缩进延续线的方式取决于它们是否在新行上开始

时间:2012-10-04 21:17:23

标签: ruby vim indentation auto-indent

我正试图让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

谢谢!

1 个答案:

答案 0 :(得分: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,然后再增加一个返回的缩进{{1 (或&shiftwidth)。检查它是否有效,如果没有,请撤消,然后转到下一个&sw,直到找到它为止。

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

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