¿Cómo busco la historia de bash en el modo vi para "foo. * Bar"?

Tengo mi entorno bash en modo vi ( set -o vi ). Entonces puedo escribir <ESC>/ seguido de una palabra, seguido de enter, y bash busca la palabra en el historial. Como / es también el método de vi para search expresiones regulares, estaba bajo la expresión que bash también searchá expresiones regulares.

Desafortunadamente, cuando <ESC>/foo.*bar en bash, no encuentra ninguna línea en el historial que coincida con la expresión regular foo.*bar .

¿Estoy pasando por alto algo o simplemente no es posible search expresiones regulares en el historial?

La respuesta corta es que no puede usar expresiones regulares para search el historial de shell. De acuerdo con POSIX (el estándar para sistemas operativos tipo Unix), debería poder search utilizando una coincidencia de patrón de shell normal (como se usa para el englobado de nombre de file y con las declaraciones de mayúsculas y case ). Esta function se conoce como búsqueda no incremental, pero actualmente no parece estar implementada correctamente en Bash.

Especificación POSIX

La especificación POSIX para la edición de command-line del shell (modo vi) establece que estos patrones de búsqueda deben usar una coincidencia de patrón de shell regular. Mientras que el ^ meta-character se usa para coincidir con el comienzo de una línea, no son expresiones regulares.

/pattern<newline>

Retroceda en el historial de commands, buscando el patrón especificado, comenzando con la línea de command anterior. Los patrones usan la notación de coincidencia de patrones descrita en la notación de coincidencia de patrones , excepto que el carácter '^' tendrá un significado especial cuando aparezca como el primer carácter del patrón . En este caso, el '^' se descarta y los caracteres que siguen al '^' se emparejarán solo al comienzo de una línea. Los commands en el historial de commands se tratarán como cadenas, no como nombres de file.

Implementación de Bash documentada

Bash usa la biblioteca GNU Readline para proporcionar sus capacidades interactivas de edición de línea y búsqueda de historia. La documentation oficial para la biblioteca Readline se centra más en el modo Emacs, pero una sección corta en su manual, Readline vi Mode indica que

Si bien la biblioteca Readline no tiene un set completo de funciones de edición de vi, sí contiene suficiente para permitir la edición simple de la línea.

El modo Readline vi se comporta como se especifica en el estándar POSIX.

Implementación de Bash real

Después de una serie de experimentos en dos sistemas diferentes, descubrí que la búsqueda no incremental en Bash / Readline no funciona como se describe en su documentation oficial. Descubrí que * se trató como un asterisco literal en lugar de un patrón que coincide con varios caracteres. Del mismo modo, el ? y [ también se tratan como caracteres literales.

Para comparar, intenté usar Vi-mode en tcsh y verifiqué que implementa correctamente la búsqueda de historial como se especifica en el estándar POSIX.

Luego descargué y busqué en el código de la biblioteca Readline y encontré que las funciones de búsqueda de historial usan una búsqueda de subcadenas simple y no usan ningún metacaracido de patrón de búsqueda, aparte del cursor, ^ (ver search.c desde el repository de git para la biblioteca Readline).

Supongo que los desarrolladores de Bash / Readline todavía tienen que implementar esta característica. No pude encontrar una list de errores, pero los files CHANGES muestran que han estado solucionando problemas relacionados con Vi-mode.