Como tornar o comportamento do histórico do oh-my-zsh similar ao do Bash?

1

Eu mudei recentemente para oh-my-zsh e não consigo me acostumar com o funcionamento da tecla de seta para cima. Quando eu digito o ssh por exemplo e pressiono para cima, ele só me mostra comandos começando com o ssh enquanto eu preferiria que ele mostrasse o comando anterior. Como eu poderia fazê-lo se comportar da maneira que o Bash faz, com o que eu já estou acostumado?

Observe que adicionar as linhas de a resposta ao final do meu zshrc não ajudou e não aconteça depois da atualização, logo após mudar para oh-my-zsh do bash.

    
por d33tah 20.11.2016 / 02:50

1 resposta

3

Ironicamente, a resposta na pergunta que as pessoas estão propondo como duplicata…

bindkey '\e[A' history-beginning-search-backward
bindkey '\e[B' history-beginning-search-forward
… é exatamente a resposta errada . Ele garante que as sequências de controle do seu terminal para as teclas de edição de setas sejam mapeadas por ZLE para os widgets de extensão history-beginning-search-backward e history-beginning-search-forward que são fornecidos pelo plug-in history-substring-search do Oh My ZSH.

Isso é exatamente o que você não quer .

Você está tentando desativar esse recurso, porque prefere outro comportamento; não tentando consertá-lo porque está quebrado.

O que você quer são aquelas chaves para mapear para os widgets como em vanilla Z Shell, sendo que o Oh My ZSH é uma extensão das customizações e customizações do Z Shell que algumas (mas não todas) pessoas gostam. Os widgets do Vanilla Z Shell têm aproximadamente o antigo comportamento de shell Bourne Again que você prefere. (Ao contrário do shell Bourne Again, no entanto, se você tiver um buffer de edição de várias linhas, ele moverá para cima e para baixo dentro dele antes, nas bordas superior e inferior do buffer, movendo-se para cima e para baixo no histórico.

Esses widgets seriam:

bindkey "$terminfo[kcuu1]" up-line-or-history
bindkey "$terminfo[kcud1]" down-line-or-history

Note como se trabalha para não programar um tipo de terminal específico em seus scripts. Pode-se usar "$termcap[ku]" e "$termcap[kd]" , alternativamente. O Z Shell, presumindo que você tenha os módulos apropriados carregados, mantém um mapa para ambos. Geralmente o mundo prefere o terminfo se o tiver hoje em dia. Para ser estritamente à prova de balas, em algo que você usa com sistemas heterogêneos ou dá a outras pessoas, você precisará de um test -n ali - assim como você encontrará as extensões Oh My ZSH fazendo de fato.

test -n "$terminfo[kcuu1]" && bindkey "$terminfo[kcuu1]" up-line-or-history
test -n "$terminfo[kcud1]" && bindkey "$terminfo[kcud1]" down-line-or-history

(In extremis, para lidar com algumas possibilidades improváveis, você precisará de alguma expansão variável "${terminfo[x]-${termcap[y]}}" . As extensões Oh My ZSH não se incomodam com isso, e na prática você também pode escapar sem ela. Na prática, quase todo mundo tem os módulos termcap e terminfo carregados, e tudo o que você precisa se preocupar é se o registro do tipo de terminal atual realmente define as sequências de controle relevantes, para as quais o test -n serve.)

Uma aproximação mais exata do comportamento do shell Bourne Again seria

bindkey "$terminfo[kcuu1]" up-history
bindkey "$terminfo[kcud1]" down-history
Esse não é o padrão da shell Z da vanilla, e depois de editar sua primeira linha de comando de múltiplas linhas, você pode decidir que o padrão é o que você preferir. ☺     
por 20.11.2016 / 09:14