在vi中快速缩进多行

All*_*nde 2111 vi vim editor indentation

应该是微不足道的,它甚至可能在帮助中,但我无法弄清楚如何导航它.如何在vi中快速缩进多行?

Gre*_*ill 2496

使用该>命令.缩进5行,5>>.标记一行和缩进,Vjj>缩进3行(仅限vim).要缩进花括号块,请将光标放在其中一个花括号上,并使用>%块内使用的任何位置>iB.

如果您正在复制文本块并需要在新位置对齐块的缩进,请使用]p而不是仅使用p.这会将粘贴的块与周围的文本对齐.

此外,该shiftwidth设置允许您控制缩进的空格数.

  • 我使用> i}(缩进内部{}块).在vim中工作.不确定它是否适用于vi. (74认同)
  • <shift> -v也可以在Vim中选择一行. (73认同)
  • @Kamran:请参阅[`shiftwidth`](http://vimdoc.sourceforge.net/htmldoc/options.html#'shiftwidth')设置以了解更改方法. (27认同)
  • 我的问题(在gVim中)是命令>缩进多于2个空格(我只想要两个空格但是缩进比如5个空格) (10认同)
  • @MattStevens:你可以在这里找到关于这种现象的扩展讨论:http://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem (4认同)
  • 我经常连续多次缩进视觉块,例如将一些标签粘贴到XML文件中.不是每次都以可视模式重新选择块,而是可以使用'gv'重用最后一个视觉块.参考http://superuser.com/questions/220666/how-do-you-reuse-a-visual-mode-selection (4认同)
  • 我一直在使用control-v通过导航到线的前面进行缩进,但这显然要好得多. (2认同)
  • @Martinho:像我这样的文本对象是Vim特有的.然后,视觉模式也是如此. (2认同)
  • 您还可以在正常模式下使用标记来分隔块,如'a'b>或命令行中的模式,如:/ begin /,/ end /> (2认同)
  • 如果您丢失了选择,请使用gv重新选择 (2认同)
  • 我已经开始使用[vim-pasta](https://github.com/sickill/vim-pasta)插件进行缩进感知粘贴.奇迹般有效! (2认同)

ire*_*ses 937

这个答案总结了这个问题的其他答案和评论,并根据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
Run Code Online (Sandbox Code Playgroud)

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

另外,请记住

.    Repeat last command
Run Code Online (Sandbox Code Playgroud)

,因此可以轻松方便地重复压痕命令.

重新缩进完整文件

另一种常见情况是要求在整个源文件中修复缩进:

gg=G  Re-indent entire buffer
Run Code Online (Sandbox Code Playgroud)

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

" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall
Run Code Online (Sandbox Code Playgroud)

或多个缓冲区:

" Re-indent all open buffers:
:bufdo normal gg=G:wall
Run Code Online (Sandbox Code Playgroud)

在可视模式下

Vjj> Visually mark and then indent three lines
Run Code Online (Sandbox Code Playgroud)

在插入模式下

这些命令适用于当前行:

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line
Run Code Online (Sandbox Code Playgroud)

Ex命令

当您想要缩进特定范围的行而不移动光标时,这些非常有用.

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive
Run Code Online (Sandbox Code Playgroud)

使用标记缩进

另一种方法是通过标记:

ma     Mark top of block to indent as marker 'a'
Run Code Online (Sandbox Code Playgroud)

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

>'a    Indent from marker 'a' to current location
Run Code Online (Sandbox Code Playgroud)

控制缩进的变量

您可以在.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
Run Code Online (Sandbox Code Playgroud)

Vim具有基于文件类型的智能缩进.尝试将此添加到.vimrc:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif
Run Code Online (Sandbox Code Playgroud)

参考

  • 这个答案和上面的答案都很棒.但我为此加了1,因为它让我想起了'dot'操作符,它重复了最后一个命令.当需要将整个块缩进多个移位空间(或缩进)而不需要按下`>}时,这非常有用.谢谢你 (12认同)
  • > 42gg从第42行开始缩进. (8认同)

Joh*_*han 123

一个很大的选择是:

gg=G
Run Code Online (Sandbox Code Playgroud)

它真的很快,一切都缩进了;-)

  • http://stackoverflow.com/questions/7600860/getting-vim-to-recognize-xml (3认同)
  • 我认为必须首先设置cindent.和@asgs我认为这只适用于cstyle编程语言. (3认同)
  • 我认为`set cindent`应该在vimrc中,或者应该在运行该命令之前运行`:set cindent` (2认同)

sve*_*vec 108

也可以尝试使用C-indent缩进,:help =有关详细信息:

={

这将自动缩进您当前的代码块.

要不就:

==

自动缩进当前行.

  • 对我来说不起作用,只是将我的光标转移到'当前代码块我'的开头括号上方的行. (2认同)

Ken*_*ric 79

为更多视觉人士提供按键:

  1. 进入命令模式:
    Escape

  2. 移动到区域的开头以缩进:
    hjkl

  3. 开始一个块:
    v

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

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

  6. 在块上执行缩进:
    >

  • 如果它使用空格而不是制表符,那么可能是因为你有缩进设置使用空格.=). (10认同)
  • 当'expandtab'选项关闭时(这是默认值),Vim尽可能使用<Tab>来进行缩进.(:帮助:>) (4认同)
  • 您要查看"空格与标签"的三个设置是1.tabstop 2. shiftwidth 3. expandtab.您可能有"shiftwidth = 5 noexpandtab",因此"tab"为3个空格,缩进级别为"5"空格,因此它组成5个带有1个选项卡和2个空格. (3认同)
  • 这很棒,但它使用空格而不是制表符.有没有办法解决这个问题? (2认同)

Dan*_*wak 65

除了已经给出和接受的答案之外,还可以放置标记然后缩进从当前光标到标记的所有内容.因此,输入ma您想要缩进块顶部的位置,根据需要向下移动光标,然后键入>'a(注意" a"可以替换任何有效的标记名称).这有时比5>>或更容易vjjj>.

  • 这非常有用,因为它可以避免计算要缩进的行数. (2认同)

Sag*_*ain 64

所有命令的主人都是
gg=G

这会缩进整个文件!

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

缩进当前行
==

缩进当前行下面的所有行

=G

缩进n当前行下方的行

n==

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

4==

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

=%

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

  • 我喜欢这样的答案:清晰、准确和简洁。在 Debian Jessie 为我工作。谢谢,@SJain (4认同)
  • 这只是在'vim`中,而不是`vi`. (3认同)
  • 它不在我的Solaris或AIX机箱上.equals键一直是我标准的ad hoc宏分配之一.你确定你没有看到被称为"vi"的"vim"吗? (3认同)
  • 是的,在Linux上,vi几乎总是链接到vim.尝试在vi中运行:ve命令. (3认同)
  • @rojomoke:不,它也适用于vi (2认同)

Mic*_*ant 29

转到文本的开头

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


Pau*_*lin 27

除了提供的解决方案,我喜欢一次做一个段落 >}

  • 是的,这就是为什么我最讨厌的一个原因是空白行上的空白:它们弄乱了 vim 的“段落”概念。 (2认同)

Mic*_*oka 27

当您选择一个块并用于>缩进时,它会缩进然后返回到正常模式.我在.vimrc文件中有这个:

vnoremap < <gv

vnoremap > >gv
Run Code Online (Sandbox Code Playgroud)

它允许您根据需要缩短选择时间.

  • 要多次缩进选择,您只需按.重复上一个命令. (17认同)
  • 的问题。在这种情况下,您必须动动手指。使用@mike的解决方案(与我使用的解决方案相同),您已经可以将手指放在缩进键上,并且可以不断对其进行修改以保持缩进,而不必进行切换和其他操作。使用周期需要更长的时间,因为您必须动动双手,并且需要更多的思考,因为这是另一种不同的操作。 (2认同)

Joh*_*son 21

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

:set shiftwidth=2
Run Code Online (Sandbox Code Playgroud)
  • 键入v(输入视觉块编辑模式)
  • 使用箭头键(或使用h/ j/ k/ l)移动光标以突出显示要缩进或取消的行.

然后:

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

你明白了.

(空行不会缩进,我觉得这很好.)


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

:help visual-block
/indent
Run Code Online (Sandbox Code Playgroud)

如果要对命令进行计数,请在键入操作符之前执行此操作:"v {move-around} 3>"(向右移动第3行缩进).


Jua*_*nus 18

vim UI的美妙之处在于它的一致性.编辑命令由命令和光标移动组成.光标移动始终相同:

  • H屏幕顶部,L底部,M中间
  • n G转到行n,G单独到文件底部,gg到顶部
  • n转到下一个搜索匹配,N转到上一个
  • } 到段落结束
  • % 下一个匹配括号,括号中的任何一个或标签类型
  • enter 到下一行
  • 'x 标记x,其中x是一个字母或另一个字母'
  • 更多,包括wW言论,$0线的提示等,这里不适用,因为不是线条移动.

因此,为了使用vim,你必须学会​​移动光标并记住一系列命令,例如>缩进(和<"outdent").
因此,为了缩小从光标位置到屏幕顶部的行>H,>G缩进到文件的底部.

如果>H您键入的是输入,而不是键入,dH则删除相同的行块,cH以替换它等.

某些光标移动适合特定命令.特别是,该%命令可以方便地缩进整个HTML或XML块.
如果文件突出显示语法('),则将光标设置在标签的文本中(例如,在<div>的"i"中,输入>%将缩进到结束</ div>标签.

这就是vim的工作原理:只需记住光标移动和命令,以及如何混合它们.
所以我这个问题的答案将是"去你要缩进的行块的一端,然后键入>命令和运动块的另一端,"如果缩进被解释为转移的线路,=如果缩进被解释为漂亮印刷.

  • 我会说vi/vim几乎是一致的.例如,D的行为与S和Y不同!:) (2认同)

小智 14

做这个

$vi .vimrc
Run Code Online (Sandbox Code Playgroud)

并添加此行

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent
Run Code Online (Sandbox Code Playgroud)

这只适用于cpp文件,你也可以通过修改文件类型来为另一种文件类型执行此操作...


Eri*_*thi 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在整个范围内的每一行的开头插入


Nyk*_*kin 12

还有一种方法尚未提及 - 您可以使用norm i命令在行的开头插入给定的文本.要在第2-10行之前插入10个空格:

:2,10norm 10i 
Run Code Online (Sandbox Code Playgroud)

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

:%norm 5i_
Run Code Online (Sandbox Code Playgroud)

或者更奇特的东西:

:%norm 2i[ ]
Run Code Online (Sandbox Code Playgroud)

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

:1,20norm i#
Run Code Online (Sandbox Code Playgroud)

重新缩进使用x而不是i.例如,从每行中删除前5个字符:

:%norm 5x
Run Code Online (Sandbox Code Playgroud)


小智 11

我喜欢为缩进标记文本:

  1. 转到文本行的开头然后输入ma(a是'm'ark的标签:它可以是任何字母)
  2. 转到文本的结尾行并键入mz(再次z可以是任何字母)
  3. :'a,'z>或:'a,'z <将缩进或突出(这是一个字吗?)
  4. 瞧!文本被移动(空行保持为空,没有空格)

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


小智 11

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

<}<{同样的缩进


zun*_*arz 10

:help left

ex mode您可以使用:left:le对齐指定数量的行.具体而言,:left左对齐线路中的[范围].它将行中的缩进设置为[indent](默认为0).

:%le3:%le 3:%left3:%left 3将填充有三个空格对准整个文件.

:5,7 le 3 通过用3个空格填充它们来对齐第5到第7行.

:le没有任何值或:le 0将与0的填充对齐.

这适用于:help leftex mode.


mda*_*mda 9

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

set expandtab
set tabstop=2
set shiftwidth=2
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@
Run Code Online (Sandbox Code Playgroud)

当然在"〜/ .bashrc"中:

export PATH=$PATH:$HOME/bin
Run Code Online (Sandbox Code Playgroud)

Macport使用"〜/ .profile"很多,因此PATH环境变量可能会变得很长.


roh*_*m19 9

5==将从当前光标位置缩进5行.所以你可以输入任何数字==,它会缩进行数.这是在命令模式下.

gg=G 将从上到下缩进整个文件.


Nic*_*oft 9

我没有找到我在评论中使用的方法,所以我会分享它(我认为只有vim):

  1. Esc 进入命令模式
  2. 移动到要识别的最后一行的第一个字符
  3. ctrl- v开始块选择
  4. 移动到要识别的第一行的第一个字符
  5. shift- i进入特殊插入模式
  6. 键入尽可能多的spase/tabs以缩进(例如2
  7. Esc和空格将出现在所有行中

当您不想更改vimrc中的标识/选项卡设置或记住它们在编辑时更改它时,这非常有用.

为了取消我使用相同的ctrl- v块选择选择空格并删除它d.


Kam*_*nde 9

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

我自己不得不挣扎很多才知道这很简单

.vimrc在主目录下编辑您的文件添加此行

set cindent
Run Code Online (Sandbox Code Playgroud)

在你要正确缩进的文件中

在正常/命令模式类型

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


Abh*_*rma 8

:line_num_start,line_num_end>
Run Code Online (Sandbox Code Playgroud)

例如

14,21> shifts line number 14 to 21 to one tab
Run Code Online (Sandbox Code Playgroud)

增加'>'符号以获得更多标签

例如

14,21>>> for three tabs
Run Code Online (Sandbox Code Playgroud)


Mam*_*ezo 8

<TAB>对于喜欢现代编辑器使用->Tab<S-TAB>-> Shift+缩进所选行的人Tab

vnoremap <TAB> >gv
vnoremap <S-TAB> <gv
Run Code Online (Sandbox Code Playgroud)

用法:点击V逐行视觉模式,选择您想要的行,然后点击Tab(可能带有shift),然后根据需要应用缩进并保留选择...


Joh*_*ooy 7

使用Python很多,我发现自己需要经常需要通过多个缩进来移动块.您可以使用任何块选择方法执行此操作,然后只需输入您希望在之前跳转的缩进数>

例如.V5j3>将缩进5行3次 - 如果使用4个空格进行缩进,则为12行


kap*_*pil 7

要缩进文件类型中的每一行, esc则G = gg


小智 7

我使用块模式视觉选择:

  • 去块的前面移动(在顶部或底部)。
  • Ctrl+V进入视觉块模式。
  • 导航以选择行前面的列。
  • I( Shift+ I) 进入插入模式。
  • 键入一些空格。
  • Esc。所有线路都会移动。

这不是一个单一任务者。有用:

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


Kul*_*ani 7

  • 对于代码块,{}:=+%

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

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

注意:'gg' 表示转到第 1 行,'=' 是缩进命令,'G' 将光标移动到文件末尾


Eri*_*ski 6

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

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

  1. 选择要缩进的代码块.Ctrl+V在正常模式下使用并向下箭头选择文本.选中它后,输入:以向所选文本块发出命令.

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

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

  4. 所选文本立即缩进为3个空格.

选项2:使用Visual Line模式将vi中的代码块缩进到三个空格:

  1. 在VI中打开您的文件.
  2. 将光标放在某些代码上
  3. 处于正常模式时,按以下键:

    Vjjjj:le 3
    
    Run Code Online (Sandbox Code Playgroud)

    解释你做了什么:

    V 意味着开始选择文字.

    jjjj 箭头向下4行,突出显示4行.

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

    le 3 意味着缩进突出显示的文本3行.

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

选项3:使用Visual Block模式和特殊插入模式增加缩进:

  1. 在VI中打开您的文件.
  2. 将光标放在某些代码上
  3. 处于正常模式时,按以下键:

    Ctrl+V

    jjjj
    
    Run Code Online (Sandbox Code Playgroud)

    (按空格键5次)

    Esc Shift+i

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


ABN*_*ABN 6

  1. 按“SHIFT + v”进入VISUAL LINE模式。
  2. 使用光标键或“j”和“k”键选择要缩进的文本。
  3. 要缩进,请按“SHIFT + 点”(> 字符)。要向左缩进,请按“SHIFT + 逗号”(< 字符)。

来源:https : //www.fir3net.com/UNIX/General/how-do-i-tab-multiple-lines-within-vi.html


Kay*_*ayV 6

对于苹果机来说,

  1. 使用vim打开文件

    vim 部署1.yml

  2. 使用 Shift +“v”然后使用“向上”或“向下”键选择行

    在此输入图像描述

  3. 使用 Shift + '>' 或 Shift + '<' 缩进所选行

    在此输入图像描述