diff -r 000000000000 -r 7215ca490221 zshrc.d/60-vi-showmode.zrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zshrc.d/60-vi-showmode.zrc Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,245 @@ +# +# Vi Mode +# This is an old script I have been updating/customizing over +# the time, I'm unable to mention the original author. +# Let me know if you know who I should give the credits to. +# +# This mode can be enabled/disabled using the variable +# $SHOWMODE in your $ZDOTLOCALDIR/zshrc. +# +# MiKael +# + +if [[ $SHOWMODE != "on" ]]; then + # Vi showmode is not enabled--skipping file + return 0 +fi + + +##################### +# Vim-like showmode # +##################### + +# vi keybindings +bindkey -v + +bindkey -M vicmd "^R" redo +bindkey -M vicmd "u" undo +bindkey -M vicmd "ga" what-cursor-position + +unsetopt promptcr +setopt transient_rprompt + +__string_insert="--INSERT--" +__string_normal="--NORMAL--" +__string_replace="--REPLACE-" + +redisplay-insert() { + show_mode "$__string_insert" +} +redisplay-normal() { + show_mode "$__string_normal" +} +zle -N redisplay-insert +zle -N redisplay-normal +bindkey -M viins "^X^R" redisplay-insert +bindkey -M vicmd "^X^R" redisplay-normal + +screenclear () { + echo -n "\033[2J\033[400H" + builtin zle .redisplay + show_mode "$__string_insert" +} +zle -N screenclear +bindkey " " screenclear + +function zle-line-finish { + export RPS1="$__string_insert" +} +zle -N zle-line-finish + +show_mode() { + export RPS1=$1 + builtin zle reset-prompt + return +} + + +### vi-add-eol (unbound) (A) (unbound) +### Move to the end of the line and enter insert mode. + +vi-add-eol() { + show_mode "$__string_insert" + builtin zle .vi-add-eol +} +zle -N vi-add-eol +bindkey -M vicmd "A" vi-add-eol + +### vi-add-next (unbound) (a) (unbound) +### Enter insert mode after the current cursor posiĀ­ +### tion, without changing lines. +vi-add-next() { + show_mode "$__string_insert" + builtin zle .vi-add-next +} +zle -N vi-add-next +bindkey -M vicmd "a" vi-add-next + + +### vi-change (unbound) (c) (unbound) +### Read a movement command from the keyboard, and kill +### from the cursor position to the endpoint of the +### movement. Then enter insert mode. If the command +### is vi-change, change the current line. + +vi-change() { + show_mode "$__string_insert" + builtin zle .vi-change +} +zle -N vi-change +bindkey -M vicmd "c" vi-change + +### vi-change-eol (unbound) (C) (unbound) +### Kill to the end of the line and enter insert mode. + +vi-change-eol() { + show_mode "$__string_insert" + builtin zle .vi-change-eol +} +zle -N vi-change-eol +bindkey -M vicmd "C" vi-change-eol + +### vi-change-whole-line (unbound) (S) (unbound) +### Kill the current line and enter insert mode. + +vi-change-whole-line() { + show_mode "$__string_insert" + builtin zle .vi-change-whole-line +} +zle -N vi-change-whole-line +bindkey -M vicmd "S" vi-change-whole-line + +### vi-insert (unbound) (i) (unbound) +### Enter insert mode. + +vi-insert() { + show_mode "$__string_insert" + builtin zle .vi-insert +} +zle -N vi-insert +bindkey -M vicmd "i" vi-insert + +### vi-insert-bol (unbound) (I) (unbound) +### Move to the first non-blank character on the line +### and enter insert mode. + +vi-insert-bol() { + show_mode "$__string_insert" + builtin zle .vi-insert-bol +} +zle -N vi-insert-bol +bindkey -M vicmd "I" vi-insert-bol + +### vi-open-line-above (unbound) (O) (unbound) +### Open a line above the cursor and enter insert mode. + +vi-open-line-above() { + show_mode "$__string_insert" + builtin zle .vi-open-line-above +} +zle -N vi-open-line-above +bindkey -M vicmd "O" vi-open-line-above + +### vi-open-line-below (unbound) (o) (unbound) +### Open a line below the cursor and enter insert mode. + +vi-open-line-below() { + show_mode "$__string_insert" + builtin zle .vi-open-line-below +} +zle -N vi-open-line-below +bindkey -M vicmd "o" vi-open-line-below + +### vi-substitute (unbound) (s) (unbound) +### Substitute the next character(s). + +vi-substitute() { + show_mode "$__string_insert" + builtin zle .vi-substitute +} +zle -N vi-substitute +bindkey -M vicmd "s" vi-substitute + + +### vi-replace (unbound) (R) (unbound) +### Enter overwrite mode. +### + +vi-replace() { + show_mode "$__string_replace" + builtin zle .vi-replace +} +zle -N vi-replace +bindkey -M vicmd "R" vi-replace + +### vi-cmd-mode (^X^V) (unbound) (^[) +### Enter command mode; that is, select the `vicmd' +### keymap. Yes, this is bound by default in emacs +### mode. + +vi-cmd-mode() { + show_mode "$__string_normal" + builtin zle .vi-cmd-mode +} +zle -N vi-cmd-mode +bindkey -M viins "" vi-cmd-mode + + +### vi-oper-swap-case +### Read a movement command from the keyboard, and swap +### the case of all characters from the cursor position +### to the endpoint of the movement. If the movement +### command is vi-oper-swap-case, swap the case of all +### characters on the current line. +### + +bindkey -M vicmd "g~" vi-oper-swap-case + + +bindkey -M vicmd "[2~" vi-insert +bindkey -M vicmd 'q' push-line +bindkey -M vicmd '[5~' history-beginning-search-backward # PgUp +bindkey -M vicmd '[6~' history-beginning-search-forward # PgDn + +bindkey -M viins '[5~' history-beginning-search-backward # PgUp +bindkey -M viins '[6~' history-beginning-search-forward # PgDn +bindkey -M viins '[7~' beginning-of-line +bindkey -M viins '[8~' end-of-line +bindkey -M viins '^A' beginning-of-line +bindkey -M viins '^E' end-of-line +bindkey -M viins '[3~' delete-char +bindkey -M viins '' up-line-or-history +bindkey -M viins '' down-line-or-history +bindkey -M viins '^Xc' copy-prev-word +bindkey -M viins '^Xf' _correct_filename +bindkey -M viins '^_' undo +bindkey -M viins '^K' vi-change-eol +bindkey -M viins '^R' history-incremental-search-backward +bindkey -M viins '^O' accept-line-and-down-history +bindkey -M viins '^T' transpose-chars +bindkey -M viins '^Xm' _most_recent_file + +bindkey -M viins -s '^X^H' 'hash -r\n' + + +if [[ -z ${TERM:#screen} ]]; then + bindkey -M viins '[1~' beginning-of-line # Home + bindkey -M viins '[4~' end-of-line # End +fi + +# Edit the command line using your usual editor. +autoload edit-command-line +zle -N edit-command-line +bindkey -M vicmd v edit-command-line + +export RPS1="$__string_insert"