2012/03/28


glidenoteさんがmemolistという簡素ながらも良くできたメモ取り用プラグインを作っています。
シンプルなメモ管理用プラグインmemolist.vimを作った - Glide Note - グライドノート

Octopress の記事を書くときに カスタムしたjekyll.vim を 利用していて、「新規作成」と「記事の管理」が非常に便利なので、 同じようなことが出来るメモ用プラグインを作ってみました。 ...

http://blog.glidenote.com/blog/2012/03/26/memolist.vim/
さらにFuzzyFinderとの連携記事もあがってます。
FuzzyFinderでmemolist.vimが進化した! - Glide Note - グライドノート

Recent Posts FuzzyFinderでmemolist.vimが進化した! シンプルなメモ管理用プラグインmemolist.vimを作った エンジニアのための時間管理術、自動化に関するまと...

http://blog.glidenote.com/blog/2012/03/26/memolist-fuzyfinder/
なかなか便利そうです。ただ僕は最近 CtrlP を使ってるので、こんな感じのを vimrc nに追加しました。 nmap ,mf :exe "CtrlP" g:memolist_path<cr><f5>
nmap ,mc :MemoNew<cr>
nmap ,mg :MemoGrep<cr>
,mf で CtrlP を使ったファイル一覧が表示されます。文字を打ち込んで絞り込みも出来ますし、<c-j><c-k> で候補を選ぶ事も出来ます。上記の記事の中にある様に migemo と組み合わせればもっと便利になるかもしれません。今のところファイル名を日本語で検索したいニーズが僕には無いので有効にはしていませんが。
,mc で新しいメモを作り、,mg でメモ検索を行います。文書は markdown 形式で保存されているので、なんならgithubにblogとしてポストしてしまっても良いかもしれません。
glidenoteさんに感謝です。
ちなみにファイル名の入力や検索のキーワード入力中にCTRL-Cでキャンセル出切る様にpull requestしておきました。
Posted at by




この記事は、Vim Advent Calendar 2011の記事です。欠番が出そうだったので、勝手ながら割り込ませて頂きます。

CtrlP.vim Vimを使って開発をする際、リポジトリ内のファイルにどうやってアクセスしていますか?NERDTree?vimshell?unite.vim?FuzzyFinder?

色んな方法があるかと思います。ただこれらは若干古かったりニュアンスが異なっていたり、物によっては開発に向かない物もあります。単純にファイルを選択するのであれば、それで事足りるでしょう。しかしながら本当に開きたいファイルを最短の方法で選ぶには、これまでの方法では時に無駄であったり、余計なお世話だったりもしました。
僕はバッファセレクタやファイルセレクタというのは使わない方なのですが、ちょっと前にこれを見つけて「おっ...よさげなインタフェース」と思った物があったので紹介しようと思います。

ctrlp.vim ÷ home

Full path fuzzy file, buffer and MRU file finder for Vim. » Written in pure Vimscript for MacV...

http://kien.github.com/ctrlp.vim/
ctrlp.vimの特徴は以下の通り。
  • pure vimscriptで書かれている
  • vimの正規表現を使った検索
  • MRU(Most Recently Used)ファイルモニタリングおよび検索
  • ルートディレクトリ検知
  • 複数ファイルの同時オープン
  • ファイルおよびディレクトリの作成
  • 開いているファイル上でのExコマンド実行(行や文字列へジャンプ、もしくは他の動作)
  • キャッシュと履歴を使ったクロスセッションと高速な初期化
  • マッピングとvimとの親和性
インストールは上記サイトのリンクを辿ってgithubの物をgit cloneするのが良いでしょう。
起動するにはその名の通り <c-p> をタイプします。すると画面下部にファイル一覧が表示されるのが分かると思います。初回は検索とキャッシュに時間が掛かりますが、次回起動時にはそのキャッシュを使って高速に起動します。
さて何か文字を打ってみて下さい。文字を打つごとにファイルが絞り込まれているのが分かるかと思います。
この文字は連続していなくても構いません。例えば /foo/bar/baz
/foo/bar/bar
この様なファイルが一覧されている場合に > fooz とタイプすると /foo/bar/baz
に絞り込まれます。候補を選ぶには <c-j><c-k> で移動出来ます。入力のヒストリは <c-n><c-p> で参照可能。絞り込まれたらエンターキーを押してファイルを開きます。恐らく開発で使用する場合、同名のファイルで拡張子のみが異なる事が多いかと思います。C++であればソースとヘッダ、あるフォルダ配下にあるcssファイル、バージョン番号が付いたファイルなど人間がおおよそ見当の付く入力を行えば自然とファイルがマッチするという良くできた検索になっています。

またgit等VCSリポジトリ上であった場合には検索の範囲がリポジトリ内に限られるという親切な設計になっています。
ですので開発プロジェクトのフォルダの中であればどこにいても目的のファイルを開くこと出来ます。
実行中に <c-r> をタイプすると部分一致検索モードから正規表現検索モードにスイッチします。入力した文字を正規表現パターンとしてファイルを検索出来ます。
もう一度タイプすると通常モードに戻ります。また <c-d> でフルパスモードからファイル名モードへ、<c-f> でMRUファイル検索、<c-b> でバッファ検索へとスイッチ出来ます。
入力欄で / もしくは \ はプロジェクトのルートフォルダに相当し、.. による親フォルダの参照も可能です。

そしてパターンの後ろに : を付与すると、一覧に表示されているファイル群にコマンドを実行する事が出来ます。
abc:45 であればファイル abc の45行目にジャンプ、abc:/my\:function でファイルabc内で見つかる my:function へジャンプします。
任意の複数のファイルを開くには、候補一覧で <c-z> を使ってマークし、<c-o> をタイプします。

これだけあれば、「ファイル一覧→選択→検索開始」というアクションを一度に、しかも複数のファイルに対して行う事が出来ます。

さて、例えば日本語のファイルにマッチしたくなったとしたらどうしたいですか?
ctrlp.vim には日本語ファイル名にマッチ出来る仕組みが入っています。
cmigemo をインストールし、以下の様に vimrc に追記します。
let g:ctrlp_use_migemo = 1
なお、cmigemo の辞書ファイル migemo-dict は以下の位置に配置しておく必要があります。
~/.vim/dict/migemo-dict もしくは以下の様にエンコーディング毎に格納しても良いです。
~/.vim/dict/utf-8/migemo-dict ctrlp.vim を起動して、<c-r> をタイプして正規表現モードにスイッチします。通常であればここに正規表現パターンを入力するのですが、ここに kanji の様にmigemoのクエリを入力出来ます。クエリは空白文字列で分割出来るので、例えば ore kyuuyo とタイプすると
俺の給与明細
「俺の給与明細.xls」をマッチさせる事が出来ます。

これさえあれば、仕事中に給与明細をvimで開く事が出来ますね!
Posted at by



2012/03/17


Vimには --startuptime というコマンドラインオプションがあり $ vim --startuptime foo の様に指定するとスクリプトファイル単位で掛かった時間を知る事が出来ます。 times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.000  000.000: --- VIM STARTING ---
000.000  000.000: Allocated generic buffers
000.000  000.000: locale set
000.000  000.000: clipboard setup
000.000  000.000: window checked
000.000  000.000: inits 1
000.000  000.000: parsing arguments
000.000  000.000: expanding arguments
000.000  000.000: shell init
016.000  016.000: Termcap init
016.000  000.000: inits 2
016.000  000.000: init highlight
016.000  000.000  000.000: sourcing c:\vim\runtime\syntax\syncolor.vim
016.000  000.000  000.000: sourcing c:\vim\runtime\syntax\synload.vim
062.000  000.000  000.000: sourcing c:\go\misc\vim\ftdetect\gofiletype.vim
062.000  000.000  000.000: sourcing c:\temp\github\rust\src\etc\vim\ftdetect\rust.vim
062.000  000.000  000.000: sourcing c:\temp\bitbucket\vimclojure\vim\ftdetect\clojure.vim
062.000  046.000  046.000: sourcing c:\vim\runtime\filetype.vim
062.000  046.000  000.000: sourcing c:\vim\runtime\syntax\syntax.vim
062.000  000.000  000.000: sourcing c:\vim\runtime\filetype.vim
062.000  000.000  000.000: sourcing c:\vim\runtime\ftplugin.vim
062.000  000.000  000.000: sourcing c:\vim\runtime\indent.vim
062.000  000.000  000.000: sourcing c:\vim\runtime\ftplugof.vim
しかし幾ら不必要なプラグインを削っても起動が遅い事があります。そんな場合はだいたいvimrcの読み込みに時間が掛かっていたりします。 218.000  202.000  093.000: sourcing $HOME\_vimrc
じゃぁ _vimrc の中のどの部分が時間が掛かってるのよ...となるのですが、--startuptime では実行行単位に計測はしてくれません。これをなんとかしたかったので benchvimrc-vim というプラグインを書きました。
mattn/benchvimrc-vim - GitHub

make benchmark result of your vimrc

https://github.com/mattn/benchvimrc-vim
これをインストールして :BenchVimrc を実行すると、行単位に計測時間が表示されます。 00692           : "**************************************************
00693           : "* Syntax On {{{
00694           : "--------------------------------------------------
00695           : if isdirectory($VIMRUNTIME.'/syntax')
00696           :   if &t_Co > 2 || has("gui_running")
00697   0.025281:     syntax on
00698           :   endif
00699           :   if has("autocmd")
00700   0.013719:     filetype plugin indent on
00701           :   endif
00702   0.000107:   autocmd BufReadPost *
00703           :     \ silentif line("'\"") > 0 && line("'\"") <= line("$") |
00704           :     \   exe "normal g`\"" |
00705           :     \ endif
00706           : endif
00707           : 
00708   0.004691filetype plugin off
先頭に計測時間が付与されています。実行していない行にはもちろん計測時間はついていません。
数値が先頭なので :%sort を実行すると一番下に、重い処理が集まります。私のvimrcの例だと   0.004190 00132let &viewdir=globpath(&rtp, "view")
  0.004294 00796:   silentcall metarw#define_wrapper_commands(1)
  0.004459 00133let &undodir=globpath(&rtp, "undo")
  0.004778 00708filetype plugin off
  0.005199 00464let g:skk_large_jisyo = globpath(&rtp, "dict/SKK-JISYO.L")
  0.013917 00700:     filetype plugin indent on
  0.014531 00731:   silentcolorscheme torte
  0.025083 00697:     syntax on
  0.053559 00716:   call pathogen#infect()
  0.375485 00717:   call pathogen#helptags()
こうなりました。どうやら pathogen#helptags に 0.4秒掛かっているようです。新しいプラグインを入れたとき、自動でヘルプタグを作ってくれるので便利ですが、プラグインの更新時や新しいプラグインを入れた際に自分で実行すればいいだけなので、ひとまずコメントアウトしてみます。
vimrc の読み込みに時間が掛かって困ってる人には便利かもしれません。注意点としては、初回実行という訳ではないので完全な計測では無い事、if文内の式には現状対応出来ていない事です。よろしければどうぞ。

追記1
もう一つ注意点、2度実行してもエラーの出ないvimrcでないとエラーになります。

追記2
vimにはprofileという機能がありますが、FEAT_PROFILEを付けてvimをコンパイルする必要があり、それにより計測を行わない場合においても全てのスクリプト実行が幾分遅くなってしまいます。
Posted at by