¿Cómo navegar dentro de la búsqueda inversa de bash?

40

Bash ofrece la funcionalidad de búsqueda inversa a través de Ctrl+ R. Entonces uno puede escribir una parte de un comando que mostrará una entrada adecuada del historial.

Supongamos que esta es mi historia:

vim foo1
vim foo2 # I want to go here
vim foo3 # this is where I land, how to go back?

Busco foo. Al presionar Ctrl+ Rnuevamente se muestra la siguiente entrada de búsqueda adecuada. A menudo me sucede que soy demasiado rápido y navego más allá de mi resultado deseado y vim foo3se muestra y ahora quiero volver a vim foo2.

Por lo tanto, mi pregunta es: ¿Cómo navego dentro de la búsqueda inversa?

k0pernikus
fuente
¿Qué terminal usas? P.ej. gnome-terminal, konsole, etc ...
varesa
1
Bueno, no estoy muy familiarizado con él ... La clave debería ser ctrl + S, pero algunas terminales parecen comer la clave, antes de que llegue a la búsqueda inversa
varesa
Ctrl + shift + R - búsqueda hacia adelante mientras ctrl + R
devansvd
Relacionado: stackoverflow.com/questions/791765/…
k0pernikus

Respuestas:

36

Puede acceder a esto a través de la forward-search-historyfunción que está vinculada por defecto a ctrl+s. Desafortunadamente, ctrl+sse usa para señalar xoffpor defecto, lo que significa que no puede usarlo para cambiar la dirección de la búsqueda. Hay dos soluciones para resolver el problema, una deshabilita el envío de la xoff/xonseñalización y la otra cambia la combinación de teclas paraforward-search-history

Deshabilitar xon / xoff

Ejecuta stty -ixonen tu terminal o agrégalo a tu ~/.bashrc. Esto le permite usar ctrl+spara usar la forward-search-historyfunción de historial.

Para obtener más información sobre el flujo de control, consulte ¿Cómo descongelar después de presionar accidentalmente Ctrl-S en un terminal? y algunas de las respuestas

Cambiar la combinación de teclas

Si no desea cambiar el comportamiento predeterminado de ctrl+s, puede cambiar la combinación de teclas forward-search-historycon bind. Como la mayoría de las claves ya están definidas en bash, es posible que deba ser creativo:

bind "\C-t":forward-search-history

Esto se unirá ctrl+tal historial de búsqueda hacia adelante, pero tenga en cuenta que, por defecto, se ctrl+tejecutatranspose-chars

Ulrich Dangel
fuente
Probé su primera solución stty -ixonen zshy funciona muy bien. Sin embargo, ¿hay algún efecto secundario posiblemente no deseado en la desactivación de la xoff/xonseñalización?
estudiante
@student No puede usar ctrl+spara pausar la salida del terminal por más tiempo. Si nunca lo usaste antes, esto no es problema
Ulrich Dangel
1
Por lo que vale, fui con la segunda solución. Buena cosa ! Nunca supe que podría congelar la consola presionando C-s... muy útil cuando se usa tail en los registros del servidor. Ordenado ! (Ojalá tuviera otro voto a favor :))
Ashutosh Jindal
No pude obtener la opción # 2 para trabajar en OSX. Tuve que hacer esto en su lugar:bind '"\C-t": history-search-forward'
stiemannkj1
0

Como alternativa a la búsqueda inversa básica y la búsqueda hacia adelante proporcionadas por su bash, es posible que desee considerar:

fzf , un "buscador difuso de línea de comandos" autodescrito.

Puede reemplazar la búsqueda inversa predeterminada de su bash (y otros terminales).

Sus beneficios son que:

  • imprime una lista de tus comandos desde el historial
    • alterna la ordenación cronológica o de relevancia presionando Ctrl + R nuevamente
  • se puede navegar con las teclas de flecha (o Ctrl + J / Ctrl + K)
  • permite buscar múltiples agujas

Mi flujo de trabajo ahora se basa completamente en fzf sobre la búsqueda inversa básica en máquinas sobre las que tengo control.

k0pernikus
fuente