読者です 読者をやめる 読者になる 読者になる

さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

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」と入力すると、
f:id:takepierrot:20120603054343j:plain
このように新しいバッファで意味を表示してくれます。お手軽に国語辞典が調べられ、コピーも編集も自由自在。解説内で気になるキーワードがあれば、Returnキーを押すと再度調べてくれます。

ただ、単語単位のテキストオブジェクトでzレジスタにコピーしてテキストを取得しているだけなので、「書く」のような漢字とひらがなが混じる(カタカナでも同じ)キーワードは、正常に取得できません。

こうしたキーワードを調べたいときは、あらかじめzレジスタに調べたいキーワードをコピーしておいてから、「\lk」と入力します。zレジスタに何らかのキーワードが設定されている場合は、そのキーワードを読み込んで辞書を検索します。

いつものごとく、インターネット経由でのデータのやりとりとパースはすべてPerlで行っています。思い切り「Web::Query」というモジュールに依存しているので、CPANかppmで事前にインストールしておかないと使えません。

Web::Queryもいろんなモジュールに依存しているっぽいので、残念ながらこのスクリプトをプラグインとして配布するのは難しそうです。モジュールさえ入れちゃえばMacでもWindowsでも動くと思いますが(Macで作ってます)。

今度は辞書用のシンタックスハイライトなんかも作ってみたいですね。