Does this version work right?
(defun blink-matching-open () "Move cursor momentarily to the beginning of the sexp before point." (interactive) (when (and (> (point) (1+ (point-min))) blink-matching-paren ;; Verify an even number of quoting characters precede the close. (= 1 (logand 1 (- (point) (save-excursion (forward-char -1) (skip-syntax-backward "/\\") (point)))))) (let* ((oldpos (point)) (blinkpos) (mismatch) message-log-max matching-paren open-paren-line-string) (save-excursion (save-restriction (if blink-matching-paren-distance (narrow-to-region (max (point-min) (- (point) blink-matching-paren-distance)) oldpos)) (condition-case () (let ((parse-sexp-ignore-comments (and parse-sexp-ignore-comments (not blink-matching-paren-dont-ignore-comments)))) (setq blinkpos (scan-sexps oldpos -1))) (error nil))) (and blinkpos ;; Not syntax '$'. (not (eq (syntax-class (syntax-after blinkpos)) 8)) (setq matching-paren (let ((syntax (syntax-after blinkpos))) (and (consp syntax) (eq (syntax-class syntax) 4) (cdr syntax))) mismatch (or (null matching-paren) (/= (char-after (1- oldpos)) matching-paren)))) (if mismatch (setq blinkpos nil)) (if blinkpos ;; Don't log messages about paren matching. (if (save-excursion (goto-char blinkpos) (pos-visible-in-window-p)) (progn (goto-char blinkpos) (and blink-matching-paren-on-screen (sit-for blink-matching-delay))) (save-excursion (goto-char blinkpos) (setq open-paren-line-string ;; Show what precedes the open in its line, if anything. (if (save-excursion (skip-chars-backward " \t") (not (bolp))) (buffer-substring (progn (beginning-of-line) (point)) (1+ blinkpos)) ;; Show what follows the open in its line, if anything. (if (save-excursion (forward-char 1) (skip-chars-forward " \t") (not (eolp))) (buffer-substring blinkpos (progn (end-of-line) (point))) ;; Otherwise show the previous nonblank line, ;; if there is one. (if (save-excursion (skip-chars-backward "\n \t") (not (bobp))) (concat (buffer-substring (progn (skip-chars-backward "\n \t") (beginning-of-line) (point)) (progn (end-of-line) (skip-chars-backward " \t") (point))) ;; Replace the newline and other whitespace with `...'. "..." (buffer-substring blinkpos (1+ blinkpos))) ;; There is nothing to show except the char itself. (buffer-substring blinkpos (1+ blinkpos))))))) (message "Matches %s" (substring-no-properties open-paren-line-string))) (cond (mismatch (message "Mismatched parentheses")) ((not blink-matching-paren-distance) (message "Unmatched parenthesis")))))))) _______________________________________________ Emacs-devel mailing list [EMAIL PROTECTED] http://lists.gnu.org/mailman/listinfo/emacs-devel