当前位置:  开发笔记 > 编程语言 > 正文

在vi中快速缩进多行

如何解决《在vi中快速缩进多行》经验,为你挑选了26个好方法。

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



1> Greg Hewgill..:

使用该>命令.缩进5行,5>>.标记一行和缩进,Vjj>缩进3行(仅限vim).要缩进花括号块,请将光标放在其中一个花括号上,并使用>%块内使用的任何位置>iB.

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

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


我使用> i}(缩进内部{}块).在vim中工作.不确定它是否适用于vi.
-v也可以在Vim中选择一行.
@Kamran:请参阅[`shiftwidth`](http://vimdoc.sourceforge.net/htmldoc/options.html#'shiftwidth')设置以了解更改方法.
我的问题(在gVim中)是命令>缩进多于2个空格(我只想要两个空格但是缩进比如5个空格)
@MattStevens:你可以在这里找到关于这种现象的扩展讨论:http://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem
我经常连续多次缩进视觉块,例如将一些标签粘贴到XML文件中.不是每次都以可视模式重新选择块,而是可以使用'gv'重用最后一个视觉块.参考http://superuser.com/questions/220666/how-do-you-reuse-a-visual-mode-selection
我一直在使用control-v通过导航到线的前面进行缩进,但这显然要好得多.
@Martinho:像我这样的文本对象是Vim特有的.然后,视觉模式也是如此.
您还可以在正常模式下使用标记来分隔块,如'a'b>或命令行中的模式,如:/ begin /,/ end />
如果您丢失了选择,请使用gv重新选择
我已经开始使用[vim-pasta](https://github.com/sickill/vim-pasta)插件进行缩进感知粘贴.奇迹般有效!

2> ire_and_curs..:

这个答案总结了这个问题的其他答案和评论,并根据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


您可以{使用}或替换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 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

使用标记缩进

另一种方法是通过标记:

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 shiftIndent by 4 spaces when using >>, <<, == etc.
set softtabstop=4   "Indent by 4 spaces when pressing 

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

参考

缩进代码块

视觉上移动块

缩进源代码

:help =


这个答案和上面的答案都很棒.但我为此加了1,因为它让我想起了'dot'操作符,它重复了最后一个命令.当需要将整个块缩进多个移位空间(或缩进)而不需要按下`>}时,这非常有用.谢谢你
> 42gg从第42行开始缩进.

3> Johan..:

一个很大的选择是:

gg=G

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


http://stackoverflow.com/questions/7600860/getting-vim-to-recognize-xml
我认为必须首先设置cindent.和@asgs我认为这只适用于cstyle编程语言.
我认为`set cindent`应该在vimrc中,或者应该在运行该命令之前运行`:set cindent`

4> svec..:

也可以尝试使用C-indent缩进,:help =有关详细信息:

={

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

要不就:

==

自动缩进当前行.


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

5> Kent Fredric..:

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

    进入命令模式:
    Escape

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

    开始一个块:
    v

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

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

    在块上执行缩进:
    >


如果它使用空格而不是制表符,那么可能是因为你有缩进设置使用空格.=).
当'expandtab'选项关闭时(这是默认值),Vim尽可能使用来进行缩进.(:帮助:>)
您要查看"空格与标签"的三个设置是1.tabstop 2. shiftwidth 3. expandtab.您可能有"shiftwidth = 5 noexpandtab",因此"tab"为3个空格,缩进级别为"5"空格,因此它组成5个带有1个选项卡和2个空格.
这很棒,但它使用空格而不是制表符.有没有办法解决这个问题?

6> Daniel Spiew..:

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


这非常有用,因为它可以避免计算要缩进的行数.

7> Sagar Jain..:

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

这会缩进整个文件!

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

缩进当前行
==

缩进当前行下面的所有行

=G

缩进n当前行下方的行

n==

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

4==

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

=%

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


I love this kind of answers: clear, precise and succinct. Worked for me in Debian Jessie. Thanks, @SJain
这只是在'vim`中,而不是`vi`.
它不在我的Solaris或AIX机箱上.equals键一直是我标准的ad hoc宏分配之一.你确定你没有看到被称为"vi"的"vim"吗?
是的,在Linux上,vi几乎总是链接到vim.尝试在vi中运行:ve命令.
@rojomoke:不,它也适用于vi

8> Michael Durr..:

转到文本的开头

按下v可视模式.

使用up/ down箭头突出显示文本.

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



9> Paul Tomblin..:

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



10> Michael Ekok..:

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

vnoremap <  >gv

它允许您根据需要缩短选择时间.


要多次缩进选择,您只需按.重复上一个命令.
的问题。在这种情况下,您必须动动手指。使用@mike的解决方案(与我使用的解决方案相同),您已经可以将手指放在缩进键上,并且可以不断对其进行修改以保持缩进,而不必进行切换和其他操作。使用周期需要更长的时间,因为您必须动动双手,并且需要更多的思考,因为这是另一种不同的操作。

11> John Sonders..:

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

:set shiftwidth=2

键入v(输入视觉块编辑模式)

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

然后:

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

键入2>缩进两次(4个空格).

键入3>缩进三次(6个空格).

...

输入<一次(2个空格).

输入2<两次(4个空格).

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

...

你明白了.

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


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

:help visual-block
/indent

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



12> Juan Lanus..:

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

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

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

n转到下一个搜索匹配,N转到上一个

} 到段落结束

% 下一个匹配括号,括号中的任何一个或标签类型

enter 到下一行

'x 标记x,其中x是一个字母或另一个字母'

更多,包括wW言论,$0线的提示等,这里不适用,因为不是线条移动.

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

如果>H您键入的是输入,而不是键入,dH则删除相同的行块,cH以替换它等.

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

的"i"中,输入>%将缩进到结束标签.

这就是vim的工作原理:只需记住光标移动和命令,以及如何混合它们.
所以我这个问题的答案将是"去你要缩进的行块的一端,然后键入>命令和运动块的另一端,"如果缩进被解释为转移的线路,=如果缩进被解释为漂亮印刷.


我会说vi/vim几乎是一致的.例如,D的行为与S和Y不同!:)

13> 小智..:

做这个

$vi .vimrc

并添加此行

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

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



14> Eric Kigathi..:

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

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

    将光标定位在块的开头

    v切换到 -- VISUAL MODE --

    选择要缩进的文本

    键入:以切换到提示

    用3个前导空格替换:

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

    或者替换为主要标签:

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

    简要说明:

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

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

    (要么)

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



15> Nykakin..:

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

:2,10norm 10i 

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

:%norm 5i_

或者更奇特的东西:

:%norm 2i[ ]

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

:1,20norm i#

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

:%norm 5x



16> 小智..:

我喜欢为缩进标记文本:

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

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

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

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

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



17> 小智..:

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

<}<{同样的缩进



18> zundarz..:

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

这适用于:help leftex mode.



19> mda..:

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



20> rohitkadam19..:

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

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



21> NickSoft..:

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

    Esc 进入命令模式

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

    ctrl- v开始块选择

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

    shift- i进入特殊插入模式

    键入尽可能多的spase/tabs以缩进(例如2

    Esc和空格将出现在所有行中

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

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



22> Kamlesh Karw..:

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

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

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

set cindent

在你要正确缩进的文件中

在正常/命令模式类型

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



23> Abhishesh Sh..:
:line_num_start,line_num_end>

例如

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

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

例如

14,21>>> for three tabs



24> John La Rooy..:

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

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



25> kapil..:

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



26> Eric Leschin..:

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

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

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

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

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

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

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

    在VI中打开您的文件.

    将光标放在某些代码上

    处于正常模式时,按以下键:

    Vjjjj:le 3
    

    解释你做了什么:

    V 意味着开始选择文字.

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

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

    le 3 意味着缩进突出显示的文本3行.

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

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

    在VI中打开您的文件.

    将光标放在某些代码上

    处于正常模式时,按以下键:

    Ctrl+V

    jjjj
    

    (按空格键5次)

    Esc Shift+i

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

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有