【问题标题】:Vim Auto Indent with newline带有换行符的 Vim 自动缩进
【发布时间】:2011-05-27 11:54:26
【问题描述】:

如何让 vim 将光标放在从新行开始的大括号内,即使用 |表示光标位置:

class {
  |
}

现在我的设置只能这样做

class {
|}

我在我的 .vimrc 文件中得到了这个 set autoindent shiftwidth=2 tabstop=2 noexpandtab

基本上我只是想要一个普通的 IDE 如何缩进它。

更新:

我找到了如何使用 inoremap { {<CR>}<Esc>O 来做到这一点

【问题讨论】:

    标签: vim indentation


    【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 2011-03-18
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        相关资源
        最近更新 更多