bash shell emacs autocomplete

Autocompletado de Bash en el modo de shell de Emacs



#!/ bin csh (8)

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 unir TAB para self-insert-command en shell-comand-hook con local-set-key y hacer que el modo shell no comience con --noediting por Mx customize-variable RET explicit-bash-args, pero sospecho que no se sentará 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 claves regulares que son superadas por el modo de término, me refiero a todo menos a Cc, que se convierte en el escape para poder cambiar los buffers. Entonces en lugar de Cx k para matar el buffer, tendrías que Cc Cx k. O para cambiar a otro buffer ''Cc Cx o'' o ''Cc Cx 2''

En la Terminal de GNOME, Bash realiza una autocompletación inteligente. Por ejemplo

apt-get in<TAB>

se convierte

apt-get install

En el modo de shell de Emacs, esta finalización automática no funciona, incluso después de que explícitamente origen /etc/bash_completion . El ejemplo anterior se adhiere o se completa automáticamente con un nombre de archivo en el directorio actual en lugar de una opción válida apt-get comando apt-get . Presumiblemente, esto se debe a que Emacs está interceptando la tecla de tabulación-presionar. ¿Cómo habilito la autocompletación inteligente en shell-mode ?


En el shell de emacs, en realidad es emacs que realiza la finalización automática, no bash. Si el shell y los emacs no están sincronizados (por ejemplo, al usar pushd, popd o alguna función de usuario bash que cambia el directorio actual del shell), entonces la finalización automática deja de funcionar.

Para solucionar esto, simplemente escriba ''dirs'' en el shell y las cosas volverán a estar sincronizadas.

También tengo lo siguiente en mis .emacs:

(global-set-key "/M-/r" ''shell-resync-dirs)

Luego, solo presionando Esc-return resintoniza la finalización automática.


No pretendo ser un experto en emacs, pero esto debería resolver su problema:

Crear: ~ / .emacs

Agregar a esto:

(requiere ''shell-command) (shell-command-completion-mode)

Emacs se hace cargo del shell para que la configuración de BASH no se realice. Esto configurará la finalización automática para EMACS.


No sé la respuesta a esto. Pero la razón por la que no funciona como espera es probablemente porque emacs maneja internamente la finalización de los shells de emacs (mediante la función comint-dynamic-complete), y no tiene incorporadas esas funciones inteligentes de finalización.

Me temo que no es algo fácil de arreglar.

Editar: la sugerencia de njsf de usar term-mode es probablemente tan buena como se pueda. Comience con

M-x term Está incluido en la distribución estándar de emacs (y en emacs21-common o emacs22-common en Ubuntu y Debian al menos).


Por favor, considere otro modo de Mx term , como hice esto cuando tuve problemas en 2011. Intenté reunir todos los esfuerzos sobre Inet en ese momento para hacer que el shell funcionara con Bash, incluyendo esta pregunta. Pero desde que descubrí una alternativa frente al term-mode , ni siquiera quiero probar eshell .

Es un emulador de terminal completo, por lo que puede ejecutar el programa interactivo en el interior, como el comandante de medianoche. O cambie a la finalización de zsh para no perder tiempo en la configuración de Emacs.

Obtienes TAB completa en bash gratis. Pero lo más importante es que obtienes plena potencia de lectura, como la búsqueda de comandos incrementales o prefijados . Para hacer que esta configuración sea más conveniente, compruebe mi .inputrc , .bashrc , .emacs .

Parte esencial de .inputrc :

# I like this! set editing-mode emacs # Don''t strip characters to 7 bits when reading. set input-meta on # Allow iso-latin1 characters to be inserted rather than converted to # prefix-meta sequences. set convert-meta off # Display characters with the eighth bit set directly rather than as # meta-prefixed characters. set output-meta on # Ignore hidden files. set match-hidden-files off # Ignore case (on/off). set completion-ignore-case on set completion-query-items 100 # First tab suggests ambiguous variants. set show-all-if-ambiguous on # Replace common prefix with ... set completion-prefix-display-length 1 set skip-completed-text off # If set to ''on'', completed directory names have a slash appended. The default is ''on''. set mark-directories on set mark-symlinked-directories on # If set to ''on'', a character denoting a file''s type is appended to the # filename when listing possible completions. The default is ''off''. set visible-stats on set horizontal-scroll-mode off $if Bash "/C-x/C-e": edit-and-execute-command $endif # Define my favorite Emacs key bindings. "/C-@": set-mark "/C-w": kill-region "/M-w": copy-region-as-kill # Ctrl+Left/Right to move by whole words. "/e[1;5C": forward-word "/e[1;5D": backward-word # Same with Shift pressed. "/e[1;6C": forward-word "/e[1;6D": backward-word # Ctrl+Backspace/Delete to delete whole words. "/e[3;5~": kill-word "/C-_": backward-kill-word # UP/DOWN filter history by typed string as prefix. "/e[A": history-search-backward "/C-p": history-search-backward "/eOA": history-search-backward "/e[B": history-search-forward "/C-n": history-search-forward "/eOB": history-search-forward # Bind ''Shift+TAB'' to complete as in Python TAB was need for another purpose. "/e[Z": complete # Cycling possible completion forward and backward in place. "/e[1;3C": menu-complete # M-Right "/e[1;3D": menu-complete-backward # M-Left "/e[1;5I": menu-complete # C-TAB

.bashrc (¡Sí! Hay dabbrev en Bash a partir de cualquier palabra en ~/.bash_history ):

set -o emacs if [[ $- == *i* ]]; then bind ''"/e/": dabbrev-expand'' bind ''"/ee": edit-and-execute-command'' fi

.emacs para que la navegación sea cómoda en el buffer de términos:

(setq term-buffer-maximum-size (lsh 1 14)) (eval-after-load ''term ''(progn (defun my-term-send-delete-word-forward () (interactive) (term-send-raw-string "/ed")) (defun my-term-send-delete-word-backward () (interactive) (term-send-raw-string "/e/C-h")) (define-key term-raw-map [C-delete] ''my-term-send-delete-word-forward) (define-key term-raw-map [C-backspace] ''my-term-send-delete-word-backward) (defun my-term-send-forward-word () (interactive) (term-send-raw-string "/ef")) (defun my-term-send-backward-word () (interactive) (term-send-raw-string "/eb")) (define-key term-raw-map [C-left] ''my-term-send-backward-word) (define-key term-raw-map [C-right] ''my-term-send-forward-word) (defun my-term-send-m-right () (interactive) (term-send-raw-string "/e[1;3C")) (defun my-term-send-m-left () (interactive) (term-send-raw-string "/e[1;3D")) (define-key term-raw-map [M-right] ''my-term-send-m-right) (define-key term-raw-map [M-left] ''my-term-send-m-left) )) (defun my-term-mode-hook () (goto-address-mode 1)) (add-hook ''term-mode-hook #''my-term-mode-hook)

Como cualquier comando habitual como Cx o no está funcionando en el modo de emulación de terminal amplié el mapa de teclas con:

(unless (ignore-errors (require ''ido) (ido-mode 1) (global-set-key [?/s-d] #''ido-dired) (global-set-key [?/s-f] #''ido-find-file) t) (global-set-key [?/s-d] #''dired) (global-set-key [?/s-f] #''find-file)) (defun my--kill-this-buffer-maybe-switch-to-next () "Kill current buffer. Switch to next buffer if previous command was switching to next buffer or this command itself allowing sequential closing of uninteresting buffers." (interactive) (let ( (cmd last-command) ) (kill-buffer (current-buffer)) (when (memq cmd (list ''next-buffer this-command)) (next-buffer)))) (global-set-key [s-delete] ''my--kill-this-buffer-maybe-switch-to-next) (defun my--backward-other-window () (interactive) (other-window -1)) (global-set-key [s-up] #''my--backward-other-window) (global-set-key [s-down] #''other-window) (global-set-key [s-tab] ''other-window)

Tenga en cuenta que utilizo la super para que term-raw-map y posiblemente cualquier otro term-raw-map teclas no entre en conflicto con mis enlaces de teclas. Para crear una super clave desde la izquierda, la tecla Win uso .xmodmaprc :

! To load this config run: ! $ xmodmap .xmodmaprc ! Win key. clear mod3 clear mod4 keycode 133 = Super_L keycode 134 = Hyper_R add mod3 = Super_L add mod4 = Hyper_R

Solo debe recordar 2 comandos: Cc Cj - para ingresar al modo de edición de Emacs normal (para copiar o almacenar en el texto del búfer), Cc Ck - para volver al modo de emulación de terminal.

La selección del mouse y Shift-Insert funcionan como en xterm .


Sé que esta pregunta tiene tres años, pero es algo que también he estado interesado en resolver. Una búsqueda en la web me dirigió a un fragmento de elisp que hace que Emacs use bash para completarlo en modo shell. Funciona para mí, en cualquier caso.

Compruébelo en https://github.com/szermatt/emacs-bash-completion .


Yo uso Preludio y cuando toco Meta + Tab se completa para mí.

Además, Ctrl + i parece hacer lo mismo.


Yo uso el modo timon. Tiene esta funcionalidad (después de presionar "TAB"):