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

8

Eu estou uzing zsh e, como sou um ávido usuário do Vim, mudei para o modo de edição Vim na linha de comando. (Isso significa que se eu digitar ls foo/bar e decidir que quero cd , posso acessar Esc ^ para voltar ao início e cw cd para alterar ls para cd .

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

    
por Nathan Long 25.08.2011 / 20:23

3 respostas

6

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

Mas, como você também verá ao ler o manual (é o capítulo 18.), adicionar uma ligação de chave é um exercício bastante simples no uso do comando bindkey :

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

Você nem precisa usar o comando zle para mapear o widget em uma função do shell, já que esse é um widget padrão.

Se você consultar a resposta para esta mesma pergunta que está no wiki Z Shell , você verá os comandos para adicionar isso especificamente aos keymaps 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 garyjohn aponta , no vi keymap do "comando", o / o caractere está ligado ao widget vi-history-search-backward . A diferença entre esse widget e o widget history-incremental-search-backward é o comportamento do widget que se aplica uma vez que o modo de pesquisa de histórico está . Aqui estão algumas das diferenças que você notará:

  • Alternando modos do vi:
    • O modo de pesquisa em history-incremental-search-backward alterna entre os mapas de teclado main e vicmd quando você chama o widget vi-cmd-mode enquanto ainda permanece no modo de pesquisa. ie a partir do modo emacs pressionando a tecla Esc ou Ctrl + X Ctrl + V alternam o modo de pesquisa entre os mapas de teclado emacs e vicmd . (Invocar history-incremental-search-backward do mapa de teclado vicmd é, portanto, problemático, a menos que você vincule algo a vi-cmd-mode no mapa de teclado vicmd também.)
    • O modo de pesquisa em vi-history-search-backward trata o widget vi-cmd-mode como accept-line e finaliza a pesquisa, entrando novamente no modo de comando do qual você inseriu a pesquisa. i.e. (com as ligações padrão) / entra no modo de busca do modo de comando e Esc retorna ao modo de comando.
  • Repetindo uma pesquisa:
    • Em history-incremental-search-backward , os widgets history-incremental-search-backward e vi-rev-repeat-search são reconhecidos. ie (presumindo que você alterou as ligações como acima) tanto Ctrl + R e N irá procurar por uma linha correspondente.
    • Em vi-history-search-backward , apenas o widget vi-rev-repeat-search é reconhecido. i.e. (presumindo que você tenha alterado as ligações como acima) Ctrl + R causará um bipe e será ignorado.
por 26.08.2011 / 01:55
4

No modo vi do bash, digitar <Esc>/<string><Enter> procurará no histórico de comandos <string> . n pesquisará mais atrás na história; N pesquisará para frente. o zshell pode ser o mesmo.

    
por 25.08.2011 / 21:13
1

Eu prefiro usar:

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

Dessa forma, posso digitar ESC /text e ver a linha de comando. Se eu quiser ir para o próximo jogo, eu digito ESC n

    
por 09.09.2014 / 07:18

Tags