@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Dictionary.app を Emacs から引く

すでにいろいろやり方が書いてあるので、やってみた。

俺の環境 (Mac OSX Leopard) だと dict.m がコンパイルできなかったのと、マウスカーソルじゃなくてカーソル位置の単語を引きたかったので、上記三つの URL の内容をまぜこぜにしたバージョンを作った。

;; Dictionary.app を Emacs から引く
;; (+ "http://sakito.jp/mac/dictionary.html"
;;    "http://d.hatena.ne.jp/tomoya/20091218/1261138091"
;;    "http://d.hatena.ne.jp/tomoya/20100103/1262482873")
(defvar dict-bin "~/.emacs.d/dict.py"
  "dict 実行ファイルのパス")
(defun my-dictionary ()
  (interactive)
  (let ((pt (save-excursion (mouse-set-point last-nonmenu-event)))
        (old-buf (current-buffer))
        (dict-buf (get-buffer-create "*dictionary.app*"))
        beg end)
    (if (and mark-active
             (<= (region-beginning) pt) (<= pt (region-end)))
        (setq beg (region-beginning)
              end (region-end))
      (save-excursion
        (goto-char pt)
        (setq end (progn (forward-word) (point)))
        (setq beg (progn (backward-word) (point)))
        ))
    (setq word (buffer-substring-no-properties beg end))
    (set-buffer dict-buf)
    (erase-buffer)
    (call-process dict-bin
                  nil "*dictionary.app*" t word
                  "Japanese-English" "Japanese" "Japanese Synonyms")
    (setq dict (buffer-string))
    (set-buffer old-buf)
    (when (not (eq (length dict) 0))
      (popup-tip dict :margin t :scroll-bar t) t)
    ))
;(defvar dict-timer nil)
;(defvar dict-delay 1.0)
;(defun dict-timer ()
;  (when (and (not (minibufferp))
;             (and mark-active transient-mark-mode))
;    (ns-popup-dictionary)))
;(setq dict-timer (run-with-idle-timer dict-delay dict-delay 'dict-timer))
(define-key global-map (kbd "C-M-d") 'my-dictionary)

experimentail/hackers パッチを当ててるので C-M-d は DictionaryService 連携で乗っ取られてて Emacs 側にこないので C-M-S-d を押すとできる。 (translated from C-M-S-d) だそうで。知らなかった (適当に Shift 一緒に押したらこうなった)