2008-09-22 13 views
18

Me gusta usar el modo de shell de Emacs, pero tiene algunas deficiencias. Una de ellas es que no es lo suficientemente inteligente como para abrir un nuevo búfer cuando un comando de shell intenta invocar un editor. Por ejemplo, con la variable de entorno VISUAL conjunto de vim me sale el siguiente de svn propedit:Abrir un búfer de Emacs cuando un comando intenta abrir un editor en modo de shell

 
$ svn propedit svn:externals . 
"svn-prop.tmp" 2L, 149C[1;1H 
~                    [4;1H~                    [5;1H~                    [6;1H~                    [7;1H~    
... 

(que puede ser difícil saber a partir de la representación, pero es un feo desorden horrible.)

Con VISUAL establecido en "emacs -nw", consigo

 
$ svn propedit svn:externals . 
emacs: Terminal type "dumb" is not powerful enough to run Emacs. 
It lacks the ability to position the cursor. 
If that is not the actual type of terminal you have, 
use the Bourne shell command `TERM=... export TERM' (C-shell: 
`setenv TERM ...') to specify the correct type. It may be necessary 
to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.svn: system('emacs -nw svn-prop.tmp') returned 256 

(funciona con VISUAL conjunto a solo emacs, pero sólo desde el interior de una ventana de Emacs X, no dentro de una sesión de terminal.)

¿Hay alguna manera de hacer que el modo de shell haga lo correcto aquí y abrir un nuevo búfer en nombre del proceso de la línea de comando?

Respuesta

19

Puede conectarlo a una sesión de Emacs a través del emacsclient. En primer lugar, iniciar el servidor con emacs

M-x server-start 

o añadir a su (server-start).emacs. Luego,

export VISUAL=emacsclient 

Editar.

Nota:

  • Las versiones de emacs y emacsclient deben estar de acuerdo. Si tiene varias versiones de Emacs instaladas, asegúrese de invocar la versión de emacsclient correspondiente a la versión de Emacs que ejecuta el servidor.
  • Si inicia el servidor en múltiples procesos/marcos de Emacs (por ejemplo, porque (server-start) está en su .emacs), el búfer se creará en el último cuadro para iniciar el servidor.
+0

$ svn propedit svn: ignorar. Esperando Emacs ... -error Desconocido & _comando: & _ ABSPATH/TO/REPO/svn & -prop.tmp Sin cambios a la propiedad 'svn: ignore' on '.' –

+0

Vaya. Tengo/etc/alternatives apuntando a diferentes versiones para emacs y emacsclient. La actualización de la alternativa para emacsclient solucionó lo anterior. –

+0

'export EDITOR =" emacsclient --alternate-editor = emacs --no-wait +% l% f "' vale la pena mencionar. – jfs

3

Hay emacsclient, gnuserv y en Emacs 23, multi-tty que son útiles para esto. De hecho, creo que en Emacs 23, emacsclient tiene toda la funcionalidad interesante de gnuserv.

0

No es del todo cierto. ansi-term puede ejecutar una multa de emacs (aunque normalmente ejecuto mg para los registros de confirmación, en el raro caso de que no confirme directamente desde emacs). eshell también puede ejecutar un emacs si primero inicia screen y lo ejecuta desde allí.

0

Junto con el uso de emacs cliente/servidor, estoy usando esta secuencia de comandos para invocar emacs.

Esto iniciará emacs si aún no se está ejecutando, o simplemente abrirá un nuevo búfer de emacs en los emacs en ejecución (usando gnuclient). Se ejecuta en segundo plano de forma predeterminada, pero se puede ejecutar en primer plano para procesos que esperan alguna entrada. Por ejemplo, estoy usando esto como mi editor de control de fuente, al ingresar una descripción de la lista de cambios. Tengo "SVN_EDITOR = emacs sync", así que puedo hacer "svn commit" en un shell emacs, y se abrirá el editor svn en un nuevo búfer de emacs en el mismo emacs. Cuando cierro el búfer, continúa "svn commit". Bastante útil.

 
#!/bin/sh 

if [ -z $EMACS_CMD ]; then 
    EMACS_CMD="/usr/bin/emacs" 
fi 

if [ -z $GNUCLIENT_CMD ]; then 
    GNUCLIENT_CMD="/usr/bin/gnuclient" 
fi 

if [ "$1" = "sync" ]; then 
    shift 1 
    sync=true 
else 
    sync=false 
fi 

cmd="${EMACS_CMD} $*" 
lsof $EMACS_CMD | grep $USER >/dev/null 2>&1 
if [ "$?" -ne "1" ]; then 
    cmd="${GNUCLIENT_CMD} $*" 
fi 

if [ $sync = "true" ]; then 
    $cmd 
else 
    $cmd & 
fi 

0

Yo quería hacer algo similar para fusionarme en un shell de emacs a través de mercurial. Gracias a los carteles aquí, encontré el camino. dos pasos:

  1. complemento: (start-servidor) en el fichero .emacs (recuerde que debe cargar archivos después de su cambio)

  2. en su hgrc:

     
    [merge-tools] 
    emacs.executable = emacsclient 
    emacs.premerge = False 
    emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")" 
    

0

Cuando he (start-servidor) en mis .emacs que recibo este error ....

Debugger entered--Lisp error: (void-function start-server) 
    (start-server) 
    eval-buffer(#<buffer *load*> nil "/Users/jarrold/.emacs" nil t) ; Reading at buffer position 22768 
    load-with-code-conversion("/Users/jarrold/.emacs" "/Users/jarrold/.emacs" t t) 
    load("~/.emacs" t t) 
    #[nil "^H\205\276^@ \306=\203^Q^@\307^H\310Q\202A^@ \311=\2033^@\312\307\313\314#\203#^@\315\202A^@\312\307\$ 
    command-line() 
    normal-top-level() 

.... estoy usando GNU Emacs 22.1.1

Y esta es la versión de Mac OS X que estoy utilizando:

shandemo 511 $ uname -a Darwin facilitys-MacBook-Pro.local 10.8.0

Darwin Kernel Versión 10.8. 0: martes 7 de junio 16:33:36 PDT 2011;

raíz: xnu-1504.15.3 ~ 1/RELEASE_I386 i386

Tenga en cuenta que m-x ANSI plazo parece permitir que me comprometa con éxito hg dentro de su concha. Sin embargo, ese shell no me permite desplazarme por el buffer con, por ejemplo, c-p o c-n así que preferiría nosotros m-x shell.

Cuestiones relacionadas