Lookback de seta separado para histórico ZSH local e global

22

É possível ...

  • Intensifique o histórico do shell ZSH local (as ações só aconteceram nesse prompt)

  • Intensifique o histórico global do ZSH (o histórico compartilhado está ativado) - padrão o que acontece quando você pressiona a seta para cima quando o histórico compartilhado está em

... separadamente.

Por exemplo, pode-se ligar o CTRL + para o histórico global, normal para o histórico local. Ao mesmo tempo, faz sentido usar o histórico global para uma pesquisa de histórico inverso (ou seja, CTRL + R ).

Isso pode acelerar algumas operações do shell, já que algumas operações são específicas da janela do shell e você deseja voltar a elas.

    
por Mikko Ohtamaa 09.07.2012 / 10:06

5 respostas

21

Copiar & Cole isso no seu .zshrc :

Os cursores estão usando o histórico local:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

Se você também precisar de atalhos de teclado ( CTRL + cursores) para percorrer o histórico global, inclua também isso em seu .zshrc :

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

Para que isso funcione, a opção SHARE_HISTORY (ver 16.2.4 Histórico ) precisa ser ativado. Execute setopt e verifique se "sharehistory" está listado. Se não adicionar setopt sharehistory ao seu .zshrc . Então pode-se usar set-local-history como fizemos acima. A documenação diz:

By default, history movement commands visit the imported lines as well as the local lines, but you can toggle this on and off with the set-local-history zle binding. It is also possible to create a zle widget that will make some commands ignore imported commands, and some include them.

Observe que, por padrão, o histórico global é usado (e todas as funções terminam em "zle set-local-history 0", ou seja, o histórico local é desativado). Então pressionar CTRL + R irá procurar o histórico global por padrão (o que faz sentido na maioria dos casos).

Isso é bem parecido com a solução de @mpy, mas está pronto para copiar & colar. Sobrescreve as teclas do cursor para cima e para baixo. Eu usei esta entrada na lista de e-mails .

Veja também:

por 21.12.2013 / 18:42
5

Você pode configurar um widget zle especial para mostrar somente os itens do histórico local:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

Supondo que esteja ligado a up-line-or-history (acho que é o padrão), você pode ligar este widget a outro toque de tecla, como CTRL + :

 bindkey "^[Oa" only-local-history

Se isso funcionar é provavelmente dependente do seu terminal. A linha acima funciona em URxvt/Screen . Com xterm , você precisará de

 bindkey "^[[1;5A" only-local-history

para CTRL + .

Outra variante poderia ser

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

Assim, se você tiver o histórico local ativado, poderá ver o global ou vice-versa.

    
por 01.03.2013 / 14:34
4

A resposta do @lumbic funcionou para mim apenas com algumas alterações:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

Esse código torna o histórico global o padrão e usa a seta CTRL para o histórico local.

Nota: eu uso o zsh 5.0.2 junto com o oh-my-zsh.

    
por 13.01.2016 / 16:19
0

Eu tentei as opções listadas em outras respostas aqui, mas não fiquei feliz com elas. Os widgets 1 up-history ou up-line-or-history não incluem iniciando a pesquisa e o widget 1 up-line-or-beginning-search parece não funcionar bem ao alterar a preferência do histórico local ao usá-lo. 2

Então eu cheguei às seguintes configurações. Ele permite que as setas Ctrl + procurem o histórico global, Alt + setas para navegar apenas pelo histórico local (semelhante ao Bash) e setas autônomas para usar a pesquisa de início inteligente (padrão em Oh My Zsh ).

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1 Suas contrapartes down são implicitamente também.

2 O começo usado para pesquisa é redefinido após alterar a preferência do histórico local, então o primeiro comando inteiro encontrado é usado como o começo a ser procurado na segunda busca.

    
por 13.03.2018 / 10:53
-1
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

Acima da resposta funcionou para mim.

Referência: link

    
por 07.02.2018 / 05:55