diff .elisp/settings/50.localfuncs.el @ 126:34b698771af9

emacs keybinding fixes * Stop passing any keys through to the Mac layer * M-shift-f is now textmate-find-in-project * M-p bounces to matching paren (includes new elisp function to do that, is there a built in one?)
author Augie Fackler <durin42@gmail.com>
date Thu, 09 Jul 2009 13:32:06 -0500
parents 15bcc3e0afeb
children e30655eb7050
line wrap: on
line diff
--- a/.elisp/settings/50.localfuncs.el
+++ b/.elisp/settings/50.localfuncs.el
@@ -74,3 +74,41 @@ Delimiters are paired characters: ()[]<>«»“”‘’「」, including \"\"."
    (set-mark b1)
    )
  )
+
+;; Most of this was extracted from show-paren-function in paren.el from an emacs 23 nightly
+;; Also, it seems like this really ought to be builtin, but I can't find it.
+(defun bounce-to-other-paren ()
+  (interactive)
+  (let ((oldpos (point))
+        (dir (cond ((eq (syntax-class (syntax-after (1- (point)))) 5) -1)
+                   ((eq (syntax-class (syntax-after (point)))      4) 1)))
+        pos mismatch face)
+    ;;
+    ;; Find the other end of the sexp.
+    (when dir
+      (save-excursion
+        (save-restriction
+          ;; Determine the range within which to look for a match.
+          (when blink-matching-paren-distance
+            (narrow-to-region
+             (max (point-min) (- (point) blink-matching-paren-distance))
+             (min (point-max) (+ (point) blink-matching-paren-distance))))
+          ;; Scan across one sexp within that range.
+          ;; Errors or nil mean there is a mismatch.
+          (condition-case ()
+              (setq pos (scan-sexps (point) dir))
+            (error (setq pos t mismatch t)))
+          ;; Move back the other way and verify we get back to the
+          ;; starting point.  If not, these two parens don't really match.
+          ;; Maybe the one at point is escaped and doesn't really count.
+          (when (integerp pos)
+            (unless (condition-case ()
+                        (eq (point) (scan-sexps pos (- dir)))
+                      (error nil))
+              (setq pos nil)))
+          )))
+    ;; Highlight the other end of the sexp, or unhighlight if none.
+    (if (and pos (integerp pos))
+        (goto-char pos)
+      (message "No matching other paren found.")
+      )))