2010-02-03 emacs suggest 書いてみた
いわく, 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 (<= (+ n i) m)
(cond
((= i 0) (setq suggest-str (concat suggest-str "A:" (nth i suggestedlist) " ")))
((= i 1) (setq suggest-str (concat suggest-str "S:" (nth i suggestedlist) " ")))
((= i 2) (setq suggest-str (concat suggest-str "D:" (nth i suggestedlist) " ")))
((= i 3) (setq suggest-str (concat suggest-str "F:" (nth i suggestedlist) " ")))
((= i 4) (setq suggest-str (concat suggest-str "G:" (nth i suggestedlist) " ")))
((= i 5) (setq suggest-str (concat suggest-str "H:" (nth i suggestedlist) " ")))
((= i 6) (setq suggest-str (concat suggest-str "J:" (nth i suggestedlist) " ")))
((= i 7) (setq suggest-str (concat suggest-str "K:" (nth i suggestedlist) " ")))
((= i 8) (setq suggest-str (concat suggest-str "L:" (nth i suggestedlist) " ")))
((= i 9) (setq suggest-str (concat suggest-str ";:" (nth i suggestedlist) " ")))
(t ()))
(setq i (+ i 1)))
suggest-str))
(defun read-key-once()
(interactive)
(let ((readkey))
(setq readkey (read-event))
readkey))
(defun replace-word-to-str(str)
(kill-region (progn (backward-word) (point)) (progn (forward-word) (point)))
(insert str))
(defun display-suggest-string (lst)
(interactive "*P")
(message "display-suggest-string: %s" lst)
(setq suggest-str (make-suggest-string lst 0 9))
(message suggest-str)
(setq key (read-key-once))
;;
(cond
((or (= key ?a) (= key ?A)) (replace-word-to-str (nth 0 lst)))
((or (= key ?s) (= key ?S)) (replace-word-to-str (nth 1 lst)))
((or (= key ?d) (= key ?D)) (replace-word-to-str (nth 2 lst)))
((or (= key ?f) (= key ?F)) (replace-word-to-str (nth 3 lst)))
((or (= key ?g) (= key ?G)) (replace-word-to-str (nth 4 lst)))
((or (= key ?h) (= key ?H)) (replace-word-to-str (nth 5 lst)))
((or (= key ?j) (= key ?J)) (replace-word-to-str (nth 6 lst)))
((or (= key ?k) (= key ?K)) (replace-word-to-str (nth 7 lst)))
((or (= key ?l) (= key ?L)) (replace-word-to-str (nth 8 lst)))
((or (= key ?\;) (= key ?:)) (replace-word-to-str (nth 9 lst)))
(t ())))
(defun call-suggest ()
(interactive)
(setq suggestword (cut-word))
(setq suggestedlist (search-suggest suggestword))
(display-suggest-string suggestedlist))
(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 っぽい..
そのうち書く. 只今整備中につきしばらくお待ちください.m(_._)m
クエリパラメータのie,oeで入出力のencoding切り替え可能です。:)
thanx. ruby の引数に喰わせようかと思ってましたが次期バージョンはそれでいかせてもらいます。
gAft3i <a href="http://tydkwizjonej.com/">tydkwizjonej</a>, [url=http://ebadtlinqydb.com/]ebadtlinqydb[/url], [link=http://xrxziqimahwb.com/]xrxziqimahwb[/link], http://lfolhkmbfkoc.com/
W0TBjW <a href="http://qoctzrmrlocj.com/">qoctzrmrlocj</a>, [url=http://aycrafmflwsc.com/]aycrafmflwsc[/url], [link=http://tolqjrvjhtbx.com/]tolqjrvjhtbx[/link], http://nkrtgrchnqng.com/
http://markonzo.edu Help me to find the, <a href="http://jguru.com/guru/viewbio.jsp?EID=1536072">actual ashley furniture</a> http://jguru.com/guru/viewbio.jsp?EID=1536072 actual ashley furniture, gowidb, <a href="http://jguru.com/guru/viewbio.jsp?EID=1536075">watch allegiant air</a> http://jguru.com/guru/viewbio.jsp?EID=1536075 watch allegiant air, poyqoa, <a href="http://jguru.com/guru/viewbio.jsp?EID=1536078">best pressure washers</a> http://jguru.com/guru/viewbio.jsp?EID=1536078 best pressure washers, jyxte, <a href="http://jguru.com/guru/viewbio.jsp?EID=1536080">follow dishnetwork</a> http://jguru.com/guru/viewbio.jsp?EID=1536080 follow dishnetwork, jekew, <a href="http://jguru.com/guru/viewbio.jsp?EID=1536076">fresh adt security</a> http://jguru.com/guru/viewbio.jsp?EID=1536076 fresh adt security, vrpnmr,
AH4HFT <a href="http://pzhpqaptvvfn.com/">pzhpqaptvvfn</a>, [url=http://jzwimbzitiie.com/]jzwimbzitiie[/url], [link=http://bmplbsfuwbec.com/]bmplbsfuwbec[/link], http://nckgtxumxtia.com/
http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra 袱袢袱
dohC8U <a href="http://pxaamyifmmib.com/">pxaamyifmmib</a>, [url=http://msvbbyhjhptz.com/]msvbbyhjhptz[/url], [link=http://icarsahitvik.com/]icarsahitvik[/link], http://ekqfnivowltn.com/
9k9cq9 <a href="http://omhlkyfjoklm.com/">omhlkyfjoklm</a>, [url=http://qwzkbukdpbxa.com/]qwzkbukdpbxa[/url], [link=http://hdnhbotmruij.com/]hdnhbotmruij[/link], http://dpnqykjisibd.com/
t3hxeU <a href="http://npemotxszojp.com/">npemotxszojp</a>, [url=http://vtqregtctsrv.com/]vtqregtctsrv[/url], [link=http://ogtlrnqjvjyr.com/]ogtlrnqjvjyr[/link], http://qurjfoyikrti.com/
http://lumerkoz.edu Give somebody the to a site about the http://talkingaboutwindows.com/members/Buy-Ciprofloxacin/default.aspx faxes http://www.comicspace.com/amoxil/ heptagon idsmt http://www.lovespeaks.org/profiles/blogs/buy-metronidazole identities http://www.comicspace.com/clomid/ htmlthe http://soundcloud.com/altace sandals
eMJXgE <a href="http://weddzhyyvxne.com/">weddzhyyvxne</a>, [url=http://sjdlrtsusxrm.com/]sjdlrtsusxrm[/url], [link=http://xnnzgiwmfofe.com/]xnnzgiwmfofe[/link], http://mrqtlzjigavn.com/