Cómo ejecutar la búsqueda del historial en modo Vi en bash

Quiero encontrar la alternativa a ctrl + R para buscar el historial en bash. Puedo habilitar el modo vi en bash pero no puedo hacer que busque. Cuando hago /search o ?search no pasa nada. ¿Hay algo más que deba presionar? Intenté presionar enter y luego sucedió esto:

$ set -o vi $ ls|grep f $ /gr -bash: /gr: No such file or directory $ 

Comentarios

  • Es <C-r> ¿realmente no funciona para usted en modo vi para readline? Me funciona bien con la última versión de bash.
  • @ D.BenKnoble Sí, pero creo que <C-r> es el modo emacs y quiero aprender modo vi.
  • <C-r> es una búsqueda recursiva; No estoy seguro de que tenga algo que ver con emacs vs vi, especialmente porque podría ser una extensión específica de bash (mi memoria es confusa en ese detalle). No te estoy desanimando de usar /, solo que cada uno tiene sus (diferentes) usos.

Respuesta

Ciertamente, existe un estilo de búsqueda Vim en bash / readline. De hecho, su línea de comando es esencialmente una versión reducida del editor Vim con una cantidad significativa de comandos en modo Normal disponibles para usted. Más sobre eso en un segundo, pero primero busque. La información clave que necesita es que mientras mira fijamente el cursor parpadeante en su línea de comando, se encuentra en el equivalente al modo Insertar de Vim. Entonces, ¿cómo llegamos al modo Normal? Pulsando Esc , por supuesto.

Desde allí, presione / , ingrese un término de búsqueda y presione Enter . Ahora puede usar n y N para avanzar y retroceder por los resultados. (Efectivamente, buscará hacia atrás de forma predeterminada con n … buscando hacia adelante desde el principio no daría ningún resultado ya que no hay historial en el futuro!) Para ejecutar el resultado actual como un comando, presione Enter nuevamente.

No olvide que usted » Sin embargo, estás en modo Normal, así que si no encuentras lo que estás buscando y quieres volver a ingresar texto en el modo Insertar, haz lo que normalmente haces en Vim. Pulsando i , por ejemplo, lo hará. O puede usar el comando de Vim C que eliminará cualquier texto después del cursor y entrará en el modo Insertar, que es útil. (Puede preceder eso con 0 si movió el cursor más allá de la primera columna). O use A, a, R, s, s, I, Ctrl-C … obtienes la imagen.

Además de los diversos comandos que ingresan al modo Insertar, puedes navegar con b, B, e, E , w, W, 0, $, etc. Yank / delete / put también están ahí, y puedes usarlos en ellos en comandos de acción + navegación como yB, c2e, d$, etc. 1 ¡Finalmente, u ndo también funciona! Adelante, pruebe otras cosas usted mismo.

Ah, y si te pierdes un poco o, como me pasa de vez en cuando, algo de funkiness con el ajuste de línea altera tu c / l, puedes dejar de fingir y pulsar v. Esto extrae el contenido de su línea de comandos en una instancia real de Vim para que pueda editar con un Editor de texto operativo y completamente armado . Una vez hecho esto, :wq para enviar lo que tienes al shell para su ejecución.

1 Por desgracia, el operador + Los comandos de movimiento (caw, dis, yap, etc.) no son compatibles. Pero el comentario de @EdNeville «a continuación tiene un enlace a algunas configuraciones de readline que aparentemente agregará todos los comandos de op-motion que hay, así como varios otros. Realmente puede completar su experiencia de Vim basada en la línea de comandos agregándolos a su archivo .inputrc.


Información adicional : no está restringido a usar solo lo que set -o vi o set -o emacs te da. Puedes usar cualquiera de los comandos readline disponibles. Creo que Ctrl-R debería estar disponible incluso en modo Vim, pero si no, puedes probar poniendo esto en su ~/.inputrc

set editing-mode vi "\C-r": reverse-search-history "\C-s": forward-search-history 

Mejor aún, puede agregar algunos comandos que de otro modo no estarán disponibles como

"\C-o": operate-and-get-next 

Con esto, una vez que haya seleccionado un comando del historial (p. ej.a través de la búsqueda de Vim) presione Ctrl-O en lugar de Enter y Bash ejecutará el comando e insertará el siguiente comando del historial, listo para ejecutarse.

Consulte la sección Readline Command Names en la página de manual de Bash para obtener una lista completa.

(También puede configurarlos desde la línea de comandos con bind pero ya me estoy alejando demasiado.)

Comentarios

  • Bonito. Un momento de aprendizaje.
  • @niklas, esta es tu respuesta
  • @glennjackman Hago un uso intensivo de esta funcionalidad. Realmente útil para mí.
  • @NiklasRosencrantz Sí, lo entendí. Nosotros intente escribir respuestas que sean generalmente útiles en lugar de centrarse únicamente en el interrogador, así que agregué la información adicional sobre la combinación de comandos de diferentes modos.
  • También puede agregar cosas como ciw si modifica .inputrc: usenix.org.uk/content/bash.html#input

Respuesta

Lo que mencionó @ B-Layer funciona bastante bien en bash y de manera similar en zsh.

Dado que ya está usando VIM , y si usas neovim o vim8, también puedes probar :terminal, que abrirá la terminal predeterminada en vim.

Luego puede usar el comando vim para navegar por la salida del terminal de términos, así como navegar por el historial de los comandos del terminal.

Ref.

  1. http://vimcasts.org/episodes/neovim-terminal/
  2. https://neovim.io/doc/user/nvim_terminal_emulator.html
  3. https://github.com/vim/vim/blob/master/runtime/doc/terminal.txt

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *