Busque un comando anterior con el mismo prefijo cuando presiono Arriba en un indicador de comandos de shell

19

Viniendo de un mundo de FreeBSD, deseo que el terminal de Linux se comporte como FreeBSD, especialmente la versión 9.1, básicamente cuando escribes cden el terminal y presionas la flecha "arriba" puedes navegar por todos los comandos en la historia comenzando con cdlo que te hace ganar mucho tiempo

No sé cómo habilitar esta función en Linux Debian o CentOS que me obligan a escribir todo, ¿podría alguien ayudarme?

Abdelilah Benaou
fuente
77
Esa es una función del shell, no del terminal. ¿Qué shell estás usando en FreeBSD? Es posible que pueda obtener el mismo (o similar) shell para Linux.
cjm
Estoy usando el shell tcsh.
Abdelilah Benaou
2
Estoy usando tcsh bajo OS X y no tuve este comportamiento práctico ... Después de buscar, descubrí que podía habilitarlo al poner bindkey -k (up|down) history-search-(back|for)wardmi .tcshrc como se describe aquí . ¡Frio!
Garrett Albright

Respuestas:

34

Agregue lo siguiente a ~/.inputrc:

# Press up-arrow for previous matching command
"\e[A":history-search-backward
# Press down-arrow for next matching command
"\e[B":history-search-forward

Explicación

~/.inputrces el archivo de configuración para GNU readline . Muchos shells, incluidos bashy tcshusan readline para la edición de la línea de comandos. Las dos líneas anteriores le indicarán a readline que invoque su funcionalidad de búsqueda de historial cuando se encuentren las secuencias de escape para la tecla de flecha hacia arriba ( \e[A) y la tecla de flecha hacia abajo ( \e[B).

Thomas Nyman
fuente
Me gusta agregar F12 para poner la última palabra de la última línea al final del comando actual. Last wordA menudo es un camino que quiero probar en varios clichés arcanos. Y Shift F12 para volver a editar la última línea completa desde el principio. ~/.inputrcEs una herramienta útil.
jalanb
El Shift F12 requiere el modo vi .
jalanb
6

Lo que sucede es que FreeBSD y Linux usan diferentes shells por defecto. FreeBSD tiene por defecto tcsh , que tenía mejores características interactivas que bash en el pasado (pero bash se ha puesto al día) pero características de scripting notablemente peores .

La forma más sencilla de obtener el entorno al que está acostumbrado sería cambiar su shell a tcsh en Linux. Siempre que tcsh esté instalado en todo el sistema (si no lo está, solicite al administrador del sistema que lo instale), ejecute chsh -s tcshpara cambiar su shell predeterminado.

Alternativamente, puede configurar bash para tener este comando al que está acostumbrado. De forma predeterminada, las flechas Upy Downnavegan entre todos los comandos del historial, no solo los que comienzan con el prefijo que ha escrito. Para cambiar esto al comportamiento al que está acostumbrado, coloque las siguientes líneas en el archivo de inicialización de bash, que se encuentra .bashrcen su directorio de inicio. Ejecute . ~/.bashrco inicie un nuevo shell para volver a leer el archivo de inicialización.

bind '"\eOA": history-search-backward'
bind '"\e[A": history-search-backward'
bind '"\eOB": history-search-forward'
bind '"\e[B": history-search-forward'

Las secuencias de escape son lo que su terminal envía al shell cuando presiona una tecla de flecha. Uppuede ser \eOA(escape, O, A) o \e[Aen función de su terminal, y lo mismo para Down.

Por defecto, bash ofrece diferentes combinaciones de teclas para buscar en el historial de comandos. Puede presionar Ctrl+ R, luego ingresar algunos caracteres para buscar un comando que contenga esta subcadena en cualquier lugar de la línea. Presione Ctrl+ Spara avanzar en lugar de retroceder. La búsqueda es incremental (es decir, a medida que escribe); Alt+ Py Alt+ le Ndan una búsqueda no incremental.

En lugar de bash y tcsh, puede cambiar a zsh, que tiene algunas características interesantes que no se encuentran en otros shells . Zsh tiene Ctrl+ Ry Ctrl+ Spor defecto al igual que bash. Para obtener Upy Downcomo tenía en tcsh, ponga las siguientes líneas en ~/.zshrc:

bindkey '\eOA' history-beginning-search-backward
bindkey '\e[A' history-beginning-search-backward
bindkey '\eOB' history-beginning-search-forward
bindkey '\e[B' history-beginning-search-forward

Si desea utilizar el mismo shell en todas partes, también puede usar bash o zsh en FreeBSD, siempre que el puerto esté instalado (nuevamente, consulte al administrador del sistema).

Gilles 'SO- deja de ser malvado'
fuente
1

tcshestá disponible para la mayoría de las distribuciones de Linux. Intente instalar el tcshpaquete y luego ejecutarlo chsh -s /bin/tcshpara convertirlo en su shell predeterminado.

cjm
fuente
1
O podría considerar cambiar a bash (lo hice).
Keith Thompson
1

Otras respuestas lo abordan, pero si quieres más, echa un vistazo a https://github.com/zsh-users/zsh-history-substring-search

Prezto ( https://github.com/sorin-ionescu/prezto ) también está lleno de productos zsh.

Fuad Saud
fuente
Gracias por su respuesta, por cierto, todavía no veo qué beneficios tiene zsh sobre bash o tcsh.
Abdelilah Benaou
1
Hum, puedes hacer casi todas las cosas básicas en todas estas conchas. Uso zsh debido al paquete prezto bastante bien mantenido (probablemente el gran cambio de juego), el aviso correcto (que es una característica exclusiva) y porque se siente más pulido que bash (consiguración y demás).
Fuad Saud