【问题标题】:Indent multiple lines quickly in vi在vi中快速缩进多行
【发布时间】:2010-09-19 03:33:07
【问题描述】:

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

【问题讨论】:

    标签: vim editor indentation vi


    【解决方案1】:

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

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

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

    【讨论】:

    • 我使用 >i}(缩进内部 {} 块)。在 vim 中工作。不确定它在 vi 中是否有效。
    • 我的问题(在 gVim 中)是命令 > 缩进超过 2 个空格(我只想要两个空格,但 > 缩进 5 个空格)
    • @Kamran:请参阅shiftwidth 设置以了解更改方式。
    • @MattStevens:您可以在此处找到有关此现象的扩展讨论:meta.stackexchange.com/questions/9731/…
    • 我经常连续多次缩进视觉块,例如修复一些粘贴到 XML 文件中的标签。与其每次都在可视模式下重新选择块,不如使用“gv”来重用最后一个可视块。参考superuser.com/questions/220666/…
    【解决方案2】:

    这个答案总结了这个问题的其他答案和cmets,它根据Vim documentationVim wiki添加了额外的信息。为简洁起见,此答案不区分 Vi 和 Vim 特定命令。

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

    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
    

    参考文献

    【讨论】:

    • 这个答案和上面的答案都很棒。但我 +1 是因为它让我想起了“点”运算符,它重复了最后一个命令。当需要将整个块缩进几个移位空间(或缩进)而不需要一直按&gt;} 时,这非常很有用。非常感谢
    • 5>> 缩进 5 行:此命令缩进 第五 行,而不是 5 行。这可能是由于我的 VIM 设置,还是您的措辞不正确?
    • @Wipqozn - 这很奇怪。在 Vim 7.2.330 上测试过,它对我来说绝对缩进了接下来的五行。
    • >42gg 从当前位置缩进到第 42 行。
    • 很棒的总结!另请注意,“缩进块内”和“缩进所有块”(a{ 等)也适用于括号和括号: >a( 之外,它们还适用于 d、c、y 等)
    【解决方案3】:

    一个很大的选择是:

    gg=G
    

    速度非常快,而且所有内容都会缩进 ;-)

    【讨论】:

    • 我有一个 XML 文件并打开了语法高亮。键入gg=G 只是将每一行从位置1 开始。所有的空格都已被删除。还有什么特定于 XML 的吗?
    • 我认为 set cindent 应该在 vimrc 中或者应该在运行该命令之前运行 :set cindent
    • 我认为必须先设置cindent。 @asgs 我认为这只适用于 cstyle 编程语言。
    【解决方案4】:

    也可以试试这个C-indenting缩进。更多信息请:help =

    ={

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

    或者只是:

    ==

    自动缩进当前行。

    【讨论】:

    • 对我不起作用,只是将我的光标转储到“我所在的当前代码块”的左大括号上方的行。
    【解决方案5】:

    更多视觉人的按键:

    1. 进入命令模式:
      Escape

    2. 移动到要缩进的区域的开头:
      hjkl kbd>

    3. 开始一个区块:
      v

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

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

    6. 对块执行缩进:
      >

    【讨论】:

    • 这很好,但它使用空格而不是制表符。有什么办法可以解决这个问题?
    • 如果它使用空格而不是制表符,那么可能是因为您将缩进设置为使用空格。 =)。
    • 当 'expandtab' 选项关闭时(这是默认设置)Vim 尽可能使用 来进行缩进。 ( :help :> )
    • 我更改的唯一与制表符/空格相关的 vim 设置是 :set tabstop=3。它实际上是每次我使用 >>: "" 时插入的。与缩进块相同。有什么想法吗?
    • 您要查看“空格与制表符”的三个设置是 1. tabstop 2. shiftwidth 3. expandtab。你可能有“shiftwidth=5 noexpandtab”,所以一个“tab”是3个空格,缩进级别是“5”个空格,所以它用1个tab和2个空格组成了5个。
    【解决方案6】:

    所有命令的主人是
    gg=G

    这会缩进整个文件!

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

    缩进当前行
    ==

    缩进当前行下面的所有行

    =G

    在当前行下面缩进n

    n==

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

    4==

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

    =%

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

    【讨论】:

    • 这只是在vim,而不是vi
    • 不是在我的 Solaris 或 AIX 机器上它没有。等号键一直是我的标准临时宏分配之一。您确定您查看的不是vim 链接为vi 吗?
    • 是的,在 Linux 上,vi 几乎总是指向 vim 的链接。尝试在 vi 中运行 :ve 命令。
    • 我喜欢这样的答案:清晰、准确、简洁。在 Debian Jessie 为我工作。谢谢,@SJain
    • 因为我使用的是 vim,而不是 vi,所以我很兴奋这个答案就在这里。谢谢。
    【解决方案7】:

    除了the answer already given 和接受之外,还可以放置一个标记,然后从当前光标缩进所有内容。

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

    【讨论】:

    • 这真的很有用。我将不得不查找所有适用于此的方法。我知道 d'a 和 y'a,还有什么?
    • 这非常有用,因为它避免了计算要缩进多少行的需要。
    【解决方案8】:

    转到正文的开头

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

    【讨论】:

      【解决方案9】:

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

      vnoremap < <gv
      
      vnoremap > >gv
      

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

      【讨论】:

      • 要多次缩进所选内容,只需按 。重复上一个命令。
      • . 的问题。在这种情况下,你必须移动你的手指。使用@mike 的解决方案(与我使用的相同),您已经将手指放在缩进键上,并且可以继续敲击它以保持缩进而不是切换和做其他事情。使用期间需要更长的时间,因为您必须移动双手,并且需要更多的思考,因为这是第二次不同的操作。
      【解决方案10】:

      除了提供的解决方案之外,我还喜欢使用&gt;} 一次处理一个段落

      【讨论】:

      • 是的,这就是为什么我最大的烦恼之一是空白行上的空白:它们破坏了 vim 的“段落”概念。
      【解决方案11】:

      假设您使用 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 行缩进移动到 右边)。

      【讨论】:

        【解决方案12】:

        Vim 用户界面的美妙之处在于它的一致性。编辑命令由命令和光标移动组成。 光标移动总是一样的:

        • H 到屏幕顶部,L 到底部,M 到中间
        • nG 转到第 n 行,G 单独到文件底部,gg 到顶部
        • n 移动到下一个搜索匹配,N 到上一个
        • } 到段落结尾
        • % 到下一个匹配的括号,无论是括号还是标签种类
        • 输入到下一行
        • 'x 标记 x 其中 x 是一个字母或另一个 '
        • 更多,包括 wW 用于单词,$0 到行的提示,等等,因为不是 line 动作,所以不适用于此处。

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

        因此,对于从光标位置缩进到屏幕顶部的行,您可以执行 >H, >G 缩进到文件底部。

        如果不是键入 >H,而是键入 dH,那么您将删除同一个块行数,cH 用于替换它,等等。

        某些光标移动更适合特定命令。特别是,% 命令可以方便地缩进整个 HTML 或 XML 块。如果文件突出显示了语法 (:syn on),则将光标设置在标签的文本中(例如,在

        的“i”中并输入 >% 将缩进到结束的
        标记。

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

        【讨论】:

        • 我会说 vi/vim 大部分是一致的。例如,D 的行为与 S 和 Y 不同! :)
        • 我没想到我会在这里学到比缩进更多的东西。所以&gt;* 会做一件有趣的事情,&lt;header&gt;ddd&lt;/header&gt;,它会缩进整个块,因为* 会转到下一个header
        【解决方案13】:

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

        :2,10norm 10i 
        

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

        :%norm 5i_
        

        或者更花哨的东西:

        :%norm 2i[ ]
        

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

        :1,20norm i#
        

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

        :%norm 5x
        

        【讨论】:

        • 这是从文件的左侧开始...不是块的当前位置
        • 能够使用它来修复正则表达式范围::g/^@.\{-}{\n/,/^}\n}/norm &gt;&gt; 重新缩进特定模式块(css 文件),很难弄清楚这一点,这是一个巨大的帮助,谢谢
        【解决方案14】:

        这样做:

        $vi .vimrc
        

        并添加这一行:

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

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

        【讨论】:

          【解决方案15】:
          :line_num_start,line_num_end>
          

          例如,

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

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

          例如,

          14,21>>> for three tabs
          

          【讨论】:

          • 显然有很多方法可以解决这个问题,但这是最容易实现的,因为在 vim 中默认显示行号并且不需要数学。
          • @HoldOffHunger 默认情况下不显示行号。您需要使用:set number 来切换行号(默认情况下它们是关闭),或者将set number 放在您的vimrc 中。
          【解决方案16】:

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

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

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

            :'&lt;,'&gt;s/^/ /g

          6. 或者用前导标签替换:

            :'&lt;,'&gt;s/^/\t/g

          7. 简要说明:

            '&lt;,'&gt; - 在可视范围内

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

            (或)

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

          【讨论】:

            【解决方案17】:

            &gt;}&gt;{ 从当前行缩进到下一段

            &lt;}&lt;{ 相同的取消缩进

            【讨论】:

              【解决方案18】:

              我喜欢为缩进标记文本:

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

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

              【讨论】:

                【解决方案19】:

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

                【讨论】:

                  【解决方案20】:

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

                  【讨论】:

                  • 太棒了,正是我想要的(一种插入特定数量空格的方法——降价代码的 4 个空格——覆盖我的正常缩进)。在我的情况下,我想在可视模式下缩进特定数量的行,所以 shift-v 突出显示这些行,然后 :'&lt;,'&gt;le4 插入空格。谢谢!
                  【解决方案21】:

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

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

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

                  【讨论】:

                    【解决方案22】:

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

                    1. Esc 进入命令模式
                    2. 移动到要缩进的最后一行的第一个字符
                    3. Ctrl + V 开始块选择
                    4. 移动到要缩进的第一行的第一个字符
                    5. Shift + I 进入特殊插入模式
                    6. 键入尽可能多的空格/制表符以缩进(例如两个
                    7. Esc,所有行都会出现空格

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

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

                    【讨论】:

                      【解决方案23】:

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

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

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

                        set cindent
                        

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

                      • 普通/命令模式类型

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

                      【讨论】:

                        【解决方案24】:

                        经常使用 Python,我发现自己经常需要将块移动不止一个缩进。您可以使用任何块选择方法来执行此操作,然后只需在 &gt; 之前输入您希望跳转的缩进数

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

                        【讨论】:

                          【解决方案25】:

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

                          【讨论】:

                            【解决方案26】:

                            我使用块模式视觉选择:

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

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

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

                            【讨论】:

                            • 这很麻烦,但是如果你在核心VIM之外进行格式化(例如,使用vim-prettier而不是默认缩进引擎)。否则,使用 &gt; 会严重破坏 Prettier 完成的格式设置。
                            • 很有趣,我觉得它一点也不麻烦。这不是单任务!学习这种方法除了缩进之外还有很多用途。
                            • 我发现它比公认的答案更好,因为我可以看到正在发生的事情、我选择的行和我正在做的动作,而不仅仅是输入某种 vim 咒语。
                            【解决方案27】:
                            • 对于代码块,{}:= + %

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

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

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

                            【讨论】:

                              【解决方案28】:
                              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

                              【讨论】:

                                【解决方案29】:

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

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

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

                                2. 命令行中会出现以下内容::'&lt;,'&gt;

                                3. 要将缩进设置为三个空格,请键入 le 3 并按 Enter。这就是出现的内容::'&lt;,'&gt;le 3

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

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

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

                                  Vjjjj:le 3
                                  

                                  您所做的解释:

                                  V 表示开始选择文本。

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

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

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

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

                                方案三:使用可视块模式和特殊插入模式增加缩进:

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

                                  Ctrl+V

                                  jjjj
                                  

                                  (按空格键五次)

                                  Esc Shift+i

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

                                【讨论】:

                                  【解决方案30】:

                                  将所有文件缩进四:

                                  esc 4G=G
                                  

                                  【讨论】:

                                  • ...什么? '缩进4个空格'?不,这会跳转到第 4 行,然后使用当前选择的缩进模式(如果有的话)缩进从那里到文件末尾的所有内容。
                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2010-09-20
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2019-01-22
                                  • 2012-03-09
                                  • 2019-04-19
                                  • 2019-07-27
                                  相关资源
                                  最近更新 更多