macos emacs command-line

macos - ¿Cómo ejecutar GUI Emacs desde línea de comandos en OSX?



command-line (11)

¿Cómo ejecuto GUI Emacs desde la línea de comandos en OSX?

He descargado e instalado Emacs desde http://emacsformacosx.com/ .

Aceptaré una respuesta que cumpla con todos los siguientes criterios:

  1. La ventana de emacs se abre frente a mi ventana de terminal.
  2. Escribir "emacs" inicia una ventana GUI Emacs. Encontrar archivos en esa ventana tomará de forma predeterminada buscar en el directorio desde donde comencé Emacs.
  3. Al escribir "emacs foo.txt" cuando foo.txt existe se inicia una ventana GUI Emacs con foo.txt cargado.
  4. Al escribir "emacs foo.txt" cuando foo.txt no existe se inicia una ventana GUI Emacs con un búfer de texto vacío llamado "foo.txt". Al hacer ^ X ^ S en ese búfer se guardará foo.txt en el directorio desde donde comencé Emacs.

Solución simple...

Aquí se publican muchas soluciones muy complejas a este problema. Eso es justo porque parece no trivial.

Sin embargo, esta solución funciona muy bien para mí.

ec() { emacsclient -n $@ 2> /dev/null if [[ $? == 1 ]]; then open -a Emacs.app -- $@ fi }

Uso

ec file [...]

Vamos a descomprimir lo que está pasando:

  1. pase todos los argumentos ec a emacsclient y no ( -n ) espere emacs antes de continuar.
    1. Si Emacs ya se está ejecutando, ya hemos terminado y estás editando.
  2. trague el mensaje de error publicado por emacsclient cuando no hay emacs en ejecución. ( 2> /dev/null )
  3. Manejar manualmente el código de salida 1 ( [[ $? == 1 ]] )
    1. abra Emacs.app y pase los argumentos del archivo a él (las rutas se abrirán correctamente).
    2. Ya has terminado, y Emacs ha abierto tus archivos.

Acabo de crear emacs con el administrador de paquetes homebrew de acuerdo con esta guía: http://www.emacswiki.org/emacs/EmacsForMacOS con brew install --cocoa emacs Después de eso, debería lanzar la versión .app para obtener la interfaz gráfica de usuario, que en mi caso era /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs


Compile Emacs de acuerdo con los siguientes pasos:

./configure --with-x --prefix=/usr make sudo make install

¡Y listo! Puede ayudar a descargar e instalar XQuartz, pero esa es solo mi opinión.


En Mountain Lion, estoy usando el puerto de Yamamoto Mitsuharu https://github.com/railwaycat/emacs-mac-port con el siguiente alias:

alias emacs=/Applications/Emacs.app/Contents/MacOS/Emacs

y satisface todos sus criterios.


En su shell, alias el comando ''emacs'' para apuntar a la aplicación OSX emacs

En mi shell (ejecutando el bash predeterminado), tengo lo siguiente (en mi .bashrc)

alias emacs=''open -a /Applications/Emacs.app $1''

Luego, al escribir emacs en la línea de comando, se inicia la aplicación emacs.

Sin embargo, recomendaría que abra una copia de emacs y simplemente la mantenga en funcionamiento. Si ese es el caso, y desea cargar un archivo en una copia existente de emacs, puede usar el emacsclient colocando lo siguiente en su .bashrc:

alias ec=''/Applications/Emacs.app/Contents/MacOS/bin/emacsclient''

A continuación, agregue lo siguiente a su archivo .emacs para iniciar el servidor emacs (que recibe las llamadas emacsclient)

;;======================================== ;; start the emacsserver that listens to emacsclient (server-start)

Entonces puedes escribir

ec .bashrc

para cargar una copia de .bashrc en una sesión de emacs existente!


Este es mi script para abrir emacs / emacsclient en osx.

#!/bin/bash # Ensure (server-start) is added in your emacs init script. EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs EMACSCLIENT=/Applications/Macports/Emacs.app// Contents/MacOS/bin/emacsclient # test if client already exsit. $EMACSCLIENT -e "(frames-on-display-list)" &>/dev/null # use emacsclient to connect existing server. if [ $? -eq 0 ]; then $EMACSCLIENT -n "$@" # open emacs.app instead. else `$EMACS "$@"` & fi


Esto mejora la respuesta de David Caldwell al iniciar Emacs en segundo plano:

#!/bin/sh $(/Applications/Emacs.app/Contents/MacOS/Emacs "$@") &

Como se indica en la otra respuesta, esto cubre los n. ° 2, n. ° 3 y n. ° 4. Para # 1, coloque esto en algún lugar de su archivo .emacs: (x-focus-frame nil) .

Tenga en cuenta que lo siguiente no funciona para mí: no inicia Emacs en un directorio especificado en la línea de comando (por ejemplo, emacs . ) emacs .

# NOT RECOMMENDED #!/bin/sh /Applications/Emacs.app/Contents/MacOS/Emacs "$@" &


Las otras respuestas aquí no funcionaron para mí. En particular, en mi máquina, el script bash

#!/bin/sh /Applications/Emacs.app/Contents/MacOS/Emacs "$@"

siempre abre emacs en el directorio de inicio. Para que se abra en el directorio de trabajo actual, tuve que hacer

#!/bin/sh /Applications/Emacs.app/Contents/MacOS/Emacs "$PWD/$@"

en lugar.


Llame al siguiente script "emacs" y póngalo en su PATH algún lugar:

#!/bin/sh /Applications/Emacs.app/Contents/MacOS/Emacs "$@"

Eso cubre # 2, # 3 y # 4.

Para el n. ° 1, coloque esto en algún lugar de su archivo .emacs:

(x-focus-frame nil)

El sitio de http://emacsformacosx.com/ ahora tiene una página de http://emacsformacosx.com/ , que es de donde proviene el fragmento superior. Hay más información sobre cómo ejecutar emacsclient y conectar Emacs a git mergetool .


Mejorando aún más la respuesta de David James, los siguientes trabajos para mí:

Por instrucciones para abrir un archivo desde un terminal que se encuentra en http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

open -a /Applications/Emacs.app <file-name>

combinando esto con la respuesta de David Jame, he creado el siguiente script emax bash y lo coloqué en mi camino en ~ / bin

#!/bin/bash (open -a /Applications/Emacs.app "$@") &

Advertencia : para que emacs abra el directorio actual en modo Direc by name , debe usar

emax .

Ambiente:

  • OS X Yosemite, versión 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) del 2014-11-13

Supongo que tú:

  • Inicie el daemon de emacs al iniciar sesión
  • Have (server-start) en tu .emacs
  • No importa tener muchas copias separadas de emacs corriendo

Si es así, entonces creo que esto satisface los cuatro criterios originales, más uno más:

  1. La ventana de emacs se abre frente a mi ventana de terminal.

siempre se abrirá al primer plano (con x-focus-frame).

  1. Escribir "emacs" inicia una ventana GUI Emacs. Encontrar archivos en esa ventana tomará de forma predeterminada buscar en el directorio desde donde comencé Emacs.

Abrirá una ventana existente de emacs en modo directo.

  1. Al escribir "emacs foo.txt" cuando foo.txt existe, se inicia una ventana de GUI Emacs con foo.txt cargado.

Si emacs ya se está ejecutando y tiene un servidor, se abrirá en la ventana existente y pasará a primer plano.

  1. Al escribir "emacs foo.txt" cuando foo.txt no existe se inicia una ventana GUI Emacs con un búfer de texto vacío llamado "foo.txt". Al hacer ^ X ^ S en ese búfer se guardará foo.txt en el directorio desde donde comencé Emacs.

Correcto.

Uno extra:

El control vuelve a la sesión de la terminal inmediatamente después de escribir el comando.

~ / bin / emacs

#!/bin/bash EMACSPATH=/Applications/Emacs.app/Contents/MacOS # Check if an emacs server is available # (by checking to see if it will evaluate a lisp statement) if ! (${EMACSPATH}/bin/emacsclient --eval "t" 2> /dev/null > /dev/null ) then # There is no server available so, # Start Emacs.app detached from the terminal # and change Emac''s directory to PWD nohup ${EMACSPATH}/Emacs --chdir "${PWD}" "${@}" 2>&1 > /dev/null & else # The emacs server is available so use emacsclient if [ -z "${@}" ] then # There are no arguments, so # tell emacs to open a new window ${EMACSPATH}/bin/emacsclient --eval "(list-directory /"${PWD}/")" else # There are arguments, so # tell emacs to open them ${EMACSPATH}/bin/emacsclient --no-wait "${@}" fi # Bring emacs to the foreground ${EMACSPATH}/bin/emacsclient --eval "(x-focus-frame nil)" fi