带有换行符的 Vim 自动缩进
Posted
技术标签:
【中文标题】带有换行符的 Vim 自动缩进【英文标题】:Vim Auto Indent with newline 【发布时间】:2011-05-27 11:54:26 【问题描述】:如何让 vim 将光标放在从新行开始的大括号内,即使用 |表示光标位置:
class
|
现在我的设置只能这样做
class
|
我在我的 .vimrc 文件中得到了这个 set autoindent shiftwidth=2 tabstop=2 noexpandtab
基本上我只是想要一个普通的 IDE 如何缩进它。
更新:
我找到了如何使用 inoremap <CR><Esc>O
来做到这一点
【问题讨论】:
【参考方案1】:autoindent
指的是它将 current 缩进级别传递到后续行。要使其根据语法缩进,您还需要指定 smartindent
或 cindent
之类的标志。
【讨论】:
缩进不是问题,我只想在输入正确缩进时自动插入换行符 我很困惑。您是否处于插入模式之外?如果你按i
然后Return
,你会得到你想要的行为吗?
是的,我处于插入模式,我想要的是当我在 我希望 vim 将我放在结束时的新行之后按 enter 时,基本上是我问题中的第一个块。
【参考方案2】:
把它放在你的 .vimrc 中:
imap <C-Return> <CR><CR><C-o>k<Tab>
假设 autoindent
和 smartindent
设置正确,在大括号之间键入 Ctrl + Return
会将光标放在您想要的位置。
【讨论】:
有没有映射它只是输入寿?我一直在使用 Eclipse,所以我有点习惯按 Enter 键。 或者是否可以将其集成到特定语言的缩进文件中? 我认为将这样的功能映射到常规 Return 将意味着使其成为一个真正的功能,并且每次按下键时至少进行两次 RegExp 测试。好像有点矫枉过正了。那,恐怕我还不够先进。不过,为缩进文件 +1。 这里有一个细微的变化,它与重新映射imap <C-Return> <CR><CR><C-o>k<C-t>
imap <C-Return> <CR><CR><C-o>k<S-s>
和 <S-s>
在正确的缩进级别开始插入。另外我认为使用inoremap
应该可以防止副作用。【参考方案3】:
我发现delimitMate 完全符合您的描述以及更多功能(即自动插入结尾)。请注意,您必须通过将
let delimitMate_expand_cr=1
添加到您的配置来告诉 delimitMate 扩展回车。
根据我的观察,这正是 TextMate 和 SublimeText 中的行为。
【讨论】:
delimitMate + neocomplcache 用户仅供参考:如果您使用默认的 neocomplcache .vimrc 设置,则需要调整imap <expr> <CR> pumvisible() ? neocomplcache#smart_close_popup() : '<Plug>delimitMateCR'
并且两个插件都像我希望的那样工作delimitMate
expand_cr_1
最近没有工作。相反,您可以使用imap <expr> <CR> pumvisible() ? "\<c-y>" : "<Plug>delimitMateCR"
。【参考方案4】:
我有 Ubuntu 12.04,但在主目录中找不到 vimrc
文件。全局vimrc
文件位于/etc/vim/vimrc
。
此文件中几乎没有任何内容。所以对我来说,将这 3 行添加到 /etc/vim/vimrc
的末尾是有效的
set autoindent
set cindent
inoremap <CR><up><end><CR>
当您下次键入 时,它将通过组合
、Enter、
、up、end、Enter 进行更改。
cindent
和 autoindent
将添加所需数量的 Tab。
附言我不擅长调整 vim,所以一些解释可能不太准确。这就是我认为它的工作原理。
【讨论】:
我在最后一行的末尾添加了一个“在文件的底部,我正在使用:
# vim: ts=2 sw=2 sts=2 sr noet st ai si
例如Dockerfile
:
FROM centos-7
RUN ...
CMD ...
# vim: ts=2 sw=2 sts=2 sr noet st ai si
如果您只想保留缩进,请使用# vim: st ai si
【讨论】:
【参考方案6】:我在.vimrc
中写了这个
inoremap <expr> <CR> InsertMapForEnter()
function! InsertMapForEnter()
if pumvisible()
return "\<C-y>"
elseif strcharpart(getline('.'),getpos('.')[2]-1,1) == ''
return "\<CR>\<Esc>O"
elseif strcharpart(getline('.'),getpos('.')[2]-1,2) == '</'
return "\<CR>\<Esc>O"
else
return "\<CR>"
endif
endfunction
上面的代码首先检查你是否使用Enter
来确认代码完成,如果不是,它会在你输入Enter
时缩进|
。此外,它还提供html标签自动缩进。
针对您的问题:
class |
按Enter
你会得到
class
|
<html>|<html>
按Enter
你会得到
<html>
|
</html>
【讨论】:
以上是关于带有换行符的 Vim 自动缩进的主要内容,如果未能解决你的问题,请参考以下文章