Fork me on GitHub

2010/01/28

Recent entries from same category

  1. VimでFizzBuzz...いやBrainfuck Hatena
  2. zen-codingの殆どの機能をzencoding.vimに取り込んだ。 Hatena
  3. zen-coding for vim を pure vimscript だけで書いてみた。 Hatena
  4. Vim script manager「Vimana」が便利すぎる。 Hatena
  5. VimからIRC出来るスクリプト書いた。 Hatena

はてな
vimの入力補完って大変便利なんですが、例えば「あーあの芸能人、名前分かるけどどの漢字だったっけ...」なんて事がたまにあります。
芸能人の名前辞書用意持ってる人なんて見たことないですね。たいがいこういう時はGoogle先生にたよるのが一般的です。
今日はGoogleサジェスト(Google検索で数文字打ったら出てくるあの候補)からvimの補完を行えるスクリプトを書いてみました。

例えばこんな事が出来ます。
googlesuggest-complete-vim1
おもむろに「takasu」と打って、<c-x><c-u>とタイプします。
googlesuggest-complete-vim2

Yes! 高須クリニック!


えっ2番?...うるさい!

便利ですね!

また「watasinonamaeha」(私の名前は)と打って<c-x><c-u>すると...
私の名前はキムサムスン
誰ですか!キムサムスン!

例えば「naitu」なら...
ナイツ お笑い
「www」なら...
www.yahoo.co.jp
「gm」だけで...
gmailへようこそ
... えっ ...

びっ...「vimp」ならば...
vimperator
そして「puri」で...
プリキュア

便利過ぎます!

もうIMEいりません!

どうかお役立て下さい!
mattn's googlesuggest-complete-vim at master - GitHub

complete function using google suggest API. perhaps, you should input japanese without IME.

http://github.com/mattn/googlesuggest-complete-vim
Posted at 23:13 in ソフトウェア::vim | WriteBacks (1) | Edit
Tagged as: google, vim
Bookmarks: このエントリーのtweets add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark

blog comments powered by Disqus
WriteBacks

emacs suggest 書いてみた



■ [emacs][google] emacs suggest 書いてみた

暇ではないのだが暇そうにして見えたのか某所の中の人にこんなものを振られる.


http://b.hatena.ne.jp/entry/mattn.kaoriya.net/software/vim/20100128225659.htm


いわく, vi に負けていいんですか? まあその通り. vi に出きて emacs に出来ないことはない,
"この世にはエディタは二つしかない, emacs かそれ以外か,だ" を信条にしている身としては emacs
版が無いという事実は受け入れがたい. 使うかどうかはさておきだが.
そんな訳で構想1日, コーディング N時間のクリックハックを試みたのだが
意外と手間どる.
google suggest からデータを引っぱってくるのは emacs ではちょっと直ぐに思い浮かばなかった,
というより横で ruby で xmlrpc かきかけのコードが居たのでこれを元にちゃちゃっと書いてみる.
google suggest の API をしらないのでググってみるとあっさり解決. 流用させてもらおう.
むしろ悩んだのがインターフェース. vim 版は C-xC-u でやってるけどそもそも単語の切り取り
とかどうするよ, C-xC-u って emacs だと既に upper 変換かなんかで使ってるし. ということで
ちょっと悩む. 一番いいのは使い慣れた skk にでも似せることかな, というわけで作ってみた.
単語はそのまま backward-ward, forward-ward の間ということにして, 単語を ruby
スクリプトに食べさせ, 出力結果を temporary buffer から list にしてあとは SKK
もどきの interface にしてしまうことにする. google suggest はどうも utf-8 入力 sjis 出力っぽいので面倒な変換は ruby におまかせということでw
キーの入力をどう取るのか最初しばらくわからなかったが raw level で取れる read-event
関数があるとのことなのでこれを使用, 選択に応じて上述の範囲で単語を置換する, ということ
にしてみた.
# 最近は github に入れるのがはやりなのかな. メンテナンス考えるとそうするべき
なんだろうけど. 会社のネットワーク通るかな...
## え, ruby の部分を emacs にしないと真の emacsian とは云えない? お説ごもっとも.
JAIST の課題とか一段落したら直しますm(_._)m

(setq suggest-command "~/works/examcodes/suggest/suggest.rb")
(defun search-suggest (word)
(interactive)
(let ((suggestword nil) (suggestlist ()))
(with-temp-buffer
(call-process suggest-command nil t nil word)
(goto-char (point-min))
(while (not (eobp))
(setq suggestword (buffer-substring (progn (beginning-of-line) (point)) (progn (end-of-line) (point))))
;;(message suggestword)
(setq suggestlist (cons suggestword suggestlist))
;;(message "%s:%s" suggestword suggestlist)
(forward-line 1)))
suggestlist))
(defun cut-word ()
(interactive)
(let ((word))
(setq word (buffer-substring (progn (backward-word) (point)) (progn (forward-word) (point))))
word))
(defun make-suggest-string (suggestedlist n m)
(interactive)
(let ((i 0) (suggest-str ""))
(while (
(global-set-key "\C-x\C-u" 'call-suggest)


#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require "rexml/document"
require 'net/http'
require 'cgi'
require 'nkf'

export_code = "-e"
site = 'www.google.co.jp'

word = ARGV[0]
utf8_word = NKF.nkf('-w', word)

http = Net::HTTP.new(site, 80)
query = "/complete/search?output=toolbar&q=#{CGI::escape(utf8_word)}"
req = Net::HTTP::Get.new(query)
res = http.request(req)

res_str = NKF.nkf('-w', res.read_body)
doc = REXML::Document.new(res_str)

REXML::XPath.match(doc, "//@data").each { |e|
puts NKF.nkf('-e', e.to_s)
}


でこんな風に

入力して単語で C-xC-u

一覧表示から選択すると

置換されたり.

なんてことで実装したら, この blog を書いているときには振った某所の中の人から既に実装した強者がいるとのこと.
なんてこったい. しかもこっちはどうやらちゃんと xmlrpc も emacs lisp っぽい..

Posted by とあるダメ犬の戯言日記 at 2010/02/08 (Mon) 02:26:57

TrackBack ping me at
Post a comment

writeback message: Ready to post a comment.