Sixtyfive
Sixtyfive

Reputation: 1496

Vim: same change to all line-endings of selected lines?

In https://stackoverflow.com/a/11790464/5354137, there is a very detailed description how to, e.g. perform the same insert to the beginnings of all selected lines by placing the cursor over the first character of the first line, then after <C-v> moving down, then Isomething<Esc><down> inserting something everywhere.

But how does one do the same thing in the case of lines of unequal length, such as:

'Lorem ipsum
'dolor sit amet,
'consectetur adipiscing elit,
'sed do...

to their respective line endings? E.g. if I wanted to insert ', after m, ,, , and ., how would I do that without resorting to :substitute? (Or to a plugin, just using original vim-fu...)

Upvotes: 0

Views: 345

Answers (3)

Friedrich
Friedrich

Reputation: 4846

Substitute (original answer)

The easiest way to do it is with the :substitute command. Select the lines in visual mode and then do:

:'<,'>s/$/',/<CR>

The $ stands for the end of the line. Note that vim will already write the :'<,'> part, so you only have to type from there.

Using a macro

With the question having been updated and :substitute off the table, I'd suggest recording a macro. Place the cursor on the line with "Lorm ipsum" and do:

qaA',<Esc>jq

then call the macro three times for the remaining lines. Either by hitting @ a lot:

@a@@@@

or with the more elegant

3@a

Using a recursive macro

As commented by @AndR, it's possible to record a macro that calls itself which will run until it reaches the end of the buffer:

qaqqaA',<Esc>j@aq

Note that the macro already calls itself with @a.

Afterwards, call @a and single quotes will be appended to every line until the end of the buffer.

Without visual selection

Both @AndR's answer using :normal and my :substitute answer above rely on a visual selection of the lines to modify. It is possible without that by typing in a range or line numbers. For "Lorem ipsum..." on lines 1 through 4, type either of the two commands:

:1,4s/$/',/
:1,4norm A',

This has the benefit that it works without a visual selection and from anywhere in the buffer.

Upvotes: 4

Rocco
Rocco

Reputation: 491

Based on your reference link and reproduction steps, this is your problem halfway:

But how does one do the same thing in the case of lines of unequal length ...

Follow the link and use the first method Using only visual-block mode, let's start with step 5:

  1. Select any column, hit <C-v> to enter visual-block mode and expand your selection toward the bottom:

    'Lo[r]em ipsum
    'do[l]or sit amet,
    'co[n]sectetur adipiscing elit,
    'se[d] do...
    
  2. Hit $ or <End> (see :help $), will get the selection like this:

    'Lo[rem ipsum]
    'do[lor sit amet,]
    'co[nsectetur adipiscing elit,]
    'se[d do...]
    
  3. Hit A',<Esc> to achieve your goal:

    'Lorem ipsum',
    'dolor sit amet,',
    'consectetur adipiscing elit,',
    'sed do...',
    

Note and supplement:

If you use the latest Vim9 and your virtualedit option contains block, when you hit $ or <End>, you may see this selection (Vim8 won't):

'Lo[rem ipsum                  ]
'do[lor sit amet,              ]
'co[nsectetur adipiscing elit, ]
'se[d do...                    ]

This could be a issue with the VIM9 or an intentional design? I don't know, but don't care, just press A. You'll see your cursor at the end of the first line, which is fine (| is the cursor position):

'Lorem ipsum|
'dolor sit amet,
'consectetur adipiscing elit,
'sed do...

Then you enter the text you need (e.g. ',) and <Esc> ends editing, it works fine:

'Lorem ipsum',
'dolor sit amet,',
'consectetur adipiscing elit,',
'sed do...',

As a supplement, oppositely, if you want to insert text in the same column where has no text when there are irregular endings : You can add block to your virtualedit option (see :h 'virtualedit'), using other left-right-motions (e.g. l or |) instead of $ to get this selection:

'Lo[rem ipsum                  ]
'do[lor sit amet,              ]
'co[nsectetur adipiscing elit, ]
'se[d do...                    ]

When you press A, the cursor will be at (| is the cursor position):

'Lorem ipsum                  |
'dolor sit amet,              
'consectetur adipiscing elit, 
'sed do...                    

Then enter the text you want (e.g. ',), hit <Esc> to obtain:

'Lorem ipsum                  ',
'dolor sit amet,              ',
'consectetur adipiscing elit, ',
'sed do...                    ',

Upvotes: 2

And R
And R

Reputation: 512

Here the goal can be achieved by appending ' at the end of each line. In one line you'd normally do A'. In order to do this this in each line of the visual selection, run

:<,>norm A'

Assuming that you have selected the needed lines visually (with v or V).

See :h :normal for details.

Upvotes: 1

Related Questions