En la Terminal GNOME, Bash realiza la autocompletación inteligente. Por ejemplo
apt-get in<TAB>
se convierte en
apt-get install
En el modo shell de Emacs, este autocompletado no funciona, incluso después de haber obtenido explícitamente /etc/bash_completion
. El ejemplo anterior se adhiere in
o se completa automáticamente con un nombre de archivo en el directorio actual en lugar de una apt-get
opción de comando válida . Presumiblemente, esto se debe a que Emacs está interceptando la pulsación de la tecla Tab. ¿Cómo habilito la finalización automática inteligente en shell-mode
?
bash
shell
emacs
autocomplete
Chris Conway
fuente
fuente
eshell-mode
que tiene finalización de pestaña. Más información aquí: masteringemacs.org/articles/2010/11/01/…Respuestas:
Sé que esta pregunta tiene tres años, pero es algo que también me ha interesado resolver. Una búsqueda en la Web me dirigió a una pieza de elisp que hace que Emacs use bash para completar en modo shell. En cualquier caso, funciona para mí.
Compruébalo en https://github.com/szermatt/emacs-bash-completion .
fuente
M-x package-list-packages
, pero al final no funcionó para mí, no sé por qué, puede ser mi emacs (24.3.1) o versión bash (4.3.30). La documentación dice que "bash -mentation.el es bastante sensible al sistema operativo y la versión de BASH ..." y luego hay una lista donde mis versiones están ausentes.En el shell de emacs, en realidad es emacs el que realiza el autocompletado, no bash. Si el shell y emacs no están sincronizados (por ejemplo, al usar pushd, popd o alguna función de usuario de bash que cambia el directorio actual del shell), la finalización automática deja de funcionar.
Para solucionar esto, simplemente escriba 'dirs' en el shell y las cosas se volverán a sincronizar.
También tengo lo siguiente en mi .emacs:
Luego, simplemente presionando Esc-return resincroniza el autocompletado.
fuente
No sé la respuesta a esto. Pero la razón por la que no funciona como esperabas es probablemente porque emacs maneja internamente la finalización en shells emacs (mediante la función comint-dynamic-complete) y no tiene incorporadas esas funciones de finalización inteligente.
Me temo que no es fácil de arreglar.
Editar: la sugerencia de njsf de usar el modo de término es probablemente tan buena como parece. Empiece con
Está incluido en la distribución estándar de emacs (y al menos en emacs21-common o emacs22-common en Ubuntu y Debian).fuente
M-x term
.Como dijo Matli, no es una tarea fácil, ya que bash se inicia con --noediting y TAB está obligado a comint-dynamic-complete.
Uno podría posiblemente volver a vincular TAB a self-insert-command en shell-comand-hook con local-set-key y hacer que el modo shell no comience con --noediting por Mx custom-variable RET explicit-bash-args, pero sospecho que no quedará bien con todas las demás ediciones.
Es posible que desee probar el modo de término, pero tiene otro conjunto de problemas, porque algunas de las otras combinaciones de teclas regulares son superadas por el modo de término.
EDITAR: Por otras ofertas de teclas regulares superadas por el modo de término, me refiero a todas menos Cc, que se convierte en el escape para poder cambiar de búfer. Entonces, en lugar de Cx k para matar el búfer, tendrías que Cc Cx k. O para cambiar a otro búfer 'Cc Cx o' o 'Cc Cx 2'
fuente
Por favor, considere otro modo
M-x term
, como lo hice cuando tuve un problema en 2011. Intenté reunir todos los esfuerzos sobre Inet en ese momento para que el shell funcionara con la finalización de Bash, incluida esta pregunta. Pero desde que descubrí la alternativaterm-mode
, ni siquiera quiero intentarloeshell
.Es un emulador de terminal completo, por lo que puede ejecutar un programa interactivo en su interior, como Midnight Commander. O cambie a la
zsh
finalización para no perder tiempo en la configuración de Emacs.Obtienes la finalización de TAB en bash de forma gratuita. Pero lo que es más importante, obtiene toda la potencia de Readline, como la búsqueda de comandos incrementales o con prefijos . Para que esta configuración sea más conveniente, consulte mi .inputrc , .bashrc , .emacs .
Parte esencial de
.inputrc
:.bashrc
(¡SÍ! Hay dabbrev en Bash de cualquier palabra en~/.bash_history
):.emacs
para que la navegación sea cómoda en el búfer de términos:Como cualquier comando habitual
C-x o
no funciona en el modo de emulación de terminal, extendí el mapa de teclas con:Tenga en cuenta que utilizo la
super
claveterm-raw-map
y posiblemente cualquier otro mapa de teclas no entre en conflicto con mis combinaciones de teclas. Para hacer lasuper
clave desde la tecla izquierdaWin
utilizo.xmodmaprc
:Solo debe recordar 2 comandos:
C-c C-j
- para ingresar al modo de edición normal de Emacs (para copiar o hacer grepping en el texto del búfer),C-c C-k
- para regresar al modo de emulación de terminal.Selección del mouse y
Shift-Insert
trabajo como enxterm
.fuente
.inputrc
parte!Uso Preludio y cuando presiono Meta + Tab se completa para mí.
Además, Ctrl + i parece hacer lo mismo.
fuente
Sé que esta publicación tiene más de 11 años. Pero he creado una función para completar el shell nativo en Emacs. Simplemente envía una tecla de tabulación al proceso subyacente e intercepta la salida, por lo que es exactamente lo mismo que obtendría en el propio shell.
https://github.com/CeleritasCelery/emacs-native-shell-complete
fuente
Yo uso el modo timón. Tiene esta funcionalidad (después de presionar "TAB"):
fuente
No pretendo ser un experto en emacs, pero esto debería resolver su problema:
Crear: ~ / .emacs
Añádalo:
(requiere 'comando de shell) (modo de finalización de comando de shell)
Emacs se hace cargo del shell para que la configuración de BASH no se lleve a cabo. Esto establecerá la finalización automática para EMACS.
fuente