955 lines
23 KiB
Bash
955 lines
23 KiB
Bash
|
#!/bin/zsh -f
|
||
|
|
||
|
bindkey -N vivis
|
||
|
|
||
|
get-x-clipboard()
|
||
|
{
|
||
|
local clippaste clipboard
|
||
|
if (( $+commands[pbpaste] )); then
|
||
|
clippaste="pbpaste"
|
||
|
elif (( $+commands[xsel] )); then
|
||
|
clippaste="xsel --clipboard --output"
|
||
|
else
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
clipboard="$( ${=clippaste} )"
|
||
|
if [[ -n $clipboard && $clipboard != $CUTBUFFER ]]; then
|
||
|
killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
|
||
|
CUTBUFFER="$clipboard"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
set-x-clipboard()
|
||
|
{
|
||
|
local clipcopy clipboard
|
||
|
if (( $+commands[pbcopy] )); then
|
||
|
clipcopy="pbcopy"
|
||
|
elif (( $+commands[xsel] )); then
|
||
|
clipcopy="xsel --clipboard --input"
|
||
|
else
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
printf -- "$@" | ${=clipcopy}
|
||
|
}
|
||
|
|
||
|
vi-set-buffer()
|
||
|
{
|
||
|
read -k keys
|
||
|
if [[ $keys == '+' ]]; then
|
||
|
_clipcopy='+'
|
||
|
else
|
||
|
zle -U $keys
|
||
|
zle .vi-set-buffer
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-set-buffer
|
||
|
|
||
|
vi-put-after()
|
||
|
{
|
||
|
local cbuf
|
||
|
if [[ $_clipcopy == '+' ]]; then
|
||
|
cbuf="$CUTBUFFER"
|
||
|
get-x-clipboard
|
||
|
zle .vi-put-after
|
||
|
unset _clipcopy
|
||
|
CUTBUFFER="$cbuf"
|
||
|
else
|
||
|
zle .vi-put-after
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-put-after
|
||
|
|
||
|
vi-put-before()
|
||
|
{
|
||
|
local cbuf
|
||
|
if [[ $_clipcopy == '+' ]]; then
|
||
|
cbuf="$CUTBUFFER"
|
||
|
get-x-clipboard
|
||
|
zle .vi-put-before
|
||
|
unset _clipcopy
|
||
|
CUTBUFFER="$cbuf"
|
||
|
else
|
||
|
zle .vi-put-before
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-put-before
|
||
|
|
||
|
# _ _ _ _
|
||
|
# __ _(_) _ __ ___ ___ __| | ___ __ _(_)___ _ _ __ _| |
|
||
|
# \ \ / / | | '_ ` _ \ / _ \ / _` |/ _ \ \ \ / / / __| | | |/ _` | |
|
||
|
# \ V /| | | | | | | | (_) | (_| | __/ \ V /| \__ \ |_| | (_| | |
|
||
|
# \_/ |_| |_| |_| |_|\___/ \__,_|\___| \_/ |_|___/\__,_|\__,_|_|
|
||
|
#
|
||
|
# create a new keymap and remap a few key's with other or new widget's
|
||
|
|
||
|
# Main Highlighting Widget for VISUAL Mode
|
||
|
vi-visual-highlight()
|
||
|
{
|
||
|
integer CURSOR_HL MARK_HL
|
||
|
|
||
|
if [[ $CURSOR -gt $MARK ]];then
|
||
|
(( CURSOR_HL = CURSOR + 1 ))
|
||
|
__regstart=$MARK
|
||
|
__regend=$CURSOR_HL
|
||
|
region_highlight=("${MARK} ${CURSOR_HL} standout")
|
||
|
elif [[ $MARK -gt $CURSOR ]];then
|
||
|
(( MARK_HL = MARK + 1 ))
|
||
|
__regstart=$CURSOR
|
||
|
__regend=$MARK_HL
|
||
|
region_highlight=("${CURSOR} ${MARK_HL} standout")
|
||
|
elif [[ $MARK -eq $CURSOR ]];then
|
||
|
__regstart=$CURSOR
|
||
|
__regend=$MARK
|
||
|
region_highlight=("${CURSOR} ${MARK} standout")
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-visual-highlight
|
||
|
|
||
|
# Start Vi Visual mode
|
||
|
vi-visual-mode()
|
||
|
{
|
||
|
zle -K vivis
|
||
|
MARK=$CURSOR
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-mode
|
||
|
|
||
|
# Exit Vi Visual mode and go to vi-cmd-mode
|
||
|
vi-visual-exit()
|
||
|
{
|
||
|
region_highlight=("0 0 standout")
|
||
|
(( CURSOR = CURSOR + 1 ))
|
||
|
MARK=0
|
||
|
__regstart=0
|
||
|
__regend=0
|
||
|
zle .vi-cmd-mode
|
||
|
}
|
||
|
zle -N vi-visual-exit
|
||
|
|
||
|
# Vi Visual Kill
|
||
|
vi-visual-kill()
|
||
|
{
|
||
|
if [[ $CURSOR -gt $MARK ]];then
|
||
|
(( CURSOR = CURSOR + 1 ))
|
||
|
elif [[ $MARK -gt $CURSOR ]];then
|
||
|
(( MARK = MARK + 1 ))
|
||
|
elif [[ $MARK -eq $CURSOR ]];then
|
||
|
zle .vi-delete-char
|
||
|
return 0
|
||
|
fi
|
||
|
zle .kill-region
|
||
|
}
|
||
|
zle -N vi-visual-kill
|
||
|
|
||
|
# Exit Vi Visual and enter Insert mode
|
||
|
vi-visual-exit-to-insert()
|
||
|
{
|
||
|
region_highlight=("0 0 standout")
|
||
|
MARK=0
|
||
|
__regstart=0
|
||
|
__regend=0
|
||
|
zle .vi-insert
|
||
|
}
|
||
|
zle -N vi-visual-exit-to-insert
|
||
|
|
||
|
# Exit VISUAL mode and enter VLines Mode keeping the region
|
||
|
vi-visual-exit-to-vlines()
|
||
|
{
|
||
|
zle -K vivli
|
||
|
__savepos=$CURSOR
|
||
|
zle .vi-beginning-of-line -N
|
||
|
__start2=$CURSOR
|
||
|
zle .end-of-line -N
|
||
|
__end2=$CURSOR
|
||
|
CURSOR=$MARK
|
||
|
zle .vi-beginning-of-line -N
|
||
|
__start1=$CURSOR
|
||
|
zle .end-of-line -N
|
||
|
__end1=$CURSOR
|
||
|
zle vi-vlines-highlight
|
||
|
}
|
||
|
zle -N vi-visual-exit-to-vlines
|
||
|
|
||
|
# Exit Vi Visual and open line above
|
||
|
vi-visual-open-above()
|
||
|
{
|
||
|
region_highlight=("0 0 standout")
|
||
|
MARK=0
|
||
|
zle .vi-open-line-above
|
||
|
}
|
||
|
zle -N vi-visual-open-above
|
||
|
|
||
|
# Vi Visual move to matched bracket
|
||
|
vi-visual-match-bracket()
|
||
|
{
|
||
|
zle .vi-match-bracket
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-match-bracket
|
||
|
|
||
|
# Vi Visual move to column
|
||
|
vi-visual-goto-column()
|
||
|
{
|
||
|
zle .vi-goto-column
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-goto-column
|
||
|
|
||
|
# Vi Visual move back to first non-blank char
|
||
|
vi-visual-first-non-blank()
|
||
|
{
|
||
|
zle .vi-first-non-blank
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-first-non-blank
|
||
|
|
||
|
# Vi Visual repeat find
|
||
|
vi-visual-repeat-find()
|
||
|
{
|
||
|
zle .vi-repeat-find
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-repeat-find
|
||
|
|
||
|
# Vi Visual reverse repeat find
|
||
|
vi-visual-rev-repeat-find()
|
||
|
{
|
||
|
zle .vi-rev-repeat-find
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-rev-repeat-find
|
||
|
|
||
|
# Vi Visual kill whole line and enter to viins
|
||
|
vi-visual-substitute-lines()
|
||
|
{
|
||
|
local EOL
|
||
|
integer n
|
||
|
CURSOR=$__regend
|
||
|
zle .vi-end-of-line -N
|
||
|
EOL=$CURSOR
|
||
|
CURSOR=$__regstart
|
||
|
zle .vi-first-non-blank
|
||
|
n=$CURSOR
|
||
|
while [[ $n -lt $EOL ]]
|
||
|
do
|
||
|
zle .delete-char
|
||
|
(( n++ ))
|
||
|
done
|
||
|
zle vi-visual-exit-to-insert
|
||
|
}
|
||
|
zle -N vi-visual-substitute-lines
|
||
|
|
||
|
# Vi Visual move backward-blank-word
|
||
|
vi-visual-backward-blank-word()
|
||
|
{
|
||
|
zle .vi-backward-blank-word
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-backward-blank-word
|
||
|
|
||
|
# Vi Visual move forward-blank-word
|
||
|
vi-visual-forward-blank-word-end()
|
||
|
{
|
||
|
zle .vi-forward-blank-word-end
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-forward-blank-word-end
|
||
|
|
||
|
# Vi Visual move to prev char x
|
||
|
vi-visual-find-prev-char()
|
||
|
{
|
||
|
zle .vi-find-prev-char
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-find-prev-char
|
||
|
|
||
|
# Vi Visual insert bol
|
||
|
vi-visual-insert-bol()
|
||
|
{
|
||
|
zle vi-visual-exit-to-insert
|
||
|
zle .vi-insert-bol
|
||
|
}
|
||
|
zle -N vi-visual-insert-bol
|
||
|
|
||
|
# Vi Visual Join Lines
|
||
|
vi-visual-join()
|
||
|
{
|
||
|
CURSOR=$__regstart
|
||
|
while [[ $RBUFFER == *$'\n'* && $CURSOR -lt $__regend ]]
|
||
|
do
|
||
|
zle .vi-join
|
||
|
done
|
||
|
zle vi-visual-exit
|
||
|
}
|
||
|
zle -N vi-visual-join
|
||
|
|
||
|
# Vi Visual move to prev char x and skip
|
||
|
vi-visual-find-prev-char-skip()
|
||
|
{
|
||
|
zle .vi-find-prev-char-skip
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-find-prev-char-skip
|
||
|
|
||
|
# Vi Visual move forward blank word
|
||
|
vi-visual-forward-blank-word()
|
||
|
{
|
||
|
zle .vi-forward-blank-word
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-forward-blank-word
|
||
|
|
||
|
# Vi Visual move backward word
|
||
|
vi-visual-backward-word()
|
||
|
{
|
||
|
zle .vi-backward-word
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-backward-word
|
||
|
|
||
|
# Vi Visual change
|
||
|
vi-visual-change()
|
||
|
{
|
||
|
zle vi-visual-kill
|
||
|
set-x-clipboard "$CUTBUFFER"
|
||
|
zle vi-visual-exit-to-insert
|
||
|
}
|
||
|
zle -N vi-visual-change
|
||
|
|
||
|
# Vi Visual Kill and enter vicmd
|
||
|
vi-visual-kill-and-vicmd()
|
||
|
{
|
||
|
zle vi-visual-kill
|
||
|
set-x-clipboard "$CUTBUFFER"
|
||
|
zle vi-visual-exit
|
||
|
}
|
||
|
zle -N vi-visual-kill-and-vicmd
|
||
|
|
||
|
# Vi Visual move forward to word end
|
||
|
vi-visual-forward-word-end()
|
||
|
{
|
||
|
zle .vi-forward-word-end
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-forward-word-end
|
||
|
|
||
|
# Vi Visual move to next char x
|
||
|
vi-visual-find-next-char()
|
||
|
{
|
||
|
zle .vi-find-next-char
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-find-next-char
|
||
|
|
||
|
# Vi Visual move backward
|
||
|
vi-visual-backward-char()
|
||
|
{
|
||
|
zle .vi-backward-char
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-backward-char
|
||
|
|
||
|
# Vi Visual move down
|
||
|
vi-visual-down-line()
|
||
|
{
|
||
|
setopt extended_glob
|
||
|
local NL_CHAR NL_SUM
|
||
|
NL_CHAR=${RBUFFER//[^$'\n']/}
|
||
|
if [[ $RBUFFER == *$'\n'* && $#NL_CHAR -ge $NUMERIC ]]; then
|
||
|
zle .down-line-or-history
|
||
|
zle vi-visual-highlight
|
||
|
else
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-visual-down-line
|
||
|
|
||
|
# Vi Visual move up
|
||
|
vi-visual-up-line()
|
||
|
{
|
||
|
setopt extended_glob
|
||
|
local NL_CHAR
|
||
|
NL_CHAR=${LBUFFER//[^$'\n']/}
|
||
|
if [[ $LBUFFER == *$'\n'* && $#NL_CHAR -ge $NUMERIC ]]; then
|
||
|
zle .up-line-or-history
|
||
|
zle vi-visual-highlight
|
||
|
else
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-visual-up-line
|
||
|
|
||
|
# Vi Visual move forward
|
||
|
vi-visual-forward-char()
|
||
|
{
|
||
|
zle .vi-forward-char
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
|
||
|
zle -N vi-visual-forward-char
|
||
|
|
||
|
# Vi Visual Put
|
||
|
vi-visual-put()
|
||
|
{
|
||
|
zle vi-visual-kill
|
||
|
zle vi-visual-exit
|
||
|
(( CURSOR = CURSOR - 1 ))
|
||
|
if [[ $_clipcopy == '+' ]]; then
|
||
|
local cbuf
|
||
|
cbuf="$CUTBUFFER"
|
||
|
get-x-clipboard
|
||
|
zle .vi-put-after
|
||
|
unset _clipcopy
|
||
|
CUTBUFFER="$cbuf"
|
||
|
else
|
||
|
zle -U 2 && zle .vi-set-buffer
|
||
|
zle .vi-put-after
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-visual-put
|
||
|
|
||
|
# Vi Visual exchange start and end of region
|
||
|
vi-visual-exchange-points()
|
||
|
{
|
||
|
local CS_SAVE
|
||
|
CS_SAVE=$CURSOR
|
||
|
CURSOR=$MARK
|
||
|
MARK=$CS_SAVE
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-exchange-points
|
||
|
|
||
|
# Vi Visual move to till char x
|
||
|
vi-visual-find-next-char-skip()
|
||
|
{
|
||
|
zle .vi-find-next-char-skip
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-find-next-char-skip
|
||
|
|
||
|
# Vi Visual lowercase region
|
||
|
vi-visual-lowercase-region()
|
||
|
{
|
||
|
local LCSTART LCEND
|
||
|
(( LCSTART = __regstart + 1 ))
|
||
|
LCEND=$__regend
|
||
|
|
||
|
if [[ $__regstart == $__regend ]]; then
|
||
|
BUFFER[${LCSTART}]="${(L)BUFFER[${LCSTART}]}"
|
||
|
zle vi-visual-exit
|
||
|
else
|
||
|
BUFFER[${LCSTART},${LCEND}]="${(L)BUFFER[${LCSTART},${LCEND}]}"
|
||
|
zle vi-visual-exit
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-visual-lowercase-region
|
||
|
|
||
|
# Vi Visual uppercase region
|
||
|
vi-visual-uppercase-region()
|
||
|
{
|
||
|
local LCSTART LCEND
|
||
|
(( LCSTART = __regstart + 1 ))
|
||
|
LCEND=$__regend
|
||
|
|
||
|
if [[ $__regstart == $__regend ]]; then
|
||
|
BUFFER[${LCSTART}]="${(U)BUFFER[${LCSTART}]}"
|
||
|
CURSOR=$__regstart
|
||
|
zle vi-visual-exit
|
||
|
else
|
||
|
BUFFER[${LCSTART},${LCEND}]="${(U)BUFFER[${LCSTART},${LCEND}]}"
|
||
|
CURSOR=$__regstart
|
||
|
zle vi-visual-exit
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-visual-uppercase-region
|
||
|
|
||
|
# Vi Visual replace region
|
||
|
vi-visual-replace-region()
|
||
|
{
|
||
|
integer n
|
||
|
local LCSTART LCEND
|
||
|
(( LCSTART = __regstart + 1 ))
|
||
|
LCEND=$__regend
|
||
|
|
||
|
if [[ $__regstart == $__regend ]]; then
|
||
|
read -k key
|
||
|
BUFFER[${LCSTART}]="$key"
|
||
|
zle vi-visual-exit
|
||
|
else
|
||
|
read -k key
|
||
|
n=$LCSTART
|
||
|
while [[ $n -le ${LCEND} ]]
|
||
|
do
|
||
|
if [[ ! $BUFFER[$n] == $'\n' ]] && [[ -n $BUFFER[$n] ]]; then
|
||
|
BUFFER[$n]="$key"
|
||
|
fi
|
||
|
(( n++ ))
|
||
|
done
|
||
|
CURSOR=$__regstart
|
||
|
zle vi-visual-exit
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-visual-replace-region
|
||
|
|
||
|
# Vi Visual move word forward
|
||
|
vi-visual-forward-word()
|
||
|
{
|
||
|
zle .vi-forward-word
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-forward-word
|
||
|
|
||
|
# Vi Visual Yank
|
||
|
vi-visual-yank()
|
||
|
{
|
||
|
if [[ $__regstart == $__regend ]]; then
|
||
|
zle .vi-yank
|
||
|
zle vi-visual-exit
|
||
|
else
|
||
|
zle .copy-region-as-kill "$BUFFER[${__regstart}+1,${__regend}]"
|
||
|
zle vi-visual-exit
|
||
|
fi
|
||
|
set-x-clipboard "$CUTBUFFER"
|
||
|
}
|
||
|
zle -N vi-visual-yank
|
||
|
|
||
|
# Vi Visual move to bol
|
||
|
vi-visual-bol()
|
||
|
{
|
||
|
zle .vi-digit-or-beginning-of-line
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-bol
|
||
|
|
||
|
# Vi Visual move to eol
|
||
|
vi-visual-eol()
|
||
|
{
|
||
|
zle .vi-end-of-line
|
||
|
zle .vi-backward-char
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-eol
|
||
|
|
||
|
# Some use(less|ful) keybindings
|
||
|
# I took this from grml's zshrc
|
||
|
if [[ "$TERM" != emacs ]] ; then
|
||
|
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M vivis "$terminfo[kcuu1]" vi-visual-up-line
|
||
|
[[ -z "$terminfo[kcud1]" ]] || bindkey -M vivis "$terminfo[kcud1]" vi-visual-down-line
|
||
|
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M vivis "$terminfo[kcuf1]" vi-visual-forward-char
|
||
|
[[ -z "$terminfo[kcub1]" ]] || bindkey -M vivis "$terminfo[kcub1]" vi-visual-backward-char
|
||
|
# ncurses stuff:
|
||
|
[[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M vivis "${terminfo[kcuu1]/O/[}" vi-visual-up-line
|
||
|
[[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M vivis "${terminfo[kcud1]/O/[}" vi-visual-down-line
|
||
|
[[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M vivis "${terminfo[kcuf1]/O/[}" vi-visual-forward-char
|
||
|
[[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M vivis "${terminfo[kcub1]/O/[}" vi-visual-backward-char
|
||
|
fi
|
||
|
|
||
|
# _ _ _ _
|
||
|
# __ _(_) _ __ ___ ___ __| | ___ __ _| (_)_ __ ___ ___
|
||
|
# \ \ / / | | '_ ` _ \ / _ \ / _` |/ _ \ \ \ / / | | '_ \ / _ \/ __|
|
||
|
# \ V /| | | | | | | | (_) | (_| | __/ \ V /| | | | | | __/\__ \
|
||
|
# \_/ |_| |_| |_| |_|\___/ \__,_|\___| \_/ |_|_|_| |_|\___||___/
|
||
|
#
|
||
|
# Create new keymap using existing vicmd keymap
|
||
|
bindkey -N vivli vicmd
|
||
|
bindkey -M vivli -r 'i'
|
||
|
bindkey -M vivli -r 'I'
|
||
|
bindkey -M vivli -r 'a'
|
||
|
bindkey -M vivli -r 'A'
|
||
|
bindkey -M vivli 'u' vi-visual-lowercase-region
|
||
|
bindkey -M vivli 'U' vi-visual-uppercase-region
|
||
|
bindkey -M vivli 'r' vi-visual-replace-region
|
||
|
bindkey -M vivli 'J' vi-visual-join
|
||
|
bindkey -M vivli 'y' vi-visual-yank
|
||
|
bindkey -M vivli 'Y' vi-visual-yank
|
||
|
bindkey -M vivli '^[' vi-visual-exit
|
||
|
#bindkey -M vivli 'jj' vi-visual-exit
|
||
|
bindkey -M vivli 'V' vi-visual-exit
|
||
|
bindkey -M vivli 'c' vi-visual-substitute-lines
|
||
|
bindkey -M vivli 'C' vi-visual-substitute-lines
|
||
|
#bindkey -M vivli 'S' vi-visual-substitute-lines
|
||
|
bindkey -M vivli 'R' vi-visual-substitute-lines
|
||
|
|
||
|
# Highlight Lines
|
||
|
vi-vlines-highlight()
|
||
|
{
|
||
|
if [[ $__start1 == $__start2 ]] && [[ $__end1 == $__end2 ]]; then
|
||
|
__regstart=$__start1
|
||
|
__regend=$__end1
|
||
|
region_highlight=("${__regstart} ${__regend} standout")
|
||
|
CURSOR=$__savepos
|
||
|
elif [[ $__start1 -lt $__start2 ]] && [[ $__end1 -lt $__end2 ]]; then
|
||
|
__regstart=$__start1
|
||
|
__regend=$__end2
|
||
|
region_highlight=("${__regstart} ${__regend} standout")
|
||
|
CURSOR=$__savepos
|
||
|
elif [[ $__start1 -gt $__start2 ]] && [[ $__end1 -gt $__end2 ]]; then
|
||
|
__regstart=$__start2
|
||
|
__regend=$__end1
|
||
|
region_highlight=("${__regstart} ${__regend} standout")
|
||
|
CURSOR=$__savepos
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-vlines-highlight
|
||
|
|
||
|
# Vi Visual Lines Mode
|
||
|
vi-vlines-mode()
|
||
|
{
|
||
|
zle -K vivli
|
||
|
__csorig=$CURSOR
|
||
|
__csbefore=$CURSOR
|
||
|
__savepos=$CURSOR
|
||
|
zle .vi-beginning-of-line -N
|
||
|
__start1=$CURSOR
|
||
|
__start2=$CURSOR
|
||
|
zle .end-of-line -N
|
||
|
__end1=$CURSOR
|
||
|
__end2=$CURSOR
|
||
|
zle vi-vlines-highlight
|
||
|
}
|
||
|
zle -N vi-vlines-mode
|
||
|
|
||
|
vi-visual-whole-line()
|
||
|
{
|
||
|
__csorig=$CURSOR
|
||
|
__csbefore=$CURSOR
|
||
|
__savepos=$CURSOR
|
||
|
zle .vi-beginning-of-line -N
|
||
|
__start1=$CURSOR
|
||
|
__start2=$CURSOR
|
||
|
zle .end-of-line -N
|
||
|
__end1=$CURSOR
|
||
|
__end2=$CURSOR
|
||
|
zle vi-vlines-highlight
|
||
|
}
|
||
|
zle -N vi-visual-whole-line
|
||
|
|
||
|
# Exchange Start and End Point of Visual Lines Mode
|
||
|
vi-vlines-exchange-points()
|
||
|
{
|
||
|
local SAVE_S1 SAVE_E1
|
||
|
|
||
|
__csbefore=$__csorig
|
||
|
__csorig=$CURSOR
|
||
|
__savepos=$__csbefore
|
||
|
|
||
|
SAVE_S1=$__start1
|
||
|
SAVE_E1=$__end1
|
||
|
__start1=$__start2
|
||
|
__start2=$SAVE_S1
|
||
|
__end1=$__end2
|
||
|
__end2=$SAVE_E1
|
||
|
zle vi-vlines-highlight
|
||
|
}
|
||
|
zle -N vi-vlines-exchange-points
|
||
|
|
||
|
# VI Visual Lines down
|
||
|
vi-vlines-down-line()
|
||
|
{
|
||
|
setopt extended_glob
|
||
|
local NL_CHAR NL_SUM
|
||
|
NL_CHAR=${RBUFFER//[^$'\n']/}
|
||
|
if [[ $RBUFFER == *$'\n'* && $#NL_CHAR -ge $NUMERIC ]]; then
|
||
|
zle .down-line-or-history
|
||
|
__savepos=$CURSOR
|
||
|
zle .vi-beginning-of-line -N
|
||
|
__start2=$CURSOR
|
||
|
zle .end-of-line -N
|
||
|
__end2=$CURSOR
|
||
|
zle vi-vlines-highlight
|
||
|
else
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-vlines-down-line
|
||
|
|
||
|
# VI Visual Lines up
|
||
|
vi-vlines-up-line()
|
||
|
{
|
||
|
setopt extended_glob
|
||
|
local NL_CHAR NL_SUM
|
||
|
NL_CHAR=${LBUFFER//[^$'\n']/}
|
||
|
if [[ $LBUFFER == *$'\n'* && $#NL_CHAR -ge $NUMERIC ]]; then
|
||
|
zle .up-line-or-history
|
||
|
__savepos=$CURSOR
|
||
|
zle .vi-beginning-of-line -N
|
||
|
__start2=$CURSOR
|
||
|
zle .end-of-line -N
|
||
|
__end2=$CURSOR
|
||
|
zle vi-vlines-highlight
|
||
|
else
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-vlines-up-line
|
||
|
|
||
|
# Kill highlighted region in VLines
|
||
|
vi-vlines-kill()
|
||
|
{
|
||
|
MARK=$__regend
|
||
|
CURSOR=$__regstart
|
||
|
zle .kill-region
|
||
|
if [[ $__regstart -le 1 ]]; then
|
||
|
zle .kill-whole-line
|
||
|
else
|
||
|
zle .backward-delete-char -N
|
||
|
zle .forward-char -N
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-vlines-kill
|
||
|
|
||
|
# Kill highlighted region in VLines
|
||
|
vi-vlines-kill-and-vicmd()
|
||
|
{
|
||
|
zle vi-vlines-kill
|
||
|
set-x-clipboard "$CUTBUFFER"
|
||
|
zle vi-visual-exit
|
||
|
}
|
||
|
zle -N vi-vlines-kill-and-vicmd
|
||
|
|
||
|
# Exit Visual Lines Mode and enter VISUAL Mode keeping the region
|
||
|
vi-vlines-exit-to-visual()
|
||
|
{
|
||
|
zle -K vivis
|
||
|
MARK=$__csorig
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-vlines-exit-to-visual
|
||
|
|
||
|
# Vi VLines Put
|
||
|
vi-vlines-put()
|
||
|
{
|
||
|
MARK=$__regend
|
||
|
CURSOR=$__regstart
|
||
|
zle .kill-region
|
||
|
if [[ $_clipcopy == '+' ]]; then
|
||
|
local cbuf
|
||
|
cbuf="$CUTBUFFER"
|
||
|
get-x-clipboard
|
||
|
zle .vi-put-after
|
||
|
unset _clipcopy
|
||
|
CUTBUFFER="$cbuf"
|
||
|
else
|
||
|
zle -U 2 && zle .vi-set-buffer
|
||
|
zle .vi-put-after
|
||
|
fi
|
||
|
zle vi-visual-exit
|
||
|
}
|
||
|
zle -N vi-vlines-put
|
||
|
|
||
|
##################### zsh vi misc stuff ###############################################################################
|
||
|
#######################################################################################################################
|
||
|
|
||
|
# Vi go to line x
|
||
|
vi-goto-line()
|
||
|
{
|
||
|
setopt extended_glob
|
||
|
local LNL_CHAR RNL_CHAR NL_SUM CUR_LINE
|
||
|
integer n
|
||
|
LNL_CHAR=${LBUFFER//[^$'\n']/}
|
||
|
RNL_CHAR=${RBUFFER//[^$'\n']/}
|
||
|
(( CUR_LINE = $#LNL_CHAR + 1 ))
|
||
|
(( NL_SUM = $#LNL_CHAR + $#RNL_CHAR + 1 ))
|
||
|
|
||
|
if [[ $NUMERIC -gt NL_SUM ]]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
if [[ -z $NUMERIC || $NUMERIC == 0 ]]; then
|
||
|
CURSOR=$#BUFFER
|
||
|
zle .vi-first-non-blank
|
||
|
return 0
|
||
|
elif [[ -n $NUMERIC && $CUR_LINE -lt $NUMERIC ]]; then
|
||
|
n=$CUR_LINE
|
||
|
while [[ $n -lt $NUMERIC ]]
|
||
|
do
|
||
|
zle .down-line-or-history -N
|
||
|
(( n++ ))
|
||
|
done
|
||
|
zle .vi-first-non-blank
|
||
|
return 0
|
||
|
elif [[ -n $NUMERIC && $CUR_LINE -gt $NUMERIC ]]; then
|
||
|
n=$CUR_LINE
|
||
|
while [[ $n -gt $NUMERIC ]]
|
||
|
do
|
||
|
zle .up-line-or-history -N
|
||
|
(( n-- ))
|
||
|
done
|
||
|
zle .vi-first-non-blank
|
||
|
return 0
|
||
|
elif [[ -n $NUMERIC && $CUR_LINE -eq $NUMERIC ]]; then
|
||
|
zle .vi-first-non-blank
|
||
|
return 0
|
||
|
fi
|
||
|
}
|
||
|
zle -N vi-goto-line
|
||
|
|
||
|
# Vi go to first line
|
||
|
vi-goto-first-line()
|
||
|
{
|
||
|
CURSOR=0
|
||
|
zle .vi-first-non-blank
|
||
|
}
|
||
|
zle -N vi-goto-first-line
|
||
|
|
||
|
# Vi VISUAL go to line
|
||
|
vi-visual-goto-line()
|
||
|
{
|
||
|
zle vi-goto-line
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-goto-line
|
||
|
|
||
|
# Vi VISUAL go to first line
|
||
|
vi-visual-goto-first-line()
|
||
|
{
|
||
|
zle vi-goto-first-line
|
||
|
zle vi-visual-highlight
|
||
|
}
|
||
|
zle -N vi-visual-goto-first-line
|
||
|
|
||
|
# Vi Vlines go to line
|
||
|
vi-vlines-goto-line()
|
||
|
{
|
||
|
zle vi-goto-line
|
||
|
__savepos=$CURSOR
|
||
|
zle .vi-beginning-of-line -N
|
||
|
__start2=$CURSOR
|
||
|
zle .end-of-line -N
|
||
|
__end2=$CURSOR
|
||
|
zle vi-vlines-highlight
|
||
|
}
|
||
|
zle -N vi-vlines-goto-line
|
||
|
|
||
|
# Vi Vlines go to first line
|
||
|
vi-vlines-goto-first-line()
|
||
|
{
|
||
|
zle vi-goto-first-line
|
||
|
__savepos=$CURSOR
|
||
|
zle .vi-beginning-of-line -N
|
||
|
__start2=$CURSOR
|
||
|
zle .end-of-line -N
|
||
|
__end2=$CURSOR
|
||
|
zle vi-vlines-highlight
|
||
|
}
|
||
|
zle -N vi-vlines-goto-first-line
|
||
|
|
||
|
vi-visual-surround-dquote()
|
||
|
{
|
||
|
zle vi-visual-kill
|
||
|
BUFFER="$LBUFFER\"$CUTBUFFER\"$RBUFFER"
|
||
|
zle vi-visual-exit
|
||
|
}
|
||
|
zle -N vi-visual-surround-dquote
|
||
|
|
||
|
vi-visual-surround-squote()
|
||
|
{
|
||
|
zle vi-visual-kill
|
||
|
BUFFER="$LBUFFER'$CUTBUFFER'$RBUFFER"
|
||
|
zle vi-visual-exit
|
||
|
}
|
||
|
zle -N vi-visual-surround-squote
|
||
|
|
||
|
vi-visual-surround-parenthesis()
|
||
|
{
|
||
|
zle vi-visual-kill
|
||
|
BUFFER="$LBUFFER($CUTBUFFER)$RBUFFER"
|
||
|
zle vi-visual-exit
|
||
|
}
|
||
|
zle -N vi-visual-surround-parenthesis
|
||
|
|
||
|
vi-visual-surround-space()
|
||
|
{
|
||
|
zle vi-visual-kill
|
||
|
BUFFER="$LBUFFER $CUTBUFFER $RBUFFER"
|
||
|
zle vi-visual-exit
|
||
|
}
|
||
|
zle -N vi-visual-surround-space
|
||
|
|
||
|
#bindkey -M vivis '-' vi-visual-up-line
|
||
|
#bindkey -M vivis 'S' vi-visual-substitute-lines
|
||
|
#bindkey -M vivis 'v' vi-visual-exit
|
||
|
#bindkey -M vivli 'v' vi-vlines-exit-to-visual
|
||
|
|
||
|
bindkey -M vivis "\"" vi-set-buffer
|
||
|
bindkey -M vivis '1' digit-argument
|
||
|
bindkey -M vivis '2' digit-argument
|
||
|
bindkey -M vivis '3' digit-argument
|
||
|
bindkey -M vivis '4' digit-argument
|
||
|
bindkey -M vivis '5' digit-argument
|
||
|
bindkey -M vivis '6' digit-argument
|
||
|
bindkey -M vivis '7' digit-argument
|
||
|
bindkey -M vivis '8' digit-argument
|
||
|
bindkey -M vivis '9' digit-argument
|
||
|
bindkey -M vicmd 'G' vi-goto-line
|
||
|
bindkey -M vicmd 'V' vi-vlines-mode
|
||
|
bindkey -M vicmd 'gg' vi-goto-first-line
|
||
|
bindkey -M vicmd 'v' vi-visual-mode
|
||
|
bindkey -M vivis "S'" vi-visual-surround-squote
|
||
|
bindkey -M vivis ' ' vi-visual-forward-char
|
||
|
bindkey -M vivis '%' vi-visual-match-bracket
|
||
|
bindkey -M vivis '+' vi-visual-down-line
|
||
|
bindkey -M vivis ',' vi-visual-rev-repeat-find
|
||
|
bindkey -M vivis '0' vi-visual-bol
|
||
|
bindkey -M vivis ';' vi-visual-repeat-find
|
||
|
bindkey -M vivis 'B' vi-visual-backward-blank-word
|
||
|
bindkey -M vivis 'C' vi-visual-substitute-lines
|
||
|
bindkey -M vivis 'D' vi-visual-kill-and-vicmd
|
||
|
bindkey -M vivis 'E' vi-visual-forward-blank-word-end
|
||
|
bindkey -M vivis 'F' vi-visual-find-prev-char
|
||
|
bindkey -M vivis 'G' vi-visual-goto-line
|
||
|
bindkey -M vivis 'I' vi-visual-insert-bol
|
||
|
bindkey -M vivis 'J' vi-visual-join
|
||
|
bindkey -M vivis 'O' vi-visual-exchange-points
|
||
|
bindkey -M vivis 'R' vi-visual-substitute-lines
|
||
|
bindkey -M vivis 'S ' vi-visual-surround-space
|
||
|
bindkey -M vivis 'S"' vi-visual-surround-dquote
|
||
|
bindkey -M vivis 'S(' vi-visual-surround-parenthesis
|
||
|
bindkey -M vivis 'S)' vi-visual-surround-parenthesis
|
||
|
bindkey -M vivis 'T' vi-visual-find-prev-char-skip
|
||
|
bindkey -M vivis 'U' vi-visual-uppercase-region
|
||
|
bindkey -M vivis 'V' vi-visual-exit-to-vlines
|
||
|
bindkey -M vivis 'W' vi-visual-forward-blank-word
|
||
|
bindkey -M vivis 'Y' vi-visual-yank
|
||
|
bindkey -M vivis '\$' vi-visual-eol
|
||
|
bindkey -M vivis '\^' vi-visual-first-non-blank
|
||
|
bindkey -M vivis '\|' vi-visual-goto-column
|
||
|
bindkey -M vivis '^?' vi-visual-backward-char
|
||
|
bindkey -M vivis '^M' vi-visual-yank
|
||
|
bindkey -M vivis '^[' vi-visual-exit
|
||
|
bindkey -M vivis 'b' vi-visual-backward-word
|
||
|
bindkey -M vivis 'c' vi-visual-change
|
||
|
bindkey -M vivis 'd' vi-visual-kill-and-vicmd
|
||
|
bindkey -M vivis 'e' vi-visual-forward-word-end
|
||
|
bindkey -M vivis 'f' vi-visual-find-next-char
|
||
|
bindkey -M vivis 'gg' vi-visual-goto-first-line
|
||
|
bindkey -M vivis 'h' vi-visual-backward-char
|
||
|
bindkey -M vivis 'j' vi-visual-down-line
|
||
|
bindkey -M vivis 'jj' vi-visual-exit
|
||
|
bindkey -M vivis 'k' vi-visual-up-line
|
||
|
bindkey -M vivis 'l' vi-visual-forward-char
|
||
|
bindkey -M vivis 'o' vi-visual-exchange-points
|
||
|
bindkey -M vivis 'p' vi-visual-put
|
||
|
bindkey -M vivis 'r' vi-visual-replace-region
|
||
|
bindkey -M vivis 't' vi-visual-find-next-char-skip
|
||
|
bindkey -M vivis 'u' vi-visual-lowercase-region
|
||
|
bindkey -M vivis 'v' vi-visual-eol
|
||
|
bindkey -M vivis 'w' vi-visual-forward-word
|
||
|
bindkey -M vivis 'y' vi-visual-yank
|
||
|
bindkey -M vivis 'X' vi-visual-kill-and-vicmd
|
||
|
bindkey -M vivis 'x' vi-visual-kill-and-vicmd
|
||
|
|
||
|
bindkey -M vivli 'D' vi-vlines-kill-and-vicmd
|
||
|
bindkey -M vivli 'G' vi-vlines-goto-line
|
||
|
bindkey -M vivli 'O' vi-vlines-exchange-points
|
||
|
bindkey -M vivli 'P' vi-vlines-put
|
||
|
bindkey -M vivli 'd' vi-vlines-kill-and-vicmd
|
||
|
bindkey -M vivli 'gg' vi-vlines-goto-first-line
|
||
|
bindkey -M vivli 'j' vi-vlines-down-line
|
||
|
bindkey -M vivli 'k' vi-vlines-up-line
|
||
|
bindkey -M vivli 'o' vi-vlines-exchange-points
|
||
|
bindkey -M vivli 'p' vi-vlines-put
|
||
|
bindkey -M vivli 'v' vi-vlines-exit-to-visual
|