mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-03-20 03:13:33 +01:00
Enable to use vim commands ( y/p/d/c/s ) to interact with the X window system clipboard, thus with other applications.
107 lines
2.4 KiB
Bash
107 lines
2.4 KiB
Bash
# Ensures that $terminfo values are valid and updates editor information when
|
|
# the keymap changes.
|
|
function zle-keymap-select zle-line-init zle-line-finish {
|
|
# The terminal must be in application mode when ZLE is active for $terminfo
|
|
# values to be valid.
|
|
if (( ${+terminfo[smkx]} )); then
|
|
printf '%s' ${terminfo[smkx]}
|
|
fi
|
|
if (( ${+terminfo[rmkx]} )); then
|
|
printf '%s' ${terminfo[rmkx]}
|
|
fi
|
|
|
|
zle reset-prompt
|
|
zle -R
|
|
}
|
|
|
|
# Ensure that the prompt is redrawn when the terminal size changes.
|
|
TRAPWINCH() {
|
|
if [[ -o zle ]]; then
|
|
zle reset-prompt
|
|
zle -R
|
|
fi
|
|
}
|
|
|
|
zle -N zle-line-init
|
|
zle -N zle-line-finish
|
|
zle -N zle-keymap-select
|
|
zle -N edit-command-line
|
|
|
|
|
|
bindkey -v
|
|
|
|
# allow v to edit the command line (standard behaviour)
|
|
autoload -Uz edit-command-line
|
|
bindkey -M vicmd 'v' edit-command-line
|
|
|
|
# allow ctrl-p, ctrl-n, ctrl-r for navigate history (standard behaviour)
|
|
bindkey '^P' up-history
|
|
bindkey '^N' down-history
|
|
bindkey '^r' history-incremental-search-backward
|
|
|
|
# allow ctrl-h, ctrl-w, ctrl-? for char and word deletion (standard behaviour)
|
|
bindkey '^?' backward-delete-char
|
|
bindkey '^h' backward-delete-char
|
|
bindkey '^w' backward-kill-word
|
|
|
|
# Some extra vim like bindings
|
|
bindkey -a 'gg' beginning-of-buffer-or-history
|
|
bindkey -a 'G' end-of-buffer-or-history
|
|
bindkey -a 'u' undo
|
|
bindkey -a '^R' redo
|
|
|
|
# if mode indicator wasn't setup by theme, define default
|
|
if [[ "$MODE_INDICATOR" == "" ]]; then
|
|
MODE_INDICATOR="%{$fg_bold[red]%}<%{$fg[red]%}<<%{$reset_color%}"
|
|
fi
|
|
|
|
function vi_mode_prompt_info() {
|
|
echo "${${KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/}"
|
|
}
|
|
|
|
# define right prompt, if it wasn't defined by a theme
|
|
if [[ "$RPS1" == "" && "$RPROMPT" == "" ]]; then
|
|
RPS1='$(vi_mode_prompt_info)'
|
|
fi
|
|
|
|
|
|
# Allow Copy/Paste with the system clipboard
|
|
# behave as expected with vim commands ( y/p/d/c/s )
|
|
[[ -n $DISPLAY ]] && (( $+commands[xclip] )) && {
|
|
|
|
function cutbuffer() {
|
|
zle .$WIDGET
|
|
echo $CUTBUFFER | xclip -selection clipboard
|
|
}
|
|
|
|
zle_cut_widgets=(
|
|
vi-backward-delete-char
|
|
vi-change
|
|
vi-change-eol
|
|
vi-change-whole-line
|
|
vi-delete
|
|
vi-delete-char
|
|
vi-kill-eol
|
|
vi-substitute
|
|
vi-yank
|
|
vi-yank-eol
|
|
)
|
|
for widget in $zle_cut_widgets
|
|
do
|
|
zle -N $widget cutbuffer
|
|
done
|
|
|
|
function putbuffer() {
|
|
zle copy-region-as-kill "$(xclip -o)"
|
|
zle .$WIDGET
|
|
}
|
|
|
|
zle_put_widgets=(
|
|
vi-put-after
|
|
vi-put-before
|
|
)
|
|
for widget in $zle_put_widgets
|
|
do
|
|
zle -N $widget putbuffer
|
|
done
|
|
}
|