¿Cómo realizo una búsqueda de historial inverso en el modo vi de ZSH?

47

Lo uso vimesencialmente para todas mis necesidades de edición, así que decidí probar una vez más el modo vi para mi shell (actualmente ZSH w / oh-my-zsh en OS X), pero me encuentro intentando (y fallando) usarlo Ctrl-Rconstantemente. ¿Cuál es la combinación de teclas equivalente? Y para referencia futura, ¿cómo lo resolvería yo mismo? Estoy bastante seguro de que podría usar bind -Pen bash.

Hank Gay
fuente
2
Según 'man zshzle', history-incremental-search-backward no está vinculado en los modos Vi (vicmd, viins) por defecto.
Paul

Respuestas:

56

Puede ejecutar bindkeysin argumentos para obtener una lista de enlaces existentes, por ejemplo:

# Enter vi mode
chopper:~> bindkey -v

# Search for history key bindings
chopper:~> bindkey | fgrep history
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[[A" up-line-or-history
"^[[B" down-line-or-history

En el modo emacs, el enlace que desea es history-incremental-search-backward, pero no está vinculado por defecto en el modo vi. Para enlazar Ctrl-R usted mismo, puede ejecutar este comando o agregarlo a su ~/.zshrc:

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

La página de zshzlemanual ( man zshzle) tiene más información sobre los modos editor de línea, bindkey y emacs / vi de zsh.

mrb
fuente
3
Gracias, particularmente por zshzle. Eso es bastante informativo y útil.
Hank Gay
te quiero. Seriamente. Después de actualizar a OSX El Capitan, la búsqueda inversa desapareció y lo extrañé más que todo lo demás en mi flujo de trabajo diario.
Christian
24

Esta es una pregunta antigua, pero la única respuesta (y aceptada) básicamente le dice a uno cómo trasplantar el modo "emacs-like" history-incremental-search-backwarda vi. Si bien esto es perfectamente factible y puede ser la solución adecuada para usted, es un poco extraño que nadie haya mencionado la "forma vi" de buscar en el historial.

El modo vi en zsh admite el historial de búsqueda utilizando las teclas estándar vi / vim: /y ?ambas disponibles en modo comando. (Presione <Esc>para cambiar del modo insertar al modo comando, como en vi o vim)

Sin embargo, su sentido se invierte: dado que generalmente desea buscar el historial de su shell en reversa, /realiza una búsqueda inversa mientras que ?realiza una búsqueda hacia adelante.

Una vez que se muestra el primer hit, puede (al igual que en vi / vim) usar npara continuar encontrando más hits en la misma dirección, o Npara invertir la dirección de la búsqueda.

Las asociaciones de teclas predeterminadas relevantes en el mapa de teclas vicmdson:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search
wjv
fuente
2
También es bueno de usar "^P" history-beginning-search-backwardy "^N" history-beginning-search-forwardpara autocompletar como vim (comienza a escribir, luego presiona ctrl+po ctrl+n).
cprn
Para mí, ?aparece bck-i-search, que es exactamente lo que estaba buscando. Gracias.
geowa4
@wjv la ventaja de history-incremental-search-backward es que admite patrones globales. El valor predeterminado /o `? ' doesnt: coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex
alpha_989
@ alpha_989 La publicación de blog a la que hace referencia es incorrecta. Puede ser que el autor tenga instalado un "marco" zsh que sobrecarga la ^Rcombinación de teclas. El único carácter "tipo regex" compatible con ambos history-search-backwardy history-incremental-search-backwardes ^, anclar la cadena de búsqueda al comienzo de la línea. El verdadero poder de history-incremental-search-backwardes que realiza una búsqueda incremental, como su nombre lo indica. Me imagino que uno podría querer vincularlo en el vicmdmapa de teclas por esa razón.
wjv
@wjv, tienes razón ... Debería haber escrito history-incremental-pattern-search-backward, no history-incremental-search-backward. history-incremental-pattern-search-backwardstal vez un widget ... pero creo que viene instalado por defecto en zsh. Admite globpatrones no regexcomo usted señaló correctamente: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators . De hecho, hay un error en la publicación ..
alpha_989