Mantener el historial por directorio de trabajo (cf. por sesión de shell)

11

¿Hay alguna manera de hacer que la característica de historia de un shell moderno se pueda definir en un camino?

Mis contextos de trabajo se dividen como rutas en el sistema de archivos, y el patrón de actividad de shell, como los comandos emitidos repetidamente, tiende a ser distinto para cada 'proyecto'. Sería bueno si pudiera abarcar la función de historial a los comandos emitidos desde la ruta actual (o subruta).

sohocoke
fuente

Respuestas:

5

Con zsh, podrías hacer:

mkdir -p ~/.zsh/dirhist

Y agregue a su ~ / .zshrc:

HISTSIZE=1000
SAVEHIST=10000
setopt HIST_SAVE_NO_DUPS INC_APPEND_HISTORY
HISTFILE=~/.zsh/dirhist/${PWD//\//@}
chpwd() {
  [[ $PWD = $OLDPWD ]] || fc -Pp ~/.zsh/dirhist/${PWD//\//@}
}

chpwd()se llama cada vez que cambia el directorio actual. Allí, restablecer el archivo de la historia en algo así como ~/.zsh/dirhist/@foo@barcuando cda /foo/bar.

Stéphane Chazelas
fuente
Me gusta este enfoque, ya que no requiere cambiar mis hábitos de uso de shell, y en los pocos días de prueba parece ir bien.
sohocoke
10

No es una buena respuesta, sino una alternativa si la está utilizando bashcomo shell: podría crear algunos alias en su .bashrc.

Por ejemplo:

alias a='cd /tmp/A ; history -w ; history -c ; export HISTFILE=/home/user/.a_history ; history -r $HISTFILE'
alias b='cd /tmp/B ; history -w ; history -c ; export HISTFILE=/home/user/.b_history ; history -r $HISTFILE'

Entonces, si escribe a:

  1. serás trasladado a tu directorio de proyectos
  2. se guardará el historial actual ( history -w)
  3. entonces el historial guardado en la memoria se restablecerá ( history -c)
  4. el archivo del historial del proyecto se establecerá /home/user/.a_historyy leerá ( history -r)
apaul
fuente
Me doy cuenta de que mi pregunta había omitido un deseo / requisito, perdón por los detalles faltantes. A saber: prefiero no tener que recordar usar alias / funciones; es decir, el alcance debería funcionar como un complemento de la forma en que normalmente interactúo con el shell.
sohocoke
No exportar HISTFILE. No hay ninguna razón para exportarlo a otros programas, y ~ / .bashrc se ejecuta para cada proceso de bash interactivo, por lo que su código para configurarlo se ejecutará en cada bash de todos modos. En general, si una variable definida por el shell no se exporta por defecto, rara vez debería exportarla.
Chris Page
1

Si está utilizando ZSH, eche un vistazo a este pequeño complemento que escribí recientemente para manejar esto:

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

Almacena un archivo separado HISTFILEpara 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 con una pulsación de tecla que alternará HISTFILEentre su "global" original HISTFILEy el HISTFILEde su directorio de trabajo actual.

Originalmente se basó en el complemento por historial de directorios de Jim Hester , pero desde entonces se ha reescrito desde cero para solucionar muchos de los problemas con ese complemento.

Eric Freese
fuente
Aquí no se recomiendan las respuestas de enlace, agregue alguna explicación de qué es / cómo funciona
0

Escribí un complemento ZSH que hace lo que quieres: https://github.com/tymm/zsh-directory-history

A diferencia de otras soluciones, mi complemento vuelve a la historia global automáticamente. Eso significa que no tiene que cambiar entre el historial del directorio y el historial global.

Sin embargo, las otras soluciones son un poco más livianas, supongo.

tymm
fuente