Erro “tipo de terminal desconhecido” ao tentar executar o emacsclient

4

(Estou usando o emacs23 ; no Debian 7; Xfce.)

Eu quero testar a solução recomendada por Gilles para fazer anotações rápidas com o Emacs .

Ao tentar executar emacsclient -a "" -e "(remember-other-frame)" , recebo o seguinte erro:

*ERROR*: Unknown terminal type

O que está errado?

(Não sei bem o que estou fazendo) Tentei iniciar um servidor a partir do Emacs: Ctrl + x e inserindo server-start . Então diz:

Warning (server): Unable to start the Emacs server.
There is an existing Emacs server, named "server".
To start the server in this Emacs process, stop the existing
server or call 'M-x server-force-delete' to forcibly disconnect it.

Ao pressionar Ctrl + x e entrar server-force-delete , diz:

Connection file "/tmp/emacs1000/server" deleted

Quando agora executo emacsclient -a "" -e "(remember-other-frame)" de uma janela de terminal diferente (tendo emacs -nw ainda em execução no primeiro), recebo:

emacsclient: can't find socket; have you started the server?
To start the server in Emacs, type "M-x server-start".

Warning: due to a long standing Gtk+ bug
http://bugzilla.gnome.org/show_bug.cgi?id=85715
Emacs might crash when run in daemon mode and the X11 connection is unexpectedly lost.
Using an Emacs configured with --with-x-toolkit=lucid does not have this problem.
("emacs")
Loading 00debian-vars...
Loading 00debian-vars...done
Loading /etc/emacs/site-start.d/50a2ps.el (source)...
Loading /etc/emacs/site-start.d/50a2ps.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...done
Loading debian-ispell...done
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...done
Starting Emacs daemon.
Emacs daemon should have started, trying to connect again
*ERROR*: Unknown terminal type

[Editar] Informações solicitadas

Saída de echo $TERM; echo $DISPLAY :

xterm
:0.0

Are you running this from a terminal emulator, if so which, if not where?

Não tenho certeza do que é um "emulador de terminal", mas o terminal que estou usando se identifica (no menu "Info") como: Xfce Terminal-Emulator (Terminal 0.4.8). É o padrão que veio com a instalação do Debian 7 + Xfce.

What do you have in ~/.emacs and ~/.emacs.d?

  • ~/.emacs não existe.
  • ~/.emacs.d contém apenas uma subpasta auto-save-list (que contém um arquivo vazio cujo nome começa com .saves ).
por unor 15.03.2014 / 21:44

2 respostas

6

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))"
    
por 16.03.2014 / 03:28
0

Se você puder chamar (make-frame) diretamente, poderá dizer que sempre crie um quadro X, o que evitará esse erro, por exemplo:

(select-frame
 (make-frame
  '((window-system . x))))
    
por 10.03.2016 / 17:30

Tags