Explicação do bug
remember-other-frame
chama switch-to-buffer-other-frame
que chama display-buffer
com a variável pop-up-frames
definido como% código%. Isso resulta em uma chamada para t
com o argumento make-frame
. A função pop-up-frame-alist
cria um quadro no mesmo dispositivo de exibição que o quadro selecionado atual. (O que o Emacs chama de frame é o que as GUIs chamam de janela, exceto que um frame também pode estar em um terminal de texto.) Neste ponto, o Emacs ainda está rodando no modo daemon, então não há frame selecionado. Portanto, make-frame
não vê nenhum ambiente GUI e acha que deve criar um quadro de terminal, mas também não há terminal de texto, resultando na mensagem de erro confusa “Tipo de terminal desconhecido”.
Solução simples, mas desajeitada
make-frame
é a função certa para chamar de dentro de uma janela existente do Emacs, mas está tecnicamente errada no emacsclient. Lá, devemos usar a opção remember-other-frame
para fazer o Emacs criar um novo quadro e a função -c
simples.
emacsclient -a "" -c -e "(remember)"
No entanto, isso não é muito bom porque remember
cria uma janela que precisa ser descartada com remember
(que também salva a nota), então o quadro deve ser descartado com C-c C-c
. Se você esquecer C-x 5 0
(o que é mais provável porque a mensagem para digitar C-c C-c
sobrescreve a mensagem para digitar C-x 5 0
na área de eco), a nota nem é salva.
Uma solução alternativa melhor
Instrua C-c C-c
explicitamente para criar o quadro no display X atual.
emacsclient -a "" -e "
(let ((pop-up-frame-alist \'((window-system . x)
(display . \"$DISPLAY\")
,@pop-up-frame-alist)))
(remember-other-frame))"
Você pode colocar tudo isso em uma linha, apenas certifique-se de não alterar a pontuação.
emacsclient -a "" -e "(let ((pop-up-frame-alist \'((window-system . x) (display . \"$DISPLAY\") ,@pop-up-frame-alist))) (remember-other-frame))"