Como altero a conclusão do histórico do bash para concluir o que já está em jogo?

133

Encontrei um comando há alguns meses atrás que fazia meu histórico do bash se auto-completar com o que já estava em jogo ao pressionar a seta para cima:

$ vim fi

pressione

$ vim file.py

Eu gostaria de configurar isso no meu novo computador, porque economiza muito tempo ao manter um grande histórico. O problema é que eu não consigo lembrar onde foi mencionado e a leitura de inúmeras referências e tutoriais do bash infelizmente também não ajudou.

Alguém conhece o comando?

blokkie
fonte

Respostas:

223

Provavelmente algo como

# ~ / .inputrc
"\ e [A": histórico-pesquisa-para trás
"\ e [B": histórico-pesquisa-para a frente

ou equivalente,

# ~ / .bashrc
se [[$ - == * i *]]
então
    bind '"\ e [A": histórico-pesquisa-para trás'
    bind '"\ e [B": histórico-pesquisa-encaminhamento'
fi

(a instrução if verifica o modo interativo)

Normalmente, Cima e Baixo estão vinculadas às funções Readline previous-historye, next-historyrespectivamente. Prefiro vincular PgUp / PgDn a essas funções, em vez de deslocar a operação normal de Up / Down.

# ~ / .inputrc
"\ e [5 ~": pesquisa de histórico-para trás
"\ e [6 ~": histórico-pesquisa-adiante

Após a modificação ~/.inputrc, reinicie o shell ou use Ctrl+ X, Ctrl+ Rpara solicitar a leitura novamente ~/.inputrc.


A propósito, se você estiver procurando por documentação relevante:

O Bash usa a GNU Readline Library para o prompt e o histórico do shell.

efémero
fonte
Obrigado pela sua resposta. Isso soa familiar, mas infelizmente não funciona para mim. Colocá-lo em .inputrc não muda nada e colocá-lo em .bashrc impede que as setas façam qualquer coisa. Alguma ideia?
22610 blokkie
Deixa pra lá. history-complete- * não existe; apenas as funções de pesquisa de histórico * existem. Obrigado!
22610 blokkie
Ah, eu digitei claramente os dois primeiros exemplos lá ... o último estava correto, no entanto. Eu vou consertar isso.
ephemient 23/06/09
@ user1037114: esta é uma pergunta em si mesma, você deve perguntar em seu próprio post.
kamaradclimber
Isso corrigiu as setas para cima / para baixo para mim usando o modo vi no bash. Note, eu tenho que pressionar "Esc" (modo de comando) para que ele funcione.
8284 Chris
5

Atualize .inputrc com o seguinte:

"\C-[OA": history-search-backward
"\C-[[A": history-search-backward

"\C-[OB": history-search-forward
"\C-[[B": history-search-forward
nate_weldon
fonte
4
Quais são essas chaves?
8284 Chris
Eu não sei o que essas chaves são especificamente, mas esta resposta corrigiu essa funcionalidade para mim quando as teclas para cima e para baixo não fizeram a pesquisa de histórico ao usar o tmux e o st terminal no X11.
Razzintown
1
@razzintown for st você provavelmente tem set enable-keypad onque a delchave funcione corretamente ( faq ). Quando o teclado está no teclado, as teclas são "\C-[OA"e "\C-[OB"(e "\C-[OC"e "\C-[OD"). Postei uma resposta abaixo para esclarecer isso.
MauricioRobayo
@ Chris Essas são as teclas de setas para cima e para baixo no modo de teclado e as teclas de setas para cima e para baixo no modo ANSI. Veja minha resposta abaixo.
MauricioRobayo
3

Se você set enable-keypad onestiver no seu país de origem, ~/.inputrccomo alguns usuários do terminal simples (que não sugam nada ), saiba que as teclas de setas estão no modo de teclado. O Ubuntu é fornecido com este útil /usr/share/doc/bash/inputrc.arrows:

# This file controls the behaviour of line input editing for
# programs that use the Gnu Readline library.
#
# Arrow keys in keypad mode
#
"\C-[OD"        backward-char
"\C-[OC"        forward-char
"\C-[OA"        previous-history
"\C-[OB"        next-history
#
# Arrow keys in ANSI mode
#
"\C-[[D"        backward-char
"\C-[[C"        forward-char
"\C-[[A"        previous-history
"\C-[[B"        next-history
#
# Arrow keys in 8 bit keypad mode
#
"\C-M-OD"       backward-char
"\C-M-OC"       forward-char
"\C-M-OA"       previous-history
"\C-M-OB"       next-history
#
# Arrow keys in 8 bit ANSI mode
#
"\C-M-[D"       backward-char
"\C-M-[C"       forward-char
"\C-M-[A"       previous-history
"\C-M-[B"       next-history

Portanto, não tenho certeza se você precisará de tudo, mas pode não machucar ter em seu ~/.inputrc:

# Arrow keys in keypad mode
"\C-[OA": history-search-backward
"\C-[OB": history-search-forward
"\C-[OC": forward-char
"\C-[OD": backward-char

# Arrow keys in ANSI mode
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
"\C-[[C": forward-char
"\C-[[D": backward-char

Também está no mesmo tópico: Minhas teclas de cursor não funcionam e também este xterm: teclas especiais

MauricioRobayo
fonte
1

Com ohmyzsh, use isso em seu .zshrc :

bindkey '^[OA' history-search-backward
bindkey '^[OB' history-search-forward

Para recarregar source ~/.zshrcou reiniciar o terminal.

Fonte: https://superuser.com/a/418299/71680

Benjamin Crouzier
fonte
O que funcionou para mim no zsh foi a opção dada no link da fonte: bindkey '\ e [A' bindkey história-search-atrasado '\ e [B' história-search-forward
Michael Massey
-3

Pode ser necessário ativar a conclusão do bash.

Verifica

  • /etc/profile
  • /etc/bash.bashrc
  • ~/.bashrc

para ver se algum dos arquivos acima é fonte /etc/bash_completion. ie

. / etc / bash_completion

Se /etc/bash___completionnão for fornecido por nenhum dos arquivos acima, você precisará adicioná-lo a um deles.

Se você deseja que todos os usuários do bash em sua máquina tenham a conclusão do bash, proceda /etc/bash_completionde /etc/bash.bashrc.

Se é apenas você quem deseja a conclusão do bash, obtenha a /etc/bash_completionsua ~/.bashrc.

Condenar
fonte
2
A conclusão da guia é boa, mas não é a mesma que a recuperação do histórico, que é o que o pôster original estava pedindo.
ephemient 23/06/09