vimで折り畳みを使って行ジャンプ専科から解脱してみた

vimの操作にてずっと行指定での移動のみ行っていましたが、最近は行番号を把握するのが辛目のファイルを扱うようになってきたため、折り畳み操作に手を出してみました。
2019.07.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ファイルの行数が増えてくると、目的の行まで移動することがやや手間になってきます。勢いをつけてスクロールをするのもありですが、スクロール玄人になりたいとは思いません。

テキストエディタにvimを使っている場合は行指定(:NUM)にて直移動ができます。但し、正確に移動する場合は肝心の行が何行か判っている前提になります。

vimはファイルタイプ動作形式を指定することで好みの形に複数の行を折り畳むことが出来るのですが、私自身は一度も折り畳みを使っていませんでした。見込み行数を推測しての行指定ジャンプ(:50 → :100 → :75)を繰り返すという方法に走っていたのが原因です。(ニアピンすると気持ちいいという理由もあります

ですが、画面上の描写がめまぐるしく変わると割と目に辛いものがあること、Cfn絡みで推定1000行を超えそうな類似項目の多いyamlを触る機会が増えたこともあり、折り畳みについて覚えつつ関連するプラグイン等にも触れてみることにしました。

折り畳み操作について

編集中の操作にて有効にしたい場合は以下のコマンドを実行します。この場合はインデントに沿います。有無言わせずに全部折り畳まれるので、初めて行った時には多分途方にくれます。

:set foldmethod=indent

慌てずに畳まれている行上(+--XX 行: )にてzOを実行しましょう。

ファイルタイプ別の折り畳み挙動設定

編集中に毎回有効にするコマンドを打つのも面倒なため、折り畳みたいファイルに対して夫々設定ファイルに記載することをお勧めします。

autocmd FileType yaml setlocal foldmethod=indent
autocmd FileType json setlocal foldmethod=syntax

ただ、最初から全部折り畳まれているため開いた時に把握し難いのも確かです。その場合、foldlevelにて初期の折り畳み位置を変えることで回避も可能です。

autocmd FileType yaml setlocal foldmethod=indent foldlevel=100
autocmd FileType json setlocal foldmethod=syntax foldlevel=100

foldmethodには以下の6種類があります。とりあえずはmanualindentsyntaxについて理解できればある程度はカバーできるのではないかと思います。

type 解説
manual 手動で折畳を定義する
indent インデントの数を折畳のレベル(深さ)とする
expr 折畳を定義する式を指定する
syntax 構文強調により折畳を定義する
diff 変更されていないテキストを折畳対象とする
marker テキスト中の印で折畳を定義する

pythonコードの折り畳みについて

foldmethodに頼る手もありますが、以下のプラグインを利用することでPythonのsyntaxに沿って手軽な折り畳みが可能になります。 tweekmonster/braceless.vim: Text objects, folding, and more for Python and other indented languages.

neovimの場合のインストール設定は以下の通りです。

[[plugins]]
repo = 'tweekmonster/braceless.vim'
on_ft = 'python'

折り畳み(fold)とハイライト(highlight-cc2)を有効にしておきます。

autocmd FileType python BracelessEnable +fold +highlight-cc2

まとめ

目的の行に向かうのが手間な時に、それ以外のコードを折り畳むことで想定的に手元へ寄せることも可能です。「まだfoldmethodは使ったことがなかった」という方は試してみると快適になるかもしれません。

今回参考にした記事

fold - Vim日本語ドキュメント

Vimメモ : BracelessでPythonコードの折り畳み、インデントハイライト - もた日記