Como posso pesquisar o histórico com o texto já inserido no prompt no zsh?

59

No zsh, eu sei que posso pesquisar no histórico com Ctrl+ r. No entanto, muitas vezes começo a digitar um comando diretamente no prompt, mas percebo que devo procurar no histórico. Quando clico em Ctrl+ r, ele exibe um prompt de pesquisa de histórico em branco como este:

prompt de pesquisa do histórico não preenchido

Observe como há texto no meu prompt, mas não no prompt de pesquisa do histórico. Como inicio a pesquisa de histórico com o texto já no prompt, para que fique assim:

prompt de pesquisa de histórico pré-preenchido

Sean Mackesey
fonte

Respostas:

44

Você pode usar ahistory-search funcionalidade do zle :

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

Isso liga Upe Down(ajusta suas próprias seqüências de escape) a uma pesquisa de histórico, para trás e para frente, com base no que já foi inserido no prompt.

Portanto, se você digitar "vim" e pressionar Up, o zsh irá retroceder no seu histórico apenas para os comandos que começam com "vim".

Além disso, você pode colocar o cursor no final da linha depois de selecionar o comando desejado no histórico do zsh, usando a função history-search-end (normalmente localizada em /usr/share/zsh/functions/Zle/) e anexando -endao final de cada linha, da seguinte forma:

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end
jasonwryan
fonte
Ótimo, obrigado. Eu tive que remover o "-end" para ambos os comandos bindkey para fazê-los funcionar. Não editei sua resposta, porque talvez haja alguma situação em que essas sejam necessárias?
Sean Mackesey 27/10/2013
Não tem problema: atualizei a resposta com os detalhes que você deseja esclarecer.
jasonwryan
Isso costumava funcionar para mim até o final de novembro de dezembro de 2015, quando eu atualizei para a versão mais recente do oh my zsh. Alguma ideia? sugestão? mais alguém está vendo isso? como depurar?
hani elaborou 18/12/2015
2
@hanielabed Oh-my-Zsh é um clusterfsck; Eu não estou nada surpreendido que iria quebrar algo tão fundamental como histórico ...
jasonwryan
11
Existe uma maneira de o cursor pular para o final de uma pesquisa de histórico vazia, mas permanecer na mesma posição para uma pesquisa parcial? É o que acontece no bash atualmente.
precisa saber é o seguinte
19

Outra opção útil é history | grep

Atribua um alias, por exemplo

alias hg='history | grep'

então você pode digitar hg whateverpara procurar os comandos que você usou, por exemplo

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

Eu coloquei esse alias nos meus arquivos de ponto.

Michael Durrant
fonte
17
O que hgme lembra ... Ah, sim, Mercurial!
12

Se você estiver usando oh-my-zsh , adicione history-substring-searchà plugins=(...)linha.

Então adicione

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

em algum lugar abaixo da linha que lê source $ZSH/oh-my-zsh.sh. Salve e ative um novo terminal ou execute-o source ~/.zshrcno terminal atual.

Nota: ^[[A é a sequência de escape da seta para cima no terminal que eu uso (gatinho) e muitos outros. Para fazer check-in no seu terminal de escolha, digite showkey -ae pressione a tecla desejada para a qual deseja encontrar a sequência de escape.

joelostblom
fonte
Não está claro o que esse mapeamento de teclas faz, a resposta acima explica "Isso liga Cima e Baixo (ajuste para suas próprias seqüências de escape) a uma pesquisa de histórico, para trás e para frente, com base no que já foi inserido no prompt".
Colin D
@ColinD Adicionou uma nota para esclarecer
joelostblom
11
a pesquisa de substring é melhor, é um superconjunto de comandos que começa com. para implementar sem ser um usuário oh-my-zsh que eu fiz brew install zsh-history-substring-search, verifiquei o readme do repositório para obter instruções, seguirei em frente e crie uma resposta que estou realmente feliz com o resultado.
Merlin
7

Você pode usar o script em https://github.com/zsh-users/zsh-history-substring-search

Onde você pode digitar qualquer parte de qualquer comando digitado anteriormente e pressionar as teclas Upe Downpara percorrer os comandos correspondentes.

número 5
fonte
4

Eu recomendo usar "$terminfo[kcuu1]"ou "$key[Up]"não coisas codificadas como "^[[A"que podem ou não funcionar em qualquer sistema específico.

Confira /etc/zsh/zshrcmais chaves. Aqui está o que parece no meu sistema. Eu acho que as terminfochaves têm mais probabilidade de serem definidas.

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)
zzxyz
fonte
4

Que tal usar zsh-autosuggestions?

A questão é que, para cada comando digitado neste plugin, você encontrará algumas sugestões que podem ser aceitas ou não. Experimente e nos dê algum feedback.

Sem plug-ins, podemos pressionar Ctrlrpara realizar uma pesquisa reversa no histórico, assim que você começar a digitar os comandos correspondentes aparecerão como sugestões.

SergioAraujo
fonte
2

Eu uso o plugin do modo vi . E então no meu ~ / .zshrc eu tenho as seguintes ligações:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

Que me permite usar o ^Pe ^Ncomo a busca para trás e para a frente normal, se eu não entrar em qualquer texto, e como filtrada pesquisa se eu fizer.

Slobodan Ilic
fonte
1

Concordo com a cheflo que a pesquisa "substring" é mais útil. Não posso comentar lá, então comecei uma nova resposta. Eu uso oh-my-zsh e adiciono "history-substring-search" aos plugins = (...) de ~ / .zshrc. Então fonte ~ / .zshrc. Não precisa adicionar mais nada. Use "bindkey" para verificar:

"^ [OA" histórico-substring-pesquisa-acima
"^ [OB" histórico-substring-pesquisa-down

Mais tarde, você digita "para" e a seta para cima aparece "histórico" e "para" realçado (se você usou o comando "histórico" antes).

James
fonte
1

Em vez disso, você pode usar o zaw , que substitui completamente sua pesquisa por uma super pesquisa com várias palavras-chave muito melhor e soluciona seu problema - o histórico de pesquisas é apenas uma das coisas que o zaw pode pesquisar.

Pequena introdução / discussão aqui

Brad Parks
fonte
0

Como uso oh-my-zsh e uso a solução de substring de joelostblom, James, modifico o arquivo .zshrc assim: (que na linha 13, localize a linha "source $ ZSH / oh-my-zsh.sh" e modifique o código ao seu redor.)

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down
user3633852
fonte
bindkey -virá quebrar ctrl-a, ctrl-e. Provavelmente todos os comandos ctrl.
Michael Ozeryansky 15/10
0

Resposta não-Oh-My-Zsh

Isso funcionou para mim (no macOS) para obter o histórico de substring facilmente acessível via seta para cima / para baixo. A ligação das teclas é sua.

O histórico de pesquisa de seqüências de caracteres é melhor do que apenas acessar comandos que começam com uma sequência. Isso é mais parecido com ctrl-r na maioria dos casos, aqueles sem globs ou correspondência de regex.

A partir das instruções em zsh-users / zsh-history-substring-search

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

Agora aproveitando isso completamente.

Merlin
fonte