How can I do a 'change word' in Vim using the current paste buffer?
Option 1
You could use registers to do it and make a keybinding for the process.
Yank the word you want to replace with yw.
The yanked word is in the 0
register which you can see by issuing :registers
.
Go to the word you want to replace and do cw. Do Ctrl+r followed by 0 to paste the 0
register.
The map for that would look something like this (assuming Ctrl+j as our key combo):
:map <C-j> cw<C-r>0<ESC>
Option 2 (simpler)
With your word yanked, cursor over the word you want to replace and do viwp. Which is visual select inner word and paste.
Courtesy of @tlo in the comments: you could also just do vep. One char shorter. Downside have to position cursor at start of word and (as with mine) changes the buffer.
Comment (from Michael):
This is good. Extra note: the second method is indeed easier but, as is, only works for ONE substitution because after each substitution the buffer then gets changed to the field that was replaced (old text). The first method is a little harder to use BUT has the advantage that the buffer 0 stays 'as is' so you can use that method to do more than 1 replacement of the same text.
The Vim way is to learn how to intentionally use the yank, delete and other registers. Once you know these, you will easily find your own key sequences to do this.
Register "0
is the yank register. Anything you yank will be put here, but neither deletes or change removals will ever touch register "0
.
So, in your example, you had just yanked a word. To replace a word with what you just yanked, you take advantage of deletions never touching the yank register. So move to the target word, delete it with dw
, then paste from your yank register with "0p
or better yet, cw
then ^R0
(which is repeatable).
The flip side to the yank register is the small deletions register "-
. Any small delete or change removal is put here, but yanks never touch "-
. A deletion counts as small if it is less than a full line.
Registers "1
-"9
are the large delete history registers. With "1
containing the latest large deletion or change removal, and "9
containing the oldest large deletion or change removal. Only deletes that aren't small, i.e. deletes of one full line or more, get pushed onto "1
-"9
.
For any operation that changes a register, a copy is also always placed in the default, a.k.a. unnamed register ""
. This is the register used when you don't explicitly name a register.
Register "_
is the black hole register, and it is always empty. If you delete to it, nothing in any register is changed at all, not even the default ""
register or the black hole register itself. The removed text is fully gone, apart from your undo history. Yanking to or pasting from the black hole register does essentially nothing.
The black hole register "_
lets you do things like first one small deletion, then a number of other deletions into "_
without changing your small deletions register "-
, then paste your first small deletion.
You are probably already familiar with the normal named registers, they are simply registers "a
-"z
, and you can use them as scratch space at will. If you refer to a named register by its capital form, "A
-"Z
, you will append to it rather than replace its contents.
Other registers are the last inserted register ".
, the filename registers "%
and "#
, the command register ":
, search register "/
and expression register "=
.
You can get a list of all these registers as well as their contents with the command :register
. Because it shows the current contents of the registers, the command is very useful to experiment with and learn what ends up where.
yw
to yank your word, then move the cursor to the word you wish to replace and use "_dw
to delete it, sending the text to the null register (so it doesn't overwrite the contents of the "
register, where yanked/cut text goes by default), and then simply paste with p
.
You could use the following mapping to make things a little easier:
nnoremap <leader>d "_d
...so in normal mode, you could use \dw
to delete a word, without affecting the "
register.