Lookback separado da seta para cima para o histórico local e global do ZSH


25

É possível...

  • Intensificar o histórico local do shell ZSH (as ações ocorreram apenas nesse prompt)

  • Intensificar 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á ativado

... separadamente.

Por exemplo, pode-se ligar 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 anterior (ou seja, CTRL+ R).

Isso pode acelerar algumas operações do shell, pois algumas operações são específicas para essa janela do shell e você deseja voltar nelas.

Respostas:


25

Copie e 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 ligações de teclas ( CTRL+ cursores) para percorrer o histórico global, adicione também isso ao seu .zshrc:

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

Para fazer isso funcionar, a opção SHARE_HISTORY (consulte 16.2.4 Histórico ) precisa estar ativada. Execute setopte verifique se "sharehistory" está listado. Se não adicionar setopt sharehistoryao seu .zshrc. Então, pode-se usar set-local-history como fizemos acima. A documentação diz:

Por padrão, os comandos de movimento do histórico visitam as linhas importadas e as linhas locais, mas você pode ativar e desativar isso com a ligação set-local-history zle. Também é possível criar um widget zle que fará com que alguns comandos ignorem os comandos importados e alguns os incluam.

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

Isso é bastante semelhante à solução do @mpy, mas está pronto para copiar e colar. Sobrescreve as teclas do cursor para cima e para baixo. Eu usei essa entrada da lista de emails .

Veja também:


1
No zsh 5.0.2, recebo um erro que não pode ser vinculado a uma sequência de teclas vazia. Mesmo que eu o substitua pelas teclas de outra resposta abaixo, as teclas para cima / para baixo e Ctrl + para cima / para baixo passam pelo histórico global. Algo que estou fazendo errado aqui?
Rjh 22/02

1
@rjh: Tente o seguinte: em um editor como o vim, exclua o arquivo ${key[Up]}. Então (no modo de edição), digite Ctrl + V seguido pela seta para cima. Isso deve inserir o código da chave correto. Faça o mesmo para a seta para baixo.
robinst

Eu usei esse método e ele funciona, mas perdi a capacidade de pesquisar o histórico escrevendo a parte inicial de um comando e, em seguida, Seta para cima. Ele passa por todos os comandos como o Bash, então eu tenho que contornar o uso Ctrl+R.
Melebius

5

Você pode configurar um widget zle especial para mostrar apenas 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 isso esteja vinculado a up-line-or-history(acho que isso é padrão), você pode vincular esse widget a outro toque de tecla, como CTRL+ :

 bindkey "^[Oa" only-local-history

Se isso funcionar provavelmente depende do seu terminal. A linha acima funciona em URxvt/Screen. Com xtermvocê precisará

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

para CTRL+ .

Outra variante pode ser

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

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


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.


Parece o oposto do que o OP solicitou - Ctrl+arrowspara a história local.
Melebius 13/09

1

Eu tenho tentado as opções listadas em outras respostas aqui, mas não estava satisfeito com elas. Os widgets 1 up-history ou up-line-or-historynão incluem a pesquisa inicial 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 vim para as seguintes configurações. Ele permite que as Ctrlsetas + pesquisem o histórico global, Alt+ as setas pesquisem apenas o histórico local (semelhante ao Bash) e as setas independentes para usar a pesquisa inicial 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 downcontrapartes também significam implicitamente.

2 O início usado para pesquisar é redefinido depois de alterar a preferência do histórico local; portanto, todo o primeiro comando encontrado é usado como o início a ser pesquisado na segunda pesquisa.


1

Com base nas várias respostas aqui, pude criar uma versão condicionada:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

Esta versão substituirá os existentes up-line-or-historye os down-line-or-historywidgets por novos widgets definidos pelo usuário. Este widget ativa o histórico local e, em seguida, chama os widgets originais , que estão disponíveis sob os .nomes predefinidos. Consulte a documentação do widget zle para obter detalhes.

Isso significa que você mantém todas as combinações de teclas existentes. Portanto, você pode evitar ter que descobrir qual é a sequência de escape para digitar uma seta para cima no seu terminal atual.


-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

A resposta acima funcionou para mim.

Referência: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys


Você poderia explicar como isso distingue a história local e global? IMHO seu código não faz isso. Além disso, isso parece já estar definido em Oh My Zsh .
`` Melebius
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.