Ведение истории для каждого рабочего каталога (ср. Для сеанса оболочки)

11

Есть ли способ сделать так, чтобы современная функция оболочки была ограничена?

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

sohocoke
источник

Ответы:

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.

Стефан Шазелас
источник
Мне нравится этот подход, так как он не требует изменения моих привычек использования оболочки, и в течение нескольких дней тестирования он кажется удачным.
СохоКок
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)
apaul
источник
Я понимаю, что в моем вопросе пропущено желание / требование, извините за недостающие детали. А именно: я бы предпочел не вспоминать использование псевдонимов / функций; т.е. область видимости должна работать как дополнение к тому, как я обычно взаимодействую с оболочкой.
СохоКок
Не экспортируйте 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

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

Однако другие решения немного более легкие, я думаю.

tymm
источник