I know how to select everything within () with "vi("
but how to select only one word like when I double-clic a word in VSCode and just copy it to clipboard ?
If the cursor is at begin of the word: ye or ve<esc>
If the cursor is within the word: yiw or viw<esc>
Do :help i( and scroll around. :help motion.txt will blow your mind.
Related
My mswin.vim contains the following command for Ctrl-A
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
This command correctly selects all lines in the file but also makes the cursor jump to the end of the file (undesired side effect). Is there a way to "select all" without moving the cursor?
Thanks in advance for any help or suggestion.
I am afraid that this cannot be achieved. Since in visual selection mode, the cursor will be either at the beginning or end of the visual range. Any motion in visual mode will lead to the visual selected range changes ( depends on the visual mode: char/line/block-wise).
The point is, what do you want to do after select-all and kept the cursor position? It may be a X->Y problem, just tell us what is your final goal. There could be better solution for it.
Btw, C-A is so useful to increment numbers, maybe you want to reconsider the map trigger?
The simplest and fastest way is to use: : % y + and then go over to Google Docs (or wherever) and paste.
You might take a look at getpos setpos - maybe you can wrap what you want in something like this:
function! TestFunc()
let save_cursor = getpos(".")
normal ggVG
" -- do something
call setpos('.', save_cursor)
endfunction
In vim you can do this by going to the text you want to delete. Instead of typing I for insert type v starting from the text you want to delete. Next, you can arrow down to where you want to delete the text, then press v again. You now have selected the text range you want to get rid of. next press I and backspace.
source https://www.cs.swarthmore.edu/oldhelp/vim/selection.html
Is there a motion for moving to the start or end of a visual selection?
I know that o while in visual mode alternates between the two, but I need to be able to select precisely the start.
The overall goal is to surround a visually selected area with parentheses.
Follow-Up:
Based on the comments, I was able to implement this using the following macro. The idea is to:
Esc to exit visual mode;
`> to go to the end of the previous visual selection;
a) to append a closing parentheses;
Esc to exit insert mode;
`< to go to the start of the previous visual selection;
i( to insert an opening parentheses;
Esc to exit insert mode again.
For example:
map \q <ESC>`>a)<ESC>`<i(<ESC>
Based on another comment, we have an even more concise solution:
map \q c()<ESC>P
There are two relevant built-in marks holding the positions of the first
and last characters of the last visual selection in the current buffer.
In order to move the cursor to these marks, use the commands `<
and `>, respectively (see :help `> and :help `<).
While you are in Visual Selection click o. It will change position of cursor to other end of selection. Then O to jump back.
The easiest way to "surround a visually selected area with parentheses" is:
change the visually selected area to () and Put it back in the middle: c()<ESC>P
I suggest defining in the .vimrc file a new visual-mode command (e.g., \q) with that:
:vmap \q c()<ESC>P
This approach also works with visual rectangular areas (<C-V>): it
puts ( and ) around each block-line.
if you just want to surround a visual selection there has already work been done, namely by tim pope, who wrote this plugin called surround. It surrounds words or visual selection with delimiters of your liking.
select your visual selection, say i like vim hit S) to get (i like vim) or S( to get ( i like vim ), to change this to [i like vim] type cs] (change surrounding) and to delete ds] to get i like vim at last.
If you can't use Surrond.vim, here is one way to do it:
Do your visual selection with v or V.
Get out of it with <Esc>.
Type `>a)<Esc> to insert a closing parenthesis after the last character of the selection.
Type `<i(<Esc> to insert an open parenthesis before the first character of the selection.
Each time i copy a word and want to replace it for several words, i do:
yank the word
enter visual mode, select the word to be replaced and paste the yanked word.
After this process, the replaced word will be yanked and cannot continue replacing new words bceause i lost the first yanked word. So, i must copy again the first yanked word.
Could anybody guide to me on how to achieve my goal in an efficient way? It could be enough if my yanked word would not get changed.
I would suggest explicitly using a register for your yank and paste.
"ayw or however you chose to yank your word.
"ap to paste.
In this case I've used the a register but you could use whichever suits you.
It has been answered before: Vim: how to paste over without overwriting register.
Overall, crude vnoremap p "_dP mapping will almost get you there, but it won't work well in a few edge cases (e.g. if a word you're replacing is at the end of the line).
The superior approach is to use this crazy-looking snippet (I wish I knew Vimscript at least half as good as the author of this):
" replace visual selection without overwriting default register
function! RestoreRegister()
let #" = s:restore_reg
return ''
endfunction
function! s:Repl()
let s:restore_reg = #"
return "p#=RestoreRegister()\<cr>"
endfunction
vnoremap <silent> <expr> p <sid>Repl()
Personally, I'd favour doing :s/word/replacement words/gc.
Alternatively, you could use "_de to delete the word to be replaced. "_ says use the "black hole" buffer to prevent losing the existing default buffer contents.
Perhaps a bit better than this is to yank the replacement words into an alternative named buffer (e.g. "a3ye), then you can delete the work to be replaced (de) and paste the named buffer "ap.
One addition to #Randy Morris answer: instead of specifying register explicitly in both cases, you can specify it only in the second one, see :h quote0 («Numbered register 0 contains the text from the most recent yank command...»). In this case using a register is better (as it is much easier to type), but if you say you are replacing words, you may want to use ciw<C-r>0 and then one . for each other word you want to replace.
I use this mapping to replace the currently selected text with default register without yanking it:
vnoremap <leader>p "_dP
I dont use yank, but ciw and then repeat with .
For instance:
Go to somewhere inside the word you want to replace.
Do ciw <type new word> Esc
Go to somewhere inside the next word you want to replace.
Press . to repeat the last replace.
Advanced:
You can also first find the word with /<word> and then use ciw <new word>.
Then you dont have to move to the word yourself before pressing . but you can just use n to go to the next (or N to go to the previous).
In vim, if I have the following text:
hello there
Say I search for hell in the text above.
/hell
and press n to move to the next instance.
hello
hell is now highlighted in vim and my cursor is on the 'h'.
What is the most efficient way to now yank/delete that highlighted text.
Is there a way to 'yank to the end of the highlighted text'?
Or 'create visual block from highlighted text'?
I know I can use %s/hell/whatever/gc to step through as an alternative.
TIA Tom
y//e, or d//e should do the trick.
:let #" = #/ as well, even if you have moved the cursor.
I don't know of a built in mapping (Edit: but see Luc Hermitte's answer below as that's a much better solution than my bodges End Edit), but you could do the yank or select with a couple of mappings:
nmap ,y y/<C-R>/\zs<CR>
nmap ,v v/<C-R>/<BS>\zs<CR>
The ,y mapping uses the '/' register to pull in the last search term search, adds \zs to make the search point be the end and the yank proceeds up to that point. The ,v mapping does a visual selection, but has to delete the last character of the search (with <BS>) to make it end at the right place.
For what it's worth, you can simplify the %s/hell/whatever/gc that you suggested by refining your search with / and then using a shortened form:
/hell
:%s//whatever/gc
This is because :s uses the last search term by default.
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
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
<cword> is the word under the cursor (:help <cword>).
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>\)/
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
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. \<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 #:
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>
ywPx
will do what you describe.
ywPxw
will also advance the cursor to the next word.
#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[]
" count word (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>