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
Ohmyzsh
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