Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: wanted: viins-mode and digit argument with a,i,A and such



> hi all!
> 
> when i use bindkey -e, i can insert one character 10 times with
> ESC 10 <character>.
> 
> With vi one normally uses something like 10i<character>.
> This is not possible with ZSH ( bindkey -v set ).
> One real advantage of bindkey -e here.
> Has someone thought about inventing something like it?

If you are using 3.1, try a widget like

read-and-insert-char () {
  local char i bound
  read -k char
  # Use padding trickery to add character multiple times.
  # Expands to something like ${(l.10..j.):-}
  # which means pad to ten characters using the fill character j, but
  # with no parameter, so we end up with pure padding.
  if [[ $char = . ]]; then bound=:; else bound=.; fi
  eval LBUFFER="\"\${LBUFFER}\${(l.${NUMERIC:-1}.${bound}$char${bound}):-}\""
}
zle -N read-and-insert-char
bindkey -M vicmd '^xi' read-and-insert-char

Go to vi command mode, type a number, the key sequence bound to the widget,
then a character, and it will be inserted that many times.

If you want to insert a longer string that many times, you will need to
expand the `read -k char' to a loop which reads a lot of characters until
you get an escape.  (It would be nice to have a minibuffer read for this
sort of thing.)  Then you will need to turn the bit which adds to LBUFFER
into a proper loop --- straightforward, I just couldn't be bothered to do
it the long-winded way.

-- 
Peter Stephenson <pws@xxxxxxxxxxxxxxxxxxxxxxxxx>
Cambridge Silicon Radio, Unit 300, Science Park, Milton Road,
Cambridge, CB4 0XL, UK                          Tel: +44 (0)1223 392070



Messages sorted by: Reverse Date, Date, Thread, Author