39 Ejecución de comandos de shell desde Emacs
Emacs tiene instrucciones para pasar líneas de comandos individuales a subprocesos de shell, y para ejecutar un shell interactivamente con entrada y salida a un búfer Emacs, y para ejecutar un shell en una ventana de emulador de terminal.
Alt-! cmd RETURN (M-!
cmd RET
)
Ejecuta el comando shell cmd y muestra la salida (
shell-command
).
Alt-| cmd RETURN (M-|
cmd RET
)
Ejecuta el comando shell cmd con el contenido de la región como entrada; opcionalmente sustituye la región por la salida (
shell-command-on-region
).
Alt-& cmd RETURN (M-&
cmd RET
)
Ejecuta el comando de shell cmd de forma asíncrona y muestra la salida (
async-shell-command
).
Alt-x shell
(M-x shell
)
Ejecuta un subshell con entrada y salida a través de un búfer Emacs. A continuación, puede dar órdenes de forma interactiva.
Alt-x term
(M-x term
)
Ejecuta un subshell con entrada y salida a través de un búfer Emacs. A continuación, puede dar órdenes de forma interactiva. Está disponible la emulación de terminal completa.
Siempre que se especifica un nombre de fichero relativo para un programa ejecutable (ya sea en el argumento cmd de uno de los comandos anteriores, o en otros contextos), Emacs busca el programa en los directorios especificados por la variable exec-path
. El valor de esta variable debe ser una lista de directorios; el valor por defecto se inicializa a partir de la variable de entorno PATH
cuando se inicia Emacs (ver C.4.1 Variables Generales).
M-x eshell
invoca un shell implementado enteramente en Emacs. Está documentado en su propio manual. Ver Eshell en Eshell: La Shell de Emacs.
39.1 Comandos de shell Simples
M-!
(shell-command
) lee una línea de texto usando el minibúfer y la ejecuta como un comando del shell, en un subshell hecho sólo para ese comando. La entrada estándar para el comando proviene del dispositivo null. Si el comando del shell produce alguna salida, ésta aparece en el área de eco (si es corta), o en el búfer "*Shell Command Output*"
(shell-command-buffer-name
) (si la salida es larga). Las variables resize-mini-windows
y max-mini-window-height
(ver 9.3 Edición en el minibuffer) controlan cuando Emacs debe considerar que la salida es demasiado larga para el área de eco. Tenga en cuenta que personalizar shell-command-dont-erase-buffer
, descrito más adelante, puede afectar a lo que se muestra en el área de eco.
Por ejemplo, una forma de descomprimir un archivo llamado foo.gz
es escribir Alt-x gunzip
foo.gz RETURN (M-! gunzip
foo.gz RET
). Este comando del shell normalmente crea el archivo foo y no produce ninguna salida en el terminal.
Un argumento numérico para shell-command
, por ejemplo, M-1 M-!
, hace que inserte la salida del terminal en el búfer actual en lugar de en un búfer separado. Por defecto, pone el punto antes de la salida, y pone la marca después de la salida (pero un valor no predeterminado de shell-command-dont-erase-buffer
puede cambiar esto, ver más abajo). Por ejemplo, M-1 M-! gunzip <
foo.gz RET
insertaría la forma descomprimida del archivo foo.gz en el búfer actual.
Siempre que el comando de shell especificado no termine con &
, se ejecuta de forma sincrónica, y debe esperar a que salga antes de continuar usando Emacs. Para dejar de esperar, teclee Ctrl-g (C-g
) para salir; esto envía una señal SIGINT
para terminar el comando shell (es la misma señal que C-c
genera normalmente en el shell). Entonces Emacs espera hasta que el comando realmente termina. Si el comando de la shell no se detiene (porque ignora la señal SIGINT
), teclee Ctrl-g (C-g
) de nuevo; esto envía al comando una señal SIGKILL
, que es imposible de ignorar.
Un comando shell que termina en &
se ejecuta asíncronamente, y puede continuar usando Emacs mientras se ejecuta. También puede escribir Alt-& (M-&
, async-shell-command
) para ejecutar un comando de shell asíncrono; esto es exactamente como llamar a M-!
con un &
al final, excepto que no necesita el &
. La salida de los comandos de shell asíncronos, por defecto, va al búfer "*Async Shell Command*"
(shell-command-buffer-name-async
). Emacs inserta la salida en este búfer a medida que llega, tanto si el búfer es visible en una ventana como si no.
Si desea ejecutar más de un comando de shell asíncrono al mismo tiempo, podrían acabar compitiendo por el búfer de salida. La opción async-shell-command-buffer
especifica qué hacer al respecto; por ejemplo, si renombrar el búfer de salida preexistente, o utilizar un búfer diferente para el nuevo comando. Consulte la documentación de la variable para más posibilidades.
Si desea que el búfer de salida de las órdenes asíncronas se muestre sólo cuando la orden genere salida, establezca async-shell-command-display-buffer
a nil
.
La opción async-shell-command-width
define el número de columnas de visualización disponibles para la salida de comandos del shell asíncrono. Un número entero positivo indica al shell que utilice ese número de columnas para la salida de comandos. El valor predeterminado es nil
, que significa utilizar el mismo número de columnas que proporciona el shell.
Para que los comandos anteriores muestren el directorio actual en sus avisos, personalice la variable shell-command-prompt-show-cwd
con un valor distinto de nil
.
M-|
(shell-command-on-region
) es como M-!
, pero pasa el contenido de la región como la entrada estándar al comando del shell, en lugar de ninguna entrada. Con un argumento numérico, borra la región antigua y la sustituye por la salida del comando de la shell.
Por ejemplo, puede utilizar M-|
con el programa gpg
para ver qué claves hay en el búfer. Si el búfer contiene una clave GnuPG, escriba Ctrl-x h Alt-| gpg RETURN (C-x h M-|
gpg RET
) para enviar todo el contenido del búfer a gpg
. Esto mostrará la lista de claves en el búfer cuyo nombre es el valor de shell-command-buffer-name
.
Los comandos anteriores utilizan el intérprete de órdenes especificado por la variable shell-file-name
. Su valor por defecto viene determinado por la variable de entorno SHELL
cuando se inicia Emacs. Si el nombre del fichero es relativo, Emacs busca en los directorios listados en exec-path
(ver 39 Ejecución de comandos de shell desde Emacs).
Si el directorio por defecto es remoto (ver 19.15 Archivos Remotos), el valor por defecto es /bin/sh
. Esto puede cambiarse declarando shell-file-name connection-local
(ver 50.2.6 Variables locales por conexión).
Para especificar un sistema de codificación para M-! o M-|
, utilice el comando C-x RET c
inmediatamente antes. Consulte 23.10 Sistemas Codificación para la Comunicación Interprocesos.
Por defecto, la salida de errores se mezcla con la salida normal en el búfer de salida. Pero si cambia el valor de la variable shell-command-default-error-buffer
a una cadena, la salida de error se inserta en un búfer con ese nombre.
Por defecto, el búfer de salida se borra entre comandos del shell, excepto cuando la salida va al búfer actual. Si cambia el valor de la opción shell-command-dont-erase-buffer
a erase
, el búfer de salida se borra siempre. Otros valores no nulos evitan el borrado del búfer de salida, y -si el búfer de salida no es el búfer actual- también controlan dónde poner el punto después de insertar la salida del comando shell:
beg-last-out
Sitúa el punto al principio de la última salida del comando shell.
end-last-out
Coloca el punto al final de la última salida del comando shell, es decir, al final del búfer de salida.
save-point
Restaura la posición del punto tal y como estaba antes de insertar la salida del comando shell.
Tenga en cuenta que si esta opción no es nula, la salida mostrada en el área de eco podría ser de más de la última orden, ya que el área de eco sólo muestra una parte del búfer de salida.
En caso de que el búfer de salida no sea el búfer actual, la salida del comando shell se añade al final de este búfer.
39.2 Subshell Interactiva
Para ejecutar un subproceso interactivamente, escriba M-x shell
. Esto crea (o reutiliza) un búfer llamado *shell*
, y ejecuta un subproceso shell con entrada proveniente de y salida hacia ese búfer. Es decir, cualquier salida de terminal del subproceso va al búfer, avanzando un punto, y cualquier entrada de terminal para el subproceso proviene del texto del búfer. Para dar entrada a la subshell, vaya al final del búfer y escriba la entrada, terminada por RET
.
Por defecto, cuando la subshell es invocada interactivamente, el búfer *shell*
es mostrado en una nueva ventana, a menos que la ventana actual ya muestre el búfer *shell*
. Este comportamiento puede personalizarse mediante display-buffer-alist
(ver 21.6.1 Cómo Funciona display-buffer).
Mientras la subshell está esperando o ejecutando un comando, puede cambiar de ventana o de búfer y realizar otras ediciones en Emacs. Emacs inserta la salida del subshell en el búfer Shell siempre que tiene tiempo para procesarla (por ejemplo, mientras espera la entrada del teclado).
En el búfer de Shell, los prompts se muestran con la cara comint-highlight-prompt
, y las líneas de entrada enviadas se muestran con la cara comint-highlight-input
. Esto facilita distinguir las líneas de entrada de la salida del intérprete de comandos. Véase 15.8. Caras de Texto.
Para hacer múltiples subshells, invoque M-x shell
con un argumento prefijo (por ejemplo, C-u M-x shell
). Entonces el comando leerá un nombre de búfer, y creará (o reutilizará) un subshell en ese búfer. También puede cambiar el nombre del búfer *shell*
utilizando M-x rename-uniquely
, y luego crear un nuevo búfer *shell*
utilizando M-x shell
simple. Las subcarpetas en diferentes búferes se ejecutan independientemente y en paralelo.
Emacs intenta hacer un seguimiento de cuál es el directorio actual mirando los comandos que se introducen, buscando comandos cd
y similares. Esta es una solución propensa a errores, ya que hay muchas maneras de cambiar el directorio actual, por lo que Emacs también busca códigos de escape OSC (Operating System Commands, Comandos del Sistema Operativo) especiales que están diseñados para transmitir esta información de una manera más fiable. Debe hacer que su shell imprima la secuencia de escape apropiada en cada prompt, por ejemplo con el siguiente comando:
printf "\e]7;file://%s%s\e\\" "$HOSTNAME" "$PWD"
Para especificar el nombre del fichero shell usado por M-x shell
, personalice la variable explicit-shell-file-name
. Si es nil
(por defecto), Emacs usa la variable de entorno ESHELL
si existe. Si no, normalmente usa la variable shell-file-name
(ver 39.1 Comandos de shell Simples); pero si el directorio por defecto es remote (ver 19.15 Archivos Remotos), te pregunta por el nombre del archivo de shell. Ver 19.2 Visitar Archivos, para pistas sobre cómo escribir nombres de archivos remotos de forma efectiva.
Emacs envía a la nueva shell el contenido del fichero ~/.emacs_nombre_shell
como entrada, si existe, donde nombre_shell es el nombre del fichero desde el que se cargó la shell. Por ejemplo, si usa bash, el archivo que se le envía es ~/.emacs_bash
. Si este fichero no se encuentra, Emacs lo intenta con ~/.emacs.d/init_shellname.sh
.
Para especificar un sistema de codificación para la shell, puede usar el comando C-x RET c
inmediatamente antes de M-x shell
. También puede cambiar el sistema de codificación para un subshell en ejecución escribiendo C-x RET p
en el búfer del shell. Véase 23.10 Sistemas Codificación para la Comunicación Interprocesos.
Emacs establece la variable de entorno INSIDE_EMACS
en la subshell a version,comint
, donde version es la versión de Emacs (por ejemplo, 29.1
). Los programas pueden comprobar esta variable para determinar si se están ejecutando dentro de una subshell de Emacs.
39.3 Modo Shell
El modo principal para los búferes de Shell es el modo Shell. Muchos de sus comandos especiales están ligados al prefijo C-c
, y se asemejan a los caracteres habituales de edición y control de trabajos presentes en los shells ordinarios, excepto que primero debe teclear C-c
. He aquí una lista de comandos del modo Shell:
RETURN (RET
)
Envía la línea actual como entrada a la subshell (
comint-send-input
). Se omite cualquier petición de la shell al principio de la línea (véase 39.4 Avisos de Shell). Si el punto está al final del búfer, esto es como enviar la línea de comandos en un shell interactivo ordinario. Sin embargo, también puede invocarRET
en cualquier parte del búfer de la shell para enviar la línea actual como entrada.
TAB (TAB
)
Completa el nombre del comando o del fichero antes del punto en el búfer de la shell (
completion-at-point
). Esto usa las reglas de completado habituales de Emacs (ver 9.4 Completado), con las alternativas de completado siendo nombres de archivo, nombres de variables de entorno, el historial de comandos del shell y referencias al historial (ver 39.5.3. Referencias al Historial del Shell). Para las opciones que controlan el completado, vea 39.7 Opciones del Modo Shell.
Alt-? (M-?
)
Muestra temporalmente una lista de las posibles terminaciones del nombre de archivo antes del punto (
comint-dynamic-list-filename-completions
).
Ctrl-d (C-d
)
Borra un carácter o envía EOF (
comint-delchar-or-maybe-eof
). Si se escribe al final del búfer de la shell, se envía EOF a la subshell. Si se escribe en cualquier otra posición del búfer, se borra un carácter de la forma habitual.
Ctrl-c Ctrl-a (C-c C-a
)
Se mueve al principio de la línea, pero después del prompt si lo hay (
comint-bol-or-process-mark
). Si repite este comando dos veces seguidas, la segunda vez se mueve de nuevo a la marca de proceso, que es el principio de la entrada que todavía no ha enviado a la subshell. (Normalmente ese es el mismo lugar-el final del prompt en esta línea- pero después deC-c SPC
la marca de proceso puede estar en una línea anterior).
Ctrl-c SPACE (C-c SPC
)
Acumula varias líneas de entrada y las envía juntas (
comint-accumulate
). Este comando inserta una nueva línea antes del punto, pero no envía el texto precedente como entrada al subshell, al menos, no todavía. Ambas líneas, la anterior a esta nueva línea y la posterior, se enviarán juntas (junto con la nueva línea que las separa), cuando escriba RET (RET
).
Ctrl-c Ctrl-u (C-c C-u
)
Mata todo el texto pendiente al final del búfer para ser enviado como entrada (
comint-kill-input
). Si el punto no está al final del búfer, esto sólo mata la parte de este texto que precede al punto.
Ctrl-c Ctrl-w (C-c C-w
)
Mata una palabra antes del punto (
backward-kill-word
).
Ctrl-c Ctrl-c (C-c C-c
)
Interrumpe el shell o su subjob (proceso hijo) actual, si existe (
comint-interrupt-subjob
). Este comando también elimina cualquier entrada del intérprete de órdenes pendiente en el búfer del intérprete de órdenes y aún no enviada.
Ctrl-c Ctrl-z (C-c C-z
)
Detiene el shell o su subjob (proceso hijo) actual si existe (
comint-stop-subjob
). Este comando también elimina cualquier entrada del intérprete de órdenes pendiente en el búfer del intérprete de órdenes y aún no enviada.
Ctrl-c Ctrl-\ (C-c C-\
)
Envía una señal de salida al shell o a su subjob (proceso hijo) actual si existe (
comint-quit-subjob
). Este comando también mata cualquier entrada del shell pendiente en el búfer del shell y aún no enviada.
Ctrl-c Ctrl-o (C-c C-o
)
Borra el último lote de salida de un comando shell (
comint-delete-output
). Esto es útil si un comando de shell arroja mucha salida que simplemente estorba. Con un prefijo como argumento, este comando guarda el texto borrado en elkill-ring
(ver 13.2.1 Anillo de Muertes), de forma que más tarde pueda borrarlo (ver 13.2 Tirar de un Texto) en otro lugar.
Ctrl-c Ctrl-s (C-c C-s
)
Escribe el último lote de salida de un comando del shell en un archivo (
comint-write-output
). Con un argumento prefijo, en su lugar se añade el archivo. Cualquier prompt al final la salida no se escribe.
C-c C-r
)C-M-l
)Se desplaza para mostrar el principio del último lote de salida en la parte superior de la ventana; también desplaza el cursor hasta allí (
comint-show-output
).
Ctrl-c Ctrl-e (C-c C-e
)
Se desplaza para colocar la última línea del búfer en la parte inferior de la ventana (
comint-show-maximum-output
).
Ctrl-c Ctrl-f (C-c C-f
)
Avanza un comando del shell, pero no más allá de la línea actual (
shell-forward-command
). La variableshell-command-regexp
especifica cómo reconocer el final de un comando.
Ctrl-c Ctrl-b (C-c C-b
)
Retrocede un comando del shell, pero no más allá de la línea actual (
shell-backward-command
).
Alt-x dirs
(M-x dirs
)
Pregunta al shell por su directorio de trabajo, y actualiza el directorio por defecto del búfer Shell. Véase 39.6 Seguimiento de Directorios.
comint-send-invisible
RETURN texto RETURNM-x comint-send-invisible RET
texto RET
)Envía texto como entrada al shell, después de leerlo sin hacer eco. Esto es útil cuando un comando del shell ejecuta un programa que pide una contraseña.
Tenga en cuenta que Emacs no hará eco de las contraseñas por defecto. Si realmente quiere que se hagan eco, evalúe (vea 28.9. Evaluación de Expresiones Emacs Lisp) la siguiente expresión Lisp:
(remove-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt)
Alt-x comint-continue-subjob
(M-x comint-continue-subjob
)
Continúa el proceso shell. Esto es útil si accidentalmente suspende el proceso shell. [22]
Alt-x comint-strip-ctrl-m
(M-x comint-strip-ctrl-m
)
Descarta todos los caracteres control-M del grupo actual de salida del shell. La forma más cómoda de utilizar este comando es hacer que se ejecute automáticamente cuando obtenga la salida del subshell. Para ello, evalúe esta expresión Lisp:
(add-hook 'comint-output-filter-functions 'comint-strip-ctrl-m)
Alt-x comint-truncate-buffer
(M-x comint-truncate-buffer
)
Este comando trunca el búfer del shell a un cierto número máximo de líneas, especificado por la variable
comint-buffer-maximum-size
. A continuación se muestra cómo hacer esto automáticamente cada vez que se obtiene salida de la subshell:(add-hook 'comint-output-filter-functions 'comint-truncate-buffer)
Por defecto, el modo Shell maneja los códigos de escape ANSI comunes (por ejemplo, para cambiar el color del texto). Emacs también soporta opcionalmente algunos códigos de escape extendidos, como algunos de los OSC (Operating System Codes, Códigos del Sistema Operativo) si pone lo siguiente en su fichero init:
(add-hook 'comint-output-filter-functions 'comint-osc-process-output)
Con esta opción activada, la salida de, por ejemplo, ls --hyperlink
se convertirá en botones clicables en el búfer del modo Shell.
El modo Shell es un derivado del modo Comint, un modo de propósito general para comunicarse con subprocesos interactivos. La mayoría de las características del modo Shell provienen en realidad del modo Comint, como se puede ver en los nombres de los comandos listados anteriormente. Las características especiales del modo Shell incluyen la característica de rastreo de directorios, y algunos comandos de Usuario.
Otras características de Emacs que usan variantes del modo Comint incluyen GUD (ver 28.6. Ejecutar Depuradores en Emacs) y M-x run-lisp
(ver 28.11. Ejecutar un Lisp externo).
Puede usar M-x comint-run
para ejecutar cualquier programa de su elección en un subproceso usando el modo Comint sin modificar -sin las especializaciones del modo Shell. Para pasar argumentos al programa, utilice C-u M-x comint-run
.
39.4 Avisos de Shell
Un prompt es la salida de texto de un programa para mostrar que está listo para aceptar nuevas entradas del usuario. Normalmente, el modo Comint (y por tanto el modo Shell) calcula automáticamente qué parte del búfer es un prompt, basándose en la salida del subproceso. (Específicamente, asume que cualquier línea de salida recibida que no termine con una nueva línea es un prompt).
El modo Comint divide el búfer en dos tipos de campos: campos de entrada (donde se teclea la entrada del usuario) y campos de salida (en todos los demás lugares). Los prompt forman parte de los campos de salida. La mayoría de los comandos de movimiento de Emacs no cruzan los límites de los campos, a menos que se muevan por varias líneas. Por ejemplo, cuando el punto está en el campo de entrada en una línea de comandos de shell, C-a
pone punto al principio del campo de entrada, después del prompt. Internamente, los campos se implementan usando la propiedad de texto de campo (ver Propiedades de Texto en el Manual de Referencia de Emacs Lisp).
Si cambia la variable comint-use-prompt-regexp
a un valor no nulo, el modo Comint reconocerá los avisos utilizando una expresión regular (véase 16.6 Sintaxis de las Expresiones Regulares). En el modo Shell, la expresión regular se especifica mediante la variable shell-prompt-pattern
. El valor por defecto de comint-use-prompt-regexp
es nil
, porque este método para reconocer prompts no es fiable, pero puede que quiera establecerlo a un valor no nil
en circunstancias inusuales. En ese caso, Emacs no divide el búfer Comint en campos, por lo que los comandos de movimiento generales se comportan como lo hacen normalmente en búferes sin propiedades de texto especiales. Sin embargo, puede usar los comandos de movimiento de párrafo para navegar convenientemente por el búfer (ver 26.3 Párrafos); en modo Shell, Emacs usa shell-prompt-pattern
como límites de párrafo.
39.5 Historial de Órdenes del Shell
Los búferes del intérprete de órdenes admiten tres formas de repetir órdenes anteriores. Puede usar teclas como las usadas para el historial del minibúfer; éstas funcionan de forma muy parecida a como lo hacen en el minibúfer, insertando texto de comandos anteriores mientras el punto permanece siempre al final del búfer. Puede moverse por el búfer hasta las entradas anteriores en su lugar original, y luego volver a enviarlas o copiarlas al final. ¡O puede utilizar una referencia histórica al estilo !
.
39.5.1 Anillo del Historial de Shell
M-p
)C-UP
)Recupera el comando shell anterior siguiente (
comint-previous-input
).
M-n
)C-DOWN
)Obtiene el siguiente comando shell anterior (
comint-next-input
).
Alt-r (M-r
)
Inicia una búsqueda incremental de expreg (expesiones regulares) de antiguos comandos del shell (
comint-history-isearch-backward-regexp
).
Ctrl-c Ctrl-x (C-c C-x
)
Obtiene la siguiente orden del historial (
comint-get-next-from-history
).
Ctrl-c . (C-c .
)
Obtiene un argumento de un comando shell anterior (
comint-input-previous-argument
).
Ctrl-c Ctrl-l (C-c C-l
)
Muestra el historial de comandos de shell del búfer en otra ventana (
comint-dynamic-list-input-ring
).
Los búferes de shell proporcionan un historial de los comandos de shell introducidos anteriormente. Para reutilizar comandos de shell del historial, utilice los comandos de edición M-p
, M-n
y M-r
. Funcionan de forma similar a los comandos del historial del minibúfer (consulte 9.5 Historial del Minibúfer), excepto que operan dentro del búfer del intérprete de comandos en lugar de hacerlo en el minibúfer, y M-r
en un búfer del intérprete de comandos invoca la búsqueda incremental a través del historial de comandos del intérprete de comandos.
M-p
recupera un comando del shell anterior hasta el final del búfer del shell. El uso sucesivo de M-p
recupera sucesivamente comandos anteriores de la shell, cada uno reemplazando cualquier texto que ya estuviera presente como entrada potencial de la shell. M-n
hace lo mismo, excepto que encuentra sucesivamente comandos más recientes del búfer. C-UP
funciona como M-p
, y C-DOWN
como M-n
.
El comando de búsqueda en el historial M-r
inicia una búsqueda incremental de expresiones regulares en comandos anteriores del shell. Después de escribir Alt-r (M-r
), comience a escribir la cadena o expresión regular deseada; el último comando del shell que coincida se mostrará en la línea actual. Los comandos de búsqueda incremental tienen sus efectos habituales; por ejemplo, C-s
y C-r
buscan hacia delante y hacia atrás la siguiente coincidencia (consulte 16.1 Búsqueda Incremental). Cuando encuentre la entrada deseada, escriba RETURN (RET
) para finalizar la búsqueda. Esto coloca la entrada en la línea de comandos. Cualquier entrada parcial que estuviera componiendo antes de navegar por la lista del historial se restaura cuando va al principio o al final del anillo del historial.
A menudo es útil reejecutar varios comandos sucesivos del shell que se ejecutaron secuencialmente previamente. Para ello, primero busque y vuelva a ejecutar el primer comando de la secuencia. A continuación, escriba Ctrl-c Ctrl-x (C-c C-x
) para obtener el siguiente comando, el que sigue al que acaba de repetir. A continuación, escriba RETURN (RET
) para volver a ejecutar este comando. Puede volver a ejecutar varios comandos sucesivos escribiendo Ctrl-c Ctrl-x RETURN (C-c C-x RET
) una y otra vez.
El comando C-c .
(comint-insert-previous-argument
) copia un argumento individual de un comando anterior, como ESC .
en Bash y zsh
. El uso más simple copia el último argumento del comando shell anterior. Con un argumento prefijo n, copia el enésimo argumento en su lugar. Repetir C-c .
copia desde un comando shell anterior, siempre usando el mismo valor de n (no de un argumento prefijo cuando repita el comando C-c .
).
Si establece comint-insert-previous-argument-from-end
a un valor no nulo, C-c .
copiará en su lugar el enésimo argumento contando desde el último; esto emula ESC . en zsh
.
Estos comandos obtienen el texto de comandos anteriores del intérprete de comandos de una lista especial del historial, no del propio búfer del intérprete de comandos. Por lo tanto, editar el búfer del intérprete de comandos, o incluso eliminar grandes partes del mismo, no afecta al historial al que acceden estos comandos.
Algunas shell almacenan sus historiales de órdenes en archivos para que pueda consultar órdenes de sesiones anteriores de la shell. Emacs lee el fichero de historial de comandos de la shell elegida, para inicializar su propio historial de comandos. El nombre del fichero es ~/.bash_history
para bash, ~/.sh_history
para ksh
, y ~/.history
para otras shell.
Si ejecuta el intérprete de comandos en un host remoto, la variable tramp-histfile-override
puede sobrescribir esta configuración. Se recomienda establecer esta variable en nil
.
39.5.2 Copiar el Historial del Shell
Ctrl-c Ctrl-p (C-c C-p
)
Mueve el punto al prompt anterior (
comint-previous-prompt
).
Ctrl-c Ctrl-n (C-c C-n
)
Mueve el punto al siguiente prompt (
comint-next-prompt
).
Ctrl-c RETURN (C-c RET
)
Copia el comando de entrada en el punto, insertando la copia al final del búfer (
comint-copy-old-input
). Esto es útil si desplaza el punto a un comando anterior. Después de copiar el comando, puede enviar la copia como entrada conRET
. Si lo desea, puede editar la copia antes de volver a enviarla. Si usa este comando en una línea de salida, copia esa línea al final del búfer.
ratón-2
Si
comint-use-prompt-regexp
esnil
(por defecto), copia el comando de entrada antiguo sobre el que se hace clic, insertando la copia al final del búfer (comint-insert-input
). Sicomint-use-prompt-regexp
no esnil
, o si el clic no es sobre la entrada antigua, simplemente tira como de costumbre.
Desplazarse a una entrada anterior y luego copiarla con C-c RET
o ratón-2
produce los mismos resultados -el mismo contenido del búfer- que obtendría utilizando M-p
suficientes veces para recuperar esa entrada anterior de la lista del historial. Sin embargo, C-c RET
copia el texto del búfer, que puede ser diferente de lo que hay en la lista del historial si edita el texto de entrada en el búfer después de haberlo enviado.
39.5.3. Referencias al Historial del Shell
Varios shells, incluyendo csh y bash, soportan referencias históricas que comienzan con !
y ^
. El modo Shell reconoce estas construcciones y puede realizar la sustitución del historial por Usted mismo.
Si inserta una referencia histórica y teclea TAB (TAB
), se buscará en el historial de entrada un comando que coincida, se realizará la sustitución si es necesario, y se colocará el resultado en el búfer en lugar de la referencia histórica. Por ejemplo, puede buscar la orden más reciente que empiece por mv
con !mvTAB (! m v TAB
). Si lo desea, puede editar la orden y, a continuación, volver a enviarla al intérprete de comandos escribiendo RETURN (RET
).
El modo shell puede expandir opcionalmente las referencias del historial en el búfer cuando las envía al shell. Para ello, establezca la variable comint-input-autoexpand
en input
. Puede hacer que SPC
realice la expansión del historial vinculando SPACE (SPC
) al comando comint-magic-space
. Consulte 50.3.5. Cambiar las combinaciones de teclas interactivamente.
El modo Shell reconoce las referencias al historial cuando siguen a un prompt. Consulte 39.4 Avisos de Shell, para ver cómo el modo Shell reconoce los avisos.
39.6 Seguimiento de Directorios
El modo Shell realiza un seguimiento de los comandos cd
, pushd
y popd
dados al subshell, para mantener el directorio por defecto del búfer Shell (ver 19.1 Nombres de Archivos) igual que el directorio de trabajo del shell. Reconoce estos comandos examinando las líneas de entrada que envía.
Si usa alias para estos comandos, puede decirle a Emacs que los reconozca también, estableciendo las variables shell-pushd-regexp
, shell-popd-regexp
, y shell-cd-regexp
a las expresiones regulares apropiadas (vea 16.6 Sintaxis de las Expresiones Regulares). Por ejemplo, si shell-pushd-regexp
coincide con el principio de una línea de comandos del shell, esa línea se considera un comando pushd
. Estos comandos sólo se reconocen al principio de una línea de comandos del shell.
Si Emacs se confunde con los cambios en el directorio de trabajo del subshell, escriba Alt-x dirs
(M-x dirs
). Este comando pregunta al shell por su directorio de trabajo y actualiza el directorio por defecto en consecuencia. Funciona para shells que soportan la sintaxis de comandos más común, pero puede no funcionar para shells poco comunes.
También puede utilizar el modo Dirtrack, un modo menor de búfer local que implementa un método alternativo de seguimiento del directorio de trabajo del intérprete de comandos. Para utilizar este método, el prompt de su shell debe contener el directorio de trabajo en todo momento, y debe proporcionar una expresión regular para reconocer qué parte del prompt contiene el directorio de trabajo; consulte la documentación de la variable dirtrack-list
para más detalles. Para utilizar el modo Dirtrack, escriba Alt-x dirtrack-mode
(M-x dirtrack-mode
) en el búfer de Shell, o añada dirtrack-mode
a shell-mode-hook
(ver 50.2.2 Ganchos (Hooks)).
39.7 Opciones del Modo Shell
Si la variable comint-scroll-to-bottom-on-input
es distinta de nil
, los comandos de inserción y yank desplazan la ventana seleccionada hasta el final antes de insertar. El valor por defecto es nil
.
Si comint-scroll-show-maximum-output
es no nil
, la llegada de la salida cuando el punto está al final intenta desplazar la última línea de texto hasta la línea inferior de la ventana, mostrando tanto texto útil como sea posible. (Esto imita el comportamiento de desplazamiento de la mayoría de los terminales.) El valor por defecto es t
.
Configurando comint-move-point-for-output
, puede optar por que el punto salte al final del búfer cuando llegue la salida, sin importar en qué punto del búfer estaba antes. Si el valor es this
, el punto salta en la ventana seleccionada. Si el valor es all
, el punto salta en cada ventana que muestre el búfer Comint. Si el valor es other
, el punto salta en todas las ventanas no seleccionadas que muestren el búfer actual. El valor por defecto es nil
, lo que significa que el punto no salta al final.
Si establece comint-prompt-read-only
, las indicaciones en el búfer Comint son de sólo lectura.
La variable comint-input-ignoredups
controla si se almacenan entradas idénticas sucesivas en el historial de entradas. Un valor no nulo significa omitir una entrada que sea igual a la entrada anterior. El valor por defecto es nil
, que significa almacenar cada entrada incluso si es igual a la entrada anterior.
Tres variables personalizan el completado del nombre de archivo. La variable comint-completion-addsuffix
controla si el completado inserta un espacio o una barra para indicar un nombre de fichero o directorio completamente completado (no nil
significa insertar un espacio o una barra). comint-completion-recexact
, si no es nil
, indica a TAB
que elija el completado más corto posible si el algoritmo de completado habitual de Emacs no puede añadir ni un solo carácter. comint-completion-autolist
, si no es nil
, indica que se listen todos los completados posibles siempre que el completado no sea exacto.
La terminación de comandos normalmente sólo considera los archivos ejecutables. Si establece shell-completion-execonly
a nil
, considera también los archivos no ejecutables.
La variable shell-completion-fignore
especifica una lista de extensiones de nombres de archivo a ignorar en el completado en modo Shell. El valor predeterminado es nil
, pero algunos Usuarios prefieren ("~" "#" "%"
) ignorar los nombres de archivo que terminan en ~
, #
o %
. Otros modos Comint relacionados utilizan la variable comint-completion-fignore
en su lugar.
También se pueden encontrar algunos detalles de implementación de la finalización de órdenes del shell en la documentación lisp de la función shell-dynamic-complete-command
.
Puede configurar el comportamiento de pushd
. Las variables controlan si pushd
se comporta como cd
si no se da ningún argumento (shell-pushd-tohome
), pop en lugar de rotate con un argumento numérico (shell-pushd-dextract
), y sólo añade directorios a la pila de directorios si no están ya en ella (shell-pushd-dunique
). Los valores que elija deben coincidir con el shell subyacente, por supuesto.
El modo Comint establece la variable de entorno TERM
a un valor por defecto seguro, pero este valor deshabilita algunas características útiles. Por ejemplo, el color está deshabilitado en las aplicaciones que usan TERM
para determinar si se admite el color. Por lo tanto, Emacs proporciona una opción comint-terminfo-terminal
que le permite elegir un terminal con características más avanzadas, como se define en la base de datos terminfo de su sistema. Emacs usará esta opción como el valor de TERM
siempre que system-uses-terminfo
no sea nulo.
Tanto comint-terminfo-terminal
como system-uses-terminfo
pueden declararse como variables connection-local
para ajustar estas opciones a lo que espera un sistema remoto (ver 50.2.6 Variables locales por conexión).
39.8 Emulador de Terminal Emacs
Para ejecutar un subshell en un emulador de terminal de texto, use M-x term
. Esto crea (o reutiliza) un búfer llamado *terminal*
, y ejecuta un subshell con la entrada proveniente de su teclado, y la salida va a ese búfer.
El emulador de terminal utiliza el modo Term, que tiene dos modos de entrada. En modo de línea, Term básicamente actúa como el modo Shell (ver 39.2 Subshell Interactiva). En el modo char, cada carácter se envía directamente al subshell, como entrada de terminal; la única excepción es el carácter de escape de terminal, que por defecto es C-c
(ver 39.9 Modo Term). Cualquier eco de su entrada es responsabilidad del subshell; cualquier salida terminal del subshell va al búfer, punto de avance.
Algunos programas (como Emacs mismo) necesitan controlar la apariencia de la pantalla del terminal en detalle. Lo hacen emitiendo códigos de control especiales. El modo Term reconoce y maneja secuencias de escape tipo VT100 estándar ANSI, que son aceptadas por la mayoría de los terminales modernos, incluyendo xterm
. (Por lo tanto, puede ejecutar Emacs dentro de una ventana de Emacs Term).
La cara de term
(term face) especifica la apariencia predeterminada del texto en el emulador de terminal (la apariencia predeterminada es la misma que la cara predeterminada). Cuando se usan códigos de control de terminal para cambiar la apariencia del texto, estos se representan en el emulador de terminal con las caras term-color-black
(term-color-negro), term-color-red
(term-color-rojo), term-color-green
(term-color-verde), term-color-yellow
(term-color-amarillo), term-color-blue
(term-color-azul), term-color-magenta
, term-color-cyan
, term-color-white
(term-color-blanco), term-color-underline
(term-color-subrayado), and term-color-bold
(term-color-negrita). Ver 15.8. Caras de Texto.
También puede usar el modo Term para comunicarse con un dispositivo conectado a un puerto serie. Consulte 39.11 Terminal en Serie.
El nombre de archivo utilizado para cargar el subshell se determina de la misma manera que para el modo Shell. Para hacer múltiples emuladores de terminal, renombrar el búfer *terminal*
a algo diferente usando M-x rename-uniquely
, al igual que con el modo Shell.
A diferencia del modo Shell, el modo Term no realiza un seguimiento del directorio actual mediante el examen de su entrada. Pero algunos shells pueden decirle a Term cuál es el directorio actual. Esto se hace automáticamente con bash
versión 1.15 y posteriores.
39.9 Modo Term
Para cambiar entre modo línea y modo char en el modo Term, utilice estos comandos:
Ctrl-c Ctrl-j (C-c C-j
)
Cambia al modo línea (term-line-mode). No hace nada si ya está en modo línea.
Ctrl-c Ctrl-k (C-c C-k
)
Cambia al modo char (
term-char-mode
). No hace nada si ya está en modo char.
Los siguientes comandos sólo están disponibles en modo char:
Ctrl-c Ctrl-c (C-c C-c
)
Envía un literal
C-c
a la subcarpeta (term-interrupt-subjob
).
Ctrl-c caracter (C-c
caracter)
Esto es equivalente a
C-x
caracter en Emacs normal. Por ejemplo,C-c o
invoca el enlace global deC-x o
, que normalmente esother-window
(otra-ventana).
El modo Term tiene una función de página a página. Cuando está activada, hace que la salida se detenga al final de cada pantalla:
Ctrl-c Ctrl-q (C-c C-q
)
Activa la función de página a página (
term-pager-toggle
). Este comando funciona tanto en modo línea como en modo char. Cuando la función está activada, la línea de modo muestra la palabrapage
(página), y cada vez que Term recibe más de una pantalla de salida, hace una pausa y muestra**MORE**
(MÁS) en la línea de modo. Escriba SPACE (SPC
) para ver la siguiente pantalla llena, o?
para ver las demás opciones. La interfaz es similar a la del programamore
.
39.10 Shell de Host Remoto
Puede conectarse a un ordenador remoto, utilizando cualquier comando que utilizaría desde un terminal normal (por ejemplo, el comando ssh
), desde una ventana Term.
Un programa que le pida una contraseña normalmente suprimirá el eco de la contraseña, por lo que la contraseña no aparecerá en el búfer. Esto ocurrirá como si estuviera usando un terminal real, si el búfer está en modo char. Si está en modo línea, la contraseña será visible temporalmente, pero se borrará cuando pulse RETURN (RET
). (Esto ocurre automáticamente; no hay ningún procesamiento especial de la contraseña).
Cuando se conecta a una máquina diferente, necesita especificar el tipo de terminal que está utilizando, estableciendo la variable de entorno TERM
en el entorno para el comando de conexión remota. (Si usa bash
, hágalo escribiendo la asignación de la variable antes del comando de inicio de sesión remoto, sin una coma de separación). Los tipos de terminal ansi
o vt100
funcionarán en la mayoría de los sistemas.
39.11 Terminal en Serie
Si tiene un dispositivo conectado a un puerto serie de su ordenador, puede comunicarse con él escribiendo Alt-x serial-term
(M-x serial-term
). Este comando pregunta por el nombre y la velocidad del puerto serie, y cambia a un nuevo búfer en modo Term. Emacs se comunica con el dispositivo serie a través de este búfer como lo hace con un terminal en modo Term ordinario.
La velocidad del puerto serie se mide en bits por segundo. La velocidad más común es 9600 bits por segundo. Puede cambiar la velocidad interactivamente haciendo clic en la línea de modo.
Un puerto serie puede configurarse aún más haciendo clic en 8N1
en la línea de modo. Por defecto, un puerto serie está configurado como 8N1
, lo que significa que cada byte consta de 8 bits de datos, Ningún bit de comprobación de paridad y 1 bit de parada.
Si la velocidad o la configuración son incorrectas, no podrá comunicarse con su dispositivo y probablemente sólo verá salida basura en la ventana.