Prowadzenie historii według katalogu roboczego (por. Sesja powłoki)

11

Czy istnieje sposób na ograniczenie zakresu historii współczesnej powłoki do ścieżki?

Moje konteksty robocze są podzielone jako ścieżki w systemie plików, a wzorzec aktywności powłoki, takiej jak wielokrotnie wydawane polecenia, zwykle różni się dla każdego „projektu”. Byłoby miło, gdybym mógł rozszerzyć funkcję historii do poleceń wydawanych z bieżącej ścieżki (lub ścieżki podrzędnej).

Sohocoke
źródło

Odpowiedzi:

5

Dzięki zshmożesz wykonać:

mkdir -p ~/.zsh/dirhist

I dodaj do swojego ~ / .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()jest wywoływany za każdym razem, gdy zmienia się bieżący katalog. Tam możemy zresetować pliku historii na coś takiego ~/.zsh/dirhist/@foo@bar, kiedy cdsię /foo/bar.

Stéphane Chazelas
źródło
Podoba mi się to podejście, ponieważ nie wymaga zmiany moich nawyków korzystania z powłoki, a po kilku dniach testowania wydaje się dobrze.
sohocoke
10

Nie jest to zgrabna odpowiedź, ale alternatywa, jeśli używasz bashjako powłoki: możesz utworzyć w swoim aliasie jakiś alias .bashrc.

Na przykład:

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'

Następnie, jeśli wpiszesz a:

  1. zostaniesz przeniesiony do katalogu projektu
  2. bieżąca historia zostanie zapisana ( history -w)
  3. wtedy historia przechowywana w pamięci zostanie zresetowana ( history -c)
  4. plik historii projektu zostanie ustawiony na /home/user/.a_historyi read ( history -r)
apaul
źródło
Zdaję sobie sprawę, że moje pytanie pominęło życzenie / wymóg, przepraszam za brakujący szczegół. Mianowicie: wolałbym nie pamiętać o używaniu aliasów / funkcji; tzn. zakres powinien działać jako dodatek do sposobu, w jaki normalnie współdziałam z powłoką.
sohocoke
Nie eksportuj HISTFILE. Nie ma powodu, aby eksportować go do innych programów, a ~ / .bashrc jest wykonywany dla każdego interaktywnego procesu bash, więc kod do jego ustawienia będzie uruchamiany w każdym bashu. Ogólnie, jeśli zmienna zdefiniowana w powłoce nie jest domyślnie eksportowana, rzadko należy ją eksportować.
Chris Page
1

Jeśli używasz ZSH, spójrz na tę małą wtyczkę, którą niedawno napisałem, aby to obsłużyć:

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

Przechowuje osobny HISTFILEdla każdego katalogu, w którym wykonałeś polecenia, i dodaje chpwdzaczep, aby przełączać się między HISTFILEs podczas zmiany katalogów.

Zapewnia również widget zle, który można powiązać z naciśnięciem klawisza, który będzie przełączał HISTFILEmiędzy oryginalnym „globalnym” HISTFILEa HISTFILEbieżącym katalogiem roboczym.

Pierwotnie był oparty na wtyczce Jima Hestera dla poszczególnych katalogów , ale od tego czasu został przepisany od podstaw, aby naprawić wiele problemów z tą wtyczką.

Eric Freese
źródło
Odsyłacze tylko odpowiedzi są tutaj odradzane, proszę dodać wyjaśnienie, co to jest / jak to działa.
0

Napisałem wtyczkę ZSH, która robi to, co chcesz: https://github.com/tymm/zsh-directory-history

W przeciwieństwie do innych rozwiązań moja wtyczka automatycznie wraca do historii globalnej. Oznacza to, że nie musisz przełączać się między historią katalogów a historią globalną.

Jednak inne rozwiązania są nieco lżejsze.

tymianek
źródło