Historial por directorio en zsh


10

Estoy feliz usando zshdesde hace un tiempo, y estoy bastante satisfecho con mi configuración de historial, que son:

# Write to history immediately
setopt inc_append_history
# History shared among terminals
setopt share_history
# Save extended info in history
setopt extended_history
# Ignore duplicates
setopt hist_ignoredups

Pero sucede a menudo que necesito usar comandos específicos dentro de algunos directorios específicos. Por ejemplo, cuando estoy adentro ~/my_project, generalmente invoco make target1 && ./run1, pero cuando estoy adentro ~/second_project, generalmente necesito make target2 && cat foobar | ./run2.

Es decir: directorios diferentes, pero comandos similares.

Entonces, usualmente cd ~/my_projectescribo makey luego busco hacia atrás en el historial hasta encontrar lo que necesito. Pero si sucede que trabajé second_project, al buscar en el historial encontraré algunos comandos que no necesito.

Entonces, mi pregunta: ¿existe un complemento / configuración / algo para zsh tal que, al buscar en el historial, los comandos invocados en el directorio actual se muestren primero?

Idealmente, todos los demás comandos de historial coincidentes aparecerán después de esos, opcionalmente especificando un número máximo de elementos prioritarios.

Intentaría escribir algo como esto por mí mismo, pero todavía no sé cómo escribir complementos personalizados de zsh, cómo manejar el historial, etc.

Respuestas:


6

Hay un complemento que dice hacer exactamente lo que está buscando, llamado apropiadamente por complemento de historial de directorio :

https://github.com/jimhester/oh-my-zsh/commit/baa187e4b903f39422a84b580e6e617ec3738e09

"Por-directorio-historial: rastrea el historial de comandos anterior tanto por directorio actual como globalmente, con la capacidad de cambiar entre ellos sobre la marcha, vinculado a ctrl-g". dice su wiki.

No lo probé yo mismo (todavía), pero según los comentarios debería funcionar.


1
¡Genial gracias! Lo intentaré antes de aceptar, si no te importa :)
AkiRoss

1
Hasta que me perdí algo, el complemento no es exactamente lo que necesito, en el sentido de que por directorio e historias globales se cambian mutuamente usando ctrl-g(y no por prioridad como pregunté). Sin embargo, todavía lo encuentro extremadamente útil y una buena respuesta a mi pregunta, así que, gracias :)
AkiRoss

Tal vez se deba a cambios en ZSH, pero este complemento en su versión actual no parece manejar la edición del historial de ZSH correctamente.
Owen

0

Acabo de escribir un pequeño complemento que hace mucho de lo que hace el complemento de Jim Hester, pero utiliza un enfoque diferente que soluciona muchos de los problemas enumerados en el repositorio de GitHub de ese complemento:

https://github.com/ericfreese/zsh-cwd-history

Almacena un HISTFILEdirectorio separado para cada directorio en el que ha ejecutado comandos, y agrega un chpwdenlace para cambiar entre HISTFILEs cuando cambia de directorio.

También proporciona un widget zle que puede vincular a una pulsación de tecla que alternará HISTFILEentre su "global" original HISTFILEy el HISTFILEde su directorio de trabajo actual.

Entonces, mi pregunta: ¿existe un complemento / configuración / algo para zsh tal que, al buscar en el historial, los comandos invocados en el directorio actual se muestren primero?

El complemento zsh-cwd-history actualmente no admite esto, pero espero agregar soporte pronto.


0

Tuve exactamente el mismo problema y escribí un complemento ZSH que lo resuelve: https://github.com/tymm/zsh-directory-history

No tiene que cambiar manualmente entre el historial global y el de directorio cuando usa mi complemento.

Idealmente, todos los demás comandos de historial coincidentes aparecerán después de esos, opcionalmente especificando un número máximo de elementos prioritarios.

Esto también funciona fuera de la caja con mi complemento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.