I forgot the key combination for this functionality and I tried to search a bit unfortunately to no avail.
I think it was actually a super simple combination of control or shift with a letter key. The next input in the editor will show the received key.
In command-line mode and insert mode, Ctrl-V is used to insert the next non-numeric keypress literally (i.e. not as a Vim movement or mapping, for example), or to enter a character by its numerical value. E.g.
Ctrl-VEnter will input a CR character (which Vim typically displays as ^M)
Ctrl-VTab will input a Tab character, even if the expandtabs option is set
Ctrl-VRight will input the text <Right>, since there is no one character associated with the right arrow key
Ctrl-V065 will input A, whose ASCII value is 65
Ctrl-VU1F4A9 will insert a poop emoji after you have typed a non-hex-digit
More info at :help i_CTRL-V, :help i_CTRL-V_digit, and equivalent command-line mode topic :help c_CTRL-V.
So, let's imagine I have this code:
print $this_one = "1";
print $this_tu = "2";
print $this_three = "3";
and I want to select the middle part using the visual block mode:
$this_one
$this_tu
$this_three
and perhaps append something etc. but that's not important now.
The problem I am facing is that I don't know how to select that.
If it were something like:
print $this_one;
print $this_tu;
print $this_three;
I would just press Ctrl + v then j j and $ and it would be done.
But what if it is in the middle and the words end up on a different columns?
The blockwise selection with a jagged right edge indeed only works at the end of lines. In the "middle", you're stuck with a rectangular block selection that then includes trailing whitespace.
Unless you switch to a completely different approach (the comments already mention vim-multiple-cursors, which lets you select multiple places and then you can interactively edit all of those in parallel), you have to live with that.
Depending on the command that is applied to the blockwise selection, the trailing whitespace (or even any other characters you inadvertently capture) doesn't necessarily harm.
To append a character (say, $) to all middle words in your example, I would use the vis.vim plugin's :B command to work on the selection only, moving to the end of the word with the E motion, then appending the character with a$:
:'<,'>B normal! Ea$
In this, the whitespace is kept, and everything to the right of the selection moves one character right.
When I pop into Vim's visual mode to, for example, indent a block of text, the command prompt always starts with '<,'>. Can someone break down for me why this is or rather what it does? It seems like it's got something to do with markers but I'm not entirely sure of this based on the manual stuff I've read so far.
'< is the first line visually selected, and '> is the last line visually selected. This is vim's way of making your command apply to only the visual area.
The '<,'> at the beginning of your command line represents the range which you have selected . This is the also the range of test onto which the command you are about to enter would be applied.
For example if I selected a region of text in visual mode and then wanted to replace all occurrences of 'stack' with 'overflow' my command would look like:
:'<,'>s/stack/overflow/g
Without visual mode this same command would have to be accomplished by specifying the line range by hand eg:
:1,10s/helo/hello/g
It's a range defined by two special marks (a mark in an anchor in the text named as "quote+1 letter")
'< `< To the first line or character of the last selected Visual
area in the current buffer. For block mode it may also be the last
character in the first line (to be able to define the block). {not
in Vi}.
'> `> To the last line or character of the last selected Visual
area in the current buffer. For block mode it may also be the
first character of the last line (to be able to define the block).
Note that 'selection' applies, the position may be just after the
Visual area. {not in Vi}.
Source
Once you select in Visual Mode e.g. five lines, then '<,'> means that you will execute the command in that region.
so :'<,'>s/replaceMe/WithThis/g will apply to only that selection
Taking the time to add some points of trivia to the already given answers
:* usually means the same (:he cpo-star),
hitting C-u in command line mode removes the range marker (actually, removes to the beginning of the line)
I regularly use the . key to repeat my last vim command. I'm wondering if there's a way to use it with commands performed using markers. Here's a simple example:
Mark a line of text using m'a
Move down a few lines, e.g. 5j
Indent the lines using >'a -- indents 6 lines
Press . to repeat above command on the same 6 lines -- will only affect 1st line
Is there a way to get vim to apply the same marker range of the previous command when using the . command?
ps. I know the above example would have been easier with 6>>, which works with the ., I'm just using it as an example. I often use markers for more complex/longer commands.
The problem is that the command you're repeating is >'a, but because of the rule "After applying the operator the cursor is mostly left at the start of the text that was operated upon" (from :help operator), >'a leaves the cursor at mark a if that was above your starting position. Then when you repeat >'a you end up with a linewise motion from that line to itself, which only re-indents one line.
Since you're left at the beginning of the block of text, to affect the same block of text again you can use the '] (linewise) or `] (charwise) motions, which move to the end of the block of text just affected. So you can use >'] to indent the same block again, and since your cursor starts and ends at the same position this time, you can repeat it additional times with ..
A simpler choice, though, would be to just use V5j> instead of ma5j>'a. V starts visual mode (linewise) at your current position, 5j moves down 5 lines, and then > indents. And when you repeat using ., the same visual selection still pertains, so you get the desired result whether you moved up or down.
Selecting a large amount of text that extends over many screens in an IDE like Eclipse is fairly easy since you can use the mouse, but what is the best way to e.g. select and delete multiscreen blocks of text or write e.g. three large methods out to another file and then delete them for testing purposes in Vim when using it via putty/ssh where you cannot use the mouse?
I can easily yank-to-the-end-of-line or yank-to-the-end-of-code-block but if the text extends over many screens, or has lots of blank lines in it, I feel like my hands are tied in Vim. Any solutions?
And a related question: is there a way to somehow select 40 lines, and then comment them all out (with "#" or "//"), as is common in most IDEs?
Well, first of all, you can set vim to work with the mouse, which would allow you to select text just like you would in Eclipse.
You can also use the Visual selection - v, by default. Once selected, you can yank, cut, etc.
As far as commenting out the block, I usually select it with VISUAL, then do
:'<,'>s/^/# /
Replacing the beginning of each line with a #. (The '< and '> markers are the beginning and and of the visual selection.
Use markers.
Go to the top of the text block you want to delete and enter
ma
anywhere on that line. No need for the colon.
Then go to the end of the block and enter the following:
:'a,.d
Entering ma has set marker a for the character under the cursor.
The command you have entered after moving to the bottom of the text block says "from the line containing the character described by marker a ('a) to the current line (.) delete."
This sort of thing can be used for other things as well.
:'a,.ya b - yank from 'a to current line and put in buffer 'b'
:'a,.ya B - yank from 'a to current line and append to buffer 'b'
:'a,.s/^/#/ - from 'a to current line, substitute '#' for line begin
(i.e. comment out in Perl)
:'s,.s#^#//# - from 'a to current line, substitute '//' for line begin
(i.e. comment out in C++)
N.B. 'a (apostrophe-a) refers to the line containing the character marked by a. ``a(backtick-a) refers to the character marked bya`.
To insert comments select the beginning characters of the lines using CTRL-v (blockwise-visual, not 'v' character wise-visual or 'V' linewise-visual). Then go to insert-mode using 'I', enter your comment-character(s) on the first line (for example '#') and finally escape to normal mode using 'Esc'. Voila!
To remove the comments use blockwise-visual to select the comments and just delete them using 'x'.
Use the visual block command v (or V for whole lines and C-V for rectangular blocks). While in visual block mode, you can use any motion commands including search; I use } frequently to skip to the next blank line. Once the block is marked, you can :w it to a file, delete, yank, or whatever. If you execute a command and the visual block goes away, re-select the same block with gv. See :help visual-change for more.
I think there are language-specific scripts that come with vim that do things like comment out blocks of code in a way that fits your language of choice.
Press V (uppercase V) and then press 40j to select 40 lines and then press d to delete them. Or as #zigdon replied, you can comment them out.
The visual mode is the solution for your main problem. As to commenting out sections of code, there are many plugins for that on vim.org, I am using tComment.vim at the moment.
There is also a neat way to comment out a block without a plugin. Lets say you work in python and # is the comment character. Make a visual block selection of the column you want the hash sign to be in, and type I#ESCAPE. To enter a visual block mode press C-q on windows or C-v on linux.
My block comment technique:
Ctrl+V to start blockwise visual mode.
Make your selection.
With the selection still active, Shift+I. This put you into column insert mode.
Type you comment characters '#' or '//' or whatever.
ESC.
Or you may want to give this script a try...
http://www.vim.org/scripts/script.php?script_id=23
For commenting out lines, I would suggest one of these plugins:
EnhancedCommentify
NERD Commenter
I find myself using NERD more these days, but I've used EnhancedCommentify for years.
If you want to perform an action on a range of lines, and you know the line numbers, you can put the range on the command line. For instance, to delete lines 20 through 200 you can do:
:20,200d
To move lines 20 through 200 to where line 300 is you can use:
:20,200m300
And so on.
Use Shift+V to go in visual mode, then you can select lines and delete / change them.
My usual method for commenting out 40 lines would be to put the cursor on the first line and enter the command:
:.,+40s/^/# /
(For here thru 40 lines forward, substitute start-of-line with hash, space)
Seems a bit longer than some other methods suggested, but I like to do things with the keyboard instead of the mouse.
First answer is currently not quite right?
To comment out selection press ':' and type command
:'<,'>s/^/# /g
('<, '> - will be there automatically)
You should be aware of the normal mode command [count]CTRL-D.
It optionally changes the 'scroll' option from 10 to [count], and then scrolls down that many lines. Pressing CTRL-D again will scroll down that same lines again.
So try entering
V "visual line selection mode
30 "optionally set scroll value to 30
CTRL-D "jump down a screen, repeated as necessary
y " yank your selection
CTRL-U works the same way but scrolls up.
v enters visual block mode, where you can select as if with shift in most common editors, later you can do anything you can normally do with normal commands (substitution :'<,'>s/^/#/ to prepend with a comment, for instance) where '<,'> means the selected visual block instead of all the text.
marks would be the simplest mb where u want to begin and me where u want to end once this is done you can do pretty much anything you want
:'b,'ed
deletes from marker b to marker e
commenting out 40 lines you can do in the visual mode
V40j:s/^/#/
will comment out 40 lines from where u start the sequence