X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/297d60aa2dad7081062fe15a517412565f45053d..c08211aa9838ecdb251e5df62f9c6394676349ee:/dot-emacs.el diff --git a/dot-emacs.el b/dot-emacs.el index 9899ef9..5b9408f 100644 --- a/dot-emacs.el +++ b/dot-emacs.el @@ -1,6 +1,4 @@ -;;; -*-emacs-lisp-*- -;;; -;;; $Id$ +;;; -*- mode: emacs-lisp; coding: utf-8 -*- ;;; ;;; Functions and macros for .emacs ;;; @@ -13,18 +11,43 @@ ;;; 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)) + (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 --------------------------------------------- +(eval-when-compile + (unless (fboundp 'make-regexp) + (load "make-regexp")) + (require 'cl)) + +(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 @@ -34,7 +57,9 @@ "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 --- @@ -42,35 +67,92 @@ (defun mdw-config (sym) "Read the configuration variable named SYM." (unless mdw-config - (setq mdw-config (with-temp-buffer - (insert-file-contents "~/.mdw.conf") - (replace-regexp "^[ \t]*\\(#.*\\|\\)\n" "" - nil (point-min) (point-max)) - (replace-regexp (concat "^[ \t]*" - "\\([-a-zA-Z0-9_.]*\\)" - "[ \t]*=[ \t]*" - "\\(.*[^ \t\n]\\|\\)" - "[ \t]**\\(\n\\|$\\)") - "(\\1 . \"\\2\") " - nil (point-min) (point-max)) - (car (read-from-string - (concat "(" (buffer-string) ")")))))) + (setq mdw-config + (flet ((replace (what with) + (goto-char (point-min)) + (while (re-search-forward what nil t) + (replace-match with t)))) + (with-temp-buffer + (insert-file-contents "~/.mdw.conf") + (replace "^[ \t]*\\(#.*\\|\\)\n" "") + (replace (concat "^[ \t]*" + "\\([-a-zA-Z0-9_.]*\\)" + "[ \t]*=[ \t]*" + "\\(.*[^ \t\n]\\|\\)" + "[ \t]**\\(\n\\|$\\)") + "(\\1 . \"\\2\")\n") + (car (read-from-string + (concat "(" (buffer-string) ")"))))))) (cdr (assq sym mdw-config))) +;; --- Set up the load path convincingly --- + +(dolist (dir (append (and (boundp 'debian-emacs-flavor) + (list (concat "/usr/share/" + (symbol-name debian-emacs-flavor) + "/site-lisp"))))) + (dolist (sub (directory-files dir t)) + (when (and (file-accessible-directory-p sub) + (not (member sub load-path))) + (setq load-path (nconc load-path (list sub)))))) + +;; --- 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.") -(defun mdw-divvy-window (&optional w) +(unless (fboundp 'scroll-bar-columns) + (defun scroll-bar-columns (side) + (cond ((eq side 'left) 0) + (window-system 3) + (t 1)))) +(unless (fboundp 'fringe-columns) + (defun fringe-columns (side) + (cond ((not window-system) 0) + ((eq side 'left) 1) + (t 2)))) + +(defun mdw-divvy-window (&optional width) "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)))) + (interactive "P") + (setq width (cond (width (prefix-numeric-value width)) + ((and window-system + (>= emacs-major-version 22)) + 77) + (t 78))) + (let* ((win (selected-window)) + (sb-width (if (not window-system) + 1 + (let ((tot 0)) + (dolist (what '(scroll-bar fringe)) + (dolist (side '(left right)) + (incf tot + (funcall (intern (concat (symbol-name what) + "-columns")) + side)))) + tot))) + (c (/ (+ (window-width) sb-width) + (+ width sb-width)))) (while (> c 1) (setq c (1- c)) - (split-window-horizontally (+ w mdw-scrollbar-width)) + (split-window-horizontally (+ width sb-width)) (other-window 1)) (select-window win))) @@ -106,8 +188,130 @@ symbols `sunday', `monday', etc. (or a mixture). If the date stored in (nth 2 when)))))))) (eq w d))) +;; --- Fighting with Org-mode's evil key maps --- + +(defvar mdw-evil-keymap-keys + '(([S-up] . [?\C-c up]) + ([S-down] . [?\C-c down]) + ([S-left] . [?\C-c left]) + ([S-right] . [?\C-c right]) + (([M-up] [?\e up]) . [C-up]) + (([M-down] [?\e down]) . [C-down]) + (([M-left] [?\e left]) . [C-left]) + (([M-right] [?\e right]) . [C-right])) + "Defines evil keybindings to clobber in `mdw-clobber-evil-keymap'. +The value is an alist mapping evil keys (as a list, or singleton) +to good keys (in the same form).") + +(defun mdw-clobber-evil-keymap (keymap) + "Replace evil key bindings in the KEYMAP. +Evil key bindings are defined in `mdw-evil-keymap-keys'." + (dolist (entry mdw-evil-keymap-keys) + (let ((binding nil) + (keys (if (listp (car entry)) + (car entry) + (list (car entry)))) + (replacements (if (listp (cdr entry)) + (cdr entry) + (list (cdr entry))))) + (catch 'found + (dolist (key keys) + (setq binding (lookup-key keymap key)) + (when binding + (throw 'found nil)))) + (when binding + (dolist (key keys) + (define-key keymap key nil)) + (dolist (key replacements) + (define-key keymap key binding)))))) + +;;;----- Mail and news hacking ---------------------------------------------- + +(define-derived-mode mdwmail-mode mail-mode "[mdw] mail" + "Major mode for editing news and mail messages from external programs +Not much right now. Just support for doing MailCrypt stuff." + :syntax-table nil + :abbrev-table nil + (run-hooks 'mail-setup-hook)) + +(define-key mdwmail-mode-map [?\C-c ?\C-c] 'disabled-operation) + +(add-hook 'mdwail-mode-hook + (lambda () + (set-buffer-file-coding-system 'utf-8) + (make-local-variable 'paragraph-separate) + (make-local-variable 'paragraph-start) + (setq paragraph-start + (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|" + paragraph-start)) + (setq paragraph-separate + (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|" + paragraph-separate)))) + +;; --- How to encrypt in mdwmail --- + +(defun mdwmail-mc-encrypt (&optional recip scm start end from sign) + (or start + (setq start (save-excursion + (goto-char (point-min)) + (or (search-forward "\n\n" nil t) (point-min))))) + (or end + (setq end (point-max))) + (mc-encrypt-generic recip scm start end from sign)) + +;; --- How to sign in mdwmail --- + +(defun mdwmail-mc-sign (key scm start end uclr) + (or start + (setq start (save-excursion + (goto-char (point-min)) + (or (search-forward "\n\n" nil t) (point-min))))) + (or end + (setq end (point-max))) + (mc-sign-generic key scm start end uclr)) + +;; --- Some signature mangling --- + +(defun mdwmail-mangle-signature () + (save-excursion + (goto-char (point-min)) + (perform-replace "\n-- \n" "\n-- " nil nil nil))) +(add-hook 'mail-setup-hook 'mdwmail-mangle-signature) +(add-hook 'message-setup-hook 'mdwmail-mangle-signature) + +;; --- Insert my login name into message-ids, so I can score replies --- + +(defadvice message-unique-id (after mdw-user-name last activate compile) + "Ensure that the user's name appears at the end of the message-id string, +so that it can be used for convenient filtering." + (setq ad-return-value (concat ad-return-value "." (user-login-name)))) + +;; --- Tell my movemail hack where movemail is --- +;; +;; This is needed to shup up warnings about LD_PRELOAD. + +(let ((path exec-path)) + (while path + (let ((try (expand-file-name "movemail" (car path)))) + (if (file-executable-p try) + (setenv "REAL_MOVEMAIL" try)) + (setq path (cdr path))))) + ;;;----- 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) @@ -206,71 +410,91 @@ input lists are not modified, although they'll probably become garbage." (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))) - -(defun mdwmail-mode () - "Major mode for editing news and mail messages from external programs -Not much right now. Just support for doing MailCrypt stuff." - (interactive) - (kill-all-local-variables) - (use-local-map text-mode-map) - (setq local-abbrev-table text-mode-abbrev-table) - (setq major-mode 'mdwmail-mode) - (setq mode-name "[mdw] mail") - (make-local-variable 'paragraph-separate) - (make-local-variable 'paragraph-start) - (setq paragraph-start (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|" - paragraph-start)) - (setq paragraph-separate (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|" - paragraph-separate)) - (run-hooks 'text-mode-hook 'mdwmail-mode-hook 'mail-setup-hook)) - -;; --- How to encrypt in mdwmail --- - -(defun mdwmail-mc-encrypt (&optional recip scm start end from sign) - (or start - (setq start (save-excursion - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) (point-min))))) - (or end - (setq end (point-max))) - (mc-encrypt-generic recip scm start end from sign)) - -;; --- How to sign in mdwmail --- - -(defun mdwmail-mc-sign (key scm start end uclr) - (or start - (setq start (save-excursion - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) (point-min))))) - (or end - (setq end (point-max))) - (mc-sign-generic key scm start end uclr)) - -;; --- Some signature mangling --- - -(defun mdwmail-mangle-signature () + (insert-file-contents 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 ((not (boundp 'global-auto-revert-ignore-buffer)) + nil) + ((and (buffer-file-name) + (fboundp 'tramp-tramp-file-p) + (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)) + +;;;----- Dired hacking ------------------------------------------------------ + +(defadvice dired-maybe-insert-subdir + (around mdw-marked-insertion first activate) + "The DIRNAME may be a list of directory names to insert. Interactively, if +files are marked, then insert all of them. With a numeric prefix argument, +select that many entries near point; with a non-numeric prefix argument, +prompt for listing options." + (interactive + (list (dired-get-marked-files nil + (and (integerp current-prefix-arg) + current-prefix-arg) + #'file-directory-p) + (and current-prefix-arg + (not (integerp current-prefix-arg)) + (read-string "Switches for listing: " + (or dired-subdir-switches + dired-actual-switches))))) + (let ((dirs (ad-get-arg 0))) + (dolist (dir (if (listp dirs) dirs (list dirs))) + (ad-set-arg 0 dir) + ad-do-it))) + +;;;----- 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 - (goto-char (point-min)) - (perform-replace "\n-- \n" "\n-- " nil nil nil))) -(add-hook 'mail-setup-hook 'mdwmail-mangle-signature) + (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 -------------------------------------------------- @@ -294,7 +518,10 @@ a list of things: (make-variable-buffer-local 'mdw-fill-prefix) (defvar mdw-hanging-indents - "\\(\\(\\([*o]\\|--\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)[ \t]+\\)?\\)" + (concat "\\(\\(" + "\\([*o]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)" + "[ \t]+" + "\\)?\\)") "*Standard regular expression matching things which might be part of a hanging indent. This is mainly useful in `auto-fill-mode'.") @@ -386,40 +613,6 @@ doesn't cope with anything approximating a complicated case." ;;;----- Other common declarations ------------------------------------------ -(defun mdw-set-frame-transparency (&optional n) - (interactive "P") - (let* ((alist (frame-parameters)) - (trans (assq 'transparency alist))) - (if trans - (rplacd trans (not (if n (zerop n) (cdr trans)))) - (setq trans (cons 'transparency (not (equal 0 n))))) - (modify-frame-parameters (selected-frame) (list trans)))) - -;; --- Mouse wheel support --- - -(defconst mdw-wheel-scroll-amount 15) -(defun mdw-wheel-up (click) - (interactive "@e") - (mdw-wheel-scroll click (function scroll-down))) -(defun mdw-wheel-down (click) - (interactive "@e") - (mdw-wheel-scroll click (function scroll-up))) - -(defun mdw-wheel-scroll (click func) - (let ((win (selected-window))) - (unwind-protect - (progn - (select-window (posn-window (event-start click))) - (let ((arg 2)) - (funcall func (/ (window-height) 2)))) - (select-window win)))) - -;; --- Going backwards --- - -(defun other-window-backwards (arg) - (interactive "p") - (other-window (- arg))) - ;; --- Common mode settings --- (defvar mdw-auto-indent t @@ -429,18 +622,27 @@ doesn't cope with anything approximating a complicated case." (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) - (local-set-key [?\#] 'self-insert-command) - (local-set-key [?\"] 'self-insert-command) + (make-variable-buffer-local 'page-delimiter) + (setq page-delimiter "\f\\|^.*-\\{6\\}.*$") (setq comment-column 40) (auto-fill-mode 1) (setq fill-column 77) + (setq show-trailing-whitespace t) + (and (fboundp 'gtags-mode) + (gtags-mode)) + (outline-minor-mode t) (mdw-set-font)) +(eval-after-load 'gtags + '(dolist (key '([mouse-2] [mouse-3])) + (define-key gtags-mode-map key nil))) + ;; --- Set up all sorts of faces --- (defvar mdw-set-font nil) @@ -450,28 +652,50 @@ doesn't cope with anything approximating a complicated case." (defvar mdw-number-face 'mdw-number-face "Face to use for numbers") (make-face 'mdw-number-face) +;; --- Backup file handling --- + +(defvar mdw-backup-disable-regexps nil + "*List of regular expressions: if a file name matches any of these then the +file is not backed up.") + +(defun mdw-backup-enable-predicate (name) + "[mdw]'s default backup predicate: allows a backup if the +standard predicate would allow it, and it doesn't match any of +the regular expressions in `mdw-backup-disable-regexps'." + (and (normal-backup-enable-predicate name) + (let ((answer t) (list mdw-backup-disable-regexps)) + (save-match-data + (while list + (if (string-match (car list) name) + (setq answer nil)) + (setq list (cdr list))) + answer)))) +(setq backup-enable-predicate 'mdw-backup-enable-predicate) + ;;;----- 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) @@ -480,11 +704,15 @@ doesn't cope with anything approximating a complicated case." ,@(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) @@ -495,12 +723,15 @@ doesn't cope with anything approximating a complicated case." (comint-highlight-input) (font-lock-builtin-face :weight bold) (font-lock-type-face :weight bold) - (region :background "grey30") + (region :background ,(if window-system "grey30" "blue")) (isearch :background "palevioletred2") (mdw-punct-face :foreground ,(if window-system "burlywood2" "yellow")) (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) @@ -508,16 +739,43 @@ doesn't cope with anything approximating a complicated case." (font-lock-keyword-face :weight bold) (font-lock-constant-face :weight bold) (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) + (message-cited-text + :foreground ,(if window-system "SeaGreen1" "green") + :slant italic) + (message-separator :background "red" :foreground "white" :weight bold) + (message-header-cc + :foreground ,(if window-system "SeaGreen1" "green") + :weight bold) + (message-header-newsgroups + :foreground ,(if window-system "SeaGreen1" "green") + :weight bold) + (message-header-subject + :foreground ,(if window-system "SeaGreen1" "green") + :weight bold) + (message-header-to + :foreground ,(if window-system "SeaGreen1" "green") + :weight bold) + (message-header-xheader + :foreground ,(if window-system "SeaGreen1" "green") + :weight bold) + (message-header-other + :foreground ,(if window-system "SeaGreen1" "green") + :weight bold) + (message-header-name + :foreground ,(if window-system "SeaGreen1" "green")) + (woman-bold :weight bold) + (woman-italic :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 () @@ -543,17 +801,21 @@ doesn't cope with anything approximating a complicated case." ;; --- Make C indentation nice --- +(eval-after-load "cc-mode" + '(progn + (define-key c-mode-map "*" nil) + (define-key c-mode-map "/" nil))) + (defun mdw-c-style () (c-add-style "[mdw] C and C++ style" '((c-basic-offset . 2) - (c-tab-always-indent . nil) (comment-column . 40) (c-class-key . "class") (c-offsets-alist (substatement-open . 0) (label . 0) (case-label . +) (access-label . -) - (inclass . ++) + (inclass . +) (inline-open . ++) (statement-cont . 0) (statement-case-intro . +))) @@ -563,7 +825,6 @@ doesn't cope with anything approximating a complicated case." ;; --- Fiddle with some syntax codes --- - (modify-syntax-entry ?_ "w") (modify-syntax-entry ?* ". 23") (modify-syntax-entry ?/ ". 124b") (modify-syntax-entry ?\n "> b") @@ -574,8 +835,6 @@ doesn't cope with anything approximating a complicated case." (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]*\\)" @@ -585,119 +844,117 @@ doesn't cope with anything approximating a complicated case." ;; --- 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++ - "asm" ;K&R, GCC - "auto" ;K&R, C89 - ;; "bitand" ;C++ - ;; "bitor" ;C++ - "bool" ;C++, C9X macro - "break" ;K&R, C89 - "case" ;K&R, C89 - "catch" ;C++ - "char" ;K&R, C89 - "class" ;C++ - "complex" ;C9X macro, C++ template type - ;; "compl" ;C++ - "const" ;C89 - "const_cast" ;C++ - "continue" ;K&R, C89 - "defined" ;C89 preprocessor - "default" ;K&R, C89 - "delete" ;C++ - "do" ;K&R, C89 - "double" ;K&R, C89 - "dynamic_cast" ;C++ - "else" ;K&R, C89 - ;; "entry" ;K&R -- never used - "enum" ;C89 - "explicit" ;C++ - ;; "export" ;C++ - "extern" ;K&R, C89 - "false" ;C++, C9X macro - "float" ;K&R, C89 - "for" ;K&R, C89 - "fortran" ;K&R - "friend" ;C++ - "goto" ;K&R, C89 - "if" ;K&R, C89 - "imaginary" ;C9X macro - "inline" ;C++, C9X, GCC - "int" ;K&R, C89 - "long" ;K&R, C89 - "mutable" ;C++ - "namespace" ;C++ - "new" ;C++ - "operator" ;C++ - ;; "or" ;C++ - ;; "or_eq" ;C++ - "private" ;C++ - "protected" ;C++ - "public" ;C++ - "register" ;K&R, C89 - "reinterpret_cast" ;C++ - "restrict" ;C9X - "return" ;K&R, C89 - "short" ;K&R, C89 - "signed" ;C89 - "sizeof" ;K&R, C89 - "static" ;K&R, C89 - "static_cast" ;C++ - "struct" ;K&R, C89 - "switch" ;K&R, C89 - "template" ;C++ - "this" ;C++ - "throw" ;C++ - "true" ;C++, C9X macro - "try" ;C++ - "this" ;C++ - "typedef" ;C89 - "typeid" ;C++ - "typeof" ;GCC - "typename" ;C++ - "union" ;K&R, C89 - "unsigned" ;K&R, C89 - "using" ;C++ - "virtual" ;C++ - "void" ;C89 - "volatile" ;C89 - "wchar_t" ;C++, C89 library type - "while" ;K&R, C89 - ;; "xor" ;C++ - ;; "xor_eq" ;C++ - "_Bool" ;C9X - "_Complex" ;C9X - "_Imaginary" ;C9X - "_Pragma" ;C9X preprocessor - "__alignof__" ;GCC - "__asm__" ;GCC - "__attribute__" ;GCC - "__complex__" ;GCC - "__const__" ;GCC - "__extension__" ;GCC - "__imag__" ;GCC - "__inline__" ;GCC - "__label__" ;GCC - "__real__" ;GCC - "__signed__" ;GCC - "__typeof__" ;GCC - "__volatile__" ;GCC - ))) + (mdw-regexps "and" ;C++ + "and_eq" ;C++ + "asm" ;K&R, GCC + "auto" ;K&R, C89 + "bitand" ;C++ + "bitor" ;C++ + "bool" ;C++, C9X macro + "break" ;K&R, C89 + "case" ;K&R, C89 + "catch" ;C++ + "char" ;K&R, C89 + "class" ;C++ + "complex" ;C9X macro, C++ template type + "compl" ;C++ + "const" ;C89 + "const_cast" ;C++ + "continue" ;K&R, C89 + "defined" ;C89 preprocessor + "default" ;K&R, C89 + "delete" ;C++ + "do" ;K&R, C89 + "double" ;K&R, C89 + "dynamic_cast" ;C++ + "else" ;K&R, C89 + ;; "entry" ;K&R -- never used + "enum" ;C89 + "explicit" ;C++ + "export" ;C++ + "extern" ;K&R, C89 + "false" ;C++, C9X macro + "float" ;K&R, C89 + "for" ;K&R, C89 + ;; "fortran" ;K&R + "friend" ;C++ + "goto" ;K&R, C89 + "if" ;K&R, C89 + "imaginary" ;C9X macro + "inline" ;C++, C9X, GCC + "int" ;K&R, C89 + "long" ;K&R, C89 + "mutable" ;C++ + "namespace" ;C++ + "new" ;C++ + "operator" ;C++ + "or" ;C++ + "or_eq" ;C++ + "private" ;C++ + "protected" ;C++ + "public" ;C++ + "register" ;K&R, C89 + "reinterpret_cast" ;C++ + "restrict" ;C9X + "return" ;K&R, C89 + "short" ;K&R, C89 + "signed" ;C89 + "sizeof" ;K&R, C89 + "static" ;K&R, C89 + "static_cast" ;C++ + "struct" ;K&R, C89 + "switch" ;K&R, C89 + "template" ;C++ + "this" ;C++ + "throw" ;C++ + "true" ;C++, C9X macro + "try" ;C++ + "this" ;C++ + "typedef" ;C89 + "typeid" ;C++ + "typeof" ;GCC + "typename" ;C++ + "union" ;K&R, C89 + "unsigned" ;K&R, C89 + "using" ;C++ + "virtual" ;C++ + "void" ;C89 + "volatile" ;C89 + "wchar_t" ;C++, C89 library type + "while" ;K&R, C89 + "xor" ;C++ + "xor_eq" ;C++ + "_Bool" ;C9X + "_Complex" ;C9X + "_Imaginary" ;C9X + "_Pragma" ;C9X preprocessor + "__alignof__" ;GCC + "__asm__" ;GCC + "__attribute__" ;GCC + "__complex__" ;GCC + "__const__" ;GCC + "__extension__" ;GCC + "__imag__" ;GCC + "__inline__" ;GCC + "__label__" ;GCC + "__real__" ;GCC + "__signed__" ;GCC + "__typeof__" ;GCC + "__volatile__" ;GCC + )) (preprocessor-keywords - (make-regexp '("assert" "define" "elif" "else" "endif" "error" - "ident" "if" "ifdef" "ifndef" "import" "include" - "line" "pragma" "unassert" "undef" "warning"))) + (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" - "interface" "private" "protected" "protocol" "public" - "selector")))) + (mdw-regexps "class" "defs" "encode" "end" "implementation" + "interface" "private" "protected" "protocol" "public" + "selector"))) (setq font-lock-keywords (list - 't ;; --- Fontify include files as strings --- @@ -749,7 +1006,6 @@ doesn't cope with anything approximating a complicated case." ;; --- Fiddle with some syntax codes --- - (modify-syntax-entry ?_ "w") (modify-syntax-entry ?* ". 23") (modify-syntax-entry ?/ ". 14") @@ -769,16 +1025,15 @@ doesn't cope with anything approximating a complicated case." ;; --- 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" - "do" "else" "exit" "for" "global" "goto" "help" "if" - "local" "mat" "obj" "print" "quit" "read" "return" - "show" "static" "switch" "while" "write")))) + (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 --- @@ -807,7 +1062,6 @@ doesn't cope with anything approximating a complicated case." (defun mdw-java-style () (c-add-style "[mdw] Java style" '((c-basic-offset . 2) - (c-tab-always-indent . nil) (c-offsets-alist (substatement-open . 0) (label . +) (case-label . +) @@ -823,7 +1077,6 @@ doesn't cope with anything approximating a complicated case." ;; --- Other stuff --- (mdw-java-style) - (modify-syntax-entry ?_ "w") (setq c-hanging-comment-ender-p nil) (setq c-backslash-column 72) (setq comment-start "/* ") @@ -837,23 +1090,22 @@ doesn't cope with anything approximating a complicated case." ;; --- 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" - "char" "class" "const" "continue" "default" "do" - "double" "else" "extends" "final" "finally" "float" - "for" "goto" "if" "implements" "import" "instanceof" - "int" "interface" "long" "native" "new" "package" - "private" "protected" "public" "return" "short" - "static" "super" "switch" "synchronized" "this" - "throw" "throws" "transient" "try" "void" "volatile" - "while" - - "false" "null" "true")))) + (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" + "int" "interface" "long" "native" "new" "package" + "private" "protected" "public" "return" "short" + "static" "super" "switch" "synchronized" "this" + "throw" "throws" "transient" "try" "void" "volatile" + "while" + + "false" "null" "true"))) (setq font-lock-keywords (list - 't ;; --- Handle the keywords defined above --- @@ -876,6 +1128,92 @@ doesn't cope with anything approximating a complicated case." (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-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) + (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 --- @@ -883,7 +1221,6 @@ doesn't cope with anything approximating a complicated case." (defun mdw-awk-style () (c-add-style "[mdw] Awk style" '((c-basic-offset . 2) - (c-tab-always-indent . nil) (c-offsets-alist (substatement-open . 0) (statement-cont . 0) (statement-case-intro . +))) @@ -895,30 +1232,28 @@ doesn't cope with anything approximating a complicated case." ;; --- Miscellaneous fiddling --- - (modify-syntax-entry ?_ "w") (mdw-awk-style) (setq c-backslash-column 72) (mdw-standard-fill-prefix "\\([ \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 '("BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT" - "ENVIRON" "ERRNO" "FIELDWIDTHS" "FILENAME" "FNR" - "FS" "IGNORECASE" "NF" "NR" "OFMT" "OFS" "ORS" "RS" - "RSTART" "RLENGTH" "RT" "SUBSEP" - "atan2" "break" "close" "continue" "cos" "delete" - "do" "else" "exit" "exp" "fflush" "file" "for" "func" - "function" "gensub" "getline" "gsub" "if" "in" - "index" "int" "length" "log" "match" "next" "rand" - "return" "print" "printf" "sin" "split" "sprintf" - "sqrt" "srand" "strftime" "sub" "substr" "system" - "systime" "tolower" "toupper" "while")))) + (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" + "atan2" "break" "close" "continue" "cos" "delete" + "do" "else" "exit" "exp" "fflush" "file" "for" "func" + "function" "gensub" "getline" "gsub" "if" "in" + "index" "int" "length" "log" "match" "next" "rand" + "return" "print" "printf" "sin" "split" "sprintf" + "sqrt" "srand" "strftime" "sub" "substr" "system" + "systime" "tolower" "toupper" "while"))) (setq font-lock-keywords (list - 't ;; --- Handle the keywords defined above --- @@ -945,8 +1280,6 @@ doesn't cope with anything approximating a complicated case." ;; --- Perl indentation style --- -(setq cperl-tab-always-indent nil) - (setq cperl-indent-level 2) (setq cperl-continued-statement-offset 2) (setq cperl-continued-brace-offset 0) @@ -960,24 +1293,22 @@ doesn't cope with anything approximating a complicated case." ;; --- Miscellaneous fiddling --- - (modify-syntax-entry ?_ "w") (modify-syntax-entry ?$ "\\") (modify-syntax-entry ?$ "\\" font-lock-syntax-table) (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)") ;; --- 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" - "for" "foreach" "ge" "gt" "goto" "if" - "last" "le" "lt" "local" "my" "ne" "next" "or" - "package" "redo" "require" "return" "sub" - "undef" "unless" "until" "use" "while")))) + (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" + "undef" "unless" "until" "use" "while"))) (setq font-lock-keywords (list - 't ;; --- Set up the keywords defined above --- @@ -1015,26 +1346,23 @@ strip numbers instead." ;; --- Define Python fontification style --- -(trap (require 'pyrex-mode)) (defun mdw-fontify-python () ;; --- Miscellaneous fiddling --- - (modify-syntax-entry ?_ "w") (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)") ;; --- 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" - "del" "elif" "else" "except" "exec" "finally" "for" - "from" "global" "if" "import" "in" "is" "lambda" - "not" "or" "pass" "print" "raise" "return" "try" - "while" "yield")))) + (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" "with" "yield"))) (setq font-lock-keywords (list - 't ;; --- Set up the keywords defined above --- @@ -1110,10 +1438,9 @@ strip numbers instead." ;; --- Fiddle with fontification --- - (make-local-variable 'font-lock-keywords) + (make-local-variable 'font-lock-keywords) (setq font-lock-keywords (list - 't ;; --- Handle numbers too --- ;; @@ -1145,15 +1472,22 @@ strip numbers instead." (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_]+\\|\\)") @@ -1182,7 +1516,7 @@ strip numbers instead." (local-set-key [?\C-m] 'mdw-rexx-indent-newline-indent) (local-set-key [?*] 'mdw-rexx-electric-*) (mapcar #'(lambda (ch) (modify-syntax-entry ch "w")) - '(?. ?! ?? ?_ ?# ?@ ?$)) + '(?! ?? ?# ?@ ?$)) (mdw-standard-fill-prefix "\\([ \t]*/?\*[ \t]*\\)") ;; --- Set up keywords and things for fontification --- @@ -1192,37 +1526,35 @@ strip numbers instead." (setq rexx-indent 2) (setq rexx-end-indent rexx-indent) - (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" - "else" "end" "engineering" "exit" "expose" "for" - "forever" "form" "fuzz" "if" "interpret" "iterate" - "leave" "linein" "name" "nop" "numeric" "off" "on" - "options" "otherwise" "parse" "procedure" "pull" - "push" "queue" "return" "say" "select" "signal" - "scientific" "source" "then" "trace" "to" "until" - "upper" "value" "var" "version" "when" "while" - "with" - - "abbrev" "abs" "bitand" "bitor" "bitxor" "b2x" - "center" "center" "charin" "charout" "chars" - "compare" "condition" "copies" "c2d" "c2x" - "datatype" "date" "delstr" "delword" "d2c" "d2x" - "errortext" "format" "fuzz" "insert" "lastpos" - "left" "length" "lineout" "lines" "max" "min" - "overlay" "pos" "queued" "random" "reverse" "right" - "sign" "sourceline" "space" "stream" "strip" - "substr" "subword" "symbol" "time" "translate" - "trunc" "value" "verify" "word" "wordindex" - "wordlength" "wordpos" "words" "xrange" "x2b" "x2c" - "x2d")))) + (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" + "options" "otherwise" "parse" "procedure" "pull" + "push" "queue" "return" "say" "select" "signal" + "scientific" "source" "then" "trace" "to" "until" + "upper" "value" "var" "version" "when" "while" + "with" + + "abbrev" "abs" "bitand" "bitor" "bitxor" "b2x" + "center" "center" "charin" "charout" "chars" + "compare" "condition" "copies" "c2d" "c2x" + "datatype" "date" "delstr" "delword" "d2c" "d2x" + "errortext" "format" "fuzz" "insert" "lastpos" + "left" "length" "lineout" "lines" "max" "min" + "overlay" "pos" "queued" "random" "reverse" "right" + "sign" "sourceline" "space" "stream" "strip" + "substr" "subword" "symbol" "time" "translate" + "trunc" "value" "verify" "word" "wordindex" + "wordlength" "wordpos" "words" "xrange" "x2b" "x2c" + "x2d"))) (setq font-lock-keywords (list - 't ;; --- Set up the keywords defined above --- @@ -1246,7 +1578,6 @@ strip numbers instead." ;; --- Make underscore an honorary letter --- - (modify-syntax-entry ?_ "w") (modify-syntax-entry ?' "w") ;; --- Set fill prefix --- @@ -1255,27 +1586,26 @@ strip numbers instead." ;; --- 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" - "case" - "datatype" "do" - "else" "end" "eqtype" "exception" - "fn" "fun" "functor" - "handle" - "if" "in" "include" "infix" "infixr" - "let" "local" - "nonfix" - "of" "op" "open" "orelse" - "raise" "rec" - "sharing" "sig" "signature" "struct" "structure" - "then" "type" - "val" - "where" "while" "with" "withtype")))) + (mdw-regexps "abstype" "and" "andalso" "as" + "case" + "datatype" "do" + "else" "end" "eqtype" "exception" + "fn" "fun" "functor" + "handle" + "if" "in" "include" "infix" "infixr" + "let" "local" + "nonfix" + "of" "op" "open" "orelse" + "raise" "rec" + "sharing" "sig" "signature" "struct" "structure" + "then" "type" + "val" + "where" "while" "with" "withtype"))) (setq font-lock-keywords (list - 't ;; --- Set up the keywords defined above --- @@ -1286,10 +1616,10 @@ strip numbers instead." (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 --- @@ -1303,7 +1633,6 @@ strip numbers instead." ;; --- Fiddle with syntax table to get comments right --- - (modify-syntax-entry ?_ "w") (modify-syntax-entry ?' "\"") (modify-syntax-entry ?- ". 123") (modify-syntax-entry ?{ ". 1b") @@ -1316,17 +1645,16 @@ strip numbers instead." ;; --- 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" - "deriving" "do" "else" "foreign" "hiding" "if" - "import" "in" "infix" "infixl" "infixr" "instance" - "let" "module" "newtype" "of" "qualified" "safe" - "stdcall" "then" "type" "unsafe" "where")))) + (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" + "stdcall" "then" "type" "unsafe" "where"))) (setq font-lock-keywords (list - 't (list "--.*$" '(0 font-lock-comment-face)) (list (concat "\\<\\(" haskell-keywords "\\)\\>") @@ -1338,6 +1666,41 @@ strip numbers instead." (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" '(0 mdw-punct-face)))))) +;;;----- Erlang configuration ----------------------------------------------- + +(setq erlang-electric-commannds + '(erlang-electric-newline erlang-electric-semicolon)) + +(defun mdw-fontify-erlang () + + ;; --- Set fill prefix --- + + (mdw-standard-fill-prefix "\\([ \t]*{?%*[ \t]*\\)") + + ;; --- Fiddle with fontification --- + + (make-local-variable 'font-lock-keywords) + (let ((erlang-keywords + (mdw-regexps "after" "and" "andalso" + "band" "begin" "bnot" "bor" "bsl" "bsr" "bxor" + "case" "catch" "cond" + "div" "end" "fun" "if" "let" "not" + "of" "or" "orelse" + "query" "receive" "rem" "try" "when" "xor"))) + + (setq font-lock-keywords + (list + (list "%.*$" + '(0 font-lock-comment-face)) + (list (concat "\\<\\(" erlang-keywords "\\)\\>") + '(0 font-lock-keyword-face)) + (list (concat "^-\\sw+\\>") + '(0 font-lock-keyword-face)) + (list "\\<[0-9]+\\(\\|#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)\\>" + '(0 mdw-number-face)) + (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" + '(0 mdw-punct-face)))))) + ;;;----- Texinfo configuration ---------------------------------------------- (defun mdw-fontify-texinfo () @@ -1348,10 +1711,9 @@ strip numbers instead." ;; --- 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 --- @@ -1383,6 +1745,7 @@ strip numbers instead." (defun mdw-fontify-tex () (setq ispell-parser 'tex) + (turn-on-reftex) ;; --- Don't make maths into a string --- @@ -1396,10 +1759,9 @@ strip numbers instead." ;; --- 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 --- @@ -1421,31 +1783,31 @@ strip numbers instead." ;; --- 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 --- @@ -1457,6 +1819,26 @@ strip numbers instead." (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" "" "PIO" "" + "XML-ECOM" "-->" "XML-PIC" "?>" "XML-SCOM" "