It should be trivial, and it might even be in the help, but I can't figure out how to navigate it. How do I indent multiple lines quickly in vi?
Use the > command. To indent five lines, 5>>. To mark a block of lines and indent it, Vjj> to indent three lines (Vim only). To indent a curly-braces block, put your cursor on one of the curly braces and use >% or from anywhere inside block use >iB.
If you’re copying blocks of text around and need to align the indent of a block in its new location, use ]p instead of just p. This aligns the pasted block with the surrounding text.
Also, the shiftwidth
setting allows you to control how many spaces to indent.
Answered 2023-09-20 20:31:23
shiftwidth
setting for the way to change that. - anyone This answer summarises the other answers and comments of this question, and it adds extra information based on the Vim documentation and the Vim wiki. For conciseness, this answer doesn't distinguish between Vi and Vim-specific commands.
In the commands below, "re-indent" means "indent lines according to your indentation settings." shiftwidth
is the primary variable that controls indentation.
General Commands
>> Indent line by shiftwidth spaces
<< De-indent line by shiftwidth spaces
5>> Indent 5 lines
5== Re-indent 5 lines
>% Increase indent of a braced or bracketed block (place cursor on brace first)
=% Reindent a braced or bracketed block (cursor on brace)
<% Decrease indent of a braced or bracketed block (cursor on brace)
]p Paste text, aligning indentation with surroundings
=i{ Re-indent the 'inner block', i.e. the contents of the block
=a{ Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block
>i{ Increase inner block indent
<i{ Decrease inner block indent
You can replace {
with }
or B
, e.g. =iB
is a valid block indent command. Take a look at "Indent a Code Block" for a nice example to try these commands out on.
Also, remember that
. Repeat last command
, so indentation commands can be easily and conveniently repeated.
Re-indenting complete files
Another common situation is requiring indentation to be fixed throughout a source file:
gg=G Re-indent entire buffer
You can extend this idea to multiple files:
" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall
Or multiple buffers:
" Re-indent all open buffers:
:bufdo normal gg=G:wall
In Visual Mode
Vjj> Visually mark and then indent three lines
In insert mode
These commands apply to the current line:
CTRL-t insert indent at start of line
CTRL-d remove indent at start of line
0 CTRL-d remove all indentation from line
Ex commands
These are useful when you want to indent a specific range of lines, without moving your cursor.
:< and :> Given a range, apply indentation e.g.
:4,8> indent lines 4 to 8, inclusive
Indenting using markers
Another approach is via markers:
ma Mark top of block to indent as marker 'a'
...move cursor to end location
>'a Indent from marker 'a' to current location
Variables that govern indentation
You can set these in your .vimrc file.
set expandtab "Use softtabstop spaces instead of tab characters for indentation
set shiftwidth=4 "Indent by 4 spaces when using >>, <<, == etc.
set softtabstop=4 "Indent by 4 spaces when pressing <TAB>
set autoindent "Keep indentation from previous line
set smartindent "Automatically inserts indentation in some cases
set cindent "Like smartindent, but stricter and more customisable
Vim has intelligent indentation based on filetype. Try adding this to your .vimrc:
if has ("autocmd")
" File type detection. Indent based on filetype. Recommended.
filetype plugin indent on
endif
References
Answered 2023-09-20 20:31:23
>}
. Thanks a long - anyone A big selection would be:
gg=G
It is really fast, and everything gets indented ;-)
Answered 2023-09-20 20:31:23
gg=G
just puts every line starting from position 1. All the white spaces have been removed. Is there anything else specific to XML? - anyone set cindent
should be in vimrc or should run :set cindent
before running that command - anyone Also try this for C-indenting indentation. Do :help =
for more information:
={
That will auto-indent the current code block you're in.
Or just:
==
to auto-indent the current line.
Answered 2023-09-20 20:31:23
Key presses for more visual people:
Enter Command Mode:
Escape
Move around to the start of the area to indent:
hjkl↑↓←→
Start a block:
v
Move around to the end of the area to indent:
hjkl↑↓←→
(Optional) Type the number of indentation levels you want
0..9
Execute the indentation on the block:
>
Answered 2023-09-20 20:31:23
In addition to the answer already given and accepted, it is also possible to place a marker and then indent everything from the current cursor to the marker.
Thus, enter ma
where you want the top of your indented block, cursor down as far as you need and then type >'a
(note that "a
" can be substituted for any valid marker name). This is sometimes easier than 5>>
or vjjj>
.
Answered 2023-09-20 20:31:23
The master of all commands is
gg=G
This indents the entire file!
And below are some of the simple and elegant commands used to indent lines quickly in Vim or gVim.
To indent the current line
==
To indent the all the lines below the current line
=G
To indent n
lines below the current line
n==
For example, to indent 4 lines below the current line
4==
To indent a block of code, go to one of the braces and use command
=%
These are the simplest, yet powerful commands to indent multiple lines.
Answered 2023-09-20 20:31:23
vim
, not vi
. - anyone vim
that's been linked to as vi
? - anyone When you select a block and use > to indent, it indents then goes back to normal mode. I have this in my .vimrc file:
vnoremap < <gv
vnoremap > >gv
It lets you indent your selection as many time as you want.
Answered 2023-09-20 20:31:23
Go to the start of the text
Answered 2023-09-20 20:31:23
As well as the offered solutions, I like to do things a paragraph at a time with >}
Answered 2023-09-20 20:31:23
Suppose you use 2 spaces to indent your code. Type:
:set shiftwidth=2
Then:
You get the idea.
(Empty lines will not get indented, which I think is kind of nice.)
I found the answer in the (g)vim documentation for indenting blocks:
:help visual-block
/indent
If you want to give a count to the command, do this just before typing the operator character: "v{move-around}3>" (move lines 3 indents to the right).
Answered 2023-09-20 20:31:23
The beauty of Vim's UI is that its consistency. Editing commands are made up of the command and a cursor move. The cursor moves are always the same:
'
.So, in order to use vim you have to learn to move the cursor and remember a repertoire of commands like, for example, > to indent (and < to "outdent").
Thus, for indenting the lines from the cursor position to the top of the screen you do >H, >G to indent to the bottom of the file.
If, instead of typing >H, you type dH then you are deleting the same block of lines, cH for replacing it, etc.
Some cursor movements fit better with specific commands. In particular, the % command is handy to indent a whole HTML or XML block. If the file has syntax highlighted (:syn on
) then setting the cursor in the text of a tag (like, in the "i" of <div> and entering >% will indent up to the closing </div> tag.
This is how Vim works: one has to remember only the cursor movements and the commands, and how to mix them. So my answer to this question would be "go to one end of the block of lines you want to indent, and then type the > command and a movement to the other end of the block" if indent is interpreted as shifting the lines, = if indent is interpreted as in pretty-printing.
Answered 2023-09-20 20:31:23
>*
would do a interesting thing, <header>ddd</header>
, it'll indent the entire block because *
goes to the next header
. - anyone You can use the norm i
command to insert given text at the beginning of the line. To insert 10 spaces before lines 2-10:
:2,10norm 10i
Remember that there has to be a space character at the end of the command - this will be the character we want to have inserted. We can also indent a line with any other text, for example to indent every line in a file with five underscore characters:
:%norm 5i_
Or something even more fancy:
:%norm 2i[ ]
More practical example is commenting Bash/Python/etc code with # character:
:1,20norm i#
To re-indent use x instead of i. For example, to remove first 5 characters from every line:
:%norm 5x
Answered 2023-09-20 20:31:23
:g/^@.\{-}{\n/,/^}\n}/norm >>
reindenting specific pattern blocks (css file), had a hard time figuring this out and was a huge help, thanks - anyone Source: https://www.fir3net.com/UNIX/General/how-do-i-tab-multiple-lines-within-vi.html
Answered 2023-09-20 20:31:23
:line_num_start,line_num_end>
For example,
14,21> shifts line number 14 to 21 to one tab
Increase the '>' symbol for more tabs.
For example,
14,21>>> for three tabs
Answered 2023-09-20 20:31:23
:set number
to toggle line numbers (they are off by default), or put set number
in your vimrc. - anyone Do this:
$vi .vimrc
And add this line:
autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent
This is only for a cpp file. You can do this for another file type, also just by modifying the filetype...
Answered 2023-09-20 20:31:23
A quick way to do this using VISUAL MODE
uses the same process as commenting a block of code.
This is useful if you would prefer not to change your shiftwidth
or use any set
directives and is flexible enough to work with TABS or SPACES or any other character.
-- VISUAL MODE --
:
to switch to the prompt Replacing with 3 leading spaces:
:'<,'>s/^/ /g
Or replacing with leading tabs:
:'<,'>s/^/\t/g
Brief Explanation:
'<,'>
- Within the Visually Selected Range
s/^/ /g
- Insert 3 spaces at the beginning of every line within the whole range
(or)
s/^/\t/g
- Insert Tab
at the beginning of every line within the whole range
Answered 2023-09-20 20:31:23
>}
or >{
indent from current line up to next paragraph
<}
or <{
same un-indent
Answered 2023-09-20 20:31:23
I didn't find a method I use in the comments, so I'll share it (I think Vim only):
This is useful when you don't want to change indentation/tab settings in vimrc
or to remember them to change it while editing.
To unindent I use the same Ctrl + V block select to select spaces and delete it with D.
Answered 2023-09-20 20:31:23
Esc
. One note is that when you hit Shift
+ i
it takes all the cursors away but don't be sad because it will still work :) - anyone I like to mark text for indentation:
PS: you can use the :'a,'z technique to mark a range for any operation (d, y, s///, etc.) where you might use lines, numbers, or %.
Answered 2023-09-20 20:31:23
For me, the MacVim (Visual) solution was, select with mouse and press ">", but after putting the following lines in "~/.vimrc" since I like spaces instead of tabs:
set expandtab
set tabstop=2
set shiftwidth=2
Also it's useful to be able to call MacVim from the command-line (Terminal.app), so since I have the following helper directory "~/bin", where I place a script called "macvim":
#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@
And of course in "~/.bashrc":
export PATH=$PATH:$HOME/bin
MacPorts messes with "~/.profile" a lot, so the PATH environment variable can get quite long.
Answered 2023-09-20 20:31:23
:help left
In ex mode
you can use :left
or :le
to align lines a specified amount.
Specifically, :left
will Left align lines in the [range]. It sets the indent in the lines to [indent] (default 0).
:%le3
or :%le 3
or :%left3
or :%left 3
will align the entire file by padding with three spaces.
:5,7 le 3
will align lines 5 through 7 by padding them with three spaces.
:le
without any value or :le 0
will left align with a padding of 0.
This works in Vim and gVim.
Answered 2023-09-20 20:31:23
:'<,'>le4
to insert the spaces. Thanks! - anyone 5==
will indent five lines from the current cursor position.
So you can type any number before ==
. It will indent the number of lines. This is in command mode.
gg=G
will indent the whole file from top to bottom.
Answered 2023-09-20 20:31:23
I don’t know why it's so difficult to find a simple answer like this one...
I myself had to struggle a lot to know this. It's very simple:
.vimrc
file under the home directory.Add this line
set cindent
in your file where you want to indent properly.
In normal/command mode type
10== (This will indent 10 lines from the current cursor location)
gg=G (Complete file will be properly indented)
Answered 2023-09-20 20:31:23
Using Python a lot, I find myself needing frequently needing to shift blocks by more than one indent. You can do this by using any of the block selection methods, and then just enter the number of indents you wish to jump right before the >
For example, V5j3>
will indent five lines three times - which is 12 spaces if you use four spaces for indents.
Answered 2023-09-20 20:31:23
I use block-mode visual selection:
I
(Shift + I) to enter insert mode.This is not a uni-tasker. It works:
c
instead of I
).Answered 2023-09-20 20:31:23
vim-prettier
instead of the default indenting engine). Using >
will otherwise royally scew up the formatting done by Prettier. - anyone For a block of code, {}: = + %
For a selected line: Shift + v select using the up/down arrow keys, and then press =.
For the entire file: gg + = + G
Note: 'gg' means go to line 1, '=' is the indent command, and 'G' moves the cursor to the end of file.
Answered 2023-09-20 20:31:23
For who like modern editors to indent selected line with <TAB>
-> Tab and <S-TAB>
-> Shift+Tab:
vnoremap <TAB> >gv
vnoremap <S-TAB> <gv
Usage:
Hit V
for line-wise visual-mode, select lines you want, then hit Tab(maybe with shift), then indention applies as you want and selection remains...
Answered 2023-09-20 20:31:23
Shift
+.
= :
which has other functions. So the other solutions don't work. - anyone vimrc
file. for more information execute this command: :h vimrc
. - anyone Shift
+.
is the >
character which you can find in your keyboard... - anyone Option 1: Indent a block of code in vi to three spaces with Visual Block mode:
Select the block of code you want to indent. Do this using Ctrl+V in normal mode and arrowing down to select text. While it is selected, enter :
to give a command to the block of selected text.
The following will appear in the command line: :'<,'>
To set indent to three spaces, type le 3
and press enter. This is what appears: :'<,'>le 3
The selected text is immediately indented to three spaces.
Option 2: Indent a block of code in vi to three spaces with Visual Line mode:
Be in normal mode and press the following keys:
Vjjjj:le 3
Interpretation of what you did:
V
means start selecting text.
jjjj
arrows down four lines, highlighting four lines.
:
tells vi you will enter an instruction for the highlighted text.
le 3
means indent highlighted text three lines.
The selected code is immediately increased or decreased to three spaces indentation.
Option 3: use Visual Block mode and special insert mode to increase indent:
Be in normal mode press the following keys:
Ctrl+V
jjjj
(press the spacebar five times)
Esc Shift+i
All the highlighted text is indented an additional five spaces.
Answered 2023-09-20 20:31:23