История каталогов в zsh

10

Я с удовольствием пользуюсь zshуже некоторое время, и меня вполне устраивают мои настройки истории:

# Write to history immediately
setopt inc_append_history
# History shared among terminals
setopt share_history
# Save extended info in history
setopt extended_history
# Ignore duplicates
setopt hist_ignoredups

Но часто случается так, что мне нужно использовать определенные команды внутри определенных каталогов. Например, когда я нахожусь, ~/my_projectя обычно вызываю make target1 && ./run1, но когда я нахожусь, ~/second_projectя обычно нуждаюсь make target2 && cat foobar | ./run2.

То есть: разные каталоги, но похожие команды.

Итак, я обычно cd ~/my_projectи печатаю, makeа затем ищу в истории, пока не найду то, что мне нужно. Но если случится, что я работал second_project, при поиске в истории я найду некоторые команды, которые мне не нужны.

Итак, мой вопрос: существует ли для zsh плагин / настройка / что-то такое, что при поиске в истории команды, вызываемые в текущем каталоге, отображаются первыми?

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

Я бы попытался написать что-то подобное самостоятельно, но я все еще не знаю, как писать собственные плагины zsh, как обращаться с историей и так далее.

AkiRoss
источник

Ответы:

6

Существует плагин, который утверждает, что делает именно то, что вы ищете, с соответствующим именем для каждого плагина истории каталогов :

https://github.com/jimhester/oh-my-zsh/commit/baa187e4b903f39422a84b580e6e617ec3738e09

«Per-directory-history - отслеживает предыдущую историю команд как по текущему каталогу, так и по всему миру, с возможностью переключения между ними на лету, привязанного к ctrl-g». говорит их вики.

Я не проверял это сам (пока), но согласно комментариям это должно работать.

superuser0
источник
1
Хорошо, спасибо! Я попробую, прежде чем принять, если вы не возражаете :)
AkiRoss
1
Пока я что-то не пропустил, плагин не совсем то , что мне нужно, в том смысле, что для каждого каталога и глобальных историй взаимно переключаются с использованием ctrl-g(а не по приоритету, как я просил). Тем не менее, я все еще нахожу это чрезвычайно полезным и хорошим ответом на мой вопрос, так что, спасибо :)
AkiRoss
Возможно, это связано с изменениями в ZSH, но этот плагин в его текущей версии, похоже, неправильно обрабатывает историю ZSH.
Оуэн
0

Я только что написал небольшой плагин, который делает большую часть того, что делает плагин Джима Хестера, но использует другой подход, который устраняет многие проблемы, перечисленные в репозитории GitHub этого плагина:

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

Он хранит отдельную информацию HISTFILEдля каждого каталога, в котором вы выполняли команды, и добавляет chpwdхук для переключения между HISTFILEs при смене каталогов.

Он также предоставляет виджет zle, который вы можете привязать к нажатию клавиши, который переключит HISTFILEмежду вашим исходным «глобальным» HISTFILEи HISTFILEтекущим рабочим каталогом.

Итак, мой вопрос: существует ли для zsh плагин / настройка / что-то такое, что при поиске в истории команды, вызываемые в текущем каталоге, отображаются первыми?

Плагин zsh-cwd-history в настоящее время не поддерживает это, но я надеюсь добавить поддержку для него в ближайшее время.

Эрик Фриз
источник
0

У меня была точно такая же проблема, и я написал плагин ZSH, который решает ее: https://github.com/tymm/zsh-directory-history

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

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

Это также работает из коробки с моим плагином.

tymm
источник