zshrc.d/60-vi-showmode.zrc
changeset 0 7215ca490221
child 8 3f68f355bf1a
--- /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"