Bring the word under the cursor on the :ex line in Vim

:<C-R><C-W>
Very handy to bring the word currently under the cursor into a :s command in Vim. Example: If the cursor was on the word "eggs": :s/ ==> :s/eggs

34
By: pyrho
2009-04-08 21:25:06
vim

These Might Interest You

  • In edit mode, toggle the case of a single word under the cursor in vim.


    5
    g~w
    bigeasy · 2009-07-25 07:13:40 1
  • Basic search and replaceEdit The :substitute command searches for a text pattern, and replaces it with a text string. There are many options, but these are what you probably want: :%s/foo/bar/g Find each occurrence of 'foo', and replace it with 'bar'. :%s/foo/bar/gc Change each 'foo' to 'bar', but ask for confirmation first. :%s/\/bar/gc Change only whole words exactly matching 'foo' to 'bar'; ask for confirmation. :%s/foo/bar/gci Change each 'foo' (case insensitive) to 'bar'; ask for confirmation. :%s/foo/bar/gcI Change each 'foo' (case sensitive) to 'bar'; ask for confirmation. The g flag means global ? each occurrence in the line is changed, rather than just the first. DetailsEdit Search range: :s/foo/bar/g Change each 'foo' to 'bar' in the current line. :%s/foo/bar/g Change each 'foo' to 'bar' in all lines. :5,12s/foo/bar/g Change each 'foo' to 'bar' for all lines from line 5 to line 12 inclusive. :'a,'bs/foo/bar/g Change each 'foo' to 'bar' for all lines from mark a to mark b inclusive. :.,$s/foo/bar/g Change each 'foo' to 'bar' for all lines from the current line (.) to the last line ($) inclusive. :.,+2s/foo/bar/g Change each 'foo' to 'bar' for the current line (.) and the two next lines (+2). :%s/foo/bar/g Equivalent to :1,$s/foo/bar/g (change all lines). :g/^baz/s/foo/bar/g Change each 'foo' to 'bar' in each line starting with 'baz'. When searching: ., *, \, [, ], ^, and $ are metacharacters. +, ?, |, {, }, (, and ) must be escaped to use their special function. \/ is / (use backslash + forward slash to search for forward slash) \t is tab, \s is whitespace \n is newline, \r is CR (carriage return = Ctrl-M = ^M) \{#\} is used for repetition. /foo.\{2\} will match foo and the two following characters. The \ is not required on the closing } so /foo.\{2} will do the same thing. \(foo\) makes a backreference to foo. Parenthesis without escapes are literally matched. Here the \ is required for the closing \). When replacing: \r is newline, \n is a null byte (0x00). \& is ampersand (& is the text that matches the search pattern). \1 inserts the text of the first backreference. \2 inserts the second backreference, and so on. You can use other delimiters with substitute: :s#http://www.example.com/index.html#http://example.com/# Save typing by using \zs and \ze to set the start and end of a pattern. For example, instead of: :s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ Use: :s/Copyright \zs2007\ze All Rights Reserved/2008/ Using the current word or registersEdit :%s//bar/g Replace each match of the last search pattern with 'bar'. For example, you might first place the cursor on the word foo then press * to search for that word. The above substitute would then change all words exactly matching 'foo' to 'bar'. :%s/foo//g Replace each occurrence of 'foo' with the word under the cursor. means that you press Ctrl-R then Ctrl-W. The word under the cursor will be inserted as though you typed it. :%s/foo//g Replace each occurrence of 'foo' with the WORD under the cursor (delimited by whitespace). means that you press Ctrl-R then Ctrl-A. The WORD under the cursor will be inserted as though you typed it. :%s/foo/a/g Replace each occurrence of 'foo' with the contents of register 'a'. a means that you press Ctrl-R then a. The contents of register 'a' will be inserted as though you typed it. :%s/foo/\=@a/g Replace each occurrence of 'foo' with the contents of register 'a'. \=@a is a reference to register 'a'. The contents of register 'a' is not shown in the command. This is useful if the register contains many lines of text. :%s////g Replace each match of the last search pattern with the / register (the last search pattern). After pressing Ctrl-R then / to insert the last search pattern (and before pressing Enter to perform the command), you could edit the text to make any required change. :%s/*/bar/g Replace all occurrences of the text in the system clipboard (in the * register) with 'bar' (see next example if multiline). On some systems, selecting text (in Vim or another application) is all that is required to place that text in the * register. :%s/a/bar/g Replace all occurrences of the text in register 'a' with 'bar'. a means that you press Ctrl-R then a. The contents of register 'a' will be inserted as though you typed it. Any newlines in register 'a' are inserted as ^M and are not found. The search works if each ^M is manually replaced with '\n' (two characters: backslash, 'n'). This replacement can be performed while you type the command: :%s/=substitute(@a,"\n",'\\n','g')/bar/g The "\n" (double quotes) represents the single character newline; the '\\n' (single quotes) represents two backslashes followed by 'n'. The substitute() function is evaluated by the = (Ctrl-R =) expression register; it replaces each newline with a single backslash followed by 'n'. The indicates that you press Enter to finish the = expression. See Paste registers in search or colon commands instead of using the clipboard. Additional examplesEdit :%s/foo/bar/ On each line, replace the first occurrence of "foo" with "bar". :%s/.*\zsfoo/bar/ On each line, replace the last occurrence of "foo" with "bar". :%s/\.*// On each line, delete the whole word "foo" and all following text (to end of line). :%s/\.\{5}// On each line, delete the whole word "foo" and the following five characters. :%s/\\zs.*// On each line, delete all text following the whole word "foo" (to end of line). :%s/.*\// On each line, delete the whole word "foo" and all preceding text (from beginning of line). :%s/.*\ze\// On each line, delete all the text preceding the whole word "foo" (from beginning of line). :%s/.*\(\\).*/\1/ On each line, delete all the text preceding and following the whole word "foo". Special casesEdit For substituting patterns with a corresponding case-sensitive text, Michael Geddes's keepcase plugin can be used, e.g.: :%SubstituteCase/\cHello/goodBye/g Substitute 'Hello hello helLo HELLO' by 'Goodbye goodbye goodBye GOODBYE' For changing the offsets in a patch file (line number of a block), this little snippet can be used: s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g Useful when we want to strip some blocks from a patch, without patch having to complain about offset differences. Note Should try to make the expression more compact, but don't know how without having the possibility of modifying unwanted lines.


    -2
    :%s/foo/bar/g
    anhstar · 2011-08-19 14:50:28 1
  • Here's the other way of doing it in vim: setting a recursive macro. 'gg' brings you to the top of the buffer, 'qqq' clears the 'q' macro, 'qq' starts recording a macro called 'q', '/^$' moves the cursor to the next empty line, 'dd' deletes the line that the cursor is on, '@q' calls the 'q' macro (currently empty because of 'qqq'), and 'q' stops recording the macro. '@q' calls the macro. It will run until it cannot find another blank line, at which point it will throw up an error and cease. While this is longer than the regex, you can use it without having to move your thoughts from 'vim-mode' to 'regex-mode'.


    -2
    ggqqqqq/^$dd@qq@q
    evilsoup · 2013-08-16 20:37:44 0
  • Pressing Ctrl combined with 'a' will move the cursor to the beginning of the command under bash (other shells?). I used to do this after arrowing up for the last command, then typing 'sudo ' to run the last command as root, but of course the all time greatest command here `sudo !!` is more succinct. Still Ctrl+A can be very useful when you want to edit something at/close to the beginning of the command line.


    4
    Ctrl+a
    jemptymethod · 2010-10-11 16:02:57 3

What Others Think

As a long time vim user, I'm always delighted to find a new gem like this one. Thank you.
flatcap · 479 weeks and 6 days ago
Great - i've always wanted such a shortcut - plus 1 from me. Cheers!
zwergnase · 479 weeks and 5 days ago
Thank, this is very useful. I checked some other variants by :help Like :/ which is for inserting the last search pattern
Vereb · 458 weeks and 3 days ago
This is excellent! I've been yanking a word/phrase and using 0 (zero) to put it into the :ex line. Thanks!
cometsong · 195 weeks and 4 days ago

What do you think?

Any thoughts on this command? Does it work on your machine? Can you do the same thing with only 14 characters?

You must be signed in to comment.

What's this?

commandlinefu.com is the place to record those command-line gems that you return to again and again. That way others can gain from your CLI wisdom and you from theirs too. All commands can be commented on, discussed and voted up or down.

Share Your Commands



Stay in the loop…

Follow the Tweets.

Every new command is wrapped in a tweet and posted to Twitter. Following the stream is a great way of staying abreast of the latest commands. For the more discerning, there are Twitter accounts for commands that get a minimum of 3 and 10 votes - that way only the great commands get tweeted.

» http://twitter.com/commandlinefu
» http://twitter.com/commandlinefu3
» http://twitter.com/commandlinefu10

Subscribe to the feeds.

Use your favourite RSS aggregator to stay in touch with the latest commands. There are feeds mirroring the 3 Twitter streams as well as for virtually every other subset (users, tags, functions,…):

Subscribe to the feed for: