aboutsummaryrefslogtreecommitdiffstats
path: root/modules/by-name/zs/zsh/config/custom_cursor.zsh
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-21 22:39:32 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-21 22:39:32 +0200
commit67fc567939eec10fcea47cd3569d1682698a5724 (patch)
tree5b7e6381822de15020de6cee73969acb630f78a1 /modules/by-name/zs/zsh/config/custom_cursor.zsh
parentbuild(treewide): Update (diff)
downloadnixos-config-67fc567939eec10fcea47cd3569d1682698a5724.zip
feat(modules/zsh): Nearly completely rewrite
New features: - The `vi` mode is now actually useful - The whole history search/suggestion has been integrated into `atuin` - The `edit-command-line` plugin does no longer print useless stuff - and miscellaneous other things.
Diffstat (limited to 'modules/by-name/zs/zsh/config/custom_cursor.zsh')
-rw-r--r--modules/by-name/zs/zsh/config/custom_cursor.zsh81
1 files changed, 46 insertions, 35 deletions
diff --git a/modules/by-name/zs/zsh/config/custom_cursor.zsh b/modules/by-name/zs/zsh/config/custom_cursor.zsh
index 37390c1c..071bb5fe 100644
--- a/modules/by-name/zs/zsh/config/custom_cursor.zsh
+++ b/modules/by-name/zs/zsh/config/custom_cursor.zsh
@@ -1,42 +1,53 @@
#!/usr/bin/env zsh
-# Change cursor shape for different vi modes.
-function zle-keymap-select {
- if [[ ${KEYMAP} == vicmd ]] ||
- [[ $1 = 'block' ]]; then
- echo -ne '\e[1 q'
- elif [[ ${KEYMAP} == main ]] ||
- [[ ${KEYMAP} == viins ]] ||
- [[ ${KEYMAP} = '' ]] ||
- [[ $1 = 'beam' ]]; then
- echo -ne '\e[5 q'
- fi
-}
-zle -N zle-keymap-select
+autoload -U add-zsh-hook
+autoload -U add-zle-hook-widget
+
+_cursor_beam() { echo -ne "\\033[5 q" }
+_cursor_block() { echo -ne "\\033[1 q" }
-# ci", ci', ci`, di", etc
-autoload -U select-quoted
-zle -N select-quoted
-for m in visual viopp; do
- for c in {a,i}{\',\",\`}; do
- bindkey -M "$m" "$c" select-quoted
- done
-done
+# Change cursor shape for different vi modes.
+# From `ZSHZLE (1)`:
+# > Executed every time the keymap changes, i.e. the special parameter KEYMAP is set to a different value,
+# > while the line editor is active. Initialising the keymap when the line editor starts does
+# > not cause the widget to be called.
+# >
+# > The value $KEYMAP within the function reflects the new keymap. The old keymap is passed as the sole argument.
+# >
+# > This can be used for detecting switches between the vi command (vicmd) and insert (usually main) keymaps.
+_cursor_zle-keymap-select() {
+ : keymap select
-# ci{, ci(, ci<, di{, etc
-autoload -U select-bracketed
-zle -N select-bracketed
-for m in visual viopp; do
- for c in {a,i}${(s..)^:-'()[]{}<>bB'}; do
- bindkey -M $m $c select-bracketed
- done
-done
+ case "$KEYMAP" in
+ "vicmd" | "block")
+ _cursor_block
+ ;;
+ "main" | "viins" | "" | "beam")
+ _cursor_beam
+ ;;
+ esac
+}
+add-zle-hook-widget keymap-select _cursor_zle-keymap-select
-zle-line-init() {
- zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
- echo -ne "\e[5 q"
+# From `ZSHZLE(1)`:
+# > Executed every time the line editor is started to read a new line of input.
+# > The following example puts the line editor into vi command mode when it starts up.
+# >
+# > zle-line-init() { zle -K vicmd; }
+# > zle -N zle-line-init
+# >
+# > (The command inside the function sets the keymap directly; it is equivalent to zle vi-cmd-mode.)
+_cursor_zle-line-init() {
+ : zle line init
+ _cursor_beam
+}
+# > This is similar to zle-line-init but is executed every time the line editor has finished reading a line of input.
+_cursor_zle-line-finish() {
+ : zle line finish
+ _cursor_block
}
-zle -N zle-line-init
+add-zle-hook-widget line-init _cursor_zle-line-init
+add-zle-hook-widget line-finish _cursor_zle-line-finish
-echo -ne '\e[5 q' # Use beam shape cursor on startup.
-precmd() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.
+# Use beam shape cursor on startup.
+_cursor_beam