messageについて
Vimのmessageをご存知でしょうか?Vimにおけるmessageとは画面下部に表示されるメッセージやエラーメッセージのことです。例えばVimを立ち上げて適当に編集した後保存せずに終了しようとしてみて下さい。
下の画像の様なお馴染みのメッセージが出力されます。
このmessageですが実は過去のものも参照する事が出来ます。:messages
コマンドをコマンドラインから実行して見て下さい。過去のメッセージやエラーメッセージが表示されるかと思います。
やりたいこと
messageにはaleプラグインが表示してくれるLinterなどの警告文も表示されます。今まで警告内容を解消したい時、解消方法が分からない場合は手打ちでGoogle検索を行っていました。この作業が非常に面倒くさいのでクリップボードレジスタにmessageを一発でコピーするキーバインドを作成したいと思います。
vimrc編集
:nnoremap <Leader>m :let @+ =execute('1messages')<CR>:echo 'last messages copied!'<CR>
上記では<Leader>m
を入力すると直近のmessagesを取得して、クリップボードレジスタである「@+」に代入します。少し打ち辛いキーマップですがニーモック的に覚えやすいと思ったのでこの組み合わせにしました。
試しに実行してクリップボードにコピーされていれば成功です。本当はfzfと組み合わせて選択式でクリップボードにコピー出来るようになればベストなのですが、一先ずこれで良しとすることにします。
以上です。
検索版
クリップボードレジスタにコピーしつつ、そのままブラウザ検索も行うキーマッピングに改良しました。そのためには別のVimプラグインが必要になるのでopen-browser.vimをインストールして下さい。使い方の詳細はこちらにまとめております。
改良版のキーマッピングは以下になります。
前のキーマップは削除orコメントアウトしてしまいましょう
":nnoremap <Leader>m :let @+ =execute('1messages')<CR>:echo 'last messages copied!'<CR>
:nnoremap <Leader>m :let @+ =execute('1messages')<CR>:execute('OpenBrowserSearch ' . @+)<CR>
何という事はありません。:OpenBrowserSearch
の引数に:1messages
の結果を渡しているだけです。これでやりたかった事が実現出来ました。
fzf版
その後fzf.vimと組み合わせてopen-browser.vimの検索対象のmessagesに対して、fzfで曖昧検索を行うVim scriptを作成しました。
command! FzfMessageSearch :call s:FzfMessageSearch()
function! s:FzfMessageSearch()
let messages = execute(":messages")
let messages_array = split(messages, "\n")
call remove(messages_array, 0)
call fzf#run({'source': reverse(messages_array), 'sink': funcref('s:write'), 'down': '25%'})
endfunction
func! s:write(s) abort
execute('OpenBrowserSearch ' . a:s)
endfunc