2009-08-12 14 views
5

Me pregunto si alguien tiene alguna recomendación sobre la configuración de emacs 23 en OS X. He estado usando Linux/Windows por un tiempo y allí, simplemente abriría muchas instancias de emacs y eran autónomos, por ejemplo, Podría tener dos archivos separados en marcos separados, cada uno con su propia R, Python y/o shell en ejecución. Creo que esto está mal visto (?), Pero mantuvo el directorio de trabajo para cada archivo de secuencia de comandos por separado, que me encantó.Emacs 23 en OS X: ¿usar instancias múltiples o emacsclient?

Entiendo que hay una ventaja en la configuración (inicio del servidor) en mi archivo .emacs y llamar a 'emacsclient' en lugar de 'Emacs' es ahora la forma preferida (?). He encontrado este hilo que facilita que esto ocurra a través de un Applescript: Emacs 23, OS X, multi-tty and emacsclient

Pero me pregunto si esta la única manera de hacerlo - al abrir dos instancias emacs en OS X me da el error:

** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x3803, name = 'org.gnu.Emacs.ServiceProvider' 

pero abre un nuevo marco me permite editar archivos. Entiendo que para vim en OS X hay algo llamado 'mvim' que permite lanzar varias instancias de vim, pero ¿hay algo similar para emacs? Perdón por la pregunta interminable: en resumen, supongo que estas son las preguntas para las cuales me gustaría solicitar su experiencia:

(1) Es 'emacsclient' el camino de los expertos, y (2) si no necesariamente, ¿hay alguna manera de obtener múltiples instancias de emacs 23 (no solo marcos) ejecutándose en OS X?

Gracias! -Stephen

Respuesta

6

Déjenme responder sus preguntas indirectamente.

Como usted sabe, emacsclient ofrece un servicio que permite a los usuarios abrir documentos desde fuera de Emacs en un existente Emacs. ¿Es este "el camino" de los expertos? Depende del experto. Soy un gran usuario de Emacs, pero nunca uso emacsclient. ¿Por qué? Porque nunca dejo Emacs en primer lugar. Todas las conchas que ejecuto están dentro de Emacs (usando un paquete casero screen), leo el correo en Emacs, etc. Nunca hay una razón para que escriba emacsclient en una línea de comando.

Su modelo de uso parece ser que usted prefiere tener múltiples Emacsen en ejecución, lo que facilita el seguimiento de los procesos y archivos que se utilizan juntos. Y eso tiene sentido. Puede hacerlo todo en one Emacs si lo desea, pero puede llevar algunos cambios en su modelo de uso, o algunas personalizaciones para ayudarlo a administrar múltiples intérpretes/shells/lo que sea de su agrado.

Por lo tanto, si desea varias instancias de Emacs en ejecución, entonces por supuesto, continúe haciéndolo.

En cuanto a la segunda pregunta, parece que tener (server-start) en su .emacs está causando problemas, probablemente porque hay un conflicto con dos Emacsen que intentan usar el mismo puerto. Consulte documentation para iniciar el servidor y, tal vez, elimine esa línea de su .emacs y, en su lugar, inicie el servidor una vez utilizando la opción de línea de comando --daemon.

Luego, en la línea de comandos, tiene la opción de si desea iniciar un nuevo emacs (escribiendo emacs) o conectarse al servidor que inició (escribiendo emacsclient).

+0

Gracias por su respuesta - No tengo (inicio del servidor) cuando obtengo el error bootstrap_register, y sigo recibiendo una advertencia (no puedo conectarme al servidor) cuando el servidor se está ejecutando y comienzo otro ejemplo. Creo que esto es algo de la aplicación OS X: http://osdir.com/ml/emacs.macintosh.osx/2005-07/msg00036.html, y la página de Carbon Emacs presagia advertencias al abrir varias instancias. Por lo que veo, mis opciones son (1) ignorar las advertencias y continuar trabajando en la segunda/tercera/... instancia, o (2) mejorar al tratar de administrar múltiples directorios de trabajo. – hatmatrix

+0

para continuar (alcanzar el límite de 600char antes) - gracias por la sugerencia. Tu sugerencia realmente funciona, aunque con advertencias (y el primer archivo que edito está asociado a la instancia del servidor). – hatmatrix

+0

Necesitaba ejecutar emacsclient hace unos días para acceder a mi sesión de trabajo desde mi casa para poder verificar el resultado de algunos comandos que se ejecutaban en un shell. También me gusta usarlo para $ EDITOR así puedo tener un ambiente agradable para editar crontabs, etc. –

1

Uso algo como esto en mi .emacs a única llamada al servidor de arranque si el servidor no está en ejecución:

(if (file-exists-p 
(concat (getenv "TMPDIR") "emacs" 
     (number-to-string 
      (user-real-uid)) "/server")) 
nil (server-start)) 

A continuación, un par de cambios en mi .zshrc de manera que sin pensar que puedo correr ec como mi editor de comandos de la shell:

# I use the Emacs package from emacsformacosx.com 
alias emacs='open -a emacs' 
alias emacsclient='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient' 
alias ec='emacsclient -a /Applications/Emacs.app/Contents/MacOS/Emacs' 
export EDITOR='ec' 
+0

¡Genial! No sabía acerca de la primera expresión, pensó comprobar para ver si el servidor se estaba ejecutando sería más sencillo, pero parece que funciona. – hatmatrix

+0

bien podría haber una mejor manera de saber si el servidor se está ejecutando o no, pero este es el primero que me vino a la mente :) – markhellewell

+0

La variable 'server-process' está disponible para esto.Si está utilizando '--daemon', también querrá verificar' (daemonp) ', y tener en cuenta que el servidor no se iniciará hasta que se haya procesado su archivo init y cualquier argumento de la línea de comandos. Mire cerca del final de la función '(línea de comando)' para más detalles. – phils

7

Si desea que varios casos (y no marcos) de emacs utilizar el siguiente en el terminal:

/Applications/Emacs.app/Contents/MacOS/Emacs & 

(Generic form for any app) /Path_To_Application.app/Contents/MacOS/Application & 
+0

Esto podría morderte; No me sorprendería si las múltiples instancias chocaran mutuamente los archivos temporales. En mi caso, tengo archivos/directorios en '.emacs.d' como' auto-save-list', 'backups',' bookmarks', 'ido.last',' places', y 'projectile.cache' . –

+0

Consulte esto si desea ejecutar varias instancias con diferentes directorios de configuración: [Cómo iniciar emacs con un usuario personalizado-emacs-directory] (http://emacs.stackexchange.com/questions/4253/how-to-start -emacs-with-a-custom-user-emacs-directory) (en el relativamente nuevo Emacs StackExchange, que vale la pena ver). –

1

He creado este shell script, que le permitirá abrir varias instancias de emacs simultáneamente. Para instalar, simplemente copie el script emacs-ide en /usr/local/bin/ o en cualquier directorio en su $PATH.

Puede ejecutar varias instancias de Emacs con varios archivos o directorios, tales como:

emacs-ide ~/Projects/project-1 
emacs-ide ~/Projects/project-2 

El guión también establece el nombre de la ventana para que coincida con el directorio (proyecto) o un archivo que se está editando.

4

Aquí está un simple script de shell que se iniciará una instancia independiente, subir la ventana de Emacs y darle el foco:

#!/bin/bash 

/Applications/Emacs.app/Contents/MacOS/Emacs \ 
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))' \ 
    "[email protected]" 

Notas:

  • Este script hace emacs se comportan como los emacs en Linux a lo que estoy acostumbrado
  • Probablemente haya una mejor manera que '(nth 0 (frame-list))' a identifique el marco para activar, pero el script anterior hace lo correcto para mí.
  • No tengo '(server-start)' en mi archivo .emacs.