uncommitted - develock-el

Ready changes

Summary

Import uploads missing from VCS:

Diff

diff --git a/.pc/.quilt_patches b/.pc/.quilt_patches
new file mode 100644
index 0000000..6857a8d
--- /dev/null
+++ b/.pc/.quilt_patches
@@ -0,0 +1 @@
+debian/patches
diff --git a/.pc/.quilt_series b/.pc/.quilt_series
new file mode 100644
index 0000000..c206706
--- /dev/null
+++ b/.pc/.quilt_series
@@ -0,0 +1 @@
+series
diff --git a/.pc/.version b/.pc/.version
new file mode 100644
index 0000000..0cfbf08
--- /dev/null
+++ b/.pc/.version
@@ -0,0 +1 @@
+2
diff --git a/.pc/0001-More-modes.patch/develock.el b/.pc/0001-More-modes.patch/develock.el
new file mode 100644
index 0000000..17f2d17
--- /dev/null
+++ b/.pc/0001-More-modes.patch/develock.el
@@ -0,0 +1,1979 @@
+;;; develock.el --- additional font-lock keywords for the developers
+
+;; Copyright (C) 2001-2003, 2005-2009, 2012, 2013, 2015
+;; Katsumi Yamaoka
+
+;; Author: Katsumi Yamaoka  <yamaoka@jpl.org>
+;;         Jun'ichi Shiono  <jun@fsas.fujitsu.com>
+;;         Yasutaka SHINDOH <ring-pub@fan.gr.jp>
+;;         Oscar Bonilla    <ob@bitmover.com>
+;; Created: 2001/06/28
+;; Revised: 2015/10/14
+;; Keywords: font-lock emacs-lisp change-log texinfo c java perl html
+;;           tcl ruby mail news
+
+;; Develock 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.
+
+;; Develock 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 Develock; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Develock is a minor mode which provides the ability to make font-
+;; lock highlight leading and trailing whitespace, long lines and
+;; oddities in the file buffer for Lisp modes, ChangeLog mode, Texinfo
+;; mode, C modes, Java mode, Jde-mode , CPerl mode, Perl mode, HTML
+;; modes, some Mail modes, Tcl mode and Ruby mode.  Here is an example
+;; of how to set up your startup file (possibly .emacs) to use
+;; Develock:
+;;
+;;(cond ((featurep 'xemacs)
+;;       (require 'develock)
+;;       ;; `turn-on-develock' is equivalent to `turn-on-font-lock',
+;;       ;;  except that it does not highlight the startup screen.
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-develock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock))
+;;      ((>= emacs-major-version 20)
+;;       (require 'develock)
+;;       (global-font-lock-mode 1)))
+;;
+;; Alternatively, you can use the following to enable font-lock for
+;; each mode individually in Emacs.
+;;
+;;(cond ((featurep 'xemacs)
+;;       (require 'develock)
+;;       ;; `turn-on-develock' is equivalent to `turn-on-font-lock',
+;;       ;;  except that it does not highlight the startup screen.
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-develock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock))
+;;      ((>= emacs-major-version 20)
+;;       (require 'develock)
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'emacs-lisp-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'change-log-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'texinfo-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'c-mode-common-hook 'turn-on-font-lock)
+;;       (add-hook 'cperl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'perl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock)
+;;       (add-hook 'java-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'html-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'html-helper-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'message-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'tcl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'ruby-mode-hook 'turn-on-font-lock)))
+;;
+;; Note that `jde-mode' activates the `font-lock-mode' by default
+;; because of the `jde-use-font-lock' variable.
+;;
+;; Develock will work with Emacs 20.4 and later and XEmacs 21.1 and
+;; later.  Needless to say, you have to install this file as follows:
+;;
+;; # cp -p develock.el /usr/local/share/emacs/site-lisp
+;; # cd /usr/local/share/emacs/site-lisp
+;; # emacs -q -no-site-file -batch -f batch-byte-compile develock.el
+;;
+;; It is recommended that you use the demand-driven fontification tool
+;; (e.g. jit-lock, lazy-shot) together with font-lock.
+;;
+;; You may find latest version of Develock in ftp.jpl.org:/pub/elisp/.
+
+;; Texinfo
+;; =======
+;; The value of `fill-column' for `texinfo-mode' has changed to 70 in
+;; Emacs 21.  However, many texinfo files are written on the condition
+;; that the value is 72.  To against it, Develock provides the
+;; `develock-fill-column-alist' variable which makes it possible to
+;; set the value for `fill-column' automatically.  If Develock is on,
+;; it is set to 72 and also the `auto-fill-mode' is enabled in the
+;; `texinfo-mode' by default.
+;;
+;; Even if you disable it in `develock-fill-column-alist', you can
+;; change the behavior of highlighting if too much highlighting
+;; offends your eyes, as shown below:
+;;
+;;(if (and (not (featurep 'xemacs))
+;;	 (>= emacs-major-version 21))
+;;    (plist-put develock-max-column-plist 'texinfo-mode 72))
+
+;; Ediff
+;; =====
+;; When you run Ediff on the Develock'ed buffers, you may feel
+;; everything is in confusion.  For such a case, the following hooks
+;; may help you see diffs clearly.
+;;
+;;(add-hook
+;; 'ediff-prepare-buffer-hook
+;; (lambda nil
+;;   (if (and (boundp 'font-lock-mode) font-lock-mode
+;;	    (boundp 'develock-mode) develock-mode)
+;;       (progn
+;;	 (develock-mode 0)
+;;	 (set (make-local-variable 'develock-mode-suspended) t)))))
+;;
+;;(add-hook
+;; 'ediff-cleanup-hook
+;; (lambda nil
+;;   (let ((buffers (list ediff-buffer-A ediff-buffer-B ediff-buffer-C)))
+;;     (save-excursion
+;;       (while buffers
+;;	 (if (buffer-live-p (car buffers))
+;;	     (progn
+;;	       (set-buffer (car buffers))
+;;	       (if (and (boundp 'develock-mode-suspended)
+;;			develock-mode-suspended)
+;;		   (progn
+;;		     (develock-mode 1)
+;;		     (makunbound 'develock-mode-suspended)))))
+;;	 (setq buffers (cdr buffers)))))))
+
+;; Wanderlust
+;; ==========
+;; Though Wanderlust does not support font-lock, you may use Develock
+;; for `wl-draft-mode'.  Try to use the following codes in .wl file.
+;;
+;;(require 'develock)
+;;(require 'message)
+;;
+;;(setq wl-highlight-body-too nil)
+;;
+;;(defadvice wl-highlight-headers (around dont-highlight-draft
+;;					(&optional for-draft) activate)
+;;  "Don't highlight draft buffers."
+;;  (or for-draft ad-do-it))
+;;
+;;(defun wl-draft-setup-develock ()
+;;  "Function used to setup to use Develock in `wl-draft-mode'."
+;;  (if (featurep 'xemacs)
+;;      (put 'wl-draft-mode 'font-lock-defaults
+;;	   '(message-font-lock-keywords t))
+;;    (make-local-variable 'font-lock-defaults)
+;;    (setq font-lock-defaults '(message-font-lock-keywords t t)))
+;;  (turn-on-font-lock))
+;;
+;;(add-hook 'wl-mail-setup-hook 'wl-draft-setup-develock)
+;;
+;;(setq develock-max-column-plist
+;;      (plist-put develock-max-column-plist 'wl-draft-mode t))
+;;
+;;(let ((elem (copy-sequence (assq 'message-mode develock-keywords-alist))))
+;;  (setcar elem 'wl-draft-mode)
+;;  (setq develock-keywords-alist
+;;	(cons elem (delq (assq 'wl-draft-mode develock-keywords-alist)
+;;			 develock-keywords-alist))))
+;;
+;; If you feel that highlighting is insufficient in gaudiness,
+;; customize the value of the variable `message-font-lock-keywords' to
+;; make font-lock do what you want it to.
+
+;; Mew
+;; ===
+;; Similarly, you can use Develock for `mew-draft-mode'.  The following
+;; codes are for .mew file.  You will never know unless you try.
+;;
+;;(require 'develock)
+;;(require 'message)
+;;
+;;(defadvice mew-highlight-header-region (around dont-highlight-draft activate)
+;;  "Don't highlight draft buffers."
+;;  (or (eq 'mew-draft-mode major-mode) ad-do-it))
+;;
+;;(defadvice mew-highlight-body-region (around dont-highlight-draft activate)
+;;  "Don't highlight draft buffers."
+;;  (or (eq 'mew-draft-mode major-mode) ad-do-it))
+;;
+;;(defun mew-draft-setup-develock ()
+;;  "Function used to setup to use Develock in `mew-draft-mode'."
+;;  (if (featurep 'xemacs)
+;;      (put 'mew-draft-mode 'font-lock-defaults
+;;	   '(message-font-lock-keywords t))
+;;    (make-local-variable 'font-lock-defaults)
+;;    (setq font-lock-defaults '(message-font-lock-keywords t t)))
+;;  (turn-on-font-lock))
+;;
+;;(add-hook 'mew-draft-mode-hook 'mew-draft-setup-develock)
+;;
+;;(setq develock-max-column-plist
+;;      (plist-put develock-max-column-plist 'mew-draft-mode t))
+;;
+;;(let ((elem (copy-sequence (assq 'message-mode develock-keywords-alist))))
+;;  (setcar elem 'mew-draft-mode)
+;;  (setq develock-keywords-alist
+;;	(cons elem (delq (assq 'mew-draft-mode develock-keywords-alist)
+;;			 develock-keywords-alist))))
+
+;;; Code:
+
+(defconst develock-version "0.47"
+  "Version number for this version of Develock.")
+
+(require 'advice)
+(require 'font-lock)
+
+(defgroup develock nil
+  "A tool for the developers."
+  :group 'development)
+
+(make-variable-buffer-local
+ (defvar develock-mode nil
+   "Internal buffer-local variable used to indicate whether Develock is on."))
+
+(defcustom develock-mode-strings '(" Develock" " Font")
+  "List of identifications used to show whether Develock is on or off.
+Each element should be a string beginning with a space, a null string
+or a symbol with a similar string as its value.  You can use faces for
+each element if you are using Emacs 21 as follows:
+
+\(make-face 'develock-mode)
+\(setq develock-mode-strings
+      (list (propertize \" Develock\"
+			'face '(develock-mode :foreground \"ForestGreen\"))
+	    (propertize \" Font\"
+			'face '(develock-mode :foreground \"DarkGoldenRod\"))))
+\(when (featurep 'develock)
+  (add-minor-mode 'font-lock-mode
+		  (cons 'develock-mode develock-mode-strings)))
+
+Otherwise if you are using XEmacs, you can use a face for all the
+minor mode strings as shown below:
+
+\(copy-face 'modeline 'modeline-mousable-minor-mode)
+\(set-face-foreground 'modeline-mousable-minor-mode \"PaleTurquoise\")
+"
+  :type '(list (sexp :format "On: %v\n" :size 0)
+	       (sexp :format "Off: %v\n" :size 0))
+  :set (lambda (symbol value)
+	 (prog1
+	     (if (fboundp 'custom-set-default)
+		 (custom-set-default symbol value)
+	       (set-default symbol value))
+	   (if (and (not noninteractive)
+		    (featurep 'develock))
+	       (let ((id (cons 'develock-mode value))
+		     mmode)
+		 (if (fboundp 'add-minor-mode)
+		     (add-minor-mode 'font-lock-mode id)
+		   (if (setq mmode (assq 'font-lock-mode minor-mode-alist))
+		       (setcdr mmode (list id))
+		     (setq minor-mode-alist (cons (list 'font-lock-mode id)
+						  minor-mode-alist))))))))
+  :group 'develock
+  :group 'font-lock)
+
+(if (fboundp 'add-minor-mode)
+    (eval-after-load "font-lock"
+      '(add-minor-mode 'font-lock-mode
+		       (cons 'develock-mode develock-mode-strings)))
+  (eval-after-load "font-lock"
+    '(setcdr (assq 'font-lock-mode minor-mode-alist)
+	     (list (cons 'develock-mode develock-mode-strings)))))
+
+(defface develock-whitespace-1
+  '((t (:background "Red")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-whitespace-2
+  '((t (:background "Orange")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-whitespace-3
+  '((t (:background "Yellow")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-long-line-1
+  '((((background dark))
+     (:foreground "Orange"))
+    (t
+     (:foreground "Red")))
+  "Develock face used to highlight long lines."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-long-line-2
+  '((t (:foreground "Red" :background "Yellow")))
+  "Develock face used to highlight long lines."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-lonely-parentheses
+  '((t (:foreground "Blue" :background "PaleTurquoise")))
+  "Develock face used to highlight lonely parentheses."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-bad-manner
+  '((((background dark))
+     (:foreground "Black" :background "Yellow"))
+    (t
+     (:foreground "Yellow" :background "Black")))
+  "Develock face used to highlight unwanted characters in messages.
+Those might violate the manners of mail messages or news articles."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-upper-case-tag
+  '((((background dark))
+     (:foreground "Black" :background "PowderBlue"))
+    (t
+     (:foreground "Snow" :background "FireBrick")))
+  "Develock face used to highlight upper case character tags."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-upper-case-attribute
+  '((((background dark))
+     (:foreground "Black" :background "Wheat"))
+    (t
+     (:foreground "Snow" :background "ForestGreen")))
+  "Develock face used to highlight upper case character tags."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-reachable-mail-address
+  '((t (:foreground "DarkGreen" :background "LemonChiffon")))
+  "Develock face used to highlight reachable E-mail addresses.
+That would be defenseless to spammers."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-attention
+  '((((background dark))
+     (:foreground "OrangeRed" :bold t))
+    (t
+     (:foreground "Red" :bold t)))
+  "Develock face used to highlight things to be paid attention."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defcustom develock-auto-enable t
+  "If non-nil, turn Develock mode on when font-lock is turned on."
+  :type '(boolean :format "%{%t%}: %[%v%]" :on "On" :off "Off")
+  :group 'develock
+  :group 'font-lock)
+
+(defun develock-refontify-buffers ()
+  "Refontify all Develocked buffers."
+  (interactive)
+  (let ((buffers (buffer-list)))
+    (save-excursion
+      (while buffers
+	(set-buffer (car buffers))
+	(if develock-mode
+	    (let ((develock-auto-enable t))
+	      (font-lock-mode 0)
+	      (font-lock-mode 1)))
+	(setq buffers (cdr buffers))))))
+
+(defun develock-custom-set-and-refontify (symbol value)
+  "Function used to refontify buffers when customizing Develock options."
+  (prog1
+      (if (fboundp 'custom-set-default)
+	  (custom-set-default symbol value)
+	(set-default symbol value))
+    (if (and (not noninteractive)
+	     (featurep 'develock))
+	(develock-refontify-buffers))))
+
+(defcustom develock-max-column-plist
+  (list 'emacs-lisp-mode 79
+	'lisp-interaction-mode 'w
+	'change-log-mode t
+	'texinfo-mode t
+	'c-mode 79
+	'c++-mode 79
+	'java-mode 79
+	'jde-mode 79
+	'html-mode 79
+	'html-helper-mode 79
+	'cperl-mode 79
+	'perl-mode 79
+	'mail-mode t
+	'message-mode t
+	'cmail-mail-mode t
+	'tcl-mode 79
+	'ruby-mode 79)
+  "Plist of `major-mode's and limitation values for long lines.
+The part of a line that is longer than the limitation value according
+to the `major-mode' is highlighted.  Value `w' means one subtracted
+from the window width.  Value t means the return value of
+`current-fill-column'.  You can inhibit to highlight long lines using
+the value nil."
+  :type '(repeat
+	  (list :indent 2 :inline t :format "%v"
+		(symbol :format "Major-Mode: %v\n" :size 0)
+		(radio :format "Value: %v"
+		       (const :format "Off  " nil)
+		       (const :format "Fill_column  " t)
+		       (const :format "Window_width -1  " w)
+		       (integer :format "Integer: %v\n" :size 0))))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-fill-column-alist
+  '((change-log-mode . 74)
+    (texinfo-mode . 72))
+  "Alist of `major-mode's and the values for `fill-column'.
+When Develock is turned on, `auto-fill-mode' is automatically enabled
+in the buffer where `major-mode' included in this list runs.
+Each value is applied to `fill-column' in the buffer overriding the
+one in the directory-local variables specified in the .dir-locals.el
+file (if any).  If `fill-column' is specified as a local variable and
+is allowed in the buffer, this variable will be made buffer-local and
+the value will be modified."
+  :type '(repeat (cons :format "%v"
+		       (symbol :tag "Major mode")
+		       (integer :tag "Fill column")))
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mode-ignore-kinsoku-list
+  '(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode jde-mode
+		    cperl-mode perl-mode tcl-mode)
+  "List of `major-mode's that ignore kinsoku at the end of lines."
+  :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-inhibit-highlighting-kinsoku-chars nil
+  "If non-nil, inhibit highlighting kinsoku chars at the end of lines.
+It has no effect if the buffer's major-mode is contained in the
+`develock-mode-ignore-kinsoku-list' variable."
+  :type '(boolean :format "%{%t%}: %[%v%]"
+		  :on "Inhibited" :off "Not inhibited")
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mode-ignore-long-message-header-list
+  '(mail-mode message-mode cmail-mail-mode)
+  "List of `major-mode's to stop highlighting long message header lines.
+If this list contains the value of the current `major-mode', there is
+apparently a message header and even if there are long header lines,
+they will not be highlighted by Develock."
+  :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ignored-buffer-name-regexp nil
+  "Regexp matching buffer names that will not be highlighted by Develock.
+If you don't want to perform Develock on the buffer which name begins
+with \"*\" or \" *\" (typically \"*scratch*\"), use the following value:
+
+\(setq develock-ignored-buffer-name-regexp \"^ ?\\\\*[^*]+\\\\*$\")
+
+If you want to inhibit highlighting those buffers also by font-lock,
+try the following advice in your startup file.
+
+\(defadvice font-lock-mode (before dont-turn-on-for-some-buffers
+				  activate)
+  \"Don't turn on font-lock for some buffers which specified by the
+`develock-ignored-buffer-name-regexp' variable.\"
+  (if (and (boundp 'develock-ignored-buffer-name-regexp)
+	   (symbol-value 'develock-ignored-buffer-name-regexp)
+	   (string-match
+	    (symbol-value 'develock-ignored-buffer-name-regexp)
+	    (buffer-name)))
+      (ad-set-arg 0 0)))"
+  :type '(radio (const :format "Omitted " nil)
+		(regexp :format "%t: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ignored-file-name-regexp
+  "\\`\\.newsrc\\(-.+\\)?\\.eld\\'"
+  "Regexp matching file names that will not be highlighted by Develock.
+If you want to inhibit highlighting those files also by font-lock,
+try the following advice in your startup file.
+
+\(defadvice font-lock-mode (before dont-turn-on-for-some-files
+				  activate)
+  \"Don't turn on font-lock for some files which specified by the
+`develock-ignored-file-name-regexp' variable.\"
+  (if (and (boundp 'develock-ignored-file-name-regexp)
+	   (symbol-value 'develock-ignored-file-name-regexp)
+	   buffer-file-name
+	   (string-match
+	    (symbol-value 'develock-ignored-file-name-regexp)
+	    (file-name-nondirectory buffer-file-name)))
+      (ad-set-arg 0 0)))"
+  :type '(radio (const :format "Omitted " nil)
+		(regexp :format "%t: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(eval-and-compile
+  (if (featurep 'xemacs)
+      (progn
+	(defalias 'develock-point-at-bol 'point-at-bol)
+	(defalias 'develock-point-at-eol 'point-at-eol))
+    (defalias 'develock-point-at-bol 'line-beginning-position)
+    (defalias 'develock-point-at-eol 'line-end-position)))
+
+(defvar lisp-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Lisp modes.")
+
+(defvar change-log-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Change Log mode.")
+
+(defvar texinfo-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the TeXinfo mode.")
+
+(defvar c-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the C modes.")
+
+(defvar java-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Java mode.")
+
+(defvar cperl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the CPerl mode.")
+
+(defvar perl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Perl mode.")
+
+(defvar mail-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Mail mode.")
+
+(defvar message-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Message mode.")
+
+(defvar cmail-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Cmail mode.")
+
+(defvar html-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the HTML mode.")
+
+(defvar tcl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Tcl mode.")
+
+(defvar ruby-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Ruby mode.")
+
+(defvar develock-keywords-alist
+  '((emacs-lisp-mode lisp-font-lock-keywords-x
+		     develock-lisp-font-lock-keywords)
+    (lisp-interaction-mode lisp-font-lock-keywords-x
+			   develock-lisp-font-lock-keywords)
+    (change-log-mode change-log-font-lock-keywords-x
+		     develock-change-log-font-lock-keywords)
+    (texinfo-mode texinfo-font-lock-keywords-x
+		  develock-texinfo-font-lock-keywords)
+    (c-mode c-font-lock-keywords-x
+	    develock-c-font-lock-keywords)
+    (c++-mode c-font-lock-keywords-x
+	      develock-c-font-lock-keywords)
+    (java-mode java-font-lock-keywords-x
+	       develock-java-font-lock-keywords)
+    (jde-mode java-font-lock-keywords-x
+	      develock-java-font-lock-keywords)
+    (html-mode html-font-lock-keywords-x
+	       develock-html-font-lock-keywords)
+    (html-helper-mode html-font-lock-keywords-x
+		      develock-html-font-lock-keywords)
+    (cperl-mode cperl-font-lock-keywords-x
+		develock-cperl-font-lock-keywords)
+    (perl-mode perl-font-lock-keywords-x
+	       develock-perl-font-lock-keywords)
+    (mail-mode mail-font-lock-keywords-x
+	       develock-mail-font-lock-keywords)
+    (message-mode message-font-lock-keywords-x
+		  develock-mail-font-lock-keywords)
+    (cmail-mail-mode cmail-font-lock-keywords-x
+		     develock-mail-font-lock-keywords)
+    (tcl-mode tcl-font-lock-keywords-x
+	      develock-tcl-font-lock-keywords)
+    (ruby-mode ruby-font-lock-keywords-x
+	       develock-ruby-font-lock-keywords))
+  "*Alist of keyword symbols for major modes.
+Each element should be triple symbols of the following form:
+
+\(major-mode internal-keywords user-defined-keywords)")
+
+(defvar develock-keywords-custom-type
+  (let* ((args
+	  '(option :format "    %v"
+		   (list :inline t :tag "Args"
+			 (radio :format "  Override: %v"
+				(const :format "%v " nil)
+				(const :format "%v " t)
+				(const :format "%v " keep)
+				(const :format "%v " prepend)
+				(const append))
+			 (boolean :tag "  LaxMatch"))))
+	 (fixed-function
+	  `(list
+	    :convert-widget
+	    (lambda (widget)
+	      `(function
+		:format "  %t: %v\n"
+		:size 0 :value (lambda (limit))
+		,@(if (not (widget-get widget :copy))
+		      ;; Emacs versions prior to 21.4.
+		      '(:match
+			(lambda (widget value) (functionp value))
+			:value-to-internal
+			(lambda (widget value)
+			  (widget-sexp-value-to-internal
+			   widget
+			   (if (and (stringp value)
+				    (string-match "\\`\".*\"\\'" value))
+			       (substring value 1 -1)
+			     value)))))))))
+	 (face-widget
+	  (lambda (prompt)
+	    `(group
+	      :convert-widget (lambda (widget)
+				(apply 'widget-convert (widget-type widget)
+				       (eval (car (widget-get widget :args)))))
+	      (list
+	       '(const :format "" quote)
+	       (append '(face :indent 6 :format)
+		       (if (condition-case nil
+			       (string-match
+				"%{sample%}"
+				(widget-get (get 'face 'widget-type) :format))
+			     (error nil))
+			   (list (concat ,prompt "(%{sample%}) %v\n") :size 0)
+			 (list (concat ,prompt "%[select face%] %v"))))))))
+	 (face1 (funcall face-widget "  %{%t%}: "))
+	 (face2 (funcall face-widget "    %{%t%}: ")))
+    `(repeat
+      (choice
+       :format "%[%t%] %v\n" :indent 0 :tag "Keyword Type"
+       (list :tag "Find Long Lines"
+	     (const :format "  Function: %v\n"
+		    :value develock-find-long-lines)
+	     (group (const :format "" 1)
+		    ,(funcall face-widget "\
+  %t used in a boundary (subexpression #1):\n    ")
+		    ,args)
+	     (group (const :format "" 2)
+		    ,(funcall face-widget "\
+  %t used out of a boundary (subexpression #2):\n    ")
+		    ,args))
+       (list :tag "Find Tabs or Long Spaces"
+	     :sample-face widget-documentation-face
+	     :format "Find Tabs or Long Spaces:
+   %{(If `indent-tabs-mode' is nil, this type highlights tabs.%}\n%v"
+	     (const :sample-face widget-documentation-face
+		    :format "\
+    %{Otherwise, it highlights spaces longer than `tab-width'.)%}
+  Function: %v\n"
+		    :value develock-find-tab-or-long-space)
+	     (group (const :format "" 1)
+		    ,(funcall face-widget "\
+  %t used for tabs before long spaces (subexpression #1):\n    ")
+		    ,args)
+	     (group (const :format "" 2)
+		    ,(funcall face-widget "\
+  %t used for long spaces (subexpression #2):\n    ")
+		    ,args))
+       (list :tag "(REGEXP NUM 'FACE...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (integer :format "  Match Subexpression Number: %v\n"
+		      :size 0)
+	     ,face1
+	     ,args)
+       (list :tag "(FUNCTION NUM 'FACE...)"
+	     ,fixed-function
+	     (integer :format "  Match Subexpression Number: %v\n"
+		      :size 0)
+	     ,face1
+	     ,args)
+       (cons :tag "(REGEXP (NUM 'FACE...) (NUM 'FACE...)...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(CASE_SENSITIVE_REGEXP (NUM 'FACE...)...)"
+	     (group
+	      (const :format "" lambda) (const :format "" (limit))
+	      (group
+	       (const :format "" let) (const :format "" (case-fold-search))
+	       (group
+		(const :format "" re-search-forward)
+		(regexp :format "  %t: %v\n" :size 0)
+		(const :format "" limit) (const :format "" t))))
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(FUNCTION (NUM 'FACE...) (NUM 'FACE...)...)"
+	     ,fixed-function
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(REGEXP (NUM (IF COND 'FACE)...)...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    (group :format "%v"
+			   (const :format "" if)
+			   (sexp :format "    Condition: %v\n" :size 0)
+			   ,face2)
+		    ,args)))
+       (sexp :size 0))))
+  "*Customizing widget for the extraordinary level font-lock keywords.")
+
+(defun develock-keywords-custom-set (symbol value)
+  "Function used to the :set keyword for `develock-*-font-lock-keywords'."
+  (prog1
+      (if (fboundp 'custom-set-default)
+	  (custom-set-default symbol value)
+	(set-default symbol value))
+    (if (and (not noninteractive)
+	     (featurep 'develock))
+	(let ((buffers (buffer-list))
+	      (alist develock-keywords-alist)
+	      modes)
+	  (while alist
+	    (if (eq symbol (nth 2 (car alist)))
+		(setq modes (cons (car (car alist)) modes)))
+	    (setq alist (cdr alist)))
+	  (save-excursion
+	    (while buffers
+	      (set-buffer (car buffers))
+	      (if (memq major-mode modes)
+		  (develock-mode 1))
+	      (setq buffers (cdr buffers))))))))
+
+(defcustom develock-lisp-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; lonely left parentheses or brackets without a comment
+    ("^[\t ]*\\(['`]?[\t ([]*[([]\\)[\t ]*$"
+     1 'develock-lonely-parentheses)
+    ;; lonely right parentheses or brackets
+    ("^[\t ]*\\([]\t )]*[])]\\)\\([\t ;]+\\|[\t ]*$\\)"
+     1 'develock-lonely-parentheses)
+    ;; whitespace after a left parenthesis
+    ("(\\([\t ]+\\)[^\n;]"
+     1 'develock-whitespace-2)
+    ;; whitespace before a right parenthesis
+    ("([^\n]\\([\t ]+\\))"
+     1 'develock-whitespace-2)
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Lisp modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defvar change-log-indent-text)
+
+(defcustom develock-change-log-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 append)
+     (2 'develock-long-line-2 append))
+    ;; an ugly entry line
+    (develock-find-ugly-change-log-entry-line
+     (1 'develock-whitespace-1 nil t)
+     (2 'develock-whitespace-1 t t)
+     (3 'develock-whitespace-1 t t)
+     (4 'develock-whitespace-1 t t)
+     (5 'develock-whitespace-1 t t)
+     (6 'develock-whitespace-1 t t)
+     (7 'develock-whitespace-1 t t)
+     (8 'develock-whitespace-2 t t)
+     (9 'develock-whitespace-1 t t)
+     (10 'develock-whitespace-1 t t)
+     (11 'develock-whitespace-1 t t)
+     (12 'develock-whitespace-1 t t)
+     (13 'develock-whitespace-2 t t)
+     (14 'develock-whitespace-1 t t)
+     (15 'develock-whitespace-1 t t)
+     (16 'develock-whitespace-1 t t))
+    ;; leading spaces
+    ("^\\( +\\)[^\t\n]"
+     (1 'develock-whitespace-3))
+    ;; leading 2 or more tabs
+    ("^\\([\t ][\t ]+\\)[^\t\n]"
+     ;; Improved by NISHIYAMA-san; cf. [Elips: 0005541].
+     (1 (if (and (eq (char-after (develock-point-at-bol)) ?\t)
+		 (not (= (- (match-end 1) (match-beginning 1) 1)
+			 change-log-indent-text)))
+	    'develock-whitespace-2)))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; tabs or 2 or more spaces in the log line
+    ("[^\t\n ]\\(\t[\t ]*\\|  +\\)[^\t ]"
+     (1 (if (and (memq (char-after (develock-point-at-bol)) '(?\t ?\ ))
+		 (not (string-equal ".  "
+				    (buffer-substring (1- (match-beginning 1))
+						      (match-end 1)))))
+	    'develock-whitespace-2)
+	prepend))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)\\([\t ]*\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 append)
+     (3 'develock-whitespace-2 append t))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; whitespace between a file name and a colon
+    ("^\t\\* [^\t\n ]+\\( (.+)\\)?\\([\t ]+\\):"
+     (2 'develock-whitespace-1 t)))
+  "Extraordinary level highlighting for the Change Log mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-texinfo-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; tabs
+    ("\t+"
+     (0 'develock-whitespace-1 append))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the TeXinfo mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-c-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the C modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-java-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Java mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-html-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; using upper case tag
+    ((lambda (limit)
+       (let (case-fold-search)
+	 (re-search-forward "</?\\([A-Z]+\\)" limit t)))
+     (1 'develock-upper-case-tag t))
+    ;; using upper case attribute
+    ((lambda (limit)
+       (let (case-fold-search)
+	 (re-search-forward "<[a-zA-Z]+[\t ]+\\([A-Z]+\\)[\t ]*=" limit t)))
+     (1 'develock-upper-case-attribute t)))
+  "Extraordinary level highlighting for the HTML mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-cperl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the CPerl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-perl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Perl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mail-font-lock-keywords
+  `(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ,(if (featurep 'mule)
+	 ;; Japanese hankaku katakana
+	 '("\\ck+" (0 'develock-bad-manner t))))
+  "Extraordinary level highlighting for the Mail modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-tcl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Tcl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ruby-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Ruby mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defmacro develock-find-font-lock-defaults (modesym)
+  "Get the font-lock defaults based on the major mode."
+  (if (featurep 'xemacs)
+      `(let ((defaults (or font-lock-defaults
+			   (font-lock-find-font-lock-defaults ,modesym))))
+	 (if (not (consp (car defaults)))
+	     (setcar defaults (list (car defaults))))
+	 defaults)
+    `(let ((defaults
+	     (or font-lock-defaults
+		 (cdr (assq ,modesym
+			    (symbol-value 'font-lock-defaults-alist))))))
+       (cons (if (consp (car defaults))
+		 (copy-sequence (car defaults))
+	       (list (car defaults)))
+	     (copy-sequence (cdr defaults))))))
+
+(defmacro develock-set-defaults (defaults form)
+  "Set fontification defaults appropriately for the current `major-mode'."
+  (if (featurep 'xemacs)
+      `(progn
+	 (setq font-lock-defaults-computed nil
+	       font-lock-keywords nil)
+	 ,form)
+    `(progn
+       (set (make-local-variable 'font-lock-defaults) ,defaults)
+       (setq font-lock-set-defaults nil)
+       ,form)))
+
+(defvar develock-inhibit-advice-font-lock-set-defaults nil
+  "Non-nil means inhibit advising of the `font-lock-set-defaults' function.
+In XEmacs, it is the `font-lock-set-defaults-1' function instead.
+It will be set to t when the function is called recursively by itself.
+Users should never modify the value.")
+
+(defvar develock-original-fill-configuration nil
+  "Internal variable used to save `fill-column' and `auto-fill-mode'.
+It becomes buffer-local in the buffer in which Develock is on, and
+keeps the values as a cons cell before Develock is turned on.")
+
+(if (boundp 'file-local-variables-alist)
+    ;; Emacs >=23
+    (progn
+      (defadvice hack-dir-local-variables (after
+					   hack-file-local-variables-alist
+					   activate)
+	"Advised by Develock.
+Remove `fill-column' element from `file-local-variables-alist' if
+`develock-fill-column-alist' specifies it.  Also remove dir-local
+`indent-tabs-mode' element for the Lisp modes since there should be
+no rational reason to force it."
+	(if develock-mode
+	    (progn
+	      (if (cdr (assq major-mode develock-fill-column-alist))
+		  (setq file-local-variables-alist
+			(delq (assq 'fill-column file-local-variables-alist)
+			      file-local-variables-alist)))
+	      (if (memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
+		  (setq file-local-variables-alist
+			(delq (assq 'indent-tabs-mode
+				    file-local-variables-alist)
+			      file-local-variables-alist))))))
+      (defadvice hack-local-variables (after hack-file-local-variables-alist
+					     activate)
+	"Advised by Develock.
+Merge `fill-column' local variable into `develock-fill-column-alist'."
+	(let (old new)
+	  (and develock-mode
+	       (setq old (assq major-mode develock-fill-column-alist))
+	       (setq new (assq 'fill-column file-local-variables-alist))
+	       (not (eq (cdr old) (cdr new)))
+	       (progn
+		 (set (make-local-variable 'develock-fill-column-alist)
+		      (copy-sequence develock-fill-column-alist))
+		 (setcar (memq (assq major-mode develock-fill-column-alist)
+			       develock-fill-column-alist)
+			 (cons major-mode (cdr new)))
+		 (setcar develock-original-fill-configuration (cdr new)))))))
+  ;; Emacs 22 or earlier
+  (defadvice hack-local-variables (around develock-allow-local-variables
+					  activate)
+    "Advised by Develock.
+Merge `fill-column' local variable into `develock-fill-column-alist'."
+    (let ((fc fill-column))
+      ad-do-it
+      (if (and (assq major-mode develock-fill-column-alist)
+	       (not (eq fc fill-column)))
+	  (progn
+	    (set (make-local-variable 'develock-fill-column-alist)
+		 (copy-sequence develock-fill-column-alist))
+	    (setcar (memq (assq major-mode develock-fill-column-alist)
+			  develock-fill-column-alist)
+		    (cons major-mode fill-column))
+	    (setcar develock-original-fill-configuration fill-column))))))
+
+(let (current-load-list)
+  (eval
+   `(defadvice ,(if (featurep 'xemacs)
+		    'font-lock-set-defaults-1
+		  'font-lock-set-defaults)
+      (around energize-font-lock-keywords activate)
+      "Advised by Develock.
+Energize font-lock keywords for extraordinary level highlighting."
+      (if develock-inhibit-advice-font-lock-set-defaults
+	  ad-do-it
+	(let ((develock-inhibit-advice-font-lock-set-defaults t)
+	      (def (cdr (assq major-mode develock-keywords-alist))))
+	  (if def
+	      (let* ((defaults (develock-find-font-lock-defaults major-mode))
+		     (keywords (delq (car def) (car defaults)))
+		     (max-decor (nth (1- (length keywords)) keywords))
+		     (oldmode develock-mode)
+		     (font-lock-maximum-decoration
+		      font-lock-maximum-decoration))
+		(setq develock-mode
+		      (and (not (and
+				 develock-ignored-buffer-name-regexp
+				 (string-match
+				  develock-ignored-buffer-name-regexp
+				  (buffer-name))))
+			   (not (and
+				 buffer-file-name
+				 develock-ignored-file-name-regexp
+				 (string-match
+				  develock-ignored-file-name-regexp
+				  (file-name-nondirectory buffer-file-name))))
+			   develock-auto-enable))
+		(if develock-mode
+		    (let (fc)
+		      (setq font-lock-maximum-decoration t)
+		      (set (car def)
+			   (append (if (fboundp max-decor)
+				       (funcall max-decor)
+				     (symbol-value max-decor))
+				   (symbol-value (car (cdr def)))))
+		      (setcdr (nthcdr (1- (length keywords)) keywords)
+			      (list (car def)))
+		      (if (and (not oldmode)
+			       (setq fc
+				     (cdr (assq major-mode
+						develock-fill-column-alist))))
+			  (progn
+			    (set (make-local-variable
+				  'develock-original-fill-configuration)
+				 (cons (current-fill-column)
+				       (and auto-fill-function t)))
+			    (setq fill-column fc)
+			    (auto-fill-mode 1)))))
+		(setcar defaults keywords)
+		(develock-set-defaults defaults ad-do-it))
+	    ad-do-it))))))
+
+(if (featurep 'xemacs)
+    ;; Highlight def* forms even if they aren't started from the
+    ;; beginning of the line.
+    (let ((def (car (car lisp-font-lock-keywords-1))))
+      (if (and (stringp def)
+	       (string-match "^\\^\\((\\\\(def\\)" def))
+	  (setcar (car lisp-font-lock-keywords-1)
+		  (replace-match "^[\t ]*\\1" nil nil def))))
+  (defadvice font-lock-add-keywords (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+  (defadvice font-lock-remove-keywords (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+
+  ;; Those functions call `font-lock-set-defaults' in Emacs 22.
+  (defadvice font-lock-fontify-buffer (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+  (defadvice font-lock-fontify-region (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it)))
+
+(defmacro develock-max-column ()
+  "Return the maximum column number from which lines won't be highlighted."
+  '(let ((value (plist-get develock-max-column-plist major-mode)))
+     (cond ((natnump value)
+	    value)
+	   ((eq 'w value)
+	    (1- (window-width)))
+	   ((eq t value)
+	    (current-fill-column)))))
+
+(eval-and-compile
+  (or (fboundp 'kinsoku-bol-p)
+      (fboundp 'kinsoku-longer)
+      (load "kinsoku" t t)))
+
+(defmacro develock-kinsoku-longer ()
+  "Try to leap over the kinsoku characters.  Return t if leaping is done."
+  (cond ((featurep 'xemacs)
+	 (if (fboundp 'kinsoku-bol-p)
+	     '(let (done)
+		(while (and (not (eolp))
+			    (kinsoku-bol-p))
+		  (setq done t)
+		  (forward-char 1))
+		done)))
+	((fboundp 'kinsoku-longer)
+	 '(if enable-kinsoku
+	      (let (done)
+		(while (and (not (eolp))
+			    (aref (char-category-set (following-char)) ?>))
+		  (setq done t)
+		  (forward-char 1))
+		done)))))
+
+(defun develock-find-long-lines (limit)
+  "Function used to find a long line between the point and LIMIT.
+If a long line is found, it returns non-nil and sets the `match-data'
+#0, #1 and #2 with the beginning and the end positions to be
+highlighted.  This function is affected by the values of
+`develock-max-column-plist',
+`develock-mode-ignore-long-message-header-list' and
+`develock-inhibit-highlighting-kinsoku-chars'."
+  (let ((max-column (develock-max-column))
+	start inhibit end)
+    (if (and
+	 max-column
+	 (progn
+	   (if (memq major-mode
+		     develock-mode-ignore-long-message-header-list)
+	       (save-restriction
+		 (widen)
+		 (setq start (point))
+		 (goto-char (point-min))
+		 (if (or (not (re-search-forward
+			       (concat "^\\("
+				       (regexp-quote mail-header-separator)
+				       "\\)?$")
+			       nil t))
+			 (> start (match-end 0)))
+		     (goto-char start))
+		 (setq start nil)))
+	   (while (and (not start)
+		       (< (point) limit))
+	     (if (or (and (not (eolp))
+			  (> (current-column) max-column))
+		     (and (or (not (eolp))
+			      (zerop (forward-line 1)))
+			  (progn
+			    (while (progn
+				     (end-of-line)
+				     (and (<= (point) limit)
+					  (<= (current-column) max-column)
+					  (zerop (forward-line 1)))))
+			    (> (move-to-column (1+ max-column)) max-column))))
+		 (progn
+		   (if (> (move-to-column max-column) max-column)
+		       (forward-char -1))
+		   (setq start (min (point) limit))
+		   (if (memq major-mode develock-mode-ignore-kinsoku-list)
+		       nil
+		     (setq inhibit
+			   (and (develock-kinsoku-longer)
+				develock-inhibit-highlighting-kinsoku-chars
+				(eolp)))
+		     (if (> (point) limit)
+			 (goto-char limit))))
+	       (forward-line 1)))
+	   start)
+	 (< start limit))
+	(if inhibit
+	    (progn
+	      (goto-char (min (develock-point-at-eol) limit))
+	      nil)
+	  (setq start (point-marker)
+		end (set-marker (make-marker)
+				(min (develock-point-at-eol) limit)))
+	  (or (memq (char-after) '(?\t ?\ ))
+	      (skip-chars-backward "0-9A-Za-z"))
+	  (if (> (current-column) max-column)
+	      (if (> (move-to-column max-column) max-column)
+		  (forward-char -1)))
+	  (let ((mk (point-marker)))
+	    (store-match-data (list mk end mk start start end)))
+	  (goto-char end)))))
+
+(defun develock-find-tab-or-long-space (limit)
+  "Find tabs or a long space between the point and LIMIT.
+If `indent-tabs-mode' is nil, this function highlights tabs.
+Otherwise, it highlights spaces longer than `tab-width'.  It returns
+non-nil and sets beginning and ending points as the `match-data' #0,
+#1 and #2."
+  (re-search-forward (if indent-tabs-mode
+			 (concat "\\(\t*\\)\\("
+				 (make-string tab-width ?\ )
+				 "+\\)")
+		       "\\(\t+\\)")
+		     limit t))
+
+(defun develock-find-ugly-change-log-entry-line (limit)
+  "Find an ugly entry line between the point and LIMIT in ChangeLog file."
+  (and (re-search-forward
+	(eval-when-compile
+	  (concat
+	   ;; 1. leading whitespace
+	   "^\\([\t ]+\\)?"
+	   ;; -- timestamp in various styles -->
+	   "\\(?:[12][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]\\(?:\\(?: \\|"
+	   ;; 2. abnormal whitespace between YYYY-MM-DD and HH:MM:SS
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[012][0-9]:[0-5][0-9]:[0-5][0-9]\\)?\
+\\|\\(?:Sun\\|Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\)\\(?: \\|"
+	   ;; 3. abnormal whitespace before month name
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)\
+\\(?:Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\)\
+\\(?: \\|"
+	   ;; 4. abnormal whitespace between month name and day number
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[ 0-3][0-9]\\(?: \\|"
+	   ;; 5. abnormal whitespace between day number and HH:MM:SS
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[012][0-9]:[0-5][0-9]:[0-5][0-9]\\(?: \\|"
+	   ;; 6. abnormal whitespace between HH:MM:SS and YYYY
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[12][0-9][0-9][0-9]\\)"
+	   ;; <-- timestamp in various styles --
+
+	   "\\(?:  \\|"
+	   ;; 7. abnormal whitespace between time stamp and author's name
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)"
+	   ;; -- author's name --
+	   "\\(?:[^\t <>]+\\(?: [^\t <>]+\\)*\\|"
+	   ;; 8. abnormal whitespace within names
+	   "\\([^\t <>]+\\(?: [^\t <>]+\\)*\\(?:\\(?:  +\\|\t[\t ]*\\)\
+[^\t <>]+\\)+\\(?: [^\t <>]+\\)*\\)"
+	   "\\)\\(?:\\(?:  \\|"
+	   ;; 9. abnormal whitespace between author's name and e-mail address
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)<\\|"
+	   ;; 10. no space between author's name and e-mail address
+	   "\\(<\\)"
+	   "\\)"
+	   ;; 11. unwanted whitespace between < and e-mail address
+	   "\\([\t ]+\\)?"
+	   "\\(?:"
+	   ;; -- e-mail address --
+	   "[^\t <>]+"
+	   ;; 12. unwanted whitespace between e-mail address and >
+	   "\\([\t ]+\\)?"
+	   ">\\|"
+	   ;; 13. whitespace in the middle of e-mail address
+	   "\\([^\t <>]+\\(?:[\t ]+[^\t <>]+\\)+\\)"
+	   ;; 14. unwanted whitespace between e-mail address and >
+	   "\\([\t ]+\\)?"
+	   ">\\)"
+	   ;; -- a supplement e.g., (tiny change) --
+	   "\\(?:\\(?:  \\|"
+	   ;; 15. abnormal whitespace between e-mail address and supplement
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)\(\\|"
+	   ;; 16. trailing garbage
+	   "\\([^\n ].*\\)"
+	   "\\)?"))
+	limit t)
+       (prog2
+	   (goto-char (match-beginning 0))
+	   (or (not (zerop (forward-line -1)))
+	       (save-match-data (looking-at "[\t ]*$")))
+	 (goto-char (match-end 0)))))
+
+(eval-when-compile
+  (defvar file-local-variables-alist)
+  (defvar lisp-interaction-mode-hook)
+  (if (not (fboundp 'hack-dir-local-variables))
+      (defalias 'hack-dir-local-variables 'ignore)))
+
+(eval-when-compile
+  (defmacro develock-called-interactively-p (kind)
+    (if (fboundp 'called-interactively-p)
+	`(called-interactively-p ,kind)
+      '(interactive-p))))
+
+;;;###autoload
+(defun develock-mode (arg)
+  "Toggle Develock mode.
+With ARG, turn Develock on if and only if ARG is positive.
+In Develock mode, highlighting leading and trailing whitespace,
+long lines and oddities."
+  (interactive "P")
+  (if (assq major-mode develock-keywords-alist)
+      (progn
+	(cond ((and (not develock-mode)
+		    develock-ignored-buffer-name-regexp
+		    (string-match develock-ignored-buffer-name-regexp
+				  (buffer-name)))
+	       (if (develock-called-interactively-p 'any)
+		   (message "Develock is inhibited for this buffer")))
+	      ((and (not develock-mode)
+		    buffer-file-name
+		    develock-ignored-file-name-regexp
+		    (string-match develock-ignored-file-name-regexp
+				  (file-name-nondirectory buffer-file-name)))
+	       (if (develock-called-interactively-p 'any)
+		   (message "Develock is inhibited for this file")))
+	      (t
+	       (let ((oldmode develock-mode)
+		     fc)
+		 (setq develock-mode (if (numberp arg)
+					 (> arg 0)
+				       (if font-lock-mode
+					   (not develock-mode)
+					 t)))
+		 (if develock-mode
+		     (if (and (not oldmode)
+			      (setq fc (cdr (assq
+					     major-mode
+					     develock-fill-column-alist))))
+			 (progn
+			   (set (make-local-variable
+				 'develock-original-fill-configuration)
+				(cons (current-fill-column)
+				      (and auto-fill-function t)))
+			   (setq fill-column fc)
+			   (auto-fill-mode 1)))
+		   (if (and oldmode
+			    (local-variable-p
+			     'develock-original-fill-configuration
+			     (current-buffer))
+			    (car develock-original-fill-configuration))
+		       (progn
+			 (setq fill-column
+			       (car develock-original-fill-configuration))
+			 (auto-fill-mode
+			  (if (cdr develock-original-fill-configuration)
+			      1
+			    0))))))
+	       (if font-lock-mode
+		   (progn
+		     (font-lock-mode 0)
+		     (let ((develock-auto-enable develock-mode))
+		       (font-lock-mode 1)))
+		 (if develock-mode
+		     (let ((develock-auto-enable t))
+		       (font-lock-mode 1))))))
+	(condition-case nil
+	    (progn
+	      (hack-dir-local-variables)
+	      (if develock-mode
+		  (setq indent-tabs-mode (default-value 'indent-tabs-mode))
+		(if (assq 'indent-tabs-mode file-local-variables-alist)
+		    (setq indent-tabs-mode
+			  (cdr (assq 'indent-tabs-mode
+				     file-local-variables-alist))))))
+	  (error)))
+    (error "Develock does not support `%s'" major-mode)))
+
+;;;###autoload
+(defun turn-on-develock ()
+  "Turn on font-lock after splashing the startup screen under XEmacs.
+This function is used for `lisp-interaction-mode-hook' exclusively."
+  (if (and (boundp 'inhibit-warning-display)
+	   (symbol-value 'inhibit-warning-display))
+      (add-hook 'pre-command-hook 'turn-on-develock)
+    (let ((hooks (cond ((consp lisp-interaction-mode-hook)
+			(memq 'turn-on-develock lisp-interaction-mode-hook))
+		       ((eq 'turn-on-develock lisp-interaction-mode-hook)
+			(setq lisp-interaction-mode-hook
+			      '(turn-on-develock))))))
+      (if hooks
+	  (setcar hooks 'turn-on-font-lock)))
+    (if (and (consp pre-command-hook)
+	     (memq 'turn-on-develock pre-command-hook))
+	(save-excursion
+	  (remove-hook 'pre-command-hook 'turn-on-develock)
+	  (let ((buffers (buffer-list)))
+	    (while buffers
+	      (set-buffer (car buffers))
+	      (if (eq 'lisp-interaction-mode major-mode)
+		  (font-lock-set-defaults))
+	      (setq buffers (cdr buffers)))))
+      (font-lock-set-defaults))))
+
+
+;; The following functions are useful to make source codes clean.
+
+(defvar develock-advice-plist nil
+  "Internal variable used to keep advice definitions.")
+
+(defcustom develock-energize-functions-plist
+  '(indent-region t lisp-indent-line t c-indent-line t newline-and-indent nil)
+  "Plist of commands and flags; command is advised when flag is non-nil.
+When command is advised, it removes useless whitespace."
+  :type
+  '(list
+    :convert-widget
+    (lambda (widget)
+      "This function generates the following type of a widget:
+\(list (group :inline t
+	     (const :format \"-SPACES-%v: \" FUNCTION)
+	     (boolean :format \"%[%v%]\\n\" :on \"t\" :off \"nil\"))
+      [...])"
+      (let ((value (default-value 'develock-energize-functions-plist))
+	    (maxlen 0)
+	    fn rest)
+	(while value
+	  (setq fn (car value)
+		value (nthcdr 2 value)
+		rest (nconc rest (list fn))
+		maxlen (max (length (symbol-name fn)) maxlen)))
+	(setq value rest
+	      rest nil)
+	(while value
+	  (setq fn (car value)
+		value (cdr value)
+		rest (nconc
+		      rest
+		      `((group
+			 :inline t
+			 (const :format
+				,(concat (make-string
+					  (- maxlen (length (symbol-name fn)))
+					  ?\ )
+					 "%v: ")
+				,fn)
+			 (boolean :format "%[%v%]\n" :on "t" :off "nil"))))))
+	`(list :args ,rest))))
+  :set (lambda (symbol value)
+	 (prog1
+	     (if (fboundp 'custom-set-default)
+		 (custom-set-default symbol value)
+	       (set-default symbol value))
+	   (if (and (not noninteractive)
+		    (featurep 'develock))
+	       (let (fn flag)
+		 (while value
+		   (setq fn (car value)
+			 flag (car (cdr value))
+			 value (cdr (cdr value)))
+		   (condition-case nil
+		       (if flag
+			   (ad-add-advice fn
+					  (plist-get develock-advice-plist fn)
+					  'around 'first)
+			 (ad-remove-advice fn 'around
+					   'remove-useless-whitespace))
+		     (error)))))))
+  :group 'develock)
+
+(eval-and-compile
+  (or (fboundp 'develock-Orig-lisp-indent-line)
+      (defalias 'develock-Orig-lisp-indent-line
+	;; The genuine function definition of `lisp-indent-line'.
+	(or (ad-real-orig-definition 'lisp-indent-line)
+	    (symbol-function 'lisp-indent-line)))))
+
+(defun develock-lisp-indent-line (&optional whole-exp)
+  "Internal function used to advise some Lisp indent functions."
+  (save-restriction
+    (widen)
+    (let ((st (set-marker (make-marker) (point)))
+	  pt mod orig)
+      (save-excursion
+	(end-of-line)
+	(setq pt (point))
+	(or (zerop (skip-chars-backward "\t "))
+	    (nth 3 (parse-partial-sexp (point-min) (point)))
+	    (delete-region (point) pt)))
+      (if (nth 3 (parse-partial-sexp (point-min) (develock-point-at-bol)))
+	  (develock-Orig-lisp-indent-line whole-exp)
+	(save-excursion
+	  (beginning-of-line)
+	  (or (setq mod (buffer-modified-p))
+	      (setq orig (progn
+			   (looking-at "[\t ]*")
+			   (match-string 0))))
+	  (insert "\n")
+	  (forward-char -1)
+	  (save-restriction
+	    (widen)
+	    (develock-Orig-lisp-indent-line whole-exp))
+	  (if (prog1
+		  (bolp)
+		(delete-char 1)
+		(setq pt (point)))
+	      (set-buffer-modified-p mod)
+	    (or (zerop (skip-chars-forward "\t "))
+		(delete-region pt (point)))
+	    (or mod
+		(progn
+		  (beginning-of-line)
+		  (if (string-equal orig (progn
+					   (looking-at "[\t ]*")
+					   (match-string 0)))
+		      (set-buffer-modified-p nil))))))
+	(goto-char st)
+	(set-marker st nil)
+	(if (bolp) (skip-chars-forward "\t "))))))
+
+(defun develock-Orig-c-indent-line (&optional syntax quiet ignore-point-pos)
+  "This function should be redefined to the genuine `c-indent-line'."
+  (let* ((fn (or (ad-real-orig-definition 'c-indent-line)
+		 (symbol-function 'c-indent-line)))
+	 ;; Checking how many arguments `c-indent-line' accepts.
+	 (nargs (length (ad-arglist fn))))
+    (cond ((= nargs 4)
+	   ;; The genuine function definition of `c-indent-line'.
+	   (defalias 'develock-Orig-c-indent-line fn))
+	  ((= nargs 3)
+	   (defalias 'develock-Orig-c-indent-line
+	     `(lambda (&optional syntax quiet ignore-point-pos) "\
+Identical to `c-indent-line', but the optional argument
+IGNORE-POINT-POS is ignored."
+		(funcall ,fn syntax quiet))))
+	  (t
+	   (defalias 'develock-Orig-c-indent-line
+	     `(lambda (&optional syntax quiet ignore-point-pos) "\
+Identical to `c-indent-line', but the optional arguments QUIET and
+IGNORE-POINT-POS are ignored."
+		(funcall ,fn syntax))))))
+  (if (and (featurep 'bytecomp)
+	   (eq (car-safe (symbol-function 'develock-Orig-c-indent-line))
+	       'lambda))
+      (byte-compile 'develock-Orig-c-indent-line))
+  (develock-Orig-c-indent-line syntax quiet ignore-point-pos))
+
+(eval-when-compile
+  (defvar c-syntactic-indentation))
+
+(eval-and-compile
+  (if (not (fboundp 'c-guess-basic-syntax))
+      (defalias 'c-guess-basic-syntax 'ignore)))
+
+(defun develock-c-indent-line (&optional syntax quiet ignore-point-pos)
+  "Internal function used to advise some C indent functions."
+  (save-restriction
+    (widen)
+    (if (and (or (not (boundp 'c-syntactic-indentation))
+		 c-syntactic-indentation)
+	     (assq 'string (c-guess-basic-syntax)))
+	;; Since this line looks like a continued string, we do nothing
+	;; in the line beginning area.
+	(progn
+	  (if (eq this-command 'c-indent-command)
+	      ;; Except, we remove trailing whitespace when the command
+	      ;; `c-indent-command' is performed.
+	      (save-excursion
+		(end-of-line)
+		(let ((pt (point)))
+		  (or (zerop (skip-chars-backward "\t "))
+		      (delete-region (point) pt)))))
+	  (develock-Orig-c-indent-line syntax quiet ignore-point-pos))
+      (let ((move (string-match "\\`[\t ]*\\'"
+				(buffer-substring (develock-point-at-bol)
+						  (point))))
+	    pt mod orig)
+	(save-excursion
+	  (end-of-line)
+	  (setq pt (point))
+	  (or (zerop (skip-chars-backward "\t "))
+	      (delete-region (point) pt))
+	  (beginning-of-line)
+	  (looking-at "[\t ]*")
+	  (or (setq mod (buffer-modified-p))
+	      (setq orig (match-string 0)))
+	  (if indent-tabs-mode
+	      (tabify (point) (match-end 0))
+	    (untabify (point) (match-end 0)))
+	  (develock-Orig-c-indent-line syntax quiet ignore-point-pos)
+	  (setq pt (point))
+	  (or mod
+	      (progn
+		(beginning-of-line)
+		(if (string-equal orig (progn
+					 (looking-at "[\t ]*")
+					 (match-string 0)))
+		    (set-buffer-modified-p nil)))))
+	(if move
+	    (goto-char pt))))))
+
+(let (current-load-list)
+  (defadvice indent-region (around remove-useless-whitespace
+				   (start end column) activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace in
+Lisp modes, C modes and Java mode.  You can turn off this advice
+permanently by customizing the `develock-energize-functions-plist'
+variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'indent-region)
+	     (memq major-mode '(emacs-lisp-mode
+				lisp-interaction-mode
+				c-mode c++-mode java-mode jde-mode)))
+	(save-excursion
+	  ;; Meddle with out of the region.
+	  (goto-char end)
+	  (while (and (zerop (forward-line 1))
+		      (looking-at "[\t ]+$")))
+	  (let ((to (point))
+		(fn (cdr (assq
+			  major-mode
+			  '((emacs-lisp-mode . develock-lisp-indent-line)
+			    (lisp-interaction-mode . develock-lisp-indent-line)
+			    (c-mode . develock-c-indent-line)
+			    (c++-mode . develock-c-indent-line)
+			    (java-mode . develock-c-indent-line)
+			    (jde-mode . develock-c-indent-line))))))
+	    (goto-char start)
+	    (while (and (zerop (forward-line -1))
+			(or (looking-at "[\t ]+$")
+			    (progn
+			      (forward-line 1)
+			      nil))))
+	    (save-restriction
+	      (if (prog1
+		      (zerop (forward-line -1))
+		    (narrow-to-region (point) to))
+		  (forward-line 1))
+	      (while (not (eobp))
+		(or (eolp)
+		    (progn
+		      (funcall fn)
+		      (if (and (not (bolp))
+			       (eolp))
+			  (delete-region (develock-point-at-bol) (point)))))
+		(forward-line 1)))))
+      ad-do-it))
+
+  (defadvice lisp-indent-line (around remove-useless-whitespace
+				      (&optional whole-exp) activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'lisp-indent-line))
+	(develock-lisp-indent-line whole-exp)
+      ad-do-it))
+
+  (defadvice c-indent-line (around remove-useless-whitespace
+				   (&optional syntax quiet ignore-point-pos)
+				   activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'c-indent-line))
+	(develock-c-indent-line syntax quiet ignore-point-pos)
+      ad-do-it))
+
+  (defadvice newline-and-indent (around remove-useless-whitespace activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace and
+indent appropriately in Lisp modes, C modes and Java mode.  You can
+turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'newline-and-indent))
+	(cond ((memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
+	       (develock-lisp-indent-line))
+	      ((memq major-mode '(c-mode c++-mode java-mode jde-mode))
+	       (develock-c-indent-line))))
+    ad-do-it))
+
+(let ((plist develock-energize-functions-plist)
+      fn flag def)
+  (while plist
+    (setq fn (car plist)
+	  flag (car (cdr plist))
+	  plist (cdr (cdr plist)))
+    (if (setq def (assq 'remove-useless-whitespace
+			(cdr (assq 'around (ad-get-advice-info fn)))))
+	(setq develock-advice-plist (plist-put develock-advice-plist fn def)))
+    (if (not flag)
+	(ad-remove-advice fn 'around 'remove-useless-whitespace))))
+
+(provide 'develock)
+
+;;; develock.el ends here
diff --git a/.pc/0002-advising-indent-region-with-correct-prototype.patch/develock.el b/.pc/0002-advising-indent-region-with-correct-prototype.patch/develock.el
new file mode 100644
index 0000000..a652598
--- /dev/null
+++ b/.pc/0002-advising-indent-region-with-correct-prototype.patch/develock.el
@@ -0,0 +1,2139 @@
+;;; develock.el --- additional font-lock keywords for the developers
+
+;; Copyright (C) 2001-2003, 2005-2009, 2012, 2013, 2015
+;; Katsumi Yamaoka
+
+;; Author: Katsumi Yamaoka  <yamaoka@jpl.org>
+;;         Jun'ichi Shiono  <jun@fsas.fujitsu.com>
+;;         Yasutaka SHINDOH <ring-pub@fan.gr.jp>
+;;         Oscar Bonilla    <ob@bitmover.com>
+;; Created: 2001/06/28
+;; Revised: 2015/10/14
+;; Keywords: font-lock emacs-lisp change-log texinfo c java perl html
+;;           tcl ruby mail news
+
+;; Develock 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.
+
+;; Develock 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 Develock; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Develock is a minor mode which provides the ability to make font-
+;; lock highlight leading and trailing whitespace, long lines and
+;; oddities in the file buffer for Lisp modes, ChangeLog mode, Texinfo
+;; mode, C modes, Ocaml modes, Coq mode, Java mode, Jde-mode , CPerl
+;; mode, Perl mode, HTML modes, some Mail modes, Tcl mode and Ruby
+;; mode.  Here is an example of how to set up your startup file
+;; (possibly .emacs) to use Develock:
+;;
+;;(cond ((featurep 'xemacs)
+;;       (require 'develock)
+;;       ;; `turn-on-develock' is equivalent to `turn-on-font-lock',
+;;       ;;  except that it does not highlight the startup screen.
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-develock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock))
+;;      ((>= emacs-major-version 20)
+;;       (require 'develock)
+;;       (global-font-lock-mode 1)))
+;;
+;; Alternatively, you can use the following to enable font-lock for
+;; each mode individually in Emacs.
+;;
+;;(cond ((featurep 'xemacs)
+;;       (require 'develock)
+;;       ;; `turn-on-develock' is equivalent to `turn-on-font-lock',
+;;       ;;  except that it does not highlight the startup screen.
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-develock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock))
+;;      ((>= emacs-major-version 20)
+;;       (require 'develock)
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'emacs-lisp-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'change-log-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'texinfo-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'c-mode-common-hook 'turn-on-font-lock)
+;;       (add-hook 'cperl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'perl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock)
+;;       (add-hook 'java-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'html-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'html-helper-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'message-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'tcl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'ruby-mode-hook 'turn-on-font-lock)))
+;;
+;; Note that `jde-mode' activates the `font-lock-mode' by default
+;; because of the `jde-use-font-lock' variable.
+;;
+;; Develock will work with Emacs 20.4 and later and XEmacs 21.1 and
+;; later.  Needless to say, you have to install this file as follows:
+;;
+;; # cp -p develock.el /usr/local/share/emacs/site-lisp
+;; # cd /usr/local/share/emacs/site-lisp
+;; # emacs -q -no-site-file -batch -f batch-byte-compile develock.el
+;;
+;; It is recommended that you use the demand-driven fontification tool
+;; (e.g. jit-lock, lazy-shot) together with font-lock.
+;;
+;; You may find latest version of Develock in ftp.jpl.org:/pub/elisp/.
+
+;; Texinfo
+;; =======
+;; The value of `fill-column' for `texinfo-mode' has changed to 70 in
+;; Emacs 21.  However, many texinfo files are written on the condition
+;; that the value is 72.  To against it, Develock provides the
+;; `develock-fill-column-alist' variable which makes it possible to
+;; set the value for `fill-column' automatically.  If Develock is on,
+;; it is set to 72 and also the `auto-fill-mode' is enabled in the
+;; `texinfo-mode' by default.
+;;
+;; Even if you disable it in `develock-fill-column-alist', you can
+;; change the behavior of highlighting if too much highlighting
+;; offends your eyes, as shown below:
+;;
+;;(if (and (not (featurep 'xemacs))
+;;	 (>= emacs-major-version 21))
+;;    (plist-put develock-max-column-plist 'texinfo-mode 72))
+
+;; Ediff
+;; =====
+;; When you run Ediff on the Develock'ed buffers, you may feel
+;; everything is in confusion.  For such a case, the following hooks
+;; may help you see diffs clearly.
+;;
+;;(add-hook
+;; 'ediff-prepare-buffer-hook
+;; (lambda nil
+;;   (if (and (boundp 'font-lock-mode) font-lock-mode
+;;	    (boundp 'develock-mode) develock-mode)
+;;       (progn
+;;	 (develock-mode 0)
+;;	 (set (make-local-variable 'develock-mode-suspended) t)))))
+;;
+;;(add-hook
+;; 'ediff-cleanup-hook
+;; (lambda nil
+;;   (let ((buffers (list ediff-buffer-A ediff-buffer-B ediff-buffer-C)))
+;;     (save-excursion
+;;       (while buffers
+;;	 (if (buffer-live-p (car buffers))
+;;	     (progn
+;;	       (set-buffer (car buffers))
+;;	       (if (and (boundp 'develock-mode-suspended)
+;;			develock-mode-suspended)
+;;		   (progn
+;;		     (develock-mode 1)
+;;		     (makunbound 'develock-mode-suspended)))))
+;;	 (setq buffers (cdr buffers)))))))
+
+;; Wanderlust
+;; ==========
+;; Though Wanderlust does not support font-lock, you may use Develock
+;; for `wl-draft-mode'.  Try to use the following codes in .wl file.
+;;
+;;(require 'develock)
+;;(require 'message)
+;;
+;;(setq wl-highlight-body-too nil)
+;;
+;;(defadvice wl-highlight-headers (around dont-highlight-draft
+;;					(&optional for-draft) activate)
+;;  "Don't highlight draft buffers."
+;;  (or for-draft ad-do-it))
+;;
+;;(defun wl-draft-setup-develock ()
+;;  "Function used to setup to use Develock in `wl-draft-mode'."
+;;  (if (featurep 'xemacs)
+;;      (put 'wl-draft-mode 'font-lock-defaults
+;;	   '(message-font-lock-keywords t))
+;;    (make-local-variable 'font-lock-defaults)
+;;    (setq font-lock-defaults '(message-font-lock-keywords t t)))
+;;  (turn-on-font-lock))
+;;
+;;(add-hook 'wl-mail-setup-hook 'wl-draft-setup-develock)
+;;
+;;(setq develock-max-column-plist
+;;      (plist-put develock-max-column-plist 'wl-draft-mode t))
+;;
+;;(let ((elem (copy-sequence (assq 'message-mode develock-keywords-alist))))
+;;  (setcar elem 'wl-draft-mode)
+;;  (setq develock-keywords-alist
+;;	(cons elem (delq (assq 'wl-draft-mode develock-keywords-alist)
+;;			 develock-keywords-alist))))
+;;
+;; If you feel that highlighting is insufficient in gaudiness,
+;; customize the value of the variable `message-font-lock-keywords' to
+;; make font-lock do what you want it to.
+
+;; Mew
+;; ===
+;; Similarly, you can use Develock for `mew-draft-mode'.  The following
+;; codes are for .mew file.  You will never know unless you try.
+;;
+;;(require 'develock)
+;;(require 'message)
+;;
+;;(defadvice mew-highlight-header-region (around dont-highlight-draft activate)
+;;  "Don't highlight draft buffers."
+;;  (or (eq 'mew-draft-mode major-mode) ad-do-it))
+;;
+;;(defadvice mew-highlight-body-region (around dont-highlight-draft activate)
+;;  "Don't highlight draft buffers."
+;;  (or (eq 'mew-draft-mode major-mode) ad-do-it))
+;;
+;;(defun mew-draft-setup-develock ()
+;;  "Function used to setup to use Develock in `mew-draft-mode'."
+;;  (if (featurep 'xemacs)
+;;      (put 'mew-draft-mode 'font-lock-defaults
+;;	   '(message-font-lock-keywords t))
+;;    (make-local-variable 'font-lock-defaults)
+;;    (setq font-lock-defaults '(message-font-lock-keywords t t)))
+;;  (turn-on-font-lock))
+;;
+;;(add-hook 'mew-draft-mode-hook 'mew-draft-setup-develock)
+;;
+;;(setq develock-max-column-plist
+;;      (plist-put develock-max-column-plist 'mew-draft-mode t))
+;;
+;;(let ((elem (copy-sequence (assq 'message-mode develock-keywords-alist))))
+;;  (setcar elem 'mew-draft-mode)
+;;  (setq develock-keywords-alist
+;;	(cons elem (delq (assq 'mew-draft-mode develock-keywords-alist)
+;;			 develock-keywords-alist))))
+
+;;; Code:
+
+(defconst develock-version "0.47"
+  "Version number for this version of Develock.")
+
+(require 'advice)
+(require 'font-lock)
+
+(defgroup develock nil
+  "A tool for the developers."
+  :group 'development)
+
+(make-variable-buffer-local
+ (defvar develock-mode nil
+   "Internal buffer-local variable used to indicate whether Develock is on."))
+
+(defcustom develock-mode-strings '(" Develock" " Font")
+  "List of identifications used to show whether Develock is on or off.
+Each element should be a string beginning with a space, a null string
+or a symbol with a similar string as its value.  You can use faces for
+each element if you are using Emacs 21 as follows:
+
+\(make-face 'develock-mode)
+\(setq develock-mode-strings
+      (list (propertize \" Develock\"
+			'face '(develock-mode :foreground \"ForestGreen\"))
+	    (propertize \" Font\"
+			'face '(develock-mode :foreground \"DarkGoldenRod\"))))
+\(when (featurep 'develock)
+  (add-minor-mode 'font-lock-mode
+		  (cons 'develock-mode develock-mode-strings)))
+
+Otherwise if you are using XEmacs, you can use a face for all the
+minor mode strings as shown below:
+
+\(copy-face 'modeline 'modeline-mousable-minor-mode)
+\(set-face-foreground 'modeline-mousable-minor-mode \"PaleTurquoise\")
+"
+  :type '(list (sexp :format "On: %v\n" :size 0)
+	       (sexp :format "Off: %v\n" :size 0))
+  :set (lambda (symbol value)
+	 (prog1
+	     (if (fboundp 'custom-set-default)
+		 (custom-set-default symbol value)
+	       (set-default symbol value))
+	   (if (and (not noninteractive)
+		    (featurep 'develock))
+	       (let ((id (cons 'develock-mode value))
+		     mmode)
+		 (if (fboundp 'add-minor-mode)
+		     (add-minor-mode 'font-lock-mode id)
+		   (if (setq mmode (assq 'font-lock-mode minor-mode-alist))
+		       (setcdr mmode (list id))
+		     (setq minor-mode-alist (cons (list 'font-lock-mode id)
+						  minor-mode-alist))))))))
+  :group 'develock
+  :group 'font-lock)
+
+(if (fboundp 'add-minor-mode)
+    (eval-after-load "font-lock"
+      '(add-minor-mode 'font-lock-mode
+		       (cons 'develock-mode develock-mode-strings)))
+  (eval-after-load "font-lock"
+    '(setcdr (assq 'font-lock-mode minor-mode-alist)
+	     (list (cons 'develock-mode develock-mode-strings)))))
+
+(defface develock-whitespace-1
+  '((t (:background "Red")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-whitespace-2
+  '((t (:background "Orange")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-whitespace-3
+  '((t (:background "Yellow")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-long-line-1
+  '((((background dark))
+     (:foreground "Orange"))
+    (t
+     (:foreground "Red")))
+  "Develock face used to highlight long lines."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-long-line-2
+  '((t (:foreground "Red" :background "Yellow")))
+  "Develock face used to highlight long lines."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-lonely-parentheses
+  '((t (:foreground "Blue" :background "PaleTurquoise")))
+  "Develock face used to highlight lonely parentheses."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-bad-manner
+  '((((background dark))
+     (:foreground "Black" :background "Yellow"))
+    (t
+     (:foreground "Yellow" :background "Black")))
+  "Develock face used to highlight unwanted characters in messages.
+Those might violate the manners of mail messages or news articles."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-upper-case-tag
+  '((((background dark))
+     (:foreground "Black" :background "PowderBlue"))
+    (t
+     (:foreground "Snow" :background "FireBrick")))
+  "Develock face used to highlight upper case character tags."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-upper-case-attribute
+  '((((background dark))
+     (:foreground "Black" :background "Wheat"))
+    (t
+     (:foreground "Snow" :background "ForestGreen")))
+  "Develock face used to highlight upper case character tags."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-reachable-mail-address
+  '((t (:foreground "DarkGreen" :background "LemonChiffon")))
+  "Develock face used to highlight reachable E-mail addresses.
+That would be defenseless to spammers."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-attention
+  '((((background dark))
+     (:foreground "OrangeRed" :bold t))
+    (t
+     (:foreground "Red" :bold t)))
+  "Develock face used to highlight things to be paid attention."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defcustom develock-auto-enable t
+  "If non-nil, turn Develock mode on when font-lock is turned on."
+  :type '(boolean :format "%{%t%}: %[%v%]" :on "On" :off "Off")
+  :group 'develock
+  :group 'font-lock)
+
+(defun develock-refontify-buffers ()
+  "Refontify all Develocked buffers."
+  (interactive)
+  (let ((buffers (buffer-list)))
+    (save-excursion
+      (while buffers
+	(set-buffer (car buffers))
+	(if develock-mode
+	    (let ((develock-auto-enable t))
+	      (font-lock-mode 0)
+	      (font-lock-mode 1)))
+	(setq buffers (cdr buffers))))))
+
+(defun develock-custom-set-and-refontify (symbol value)
+  "Function used to refontify buffers when customizing Develock options."
+  (prog1
+      (if (fboundp 'custom-set-default)
+	  (custom-set-default symbol value)
+	(set-default symbol value))
+    (if (and (not noninteractive)
+	     (featurep 'develock))
+	(develock-refontify-buffers))))
+
+(defcustom develock-max-column-plist
+  (list 'emacs-lisp-mode 79
+	'lisp-interaction-mode 'w
+	'change-log-mode t
+	'texinfo-mode t
+	'c-mode 79
+	'c++-mode 79
+	'java-mode 79
+	'caml-mode 79
+	'tuareg-mode 79
+	'coq-mode 79
+	'latex-mode 79
+	'jde-mode 79
+	'html-mode 79
+	'html-helper-mode 79
+	'cperl-mode 79
+	'perl-mode 79
+	'mail-mode t
+	'message-mode t
+	'cmail-mail-mode t
+	'tcl-mode 79
+	'ruby-mode 79)
+  "Plist of `major-mode's and limitation values for long lines.
+The part of a line that is longer than the limitation value according
+to the `major-mode' is highlighted.  Value `w' means one subtracted
+from the window width.  Value t means the return value of
+`current-fill-column'.  You can inhibit to highlight long lines using
+the value nil."
+  :type '(repeat
+	  (list :indent 2 :inline t :format "%v"
+		(symbol :format "Major-Mode: %v\n" :size 0)
+		(radio :format "Value: %v"
+		       (const :format "Off  " nil)
+		       (const :format "Fill_column  " t)
+		       (const :format "Window_width -1  " w)
+		       (integer :format "Integer: %v\n" :size 0))))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-fill-column-alist
+  '((change-log-mode . 74)
+    (texinfo-mode . 72))
+  "Alist of `major-mode's and the values for `fill-column'.
+When Develock is turned on, `auto-fill-mode' is automatically enabled
+in the buffer where `major-mode' included in this list runs.
+Each value is applied to `fill-column' in the buffer overriding the
+one in the directory-local variables specified in the .dir-locals.el
+file (if any).  If `fill-column' is specified as a local variable and
+is allowed in the buffer, this variable will be made buffer-local and
+the value will be modified."
+  :type '(repeat (cons :format "%v"
+		       (symbol :tag "Major mode")
+		       (integer :tag "Fill column")))
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mode-ignore-kinsoku-list
+  '(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode jde-mode
+		    cperl-mode perl-mode tcl-mode)
+  "List of `major-mode's that ignore kinsoku at the end of lines."
+  :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-inhibit-highlighting-kinsoku-chars nil
+  "If non-nil, inhibit highlighting kinsoku chars at the end of lines.
+It has no effect if the buffer's major-mode is contained in the
+`develock-mode-ignore-kinsoku-list' variable."
+  :type '(boolean :format "%{%t%}: %[%v%]"
+		  :on "Inhibited" :off "Not inhibited")
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mode-ignore-long-message-header-list
+  '(mail-mode message-mode cmail-mail-mode)
+  "List of `major-mode's to stop highlighting long message header lines.
+If this list contains the value of the current `major-mode', there is
+apparently a message header and even if there are long header lines,
+they will not be highlighted by Develock."
+  :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ignored-buffer-name-regexp nil
+  "Regexp matching buffer names that will not be highlighted by Develock.
+If you don't want to perform Develock on the buffer which name begins
+with \"*\" or \" *\" (typically \"*scratch*\"), use the following value:
+
+\(setq develock-ignored-buffer-name-regexp \"^ ?\\\\*[^*]+\\\\*$\")
+
+If you want to inhibit highlighting those buffers also by font-lock,
+try the following advice in your startup file.
+
+\(defadvice font-lock-mode (before dont-turn-on-for-some-buffers
+				  activate)
+  \"Don't turn on font-lock for some buffers which specified by the
+`develock-ignored-buffer-name-regexp' variable.\"
+  (if (and (boundp 'develock-ignored-buffer-name-regexp)
+	   (symbol-value 'develock-ignored-buffer-name-regexp)
+	   (string-match
+	    (symbol-value 'develock-ignored-buffer-name-regexp)
+	    (buffer-name)))
+      (ad-set-arg 0 0)))"
+  :type '(radio (const :format "Omitted " nil)
+		(regexp :format "%t: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ignored-file-name-regexp
+  "\\`\\.newsrc\\(-.+\\)?\\.eld\\'"
+  "Regexp matching file names that will not be highlighted by Develock.
+If you want to inhibit highlighting those files also by font-lock,
+try the following advice in your startup file.
+
+\(defadvice font-lock-mode (before dont-turn-on-for-some-files
+				  activate)
+  \"Don't turn on font-lock for some files which specified by the
+`develock-ignored-file-name-regexp' variable.\"
+  (if (and (boundp 'develock-ignored-file-name-regexp)
+	   (symbol-value 'develock-ignored-file-name-regexp)
+	   buffer-file-name
+	   (string-match
+	    (symbol-value 'develock-ignored-file-name-regexp)
+	    (file-name-nondirectory buffer-file-name)))
+      (ad-set-arg 0 0)))"
+  :type '(radio (const :format "Omitted " nil)
+		(regexp :format "%t: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(eval-and-compile
+  (if (featurep 'xemacs)
+      (progn
+	(defalias 'develock-point-at-bol 'point-at-bol)
+	(defalias 'develock-point-at-eol 'point-at-eol))
+    (defalias 'develock-point-at-bol 'line-beginning-position)
+    (defalias 'develock-point-at-eol 'line-end-position)))
+
+(defvar lisp-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Lisp modes.")
+
+(defvar change-log-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Change Log mode.")
+
+(defvar texinfo-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the TeXinfo mode.")
+
+(defvar c-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the C modes.")
+
+(defvar caml-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Caml mode.")
+
+(defvar tuareg-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Tuareg mode.")
+
+(defvar coq-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Coq mode.")
+
+(defvar latex-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the LaTeX mode.")
+
+(defvar java-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Java mode.")
+
+(defvar cperl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the CPerl mode.")
+
+(defvar perl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Perl mode.")
+
+(defvar mail-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Mail mode.")
+
+(defvar message-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Message mode.")
+
+(defvar cmail-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Cmail mode.")
+
+(defvar html-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the HTML mode.")
+
+(defvar tcl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Tcl mode.")
+
+(defvar ruby-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Ruby mode.")
+
+(defvar develock-keywords-alist
+  '((emacs-lisp-mode lisp-font-lock-keywords-x
+		     develock-lisp-font-lock-keywords)
+    (lisp-interaction-mode lisp-font-lock-keywords-x
+			   develock-lisp-font-lock-keywords)
+    (change-log-mode change-log-font-lock-keywords-x
+		     develock-change-log-font-lock-keywords)
+    (texinfo-mode texinfo-font-lock-keywords-x
+		  develock-texinfo-font-lock-keywords)
+    (c-mode c-font-lock-keywords-x
+	    develock-c-font-lock-keywords)
+    (c++-mode c-font-lock-keywords-x
+	      develock-c-font-lock-keywords)
+    (caml-mode caml-font-lock-keywords-x
+	      develock-caml-font-lock-keywords)
+    (tuareg-mode tuareg-font-lock-keywords-x
+	      develock-tuareg-font-lock-keywords)
+    (coq-mode coq-font-lock-keywords-x
+	      develock-coq-font-lock-keywords)
+    (latex-mode latex-font-lock-keywords-x
+	      develock-latex-font-lock-keywords)
+    (java-mode java-font-lock-keywords-x
+	       develock-java-font-lock-keywords)
+    (jde-mode java-font-lock-keywords-x
+	      develock-java-font-lock-keywords)
+    (html-mode html-font-lock-keywords-x
+	       develock-html-font-lock-keywords)
+    (html-helper-mode html-font-lock-keywords-x
+		      develock-html-font-lock-keywords)
+    (cperl-mode cperl-font-lock-keywords-x
+		develock-cperl-font-lock-keywords)
+    (perl-mode perl-font-lock-keywords-x
+	       develock-perl-font-lock-keywords)
+    (mail-mode mail-font-lock-keywords-x
+	       develock-mail-font-lock-keywords)
+    (message-mode message-font-lock-keywords-x
+		  develock-mail-font-lock-keywords)
+    (cmail-mail-mode cmail-font-lock-keywords-x
+		     develock-mail-font-lock-keywords)
+    (tcl-mode tcl-font-lock-keywords-x
+	      develock-tcl-font-lock-keywords)
+    (ruby-mode ruby-font-lock-keywords-x
+	       develock-ruby-font-lock-keywords))
+  "*Alist of keyword symbols for major modes.
+Each element should be triple symbols of the following form:
+
+\(major-mode internal-keywords user-defined-keywords)")
+
+(defvar develock-keywords-custom-type
+  (let* ((args
+	  '(option :format "    %v"
+		   (list :inline t :tag "Args"
+			 (radio :format "  Override: %v"
+				(const :format "%v " nil)
+				(const :format "%v " t)
+				(const :format "%v " keep)
+				(const :format "%v " prepend)
+				(const append))
+			 (boolean :tag "  LaxMatch"))))
+	 (fixed-function
+	  `(list
+	    :convert-widget
+	    (lambda (widget)
+	      `(function
+		:format "  %t: %v\n"
+		:size 0 :value (lambda (limit))
+		,@(if (not (widget-get widget :copy))
+		      ;; Emacs versions prior to 21.4.
+		      '(:match
+			(lambda (widget value) (functionp value))
+			:value-to-internal
+			(lambda (widget value)
+			  (widget-sexp-value-to-internal
+			   widget
+			   (if (and (stringp value)
+				    (string-match "\\`\".*\"\\'" value))
+			       (substring value 1 -1)
+			     value)))))))))
+	 (face-widget
+	  (lambda (prompt)
+	    `(group
+	      :convert-widget (lambda (widget)
+				(apply 'widget-convert (widget-type widget)
+				       (eval (car (widget-get widget :args)))))
+	      (list
+	       '(const :format "" quote)
+	       (append '(face :indent 6 :format)
+		       (if (condition-case nil
+			       (string-match
+				"%{sample%}"
+				(widget-get (get 'face 'widget-type) :format))
+			     (error nil))
+			   (list (concat ,prompt "(%{sample%}) %v\n") :size 0)
+			 (list (concat ,prompt "%[select face%] %v"))))))))
+	 (face1 (funcall face-widget "  %{%t%}: "))
+	 (face2 (funcall face-widget "    %{%t%}: ")))
+    `(repeat
+      (choice
+       :format "%[%t%] %v\n" :indent 0 :tag "Keyword Type"
+       (list :tag "Find Long Lines"
+	     (const :format "  Function: %v\n"
+		    :value develock-find-long-lines)
+	     (group (const :format "" 1)
+		    ,(funcall face-widget "\
+  %t used in a boundary (subexpression #1):\n    ")
+		    ,args)
+	     (group (const :format "" 2)
+		    ,(funcall face-widget "\
+  %t used out of a boundary (subexpression #2):\n    ")
+		    ,args))
+       (list :tag "Find Tabs or Long Spaces"
+	     :sample-face widget-documentation-face
+	     :format "Find Tabs or Long Spaces:
+   %{(If `indent-tabs-mode' is nil, this type highlights tabs.%}\n%v"
+	     (const :sample-face widget-documentation-face
+		    :format "\
+    %{Otherwise, it highlights spaces longer than `tab-width'.)%}
+  Function: %v\n"
+		    :value develock-find-tab-or-long-space)
+	     (group (const :format "" 1)
+		    ,(funcall face-widget "\
+  %t used for tabs before long spaces (subexpression #1):\n    ")
+		    ,args)
+	     (group (const :format "" 2)
+		    ,(funcall face-widget "\
+  %t used for long spaces (subexpression #2):\n    ")
+		    ,args))
+       (list :tag "(REGEXP NUM 'FACE...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (integer :format "  Match Subexpression Number: %v\n"
+		      :size 0)
+	     ,face1
+	     ,args)
+       (list :tag "(FUNCTION NUM 'FACE...)"
+	     ,fixed-function
+	     (integer :format "  Match Subexpression Number: %v\n"
+		      :size 0)
+	     ,face1
+	     ,args)
+       (cons :tag "(REGEXP (NUM 'FACE...) (NUM 'FACE...)...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(CASE_SENSITIVE_REGEXP (NUM 'FACE...)...)"
+	     (group
+	      (const :format "" lambda) (const :format "" (limit))
+	      (group
+	       (const :format "" let) (const :format "" (case-fold-search))
+	       (group
+		(const :format "" re-search-forward)
+		(regexp :format "  %t: %v\n" :size 0)
+		(const :format "" limit) (const :format "" t))))
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(FUNCTION (NUM 'FACE...) (NUM 'FACE...)...)"
+	     ,fixed-function
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(REGEXP (NUM (IF COND 'FACE)...)...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    (group :format "%v"
+			   (const :format "" if)
+			   (sexp :format "    Condition: %v\n" :size 0)
+			   ,face2)
+		    ,args)))
+       (sexp :size 0))))
+  "*Customizing widget for the extraordinary level font-lock keywords.")
+
+(defun develock-keywords-custom-set (symbol value)
+  "Function used to the :set keyword for `develock-*-font-lock-keywords'."
+  (prog1
+      (if (fboundp 'custom-set-default)
+	  (custom-set-default symbol value)
+	(set-default symbol value))
+    (if (and (not noninteractive)
+	     (featurep 'develock))
+	(let ((buffers (buffer-list))
+	      (alist develock-keywords-alist)
+	      modes)
+	  (while alist
+	    (if (eq symbol (nth 2 (car alist)))
+		(setq modes (cons (car (car alist)) modes)))
+	    (setq alist (cdr alist)))
+	  (save-excursion
+	    (while buffers
+	      (set-buffer (car buffers))
+	      (if (memq major-mode modes)
+		  (develock-mode 1))
+	      (setq buffers (cdr buffers))))))))
+
+(defcustom develock-lisp-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; lonely left parentheses or brackets without a comment
+    ("^[\t ]*\\(['`]?[\t ([]*[([]\\)[\t ]*$"
+     1 'develock-lonely-parentheses)
+    ;; lonely right parentheses or brackets
+    ("^[\t ]*\\([]\t )]*[])]\\)\\([\t ;]+\\|[\t ]*$\\)"
+     1 'develock-lonely-parentheses)
+    ;; whitespace after a left parenthesis
+    ("(\\([\t ]+\\)[^\n;]"
+     1 'develock-whitespace-2)
+    ;; whitespace before a right parenthesis
+    ("([^\n]\\([\t ]+\\))"
+     1 'develock-whitespace-2)
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Lisp modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defvar change-log-indent-text)
+
+(defcustom develock-change-log-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 append)
+     (2 'develock-long-line-2 append))
+    ;; an ugly entry line
+    (develock-find-ugly-change-log-entry-line
+     (1 'develock-whitespace-1 nil t)
+     (2 'develock-whitespace-1 t t)
+     (3 'develock-whitespace-1 t t)
+     (4 'develock-whitespace-1 t t)
+     (5 'develock-whitespace-1 t t)
+     (6 'develock-whitespace-1 t t)
+     (7 'develock-whitespace-1 t t)
+     (8 'develock-whitespace-2 t t)
+     (9 'develock-whitespace-1 t t)
+     (10 'develock-whitespace-1 t t)
+     (11 'develock-whitespace-1 t t)
+     (12 'develock-whitespace-1 t t)
+     (13 'develock-whitespace-2 t t)
+     (14 'develock-whitespace-1 t t)
+     (15 'develock-whitespace-1 t t)
+     (16 'develock-whitespace-1 t t))
+    ;; leading spaces
+    ("^\\( +\\)[^\t\n]"
+     (1 'develock-whitespace-3))
+    ;; leading 2 or more tabs
+    ("^\\([\t ][\t ]+\\)[^\t\n]"
+     ;; Improved by NISHIYAMA-san; cf. [Elips: 0005541].
+     (1 (if (and (eq (char-after (develock-point-at-bol)) ?\t)
+		 (not (= (- (match-end 1) (match-beginning 1) 1)
+			 change-log-indent-text)))
+	    'develock-whitespace-2)))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; tabs or 2 or more spaces in the log line
+    ("[^\t\n ]\\(\t[\t ]*\\|  +\\)[^\t ]"
+     (1 (if (and (memq (char-after (develock-point-at-bol)) '(?\t ?\ ))
+		 (not (string-equal ".  "
+				    (buffer-substring (1- (match-beginning 1))
+						      (match-end 1)))))
+	    'develock-whitespace-2)
+	prepend))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)\\([\t ]*\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 append)
+     (3 'develock-whitespace-2 append t))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; whitespace between a file name and a colon
+    ("^\t\\* [^\t\n ]+\\( (.+)\\)?\\([\t ]+\\):"
+     (2 'develock-whitespace-1 t)))
+  "Extraordinary level highlighting for the Change Log mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-texinfo-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; tabs
+    ("\t+"
+     (0 'develock-whitespace-1 append))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the TeXinfo mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-c-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the C modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-caml-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Caml mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-tuareg-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Tuareg mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-coq-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Coq mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-latex-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the LaTeX mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-java-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Java mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-html-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; using upper case tag
+    ((lambda (limit)
+       (let (case-fold-search)
+	 (re-search-forward "</?\\([A-Z]+\\)" limit t)))
+     (1 'develock-upper-case-tag t))
+    ;; using upper case attribute
+    ((lambda (limit)
+       (let (case-fold-search)
+	 (re-search-forward "<[a-zA-Z]+[\t ]+\\([A-Z]+\\)[\t ]*=" limit t)))
+     (1 'develock-upper-case-attribute t)))
+  "Extraordinary level highlighting for the HTML mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-cperl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the CPerl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-perl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Perl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mail-font-lock-keywords
+  `(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ,(if (featurep 'mule)
+	 ;; Japanese hankaku katakana
+	 '("\\ck+" (0 'develock-bad-manner t))))
+  "Extraordinary level highlighting for the Mail modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-tcl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Tcl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ruby-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Ruby mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defmacro develock-find-font-lock-defaults (modesym)
+  "Get the font-lock defaults based on the major mode."
+  (if (featurep 'xemacs)
+      `(let ((defaults (or font-lock-defaults
+			   (font-lock-find-font-lock-defaults ,modesym))))
+	 (if (not (consp (car defaults)))
+	     (setcar defaults (list (car defaults))))
+	 defaults)
+    `(let ((defaults
+	     (or font-lock-defaults
+		 (cdr (assq ,modesym
+			    (symbol-value 'font-lock-defaults-alist))))))
+       (cons (if (consp (car defaults))
+		 (copy-sequence (car defaults))
+	       (list (car defaults)))
+	     (copy-sequence (cdr defaults))))))
+
+(defmacro develock-set-defaults (defaults form)
+  "Set fontification defaults appropriately for the current `major-mode'."
+  (if (featurep 'xemacs)
+      `(progn
+	 (setq font-lock-defaults-computed nil
+	       font-lock-keywords nil)
+	 ,form)
+    `(progn
+       (set (make-local-variable 'font-lock-defaults) ,defaults)
+       (setq font-lock-set-defaults nil)
+       ,form)))
+
+(defvar develock-inhibit-advice-font-lock-set-defaults nil
+  "Non-nil means inhibit advising of the `font-lock-set-defaults' function.
+In XEmacs, it is the `font-lock-set-defaults-1' function instead.
+It will be set to t when the function is called recursively by itself.
+Users should never modify the value.")
+
+(defvar develock-original-fill-configuration nil
+  "Internal variable used to save `fill-column' and `auto-fill-mode'.
+It becomes buffer-local in the buffer in which Develock is on, and
+keeps the values as a cons cell before Develock is turned on.")
+
+(if (boundp 'file-local-variables-alist)
+    ;; Emacs >=23
+    (progn
+      (defadvice hack-dir-local-variables (after
+					   hack-file-local-variables-alist
+					   activate)
+	"Advised by Develock.
+Remove `fill-column' element from `file-local-variables-alist' if
+`develock-fill-column-alist' specifies it.  Also remove dir-local
+`indent-tabs-mode' element for the Lisp modes since there should be
+no rational reason to force it."
+	(if develock-mode
+	    (progn
+	      (if (cdr (assq major-mode develock-fill-column-alist))
+		  (setq file-local-variables-alist
+			(delq (assq 'fill-column file-local-variables-alist)
+			      file-local-variables-alist)))
+	      (if (memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
+		  (setq file-local-variables-alist
+			(delq (assq 'indent-tabs-mode
+				    file-local-variables-alist)
+			      file-local-variables-alist))))))
+      (defadvice hack-local-variables (after hack-file-local-variables-alist
+					     activate)
+	"Advised by Develock.
+Merge `fill-column' local variable into `develock-fill-column-alist'."
+	(let (old new)
+	  (and develock-mode
+	       (setq old (assq major-mode develock-fill-column-alist))
+	       (setq new (assq 'fill-column file-local-variables-alist))
+	       (not (eq (cdr old) (cdr new)))
+	       (progn
+		 (set (make-local-variable 'develock-fill-column-alist)
+		      (copy-sequence develock-fill-column-alist))
+		 (setcar (memq (assq major-mode develock-fill-column-alist)
+			       develock-fill-column-alist)
+			 (cons major-mode (cdr new)))
+		 (setcar develock-original-fill-configuration (cdr new)))))))
+  ;; Emacs 22 or earlier
+  (defadvice hack-local-variables (around develock-allow-local-variables
+					  activate)
+    "Advised by Develock.
+Merge `fill-column' local variable into `develock-fill-column-alist'."
+    (let ((fc fill-column))
+      ad-do-it
+      (if (and (assq major-mode develock-fill-column-alist)
+	       (not (eq fc fill-column)))
+	  (progn
+	    (set (make-local-variable 'develock-fill-column-alist)
+		 (copy-sequence develock-fill-column-alist))
+	    (setcar (memq (assq major-mode develock-fill-column-alist)
+			  develock-fill-column-alist)
+		    (cons major-mode fill-column))
+	    (setcar develock-original-fill-configuration fill-column))))))
+
+(let (current-load-list)
+  (eval
+   `(defadvice ,(if (featurep 'xemacs)
+		    'font-lock-set-defaults-1
+		  'font-lock-set-defaults)
+      (around energize-font-lock-keywords activate)
+      "Advised by Develock.
+Energize font-lock keywords for extraordinary level highlighting."
+      (if develock-inhibit-advice-font-lock-set-defaults
+	  ad-do-it
+	(let ((develock-inhibit-advice-font-lock-set-defaults t)
+	      (def (cdr (assq major-mode develock-keywords-alist))))
+	  (if def
+	      (let* ((defaults (develock-find-font-lock-defaults major-mode))
+		     (keywords (delq (car def) (car defaults)))
+		     (max-decor (nth (1- (length keywords)) keywords))
+		     (oldmode develock-mode)
+		     (font-lock-maximum-decoration
+		      font-lock-maximum-decoration))
+		(setq develock-mode
+		      (and (not (and
+				 develock-ignored-buffer-name-regexp
+				 (string-match
+				  develock-ignored-buffer-name-regexp
+				  (buffer-name))))
+			   (not (and
+				 buffer-file-name
+				 develock-ignored-file-name-regexp
+				 (string-match
+				  develock-ignored-file-name-regexp
+				  (file-name-nondirectory buffer-file-name))))
+			   develock-auto-enable))
+		(if develock-mode
+		    (let (fc)
+		      (setq font-lock-maximum-decoration t)
+		      (set (car def)
+			   (append (if (fboundp max-decor)
+				       (funcall max-decor)
+				     (symbol-value max-decor))
+				   (symbol-value (car (cdr def)))))
+		      (setcdr (nthcdr (1- (length keywords)) keywords)
+			      (list (car def)))
+		      (if (and (not oldmode)
+			       (setq fc
+				     (cdr (assq major-mode
+						develock-fill-column-alist))))
+			  (progn
+			    (set (make-local-variable
+				  'develock-original-fill-configuration)
+				 (cons (current-fill-column)
+				       (and auto-fill-function t)))
+			    (setq fill-column fc)
+			    (auto-fill-mode 1)))))
+		(setcar defaults keywords)
+		(develock-set-defaults defaults ad-do-it))
+	    ad-do-it))))))
+
+(if (featurep 'xemacs)
+    ;; Highlight def* forms even if they aren't started from the
+    ;; beginning of the line.
+    (let ((def (car (car lisp-font-lock-keywords-1))))
+      (if (and (stringp def)
+	       (string-match "^\\^\\((\\\\(def\\)" def))
+	  (setcar (car lisp-font-lock-keywords-1)
+		  (replace-match "^[\t ]*\\1" nil nil def))))
+  (defadvice font-lock-add-keywords (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+  (defadvice font-lock-remove-keywords (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+
+  ;; Those functions call `font-lock-set-defaults' in Emacs 22.
+  (defadvice font-lock-fontify-buffer (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+  (defadvice font-lock-fontify-region (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it)))
+
+(defmacro develock-max-column ()
+  "Return the maximum column number from which lines won't be highlighted."
+  '(let ((value (plist-get develock-max-column-plist major-mode)))
+     (cond ((natnump value)
+	    value)
+	   ((eq 'w value)
+	    (1- (window-width)))
+	   ((eq t value)
+	    (current-fill-column)))))
+
+(eval-and-compile
+  (or (fboundp 'kinsoku-bol-p)
+      (fboundp 'kinsoku-longer)
+      (load "kinsoku" t t)))
+
+(defmacro develock-kinsoku-longer ()
+  "Try to leap over the kinsoku characters.  Return t if leaping is done."
+  (cond ((featurep 'xemacs)
+	 (if (fboundp 'kinsoku-bol-p)
+	     '(let (done)
+		(while (and (not (eolp))
+			    (kinsoku-bol-p))
+		  (setq done t)
+		  (forward-char 1))
+		done)))
+	((fboundp 'kinsoku-longer)
+	 '(if enable-kinsoku
+	      (let (done)
+		(while (and (not (eolp))
+			    (aref (char-category-set (following-char)) ?>))
+		  (setq done t)
+		  (forward-char 1))
+		done)))))
+
+(defun develock-find-long-lines (limit)
+  "Function used to find a long line between the point and LIMIT.
+If a long line is found, it returns non-nil and sets the `match-data'
+#0, #1 and #2 with the beginning and the end positions to be
+highlighted.  This function is affected by the values of
+`develock-max-column-plist',
+`develock-mode-ignore-long-message-header-list' and
+`develock-inhibit-highlighting-kinsoku-chars'."
+  (let ((max-column (develock-max-column))
+	start inhibit end)
+    (if (and
+	 max-column
+	 (progn
+	   (if (memq major-mode
+		     develock-mode-ignore-long-message-header-list)
+	       (save-restriction
+		 (widen)
+		 (setq start (point))
+		 (goto-char (point-min))
+		 (if (or (not (re-search-forward
+			       (concat "^\\("
+				       (regexp-quote mail-header-separator)
+				       "\\)?$")
+			       nil t))
+			 (> start (match-end 0)))
+		     (goto-char start))
+		 (setq start nil)))
+	   (while (and (not start)
+		       (< (point) limit))
+	     (if (or (and (not (eolp))
+			  (> (current-column) max-column))
+		     (and (or (not (eolp))
+			      (zerop (forward-line 1)))
+			  (progn
+			    (while (progn
+				     (end-of-line)
+				     (and (<= (point) limit)
+					  (<= (current-column) max-column)
+					  (zerop (forward-line 1)))))
+			    (> (move-to-column (1+ max-column)) max-column))))
+		 (progn
+		   (if (> (move-to-column max-column) max-column)
+		       (forward-char -1))
+		   (setq start (min (point) limit))
+		   (if (memq major-mode develock-mode-ignore-kinsoku-list)
+		       nil
+		     (setq inhibit
+			   (and (develock-kinsoku-longer)
+				develock-inhibit-highlighting-kinsoku-chars
+				(eolp)))
+		     (if (> (point) limit)
+			 (goto-char limit))))
+	       (forward-line 1)))
+	   start)
+	 (< start limit))
+	(if inhibit
+	    (progn
+	      (goto-char (min (develock-point-at-eol) limit))
+	      nil)
+	  (setq start (point-marker)
+		end (set-marker (make-marker)
+				(min (develock-point-at-eol) limit)))
+	  (or (memq (char-after) '(?\t ?\ ))
+	      (skip-chars-backward "0-9A-Za-z"))
+	  (if (> (current-column) max-column)
+	      (if (> (move-to-column max-column) max-column)
+		  (forward-char -1)))
+	  (let ((mk (point-marker)))
+	    (store-match-data (list mk end mk start start end)))
+	  (goto-char end)))))
+
+(defun develock-find-tab-or-long-space (limit)
+  "Find tabs or a long space between the point and LIMIT.
+If `indent-tabs-mode' is nil, this function highlights tabs.
+Otherwise, it highlights spaces longer than `tab-width'.  It returns
+non-nil and sets beginning and ending points as the `match-data' #0,
+#1 and #2."
+  (re-search-forward (if indent-tabs-mode
+			 (concat "\\(\t*\\)\\("
+				 (make-string tab-width ?\ )
+				 "+\\)")
+		       "\\(\t+\\)")
+		     limit t))
+
+(defun develock-find-ugly-change-log-entry-line (limit)
+  "Find an ugly entry line between the point and LIMIT in ChangeLog file."
+  (and (re-search-forward
+	(eval-when-compile
+	  (concat
+	   ;; 1. leading whitespace
+	   "^\\([\t ]+\\)?"
+	   ;; -- timestamp in various styles -->
+	   "\\(?:[12][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]\\(?:\\(?: \\|"
+	   ;; 2. abnormal whitespace between YYYY-MM-DD and HH:MM:SS
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[012][0-9]:[0-5][0-9]:[0-5][0-9]\\)?\
+\\|\\(?:Sun\\|Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\)\\(?: \\|"
+	   ;; 3. abnormal whitespace before month name
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)\
+\\(?:Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\)\
+\\(?: \\|"
+	   ;; 4. abnormal whitespace between month name and day number
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[ 0-3][0-9]\\(?: \\|"
+	   ;; 5. abnormal whitespace between day number and HH:MM:SS
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[012][0-9]:[0-5][0-9]:[0-5][0-9]\\(?: \\|"
+	   ;; 6. abnormal whitespace between HH:MM:SS and YYYY
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[12][0-9][0-9][0-9]\\)"
+	   ;; <-- timestamp in various styles --
+
+	   "\\(?:  \\|"
+	   ;; 7. abnormal whitespace between time stamp and author's name
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)"
+	   ;; -- author's name --
+	   "\\(?:[^\t <>]+\\(?: [^\t <>]+\\)*\\|"
+	   ;; 8. abnormal whitespace within names
+	   "\\([^\t <>]+\\(?: [^\t <>]+\\)*\\(?:\\(?:  +\\|\t[\t ]*\\)\
+[^\t <>]+\\)+\\(?: [^\t <>]+\\)*\\)"
+	   "\\)\\(?:\\(?:  \\|"
+	   ;; 9. abnormal whitespace between author's name and e-mail address
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)<\\|"
+	   ;; 10. no space between author's name and e-mail address
+	   "\\(<\\)"
+	   "\\)"
+	   ;; 11. unwanted whitespace between < and e-mail address
+	   "\\([\t ]+\\)?"
+	   "\\(?:"
+	   ;; -- e-mail address --
+	   "[^\t <>]+"
+	   ;; 12. unwanted whitespace between e-mail address and >
+	   "\\([\t ]+\\)?"
+	   ">\\|"
+	   ;; 13. whitespace in the middle of e-mail address
+	   "\\([^\t <>]+\\(?:[\t ]+[^\t <>]+\\)+\\)"
+	   ;; 14. unwanted whitespace between e-mail address and >
+	   "\\([\t ]+\\)?"
+	   ">\\)"
+	   ;; -- a supplement e.g., (tiny change) --
+	   "\\(?:\\(?:  \\|"
+	   ;; 15. abnormal whitespace between e-mail address and supplement
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)\(\\|"
+	   ;; 16. trailing garbage
+	   "\\([^\n ].*\\)"
+	   "\\)?"))
+	limit t)
+       (prog2
+	   (goto-char (match-beginning 0))
+	   (or (not (zerop (forward-line -1)))
+	       (save-match-data (looking-at "[\t ]*$")))
+	 (goto-char (match-end 0)))))
+
+(eval-when-compile
+  (defvar file-local-variables-alist)
+  (defvar lisp-interaction-mode-hook)
+  (if (not (fboundp 'hack-dir-local-variables))
+      (defalias 'hack-dir-local-variables 'ignore)))
+
+(eval-when-compile
+  (defmacro develock-called-interactively-p (kind)
+    (if (fboundp 'called-interactively-p)
+	`(called-interactively-p ,kind)
+      '(interactive-p))))
+
+;;;###autoload
+(defun develock-mode (arg)
+  "Toggle Develock mode.
+With ARG, turn Develock on if and only if ARG is positive.
+In Develock mode, highlighting leading and trailing whitespace,
+long lines and oddities."
+  (interactive "P")
+  (if (assq major-mode develock-keywords-alist)
+      (progn
+	(cond ((and (not develock-mode)
+		    develock-ignored-buffer-name-regexp
+		    (string-match develock-ignored-buffer-name-regexp
+				  (buffer-name)))
+	       (if (develock-called-interactively-p 'any)
+		   (message "Develock is inhibited for this buffer")))
+	      ((and (not develock-mode)
+		    buffer-file-name
+		    develock-ignored-file-name-regexp
+		    (string-match develock-ignored-file-name-regexp
+				  (file-name-nondirectory buffer-file-name)))
+	       (if (develock-called-interactively-p 'any)
+		   (message "Develock is inhibited for this file")))
+	      (t
+	       (let ((oldmode develock-mode)
+		     fc)
+		 (setq develock-mode (if (numberp arg)
+					 (> arg 0)
+				       (if font-lock-mode
+					   (not develock-mode)
+					 t)))
+		 (if develock-mode
+		     (if (and (not oldmode)
+			      (setq fc (cdr (assq
+					     major-mode
+					     develock-fill-column-alist))))
+			 (progn
+			   (set (make-local-variable
+				 'develock-original-fill-configuration)
+				(cons (current-fill-column)
+				      (and auto-fill-function t)))
+			   (setq fill-column fc)
+			   (auto-fill-mode 1)))
+		   (if (and oldmode
+			    (local-variable-p
+			     'develock-original-fill-configuration
+			     (current-buffer))
+			    (car develock-original-fill-configuration))
+		       (progn
+			 (setq fill-column
+			       (car develock-original-fill-configuration))
+			 (auto-fill-mode
+			  (if (cdr develock-original-fill-configuration)
+			      1
+			    0))))))
+	       (if font-lock-mode
+		   (progn
+		     (font-lock-mode 0)
+		     (let ((develock-auto-enable develock-mode))
+		       (font-lock-mode 1)))
+		 (if develock-mode
+		     (let ((develock-auto-enable t))
+		       (font-lock-mode 1))))))
+	(condition-case nil
+	    (progn
+	      (hack-dir-local-variables)
+	      (if develock-mode
+		  (setq indent-tabs-mode (default-value 'indent-tabs-mode))
+		(if (assq 'indent-tabs-mode file-local-variables-alist)
+		    (setq indent-tabs-mode
+			  (cdr (assq 'indent-tabs-mode
+				     file-local-variables-alist))))))
+	  (error)))
+    (error "Develock does not support `%s'" major-mode)))
+
+;;;###autoload
+(defun turn-on-develock ()
+  "Turn on font-lock after splashing the startup screen under XEmacs.
+This function is used for `lisp-interaction-mode-hook' exclusively."
+  (if (and (boundp 'inhibit-warning-display)
+	   (symbol-value 'inhibit-warning-display))
+      (add-hook 'pre-command-hook 'turn-on-develock)
+    (let ((hooks (cond ((consp lisp-interaction-mode-hook)
+			(memq 'turn-on-develock lisp-interaction-mode-hook))
+		       ((eq 'turn-on-develock lisp-interaction-mode-hook)
+			(setq lisp-interaction-mode-hook
+			      '(turn-on-develock))))))
+      (if hooks
+	  (setcar hooks 'turn-on-font-lock)))
+    (if (and (consp pre-command-hook)
+	     (memq 'turn-on-develock pre-command-hook))
+	(save-excursion
+	  (remove-hook 'pre-command-hook 'turn-on-develock)
+	  (let ((buffers (buffer-list)))
+	    (while buffers
+	      (set-buffer (car buffers))
+	      (if (eq 'lisp-interaction-mode major-mode)
+		  (font-lock-set-defaults))
+	      (setq buffers (cdr buffers)))))
+      (font-lock-set-defaults))))
+
+
+;; The following functions are useful to make source codes clean.
+
+(defvar develock-advice-plist nil
+  "Internal variable used to keep advice definitions.")
+
+(defcustom develock-energize-functions-plist
+  '(indent-region t lisp-indent-line t c-indent-line t newline-and-indent nil)
+  "Plist of commands and flags; command is advised when flag is non-nil.
+When command is advised, it removes useless whitespace."
+  :type
+  '(list
+    :convert-widget
+    (lambda (widget)
+      "This function generates the following type of a widget:
+\(list (group :inline t
+	     (const :format \"-SPACES-%v: \" FUNCTION)
+	     (boolean :format \"%[%v%]\\n\" :on \"t\" :off \"nil\"))
+      [...])"
+      (let ((value (default-value 'develock-energize-functions-plist))
+	    (maxlen 0)
+	    fn rest)
+	(while value
+	  (setq fn (car value)
+		value (nthcdr 2 value)
+		rest (nconc rest (list fn))
+		maxlen (max (length (symbol-name fn)) maxlen)))
+	(setq value rest
+	      rest nil)
+	(while value
+	  (setq fn (car value)
+		value (cdr value)
+		rest (nconc
+		      rest
+		      `((group
+			 :inline t
+			 (const :format
+				,(concat (make-string
+					  (- maxlen (length (symbol-name fn)))
+					  ?\ )
+					 "%v: ")
+				,fn)
+			 (boolean :format "%[%v%]\n" :on "t" :off "nil"))))))
+	`(list :args ,rest))))
+  :set (lambda (symbol value)
+	 (prog1
+	     (if (fboundp 'custom-set-default)
+		 (custom-set-default symbol value)
+	       (set-default symbol value))
+	   (if (and (not noninteractive)
+		    (featurep 'develock))
+	       (let (fn flag)
+		 (while value
+		   (setq fn (car value)
+			 flag (car (cdr value))
+			 value (cdr (cdr value)))
+		   (condition-case nil
+		       (if flag
+			   (ad-add-advice fn
+					  (plist-get develock-advice-plist fn)
+					  'around 'first)
+			 (ad-remove-advice fn 'around
+					   'remove-useless-whitespace))
+		     (error)))))))
+  :group 'develock)
+
+(eval-and-compile
+  (or (fboundp 'develock-Orig-lisp-indent-line)
+      (defalias 'develock-Orig-lisp-indent-line
+	;; The genuine function definition of `lisp-indent-line'.
+	(or (ad-real-orig-definition 'lisp-indent-line)
+	    (symbol-function 'lisp-indent-line)))))
+
+(defun develock-lisp-indent-line (&optional whole-exp)
+  "Internal function used to advise some Lisp indent functions."
+  (save-restriction
+    (widen)
+    (let ((st (set-marker (make-marker) (point)))
+	  pt mod orig)
+      (save-excursion
+	(end-of-line)
+	(setq pt (point))
+	(or (zerop (skip-chars-backward "\t "))
+	    (nth 3 (parse-partial-sexp (point-min) (point)))
+	    (delete-region (point) pt)))
+      (if (nth 3 (parse-partial-sexp (point-min) (develock-point-at-bol)))
+	  (develock-Orig-lisp-indent-line whole-exp)
+	(save-excursion
+	  (beginning-of-line)
+	  (or (setq mod (buffer-modified-p))
+	      (setq orig (progn
+			   (looking-at "[\t ]*")
+			   (match-string 0))))
+	  (insert "\n")
+	  (forward-char -1)
+	  (save-restriction
+	    (widen)
+	    (develock-Orig-lisp-indent-line whole-exp))
+	  (if (prog1
+		  (bolp)
+		(delete-char 1)
+		(setq pt (point)))
+	      (set-buffer-modified-p mod)
+	    (or (zerop (skip-chars-forward "\t "))
+		(delete-region pt (point)))
+	    (or mod
+		(progn
+		  (beginning-of-line)
+		  (if (string-equal orig (progn
+					   (looking-at "[\t ]*")
+					   (match-string 0)))
+		      (set-buffer-modified-p nil))))))
+	(goto-char st)
+	(set-marker st nil)
+	(if (bolp) (skip-chars-forward "\t "))))))
+
+(defun develock-Orig-c-indent-line (&optional syntax quiet ignore-point-pos)
+  "This function should be redefined to the genuine `c-indent-line'."
+  (let* ((fn (or (ad-real-orig-definition 'c-indent-line)
+		 (symbol-function 'c-indent-line)))
+	 ;; Checking how many arguments `c-indent-line' accepts.
+	 (nargs (length (ad-arglist fn))))
+    (cond ((= nargs 4)
+	   ;; The genuine function definition of `c-indent-line'.
+	   (defalias 'develock-Orig-c-indent-line fn))
+	  ((= nargs 3)
+	   (defalias 'develock-Orig-c-indent-line
+	     `(lambda (&optional syntax quiet ignore-point-pos) "\
+Identical to `c-indent-line', but the optional argument
+IGNORE-POINT-POS is ignored."
+		(funcall ,fn syntax quiet))))
+	  (t
+	   (defalias 'develock-Orig-c-indent-line
+	     `(lambda (&optional syntax quiet ignore-point-pos) "\
+Identical to `c-indent-line', but the optional arguments QUIET and
+IGNORE-POINT-POS are ignored."
+		(funcall ,fn syntax))))))
+  (if (and (featurep 'bytecomp)
+	   (eq (car-safe (symbol-function 'develock-Orig-c-indent-line))
+	       'lambda))
+      (byte-compile 'develock-Orig-c-indent-line))
+  (develock-Orig-c-indent-line syntax quiet ignore-point-pos))
+
+(eval-when-compile
+  (defvar c-syntactic-indentation))
+
+(eval-and-compile
+  (if (not (fboundp 'c-guess-basic-syntax))
+      (defalias 'c-guess-basic-syntax 'ignore)))
+
+(defun develock-c-indent-line (&optional syntax quiet ignore-point-pos)
+  "Internal function used to advise some C indent functions."
+  (save-restriction
+    (widen)
+    (if (and (or (not (boundp 'c-syntactic-indentation))
+		 c-syntactic-indentation)
+	     (assq 'string (c-guess-basic-syntax)))
+	;; Since this line looks like a continued string, we do nothing
+	;; in the line beginning area.
+	(progn
+	  (if (eq this-command 'c-indent-command)
+	      ;; Except, we remove trailing whitespace when the command
+	      ;; `c-indent-command' is performed.
+	      (save-excursion
+		(end-of-line)
+		(let ((pt (point)))
+		  (or (zerop (skip-chars-backward "\t "))
+		      (delete-region (point) pt)))))
+	  (develock-Orig-c-indent-line syntax quiet ignore-point-pos))
+      (let ((move (string-match "\\`[\t ]*\\'"
+				(buffer-substring (develock-point-at-bol)
+						  (point))))
+	    pt mod orig)
+	(save-excursion
+	  (end-of-line)
+	  (setq pt (point))
+	  (or (zerop (skip-chars-backward "\t "))
+	      (delete-region (point) pt))
+	  (beginning-of-line)
+	  (looking-at "[\t ]*")
+	  (or (setq mod (buffer-modified-p))
+	      (setq orig (match-string 0)))
+	  (if indent-tabs-mode
+	      (tabify (point) (match-end 0))
+	    (untabify (point) (match-end 0)))
+	  (develock-Orig-c-indent-line syntax quiet ignore-point-pos)
+	  (setq pt (point))
+	  (or mod
+	      (progn
+		(beginning-of-line)
+		(if (string-equal orig (progn
+					 (looking-at "[\t ]*")
+					 (match-string 0)))
+		    (set-buffer-modified-p nil)))))
+	(if move
+	    (goto-char pt))))))
+
+(let (current-load-list)
+  (defadvice indent-region (around remove-useless-whitespace
+				   (start end column) activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace in
+Lisp modes, C modes and Java mode.  You can turn off this advice
+permanently by customizing the `develock-energize-functions-plist'
+variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'indent-region)
+	     (memq major-mode '(emacs-lisp-mode
+				lisp-interaction-mode
+				c-mode c++-mode java-mode jde-mode)))
+	(save-excursion
+	  ;; Meddle with out of the region.
+	  (goto-char end)
+	  (while (and (zerop (forward-line 1))
+		      (looking-at "[\t ]+$")))
+	  (let ((to (point))
+		(fn (cdr (assq
+			  major-mode
+			  '((emacs-lisp-mode . develock-lisp-indent-line)
+			    (lisp-interaction-mode . develock-lisp-indent-line)
+			    (c-mode . develock-c-indent-line)
+			    (c++-mode . develock-c-indent-line)
+			    (java-mode . develock-c-indent-line)
+			    (jde-mode . develock-c-indent-line))))))
+	    (goto-char start)
+	    (while (and (zerop (forward-line -1))
+			(or (looking-at "[\t ]+$")
+			    (progn
+			      (forward-line 1)
+			      nil))))
+	    (save-restriction
+	      (if (prog1
+		      (zerop (forward-line -1))
+		    (narrow-to-region (point) to))
+		  (forward-line 1))
+	      (while (not (eobp))
+		(or (eolp)
+		    (progn
+		      (funcall fn)
+		      (if (and (not (bolp))
+			       (eolp))
+			  (delete-region (develock-point-at-bol) (point)))))
+		(forward-line 1)))))
+      ad-do-it))
+
+  (defadvice lisp-indent-line (around remove-useless-whitespace
+				      (&optional whole-exp) activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'lisp-indent-line))
+	(develock-lisp-indent-line whole-exp)
+      ad-do-it))
+
+  (defadvice c-indent-line (around remove-useless-whitespace
+				   (&optional syntax quiet ignore-point-pos)
+				   activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'c-indent-line))
+	(develock-c-indent-line syntax quiet ignore-point-pos)
+      ad-do-it))
+
+  (defadvice newline-and-indent (around remove-useless-whitespace activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace and
+indent appropriately in Lisp modes, C modes and Java mode.  You can
+turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'newline-and-indent))
+	(cond ((memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
+	       (develock-lisp-indent-line))
+	      ((memq major-mode '(c-mode c++-mode java-mode jde-mode))
+	       (develock-c-indent-line))))
+    ad-do-it))
+
+(let ((plist develock-energize-functions-plist)
+      fn flag def)
+  (while plist
+    (setq fn (car plist)
+	  flag (car (cdr plist))
+	  plist (cdr (cdr plist)))
+    (if (setq def (assq 'remove-useless-whitespace
+			(cdr (assq 'around (ad-get-advice-info fn)))))
+	(setq develock-advice-plist (plist-put develock-advice-plist fn def)))
+    (if (not flag)
+	(ad-remove-advice fn 'around 'remove-useless-whitespace))))
+
+(provide 'develock)
+
+;;; develock.el ends here
diff --git a/.pc/0003-Add-groovy-mode.patch/develock.el b/.pc/0003-Add-groovy-mode.patch/develock.el
new file mode 100644
index 0000000..195452a
--- /dev/null
+++ b/.pc/0003-Add-groovy-mode.patch/develock.el
@@ -0,0 +1,2139 @@
+;;; develock.el --- additional font-lock keywords for the developers
+
+;; Copyright (C) 2001-2003, 2005-2009, 2012, 2013, 2015
+;; Katsumi Yamaoka
+
+;; Author: Katsumi Yamaoka  <yamaoka@jpl.org>
+;;         Jun'ichi Shiono  <jun@fsas.fujitsu.com>
+;;         Yasutaka SHINDOH <ring-pub@fan.gr.jp>
+;;         Oscar Bonilla    <ob@bitmover.com>
+;; Created: 2001/06/28
+;; Revised: 2015/10/14
+;; Keywords: font-lock emacs-lisp change-log texinfo c java perl html
+;;           tcl ruby mail news
+
+;; Develock 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.
+
+;; Develock 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 Develock; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Develock is a minor mode which provides the ability to make font-
+;; lock highlight leading and trailing whitespace, long lines and
+;; oddities in the file buffer for Lisp modes, ChangeLog mode, Texinfo
+;; mode, C modes, Ocaml modes, Coq mode, Java mode, Jde-mode , CPerl
+;; mode, Perl mode, HTML modes, some Mail modes, Tcl mode and Ruby
+;; mode.  Here is an example of how to set up your startup file
+;; (possibly .emacs) to use Develock:
+;;
+;;(cond ((featurep 'xemacs)
+;;       (require 'develock)
+;;       ;; `turn-on-develock' is equivalent to `turn-on-font-lock',
+;;       ;;  except that it does not highlight the startup screen.
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-develock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock))
+;;      ((>= emacs-major-version 20)
+;;       (require 'develock)
+;;       (global-font-lock-mode 1)))
+;;
+;; Alternatively, you can use the following to enable font-lock for
+;; each mode individually in Emacs.
+;;
+;;(cond ((featurep 'xemacs)
+;;       (require 'develock)
+;;       ;; `turn-on-develock' is equivalent to `turn-on-font-lock',
+;;       ;;  except that it does not highlight the startup screen.
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-develock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock))
+;;      ((>= emacs-major-version 20)
+;;       (require 'develock)
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'emacs-lisp-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'change-log-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'texinfo-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'c-mode-common-hook 'turn-on-font-lock)
+;;       (add-hook 'cperl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'perl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock)
+;;       (add-hook 'java-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'html-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'html-helper-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'message-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'tcl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'ruby-mode-hook 'turn-on-font-lock)))
+;;
+;; Note that `jde-mode' activates the `font-lock-mode' by default
+;; because of the `jde-use-font-lock' variable.
+;;
+;; Develock will work with Emacs 20.4 and later and XEmacs 21.1 and
+;; later.  Needless to say, you have to install this file as follows:
+;;
+;; # cp -p develock.el /usr/local/share/emacs/site-lisp
+;; # cd /usr/local/share/emacs/site-lisp
+;; # emacs -q -no-site-file -batch -f batch-byte-compile develock.el
+;;
+;; It is recommended that you use the demand-driven fontification tool
+;; (e.g. jit-lock, lazy-shot) together with font-lock.
+;;
+;; You may find latest version of Develock in ftp.jpl.org:/pub/elisp/.
+
+;; Texinfo
+;; =======
+;; The value of `fill-column' for `texinfo-mode' has changed to 70 in
+;; Emacs 21.  However, many texinfo files are written on the condition
+;; that the value is 72.  To against it, Develock provides the
+;; `develock-fill-column-alist' variable which makes it possible to
+;; set the value for `fill-column' automatically.  If Develock is on,
+;; it is set to 72 and also the `auto-fill-mode' is enabled in the
+;; `texinfo-mode' by default.
+;;
+;; Even if you disable it in `develock-fill-column-alist', you can
+;; change the behavior of highlighting if too much highlighting
+;; offends your eyes, as shown below:
+;;
+;;(if (and (not (featurep 'xemacs))
+;;	 (>= emacs-major-version 21))
+;;    (plist-put develock-max-column-plist 'texinfo-mode 72))
+
+;; Ediff
+;; =====
+;; When you run Ediff on the Develock'ed buffers, you may feel
+;; everything is in confusion.  For such a case, the following hooks
+;; may help you see diffs clearly.
+;;
+;;(add-hook
+;; 'ediff-prepare-buffer-hook
+;; (lambda nil
+;;   (if (and (boundp 'font-lock-mode) font-lock-mode
+;;	    (boundp 'develock-mode) develock-mode)
+;;       (progn
+;;	 (develock-mode 0)
+;;	 (set (make-local-variable 'develock-mode-suspended) t)))))
+;;
+;;(add-hook
+;; 'ediff-cleanup-hook
+;; (lambda nil
+;;   (let ((buffers (list ediff-buffer-A ediff-buffer-B ediff-buffer-C)))
+;;     (save-excursion
+;;       (while buffers
+;;	 (if (buffer-live-p (car buffers))
+;;	     (progn
+;;	       (set-buffer (car buffers))
+;;	       (if (and (boundp 'develock-mode-suspended)
+;;			develock-mode-suspended)
+;;		   (progn
+;;		     (develock-mode 1)
+;;		     (makunbound 'develock-mode-suspended)))))
+;;	 (setq buffers (cdr buffers)))))))
+
+;; Wanderlust
+;; ==========
+;; Though Wanderlust does not support font-lock, you may use Develock
+;; for `wl-draft-mode'.  Try to use the following codes in .wl file.
+;;
+;;(require 'develock)
+;;(require 'message)
+;;
+;;(setq wl-highlight-body-too nil)
+;;
+;;(defadvice wl-highlight-headers (around dont-highlight-draft
+;;					(&optional for-draft) activate)
+;;  "Don't highlight draft buffers."
+;;  (or for-draft ad-do-it))
+;;
+;;(defun wl-draft-setup-develock ()
+;;  "Function used to setup to use Develock in `wl-draft-mode'."
+;;  (if (featurep 'xemacs)
+;;      (put 'wl-draft-mode 'font-lock-defaults
+;;	   '(message-font-lock-keywords t))
+;;    (make-local-variable 'font-lock-defaults)
+;;    (setq font-lock-defaults '(message-font-lock-keywords t t)))
+;;  (turn-on-font-lock))
+;;
+;;(add-hook 'wl-mail-setup-hook 'wl-draft-setup-develock)
+;;
+;;(setq develock-max-column-plist
+;;      (plist-put develock-max-column-plist 'wl-draft-mode t))
+;;
+;;(let ((elem (copy-sequence (assq 'message-mode develock-keywords-alist))))
+;;  (setcar elem 'wl-draft-mode)
+;;  (setq develock-keywords-alist
+;;	(cons elem (delq (assq 'wl-draft-mode develock-keywords-alist)
+;;			 develock-keywords-alist))))
+;;
+;; If you feel that highlighting is insufficient in gaudiness,
+;; customize the value of the variable `message-font-lock-keywords' to
+;; make font-lock do what you want it to.
+
+;; Mew
+;; ===
+;; Similarly, you can use Develock for `mew-draft-mode'.  The following
+;; codes are for .mew file.  You will never know unless you try.
+;;
+;;(require 'develock)
+;;(require 'message)
+;;
+;;(defadvice mew-highlight-header-region (around dont-highlight-draft activate)
+;;  "Don't highlight draft buffers."
+;;  (or (eq 'mew-draft-mode major-mode) ad-do-it))
+;;
+;;(defadvice mew-highlight-body-region (around dont-highlight-draft activate)
+;;  "Don't highlight draft buffers."
+;;  (or (eq 'mew-draft-mode major-mode) ad-do-it))
+;;
+;;(defun mew-draft-setup-develock ()
+;;  "Function used to setup to use Develock in `mew-draft-mode'."
+;;  (if (featurep 'xemacs)
+;;      (put 'mew-draft-mode 'font-lock-defaults
+;;	   '(message-font-lock-keywords t))
+;;    (make-local-variable 'font-lock-defaults)
+;;    (setq font-lock-defaults '(message-font-lock-keywords t t)))
+;;  (turn-on-font-lock))
+;;
+;;(add-hook 'mew-draft-mode-hook 'mew-draft-setup-develock)
+;;
+;;(setq develock-max-column-plist
+;;      (plist-put develock-max-column-plist 'mew-draft-mode t))
+;;
+;;(let ((elem (copy-sequence (assq 'message-mode develock-keywords-alist))))
+;;  (setcar elem 'mew-draft-mode)
+;;  (setq develock-keywords-alist
+;;	(cons elem (delq (assq 'mew-draft-mode develock-keywords-alist)
+;;			 develock-keywords-alist))))
+
+;;; Code:
+
+(defconst develock-version "0.47"
+  "Version number for this version of Develock.")
+
+(require 'advice)
+(require 'font-lock)
+
+(defgroup develock nil
+  "A tool for the developers."
+  :group 'development)
+
+(make-variable-buffer-local
+ (defvar develock-mode nil
+   "Internal buffer-local variable used to indicate whether Develock is on."))
+
+(defcustom develock-mode-strings '(" Develock" " Font")
+  "List of identifications used to show whether Develock is on or off.
+Each element should be a string beginning with a space, a null string
+or a symbol with a similar string as its value.  You can use faces for
+each element if you are using Emacs 21 as follows:
+
+\(make-face 'develock-mode)
+\(setq develock-mode-strings
+      (list (propertize \" Develock\"
+			'face '(develock-mode :foreground \"ForestGreen\"))
+	    (propertize \" Font\"
+			'face '(develock-mode :foreground \"DarkGoldenRod\"))))
+\(when (featurep 'develock)
+  (add-minor-mode 'font-lock-mode
+		  (cons 'develock-mode develock-mode-strings)))
+
+Otherwise if you are using XEmacs, you can use a face for all the
+minor mode strings as shown below:
+
+\(copy-face 'modeline 'modeline-mousable-minor-mode)
+\(set-face-foreground 'modeline-mousable-minor-mode \"PaleTurquoise\")
+"
+  :type '(list (sexp :format "On: %v\n" :size 0)
+	       (sexp :format "Off: %v\n" :size 0))
+  :set (lambda (symbol value)
+	 (prog1
+	     (if (fboundp 'custom-set-default)
+		 (custom-set-default symbol value)
+	       (set-default symbol value))
+	   (if (and (not noninteractive)
+		    (featurep 'develock))
+	       (let ((id (cons 'develock-mode value))
+		     mmode)
+		 (if (fboundp 'add-minor-mode)
+		     (add-minor-mode 'font-lock-mode id)
+		   (if (setq mmode (assq 'font-lock-mode minor-mode-alist))
+		       (setcdr mmode (list id))
+		     (setq minor-mode-alist (cons (list 'font-lock-mode id)
+						  minor-mode-alist))))))))
+  :group 'develock
+  :group 'font-lock)
+
+(if (fboundp 'add-minor-mode)
+    (eval-after-load "font-lock"
+      '(add-minor-mode 'font-lock-mode
+		       (cons 'develock-mode develock-mode-strings)))
+  (eval-after-load "font-lock"
+    '(setcdr (assq 'font-lock-mode minor-mode-alist)
+	     (list (cons 'develock-mode develock-mode-strings)))))
+
+(defface develock-whitespace-1
+  '((t (:background "Red")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-whitespace-2
+  '((t (:background "Orange")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-whitespace-3
+  '((t (:background "Yellow")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-long-line-1
+  '((((background dark))
+     (:foreground "Orange"))
+    (t
+     (:foreground "Red")))
+  "Develock face used to highlight long lines."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-long-line-2
+  '((t (:foreground "Red" :background "Yellow")))
+  "Develock face used to highlight long lines."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-lonely-parentheses
+  '((t (:foreground "Blue" :background "PaleTurquoise")))
+  "Develock face used to highlight lonely parentheses."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-bad-manner
+  '((((background dark))
+     (:foreground "Black" :background "Yellow"))
+    (t
+     (:foreground "Yellow" :background "Black")))
+  "Develock face used to highlight unwanted characters in messages.
+Those might violate the manners of mail messages or news articles."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-upper-case-tag
+  '((((background dark))
+     (:foreground "Black" :background "PowderBlue"))
+    (t
+     (:foreground "Snow" :background "FireBrick")))
+  "Develock face used to highlight upper case character tags."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-upper-case-attribute
+  '((((background dark))
+     (:foreground "Black" :background "Wheat"))
+    (t
+     (:foreground "Snow" :background "ForestGreen")))
+  "Develock face used to highlight upper case character tags."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-reachable-mail-address
+  '((t (:foreground "DarkGreen" :background "LemonChiffon")))
+  "Develock face used to highlight reachable E-mail addresses.
+That would be defenseless to spammers."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-attention
+  '((((background dark))
+     (:foreground "OrangeRed" :bold t))
+    (t
+     (:foreground "Red" :bold t)))
+  "Develock face used to highlight things to be paid attention."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defcustom develock-auto-enable t
+  "If non-nil, turn Develock mode on when font-lock is turned on."
+  :type '(boolean :format "%{%t%}: %[%v%]" :on "On" :off "Off")
+  :group 'develock
+  :group 'font-lock)
+
+(defun develock-refontify-buffers ()
+  "Refontify all Develocked buffers."
+  (interactive)
+  (let ((buffers (buffer-list)))
+    (save-excursion
+      (while buffers
+	(set-buffer (car buffers))
+	(if develock-mode
+	    (let ((develock-auto-enable t))
+	      (font-lock-mode 0)
+	      (font-lock-mode 1)))
+	(setq buffers (cdr buffers))))))
+
+(defun develock-custom-set-and-refontify (symbol value)
+  "Function used to refontify buffers when customizing Develock options."
+  (prog1
+      (if (fboundp 'custom-set-default)
+	  (custom-set-default symbol value)
+	(set-default symbol value))
+    (if (and (not noninteractive)
+	     (featurep 'develock))
+	(develock-refontify-buffers))))
+
+(defcustom develock-max-column-plist
+  (list 'emacs-lisp-mode 79
+	'lisp-interaction-mode 'w
+	'change-log-mode t
+	'texinfo-mode t
+	'c-mode 79
+	'c++-mode 79
+	'java-mode 79
+	'caml-mode 79
+	'tuareg-mode 79
+	'coq-mode 79
+	'latex-mode 79
+	'jde-mode 79
+	'html-mode 79
+	'html-helper-mode 79
+	'cperl-mode 79
+	'perl-mode 79
+	'mail-mode t
+	'message-mode t
+	'cmail-mail-mode t
+	'tcl-mode 79
+	'ruby-mode 79)
+  "Plist of `major-mode's and limitation values for long lines.
+The part of a line that is longer than the limitation value according
+to the `major-mode' is highlighted.  Value `w' means one subtracted
+from the window width.  Value t means the return value of
+`current-fill-column'.  You can inhibit to highlight long lines using
+the value nil."
+  :type '(repeat
+	  (list :indent 2 :inline t :format "%v"
+		(symbol :format "Major-Mode: %v\n" :size 0)
+		(radio :format "Value: %v"
+		       (const :format "Off  " nil)
+		       (const :format "Fill_column  " t)
+		       (const :format "Window_width -1  " w)
+		       (integer :format "Integer: %v\n" :size 0))))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-fill-column-alist
+  '((change-log-mode . 74)
+    (texinfo-mode . 72))
+  "Alist of `major-mode's and the values for `fill-column'.
+When Develock is turned on, `auto-fill-mode' is automatically enabled
+in the buffer where `major-mode' included in this list runs.
+Each value is applied to `fill-column' in the buffer overriding the
+one in the directory-local variables specified in the .dir-locals.el
+file (if any).  If `fill-column' is specified as a local variable and
+is allowed in the buffer, this variable will be made buffer-local and
+the value will be modified."
+  :type '(repeat (cons :format "%v"
+		       (symbol :tag "Major mode")
+		       (integer :tag "Fill column")))
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mode-ignore-kinsoku-list
+  '(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode jde-mode
+		    cperl-mode perl-mode tcl-mode)
+  "List of `major-mode's that ignore kinsoku at the end of lines."
+  :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-inhibit-highlighting-kinsoku-chars nil
+  "If non-nil, inhibit highlighting kinsoku chars at the end of lines.
+It has no effect if the buffer's major-mode is contained in the
+`develock-mode-ignore-kinsoku-list' variable."
+  :type '(boolean :format "%{%t%}: %[%v%]"
+		  :on "Inhibited" :off "Not inhibited")
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mode-ignore-long-message-header-list
+  '(mail-mode message-mode cmail-mail-mode)
+  "List of `major-mode's to stop highlighting long message header lines.
+If this list contains the value of the current `major-mode', there is
+apparently a message header and even if there are long header lines,
+they will not be highlighted by Develock."
+  :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ignored-buffer-name-regexp nil
+  "Regexp matching buffer names that will not be highlighted by Develock.
+If you don't want to perform Develock on the buffer which name begins
+with \"*\" or \" *\" (typically \"*scratch*\"), use the following value:
+
+\(setq develock-ignored-buffer-name-regexp \"^ ?\\\\*[^*]+\\\\*$\")
+
+If you want to inhibit highlighting those buffers also by font-lock,
+try the following advice in your startup file.
+
+\(defadvice font-lock-mode (before dont-turn-on-for-some-buffers
+				  activate)
+  \"Don't turn on font-lock for some buffers which specified by the
+`develock-ignored-buffer-name-regexp' variable.\"
+  (if (and (boundp 'develock-ignored-buffer-name-regexp)
+	   (symbol-value 'develock-ignored-buffer-name-regexp)
+	   (string-match
+	    (symbol-value 'develock-ignored-buffer-name-regexp)
+	    (buffer-name)))
+      (ad-set-arg 0 0)))"
+  :type '(radio (const :format "Omitted " nil)
+		(regexp :format "%t: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ignored-file-name-regexp
+  "\\`\\.newsrc\\(-.+\\)?\\.eld\\'"
+  "Regexp matching file names that will not be highlighted by Develock.
+If you want to inhibit highlighting those files also by font-lock,
+try the following advice in your startup file.
+
+\(defadvice font-lock-mode (before dont-turn-on-for-some-files
+				  activate)
+  \"Don't turn on font-lock for some files which specified by the
+`develock-ignored-file-name-regexp' variable.\"
+  (if (and (boundp 'develock-ignored-file-name-regexp)
+	   (symbol-value 'develock-ignored-file-name-regexp)
+	   buffer-file-name
+	   (string-match
+	    (symbol-value 'develock-ignored-file-name-regexp)
+	    (file-name-nondirectory buffer-file-name)))
+      (ad-set-arg 0 0)))"
+  :type '(radio (const :format "Omitted " nil)
+		(regexp :format "%t: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(eval-and-compile
+  (if (featurep 'xemacs)
+      (progn
+	(defalias 'develock-point-at-bol 'point-at-bol)
+	(defalias 'develock-point-at-eol 'point-at-eol))
+    (defalias 'develock-point-at-bol 'line-beginning-position)
+    (defalias 'develock-point-at-eol 'line-end-position)))
+
+(defvar lisp-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Lisp modes.")
+
+(defvar change-log-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Change Log mode.")
+
+(defvar texinfo-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the TeXinfo mode.")
+
+(defvar c-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the C modes.")
+
+(defvar caml-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Caml mode.")
+
+(defvar tuareg-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Tuareg mode.")
+
+(defvar coq-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Coq mode.")
+
+(defvar latex-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the LaTeX mode.")
+
+(defvar java-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Java mode.")
+
+(defvar cperl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the CPerl mode.")
+
+(defvar perl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Perl mode.")
+
+(defvar mail-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Mail mode.")
+
+(defvar message-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Message mode.")
+
+(defvar cmail-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Cmail mode.")
+
+(defvar html-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the HTML mode.")
+
+(defvar tcl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Tcl mode.")
+
+(defvar ruby-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Ruby mode.")
+
+(defvar develock-keywords-alist
+  '((emacs-lisp-mode lisp-font-lock-keywords-x
+		     develock-lisp-font-lock-keywords)
+    (lisp-interaction-mode lisp-font-lock-keywords-x
+			   develock-lisp-font-lock-keywords)
+    (change-log-mode change-log-font-lock-keywords-x
+		     develock-change-log-font-lock-keywords)
+    (texinfo-mode texinfo-font-lock-keywords-x
+		  develock-texinfo-font-lock-keywords)
+    (c-mode c-font-lock-keywords-x
+	    develock-c-font-lock-keywords)
+    (c++-mode c-font-lock-keywords-x
+	      develock-c-font-lock-keywords)
+    (caml-mode caml-font-lock-keywords-x
+	      develock-caml-font-lock-keywords)
+    (tuareg-mode tuareg-font-lock-keywords-x
+	      develock-tuareg-font-lock-keywords)
+    (coq-mode coq-font-lock-keywords-x
+	      develock-coq-font-lock-keywords)
+    (latex-mode latex-font-lock-keywords-x
+	      develock-latex-font-lock-keywords)
+    (java-mode java-font-lock-keywords-x
+	       develock-java-font-lock-keywords)
+    (jde-mode java-font-lock-keywords-x
+	      develock-java-font-lock-keywords)
+    (html-mode html-font-lock-keywords-x
+	       develock-html-font-lock-keywords)
+    (html-helper-mode html-font-lock-keywords-x
+		      develock-html-font-lock-keywords)
+    (cperl-mode cperl-font-lock-keywords-x
+		develock-cperl-font-lock-keywords)
+    (perl-mode perl-font-lock-keywords-x
+	       develock-perl-font-lock-keywords)
+    (mail-mode mail-font-lock-keywords-x
+	       develock-mail-font-lock-keywords)
+    (message-mode message-font-lock-keywords-x
+		  develock-mail-font-lock-keywords)
+    (cmail-mail-mode cmail-font-lock-keywords-x
+		     develock-mail-font-lock-keywords)
+    (tcl-mode tcl-font-lock-keywords-x
+	      develock-tcl-font-lock-keywords)
+    (ruby-mode ruby-font-lock-keywords-x
+	       develock-ruby-font-lock-keywords))
+  "*Alist of keyword symbols for major modes.
+Each element should be triple symbols of the following form:
+
+\(major-mode internal-keywords user-defined-keywords)")
+
+(defvar develock-keywords-custom-type
+  (let* ((args
+	  '(option :format "    %v"
+		   (list :inline t :tag "Args"
+			 (radio :format "  Override: %v"
+				(const :format "%v " nil)
+				(const :format "%v " t)
+				(const :format "%v " keep)
+				(const :format "%v " prepend)
+				(const append))
+			 (boolean :tag "  LaxMatch"))))
+	 (fixed-function
+	  `(list
+	    :convert-widget
+	    (lambda (widget)
+	      `(function
+		:format "  %t: %v\n"
+		:size 0 :value (lambda (limit))
+		,@(if (not (widget-get widget :copy))
+		      ;; Emacs versions prior to 21.4.
+		      '(:match
+			(lambda (widget value) (functionp value))
+			:value-to-internal
+			(lambda (widget value)
+			  (widget-sexp-value-to-internal
+			   widget
+			   (if (and (stringp value)
+				    (string-match "\\`\".*\"\\'" value))
+			       (substring value 1 -1)
+			     value)))))))))
+	 (face-widget
+	  (lambda (prompt)
+	    `(group
+	      :convert-widget (lambda (widget)
+				(apply 'widget-convert (widget-type widget)
+				       (eval (car (widget-get widget :args)))))
+	      (list
+	       '(const :format "" quote)
+	       (append '(face :indent 6 :format)
+		       (if (condition-case nil
+			       (string-match
+				"%{sample%}"
+				(widget-get (get 'face 'widget-type) :format))
+			     (error nil))
+			   (list (concat ,prompt "(%{sample%}) %v\n") :size 0)
+			 (list (concat ,prompt "%[select face%] %v"))))))))
+	 (face1 (funcall face-widget "  %{%t%}: "))
+	 (face2 (funcall face-widget "    %{%t%}: ")))
+    `(repeat
+      (choice
+       :format "%[%t%] %v\n" :indent 0 :tag "Keyword Type"
+       (list :tag "Find Long Lines"
+	     (const :format "  Function: %v\n"
+		    :value develock-find-long-lines)
+	     (group (const :format "" 1)
+		    ,(funcall face-widget "\
+  %t used in a boundary (subexpression #1):\n    ")
+		    ,args)
+	     (group (const :format "" 2)
+		    ,(funcall face-widget "\
+  %t used out of a boundary (subexpression #2):\n    ")
+		    ,args))
+       (list :tag "Find Tabs or Long Spaces"
+	     :sample-face widget-documentation-face
+	     :format "Find Tabs or Long Spaces:
+   %{(If `indent-tabs-mode' is nil, this type highlights tabs.%}\n%v"
+	     (const :sample-face widget-documentation-face
+		    :format "\
+    %{Otherwise, it highlights spaces longer than `tab-width'.)%}
+  Function: %v\n"
+		    :value develock-find-tab-or-long-space)
+	     (group (const :format "" 1)
+		    ,(funcall face-widget "\
+  %t used for tabs before long spaces (subexpression #1):\n    ")
+		    ,args)
+	     (group (const :format "" 2)
+		    ,(funcall face-widget "\
+  %t used for long spaces (subexpression #2):\n    ")
+		    ,args))
+       (list :tag "(REGEXP NUM 'FACE...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (integer :format "  Match Subexpression Number: %v\n"
+		      :size 0)
+	     ,face1
+	     ,args)
+       (list :tag "(FUNCTION NUM 'FACE...)"
+	     ,fixed-function
+	     (integer :format "  Match Subexpression Number: %v\n"
+		      :size 0)
+	     ,face1
+	     ,args)
+       (cons :tag "(REGEXP (NUM 'FACE...) (NUM 'FACE...)...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(CASE_SENSITIVE_REGEXP (NUM 'FACE...)...)"
+	     (group
+	      (const :format "" lambda) (const :format "" (limit))
+	      (group
+	       (const :format "" let) (const :format "" (case-fold-search))
+	       (group
+		(const :format "" re-search-forward)
+		(regexp :format "  %t: %v\n" :size 0)
+		(const :format "" limit) (const :format "" t))))
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(FUNCTION (NUM 'FACE...) (NUM 'FACE...)...)"
+	     ,fixed-function
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(REGEXP (NUM (IF COND 'FACE)...)...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    (group :format "%v"
+			   (const :format "" if)
+			   (sexp :format "    Condition: %v\n" :size 0)
+			   ,face2)
+		    ,args)))
+       (sexp :size 0))))
+  "*Customizing widget for the extraordinary level font-lock keywords.")
+
+(defun develock-keywords-custom-set (symbol value)
+  "Function used to the :set keyword for `develock-*-font-lock-keywords'."
+  (prog1
+      (if (fboundp 'custom-set-default)
+	  (custom-set-default symbol value)
+	(set-default symbol value))
+    (if (and (not noninteractive)
+	     (featurep 'develock))
+	(let ((buffers (buffer-list))
+	      (alist develock-keywords-alist)
+	      modes)
+	  (while alist
+	    (if (eq symbol (nth 2 (car alist)))
+		(setq modes (cons (car (car alist)) modes)))
+	    (setq alist (cdr alist)))
+	  (save-excursion
+	    (while buffers
+	      (set-buffer (car buffers))
+	      (if (memq major-mode modes)
+		  (develock-mode 1))
+	      (setq buffers (cdr buffers))))))))
+
+(defcustom develock-lisp-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; lonely left parentheses or brackets without a comment
+    ("^[\t ]*\\(['`]?[\t ([]*[([]\\)[\t ]*$"
+     1 'develock-lonely-parentheses)
+    ;; lonely right parentheses or brackets
+    ("^[\t ]*\\([]\t )]*[])]\\)\\([\t ;]+\\|[\t ]*$\\)"
+     1 'develock-lonely-parentheses)
+    ;; whitespace after a left parenthesis
+    ("(\\([\t ]+\\)[^\n;]"
+     1 'develock-whitespace-2)
+    ;; whitespace before a right parenthesis
+    ("([^\n]\\([\t ]+\\))"
+     1 'develock-whitespace-2)
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Lisp modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defvar change-log-indent-text)
+
+(defcustom develock-change-log-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 append)
+     (2 'develock-long-line-2 append))
+    ;; an ugly entry line
+    (develock-find-ugly-change-log-entry-line
+     (1 'develock-whitespace-1 nil t)
+     (2 'develock-whitespace-1 t t)
+     (3 'develock-whitespace-1 t t)
+     (4 'develock-whitespace-1 t t)
+     (5 'develock-whitespace-1 t t)
+     (6 'develock-whitespace-1 t t)
+     (7 'develock-whitespace-1 t t)
+     (8 'develock-whitespace-2 t t)
+     (9 'develock-whitespace-1 t t)
+     (10 'develock-whitespace-1 t t)
+     (11 'develock-whitespace-1 t t)
+     (12 'develock-whitespace-1 t t)
+     (13 'develock-whitespace-2 t t)
+     (14 'develock-whitespace-1 t t)
+     (15 'develock-whitespace-1 t t)
+     (16 'develock-whitespace-1 t t))
+    ;; leading spaces
+    ("^\\( +\\)[^\t\n]"
+     (1 'develock-whitespace-3))
+    ;; leading 2 or more tabs
+    ("^\\([\t ][\t ]+\\)[^\t\n]"
+     ;; Improved by NISHIYAMA-san; cf. [Elips: 0005541].
+     (1 (if (and (eq (char-after (develock-point-at-bol)) ?\t)
+		 (not (= (- (match-end 1) (match-beginning 1) 1)
+			 change-log-indent-text)))
+	    'develock-whitespace-2)))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; tabs or 2 or more spaces in the log line
+    ("[^\t\n ]\\(\t[\t ]*\\|  +\\)[^\t ]"
+     (1 (if (and (memq (char-after (develock-point-at-bol)) '(?\t ?\ ))
+		 (not (string-equal ".  "
+				    (buffer-substring (1- (match-beginning 1))
+						      (match-end 1)))))
+	    'develock-whitespace-2)
+	prepend))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)\\([\t ]*\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 append)
+     (3 'develock-whitespace-2 append t))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; whitespace between a file name and a colon
+    ("^\t\\* [^\t\n ]+\\( (.+)\\)?\\([\t ]+\\):"
+     (2 'develock-whitespace-1 t)))
+  "Extraordinary level highlighting for the Change Log mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-texinfo-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; tabs
+    ("\t+"
+     (0 'develock-whitespace-1 append))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the TeXinfo mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-c-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the C modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-caml-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Caml mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-tuareg-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Tuareg mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-coq-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Coq mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-latex-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the LaTeX mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-java-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Java mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-html-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; using upper case tag
+    ((lambda (limit)
+       (let (case-fold-search)
+	 (re-search-forward "</?\\([A-Z]+\\)" limit t)))
+     (1 'develock-upper-case-tag t))
+    ;; using upper case attribute
+    ((lambda (limit)
+       (let (case-fold-search)
+	 (re-search-forward "<[a-zA-Z]+[\t ]+\\([A-Z]+\\)[\t ]*=" limit t)))
+     (1 'develock-upper-case-attribute t)))
+  "Extraordinary level highlighting for the HTML mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-cperl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the CPerl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-perl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Perl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mail-font-lock-keywords
+  `(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ,(if (featurep 'mule)
+	 ;; Japanese hankaku katakana
+	 '("\\ck+" (0 'develock-bad-manner t))))
+  "Extraordinary level highlighting for the Mail modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-tcl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Tcl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ruby-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Ruby mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defmacro develock-find-font-lock-defaults (modesym)
+  "Get the font-lock defaults based on the major mode."
+  (if (featurep 'xemacs)
+      `(let ((defaults (or font-lock-defaults
+			   (font-lock-find-font-lock-defaults ,modesym))))
+	 (if (not (consp (car defaults)))
+	     (setcar defaults (list (car defaults))))
+	 defaults)
+    `(let ((defaults
+	     (or font-lock-defaults
+		 (cdr (assq ,modesym
+			    (symbol-value 'font-lock-defaults-alist))))))
+       (cons (if (consp (car defaults))
+		 (copy-sequence (car defaults))
+	       (list (car defaults)))
+	     (copy-sequence (cdr defaults))))))
+
+(defmacro develock-set-defaults (defaults form)
+  "Set fontification defaults appropriately for the current `major-mode'."
+  (if (featurep 'xemacs)
+      `(progn
+	 (setq font-lock-defaults-computed nil
+	       font-lock-keywords nil)
+	 ,form)
+    `(progn
+       (set (make-local-variable 'font-lock-defaults) ,defaults)
+       (setq font-lock-set-defaults nil)
+       ,form)))
+
+(defvar develock-inhibit-advice-font-lock-set-defaults nil
+  "Non-nil means inhibit advising of the `font-lock-set-defaults' function.
+In XEmacs, it is the `font-lock-set-defaults-1' function instead.
+It will be set to t when the function is called recursively by itself.
+Users should never modify the value.")
+
+(defvar develock-original-fill-configuration nil
+  "Internal variable used to save `fill-column' and `auto-fill-mode'.
+It becomes buffer-local in the buffer in which Develock is on, and
+keeps the values as a cons cell before Develock is turned on.")
+
+(if (boundp 'file-local-variables-alist)
+    ;; Emacs >=23
+    (progn
+      (defadvice hack-dir-local-variables (after
+					   hack-file-local-variables-alist
+					   activate)
+	"Advised by Develock.
+Remove `fill-column' element from `file-local-variables-alist' if
+`develock-fill-column-alist' specifies it.  Also remove dir-local
+`indent-tabs-mode' element for the Lisp modes since there should be
+no rational reason to force it."
+	(if develock-mode
+	    (progn
+	      (if (cdr (assq major-mode develock-fill-column-alist))
+		  (setq file-local-variables-alist
+			(delq (assq 'fill-column file-local-variables-alist)
+			      file-local-variables-alist)))
+	      (if (memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
+		  (setq file-local-variables-alist
+			(delq (assq 'indent-tabs-mode
+				    file-local-variables-alist)
+			      file-local-variables-alist))))))
+      (defadvice hack-local-variables (after hack-file-local-variables-alist
+					     activate)
+	"Advised by Develock.
+Merge `fill-column' local variable into `develock-fill-column-alist'."
+	(let (old new)
+	  (and develock-mode
+	       (setq old (assq major-mode develock-fill-column-alist))
+	       (setq new (assq 'fill-column file-local-variables-alist))
+	       (not (eq (cdr old) (cdr new)))
+	       (progn
+		 (set (make-local-variable 'develock-fill-column-alist)
+		      (copy-sequence develock-fill-column-alist))
+		 (setcar (memq (assq major-mode develock-fill-column-alist)
+			       develock-fill-column-alist)
+			 (cons major-mode (cdr new)))
+		 (setcar develock-original-fill-configuration (cdr new)))))))
+  ;; Emacs 22 or earlier
+  (defadvice hack-local-variables (around develock-allow-local-variables
+					  activate)
+    "Advised by Develock.
+Merge `fill-column' local variable into `develock-fill-column-alist'."
+    (let ((fc fill-column))
+      ad-do-it
+      (if (and (assq major-mode develock-fill-column-alist)
+	       (not (eq fc fill-column)))
+	  (progn
+	    (set (make-local-variable 'develock-fill-column-alist)
+		 (copy-sequence develock-fill-column-alist))
+	    (setcar (memq (assq major-mode develock-fill-column-alist)
+			  develock-fill-column-alist)
+		    (cons major-mode fill-column))
+	    (setcar develock-original-fill-configuration fill-column))))))
+
+(let (current-load-list)
+  (eval
+   `(defadvice ,(if (featurep 'xemacs)
+		    'font-lock-set-defaults-1
+		  'font-lock-set-defaults)
+      (around energize-font-lock-keywords activate)
+      "Advised by Develock.
+Energize font-lock keywords for extraordinary level highlighting."
+      (if develock-inhibit-advice-font-lock-set-defaults
+	  ad-do-it
+	(let ((develock-inhibit-advice-font-lock-set-defaults t)
+	      (def (cdr (assq major-mode develock-keywords-alist))))
+	  (if def
+	      (let* ((defaults (develock-find-font-lock-defaults major-mode))
+		     (keywords (delq (car def) (car defaults)))
+		     (max-decor (nth (1- (length keywords)) keywords))
+		     (oldmode develock-mode)
+		     (font-lock-maximum-decoration
+		      font-lock-maximum-decoration))
+		(setq develock-mode
+		      (and (not (and
+				 develock-ignored-buffer-name-regexp
+				 (string-match
+				  develock-ignored-buffer-name-regexp
+				  (buffer-name))))
+			   (not (and
+				 buffer-file-name
+				 develock-ignored-file-name-regexp
+				 (string-match
+				  develock-ignored-file-name-regexp
+				  (file-name-nondirectory buffer-file-name))))
+			   develock-auto-enable))
+		(if develock-mode
+		    (let (fc)
+		      (setq font-lock-maximum-decoration t)
+		      (set (car def)
+			   (append (if (fboundp max-decor)
+				       (funcall max-decor)
+				     (symbol-value max-decor))
+				   (symbol-value (car (cdr def)))))
+		      (setcdr (nthcdr (1- (length keywords)) keywords)
+			      (list (car def)))
+		      (if (and (not oldmode)
+			       (setq fc
+				     (cdr (assq major-mode
+						develock-fill-column-alist))))
+			  (progn
+			    (set (make-local-variable
+				  'develock-original-fill-configuration)
+				 (cons (current-fill-column)
+				       (and auto-fill-function t)))
+			    (setq fill-column fc)
+			    (auto-fill-mode 1)))))
+		(setcar defaults keywords)
+		(develock-set-defaults defaults ad-do-it))
+	    ad-do-it))))))
+
+(if (featurep 'xemacs)
+    ;; Highlight def* forms even if they aren't started from the
+    ;; beginning of the line.
+    (let ((def (car (car lisp-font-lock-keywords-1))))
+      (if (and (stringp def)
+	       (string-match "^\\^\\((\\\\(def\\)" def))
+	  (setcar (car lisp-font-lock-keywords-1)
+		  (replace-match "^[\t ]*\\1" nil nil def))))
+  (defadvice font-lock-add-keywords (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+  (defadvice font-lock-remove-keywords (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+
+  ;; Those functions call `font-lock-set-defaults' in Emacs 22.
+  (defadvice font-lock-fontify-buffer (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+  (defadvice font-lock-fontify-region (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it)))
+
+(defmacro develock-max-column ()
+  "Return the maximum column number from which lines won't be highlighted."
+  '(let ((value (plist-get develock-max-column-plist major-mode)))
+     (cond ((natnump value)
+	    value)
+	   ((eq 'w value)
+	    (1- (window-width)))
+	   ((eq t value)
+	    (current-fill-column)))))
+
+(eval-and-compile
+  (or (fboundp 'kinsoku-bol-p)
+      (fboundp 'kinsoku-longer)
+      (load "kinsoku" t t)))
+
+(defmacro develock-kinsoku-longer ()
+  "Try to leap over the kinsoku characters.  Return t if leaping is done."
+  (cond ((featurep 'xemacs)
+	 (if (fboundp 'kinsoku-bol-p)
+	     '(let (done)
+		(while (and (not (eolp))
+			    (kinsoku-bol-p))
+		  (setq done t)
+		  (forward-char 1))
+		done)))
+	((fboundp 'kinsoku-longer)
+	 '(if enable-kinsoku
+	      (let (done)
+		(while (and (not (eolp))
+			    (aref (char-category-set (following-char)) ?>))
+		  (setq done t)
+		  (forward-char 1))
+		done)))))
+
+(defun develock-find-long-lines (limit)
+  "Function used to find a long line between the point and LIMIT.
+If a long line is found, it returns non-nil and sets the `match-data'
+#0, #1 and #2 with the beginning and the end positions to be
+highlighted.  This function is affected by the values of
+`develock-max-column-plist',
+`develock-mode-ignore-long-message-header-list' and
+`develock-inhibit-highlighting-kinsoku-chars'."
+  (let ((max-column (develock-max-column))
+	start inhibit end)
+    (if (and
+	 max-column
+	 (progn
+	   (if (memq major-mode
+		     develock-mode-ignore-long-message-header-list)
+	       (save-restriction
+		 (widen)
+		 (setq start (point))
+		 (goto-char (point-min))
+		 (if (or (not (re-search-forward
+			       (concat "^\\("
+				       (regexp-quote mail-header-separator)
+				       "\\)?$")
+			       nil t))
+			 (> start (match-end 0)))
+		     (goto-char start))
+		 (setq start nil)))
+	   (while (and (not start)
+		       (< (point) limit))
+	     (if (or (and (not (eolp))
+			  (> (current-column) max-column))
+		     (and (or (not (eolp))
+			      (zerop (forward-line 1)))
+			  (progn
+			    (while (progn
+				     (end-of-line)
+				     (and (<= (point) limit)
+					  (<= (current-column) max-column)
+					  (zerop (forward-line 1)))))
+			    (> (move-to-column (1+ max-column)) max-column))))
+		 (progn
+		   (if (> (move-to-column max-column) max-column)
+		       (forward-char -1))
+		   (setq start (min (point) limit))
+		   (if (memq major-mode develock-mode-ignore-kinsoku-list)
+		       nil
+		     (setq inhibit
+			   (and (develock-kinsoku-longer)
+				develock-inhibit-highlighting-kinsoku-chars
+				(eolp)))
+		     (if (> (point) limit)
+			 (goto-char limit))))
+	       (forward-line 1)))
+	   start)
+	 (< start limit))
+	(if inhibit
+	    (progn
+	      (goto-char (min (develock-point-at-eol) limit))
+	      nil)
+	  (setq start (point-marker)
+		end (set-marker (make-marker)
+				(min (develock-point-at-eol) limit)))
+	  (or (memq (char-after) '(?\t ?\ ))
+	      (skip-chars-backward "0-9A-Za-z"))
+	  (if (> (current-column) max-column)
+	      (if (> (move-to-column max-column) max-column)
+		  (forward-char -1)))
+	  (let ((mk (point-marker)))
+	    (store-match-data (list mk end mk start start end)))
+	  (goto-char end)))))
+
+(defun develock-find-tab-or-long-space (limit)
+  "Find tabs or a long space between the point and LIMIT.
+If `indent-tabs-mode' is nil, this function highlights tabs.
+Otherwise, it highlights spaces longer than `tab-width'.  It returns
+non-nil and sets beginning and ending points as the `match-data' #0,
+#1 and #2."
+  (re-search-forward (if indent-tabs-mode
+			 (concat "\\(\t*\\)\\("
+				 (make-string tab-width ?\ )
+				 "+\\)")
+		       "\\(\t+\\)")
+		     limit t))
+
+(defun develock-find-ugly-change-log-entry-line (limit)
+  "Find an ugly entry line between the point and LIMIT in ChangeLog file."
+  (and (re-search-forward
+	(eval-when-compile
+	  (concat
+	   ;; 1. leading whitespace
+	   "^\\([\t ]+\\)?"
+	   ;; -- timestamp in various styles -->
+	   "\\(?:[12][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]\\(?:\\(?: \\|"
+	   ;; 2. abnormal whitespace between YYYY-MM-DD and HH:MM:SS
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[012][0-9]:[0-5][0-9]:[0-5][0-9]\\)?\
+\\|\\(?:Sun\\|Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\)\\(?: \\|"
+	   ;; 3. abnormal whitespace before month name
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)\
+\\(?:Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\)\
+\\(?: \\|"
+	   ;; 4. abnormal whitespace between month name and day number
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[ 0-3][0-9]\\(?: \\|"
+	   ;; 5. abnormal whitespace between day number and HH:MM:SS
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[012][0-9]:[0-5][0-9]:[0-5][0-9]\\(?: \\|"
+	   ;; 6. abnormal whitespace between HH:MM:SS and YYYY
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[12][0-9][0-9][0-9]\\)"
+	   ;; <-- timestamp in various styles --
+
+	   "\\(?:  \\|"
+	   ;; 7. abnormal whitespace between time stamp and author's name
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)"
+	   ;; -- author's name --
+	   "\\(?:[^\t <>]+\\(?: [^\t <>]+\\)*\\|"
+	   ;; 8. abnormal whitespace within names
+	   "\\([^\t <>]+\\(?: [^\t <>]+\\)*\\(?:\\(?:  +\\|\t[\t ]*\\)\
+[^\t <>]+\\)+\\(?: [^\t <>]+\\)*\\)"
+	   "\\)\\(?:\\(?:  \\|"
+	   ;; 9. abnormal whitespace between author's name and e-mail address
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)<\\|"
+	   ;; 10. no space between author's name and e-mail address
+	   "\\(<\\)"
+	   "\\)"
+	   ;; 11. unwanted whitespace between < and e-mail address
+	   "\\([\t ]+\\)?"
+	   "\\(?:"
+	   ;; -- e-mail address --
+	   "[^\t <>]+"
+	   ;; 12. unwanted whitespace between e-mail address and >
+	   "\\([\t ]+\\)?"
+	   ">\\|"
+	   ;; 13. whitespace in the middle of e-mail address
+	   "\\([^\t <>]+\\(?:[\t ]+[^\t <>]+\\)+\\)"
+	   ;; 14. unwanted whitespace between e-mail address and >
+	   "\\([\t ]+\\)?"
+	   ">\\)"
+	   ;; -- a supplement e.g., (tiny change) --
+	   "\\(?:\\(?:  \\|"
+	   ;; 15. abnormal whitespace between e-mail address and supplement
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)\(\\|"
+	   ;; 16. trailing garbage
+	   "\\([^\n ].*\\)"
+	   "\\)?"))
+	limit t)
+       (prog2
+	   (goto-char (match-beginning 0))
+	   (or (not (zerop (forward-line -1)))
+	       (save-match-data (looking-at "[\t ]*$")))
+	 (goto-char (match-end 0)))))
+
+(eval-when-compile
+  (defvar file-local-variables-alist)
+  (defvar lisp-interaction-mode-hook)
+  (if (not (fboundp 'hack-dir-local-variables))
+      (defalias 'hack-dir-local-variables 'ignore)))
+
+(eval-when-compile
+  (defmacro develock-called-interactively-p (kind)
+    (if (fboundp 'called-interactively-p)
+	`(called-interactively-p ,kind)
+      '(interactive-p))))
+
+;;;###autoload
+(defun develock-mode (arg)
+  "Toggle Develock mode.
+With ARG, turn Develock on if and only if ARG is positive.
+In Develock mode, highlighting leading and trailing whitespace,
+long lines and oddities."
+  (interactive "P")
+  (if (assq major-mode develock-keywords-alist)
+      (progn
+	(cond ((and (not develock-mode)
+		    develock-ignored-buffer-name-regexp
+		    (string-match develock-ignored-buffer-name-regexp
+				  (buffer-name)))
+	       (if (develock-called-interactively-p 'any)
+		   (message "Develock is inhibited for this buffer")))
+	      ((and (not develock-mode)
+		    buffer-file-name
+		    develock-ignored-file-name-regexp
+		    (string-match develock-ignored-file-name-regexp
+				  (file-name-nondirectory buffer-file-name)))
+	       (if (develock-called-interactively-p 'any)
+		   (message "Develock is inhibited for this file")))
+	      (t
+	       (let ((oldmode develock-mode)
+		     fc)
+		 (setq develock-mode (if (numberp arg)
+					 (> arg 0)
+				       (if font-lock-mode
+					   (not develock-mode)
+					 t)))
+		 (if develock-mode
+		     (if (and (not oldmode)
+			      (setq fc (cdr (assq
+					     major-mode
+					     develock-fill-column-alist))))
+			 (progn
+			   (set (make-local-variable
+				 'develock-original-fill-configuration)
+				(cons (current-fill-column)
+				      (and auto-fill-function t)))
+			   (setq fill-column fc)
+			   (auto-fill-mode 1)))
+		   (if (and oldmode
+			    (local-variable-p
+			     'develock-original-fill-configuration
+			     (current-buffer))
+			    (car develock-original-fill-configuration))
+		       (progn
+			 (setq fill-column
+			       (car develock-original-fill-configuration))
+			 (auto-fill-mode
+			  (if (cdr develock-original-fill-configuration)
+			      1
+			    0))))))
+	       (if font-lock-mode
+		   (progn
+		     (font-lock-mode 0)
+		     (let ((develock-auto-enable develock-mode))
+		       (font-lock-mode 1)))
+		 (if develock-mode
+		     (let ((develock-auto-enable t))
+		       (font-lock-mode 1))))))
+	(condition-case nil
+	    (progn
+	      (hack-dir-local-variables)
+	      (if develock-mode
+		  (setq indent-tabs-mode (default-value 'indent-tabs-mode))
+		(if (assq 'indent-tabs-mode file-local-variables-alist)
+		    (setq indent-tabs-mode
+			  (cdr (assq 'indent-tabs-mode
+				     file-local-variables-alist))))))
+	  (error)))
+    (error "Develock does not support `%s'" major-mode)))
+
+;;;###autoload
+(defun turn-on-develock ()
+  "Turn on font-lock after splashing the startup screen under XEmacs.
+This function is used for `lisp-interaction-mode-hook' exclusively."
+  (if (and (boundp 'inhibit-warning-display)
+	   (symbol-value 'inhibit-warning-display))
+      (add-hook 'pre-command-hook 'turn-on-develock)
+    (let ((hooks (cond ((consp lisp-interaction-mode-hook)
+			(memq 'turn-on-develock lisp-interaction-mode-hook))
+		       ((eq 'turn-on-develock lisp-interaction-mode-hook)
+			(setq lisp-interaction-mode-hook
+			      '(turn-on-develock))))))
+      (if hooks
+	  (setcar hooks 'turn-on-font-lock)))
+    (if (and (consp pre-command-hook)
+	     (memq 'turn-on-develock pre-command-hook))
+	(save-excursion
+	  (remove-hook 'pre-command-hook 'turn-on-develock)
+	  (let ((buffers (buffer-list)))
+	    (while buffers
+	      (set-buffer (car buffers))
+	      (if (eq 'lisp-interaction-mode major-mode)
+		  (font-lock-set-defaults))
+	      (setq buffers (cdr buffers)))))
+      (font-lock-set-defaults))))
+
+
+;; The following functions are useful to make source codes clean.
+
+(defvar develock-advice-plist nil
+  "Internal variable used to keep advice definitions.")
+
+(defcustom develock-energize-functions-plist
+  '(indent-region t lisp-indent-line t c-indent-line t newline-and-indent nil)
+  "Plist of commands and flags; command is advised when flag is non-nil.
+When command is advised, it removes useless whitespace."
+  :type
+  '(list
+    :convert-widget
+    (lambda (widget)
+      "This function generates the following type of a widget:
+\(list (group :inline t
+	     (const :format \"-SPACES-%v: \" FUNCTION)
+	     (boolean :format \"%[%v%]\\n\" :on \"t\" :off \"nil\"))
+      [...])"
+      (let ((value (default-value 'develock-energize-functions-plist))
+	    (maxlen 0)
+	    fn rest)
+	(while value
+	  (setq fn (car value)
+		value (nthcdr 2 value)
+		rest (nconc rest (list fn))
+		maxlen (max (length (symbol-name fn)) maxlen)))
+	(setq value rest
+	      rest nil)
+	(while value
+	  (setq fn (car value)
+		value (cdr value)
+		rest (nconc
+		      rest
+		      `((group
+			 :inline t
+			 (const :format
+				,(concat (make-string
+					  (- maxlen (length (symbol-name fn)))
+					  ?\ )
+					 "%v: ")
+				,fn)
+			 (boolean :format "%[%v%]\n" :on "t" :off "nil"))))))
+	`(list :args ,rest))))
+  :set (lambda (symbol value)
+	 (prog1
+	     (if (fboundp 'custom-set-default)
+		 (custom-set-default symbol value)
+	       (set-default symbol value))
+	   (if (and (not noninteractive)
+		    (featurep 'develock))
+	       (let (fn flag)
+		 (while value
+		   (setq fn (car value)
+			 flag (car (cdr value))
+			 value (cdr (cdr value)))
+		   (condition-case nil
+		       (if flag
+			   (ad-add-advice fn
+					  (plist-get develock-advice-plist fn)
+					  'around 'first)
+			 (ad-remove-advice fn 'around
+					   'remove-useless-whitespace))
+		     (error)))))))
+  :group 'develock)
+
+(eval-and-compile
+  (or (fboundp 'develock-Orig-lisp-indent-line)
+      (defalias 'develock-Orig-lisp-indent-line
+	;; The genuine function definition of `lisp-indent-line'.
+	(or (ad-real-orig-definition 'lisp-indent-line)
+	    (symbol-function 'lisp-indent-line)))))
+
+(defun develock-lisp-indent-line (&optional whole-exp)
+  "Internal function used to advise some Lisp indent functions."
+  (save-restriction
+    (widen)
+    (let ((st (set-marker (make-marker) (point)))
+	  pt mod orig)
+      (save-excursion
+	(end-of-line)
+	(setq pt (point))
+	(or (zerop (skip-chars-backward "\t "))
+	    (nth 3 (parse-partial-sexp (point-min) (point)))
+	    (delete-region (point) pt)))
+      (if (nth 3 (parse-partial-sexp (point-min) (develock-point-at-bol)))
+	  (develock-Orig-lisp-indent-line whole-exp)
+	(save-excursion
+	  (beginning-of-line)
+	  (or (setq mod (buffer-modified-p))
+	      (setq orig (progn
+			   (looking-at "[\t ]*")
+			   (match-string 0))))
+	  (insert "\n")
+	  (forward-char -1)
+	  (save-restriction
+	    (widen)
+	    (develock-Orig-lisp-indent-line whole-exp))
+	  (if (prog1
+		  (bolp)
+		(delete-char 1)
+		(setq pt (point)))
+	      (set-buffer-modified-p mod)
+	    (or (zerop (skip-chars-forward "\t "))
+		(delete-region pt (point)))
+	    (or mod
+		(progn
+		  (beginning-of-line)
+		  (if (string-equal orig (progn
+					   (looking-at "[\t ]*")
+					   (match-string 0)))
+		      (set-buffer-modified-p nil))))))
+	(goto-char st)
+	(set-marker st nil)
+	(if (bolp) (skip-chars-forward "\t "))))))
+
+(defun develock-Orig-c-indent-line (&optional syntax quiet ignore-point-pos)
+  "This function should be redefined to the genuine `c-indent-line'."
+  (let* ((fn (or (ad-real-orig-definition 'c-indent-line)
+		 (symbol-function 'c-indent-line)))
+	 ;; Checking how many arguments `c-indent-line' accepts.
+	 (nargs (length (ad-arglist fn))))
+    (cond ((= nargs 4)
+	   ;; The genuine function definition of `c-indent-line'.
+	   (defalias 'develock-Orig-c-indent-line fn))
+	  ((= nargs 3)
+	   (defalias 'develock-Orig-c-indent-line
+	     `(lambda (&optional syntax quiet ignore-point-pos) "\
+Identical to `c-indent-line', but the optional argument
+IGNORE-POINT-POS is ignored."
+		(funcall ,fn syntax quiet))))
+	  (t
+	   (defalias 'develock-Orig-c-indent-line
+	     `(lambda (&optional syntax quiet ignore-point-pos) "\
+Identical to `c-indent-line', but the optional arguments QUIET and
+IGNORE-POINT-POS are ignored."
+		(funcall ,fn syntax))))))
+  (if (and (featurep 'bytecomp)
+	   (eq (car-safe (symbol-function 'develock-Orig-c-indent-line))
+	       'lambda))
+      (byte-compile 'develock-Orig-c-indent-line))
+  (develock-Orig-c-indent-line syntax quiet ignore-point-pos))
+
+(eval-when-compile
+  (defvar c-syntactic-indentation))
+
+(eval-and-compile
+  (if (not (fboundp 'c-guess-basic-syntax))
+      (defalias 'c-guess-basic-syntax 'ignore)))
+
+(defun develock-c-indent-line (&optional syntax quiet ignore-point-pos)
+  "Internal function used to advise some C indent functions."
+  (save-restriction
+    (widen)
+    (if (and (or (not (boundp 'c-syntactic-indentation))
+		 c-syntactic-indentation)
+	     (assq 'string (c-guess-basic-syntax)))
+	;; Since this line looks like a continued string, we do nothing
+	;; in the line beginning area.
+	(progn
+	  (if (eq this-command 'c-indent-command)
+	      ;; Except, we remove trailing whitespace when the command
+	      ;; `c-indent-command' is performed.
+	      (save-excursion
+		(end-of-line)
+		(let ((pt (point)))
+		  (or (zerop (skip-chars-backward "\t "))
+		      (delete-region (point) pt)))))
+	  (develock-Orig-c-indent-line syntax quiet ignore-point-pos))
+      (let ((move (string-match "\\`[\t ]*\\'"
+				(buffer-substring (develock-point-at-bol)
+						  (point))))
+	    pt mod orig)
+	(save-excursion
+	  (end-of-line)
+	  (setq pt (point))
+	  (or (zerop (skip-chars-backward "\t "))
+	      (delete-region (point) pt))
+	  (beginning-of-line)
+	  (looking-at "[\t ]*")
+	  (or (setq mod (buffer-modified-p))
+	      (setq orig (match-string 0)))
+	  (if indent-tabs-mode
+	      (tabify (point) (match-end 0))
+	    (untabify (point) (match-end 0)))
+	  (develock-Orig-c-indent-line syntax quiet ignore-point-pos)
+	  (setq pt (point))
+	  (or mod
+	      (progn
+		(beginning-of-line)
+		(if (string-equal orig (progn
+					 (looking-at "[\t ]*")
+					 (match-string 0)))
+		    (set-buffer-modified-p nil)))))
+	(if move
+	    (goto-char pt))))))
+
+(let (current-load-list)
+  (defadvice indent-region (around remove-useless-whitespace
+				   (start end &optional column) activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace in
+Lisp modes, C modes and Java mode.  You can turn off this advice
+permanently by customizing the `develock-energize-functions-plist'
+variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'indent-region)
+	     (memq major-mode '(emacs-lisp-mode
+				lisp-interaction-mode
+				c-mode c++-mode java-mode jde-mode)))
+	(save-excursion
+	  ;; Meddle with out of the region.
+	  (goto-char end)
+	  (while (and (zerop (forward-line 1))
+		      (looking-at "[\t ]+$")))
+	  (let ((to (point))
+		(fn (cdr (assq
+			  major-mode
+			  '((emacs-lisp-mode . develock-lisp-indent-line)
+			    (lisp-interaction-mode . develock-lisp-indent-line)
+			    (c-mode . develock-c-indent-line)
+			    (c++-mode . develock-c-indent-line)
+			    (java-mode . develock-c-indent-line)
+			    (jde-mode . develock-c-indent-line))))))
+	    (goto-char start)
+	    (while (and (zerop (forward-line -1))
+			(or (looking-at "[\t ]+$")
+			    (progn
+			      (forward-line 1)
+			      nil))))
+	    (save-restriction
+	      (if (prog1
+		      (zerop (forward-line -1))
+		    (narrow-to-region (point) to))
+		  (forward-line 1))
+	      (while (not (eobp))
+		(or (eolp)
+		    (progn
+		      (funcall fn)
+		      (if (and (not (bolp))
+			       (eolp))
+			  (delete-region (develock-point-at-bol) (point)))))
+		(forward-line 1)))))
+      ad-do-it))
+
+  (defadvice lisp-indent-line (around remove-useless-whitespace
+				      (&optional whole-exp) activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'lisp-indent-line))
+	(develock-lisp-indent-line whole-exp)
+      ad-do-it))
+
+  (defadvice c-indent-line (around remove-useless-whitespace
+				   (&optional syntax quiet ignore-point-pos)
+				   activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'c-indent-line))
+	(develock-c-indent-line syntax quiet ignore-point-pos)
+      ad-do-it))
+
+  (defadvice newline-and-indent (around remove-useless-whitespace activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace and
+indent appropriately in Lisp modes, C modes and Java mode.  You can
+turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'newline-and-indent))
+	(cond ((memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
+	       (develock-lisp-indent-line))
+	      ((memq major-mode '(c-mode c++-mode java-mode jde-mode))
+	       (develock-c-indent-line))))
+    ad-do-it))
+
+(let ((plist develock-energize-functions-plist)
+      fn flag def)
+  (while plist
+    (setq fn (car plist)
+	  flag (car (cdr plist))
+	  plist (cdr (cdr plist)))
+    (if (setq def (assq 'remove-useless-whitespace
+			(cdr (assq 'around (ad-get-advice-info fn)))))
+	(setq develock-advice-plist (plist-put develock-advice-plist fn def)))
+    (if (not flag)
+	(ad-remove-advice fn 'around 'remove-useless-whitespace))))
+
+(provide 'develock)
+
+;;; develock.el ends here
diff --git a/.pc/0004-Add-Python-mode.patch/develock.el b/.pc/0004-Add-Python-mode.patch/develock.el
new file mode 100644
index 0000000..7fe69af
--- /dev/null
+++ b/.pc/0004-Add-Python-mode.patch/develock.el
@@ -0,0 +1,2146 @@
+;;; develock.el --- additional font-lock keywords for the developers
+
+;; Copyright (C) 2001-2003, 2005-2009, 2012, 2013, 2015
+;; Katsumi Yamaoka
+
+;; Author: Katsumi Yamaoka  <yamaoka@jpl.org>
+;;         Jun'ichi Shiono  <jun@fsas.fujitsu.com>
+;;         Yasutaka SHINDOH <ring-pub@fan.gr.jp>
+;;         Oscar Bonilla    <ob@bitmover.com>
+;; Created: 2001/06/28
+;; Revised: 2015/10/14
+;; Keywords: font-lock emacs-lisp change-log texinfo c java perl html
+;;           tcl ruby mail news groovy
+
+;; Develock 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.
+
+;; Develock 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 Develock; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Develock is a minor mode which provides the ability to make font-
+;; lock highlight leading and trailing whitespace, long lines and
+;; oddities in the file buffer for Lisp modes, ChangeLog mode, Texinfo
+;; mode, C modes, Ocaml modes, Coq mode, Java mode, Jde-mode , CPerl
+;; mode, Perl mode, HTML modes, some Mail modes, Tcl mode, Ruby mode
+;; and Groovy mode.  Here is an example of how to set up your startup
+;; file (possibly .emacs) to use Develock:
+;;
+;;(cond ((featurep 'xemacs)
+;;       (require 'develock)
+;;       ;; `turn-on-develock' is equivalent to `turn-on-font-lock',
+;;       ;;  except that it does not highlight the startup screen.
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-develock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock))
+;;      ((>= emacs-major-version 20)
+;;       (require 'develock)
+;;       (global-font-lock-mode 1)))
+;;
+;; Alternatively, you can use the following to enable font-lock for
+;; each mode individually in Emacs.
+;;
+;;(cond ((featurep 'xemacs)
+;;       (require 'develock)
+;;       ;; `turn-on-develock' is equivalent to `turn-on-font-lock',
+;;       ;;  except that it does not highlight the startup screen.
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-develock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock))
+;;      ((>= emacs-major-version 20)
+;;       (require 'develock)
+;;       (add-hook 'lisp-interaction-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'emacs-lisp-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'change-log-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'texinfo-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'c-mode-common-hook 'turn-on-font-lock)
+;;       (add-hook 'cperl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'perl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'mail-setup-hook 'turn-on-font-lock)
+;;       (add-hook 'java-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'groovy-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'html-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'html-helper-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'message-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'tcl-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'ruby-mode-hook 'turn-on-font-lock)))
+;;
+;; Note that `jde-mode' activates the `font-lock-mode' by default
+;; because of the `jde-use-font-lock' variable.
+;;
+;; Develock will work with Emacs 20.4 and later and XEmacs 21.1 and
+;; later.  Needless to say, you have to install this file as follows:
+;;
+;; # cp -p develock.el /usr/local/share/emacs/site-lisp
+;; # cd /usr/local/share/emacs/site-lisp
+;; # emacs -q -no-site-file -batch -f batch-byte-compile develock.el
+;;
+;; It is recommended that you use the demand-driven fontification tool
+;; (e.g. jit-lock, lazy-shot) together with font-lock.
+;;
+;; You may find latest version of Develock in ftp.jpl.org:/pub/elisp/.
+
+;; Texinfo
+;; =======
+;; The value of `fill-column' for `texinfo-mode' has changed to 70 in
+;; Emacs 21.  However, many texinfo files are written on the condition
+;; that the value is 72.  To against it, Develock provides the
+;; `develock-fill-column-alist' variable which makes it possible to
+;; set the value for `fill-column' automatically.  If Develock is on,
+;; it is set to 72 and also the `auto-fill-mode' is enabled in the
+;; `texinfo-mode' by default.
+;;
+;; Even if you disable it in `develock-fill-column-alist', you can
+;; change the behavior of highlighting if too much highlighting
+;; offends your eyes, as shown below:
+;;
+;;(if (and (not (featurep 'xemacs))
+;;	 (>= emacs-major-version 21))
+;;    (plist-put develock-max-column-plist 'texinfo-mode 72))
+
+;; Ediff
+;; =====
+;; When you run Ediff on the Develock'ed buffers, you may feel
+;; everything is in confusion.  For such a case, the following hooks
+;; may help you see diffs clearly.
+;;
+;;(add-hook
+;; 'ediff-prepare-buffer-hook
+;; (lambda nil
+;;   (if (and (boundp 'font-lock-mode) font-lock-mode
+;;	    (boundp 'develock-mode) develock-mode)
+;;       (progn
+;;	 (develock-mode 0)
+;;	 (set (make-local-variable 'develock-mode-suspended) t)))))
+;;
+;;(add-hook
+;; 'ediff-cleanup-hook
+;; (lambda nil
+;;   (let ((buffers (list ediff-buffer-A ediff-buffer-B ediff-buffer-C)))
+;;     (save-excursion
+;;       (while buffers
+;;	 (if (buffer-live-p (car buffers))
+;;	     (progn
+;;	       (set-buffer (car buffers))
+;;	       (if (and (boundp 'develock-mode-suspended)
+;;			develock-mode-suspended)
+;;		   (progn
+;;		     (develock-mode 1)
+;;		     (makunbound 'develock-mode-suspended)))))
+;;	 (setq buffers (cdr buffers)))))))
+
+;; Wanderlust
+;; ==========
+;; Though Wanderlust does not support font-lock, you may use Develock
+;; for `wl-draft-mode'.  Try to use the following codes in .wl file.
+;;
+;;(require 'develock)
+;;(require 'message)
+;;
+;;(setq wl-highlight-body-too nil)
+;;
+;;(defadvice wl-highlight-headers (around dont-highlight-draft
+;;					(&optional for-draft) activate)
+;;  "Don't highlight draft buffers."
+;;  (or for-draft ad-do-it))
+;;
+;;(defun wl-draft-setup-develock ()
+;;  "Function used to setup to use Develock in `wl-draft-mode'."
+;;  (if (featurep 'xemacs)
+;;      (put 'wl-draft-mode 'font-lock-defaults
+;;	   '(message-font-lock-keywords t))
+;;    (make-local-variable 'font-lock-defaults)
+;;    (setq font-lock-defaults '(message-font-lock-keywords t t)))
+;;  (turn-on-font-lock))
+;;
+;;(add-hook 'wl-mail-setup-hook 'wl-draft-setup-develock)
+;;
+;;(setq develock-max-column-plist
+;;      (plist-put develock-max-column-plist 'wl-draft-mode t))
+;;
+;;(let ((elem (copy-sequence (assq 'message-mode develock-keywords-alist))))
+;;  (setcar elem 'wl-draft-mode)
+;;  (setq develock-keywords-alist
+;;	(cons elem (delq (assq 'wl-draft-mode develock-keywords-alist)
+;;			 develock-keywords-alist))))
+;;
+;; If you feel that highlighting is insufficient in gaudiness,
+;; customize the value of the variable `message-font-lock-keywords' to
+;; make font-lock do what you want it to.
+
+;; Mew
+;; ===
+;; Similarly, you can use Develock for `mew-draft-mode'.  The following
+;; codes are for .mew file.  You will never know unless you try.
+;;
+;;(require 'develock)
+;;(require 'message)
+;;
+;;(defadvice mew-highlight-header-region (around dont-highlight-draft activate)
+;;  "Don't highlight draft buffers."
+;;  (or (eq 'mew-draft-mode major-mode) ad-do-it))
+;;
+;;(defadvice mew-highlight-body-region (around dont-highlight-draft activate)
+;;  "Don't highlight draft buffers."
+;;  (or (eq 'mew-draft-mode major-mode) ad-do-it))
+;;
+;;(defun mew-draft-setup-develock ()
+;;  "Function used to setup to use Develock in `mew-draft-mode'."
+;;  (if (featurep 'xemacs)
+;;      (put 'mew-draft-mode 'font-lock-defaults
+;;	   '(message-font-lock-keywords t))
+;;    (make-local-variable 'font-lock-defaults)
+;;    (setq font-lock-defaults '(message-font-lock-keywords t t)))
+;;  (turn-on-font-lock))
+;;
+;;(add-hook 'mew-draft-mode-hook 'mew-draft-setup-develock)
+;;
+;;(setq develock-max-column-plist
+;;      (plist-put develock-max-column-plist 'mew-draft-mode t))
+;;
+;;(let ((elem (copy-sequence (assq 'message-mode develock-keywords-alist))))
+;;  (setcar elem 'mew-draft-mode)
+;;  (setq develock-keywords-alist
+;;	(cons elem (delq (assq 'mew-draft-mode develock-keywords-alist)
+;;			 develock-keywords-alist))))
+
+;;; Code:
+
+(defconst develock-version "0.47"
+  "Version number for this version of Develock.")
+
+(require 'advice)
+(require 'font-lock)
+
+(defgroup develock nil
+  "A tool for the developers."
+  :group 'development)
+
+(make-variable-buffer-local
+ (defvar develock-mode nil
+   "Internal buffer-local variable used to indicate whether Develock is on."))
+
+(defcustom develock-mode-strings '(" Develock" " Font")
+  "List of identifications used to show whether Develock is on or off.
+Each element should be a string beginning with a space, a null string
+or a symbol with a similar string as its value.  You can use faces for
+each element if you are using Emacs 21 as follows:
+
+\(make-face 'develock-mode)
+\(setq develock-mode-strings
+      (list (propertize \" Develock\"
+			'face '(develock-mode :foreground \"ForestGreen\"))
+	    (propertize \" Font\"
+			'face '(develock-mode :foreground \"DarkGoldenRod\"))))
+\(when (featurep 'develock)
+  (add-minor-mode 'font-lock-mode
+		  (cons 'develock-mode develock-mode-strings)))
+
+Otherwise if you are using XEmacs, you can use a face for all the
+minor mode strings as shown below:
+
+\(copy-face 'modeline 'modeline-mousable-minor-mode)
+\(set-face-foreground 'modeline-mousable-minor-mode \"PaleTurquoise\")
+"
+  :type '(list (sexp :format "On: %v\n" :size 0)
+	       (sexp :format "Off: %v\n" :size 0))
+  :set (lambda (symbol value)
+	 (prog1
+	     (if (fboundp 'custom-set-default)
+		 (custom-set-default symbol value)
+	       (set-default symbol value))
+	   (if (and (not noninteractive)
+		    (featurep 'develock))
+	       (let ((id (cons 'develock-mode value))
+		     mmode)
+		 (if (fboundp 'add-minor-mode)
+		     (add-minor-mode 'font-lock-mode id)
+		   (if (setq mmode (assq 'font-lock-mode minor-mode-alist))
+		       (setcdr mmode (list id))
+		     (setq minor-mode-alist (cons (list 'font-lock-mode id)
+						  minor-mode-alist))))))))
+  :group 'develock
+  :group 'font-lock)
+
+(if (fboundp 'add-minor-mode)
+    (eval-after-load "font-lock"
+      '(add-minor-mode 'font-lock-mode
+		       (cons 'develock-mode develock-mode-strings)))
+  (eval-after-load "font-lock"
+    '(setcdr (assq 'font-lock-mode minor-mode-alist)
+	     (list (cons 'develock-mode develock-mode-strings)))))
+
+(defface develock-whitespace-1
+  '((t (:background "Red")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-whitespace-2
+  '((t (:background "Orange")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-whitespace-3
+  '((t (:background "Yellow")))
+  "Develock face used to highlight whitespace."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-long-line-1
+  '((((background dark))
+     (:foreground "Orange"))
+    (t
+     (:foreground "Red")))
+  "Develock face used to highlight long lines."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-long-line-2
+  '((t (:foreground "Red" :background "Yellow")))
+  "Develock face used to highlight long lines."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-lonely-parentheses
+  '((t (:foreground "Blue" :background "PaleTurquoise")))
+  "Develock face used to highlight lonely parentheses."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-bad-manner
+  '((((background dark))
+     (:foreground "Black" :background "Yellow"))
+    (t
+     (:foreground "Yellow" :background "Black")))
+  "Develock face used to highlight unwanted characters in messages.
+Those might violate the manners of mail messages or news articles."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-upper-case-tag
+  '((((background dark))
+     (:foreground "Black" :background "PowderBlue"))
+    (t
+     (:foreground "Snow" :background "FireBrick")))
+  "Develock face used to highlight upper case character tags."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-upper-case-attribute
+  '((((background dark))
+     (:foreground "Black" :background "Wheat"))
+    (t
+     (:foreground "Snow" :background "ForestGreen")))
+  "Develock face used to highlight upper case character tags."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-reachable-mail-address
+  '((t (:foreground "DarkGreen" :background "LemonChiffon")))
+  "Develock face used to highlight reachable E-mail addresses.
+That would be defenseless to spammers."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defface develock-attention
+  '((((background dark))
+     (:foreground "OrangeRed" :bold t))
+    (t
+     (:foreground "Red" :bold t)))
+  "Develock face used to highlight things to be paid attention."
+  :group 'develock
+  :group 'font-lock-highlighting-faces
+  :group 'font-lock-faces)
+
+(defcustom develock-auto-enable t
+  "If non-nil, turn Develock mode on when font-lock is turned on."
+  :type '(boolean :format "%{%t%}: %[%v%]" :on "On" :off "Off")
+  :group 'develock
+  :group 'font-lock)
+
+(defun develock-refontify-buffers ()
+  "Refontify all Develocked buffers."
+  (interactive)
+  (let ((buffers (buffer-list)))
+    (save-excursion
+      (while buffers
+	(set-buffer (car buffers))
+	(if develock-mode
+	    (let ((develock-auto-enable t))
+	      (font-lock-mode 0)
+	      (font-lock-mode 1)))
+	(setq buffers (cdr buffers))))))
+
+(defun develock-custom-set-and-refontify (symbol value)
+  "Function used to refontify buffers when customizing Develock options."
+  (prog1
+      (if (fboundp 'custom-set-default)
+	  (custom-set-default symbol value)
+	(set-default symbol value))
+    (if (and (not noninteractive)
+	     (featurep 'develock))
+	(develock-refontify-buffers))))
+
+(defcustom develock-max-column-plist
+  (list 'emacs-lisp-mode 79
+	'lisp-interaction-mode 'w
+	'change-log-mode t
+	'texinfo-mode t
+	'c-mode 79
+	'c++-mode 79
+	'java-mode 79
+	'caml-mode 79
+	'tuareg-mode 79
+	'coq-mode 79
+	'latex-mode 79
+	'jde-mode 79
+	'html-mode 79
+	'html-helper-mode 79
+	'cperl-mode 79
+	'perl-mode 79
+	'mail-mode t
+	'message-mode t
+	'cmail-mail-mode t
+	'tcl-mode 79
+	'groovy-mode 79
+	'ruby-mode 79)
+  "Plist of `major-mode's and limitation values for long lines.
+The part of a line that is longer than the limitation value according
+to the `major-mode' is highlighted.  Value `w' means one subtracted
+from the window width.  Value t means the return value of
+`current-fill-column'.  You can inhibit to highlight long lines using
+the value nil."
+  :type '(repeat
+	  (list :indent 2 :inline t :format "%v"
+		(symbol :format "Major-Mode: %v\n" :size 0)
+		(radio :format "Value: %v"
+		       (const :format "Off  " nil)
+		       (const :format "Fill_column  " t)
+		       (const :format "Window_width -1  " w)
+		       (integer :format "Integer: %v\n" :size 0))))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-fill-column-alist
+  '((change-log-mode . 74)
+    (texinfo-mode . 72))
+  "Alist of `major-mode's and the values for `fill-column'.
+When Develock is turned on, `auto-fill-mode' is automatically enabled
+in the buffer where `major-mode' included in this list runs.
+Each value is applied to `fill-column' in the buffer overriding the
+one in the directory-local variables specified in the .dir-locals.el
+file (if any).  If `fill-column' is specified as a local variable and
+is allowed in the buffer, this variable will be made buffer-local and
+the value will be modified."
+  :type '(repeat (cons :format "%v"
+		       (symbol :tag "Major mode")
+		       (integer :tag "Fill column")))
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mode-ignore-kinsoku-list
+  '(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode jde-mode
+		    cperl-mode perl-mode tcl-mode groovy-mode)
+  "List of `major-mode's that ignore kinsoku at the end of lines."
+  :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-inhibit-highlighting-kinsoku-chars nil
+  "If non-nil, inhibit highlighting kinsoku chars at the end of lines.
+It has no effect if the buffer's major-mode is contained in the
+`develock-mode-ignore-kinsoku-list' variable."
+  :type '(boolean :format "%{%t%}: %[%v%]"
+		  :on "Inhibited" :off "Not inhibited")
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mode-ignore-long-message-header-list
+  '(mail-mode message-mode cmail-mail-mode)
+  "List of `major-mode's to stop highlighting long message header lines.
+If this list contains the value of the current `major-mode', there is
+apparently a message header and even if there are long header lines,
+they will not be highlighted by Develock."
+  :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ignored-buffer-name-regexp nil
+  "Regexp matching buffer names that will not be highlighted by Develock.
+If you don't want to perform Develock on the buffer which name begins
+with \"*\" or \" *\" (typically \"*scratch*\"), use the following value:
+
+\(setq develock-ignored-buffer-name-regexp \"^ ?\\\\*[^*]+\\\\*$\")
+
+If you want to inhibit highlighting those buffers also by font-lock,
+try the following advice in your startup file.
+
+\(defadvice font-lock-mode (before dont-turn-on-for-some-buffers
+				  activate)
+  \"Don't turn on font-lock for some buffers which specified by the
+`develock-ignored-buffer-name-regexp' variable.\"
+  (if (and (boundp 'develock-ignored-buffer-name-regexp)
+	   (symbol-value 'develock-ignored-buffer-name-regexp)
+	   (string-match
+	    (symbol-value 'develock-ignored-buffer-name-regexp)
+	    (buffer-name)))
+      (ad-set-arg 0 0)))"
+  :type '(radio (const :format "Omitted " nil)
+		(regexp :format "%t: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ignored-file-name-regexp
+  "\\`\\.newsrc\\(-.+\\)?\\.eld\\'"
+  "Regexp matching file names that will not be highlighted by Develock.
+If you want to inhibit highlighting those files also by font-lock,
+try the following advice in your startup file.
+
+\(defadvice font-lock-mode (before dont-turn-on-for-some-files
+				  activate)
+  \"Don't turn on font-lock for some files which specified by the
+`develock-ignored-file-name-regexp' variable.\"
+  (if (and (boundp 'develock-ignored-file-name-regexp)
+	   (symbol-value 'develock-ignored-file-name-regexp)
+	   buffer-file-name
+	   (string-match
+	    (symbol-value 'develock-ignored-file-name-regexp)
+	    (file-name-nondirectory buffer-file-name)))
+      (ad-set-arg 0 0)))"
+  :type '(radio (const :format "Omitted " nil)
+		(regexp :format "%t: %v\n" :size 0))
+  :set 'develock-custom-set-and-refontify
+  :group 'develock
+  :group 'font-lock)
+
+(eval-and-compile
+  (if (featurep 'xemacs)
+      (progn
+	(defalias 'develock-point-at-bol 'point-at-bol)
+	(defalias 'develock-point-at-eol 'point-at-eol))
+    (defalias 'develock-point-at-bol 'line-beginning-position)
+    (defalias 'develock-point-at-eol 'line-end-position)))
+
+(defvar lisp-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Lisp modes.")
+
+(defvar change-log-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Change Log mode.")
+
+(defvar texinfo-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the TeXinfo mode.")
+
+(defvar c-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the C modes.")
+
+(defvar caml-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Caml mode.")
+
+(defvar tuareg-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Tuareg mode.")
+
+(defvar coq-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Coq mode.")
+
+(defvar latex-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the LaTeX mode.")
+
+(defvar java-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Java mode.")
+
+(defvar cperl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the CPerl mode.")
+
+(defvar perl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Perl mode.")
+
+(defvar mail-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Mail mode.")
+
+(defvar message-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Message mode.")
+
+(defvar cmail-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Cmail mode.")
+
+(defvar html-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the HTML mode.")
+
+(defvar tcl-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Tcl mode.")
+
+(defvar ruby-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Ruby mode.")
+
+(defvar develock-keywords-alist
+  '((emacs-lisp-mode lisp-font-lock-keywords-x
+		     develock-lisp-font-lock-keywords)
+    (lisp-interaction-mode lisp-font-lock-keywords-x
+			   develock-lisp-font-lock-keywords)
+    (change-log-mode change-log-font-lock-keywords-x
+		     develock-change-log-font-lock-keywords)
+    (texinfo-mode texinfo-font-lock-keywords-x
+		  develock-texinfo-font-lock-keywords)
+    (c-mode c-font-lock-keywords-x
+	    develock-c-font-lock-keywords)
+    (c++-mode c-font-lock-keywords-x
+	      develock-c-font-lock-keywords)
+    (caml-mode caml-font-lock-keywords-x
+	      develock-caml-font-lock-keywords)
+    (tuareg-mode tuareg-font-lock-keywords-x
+	      develock-tuareg-font-lock-keywords)
+    (coq-mode coq-font-lock-keywords-x
+	      develock-coq-font-lock-keywords)
+    (latex-mode latex-font-lock-keywords-x
+	      develock-latex-font-lock-keywords)
+    (java-mode java-font-lock-keywords-x
+	       develock-java-font-lock-keywords)
+    (jde-mode java-font-lock-keywords-x
+	      develock-java-font-lock-keywords)
+    (html-mode html-font-lock-keywords-x
+	       develock-html-font-lock-keywords)
+    (html-helper-mode html-font-lock-keywords-x
+		      develock-html-font-lock-keywords)
+    (cperl-mode cperl-font-lock-keywords-x
+		develock-cperl-font-lock-keywords)
+    (perl-mode perl-font-lock-keywords-x
+	       develock-perl-font-lock-keywords)
+    (mail-mode mail-font-lock-keywords-x
+	       develock-mail-font-lock-keywords)
+    (message-mode message-font-lock-keywords-x
+		  develock-mail-font-lock-keywords)
+    (cmail-mail-mode cmail-font-lock-keywords-x
+		     develock-mail-font-lock-keywords)
+    (tcl-mode tcl-font-lock-keywords-x
+	      develock-tcl-font-lock-keywords)
+    (ruby-mode ruby-font-lock-keywords-x
+	       develock-ruby-font-lock-keywords)
+    (groovy-mode java-font-lock-keywords-x
+	       develock-java-font-lock-keywords))
+  "*Alist of keyword symbols for major modes.
+Each element should be triple symbols of the following form:
+
+\(major-mode internal-keywords user-defined-keywords)")
+
+(defvar develock-keywords-custom-type
+  (let* ((args
+	  '(option :format "    %v"
+		   (list :inline t :tag "Args"
+			 (radio :format "  Override: %v"
+				(const :format "%v " nil)
+				(const :format "%v " t)
+				(const :format "%v " keep)
+				(const :format "%v " prepend)
+				(const append))
+			 (boolean :tag "  LaxMatch"))))
+	 (fixed-function
+	  `(list
+	    :convert-widget
+	    (lambda (widget)
+	      `(function
+		:format "  %t: %v\n"
+		:size 0 :value (lambda (limit))
+		,@(if (not (widget-get widget :copy))
+		      ;; Emacs versions prior to 21.4.
+		      '(:match
+			(lambda (widget value) (functionp value))
+			:value-to-internal
+			(lambda (widget value)
+			  (widget-sexp-value-to-internal
+			   widget
+			   (if (and (stringp value)
+				    (string-match "\\`\".*\"\\'" value))
+			       (substring value 1 -1)
+			     value)))))))))
+	 (face-widget
+	  (lambda (prompt)
+	    `(group
+	      :convert-widget (lambda (widget)
+				(apply 'widget-convert (widget-type widget)
+				       (eval (car (widget-get widget :args)))))
+	      (list
+	       '(const :format "" quote)
+	       (append '(face :indent 6 :format)
+		       (if (condition-case nil
+			       (string-match
+				"%{sample%}"
+				(widget-get (get 'face 'widget-type) :format))
+			     (error nil))
+			   (list (concat ,prompt "(%{sample%}) %v\n") :size 0)
+			 (list (concat ,prompt "%[select face%] %v"))))))))
+	 (face1 (funcall face-widget "  %{%t%}: "))
+	 (face2 (funcall face-widget "    %{%t%}: ")))
+    `(repeat
+      (choice
+       :format "%[%t%] %v\n" :indent 0 :tag "Keyword Type"
+       (list :tag "Find Long Lines"
+	     (const :format "  Function: %v\n"
+		    :value develock-find-long-lines)
+	     (group (const :format "" 1)
+		    ,(funcall face-widget "\
+  %t used in a boundary (subexpression #1):\n    ")
+		    ,args)
+	     (group (const :format "" 2)
+		    ,(funcall face-widget "\
+  %t used out of a boundary (subexpression #2):\n    ")
+		    ,args))
+       (list :tag "Find Tabs or Long Spaces"
+	     :sample-face widget-documentation-face
+	     :format "Find Tabs or Long Spaces:
+   %{(If `indent-tabs-mode' is nil, this type highlights tabs.%}\n%v"
+	     (const :sample-face widget-documentation-face
+		    :format "\
+    %{Otherwise, it highlights spaces longer than `tab-width'.)%}
+  Function: %v\n"
+		    :value develock-find-tab-or-long-space)
+	     (group (const :format "" 1)
+		    ,(funcall face-widget "\
+  %t used for tabs before long spaces (subexpression #1):\n    ")
+		    ,args)
+	     (group (const :format "" 2)
+		    ,(funcall face-widget "\
+  %t used for long spaces (subexpression #2):\n    ")
+		    ,args))
+       (list :tag "(REGEXP NUM 'FACE...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (integer :format "  Match Subexpression Number: %v\n"
+		      :size 0)
+	     ,face1
+	     ,args)
+       (list :tag "(FUNCTION NUM 'FACE...)"
+	     ,fixed-function
+	     (integer :format "  Match Subexpression Number: %v\n"
+		      :size 0)
+	     ,face1
+	     ,args)
+       (cons :tag "(REGEXP (NUM 'FACE...) (NUM 'FACE...)...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(CASE_SENSITIVE_REGEXP (NUM 'FACE...)...)"
+	     (group
+	      (const :format "" lambda) (const :format "" (limit))
+	      (group
+	       (const :format "" let) (const :format "" (case-fold-search))
+	       (group
+		(const :format "" re-search-forward)
+		(regexp :format "  %t: %v\n" :size 0)
+		(const :format "" limit) (const :format "" t))))
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(FUNCTION (NUM 'FACE...) (NUM 'FACE...)...)"
+	     ,fixed-function
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    ,face2
+		    ,args)))
+       (cons :tag "(REGEXP (NUM (IF COND 'FACE)...)...)"
+	     (regexp :format "  %t: %v\n" :size 0)
+	     (repeat
+	      :format "%v%i\n" :indent 2
+	      (list :format "\n%v" :indent 0
+		    (integer
+		     :format "    Match Subexpression Number: %v\n"
+		     :size 0)
+		    (group :format "%v"
+			   (const :format "" if)
+			   (sexp :format "    Condition: %v\n" :size 0)
+			   ,face2)
+		    ,args)))
+       (sexp :size 0))))
+  "*Customizing widget for the extraordinary level font-lock keywords.")
+
+(defun develock-keywords-custom-set (symbol value)
+  "Function used to the :set keyword for `develock-*-font-lock-keywords'."
+  (prog1
+      (if (fboundp 'custom-set-default)
+	  (custom-set-default symbol value)
+	(set-default symbol value))
+    (if (and (not noninteractive)
+	     (featurep 'develock))
+	(let ((buffers (buffer-list))
+	      (alist develock-keywords-alist)
+	      modes)
+	  (while alist
+	    (if (eq symbol (nth 2 (car alist)))
+		(setq modes (cons (car (car alist)) modes)))
+	    (setq alist (cdr alist)))
+	  (save-excursion
+	    (while buffers
+	      (set-buffer (car buffers))
+	      (if (memq major-mode modes)
+		  (develock-mode 1))
+	      (setq buffers (cdr buffers))))))))
+
+(defcustom develock-lisp-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; lonely left parentheses or brackets without a comment
+    ("^[\t ]*\\(['`]?[\t ([]*[([]\\)[\t ]*$"
+     1 'develock-lonely-parentheses)
+    ;; lonely right parentheses or brackets
+    ("^[\t ]*\\([]\t )]*[])]\\)\\([\t ;]+\\|[\t ]*$\\)"
+     1 'develock-lonely-parentheses)
+    ;; whitespace after a left parenthesis
+    ("(\\([\t ]+\\)[^\n;]"
+     1 'develock-whitespace-2)
+    ;; whitespace before a right parenthesis
+    ("([^\n]\\([\t ]+\\))"
+     1 'develock-whitespace-2)
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Lisp modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defvar change-log-indent-text)
+
+(defcustom develock-change-log-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 append)
+     (2 'develock-long-line-2 append))
+    ;; an ugly entry line
+    (develock-find-ugly-change-log-entry-line
+     (1 'develock-whitespace-1 nil t)
+     (2 'develock-whitespace-1 t t)
+     (3 'develock-whitespace-1 t t)
+     (4 'develock-whitespace-1 t t)
+     (5 'develock-whitespace-1 t t)
+     (6 'develock-whitespace-1 t t)
+     (7 'develock-whitespace-1 t t)
+     (8 'develock-whitespace-2 t t)
+     (9 'develock-whitespace-1 t t)
+     (10 'develock-whitespace-1 t t)
+     (11 'develock-whitespace-1 t t)
+     (12 'develock-whitespace-1 t t)
+     (13 'develock-whitespace-2 t t)
+     (14 'develock-whitespace-1 t t)
+     (15 'develock-whitespace-1 t t)
+     (16 'develock-whitespace-1 t t))
+    ;; leading spaces
+    ("^\\( +\\)[^\t\n]"
+     (1 'develock-whitespace-3))
+    ;; leading 2 or more tabs
+    ("^\\([\t ][\t ]+\\)[^\t\n]"
+     ;; Improved by NISHIYAMA-san; cf. [Elips: 0005541].
+     (1 (if (and (eq (char-after (develock-point-at-bol)) ?\t)
+		 (not (= (- (match-end 1) (match-beginning 1) 1)
+			 change-log-indent-text)))
+	    'develock-whitespace-2)))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; tabs or 2 or more spaces in the log line
+    ("[^\t\n ]\\(\t[\t ]*\\|  +\\)[^\t ]"
+     (1 (if (and (memq (char-after (develock-point-at-bol)) '(?\t ?\ ))
+		 (not (string-equal ".  "
+				    (buffer-substring (1- (match-beginning 1))
+						      (match-end 1)))))
+	    'develock-whitespace-2)
+	prepend))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)\\([\t ]*\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 append)
+     (3 'develock-whitespace-2 append t))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; whitespace between a file name and a colon
+    ("^\t\\* [^\t\n ]+\\( (.+)\\)?\\([\t ]+\\):"
+     (2 'develock-whitespace-1 t)))
+  "Extraordinary level highlighting for the Change Log mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-texinfo-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; tabs
+    ("\t+"
+     (0 'develock-whitespace-1 append))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the TeXinfo mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-c-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the C modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-caml-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Caml mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-tuareg-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Tuareg mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-coq-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Coq mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-latex-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the LaTeX mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-java-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Java mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-html-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; using upper case tag
+    ((lambda (limit)
+       (let (case-fold-search)
+	 (re-search-forward "</?\\([A-Z]+\\)" limit t)))
+     (1 'develock-upper-case-tag t))
+    ;; using upper case attribute
+    ((lambda (limit)
+       (let (case-fold-search)
+	 (re-search-forward "<[a-zA-Z]+[\t ]+\\([A-Z]+\\)[\t ]*=" limit t)))
+     (1 'develock-upper-case-attribute t)))
+  "Extraordinary level highlighting for the HTML mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-cperl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the CPerl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-perl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Perl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-mail-font-lock-keywords
+  `(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ,(if (featurep 'mule)
+	 ;; Japanese hankaku katakana
+	 '("\\ck+" (0 'develock-bad-manner t))))
+  "Extraordinary level highlighting for the Mail modes."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-tcl-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Tcl mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-ruby-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Ruby mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defmacro develock-find-font-lock-defaults (modesym)
+  "Get the font-lock defaults based on the major mode."
+  (if (featurep 'xemacs)
+      `(let ((defaults (or font-lock-defaults
+			   (font-lock-find-font-lock-defaults ,modesym))))
+	 (if (not (consp (car defaults)))
+	     (setcar defaults (list (car defaults))))
+	 defaults)
+    `(let ((defaults
+	     (or font-lock-defaults
+		 (cdr (assq ,modesym
+			    (symbol-value 'font-lock-defaults-alist))))))
+       (cons (if (consp (car defaults))
+		 (copy-sequence (car defaults))
+	       (list (car defaults)))
+	     (copy-sequence (cdr defaults))))))
+
+(defmacro develock-set-defaults (defaults form)
+  "Set fontification defaults appropriately for the current `major-mode'."
+  (if (featurep 'xemacs)
+      `(progn
+	 (setq font-lock-defaults-computed nil
+	       font-lock-keywords nil)
+	 ,form)
+    `(progn
+       (set (make-local-variable 'font-lock-defaults) ,defaults)
+       (setq font-lock-set-defaults nil)
+       ,form)))
+
+(defvar develock-inhibit-advice-font-lock-set-defaults nil
+  "Non-nil means inhibit advising of the `font-lock-set-defaults' function.
+In XEmacs, it is the `font-lock-set-defaults-1' function instead.
+It will be set to t when the function is called recursively by itself.
+Users should never modify the value.")
+
+(defvar develock-original-fill-configuration nil
+  "Internal variable used to save `fill-column' and `auto-fill-mode'.
+It becomes buffer-local in the buffer in which Develock is on, and
+keeps the values as a cons cell before Develock is turned on.")
+
+(if (boundp 'file-local-variables-alist)
+    ;; Emacs >=23
+    (progn
+      (defadvice hack-dir-local-variables (after
+					   hack-file-local-variables-alist
+					   activate)
+	"Advised by Develock.
+Remove `fill-column' element from `file-local-variables-alist' if
+`develock-fill-column-alist' specifies it.  Also remove dir-local
+`indent-tabs-mode' element for the Lisp modes since there should be
+no rational reason to force it."
+	(if develock-mode
+	    (progn
+	      (if (cdr (assq major-mode develock-fill-column-alist))
+		  (setq file-local-variables-alist
+			(delq (assq 'fill-column file-local-variables-alist)
+			      file-local-variables-alist)))
+	      (if (memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
+		  (setq file-local-variables-alist
+			(delq (assq 'indent-tabs-mode
+				    file-local-variables-alist)
+			      file-local-variables-alist))))))
+      (defadvice hack-local-variables (after hack-file-local-variables-alist
+					     activate)
+	"Advised by Develock.
+Merge `fill-column' local variable into `develock-fill-column-alist'."
+	(let (old new)
+	  (and develock-mode
+	       (setq old (assq major-mode develock-fill-column-alist))
+	       (setq new (assq 'fill-column file-local-variables-alist))
+	       (not (eq (cdr old) (cdr new)))
+	       (progn
+		 (set (make-local-variable 'develock-fill-column-alist)
+		      (copy-sequence develock-fill-column-alist))
+		 (setcar (memq (assq major-mode develock-fill-column-alist)
+			       develock-fill-column-alist)
+			 (cons major-mode (cdr new)))
+		 (setcar develock-original-fill-configuration (cdr new)))))))
+  ;; Emacs 22 or earlier
+  (defadvice hack-local-variables (around develock-allow-local-variables
+					  activate)
+    "Advised by Develock.
+Merge `fill-column' local variable into `develock-fill-column-alist'."
+    (let ((fc fill-column))
+      ad-do-it
+      (if (and (assq major-mode develock-fill-column-alist)
+	       (not (eq fc fill-column)))
+	  (progn
+	    (set (make-local-variable 'develock-fill-column-alist)
+		 (copy-sequence develock-fill-column-alist))
+	    (setcar (memq (assq major-mode develock-fill-column-alist)
+			  develock-fill-column-alist)
+		    (cons major-mode fill-column))
+	    (setcar develock-original-fill-configuration fill-column))))))
+
+(let (current-load-list)
+  (eval
+   `(defadvice ,(if (featurep 'xemacs)
+		    'font-lock-set-defaults-1
+		  'font-lock-set-defaults)
+      (around energize-font-lock-keywords activate)
+      "Advised by Develock.
+Energize font-lock keywords for extraordinary level highlighting."
+      (if develock-inhibit-advice-font-lock-set-defaults
+	  ad-do-it
+	(let ((develock-inhibit-advice-font-lock-set-defaults t)
+	      (def (cdr (assq major-mode develock-keywords-alist))))
+	  (if def
+	      (let* ((defaults (develock-find-font-lock-defaults major-mode))
+		     (keywords (delq (car def) (car defaults)))
+		     (max-decor (nth (1- (length keywords)) keywords))
+		     (oldmode develock-mode)
+		     (font-lock-maximum-decoration
+		      font-lock-maximum-decoration))
+		(setq develock-mode
+		      (and (not (and
+				 develock-ignored-buffer-name-regexp
+				 (string-match
+				  develock-ignored-buffer-name-regexp
+				  (buffer-name))))
+			   (not (and
+				 buffer-file-name
+				 develock-ignored-file-name-regexp
+				 (string-match
+				  develock-ignored-file-name-regexp
+				  (file-name-nondirectory buffer-file-name))))
+			   develock-auto-enable))
+		(if develock-mode
+		    (let (fc)
+		      (setq font-lock-maximum-decoration t)
+		      (set (car def)
+			   (append (if (fboundp max-decor)
+				       (funcall max-decor)
+				     (symbol-value max-decor))
+				   (symbol-value (car (cdr def)))))
+		      (setcdr (nthcdr (1- (length keywords)) keywords)
+			      (list (car def)))
+		      (if (and (not oldmode)
+			       (setq fc
+				     (cdr (assq major-mode
+						develock-fill-column-alist))))
+			  (progn
+			    (set (make-local-variable
+				  'develock-original-fill-configuration)
+				 (cons (current-fill-column)
+				       (and auto-fill-function t)))
+			    (setq fill-column fc)
+			    (auto-fill-mode 1)))))
+		(setcar defaults keywords)
+		(develock-set-defaults defaults ad-do-it))
+	    ad-do-it))))))
+
+(if (featurep 'xemacs)
+    ;; Highlight def* forms even if they aren't started from the
+    ;; beginning of the line.
+    (let ((def (car (car lisp-font-lock-keywords-1))))
+      (if (and (stringp def)
+	       (string-match "^\\^\\((\\\\(def\\)" def))
+	  (setcar (car lisp-font-lock-keywords-1)
+		  (replace-match "^[\t ]*\\1" nil nil def))))
+  (defadvice font-lock-add-keywords (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+  (defadvice font-lock-remove-keywords (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+
+  ;; Those functions call `font-lock-set-defaults' in Emacs 22.
+  (defadvice font-lock-fontify-buffer (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it))
+  (defadvice font-lock-fontify-region (around inhibit-develock activate)
+    "Run `font-lock-set-defaults' being not advised by Develock."
+    (let ((develock-inhibit-advice-font-lock-set-defaults t))
+      ad-do-it)))
+
+(defmacro develock-max-column ()
+  "Return the maximum column number from which lines won't be highlighted."
+  '(let ((value (plist-get develock-max-column-plist major-mode)))
+     (cond ((natnump value)
+	    value)
+	   ((eq 'w value)
+	    (1- (window-width)))
+	   ((eq t value)
+	    (current-fill-column)))))
+
+(eval-and-compile
+  (or (fboundp 'kinsoku-bol-p)
+      (fboundp 'kinsoku-longer)
+      (load "kinsoku" t t)))
+
+(defmacro develock-kinsoku-longer ()
+  "Try to leap over the kinsoku characters.  Return t if leaping is done."
+  (cond ((featurep 'xemacs)
+	 (if (fboundp 'kinsoku-bol-p)
+	     '(let (done)
+		(while (and (not (eolp))
+			    (kinsoku-bol-p))
+		  (setq done t)
+		  (forward-char 1))
+		done)))
+	((fboundp 'kinsoku-longer)
+	 '(if enable-kinsoku
+	      (let (done)
+		(while (and (not (eolp))
+			    (aref (char-category-set (following-char)) ?>))
+		  (setq done t)
+		  (forward-char 1))
+		done)))))
+
+(defun develock-find-long-lines (limit)
+  "Function used to find a long line between the point and LIMIT.
+If a long line is found, it returns non-nil and sets the `match-data'
+#0, #1 and #2 with the beginning and the end positions to be
+highlighted.  This function is affected by the values of
+`develock-max-column-plist',
+`develock-mode-ignore-long-message-header-list' and
+`develock-inhibit-highlighting-kinsoku-chars'."
+  (let ((max-column (develock-max-column))
+	start inhibit end)
+    (if (and
+	 max-column
+	 (progn
+	   (if (memq major-mode
+		     develock-mode-ignore-long-message-header-list)
+	       (save-restriction
+		 (widen)
+		 (setq start (point))
+		 (goto-char (point-min))
+		 (if (or (not (re-search-forward
+			       (concat "^\\("
+				       (regexp-quote mail-header-separator)
+				       "\\)?$")
+			       nil t))
+			 (> start (match-end 0)))
+		     (goto-char start))
+		 (setq start nil)))
+	   (while (and (not start)
+		       (< (point) limit))
+	     (if (or (and (not (eolp))
+			  (> (current-column) max-column))
+		     (and (or (not (eolp))
+			      (zerop (forward-line 1)))
+			  (progn
+			    (while (progn
+				     (end-of-line)
+				     (and (<= (point) limit)
+					  (<= (current-column) max-column)
+					  (zerop (forward-line 1)))))
+			    (> (move-to-column (1+ max-column)) max-column))))
+		 (progn
+		   (if (> (move-to-column max-column) max-column)
+		       (forward-char -1))
+		   (setq start (min (point) limit))
+		   (if (memq major-mode develock-mode-ignore-kinsoku-list)
+		       nil
+		     (setq inhibit
+			   (and (develock-kinsoku-longer)
+				develock-inhibit-highlighting-kinsoku-chars
+				(eolp)))
+		     (if (> (point) limit)
+			 (goto-char limit))))
+	       (forward-line 1)))
+	   start)
+	 (< start limit))
+	(if inhibit
+	    (progn
+	      (goto-char (min (develock-point-at-eol) limit))
+	      nil)
+	  (setq start (point-marker)
+		end (set-marker (make-marker)
+				(min (develock-point-at-eol) limit)))
+	  (or (memq (char-after) '(?\t ?\ ))
+	      (skip-chars-backward "0-9A-Za-z"))
+	  (if (> (current-column) max-column)
+	      (if (> (move-to-column max-column) max-column)
+		  (forward-char -1)))
+	  (let ((mk (point-marker)))
+	    (store-match-data (list mk end mk start start end)))
+	  (goto-char end)))))
+
+(defun develock-find-tab-or-long-space (limit)
+  "Find tabs or a long space between the point and LIMIT.
+If `indent-tabs-mode' is nil, this function highlights tabs.
+Otherwise, it highlights spaces longer than `tab-width'.  It returns
+non-nil and sets beginning and ending points as the `match-data' #0,
+#1 and #2."
+  (re-search-forward (if indent-tabs-mode
+			 (concat "\\(\t*\\)\\("
+				 (make-string tab-width ?\ )
+				 "+\\)")
+		       "\\(\t+\\)")
+		     limit t))
+
+(defun develock-find-ugly-change-log-entry-line (limit)
+  "Find an ugly entry line between the point and LIMIT in ChangeLog file."
+  (and (re-search-forward
+	(eval-when-compile
+	  (concat
+	   ;; 1. leading whitespace
+	   "^\\([\t ]+\\)?"
+	   ;; -- timestamp in various styles -->
+	   "\\(?:[12][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]\\(?:\\(?: \\|"
+	   ;; 2. abnormal whitespace between YYYY-MM-DD and HH:MM:SS
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[012][0-9]:[0-5][0-9]:[0-5][0-9]\\)?\
+\\|\\(?:Sun\\|Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\)\\(?: \\|"
+	   ;; 3. abnormal whitespace before month name
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)\
+\\(?:Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\)\
+\\(?: \\|"
+	   ;; 4. abnormal whitespace between month name and day number
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[ 0-3][0-9]\\(?: \\|"
+	   ;; 5. abnormal whitespace between day number and HH:MM:SS
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[012][0-9]:[0-5][0-9]:[0-5][0-9]\\(?: \\|"
+	   ;; 6. abnormal whitespace between HH:MM:SS and YYYY
+	   "\\(  +\\|\t[\t ]*\\)"
+	   "\\)[12][0-9][0-9][0-9]\\)"
+	   ;; <-- timestamp in various styles --
+
+	   "\\(?:  \\|"
+	   ;; 7. abnormal whitespace between time stamp and author's name
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)"
+	   ;; -- author's name --
+	   "\\(?:[^\t <>]+\\(?: [^\t <>]+\\)*\\|"
+	   ;; 8. abnormal whitespace within names
+	   "\\([^\t <>]+\\(?: [^\t <>]+\\)*\\(?:\\(?:  +\\|\t[\t ]*\\)\
+[^\t <>]+\\)+\\(?: [^\t <>]+\\)*\\)"
+	   "\\)\\(?:\\(?:  \\|"
+	   ;; 9. abnormal whitespace between author's name and e-mail address
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)<\\|"
+	   ;; 10. no space between author's name and e-mail address
+	   "\\(<\\)"
+	   "\\)"
+	   ;; 11. unwanted whitespace between < and e-mail address
+	   "\\([\t ]+\\)?"
+	   "\\(?:"
+	   ;; -- e-mail address --
+	   "[^\t <>]+"
+	   ;; 12. unwanted whitespace between e-mail address and >
+	   "\\([\t ]+\\)?"
+	   ">\\|"
+	   ;; 13. whitespace in the middle of e-mail address
+	   "\\([^\t <>]+\\(?:[\t ]+[^\t <>]+\\)+\\)"
+	   ;; 14. unwanted whitespace between e-mail address and >
+	   "\\([\t ]+\\)?"
+	   ">\\)"
+	   ;; -- a supplement e.g., (tiny change) --
+	   "\\(?:\\(?:  \\|"
+	   ;; 15. abnormal whitespace between e-mail address and supplement
+	   "\\( \\|   +\\|\t[\t ]*\\)"
+	   "\\)\(\\|"
+	   ;; 16. trailing garbage
+	   "\\([^\n ].*\\)"
+	   "\\)?"))
+	limit t)
+       (prog2
+	   (goto-char (match-beginning 0))
+	   (or (not (zerop (forward-line -1)))
+	       (save-match-data (looking-at "[\t ]*$")))
+	 (goto-char (match-end 0)))))
+
+(eval-when-compile
+  (defvar file-local-variables-alist)
+  (defvar lisp-interaction-mode-hook)
+  (if (not (fboundp 'hack-dir-local-variables))
+      (defalias 'hack-dir-local-variables 'ignore)))
+
+(eval-when-compile
+  (defmacro develock-called-interactively-p (kind)
+    (if (fboundp 'called-interactively-p)
+	`(called-interactively-p ,kind)
+      '(interactive-p))))
+
+;;;###autoload
+(defun develock-mode (arg)
+  "Toggle Develock mode.
+With ARG, turn Develock on if and only if ARG is positive.
+In Develock mode, highlighting leading and trailing whitespace,
+long lines and oddities."
+  (interactive "P")
+  (if (assq major-mode develock-keywords-alist)
+      (progn
+	(cond ((and (not develock-mode)
+		    develock-ignored-buffer-name-regexp
+		    (string-match develock-ignored-buffer-name-regexp
+				  (buffer-name)))
+	       (if (develock-called-interactively-p 'any)
+		   (message "Develock is inhibited for this buffer")))
+	      ((and (not develock-mode)
+		    buffer-file-name
+		    develock-ignored-file-name-regexp
+		    (string-match develock-ignored-file-name-regexp
+				  (file-name-nondirectory buffer-file-name)))
+	       (if (develock-called-interactively-p 'any)
+		   (message "Develock is inhibited for this file")))
+	      (t
+	       (let ((oldmode develock-mode)
+		     fc)
+		 (setq develock-mode (if (numberp arg)
+					 (> arg 0)
+				       (if font-lock-mode
+					   (not develock-mode)
+					 t)))
+		 (if develock-mode
+		     (if (and (not oldmode)
+			      (setq fc (cdr (assq
+					     major-mode
+					     develock-fill-column-alist))))
+			 (progn
+			   (set (make-local-variable
+				 'develock-original-fill-configuration)
+				(cons (current-fill-column)
+				      (and auto-fill-function t)))
+			   (setq fill-column fc)
+			   (auto-fill-mode 1)))
+		   (if (and oldmode
+			    (local-variable-p
+			     'develock-original-fill-configuration
+			     (current-buffer))
+			    (car develock-original-fill-configuration))
+		       (progn
+			 (setq fill-column
+			       (car develock-original-fill-configuration))
+			 (auto-fill-mode
+			  (if (cdr develock-original-fill-configuration)
+			      1
+			    0))))))
+	       (if font-lock-mode
+		   (progn
+		     (font-lock-mode 0)
+		     (let ((develock-auto-enable develock-mode))
+		       (font-lock-mode 1)))
+		 (if develock-mode
+		     (let ((develock-auto-enable t))
+		       (font-lock-mode 1))))))
+	(condition-case nil
+	    (progn
+	      (hack-dir-local-variables)
+	      (if develock-mode
+		  (setq indent-tabs-mode (default-value 'indent-tabs-mode))
+		(if (assq 'indent-tabs-mode file-local-variables-alist)
+		    (setq indent-tabs-mode
+			  (cdr (assq 'indent-tabs-mode
+				     file-local-variables-alist))))))
+	  (error)))
+    (error "Develock does not support `%s'" major-mode)))
+
+;;;###autoload
+(defun turn-on-develock ()
+  "Turn on font-lock after splashing the startup screen under XEmacs.
+This function is used for `lisp-interaction-mode-hook' exclusively."
+  (if (and (boundp 'inhibit-warning-display)
+	   (symbol-value 'inhibit-warning-display))
+      (add-hook 'pre-command-hook 'turn-on-develock)
+    (let ((hooks (cond ((consp lisp-interaction-mode-hook)
+			(memq 'turn-on-develock lisp-interaction-mode-hook))
+		       ((eq 'turn-on-develock lisp-interaction-mode-hook)
+			(setq lisp-interaction-mode-hook
+			      '(turn-on-develock))))))
+      (if hooks
+	  (setcar hooks 'turn-on-font-lock)))
+    (if (and (consp pre-command-hook)
+	     (memq 'turn-on-develock pre-command-hook))
+	(save-excursion
+	  (remove-hook 'pre-command-hook 'turn-on-develock)
+	  (let ((buffers (buffer-list)))
+	    (while buffers
+	      (set-buffer (car buffers))
+	      (if (eq 'lisp-interaction-mode major-mode)
+		  (font-lock-set-defaults))
+	      (setq buffers (cdr buffers)))))
+      (font-lock-set-defaults))))
+
+
+;; The following functions are useful to make source codes clean.
+
+(defvar develock-advice-plist nil
+  "Internal variable used to keep advice definitions.")
+
+(defcustom develock-energize-functions-plist
+  '(indent-region t lisp-indent-line t c-indent-line t newline-and-indent nil)
+  "Plist of commands and flags; command is advised when flag is non-nil.
+When command is advised, it removes useless whitespace."
+  :type
+  '(list
+    :convert-widget
+    (lambda (widget)
+      "This function generates the following type of a widget:
+\(list (group :inline t
+	     (const :format \"-SPACES-%v: \" FUNCTION)
+	     (boolean :format \"%[%v%]\\n\" :on \"t\" :off \"nil\"))
+      [...])"
+      (let ((value (default-value 'develock-energize-functions-plist))
+	    (maxlen 0)
+	    fn rest)
+	(while value
+	  (setq fn (car value)
+		value (nthcdr 2 value)
+		rest (nconc rest (list fn))
+		maxlen (max (length (symbol-name fn)) maxlen)))
+	(setq value rest
+	      rest nil)
+	(while value
+	  (setq fn (car value)
+		value (cdr value)
+		rest (nconc
+		      rest
+		      `((group
+			 :inline t
+			 (const :format
+				,(concat (make-string
+					  (- maxlen (length (symbol-name fn)))
+					  ?\ )
+					 "%v: ")
+				,fn)
+			 (boolean :format "%[%v%]\n" :on "t" :off "nil"))))))
+	`(list :args ,rest))))
+  :set (lambda (symbol value)
+	 (prog1
+	     (if (fboundp 'custom-set-default)
+		 (custom-set-default symbol value)
+	       (set-default symbol value))
+	   (if (and (not noninteractive)
+		    (featurep 'develock))
+	       (let (fn flag)
+		 (while value
+		   (setq fn (car value)
+			 flag (car (cdr value))
+			 value (cdr (cdr value)))
+		   (condition-case nil
+		       (if flag
+			   (ad-add-advice fn
+					  (plist-get develock-advice-plist fn)
+					  'around 'first)
+			 (ad-remove-advice fn 'around
+					   'remove-useless-whitespace))
+		     (error)))))))
+  :group 'develock)
+
+(eval-and-compile
+  (or (fboundp 'develock-Orig-lisp-indent-line)
+      (defalias 'develock-Orig-lisp-indent-line
+	;; The genuine function definition of `lisp-indent-line'.
+	(or (ad-real-orig-definition 'lisp-indent-line)
+	    (symbol-function 'lisp-indent-line)))))
+
+(defun develock-lisp-indent-line (&optional whole-exp)
+  "Internal function used to advise some Lisp indent functions."
+  (save-restriction
+    (widen)
+    (let ((st (set-marker (make-marker) (point)))
+	  pt mod orig)
+      (save-excursion
+	(end-of-line)
+	(setq pt (point))
+	(or (zerop (skip-chars-backward "\t "))
+	    (nth 3 (parse-partial-sexp (point-min) (point)))
+	    (delete-region (point) pt)))
+      (if (nth 3 (parse-partial-sexp (point-min) (develock-point-at-bol)))
+	  (develock-Orig-lisp-indent-line whole-exp)
+	(save-excursion
+	  (beginning-of-line)
+	  (or (setq mod (buffer-modified-p))
+	      (setq orig (progn
+			   (looking-at "[\t ]*")
+			   (match-string 0))))
+	  (insert "\n")
+	  (forward-char -1)
+	  (save-restriction
+	    (widen)
+	    (develock-Orig-lisp-indent-line whole-exp))
+	  (if (prog1
+		  (bolp)
+		(delete-char 1)
+		(setq pt (point)))
+	      (set-buffer-modified-p mod)
+	    (or (zerop (skip-chars-forward "\t "))
+		(delete-region pt (point)))
+	    (or mod
+		(progn
+		  (beginning-of-line)
+		  (if (string-equal orig (progn
+					   (looking-at "[\t ]*")
+					   (match-string 0)))
+		      (set-buffer-modified-p nil))))))
+	(goto-char st)
+	(set-marker st nil)
+	(if (bolp) (skip-chars-forward "\t "))))))
+
+(defun develock-Orig-c-indent-line (&optional syntax quiet ignore-point-pos)
+  "This function should be redefined to the genuine `c-indent-line'."
+  (let* ((fn (or (ad-real-orig-definition 'c-indent-line)
+		 (symbol-function 'c-indent-line)))
+	 ;; Checking how many arguments `c-indent-line' accepts.
+	 (nargs (length (ad-arglist fn))))
+    (cond ((= nargs 4)
+	   ;; The genuine function definition of `c-indent-line'.
+	   (defalias 'develock-Orig-c-indent-line fn))
+	  ((= nargs 3)
+	   (defalias 'develock-Orig-c-indent-line
+	     `(lambda (&optional syntax quiet ignore-point-pos) "\
+Identical to `c-indent-line', but the optional argument
+IGNORE-POINT-POS is ignored."
+		(funcall ,fn syntax quiet))))
+	  (t
+	   (defalias 'develock-Orig-c-indent-line
+	     `(lambda (&optional syntax quiet ignore-point-pos) "\
+Identical to `c-indent-line', but the optional arguments QUIET and
+IGNORE-POINT-POS are ignored."
+		(funcall ,fn syntax))))))
+  (if (and (featurep 'bytecomp)
+	   (eq (car-safe (symbol-function 'develock-Orig-c-indent-line))
+	       'lambda))
+      (byte-compile 'develock-Orig-c-indent-line))
+  (develock-Orig-c-indent-line syntax quiet ignore-point-pos))
+
+(eval-when-compile
+  (defvar c-syntactic-indentation))
+
+(eval-and-compile
+  (if (not (fboundp 'c-guess-basic-syntax))
+      (defalias 'c-guess-basic-syntax 'ignore)))
+
+(defun develock-c-indent-line (&optional syntax quiet ignore-point-pos)
+  "Internal function used to advise some C indent functions."
+  (save-restriction
+    (widen)
+    (if (and (or (not (boundp 'c-syntactic-indentation))
+		 c-syntactic-indentation)
+	     (assq 'string (c-guess-basic-syntax)))
+	;; Since this line looks like a continued string, we do nothing
+	;; in the line beginning area.
+	(progn
+	  (if (eq this-command 'c-indent-command)
+	      ;; Except, we remove trailing whitespace when the command
+	      ;; `c-indent-command' is performed.
+	      (save-excursion
+		(end-of-line)
+		(let ((pt (point)))
+		  (or (zerop (skip-chars-backward "\t "))
+		      (delete-region (point) pt)))))
+	  (develock-Orig-c-indent-line syntax quiet ignore-point-pos))
+      (let ((move (string-match "\\`[\t ]*\\'"
+				(buffer-substring (develock-point-at-bol)
+						  (point))))
+	    pt mod orig)
+	(save-excursion
+	  (end-of-line)
+	  (setq pt (point))
+	  (or (zerop (skip-chars-backward "\t "))
+	      (delete-region (point) pt))
+	  (beginning-of-line)
+	  (looking-at "[\t ]*")
+	  (or (setq mod (buffer-modified-p))
+	      (setq orig (match-string 0)))
+	  (if indent-tabs-mode
+	      (tabify (point) (match-end 0))
+	    (untabify (point) (match-end 0)))
+	  (develock-Orig-c-indent-line syntax quiet ignore-point-pos)
+	  (setq pt (point))
+	  (or mod
+	      (progn
+		(beginning-of-line)
+		(if (string-equal orig (progn
+					 (looking-at "[\t ]*")
+					 (match-string 0)))
+		    (set-buffer-modified-p nil)))))
+	(if move
+	    (goto-char pt))))))
+
+(let (current-load-list)
+  (defadvice indent-region (around remove-useless-whitespace
+				   (start end &optional column) activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace in
+Lisp modes, C modes, Java mode and Groovy mode.  You can turn off this advice
+permanently by customizing the `develock-energize-functions-plist'
+variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'indent-region)
+	     (memq major-mode '(emacs-lisp-mode
+				lisp-interaction-mode
+				c-mode c++-mode
+				java-mode jde-mode groovy-mode)))
+	(save-excursion
+	  ;; Meddle with out of the region.
+	  (goto-char end)
+	  (while (and (zerop (forward-line 1))
+		      (looking-at "[\t ]+$")))
+	  (let ((to (point))
+		(fn (cdr (assq
+			  major-mode
+			  '((emacs-lisp-mode . develock-lisp-indent-line)
+			    (lisp-interaction-mode . develock-lisp-indent-line)
+			    (c-mode . develock-c-indent-line)
+			    (c++-mode . develock-c-indent-line)
+			    (java-mode . develock-c-indent-line)
+			    (jde-mode . develock-c-indent-line)
+			    (groovy-mode . develock-c-indent-line))))))
+	    (goto-char start)
+	    (while (and (zerop (forward-line -1))
+			(or (looking-at "[\t ]+$")
+			    (progn
+			      (forward-line 1)
+			      nil))))
+	    (save-restriction
+	      (if (prog1
+		      (zerop (forward-line -1))
+		    (narrow-to-region (point) to))
+		  (forward-line 1))
+	      (while (not (eobp))
+		(or (eolp)
+		    (progn
+		      (funcall fn)
+		      (if (and (not (bolp))
+			       (eolp))
+			  (delete-region (develock-point-at-bol) (point)))))
+		(forward-line 1)))))
+      ad-do-it))
+
+  (defadvice lisp-indent-line (around remove-useless-whitespace
+				      (&optional whole-exp) activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'lisp-indent-line))
+	(develock-lisp-indent-line whole-exp)
+      ad-do-it))
+
+  (defadvice c-indent-line (around remove-useless-whitespace
+				   (&optional syntax quiet ignore-point-pos)
+				   activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'c-indent-line))
+	(develock-c-indent-line syntax quiet ignore-point-pos)
+      ad-do-it))
+
+  (defadvice newline-and-indent (around remove-useless-whitespace activate)
+    "Advised by Develock.
+If Develock is on, remove useless leading and trailing whitespace and
+indent appropriately in Lisp modes, C modes, Java mode and Groovy mode.
+You can turn off this advice permanently by customizing the
+`develock-energize-functions-plist' variable."
+    (if (and develock-mode font-lock-mode
+	     (plist-get develock-energize-functions-plist 'newline-and-indent))
+	(cond ((memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
+	       (develock-lisp-indent-line))
+	      ((memq major-mode '(c-mode c++-mode
+					 java-mode jde-mode groovy-mode))
+	       (develock-c-indent-line))))
+    ad-do-it))
+
+(let ((plist develock-energize-functions-plist)
+      fn flag def)
+  (while plist
+    (setq fn (car plist)
+	  flag (car (cdr plist))
+	  plist (cdr (cdr plist)))
+    (if (setq def (assq 'remove-useless-whitespace
+			(cdr (assq 'around (ad-get-advice-info fn)))))
+	(setq develock-advice-plist (plist-put develock-advice-plist fn def)))
+    (if (not flag)
+	(ad-remove-advice fn 'around 'remove-useless-whitespace))))
+
+(provide 'develock)
+
+;;; develock.el ends here
diff --git a/.pc/applied-patches b/.pc/applied-patches
new file mode 100644
index 0000000..6e4b7c2
--- /dev/null
+++ b/.pc/applied-patches
@@ -0,0 +1,4 @@
+0001-More-modes.patch
+0002-advising-indent-region-with-correct-prototype.patch
+0003-Add-groovy-mode.patch
+0004-Add-Python-mode.patch
diff --git a/debian/changelog b/debian/changelog
index c6ac56e..39550fa 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+develock-el (0.47-3.1) unstable; urgency=medium
+
+  * Non maintainer upload by the Reproducible Builds team.
+  * No source change upload to rebuild on buildd with .buildinfo files.
+
+ -- Holger Levsen <holger@debian.org>  Sun, 03 Jan 2021 17:31:51 +0100
+
 develock-el (0.47-3) unstable; urgency=medium
 
   * Add Python mode (Closes: #771469)
diff --git a/develock.el b/develock.el
index 17f2d17..11c850d 100644
--- a/develock.el
+++ b/develock.el
@@ -10,7 +10,7 @@
 ;; Created: 2001/06/28
 ;; Revised: 2015/10/14
 ;; Keywords: font-lock emacs-lisp change-log texinfo c java perl html
-;;           tcl ruby mail news
+;;           tcl ruby mail news groovy
 
 ;; Develock is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
@@ -32,10 +32,10 @@
 ;; Develock is a minor mode which provides the ability to make font-
 ;; lock highlight leading and trailing whitespace, long lines and
 ;; oddities in the file buffer for Lisp modes, ChangeLog mode, Texinfo
-;; mode, C modes, Java mode, Jde-mode , CPerl mode, Perl mode, HTML
-;; modes, some Mail modes, Tcl mode and Ruby mode.  Here is an example
-;; of how to set up your startup file (possibly .emacs) to use
-;; Develock:
+;; mode, C modes, Ocaml modes, Coq mode, Java mode, Jde-mode , CPerl
+;; mode, Perl mode, Python modes, HTML modes, some Mail modes, Tcl
+;; mode, Ruby mode and Groovy mode.  Here is an example of how to set
+;; up your startup file (possibly .emacs) to use Develock:
 ;;
 ;;(cond ((featurep 'xemacs)
 ;;       (require 'develock)
@@ -67,6 +67,7 @@
 ;;       (add-hook 'perl-mode-hook 'turn-on-font-lock)
 ;;       (add-hook 'mail-setup-hook 'turn-on-font-lock)
 ;;       (add-hook 'java-mode-hook 'turn-on-font-lock)
+;;       (add-hook 'groovy-mode-hook 'turn-on-font-lock)
 ;;       (add-hook 'html-mode-hook 'turn-on-font-lock)
 ;;       (add-hook 'html-helper-mode-hook 'turn-on-font-lock)
 ;;       (add-hook 'message-mode-hook 'turn-on-font-lock)
@@ -409,15 +410,21 @@ That would be defenseless to spammers."
 	'c-mode 79
 	'c++-mode 79
 	'java-mode 79
+	'caml-mode 79
+	'tuareg-mode 79
+	'coq-mode 79
+	'latex-mode 79
 	'jde-mode 79
 	'html-mode 79
 	'html-helper-mode 79
 	'cperl-mode 79
 	'perl-mode 79
+	'python-mode 79
 	'mail-mode t
 	'message-mode t
 	'cmail-mail-mode t
 	'tcl-mode 79
+	'groovy-mode 79
 	'ruby-mode 79)
   "Plist of `major-mode's and limitation values for long lines.
 The part of a line that is longer than the limitation value according
@@ -456,7 +463,7 @@ the value will be modified."
 
 (defcustom develock-mode-ignore-kinsoku-list
   '(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode jde-mode
-		    cperl-mode perl-mode tcl-mode)
+		    cperl-mode perl-mode tcl-mode groovy-mode)
   "List of `major-mode's that ignore kinsoku at the end of lines."
   :type '(repeat (symbol :format "Major-Mode: %v\n" :size 0))
   :set 'develock-custom-set-and-refontify
@@ -553,6 +560,18 @@ try the following advice in your startup file.
 (defvar c-font-lock-keywords-x nil
   "Extraordinary level font-lock keywords for the C modes.")
 
+(defvar caml-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Caml mode.")
+
+(defvar tuareg-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Tuareg mode.")
+
+(defvar coq-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Coq mode.")
+
+(defvar latex-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the LaTeX mode.")
+
 (defvar java-font-lock-keywords-x nil
   "Extraordinary level font-lock keywords for the Java mode.")
 
@@ -562,6 +581,9 @@ try the following advice in your startup file.
 (defvar perl-font-lock-keywords-x nil
   "Extraordinary level font-lock keywords for the Perl mode.")
 
+(defvar python-font-lock-keywords-x nil
+  "Extraordinary level font-lock keywords for the Python mode.")
+
 (defvar mail-font-lock-keywords-x nil
   "Extraordinary level font-lock keywords for the Mail mode.")
 
@@ -593,6 +615,14 @@ try the following advice in your startup file.
 	    develock-c-font-lock-keywords)
     (c++-mode c-font-lock-keywords-x
 	      develock-c-font-lock-keywords)
+    (caml-mode caml-font-lock-keywords-x
+	      develock-caml-font-lock-keywords)
+    (tuareg-mode tuareg-font-lock-keywords-x
+	      develock-tuareg-font-lock-keywords)
+    (coq-mode coq-font-lock-keywords-x
+	      develock-coq-font-lock-keywords)
+    (latex-mode latex-font-lock-keywords-x
+	      develock-latex-font-lock-keywords)
     (java-mode java-font-lock-keywords-x
 	       develock-java-font-lock-keywords)
     (jde-mode java-font-lock-keywords-x
@@ -605,6 +635,8 @@ try the following advice in your startup file.
 		develock-cperl-font-lock-keywords)
     (perl-mode perl-font-lock-keywords-x
 	       develock-perl-font-lock-keywords)
+    (python-mode python-font-lock-keywords-x
+	      develock-python-font-lock-keywords)
     (mail-mode mail-font-lock-keywords-x
 	       develock-mail-font-lock-keywords)
     (message-mode message-font-lock-keywords-x
@@ -614,7 +646,9 @@ try the following advice in your startup file.
     (tcl-mode tcl-font-lock-keywords-x
 	      develock-tcl-font-lock-keywords)
     (ruby-mode ruby-font-lock-keywords-x
-	       develock-ruby-font-lock-keywords))
+	       develock-ruby-font-lock-keywords)
+    (groovy-mode java-font-lock-keywords-x
+	       develock-java-font-lock-keywords))
   "*Alist of keyword symbols for major modes.
 Each element should be triple symbols of the following form:
 
@@ -959,6 +993,142 @@ Each element should be triple symbols of the following form:
   :group 'develock
   :group 'font-lock)
 
+(defcustom develock-caml-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Caml mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-tuareg-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Tuareg mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-coq-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Coq mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
+(defcustom develock-latex-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the LaTeX mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
 (defcustom develock-java-font-lock-keywords
   '(;; a long line
     (develock-find-long-lines
@@ -1198,6 +1368,40 @@ Each element should be triple symbols of the following form:
   :group 'develock
   :group 'font-lock)
 
+(defcustom develock-python-font-lock-keywords
+  '(;; a long line
+    (develock-find-long-lines
+     (1 'develock-long-line-1 t)
+     (2 'develock-long-line-2 t))
+    ;; long spaces
+    (develock-find-tab-or-long-space
+     (1 'develock-whitespace-2)
+     (2 'develock-whitespace-3 nil t))
+    ;; trailing whitespace
+    ("[^\t\n ]\\([\t ]+\\)$"
+     (1 'develock-whitespace-1 t))
+    ;; spaces before tabs
+    ("\\( +\\)\\(\t+\\)"
+     (1 'develock-whitespace-1 t)
+     (2 'develock-whitespace-2 t))
+    ;; tab space tab
+    ("\\(\t\\) \t"
+     (1 'develock-whitespace-2 append))
+    ;; only tabs or spaces in the line
+    ("^[\t ]+$"
+     (0 'develock-whitespace-2 append))
+    ;; reachable E-mail addresses
+    ("<?[-+.0-9A-Z_a-z]+@[-0-9A-Z_a-z]+\\(\\.[-0-9A-Z_a-z]+\\)+>?"
+     (0 'develock-reachable-mail-address t))
+    ;; things to be paid attention
+    ("\\<\\(?:[Ff][Ii][Xx][Mm][Ee]\\|[Tt][Oo][Dd][Oo]\\)\\(?::\\|\\>\\)"
+     (0 'develock-attention t)))
+  "Extraordinary level highlighting for the Python mode."
+  :type develock-keywords-custom-type
+  :set 'develock-keywords-custom-set
+  :group 'develock
+  :group 'font-lock)
+
 (defmacro develock-find-font-lock-defaults (modesym)
   "Get the font-lock defaults based on the major mode."
   (if (featurep 'xemacs)
@@ -1879,17 +2083,18 @@ IGNORE-POINT-POS are ignored."
 
 (let (current-load-list)
   (defadvice indent-region (around remove-useless-whitespace
-				   (start end column) activate)
+				   (start end &optional column) activate)
     "Advised by Develock.
 If Develock is on, remove useless leading and trailing whitespace in
-Lisp modes, C modes and Java mode.  You can turn off this advice
+Lisp modes, C modes, Java mode and Groovy mode.  You can turn off this advice
 permanently by customizing the `develock-energize-functions-plist'
 variable."
     (if (and develock-mode font-lock-mode
 	     (plist-get develock-energize-functions-plist 'indent-region)
 	     (memq major-mode '(emacs-lisp-mode
 				lisp-interaction-mode
-				c-mode c++-mode java-mode jde-mode)))
+				c-mode c++-mode
+				java-mode jde-mode groovy-mode)))
 	(save-excursion
 	  ;; Meddle with out of the region.
 	  (goto-char end)
@@ -1903,7 +2108,8 @@ variable."
 			    (c-mode . develock-c-indent-line)
 			    (c++-mode . develock-c-indent-line)
 			    (java-mode . develock-c-indent-line)
-			    (jde-mode . develock-c-indent-line))))))
+			    (jde-mode . develock-c-indent-line)
+			    (groovy-mode . develock-c-indent-line))))))
 	    (goto-char start)
 	    (while (and (zerop (forward-line -1))
 			(or (looking-at "[\t ]+$")
@@ -1951,14 +2157,15 @@ You can turn off this advice permanently by customizing the
   (defadvice newline-and-indent (around remove-useless-whitespace activate)
     "Advised by Develock.
 If Develock is on, remove useless leading and trailing whitespace and
-indent appropriately in Lisp modes, C modes and Java mode.  You can
-turn off this advice permanently by customizing the
+indent appropriately in Lisp modes, C modes, Java mode and Groovy mode.
+You can turn off this advice permanently by customizing the
 `develock-energize-functions-plist' variable."
     (if (and develock-mode font-lock-mode
 	     (plist-get develock-energize-functions-plist 'newline-and-indent))
 	(cond ((memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
 	       (develock-lisp-indent-line))
-	      ((memq major-mode '(c-mode c++-mode java-mode jde-mode))
+	      ((memq major-mode '(c-mode c++-mode
+					 java-mode jde-mode groovy-mode))
 	       (develock-c-indent-line))))
     ad-do-it))
 

Debdiff

File lists identical (after any substitutions)

No differences were encountered in the control files

Run locally

More details

Full run details