Comment puis-je faire en sorte qu'emacsclient à partir du lanceur d'unité réutilise une fenêtre emacs existante

12

Si vous créez un lanceur emacsclient en copiant un fichier .desktop (par exemple, le fichier Emacs), il ne se comporte pas de la manière standard du lanceur Unity. Il ouvre toujours une nouvelle fenêtre; il ne reconnaît pas que les fenêtres Emacsclient existantes existent pour y accéder. Comment puis-je le faire se comporter?

En arrière-plan, il s'agit d'un mode d'utilisation très utile pour Emacs, où vous l'exécutez en tant que démon:, emacs --daemonpuis vous invoquez une fenêtre emacs avec emacsclient. Une bonne façon de le faire pour les utilisateurs emacs habituels est de les mettre emacs --daemondans vos applications de démarrage.

james.ferguson
la source

Réponses:

16

La solution consiste à créer un emacsclient.desktopfichier incluant une directive pour lui la classe de la fenêtre en utilisant les paramètres StartupWMClass. Sans cela, Unity ne peut pas dire que cette fenêtre provenait d'Emacsclient. Cela en créera un basé sur le contenu de celui d'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

Placez l'emacsclient dans le lanceur (par exemple, appuyez sur Super, tapez "emacsclient", faites-le glisser) et déconnectez-vous.

james.ferguson
la source
Dans mon .bashrc, je définis TMPDIR = $ {HOME} / tmp pour que les fichiers temporaires se trouvent sous mon $ HOME chiffré. emacs, invoqué depuis le lanceur, ne voit pas cette définition, mais emacsclient, invoqué depuis un shell, le voit. emacs (après le démarrage du serveur) ouvre un socket dans / tmp, emacsclient essaie de communiquer avec emacs sur un socket dans $ {HOME} / tmp, et fonctionne très mal. Puis-je utiliser emacsclient.desktop pour transmettre la bonne valeur pour TMPDIR?
waltinator le
J'ai déplacé ma question sur un fil à part et j'ai obtenu une réponse. Voir askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/…
waltinator
L'unité m'a totalement ignoré emacsclient.desktoppour une raison quelconque. J'ai finalement réussi à contourner cela en créant le lanceur dans alacarte(l'interface graphique "Menu principal") à la place.
Brian Z
2

La solution de james.ferguson fonctionne bien. Ce que je voulais, c'était de lier emacsclient à certains types de fichiers comme "application préférée". Pour cela, j'ai trouvé le script de james avec une nouvelle ligne "Exec"

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

fonctionne mieux pour moi: il exécute un nouvel emacs si aucun n'est en cours d'exécution, n'ouvre pas une nouvelle fenêtre et ne fait pas se plaindre emacs des clients attendant toujours que des choses se produisent.

Maintenant, je peux cliquer sur les fichiers et ils sont ouverts dans un emacs en cours d'exécution, s'il en existe un, sinon emacs démarre.

user127094
la source
1

Une autre façon consiste à utiliser un script :

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

Vous invoquez donc toujours la même commande.

yPhil
la source