Guía de Historial y Persistencia en Fish Shell
Cómo Fish Shell gestiona el historial de comandos, incluyendo búsqueda, eliminación, fusión entre sesiones, el archivo de historial y consejos para mantener un historial limpio.
El historial de Fish es una de esas funciones que trabaja tan bien que rara vez piensas en ella. Los comandos se guardan automáticamente, se comparten entre sesiones (con algunas salvedades) y se pueden buscar de varias formas. Pero hay cosas que vale la pena saber sobre cómo funciona internamente, sobre todo si te importa mantener un historial limpio o sincronizarlo entre máquinas.
Dónde se almacena el archivo de historial
Fish guarda el historial en:
~/.local/share/fish/fish_history
Es un archivo de texto plano con marcas de tiempo. Cada entrada tiene este aspecto:
- cmd: git commit -m "fix auth"
when: 1708784400
El archivo crece con el tiempo. Fish no tiene un límite estricto de tamaño como Bash (HISTSIZE). Por defecto, Fish conserva 256.000 entradas (o unos 16 MB de historial). En la práctica, nunca llegarás a ese límite a menos que añadas historial mediante scripts.
Buscar en el historial
Teclas de flechas
El método más sencillo. Pulsa la flecha arriba para recorrer los comandos anteriores. Si has escrito algo primero, la flecha arriba solo muestra comandos que empiezan con lo que escribiste.
Escribe git y luego pulsa la flecha arriba — Fish recorre solo tus comandos de git. Es una búsqueda de historial basada en prefijo.
Ctrl+R (búsqueda inversa)
Pulsa Ctrl+R y empieza a escribir. Fish busca en tu historial comandos que contengan lo que escribiste, usando sintaxis glob. Escribe git*fix y coincide con comandos que contienen “git” seguido más adelante de “fix”.
Navega por los resultados con las teclas de flechas o sigue escribiendo para acotar la búsqueda. Pulsa Enter para ejecutar el comando seleccionado, o Escape para cancelar.
Si tienes fzf.fish instalado, Ctrl+R abre una búsqueda interactiva con fzf, que es aún mejor.
El comando history
Para búsquedas más precisas:
# Buscar comandos que contengan "docker"
history search docker
# Buscar por prefijo
history search --prefix "git commit"
# Coincidencia exacta
history search --exact "git push origin main"
# Mostrar marcas de tiempo
history search --show-time docker
# Limitar resultados
history search --max 10 docker
# Búsqueda sensible a mayúsculas
history search --case-sensitive Docker
Por defecto, history search no distingue mayúsculas y ordena del más reciente al más antiguo. Añade --reverse para invertir el orden.
Eliminar entradas del historial
A veces ejecutas un comando con un error tipográfico, o accidentalmente pones datos sensibles en la línea de comandos. Fish te permite limpiar eso.
Eliminación interactiva
history delete docker
Esto busca comandos que coincidan con “docker” y te muestra las coincidencias. Puedes introducir números de entradas específicas para eliminar, un rango, o all para quitar todas las coincidencias.
Eliminación exacta
history delete --exact --case-sensitive "docker login -p my_secret_password"
Esto elimina ese comando específico sin preguntar.
Eliminar con el plugin sponge
El plugin sponge elimina automáticamente del historial los comandos que fallan (código de salida distinto de cero). Instálalo con:
fisher install meaningful-ooo/sponge
Me resulta útil porque mantiene los comandos mal escritos y los experimentos fallidos fuera de mis autosugerencias.
Controlar qué se guarda en el historial
La función fish_should_add_to_history
Fish 4.0 añadió un hook que te permite controlar qué comandos se guardan. Define esta función para filtrar entradas del historial:
# ~/.config/fish/functions/fish_should_add_to_history.fish
function fish_should_add_to_history
# No guardar comandos que empiezan con un espacio
string match -qr '^\s' -- $argv[1]; and return 1
# No guardar comandos cortos
test (string length -- $argv[1]) -lt 3; and return 1
# No guardar comandos con patrones sensibles
string match -qr 'password|secret|token|api.key' -- $argv[1]; and return 1
return 0
end
Devuelve 0 para guardar el comando, 1 para omitirlo.
Espacio inicial para omitir el historial
La función anterior demuestra un patrón común: añadir un espacio antes del comando para que no se registre en el historial. Esto imita el comportamiento de HISTCONTROL=ignorespace en Bash. Fish no hace esto por defecto — necesitas la función fish_should_add_to_history.
Historial entre múltiples sesiones
Fish gestiona el historial de múltiples sesiones de forma diferente a Bash. Cada sesión de Fish mantiene su propio historial en memoria y escribe en el archivo de historial compartido. Así funciona:
- Cuando ejecutas un comando, se añade al historial de la sesión actual y se escribe en disco.
- Otras sesiones en ejecución no ven el nuevo comando inmediatamente.
- Las sesiones nuevas que se inicien después de guardar el comando sí lo verán.
history mergefuerza a la sesión actual a cargar comandos de todas las demás sesiones.
Fusionar historial
history merge
Esto importa el historial de otras sesiones de Fish a la actual. Útil si ejecutaste algo en otra pestaña del terminal y quieres acceder a ello con Ctrl+R o la búsqueda con flechas.
Algunas personas lo añaden a un atajo de teclado:
bind \em 'history merge; commandline -f repaint'
Ahora Alt+M fusiona y redibuja el prompt.
Limpiar historial
# Limpiar todo (con confirmación)
history clear
# Limpiar solo el historial de la sesión actual
history clear-session
clear-session es útil cuando has estado experimentando y no quieres que esos comandos contaminen tu historial, pero quieres conservar todo lo anterior.
Guardar historial manualmente
history save
Esto fuerza una escritura inmediata en disco. Fish guarda automáticamente de forma periódica, pero esto asegura que nada se pierda si el shell se cierra inesperadamente.
Añadir comandos sin ejecutarlos
history append "some command I want to remember"
Esto añade el comando al historial sin ejecutarlo. Útil para guardar comandos que quieras encontrar después con Ctrl+R.
Formato del archivo de historial y respaldo
El archivo de historial es fácil de respaldar y portable entre máquinas:
cp ~/.local/share/fish/fish_history ~/fish_history_backup
Para restaurar:
cp ~/fish_history_backup ~/.local/share/fish/fish_history
history merge
Si gestionas dotfiles entre máquinas, puedes crear un enlace simbólico o sincronizar el archivo de historial. Ten en cuenta que las escrituras concurrentes desde varias máquinas podrían causar conflictos — fusiona manualmente si es necesario.
Consejos útiles sobre el historial
Usa abreviaturas en lugar de depender del historial. Si usas un comando cada día, añádelo como abreviatura en lugar de buscarlo en el historial cada vez.
Busca dentro de los resultados. Cuando la búsqueda con Ctrl+R muestra demasiados resultados, añade más caracteres o usa patrones glob. git*main filtra mejor que solo git.
Combina con fzf. El plugin fzf.fish reemplaza el Ctrl+R integrado con una búsqueda difusa mucho más rápida de navegar. Muestra una vista previa y permite selección múltiple.
Elimina patrones. Si cambiaste una contraseña y accidentalmente escribiste la antigua en un comando, history delete --prefix "mysql -p" lo limpia rápido.
Guías relacionadas
- Autocompletado y sugerencias en Fish Shell — el historial alimenta las autosugerencias
- Mejores plugins para Fish Shell — fzf.fish y sponge para mejor historial
- Guía de funciones en Fish Shell — crear fish_should_add_to_history
- Instalar Fish Shell en Ubuntu — primeros pasos
- Fish Shell en macOS — guía de configuración en Mac