带有换行符的 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 缩进级别传递到后续行。要使其根据语法缩进,您还需要指定 smartindentcindent 之类的标志。

【讨论】:

缩进不是问题,我只想在输入正确缩进时自动插入换行符 我很困惑。您是否处于插入模式之外?如果你按i 然后Return,你会得到你想要的行为吗? 是的,我处于插入模式,我想要的是当我在 我希望 vim 将我放在结束时的新行之后按 enter 时,基本上是我问题中的第一个块。 【参考方案2】:

把它放在你的 .vimrc 中:

imap <C-Return> <CR><CR><C-o>k<Tab>

假设 autoindentsmartindent 设置正确,在大括号之间键入 Ctrl + Return 会将光标放在您想要的位置。

【讨论】:

有没有映射它只是输入寿?我一直在使用 Eclipse,所以我有点习惯按 Enter 键。 或者是否可以将其集成到特定语言的缩进文件中? 我认为将这样的功能映射到常规 Return 将意味着使其成为一个真正的功能,并且每次按下键时至少进行两次 RegExp 测试。好像有点矫枉过正了。那,恐怕我还不够先进。不过,为缩进文件 +1。 这里有一个细微的变化,它与重新映射 imap &lt;C-Return&gt; &lt;CR&gt;&lt;CR&gt;&lt;C-o&gt;k&lt;C-t&gt; 的插件更兼容 谢谢,实际上我昨天找到了另一个:imap &lt;C-Return&gt; &lt;CR&gt;&lt;CR&gt;&lt;C-o&gt;k&lt;S-s&gt;&lt;S-s&gt; 在正确的缩进级别开始插入。另外我认为使用inoremap 应该可以防止副作用。【参考方案3】:

我发现delimitMate 完全符合您的描述以及更多功能(即自动插入结尾)。请注意,您必须通过将 let delimitMate_expand_cr=1 添加到您的配置来告诉 delimitMate 扩展回车。

根据我的观察,这正是 TextMate 和 SublimeText 中的行为。

【讨论】:

delimitMate + neocomplcache 用户仅供参考:如果您使用默认的 neocomplcache .vimrc 设置,则需要调整 映射以适应这两个插件。更多信息here。我的 .vimrc 现在有 imap &lt;expr&gt; &lt;CR&gt; pumvisible() ? neocomplcache#smart_close_popup() : '&lt;Plug&gt;delimitMateCR' 并且两个插件都像我希望的那样工作 For delimitMate expand_cr_1 最近没有工作。相反,您可以使用imap &lt;expr&gt; &lt;CR&gt; pumvisible() ? "\&lt;c-y&gt;" : "&lt;Plug&gt;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 进行更改。 cindentautoindent 将添加所需数量的 Tab。 附言我不擅长调整 vim,所以一些解释可能不太准确。这就是我认为它的工作原理。

【讨论】:

我在最后一行的末尾添加了一个“”,使其中间行缩进一步。 IE。 inoremap 【参考方案5】:

在文件的底部,我正在使用:

# 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 自动缩进的主要内容,如果未能解决你的问题,请参考以下文章

vim里设置tab及自动换行

Vim编辑器的自动缩进设定

vi vim 括号自动缩进设置及解释

vim粘贴取消自动缩进

Vim自动缩进配置原理和tab键替换空格-Vim使用技巧

VIM 自动缩进 自动对齐