-;;; -*-emacs-lisp-*-
+;;; -*- mode: emacs-lisp; coding: utf-8 -*-
;;;
;;; $Id$
;;;
;;; it under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 2 of the License, or
;;; (at your option) any later version.
-;;;
+;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
-;;;
+;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program; if not, write to the Free Software Foundation,
;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+;;;----- Check command-line -------------------------------------------------
+
+(defvar mdw-fast-startup nil
+ "Whether .emacs should optimize for rapid startup.
+This may be at the expense of cool features.")
+(let ((probe nil) (next command-line-args))
+ (message "probe = %s" probe)
+ (message "next = %s" next)
+ (while next
+ (cond ((string= (car next) "--mdw-fast-startup")
+ (setq mdw-fast-startup t)
+ (if probe
+ (rplacd probe (cdr next))
+ (setq command-line-args (cdr next))))
+ (t
+ (setq probe next)))
+ (setq next (cdr next))))
+
;;;----- Some general utilities ---------------------------------------------
+(evan-when-compile (or (fboundp 'make-regexp)
+ (load "make-regexp")))
+
+(defmacro mdw-regexps (&rest list)
+ "Turn a LIST of strings into a single regular expression at compile-time."
+ (make-regexp list))
+
;; --- Some error trapping ---
;;
;; If individual bits of this file go tits-up, we don't particularly want
"Execute FORMS without allowing errors to propagate outside."
`(condition-case err
,(if (cdr forms) (cons 'progn forms) (car forms))
- (error (message "Error (trapped): %s" (error-message-string err)))))
+ (error (message "Error (trapped): %s in %s"
+ (error-message-string err)
+ ',forms))))
;; --- Configuration reading ---
(concat "(" (buffer-string) ")"))))))
(cdr (assq sym mdw-config)))
+;; --- Is an Emacs library available? ---
+
+(defun library-exists-p (name)
+ "Return non-nil if NAME.el (or NAME.elc) is somewhere on the Emacs load
+path. The non-nil value is the filename we found for the library."
+ (let ((path load-path) elt (foundp nil))
+ (while (and path (not foundp))
+ (setq elt (car path))
+ (setq path (cdr path))
+ (setq foundp (or (let ((file (concat elt "/" name ".elc")))
+ (and (file-exists-p file) file))
+ (let ((file (concat elt "/" name ".el")))
+ (and (file-exists-p file) file)))))
+ foundp))
+
+(defun maybe-autoload (symbol file &optional docstring interactivep type)
+ "Set an autoload if the file actually exists."
+ (and (library-exists-p file)
+ (autoload symbol file docstring interactivep type)))
+
;; --- Splitting windows ---
-(defconst mdw-scrollbar-width (if window-system 6 1)
- "Guessed width of scroll bar.")
+(or (and (fboundp 'scroll-bar-columns)
+ (fboundp 'fringe-columns))
+ (progn
+ (defun scroll-bar-columns (side)
+ (cond ((eq side 'left) 0)
+ (window-system 3)
+ (t 1)))
+ (defun fringe-columns (side)
+ (cond ((not window-system) 0)
+ ((eq side 'left) 1)
+ (t 2)))))
+
(defun mdw-divvy-window (&optional w)
"Split a wide window into appropriate widths."
(interactive)
- (or w (setq w 78))
- (let ((win (selected-window))
- (c (/ (+ (window-width) mdw-scrollbar-width)
- (+ w mdw-scrollbar-width))))
+ (or w (setq w (if (and window-system
+ (>= emacs-major-version 22))
+ 77
+ 78)))
+ (let* ((win (selected-window))
+ (sb-width (if (not window-system)
+ 1
+ (+ (scroll-bar-columns 'left)
+ (scroll-bar-columns 'right)
+ (fringe-columns 'left)
+ (fringe-columns 'right))))
+ (c (/ (+ (window-width) sb-width)
+ (+ w sb-width))))
(while (> c 1)
(setq c (1- c))
- (split-window-horizontally (+ w mdw-scrollbar-width))
+ (split-window-horizontally (+ w sb-width))
(other-window 1))
(select-window win)))
;;;----- Utility functions --------------------------------------------------
+(or (fboundp 'line-number-at-pos)
+ (defun line-number-at-pos (&optional pos)
+ (let ((opoint (or pos (point))) start)
+ (save-excursion
+ (save-restriction
+ (goto-char (point-min))
+ (widen)
+ (forward-line 0)
+ (setq start (point))
+ (goto-char opoint)
+ (forward-line 0)
+ (1+ (count-lines 1 (point))))))))
+
;; --- mdw-uniquify-alist ---
(defun mdw-uniquify-alist (&rest alists)
(interactive)
(save-excursion
(or arg (progn
- (goto-char (point-max))
+ (goto-char (point-max))
(insert "\nNP: ")
- (insert-file np-file)))))
-
-(trap
- (require 'tramp)
- (require 'autorevert)
- (defun mdw-check-autorevert ()
- (if (and (buffer-file-name)
- (tramp-tramp-file-p (buffer-file-name)))
- (unless global-auto-revert-ignore-buffer
- (setq global-auto-revert-ignore-buffer 'tramp))
- (if (eq global-auto-revert-ignore-buffer 'tramp)
- (setq global-auto-revert-ignore-buffer nil))))
- (defadvice find-file (after mdw-autorevert activate)
- (mdw-check-autorevert))
- (defadvice write-file (after mdw-autorevert activate)
- (mdw-check-autorevert)))
+ (insert-file np-file)))))
+
+(defun mdw-check-autorevert ()
+ "Sets global-auto-revert-ignore-buffer appropriately for this buffer,
+taking into consideration whether it's been found using tramp, which seems to
+get itself into a twist."
+ (cond ((and (buffer-file-name)
+ (tramp-tramp-file-p (buffer-file-name)))
+ (unless global-auto-revert-ignore-buffer
+ (setq global-auto-revert-ignore-buffer 'tramp)))
+ ((eq global-auto-revert-ignore-buffer 'tramp)
+ (setq global-auto-revert-ignore-buffer nil))))
+
+(defadvice find-file (after mdw-autorevert activate)
+ (mdw-check-autorevert))
+(defadvice write-file (after mdw-autorevert activate)
+ (mdw-check-autorevert)))
(defun mdwmail-mode ()
"Major mode for editing news and mail messages from external programs
(perform-replace "\n-- \n" "\n-- " nil nil nil)))
(add-hook 'mail-setup-hook 'mdwmail-mangle-signature)
+;;;----- URL viewing --------------------------------------------------------
+
+(defun mdw-w3m-browse-url (url &optional new-session-p)
+ "Invoke w3m on the URL in its current window, or at least a different one.
+If NEW-SESSION-P, start a new session."
+ (interactive "sURL: \nP")
+ (save-excursion
+ (let ((window (selected-window)))
+ (unwind-protect
+ (progn
+ (select-window (or (and (not new-session-p)
+ (get-buffer-window "*w3m*"))
+ (progn
+ (if (one-window-p t) (split-window))
+ (get-lru-window))))
+ (w3m-browse-url url new-session-p))
+ (select-window window)))))
+
+(defvar mdw-good-url-browsers
+ '((w3m . mdw-w3m-browse-url)
+ browse-url-w3
+ browse-url-mozilla)
+ "List of good browsers for mdw-good-url-browsers; each item is a browser
+function name, or a cons (CHECK . FUNC). A symbol FOO stands for (FOO
+. FOO).")
+
+(defun mdw-good-url-browser ()
+ "Return a good URL browser. Trundle the list of such things, finding the
+first item for which CHECK is fboundp, and returning the correponding FUNC."
+ (let ((bs mdw-good-url-browsers) b check func answer)
+ (while (and bs (not answer))
+ (setq b (car bs)
+ bs (cdr bs))
+ (if (consp b)
+ (setq check (car b) func (cdr b))
+ (setq check b func b))
+ (if (fboundp check)
+ (setq answer func)))
+ answer))
+
;;;----- Paragraph filling --------------------------------------------------
;; --- Useful variables ---
(and mdw-auto-indent
(cond ((eq major-mode 'lisp-mode)
(local-set-key "\C-m" 'mdw-indent-newline-and-indent))
- ((eq major-mode 'slime-repl-mode) nil)
+ ((or (eq major-mode 'slime-repl-mode)
+ (eq major-mode 'asm-mode))
+ nil)
(t
(local-set-key "\C-m" 'newline-and-indent))))
(local-set-key [C-return] 'newline)
- (local-set-key [?\;] 'self-insert-command)
+ (or (eq major-mode 'asm-mode)
+ (local-set-key [?\;] 'self-insert-command))
(local-set-key [?\#] 'self-insert-command)
(local-set-key [?\"] 'self-insert-command)
(setq comment-column 40)
(auto-fill-mode 1)
(setq fill-column 77)
+ (setq show-trailing-whitespace t)
(mdw-set-font))
;; --- Set up all sorts of faces ---
;;;----- General fontification ----------------------------------------------
-(defun mdw-set-fonts (frame ff)
- (if ff (progn (set-face-attribute (caar ff) frame
- :family 'unspecified
- :width 'unspecified
- :height 'unspecified
- :weight 'unspecified
- :slant 'unspecified
- :foreground 'unspecified
- :background 'unspecified
- :underline 'unspecified
- :overline 'unspecified
- :strike-through 'unspecified
- :box 'unspecified
- :inverse-video 'unspecified
- :stipple 'unspecified
-; :font 'unspecified
- :inherit 'unspecified
- )
- (apply 'set-face-attribute (caar ff) frame (cdar ff))
- (mdw-set-fonts frame (cdr ff)))))
+(defun mdw-set-fonts (frame faces)
+ (while faces
+ (let ((face (caar faces)))
+ (or (facep face) (make-face face))
+ (set-face-attribute face frame
+ :family 'unspecified
+ :width 'unspecified
+ :height 'unspecified
+ :weight 'unspecified
+ :slant 'unspecified
+ :foreground 'unspecified
+ :background 'unspecified
+ :underline 'unspecified
+ :overline 'unspecified
+ :strike-through 'unspecified
+ :box 'unspecified
+ :inverse-video 'unspecified
+ :stipple 'unspecified
+ ;:font 'unspecified
+ :inherit 'unspecified)
+ (apply 'set-face-attribute face frame (cdar faces))
+ (setq faces (cdr faces)))))
(defun mdw-do-set-font (&optional frame)
(interactive)
,@(cond ((eq window-system 'w32)
'(:family "courier new" :height 85))
((eq window-system 'x)
- '(:family "misc-fixed" :width semi-condensed))))
- (modeline :foreground "blue" :background "yellow"
- :box (:line-width 1 :style released-button))
+ '(:family "misc-fixed" :height 130 :width semi-condensed))))
+ (fixed-pitch)
+ (minibuffer-prompt)
+ (mode-line :foreground "blue" :background "yellow"
+ :box (:line-width 1 :style released-button))
+ (mode-line-inactive :foreground "yellow" :background "blue"
+ :box (:line-width 1 :style released-button))
(scroll-bar :foreground "black" :background "lightgrey")
- (fringe :foreground "yellow" :background "grey30")
+ (fringe :foreground "yellow" :background "black")
(show-paren-match-face :background "darkgreen")
(show-paren-mismatch-face :background "red")
(font-lock-warning-face :background "red" :weight bold)
(mdw-number-face :foreground "yellow")
(font-lock-function-name-face :weight bold)
(font-lock-variable-name-face :slant italic)
+ (font-lock-comment-delimiter-face
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :slant italic)
(font-lock-comment-face
:foreground ,(if window-system "SeaGreen1" "green")
:slant italic)
(font-lock-reference-face :weight bold)
(woman-bold-face :weight bold)
(woman-italic-face :slant italic)
- (diff-header-face :foreground "skyblue1")
- (diff-index-face :weight bold)
- (diff-file-header-face)
- (diff-context-face :foreground "grey70")
- (diff-added-face :foreground "white")
- (diff-removed-face :foreground "white" :slant italic)
+ (diff-index :weight bold)
+ (diff-file-header :weight bold)
+ (diff-hunk-header :foreground "SkyBlue1")
+ (diff-function :foreground "SkyBlue1" :weight bold)
+ (diff-header :background "grey10")
+ (diff-added :foreground "green")
+ (diff-removed :foreground "red")
+ (diff-context)
(whizzy-slice-face :background "grey10")
(whizzy-error-face :background "darkred")
+ (trailing-whitespace :background "red")
)))
(defun mdw-set-font ()
(label . 0)
(case-label . +)
(access-label . -)
- (inclass . ++)
+ (inclass . +)
(inline-open . ++)
(statement-cont . 0)
(statement-case-intro . +)))
(setq c-hanging-comment-ender-p nil)
(setq c-backslash-column 72)
(setq c-label-minimum-indentation 0)
- (setq comment-start "/* ")
- (setq comment-end " */")
(setq mdw-fill-prefix
`((,(concat "\\([ \t]*/?\\)"
"\\([\*/][ \t]*\\)"
;; --- Now define things to be fontified ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((c-keywords
- (make-regexp '(
- ;; "and" ;C++
- ;; "and_eq" ;C++
+ (mdw-regexps '(
+ "and" ;C++
+ "and_eq" ;C++
"asm" ;K&R, GCC
"auto" ;K&R, C89
- ;; "bitand" ;C++
- ;; "bitor" ;C++
+ "bitand" ;C++
+ "bitor" ;C++
"bool" ;C++, C9X macro
"break" ;K&R, C89
"case" ;K&R, C89
"char" ;K&R, C89
"class" ;C++
"complex" ;C9X macro, C++ template type
- ;; "compl" ;C++
+ "compl" ;C++
"const" ;C89
"const_cast" ;C++
"continue" ;K&R, C89
;; "entry" ;K&R -- never used
"enum" ;C89
"explicit" ;C++
- ;; "export" ;C++
+ "export" ;C++
"extern" ;K&R, C89
"false" ;C++, C9X macro
"float" ;K&R, C89
"for" ;K&R, C89
- "fortran" ;K&R
+ ;; "fortran" ;K&R
"friend" ;C++
"goto" ;K&R, C89
"if" ;K&R, C89
"namespace" ;C++
"new" ;C++
"operator" ;C++
- ;; "or" ;C++
- ;; "or_eq" ;C++
+ "or" ;C++
+ "or_eq" ;C++
"private" ;C++
"protected" ;C++
"public" ;C++
"volatile" ;C89
"wchar_t" ;C++, C89 library type
"while" ;K&R, C89
- ;; "xor" ;C++
- ;; "xor_eq" ;C++
+ "xor" ;C++
+ "xor_eq" ;C++
"_Bool" ;C9X
"_Complex" ;C9X
"_Imaginary" ;C9X
"__volatile__" ;GCC
)))
(preprocessor-keywords
- (make-regexp '("assert" "define" "elif" "else" "endif" "error"
+ (mdw-regexps '("assert" "define" "elif" "else" "endif" "error"
"ident" "if" "ifdef" "ifndef" "import" "include"
"line" "pragma" "unassert" "undef" "warning")))
(objc-keywords
- (make-regexp '("class" "defs" "encode" "end" "implementation"
+ (mdw-regexps '("class" "defs" "encode" "end" "implementation"
"interface" "private" "protected" "protocol" "public"
"selector"))))
(setq font-lock-keywords
(list
- 't
;; --- Fontify include files as strings ---
;; --- Now define things to be fontified ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((c-keywords
- (make-regexp '("break" "case" "cd" "continue" "define" "default"
+ (mdw-regexps '("break" "case" "cd" "continue" "define" "default"
"do" "else" "exit" "for" "global" "goto" "help" "if"
"local" "mat" "obj" "print" "quit" "read" "return"
"show" "static" "switch" "while" "write"))))
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
;; --- Now define things to be fontified ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((java-keywords
- (make-regexp '("abstract" "boolean" "break" "byte" "case" "catch"
+ (mdw-regexps '("abstract" "boolean" "break" "byte" "case" "catch"
"char" "class" "const" "continue" "default" "do"
"double" "else" "extends" "final" "finally" "float"
"for" "goto" "if" "implements" "import" "instanceof"
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+;;;----- C# programming configuration ---------------------------------------
+
+;; --- Make indentation nice ---
+
+(defun mdw-csharp-style ()
+ (c-add-style "[mdw] C# style"
+ '((c-basic-offset . 2)
+ (c-tab-always-indent . nil)
+ (c-offsets-alist (substatement-open . 0)
+ (label . 0)
+ (case-label . +)
+ (access-label . 0)
+ (inclass . +)
+ (statement-case-intro . +)))
+ t))
+
+;; --- Declare C# fontification style ---
+
+(defun mdw-fontify-csharp ()
+
+ ;; --- Other stuff ---
+
+ (mdw-csharp-style)
+ (modify-syntax-entry ?_ "w")
+ (setq c-hanging-comment-ender-p nil)
+ (setq c-backslash-column 72)
+ (setq comment-start "/* ")
+ (setq comment-end " */")
+ (setq mdw-fill-prefix
+ `((,(concat "\\([ \t]*/?\\)"
+ "\\([\*/][ \t]*\\)"
+ "\\([A-Za-z]+:[ \t]*\\)?"
+ mdw-hanging-indents)
+ (pad . 1) (match . 2) (pad . 3) (pad . 4))))
+
+ ;; --- Now define things to be fontified ---
+
+ (make-local-variable 'font-lock-keywords)
+ (let ((csharp-keywords
+ (mdw-regexps '("abstract" "as" "base" "bool" "break"
+ "byte" "case" "catch" "char" "checked"
+ "class" "const" "continue" "decimal" "default"
+ "delegate" "do" "double" "else" "enum"
+ "event" "explicit" "extern" "false" "finally"
+ "fixed" "float" "for" "foreach" "goto"
+ "if" "implicit" "in" "int" "interface"
+ "internal" "is" "lock" "long" "namespace"
+ "new" "null" "object" "operator" "out"
+ "override" "params" "private" "protected" "public"
+ "readonly" "ref" "return" "sbyte" "sealed"
+ "short" "sizeof" "stackalloc" "static" "string"
+ "struct" "switch" "this" "throw" "true"
+ "try" "typeof" "uint" "ulong" "unchecked"
+ "unsafe" "ushort" "using" "virtual" "void"
+ "volatile" "while" "yield"))))
+
+ (setq font-lock-keywords
+ (list
+
+ ;; --- Handle the keywords defined above ---
+
+ (list (concat "\\<\\(" csharp-keywords "\\)\\>")
+ '(0 font-lock-keyword-face))
+
+ ;; --- Handle numbers too ---
+ ;;
+ ;; The following isn't quite right, but it's close enough.
+
+ (list (concat "\\<\\("
+ "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
+ "[0-9]+\\(\\.[0-9]*\\|\\)"
+ "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
+ "[lLfFdD]?")
+ '(0 mdw-number-face))
+
+ ;; --- And anything else is punctuation ---
+
+ (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+ '(0 mdw-punct-face))))))
+
+(defun csharp-mode ()
+ (interactive)
+ (java-mode)
+ (setq major-mode 'csharp-mode)
+ (setq mode-name "C#")
+ (mdw-fontify-csharp)
+ (run-hooks 'csharp-mode-hook))
+
;;;----- Awk programming configuration --------------------------------------
;; --- Make Awk indentation nice ---
;; --- Now define things to be fontified ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((c-keywords
- (make-regexp '("BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
+ (mdw-regexps '("BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
"ENVIRON" "ERRNO" "FIELDWIDTHS" "FILENAME" "FNR"
"FS" "IGNORECASE" "NF" "NR" "OFMT" "OFS" "ORS" "RS"
"RSTART" "RLENGTH" "RT" "SUBSEP"
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
;; --- Now define fontification things ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((perl-keywords
- (make-regexp '("and" "cmp" "continue" "do" "else" "elsif" "eq"
+ (mdw-regexps '("and" "cmp" "continue" "do" "else" "elsif" "eq"
"for" "foreach" "ge" "gt" "goto" "if"
"last" "le" "lt" "local" "my" "ne" "next" "or"
"package" "redo" "require" "return" "sub"
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
;; --- Define Python fontification style ---
-(trap (require 'pyrex-mode))
(defun mdw-fontify-python ()
;; --- Miscellaneous fiddling ---
;; --- Now define fontification things ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((python-keywords
- (make-regexp '("and" "as" "assert" "break" "class" "continue" "def"
+ (mdw-regexps '("and" "as" "assert" "break" "class" "continue" "def"
"del" "elif" "else" "except" "exec" "finally" "for"
"from" "global" "if" "import" "in" "is" "lambda"
"not" "or" "pass" "print" "raise" "return" "try"
"while" "yield"))))
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
;; --- Fiddle with fontification ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
;; --- Handle numbers too ---
;;
(run-hooks 'arm-assembler-mode-hook))
+;;;----- Assembler mode -----------------------------------------------------
+
+(defun mdw-fontify-asm ()
+ (modify-syntax-entry ?' "\"")
+ (modify-syntax-entry ?. "w")
+ (setf fill-prefix nil)
+ (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)"))
+
;;;----- TCL configuration --------------------------------------------------
(defun mdw-fontify-tcl ()
(mapcar #'(lambda (ch) (modify-syntax-entry ch ".")) '(?$))
(mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
(list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
"\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
"\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
(setq rexx-tab-always-indent nil)
(setq rexx-cont-indent rexx-indent)
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((rexx-keywords
- (make-regexp '("address" "arg" "by" "call" "digits" "do" "drop"
+ (mdw-regexps '("address" "arg" "by" "call" "digits" "do" "drop"
"else" "end" "engineering" "exit" "expose" "for"
"forever" "form" "fuzz" "if" "interpret" "iterate"
"leave" "linein" "name" "nop" "numeric" "off" "on"
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
;; --- Now define fontification things ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((sml-keywords
- (make-regexp '("abstype" "and" "andalso" "as"
+ (mdw-regexps '("abstype" "and" "andalso" "as"
"case"
"datatype" "do"
"else" "end" "eqtype" "exception"
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
(list (concat "\\<\\(\\~\\|\\)"
"\\(0\\(\\([wW]\\|\\)[xX][0-9a-fA-F]+\\|"
- "[wW][0-9]+\\)\\|"
- "\\([0-9]+\\(\\.[0-9]+\\|\\)"
- "\\([eE]\\(\\~\\|\\)"
- "[0-9]+\\|\\)\\)\\)")
+ "[wW][0-9]+\\)\\|"
+ "\\([0-9]+\\(\\.[0-9]+\\|\\)"
+ "\\([eE]\\(\\~\\|\\)"
+ "[0-9]+\\|\\)\\)\\)")
'(0 mdw-number-face))
;; --- And anything else is punctuation ---
;; --- Fiddle with fontification ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(let ((haskell-keywords
- (make-regexp '("as" "case" "ccall" "class" "data" "default"
+ (mdw-regexps '("as" "case" "ccall" "class" "data" "default"
"deriving" "do" "else" "foreign" "hiding" "if"
"import" "in" "infix" "infixl" "infixr" "instance"
"let" "module" "newtype" "of" "qualified" "safe"
(setq font-lock-keywords
(list
- 't
(list "--.*$"
'(0 font-lock-comment-face))
(list (concat "\\<\\(" haskell-keywords "\\)\\>")
;; --- Real fontification things ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
;; --- Environment names are keywords ---
;; --- Real fontification things ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
;; --- Environment names are keywords ---
;; --- Handle @/.../ for italics ---
;; (list "\\(@/\\)\\([^/]*\\)\\(/\\)"
- ;; '(1 font-lock-keyword-face)
- ;; '(3 font-lock-keyword-face))
+ ;; '(1 font-lock-keyword-face)
+ ;; '(3 font-lock-keyword-face))
;; --- Handle @*...* for boldness ---
;; (list "\\(@\\*\\)\\([^*]*\\)\\(\\*\\)"
- ;; '(1 font-lock-keyword-face)
- ;; '(3 font-lock-keyword-face))
+ ;; '(1 font-lock-keyword-face)
+ ;; '(3 font-lock-keyword-face))
;; --- Handle @`...' for literal syntax things ---
;; (list "\\(@`\\)\\([^']*\\)\\('\\)"
- ;; '(1 font-lock-keyword-face)
- ;; '(3 font-lock-keyword-face))
+ ;; '(1 font-lock-keyword-face)
+ ;; '(3 font-lock-keyword-face))
;; --- Handle @<...> for nonterminals ---
;; (list "\\(@<\\)\\([^>]*\\)\\(>\\)"
- ;; '(1 font-lock-keyword-face)
- ;; '(3 font-lock-keyword-face))
+ ;; '(1 font-lock-keyword-face)
+ ;; '(3 font-lock-keyword-face))
;; --- Handle other @-commands ---
;; (list "@\\([^a-zA-Z]\\|[a-zA-Z]*\\)"
- ;; '(0 font-lock-keyword-face))
+ ;; '(0 font-lock-keyword-face))
;; --- Make sure we get comments properly ---
(list "[$^_{}#&]"
'(0 mdw-punct-face)))))
+;;;----- SGML hacking -------------------------------------------------------
+
+(defun mdw-sgml-mode ()
+ (interactive)
+ (sgml-mode)
+ (mdw-standard-fill-prefix "")
+ (make-variable-buffer-local 'sgml-delimiters)
+ (setq sgml-delimiters
+ '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]"
+ "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\""
+ "LITA" "'" "MDC" ">" "MDO" "<!" "MINUS" "-" "MSC" "]]" "NESTC" "{"
+ "NET" "}" "OPT" "?" "OR" "|" "PERO" "%" "PIC" ">" "PIO" "<?"
+ "PLUS" "+" "REFC" "." "REP" "*" "RNI" "#" "SEQ" "," "STAGO" ":"
+ "TAGC" "." "VI" "=" "MS-START" "<![" "MS-END" "]]>"
+ "XML-ECOM" "-->" "XML-PIC" "?>" "XML-SCOM" "<!--" "XML-TAGCE" "/>"
+ "NULL" ""))
+ (setq major-mode 'mdw-sgml-mode)
+ (setq mode-name "[mdw] SGML")
+ (run-hooks 'mdw-sgml-mode-hook))
+
;;;----- Shell scripts ------------------------------------------------------
(defun mdw-setup-sh-script-mode ()
(make-local-variable 'font-lock-defaults)
(make-local-variable 'message-mode-keywords)
(let ((keywords
- (make-regexp '("array" "bitmap" "callback" "docs[ \t]+enum"
+ (mdw-regexps '("array" "bitmap" "callback" "docs[ \t]+enum"
"export" "enum" "fixed-octetstring" "flags"
"harmless" "map" "nested" "optional"
"optional-tagged" "package" "primitive"
(setq comment-start "/* ")
(setq comment-end " */")
(let ((preprocessor-keywords
- (make-regexp '("assert" "define" "elif" "else" "endif" "error"
+ (mdw-regexps '("assert" "define" "elif" "else" "endif" "error"
"ident" "if" "ifdef" "ifndef" "import" "include"
"line" "pragma" "unassert" "undef" "warning"))))
(setq message-mode-keywords
'(2 font-lock-string-face))
(list (concat "^\\([ \t]*#[ \t]*\\(\\("
preprocessor-keywords
- "\\)\\>\\|[0-9]+\\|$\\)\\)")
+ "\\)\\>\\|[0-9]+\\|$\\)\\)")
'(1 font-lock-keyword-face)))
message-mode-keywords)))
- (setq font-lock-defaults
- '(message-mode-keywords nil nil nil nil))
(turn-on-font-lock-if-enabled)
- (run-hooks 'messages-mode-hook))
+ (run-hooks 'cpp-messages-mode-hook))
-(add-hook 'messages-file-hook 'mdw-misc-mode-config t)
+(add-hook 'messages-mode-hook 'mdw-misc-mode-config t)
+(add-hook 'cpp-messages-mode-hook 'mdw-misc-mode-config t)
; (add-hook 'messages-file-hook 'mdw-fontify-messages t)
;;;----- Messages-file mode -------------------------------------------------
(make-local-variable 'font-lock-defaults)
(make-local-variable 'mallow-driver-mode-keywords)
(let ((keywords
- (make-regexp '("each" "divert" "file" "if"
+ (mdw-regexps '("each" "divert" "file" "if"
"perl" "set" "string" "type" "write"))))
(setq mallow-driver-mode-keywords
(list
(local-set-key "\C-i" 'smalltalk-reindent))
(defun mdw-fontify-smalltalk ()
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
(list "\\<[A-Z][a-zA-Z0-9]*\\>"
'(0 font-lock-keyword-face))
(list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
;; --- Not much fontification needed ---
- (make-local-variable 'font-lock-keywords)
+ (make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face)))))
(and mdw-auto-indent
(indent-for-tab-command)))
+(defun mdw-setup-m4 ()
+ (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
+
;;;----- Text mode ----------------------------------------------------------
(defun mdw-text-mode ()
(setq fill-column 72)
(flyspell-mode t)
(mdw-standard-fill-prefix
- "\\([ \t]*\\([A-Za-z0-9]*[>#|:] ?\\)*[ \t]*\\)" 3)
+ "\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
(auto-fill-mode 1))
;;;----- Shell mode ---------------------------------------------------------
'comint-watch-for-password-prompt))
(defun mdw-term-mode-setup ()
- (setq term-prompt-regexp "^[^]#$%>»\n]*[]#$%>»] *")
+ (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *")
(make-local-variable 'mouse-yank-at-point)
(make-local-variable 'transient-mark-mode)
(setq mouse-yank-at-point t)