关于vim:在vi中快速缩进多行

Indent multiple lines quickly in vi

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


使用>命令。要缩进5行,5>>。要标记一个行块并缩进它,vbkbdbdykbdjbabdxkbdxkbdjbabdxkbdxkbdxkbd>缩进3行(仅限VIM)。要缩进大括号块,请将光标放在其中一个大括号上,然后使用>%,或者从块内的任何位置使用>iykbdbackbd。

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

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


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

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

常规命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>   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是有效的块缩进命令。请看"缩进代码块"以获得一个很好的示例来尝试这些命令。

另外,记住

1
.    Repeat last command

,因此可以方便地重复缩进命令。

重新缩进完整文件

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

1
gg=G  Re-indent entire buffer

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

1
2
3
4
" Re-indent all your c source code:
:args *.c
:argdo normal gg=G
:wall

或多个缓冲区:

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

在视觉模式下

1
Vjj> Visually mark and then indent 3 lines

插入模式

这些命令应用于当前行:

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

前命令

如果要缩进特定范围的行,而不移动光标。

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

使用标记缩进

另一种方法是通过标记:

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

…将光标移动到结束位置

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

控制缩进的变量

您可以在.vimrc文件中设置这些。

1
2
3
4
5
6
7
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:

1
2
3
4
if has ("autocmd")
   " File type detection. Indent based on filetype. Recommended.

    filetype plugin indent on
endif

工具书类

  • 缩进代码块
  • 可视移动块
  • 缩进源代码
  • :help =


一个大的选择是:

1
gg=G

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


也可以尝试此方法进行C缩进,有关详细信息,请执行:help =

={

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

或者只是:

==

自动缩进当前行。


按键可以让更多的人看到:

  • 进入命令模式:< BR>escapeBKBD(escapeBKBD)

  • 移动到要缩进的区域的开头:< BR>HJBL&UARR;&DARR;&LARR;&RARR;

  • 启动块:< BR>v

  • 移动到要缩进的区域的末尾:< BR>HJBL&UARR;&DARR;&LARR;&RARR;

  • (可选)键入所需的缩进级别数< BR>0.9

  • 在块上执行缩进:< BR> >


  • 除了已经给出和接受的答案之外,还可以放置一个标记,然后从当前光标缩进到标记。因此,在需要缩进块顶部的位置输入ma,尽可能向下光标,然后键入>'a(注意,可以用"a"代替任何有效的标记名)。这有时比5>>vjjj>容易。


    所有命令的掌握者是< BR>gg=G

    这将缩进整个文件!

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

    缩进当前行< BR>==

    缩进当前行下方的所有行

    =G

    在当前行下缩进n

    n==

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

    4==

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

    =%

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


    转到文本的开头

    • V查看模式。
    • 使用upbkbd/down箭头突出显示文本。
    • =可缩进突出显示的所有行。

    除了提供的解决方案外,我还喜欢一段时间用>}来做一些事情。


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

    1
    2
    3
    vnoremap < <gv

    vnoremap > >gv

    它允许您根据需要缩进所选内容。


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

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

    然后:

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

    你明白了。

    (空行不会缩进,我觉得这有点好。)

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

    1
    2
    :help visual-block
    /indent

    If you want to give a count to the command, do this just before typing
    the operator character:"v{move-around}3>" (move lines 3 indents to
    the right).


    Vim的用户界面的好处在于它是一致的。编辑命令由命令和光标移动组成。光标移动始终相同:

    • H至屏幕顶部,LABBD至屏幕底部,M至屏幕中部
    • n g转到第n行,g单独转到文件底部,gg单独转到文件顶部
    • n移动到下一个搜索匹配,n移动到上一个
    • 至段落结尾
    • %到下一个匹配括号,括号或标记类型
    • enter到下一行
    • 'x to mark x,其中x是字母或其他'
    • 更多,包括ww for word,$0 to tips of the line,等等,这些在这里不适用,因为它们不是线移动。

    因此,为了使用vim,您必须学会移动光标并记住一系列命令,例如> to indent(和< to"outment")。因此,要将光标位置的行缩进到屏幕顶部,请执行>bdbdbkbd,>bdgbbd以缩进到文件底部。

    如果不键入>bdh,而是键入dbkbdykbdh,则删除相同的行块,用cbdh替换行块,等等。

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

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


    这样做

    1
    $vi .vimrc

    加上这一行

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

    这仅适用于cpp文件,您也可以通过修改文件类型对其他文件类型执行此操作…


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

    如果您不希望更改shiftwidth或使用任何set指令,并且具有足够的灵活性,可以使用制表符、空格或任何其他字符,那么这非常有用。

  • 将光标放在块的开头
  • V切换到-- VISUAL MODE --
  • 选择要缩进的文本
  • 键入:切换到提示
  • 替换为3个前导空格:

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

  • 或替换为前导标签:

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

  • 简要说明:

    '<,'>—在视觉选择范围内

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

    (或)

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


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

    1
    :2,10norm 10i

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

    1
    :%norm 5i_

    或者更花哨的东西:

    1
    :%norm 2i[ ]

    更实际的例子是用字符注释bash/python/etc代码:

    1
    :1,20norm i#

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

    1
    :%norm 5x


    我喜欢为缩进标记文本:

  • 转到文本行的开头,然后键入m a(a是"m"方格中的标签:可以是任何字母)
  • 转到文本的结束行并键入mz(同样,z可以是任何字母)
  • :'a,'z>或:'a,'z<将缩进或升级(这是一个词吗?)
  • 哇!文本被移动(空行保持为空,没有空格)
  • PS:您可以使用:'A,'Z技术为可能使用行、数字或百分比的任何操作(d、y、s///等)标记一个范围。


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

    <}<{同一未缩进


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

    1
    2
    3
    set expandtab
    set tabstop=2
    set shiftwidth=2

    另外,能够从命令行(terminal.app)调用macvim也是很有用的,因此,因为我有以下助手目录"~/bin",我在其中放置了一个名为"macvim"的脚本:

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

    当然在"~/.bashrc"中:

    1
    export PATH=$PATH:$HOME/bin

    MacPorts经常与"~/.profile"混淆,因此路径环境变量可能会变长。


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

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


    我在评论中找不到我使用的方法,所以我将分享它(我只认为Vim):

  • esc进入命令模式
  • 移动到要识别的最后一行的第一个字符
  • ctrl v启动块选择
  • 移动到要识别的第一行的第一个字符
  • shift iakbd进入特殊插入模式
  • 键入需要缩进到的所有spas/tab(例如2
  • esc,所有行中都会出现空格。
  • 当您不想更改VIMRC中的标识/选项卡设置或在编辑时记住更改时,这很有用。

    要取消缩进,我使用相同的ctrl vbackbd块选择空格并用d删除它。


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

    我自己也很努力才知道这一点它很简单

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

    1
    set cindent

    在要正确缩进的文件中

    在正常/命令模式下类型

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

    :help left

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

    :%le3:%le 3:%left3:%left 3将用三个空格填充整个文件。

    :5,7 le 3将用3个空格填充第5行到第7行。

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

    这在vimgvim中工作。


    1
    :line_num_start,line_num_end>

    例如

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

    增加更多标签的">"符号

    例如

    1
    14,21>>> for 3 tabs


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


    经常使用python,我发现自己经常需要将块移动不止一个缩进。您可以通过使用任何块选择方法来实现这一点,然后只需在>之前输入希望跳转的缩进数。

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


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

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

  • 选择要缩进的代码块。在正常模式下使用ctrl+v并向下箭头选择文本。选择时,输入:以向所选文本块发出命令。

  • 命令行中将显示以下内容::'<,'>

  • 要将缩进设置为3个空格,请键入le 3,然后按Enter键。这就是出现的情况::'<,'>le 3

  • 所选文本将立即缩进为3个空格。

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

  • 在vi中打开文件。
  • 把光标放在一些代码上
  • 在正常模式下,按以下键:

    1
    Vjjjj:le 3

    你所做的解释:

    V表示开始选择文本。

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

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

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

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

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

  • 在vi中打开文件。
  • 把光标放在一些代码上
  • 在正常模式下,按以下键:

    CTRL+V

    1
    jjjj

    (按空格键5次)

    eBshift+i

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


  • 将所有文件缩进4:

    1
    esc 4G=G


    我使用块模式视觉选择:

    • 转到要移动的块的前面(顶部或底部)。
    • 按ctrl-v进入可视块模式。
    • 导航以选择行前面的列。
    • 按i(shift i)进入插入模式。
    • 键入一些空格。
    • 按下ESC。所有线路都将移动。

    这不是一个单工。它的工作原理是:

    • 在线条中间。
    • 在所有行中插入任何字符串。
    • 更改列(使用C而不是I)。
    • 扬克,删除,替换等…


    • 对于代码块:=+%

    • 对于所选行:shift+v使用上/下箭头键选择,然后按=

    • 对于整个文件:ggabbkbd+=+g

    注意:"g g"表示转到第1行,"="表示缩进命令,"g"表示将光标移动到文件末尾。


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

    1
    2
    3
    4
    5
    int main() {
    line1
    line2|
    line3
    }

    你可以做>i{,意思是"在(i块({内缩进(EDOCX1〔17))",得到:

    1
    2
    3
    4
    5
    int main() {
        line1
        line2|
        line3
    }

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

    1
    2
    3
    4
    5
    do
    line2|
    line3
    line4
    done

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

    1
    2
    3
    4
    5
    do
        line2|
        line3
        line4
    done

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