Menyimpan riwayat per direktori kerja (lih per sesi shell)

11

Apakah ada cara untuk membuat fitur riwayat shell modern dicakup ke jalur?

Konteks kerja saya dibagi sebagai jalur pada sistem file, dan pola aktivitas shell, seperti perintah yang berulang kali dikeluarkan, cenderung berbeda untuk setiap 'proyek'. Akan lebih baik jika saya bisa lingkup fitur sejarah untuk perintah yang dikeluarkan dari jalur saat ini (atau sub-jalur).

sohocoke
sumber

Jawaban:

5

Dengan zsh, Anda bisa melakukan:

mkdir -p ~/.zsh/dirhist

Dan tambahkan ke ~ / .zshrc Anda:

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()dipanggil setiap kali direktori saat ini berubah. Di sana, kami mengatur ulang file riwayat ke sesuatu seperti ~/.zsh/dirhist/@foo@barketika Anda cdmelakukannya /foo/bar.

Stéphane Chazelas
sumber
Saya suka pendekatan ini, karena tidak perlu mengubah kebiasaan penggunaan cangkang saya, dan dalam beberapa hari pengujian kelihatannya berjalan dengan baik.
sohocoke
10

Bukan jawaban yang rapi tetapi sebuah alternatif jika Anda menggunakan bashshell Anda: Anda dapat membuat beberapa alias di blog Anda .bashrc.

Contohnya:

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'

Lalu, jika Anda mengetik a:

  1. Anda akan dipindahkan di direktori proyek Anda
  2. sejarah saat ini akan disimpan ( history -w)
  3. maka riwayat yang disimpan dalam memori akan diatur ulang ( history -c)
  4. file riwayat proyek akan disetel ke /home/user/.a_historydan dibaca ( history -r)
apaul
sumber
Saya menyadari pertanyaan saya telah menghilangkan keinginan / persyaratan, maaf atas detail yang hilang. Yaitu: Saya lebih suka tidak harus ingat untuk menggunakan alias / fungsi; yaitu pelingkupan harus berfungsi sebagai add-on dengan cara saya biasanya berinteraksi dengan shell.
sohocoke
Jangan ekspor HISTFILE. Tidak ada alasan untuk mengekspornya ke program lain, dan ~ / .bashrc dieksekusi untuk setiap proses bash interaktif, jadi kode Anda untuk mengaturnya akan dijalankan di setiap bash. Secara umum, jika variabel yang ditentukan oleh shell tidak diekspor secara default, Anda jarang harus mengekspornya.
Chris Page
1

Jika Anda menggunakan ZSH, lihat plugin kecil ini yang baru-baru ini saya tulis untuk menangani ini:

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

Ia menyimpan HISTFILEdirektori terpisah untuk setiap direktori yang telah Anda jalankan, dan menambahkan sebuah chpwdhook untuk beralih di antara HISTFILEs ketika Anda mengubah direktori.

Ini juga menyediakan widget zle yang dapat Anda ikat ke penekanan tombol yang akan mengubah HISTFILEantara "global" asli Anda HISTFILEdan HISTFILEuntuk direktori kerja Anda saat ini.

Itu awalnya didasarkan pada plugin per-direktori-sejarah Jim Hester , tetapi sejak itu telah ditulis ulang dari bawah ke atas untuk memperbaiki banyak masalah dengan plugin itu.

Eric Freese
sumber
Tautan jawaban saja tidak disarankan di sini, harap tambahkan beberapa penjelasan tentang apa / bagaimana cara kerjanya.
0

Saya menulis sebuah plugin ZSH yang melakukan apa yang Anda inginkan: https://github.com/tymm/zsh-directory-history

Berbeda dengan solusi lain, plugin saya kembali ke sejarah global secara otomatis. Itu berarti bahwa Anda tidak perlu beralih antara sejarah direktori dan sejarah global.

Namun solusi lain sedikit lebih ringan kurasa.

tymm
sumber