読者です 読者をやめる 読者になる 読者になる

lightline.vimでファイルの総行数が出るように設定した

tl;dr

before:

f:id:note103:20160415022637p:plain

経緯

lightline.vimについては、以前に以下で少し書きました。

note103.hateblo.jp

この時の詳細な設定は、同記事では書かなかったのですが(すぐにいろいろ変更・調整すると思ったので)、結局大体、こんな感じでした。

gist950c9e240ce410e0f2a4b187d958058d

で、これを反映したのが、たとえばこんな感じです。

f:id:note103:20160415020731p:plain

大変素晴らしい。自分的にはほぼ理想の仕上がりでしたが、ただ使っていくうちにちょっと不満になってきたのが、その「ファイル全体の行数」がわからない、ということでした。

課題

今いる場所(行)について言えば、右から2番めの要素に割合(%)が出てくるので、「ああ、48%ということは、真ん中よりちょっと上か。といってもほとんど真ん中だけどナ」とかわかるわけですが、ただぼくの仕事っていうのは、日本語の長文を扱う編集業で、それは長〜い文章を相手に、1行目から最後の行まで、地道にひとつひとつ「未完成→完成」の変換作業をしていくようなものだったりします。

それはたとえてみればマラソンのようなもので、その時にランナーたる私が知りたいのは、「このコースは全長何キロで、自分はあと何キロ走ればいいんだろう?」ということ。

そしてしかし、割合(%)という要素は、結局全長によって1%あたりの量が変わってしまうので、複数のファイルで並行作業をしているときにはあまり参考にできないというか、直感的に分量を把握することができません。
(1%あたりの作業量がファイルごとに異なるということ)

つまり、各ファイルにおける作業量や進捗率を適切に見積もるためには(少なくともぼくの仕事では)そのファイルのトータル行数という情報が大変有益というか、ある意味不可欠なものになります。

試行

ではそのトータル行数を一体どうやって捕まえればいいのか、と、まず簡単に検索してみると、Vimのステータスラインでそれを出す方法はけっこうサクサク引っかかって、

%L

を使えばいい、と書いてあります。

そこでさっそく、ひとつ前の記事で紹介したウィンドウサイズを求める関数(LightLineWinform)を元にこんな関数を作って、

function! LightLineTotalinfo()
  return '[%L]'
endfunction

lightline変数の中に入れてみましたが、結果はこんな感じで……

f:id:note103:20160415020746p:plain

うまく展開されません。

この段階ではまだ、そのウィンドウサイズの関数を作った応用でいけると考えていたので、「%L」という情報が不十分なのかもしれないとしばらく彷徨していましたが、どうも考えていたような解決策が見つからないので、そこでようやく本家のドキュメント(ヘルプ)へ。

github.com

しかし、そのページを上から下まで眺めて回っても、どうも求める解法が出てくる気配がありません。

転回

ここで二度目のハマり状態に入ったわけですが、少し頭を切り替えて、「そういえば、今一番右に表示されている〈行 : 列〉の情報って、どうやって設定してるんだっけ?」と確認してみると、それまで気づいていなかったのですが、自分が設定している変数や関数の中には、その情報が明記されていません。

つまり、この部分、

f:id:note103:20160415022637p:plain

これを規定するコードが自分のvimrcには記述されていない、ということに気づきました。

それはつまり、自分で設定した以外のどこかに、このステータスラインの要素を規定している場所があるということを意味していて、ならばそのコードを見つけて、眺めたりいじったりしてみれば、何か進展するんじゃないかと考えました。

で、あらためてドキュメントを読み直すと、ありました。

https://github.com/itchyny/lightline.vim/blob/master/doc/lightline.txt#L113

g:lightline.component			*g:lightline.component*
        Dictionary for statusline/tabline components.
        The default value is:
>
        let g:lightline.component = {
            ...(略)...
            \ 'lineinfo': '%3l:%-2v',

たぶん、これだなと。

そこであらためて、先ほどの「%L」を復活させ、それを含むlightline.component変数の設定を、関数群の先頭(上記Gistの33行目)あたりに追加。

let g:lightline.component = {
    \ 'lineinfo': '%3l[%L]:%-2v'}

全体像はこんな感じで。
gist4efce80fa78ec19111b7e12de3aaa000

結果。

f:id:note103:20160415021345p:plain

出ました、トータル460行。これが知りたかった。

ということで、まあドキュメントちゃんと読め、ということでもありますが、ともあれいつもながらのささやかな探検譚でした。