俺が見たいのはメッセージの最後なんだ!:messagesを便利にするVimプラグイン
Vim Advent Calendar 2012 330日目の記事です。
Vimでエラーが発生した時にメッセージが表示されます。
そのメッセージを後から確認したい場合は:messages
でメッセージ履歴を表示します。
しかし:messages
にはVimが起動してからのメッセージが蓄積されているので、長時間起動しているとメッセージが長くなってしまい、最後の方にある目当てのメッセージを表示するためにスクロールさせるのが苦痛になってきます。
知りたいのはエラーが発生してからのメッセージ数行だけでいいのに、200のメッセージをスクロールしなければいけないかもしれないのです。
見ることのできるメッセージ数は、tiny バージョンでは20に、それ以外のバージョン
では200に固定されている。
(:help :messages
より引用)
このメッセージは蓄積される数を変更することも出来ないし、消去することも出来ません*1。非常に不便です。
前々からフラストレーションを感じていたので、こんなのを作りました。
NeoBundle 'LeafCage/lastmess.vim'
これを使えば、
:LastMess
で、デフォルトで最後の10行のメッセージが表示されます。
:LastMess 12
または
:12LastMess
というように数値を与えてやると、最後の与えられた数字行のメッセージ(この場合は最後の12行)が表示されます。
表示される行のデフォルト値は10ですが、g:lastmess_default_count
で変更することが可能です。
let g:lastmess_default_count = 15
<Plug>(lastmess)
はキーマップ版です。例えばこれを
nmap mz <Plug>(lastmess)
というキーに充てておきますと、mz
でデフォルトの10行のメッセージが表示されます。
15mz
のようにカウントを与えると、その行数分のメッセージが表示されます。
カウントに999などの大きな数値を与えた場合は、メッセージが最初から表示されます(:messages
と同じですね。)。
これで:messages
を見るストレスが軽減され、特にプラグイン制作者は捗ることでしょう。
lightline.vimをカスタマイズする
Vim Advent Calendar 2012 の325日目の記事です。
少し長めになりますので、お時間があるときにお読みください。
Vimのステータスラインを改造するプラグインが、Lokaltog/powerline、bling/vim-airlineに続いてitchyny/lightline.vimが登場しました。
私は今までステータスラインやタブラインは自前で改造していましたが、モダンなラインも経験してみたかったので、導入することにしました。
(参考:VACのライン系の記事)
(当記事の内容)
- 設定方法
- コンポーネント作成方法
- カラースキーム作成方法
ctrlp.vimの拡張を作るときにVim7.3.1170以前ではスクリプトローカル関数をFuncrefで渡すことが出来ない
こういうのは無理。
スクリプトローカル関数のFuncrefはそのスクリプト内でのみしか有効でないから。
let s:ctrlp_ext_var let s:ctrlp_ext_var.accept = function('s:accept')
グローバル関数や、オートロード関数を使おう。
もしかしたらこういうことをしたら可能かもしれない。
function! s:SID() return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$') endfun let s:FSID = '<SNR>'. s:SID(). '_' let s:ctrlp_ext_var let s:ctrlp_ext_var.accept = function(s:FSID. 'accept')
将来使うかも知れないVimの正規表現
- コマンドの引数を空白で分割(ただし「\」でエスケープされている空白を考慮)
for arg in split(a:args, '\%(\\\@<!\s\)\+') let arg = substitute(arg, '\\\( \)', '\1', 'g') endfor
ctrlp.vimのExtensionを書くときに:NeoBundleLazy autoloadを考慮してg:ctrlp_builtinsをそのまま使わない
ctrlp拡張を作ったら、最後にctrlpからid番号を取得してctrlpに登録することになるが、
このとき、ctrlpがNeoBundleLazy状態であるのなら、
command! CtrlPExtension call ctrlp#init(ctrlp#{extension-name}#id())
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) function! ctrlp#{extension-name}#id() return s:id endfunction
は、g:ctrlp_builtins
が定義されていないためにエラーが出る。
ctrlp.vimはctrlp#init()
が呼び出されたときに初めてneobundle.vimによって読み込まれるために、それ以前にはg:ctrlp_builtins
が定義されていないからである。
エラーが出ないようにするためには、たとえば以下のように書き改める。
let s:id = ctrlp#getvar('g:ctrlp_builtins') + len(g:ctrlp_ext_vars) function! ctrlp#{extension-name}#id() return s:id endfunction
ctrlpの変数の値を返すctrlp#getvar()が呼ばれたときに、neobundle.vimがctrlp.vimを読み込むようになるために、エラーが出なくなる。
ctrlpのExtensionの作り方は以下の記事に詳しい。
ctrlp.vim起動時にステータスラインをlightline.vimのものに上書きされるのを防ぐ方法
以下のautocmdをvimrcに定義しておくと、lightline.vimがctrlp.vimのステータスラインを上書きするのを防ぐことが出来ます。
autocmd CursorMoved ControlP let w:lightline = 0
[注意]
このautocmdはplugin/lightline.vimが読まれるより先に定義されていなければいけません。
[解説]
ctrlpは専用バッファを:noautocmd
で開くため、lightline.vimの
autocmd WinEnter,BufWinEnter,FileType,ColorScheme * call lightline#update()
が発動せず、ctrlpのステータスラインが描写された後に、
autocmd CursorMoved,BufUnload * call lightline#update_once()
が発動して上書きしてしまうのです。CursorMovedのときにw:lightline
を定義することで上書きを防いでいます。
GVimのハイライトで使える色名を色見本付きで一覧するunite-source-gvimrgb
この記事は Vim Advent Calendar 2012 299日目の記事です。
GVimで:highlight
コマンドのguifg=
guibg=
引数に渡すことが出来る色名を一覧するunite-sourceを作りました。
$VIMRUNTIMEディレクトリの、rgb.txtの中にある色名リストを元にしています。:h rgb.txt
実行にはunite.vim
が必要です。
実行すると以下のように、色がuniteで一覧されます。
:Unite gvimrgb
GVimにはかなりの色名が用意されているのが分かります。(AntiqueWhite2とかPeachPuff1とかいうのが色名になります)
ハイライトの色を何にするかで困ったときに、ここからよく選んでいます。
例えば、Gray{数字}はGray0が黒でこの数を上げていけば明度が増してきてGray100で完全に白になります。灰色の微調整をするときに、Gray40,Gray30,...てな具合に数字を変更させて見た目を確認します。
後は、#rrggbb
で設定するよりも、後から見たときに色名だから分かり易くなる‥?かな?
itchyny/lightline.vimを導入したので、ステータスラインの色を調整するヒントとして活用しています。
似たunite-sourceに、Webカラー名を一覧表示するものがありますが、そのソースコードをパクっています。
Yuki(ぱせらん)さんありがとうございます。