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.