2

我试图让 vim 以这种方式从新行开始缩进续行:

def foo
  open_paren_at_EOL(
      100, 200)

  a = {
      :foo => 1,
  }
end

Vim 7.3 对这些行的默认缩进 [1] 如下所示:

def foo
  open_paren_at_EOL(
    100, 200)

  a = {
    :foo => 1,
  }
end

我尝试了多个 cino= 值,甚至尝试从 [2] 改编 .vim 脚本,但没有成功。

我的 .vimrc 在这里:

https://github.com/slnc/dotfiles/blob/master/.vimrc

谢谢!

4

1 回答 1

0

要获得这种缩进,您可以做的是找出GetRubyIndent函数的哪些区域与这些延续相关并增加返回值。对于您给出的示例,这似乎可以完成工作:

diff --git a/indent/ruby.vim b/indent/ruby.vim
index 05c1e85..6f51cf2 100644
--- a/indent/ruby.vim
+++ b/indent/ruby.vim
@@ -368,7 +368,7 @@ function GetRubyIndent(...)

  " If the previous line ended with a block opening, add a level of indent.
  if s:Match(lnum, s:block_regex)
-    return indent(s:GetMSL(lnum)) + &sw
+    return indent(s:GetMSL(lnum)) + &sw * 2
  endif

  " If the previous line ended with the "*" of a splat, add a level of indent
@@ -383,7 +383,7 @@ function GetRubyIndent(...)
    if open.pos != -1
      if open.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
        if col('.') + 1 == col('$')
-          return ind + &sw
+          return ind + &sw * 2
        else
          return virtcol('.')
        endif

我不完全确定这是否不会破坏其他任何东西,但这对我来说似乎是一个安全的改变。如果您发现不按您想要的方式缩进的情况,您可以通过困难的方式修复它:return在函数的限制内搜索,然后增加一个&shiftwidth(或&sw)返回的缩进。检查它是否有效,如果无效,请撤消然后继续下一个return,直到您真正找到它。

您可以 fork vim-ruby,或者您可以将indent/ruby.vim文件复制到~/.vim/indent/ruby.vim并根据需要进行更改。它应该优先于捆绑的indent/ruby.vim.

如果您正在寻找一个完全不引人注目的解决方案,那将是困难的。从理论上讲,您可以通过使用将函数覆盖GetRubyIndent为缩进器setlocal indentexpr=CustomGetRubyIndent(v:lnum),然后定义一个CustomGetRubyIndent函数,该函数仅在特定情况下实现您的行为并委托给GetRubyIndent. 不过,我不建议走那么远,它可能会变得相当混乱。

于 2012-10-06T15:33:16.510 回答