How do I specify "the word under the cursor" on VIM's commandline?

VimCommand Line

Vim Problem Overview


I want to write a command that specifies "the word under the cursor" in VIM. For instance, let's say I have the cursor on a word and I make it appear twice. For instance, if the word is "abc" and I want "abcabc" then I could type:

:s/\(abc\)/\1\1/

But then I'd like to be able to move the cursor to "def" and use the same command to change it to "defdef":

:s/\(def\)/\1\1/

How can I write the command in the commandline so that it does this?

:s/\(*whatever is under the commandline*\)/\1\1

Vim Solutions


Solution 1 - Vim

While in command-line mode, CTRL+R CTRL+W will insert the word under the cursor.

See the help for c_CTRL-R for a listing of all the other special registers:

:help c_CTRL-R

Solution 2 - Vim

<cword> is the word under the cursor (:help <cword>).

Sorry, I should have been more complete in this answer.

You can nmap a command to it, or this series of keystrokes for the lazy will work:

b #go to beginning of current word
yw #yank to register

Then, when you are typing in your pattern you can hit <control-r>0<enter> which will paste in your command the contents of the 0-th register.

You can also make a command for this like:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

Which will map hitting '' and 'w' at the same time to replace your command line with

:s/\(<currentword>\)/

Solution 3 - Vim

yiwP

yiw: Yank inner word (the word under the cursor). This command also moves the cursor to the beginning of the word.

P: Paste before the cursor.

You can then map the e.g.: < ALT > - D to this command:

:nmap < ALT >-D yiwP

Solution 4 - Vim

Another easy way to do this is to use the * command.

In regular mode, when over a word, type

*:s//\0\0<Enter>

* makes the search pattern the current word (e.g. &lt;abc\>).

:s// does a substitution using the current search pattern, and \0 in the replacement section is the matched string.

You can then repeat this behaviour, say over word "def", by either typing the same again, or by typing

*@:

@: just repeats the last ex command, without a need for an <Enter>, in this case the substitution.

You can also record a quick macro to do this using the q command

qd*:s//\0\0<Enter>q

Then repeat it to your hearts content by typing

@d

when over a word you want to double. As this is only one character less than the prior solution, it may not be worth it to you - unless you will be doing other ex-commands between the word-doubling, which would change the behaviour of @:

Solution 5 - Vim

You need to escape the backslashes within the mapping. You can also include the substitution string within the mapping.

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

Solution 6 - Vim

ywPx

will do what you describe.

ywPxw

will also advance the cursor to the next word.

Solution 7 - Vim

@user11211 has the most straightforward way to duplicate the word under cursor:

yiwP

yank inner word (moves cursor to start of word), paste (before cursor).

eg. straigh[t]forward ----> straightforwar[d]straightforward

[] is cursor

To elaborate...

You probably want to have the cursor following your duplicated word:

yiwPea

straigh[t]forward ----> straightforwardstraightforward[]

NOTE:

yiw

is yank inner word (without whitespace)

yaw

is yank all word (including trailing whitespace).

yawPea

is therefore duplicate word including whitespace, and position cursor.

straigh[t]forward ----> straightforward straightforward[]

Solution 8 - Vim

" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNathan FellmanView Question on Stackoverflow
Solution 1 - VimCésar AlfordeView Answer on Stackoverflow
Solution 2 - VimhazzenView Answer on Stackoverflow
Solution 3 - Vimuser11211View Answer on Stackoverflow
Solution 4 - VimrampionView Answer on Stackoverflow
Solution 5 - VimDeanView Answer on Stackoverflow
Solution 6 - VimbmbView Answer on Stackoverflow
Solution 7 - VimBBW Before WindowsView Answer on Stackoverflow
Solution 8 - VimSergioAraujoView Answer on Stackoverflow