X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/52696e46085eb452409261a6bae0a069a78144a9..417dcddd244951d520987f103f4ff56bab5604c2:/dot-emacs.el diff --git a/dot-emacs.el b/dot-emacs.el index 55bd054..5d650cf 100644 --- a/dot-emacs.el +++ b/dot-emacs.el @@ -23,8 +23,35 @@ ;;; 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 --------------------------------------------- +(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,19 +71,22 @@ (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))) ;; --- Is an Emacs library available? --- @@ -262,22 +292,23 @@ 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))) + (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 ((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 @@ -617,12 +648,14 @@ doesn't cope with anything approximating a complicated case." (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") @@ -661,7 +694,7 @@ doesn't cope with anything approximating a complicated case." (label . 0) (case-label . +) (access-label . -) - (inclass . ++) + (inclass . +) (inline-open . ++) (statement-cont . 0) (statement-case-intro . +))) @@ -693,7 +726,7 @@ doesn't cope with anything approximating a complicated case." (make-local-variable 'font-lock-keywords) (let ((c-keywords - (make-regexp '( + (mdw-regexps '( "and" ;C++ "and_eq" ;C++ "asm" ;K&R, GCC @@ -793,11 +826,11 @@ doesn't cope with anything approximating a complicated case." "__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")))) @@ -876,7 +909,7 @@ 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" + (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")))) @@ -943,7 +976,7 @@ 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" + (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" @@ -1018,7 +1051,7 @@ 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" + (mdw-regexps '("abstract" "as" "base" "bool" "break" "byte" "case" "catch" "char" "checked" "class" "const" "continue" "decimal" "default" "delegate" "do" "double" "else" "enum" @@ -1095,7 +1128,7 @@ 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" + (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" @@ -1159,7 +1192,7 @@ 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" + (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" @@ -1204,7 +1237,6 @@ strip numbers instead." ;; --- Define Python fontification style --- -(trap (require 'pyrex-mode)) (defun mdw-fontify-python () ;; --- Miscellaneous fiddling --- @@ -1216,7 +1248,7 @@ strip numbers instead." (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" @@ -1391,7 +1423,7 @@ strip numbers instead." (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" @@ -1450,7 +1482,7 @@ strip numbers instead." (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" @@ -1510,7 +1542,7 @@ strip numbers instead." (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" @@ -1722,7 +1754,7 @@ strip numbers instead." (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" @@ -1767,7 +1799,7 @@ strip numbers instead." (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 @@ -1811,7 +1843,7 @@ strip numbers instead." (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 @@ -1948,7 +1980,7 @@ strip numbers instead." (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 ---------------------------------------------------------