Зберігання історії за робочим каталогом (див. За сеанс оболонки)


11

Чи є спосіб зробити так, щоб особливість історії сучасної оболонки перенести на шлях?

Мій робочий контекст розділений як шляхи до файлової системи, і модель активності оболонки, така як неодноразово видані команди, має тенденцію бути відмінною для кожного "проекту". Було б непогано, якби я міг застосувати функцію історії на команди, видані з поточного шляху (або піддоріжки).

Відповіді:


5

З zsh, ви можете зробити:

mkdir -p ~/.zsh/dirhist

І додайте до свого ~ / .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()викликається кожен раз, коли змінюється поточний каталог. Там ми скидаємо файл історії на щось подібне, ~/.zsh/dirhist/@foo@barколи вам cdпотрібно /foo/bar.


Мені подобається такий підхід, оскільки він не потребує зміни звичок використання оболонок, і за кілька днів тестування здається, що це добре.
sohocoke

10

Не чітка відповідь, а альтернатива, якщо ви використовуєте bashв якості оболонки: ви можете створити певний псевдонім у своїй .bashrc.

Наприклад:

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'

Потім, якщо ви введете a:

  1. вас перенесуть у каталог вашого проекту
  2. поточна історія буде збережена ( history -w)
  3. тоді історія, що зберігається в пам'яті, буде скинута ( history -c)
  4. файл історії проекту буде встановлено /home/user/.a_historyта прочитати ( history -r)

Я розумію, що моє запитання пропустило бажання / вимогу, вибачте за відсутні деталі. А саме: я вважаю за краще не забувати використовувати псевдоніми / функції; тобто масштабування повинно працювати як доповнення до того, як я зазвичай взаємодію з оболонкою.
sohocoke

Не експортуйте HISTFILE. Немає ніяких причин експортувати його в інші програми, і ~ / .bashrc виконується для кожного інтерактивного процесу bash, тому ваш код для його налаштування в будь-якому випадку буде запущений у кожному bash. Загалом, якщо змінна, визначена оболонкою, не експортується за замовчуванням, її рідко слід експортувати.
Кріс Пейдж

1

Якщо ви використовуєте ZSH, подивіться на цей невеликий плагін, який я нещодавно написав, щоб вирішити це:

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

Він зберігає окремий HISTFILEдля кожного каталогу, в якому виконуються команди, і додає chpwdгачок для перемикання між HISTFILEs при зміні каталогів.

Він також надає віджет zle, який можна прив’язати до натискання клавіші, який буде перемикати HISTFILEміж початковим "глобальним" HISTFILEта " HISTFILEпоточним" робочим каталогом.

Спочатку він базувався на плагіні історії Джима Хестера за каталогами , але з тих пір був переписаний з нуля, щоб виправити багато проблем із цим плагіном.


Тут не рекомендується відповідати лише на посилання. Будь ласка, додайте пояснення, що таке / як це працює.

0

Я написав плагін ZSH, який робить те, що ви хочете: https://github.com/tymm/zsh-directory-history

На відміну від інших рішень мій плагін автоматично повертається до глобальної історії. Це означає, що вам не доведеться перемикатися між історією каталогів та глобальною історією.

Однак інші рішення є трохи легшими, я думаю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.