¿Puedo usar el modo de edición Vim en la línea de comando sin perder la búsqueda recursiva del historial?

8

Estoy usando zsh y, como soy un ávido usuario de Vim, simplemente cambié a usar la edición de estilo Vim en la línea de comandos. (Eso significa que si escribo ls foo/bary decido que quiero cdhacerlo, puedo presionar Esc ^para volver al principio y cw cdcambiar lsa cd.

Eso es todo excelente, pero el problema es que ya no puedo usar Ctrl+Rpara hacer búsquedas recursivas en el historial. ¿Hay otra forma de hacerlo, o puedo anular de alguna manera la combinación de teclas Vim para recuperarlo?

Nathan Long
fuente
¡Una elección difícil! garyjohnmuestra una forma de Vim de hacerlo y JdeBPmuestra cómo recuperar la combinación de teclas para Ctrl + R. Voy a jugar con ambos métodos y aceptaré una respuesta más tarde. Decidiré en base a 1) qué método me parece más fácil y 2) cuál recibe más votos a favor. ¡Gracias a los dos!
Nathan Long el

Respuestas:

6

Por supuesto, ya no puedes usar Ctrl+ R. Si consulta el manual de Z Shell, verá que solo hay un enlace de teclas para el history-incremental-search-backwardwidget en el emacsmapa de teclas . No hay enlaces de teclas para ello en los mapas de teclas vi.

Pero como también encontrará al leer el manual (Es el capítulo 18.), agregar una combinación de teclas es un ejercicio bastante simple en el uso del bindkeycomando:

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

Ni siquiera tiene que usar el zlecomando para asignar el widget a una función de shell, ya que este es un widget estándar.

Si consulta la respuesta a esta misma pregunta que está en el wiki de Z Shell , verá los comandos para agregar específicamente esto a los mapas de teclas vi "comando" y "modo de inserción":

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

También tenga en cuenta que, como señala garyjohn , en el mapa de teclas vi "comando", el /carácter está vinculado al vi-history-search-backwardwidget. La diferencia entre este widget y el history-incremental-search-backwardwidget es el comportamiento del widget que se aplica una vez que uno está en modo de búsqueda de historial. Estas son algunas de las diferencias que notará:

  • Cambio de modos vi:
    • El modo de búsqueda history-incremental-search-backwardalterna entre los mapas de teclas mainy vicmdcuando invoca el vi-cmd-modewidget mientras permanece en modo de búsqueda. es decir, desde el emacsmodo presionando la Esctecla o las teclas Ctrl+ XCtrl+ Valterna el modo de búsqueda entre los mapas de teclas emacsy vicmd. (Invocar history-incremental-search-backwarddesde el vicmdmapa de teclas es, por lo tanto, problemático, a menos que también enlace algo vi-cmd-modeen el vicmdmapa de teclas).
    • El modo de búsqueda vi-history-search-backwardtrata el vi-cmd-modewidget como accept-liney finalizará la búsqueda, volviendo a ingresar el modo de comando desde el que ingresó la búsqueda. es decir (con los enlaces predeterminados) /ingresa al modo de búsqueda desde el modo de comando y Escvuelve al modo de comando.
  • Repetir una búsqueda:
    • En history-incremental-search-backward, tanto el history-incremental-search-backwardy los vi-rev-repeat-searchwidgets son reconocidos. es decir (suponiendo que ha alterado los enlaces como se indicó anteriormente) ambos Ctrl+ Ry Nbuscará una línea coincidente anterior.
    • En vi-history-search-backward, solo vi-rev-repeat-searchse reconoce el widget. es decir (suponiendo que ha alterado los enlaces como se indicó anteriormente) Ctrl+ Rprovocará un pitido y será ignorado.
JdeBP
fuente
¡Mi memoria muscular te bendice!
Nathan Long el
4

En el modo vi de bash, al escribir <Esc>/<string><Enter>buscará en el historial de comandos <string>. nbuscará más atrás en la historia; Nbuscará hacia adelante zshell puede ser lo mismo.

garyjohn
fuente
1
Sin embargo, eso es interesante: con frecuencia uso la búsqueda como movimiento en Vim. Supongo que no puedo usarlo para moverme dentro del comando que estoy editando actualmente, ya que está vinculado al historial de búsqueda, ¿eh?
Nathan Long el
Derecha. Pero puedes (al menos en bash) usar f, F, t, T, ';' (punto y coma) y los comandos ',' (coma) para avanzar y retroceder a caracteres particulares en la línea.
garyjohn
1

Prefiero usar:

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

De esta manera puedo escribir ESC /texty ver la línea de comando. Si quiero ir al próximo partido escriboESC n

Jonas Fagundes
fuente