;; -*- mode: emacs-lisp; coding: hebrew-iso-8bit-unix -*- ;; ek-paren.el --- changhes to paren.el - add overlay priority ;; Copyright (C) 1999-2001 Ehud karni ;; This file is NOT part of GNU Emacs, distribution conditions below. ;; ;; EHUD KARNI ינרק דוהא ;; Ben Gurion st' 14 ןוירוג ןב 'חר ;; Kfar - Sava 44 257 אבס - רפכ ;; =================================== ;; 972-(0)9-7659599 ;; =================================== ;; RCS: $Id: $ ;; ;; LOG: $Log: $ ;; This program 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 of the License, or ;; (at your option) any later version. ;; ;; This program 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 this program; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (require 'paren) ;;hacked from emacs 20.6 paren.el (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 (or window-system (>= emacs-major-version 21)) (let (pos dir mismatch face (oldpos (point)) (ch-b (preceding-char)) ;; ek (ch-a (following-char)) ;; EK (qts '(?\" ?\' ?\`)) ;;different quotes ) (cond ((or (= (char-syntax ch-b) ?\)) (= ch-b ?\})) (setq dir -1)) ((or (= (char-syntax ch-a) ?\() (= ch-a ?\{)) (setq dir 1)) ;; EK hack for strings ["-" '-' `-`] ((memq ch-b qts) (setq dir -1)) ((memq ch-a qts) (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. (or (matching-paren (char-after beg)) (car-safe (memq (char-after beg) qts))) ))))))))) ;; ;; 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 (progn (if show-paren-ring-bell-on-mismatch (beep)) (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 'priority 999) (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 'priority 999) (overlay-put show-paren-overlay 'face face))))) (set-face-foreground 'show-paren-match-face "black") (set-face-background 'show-paren-match-face "cyan") (set-face-foreground 'show-paren-mismatch-face "white") (set-face-background 'show-paren-mismatch-face "purple") (show-paren-mode 1) ;; set show paren mode ON ;;end of ek-paren.el - minor fix to paren.el ===========================