Indent multiple lines quickly in vi
应该是微不足道的,它甚至可能在帮助中,但我不知道如何导航它。如何在vi中快速缩进多行?
使用>命令。要缩进5行,5>>。要标记一个行块并缩进它,vbkbdbdykbdjbabdxkbdxkbdjbabdxkbdxkbdxkbd>缩进3行(仅限VIM)。要缩进大括号块,请将光标放在其中一个大括号上,然后使用>%,或者从块内的任何位置使用>iykbdbackbd。
如果要复制周围的文本块,并且需要在新位置对齐块的缩进,请使用]bdbbakbd,而不是仅使用p。这将使粘贴的块与周围的文本对齐。
另外,
这个答案总结了这个问题的其他答案和评论,并添加了基于VIM文档和VIM wiki的额外信息。为了简洁起见,这个答案不能区分vi和vim特定的命令。
在下面的命令中,"重新缩进"表示"根据缩进设置缩进行"。
常规命令
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 |
您可以用
另外,记住
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缩进,有关详细信息,请执行
这将自动缩进您所在的当前代码块。
或者只是:
自动缩进当前行。
按键可以让更多的人看到:
进入命令模式:< BR>escapeBKBD(escapeBKBD)
移动到要缩进的区域的开头:< BR>HJBL&UARR;&DARR;&LARR;&RARR;
启动块:< BR>v
移动到要缩进的区域的末尾:< BR>HJBL&UARR;&DARR;&LARR;&RARR;
(可选)键入所需的缩进级别数< BR>0.9
在块上执行缩进:< BR> >
除了已经给出和接受的答案之外,还可以放置一个标记,然后从当前光标缩进到标记。因此,在需要缩进块顶部的位置输入
所有命令的掌握者是< BR>
这将缩进整个文件!
下面是一些简单而优雅的命令,用于在vim或gvim中快速缩进行。
缩进当前行< BR>
缩进当前行下方的所有行
在当前行下缩进
例如,在当前行下缩进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型
- …
- 2型
你明白了。
(空行不会缩进,我觉得这有点好。)
我在(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是字母或其他'
- 更多,包括w和w for word,$或0 to tips of the line,等等,这些在这里不适用,因为它们不是线移动。
因此,为了使用vim,您必须学会移动光标并记住一系列命令,例如> to indent(和< to"outment")。因此,要将光标位置的行缩进到屏幕顶部,请执行>bdbdbkbd,>bdgbbd以缩进到文件底部。
如果不键入>bdh,而是键入dbkbdykbdh,则删除相同的行块,用cbdh替换行块,等等。
一些光标移动更适合特定的命令。特别是,%命令可以方便地缩进整个HTML或XML块。如果文件的语法突出显示(
这就是Vim的工作原理:必须只记住光标的移动和命令,以及如何混合它们。因此,我对这个问题的回答是"转到要缩进的行块的一端,然后键入>命令,并移动到块的另一端"。如果缩进被解释为移动行,=如果缩进被解释为漂亮的打印。
这样做
1 | $vi .vimrc |
加上这一行
1 | autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent |
这仅适用于cpp文件,您也可以通过修改文件类型对其他文件类型执行此操作…
使用
如果您不希望更改
替换为3个前导空格:
或替换为前导标签:
简要说明:
(或)
还有一种方法尚未被提及——您可以使用
1 | :2,10norm 10i |
记住,命令末尾必须有空格字符-这将是我们想要插入的字符。我们还可以用任何其他文本缩进行,例如,用5个下划线字符缩进文件中的每一行:
1 | :%norm 5i_ |
或者更花哨的东西:
1 | :%norm 2i[ ] |
更实际的例子是用字符注释bash/python/etc代码:
1 | :1,20norm i# |
要重新缩进,请使用xbakbd而不是abbd。例如,要从每行中删除前5个字符:
1 | :%norm 5x |
我喜欢为缩进标记文本:
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"混淆,因此路径环境变量可能会变长。
我在评论中找不到我使用的方法,所以我将分享它(我只认为Vim):
当您不想更改VIMRC中的标识/选项卡设置或在编辑时记住更改时,这很有用。
要取消缩进,我使用相同的ctrl vbackbd块选择空格并用d删除它。
我不知道为什么很难找到这样一个简单的答案…
我自己也很努力才知道这一点它很简单
在主目录下编辑您的
1 | set cindent |
在要正确缩进的文件中
在正常/命令模式下类型
1 2 | 10== (this will indent 10 lines from the current cursor location ) gg=G (complete file will be properly indented) |
在
没有任何值的
这在
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,我发现自己经常需要将块移动不止一个缩进。您可以通过使用任何块选择方法来实现这一点,然后只需在
例如,
如何立即用空格缩进vi中突出显示的代码:
选项1:使用可视块模式将vi中的代码块缩进到三个空格中:
选择要缩进的代码块。在正常模式下使用ctrl+v并向下箭头选择文本。选择时,输入
命令行中将显示以下内容:
要将缩进设置为3个空格,请键入
所选文本将立即缩进为3个空格。
选项2:使用可视行模式将vi中的代码块缩进到三个空格中:
在正常模式下,按以下键:
1 | Vjjjj:le 3 |
你所做的解释:
所选代码将立即增加或减少到三个空格缩进。
选项3:使用可视块模式和特殊插入模式增加缩进量:
在正常模式下,按以下键:
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"表示将光标移动到文件末尾。
假设
1 2 3 4 5 | int main() { line1 line2| line3 } |
你可以做
1 2 3 4 5 | int main() { line1 line2| line3 } |
现在假设行是连续的,但在一个块之外,例如:
1 2 3 4 5 | do line2| line3 line4 done |
要缩进第2行到第4行,您可以直观地选择行并键入
1 2 3 4 5 | do line2| line3 line4 done |
注意,