Wie kann ich dafür sorgen, dass das Ausführen von emacsclient über den Unity Launcher ein vorhandenes Emacs-Fenster wiederverwendet

12

Wenn Sie einen Emacsclient-Launcher durch Kopieren einer .desktop-Datei (z. B. der Emacs-Datei) erstellen, verhält sich dieser nicht wie der Standard-Unity-Launcher. Es wird immer ein neues Fenster geöffnet. Es erkennt nicht, dass vorhandene Emacsclient-Fenster vorhanden sind, um zu ihnen zu springen. Wie kann ich dafür sorgen, dass es sich verhält?

Als Hintergrund ist dies ein sehr nützlicher Verwendungsmodus für Emacs, in dem Sie es als Daemon ausführen emacs --daemonund dann ein Emacs-Fenster mit aufrufen emacsclient. Eine gute Möglichkeit, dies für gewohnheitsmäßige Emacs-Benutzer zu tun, besteht darin, sie emacs --daemonin Ihre Startup-Anwendungen zu integrieren.

james.ferguson
quelle

Antworten:

16

Die Lösung besteht darin, emacsclient.desktopmithilfe der StartupWMClass-Einstellungen eine Datei zu erstellen, die eine Direktive zur Fensterklasse enthält. Ohne sie kann Unity nicht erkennen, dass dieses Fenster von Emacsclient stammt. Dadurch wird eine erstellt, die auf dem Inhalt des Emacs basiert (/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

Legen Sie den Emacsclient in den Launcher (z. B. tippen Sie auf Super, geben Sie "emacsclient" ein, ziehen Sie ihn auf) und melden Sie sich ab / an.

james.ferguson
quelle
In meinem .bashrc definiere ich TMPDIR = $ {HOME} / tmp, sodass temporäre Dateien unter meinem verschlüsselten $ HOME liegen. Vom Launcher aufgerufene emacs sehen diese Definition nicht, von einer Shell aufgerufene emacsclient dagegen. emacs (nach dem Serverstart) öffnet einen Socket in / tmp, emacsclient versucht mit emacs über einen Socket in $ {HOME} / tmp zu kommunizieren und funktioniert sehr schlecht. Kann ich mit emacsclient.desktop den richtigen Wert für TMPDIR übergeben?
Waltinator
Ich habe meine Frage in einen eigenen Thread verschoben und wurde beantwortet. Siehe askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/…
Waltinator
Die Einigkeit ignorierte mich emacsclient.desktopaus irgendeinem Grund völlig . Ich habe dies schließlich umgangen, indem ich alacartestattdessen den Launcher in (der "Hauptmenü" -GUI) erstellt habe.
Brian Z
2

Lösung von james.ferguson funktioniert gut. Was ich wollte, war die Verknüpfung von emacsclient mit einigen Dateitypen als "bevorzugte Anwendung". Dafür habe ich James 'Skript mit einer neuen "Exec" -Zeile gefunden

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

funktioniert besser für mich: es wird ein neuer Emac ausgeführt, wenn keiner ausgeführt wird, es wird kein neues Fenster geöffnet und es wird nicht dafür gesorgt, dass sich Emacs über Clients beschwert, die immer noch darauf warten, dass etwas passiert.

Jetzt kann ich auf Dateien klicken und sie werden in einem laufenden Emacs geöffnet, falls einer existiert, ansonsten startet Emacs.

user127094
quelle
1

Eine andere Möglichkeit ist die Verwendung eines Skripts :

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

Sie rufen also immer den gleichen Befehl auf.

yPhil
quelle