C-M-p/C-M-nで対応するダブルクオートに飛ぶ

なんか欲しくなったので書いてみた. backward-list/forward-listへのアドバイスとして.
何をするかと言えば, ポイントが「"」にあれば, C-M-pやらC-M-nで対応する「"」に飛ぶだけ.
普通は, 中括弧とか丸括弧に作用するC-M-p/C-M-nがダブルクオートの場合でも動く, そんだけ.
まあ, こいつらと似た風に働く.
ちなみに, バックスラッシュ「\」でダブルクオートがエスケープされてたら, 同じくエスケープされたのに飛ぶ.

(defadvice backward-list (around backward-quote)
  (let ((ch (char-before (point)))
        (op (point)) pos)
    (cond
     ((= ch ?\")
      (let ((bslash (if (= ?\\ (char-before (1- (point)))) t nil)))
        (goto-char (1- (point)))
        (goto-char (catch 'loop
                     (while (re-search-backward "\"" nil t)
                       (setq pos (match-beginning 0))
                       (cond
                        ((null pos)
                         (throw 'loop op))
                        ((or (and bslash
                                  (= (char-before pos) ?\\))
                             (and (not bslash)
                                  (/= (char-before pos) ?\\)))
                         (throw 'loop pos))
                        (t
                         nil)))))))
     (t
      ad-do-it))))
;; 活性
(ad-activate 'backward-list)
;; ;; 不活性
;; (ad-deactivate 'backward-list)

(defadvice forward-list (around forward-quote)
  (let ((ch (char-after (point)))
        (op (point)) pos)
    (cond
     ((and (= ch ?\")
           (/= (ad-get-arg 0) -1))
      (let ((bslash (if (= ?\\ (char-before (point))) t nil)))
        (goto-char (1+ (point)))
        (goto-char (catch 'loop
                     (while (re-search-forward "\"" nil t)
                       (setq pos (match-beginning 0))
                       (cond
                        ((null pos)
                         (throw 'loop op))
                        ((or (and bslash
                                  (= (char-before pos) ?\\))
                             (and (not bslash)
                                  (/= (char-before pos) ?\\)))
                         (throw 'loop (1+ pos)))
                        (t
                         nil)))))))
     (t
      ad-do-it))))
;; 活性
(ad-activate 'forward-list)
;; ;; 不活性
;; (ad-deactivate 'forward-list)

本格的にやるならtimerまわしてポイントがダブルクオートの上にあるなら対応するのを光らせた方がいいかな?
つか, scan-listsへのアドバイスにしたら, アドバイス1つで済んだかなあ?まあいいや.

追記


inferior-lisp-mode, scheme-mode, emacs-lisp-mode, lisp-modeのような,
Lisp関係のmodeなら, C-M-f/C-M-bで上記の動作をしてくれるようです.
コメントで教えてもらいました.
matsuyamaさん、ありがとうございますm(_ _)m.

更新時刻

  • 1かいめ 2008年, 3月18日, 4:00
  • 2かいめ 2008年, 3月19日, 1:37