web-dev-qa-db-fra.com

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

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

En tant que contexte, il s’agit d’un mode d’utilisation très utile pour Emacs, dans lequel vous l’exécutez en tant que démon: emacs --daemon, puis vous appelez une fenêtre emacs avec emacsclient. Un bon moyen de faire cela pour les utilisateurs habituels d’emacs est de mettre emacs --daemon dans vos applications de démarrage.

12
james.ferguson

La solution consiste à créer un fichier emacsclient.desktop comprenant une directive lui indiquant la classe de la fenêtre à l'aide des paramètres StartupWMClass. Sans cela, Unity ne peut pas dire que cette fenêtre provient 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 emacsclient dans le lanceur (par exemple, appuyez sur Super, tapez "emacsclient", faites-le glisser), puis déconnectez-vous/connectez-vous.

16
james.ferguson

La solution de james.ferguson fonctionne bien. Ce que je voulais, c'était de lier emacsclient à certains types de fichiers en tant qu '"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 à propos des clients qui attendent toujours que des choses se passent.

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.

2
user127094

Une autre façon consiste à utiliser un script :

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

Donc, vous invoquez toujours la même commande.

1
yPhil