题 在vi中快速缩进多行


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


1969
2017-10-25 03:27


起源




答案:


使用 > 命令。要缩进5行, >>。标记一条线并缩进它, VĴĴ> 缩进3行(仅限vim)。要缩进花括号块,请将光标放在其中一个花括号上并使用 >

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

而且, shiftwidth 设置允许您控制缩进的空格数。


2324
2017-10-25 03:28



<shift> -v也可以在Vim中选择一行。 - akdom
我使用> i}(缩进内部{}块)。在vim中工作。不确定它是否适用于vi。 - R. Martinho Fernandes
我的问题(在gVim中)是命令>缩进多于2个空格(我只想要两个空格但是缩进比如5个空格) - Kamran Bigdely
@Kamran:见 shiftwidth 设置改变它的方式。 - Greg Hewgill
@MattStevens:你可以在这里找到关于这种现象的扩展讨论: meta.stackexchange.com/questions/9731/... - Greg Hewgill


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

在下面的命令中,“重新缩进”表示“根据您的缩进行缩进行” 缩进设置“。 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 是一个有效的块缩进命令。看一眼 “缩进代码块” 一个很好的例子来尝试这些命令。

另外,请记住

.    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

缩进使用标记

另一种方法是通过 标记

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

参考


887
2018-03-06 17:29



这个答案和上面的答案都很棒。但我为此加了1,因为它让我想起了'点'运算符,它重复了最后一个命令。这是 非常 当需要将整个块缩进多个移位空间(或缩进)而无需持续按压时非常有用 >}。谢谢你 - Amit
5 >>缩进5行:此命令缩进 第五 线,而不是5行。这可能是由于我的VIM设置,还是你的措辞不正确? - Wipqozn
@Wipqozn - 这很奇怪。在Vim 7.2.330上进行测试后,它肯定会为我缩小接下来的五行。 - ire_and_curses
> 42gg从第42行开始缩进。 - Steve
总结!另请注意,“缩进内部块”和“缩进所有块”(<i {> a {etc)也适用于括号和括号:> a(<i]等(当我在它时,在除<>之外,它们也适用于d,c,y等) - aqn


一个很大的选择

gg=G

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


116
2018-01-20 21:11



我有一个XML文件,并打开语法高亮。打字 gg=G 只是将每一行从位置1开始。所有的空格都被删除了。还有其他特定于XML的东西吗? - asgs
stackoverflow.com/questions/7600860/... - Johan
我认为 set cindent 应该在vimrc或应该运行 :set cindent 在运行该命令之前 - Amanuel Nega
我认为必须首先设置cindent。和@asgs我认为这只适用于cstyle编程语言。 - Amanuel Nega


也尝试这个 C-缩进 缩进,做 :help = 了解更多信息:

={

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

要不就:

==

自动缩进当前行。


105
2017-10-25 04:21



对我来说不起作用,只是将我的光标转移到'当前代码块我'的开头括号上方的行。 - underscore_d


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

  1. 进入命令模式:
    逃逸 

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

  3. 开始一个块:
    v

  4. 移动到该区域的末尾以缩进:
    HĴķ 

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

  6. 在块上执行缩进:
    >


73
2017-10-25 09:16



这很棒,但它使用空格而不是制表符。有没有办法解决这个问题? - Shane Reustle
如果它使用空格而不是制表符,则可能是因为您设置了缩进设置以使用空格。 =)。 - Kent Fredric
当'expandtab'选项关闭时(这是默认值),Vim尽可能使用<Tab>来进行缩进。 (:帮助:>) - Kent Fredric
我改变的唯一与标签/空间相关的vim设置是:set tabstop = 3。它实际上每次我使用>>:“<tab> <space> <space>”时插入它。缩进块也一样。有任何想法吗? - Shane Reustle
您要查看“空格与标签”的三个设置是1.tabstop 2. shiftwidth 3. expandtab。您可能有“shiftwidth = 5 noexpandtab”,因此“tab”为3个空格,缩进级别为“5”空格,因此它组成5个带有1个选项卡和2个空格。 - Kent Fredric


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


62
2017-10-25 04:00



这非常有用。我将不得不查看所有有用的东西。我知道你和你,还有什么? - user606723
这非常有用,因为它可以避免计算要缩进的行数。 - ziggy


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

这会缩进整个文件!

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

缩进当前行
==

缩进当前行下面的所有行

=G

缩进 n 当前行下方的行

n==

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

4==

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

=%

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


60
2018-04-18 18:41



这只是在 vim不是 vi。 - rojomoke
@rojomoke:不,它也适用于vi - Sagar Jain
它不在我的Solaris或AIX机箱上。 equals键一直是我标准的ad hoc宏分配之一。你确定你没有看到 vim 与...相关联 vi? - rojomoke
是的,在Linux上,vi几乎总是链接到vim。尝试在vi中运行:ve命令。 - rojomoke
我喜欢这样的答案:清晰,精确和简洁。在Debian Jessie为我工作。谢谢,@ SJain - datelligence


转到文本的开头

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

29
2017-11-04 22:57





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


27
2017-10-25 04:08



是的,这就是为什么我的一个大的烦恼是空白线上的白色空间:它们弄乱了vim的“段落”概念。 - aqn


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

vnoremap < <gv

vnoremap > >gv

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


25
2018-02-15 05:42



要多次缩进选区,只需按。重复上一个命令。 - sundar
这个问题。在这种情况下,你必须移动你的手指。使用@ mike的解决方案(我使用的同一个)你已经将手指放在缩进键上,并且可以继续打击它以保持缩进而不是切换和做其他事情。使用句号需要更长的时间,因为你必须移动你的手,这需要更多的思考,因为它是第二个不同的操作。 - masukomi