foxshell/fn/-z4h-init-zle
2025-07-04 11:48:40 -05:00

1103 lines
40 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env zsh
if { zstyle -t :z4h: term-shell-integration || zstyle -t :z4h: iterm2-integration } &&
[[ $TERM != (dumb|linux) && $ITERM_SHELL_INTEGRATION_INSTALLED != Yes &&
-z $NVIM_LISTEN_ADDRESS && -z $NVIM ]]; then
-z4h-enable-iterm2-integration
else
function -z4h-iterm2-precmd() { }
function -z4h-iterm2-preexec() { }
fi
# When a command is running, display it in the terminal title.
function -z4h-set-term-title-preexec() {
emulate -L zsh
local _z4h_fmt
if [[ -n $SSH_CONNECTION || $P9K_SSH == 1 ]]; then
zstyle -s :z4h:term-title:ssh preexec _z4h_fmt || _z4h_fmt='%n@%m: ${1//\%/%%}'
else
zstyle -s :z4h:term-title:local preexec _z4h_fmt || _z4h_fmt='${1//\%/%%}'
fi
-z4h-iterm2-preexec
[[ -z $_z4h_fmt ]] || -z4h-set-term-title $_z4h_fmt "$@"
}
# When no command is running, display the current directory in the terminal title.
function -z4h-set-term-title-precmd() {
local -i err=$?
emulate -L zsh
local _z4h_fmt
if [[ -n $SSH_CONNECTION || $P9K_SSH == 1 ]]; then
zstyle -s :z4h:term-title:ssh precmd _z4h_fmt || _z4h_fmt='%n@%m: %~'
else
zstyle -s :z4h:term-title:local precmd _z4h_fmt || _z4h_fmt='%~'
fi
-z4h-iterm2-precmd $err
[[ -z $_z4h_fmt ]] || -z4h-set-term-title $_z4h_fmt
}
autoload -Uz up-line-or-beginning-search down-line-or-beginning-search || return
autoload -Uz run-help ${^fpath}/run-help-^*.zwc(N:t) || return
add-zsh-hook -- preexec -z4h-set-term-title-preexec || return
add-zsh-hook -- precmd -z4h-set-term-title-precmd || return
[[ -v aliases[run-help] ]] && unalias run-help
local pkg
typeset -gA _z4h_use
for pkg in fzf powerlevel10k systemd zsh-history-substring-search \
zsh-completions zsh-autosuggestions zsh-syntax-highlighting; do
zstyle -t :z4h:$pkg channel none || _z4h_use[$pkg]=1
done
typeset -grA _z4h_use
if (( _z4h_use[powerlevel10k] && ! $#POWERLEVEL9K_CONFIG_FILE )) ; then
POWERLEVEL9K_CONFIG_FILE=$ZDOTDIR/.p10k
if [[ $langinfo[CODESET] != (utf|UTF)(-|)8 || $TERM == (dumb|linux) ]]; then
POWERLEVEL9K_CONFIG_FILE+=-ascii
fi
(( terminfo[colors] >= 256 )) || POWERLEVEL9K_CONFIG_FILE+=-8color
POWERLEVEL9K_CONFIG_FILE+=.zsh
fi
# Enable command_not_found_handler if possible.
if [[ -v functions[command_not_found_handler] ]]; then
# Already installed or not needed.
elif [[ -v commands[brew] &&
-n $HOMEBREW_REPOSITORY &&
-e $HOMEBREW_REPOSITORY/Library/Taps/homebrew/homebrew-command-not-found/cmd/which-formula.rb ||
-x /usr/lib/command-not-found ]]; then
autoload +X -Uz -- -z4h-command-not-found
builtin functions -c -- -z4h-command-not-found command_not_found_handler
elif [[ -e /etc/zsh_command_not_found ]]; then
builtin source /etc/zsh_command_not_found
elif [[ -e /usr/share/doc/pkgfile/command-not-found.zsh ]]; then
builtin source /usr/share/doc/pkgfile/command-not-found.zsh
elif [[ -x /usr/libexec/pk-command-not-found && -S /var/run/dbus/system_bus_socket ]]; then
command_not_found_handler() { /usr/libexec/pk-command-not-found "$@" }
elif [[ -x /data/data/com.termux/files/usr/libexec/termux/command-not-found ]]; then
command_not_found_handler() { /data/data/com.termux/files/usr/libexec/termux/command-not-found "$1" }
elif [[ -x /run/current-system/sw/bin/command-not-found ]]; then
command_not_found_handler() { /run/current-system/sw/bin/command-not-found "$@" }
fi
function z4h-up-prefix-local() {
-z4h-with-local-history 1 up-line-or-beginning-search "$@"
}
function z4h-down-prefix-local() {
-z4h-with-local-history 1 down-line-or-beginning-search "$@"
}
function z4h-up-prefix-global() {
-z4h-with-local-history 0 up-line-or-beginning-search "$@"
}
function z4h-down-prefix-global() {
-z4h-with-local-history 0 down-line-or-beginning-search "$@"
}
if (( _z4h_use[zsh-history-substring-search] )); then
function z4h-up-substring-local() {
-z4h-with-local-history 1 history-substring-search-up "$@"
}
function z4h-down-substring-local() {
-z4h-with-local-history 1 history-substring-search-down "$@"
}
function z4h-up-substring-global() {
-z4h-with-local-history 0 history-substring-search-up "$@"
}
function z4h-down-substring-global() {
-z4h-with-local-history 0 history-substring-search-down "$@"
}
fi
function z4h-kill-word() { -z4h-move-and-kill z4h-forward-word }
function z4h-backward-kill-word() { -z4h-move-and-kill z4h-backward-word }
function z4h-kill-zword() { -z4h-move-and-kill z4h-forward-zword }
function z4h-backward-kill-zword() { -z4h-move-and-kill z4h-backward-zword }
function z4h-beginning-of-buffer() { CURSOR=0 }
function z4h-end-of-buffer() {
typeset -gi CURSOR='_z4h_cursor_max()'
}
function z4h-expand() { zle _expand_alias || zle .expand-word || true }
function z4h-cd-back() { -z4h-cd-rotate +1 }
function z4h-cd-forward() { -z4h-cd-rotate -0 }
function z4h-cd-up() { builtin cd -q .. && -z4h-redraw-prompt }
function z4h-do-nothing() {}
if (( $+terminfo[civis] && $+terminfo[cnorm] )) && [[ -v _z4h_tty_fd ]]; then
function -z4h-cursor-hide() {
[[ -t 1 ]] && echoti civis || echoti civis >&$_z4h_tty_fd
}
function -z4h-cursor-show() {
# See https://github.com/romkatv/powerlevel10k/issues/1699.
local cnorm=${${terminfo[cnorm]-}:/*$'\e[?25h'(|'\e'*)/$'\e[?25h'}
[[ -t 1 ]] && print -rn -- $cnorm || print -rnu $_z4h_tty_fd -- $cnorm
}
else
function -z4h-cursor-hide() {}
function -z4h-cursor-show() {}
fi
functions -M -- _z4h_cursor_max 0 0
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
zle -N z4h-accept-line
zle -N z4h-eof
zle -N z4h-exit
zle -N z4h-expand
zle -N z4h-forward-word
zle -N z4h-kill-word
zle -N z4h-backward-word
zle -N z4h-backward-kill-word
zle -N z4h-forward-zword
zle -N z4h-kill-zword
zle -N z4h-backward-zword
zle -N z4h-backward-kill-zword
zle -N z4h-quote-prev-zword
zle -N z4h-beginning-of-buffer
zle -N z4h-end-of-buffer
zle -N z4h-stash-buffer
zle -N z4h-fzf-complete
zle -N z4h-up-prefix-local
zle -N z4h-down-prefix-local
zle -N z4h-up-prefix-global
zle -N z4h-down-prefix-global
if (( _z4h_use[zsh-history-substring-search] )); then
zle -N z4h-up-substring-local
zle -N z4h-down-substring-local
zle -N z4h-up-substring-global
zle -N z4h-down-substring-global
fi
zle -N z4h-cd-back
zle -N z4h-cd-forward
zle -N z4h-cd-up
zle -N z4h-cd-down
zle -N z4h-fzf-history
zle -N z4h-fzf-dir-history
zle -N z4h-autosuggest-accept
zle -N z4h-do-nothing
zle -N z4h-clear-screen-soft-top
zle -N z4h-clear-screen-soft-bottom
zle -N z4h-clear-screen-hard-top
zle -N z4h-clear-screen-hard-bottom
zle -C -- -z4h-comp-insert-all complete-word -z4h-comp-insert-all
PROMPT_EOL_MARK='%K{red} %k' # mark the missing \n at the end of a comand output with a red block
WORDCHARS='' # only alphanums make up words in word-based zle widgets
ZLE_REMOVE_SUFFIX_CHARS='' # don't eat space when typing '|' after a tab completion
KEYTIMEOUT=20 # wait for 200ms for the continuation of a key sequence
zle_highlight=('paste:none') # disable highlighting of text pasted into the command line
if (( ! _z4h_custom_histfile )); then
HISTFILE=${ZDOTDIR:-~}/.zsh_history
fi
HISTSIZE=1000000000 # infinite command history
SAVEHIST=1000000000 # infinite command history
# Delete all existing keymaps and reset to the default state.
bindkey -d
bindkey -e
local keymap
for keymap in emacs viins vicmd; do
# If NumLock is off, translate keys to make them appear the same as with NumLock on.
bindkey -M $keymap -s '^[OM' '^M' # enter
bindkey -M $keymap -s '^[OX' '='
bindkey -M $keymap -s '^[Oj' '*'
bindkey -M $keymap -s '^[Ok' '+'
bindkey -M $keymap -s '^[Ol' '+'
bindkey -M $keymap -s '^[Om' '-'
bindkey -M $keymap -s '^[On' '.'
bindkey -M $keymap -s '^[Oo' '/'
bindkey -M $keymap -s '^[Op' '0'
bindkey -M $keymap -s '^[Oq' '1'
bindkey -M $keymap -s '^[Or' '2'
bindkey -M $keymap -s '^[Os' '3'
bindkey -M $keymap -s '^[Ot' '4'
bindkey -M $keymap -s '^[Ou' '5'
bindkey -M $keymap -s '^[Ov' '6'
bindkey -M $keymap -s '^[Ow' '7'
bindkey -M $keymap -s '^[Ox' '8'
bindkey -M $keymap -s '^[Oy' '9'
# If someone switches our terminal to application mode (smkx), translate keys to make
# them appear the same as in raw mode (rmkx).
bindkey -M $keymap -s '^[OA' '^[[A' # up
bindkey -M $keymap -s '^[OB' '^[[B' # down
bindkey -M $keymap -s '^[OD' '^[[D' # left
bindkey -M $keymap -s '^[OC' '^[[C' # right
bindkey -M $keymap -s '^[OH' '^[[H' # home
bindkey -M $keymap -s '^[OF' '^[[F' # end
# TTY sends different key codes. Translate them to xterm equivalents.
# Missing: {ctrl,alt,shift}+{up,down,left,right,home,end}, {ctrl,alt}+delete.
bindkey -M $keymap -s '^[[1~' '^[[H' # home
bindkey -M $keymap -s '^[[4~' '^[[F' # end
# Urxvt sends different key codes. Translate them to xterm equivalents.
bindkey -M $keymap -s '^[[7~' '^[[H' # home
bindkey -M $keymap -s '^[[8~' '^[[F' # end
bindkey -M $keymap -s '^[Oa' '^[[1;5A' # ctrl+up
bindkey -M $keymap -s '^[Ob' '^[[1;5B' # ctrl+down
bindkey -M $keymap -s '^[Od' '^[[1;5D' # ctrl+left
bindkey -M $keymap -s '^[Oc' '^[[1;5C' # ctrl+right
bindkey -M $keymap -s '^[[7\^' '^[[1;5H' # ctrl+home
bindkey -M $keymap -s '^[[8\^' '^[[1;5F' # ctrl+end
bindkey -M $keymap -s '^[[3\^' '^[[3;5~' # ctrl+delete
bindkey -M $keymap -s '^[^[[A' '^[[1;3A' # alt+up
bindkey -M $keymap -s '^[^[[B' '^[[1;3B' # alt+down
bindkey -M $keymap -s '^[^[[D' '^[[1;3D' # alt+left
bindkey -M $keymap -s '^[^[[C' '^[[1;3C' # alt+right
bindkey -M $keymap -s '^[^[[7~' '^[[1;3H' # alt+home
bindkey -M $keymap -s '^[^[[8~' '^[[1;3F' # alt+end
bindkey -M $keymap -s '^[^[[3~' '^[[3;3~' # alt+delete
bindkey -M $keymap -s '^[[a' '^[[1;2A' # shift+up
bindkey -M $keymap -s '^[[b' '^[[1;2B' # shift+down
bindkey -M $keymap -s '^[[d' '^[[1;2D' # shift+left
bindkey -M $keymap -s '^[[c' '^[[1;2C' # shift+right
bindkey -M $keymap -s '^[[7$' '^[[1;2H' # shift+home
bindkey -M $keymap -s '^[[8$' '^[[1;2F' # shift+end
# Tmux sends different key codes. Translate them to xterm equivalents.
bindkey -M $keymap -s '^[[1~' '^[[H' # home
bindkey -M $keymap -s '^[[4~' '^[[F' # end
bindkey -M $keymap -s '^[^[[A' '^[[1;3A' # alt+up
bindkey -M $keymap -s '^[^[[B' '^[[1;3B' # alt+down
bindkey -M $keymap -s '^[^[[D' '^[[1;3D' # alt+left
bindkey -M $keymap -s '^[^[[C' '^[[1;3C' # alt+right
bindkey -M $keymap -s '^[^[[1~' '^[[1;3H' # alt+home
bindkey -M $keymap -s '^[^[[4~' '^[[1;3F' # alt+end
bindkey -M $keymap -s '^[^[[3~' '^[[3;3~' # alt+delete
# iTerm2 sends different key codes. Translate them to xterm equivalents.
# Missing (depending on settings): ctrl+{up,down,left,right}, {ctrl,alt}+{delete,backspace}.
bindkey -M $keymap -s '^[^[[A' '^[[1;3A' # alt+up
bindkey -M $keymap -s '^[^[[B' '^[[1;3B' # alt+down
bindkey -M $keymap -s '^[^[[D' '^[[1;3D' # alt+left
bindkey -M $keymap -s '^[^[[C' '^[[1;3C' # alt+right
bindkey -M $keymap -s '^[[1;9A' '^[[1;3A' # alt+up
bindkey -M $keymap -s '^[[1;9B' '^[[1;3B' # alt+down
bindkey -M $keymap -s '^[[1;9D' '^[[1;3D' # alt+left
bindkey -M $keymap -s '^[[1;9C' '^[[1;3C' # alt+right
bindkey -M $keymap -s '^[[1;9H' '^[[1;3H' # alt+home
bindkey -M $keymap -s '^[[1;9F' '^[[1;3F' # alt+end
# TODO: Add missing translations.
done
# Move cursor one char backward.
bindkey '^[[D' backward-char # left
# Move cursor one char forward.
bindkey '^[[C' forward-char # right
if (( _z4h_use[zsh-history-substring-search] )); then
# Move cursor one line up or fetch the previous command from LOCAL history.
bindkey '^P' z4h-up-substring-local # ctrl+p
bindkey '^[[A' z4h-up-substring-local # up
# Move cursor one line down or fetch the next command from LOCAL history.
bindkey '^N' z4h-down-substring-local # ctrl+n
bindkey '^[[B' z4h-down-substring-local # down
else
# Move cursor one line up or fetch the previous command from LOCAL history.
bindkey '^P' z4h-up-prefix-local # ctrl+p
bindkey '^[[A' z4h-up-prefix-local # up
# Move cursor one line down or fetch the next command from LOCAL history.
bindkey '^N' z4h-down-prefix-local # ctrl+n
bindkey '^[[B' z4h-down-prefix-local # down
fi
# Move cursor one line up or fetch the previous command from GLOBAL history.
bindkey '^[[1;5A' z4h-up-prefix-global # ctrl+up
# Move cursor one line down or fetch the next command from GLOBAL history.
bindkey '^[[1;5B' z4h-down-prefix-global # ctrl+down
# Move cursor to the beginning of line.
bindkey '^[[H' beginning-of-line # home
# Move cursor to the end of line.
bindkey '^[[F' end-of-line # end
# Move cursor to the beginning of buffer.
bindkey '^[[1;5H' z4h-beginning-of-buffer # ctrl+home
bindkey '^[[1;3H' z4h-beginning-of-buffer # alt+home
# Move cursor to the end of buffer.
bindkey '^[[1;5F' z4h-end-of-buffer # ctrl+end
bindkey '^[[1;3F' z4h-end-of-buffer # alt+end
# Delete the character under the cursor.
bindkey '^D' delete-char # ctrl+d
bindkey '^[[3~' delete-char # delete
# Delete next word.
bindkey '^[d' z4h-kill-word # alt+d
bindkey '^[D' z4h-kill-word # alt+D
bindkey '^[[3;5~' z4h-kill-word # ctrl+del
bindkey '^[[3;3~' z4h-kill-word # alt+del
# Delete previous word.
bindkey '^W' z4h-backward-kill-word # ctrl+w
bindkey '^[^?' z4h-backward-kill-word # alt+bs
bindkey '^[^H' z4h-backward-kill-word # ctrl+alt+bs
# Move cursor one zsh word forward.
bindkey '^[[1;6C' z4h-forward-zword # ctrl+shift+right
# Move cursor one zsh word backward.
bindkey '^[[1;6D' z4h-backward-zword # ctrl+shift+left
# Delete next zsh word.
bindkey '^[[3;6~' z4h-kill-zword # ctrl+shift+del
# Delete line before cursor.
bindkey '^[k' backward-kill-line # alt+k
bindkey '^[K' backward-kill-line # alt+K
# Delete all lines.
bindkey '^[j' kill-buffer # alt+j
bindkey '^[J' kill-buffer # alt+J
# Push buffer to ephemeral history (won't be saved to HISTFILE) and delete all lines.
bindkey '^[o' z4h-stash-buffer # alt+o
bindkey '^[O' z4h-stash-buffer # alt+O
# Accept autosuggestion.
bindkey '^[m' z4h-autosuggest-accept # alt+m
bindkey '^[M' z4h-autosuggest-accept # alt+M
# Undo and redo.
bindkey '^[[Z' undo # shift+tab
bindkey '^[/' redo # alt+/
# Expand alias/glob/parameter.
bindkey '^ ' z4h-expand # ctrl+space
# Generic command completion.
bindkey '^I' z4h-fzf-complete # tab
if (( _z4h_use[fzf] )); then
# Command history.
bindkey '^R' z4h-fzf-history # ctrl+r
fi
# Show help for the command at cursor.
bindkey '^[h' run-help # alt+h
bindkey '^[H' run-help # alt+H
# Do nothing (better than printing '~').
bindkey '^[[5~' z4h-do-nothing # pageup
bindkey '^[[6~' z4h-do-nothing # pagedown
# Move cursor one word backward.
bindkey '^[b' z4h-backward-word # alt+b
bindkey '^[B' z4h-backward-word # alt+B
bindkey '^[[1;3D' z4h-backward-word # alt+left
bindkey '^[[1;5D' z4h-backward-word # ctrl+left
# Move cursor one word forward.
bindkey '^[f' z4h-forward-word # alt+f
bindkey '^[F' z4h-forward-word # alt+F
bindkey '^[[1;3C' z4h-forward-word # alt+right
bindkey '^[[1;5C' z4h-forward-word # ctrl+right
# cd into the previous directory.
bindkey '^[[1;2D' z4h-cd-back # shift+left
# cd into the next directory.
bindkey '^[[1;2C' z4h-cd-forward # shift+right
# cd into the parent directory.
bindkey '^[[1;2A' z4h-cd-up # shift+up
if (( _z4h_use[fzf] )); then
# cd into a subdirectory (interactive).
bindkey '^[[1;2B' z4h-cd-down # shift+down
fi
# Directory history.
bindkey '^[r' z4h-fzf-dir-history # alt+r
bindkey '^[R' z4h-fzf-dir-history # alt+R
if (( _z4h_can_save_restore_screen )) &&
zstyle -T :z4h: prompt-at-bottom; then
bindkey '^L' z4h-clear-screen-soft-bottom # ctrl+l
bindkey '^[^L' z4h-clear-screen-hard-bottom # ctrl+alt+l
else
bindkey '^L' z4h-clear-screen-soft-top # ctrl+l
bindkey '^[^L' z4h-clear-screen-hard-top # ctrl+alt+l
fi
if zstyle -T :z4h:bindkey macos-option-as-alt; then
typeset -grA _z4h_macos_opt_key=(
q 'œ'
w '∑'
r '®'
t '†'
o 'ø'
p 'π'
[ '“'
] ''
a 'å'
s 'ß'
d '∂'
f 'ƒ'
g '©'
h '˙'
j '∆'
k '˚'
l '¬'
z 'Ω'
x '≈'
c 'ç'
v '√'
b '∫'
m 'µ'
, '≤'
. '≥'
/ '÷'
\\ '«'
# Option+y is just '\'.
# Dead key functionality: e, u, i, n.
Q 'Œ'
W '„'
E '´'
R '‰'
T 'ˇ'
Y 'Á'
U '¨'
I 'ˆ'
O 'Ø'
P '∏'
A 'Å'
S 'Í'
D 'Î'
F 'Ï'
G '˝'
H 'Ó'
J 'Ô'
K '\357\243\277'
L 'Ò'
Z '¸'
X '˛'
C 'Ç'
V '◊'
B 'ı'
N '˜'
M 'Â'
)
bindkey '∂' z4h-kill-word # opt+d
bindkey 'Î' z4h-kill-word # opt+D
bindkey '˚' backward-kill-line # opt+k
bindkey '\357\243\277' backward-kill-line # opt+K (U+F8FF)
bindkey '∆' kill-buffer # opt+j
bindkey 'Ô' kill-buffer # opt+J
bindkey 'ø' z4h-stash-buffer # opt+o
bindkey 'Ø' z4h-stash-buffer # opt+O
bindkey 'µ' z4h-autosuggest-accept # opt+m
bindkey 'Â' z4h-autosuggest-accept # opt+M
bindkey '÷' redo # opt+/
bindkey '˙' run-help # opt+h
bindkey 'Ó' run-help # opt+H
bindkey '∫' z4h-backward-word # opt+b
bindkey 'ı' z4h-backward-word # opt+B
bindkey '®' z4h-fzf-dir-history # opt+r
bindkey '‰' z4h-fzf-dir-history # opt+R
else
typeset -grA _z4h_macos_opt_key=()
fi
if zstyle -t :z4h:bindkey keyboard mac; then
local del=Fn+Delete
else
local del=Delete
fi
typeset -gA _z4h_key=(
Tab '^I'
Space ' '
Enter '^M'
Escape '^['
Ctrl+/ '^_'
Ctrl+_ '^_'
Ctrl+Space '^ '
Alt+Space '^[ '
Shift+Tab '^[[Z'
Up '^[[A'
Down '^[[B'
Right '^[[C'
Left '^[[D'
Home '^[[H'
End '^[[F'
Insert '^[[2~'
$del '^[[3~'
PageUp '^[[5~'
PageDown '^[[6~'
Backspace '^?'
Shift+Up '^[[1;2A'
Shift+Down '^[[1;2B'
Shift+Right '^[[1;2C'
Shift+Left '^[[1;2D'
Shift+Home '^[[1;2H'
Shift+End '^[[1;2F'
Shift+Insert '^[[2;2~'
Shift+$del '^[[3;2~'
Shift+PageUp '^[[5;2~'
Shift+PageDown '^[[6;2~'
Shift+Backspace '^?'
Alt+Up '^[[1;3A'
Alt+Down '^[[1;3B'
Alt+Right '^[[1;3C'
Alt+Left '^[[1;3D'
Alt+Home '^[[1;3H'
Alt+End '^[[1;3F'
Alt+Insert '^[[2;3~'
Alt+$del '^[[3;3~'
Alt+PageUp '^[[5;3~'
Alt+PageDown '^[[6;3~'
Alt+Backspace '^[^?'
Alt+Shift+Up '^[[1;4A'
Alt+Shift+Down '^[[1;4B'
Alt+Shift+Right '^[[1;4C'
Alt+Shift+Left '^[[1;4D'
Alt+Shift+Home '^[[1;4H'
Alt+Shift+End '^[[1;4F'
Alt+Shift+Insert '^[[2;4~'
Alt+Shift+$del '^[[3;4~'
Alt+Shift+PageUp '^[[5;4~'
Alt+Shift+PageDown '^[[6;4~'
Alt+Shift+Backspace '^[^H'
Ctrl+Up '^[[1;5A'
Ctrl+Down '^[[1;5B'
Ctrl+Right '^[[1;5C'
Ctrl+Left '^[[1;5D'
Ctrl+Home '^[[1;5H'
Ctrl+End '^[[1;5F'
Ctrl+Insert '^[[2;5~'
Ctrl+$del '^[[3;5~'
Ctrl+PageUp '^[[5;5~'
Ctrl+PageDown '^[[6;5~'
Ctrl+Backspace '^H'
Ctrl+Shift+Up '^[[1;6A'
Ctrl+Shift+Down '^[[1;6B'
Ctrl+Shift+Right '^[[1;6C'
Ctrl+Shift+Left '^[[1;6D'
Ctrl+Shift+Home '^[[1;6H'
Ctrl+Shift+End '^[[1;6F'
Ctrl+Shift+Insert '^[[2;6~'
Ctrl+Shift+$del '^[[3;6~'
Ctrl+Shift+PageUp '^[[5;6~'
Ctrl+Shift+PageDown '^[[6;6~'
Ctrl+Shift+Backspace '^?'
Ctrl+Alt+Up '^[[1;7A'
Ctrl+Alt+Down '^[[1;7B'
Ctrl+Alt+Right '^[[1;7C'
Ctrl+Alt+Left '^[[1;7D'
Ctrl+Alt+Home '^[[1;7H'
Ctrl+Alt+End '^[[1;7F'
Ctrl+Alt+Insert '^[[2;7~'
Ctrl+Alt+$del '^[[3;7~'
Ctrl+Alt+PageUp '^[[5;7~'
Ctrl+Alt+PageDown '^[[6;7~'
Ctrl+Alt+Backspace '^[^H'
Ctrl+Alt+Shift+Up '^[[1;8A'
Ctrl+Alt+Shift+Down '^[[1;8B'
Ctrl+Alt+Shift+Right '^[[1;8C'
Ctrl+Alt+Shift+Left '^[[1;8D'
Ctrl+Alt+Shift+Home '^[[1;8H'
Ctrl+Alt+Shift+End '^[[1;8F'
Ctrl+Alt+Shift+Insert '^[[2;8~'
Ctrl+Alt+Shift+$del '^[[3;8~'
Ctrl+Alt+Shift+PageUp '^[[5;8~'
Ctrl+Alt+Shift+PageDown '^[[6;8~'
Ctrl+Alt+Shift+Backspace '^?'
# Duplicate all Alt bindings with s/Alt/Option/.
Option+Space '^[ '
Option+Up '^[[1;3A'
Option+Down '^[[1;3B'
Option+Right '^[[1;3C'
Option+Left '^[[1;3D'
Option+Home '^[[1;3H'
Option+End '^[[1;3F'
Option+Insert '^[[2;3~'
Option+$del '^[[3;3~'
Option+PageUp '^[[5;3~'
Option+PageDown '^[[6;3~'
Option+Backspace '^[^?'
Option+Shift+Up '^[[1;4A'
Option+Shift+Down '^[[1;4B'
Option+Shift+Right '^[[1;4C'
Option+Shift+Left '^[[1;4D'
Option+Shift+Home '^[[1;4H'
Option+Shift+End '^[[1;4F'
Option+Shift+Insert '^[[2;4~'
Option+Shift+$del '^[[3;4~'
Option+Shift+PageUp '^[[5;4~'
Option+Shift+PageDown '^[[6;4~'
Option+Shift+Backspace '^[^H'
Ctrl+Option+Up '^[[1;7A'
Ctrl+Option+Down '^[[1;7B'
Ctrl+Option+Right '^[[1;7C'
Ctrl+Option+Left '^[[1;7D'
Ctrl+Option+Home '^[[1;7H'
Ctrl+Option+End '^[[1;7F'
Ctrl+Option+Insert '^[[2;7~'
Ctrl+Option+$del '^[[3;7~'
Ctrl+Option+PageUp '^[[5;7~'
Ctrl+Option+PageDown '^[[6;7~'
Ctrl+Option+Backspace '^[^H'
Ctrl+Option+Shift+Up '^[[1;8A'
Ctrl+Option+Shift+Down '^[[1;8B'
Ctrl+Option+Shift+Right '^[[1;8C'
Ctrl+Option+Shift+Left '^[[1;8D'
Ctrl+Option+Shift+Home '^[[1;8H'
Ctrl+Option+Shift+End '^[[1;8F'
Ctrl+Option+Shift+Insert '^[[2;8~'
Ctrl+Option+Shift+$del '^[[3;8~'
Ctrl+Option+Shift+PageUp '^[[5;8~'
Ctrl+Option+Shift+PageDown '^[[6;8~'
Ctrl+Option+Shift+Backspace '^?'
)
if zstyle -t :z4h:bindkey keyboard mac; then
# Duplicate all Backspace bindings with s/Backspace/Delete/.
_z4h_key+=(
Delete '^?'
Shift+Delete '^?'
Alt+Delete '^[^?'
Alt+Shift+Delete '^[^H'
Ctrl+Delete '^H'
Ctrl+Shift+Delete '^?'
Ctrl+Alt+Delete '^[^H'
Ctrl+Alt+Shift+Delete '^?'
Option+Delete '^[^?'
Option+Shift+Delete '^[^H'
Ctrl+Option+Delete '^[^H'
Ctrl+Option+Shift+Delete '^?'
)
fi
typeset -grA _z4h_key
# Configure completions.
zstyle ':completion:*' matcher-list "m:{a-z}={A-Z}"
zstyle ':completion:*' menu "false"
zstyle ':completion:*' verbose "true"
zstyle ':completion:::::' insert-tab "pending"
zstyle ':completion:*:-subscript-:*' tag-order "indexes parameters"
zstyle ':completion:*:-tilde-:*' tag-order "directory-stack" "named-directories" "users"
zstyle ':completion:*' squeeze-slashes "true"
zstyle ':completion:*:rm:*' ignore-line "other"
zstyle ':completion:*:kill:*' ignore-line "other"
zstyle ':completion:*:diff:*' ignore-line "other"
zstyle ':completion:*:rm:*' file-patterns "*:all-files"
zstyle ':completion:*:paths' accept-exact-dirs "true"
zstyle ':completion:*' single-ignored "show"
zstyle ':completion:*:functions' ignored-patterns "-*|_*"
zstyle ':completion:*:parameters' ignored-patterns \
"_(z4h|p9k|_p9k|POWERLEVEL9K|gitstatus|GITSTATUS|zsh_highlight|zsh_autosuggest|ZSH_HIGHLIGHT|ZSH_AUTOSUGGEST)*"
if (( ! _z4h_dangerous_root )); then
zstyle ':completion:*' use-cache "true"
zstyle ':completion:*' cache-path "$Z4H/cache/zcompcache-$ZSH_VERSION"
fi
zstyle ':completion:*:ssh:argument-1:*' sort 'true'
zstyle ':completion:*:scp:argument-rest:*' sort 'true'
zstyle ':completion:*:git-*:argument-rest:heads' ignored-patterns '(FETCH_|ORIG_|*/|)HEAD'
zstyle ':completion:*:git-*:argument-rest:heads-local' ignored-patterns '(FETCH_|ORIG_|)HEAD'
zstyle ':completion:*:git-*:argument-rest:heads-remote' ignored-patterns '*/HEAD'
zstyle ':completion:*:git-*:argument-rest:commits' ignored-patterns '*'
zstyle ':completion:*:git-*:argument-rest:commit-objects' ignored-patterns '*'
zstyle ':completion:*:git-*:argument-rest:recent-branches' ignored-patterns '*'
# Make it possible to use completion specifications and functions written for bash.
autoload -Uz bashcompinit
bashcompinit
if (( _z4h_use[powerlevel10k] )); then
# Initialize prompt. Type `p10k configure` or edit $POWERLEVEL9K_CONFIG_FILE to customize it.
() {
local XDG_CACHE_HOME=$Z4H/cache/powerlevel10k
builtin source $Z4H/powerlevel10k/powerlevel10k.zsh-theme
}
z4h source -c $POWERLEVEL9K_CONFIG_FILE
fi
if [[ -v _z4h_iterm_cmd ]]; then
-z4h-iterm2-dump
-z4h-tmux-bypass '\e]1337;ShellIntegrationVersion=12;shell=zsh\a'
fi
-z4h-set-term-title-precmd || return
if (( _z4h_use[zsh-autosuggestions] )); then
if (( terminfo[colors] >= 256 )); then
LS_COLORS+=':no=38;5;248'
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=244' # the default is hard to see
else
LS_COLORS+=':no=1;30'
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=black,bold' # the default is outside of 8-color range
fi
ZSH_AUTOSUGGEST_MANUAL_REBIND=1
# Tell zsh-autosuggestions how to handle different widgets.
typeset -g ZSH_AUTOSUGGEST_EXECUTE_WIDGETS=()
typeset -g ZSH_AUTOSUGGEST_CLEAR_WIDGETS=(
z4h-fzf-history
z4h-down-prefix-global
z4h-down-prefix-local
z4h-up-prefix-global
z4h-up-prefix-local
)
if (( _z4h_use[zsh-history-substring-search] )); then
ZSH_AUTOSUGGEST_CLEAR_WIDGETS+=(
z4h-down-substring-global
z4h-down-substring-local
z4h-up-substring-global
z4h-up-substring-local
)
fi
typeset -g ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS=(
emacs-forward-word
forward-word
vi-find-next-char
vi-find-next-char-skip
vi-forward-blank-word
vi-forward-blank-word-end
vi-forward-word
vi-forward-word-end
z4h-forward-word
z4h-forward-zword
)
typeset -g ZSH_AUTOSUGGEST_ACCEPT_WIDGETS=(
z4h-end-of-buffer
)
if zstyle -T :z4h:autosuggestions forward-char accept; then
ZSH_AUTOSUGGEST_ACCEPT_WIDGETS+=(forward-char vi-forward-char)
else
ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS+=(forward-char vi-forward-char)
fi
if zstyle -T :z4h:autosuggestions end-of-line accept; then
ZSH_AUTOSUGGEST_ACCEPT_WIDGETS+=(end-of-line vi-add-eol vi-end-of-line)
else
ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS+=(end-of-line vi-add-eol vi-end-of-line)
fi
builtin source $Z4H/zsh-autosuggestions/zsh-autosuggestions.zsh
precmd_functions=(${precmd_functions:#_zsh_autosuggest_start})
_zsh_autosuggest_widget_execute() {
-z4h-autosuggest-fetch
if [[ -n $POSTDISPLAY ]]; then
BUFFER=$BUFFER$POSTDISPLAY
region_highlight[-1]=()
typeset -g _z4h_autosuggest_buffer=$BUFFER
unset _z4h_autosuggestion POSTDISPLAY
fi
zle .accept-line
}
_zsh_autosuggest_widget_clear() {
_zsh_autosuggest_invoke_original_widget "$@"
local -i ret=$?
if [[ $CONTEXT == start ]]; then
[[ -z $POSTDISPLAY ]] || region_highlight[-1]=()
if (( ret )); then
-z4h-autosuggest-fetch
else
typeset -g _z4h_autosuggest_buffer=$BUFFER
unset _z4h_autosuggestion POSTDISPLAY
fi
fi
return ret
}
_zsh_autosuggest_widget_accept() {
-z4h-autosuggest-fetch
if (( ${#POSTDISPLAY} == 0 || CURSOR < _z4h_cursor_max() )); then
_zsh_autosuggest_invoke_original_widget "$@"
return
fi
BUFFER="$BUFFER$POSTDISPLAY"
region_highlight[-1]=()
unset _z4h_autosuggestion POSTDISPLAY
_zsh_autosuggest_invoke_original_widget "$@"
local -i ret=$?
typeset -g _z4h_autosuggest_buffer="$BUFFER"
typeset -gi CURSOR='_z4h_cursor_max()'
return ret
}
_zsh_autosuggest_widget_partial_accept() {
-z4h-autosuggest-fetch
if (( ${#POSTDISPLAY} == 0 || CURSOR < _z4h_cursor_max() )); then
_zsh_autosuggest_invoke_original_widget "$@"
return
fi
local -i buf_len=${#BUFFER}
BUFFER="$BUFFER$POSTDISPLAY"
_zsh_autosuggest_invoke_original_widget "$@"
local -i ret=$?
local -i cursor=CURSOR
if [[ $KEYMAP == vicmd && -n ${BUFFER##*$'\n'} ]]; then
(( ++cursor ))
fi
if (( cursor > buf_len )); then
BUFFER=${BUFFER:0:$cursor}
POSTDISPLAY=${POSTDISPLAY:$((cursor - buf_len))}
else
BUFFER=${BUFFER:0:$buf_len}
fi
typeset -g _z4h_autosuggest_buffer=$BUFFER
return ret
}
_zsh_autosuggest_widget_modify() {
_zsh_autosuggest_invoke_original_widget "$@"
local -i retval=$?
[[ -z $POSTDISPLAY ]] || region_highlight[-1]=()
-z4h-autosuggest-fetch
return retval
}
_zsh_autosuggest_widget_fetch() {
[[ -z $POSTDISPLAY ]] || region_highlight[-1]=()
-z4h-autosuggest-fetch
}
_zsh_autosuggest_widget_suggest() {
[[ -z $BUFFER || $CONTEXT != start ]] && return
[[ -z $POSTDISPLAY ]] || region_highlight[-1]=()
POSTDISPLAY=${1-}
typeset -g _z4h_autosuggest_buffer="$BUFFER"
typeset -g _z4h_autosuggestion="${BUFFER}${POSTDISPLAY}"
if [[ -n $POSTDISPLAY ]]; then
region_highlight+=(
"${#BUFFER} $((${#BUFFER} + ${#POSTDISPLAY})) $ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE")
fi
}
_zsh_autosuggest_widget_enable() {
(( ${+_ZSH_AUTOSUGGEST_DISABLED} )) || return 0
unset _ZSH_AUTOSUGGEST_DISABLED
_zsh_autosuggest_widget_fetch
}
_zsh_autosuggest_widget_disable() {
(( ${+_ZSH_AUTOSUGGEST_DISABLED} )) && return
typeset -g _ZSH_AUTOSUGGEST_DISABLED
[[ -z $POSTDISPLAY ]] || region_highlight[-1]=()
unset POSTDISPLAY _z4h_autosuggest_buffer _z4h_autosuggestion
}
_zsh_autosuggest_widget_toggle() {
if (( ${+_ZSH_AUTOSUGGEST_DISABLED} )); then
_zsh_autosuggest_widget_enable
else
_zsh_autosuggest_widget_disable
fi
}
else
function -z4h-autosuggest-fetch() {
unset POSTDISPLAY _z4h_autosuggest_buffer _z4h_autosuggestion
}
fi
# Define _zsh_highlight before sourcing history-substring-search to work around bugs
# in the latter: https://github.com/romkatv/zsh4humans/issues/58.
function _zsh_highlight() {
if [[ $WIDGET == zle-line-finish || ! -v _z4h_substring_search_highlight ]]; then
region_highlight=()
else
region_highlight=("${_z4h_substring_search_highlight[@]}")
fi
}
if (( _z4h_use[zsh-history-substring-search] )); then
builtin source $Z4H/zsh-history-substring-search/zsh-history-substring-search.zsh
fi
if (( _z4h_use[zsh-syntax-highlighting] )); then
if (( terminfo[colors] >= 256 )); then
typeset -gA ZSH_HIGHLIGHT_STYLES=(comment fg=96) # the default is hard to see
fi
ZSH_HIGHLIGHT_MAXLENGTH=1024 # don't colorize long command lines (slow)
ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets) # main syntax highlighting plus matching brackets
typeset -gi zsh_highlight__memo_feature=0
fi
local event
for event in pre-redraw init finish; do
if (( $+widgets[zle-line-$event] )); then
zle -A -- zle-line-$event -z4h-orig-zle-line-$event
fi
zle -N -- zle-line-$event -z4h-zle-line-$event
done
function -z4h-post-init() {
eval "$_z4h_opt"
precmd_functions=(${precmd_functions:#-z4h-post-init})
if zstyle -t :z4h:direnv enable; then
if [[ -v functions[_direnv_hook] ]]; then
unfunction _direnv_hook
chpwd_functions=(${chpwd_functions:#_direnv_hook})
precmd_functions=(${precmd_functions:#_direnv_hook})
fi
[[ -v _z4h_direnv_initialized ]] || -z4h-direnv-init 1
fi
if [[ -v _z4h_direnv_initialized ]]; then
precmd_functions=(-z4h-direnv-hook $precmd_functions)
chpwd_functions=(-z4h-direnv-hook $chpwd_functions)
unset _z4h_direnv_initialized
fi
typeset -gi _z4h_compinit_fd
if [[ -v __p9k_fd_0 ]] && zselect -t0 -r $__p9k_fd_0 &&
sysopen -o cloexec -ru _z4h_compinit_fd /dev/null; then
zle -F $_z4h_compinit_fd -z4h-compinit
else
unset _z4h_compinit_fd
-z4h-compinit
-z4h-update-dir-history
fi
if (( _z4h_use[zsh-syntax-highlighting] )); then
() {
local -hA widgets=(
zle-line-finish user:_zsh_highlight_widget_zle-line-finish
zle-isearch-update user:_zsh_highlight_widget_zle-isearch-update
)
builtin source $Z4H/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
}
preexec_functions=(${preexec_functions:#_zsh_highlight_preexec_hook})
eval '_zsh_highlight() {
[[ ${WIDGET-} == zle-line-pre-redraw && ${LASTWIDGET-} == accept-line ]] && return
{
if [[ ${#BUFFER} -gt ${ZSH_HIGHLIGHT_MAXLENGTH:-${#BUFFER}} ]]; then
region_highlight=()
else
local -ih PENDING=0 KEYS_QUEUED_COUNT=0
'$functions[_zsh_highlight]'
fi
} always {
[[ $WIDGET == zle-line-finish ]] || region_highlight+=("${_z4h_substring_search_highlight[@]}")
}
}'
fi
if (( _z4h_use[zsh-history-substring-search] )); then
function _history-substring-search-end() {
builtin eval "$_z4h_opt"
if (( _history_substring_search_refresh_display )); then
typeset -gi CURSOR='_z4h_cursor_max()'
fi
typeset -g _history_substring_search_result=$BUFFER
typeset -gi _history_substring_search_cursor=CURSOR
unset _z4h_substring_search_highlight
[[ -z $_history_substring_search_query_highlight ]] && return
local query_part escaped_query_part REPLY
local -i highlight_start_index highlight_end_index query_part_match_index
for query_part in $_history_substring_search_query_parts; do
escaped_query_part=${query_part//(#m)[\][()|\\*?#<>~^]/\\$MATCH}
query_part_match_index=${${BUFFER:$highlight_start_index}[(i)(#$HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS)${escaped_query_part}]}
(( query_part_match_index > $#BUFFER - highlight_start_index )) && continue
highlight_start_index=$(( highlight_start_index + query_part_match_index ))
highlight_end_index=$(( highlight_start_index + ${#query_part} ))
_z4h_substring_search_highlight+=(
"$((highlight_start_index - 1)) $((highlight_end_index - 1)) $_history_substring_search_query_highlight")
done
}
# This function is buggy in the original implementation when vicmd is active.
_history-substring-search-up-buffer() {
builtin eval "$_z4h_opt"
# The original implementation is equivalent to this one with the exception
# of the condition on the next line being (( CURSOR != $#BUFFER )).
(( CURSOR != _z4h_cursor_max() )) || return
[[ $LBUFFER == *$'\n'* ]] || return
builtin zle up-line-or-history || true
}
# See _history-substring-search-up-buffer above.
_history-substring-search-down-buffer() {
builtin eval "$_z4h_opt"
(( CURSOR != _z4h_cursor_max() )) || return
[[ $RBUFFER == *$'\n'* ]] || return
builtin zle down-line-or-history || true
}
elif (( $+functions[_history-substring-search-end] )); then
# Turn off highlighting in _history-substring-search-end. It doesn't work anyway.
function _history-substring-search-end() {
emulate -L zsh
_history_substring_search_result=$BUFFER
if (( _history_substring_search_refresh_display )); then
typeset -gi CURSOR='_z4h_cursor_max()'
fi
}
fi
if (( _z4h_use[zsh-autosuggestions] )); then
local suggest_special=(
$ZSH_AUTOSUGGEST_EXECUTE_WIDGETS
$ZSH_AUTOSUGGEST_CLEAR_WIDGETS
$ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS
$ZSH_AUTOSUGGEST_ACCEPT_WIDGETS)
typeset -g ZSH_AUTOSUGGEST_IGNORE_WIDGETS=(${${(k)widgets}:|suggest_special})
unset ZSH_AUTOSUGGEST_USE_ASYNC
_zsh_autosuggest_start
fi
if [[ -v functions[bracketed-paste-magic] ]]; then
builtin unfunction bracketed-paste-magic
builtin autoload -Uz -- $Z4H/zsh4humans/fn/bracketed-paste-magic
fi
if (( ! $+_z4h_iterm_cmd )) && [[ $ITERM_SHELL_INTEGRATION_INSTALLED == Yes ]]; then
-z4h-error-iterm2-integration
fi
if [[ -v _z4h_tty_fd ]]; then
if [[ -v function[__vte_osc7] ]]; then
builtin functions -c -- -z4h-vte-osc7 __vte_osc7
fi
if { zstyle -t :z4h: term-shell-integration || zstyle -t :z4h: iterm2-integration } &&
[[ $TERM != (dumb|linux) ]]; then
builtin functions -c -- -z4h-vte-osc7 __vte_osc7
if (( ! $precmd_functions[(I)__vte_osc7] )); then
precmd_functions=(__vte_osc7 $precmd_functions)
__vte_osc7
fi
if [[ -v z4h_win_env && -z ${SSH_CONNECTION-} && ${P9K_SSH-} != 1 ]]; then
chpwd_functions+=(-z4h-osc9)
-z4h-osc9
fi
fi
fi
precmd_functions=(-z4h-wrap-commands $precmd_functions)
# Send WINCH just in case we've set incorrect TTY dimensions manually.
builtin kill -WINCH $$
}
precmd_functions=(-z4h-post-init $precmd_functions)
[[ -e $Z4H/welcome ]] && precmd_functions+=(-z4h-welcome)
typeset -g iterm2_hostname=${HOST:-${(%):-%m}}
typeset -ga _z4h_dir_history
function compdef() {
eval "$_z4h_opt"
_z4h_compdef+=("${(pj:\0:)@}")
}
compdef _ssh ssh
compdef _sudo sudo
typeset -g VIRTUAL_ENV_DISABLE_PROMPT=1
PS2=
RPS2='%F{3}%^%f'