2012/11/01

Recent entries from same category

  1. Vim と日本語入力の話。
  2. Windows で子プロセスの標準入出力バッファリングを無効にする
  3. Vim で端末機能が動くようになった。
  4. vim-soundcloud 作った。
  5. Software Design 2016年5月号 Vim 「実戦」投入

先日「Google 日本語入力 - CGI API」が公開されましたね。
Google 日本語入力 - CGI API
Google 日本語入力 - CGI API デベロッパーガイド

Google CGI API for Japanese Input Google CGI API for Japanese Input は、日本語変換をインターネット上で実現するための、CGI サービ...

http://www.google.com/intl/ja/ime/cgiapi.html
こんなの migemo の為にあるみたいなもんじゃないですか!

さっそく作りました。
"=============================================================================
" File: gmigemo.vim
" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
" Last Change:08-Oct-2010.
" Version: 0.1
" WebPage: http://github.com/mattn/gmigemo-vim
" Usage:
"
"   :GoogleMigemo ここではきものをぬぐ
"     match: "ココでは着物を脱ぐ"
"
"   :GoogleMigemo ここで はきものを ぬぐ
"     match: "此処で履物を脱ぐ"
"
" Require:
"   webapi-vim: http://github.com/mattn/webapi-vim

if exists("loaded_gmigemo") || v:version < 700
  finish
endif
let loaded_gmigemo = 1

function! s:nr2byte(nr)
  if a:nr < 0x80
    return nr2char(a:nr)
  elseif a:nr < 0x800
    return nr2char(a:nr/64+192).nr2char(a:nr%64+128)
  else
    return nr2char(a:nr/4096%16+224).nr2char(a:nr/64%64+128).nr2char(a:nr%64+128)
  endif
endfunction

function! s:nr2enc_char(charcode)
  if &encoding == 'utf-8'
    return nr2char(a:charcode)
  endif
  let char = s:nr2byte(a:charcode)
  if strlen(char) > 1
    let char = strtrans(iconv(char, 'utf-8', &encoding))
  endif
  return char
endfunction

function! g:GoogleMigemo(word)
  let word = substitute(a:word, '\s', ',', 'g')
  let url = "http://www.google.com/transliterate"
  let res = http#get(url, { "langpair": "ja-Hira|ja", "text": word }, {})
  let str = iconv(res.content, "utf-8", &encoding)
  let str = substitute(str, '\\u\(\x\x\x\x\)', '\=s:nr2enc_char("0x".submatch(1))', 'g')
  let str = substitute(str, "\n", "", "g")
  let g:hoge = str
  let arr = eval(str)
  let mx = ''
  for m in arr
    call map(m[1], 'substitute(v:val,"\\\\", "\\\\\\\\", "g")')
    let mx .= '\('.join(m[1], '\|').'\)'
  endfor
  return mx
endfunction

function! s:GoogleMigemo(word)
  if executable('curl') == 0
    echohl ErrorMsg
    echo 'GoogleMigemo: curl is not installed'
    echohl None
    return
  endif

  let word = a:word != '' ? a:word : input('GoogleMigemo:')
  if word == ''
    return
  endif
  let mx = g:GoogleMigemo(word)
  let @/ = mx
  let v:errmsg = ''
  silent! normal n
  if v:errmsg != ''
    echohl ErrorMsg
    echo v:errmsg
    echohl None
  endif
endfunction

command! -nargs=* GoogleMigemo :call <SID>GoogleMigemo(<q-args>)
nnoremap <silent> <leader>mg :call <SID>GoogleMigemo('')<cr>

" vi:set ts=8 sts=2 sw=2 tw=0:
いつも1ファイルで動くものを提供してきましたが、そろそろvimもライブラリとアプリケーションを分けないとvimの今後があやぶまれるな...(vimjoltsってなんだっけ汗)...と思ったので、今回は手前味噌ですが「webapi-vim」というのを使っています。
mattn's webapi-vim at master - GitHub

webapi-vim: vim interface to Web APIDescription:Require: curl command : http://curl.haxx.se/Thanks T...

http://github.com/mattn/webapi-vim
先日 vim-oauth で使った奴ですね。
まぁ単体にしたい人は書き換えて下さい。

使い方は簡単。
:GogoleMigemo ここではきものをぬぐ
とすると、「ココで履物を脱ぐ」がマッチします。なお、「ここでは着物を脱ぐ」が検索したかったよ...という全国2000万人のエロいオッサン達。慌てないで。
:GogoleMigemo ここでは きものを ぬぐ
とスペースを入れると認識してくれ、ちゃんと「此処では着物を脱ぐ」にマッチします。もちろん「ここで はきものを ぬぐ」とすれば「此処で履物を脱ぐ」や「個々で履物を脱ぐ」にマッチしたりもします。
<leader>mg にキーマップしてあります。あと、グローバル関数「GoogleMigemo」も提供してあるので「let foo = GoogleMigemo(xxx)」な使い方も出来ます。
それなりに便利かもしれません。もちろんネットに繋がってないと使えませんし、エロい語句を検索すると、Google先生にネタを送ってしまいます。
ご利用は計画的に。

blog comments powered by Disqus