ivxiのブログスマートフォン用の表示で見るivxiのブログこの広告は、90日以上更新していないブログに表示しています。2012の187日目の記事です。AdventCalendar初参加です。クリスマスがとても待ち遠しいですね!はじめにこの記事では、次の2つの話を書きました。追加変更があったファイルの一覧をVimのQuickFixリストを使って見るというコマンドを追加します。このプラグインができたきっかけこんなときがありました。「masterと比較して新画面のHTML一覧がQuickFixリストに入ってきたら便利だよねー」との日々改善を試みるVimmerの一声が、このプラグインを書くきっかけとなりました。gitquick.vimの使い方Git管理下のディレクトリに中で、次のコマンドを実行します。ブランチ名2ブランチ1とブランチ2の間での追加・変更されたファイルをQuickFixリストに入れます。Aが追加、Mが編集があったファイルです。ブランチ名1、2は<TAB>で入力補完することができます。カレントのブランチと引数のブランチで比較します。上記は、次を実行した場合と同じ結果です。ブランチ名gitquick.vimを作る課程の紹介ここからは、このプラグインを作る過程の話を書いてみたいと思います。QuickFixリストに入れているだけです。こんな風にプラグインを作りましたという流れとその間に参照したヘルプやページを加えて綴ってみたいと思います。見てねで終了かもしれませんが最初はヘルプを引くのもハードル高かったですし、そこに気づくまでを少し掘り下げてみたいと思います。)間違いやもっと便利な作り方あるよ!というご指摘をいただけましたら幸いです。別のVimを起動して動かしてみる」の繰り返しです。デバッグは、とりあえずなんでもechoでVimの画面下部に出力することで確認しました。変数はechoすれば文字列だろうが辞書型だろうが中身を見ることができます。途中まで動いたかどうかもechoで目印となる文字列をだして確認しながら実装していきました。プラグインのファイルをつくるまず、プラグインの名前決めです。今回は「gitquick」です。.vimrcでランタイムパスを通します。開発ディレクトリは~/works/gitquick.vim/にしました。以下、ランタイムパスに開発ディレクトリを追加します。プラグインとして機能させるファイルは、「plugin」の下に置きます。ランタイムパスに通してあるディレクトリ配下のディレクトリは、その名前によって役割が決まっています。plugin/gitquick.vimに次のコードを書いて保存し、別Vimを起動してみます。Plugin!続けるにはENTERを押すかコマンドを入力してくださいと出たらOKです。無事、ディレクトリはパスが通り、プラグインのファイルが読み込まれています。プラグインを書くときの決まりごと実装を進めていきます。(3)上の(1)(2)のブロックは、プラグインを書くときの決まりごとみたいなものです。プラグインが2重に読み込むのを防止しています。Vimの設定による環境依存を避けるためのおまじないみたいなものです。このソースをVimで開いたときに、文字コードや改行コード等をどう表示するのかの指定です(プラグイン作成には直接関係はないです)。foldこれでプラグインの基本的なかたちができました。独自のコマンドが動くようにします。単純に実行したらなにか文字を出すコマンドをつくってみます。:Testというユーザ定義コマンドを定義しています。このコマンドを実行したときにはプラグイン内のs:Test()という関数が実行されます。コマンドの最初の文字は大文字にする必要があります。Test()というプラグイン内だけで使えるスコープ(s:)の関数を定義しています。command!」と表示されたら成功です。これでVimから呼べるユーザ定義コマンドができました。ユーザコマンドに引数を渡すブランチ名を引数に渡せるコマンドを作ります。入力するブランチ名が長くなるとめんどうなので、入力補完できるようにしてみます。s:DiffBranch()を実行する:Gitquickというコマンドを定義しています。このコマンドが引数をいくつでも(0個以上)とることができるという指定です。「」は、コマンドに渡す引数を、スペースやタブで区切って複数に分けるという指定です。「-complete=customlist,s:GetBranches」は、s:GetBranches関数で返すリストを補完候補とする指定です。CursorPosをもらうように決まっています。branchコマンドを実行した結果の標準出力を改行文字で区切ってリストにして、for文でまわしています。ループの中で、Vimスクリプトが最初から用意している組み込み関数matchstr()を使い、正規表現にマッチするブランチ名を抜き出してリストlistに追加しています。入力されている補完対象の文字列ArgLeadにマッチする補完候補のみフィルタリングして、補完候補を絞ったリストを返しています。引数「...」は、引数が1個でも2個でも大丈夫なように、可変長の引数を受け取る指定です。:Gitquickコマンドに引数を渡して実行すると、その内容が表示されるところまできました。diffの結果をQuickFixリストに流し込みます。s:DiffBranch()の中身を実装します。コマンドを実行した結果を、(2)で指定したフォーマットに入れてQuickFixリストでファイル一覧をつくります。関数をautoloadに寄せるここで、すこし工夫してみます。plugin/xxx.vimの行数が増えてくるとプラグインを読み込むのに時間がかかりいくら早いVimといえど、起動速度が気になるようになってしまいます。今回は小さい規模のプラグインなのでほぼ影響がないですが、pluginファイルは小さい方がよいです。あと、せっかくなのでブランチの一覧を取得する関数はほかのプラグインからも呼べると便利かもしれません。これらを満たすために「autoload」という仕組みを使ってみたいと思います。autoloadというディレクトリの下に、gitquick.vimというファイルを置き、ブランチ一覧を取得するgitquick#get_branches()関数を作ります。fdm=marker:autoloadの関数名はディレクトリ名とファイル名によって決まります。