Come posso fare in modo che l'esecuzione di emacsclient dal launcher di unità riutilizzi una finestra di emacs esistente


12

Se si crea un programma di avvio emacsclient copiando un file .desktop (ad esempio quello di Emacs), non si comporta nel modo di avvio Unity standard. Avvia sempre una nuova finestra; non riconosce che esistono le finestre Emacsclient esistenti per saltarle. Come posso farlo comportare?

Come sfondo, questa è una modalità di utilizzo molto utile per Emacs, dove la esegui come un demone: emacs --daemone poi evoca una finestra di emacs emacsclient. Un buon modo per farlo per gli utenti abituali di emacs è quello di inserire emacs --daemonle applicazioni di avvio.

Risposte:


16

La soluzione è creare un emacsclient.desktopfile che includa una direttiva nella classe della finestra usando le impostazioni StartupWMClass. Senza di essa, Unity non può dire che quella finestra provenga da Emacsclient. Questo ne creerà uno in base al contenuto di quello di 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

Posiziona l'emacsclient nel programma di avvio (ad esempio, tocca Super, digita "emacsclient", trascinalo su) e disconnetti / disconnetti.


Nel mio .bashrc, definisco TMPDIR = $ {HOME} / tmp in modo che i file temporanei si trovino nella mia $ HOME crittografata. emacs, invocato dal programma di avvio, non vede questa definizione, ma emacsclient, invocato da una shell. emacs (dopo l'avvio del server) apre un socket in / tmp, emacsclient cerca di comunicare con emacs tramite un socket in $ {HOME} / tmp e lo fa molto male. Posso usare emacsclient.desktop per passare il valore corretto per TMPDIR?
Waltinator,

Ho spostato la mia domanda in un thread a parte e ho ricevuto risposta. Vedi askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/…
waltinator

Unity ha totalmente ignorato il mio emacsclient.desktopper qualche motivo. Alla fine ho risolto il problema creando invece il programma di avvio nella alacarteGUI del "menu principale".
Brian Z

2

La soluzione di james.ferguson funziona bene. Quello che volevo era collegare emacsclient ad alcuni tipi di file come "applicazione preferita". Per questo, ho trovato la sceneggiatura di James con una nuova riga "Exec"

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

funziona meglio per me: esegue un nuovo emacs se nessuno è in esecuzione, non apre una nuova finestra e non fa lamentare emacs per i clienti che aspettano ancora che succeda qualcosa.

Ora posso fare clic sui file e vengono aperti in un emacs in esecuzione, se ne esiste uno, altrimenti si avvia emacs.


1

Un altro modo è usare uno script :

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

Quindi invochi sempre lo stesso comando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.