What's the difference between :insert and :append? - vim

I'm looking for a vim command that pastes the code but disable the auto indent. So I find these commands, I can just use one command and paste, then enter the <Ctrl+C>, very easy.
However, I don't understand what's the difference between :insert and :append.
Do they really have the same behavior?

Behaviour of :insert and :append is not the same.
:insert
Insert text before the cursor
:append
Insert text after the cursor
From :h append
append({lnum}, {expr})
append()
When {expr} is a |List|: Append each item of the |List| as a
text line below line {lnum} in the current buffer.
Otherwise append {expr} as one text line below line {lnum} in
the current buffer.
{lnum} can be zero to insert a line before the first one.

Related

Commenting several lines in vim not working

All the instructions I see say pretty much the same thing here
What's a quick way to comment/uncomment lines in Vim?
First, go to the first line you want to comment, press CtrlV. This will put the editor in the VISUAL BLOCK mode.
Then using the arrow key and select until the last line
Now press ShiftI, which will put the editor in INSERT mode and then press #. This will add a hash to the first line.
Then press Esc (give it a second), and it will insert a # character on all other selected lines.
When I pretty shift+I, the multiple highlighting of lines disappears, and all that happens is that it goes into regular insert mode at the first line only. When I type something, it's only typed on the first line.
I feel that there is a step missing, but I can't figure out what.

In Vim, how do I make visual line selection for a block of code?

For example, in HTML I want to select an entire element. I could do Shift+V, and keep hitting J until I've selected all the lines, but that's cumbersome. Typing vat doesn't do what I want either -- it goes into visual mode, not visual line mode. The problem with not having visual line is that when I yank the text, its not yanking the first line's indentation.
You just do vat as usual, then press shift-v to have linewise selection.
First, you need to install matchit plugin, which provides extended functionality for %. Particularly it allows to jump between matching HTML tags using %.
After that, put cursor on opening HTML tag (on first letter of the tag, not < symbol) and press Shift + v, then %.
This will do line selection from the line you put cursor to the line containing the closing tag.

Paste to end of the file in VIM without moving cursor

In a text document, I'm [visually or otherwise] selecting several lines, cutting them with d... I'd like to paste these lines to the end of the file without moving the cursor. Is there a relatively simple way to do this?
Use the Implicit Mark from Last Jump
You can use the implicit mark (e.g. ') to return your cursor to the location it occupied just before the last jump. For example:
Gp''
This will (G)o to the end of the file, (p)aste the contents after the last line, and then return to your position at the time you typed G.
There are a few ways:
Marks
Set a mark, do your paste, then jump back to the mark
m':$pu<cr>``
Visual mode
Visually select your lines, copy them, append, and then restore visual selection (optionally delete)
y:$pu<cr>gv
Append to the file
Visually select your lines, use :w to append to the file, and then reload the file. (Note: will move the cursor to the start of the visually selected lines)
:w >><cr>:e!
Create your own command/mapping
You can create your own command and/or mapping that will use winsaveview() and winrestview() to append then restore the cursor.
You can define a mapping which marks the current location, pastes at the end of the buffer using :$put then returns to the original cursor location using the mark.
This works because :put allows a line number prefix (the last line being representable as $). From :help put:
:[line]pu[t] [x] Put the text [from register x]
This would map it to <leader>p:
:nnoremap <leader>p :mark '<cr>:$put<cr>`'
It sets the ' mark at the cursor, pastes at the end, then returns to the ' mark with `
Depends on how you mean "without moving the cursor".
This will paste at the bottom of the current file and then allow you to continue where you cut the lines from.
split window with :split
move to bottom with shift+g
paste with p
close the duplicate split view (zz or :q)
If you dont like the split view, you can use the ctrl+o to jump back after G
move to bottom with shift+g
paste with p
jump back with ctrl+o

How to highlight or mark a line in vim

We can highlight different marks in vim using mark.vim but, how can I highlight a line in Vim?
For example:
Line One
Line Two
Line Three
I let the cursor on line one, I highlight line one, the whole line is highlighted.
Then I type jj to move to line 3, the line one is highlighted too, but didn't disappear.
Use v to get into visual mode. <shift>v will highlight the entire line and <ctrl>v will take you into visual block mode so you can highlight columns.
If you're looking for the permanent highlighting of the current line, following along with the cursor, that's a built-in feature of Vim since version 7.0. To activate this, put the following into your ~/.vimrc:
set cursorline

Vim select the ends of multiple lines (block mode, but where the ending column varies)

Is there any way in vim that I can select the end of all these lines? (I'm only showing the end of the lines in these screenshots).
In block mode I can get them all if the bottom line is longer than the rest, but if the bottom line is shorter, the longer lines are truncated.
EDIT | I guess I can just pad out the bottom line with spaces before I select, then delete the spaces later.
Put your cursor on the top-left character you want to be part of the block.
Enter block selection mode with ctrl+v
Select to the end of the line with $ (this is the step you're missing; if you move to the end of the first line using $ then the selection will extend to the end of subsequent lines as well)
Move down 3 lines with 3j
There's more information in the Vim documentation's section on visual mode which you can read online, or just type :help v_$ in Vim.
Click somewhere (anywhere) in the first line you wish to append text to.
Press Control + V.
Press Down to create an arbitrary vertical block selection that spans the desired lines.
Press $ to expand the visual block selection to the ends of every line selected.
Press Shift + A to append text to every selected line.
Type the text you want to append.
Press Escape and the text will be appended across the selected lines.
Alternately, you can set the virtualedit (:h 'virtualedit') setting so that, any time you're in visual block mode, you can move the cursor around even past the ends of lines. E.g. :set virtualedit=block.
If you're looking to select the very last character of every line, like if you want to add something after the quotes at the end of each line, you can do the following:
Put your cursor over the very last character (in this example, the last quote on the first line)
Enter block mode: control + V
Move down to select as many lines as you want to change.
Insert at the end of the line: shift + A
Type what you want to add and then exit Visual mode
You text should now be inserted at the end of each selected line!
Hope this is helpful to others like me searching for an answer similar, but not exactly the same, as the above.
I don't know if is a new thing. But if you press $ two times (instead one) the block goes to the end of all lines without creating extra spaces).
Tested on nvim 0.7.2.

Resources