Vimから国語辞典をチェックする
ライターや編集者にとってなくてはならないアイテムが辞書。
最近はYahoo!辞書のような便利なインターネット経由で利用できる辞書サービスも増えています。便利になったものです。
しかし、そんな状況も慣れてくると不満が出てきます。
わざわざエディタから離れてブラウザで検索し直さないといけないなんて面倒くさい。
コピペにマウスを使わないといけないのも面倒くさい。
というわけで、Vimで原稿中のキーワードをYahoo!辞書の国語辞典で調べ、バッファに出力するスクリプトを書いてみました。
出力用のバッファの管理は、quickrun.vimのoutrunnerを参考にさせていただきました。最初は自分でやってみようと思ったんですが、無理でした。ここがいちばん苦労しました……。
" 出力用のバッファの管理 function! Jiten_Window() if !exists('s:bufnr') let s:bufnr = -1 " A number that doesn't exist. endif if !bufexists(s:bufnr) split edit `='[kokugo jiten output]'` let s:bufnr = bufnr('%') nnoremap <buffer> q <C-w>c nnoremap <buffer> <CR> :call CallDic()<CR> nnoremap <buffer> K :call CallRuigigo()<CR> setlocal bufhidden=hide buftype=nofile noswapfile nobuflisted setf txt elseif bufwinnr(s:bufnr) != -1 execute bufwinnr(s:bufnr) 'wincmd w' else split execute 'buffer' s:bufnr endif normal ggdG endfunction " 国語辞典をチェック fun! CallDic() if getreg('z') == '' normal viw"zy endif let s:str = getreg('z') call Jiten_Window() call Dic_check_input(s:str) call setreg('z', '') endf nnoremap <Leader>lk :call CallDic()<CR> fun! Dic_check_input(str) perl << EOF use utf8; use Encode; use Web::Query; use URI; my $keyword = decode_utf8(VIM::Eval('a:str')); my $uri = URI->new('http://dic.yahoo.co.jp/dsearch'); $uri->query_form( p => $keyword, stype => 1, dtype => 0, ); my $wq = wq($uri)->find('div.content-detail'); my $title = $wq->find('h1')->text; my $html = $wq->find('table.d-detail')->html; $html =~ s|<br />|\\n|g; my $descr = Web::Query->new_from_html($html)->text; if ($title) { $descr =~ s/(\\n)+/\n/g; $descr =~ s/^ //mg; $descr =~ s/^([1-9])/[$1]/mg; my $honmon = $title . "\n" . $descr; $main::curbuf->Append(0, split(/\n/, $honmon)); } else { $main::curbuf->Set(1, "「$keyword」に該当する文字列は辞書にはありません"); } EOF endf
このスクリプトを.vimrc(_vimrc)に書いて再読み込み後、任意のキーワード上で「\lk」と入力すると、
このように新しいバッファで意味を表示してくれます。お手軽に国語辞典が調べられ、コピーも編集も自由自在。解説内で気になるキーワードがあれば、Returnキーを押すと再度調べてくれます。
ただ、単語単位のテキストオブジェクトでzレジスタにコピーしてテキストを取得しているだけなので、「書く」のような漢字とひらがなが混じる(カタカナでも同じ)キーワードは、正常に取得できません。
こうしたキーワードを調べたいときは、あらかじめzレジスタに調べたいキーワードをコピーしておいてから、「\lk」と入力します。zレジスタに何らかのキーワードが設定されている場合は、そのキーワードを読み込んで辞書を検索します。
いつものごとく、インターネット経由でのデータのやりとりとパースはすべてPerlで行っています。思い切り「Web::Query」というモジュールに依存しているので、CPANかppmで事前にインストールしておかないと使えません。
Web::Queryもいろんなモジュールに依存しているっぽいので、残念ながらこのスクリプトをプラグインとして配布するのは難しそうです。モジュールさえ入れちゃえばMacでもWindowsでも動くと思いますが(Macで作ってます)。
今度は辞書用のシンタックスハイライトなんかも作ってみたいですね。