No Terminal GNOME, o Bash faz o preenchimento automático inteligente. Por exemplo
apt-get in<TAB>
torna-se
apt-get install
No modo shell do Emacs, esse preenchimento automático não funciona, mesmo depois que eu explicitamente o código /etc/bash_completion
. O exemplo acima se fixa in
ou se completa automaticamente com um nome de arquivo no diretório atual em vez de uma apt-get
opção de comando válida . Presumivelmente, isso ocorre porque o Emacs está interceptando o pressionamento da tecla Tab. Como habilito o preenchimento automático inteligente shell-mode
?
bash
shell
emacs
autocomplete
Chris Conway
fonte
fonte
eshell-mode
que tem preenchimento com guia. Mais informações aqui: masteringemacs.org/articles/2010/11/01/…Respostas:
Sei que essa pergunta tem três anos, mas é algo que também estou interessado em resolver. Uma pesquisa na Web me direcionou para um pedaço de elisp que faz o Emacs usar o bash para completar no modo shell. Funciona para mim, em qualquer caso.
Confira em https://github.com/szermatt/emacs-bash-completion .
fonte
M-x package-list-packages
, mas no final não funcionou para mim, não sei porque, pode ser meu emacs (24.3.1) ou versão bash (4.3.30). A documentação diz "bash-completed.el é bastante sensível ao sistema operacional e à versão do BASH ..." então é uma lista onde minhas versões estão ausentes.No shell do emacs, na verdade é o emacs fazendo o preenchimento automático, não o bash. Se o shell e o emacs estiverem fora de sincronia (por exemplo, usando pushd, popd ou alguma função de usuário bash que muda o diretório atual do shell), então o autocompletar para de funcionar.
Para corrigir isso, basta digitar 'dirs' no shell e as coisas voltam a sincronizar.
Eu também tenho o seguinte em meu .emacs:
Em seguida, apenas pressionar Esc-return sincroniza novamente o preenchimento automático.
fonte
Eu não sei a resposta para isso. Mas a razão pela qual não funciona como você espera é provavelmente porque o preenchimento em shells emacs é tratado pelo emacs internamente (pela função comint-dynamic-complete) e não tem essas funções de conclusão inteligente embutidas.
Receio que não seja uma coisa fácil de consertar.
Edit: a sugestão do njsf de usar o modo term é provavelmente o melhor que pode acontecer. Comece com
Ele está incluído na distribuição emacs padrão (e no emacs21-common ou emacs22-common no Ubuntu e Debian pelo menos).fonte
M-x term
.Como Matli disse, não é uma tarefa fácil, já que o bash é iniciado com --noediting e TAB é vinculado a comint-dynamic-complete.
É possível religar TAB ao comando self-insert no shell-comand-hook com local-set-key e fazer com que o modo shell não comece com --noediting por Mx customize-variable RET explicit-bash-args, mas eu suspeito que não vai se encaixar bem com todas as outras edições.
Você pode querer tentar o modo de termo, mas ele tem outro conjunto de problemas, porque alguns dos outros atalhos de teclado regulares são substituídos pelo modo de termo.
EDIT: Por outros keybidings regulares sendo ultrapassados pelo modo de termo, quero dizer todos, exceto Cc, que se torna a saída para ser capaz de alternar os buffers. Então, em vez de Cx k para matar o buffer, você teria que Cc Cx k. Ou para mudar para outro buffer 'Cc Cx o' ou 'Cc Cx 2'
fonte
Por favor, considere outro modo
M-x term
, como eu fiz quando atingi o problema em 2011. Eu tentei reunir todos os esforços no Inet naquela época para fazer o shell funcionar com a conclusão do Bash, incluindo esta questão. Mas desde que descobri alternativas diante determ-mode
não quero nem tentareshell
.É um emulador de terminal completo, para que você possa executar um programa interativo dentro dele, como o Midnight commander. Ou mude para a
zsh
conclusão para não perder tempo na configuração do Emacs.Você obtém a conclusão TAB no bash gratuitamente. Mas o mais importante é que você obtenha o poder total do Readline, como pesquisa de comando incremental ou prefixada . Para tornar esta configuração mais conveniente, verifique meus .inputrc , .bashrc , .emacs .
Parte essencial de
.inputrc
:.bashrc
(SIM! Há dabbrev em Bash de qualquer palavra em~/.bash_history
):.emacs
para tornar a navegação confortável no buffer de termo:Como qualquer comando usual, pois
C-x o
não está funcionando no modo de emulação de terminal, estendi o mapa de teclado com:Observe que eu uso a
super
chave para que,term-raw-map
possivelmente, qualquer outro mapa de teclado não entre em conflito com minhas combinações de teclas. Para fazer asuper
chave a partir da esquerda,Win
eu uso.xmodmaprc
:Você apenas deve se lembrar de 2 comandos:
C-c C-j
- para entrar no modo de edição normal do Emacs (para copiar ou fazer o grep no texto do buffer),C-c C-k
- para retornar ao modo de emulação de terminal.Seleção do mouse e
Shift-Insert
trabalho como emxterm
.fonte
.inputrc
parte!Eu uso o Prelude e quando clico em Meta + Tab, ele é concluído para mim.
Além disso, Ctrl + i parece fazer a mesma coisa.
fonte
Eu sei que este post já tem mais de 11 anos. Mas eu criei uma função para fornecer a conclusão do shell nativo no Emacs. Ele apenas envia uma tecla tab para o processo subjacente e intercepta a saída, de modo que é exatamente o mesmo que você obteria no próprio shell.
https://github.com/CeleritasCelery/emacs-native-shell-complete
fonte
Eu uso o modo de leme. Possui esta funcionalidade (após pressionar "TAB"):
fonte
Não reivindico ser um especialista em emacs, mas isso deve resolver o seu problema:
Crie: ~ / .emacs
Adicione a ele:
(requer 'shell-command) (shell-command-complete-mode)
O Emacs assume o controle do shell para que as configurações do BASH não sejam executadas. Isso definirá o preenchimento automático para o próprio EMACS.
fonte