Dans le terminal GNOME, Bash effectue l'auto-complétion intelligente. Par exemple
apt-get in<TAB>
devient
apt-get install
En mode shell d'Emacs, cette auto-complétion ne fonctionne pas, même après avoir explicitement source /etc/bash_completion
. L'exemple ci-dessus colle comme in
ou se complète automatiquement avec un nom de fichier dans le répertoire courant plutôt qu'une apt-get
option de commande valide . Vraisemblablement, c'est parce qu'Emacs intercepte la touche Tab. Comment activer la complétion automatique intelligente dans shell-mode
?
bash
shell
emacs
autocomplete
Chris Conway
la source
la source
eshell-mode
qui a l'achèvement de l'onglet. Plus d'infos ici: masteringemacs.org/articles/2010/11/01/…Réponses:
Je sais que cette question remonte à trois ans, mais c'est quelque chose que j'ai également voulu résoudre. Une recherche sur le Web m'a dirigé vers un élément d'elisp qui fait qu'Emacs utilise bash pour la complétion en mode shell. Cela fonctionne pour moi, en tout cas.
Découvrez-le sur https://github.com/szermatt/emacs-bash-completion .
la source
M-x package-list-packages
, mais à la fin cela n'a pas fonctionné pour moi, je ne sais pas pourquoi, c'est peut-être mon emacs (24.3.1) ou version bash (4.3.30). La documentation dit "bash-completion.el est assez sensible à l'OS et à la version BASH ..." alors est une liste où mes versions sont absentes.Dans le shell emacs, c'est en fait emacs qui effectue l'auto-complétion, pas bash. Si le shell et emacs ne sont pas synchronisés (par exemple en utilisant pushd, popd ou une fonction utilisateur bash qui change le répertoire courant du shell), alors l'auto-complétion cesse de fonctionner.
Pour résoudre ce problème, tapez simplement «dirs» dans le shell et les choses se synchronisent.
J'ai également les éléments suivants dans mes .emacs:
Ensuite, le simple fait d'appuyer sur Esc-return resynchronise l'auto-complétion.
la source
Je ne connais pas la réponse à cela. Mais la raison pour laquelle cela ne fonctionne pas comme prévu est probablement parce que la complétion dans les shells emacs est gérée par emacs en interne (par la fonction comint-dynamic-complete), et n'a pas ces fonctions de complétion intelligente intégrées.
J'ai bien peur que ce ne soit pas une chose facile à résoudre.
Edit: la suggestion de njsf d'utiliser le mode terme est probablement aussi bonne que possible. Commencez avec
Il est inclus dans la distribution standard emacs (et au moins dans emacs21-common ou emacs22-common sur Ubuntu et Debian).la source
M-x term
.Comme Matli l'a dit, ce n'est pas une tâche facile, car bash est démarré avec --noediting et TAB est lié à comint-dynamic-complete.
On pourrait éventuellement relier TAB à self-insert-command dans shell-comand-hook avec local-set-key et faire en sorte que le mode shell ne commence pas par --noediting by Mx personnalise-variable RET explicit-bash-args, mais je soupçonne que cela ne conviendra pas à toutes les autres modifications.
Vous voudrez peut-être essayer le mode terme, mais il présente un autre ensemble de problèmes, car certaines des autres combinaisons de touches régulières sont dépassées par le mode terme.
EDIT: Par d'autres keybidings réguliers dépassés par le mode terme, je veux dire tout sauf Cc qui devient l'évasion pour pouvoir changer de tampon. Donc, au lieu de Cx k pour tuer le tampon, vous devrez Cc Cx k. Ou pour passer à un autre tampon 'Cc Cx o' ou 'Cc Cx 2'
la source
S'il vous plaît, considérez un autre mode
M-x term
, comme je l'ai fait lorsque j'ai rencontré un problème en 2011. J'ai essayé de rassembler tous les efforts sur Inet à ce moment-là pour faire fonctionner le shell avec l'achèvement de Bash, y compris cette question. Mais depuis queterm-mode
j'ai découvert une alternative face à moi, je n'ai même pas envie d'essayereshell
.C'est un émulateur de terminal complet, vous pouvez donc exécuter un programme interactif à l'intérieur, comme Midnight Commander. Ou passez à la
zsh
fin pour ne pas perdre de temps sur la configuration d'Emacs.Vous obtenez la complétion TAB dans bash gratuitement. Mais plus important encore, vous bénéficiez de toute la puissance de Readline, comme la recherche de commandes incrémentielle ou préfixée . Pour rendre cette configuration plus pratique, vérifiez mon .inputrc , .bashrc , .emacs .
Partie essentielle de
.inputrc
:.bashrc
(OUI! Il y a dabbrev dans Bash de n'importe quel mot dans~/.bash_history
):.emacs
pour rendre la navigation confortable dans le tampon de termes:Comme toutes les commandes habituelles
C-x o
ne fonctionnent pas en mode d'émulation de terminal, j'ai étendu le keymap avec:Notez que j'utilise la
super
cléterm-raw-map
et peut-être que toute autre mappe de touches n'est pas en conflit avec mes raccourcis clavier. Pour créer lasuper
clé à partir de la touche gauche,Win
j'utilise.xmodmaprc
:Vous devez juste vous souvenir de 2 commandes:
C-c C-j
- pour entrer dans le mode d'édition normal d'Emacs (pour copier ou grepping dans le texte du tampon),C-c C-k
- pour revenir en mode d'émulation de terminal.Sélection de la souris et
Shift-Insert
travail comme dansxterm
.la source
.inputrc
partie!J'utilise Prelude et quand je clique sur Meta + Tab, ça se termine pour moi.
De plus, Ctrl + i semble faire la même chose.
la source
Je sais que ce message a plus de 11 ans maintenant. Mais j'ai créé une fonction pour compléter le shell natif dans Emacs. Il envoie simplement une touche de tabulation au processus sous-jacent et intercepte la sortie, donc c'est exactement la même chose que vous obtiendriez dans le shell lui-même.
https://github.com/CeleritasCelry/emacs-native-shell-complete
la source
J'utilise le mode barre. Il a cette fonctionnalité (après avoir appuyé sur "TAB"):
la source
Je ne prétends pas être un expert emacs mais cela devrait résoudre votre problème:
Créer: ~ / .emacs
Ajoutez-y:
(nécessite 'shell-command) (shell-command-completion-mode)
Emacs prend en charge le shell afin que les paramètres BASH ne soient pas appliqués. Cela définira la complétion automatique pour EMACS lui-même.
la source