This is an implementation of per directory history for ZSH:
Typed commands are saved both in a global history, as well as a per-directory history.
A hotkey (AltL by default) toggles the current history, used for ZSH history navigation and search.
Directory histories are saved in a hierarchy under your home directory mirroring the filesystem hierarchy.
This implementation is loosely based on the implementation by Jim Hester. Notable differences:
Works smoothly with very large (global) history files. The global history file is only read in full when switching to it with the hotkey.
Works smoothly with share_history
(commands are flushed to history
files immediately, and become visible in other shell instances).
Some subjectively saner defaults and namespacing fixes.
Load this script into your interactive ZSH session:
% source zsh-per-directory-history.zsh
The default mode is per-directory history, interact with your history as normal.
Press AltL (lowercase) to toggle between local and global histories.
PER_DIRECTORY_HISTORY_TOGGLE
is a shell variable defining the key
combination which toggles between directory and global histories.
PER_DIRECTORY_HISTORY_BASE
is a shell variable which defines the
base directory in which the directory histories are stored.
PER_DIRECTORY_HISTORY_FILE
is a shell variable which defines the
name of the files which will contain the directory histories. It
should be set to something that's unlikely to occur as a path
component in any paths you intend to visit on your filesystem.
PER_DIRECTORY_HISTORY_NEW_PROMPT
is a shell variable which defines if
new prompt is created when the history is toggled. Set to false to only
show a message below the prompt.
per-directory-history-toggle-history
is the function to toggle the
history mode.