web-dev-qa-db-ja.com

Vimでインデントガイドを表示することはできますか?

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

:set list 

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

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

45
mjn12

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

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

特徴:

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

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

66
Nate K

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

27
Yggdroot

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

" 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
27

これにより、入力時にインデントレベルを示すドットが表示されます。ラインを離れると、ドットは魔法のように消えます。

set list listchars=tab:»-,trail:·,extends:»,precedes:«

例えば:

def test():
....print('indentation level 1')

かっこいい?

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

_: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()でオンに切り替えることができます。もちろん、ハイライトグループを変更したり(インデントガイドでのみ使用する特別なグループを作成したり)、便利なマッピングを設定したりできます。1 そのために、および/またはいくつかのファイルタイプのためにautocmdからそれを呼び出します。


1 _.vimrc_ファイルの構成を強調するインデントガイド: https://Gist.github.com/734422

15
ib.

これを試してみてくださいVIM plugin BlockHL 連続する各レベルのインデントを色分けします。

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

1
prestomation

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

0
kevin