hyperspec.el は便利ですがね。

どもです。
更新サボりまくり。
つぼみが出ているのに,レジナの定植先延ばし過ぎ。
ま,幸か不幸か生存しているということで。ワタシもレジナも。

common lisp のドキュメントを引くのは非常に楽ですけど。

カーソルがドキュメントに存在するシンボルの上にある状態で,
そのシンボルではないものを探そうとするも,
強制的にカーソル下のシンボルについてのドキュメントが引かれる
のは困ったちゃんです。
アドバイスしようとしたけど,面倒なのでソースを変更しちゃいました。
変更後の hyperspec.el から引用。

(defun common-lisp-hyperspec (symbol-name)
  "View the documentation on SYMBOL-NAME from the Common Lisp HyperSpec.
If SYMBOL-NAME has more than one definition, all of them are displayed with
your favorite browser in sequence.  The browser should have a \"back\"
function to view the separate definitions.

The Common Lisp HyperSpec is the full ANSI Standard Common Lisp, provided
by Kent Pitman and Xanalys Inc.  By default, the Xanalys Web site is
visited to retrieve the information.  Xanalys Inc. allows you to transfer
the entire Common Lisp HyperSpec to your own site under certain conditions.
Visit http://www.lispworks.com/reference/HyperSpec/ for more information.
If you copy the HyperSpec to another location, customize the variable
`common-lisp-hyperspec-root' to point to that location."
  (interactive (list (let* ((symbol-at-point (thing-at-point 'symbol))
                            (stripped-symbol
                             (and symbol-at-point
                                  (substring-no-properties
                                   (downcase
                                    (common-lisp-hyperspec-strip-cl-package 
                                     symbol-at-point))))))
                       (progn (and stripped-symbol
                                   (intern-soft stripped-symbol
                                                common-lisp-hyperspec-symbols))
                              (completing-read
                               (format "Look up symbol in CL HyperSpec (default %s): "
                                       stripped-symbol)
                               common-lisp-hyperspec-symbols #'boundp
                               t nil
                               'common-lisp-hyperspec-history stripped-symbol)))))
  (maplist (lambda (entry)
             (browse-url (concat common-lisp-hyperspec-root "Body/" (car entry)))
             (if (cdr entry)
                 (sleep-for 1.5)))
           (let ((symbol (intern-soft 
                          (common-lisp-hyperspec-strip-cl-package 
                           (downcase symbol-name))
                          common-lisp-hyperspec-symbols)))
             (if (and symbol (boundp symbol))
                 (symbol-value symbol)
               (error "The symbol `%s' is not defined in Common Lisp"
                      symbol-name)))))


デフォルトはカーソル下のシンボル。
デフォルトのシンボルを調べたいときには,そのままEnterなり,C-mなり。
そうでない場合は,自分で入力。
カーソル下にシンボルがないときに,デフォルトが「nil」になってしまうのは
ご愛敬。誰か直して。ま,その場合は自分で入力したい状況だろうから大丈夫かな。


以下は,diff。元のソースのインデントが読みにくかったので,それも自分仕様に。
というか,Emacs に任せた。

Index: hyperspec.el
===================================================================
RCS file: /project/slime/cvsroot/slime/hyperspec.el,v
retrieving revision 1.16
diff -u -r1.16 hyperspec.el
--- hyperspec.el	31 Jan 2010 19:07:54 -0000	1.16
+++ hyperspec.el	20 Oct 2011 09:30:29 -0000
@@ -84,29 +84,29 @@
 If you copy the HyperSpec to another location, customize the variable
 `common-lisp-hyperspec-root' to point to that location."
   (interactive (list (let* ((symbol-at-point (thing-at-point 'symbol))
-			    (stripped-symbol 
-			     (and symbol-at-point
-				  (substring-no-properties
-				   (downcase
-				    (common-lisp-hyperspec-strip-cl-package 
-				     symbol-at-point))))))
-                       (if (and stripped-symbol
-                                (intern-soft stripped-symbol
-                                             common-lisp-hyperspec-symbols))
-                           stripped-symbol
-                         (completing-read
-                          "Look up symbol in Common Lisp HyperSpec: "
-                          common-lisp-hyperspec-symbols #'boundp
-                          t stripped-symbol
-                          'common-lisp-hyperspec-history)))))
+                            (stripped-symbol
+                             (and symbol-at-point
+                                  (substring-no-properties
+                                   (downcase
+                                    (common-lisp-hyperspec-strip-cl-package 
+                                     symbol-at-point))))))
+                       (progn (and stripped-symbol
+                                   (intern-soft stripped-symbol
+                                                common-lisp-hyperspec-symbols))
+                              (completing-read
+                               (format "Look up symbol in CL HyperSpec (default %s): "
+                                       stripped-symbol)
+                               common-lisp-hyperspec-symbols #'boundp
+                               t nil
+                               'common-lisp-hyperspec-history stripped-symbol)))))
   (maplist (lambda (entry)
              (browse-url (concat common-lisp-hyperspec-root "Body/" (car entry)))
              (if (cdr entry)
                  (sleep-for 1.5)))
            (let ((symbol (intern-soft 
-			  (common-lisp-hyperspec-strip-cl-package 
-			   (downcase symbol-name))
-			  common-lisp-hyperspec-symbols)))
+                          (common-lisp-hyperspec-strip-cl-package 
+                           (downcase symbol-name))
+                          common-lisp-hyperspec-symbols)))
              (if (and symbol (boundp symbol))
                  (symbol-value symbol)
                (error "The symbol `%s' is not defined in Common Lisp"

ついでなので,アドバイスもさらしておこう。

どっかのサイトにあったものをコピペしていたのですが,
w3m の挙動が気に入らなかったので,その部分を修正。
簡単に言うと,w3mウィンドウがあれば,そこでドキュメントを開くというもの。
だけど,「*w3m*<2>」とかの場合はダメじゃね? ということに今,気づいた
メジャーモードで調べるか。そのうち修正します。

(defadvice common-lisp-hyperspec
  (around hyperspec-lookup-w3m () activate)
  (let* ((window-configuration (current-window-configuration))
         (browse-url-browser-function
          (lambda (url new-window)
            (if (and (get-buffer "*w3m*")
                     (get-buffer-window (get-buffer "*w3m*")))
                (select-window (get-buffer-window (get-buffer "*w3m*")))
              (other-window 1))
            (w3m-browse-url url nil)
            (let ((hs-map (copy-keymap w3m-mode-map)))
              (define-key hs-map (kbd "q")
                `(lambda ()
                   (interactive)
                   (kill-buffer nil)
                   (set-window-configuration ,window-configuration)))
              (use-local-map hs-map)))))
    ad-do-it))

追記

たぶん動く。はず。
よく見たら,「q」で kill-buffer されちゃうことに気づいて,これは困るので,
kill-buffer を除去。さらに気づいたが,ウィンドウが1つの状態だと,
w3m バッファ一色になってしまうので,それはそれで困るなぁ。
ウィンドウ1つの場合は分割するとかあるけど,以前も似たようなのを書いた気がするし,
面倒臭いのでやめた。やはり popwin.el を使用するべきなのかも。

(defadvice common-lisp-hyperspec
  (around hyperspec-lookup-w3m () activate)
  (let* ((window-configuration (current-window-configuration))
         (browse-url-browser-function
          (lambda (url new-window)
            (let ((b (car (remove-if-not (lambda (buf)
                                           (save-excursion
                                             (set-buffer buf)
                                             (eq major-mode 'w3m-mode)))
                                         (mapcar #'window-buffer (window-list))))))
              (if b
                  (select-window (get-buffer-window b))
                (other-window 1))
              (w3m-browse-url url nil)
              (let ((hs-map (copy-keymap w3m-mode-map)))
                (define-key hs-map (kbd "q")
                  `(lambda ()
                     (interactive)
                     (set-window-configuration ,window-configuration)))
                (use-local-map hs-map))))))
    ad-do-it))