commit
77e17d2802
2 changed files with 120 additions and 0 deletions
@ -0,0 +1 @@ |
|||||||
|
*.elc |
||||||
@ -0,0 +1,119 @@ |
|||||||
|
;;; highlight-parentheses.el --- highlight surrounding parentheses |
||||||
|
;; |
||||||
|
;; Copyright (C) 2007 Nikolaj Schumacher |
||||||
|
;; |
||||||
|
;; Author: Nikolaj Schumacher <bugs * nschum de> |
||||||
|
;; Version: 0.9.1 |
||||||
|
;; Keywords: faces, matching |
||||||
|
;; URL: http://nschum.de/src/emacs/highlight-parentheses/ |
||||||
|
;; Compatibility: GNU Emacs 22.x |
||||||
|
;; |
||||||
|
;; This file is NOT part of GNU Emacs. |
||||||
|
;; |
||||||
|
;; 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, see <http://www.gnu.org/licenses/>. |
||||||
|
;; |
||||||
|
;;; Commentary: |
||||||
|
;; |
||||||
|
;; Add the following to your .emacs file: |
||||||
|
;; (require 'highlight-parentheses) |
||||||
|
;; |
||||||
|
;; Enable `highlight-symbol-mode'. |
||||||
|
;; |
||||||
|
;;; Change Log: |
||||||
|
;; |
||||||
|
;; 2007-05-15 (0.9.1) |
||||||
|
;; Support for defcustom. |
||||||
|
;; |
||||||
|
;; 2007-04-26 (0.9) |
||||||
|
;; Initial Release. |
||||||
|
;; |
||||||
|
;;; Code: |
||||||
|
|
||||||
|
(require 'cl) |
||||||
|
|
||||||
|
(defgroup highlight-parentheses nil |
||||||
|
"Highlight surrounding parentheses" |
||||||
|
:group 'faces |
||||||
|
:group 'matching) |
||||||
|
|
||||||
|
(defcustom hl-paren-colors |
||||||
|
'("firebrick1" "IndianRed4" "IndianRed") |
||||||
|
"*List of colors for the highlighted parentheses. |
||||||
|
The list starts with the the inside parentheses and moves outwards." |
||||||
|
:type '(repeat color) |
||||||
|
:group 'highlight-parentheses) |
||||||
|
|
||||||
|
(defvar hl-paren-overlays nil |
||||||
|
"This buffers currently active overlays.") |
||||||
|
(make-variable-buffer-local 'hl-paren-overlays) |
||||||
|
|
||||||
|
(defvar hl-paren-last-point 0 |
||||||
|
"The last point for which parentheses were highlighted. |
||||||
|
This is used to prevent analyzing the same context over and over.") |
||||||
|
(make-variable-buffer-local 'hl-paren-last-point) |
||||||
|
|
||||||
|
(defun hl-paren-highlight () |
||||||
|
"Highlight the parentheses around point." |
||||||
|
(unless (= (point) hl-paren-last-point) |
||||||
|
(save-excursion |
||||||
|
(let ((pos (point)) |
||||||
|
(match-pos (point)) |
||||||
|
(level -1) |
||||||
|
(max (1- (length hl-paren-overlays)))) |
||||||
|
(while (and match-pos (< level max)) |
||||||
|
(setq match-pos |
||||||
|
(when (setq pos (cadr (syntax-ppss pos))) |
||||||
|
(ignore-errors (scan-sexps pos 1)))) |
||||||
|
(when match-pos |
||||||
|
(hl-paren-put-overlay pos (incf level)) |
||||||
|
(hl-paren-put-overlay (1- match-pos) (incf level)))) |
||||||
|
(while (< level max) |
||||||
|
(hl-paren-put-overlay nil (incf level))))) |
||||||
|
(setq hl-paren-last-point (point)))) |
||||||
|
|
||||||
|
(defun hl-paren-put-overlay (pos n) |
||||||
|
"Move or create the N'th overlay so its shown at POS." |
||||||
|
(let ((ov (elt hl-paren-overlays n))) |
||||||
|
(if pos |
||||||
|
(if ov |
||||||
|
(move-overlay ov pos (1+ pos)) |
||||||
|
(setq ov (make-overlay pos (1+ pos))) |
||||||
|
(aset hl-paren-overlays n ov) |
||||||
|
(overlay-put ov 'face |
||||||
|
(cons 'foreground-color |
||||||
|
(nth (/ n 2) hl-paren-colors)))) |
||||||
|
(when ov |
||||||
|
(delete-overlay ov) |
||||||
|
(aset hl-paren-overlays n nil))))) |
||||||
|
|
||||||
|
;;;###autoload |
||||||
|
(define-minor-mode highlight-parentheses-mode |
||||||
|
"Minor mode to highlight the surrounding parentheses." |
||||||
|
nil " hl-p" nil |
||||||
|
(if highlight-parentheses-mode |
||||||
|
(progn |
||||||
|
(setq hl-paren-overlays |
||||||
|
(make-vector (* 2 (length hl-paren-colors)) nil)) |
||||||
|
(add-hook 'post-command-hook 'hl-paren-highlight nil t)) |
||||||
|
(let (ov) |
||||||
|
(dotimes (i (length hl-paren-overlays)) |
||||||
|
(when (setq ov (elt hl-paren-overlays i)) |
||||||
|
(delete-overlay ov)))) |
||||||
|
(kill-local-variable 'hl-paren-overlays) |
||||||
|
(kill-local-variable 'hl-paren-point) |
||||||
|
(remove-hook 'post-command-hook 'hl-paren-highlight t))) |
||||||
|
|
||||||
|
(provide 'highlight-parentheses) |
||||||
|
|
||||||
|
;;; highlight-parentheses.el ends here |
||||||
Loading…
Reference in new issue