emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: blink-matching-open resizes echo area


From: Richard M. Stallman
Subject: Re: blink-matching-open resizes echo area
Date: Sun, 21 Aug 2005 20:06:23 -0400

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"))))))))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]