在vi中快速缩进多行

时间:2008-10-25 03:27:28

标签: vim editor indentation vi

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

32 个答案:

答案 0 :(得分:2437)

使用> 命令。要缩进5行, 5 > > 。要标记一行线并缩进它, V j j > 缩进3行(仅限vim )。要缩进花括号块,将光标放在其中一个花括号上并使用> 或从块中的任何位置使用>

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

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

答案 1 :(得分:924)

此回答总结了此问题的其他答案和评论,并根据Vim documentationVim wiki添加了额外信息。为简明起见,此答案不区分Vi和Vim特定的命令。

在下面的命令中,“重新缩进”表示“根据您的indentation settings缩进行”。 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是一个有效的块缩进命令。看看"Indent a Code Block"以获得一个很好的例子来尝试这些命令。

另外,请记住

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

Ex命令

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

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

使用标记缩进

另一种方法是通过markers

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

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

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

管理缩进的变量

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

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

<强>参考

答案 2 :(得分:121)

一个很大的选择是:

gg=G

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

答案 3 :(得分:107)

也可以尝试 C-indenting 缩进,:help =了解更多信息:

={

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

或者只是:

==

自动缩进当前行。

答案 4 :(得分:76)

更多视觉人士的按键:

  1. 进入命令模式:
    Escape

  2. 移动到区域的开头以缩进:
    ħ Ĵ ķ

  3. 开始一个块:
    v

  4. 移动到区域末尾以缩进:
    ħ Ĵ ķ

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

  6. 执行块上的缩进:
    &GT;

答案 5 :(得分:64)

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

答案 6 :(得分:62)

所有命令的主人是
gg=G

这会缩进整个文件!

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

缩进当前行
==

缩进当前行下方的所有行

=G

缩进当前行下面的n

n==

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

4==

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

=%

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

答案 7 :(得分:29)

转到文本的开头

  • v 进行可视模式。
  • 使用向上 / 向下箭头突出显示文字。
  • = 缩进所有突出显示的行。

答案 8 :(得分:27)

除了提供的解决方案之外,我还喜欢用>}

一次做一个段落

答案 9 :(得分:25)

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

vnoremap < <gv

vnoremap > >gv

它允许您根据需要随时缩进您的选择。

答案 10 :(得分:21)

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

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

然后:

  • 键入&gt; 缩进一次(2个空格)。
  • 键入 2 &gt; 缩进两次(4个空格)。
  • 键入 3 &gt; 缩进三次(6个空格)。
  • ...
  • 输入&lt; 取消一次(2个空格)。
  • 键入 2 &lt; 连续两次(4个空格)。
  • 键入 3 &lt; 至unindent三次(6个空格)。
  • ...

你明白了。

空行不会缩进,我觉得这很好。


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

:help visual-block
/indent
  

如果要对命令进行计数,请在键入之前执行此操作   操作员角色:“v {move-around} 3&gt;” (将第3行缩进到   右边)。

答案 11 :(得分:18)

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

  • H 到屏幕顶部, L 到底部, M 到中间
  • n G 单独转到第n行, G 到文件底部, g g 到顶部
  • n 转到下一个搜索匹配, N 到上一个
  • } 到段落
  • 到下一个匹配的括号,括号或标签类型
  • 输入到下一行
  • ' x 标记x,其中x是字母或其他'
  • 更多,包括 w W 用于单词, $ 0 到行的提示,等,这里不适用,因为不是动作。

因此,为了使用vim,你必须学习移动光标并记住一系列命令,例如&gt; 以缩进(和&lt; “突然”)。
因此,为了缩小从光标位置到屏幕顶部的行,你可以&gt; H &gt; G < / kbd>缩进到文件的底部。

如果您输入 d H ,而不是输入&gt; H ,那么您将删除相同的内容行块, c H 用于替换它等等。

某些光标移动适合特定命令。特别是,命令可以方便缩进整个HTML或XML块。
如果文件突出显示语法(:syn on),则将光标设置在标签的文本中(例如,在&lt; div&gt;的“i”中并输入&gt; 将缩进到结束&lt; / div&gt;标记。

这就是vim的工作原理:人们必须只记住光标移动和命令,以及如何混合它们 所以我对这个问题的回答是“转到要缩进的行块的一端,然后键入&gt; 命令,并移动到块的另一端”if <如果缩进被解释为漂亮打印,则em> indent 被解释为移动行 =

答案 12 :(得分:14)

这样做

$vi .vimrc

并添加此行

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

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

答案 13 :(得分: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

答案 14 :(得分:11)

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

<}<{相同的非缩进

答案 15 :(得分:11)

我喜欢为缩进标记文字:

  1. 转到文本行的开头然后输入ma(a是'm'ark中的标签:它可以是任何字母)
  2. 转到文本的结尾行并键入mz(再次z可以是任何字母)
  3. : '一个,' Z&GT;或:'a,'z&lt;会缩进还是突出(这是一个字吗?)
  4. 瞧!文本被移动(空行保持为空,没有空格)
  5. PS:您可以使用:'a,'z技术来标记任何操作(d,y,s ///等)的范围,您可以在其中使用行,数字或%

答案 16 :(得分:11)

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

:2,10norm 10i 

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

:%norm 5i_

或者更奇特的东西:

:%norm 2i[ ]

更实际的例子是用#character:

注释Bash / Python / etc代码
:1,20norm i#

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

:%norm 5x

答案 17 :(得分:9)

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

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

答案 18 :(得分:9)

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

  1. Esc 进入命令模式
  2. 移至要识别的最后一行的第一个字符
  3. ctrl - v 开始选择块
  4. 移至要识别的第一行的第一个字符
  5. shift - i 进入特殊插入模式
  6. 键入您需要缩进的任意数量的spase / tabs(例如
  7. Esc ,所有行中都会出现空格
  8. 当您不想更改vimrc中的标识/标签设置或记住它们在编辑时更改它时,这非常有用。

    要取消注意,我使用相同的 ctrl - v 块选择选择空格并用 d 删除它。

答案 19 :(得分:9)

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

我自己不得不为了解这一点而奋斗 它非常简单

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

set cindent

在您要正确缩进的文件中

在正常/命令模式下

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

答案 20 :(得分:9)

对我来说,MacVim(Visual)解决方案是,用鼠标选择并按“&gt;”,但是在将以下行放在“〜/ .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环境变量可能会很长。

答案 21 :(得分:7)

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

之前跳转的缩进数量

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

答案 22 :(得分:7)

:line_num_start,line_num_end>

e.g。

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

增加&#39;&gt;&#39;更多标签的符号

e.g。

14,21>>> for 3 tabs

答案 23 :(得分:7)

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

答案 24 :(得分:6)

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

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

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

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

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

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

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

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

      Vjjjj:le 3
      

      解释您所做的事情:

      V表示开始选择文字。

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

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

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

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

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

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

        控制+ V

        jjjj
        

        (按空格键5次)

        ESC 切换+ I

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

答案 25 :(得分:4)

将所有文件缩进4:

esc 4G=G

答案 26 :(得分:4)

我使用块模式视觉选择:

  • 前往街区前方移动(在顶部或底部)。
  • 按ctrl-v进入可视屏幕模式。
  • 导航以选择行前面的列。
  • 按I(shift i)进入插入模式。
  • 键入一些空格。
  • 按ESC键。所有行都会改变。

这不是一个单一的任务者。它有效:

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

答案 27 :(得分:3)

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

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

答案 28 :(得分:2)

  • 对于代码块{}: = +

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

    < / li>
  • 对于整个文件: gg + = + G

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

答案 29 :(得分:1)

对于Mac,

  1. 使用vim打开文件

    vim deploy1.yml

  2. 使用Shift +'v'选择行,然后使用'up'或'down'键

    enter image description here

  3. 使用Shift +'>'或Shift +'<'

    缩进选定的行

    enter image description here

答案 30 :(得分:0)

假设|表示光标在Vim中的位置。如果要缩进的文本包含在代码块中,如:

int main() {
line1
line2|
line3
}

您可以执行>i{,这意味着&#34; 缩进(>)内部(i)阻止({&# 34;得到:

int main() {
    line1
    line2|
    line3
}

现在假设这些行是连续的但在块之外,例如:

do
line2|
line3
line4
done

要缩进第2行至第4行,您可以直观地选择行并键入>。或者甚至更快,您可以>2j获得:

do
    line2|
    line3
    line4
done

请注意,>Nj表示从当前行缩进到下面的N行。如果要缩进的行数很大,则用户可能需要几秒钟来计算N的正确值。为节省宝贵的秒数,您可以使用set relativenumber激活相对号码选项(自Vim 7.3版起可用)。

答案 31 :(得分:0)

对于喜欢现代编辑者使用<TAB><S-TAB>缩进所选行的人:

vnoremap <TAB> >gv
vnoremap <S-TAB> <gv

用法: 按下V进入逐行可视模式,选择所需的行,然后按下Tab(可能带有shift键),然后根据需要应用缩进,并且选择保持不变...