Mantendo o histórico por diretório de trabalho (cf. por sessão do shell)

11

Existe uma maneira de fazer com que o recurso de história de um shell moderno tenha um escopo definido para um caminho?

Meus contextos de trabalho são divididos como caminhos no sistema de arquivos, e o padrão de atividade do shell, como comandos emitidos repetidamente, tende a ser distinto para cada 'projeto'. Seria bom se eu pudesse escopo o recurso de histórico para comandos emitidos a partir do caminho atual (ou subcaminho).

sohocoke
fonte

Respostas:

5

Com zsh, você pode fazer:

mkdir -p ~/.zsh/dirhist

E adicione ao seu ~ / .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()é chamado sempre que o diretório atual é alterado. Lá, nós redefinir o arquivo de histórico para algo como ~/.zsh/dirhist/@foo@barquando você cdpara /foo/bar.

Stéphane Chazelas
fonte
Eu gosto dessa abordagem, pois ela não requer alteração dos meus hábitos de uso de shell e, nos poucos dias de teste, parece bem.
sohocoke
10

Não é uma resposta legal, mas uma alternativa se você estiver usando bashcomo seu shell: você pode criar um alias no seu .bashrc.

Por exemplo:

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'

Então, se você digitar a:

  1. você será movido para o diretório do projeto
  2. o histórico atual será salvo ( history -w)
  3. o histórico mantido na memória será redefinido ( history -c)
  4. o arquivo de histórico do projeto será definido como /home/user/.a_historye lido ( history -r)
apaul
fonte
Sei que minha pergunta omitiu um desejo / requisito, desculpe pelos detalhes ausentes. A saber: eu preferiria não ter que lembrar de usar aliases / funções; ou seja, o escopo deve funcionar como um complemento à maneira como eu normalmente interajo com o shell.
sohocoke
Não exporte HISTFILE. Não há razão para exportá-lo para outros programas, e o ~ / .bashrc é executado para todos os processos do bash interativo; portanto, seu código para defini-lo será executado em todo bash de qualquer maneira. Em geral, se uma variável definida pelo shell não é exportada por padrão, você raramente deve exportá-la.
Chris Página
1

Se você estiver usando o ZSH, dê uma olhada neste pequeno plug-in que escrevi recentemente para lidar com isso:

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

Ele armazena um separado HISTFILEpara cada diretório em que você executou comandos e adiciona um chpwdgancho para alternar entre HISTFILEs quando você altera os diretórios.

Ele também fornece um widget zle que você pode vincular a um pressionamento de tecla que alterna HISTFILEentre o "global" original HISTFILEe o HISTFILEdiretório de trabalho atual.

Ele foi originalmente baseado no plug - in por histórico de diretório de Jim Hester , mas foi reescrito desde o início para corrigir muitos dos problemas desse plug-in.

Eric Freese
fonte
As respostas apenas para links são desencorajadas aqui; adicione algumas explicações sobre o que é / como funciona.
0

Eu escrevi um plugin ZSH que faz o que você deseja: https://github.com/tymm/zsh-directory-history

Em contraste com outras soluções, meu plug-in volta automaticamente ao histórico global. Isso significa que você não precisa alternar entre o histórico do diretório e o histórico global.

No entanto, as outras soluções são um pouco mais leves, eu acho.

tymm
fonte