texto salto quitar linea formato documentos convertir archivos archivo abrir unix shell emacs

unix - salto - quitar m en linux



Abra un bĂșfer Emacs cuando un comando intente abrir un editor en modo shell (6)

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 configurada en vim , obtengo lo siguiente de svn propedit :

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

(Puede ser difícil de decir de la representación, pero es un lío horrible y horrible).

Con VISUAL configurado en "emacs -nw" , obtengo

$ 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 configurado solo para emacs , pero solo desde dentro 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 línea de comando?


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.


No 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 se inicia una screen y se ejecuta desde allí.


Puede adjuntar a una sesión de Emacs a través de emacsclient . Primero, inicie el servidor de emacs con

M-x server-start

o agregue (server-start) a sus .emacs . Entonces,

export VISUAL=emacsclient

Editar lejos.

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.

Junto con usar el cliente / servidor emacs, estoy usando este script 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


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. add: (start-server) en su archivo .emacs (recuerde cargar el archivo después de su cambio)

  2. en tu hgrc:

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


Cuando tengo (start-server) en mis .emacs obtengo 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 usando:

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

Darwin Kernel Versión 10.8.0: Mar 7 de junio 16:33:36 PDT 2011;

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

Tenga en cuenta que mx ansi-term parece permitirme hg commit exitosamente dentro de su caparazón. Sin embargo, ese shell no me permite desplazarme por el buffer con, por ejemplo, cp o cn, por lo que preferiría usar mx shell.