50

私は長年の Vim ユーザー (3 ~ 4 年) で、最近、深くネストされたコードを扱い始めました。このコードは、タブではなくスペースでインデントされています。多くのレベルの深いものを見ているときに、コードのどのブロックにいるかを追跡するのに役立つ、クリーンで気を散らさないインデントの表示が必要です。

:set list 

タブとエンドライン文字のみを表示します。各インデント レベルを次第に暗い色で強調表示するプラグインを 1 つ見つけましたが (現時点では掘り下げることができないようです)、これは視覚的に魅力的ではありません。理想的には、各インデント レベルで細い垂直線を表示したいと考えています。多くの新しいエディターにはこの機能がありますが、私はまだ Vim をあきらめたくありません。

これを達成する方法を知っている人はいますか?

4

7 に答える 7

72

この答えはパーティーに少し遅れており、恥知らずなプラグでもあります。:)

とにかく、私のIndent-Guides.vimプラグインを試してみてください。これは、vimにインデントガイドがないことに関する私自身のかゆみを掻くために作成されました。誰かがやって来てそれを作るのを待つのにうんざりしていたので、自分でやっただけです。

特徴:

  • タブとスペースのインデントスタイルの両方を検出できます。
  • 配色を自動的に検査し、適切な色を選択します(gVimのみ)。
  • インデントレベルを交互の色で強調表示します。
  • gVimの完全サポートとTerminalVimの基本サポート。
  • Windows gVim 7.3で動作するようです(ただし、広範なテストは行っていません)。
  • インデントガイドのカスタマイズ可能なサイズ。スキニーガイド(ソフトタブのみ)。
  • カスタマイズ可能な開始インデントレベル。

プラグインの動作のスクリーンショットをいくつか示します。ここにマウスを置いて、をクリックします

于 2011-02-11T10:58:21.213 に答える
33

コードをスペースでインデントする場合は、私のプラグインを試すことができます: https://github.com/Yggdroot/indentLine、上記の回答が言及しているように、細い垂直線は表示されますが、太い垂直線は表示されません。タブでコードをインデントする場合は、:set list lcs=tab:\|\ (here is a space)

于 2012-12-06T05:02:55.180 に答える
30

タブを使用してインデント ガイドを表示し、ファイルを保存する前にタブを削除できます。

" use 4 spaces for tabs
set tabstop=4 softtabstop=4 shiftwidth=4

" display indentation guides
set list listchars=tab:❘-,trail:·,extends:»,precedes:«,nbsp:×

" convert spaces to tabs when reading file
autocmd! bufreadpost * set noexpandtab | retab! 4

" convert tabs to spaces before writing file
autocmd! bufwritepre * set expandtab | retab! 4

" convert spaces to tabs after writing file (to show guides again)
autocmd! bufwritepost * set noexpandtab | retab! 4
于 2010-01-29T05:09:13.790 に答える
17

次のコマンドは、入力時にインデント レベルを示すドットを表示するように Vim を構成します。カーソルが行から離れると、ドットは魔法のように消えます。

:set list listchars=tab:»-,trail:·,extends:»,precedes:«
于 2010-01-29T15:50:44.427 に答える
16

おそらく最も効果的な解決策は、マッチ ハイライトを使用してインデント ガイドを「描画」することです。それがどのように役立つかを理解するには、次の例を見てください。

:match Search /\%(\_^\s*\)\@<=\%(\%1v\|\%5v\|\%9v\)\s/

強調表示—検索の強調表示グループを使用します。もちろん、他のグループを使用することもできます。最初、5 番目、および 9 番目 (継続することができます) の仮想列は、行の先頭から空白だけが前にあるスペース文字で占められています。したがって、これにより、高々 3 レベルの深さの 4 スペースのインデントが強調表示されます。

このアイデアを一般化するために残っている唯一のことは、より深いインデント レベルを処理し、実際のインデント幅を使用するために、現在のバッファーtextwidthと設定に従って、上記と同様のパターンを生成する手順です。shiftwidthこのタスクは、以下の関数に示すように簡単に自動化できます。

function! ToggleIndentGuides()
    if exists('b:indent_guides')
        call matchdelete(b:indent_guides)
        unlet b:indent_guides
    else
        let pos = range(1, &l:textwidth, &l:shiftwidth)
        call map(pos, '"\\%" . v:val . "v"')
        let pat = '\%(\_^\s*\)\@<=\%(' . join(pos, '\|') . '\)\s'
        let b:indent_guides = matchadd('CursorLine', pat)
    endif
endfunction

現在のバッファでインデントガイドが必要なときはいつでも、 でオンに切り替えることができます:call ToggleIndentGuides()。もちろん、ハイライト グループを変更したり (またはインデント ガイドで使用する専用のグループを作成したり)、そのための便利なマッピングをセットアップし、autocmd一部のファイル タイプに対して から呼び出すことができます。

例として、上記のアプローチのわずかに拡張されたバージョンを実装するhttps://gist.github.com/734422.vimrcの私のファイルから構成を強調表示するインデント ガイドを参照してください。

于 2010-01-30T05:31:26.343 に答える
1

この VIM プラグインBlockHLを試してみてください。これ は、連続する各レベルのインデントを異なる方法で色分けします。

編集:何の言語を使用していますか? このプラグインは C スタイル言語用です。

于 2010-01-28T22:06:38.763 に答える
0

Indent-Guides.vim プラグインを使用し、必要なときに ig の使用を切り替えます。時々それは迷惑になるかもしれません:)

于 2015-06-16T05:14:37.093 に答える