Thanks, Daniel! Peter сре, 23. сеп 2020. у 13:29 Daniel Shahaf је написао/ла: > Peter Slížik wrote on Wed, 23 Sep 2020 10:34 +0200: > > Hello, > > > > I'd like to replicate the functionality found in some text editors - > namely > > that if you press a single or double quote, the editor inserts two of > them > > and places the cursor inside the pair. > > > > With some necessary checks for word boundaries, etc. left out, the > solution > > looks rather trivial: > > > > function insert-single-quotes() { > > zle self-insert "''" # that's "_'_'_" > > zle backward-char > > } > > > > zle -N insert-single-quotes > > bindkey "'" insert-single-quotes # that's "_'_" > > > > However, this solution creates infinite recursion (a single quote bound > to > > insert a single quote). > > No, it doesn't. I tried in «zsh -f» and it inserts a single quote > without moving the cursor. > > It inserts _one_ quote, rather than two, because self-insert ignores > its positional arguments and the widget was bound to «'». > > > 1. How to prevent the recursion? > > Always open a new shell for testing. > > > Is self-insert the right widget for this task? > > You could also use «zle .self-insert», or even modify $LBUFFER and > $RBUFFER directly («LBUFFER+=\'; RBUFFER=\'$RBUFFER»). > > (Incidentally, I guess you may also want to check whether ${RBUFFER} > starts with a single quote, but that's no longer a zsh question but > a business logic question.) > > > 2. I played with zle -U. What are the use cases for zle self-insert and > zle > > -U? > > «zle -U foo» subjects the «f», «o», and «o» to bindkey mappings. For > instance, «bindkey -s x y» followed by «zle -U x» would insert «y». > > «self-insert» appends one character to the buffer. > > > 3. I tried to avoid the recursion by using "zle -K .safe -U text", but it > > ended with "too many arguments for -K". How is zle -K expected to be > used? > > As «zle -K foo» without further arguments. You can do something like this: > > { > readonly save_KEYMAP=$KEYMAP > zle -K .safe > ⋮ > } always { > zle -K $save_KEYMAP > } > > But see above about $LBUFFER. > > Cheers, > > Daniel >