「カスタマイズの効くポメラが欲しい」という理由で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
でロードするスクリプトを置けば要件達成です…何だ簡単じゃねぇか。
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したほうがいいんじゃねえかな?
お箸の国の人ですから
目的と手段がめちゃめちゃになり始めていますが、 autocmd
と autoload
を使ってカスタム部分だけを動的に読めそうだったのでその路線でいきます。手順としては、カラースキームロード後に autocmd ColorScheme *
で autocmd
にあるカスタム部分をロード、この時に関数名を波括弧変数と g:colors_name
を使って読んでもらいます。カスタムしてない場合もあるので、 try ~ catch
を使ってなんとかしています。
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に最初のスクリプト読み込み時だけ処理してほしい部分があったので、これで書き換えました。
結果
いや、自分で言うのも何なんですがちょっと…偏執的だと思うんです。
-
外部のプログラムに依存するものや、特定のディレクトリにファイルがあるけど、droidVimの場合クラウド同期して…という方法が現実的ではない、など理由は様々。 ↩