Sending escape sequences directly from zsh and bypassing tmux results in the wrong cursor shape when switching between panes which no longer reflect the current zsh vi mode. When using ZTE compatible terminals tmux supports tracking cursor shape changes on a per pane basis using a suitable `terminal-override`, this allows zsh and vim to behave as if they are not operating in tmux and everything works as expected. However, so far I've not been able to reproduce this behaviour in iTerm2.
146 lines
3.8 KiB
Bash
146 lines
3.8 KiB
Bash
# .zshrc [2] Used for setting user's interactive shell configuration and
|
|
# executing commands, will be sourced when starting as an interactive shell.
|
|
|
|
# Load plugin scripts
|
|
plugin-load() { source ~/.config/zsh/$1/$1.plugin.zsh }
|
|
plugin-load zsh-autosuggestions
|
|
plugin-load zsh-history-substring-search
|
|
plugin-load zsh-syntax-highlighting
|
|
|
|
# Disable non end-of-line autosuggest accept widgets
|
|
ZSH_AUTOSUGGEST_ACCEPT_WIDGETS=(end-of-line vi-end-of-line)
|
|
|
|
# Remove duplicates from history
|
|
setopt hist_ignore_all_dups
|
|
setopt hist_reduce_blanks
|
|
setopt hist_save_no_dups
|
|
|
|
# Enable multi-terminal history
|
|
setopt inc_append_history
|
|
|
|
# Enable comments in the prompt
|
|
setopt interactive_comments
|
|
|
|
# Disable '<Ctrl>D' to logout
|
|
setopt ignore_eof
|
|
|
|
# Disable sound
|
|
unsetopt beep
|
|
|
|
# Disable tty flow control, allows vim to use '<Ctrl>S'
|
|
unsetopt flow_control
|
|
|
|
# Initialize completions
|
|
autoload -U compinit
|
|
compinit
|
|
|
|
# Enable prompt themes
|
|
autoload -Uz promptinit
|
|
promptinit
|
|
prompt fresh
|
|
|
|
# Enable vi mode line editor keymap
|
|
bindkey -v
|
|
|
|
# Enable yank, change, and delete whole line with 'Y', 'cc', and 'dd'
|
|
bindkey -M vicmd 'Y' vi-yank-whole-line
|
|
|
|
# Enable undo with 'u' and redo with 'U'
|
|
bindkey -M vicmd 'u' undo
|
|
bindkey -M vicmd 'U' redo
|
|
|
|
# Enable toggle comment at start of line al la vim-commentary
|
|
bindkey -M vicmd 'gcc' vi-pound-insert
|
|
|
|
# TODO: vi-pipe???
|
|
|
|
# Enable accepting autosuggestions
|
|
bindkey '^O' forward-word
|
|
bindkey '^P' autosuggest-accept
|
|
|
|
# Enable substring history search with 'j' and 'k'
|
|
bindkey -M vicmd 'k' history-substring-search-up
|
|
bindkey -M vicmd 'j' history-substring-search-down
|
|
|
|
# Replace '<Esc>h' with 'K' to view help
|
|
bindkey -r '^[h'
|
|
bindkey -M vicmd 'K' run-help
|
|
|
|
# Disable Ex mode with ':'
|
|
bindkey -rM vicmd ':'
|
|
|
|
# Enable '<Shirt><Tab>' reverse order completions
|
|
bindkey '^[[Z' reverse-menu-complete
|
|
|
|
# Use editor to edit command line with '<Ctrl>V'
|
|
autoload -U edit-command-line
|
|
zle -N edit-command-line
|
|
bindkey -M vicmd '^V' edit-command-line
|
|
|
|
# Get the shells parent process name.
|
|
ppid_name() { echo $(ps -p $(ps -p $(echo $$) -o ppid=) -o comm=) }
|
|
|
|
# Enable changing cursor shape based on vi mode
|
|
if [ "$ITERM_PROFILE" != "" ]; then
|
|
# TODO: This only works outside tmux, unlike VTE compatible terminals I've
|
|
# not found a tmux terminal-override which works with iTerm2's CursorShape
|
|
# escape sequences.
|
|
# iTerm2 cursor shape escape sequences
|
|
cursor_block="\E]50;CursorShape=0\C-G"
|
|
cursor_line="\E]50;CursorShape=1\C-G"
|
|
elif [ "$(ppid_name)" != "python2" ]; then
|
|
# VTE compatible cursor shape escape sequences, excluding Guake even though
|
|
# it is VTE based it doesn't seem to handle these properly
|
|
cursor_block="\e[2 q"
|
|
cursor_line="\e[6 q"
|
|
fi
|
|
|
|
if [[ ! -z "$cursor_block" && ! -z "$cursor_line" ]]; then
|
|
# Change cursor shape when vi mode changes
|
|
function zle-keymap-select zle-line-init {
|
|
case $KEYMAP in
|
|
vicmd) print -n -- "$cursor_block" ;;
|
|
viins|main) print -n -- "$cursor_line" ;;
|
|
esac
|
|
zle reset-prompt
|
|
zle -R
|
|
}
|
|
|
|
# Change cursor shape when line editing is finished
|
|
function zle-line-finish { print -n -- "$cursor_block" }
|
|
|
|
# Register cursor shape hooks
|
|
zle -N zle-keymap-select
|
|
zle -N zle-line-init
|
|
zle -N zle-line-finish
|
|
fi
|
|
|
|
# Remove duplicates from environment variables
|
|
typeset -U PATH
|
|
typeset -U MANPATH
|
|
typeset -U INFOPATH
|
|
|
|
# Aliases
|
|
alias grep='grep --color=always'
|
|
alias cninja='cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMNADS=ON'
|
|
alias ssh='TERM=xterm-256color ssh'
|
|
|
|
case `uname` in
|
|
Linux)
|
|
[ "$TMUX" = "" ] && \
|
|
alias cls="printf '\ec'" || alias cls="clear && printf '\e[3J'"
|
|
alias ls='ls -F --color=auto'
|
|
alias debug='cgdb --args'
|
|
;;
|
|
Darwin)
|
|
alias cls="clear && printf '\e[3J'"
|
|
alias ls='ls -GFh'
|
|
alias debug='lldb --'
|
|
;;
|
|
esac
|
|
|
|
if [ "$TMUX" != "" ]; then
|
|
alias sp='tmux split-window'
|
|
alias vs='tmux split-window -h'
|
|
fi
|