Mercurial > emacs
view lisp/paren.el @ 21873:3ab8be88f2ef
Generalized region skipping added.
Checks comments only in code.
Added backward compatible support for customize.
(ispell-query-replace-choices, ispell-message-dictionary-alist)
(ispell-grep-command, ispell-grep-options, ispell-look-command)
(ispell-look-options, ispell-use-ptys-p, ispell-local-dictionary)
(ispell-dictionary-alist): Now customizable.
Fixed type of custom variables: ispell-help-in-bufferp.
(ispell-use-framepop-p): New variable.
(ispell-dictionary-alist): Added dictionaries: castellano, castellano8
czech, esperanto, esperanto-tex, norsk, russian.
Capitalize XEmacs correctly, and change lucid to xemacs in code:
(ispell-menu-lucid): Renamed to ispell-menu-xemacs.
Changed string compares for version number to be correct for XEmacs.
Fixed to work with string properties.
(ispell-recursive-edit-marker): new marker saving return point.
(ispell-skip-region-alist): New variable defining regions.
(ispell-tex-skip-alists): New variable for LaTeX regions.
(ispell-skip-sgml): Now buffer-mode aware.
(ispell-highlight-p): Support block cursors.
(ispell-message-text-end): Don't check signatures.
(ispell-comments-and-strings): New command, added to menu.
(ispell-int-char): New function for character incrementing.
(ispell-word): Produces message on error when called from
ispell-minor-mode. Potential infinite loop removed.
(ispell-command-loop): prevent XEmacs modeline hiding.
Allow temporary split of dedicated windows. Improve recursive
edit support. Support block cursors.
(ispell-show-choices): New function cleaning up command loop.
(ispell-highlight-spelling-error-generic): Block cursor support added.
(ispell-highlight-spelling-error-xemacs): Block cursor, name change.
(ispell-overlay-window): dedicated window splitting, XEmacs changes.
(ispell-parse-output): Displays ispell process error messages.
(check-ispell-version): Interactive mode that shows ispell versions.
(ispell-begin-skip-region-regexp): New region skipping function.
(ispell-begin-tex-skip-regexp): New tex mode region skipping function.
(ispell-begin-skip-region): New region skipping function.
(ispell-tex-arg-end): New tex mode region skipping function.
(ispell-skip-region): New region skipping function.
(ispell-get-line): New function to clean up command loop.
(ispell-process-line): New function cleaning up command loop.
(ispell-continue): Improve recursive editor support.
(ispell-complete-word): Interior fragment support improved.
(ispell-message): Region skipping vastly improved.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Thu, 30 Apr 1998 06:43:48 +0000 |
parents | 9b248fbd740f |
children | 7d49e4c824b6 |
line wrap: on
line source
;;; paren.el --- highlight matching paren. ;; Copyright (C) 1993, 1996 Free Software Foundation, Inc. ;; Author: rms@gnu.ai.mit.edu ;; Maintainer: FSF ;; Keywords: languages, faces ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; Load this and it will display highlighting on whatever ;; paren matches the one before or after point. ;;; Code: (defgroup paren-showing nil "Showing (un)matching of parens and expressions." :prefix "show-paren-" :group 'paren-matching) ;; This is the overlay used to highlight the matching paren. (defvar show-paren-overlay nil) ;; This is the overlay used to highlight the closeparen right before point. (defvar show-paren-overlay-1 nil) (defcustom show-paren-mode nil "Toggle Show Paren mode. When Show Paren mode is enabled, any matching parenthesis is highlighted after `show-paren-delay' seconds of Emacs idle time. You must modify via \\[customize] for this variable to have an effect." :set (lambda (symbol value) (show-paren-mode (or value 0))) :initialize 'custom-initialize-default :type 'boolean :group 'paren-showing :require 'paren) (defcustom show-paren-style 'parenthesis "*Style used when showing a matching paren. Valid styles are `parenthesis' (meaning show the matching paren), `expression' (meaning show the entire expression enclosed by the paren) and `mixed' (meaning show the matching paren if it is visible, and the expression otherwise)." :type '(choice (const parenthesis) (const expression) (const mixed)) :group 'paren-showing) (defcustom show-paren-delay (if (featurep 'lisp-float-type) (/ (float 1) (float 8)) 1) "*Time in seconds to delay before showing a matching paren." :type '(number :tag "seconds") :group 'paren-showing) (defface show-paren-match-face '((((class color)) (:background "turquoise")) (t (:background "gray"))) "Show Paren mode face used for a matching paren." :group 'faces :group 'paren-showing) (defface show-paren-mismatch-face '((((class color)) (:foreground "white" :background "purple")) (t (:reverse-video t))) "Show Paren mode face used for a mismatching paren." :group 'faces :group 'paren-showing) (defvar show-paren-idle-timer nil) ;;;###autoload (defun show-paren-mode (&optional arg) "Toggle Show Paren mode. With prefix ARG, turn Show Paren mode on if and only if ARG is positive. Returns the new status of Show Paren mode (non-nil means on). When Show Paren mode is enabled, any matching parenthesis is highlighted in `show-paren-style' after `show-paren-delay' seconds of Emacs idle time." (interactive "P") (when window-system (let ((on-p (if arg (> (prefix-numeric-value arg) 0) (not show-paren-mode)))) (setq blink-matching-paren-on-screen (not on-p)) (when show-paren-idle-timer (cancel-timer show-paren-idle-timer)) (if on-p (setq show-paren-idle-timer (run-with-idle-timer show-paren-delay t 'show-paren-function)) (and show-paren-overlay (overlay-buffer show-paren-overlay) (delete-overlay show-paren-overlay)) (and show-paren-overlay-1 (overlay-buffer show-paren-overlay-1) (delete-overlay show-paren-overlay-1))) (setq show-paren-mode on-p)))) ;; Find the place to show, if there is one, ;; and show it until input arrives. (defun show-paren-function () ;; Do nothing if no window system to display results with. ;; Do nothing if executing keyboard macro. ;; Do nothing if input is pending. (when window-system (let (pos dir mismatch face (oldpos (point))) (cond ((eq (char-syntax (preceding-char)) ?\)) (setq dir -1)) ((eq (char-syntax (following-char)) ?\() (setq dir 1))) ;; ;; 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))) ;; If found a "matching" paren, see if it is the right ;; kind of paren to match the one we started at. (when (integerp pos) (let ((beg (min pos oldpos)) (end (max pos oldpos))) (when (/= (char-syntax (char-after beg)) ?\$) (setq mismatch (not (eq (char-before end) ;; This can give nil. (matching-paren (char-after beg))))))))))) ;; ;; Highlight the other end of the sexp, or unhighlight if none. (if (not pos) (progn ;; If not at a paren that has a match, ;; turn off any previous paren highlighting. (and show-paren-overlay (overlay-buffer show-paren-overlay) (delete-overlay show-paren-overlay)) (and show-paren-overlay-1 (overlay-buffer show-paren-overlay-1) (delete-overlay show-paren-overlay-1))) ;; ;; Use the correct face. (if mismatch (setq face 'show-paren-mismatch-face) (setq face 'show-paren-match-face)) ;; ;; If matching backwards, highlight the closeparen ;; before point as well as its matching open. ;; If matching forward, and the openparen is unbalanced, ;; highlight the paren at point to indicate misbalance. ;; Otherwise, turn off any such highlighting. (if (and (= dir 1) (integerp pos)) (when (and show-paren-overlay-1 (overlay-buffer show-paren-overlay-1)) (delete-overlay show-paren-overlay-1)) (let ((from (if (= dir 1) (point) (forward-point -1))) (to (if (= dir 1) (forward-point 1) (point)))) (if show-paren-overlay-1 (move-overlay show-paren-overlay-1 from to (current-buffer)) (setq show-paren-overlay-1 (make-overlay from to))) ;; Always set the overlay face, since it varies. (overlay-put show-paren-overlay-1 'face face))) ;; ;; Turn on highlighting for the matching paren, if found. ;; If it's an unmatched paren, turn off any such highlighting. (unless (integerp pos) (delete-overlay show-paren-overlay)) (let ((to (if (or (eq show-paren-style 'expression) (and (eq show-paren-style 'mixed) (not (pos-visible-in-window-p pos)))) (point) pos)) (from (if (or (eq show-paren-style 'expression) (and (eq show-paren-style 'mixed) (not (pos-visible-in-window-p pos)))) pos (save-excursion (goto-char pos) (forward-point (- dir)))))) (if show-paren-overlay (move-overlay show-paren-overlay from to (current-buffer)) (setq show-paren-overlay (make-overlay from to)))) ;; ;; Always set the overlay face, since it varies. (overlay-put show-paren-overlay 'face face))))) (provide 'paren) (if show-paren-mode (show-paren-mode t)) ;;; paren.el ends here