Vim Tips Wiki
Advertisement
Tip 344 Printable Monobook Previous Next

created October 15, 2002 · complexity basic · author Kdr · version 5.7


If you ever need to cut / copy / delete / paste lines without knowing the actual number of lines, here is what you should do.

  1. In normal mode, go to the beginning of the first mark (let's say line 50).
  2. Type mk
  3. Go to the end of your selection (let's say line 100), using j or Ctrl-F or anything. You don't need to count the lines.
  4. Type: "ay'k (double quotes, <register name from a-z>, <y-yank or d-delete>, single quote, k
  5. The above command copies those lines into register a.
  6. If you do "ad'k it will delete them from the current location and copy them into register a.
  7. You can paste those lines wherever you want with "ap

Comments

Be sure to check out visual mode. V will allow to select a range of lines, which you can then "ay, etc. This is one of the coolest features of vim.


A related thought:
I like to think of " as into and ' as till.
So, something like "ay'k can be thought of as "into a yank till k"


I normally don't count the lines, but use a range using line numbers like ".,100y" ('.' means line number at cursorpos). The range can be relative (".,+5"), of course you know the number of lines then. So I don't have to move the cursor around just for yanking and put it again to the position whre I want to drop the lines.

Visual marking with the mouse is a powerful alternative, because you don' have to copy/delete complete lines. You also can visually mark rectangle blocks of text by pressing <CTRL-V> in visual mode.

Remember: Vim automatically copies the visually marked text, so you can simply drop it by clicking the middle mouse button at cursor position without using named registers.


Vim doesn't automatically copy the selected text unless 'clipboard' and 'guioptions' settings have specific values. (I believe they are autoselect and a, respectively.)


:help 'guioptions' Only 'a' needs to be added. My guioptions is 'gmrLtTa', clipboard is empty.


Other good way is use / to find the place to which delete/copy, e.g., d/This sentence should be left<CR>. For smaller deletes, dt<letter> and df<letter> are also useful.


An easier-to-remember way:
Forget about registers. Go to desired start line, hit ma ("mark this line as 'a'"), then go to desired end line, and hit y'a or d'a ("yank or delete to the line marked 'a'"). Paste using p.

A character-level way: (not line-level)
Go to desired start character, hit ma (same as above), then go to desired end character (can be in a different line), and hit y`a or d`a (notice that it's the "tick", not the "apostrophe"). Paste using p.


Go to the start of the block and mark it as mx then go to the end of block and mark it as my.

Do `x (move to start of block), then do y`y (copy the block) or d`y (delete the block).


Cool story bros, but emacs is way easier... C-<SPC> to set mark, move to end of region, C-w to kill region, C-y to yank region back.

Advertisement