2

私はvimに次のように新しい行から始まる継続行をインデントさせようとしています:

def foo
  open_paren_at_EOL(
      100, 200)

  a = {
      :foo => 1,
  }
end

これらの行に対するVim7.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関数の範囲内で検索してから、返されるインデントをもう1つ&shiftwidth(または&sw)増やします。動作するかどうかを確認し、動作しない場合は、元に戻してから、return実際に見つかるまで次のに進みます。

フォークすることも、ファイルをにvim-rubyコピーして必要に応じて変更することもできます。バンドルされているものよりも優先する必要があります。indent/ruby.vim~/.vim/indent/ruby.vimindent/ruby.vim

あなたが完全に目立たない解決策を探しているなら、それは難しいでしょう。GetRubyIndent理論的には、を使用して関数を圧子としてオーバーライドし、関数をsetlocal indentexpr=CustomGetRubyIndent(v:lnum)定義できます。この関数はCustomGetRubyIndent、特定の場合にのみ動作を実装し、に委任しGetRubyIndentます。そこまで行くことはお勧めしませんが、かなり厄介になる可能性があります。

于 2012-10-06T15:33:16.510 に答える