なんかみんなステータスラインかっこよくねっすか?


「なにあのかっこいいの!妬く!」…ということで調べました、PowerLine。

俺はPowerLine!お前は何Line?

現状Vimで使えそうな某Lineは

と、3つ見つけたんですがPowerLineは装飾の部分がうまく行かない上に設定を探しても探してもlightlineの設定チュートリアルが出てきてしまうので「lightlineでいいや」ということになりました。

書けば出る (vimrcに)

vim-plugに書けばいいだけみたいなのでサクっと書いてしまいます。

vimrc
call plug#begin('~/vimfiles/vim-plugged')
    Plug 'itchyny/lightline.vim'
call plug#end()
" vim-plug用
cnoremap <Leader>p :PlugInstall<CR>

寄り道して:PlugInstallをLeader使っていい具合にしてます。

ぶっちゃけこれだけでとりあえず動いてしまったんですけど。

動いただけ

「なにあのかっこいいの」のかっこいいのの部分がまだ出てないんですよ、あの三角のやつ。そこが頑張ってもPowerLineでうまく出来なくて、設定チュートリアルが出てきたlightlineにおまかせしました。要はフォントとvimrcにコンフィグ足してあげればいいのね…

vimrc
" vim-plugロード後の各プラグインの設定
    " lightline.vim
    let g:lightline = {
            \ 'separator': { 'left': "\u2b80", 'right': "\u2b82" },
            \ 'subseparator': { 'left': "\u2b81", 'right': "\u2b83" }
            \ }
gvimrc
let s:winfont = 'Ricty_Diminished_for_Powerline:h12'
    :
    :

gvimrcの設定でs:winfontに書き込めば変わるようになっています。

見える…見えるよitchynyさん!

正解はこれ!じゃない!

現在のカラースキームは全角スペース分若干カスタムしたtwilightで、リロードする度にlightlineが文句を言ってくるので困っていたんですけど、原因はカラースキームのロードタイミングだったらしく、colorscheme custom_twilightがvimrcとgvimrcの両方に書いてあったんだけどなんだこれ…ちなみにカラースキーム自体はデフォで満足したのでそのままに。
その他にも問題が出ていて、ファイル名が長すぎるとモードの表示が折り畳まれてしまって不自由だわみっともないわ…かっこいいから妬いたのでココを修正しないわけにはいきません…えっと、コンポーネント?関数?

わからない、俺達は雰囲気でスクリプトを書いている

lightlineのカスタムをするにはg:lightlineにぺそぺそと書いていけばいいらしいので…デフォルトの設定を探して…

(30分後)

…ソースに書いてあったのを持ってきました。アクティブ状態の時とイナクティブ状態があればなんとかなりそうなのでコピーして、悪さしているのはファイルネームっぽいのでここをコンポーネント関数にすれば良いらしいです。最初はモードが隠れるのでモードの方をなんとかしてやらないと、と思ってたんですけど違いました。

vimrc
    " lightline.vim
    let g:lightline = {
        \ 'separator': { 'left': "\u2b80", 'right': "\u2b82" },
        \ 'subseparator': { 'left': "\u2b81", 'right': "\u2b83" },
        \ 'active': {
        \   'left': [['mode', 'paste'], ['readonly', 'customFilename', 'modified']],
        \   'right': [['lineinfo'], ['percent'], ['fileformat', 'fileencoding', 'filetype']]
        \ },
        \ 'inactive': {
        \   'left': [['customFilename']],
        \   'right': [['lineinfo'], ['percent']]
        \ },
        \ 'component_function': {
        \   'customFilename': 'LlCustomFilename'
        \ }
        \ }

    function! LlCustomFilename() abort
        return winwidth(0)-50 > strlen(expand('%')) ? expand('%') : '某.'.expand('%:e')
    endfunction

なんかすごいことになっちゃったぞ

で、これでも問題が発生しておりまして…
現在のVimの文字コードがutf-8なので文字数カウントすると全角文字が3バイト計算になり、現在のLlCustomFilename()では見た目の長さを取得できません。さてどーすべ……strchars()?え、これ全角文字1文字計算でしょ…?えぇー…

vimrc
    " lightline.vim
    let g:lightline = {
        \ 'separator': { 'left': "\u2b80", 'right': "\u2b82" },
        \ 'subseparator': { 'left': "\u2b81", 'right': "\u2b83" },
        \ 'active': {
        \   'left': [['mode', 'paste'], ['readonly', 'activeFilename', 'modified']],
        \   'right': [['lineinfo'], ['percent'], ['fileformat', 'fileencoding', 'filetype']]
        \ },
        \ 'inactive': {
        \   'left': [['inactiveFilename']],
        \   'right': [['lineinfo'], ['percent']]
        \ },
        \ 'component_function': {
        \   'activeFilename': 'LlActiveFilename',
        \   'inactiveFilename': 'LlInactiveFilename'
        \ }
    \ }

    function! Vstrlen(sentence) abort
        let s:sDiff = (strlen(a:sentence)-strchars(a:sentence))/2
        return strchars(a:sentence)+s:sDiff
    endfunction

    function! LlActiveFilename() abort
        return winwidth(0)-55 > Vstrlen(expand('%')) ? expand('%') : '某.'.expand('%:e')
    endfunction

    function! LlInactiveFilename() abort
        return winwidth(0)-20 > Vstrlen(expand('%:t')) ? expand('%:t') : '某.'.expand('%:e')
    endfunction

…正気?いや、まぁある程度納得する形にはなったんですけどこれは流石にどうなんすか?

統括せよ

多分もっとスマートな方法があるんだと思います。関数のリファレンスをもっと掘るべきかもしれません。もしくはlightline側にいい関数があるのを見落としているのか…lightlineが設計思想の強いツールなので多分この思想の中でやればこんな事にならなくて済みそう。おしえてitchynyさん!