Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Oh My Zsh
Commits
98762faa
Unverified
Commit
98762faa
authored
Jan 02, 2021
by
Robert Estelle
Committed by
GitHub
Jan 02, 2021
Browse files
fix(vi-mode): control cursor, restore and use visual mode and speed up mode changes (#8004)
parent
4298e89b
Changes
1
Hide whitespace changes
Inline
Side-by-side
plugins/vi-mode/vi-mode.plugin.zsh
View file @
98762faa
# Control whether to force a redraw on each mode change.
#
# Resetting the prompt on every mode change can cause lag when switching modes.
# This is especially true if the prompt does things like checking git status.
#
# Set to "true" to force the prompt to reset on each mode change.
# Set to "false" to force the prompt *not* to reset on each mode change.
#
# (The default is not to reset, unless we're showing the mode in RPS1).
typeset
-g
VI_MODE_RESET_PROMPT_ON_MODE_CHANGE
typeset
-g
VI_KEYMAP
=
main
function
_vi-mode-set-cursor-shape-for-keymap
()
{
# https://vt100.net/docs/vt510-rm/DECSCUSR
local
_shape
=
0
case
"
${
1
:-${
VI_KEYMAP
:-
main
}}
"
in
main
)
_shape
=
6
;;
# vi insert: line
viins
)
_shape
=
6
;;
# vi insert: line
isearch
)
_shape
=
6
;;
# inc search: line
command
)
_shape
=
6
;;
# read a command name
vicmd
)
_shape
=
2
;;
# vi cmd: block
visual
)
_shape
=
2
;;
# vi visual mode: block
viopp
)
_shape
=
0
;;
# vi operation pending: blinking block
*
)
_shape
=
0
;;
esac
printf
$'
\e
[%d q'
"
${
_shape
}
"
}
# Updates editor information when the keymap changes.
function
zle-keymap-select
()
{
# update keymap variable for the prompt
VI_KEYMAP
=
$KEYMAP
typeset
-g
VI_KEYMAP
=
$KEYMAP
zle reset-prompt
zle
-R
if
[
"
${
VI_MODE_RESET_PROMPT_ON_MODE_CHANGE
:-}
"
=
true
]
;
then
zle reset-prompt
zle
-R
fi
_vi-mode-set-cursor-shape-for-keymap
"
${
VI_KEYMAP
}
"
}
zle
-N
zle-keymap-select
function
vi-accept-line
()
{
VI_KEYMAP
=
main
zle accept-line
# These "echoti" statements were originally set in lib/key-bindings.zsh
# Not sure the best way to extend without overriding.
function
zle-line-init
()
{
typeset
-g
VI_KEYMAP
=
main
((
!
${
+terminfo[smkx]
}
))
||
echoti smkx
_vi-mode-set-cursor-shape-for-keymap
"
${
VI_KEYMAP
}
"
}
zle
-N
zle-line-init
zle
-N
vi-accept-line
function
zle-line-finish
()
{
((
!
${
+terminfo[rmkx]
}
))
||
echoti rmkx
_vi-mode-set-cursor-shape-for-keymap default
}
zle
-N
zle-line-finish
bindkey
-v
# use custom accept-line widget to update $VI_KEYMAP
bindkey
-M
vicmd
'^J'
vi-accept-line
bindkey
-M
vicmd
'^M'
vi-accept-line
# allow v to edit the command line (standard behaviour)
autoload
-Uz
edit-command-line
zle
-N
edit-command-line
bindkey
-M
vicmd
'v'
edit-command-line
# allow ctrl-p, ctrl-n for navigate history (standard behaviour)
bindkey
'^P'
up-history
bindkey
'^N'
down-history
...
...
@@ -45,12 +73,95 @@ bindkey '^s' history-incremental-search-forward
bindkey
'^a'
beginning-of-line
bindkey
'^e'
end-of-line
if
[[
"
${
terminfo
[kpp]
}
"
!=
""
]]
;
then
bindkey
"
${
terminfo
[kpp]
}
"
up-line-or-history
# [PageUp] - Up a line of history
fi
if
[[
"
${
terminfo
[knp]
}
"
!=
""
]]
;
then
bindkey
"
${
terminfo
[knp]
}
"
down-line-or-history
# [PageDown] - Down a line of history
fi
# start typing + [Up-Arrow] - fuzzy find history forward
if
[[
"
${
terminfo
[kcuu1]
}
"
!=
""
]]
;
then
autoload
-U
up-line-or-beginning-search
zle
-N
up-line-or-beginning-search
bindkey
"
${
terminfo
[kcuu1]
}
"
up-line-or-beginning-search
fi
# start typing + [Down-Arrow] - fuzzy find history backward
if
[[
"
${
terminfo
[kcud1]
}
"
!=
""
]]
;
then
autoload
-U
down-line-or-beginning-search
zle
-N
down-line-or-beginning-search
bindkey
"
${
terminfo
[kcud1]
}
"
down-line-or-beginning-search
fi
if
[[
"
${
terminfo
[khome]
}
"
!=
""
]]
;
then
bindkey
"
${
terminfo
[khome]
}
"
beginning-of-line
# [Home] - Go to beginning of line
fi
if
[[
"
${
terminfo
[kend]
}
"
!=
""
]]
;
then
bindkey
"
${
terminfo
[kend]
}
"
end-of-line
# [End] - Go to end of line
fi
if
[[
"
${
terminfo
[kcbt]
}
"
!=
""
]]
;
then
bindkey
"
${
terminfo
[kcbt]
}
"
reverse-menu-complete
# [Shift-Tab] - move through the completion menu backwards
fi
bindkey
'^?'
backward-delete-char
# [Backspace] - delete backward
if
[[
"
${
terminfo
[kdch1]
}
"
!=
""
]]
;
then
bindkey
"
${
terminfo
[kdch1]
}
"
delete-char
# [Delete] - delete forward
else
bindkey
"^[[3~"
delete-char
bindkey
"^[3;5~"
delete-char
bindkey
"
\e
[3~"
delete-char
fi
()
{
local
wrap_clipboard_widgets
function
wrap_clipboard_widgets
()
{
# NB: Assume we are the first wrapper and that we only wrap native widgets
# See zsh-autosuggestions.zsh for a more generic and more robust wrapper
local
verb
=
"
$1
"
shift
local
widget
local
wrapped_name
for
widget
in
"
$@
"
;
do
wrapped_name
=
"_zsh-vi-
${
verb
}
-
${
widget
}
"
if
[
"
${
verb
}
"
=
copy
]
;
then
eval
"
function
${
wrapped_name
}
() {
zle .
${
widget
}
printf %s
\"\$
{CUTBUFFER}
\"
| clipcopy
}
"
else
eval
"
function
${
wrapped_name
}
() {
CUTBUFFER=
\"\$
(clippaste)
\"
zle .
${
widget
}
}
"
fi
zle
-N
"
${
widget
}
"
"
${
wrapped_name
}
"
done
}
wrap_clipboard_widgets copy vi-yank vi-yank-eol vi-backward-kill-word vi-change-whole-line vi-delete
wrap_clipboard_widgets
paste
vi-put-
{
before,after
}
unfunction wrap_clipboard_widgets
}
# if mode indicator wasn't setup by theme, define default
if
[[
"
$MODE_INDICATOR
"
==
""
]]
;
then
MODE_INDICATOR
=
"%{
$fg_bold
[
red
]%
}<%
{
$fg
[red]%}<<%{
$reset_color
%}"
MODE_INDICATOR
=
'%B%F{
red}<%
b<<%f'
fi
function
vi_mode_prompt_info
()
{
# If we're using the prompt to display mode info, and we haven't explicitly
# disabled "reset prompt on mode change", then set it here.
#
# We do that here instead of the `if` statement below because the user may
# set RPS1/RPROMPT to something else in their custom config.
:
"
${
VI_MODE_RESET_PROMPT_ON_MODE_CHANGE
:
=true
}
"
echo
"
${${
VI_KEYMAP
/vicmd/
$MODE_INDICATOR
}
/(main|viins)/
}
"
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment