懒得找星际译王的词库, 不过Emacs没有翻译功能怎么行呢?利用有道的api实现一个简单的在线的。选中词后按组合键Ctrl-c f。
1. 首先先到有道的api申请页面申请一个key,随便写点,不过邮件要准确,因为会把key和keyfrom发到你的邮箱的。然后利用得到的key和夫keyfrom替换一下:
http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=<doctype>&version=1
注:有三种方式调用api:json,jsonp,xml,这边我用的是xml.
2.到emacs wiki下面找到这个xmlparser加入到你的emacs中,因为要用这个库解析获取到的xml结果.
http://emacswiki.org/emacs/XmlParser
注:我是这样放的:我把xml.el和xml-parse.el文件放在~/.emacs.d/config/目录下面,下面的代码也是新建一个el文件放进去的。在~/.emacs中加入下面的代码:
(add-to-list 'load-path "~/elisp-sites" "~/.emacs.d/config")
(mapc 'load (directory-files "~/.emacs.d/config" t "^[a-zA-Z0-9].*.el$"))
3. 将下面的代码加入到~/.emacs文件中,或者可以和我一样。
;获取要翻译的词典
(defun get-current-word ()
(interactive)
(let ((begin (point-min)) (end (point-max)))
(save-excursion
(when (not mark-active)
(backward-word)
(mark-word))
(setq begin (region-beginning)
end (region-end)))
(buffer-substring begin end)))
;;抓取翻译结果
(defun get-translate-result (word)
(shell-command-to-string (concat (format "curl 'http://fanyi.youdao.com/openapi.do?keyfrom=&key=&type=data&doctype=xml&version=1.1&q=%s' 2>/dev/null" word))))
;;分析翻译结果,并返回显示字符串
(defun analytic-translate-result (translateresult)
(let* ((root (with-temp-buffer (insert translateresult)
(xml-parse-region (point-min) (point-max))))
(youdao-fanyi (car root))
(basic (car (xml-get-children youdao-fanyi 'basic)))
(explains-ex (xml-get-children (car (xml-get-children basic 'explains)) 'ex))
(phonetic-texts (car (xml-node-children (car (xml-get-children basic 'phonetic)))))
(explains-texts (concat "音标:" phonetic-texts "\n")))
(loop for ex in explains-ex
do (setq explains-texts (concat explains-texts (car (xml-node-children ex)) "\n")))
explains-texts))
;;主函数
(defun lookup-word ()
(interactive)
(let* ((word (get-current-word))
(translate-result (get-translate-result word))
(explains-texts (analytic-translate-result translate-result)))
(tooltip-show explains-texts)))
;;绑定到Ctrl-c f组合键上
(global-set-key (kbd "C-c f") 'lookup-word)
注意:抓取翻译的结果代码中的url要加上你的key和keyfrom,重启一下emacs。
结果就像这样: