## 16.2.4 History
# NOTE: NO_HIST_SAVE_BY_COPY to allow saving histfile if updating another
# user's histfile. this is for compatibility with zsu.
- HIST_FCNTL_LOCK HIST_IGNORE_DUPS HIST_IGNORE_SPACE HIST_LEX_WORDS
- HIST_NO_STORE HIST_REDUCE_BLANKS NO_HIST_SAVE_BY_COPY SHARE_HISTORY
+ EXTENDED_HISTORY HIST_FCNTL_LOCK HIST_IGNORE_ALL_DUPS HIST_IGNORE_DUPS
+ HIST_IGNORE_SPACE HIST_LEX_WORDS HIST_NO_STORE HIST_REDUCE_BLANKS
+ NO_HIST_SAVE_BY_COPY HIST_SAVE_NO_DUPS SHARE_HISTORY
## 16.2.6 Input/Output
NO_CLOBBER CLOBBER_EMPTY CORRECT_ALL INTERACTIVE_COMMENTS
HASH_EXECUTABLES_ONLY
}
find_keymap
if [[ -z $keymap ]] {
- if read -q "?Can't read terminfo. Add new zkbd keymap? [y/N]"; then
+ if (read -q "?Can't read terminfo. Add new zkbd keymap? [y/N]") {
echo
- autoload -Uz zkbd && zkbd
- unfunction zkbd
+ {
+ autoload -Uz zkbd && zkbd
+ } always {
+ TRY_BLOCK_ERROR=0
+ unfunction zkbd
+ }
find_keymap
- fi
+ }
echo
}
if [[ -n $keymap ]] {
}
unset a k v
+## fzf
+# bash-style reverse-search-history (i.e. reverse-i-search)
+if [[ -v commands[fzf] ]] {
+ function _history-incremental-pattern-search-fzf {
+ fc -AI
+ # XXX: this shit is cursed and sometimes doesn't work
+ # TODO: remove doesn't work over newlines, fzf replaces them with \n,
+ # and sed of course hates newlines and would need to be massaged
+ # TODO: interactive history refresh... can't get zsh to load histfile:
+ # +reload(HISTFILE='"$h HISTSIZE=$HISTSIZE SAVEHIST=$SAVEHIST \$0 +Z -dfimc 'setopt EXTENDED_HISTORY;fc -R \$HISTFILE;$c' </dev/null 2>&1)" \
+ local c='fc -lt%F -1 0'
+ local h="'${HISTFILE//\'/\'\\\'\'}'"
+ local l=(${(f)"$($=c | fzf \
+ --scheme=history -e -n 1,3.. \
+ +s \
+ -m --bind 'ctrl-d:execute-silent(sed -i -f <(
+ sed -Ee '\''s/[$*.[\^/]/\\&/g;s~.*~/^\\(: [0-9]\\+:[0-9]\\+;\\)\\?&$/d~'\'' {+f3..}
+ ) '$h')+abort' \
+ --preview-window=hidden --height=20% \
+ --with-shell "${0:a} -dfc" \
+ ${BUFFER:+-q $BUFFER})"})
+ # XXX: this sucks, I hate this. no other way to flush internal history?
+ HISTFILE= HISTSIZE=0 fc -p $HISTFILE $HISTSIZE $SAVEHIST
+ l=$(for x ("${l[@]}") { echo ${${=x}:3}; })
+ BUFFER="$l"
+ zle reset-prompt
+ }
+ zle -N _history-incremental-pattern-search-fzf
+ bindkey '^R' _history-incremental-pattern-search-fzf
+} else {
+ bindkey '^R' history-incremental-pattern-search-backward
+}
+
### aliases
## builtins
alias rehash='_sev_setpath; rehash'
alias g=git
alias gd='git diff'
alias gdh='git diff HEAD'
+alias gdp='git diff HEAD\^'
alias gds='git diff --staged'
alias ga='git add'
alias ga.='git add .'
alias gu='git pull'
alias gl='git log'
alias gt='git tree' # from gitconfig
-alias gs='git show'
-alias gst='git stash'
+alias gsh='git show'
+alias gshn='git show --name-status'
+alias gst='git status'
+alias gsts='git status --short'
+alias gs='git stash'
alias gsp='git stash pop'
+alias gsd='git stash drop'
+alias gss='git stash show -p'
+alias grc='git rebase --continue'
## cd/zoxide
function up {
\cd $(printf '../%.0s' {1..${1:-1}})
# https://github.com/ajeetdsouza/zoxide/issues/513
eval "${$(zoxide init zsh):s#_files -/#_cd#}"
alias cd=z
+ alias z-='z -'
}
alias cd..=up
## dotfiles
}
add-zsh-hook chpwd sev_chpwd
-### system-specific configs and aliases
-case $OSTYPE; in
- freebsd*)
- ## colors
- export CLICOLOR=
- export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
-
- ## sound
- function s { sysctl hw.snd.default_unit${1:+\=$1} }
- alias vol mixer
-
- ## install port dependencies from pkg (like pkgsrc `bmake bin-install')
- # XXX: should probably use package-depends where possible, breaks when
- # port name is different to package name
- # (eg. graphics/sdl20 == sdl2, devel/glib20 == glib2, etc)
- function portpkg {
- case "$1" {
- build|run)
- sudo pkg install -AU $(make ${1}-depends-list |
- sed 's_/usr/ports/_ _' | tr -d '\n')
- ;;
- *) echo "Usage: \`portpkg <build|run>' in a port directory"
- return 1;;
- }
- };;
- netbsd)
- ## sound
- function s {
- if [[ -z "$1" ]] {
- ll /dev/mixer /dev/sound /dev/audio
- return
- }
- for x in mixer sound audio; do
- ln -sf /dev/$x"$1" /dev/$x
- done
- }
- function vol {
- if [[ -z "$1" ]] {
- for x in $(mixerctl -a | grep 'outputs\.master'); do
- echo -E - $x
- done
- return
- }
- mixerctl -w outputs.master"$2"="$1"
- };;
- *)
- ## sound
- # TODO: test alsa/oss/sndio/portaudio/pulse/pipewire in order of importance
- function s {}
- function vol {}
-esac
-
### prompt
autoload -Uz promptinit && promptinit
prompt arrows
+### plugins
+load-plugins zshrc
+
### load site-specific
load-site-dotfile zshrc