2299

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

4

33 回答 33

2725

使用>命令。要缩进五行,5>>. 标记一行并缩进它,Vjj>缩进三行(仅限 Vim)。要缩进花括号块,请将光标放在其中一个花括号上,然后使用>%或从块内的任何位置使用>iB

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

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

于 2008-10-25T03:28:37.450 回答
1007

这个答案总结了这个问题的其他答案和评论,并添加了基于Vim 文档Vim wiki的额外信息。为了简洁起见,这个答案不区分 Vi 和 Vim 特定的命令。

在下面的命令中,“re-indent”的意思是“根据你的缩进设置缩进行”。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

您可以{}or替换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 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

参考

于 2011-03-06T17:29:30.413 回答
127

一个很大的选择是:

gg=G

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

于 2009-01-20T21:11:13.267 回答
113

也试试这个C 缩进缩进。:help =获取更多信息:

={

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

要不就:

==

自动缩进当前行。

于 2008-10-25T04:21:02.197 回答
82

更多视觉人的按键:

  1. 进入命令模式:
    Escape

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

  3. 开始一个块:
    v

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

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

  6. 在块上执行缩进:
    >

于 2008-10-25T09:16:00.620 回答
69

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

因此,输入ma您想要缩进块顶部的位置,将光标向下移至您需要的位置,然后键入>'a(注意“ a”可以替换任何有效的标记名称)。这有时比5>>or更容易vjjj>

于 2008-10-25T04:00:31.363 回答
69

所有命令的主人是
gg=G

这会缩进整个文件!

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

缩进当前行
==

缩进当前行下方的所有行

=G

缩进n当前行下方的行

n==

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

4==

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

=%

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

于 2014-04-18T18:41:23.727 回答
31

转到文本的开头

  • 按下v进入视觉模式。
  • 使用up/down箭头突出显示文本。
  • =缩进您突出显示的所有行。
于 2013-11-04T22:57:14.357 回答
30

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

vnoremap < <gv

vnoremap > >gv

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

于 2009-02-15T05:42:04.327 回答
29

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

于 2008-10-25T04:08:38.650 回答
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 行缩进向右移动)。

于 2015-01-31T19:17:54.243 回答
20

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

  • H到屏幕顶部,L到底部,M到中间
  • nG转到第n行,G单独到文件底部,gg到顶部
  • n移动到下一个搜索匹配,N到上一个
  • }到段尾
  • %到下一个匹配的括号,括号或标签类型
  • enter到下一行
  • 'x标记x其中x是一个字母或另一个'
  • 还有更多,包括wWfor word,$0线的提示等,这里不适用,因为不是线移动。

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

因此,为了将行从光标位置缩进到屏幕顶部,您>H可以>G缩进到文件底部。

如果您键入而不是键入>HdH那么您正在删除相同的行块,cH以替换它等。

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

这就是 Vim 的工作方式:人们只需要记住光标移动和命令,以及如何混合它们。所以我对这个问题的回答是“转到要缩进的行的一端,然后键入>命令并移动到块的另一端”如果缩进被解释为移动行,=如果缩进被解释为漂亮的打印。

于 2012-09-18T14:12:41.853 回答
17

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

:2,10norm 10i 

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

:%norm 5i_

或者更花哨的东西:

:%norm 2i[ ]

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

:1,20norm i#

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

:%norm 5x
于 2015-08-21T13:33:52.253 回答
14

做这个:

$vi .vimrc

并添加这一行:

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

这仅适用于 cpp 文件。您可以对另一种文件类型执行此操作,也只需修改文件类型...

于 2009-11-11T17:33:42.180 回答
13
:line_num_start,line_num_end>

例如,

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

为更多选项卡增加“>”符号。

例如,

14,21>>> for three tabs
于 2014-07-15T09:22:47.537 回答
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/gTab-在整个范围内的每一行的开头插入

于 2012-01-04T00:41:53.617 回答
12

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

<}<{相同的取消缩进

于 2012-02-17T15:16:52.450 回答
11

我喜欢为缩进标记文本:

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

PS:您可以使用该:'a,'z技术为可能使用行、数字或%.

于 2010-11-10T19:16:06.600 回答
10

对我来说,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 环境变量可能会变得很长。

于 2012-06-04T05:12:04.323 回答
10

:help left

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

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

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

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

这适用于 Vim 和 gVim。

于 2015-09-10T18:41:24.017 回答
9

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

所以你可以在==. 它将缩进行数。这是在命令模式下。

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

于 2013-05-07T07:13:15.853 回答
9

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

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

当您不想更改缩进/制表符设置vimrc或记住它们以在编辑时更改它时,这很有用。

为了取消缩进,我使用相同的Ctrl+V块选择来选择空格并使用D.

于 2013-11-05T16:19:18.740 回答
9

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

我自己也费了很大力气才知道这一点。这很简单:

  • 编辑.vimrc主目录下的文件。
  • 添加这一行

    set cindent
    

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

  • 在普通/命令模式类型

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    
于 2014-02-06T04:04:42.950 回答
8
  1. 按“SHIFT + v”进入视觉线模式。
  2. 使用光标键或“j”和“k”键选择要缩进的文本。
  3. 要向右缩进,请按“SHIFT + 点”(> 字符)。要向左缩进,请按“SHIFT + 逗号”(< 字符)。

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

于 2020-02-28T14:05:12.053 回答
7

经常使用 Python,我发现自己经常需要将块移动不止一个缩进。您可以使用任何块选择方法来执行此操作,然后只需在>

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

于 2013-07-02T07:24:33.230 回答
7

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

于 2015-03-01T13:20:25.460 回答
7

我使用块模式视觉选择:

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

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

  • 在行的中间。
  • 在所有行上插入任何字符串。
  • 更改列(使用c代替I)。
  • 猛拉,删除,替换等...
于 2017-09-28T23:59:37.367 回答
7
  • 对于代码块,{}:=+%

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

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

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

于 2018-11-15T05:36:49.433 回答
6

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

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

  1. 选择要缩进的代码块。在正常模式下使用Ctrl+V并向下箭头选择文本。当它被选中时,输入:给选定文本块一个命令。

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

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

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

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

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

    Vjjjj:le 3
    

    对你所做的解释:

    V表示开始选择文本。

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

    :告诉 vi 您将为突出显示的文本输入指令。

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

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

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

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

    Ctrl+V

    jjjj
    

    (按空格键五次)

    Esc Shift+i

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

于 2013-12-23T03:30:05.970 回答
3

要将所有文件缩进四:

esc 4G=G
于 2014-12-19T20:18:30.537 回答
3

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

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

用法:点击V逐行视觉模式,选择你想要的行,然后点击Tab(也许用shift),然后缩进应用你想要的,选择仍然......

于 2020-07-22T21:06:11.570 回答
1

对于麦克,

  1. 使用 vim 打开文件

    vim 部署1.yml

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

    在此处输入图像描述

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

    在此处输入图像描述

于 2020-10-06T10:32:29.293 回答
0

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

int main() {
line1
line2|
line3
}

您可以这样做>i{,这意味着“在 ( ) 块 ( ) 中缩进 ( )>i{ ”并获得:

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 开始可用)。

于 2018-04-25T07:14:41.943 回答