Reply to message «CTRL-O in vi mode», sent 23:32:05 16 November 2010, Tuesday by Bernd Strohhaecker: > I'm using vi mode. Is it possible in viins mode to realize Vim's CTRL-O > command, e.g. execute one vicmd command and then return to viins mode? Of course, it is. I do use emacs mode but have lots of custom mappings and is one of them: function _-vi-digit-arg { emulate -LR zsh [[ -z "${NUMERIC}" ]] && NUMERIC=0 [[ -z "$1" ]] && num=0 || num=$(( $1 )) shift (( NUMERIC=NUMERIC*10+num )) && $@ } function _-repeat-for-key { emulate -LR zsh local key read -k key local -i OLDLLEN=${#LBUFFER} OLDRLEN=${#RBUFFER} local OLDLBUFFER="$LBUFFER" OLDRBUFFER="$RBUFFER" (( NUMERIC )) || NUMERIC=1 if ! [[ -z $2 ]] ; then eval $2 (( NUMERIC-- )) fi while (( NUMERIC )) ; do eval $1 (( NUMERIC-- )) done local -i LLEN=${#LBUFFER} RLEN=${#RBUFFER} if (( LLEN=##0 && key<=##9 )) then _-vi-digit-arg $(( key - ##0 )) _-vi-delete fi } function _-vi-ctrl-o { emulate -LR zsh local keystr read -k keystr local -r keystr local -ri key=$(( #keystr )) if (( key==##A )) ; then zle end-of-line elif (( key==##$ )) ; then zle end-of-line elif (( key==##I )) ; then zle vi-first-non-blank elif (( key==##d )) ; then _-vi-delete elif (( key==##0 )) && [[ -z $NUMERIC ]] ; then zle beginning-of-line elif (( key>=##0 && key<=##9 )) then _-vi-digit-arg $(( key - ##0 )) _-vi-ctrl-o #elif (( key==##s )) ; then zle sedsubstitute #elif (( key==##= )) ; then zle tailfor else zle ${${(z)$(bindkey -M vicmd $keystr)}[2]} fi } zle -N vi-ctrl-o _-vi-ctrl-o bindkey -N evi emacs bindkey -A evi main bindkey -rM evi "\C-o" bindkey -M evi "\C-o" "vi-ctrl-o"