Emacsの単語をブラウザで検索

Emacs でコードとか読んでると Google で検索したくなることはよくあるので,方法をいろいろ調べてみた.

anything-c-source-surfraw

1つが anything-c-source-surfraw.anything をインストールしている Emacs なら,sudo apt-get install surfraw で surfraw をインストールして,M-x anything-surfraw で使える.

試してみたが,複雑な検索を簡単に行うことはできても,検索までにいろいろ入力が必要で,いつも Google で検索する私にはちょい面倒.
あと,別のサーチエンジンを追加するには surfraw 側を弄る必要があるらしいのだが,そこがさっぱりわからなかったので断念.

anything-c-source-surfraw の詳細を知りたければ,以下が詳しいので参考に.

emacs からサーチエンジンの検索結果を呼び出す anything-c-source-surfraw の紹介 - わからん

search-web.el

もう1つ,search-web.el を見つけた.こちらは手軽に検索できて,サーチエンジンの追加も簡単.

Emacs ですぐに単語の検索をしたい欲望を叶える Elisp。 - 日々、とんは語る。

search-web.el ではリージョン検索と付近の単語検索で関数を分けているが,transient-mark-mode 時にはリージョンを,そうでないときは付近の単語を検索する方が便利.
あと,現在のバージョンの search-web.el では,キーバインド一発検索が設定できない.

ということで,.emacsに以下を追加.

(require 'search-web)

(define-prefix-command 'search-web-map)
(global-set-key (kbd "M-i") 'search-web-map)
(global-set-key (kbd "M-i g") (lambda () (interactive) (search-web-dwim "google")))
(global-set-key (kbd "M-i M-i") (lambda () (interactive) (search-web-dwim)))

(defun search-web-dwim (&optional arg-engine)
  "transient-mark-mode がオンの時はリージョンを,
オフの時はカーソル位置の単語を検索する."
  (interactive)
  (cond
   ((transient-region-active-p)
    (search-web-region arg-engine))
   (t
    (search-web-at-point arg-engine))))

さらに,search-web.el の search-web-at-point と search-web-region を以下に書き換え.

(defun search-web-at-point (&optional arg-engine)
  (interactive)
  (message "sw: %s" arg-engine)
  (let* ((completion-ignore-case t)
         (search-word (substring-no-properties (thing-at-point 'word)))
         (engine (or arg-engine (completing-read (format "[%s] Search Engine: " search-word)
                                   (make-search-engine-name-list) nil t))))
  (search-web engine search-word)))

(defun search-web-region (&optional arg-engine)
  (interactive)
  (let* ((completion-ignore-case t)
         (beg (mark))
         (end (point))
         (search-word (buffer-substring-no-properties beg end))
         (engine (or arg-engine (completing-read (format "[%s] Search Engine: " search-word)
                                   (make-search-engine-name-list) nil t))))
    (search-web engine search-word)))

M-i g で Google 検索,M-i M-i でサーチエンジンを選択して検索できる.