首页 文章

在vi中快速缩进多行

提问于
浏览
2013

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

30 回答

  • 105

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

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

  • 2378

    转到文本的开头

    • 按v进入可视模式 .

    • 使用向上/向下箭头突出显示文本 .

    • 按=缩进所有突出显示的行 .

  • 9

    也可以尝试使用 C-indenting 缩进,执行 :help = 以获取更多信息:

    ={

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

    要不就:

    ==

    自动缩进当前行 .

  • 7

    做这个

    $vi .vimrc
    

    并添加此行

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

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

  • 29

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

  • 6
    • 代码块{}:=%

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

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

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

  • 1

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

    <}<{ 相同的缩进

  • 14

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

  • 9

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

    • 进入命令模式:
      逃逸

    • 移动到区域的开头以缩进:
      hjkl↑↓←→

    • 开始一个块:
      v

    • 移动到区域末尾以缩进:
      hjkl↑↓←→

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

    • 执行块上的缩进:

  • 73

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

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

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

    set cindent
    

    在你要正确缩进的文件中

    在正常/命令模式类型

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

    我喜欢为缩进标记文本:

    • 转到文本行的开头然后键入ma(a是'm' ark中的标签:它可以是任何字母)

    • 转到文本的结尾行并键入mz(再次z可以是任何字母)

    • :'a,' z>或:'a,' z <将缩进或突出(这是一个字吗?)

    • 瞧!移动文本(空行保持为空,没有空格)

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

  • 18

    我使用块模式视觉选择:

    • 转到块的前面移动(在顶部或底部) .

    • 按ctrl-v进入可视区块模式 .

    • 导航以选择行前面的列 .

    • 按I(shift i)进入插入模式 .

    • 键入一些空格 .

    • 按ESC键 . 所有线路都将改变 .

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

    • 在线的中间 .

    • 在所有行上插入任何字符串 .

    • 更改列(使用c而不是I) .

    • 猛拉,删除,替换等...

  • 11

    对我来说,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
    

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

  • 7

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

    • H到屏幕顶部,L到底部,M到中间

    • nG转到行n,G单独到文件底部,gg到顶部

    • n移至下一个搜索匹配,N移至上一个

    • }到段落结尾

    • %到下一个匹配的括号,括号或标签种类

    • 进入下一行

    • 'x标记x,其中x是字母或其他字母'

    • 更多,包括w和W for word,$或0到行的提示等,这里不适用,因为不是行移动 .

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

    如果您键入dH而不是键入> H,那么您将删除相同的行块,cH用于替换它,等等 .

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

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

  • 12

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

    • Esc进入命令模式

    • 移动到要识别的最后一行的第一个字符

    • ctrl -v启动块选择

    • 移动到要识别的第一行的第一个字符

    • shift-i进入特殊插入模式

    • 键入您需要缩进的多个spase / tabs(2 for例

    • 按Esc,空格将出现在所有行中

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

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

  • 9

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

    这会缩进整个文件!

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

    缩进当前行
    ==

    缩进当前行下面的所有行

    =G

    缩进当前行下方的 n

    n==

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

    4==

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

    =%

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

  • 11

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

    :2,10norm 10i
    

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

    :%norm 5i_
    

    或者更奇特的东西:

    :%norm 2i[ ]
    

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

    :1,20norm i#
    

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

    :%norm 5x
    
  • 4

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

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

  • 21

    使用>命令 . 缩进5行,5 >> . 要标记一行和缩进,Vjj>缩进3行(仅限vim) . 要缩进花括号块,请将光标放在其中一个花括号上,然后使用>% .

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

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

  • 27

    要将所有文件缩进4:

    esc 4G=G
    
  • 61

    使用 VISUAL MODE 快速执行此操作的方法与注释代码块的过程相同 .

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

    • 将光标定位在块的开头

    • v切换到 -- VISUAL MODE --

    • 选择要缩进的文本

    • 键入 : 以切换到提示

    • 用3个前导空格替换:

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

    • 或替换为主要标签:

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

    • 简要说明:

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

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

    (要么)

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

  • 11

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

  • 0
    :line_num_start,line_num_end>
    

    例如

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

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

    例如

    14,21>>> for 3 tabs
    
  • 3

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

    vnoremap < <gv
    
    vnoremap > >gv
    

    它允许您根据需要随意缩进选择 .

  • 7

    :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对齐 .

    这适用于 vimgvim .

  • 120

    一个很大的选择是:

    gg=G
    

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

  • 25

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

    Option 1: Indent a block of code in vi to three spaces with Visual Block mode:

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

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

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

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

    Option 2: Indent a block of code in vi to three spaces with Visual Line mode:

    • 在VI中打开文件 .

    • 将光标放在某些代码上

    • 进入正常模式,按以下键:

    Vjjjj:le 3
    

    Interpretation of what you did:

    V 表示开始选择文本 .

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

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

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

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

    Option 3: use Visual Block mode and special insert mode to increase indent:

    • 在VI中打开文件 .

    • 将光标放在某些代码上

    • 进入正常模式,按以下键:

    Ctrl V

    jjjj
    

    (按空格键5次)

    Esc Shift i

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

  • 9

    假设 | 表示光标在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起可用) .

  • 9

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

    :set shiftwidth=2
    
    • 键入v(进入可视块编辑模式)

    • 使用箭头键(或使用h / j / k / l)移动光标以突出显示要缩进或取消的行 .

    然后:

    • 键入>缩进一次(2个空格) .

    • 类型2>缩进两次(4个空格) .

    • 类型3>缩进三次(6个空格) .

    • ......

    • 键入<到unindent一次(2个空格) .

    • 类型2 <到unindent两次(4个空格) .

    • 键入3 <到unindent三次(6个空格) .

    • ......

    你明白了 .

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


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

    :help visual-block
    /indent
    

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

  • 63

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

    在下面的命令中,"re-indent"表示“根据indentation settings缩进行” . shiftwidth是控制缩进的主要变量 .

    General Commands

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

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

    Re-indenting complete files

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

    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
    

    In Visual Mode

    Vjj> Visually mark and then indent 3 lines
    

    In insert mode

    这些命令适用于当前行:

    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 commands

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

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

    Indenting using markers

    另一种方法是通过markers

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

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

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

    Variables that govern indentation

    您可以在.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
    

    References

相关问题