¿Cómo puedo hacer que ejecutar emacsclient desde la unidad launcher reutilice una ventana existente de emacs

12

Si crea un iniciador de emacsclient copiando un archivo .desktop (por ejemplo, el de Emacs), no se comporta de la manera estándar del iniciador de Unity. Siempre lanza una nueva ventana; no reconoce que existen ventanas Emacsclient existentes para saltar a ellas. ¿Cómo puedo hacer que se comporte?

Como fondo, este es un modo de uso muy útil para Emacs, donde lo ejecuta como un daemon: emacs --daemony luego invoca una ventana de emacs con emacsclient. Una buena manera de hacer esto para los usuarios habituales de emacs es poner emacs --daemonen sus aplicaciones de inicio.

james.ferguson
fuente

Respuestas:

16

La solución es crear un emacsclient.desktoparchivo que incluya una directiva para la clase de la ventana utilizando la configuración de StartupWMClass. Sin ella, Unity no puede decir que esa ventana vino de Emacsclient. Esto creará uno basado en el contenido de Emacs one (/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 el emacsclient en el iniciador (por ejemplo, toque Super, escriba "emacsclient", arrástrelo) y cierre la sesión / inicie sesión.

james.ferguson
fuente
En mi .bashrc, defino TMPDIR = $ {HOME} / tmp para que los archivos temporales estén bajo mi $ HOME encriptado. emacs, invocado desde el iniciador, no ve esta definición, pero emacsclient, invocado desde un shell sí. emacs (después del inicio del servidor) abre un socket en / tmp, emacsclient intenta comunicarse con emacs a través de un socket en $ {HOME} / tmp, y lo hace muy mal. ¿Puedo usar emacsclient.desktop para pasar el valor correcto para TMPDIR?
waltinator
Moví mi pregunta a un hilo propio, y obtuve respuesta. Consulte askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/…
waltinator el
La unidad ignoró totalmente mi emacsclient.desktoppor alguna razón. Eventualmente solucioné esto creando el lanzador en alacarte(la GUI "Menú principal").
Brian Z
2

La solución de james.ferguson funciona bien. Lo que quería era vincular emacsclient a algunos tipos de archivos como la "aplicación preferida". Para esto, encontré el script de James con una nueva línea "Exec"

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

funciona mejor para mí: ejecuta un nuevo emacs si no se está ejecutando ninguno, no abre una nueva ventana y no hace que emacs se queje de que los clientes todavía esperan que sucedan cosas.

Ahora puedo hacer clic en los archivos y se abren en un emacs en ejecución, si existe, de lo contrario se inicia emacs.

usuario127094
fuente
1

Otra forma es usar un script :

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

Entonces siempre invocas el mismo comando.

yPhil
fuente