Como posso fazer a execução do emacsclient a partir do unity launcher reutilizar uma janela existente do emacs

12

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

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

james.ferguson
fonte

Respostas:

16

A solução é criar um emacsclient.desktoparquivo incluindo uma diretiva para a classe da janela usando as configurações StartupWMClass. Sem ele, o Unity não pode dizer que essa janela veio do Emacsclient. Isso criará um com base 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 iniciador (por exemplo, toque em Super, digite "emacsclient", arraste-o) e faça logout / logon.

james.ferguson
fonte
No meu .bashrc, defino TMPDIR = $ {HOME} / tmp para que os arquivos temporários fiquem sob o meu $ HOME criptografado. O emacs, invocado a partir do iniciador, não vê essa definição, mas o emacsclient, invocado a partir de um shell, não. O emacs (após a inicialização do servidor) abre um soquete em / tmp, o emacsclient tenta se comunicar com o emacs em um soquete em $ {HOME} / tmp, e se sai muito mal. Posso usar o emacsclient.desktop para passar o valor correto para o TMPDIR?
waltinator
Mudei minha pergunta para um tópico próprio e fui respondida. Veja askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/…
waltinator
A unidade ignorou totalmente a minha emacsclient.desktoppor algum motivo. Acabei contornando isso criando o iniciador alacarte(na GUI "Menu principal").
Brian Z
2

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

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

funciona melhor para mim: executa um novo emacs se não houver nenhum, não abre uma nova janela e não faz o emacs reclamar dos clientes que ainda esperam que as coisas aconteçam.

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

user127094
fonte
1

Outra maneira é usar um script :

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

Então você sempre invoca o mesmo comando.

yPhil
fonte