在vi中快速缩进多行


Answers:


2551

使用>命令。要缩进五行,5>>。标记一行并缩进,Vjj>以缩进三行​​(仅Vim)。要缩进大括号块,请将光标放在大括号之一上,然后使用>%或从block use中的任何位置使用>iB

如果要在周围复制文本块,并且需要在新位置对齐块的缩进,请使用]p代替just p。这会将粘贴的块与周围的文本对齐。

此外,该shiftwidth设置还可以控制缩进多少空格。


77
我使用> i}(缩进内部{}块)。在vim中工作。不确定它在vi中是否有效。
R. Martinho Fernandes

11
我的问题(在gVim中)是该命令>缩进2个以上的空格(我只需要两个空格,但>缩进5个空格)
Kamran Bigdely 2011年

28
@Kamran:请参阅shiftwidth设置以更改此设置。
格雷格(Greg Hewgill)2011年

4
@MattStevens:您可以找到有关这种现象在这里进一步讨论:meta.stackexchange.com/questions/9731/...
格雷格Hewgill

5
我经常连续缩进可视块,例如修复粘贴到XML文件中的某些标签。不必每次都以可视模式重新选择块,而是可以使用“ gv”重用最后一个可视块。参考superuser.com/questions/220666/…–
大卫·曼

958

该答案总结了该问题的其他答案和评论,并基于Vim文档Vim Wiki添加了更多信息。为简洁起见,此答案不区分Vi和Vim特定命令。

在下面的命令中,“重新缩进”表示“根据缩进设置缩进行” 。shiftwidth是控制缩进的主要变量。

通用命令

>>   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

您可以{}或代替B,例如=iB是有效的块缩进命令。看一下“缩进代码块”,这是一个很好的示例,可以尝试使用这些命令。

另外,请记住

.    Repeat last command

,因此可以轻松方便地重复执行缩进命令。

重新缩进完整文件

另一个常见情况是要求在整个源文件中固定缩进:

gg=G  Re-indent entire buffer

您可以将此想法扩展到多个文件:

" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall

或多个缓冲区:

" Re-indent all open buffers:
:bufdo normal gg=G:wall

在可视模式下

Vjj> Visually mark and then indent three lines

在插入模式下

这些命令适用于当前行:

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line

防爆命令

当您希望缩进特定范围的行而不移动光标时,这些功能很有用。

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive

使用标记缩进

另一种方法是通过标记

ma     Mark top of block to indent as marker 'a'

...将光标移到结束位置

>'a    Indent from marker 'a' to current location

控制缩进的变量

您可以在.vimrc文件中进行设置

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具有基于文件类型的智能缩进。尝试将其添加到您的.vimrc中:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif

参考文献


13
这个答案和上面的答案都很棒。但是我对此+1了,因为它使我想起了'dot'运算符,它重复了最后一个命令。当需要在整个块上缩进几个移位空间(或缩进)而无需持续按时,此功能非常有用>}。由于长
阿密特

1
5 >>缩进5行:此命令缩进第五行,而不是5行。这可能是由于我的VIM设置引起的,还是您的措词不正确?
Wipqozn 2011年

1
@Wipqozn-真奇怪。在Vim 7.2.330上测试,它肯定会缩进下五行。
ire_and_curses

8
> 42gg从您要插入的位置开始缩进42行。–
Steve

很棒的总结!还要注意,“缩进内部块”和“缩进所有块”(<i {> a {等)也可以使用括号和括号:> a(<i]等。(当我在其中时,在除了<>之外,它们还与d,c,y等一起使用)
2013年

123

一个很大的选择是:

gg=G

它真的很快,并且所有东西都缩进了;-)


1
我有一个XML文件,并打开了语法高亮显示。键入gg=G只是将每一行从位置1开始。所有空白都已删除。还有XML特有的其他功能吗?
ass 2014年

2
我认为set cindent应该在vimrc中:set cindent运行,还是应该在运行该命令之前运行
Amanuel Nega,2015年

3
我认为必须首先设置先例。和@asgs我认为这仅适用于cstyle编程语言。
阿曼纽尔·内加

110

也可以尝试这种方式进行C缩进缩进。执行:help =以获取更多信息:

={

这将自动缩进您所在的当前代码块。

要不就:

==

自动缩进当前行。


2
不适用于我,只需将光标转储到“我所在的当前代码块”开头大括号上方的行。
underscore_d

79

吸引更多视觉人士的按键:

  1. 进入命令模式:
    Escape

  2. 移至要缩进的区域的起点:
    hjkl

  3. 开始一个块:
    v

  4. 移动到该区域的末端以缩进:
    hjkl

  5. (可选)键入所需的缩进级别数
    0..9

  6. 在块上执行缩进:
    >


2
很好,但是它使用空格而不是制表符。有什么办法可以解决这个问题?
Shane Reustle,2011年

12
如果使用空格而不是制表符,则可能是因为您已将缩进设置为使用空格。=)。
肯特·弗雷德里克

4
当'expandtab'选项关闭时(默认),Vim尽量使用<Tab>来缩进。(:help:>)
肯特·弗雷德里克

1
我唯一更改过的与制表符/空格有关的vim设置是:set tabstop = 3。每次我使用>>时,实际上是在插入此内容:“ <tab> <space> <space>”。与缩进块相同。有任何想法吗?
Shane Reustle

3
您要查看的“空格与制表符”的三个设置是1. tabstop 2. shiftwidth 3. expandtab。您可能具有“ shiftwidth = 5 noexpandtab”,因此“ tab”为3个空格,而缩进级别为“ 5”个空格,因此它由5个1个制表符和2个空格组成。
肯特·弗雷德里克

66

所有命令的主人是
gg=G

这会使整个文件缩进!

下面是一些简单而优雅的命令,用于在Vim或gVim中快速缩进行。

缩进当前行
==

缩进当前行下面的所有行

=G

缩进n当前行下方的行

n==

例如,缩进当前行下方的4行

4==

要缩进一段代码,请转到其中一个大括号并使用命令

=%

这些是缩进多行的最简单但功能强大的命令。


3
这只是在vim,不是vi
rojomoke

3
在我的Solaris或AIX机器上没有。equals键一直是我的标准即席宏分配之一。您确定不查看vim链接为as的vi吗?
rojomoke

3
是的,在Linux上,vi几乎始终是vim的链接。尝试在vi中运行:ve命令。
rojomoke

4
我喜欢这种答案:清晰,准确和简洁。在Debian Jessie为我工作。谢谢,@SJain
digitai

1
由于我使用的是vim,而不是vi,因此我很高兴这个答案在这里。谢谢。
Dan Nissenbaum

66

除了已经给出和接受的答案外,还可以放置一个标记,然后缩进从当前光标到该标记的所有内容。

因此,输入ma要缩进的块的顶部的位置,根据需要向下光标,然后键入>'a(请注意,“ a”可以代替任何有效的标记名)。有时比5>>或容易vjjj>


1
这真的很有用。我将必须查找所有与此相关的功能。我知道d'a和y'a,还有什么?
user606723 2011年

2
这非常有用,因为它无需计算要缩进的行数。
ziggy 2014年

29

转到文本的开头

  • v进入可视模式。
  • 使用up/ down箭头突出显示文本。
  • =缩进突出显示的所有行。

28

除了提供的解决方案外,我还希望一次做一个段落 >}


2
是的,这就是为什么我最大的烦恼之一是在空白的行上留有空白:它们弄乱了vim的“段落”概念。
2013年

28

当您选择一个块并用于>缩进时,其缩进然后返回到普通模式。我的.vimrc文件中有这个:

vnoremap < <gv

vnoremap > >gv

它使您可以根据需要缩进选择次数。


17
要多次缩进选择,只需按即可。重复上一个命令。
sundar-恢复莫妮卡

2
的问题。在这种情况下,您必须动动手指。使用@mike的解决方案(与我使用的解决方案相同),您已经可以将手指放在缩进键上,并且可以不断对其进行调整以保持缩进,而不必进行切换和执行其他操作。使用周期需要更长的时间,因为您必须动动双手,并且需要更多的思考,因为这是另一种不同的操作。
masukomi 2013年

21

假设您使用2个空格来缩进代码。类型:

:set shiftwidth=2
  • 键入v(进入可视块编辑模式)
  • 使用箭头键(或使用h/ j/ k/ l)移动光标以突出显示要缩进或缩进的行。

然后:

  • 键入>一次缩进一次(2个空格)。
  • 键入2>两次缩进(4个空格)。
  • 键入3>缩进三次(6个空格)。
  • ...
  • 键入<一次取消缩进(2个空格)。
  • 键入2<两次以取消缩进(4个空格)。
  • 输入3<三次以缩进(6个空格)。
  • ...

你明白了。

空行不会缩进,我认为这很好。


我在(g)vim文档中找到了缩进块的答案:

:help visual-block
/indent

如果要对命令计数,请在键入运算符:“ v {move-around} 3>”(将第3行缩进右移)之前执行此操作。


18

Vim的UI的优点在于它的一致性。编辑命令由命令和光标移动组成。光标移动始终相同:

  • H到屏幕顶部,L到底部,M中间
  • nG转到第n行,G单独到文件底部,gg到顶部
  • n移至下一个搜索匹配,N移至上一个
  • } 至本段末
  • % 到下一个匹配的括号,括号或标签种类
  • enter 到下一行
  • 'x标记x,其中x是字母或另一个'
  • 还有更多的内容,包括wW单词有关的内容,$0与行的提示有关的内容,等等,在这里不适用,因为它们不是行的运动。

因此,为了使用vim,您必须学习移动光标并记住一系列命令,例如>缩进(和<“ outdent”)。

因此,要缩进从光标位置到屏幕顶部的行>H>G请缩进到文件的底部。

如果>H您键入而不是键入,dH那么您将删除同一行,cH以替换它,依此类推。

某些光标移动更适合特定命令。特别是,该%命令很容易缩进整个HTML或XML块。如果文件的语法高亮显示了(:syn on),则将光标设置在标签文本中(例如,在<div>的“ i”中,然后输入>%将缩进到结束</ div>标签)。

这就是Vim的工作方式:仅记住光标移动和命令,以及如何混合它们。因此,对于这个问题,我的答案是“转到要缩进的行的一端,然后键入>命令,然后向该行的另一端移动”(如果缩进被解释为移动行,=如果缩进的话)被解释为漂亮印刷。


2
我会说vi / vim 基本上是一致的。例如,D与S和Y的行为不同!:)
13年

14

做这个:

$vi .vimrc

并添加以下行:

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent

这仅适用于cpp文件。您可以为其他文件类型执行此操作,也只需修改文件类型...


13

您可以使用该norm i命令在行首插入给定的文本。要在第2-10行之前插入10个空格:

:2,10norm 10i 

请记住,命令末尾必须有一个空格字符-这将是我们要插入的字符。我们还可以缩进任何其他文本的行,例如缩进文件中具有五个下划线字符的每一行:

:%norm 5i_

或更喜欢的东西:

:%norm 2i[ ]

更实际的示例是使用#字符注释Bash / Python / etc代码:

:1,20norm i#

要重新缩进,请使用x代替i。例如,要从每行中删除前5个字符:

:%norm 5x

1
这从文件的左侧开始...不是块的当前位置
Eliethesaiyan

12

VISUAL MODE使用此方法的快速方法是使用与注释代码块相同的过程。

如果您不想更改您的指令shiftwidth或使用任何set指令,并且对使用TABS或SPACES或任何其他字符足够灵活,这将很有用。

  1. 将光标定位在块的开头
  2. v切换至 -- VISUAL MODE --
  3. 选择要缩进的文本
  4. 键入:以切换到提示
  5. 替换为3个前置空格:

    :'<,'>s/^/ /g

  6. 或替换为前导标签:

    :'<,'>s/^/\t/g

  7. 简要说明:

    '<,'> -在可视范围内

    s/^/ /g -在整个范围的每一行的开头插入3个空格

    (要么)

    s/^/\t/g- Tab在整个范围内的每一行的开头插入


12

>}>{从当前行缩进到下一段

<}<{相同的非缩进


11

我喜欢将文本标记为缩进:

  1. 转到文本行的开头,然后键入maa是'm'ark的标签:可以是任何字母)
  2. 转到文本的结尾行并键入mz(同样,z可以是任何字母)
  3. :'a,'z>还是:'a,'z<会缩进或缩排(这是一个字吗?)
  4. 瞧!文本被移动(空行保持空白,没有空格)

PS:您可以使用该:'a,'z技术为可能使用行,数字或的任何操作(d,y,s ///等)标记范围%


10

:help left

ex mode你可以使用:left:le对齐线指定的金额。具体来说,:left[范围]中的线左对齐。它将行中的缩进设置为[indent](默认值0)。

:%le3:%le 3:%left3:%left 3将通过填充三个空格来对齐整个文件。

:5,7 le 3 会将5到7行对齐,并在其中填充三个空格。

:le没有任何值,否则:le 0将与填充0对齐。

这适用于Vim和gVim。


1
太棒了,这正是我想要的东西(一种方法是插入特定数量的空格-降价代码4个空格-覆盖我的常规缩进)。在我的情况下,我想在可视模式下缩进特定数量的行,因此使用shift -v突出显示行,然后:'<,'>le4插入空格。谢谢!
Subfuzion

9

对我来说,MacVim(Visual)解决方案是用鼠标选择并按“>”,但是将以下几行放在“〜/ .vimrc”中,因为我喜欢空格而不是制表符:

set expandtab
set tabstop=2
set shiftwidth=2

能够从命令行(Terminal.app)调用MacVim也很有用,因此,由于我具有以下帮助程序目录“〜/ bin”,因此在其中放置了一个名为“ macvim”的脚本:

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@

当然在“〜/ .bashrc”中:

export PATH=$PATH:$HOME/bin

MacPorts与“〜/ .profile” 经常发生混乱,因此PATH环境变量可能会变得很长。


9

5== 将从当前光标位置缩进五行。

因此,您可以在之前键入任何数字==。它将缩进行数。这是在命令模式下。

gg=G 将从顶部到底部缩进整个文件。


9

我没有在注释中找到使用的方法,因此我将与您分享(我认为仅Vim):

  1. Esc 进入命令模式
  2. 移至要缩进的最后一行的第一个字符
  3. Ctrl+ V开始块选择
  4. 移至要缩进的第一行的第一个字符
  5. Shift+ I进入特殊插入模式
  6. 键入您需要缩进的任意数量的空格/制表符(例如,两个
  7. Esc和空格将出现在所有行中

当您不想在其中更改缩进/制表符设置vimrc或不想在编辑时记住它们进行更改时,此功能很有用。

要取消缩进,我使用相同的Ctrl+ V块选择来选择空格并使用删除它D


9

我不知道为什么很难找到像这样的简单答案...

为了了解这一点,我自己不得不付出很多努力。很简单:

  • .vimrc在主目录下编辑文件。
  • 添加此行

    set cindent
    

    在您要正确缩进的文件中。

  • 在普通/命令模式下

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    

8
:line_num_start,line_num_end>

例如,

14,21> shifts line number 14 to 21 to one tab

增加“>”符号可查看更多标签。

例如,

14,21>>> for three tabs

1
显然有很多方法可以解决此问题,但这是最容易实现的,因为行号默认在vim中显示,并且不需要数学。
HoldOffHunger

@HoldOffHunger默认情况下不显示行号。您需要使用:set number来切换行号(默认情况下它们是关闭的),或放入set number您的vimrc中。
DryLabRebel

7

大量使用Python,我发现自己经常需要将块移位多个缩进。您可以通过使用任何一种块选择方法来执行此操作,然后只需输入要跳入的缩进数量即可>

例如,V5j3>将五行缩进3次-如果您将四个空格缩进,则缩进12个空格。



6

如何用空格立即缩进vi中突出显示的代码:

选项1:使用可视块模式将vi中的代码块缩进三个空格:

  1. 选择要缩进的代码块。使用Ctrl+V普通模式并向下箭头选择文本来执行此操作。选中后,输入:以对所选文本块发出命令。

  2. 以下内容将出现在命令行中: :'<,'>

  3. 要将缩进量设置为三个空格,请键入le 3并按Enter。出现的内容是::'<,'>le 3

  4. 所选文本立即缩进三个空格。

选项2:使用可视行模式将vi中的代码块缩进三个空格:

  1. 在vi中打开文件。
  2. 将光标放在一些代码上
  3. 处于正常模式,然后按以下键:

    Vjjjj:le 3
    

    您所做的解释:

    V 表示开始选择文本。

    jjjj 向下箭头四行,突出显示四行。

    : 告诉vi您将输入突出显示文本的说明。

    le 3 表示将突出显示的文本缩进三行。

    所选代码立即增加或减少到三个空格缩进。

选项3:使用可视块模式和特殊插入模式增加缩进量:

  1. 在vi中打开文件。
  2. 将光标放在一些代码上
  3. 在正常模式下,按以下键:

    Ctrl+V

    jjjj
    

    (按空格键五次)

    Esc Shift+i

    所有突出显示的文本都缩进了五个空格。


6

我使用块模式视觉选择:

  • 转到块的前面进行移动(在顶部或底部)。
  • Ctrl+ V进入可视块模式。
  • 导航以选择行前面的列。
  • IShift+ I)进入插入模式。
  • 输入一些空格。
  • Esc。所有行将转移。

这不是单任务程序。有用:

  • 在行的中间。
  • 在所有行上插入任何字符串。
  • 更改列(使用c代替I)。
  • 拉,删除,替换等...

这很麻烦,但是如果您在核心VIM之外进行格式化(例如,使用vim-prettier而不是默认的缩进引擎)进行格式化,这是可行的方法。>否则,使用将严重破坏Prettier所做的格式化。
oligofren

有趣的是,我觉得它很麻烦。这不是单任务!学习这种方法除了缩进以外还有很多用途。
sqqqrly

我发现它比接受的答案更好,因为我可以看到正在发生的事情,正在选择的行和正在执行的操作,而不仅仅是键入某种vim咒语。
user405205​​4

5
  • 对于一段代码,{}:=+%

  • 对于选定的行:Shift+ v使用向上/向下箭头键选择,然后按=

  • 对于整个文件:gg+ =+G

注意:“ gg”表示转到第1行,“ =”是缩进命令,而“ G”将光标移到file的末尾


4

要将所有文件缩进四倍:

esc 4G=G

3
...什么?“缩进4个空格”?不,这会跳到第4行,然后使用当前选择的缩进模式(如果有的话)对从此处到文件末尾的所有内容进行缩进。
underscore_d

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.