;;; paren.el --- highlight matching paren.;; Copyright (C) 1993 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:;; This is the overlay used to highlight the matching paren.(defvarshow-paren-overlaynil);; This is the overlay used to highlight the closeparen;; right before point.(defvarshow-paren-overlay-1nil)(defvarshow-paren-mismatch-facenil)(defvarshow-paren-face'region"*Name of face to use for showing the matching paren.");; Find the place to show, if there is one,;; and show it until input arrives.(defunshow-paren-command-hook();; Do nothing if no window system to display results with.;; Do nothing if executing keyboard macro.;; Do nothing if input is pending.(ifwindow-system(let(posdirmismatch(oldpos(point))(faceshow-paren-face))(cond((eq(char-syntax(preceding-char))?\))(setqdir-1))((eq(char-syntax(following-char))?\()(setqdir1)))(ifdir(save-excursion(save-restriction;; Determine the range within which to look for a match.(ifblink-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.(condition-case()(setqpos(scan-sexps(point)dir))(errornil));; See if the "matching" paren is the right kind of paren;; to match the one we started at.(ifpos(let((beg(minposoldpos))(end(maxposoldpos)))(and(/=(char-syntax(char-afterbeg))?\$)(setqmismatch(not(eq(char-after(1-end));; This can give nil.(matching-paren(char-afterbeg))))))));; If they don't properly match, use a different face,;; or print a message.(ifmismatch(progn(and(nullshow-paren-mismatch-face)(x-display-color-p)(progn(add-to-list'facemenu-unlisted-faces'paren-mismatch)(make-face'paren-mismatch)(or(face-nontrivial-p'paren-mismatcht)(progn(set-face-background'paren-mismatch"purple")(set-face-foreground'paren-mismatch"white")))(setqshow-paren-mismatch-face'paren-mismatch)))(ifshow-paren-mismatch-face(setqfaceshow-paren-mismatch-face)(message"Paren mismatch")))))))(cond(pos(if(=dir-1);; If matching backwards, highlight the closeparen;; before point as well as its matching open.(progn(ifshow-paren-overlay-1(move-overlayshow-paren-overlay-1(+(point)dir)(point)(current-buffer))(setqshow-paren-overlay-1(make-overlay(-posdir)pos)));; Always set the overlay face, since it varies.(overlay-putshow-paren-overlay-1'faceface));; Otherwise, turn off any such highlighting.(andshow-paren-overlay-1(overlay-buffershow-paren-overlay-1)(delete-overlayshow-paren-overlay-1)));; Turn on highlighting for the matching paren.(ifshow-paren-overlay(move-overlayshow-paren-overlay(-posdir)pos(current-buffer))(setqshow-paren-overlay(make-overlay(-posdir)pos)));; Always set the overlay face, since it varies.(overlay-putshow-paren-overlay'faceface))(t;; If not at a paren that has a match,;; turn off any previous paren highlighting.(andshow-paren-overlay(overlay-buffershow-paren-overlay)(delete-overlayshow-paren-overlay))(andshow-paren-overlay-1(overlay-buffershow-paren-overlay-1)(delete-overlayshow-paren-overlay-1)))))))(ifwindow-system(progn(setqblink-matching-paren-on-screennil)(add-hook'post-command-idle-hook'show-paren-command-hook)));;; This is in case paren.el is preloaded.(add-hook'window-setup-hook(function(lambda()(ifwindow-system(progn(setqblink-matching-paren-on-screennil)(add-hook'post-command-idle-hook'show-paren-command-hook))))))(provide'paren);;; paren.el ends here