substitute() regex trim last newline from register ?

27 views
Skip to first unread message

M Kelly

unread,
Jan 15, 2020, 8:29:52 PM1/15/20
to vim_use
Hi,

In visual-line mode when I yank to the * register and then outside of vim paste - I am getting a newline at the end of the selection.
This does not happen in visual block or char mode.
Does anyone know of a way to load into * reg the same selection but have the last newline trimmed off ?
ie something like:
let @* = substitute(@a, "\(.*\)\\n/\1/", "", "")

thx for everything vim,
-m

Tony Mechelynck

unread,
Jan 15, 2020, 8:44:44 PM1/15/20
to vim_use
When yanking linewise, what you get is lines, and each of them has a
proper end-of-line. This way, when you paste it, it will be pasted
linewise, with line breaks between it and whatever happens before and
after it.

To yank without an end-of-line at the end, yank characterwise from the
first character of the first desired line (or from the first character
you want to yank even if it is in the middle of a line) to the last
character you want to yank. This way, if you paste in the middle of a
line, you won't get line breaks before and after the pasted text.

See also :help setreg()

Best regards,
Tony.

Tim Chase

unread,
Jan 15, 2020, 8:47:54 PM1/15/20
to M Kelly, vim...@googlegroups.com
Pretty sure you're 99% of the way there:

let @+ = substitute(@a, '\n\+$', '', '')

If you want all potential trailing whitespace (spaces, tabs, and
newlines)

let @+ = substitute(@a, '\_s\+$', '', '')

should do the trick.

-tim



M Kelly

unread,
Jan 15, 2020, 9:08:25 PM1/15/20
to vim_use
Tony, hi

ok, thanks.  I can use 0 v $ y.  But V y is handy/quick ...
Inside of vim its all great, V works perfectly - its just I wanted to automatically remove the last newline from "* if possible, 
so that a V y and then outside of vim paste doesn't have the extra newline.
I just wondered if I could regex trim the last newline of "* or of "a and put it into "*

thanks always for your help,
-m

M Kelly

unread,
Jan 15, 2020, 9:21:29 PM1/15/20
to vim_use
Tim, hi

ok, awesome.
I think this works now -

"aygv<Esc>:let @* = substitute(@a, "\\_s\\+$", "", "")<CR>

thx so much!
-m

Tim Chase

unread,
Jan 15, 2020, 9:39:13 PM1/15/20
to vim...@googlegroups.com
On 2020-01-15 18:08, M Kelly wrote:
> V y is handy/quick

Just in case you haven't encountered it, you can make that even
quicker by just using

Y

:-)

-tim


Tony Mechelynck

unread,
Jan 15, 2020, 11:53:24 PM1/15/20
to vim_use
On Thu, Jan 16, 2020 at 3:08 AM M Kelly <mckel...@gmail.com> wrote:
>
> Tony, hi
>
> ok, thanks. I can use 0 v $ y. But V y is handy/quick ...
> Inside of vim its all great, V works perfectly - its just I wanted to automatically remove the last newline from "* if possible,
> so that a V y and then outside of vim paste doesn't have the extra newline.
> I just wondered if I could regex trim the last newline of "* or of "a and put it into "*
>
> thanks always for your help,
> -m

What's wrong with
:call setreg('*', getreg('*'), 'c')
(see "see also" at he end of my previous message)?

Best regards,
Tony.
>
> On Wednesday, January 15, 2020 at 8:44:44 PM UTC-5, Tony Mechelynck wrote:
>>
>> On Thu, Jan 16, 2020 at 2:29 AM M Kelly <mckel...@gmail.com> wrote:
>> >
>> > Hi,
>> >
>> > In visual-line mode when I yank to the * register and then outside of vim paste - I am getting a newline at the end of the selection.
>> > This does not happen in visual block or char mode.
>> > Does anyone know of a way to load into * reg the same selection but have the last newline trimmed off ?
>> > ie something like:
>> > let @* = substitute(@a, "\(.*\)\\n/\1/", "", "")
>> >
>> > thx for everything vim,
>> > -m
>>
>> When yanking linewise, what you get is lines, and each of them has a
>> proper end-of-line. This way, when you paste it, it will be pasted
>> linewise, with line breaks between it and whatever happens before and
>> after it.
>>
>> To yank without an end-of-line at the end, yank characterwise from the
>> first character of the first desired line (or from the first character
>> you want to yank even if it is in the middle of a line) to the last
>> character you want to yank. This way, if you paste in the middle of a
>> line, you won't get line breaks before and after the pasted text.
>>
>> See also :help setreg()
>>
>> Best regards,
>> Tony.
>
> --
> --
> 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 the Google Groups "vim_use" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+u...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/vim_use/9b5f482a-1037-4c4d-8ed3-252cf2f2b501%40googlegroups.com.

M Kelly

unread,
Jan 18, 2020, 8:57:54 PM1/18/20
to vim_use
Tony, hi

I ended up using getregtype("*") along with the @*=substitute() to get a perfect solution for my use.
Thank you again for this info.

take care,
-m
> To unsubscribe from this group and stop receiving emails from it, send an email to vim...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages