我如何使vi-Vim从来不使用制表符(将空格转换为制表符,坏!),使制表键== 4个空格,并自动缩进代码花括号块后像Emacs ?
此外,我如何保存这些设置,这样我就不必再次输入它们了?
我见过其他与此相关的问题,但它似乎总是有点偏离我想要的。
我如何使vi-Vim从来不使用制表符(将空格转换为制表符,坏!),使制表键== 4个空格,并自动缩进代码花括号块后像Emacs ?
此外,我如何保存这些设置,这样我就不必再次输入它们了?
我见过其他与此相关的问题,但它似乎总是有点偏离我想要的。
当前回答
要在大多数文件中使用4个空格的制表符,在Makefiles中使用真正的8宽制表符字符,并在包括C/ c++在内的各种文件中使用自动缩进,请将此放在~/中。vimrc文件:
" Only do this part when compiled with support for autocommands.
if has("autocmd")
" Use filetype detection and file-based automatic indenting.
filetype plugin indent on
" Use actual tab chars in Makefiles.
autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif
" For everything else, use a tab width of 4 space chars.
set tabstop=4 " The width of a TAB is set to 4.
" Still it is a \t. It is just that
" Vim will interpret it to be having
" a width of 4.
set shiftwidth=4 " Indents will have a width of 4.
set softtabstop=4 " Sets the number of columns for a TAB.
set expandtab " Expand TABs to spaces.
其他回答
获得特定于文件类型的缩进的最好方法是在vimrc中使用文件类型插件缩进。然后你可以在.vim/ftplugin/c中指定set sw=4 sts=4 et。例如,vim,而不必为所有被编辑的文件设置全局,其他非c类型的语法也会正确地缩进(甚至是口齿不清)。
来自VIM wiki:
:set tabstop=4
:set shiftwidth=4
:set expandtab
首先,不要在Vim中使用Tab键进行手动缩进。Vim在插入模式中有一对命令,用于手动增加或减少缩进量。这些命令是Ctrl-T和Ctrl-D。这些命令观察制表符、shiftwidth和expandtab的值,并保持正确的空格和制表符的组合(最大制表符数量后面跟着任何必要数量的空格)。
其次,如果您使用自动缩进,这些手动缩进键就不必经常使用。
如果Ctrl-T而不是Tab让你困扰,你可以重新映射它:
:imap <Tab> ^T
你也可以重新映射Shift-Tab键来做Ctrl-D去缩进:
:imap <S-Tab> ^D
这里的^T和^D是可以作为Ctrl-VCtrl-T插入的文字控制字符。
有了这个映射,您仍然可以使用Ctrl-VTab在缓冲区中输入文字Tab。注意,如果这样做,即使:set expandtab是打开的,也会得到一个未展开的制表符。
与<Tab>映射类似的效果是使用:set smarttab实现的,这也会导致行前的退格显示为智能。
在smartab模式下,当Tab不在行首使用时,它没有特殊含义。这与我上面的Tab到Ctrl-T的映射不同,因为在一行的任何地方使用Ctrl-T(在插入模式下)将增加该行的缩进。
其他有用的映射可能是:
:map <Tab> >
:map <S-Tab> <
现在我们可以做一些事情,比如选择一些行,然后按Tab键将它们缩进。或者在一行上按两次Tab键(在命令模式下)来增加缩进。
如果使用适当的缩进管理命令,那么一切都由三个参数控制:shiftwidth, tabstop和expandtab。
shiftwidth参数控制缩进大小;如果你想要四个空格缩进,使用:set shiftwidth=4,或者缩写:set sw=4。
如果只这样做,那么将使用空格和制表符混合创建缩进,因为noexpandtab是默认的。使用:set expandtab。这将导致您在缓冲区中键入的制表符扩展为空格,而vim管理的缩进只使用空格。
当expandtab打开时,如果您通过所有适当的Vim机制管理缩进,那么tabstop的值就变得无关紧要了。如果制表符碰巧出现在文件中,它控制制表符的显示方式。如果你设置了tabstop=8 expandtab,然后使用Ctrl-VTab将一个硬制表符插入到文件中,它将像往常一样产生一个到下一个基于8列的制表符位置的对齐。
正如在其他几个回答中指出的那样,现在首选的方法不是使用smartindent,而是使用以下方法(在你的.vimrc中):
filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab
在你的[。vimrc:][1]文件: 设置smartindent 设置制表符= 4 设置shiftwidth = 4 设置expandtab 帮助文件需要一些时间来适应,但你读得越多,Vim就会变得越好: :帮助smartindent 更好的是,你可以将这些设置嵌入到你的源代码中以实现可移植性: :帮助自动对焦功能 查看当前设置: :设置所有 正如graywh在评论中指出的那样,smartindent已经被“工作更聪明”的cindent所取代,尽管它仍然主要用于类似c语言的语法: :帮助C-indenting
要在大多数文件中使用4个空格的制表符,在Makefiles中使用真正的8宽制表符字符,并在包括C/ c++在内的各种文件中使用自动缩进,请将此放在~/中。vimrc文件:
" Only do this part when compiled with support for autocommands.
if has("autocmd")
" Use filetype detection and file-based automatic indenting.
filetype plugin indent on
" Use actual tab chars in Makefiles.
autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif
" For everything else, use a tab width of 4 space chars.
set tabstop=4 " The width of a TAB is set to 4.
" Still it is a \t. It is just that
" Vim will interpret it to be having
" a width of 4.
set shiftwidth=4 " Indents will have a width of 4.
set softtabstop=4 " Sets the number of columns for a TAB.
set expandtab " Expand TABs to spaces.