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

91

¿Cómo ejecuto GUI Emacs desde la línea de comando 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 la ventana de mi terminal.
  2. Al escribir "emacs" se abre una ventana de GUI Emacs. Al buscar archivos en esa ventana, se buscará por defecto en el directorio desde donde inicié Emacs.
  3. Escribir "emacs foo.txt" cuando foo.txt existe lanza una ventana GUI de Emacs con foo.txt cargado.
  4. Al escribir "emacs foo.txt" cuando foo.txt no existe, se abre una ventana GUI de Emacs con un búfer de texto vacío llamado "foo.txt". Hacer ^ X ^ S en ese búfer guardará foo.txt en el directorio desde donde inicié Emacs.
Johan Walles
fuente
¿Cuáles de esos criterios no se cumplen al ingresar 'emacs' en un indicador de terminal? Sus requisitos describen el comportamiento predeterminado en Linux. No he usado una Mac en un tiempo, pero creo que el truco fue encontrar el programa correcto para ejecutar, ¿quizás emacs.app?
Tyler
8
Tyler, viniendo de un entorno Linux, estoy contigo todo el tiempo; solo escribir "emacs" en el indicador debería ser todo lo que necesito hacer. Sin embargo, hacer eso en OSX lanza el modo texto Emacs en la ventana de la terminal (por lo tanto, falla el criterio 1), y eso no es lo que quiero.
Johan Walles
1
Johan, ¿has encontrado una solución mientras tanto? Estoy luchando con los mismos problemas y pienso en comenzar una recompensa. Especialmente molesto es que llamar a emacs (y no el Emacs.app) desde la línea de comandos se abre una ventana en el fondo ...
alexurba
1
@DougHarris Mis requisitos coinciden con la realidad en cualquier distribución de Linux, de ahí provienen. Me alegra que haya encontrado un flujo de trabajo que funcione para usted. ¡Salud!
Johan Walles
2
No sé si funciona en OSX, pero podría intentarlo: emacsclient -c -a "" "$@"command
jfs

Respuestas:

113

Llame al siguiente script "emacs" y colóquelo en su PATHlugar:

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

Eso cubre los números 2, 3 y 4.

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

(x-focus-frame nil)

El emacsformacosx.com sitio ahora tiene una página de How-To , que es donde el fragmento de la parte superior de procedencia. Allí hay más información sobre cómo ejecutar emacsclienty conectar Emacs git mergetool.

David Caldwell
fuente
1
¡Gracias David, tú mandas!
Johan Walles
1
Funciona genial. Próximamente recompensa.
Tamzin Blake
2
En Mavericks si estoy en la carpeta ~/fooy quiero abrir bar.txtescribo gmacs bar.txtpero crea un nuevo archivo en ~/bar.txtlugar de abrir ~foo/bar.txt. ¿Estoy haciendo algo mal?
Daniel Compton
2
¿Dónde está el archivo .emacs?
Bren
1
No puede agregar (x-focus-frame nil) en cualquier lugar, tiene que estar dentro de la expresión (custom-set-variables), que emacs creará para usted una vez que configure algo a través de la personalización. Simplemente personalice algo de la barra de menú, como activar el "cursor parpadeante" (luego desactivarlo si no le gusta) y esa sección se creará en su .emacs. Además, ¿esto incluso se ha probado? No estoy seguro de que emacs en Cocoa respete esta configuración.
Chuck Adams
70

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, le recomendaría que abra una copia de emacs y la mantenga en funcionamiento. Si ese es el caso, y desea cargar un archivo en una copia existente de emacs, puede usar emacsclient colocando lo siguiente en su .bashrc:

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

Luego 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 emacs existente.

Chris McMahan
fuente
4
¡Hola Chris! Su primera respuesta no cumple los criterios 2 y 4. Su segunda respuesta no cumple el criterio 2. Estoy buscando una solución que cumpla con todos los criterios enumerados. Saludos / Johan
Johan Walles
3
Parece que todos sus problemas podrían resolverse si simplemente usara emacs para cargar los archivos, en lugar de depender de una línea de comandos para lanzar una nueva instancia cada vez. Por lo general, comienzo emacs al comienzo de mi día (si aún no se está ejecutando) y lo uso para cargar archivos, cambiar directorios, crear archivos nuevos y cualquier otra cosa que quiera sin tocar la ventana de la terminal.
Chris McMahan
Debo decir que hay varias de estas preguntas en este sitio que tratan esta cuestión, pero esta es la única que resuelve completamente el problema de abrir también un archivo, de una manera breve y elocuente.
tylerthemiler
3
@tylerthemiler, ¿dónde está la respuesta que resuelve completamente el problema? Ambas respuestas en esta respuesta fallan el criterio 2 y la primera falla también 4.
Johan Walles
5
Un poco de tacto ayuda mucho a que se responda una pregunta. También lo hace un poco de búsqueda en Google.
Duma
10

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úmeros 2, 3 y 4. Para # 1, poner esto en alguna parte 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 .)

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &
David J.
fuente
1
Esto soluciona un problema con OSX (quizás comenzando con 10.9 Mavericks). A partir de 10.9, el método "no recomendado" falla, mientras que hasta al menos 10.6, el no recomendado sincroniza el shell $ PWD y Emacs (pwd). La respuesta de David podría estar en otra parte, pero ¿cómo logras que los motores de búsqueda entiendan: "pwd not pwd"?
infogizmo
Ambos fragmentos de esta respuesta no inician emacs en el directorio correcto cuando probé en macOS 10.15.6 y Emacs 26.2.
gsingh2011
5

Asumo que tú tampoco:

  • Inicie el demonio emacs al iniciar sesión
  • Tener (inicio del servidor) en su .emacs
  • No le importe tener muchas copias separadas de emacs ejecutándose

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

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

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

  1. Al escribir "emacs" se abre una ventana de GUI Emacs. Al buscar archivos en esa ventana, se buscará por defecto en el directorio desde donde inicié Emacs.

Abrirá una ventana de emacs existente en modo directo.

  1. Escribir "emacs foo.txt" cuando foo.txt existe lanza una ventana GUI de Emacs con foo.txt cargado.

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

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

Correcto.

Uno extra:

El control vuelve a la sesión del 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
El dave
fuente
¡Increíble! Sin embargo, parece que tus piernas de argumentos y no argumentos están cambiadas.
eriksensei
4

Solución simple...

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

Sin embargo, esta solución me funciona muy bien.

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

Uso

ec file [...]

Analicemos lo que está sucediendo:

  1. pase todos los ecargumentos a emacsclient y no ( -n) espere emacs antes de continuar.
    1. Si Emacs ya se está ejecutando, terminamos y está editando.
  2. absorba 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 (las rutas se abrirán correctamente).
    2. Ya ha terminado y Emacs ha abierto sus archivos.
ocodo
fuente
3

Acabo de construir 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, uno debería lanzar la versión .app para obtener gui, que en mi caso fue /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs

Yuriy Skvortsov
fuente
- el cacao estaba en desuso; usando --with-cocoa en su lugar!
Erwin Rooijakkers
3

Mejorando aún más la respuesta de David James, lo siguiente funciona para mí:

Según las 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, creé el siguiente script emax bash y lo coloqué en mi ruta en ~ / bin

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

Advertencia : para que emacs abra el directorio actual en el modo Dired por nombre , 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) de 2014-11-13
sbecker11
fuente
Esto solo funciona para un archivo existente, no creará uno si no está allí
Stíofán.
Estoy usando macOS 10.15 (Catalina), y parece que esto funciona la primera vez (cuando Emacs aún no está abierto), pero no funciona la segunda vez (cuando una ventana de Emacs ya está abierta). ¿Sabes cómo arreglar ésto?
user102008
1

Las otras respuestas aquí no funcionaron del todo 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.

Jackkamm
fuente
1
Mi construcción / instalación particular no tiene ese problema, pero hay un problema con su solución. Si intenta abrir más de un archivo, solo el primero se expandirá al directorio PWD. El resto no tendrá como prefijo una ruta $ PWD.
kmarsh
0

Compile Emacs de acuerdo con los siguientes pasos:

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

¡Y listo! Puede ser útil descargar e instalar XQuartz, pero esa es solo mi opinión.

rastrillo
fuente
0

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
Koren.H
fuente
0

En todo lo anterior, cuando use "abrir", asegúrese de usar la opción "--args"

No hagas esto:

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

En lugar de esto:

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

la --argsopción evita que "open" consuma varias opciones diseñadas para Emacs.

user3696153
fuente
Por alguna razón, cuando probé esto en macOS 10.15.6 y Emacs 26.2, el directorio de trabajo de emacs estaba configurado en mi directorio de inicio, lo que significa que no pude abrir archivos usando rutas relativas. Sin embargo, esto solucionó el problema de los archivos abiertos inexistentes.
gsingh2011
0

La respuesta principal es buena, pero quería que el proceso emacs se ejecutara en segundo plano para poder seguir usando mi shell. Esta respuesta pareció hacer lo que quería, pero no inició emacs en el directorio correcto, lo que significa que se requerían rutas absolutas (o trucos para agregar pwda las rutas que no funcionarían en todos los casos). Además, simplemente usar &significaba que si mataba la terminal, emacs también se mataría.

Decidí usar screeny una función bash, y la siguiente solución me funciona en macOS 10.15.6 y emacs 26.2 instalados con brew:

function emacs() {
    screen -d -m /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
}
gsingh2011
fuente
La pregunta solicitó explícitamente Emacs en una ventana GUI, y esto abre Emacs en una sesión de terminal.
Johan Walles
@JohanWalles, esto abre Emacs en una ventana GUI.
gsingh2011
screenme despidió, ahora que leo con más atención me doy cuenta de que tienes razón. Mis disculpas @ gsingh2011.
Johan Walles hace