LoginSignup
0
0

More than 3 years have passed since last update.

設定群の大幅見直し

Last updated at Posted at 2019-06-22

「カスタマイズの効くポメラが欲しい」という理由でdroidVimを導入して以降、複数デバイスでvimを使うようになり、その際に設定ファイル群のロードをかなり工夫していました。が、そもそも既に用意してあるプラグインのディレクトリを使わずにコントロールするやり方が気に食わず、もっとスマートにやる方法を探していたところ、「それ packadd で出来るよ」という感じでヘルプファイルに書いてあったので、「じゃあ試そうじゃないか」となったわけです。ついでに他の気になっていた部分も後学だ、ということで調整しています。

packadd #とは

引用元

:pa[ckadd][!] {name}

packpath 中の任意のプラグインディレクトリを検索し、見つかったプラグインのファイルを読み込む。ディレクトリは以下にマッチしなければならない:

pack/*/opt/{name} ~

見つかったディレクトリは、もし含まれていなければ runtimepath に追加される。もしディレクトリ pack/*/opt/{name}/after が存在すれば、runtimepath の最後に追加される。
"pack/*/start" からのパッケージの読み込みがスキップされた場合、次のディレクトリが最初に検索される。

pack/*/start/{name} ~

今実現したい「デバイスを確認してプラグインを読み込まないための設定」で必要なことはこのあたりまででした。

というわけで、条件付きで読み込みたい自作のプラグイン1をすべて pack/myplug/opt/foo/plugin/foo.vim みたいな感じに移動しました。あとはプラグインディレクトリに条件をチェックして packadd でロードするスクリプトを置けば要件達成です…何だ簡単じゃねぇか。

autoload/packer_example.vim
scriptencoding utf-8

function! packer#main() abort
    if exists('g:fooPath')
        packadd foo
    endif

    if exists('g:barExe')
        packadd bar
    endif
endfunction

一例としてこんな感じになりました。ここで読むスクリプトのリマップのタイミングの為、autoloadを使っています。

colorscheme の行方

こだわりたいですよね、カラースキーム。最近はプラグイン管理スクリプトとgithubでさっくりとダウンロードして簡単に試せるいい時代ですが、そこからカスタマイズするとなると…あれ、何処に書くのがスマートそう?

いままで

パッケージ管理にvim-plugを使っているので、vim-plugでロードしたあとに読める場所、現環境では別ファイル化してあるのでそこに書いていました。そこからカスタムするとして、なんか長々と設定書くのがちょっと嫌だったんです。カラースキーム変えたときにもスクリプトの書き換え場所増えるし、ならカラースキーム変更したら後は勝手にカスタムした部分探してロードして欲しかったんです…素直にforkしたほうがいいんじゃねえかな?

お箸の国の人ですから

目的と手段がめちゃめちゃになり始めていますが、 autocmdautoload を使ってカスタム部分だけを動的に読めそうだったのでその路線でいきます。手順としては、カラースキームロード後に autocmd ColorScheme *autocmd にあるカスタム部分をロード、この時に関数名を波括弧変数g:colors_name を使って読んでもらいます。カスタムしてない場合もあるので、 try ~ catch を使ってなんとかしています。

customCD.vim
scriptencoding utf-8

" カスタムしたカラースキームは $VIMFILES/autoload/ へ

" トリガー引く用
function! s:customCSLoader(name) abort
    try
        call ccs_{a:name}#main()
        let mes = printf('Loaded ''%s'' custom script.', a:name)
        let isFound = 1
    catch /E117/
        let mes = printf('No custom script for ''%s''.', a:name)
        let isFound = 0
    finally
        if v:vim_did_enter
            redraw
            echomsg 'costomCSLoader: '.mes
        endif
    endtry

    return isFound
endfunction

augroup customColor
    autocmd!
    autocmd ColorScheme * call s:customCSLoader(g:colors_name)
augroup END

if !v:vim_did_enter
    call s:customCSLoader(g:colors_name)
endif

v:vim_did_enterなんて変数があったんですね。今までvimrcに最初のスクリプト読み込み時だけ処理してほしい部分があったので、これで書き換えました。

結果

いや、自分で言うのも何なんですがちょっと…偏執的だと思うんです。


  1. 外部のプログラムに依存するものや、特定のディレクトリにファイルがあるけど、droidVimの場合クラウド同期して…という方法が現実的ではない、など理由は様々。 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0