Como posso fazer o emacsclient em execução a partir do launcher de unidade reutilizar uma janela existente do emacs?

12

Se você criar um lançador emacsclient copiando um arquivo .desktop (por exemplo, o Emacs), ele não se comportará da maneira padrão do iniciador Unity. Sempre lança uma nova janela; ele não reconhece que existem janelas existentes do Emacsclient para pular para elas. Como posso fazê-lo se comportar?

Como pano de fundo, esse é um modo de uso muito útil para o Emacs, no qual você o executa como um daemon: emacs --daemon e, em seguida, convoca uma janela do emacs com emacsclient . Uma boa maneira de fazer isso para os usuários habituais do emacs é colocar emacs --daemon em seus aplicativos de inicialização.

    
por james.ferguson 09.05.2011 / 17:52

3 respostas

16

A solução é criar um arquivo emacsclient.desktop , incluindo uma diretiva para a classe da janela usando as configurações StartupWMClass. Sem ela, o Unity não pode dizer que aquela janela veio do Emacsclient. Isto irá criar um baseado no conteúdo do Emacs (/usr/share/applications/emacs23.desktop):

mkdir -p ~/.local/share/applications
cat > !$/emacsclient.desktop <<EOF
[Desktop Entry]
Version=1.0
Name=Emacsclient
GenericName=Text Editor
Comment=View and edit files
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=/usr/bin/emacsclient -c %F
Icon=/usr/share/icons/hicolor/scalable/apps/emacs23.svg
Type=Application
Terminal=false
Categories=Utility;Development;TextEditor;
StartupWMClass=Emacs
EOF

Coloque o emacsclient no lançador (por exemplo, toque em Super, digite "emacsclient", arraste-o para dentro) e efetue logout / in.

    
por james.ferguson 10.05.2011 / 09:41
1

Outra maneira é usar um script :

if [ "$(pidof emacs)" ] ; then
    emacsclient "$@" &
else
    emacs -mm "$@" &
fi

Então, você sempre invoca o mesmo comando.

    
por yPhil 07.09.2013 / 16:35
1

A solução de james.ferguson funciona bem. O que eu queria era vincular o emacsclient a alguns tipos de arquivos como o "aplicativo preferido". Para isso, encontrei o script do james com uma nova linha "Exec"

Exec=/usr/bin/emacsclient --alternate-editor emacs24 --no-wait %F

funciona melhor para mim: ele executa um novo emacs se nenhum estiver em execução, não abre uma nova janela e não faz o emacs reclamar sobre os clientes que ainda estão esperando que as coisas aconteçam.

Agora eu posso clicar nos arquivos e eles são abertos em um emacs em execução, se existir algum, caso contrário o emacs é iniciado.

    
por user127094 14.06.2014 / 13:31