つくったVim PluginとつかったVim scriptのはなし

この記事は Vim Advent Calendar 2013 の 12日目の記事です。

もう12月も半ばですね。
みなさまは年の暮れに向けていかがお過ごしでしょうか。
私の場合、Plugin作りがなかなか進まず、苦しい年末が近づいております。

さて、今回は自分で作ったPlugin4つの紹介とその時に知ったVim scriptについてのことを書こうと思います。

まずは一つ目です。
Vim scriptをVim Pluginとするにはディレクトリを分けるなど Vim Pluginとしてのルールがあります。
ですが、「あっ、これPluginにしよう!」と思った時にmkdirやtouchコマンドを連打するのは面倒です。
:help write-plugin にもある通り、Pluginとするにはディレクトリを分ける必要があります。
直ぐにパッと作って行きたい、Pluginを作りはじめるまでをカイゼンしようというわけです。

そんなときに使うために作ったのがこれです。
mopp/layoutplugin.vim
Vimからディレクトリ、スクリプトファイル、README.mdをパッと作ってくれます。
スクリプトファイルの中身もテンプレ的に出力してくれます。


2つ目です。
githubをふらふらしていた時にたまたま見つけた、
数年前にmattnさんが作ったgooglesuggest-complete-vimをneocomplete.vim向けにラップしました。
mopp/googlesuggest-source.vim
自動でgoogle補完力で入力ができます。
個人的に5分で出来たにもかかわらずなかなか面白いなあと感じております。
ただ少々不安定なのは通信をするからでしょうか…
そういうときはインサートモードで<C-U>するとよいです。


3つ目です。
molokaiのような色合いが好みなのですが
コメントの色など不満が幾つかあったのでmolokaiを元に自分のカラースキームを作りました。

mopp/mopkai.vim
もぷかいと読んでやってください。
molokaiよりも強めのカラーリングのつもりです。
自分のためのカラースキームなのでこれからもガンガンいじっていく予定です。

4つ目です。
先日のvimrc読書会で誰かこれをPlugin化という話が挙がっていたのでささっとしておきました。
mopp/autodirmake.vim
:e new_dir/text.txt と編集した際にnew_dirが存在しないディレクトリだとVimはファイルを保存できません。
このPluginを入れておけば、保存時にディレクトリを作成してくれます。


次にPluginを作ってる時に知ったVim scriptについてです。
自分がメモとして書き留めていたものを、色がついて見やすいのでgistにまとめました。
詳しくは:helpで見たほうがよいでしょう。
" 定数を使いたい
let lst = ['a', 'b', 'c']
lockvar lst " 変数を書き換えられないようにする
" let lst[0] = 'd' -> ERROR!
unlockvar lst " 解除
" Vim script以外のファイルを読み込みたいとき
" 結果はファイルの行がリストとしてかえる
let lst = readfile('hogehoge.txt')
" 逆に書き込みを行うときは以下
call writefile(lst, 'hugahuga.txt')
" ファイルではなくてバッファに書き込むときは
call append(0, lst)
" こういうようにファイルを扱うときは
" List番号と行番号を対応付けて処理するのが手っ取り早いです
" カーソル位置の文字列取得
let corsor_char = matchstr(getline('.'), '.', col('.')-1)
" これは現在行を取得して、そこから現在のカーソル位置-1の一文字を取得しています
" 第二引数は正規表現です
" 分岐以外を使ってオプションにより変数を変えたいとき
let var_name = 'hoge'
let test_hoge = 'hoge variable'
let test_huga = 'huga variable'
echomsg test_{ var_name }
" 波括弧付き変数です。
" なんか気持ち悪いですがオプションで変数を切り替えたいときは便利です
" 辞書内の要素で検索
" 文字列で式をわたし、その結果が0なら値を削除します
let lst = ['foo1', 'foo2', 'foo3']
let searched = filter(copy(lst), 'v:val != "foo1"')
" これだとfoo1以外を取りだしています
" is isnot を使ってlistや辞書が同じインスタンスの比較をする
if (lst isnot searched)
echomsg 'lst isnot searched'
endif
" グローバル変数の初期化
let g:layoutplugin#user_name = get(g:, "layoutplugin#user_name", string($USER))
" これで、g:内に第二引数と同じ名前の変数があればそれがかえります。
" もしなければデフォルト値として第三引数が使用されます。
" Exコマンド実行結果を保存するには
" 以下のようにして変数にリダイレクトします
redir => stored_cmd
map
redir END
echomsg string(stored_cmd)
" 他にもレジスタやファイルにリダイレクト可能です
view raw VAC20131212.vim hosted with ❤ by GitHub

波括弧付き変数とかすごいですね
Pluginをどんどん生み出している人からすれば当たり前かもしれませんが
私は、helpを読破していないのでVimの知らない機能がまだあります。
人のPluginを読むとなんだこのコマンドは…というのもよくあることです。

Vim Plugin力もレベルアップしていかねばなりませんね。

というところで、今回は筆を置くことにします。

Happy Vimming !

コメント

このブログの人気の投稿

カーソルキーさん@つかわない インサートモード編

Erlang & Elixir Fest 2019 に参加してきた

Elixir に入門したいので雑な 分散KVS を自作した