X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/8df912e4f47928e29776086741ef57eb067aeb5c..c08211aa9838ecdb251e5df62f9c6394676349ee:/dot-emacs.el diff --git a/dot-emacs.el b/dot-emacs.el index e10f9ed..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 ;;; @@ -23,8 +21,33 @@ ;;; 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 @@ -44,21 +67,35 @@ (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) @@ -81,37 +118,41 @@ path. The non-nil value is the filename we found for the library." ;; --- Splitting windows --- -(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) +(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 (if (and window-system - (>= emacs-major-version 22)) - 77 - 78))) + (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 - (+ (scroll-bar-columns 'left) - (scroll-bar-columns 'right) - (fringe-columns 'left) - (fringe-columns 'right)))) + (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) - (+ w sb-width)))) + (+ width sb-width)))) (while (> c 1) (setq c (1- c)) - (split-window-horizontally (+ w sb-width)) + (split-window-horizontally (+ width sb-width)) (other-window 1)) (select-window win))) @@ -147,6 +188,115 @@ 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) @@ -262,69 +412,49 @@ input lists are not modified, although they'll probably become garbage." (or arg (progn (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 () - (save-excursion - (goto-char (point-min)) - (perform-replace "\n-- \n" "\n-- " nil nil nil))) -(add-hook 'mail-setup-hook '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 -------------------------------------------------------- @@ -388,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'.") @@ -480,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 @@ -529,16 +628,21 @@ doesn't cope with anything approximating a complicated case." (t (local-set-key "\C-m" 'newline-and-indent)))) (local-set-key [C-return] 'newline) - (or (eq major-mode 'asm-mode) - (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) @@ -548,6 +652,26 @@ 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 faces) @@ -580,13 +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)))) + '(:family "misc-fixed" :height 130 :width semi-condensed)))) (fixed-pitch) (minibuffer-prompt) - (modeline :foreground "blue" :background "yellow" - :box (:line-width 1 :style released-button)) + (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) @@ -597,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) @@ -610,14 +739,40 @@ 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") @@ -646,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 . +))) @@ -666,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") @@ -688,113 +846,112 @@ doesn't cope with anything approximating a complicated case." (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 @@ -849,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") @@ -871,10 +1027,10 @@ doesn't cope with anything approximating a complicated case." (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 @@ -906,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 . +) @@ -922,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 "/* ") @@ -938,17 +1092,17 @@ doesn't cope with anything approximating a complicated case." (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 @@ -981,7 +1135,6 @@ doesn't cope with anything approximating a complicated case." (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 . +) @@ -997,7 +1150,6 @@ doesn't cope with anything approximating a complicated case." ;; --- Other stuff --- (mdw-csharp-style) - (modify-syntax-entry ?_ "w") (setq c-hanging-comment-ender-p nil) (setq c-backslash-column 72) (setq comment-start "/* ") @@ -1013,22 +1165,22 @@ doesn't cope with anything approximating a complicated case." (make-local-variable 'font-lock-keywords) (let ((csharp-keywords - (make-regexp '("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")))) + (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 @@ -1069,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 . +))) @@ -1081,7 +1232,6 @@ 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]*\\)") @@ -1090,17 +1240,17 @@ doesn't cope with anything approximating a complicated case." (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 @@ -1130,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) @@ -1145,7 +1293,6 @@ 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]*\\)") @@ -1154,11 +1301,11 @@ doesn't cope with anything approximating a complicated case." (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 @@ -1199,23 +1346,21 @@ 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) (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 @@ -1371,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 --- @@ -1381,33 +1526,32 @@ 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) (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 @@ -1434,7 +1578,6 @@ strip numbers instead." ;; --- Make underscore an honorary letter --- - (modify-syntax-entry ?_ "w") (modify-syntax-entry ?' "w") ;; --- Set fill prefix --- @@ -1445,21 +1588,21 @@ strip numbers instead." (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 @@ -1490,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") @@ -1505,11 +1647,11 @@ strip numbers instead." (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 @@ -1524,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 () @@ -1568,6 +1745,7 @@ strip numbers instead." (defun mdw-fontify-tex () (setq ispell-parser 'tex) + (turn-on-reftex) ;; --- Don't make maths into a string --- @@ -1641,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" "