various
authorJoerg Jaspert <joerg@debian.org>
Tue, 9 Apr 2013 22:00:01 +0000 (00:00 +0200)
committerJoerg Jaspert <joerg@debian.org>
Tue, 9 Apr 2013 22:00:01 +0000 (00:00 +0200)
.emacs.d/config/emacs.org
elisp/local/loaddefs.el
elisp/local/rainbow-delimiters.el [new file with mode: 0644]

index c8f9d8b..09ae0c8 100644 (file)
@@ -286,11 +286,6 @@ questions. Blergh, nope, enable it.
 (put 'narrow-to-region 'disabled nil)
 #+END_SRC
 
-The default how emacs handles cutting/pasting with the primary selection
-changed in emacs24. I am used to the old way, so get it.
-#+BEGIN_SRC emacs-lisp
-(setq x-select-enable-primary t)
-#+END_SRC
 *** Font
 #+BEGIN_SRC emacs-lisp
 (set-default-font "Inconsolata-14")
@@ -369,76 +364,19 @@ Size indication lets me know how far I am in a buffer.
 And modeline-posn is great. It will hilight the column number in the
 modeline in red as soon as you are over the defined limit.
 
-#+BEGIN_SRC emacs-lisp-off
-(line-number-mode 1)
-(column-number-mode 1)
-(size-indication-mode 1)
-(setq modelinepos-column-limit 72)
-(require 'modeline-posn)
-#+END_SRC
-
 #+BEGIN_SRC emacs-lisp
-  (set-face-foreground 'mode-line "grey30")
-  (set-face-background 'mode-line "grey30")
-  (set-face-foreground 'modeline-inactive "grey20")
-  (set-face-background 'modeline-inactive "grey30")
-  ;; use setq-default to set it for /all/ modes
-  (setq-default mode-line-format
-    (list
-      ;; the buffer name; the file name as a tool tip
-      '(:eval (propertize "%b " 'face 'font-lock-keyword-face
-          'help-echo (buffer-file-name)))
-  
-      ;; line and column
-      ;; '%02' to set to 2 chars at least; prevents flickering
-      ""
-        (propertize "(%02l" 'face 'font-lock-type-face) ","
-        (propertize "%02c)" 'face 'font-lock-type-face) 
-      " "
-  
-      ;; relative position, size of file
-      ""
-      (propertize "[%p" 'face 'font-lock-constant-face) ;; % above top
-      "/"
-      (propertize "%I]" 'face 'font-lock-constant-face) ;; size
-      " "
-  
-      ;; the current major mode for the buffer.
-      ""
-        '(:eval (propertize "[%m]" 'face 'font-lock-string-face
-                'help-echo buffer-file-coding-system))
-      " "
+  (line-number-mode 1)
+  (column-number-mode 1)
+  (size-indication-mode 1)
+  (setq modelinepos-column-limit 72)
   
-  
-      "[" ;; insert vs overwrite mode, input-method in a tooltip
-      '(:eval (propertize (if overwrite-mode "Ovr" "Ins")
-                'face 'font-lock-preprocessor-face
-                'help-echo (concat "Buffer is in "
-                             (if overwrite-mode "overwrite" "insert") " mode")))
-  
-      ;; was this buffer modified since the last save?
-      '(:eval (when (buffer-modified-p)
-                (concat ","  (propertize "Mod"
-                               'face 'font-lock-warning-face
-                               'help-echo "Buffer has been modified"))))
-  
-      ;; is this buffer read-only?
-      '(:eval (when buffer-read-only
-                (concat ","  (propertize "RO"
-                               'face 'font-lock-type-face
-                               'help-echo "Buffer is read-only"))))  
-      "] "
-  
-      ;; add the time, with the date and the emacs uptime in the tooltip
-      '(:eval (propertize (format-time-string "%H:%M")
-                'help-echo
-                (concat (format-time-string "%c; ")
-                        (emacs-uptime "Uptime:%hh"))))
-      " --"
-      ;; i don't want to see minor-modes; but if you want, uncomment this:
-       minor-mode-alist  ;; list of minor modes
-      "%-" ;; fill with '-'
-      ))
+  (require 'modeline-posn)
+  (set-face-foreground 'mode-line "grey20")
+  (set-face-background 'mode-line "grey70")
+  (set-face-foreground 'modeline-inactive "grey20")
+  (set-face-background 'modeline-inactive "grey40")
+  (set-face-foreground 'modelinepos-column-warning "grey20")
+  (set-face-background 'modelinepos-column-warning "red")
 #+END_SRC
 
 *** Default mode
@@ -567,6 +505,10 @@ When I press Enter I almost always want to go to the right indentation on the ne
   (global-set-key (kbd "RET") 'newline-and-indent)
 #+END_SRC
 
+Easier undo, and i don't need suspend-frame
+#+BEGIN_SRC emacs-lisp
+(global-set-key (kbd "C-z") 'undo)
+#+END_SRC
 
 **** Overwrite mode
 Usually you can press the *Ins*ert key, to get into overwrite mode. I
@@ -634,7 +576,7 @@ hilighting them makes it obvious where they are.
 (setq show-paren-style 'parenthesis)
 (show-paren-mode +1)
 #+END_SRC
-*** Kill  other bufers
+*** Kill  other buffers
 While many editors allow you to close "all the other files, not the one
 you are in", emacs doesn't have this... Except, now it will.
 #+BEGIN_SRC emacs-lisp
@@ -652,6 +594,34 @@ Doesn't mess with special buffers."
 (global-set-key (kbd "C-c k") 'kill-other-buffers)
 
 #+END_SRC
+*** Scrolling
+Default scrolling behaviour in emacs is a bit annoying, who wants to
+jump half-windows?
+#+BEGIN_SRC emacs-lisp
+(setq
+  scroll-margin 0                       ;; do smooth scrolling, ...
+  scroll-conservatively 100000          ;; ... the defaults ...
+  scroll-up-aggressively 0.0            ;; ... are very ...
+  scroll-down-aggressively 0.0          ;; ... annoying
+  scroll-preserve-screen-position t)   ;; preserve screen pos with C-v/M-v 
+#+END_SRC
+
+*** Copy/Paste with X
+[2013-04-09 Di 23:31]
+#+BEGIN_SRC emacs-lisp
+The default how emacs handles cutting/pasting with the primary selection
+changed in emacs24. I am used to the old way, so get it.
+#+BEGIN_SRC emacs-lisp
+(setq x-select-enable-primary t)
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp
+(setq x-select-enable-clipboard t        ;; copy-paste should work ...
+  interprogram-paste-function            ;; ...with...
+  'x-cut-buffer-or-selection-value)      ;; ...other X clients
+
+#+END_SRC
+
 ** Miscellaneous stuff
 #+BEGIN_SRC emacs-lisp
 (setq backup-by-copying t)
@@ -795,10 +765,15 @@ configuration.
 Transparent Remote (file) Access, Multiple Protocol, remote file editing.
 #+BEGIN_SRC emacs-lisp
 (require 'tramp)
-(setq tramp-default-method "sshx")
+(setq 
+  tramp-default-method        "ssh"
+  tramp-persistency-file-name "~/.emacs.d/cache/tramp")
+(setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
 (add-to-list 'tramp-default-method-alist
                         '("\\`localhost\\'" "\\`root\\'" "su")
                         )
+  
+
 #+END_SRC
 
 ** tiny-tools
@@ -1045,8 +1020,8 @@ Instead of default /html-mode/ I use /html-helper-mode/.
 
 ** Debian related
 #+BEGIN_SRC emacs-lisp
-(require 'dpkg-dev-el-loaddefs)
-(require 'debian-el-loaddefs)
+(require 'dpkg-dev-el-loaddefs nil 'noerror)
+(require 'debian-el-loaddefs nil 'noerror)
 
 (setq debian-changelog-full-name "Joerg Jaspert")
 (setq debian-changelog-mailing-address "joerg@debian.org")
@@ -1739,7 +1714,7 @@ much more like reading and editing of code using its major mode.
                     ("" "soul" t)
                     ("xetex" "hyperref" nil)
                     )))
-  
+
         (if (string-match "#+LATEX_CMD: xelatex" (buffer-string))
             (setq org-export-latex-classes
                   (cons '("scrartcl"
@@ -1798,15 +1773,15 @@ Emacs]].
 
 I want to access it from anywhere using =F6=.
 #+BEGIN_SRC emacs-lisp
-(autoload 'mingus "mingus-stays-home" nil t)
-(global-set-key (kbd "<f6>") 'mingus)
-(setq mingus-dired-add-keys t)
-(setq mingus-mode-always-modeline nil)
-(setq mingus-mode-line-show-elapsed-percentage nil)
-(setq mingus-mode-line-show-volume nil)
-(setq mingus-mpd-config-file "/etc/mpd.conf")
-(setq mingus-mpd-playlist-dir "/var/lib/mpd/playlists")
-(setq mingus-mpd-root "/share/music/")
+  (autoload 'mingus "mingus-stays-home" nil t)
+  (global-set-key (kbd "<f6>") 'mingus)
+  (setq mingus-dired-add-keys t)
+  (setq mingus-mode-always-modeline nil)
+  (setq mingus-mode-line-show-elapsed-percentage nil)
+  (setq mingus-mode-line-show-volume nil)
+  (setq mingus-mpd-config-file "/etc/mpd.conf")
+  (setq mingus-mpd-playlist-dir "/var/lib/mpd/playlists")
+  (setq mingus-mpd-root "/share/music/")
 #+END_SRC
 
 ** saveplace
@@ -1877,14 +1852,14 @@ what I want every emacs to know.
 ** hippie-exp
 #+BEGIN_SRC emacs-lisp
   (require 'hippie-exp)
-  (setq hippie-expand-try-functions-list '(try-expand-dabbrev 
-                                           try-expand-dabbrev-all-buffers 
-                                           try-expand-dabbrev-from-kill 
-                                           try-complete-file-name-partially 
-                                           try-complete-file-name 
+  (setq hippie-expand-try-functions-list '(try-expand-dabbrev
+                                           try-expand-dabbrev-all-buffers
+                                           try-expand-dabbrev-from-kill
+                                           try-complete-file-name-partially
+                                           try-complete-file-name
                                            try-expand-all-abbrevs try-expand-list
-                                           try-expand-line 
-                                           try-complete-lisp-symbol-partially 
+                                           try-expand-line
+                                           try-complete-lisp-symbol-partially
                                            try-complete-lisp-symbol))
   (global-set-key (kbd "M-/") 'hippie-expand)
 #+END_SRC
@@ -1903,7 +1878,6 @@ The Emacs Lisp Package Archive (may) contain(s) some things I want
 [2013-04-08 Mon 23:57]
 Use multiple cursors mode. See [[http://emacsrocks.com/e13.html][Emacs Rocks! multiple cursors]] and
 [[https://github.com/emacsmirror/multiple-cursors][emacsmirror/multiple-cursors · GitHub]]
-
 #+BEGIN_SRC emacs-lisp
   (use-package multiple-cursors
     :bind
@@ -1911,7 +1885,16 @@ Use multiple cursors mode. See [[http://emacsrocks.com/e13.html][Emacs Rocks! mu
       ("C-<" . mc/mark-previous-like-this)
       ("C-*" . mc/mark-all-like-this)))
 #+END_SRC
-
+** rainbow-delimiters
+[2013-04-09 Di 23:38] [[http://www.emacswiki.org/emacs/RainbowDelimiters][EmacsWiki: Rainbow Delimiters]] is a “rainbow
+parentheses”-like mode which highlights parens, brackets, and braces
+according to their depth. Each successive level is highlighted a
+different color. This makes it easy to spot matching delimiters, orient
+yourself in the code, and tell which statements are at the same depth.
+#+BEGIN_SRC emacs-lisp
+(when (require 'rainbow-delimiters nil 'noerror) 
+  (global-rainbow-delimiters-mode))
+#+END_SRC
 * Customized variables
 :PROPERTIES:
 :ID: 0102208d-fdf6-4928-9e40-7e341bd3aa3a
index 7996d85..cdab72e 100644 (file)
@@ -2950,6 +2950,49 @@ If LOCATION is not set, use org-google-weather-location.
 
 ;;;***
 \f
+;;;### (autoloads (global-rainbow-delimiters-mode rainbow-delimiters-mode-disable
+;;;;;;  rainbow-delimiters-mode-enable rainbow-delimiters-mode) "rainbow-delimiters"
+;;;;;;  "rainbow-delimiters.el" (20836 35883 0 0))
+;;; Generated autoloads from rainbow-delimiters.el
+
+(autoload 'rainbow-delimiters-mode "rainbow-delimiters" "\
+Highlight nested parentheses, brackets, and braces according to their depth.
+
+\(fn &optional ARG)" t nil)
+
+(autoload 'rainbow-delimiters-mode-enable "rainbow-delimiters" "\
+
+
+\(fn)" nil nil)
+
+(autoload 'rainbow-delimiters-mode-disable "rainbow-delimiters" "\
+
+
+\(fn)" nil nil)
+
+(defvar global-rainbow-delimiters-mode nil "\
+Non-nil if Global-Rainbow-Delimiters mode is enabled.
+See the command `global-rainbow-delimiters-mode' for a description of this minor mode.
+Setting this variable directly does not take effect;
+either customize it (see the info node `Easy Customization')
+or call the function `global-rainbow-delimiters-mode'.")
+
+(custom-autoload 'global-rainbow-delimiters-mode "rainbow-delimiters" nil)
+
+(autoload 'global-rainbow-delimiters-mode "rainbow-delimiters" "\
+Toggle Rainbow-Delimiters mode in all buffers.
+With prefix ARG, enable Global-Rainbow-Delimiters mode if ARG is positive;
+otherwise, disable it.  If called from Lisp, enable the mode if
+ARG is omitted or nil.
+
+Rainbow-Delimiters mode is enabled in all buffers where
+`rainbow-delimiters-mode-enable' would do it.
+See `rainbow-delimiters-mode' for more information on Rainbow-Delimiters mode.
+
+\(fn &optional ARG)" t nil)
+
+;;;***
+\f
 ;;;### (autoloads (register-list) "register-list" "register-list.el"
 ;;;;;;  (18388 31493 0 0))
 ;;; Generated autoloads from register-list.el
@@ -3095,7 +3138,7 @@ Durations are measured in hours.  If invoked non-interactively (i.e., \"emacs
 ;;;;;;  "color-theme.el" "crypt++.el" "dash.el" "ldap-mode.el" "manoj-colors.el"
 ;;;;;;  "mingus-stays-home.el" "mingus.el" "moinmoin-mode.el" "naquadah-theme.el"
 ;;;;;;  "nnir.el" "nntodo.el" "randomsig.el" "typing.el" "use-package.el")
-;;;;;;  (20835 16764 402751 500000))
+;;;;;;  (20836 36631 376648 4000))
 
 ;;;***
 \f
diff --git a/elisp/local/rainbow-delimiters.el b/elisp/local/rainbow-delimiters.el
new file mode 100644 (file)
index 0000000..8196767
--- /dev/null
@@ -0,0 +1,541 @@
+;;; rainbow-delimiters.el --- Highlight nested parens, brackets, braces a different color at each depth.
+
+;; Copyright (C) 2010-2013 Jeremy Rayman.
+;; Author: Jeremy Rayman <opensource@jeremyrayman.com>
+;; Maintainer: Jeremy Rayman <opensource@jeremyrayman.com>
+;; Created: 2010-09-02
+;; Version: 20130307.340
+;; X-Original-Version: 1.3.4
+;; Keywords: faces, convenience, lisp, matching, tools, rainbow, rainbow parentheses, rainbow parens
+;; EmacsWiki: http://www.emacswiki.org/emacs/RainbowDelimiters
+;; Github: http://github.com/jlr/rainbow-delimiters
+;; URL: http://github.com/jlr/rainbow-delimiters/raw/master/rainbow-delimiters.el
+
+;; 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 3 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:
+;;
+;; Rainbow-delimiters is a “rainbow parentheses”-like mode which highlights
+;; parentheses, brackets, and braces according to their depth. Each
+;; successive level is highlighted in a different color. This makes it easy
+;; to spot matching delimiters, orient yourself in the code, and tell which
+;; statements are at a given level.
+;;
+;; Great care has been taken to make this mode FAST. You shouldn't see
+;; any discernible change in scrolling or editing speed while using it,
+;; even in delimiter-rich languages like Clojure, Lisp, and Scheme.
+;;
+;; Default colors are subtle, with the philosophy that syntax highlighting
+;; shouldn't be visually intrusive. Color schemes are always a matter of
+;; taste.  If you take the time to design a new color scheme, please share
+;; (even a simple list of colors works) on the EmacsWiki page or via github.
+;; EmacsWiki: http://www.emacswiki.org/emacs/RainbowDelimiters
+;; Github: http://github.com/jlr/rainbow-delimiters
+
+
+;;; Installation:
+
+;; 1. Place rainbow-delimiters.el on your emacs load-path.
+;;
+;; 2. Compile the file (necessary for speed):
+;; M-x byte-compile-file <location of rainbow-delimiters.el>
+;;
+;; 3. Add the following to your dot-emacs/init file:
+;; (require 'rainbow-delimiters)
+;;
+;; 4. Activate the mode in your init file.
+;;    You can choose to enable it only in certain modes, or Emacs-wide:
+;;
+;; - To enable it only in certain modes, add lines like the following:
+;; (add-hook 'clojure-mode-hook 'rainbow-delimiters-mode)
+;;
+;; - To enable it in all programming-related emacs modes (Emacs 24+):
+;; (add-hook 'prog-mode-hook 'rainbow-delimiters-mode)
+;;
+;; - To activate the mode globally, add to your init file:
+;; (global-rainbow-delimiters-mode)
+;;
+;; - To temporarily activate rainbow-delimiters mode in an open buffer:
+;; M-x rainbow-delimiters-mode
+;;
+;; - To toggle global-rainbow-delimiters-mode:
+;; M-x global-rainbow-delimiters-mode
+
+;;; Customization:
+
+;; To customize various options, including the color scheme:
+;; M-x customize-group rainbow-delimiters
+;;
+;; deftheme / color-theme.el users:
+;; You can specify custom colors by adding the appropriate faces to your theme.
+;; - Faces take the form of:
+;;   'rainbow-delimiters-depth-#-face' with # being the depth.
+;;   Depth begins at 1, the outermost color.
+;;   Faces exist for depths 1-9.
+;; - The unmatched delimiter face (normally colored red) is:
+;;   'rainbow-delimiters-unmatched-face'
+
+
+;;; Change Log:
+
+;; 1.0 - Initial release.
+;; 1.1 - Stop tracking each delimiter's depth independently.
+;;       This had lead to confusing results when viewing clojure
+;;       code. Instead, just color based on current nesting inside
+;;       all delimiters combined.
+;;     - Added 'all-delimiters' faces to apply a color scheme to
+;;       all delimiters at once. Other faces inherit from this group.
+;; 1.1.1 - Change color scheme to a lighter, more subtle style.
+;; 1.1.2: (2011-03-25)
+;;  - Add an unmatched-delimiter face and correct problem with
+;;    coloring of text following unmatched closing delims.
+;; 1.2: (2011-03-28)
+;;  - Unify delimiter faces: all delimiter types now use the same depth
+;;    faces, of form 'rainbow-delimiters-depth-#-face'.
+;; 1.2.1: (2011-03-29)
+;;  - Conform to ELPA conventions.
+;; 1.3: (2011-05-24)
+;;  - Add separate color schemes for light and dark background modes.
+;;  - Checkboxes to enable/disable highlighting for each delimiter type.
+;;  - Improvements to Customize interface.
+;;  - Infinite depth support by cycling through defined faces repeatedly.
+;;  - Documentation changes.
+;; 1.3.1 (2011-05-25)
+;;  - Light color theme appears entirely grey on SRGB monitors. Revert to
+;;    old color theme until a nicer light background theme can be added.
+;;  - Correct typo in the installation step for users of dark backgrounds.
+;; 1.3.2 (2011-10-14)
+;;  - Add 'global-rainbow-delimiters-mode'.
+;;  - Respect syntax of current buffer major-mode so delimiters
+;;    highlight correctly in non-lisp languages.
+;; 1.3.3 (2011-11-25)
+;;  - Backwards compatibility with Emacs versions prior to 23.2.
+;;    Defines "with-silent-modifications" if undefined.
+;; 1.3.4 (2012-04-27)
+;;  - Further optimize highlighting speed. Benchmarks show 2x improvement.
+;;  - Color scheme for light backgrounds.
+;;  - Eliminate bottleneck seen in certain large files.
+;;    A large file which revealed this bottleneck now highlights ~40x faster.
+;;  - Correct broken/incorrect highlighting reported in certain languages.
+
+;;; TODO:
+
+;; - Add support for independent depth tracking of each delimiter type
+;;   for users of C-like languages.
+;; - Python style - increase depth with each new indentation.
+;; - Add support for nested tags (XML, HTML)
+;; - Set up proper example defthemes for rainbow-delimiters faces.
+;; - Intelligent support for other languages: Ruby, LaTeX tags, et al.
+
+;;; Issues:
+
+;; - Rainbow-delimiters mode does not appear to change the color of
+;;   delimiters when Org-mode is also enabled.
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+
+;; Note: some of the functions in this file have been inlined for speed.
+;; Inlining functions can cause problems with debugging. To debug these
+;; functions more easily, change defsubst -> defun.
+;; http://www.gnu.org/s/emacs/manual/html_node/elisp/Compilation-Tips.html
+
+;;; Customize interface:
+
+(defgroup rainbow-delimiters nil
+  "Highlight nested parentheses, brackets, and braces according to their depth."
+  :prefix "rainbow-delimiters-"
+  :link '(url-link :tag "Website for rainbow-delimiters (EmacsWiki)"
+                   "http://www.emacswiki.org/emacs/RainbowDelimiters")
+  :group 'applications)
+
+(defgroup rainbow-delimiters-faces nil
+  "Faces for successively nested pairs of delimiters.
+
+When depth exceeds innermost defined face, colors cycle back through."
+  :tag "Color Scheme"
+  :group 'rainbow-delimiters
+  :link '(custom-group-link "rainbow-delimiters")
+  :link '(custom-group-link :tag "Toggle Delimiters" "rainbow-delimiters-toggle-delimiter-highlighting")
+  :prefix 'rainbow-delimiters-faces-)
+
+;; Choose which delimiters you want to highlight in your preferred language:
+
+(defgroup rainbow-delimiters-toggle-delimiter-highlighting nil
+  "Choose which delimiters to highlight."
+  :tag "Toggle Delimiters"
+  :group 'rainbow-delimiters
+  :link '(custom-group-link "rainbow-delimiters")
+  :link '(custom-group-link :tag "Color Scheme" "rainbow-delimiters-faces"))
+
+(defcustom rainbow-delimiters-highlight-parens-p t
+  "Enable highlighting of nested parentheses -- ().
+
+Non-nil (default) enables highlighting of parentheses.
+Nil disables parentheses highlighting."
+  :tag "Highlight Parentheses?"
+  :type 'boolean
+  :group 'rainbow-delimiters-toggle-delimiter-highlighting)
+
+(defcustom rainbow-delimiters-highlight-brackets-p t
+  "Enable highlighting of nested brackets -- [].
+
+Non-nil (default) enables highlighting of brackets.
+Nil disables bracket highlighting."
+  :tag "Highlight Brackets?"
+  :type 'boolean
+  :group 'rainbow-delimiters-toggle-delimiter-highlighting)
+
+(defcustom rainbow-delimiters-highlight-braces-p t
+  "Enable highlighting of nested braces -- {}.
+
+Non-nil (default) enables highlighting of braces.
+Nil disables brace highlighting."
+  :tag "Highlight Braces?"
+  :type 'boolean
+  :group 'rainbow-delimiters-toggle-delimiter-highlighting)
+
+
+;;; Faces:
+
+;; Unmatched delimiter face:
+(defface rainbow-delimiters-unmatched-face
+  '((((background light)) (:foreground "#88090B"))
+    (((background dark)) (:foreground "#88090B")))
+  "Face to highlight unmatched closing delimiters in."
+  :group 'rainbow-delimiters-faces)
+
+;; Faces for highlighting delimiters by nested level:
+(defface rainbow-delimiters-depth-1-face
+  '((((background light)) (:foreground "#707183"))
+    (((background dark)) (:foreground "grey55")))
+  "Nested delimiters face, depth 1 - outermost set."
+  :tag "Rainbow Delimiters Depth 1 Face -- OUTERMOST"
+  :group 'rainbow-delimiters-faces)
+
+(defface rainbow-delimiters-depth-2-face
+  '((((background light)) (:foreground "#7388d6"))
+    (((background dark)) (:foreground "#93a8c6")))
+  "Nested delimiters face, depth 2."
+  :group 'rainbow-delimiters-faces)
+
+(defface rainbow-delimiters-depth-3-face
+  '((((background light)) (:foreground "#909183"))
+    (((background dark)) (:foreground "#b0b1a3")))
+  "Nested delimiters face, depth 3."
+  :group 'rainbow-delimiters-faces)
+
+(defface rainbow-delimiters-depth-4-face
+  '((((background light)) (:foreground "#709870"))
+    (((background dark)) (:foreground "#97b098")))
+  "Nested delimiters face, depth 4."
+  :group 'rainbow-delimiters-faces)
+
+(defface rainbow-delimiters-depth-5-face
+  '((((background light)) (:foreground "#907373"))
+    (((background dark)) (:foreground "#aebed8")))
+  "Nested delimiters face, depth 5."
+  :group 'rainbow-delimiters-faces)
+
+(defface rainbow-delimiters-depth-6-face
+  '((((background light)) (:foreground "#6276ba"))
+    (((background dark)) (:foreground "#b0b0b3")))
+  "Nested delimiters face, depth 6."
+  :group 'rainbow-delimiters-faces)
+
+(defface rainbow-delimiters-depth-7-face
+  '((((background light)) (:foreground "#858580"))
+    (((background dark)) (:foreground "#90a890")))
+  "Nested delimiters face, depth 7."
+  :group 'rainbow-delimiters-faces)
+
+(defface rainbow-delimiters-depth-8-face
+  '((((background light)) (:foreground "#80a880"))
+    (((background dark)) (:foreground "#a2b6da")))
+  "Nested delimiters face, depth 8."
+  :group 'rainbow-delimiters-faces)
+
+(defface rainbow-delimiters-depth-9-face
+  '((((background light)) (:foreground "#887070"))
+    (((background dark)) (:foreground "#9cb6ad")))
+  "Nested delimiters face, depth 9."
+  :group 'rainbow-delimiters-faces)
+
+;;; Faces 10+:
+;; NOTE: Currently unused. Additional faces for depths 9+ can be added on request.
+
+(defconst rainbow-delimiters-max-face-count 9
+  "Number of faces defined for highlighting delimiter levels.
+
+Determines depth at which to cycle through faces again.")
+
+;;; Face utility functions
+
+(defsubst rainbow-delimiters-depth-face (depth)
+  "Return face-name for DEPTH as a string 'rainbow-delimiters-depth-DEPTH-face'.
+
+For example: 'rainbow-delimiters-depth-1-face'."
+  (concat "rainbow-delimiters-depth-"
+          (number-to-string
+           (or
+            ;; Our nesting depth has a face defined for it.
+            (and (< depth rainbow-delimiters-max-face-count)
+                 depth)
+            ;; Deeper than # of defined faces; cycle back through to beginning.
+            ;; Depth 1 face is only applied to the outermost delimiter pair.
+            ;; Cycles infinitely through faces 2-9.
+            (let ((cycled-depth (mod depth rainbow-delimiters-max-face-count)))
+              (if (/= cycled-depth 0)
+                  ;; Return face # that corresponds to current nesting level.
+                  (mod depth rainbow-delimiters-max-face-count)
+                ;; Special case: depth divides evenly into max, correct face # is max.
+                rainbow-delimiters-max-face-count))))
+          "-face"))
+
+
+;;; Nesting level
+
+(defvar rainbow-delimiters-syntax-table nil
+  "Syntax table (inherited from buffer major-mode) which uses all delimiters.
+
+When rainbow-delimiters-minor-mode is first activated, it sets this variable and
+the other rainbow-delimiters specific syntax tables based on the current
+major-mode. The syntax table is constructed by the function
+'rainbow-delimiters-make-syntax-table'.")
+
+;; syntax-table: used with syntax-ppss for determining current depth.
+(defun rainbow-delimiters-make-syntax-table (syntax-table)
+  "Inherit SYNTAX-TABLE and add delimiters intended to be highlighted by mode."
+  (let ((table (copy-syntax-table syntax-table)))
+    (modify-syntax-entry ?\( "()  " table)
+    (modify-syntax-entry ?\) ")(  " table)
+    (modify-syntax-entry ?\[ "(]" table)
+    (modify-syntax-entry ?\] ")[" table)
+    (modify-syntax-entry ?\{ "(}" table)
+    (modify-syntax-entry ?\} "){" table)
+    table))
+
+(defsubst rainbow-delimiters-depth (loc)
+  "Return # of nested levels of parens, brackets, braces LOC is inside of."
+  (let ((depth
+         (with-syntax-table rainbow-delimiters-syntax-table
+           (car (syntax-ppss loc)))))
+    (if (>= depth 0)
+        depth
+      0))) ; ignore negative depths created by unmatched closing parens.
+
+
+;;; Text properties
+
+;; Backwards compatibility: Emacs < v23.2 lack macro 'with-silent-modifications'.
+(eval-and-compile
+  (unless (fboundp 'with-silent-modifications)
+    (defmacro with-silent-modifications (&rest body)
+      "Defined by rainbow-delimiters.el for backwards compatibility with Emacs < 23.2.
+ Execute BODY, pretending it does not modify the buffer.
+If BODY performs real modifications to the buffer's text, other
+than cosmetic ones, undo data may become corrupted.
+
+This macro will run BODY normally, but doesn't count its buffer
+modifications as being buffer modifications.  This affects things
+like buffer-modified-p, checking whether the file is locked by
+someone else, running buffer modification hooks, and other things
+of that nature.
+
+Typically used around modifications of text-properties which do
+not really affect the buffer's content."
+      (declare (debug t) (indent 0))
+      (let ((modified (make-symbol "modified")))
+        `(let* ((,modified (buffer-modified-p))
+                (buffer-undo-list t)
+                (inhibit-read-only t)
+                (inhibit-modification-hooks t)
+                deactivate-mark
+                ;; Avoid setting and removing file locks and checking
+                ;; buffer's uptodate-ness w.r.t the underlying file.
+                buffer-file-name
+                buffer-file-truename)
+           (unwind-protect
+               (progn
+                 ,@body)
+             (unless ,modified
+               (restore-buffer-modified-p nil))))))))
+
+(defsubst rainbow-delimiters-propertize-delimiter (loc depth)
+  "Highlight a single delimiter at LOC according to DEPTH.
+
+LOC is the location of the character to add text properties to.
+DEPTH is the nested depth at LOC, which determines the face to use.
+
+Sets text properties:
+`font-lock-face' to the appropriate delimiter face.
+`rear-nonsticky' to prevent color from bleeding into subsequent characters typed by the user."
+  (with-silent-modifications
+    (let ((delim-face (if (<= depth 0)
+                          "rainbow-delimiters-unmatched-face"
+                        (rainbow-delimiters-depth-face depth))))
+      ;; (when (eq depth -1) (message "Unmatched delimiter at char %s." loc))
+      (add-text-properties loc (1+ loc)
+                           `(font-lock-face ,delim-face
+                             rear-nonsticky t)))))
+
+
+(defsubst rainbow-delimiters-unpropertize-delimiter (loc)
+  "Remove text properties set by rainbow-delimiters mode from char at LOC."
+  (with-silent-modifications
+    (remove-text-properties loc (1+ loc)
+                            '(font-lock-face nil
+                              rear-nonsticky nil))))
+
+(make-local-variable 'rainbow-delimiters-escaped-char-predicate)
+(setq rainbow-delimiters-escaped-char-predicate nil)
+
+(defvar rainbow-delimiters-escaped-char-predicate-list
+  '((emacs-lisp-mode . rainbow-delimiters-escaped-char-predicate-emacs-lisp)
+    (inferior-emacs-lisp-mode . rainbow-delimiters-escaped-char-predicate-emacs-lisp)
+    (lisp-mode . rainbow-delimiters-escaped-char-predicate-lisp)
+    (scheme-mode . rainbow-delimiters-escaped-char-predicate-lisp)
+    (clojure-mode . rainbow-delimiters-escaped-char-predicate-lisp)
+    (inferior-scheme-mode . rainbow-delimiters-escaped-char-predicate-lisp)
+    ))
+
+(defun rainbow-delimiters-escaped-char-predicate-emacs-lisp (loc)
+  (and (eq (char-before loc) ?\\)  ; escaped char, e.g. ?\) - not counted
+       (and (not (eq (char-before (1- loc)) ?\\)) ; special-case: ignore ?\\
+            (eq (char-before (1- loc)) ?\?))))
+;; NOTE: standard char read syntax '?)' is not tested for because emacs manual
+;; states punctuation such as delimiters should _always_ use escaped '?\)' form.
+
+(defun rainbow-delimiters-escaped-char-predicate-lisp (loc)
+  (eq (char-before loc) ?\\))
+
+(defsubst rainbow-delimiters-char-ineligible-p (loc)
+  "Return t if char at LOC should be skipped, e.g. if inside a comment.
+
+Returns t if char at loc meets one of the following conditions:
+- Inside a string.
+- Inside a comment.
+- Is an escaped char, e.g. ?\)"
+  (let ((parse-state (syntax-ppss loc)))
+    (or
+     (nth 3 parse-state)                ; inside string?
+     (nth 4 parse-state)                ; inside comment?
+     (and rainbow-delimiters-escaped-char-predicate
+          (funcall rainbow-delimiters-escaped-char-predicate loc)))))
+
+
+(defsubst rainbow-delimiters-apply-color (delim depth loc)
+  "Apply color for DEPTH to DELIM at LOC following user settings.
+
+DELIM is a string specifying delimiter type.
+DEPTH is the delimiter depth, or corresponding face # if colors are repeating.
+LOC is location of character (delimiter) to be colorized."
+  (and
+   ;; Ensure user has enabled highlighting of this delimiter type.
+   (symbol-value (intern-soft
+                  (concat "rainbow-delimiters-highlight-" delim "s-p")))
+   (rainbow-delimiters-propertize-delimiter loc
+                                            depth)))
+
+
+;;; JIT-Lock functionality
+
+;; Used to skip delimiter-by-delimiter `rainbow-delimiters-propertize-region'.
+(defconst rainbow-delimiters-delim-regex "\\(\(\\|\)\\|\\[\\|\\]\\|\{\\|\}\\)"
+  "Regex matching all opening and closing delimiters the mode highlights.")
+
+;; main function called by jit-lock:
+(defsubst rainbow-delimiters-propertize-region (start end)
+  "Highlight delimiters in region between START and END.
+
+Used by jit-lock for dynamic highlighting."
+  (setq rainbow-delimiters-escaped-char-predicate
+        (cdr (assoc major-mode rainbow-delimiters-escaped-char-predicate-list)))
+  (save-excursion
+    (goto-char start)
+    ;; START can be anywhere in buffer; determine the nesting depth at START loc
+    (let ((depth (rainbow-delimiters-depth start)))
+      (while (and (< (point) end)
+                  (re-search-forward rainbow-delimiters-delim-regex end t))
+        (backward-char) ; re-search-forward places point after delim; go back.
+        (unless (rainbow-delimiters-char-ineligible-p (point))
+          (let ((delim (char-after (point))))
+            (cond ((eq ?\( delim)       ; (
+                   (setq depth (1+ depth))
+                   (rainbow-delimiters-apply-color "paren" depth (point)))
+                  ((eq ?\) delim)       ; )
+                   (rainbow-delimiters-apply-color "paren" depth (point))
+                   (setq depth (or (and (<= depth 0) 0) ; unmatched paren
+                                   (1- depth))))
+                  ((eq ?\[ delim)       ; [
+                   (setq depth (1+ depth))
+                   (rainbow-delimiters-apply-color "bracket" depth (point)))
+                  ((eq ?\] delim)       ; ]
+                   (rainbow-delimiters-apply-color "bracket" depth (point))
+                   (setq depth (or (and (<= depth 0) 0) ; unmatched bracket
+                                   (1- depth))))
+                  ((eq ?\{ delim)       ; {
+                   (setq depth (1+ depth))
+                   (rainbow-delimiters-apply-color "brace" depth (point)))
+                  ((eq ?\} delim)       ; }
+                   (rainbow-delimiters-apply-color "brace" depth (point))
+                   (setq depth (or (and (<= depth 0) 0) ; unmatched brace
+                                   (1- depth)))))))
+        ;; move past delimiter so re-search-forward doesn't pick it up again
+        (forward-char)))))
+
+(defun rainbow-delimiters-unpropertize-region (start end)
+  "Remove highlighting from delimiters between START and END."
+  (save-excursion
+    (goto-char start)
+    (while (and (< (point) end)
+                (re-search-forward rainbow-delimiters-delim-regex end t))
+      ;; re-search-forward places point 1 further than the delim matched:
+      (rainbow-delimiters-unpropertize-delimiter (1- (point))))))
+
+
+;;; Minor mode:
+
+;;;###autoload
+(define-minor-mode rainbow-delimiters-mode
+  "Highlight nested parentheses, brackets, and braces according to their depth."
+  nil "" nil ; No modeline lighter - it's already obvious when the mode is on.
+  (if (not rainbow-delimiters-mode)
+      (progn
+        (jit-lock-unregister 'rainbow-delimiters-propertize-region)
+        (rainbow-delimiters-unpropertize-region (point-min) (point-max)))
+    (jit-lock-register 'rainbow-delimiters-propertize-region t)
+    ;; Create necessary syntax tables inheriting from current major-mode.
+    (set (make-local-variable 'rainbow-delimiters-syntax-table)
+         (rainbow-delimiters-make-syntax-table (syntax-table)))))
+
+;;;###autoload
+(defun rainbow-delimiters-mode-enable ()
+  (rainbow-delimiters-mode 1))
+
+;;;###autoload
+(defun rainbow-delimiters-mode-disable ()
+  (rainbow-delimiters-mode 0))
+
+;;;###autoload
+(define-globalized-minor-mode global-rainbow-delimiters-mode
+  rainbow-delimiters-mode rainbow-delimiters-mode-enable)
+
+(provide 'rainbow-delimiters)
+
+;;; rainbow-delimiters.el ends here.