map with empty yank

18 views
Skip to first unread message

Carlos Pita

unread,
Jan 28, 2014, 2:36:49 PM1/28/14
to vim...@googlegroups.com
Hi all,

I would like to yank the inner contents of <...> or (...) expressions in a mapping. In normal mode I can try with the two-yank sequence yi<yi(. One of the yanks will be empty and the other will match the desired contents. The net effect is to match the contents no matter they were inside () or <>. Now if I put that in a map it seems to abort when the first yank fails, so it only matches the contents for <...> expressions (because yi< is the first probed yank). If I put :normal yi<<CR>:normal yi( instead, the mapping works the same than when I manually type it in normal mode. The E flag is not included in my cpoptions.

Could someone clarify this behavior, please?

Best regards
--
Carlos

Carlos Pita

unread,
Jan 28, 2014, 2:39:55 PM1/28/14
to vim...@googlegroups.com
PD: I'm assuming <...> and (...) expressions are not nested, of course.

Christian Brabandt

unread,
Jan 28, 2014, 3:06:00 PM1/28/14
to vim...@googlegroups.com
Hi Carlos!
That is explained (although only briefly) at :h map-error

I am not sure, there is an easy way to achieve what you want. I think,
something like this could work:

fu! MapAngle()
if searchpairpos('<', '', '>', 'bn') ==# [0,0]
return "i("
else
return "i<"
endif
endfu

omap <expr> i_ MapAngle()


Best,
Christian
--
"But Huey, you PROMISED!"
"Tell 'em I lied."

Carlos Pita

unread,
Jan 28, 2014, 3:15:42 PM1/28/14
to vim...@googlegroups.com
Hi Christian,

thanks for your prompt reply! It's still not clear to me whether
yanking a non-existent text object always raises an error or not.
cpoptions E seems to apply to y<motion> but it's not clearly stated
(at least, I can't find that statement) what happens with y<object>.

There is an easy workaround that I mentioned before: :norm
yi<<CR>:norm yi(<CR>. It's somewhat hackish but it's concise. It
should be noticed that :norm yi<yi( also fails. This last observation
reinforces the "y<object> always raises an error for non-matched
objects" theory.

Best regards
--
Carlos
> --
> --
> You received this message from the "vim_use" maillist.
> Do not top-post! Type your reply below the text you are replying to.
> For more information, visit http://www.vim.org/maillist.php
>
> ---
> You received this message because you are subscribed to a topic in the Google Groups "vim_use" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/topic/vim_use/nBBm61o00pI/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to vim_use+u...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.

Christian Brabandt

unread,
Jan 28, 2014, 3:41:39 PM1/28/14
to vim...@googlegroups.com

On Di, 28 Jan 2014, Carlos Pita wrote:
> thanks for your prompt reply! It's still not clear to me whether
> yanking a non-existent text object always raises an error or not.
> cpoptions E seems to apply to y<motion> but it's not clearly stated
> (at least, I can't find that statement) what happens with y<object>.

I think, there is no such thing as an empty text object. If the text
object isn't valid, Vim raises an error and this also happens in normal
mode (you can see, by :set visualbell and see how the terminal flashes
when doing yi< and the cursor not being within a <> pair.

This errors causes, that your mapping will be aborted.

Best,
Christian
--
I disagree with what you say, but will defend to the death your right to
tell such LIES!

Carlos Pita

unread,
Jan 28, 2014, 3:47:01 PM1/28/14
to vim...@googlegroups.com
For future reference, I'm quoting here what a guy in stackoverflow suggested:

Note that the semantics of :normal changes when it is contained in a
try...catch loop, or executed through :silent!: Without it, execution
of the command sequence aborts when an error is encountered; the rest
of the sequence is discarded (like in a macro). With it, all commands
execute, even if an error occurs.

Therefore, you can get the desired behavior with

:silent! normal! yi<yi(

Seems a bit cleaner to me than calling :normal twice.

Regards (and thank you again, Christian)
--
Carlos

ZyX

unread,
Jan 28, 2014, 3:59:51 PM1/28/14
to vim...@googlegroups.com
On Wednesday, January 29, 2014 12:47:01 AM UTC+4, Carlos Pita wrote:
> For future reference, I'm quoting here what a guy in stackoverflow suggested:
>
>
> Note that the semantics of :normal changes when it is contained in a
> try...catch loop, or executed through :silent!: Without it, execution
> of the command sequence aborts when an error is encountered; the rest
> of the sequence is discarded (like in a macro). With it, all commands
> execute, even if an error occurs.
>
> Therefore, you can get the desired behavior with
>
> :silent! normal! yi<yi(
>
> Seems a bit cleaner to me than calling :normal twice.

If this works inside `:try` then it is a bug. Though I am unable to reproduce it. `:silent!` variant is documented.

Reply all
Reply to author
Forward
0 new messages