summaryrefslogtreecommitdiff
path: root/plugins/vi-mode
diff options
context:
space:
mode:
authorJulien Vincent <m@julienvincent.io>2023-03-07 21:46:21 +0200
committerGitHub <noreply@github.com>2023-03-07 20:46:21 +0100
commite0f92c8df52335c266f73e3cc3384b277f3e9a34 (patch)
tree1cbb71660141df61814f42687e5bb6f1af466062 /plugins/vi-mode
parentd342b353e32091ef7384b86fd86b1a88dbd44609 (diff)
downloadzsh-e0f92c8df52335c266f73e3cc3384b277f3e9a34.tar.gz
zsh-e0f92c8df52335c266f73e3cc3384b277f3e9a34.tar.bz2
zsh-e0f92c8df52335c266f73e3cc3384b277f3e9a34.zip
feat(vi-mode): add settings for vi-mode cursor styles (#10860)
Diffstat (limited to 'plugins/vi-mode')
-rw-r--r--plugins/vi-mode/README.md21
-rw-r--r--plugins/vi-mode/vi-mode.plugin.zsh23
2 files changed, 37 insertions, 7 deletions
diff --git a/plugins/vi-mode/README.md b/plugins/vi-mode/README.md
index 476666bf6..3b819c7cb 100644
--- a/plugins/vi-mode/README.md
+++ b/plugins/vi-mode/README.md
@@ -29,6 +29,8 @@ plugins=(... vi-mode)
VI_MODE_SET_CURSOR=true
```
+ See [Cursor Styles](#cursor-styles) for controlling how the cursor looks in different modes
+
- `MODE_INDICATOR`: controls the string displayed when the shell is in normal mode.
See [Mode indicators](#mode-indicators) for details.
@@ -52,6 +54,25 @@ INSERT_MODE_INDICATOR="%F{yellow}+%f"
You can also use the `vi_mode_prompt_info` function in your prompt, which will display
this mode indicator.
+## Cursor Styles
+
+You can control the cursor style used in each active vim mode by changing the values of the following variables.
+
+```zsh
+# defaults
+VI_MODE_CURSOR_NORMAL=2
+VI_MODE_CURSOR_VISUAL=6
+VI_MODE_CURSOR_INSERT=6
+VI_MODE_CURSOR_OPPEND=0
+```
+
+- 0, 1 - Blinking block
+- 2 - Solid block
+- 3 - Blinking underline
+- 4 - Solid underline
+- 5 - Blinking line
+- 6 - Solid line
+
## Key bindings
Use `ESC` or `CTRL-[` to enter `Normal mode`.
diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh
index 149d6bbd5..9a410c1fb 100644
--- a/plugins/vi-mode/vi-mode.plugin.zsh
+++ b/plugins/vi-mode/vi-mode.plugin.zsh
@@ -14,6 +14,15 @@ typeset -g VI_MODE_RESET_PROMPT_ON_MODE_CHANGE
# Unset or set to any other value to do the opposite.
typeset -g VI_MODE_SET_CURSOR
+# Control how the cursor appears in the various vim modes. This only applies
+# if $VI_MODE_SET_CURSOR=true.
+#
+# See https://vt100.net/docs/vt510-rm/DECSCUSR for cursor styles
+typeset -g VI_MODE_CURSOR_NORMAL=2
+typeset -g VI_MODE_CURSOR_VISUAL=6
+typeset -g VI_MODE_CURSOR_INSERT=6
+typeset -g VI_MODE_CURSOR_OPPEND=0
+
typeset -g VI_KEYMAP=main
function _vi-mode-set-cursor-shape-for-keymap() {
@@ -22,13 +31,13 @@ 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
+ main) _shape=$VI_MODE_CURSOR_INSERT ;; # vi insert: line
+ viins) _shape=$VI_MODE_CURSOR_INSERT ;; # vi insert: line
+ isearch) _shape=$VI_MODE_CURSOR_INSERT ;; # inc search: line
+ command) _shape=$VI_MODE_CURSOR_INSERT ;; # read a command name
+ vicmd) _shape=$VI_MODE_CURSOR_NORMAL ;; # vi cmd: block
+ visual) _shape=$VI_MODE_CURSOR_VISUAL ;; # vi visual mode: block
+ viopp) _shape=$VI_MODE_CURSOR_OPPEND ;; # vi operation pending: blinking block
*) _shape=0 ;;
esac
printf $'\e[%d q' "${_shape}"