Posso usar o modo de edição do Vim na linha de comando sem perder a pesquisa de histórico recursivo?

8

Estou usando o zsh e, como sou um usuário ávido do Vim, mudei para a edição no estilo Vim na linha de comando. (Isso significa que, se eu digitar ls foo/bare decidir que deseja cd, posso pressionar Esc ^para voltar ao início e cw cdmudar lspara cd.

Tudo isso é ótimo, mas o problema é que não posso mais usar Ctrl+Rpara fazer uma pesquisa recursiva no histórico. Existe outra maneira de fazer isso ou posso, de alguma forma, substituir o atalho de teclas do Vim para recuperá-lo?

Nathan Long
fonte
Uma escolha difícil! garyjohnmostra uma maneira do Vim de fazer isso e JdeBPmostra como recuperar as teclas pressionadas por Ctrl + R! Vou jogar com os dois métodos e aceitar uma resposta mais tarde. Decidirei com base em 1) qual método me parece mais fácil e 2) que obtém mais votos positivos. Graças a vocês dois!
Nathan Long

Respostas:

6

Claro que você não pode mais usar o Ctrl+ R. Se você consultar o manual do Z Shell, verá que há apenas uma ligação de chave para o history-incremental-search-backwardwidget no emacsmapa de teclas . Não há ligações de teclas para ele nos mapas de teclas do vi.

Mas como você também encontrará na leitura do manual (é o capítulo 18.), adicionar uma ligação de chave é um exercício bastante simples no uso do bindkeycomando:

bindkey "^R" history-incremental-search-backward

Você nem precisa usar o zlecomando para mapear o widget em uma função shell, pois esse é um widget padrão.

Se você consultar a resposta para essa mesma pergunta que está no wiki do Z Shell , verá os comandos para adicioná-lo especificamente aos mapas de teclas vi "command" e "insert mode":

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

Observe também que, como aponta garyjohn , no mapa de teclas do "comando" do vi, o /caractere está vinculado ao vi-history-search-backwardwidget. A diferença entre esse widget e o history-incremental-search-backwardwidget é o comportamento do widget que se aplica quando o usuário está no modo de pesquisa de histórico. Aqui estão algumas das diferenças que você notará:

  • Alternando os modos vi:
    • O modo de pesquisa history-incremental-search-backwardalterna entre os mapas de teclas maine vicmdquando você invoca o vi-cmd-modewidget enquanto permanece no modo de pesquisa. ou seja, do emacsmodo pressionando a Esctecla ou Ctrl+ XCtrl+ Valterna o modo de busca entre os mapas de teclas emacse vicmd. (Invocando history-incremental-search-backwarda partir do vicmdmapa de teclado é, portanto, problemático, a menos que ligam algo vi-cmd-modeno vicmdmapa de teclado também.)
    • O modo de pesquisa vi-history-search-backwardtrata o vi-cmd-modewidget como accept-linee encerrará a pesquisa, retornando ao modo de comando do qual você inseriu a pesquisa. ie (com as ligações padrão) /entra no modo de pesquisa no modo de comando e Escvolta ao modo de comando.
  • Repetindo uma pesquisa:
    • Em history-incremental-search-backward, history-incremental-search-backwardos vi-rev-repeat-searchwidgets e são reconhecidos. ie (presumindo que você alterou as ligações como acima) ambos Ctrl+ Re Nprocurará uma linha correspondente anterior.
    • Em vi-history-search-backward, apenas o vi-rev-repeat-searchwidget é reconhecido. ie (presumindo que você alterou as ligações como acima) Ctrl+ Rcausará um sinal sonoro e será ignorado.
JdeBP
fonte
Minha memória muscular te abençoa!
Nathan Long
4

No modo vi do bash, digitar <Esc>/<string><Enter>pesquisará o histórico de comandos <string>. nprocurará mais na história; Nirá procurar para a frente. O zshell pode ser o mesmo.

garyjohn
fonte
1
No entanto, isso é interessante - eu freqüentemente uso a pesquisa como um movimento no Vim. Acho que não posso usá-lo para mover dentro do comando que estou editando no momento, já que está atrelado à pesquisa no histórico, não é?
Nathan Long
Direita. Mas você pode (pelo menos no bash) usar f, F, t, T, ';' (ponto e vírgula) e ',' (vírgula) para avançar e voltar para caracteres específicos na linha.
precisa saber é o seguinte
1

Eu prefiro usar:

bindkey -M vicmd '/' history-incremental-search-backward

Dessa forma, eu posso digitar ESC /texte ver a linha de comando. Se eu quiser ir para a próxima partida, digitoESC n

Jonas Fagundes
fonte