dot/emacs, el/dot-emacs.el: Prefer Iceweasel over Chrome.
[profile] / el / dot-emacs.el
index e9ed90a..eb30141 100644 (file)
@@ -190,6 +190,29 @@ fringes is not taken out of the allowance for WIDTH, unlike
       (other-window 1))
     (select-window win)))
 
       (other-window 1))
     (select-window win)))
 
+;; Don't raise windows unless I say so.
+
+(defvar mdw-inhibit-raise-frame nil
+  "*Whether `raise-frame' should do nothing when the frame is mapped.")
+
+(defadvice raise-frame
+    (around mdw-inhibit (&optional frame) activate compile)
+  "Don't actually do anything if `mdw-inhibit-raise-frame' is true, and the
+frame is actually mapped on the screen."
+  (if mdw-inhibit-raise-frame
+      (make-frame-visible frame)
+    ad-do-it))
+
+(defmacro mdw-advise-to-inhibit-raise-frame (function)
+  "Advise the FUNCTION not to raise frames, even if it wants to."
+  `(defadvice ,function
+       (around mdw-inhibit-raise (&rest hunoz) activate compile)
+     "Don't raise the window unless you have to."
+     (let ((mdw-inhibit-raise-frame t))
+       ad-do-it)))
+
+(mdw-advise-to-inhibit-raise-frame select-frame-set-input-focus)
+
 ;; Transient mark mode hacks.
 
 (defadvice exchange-point-and-mark
 ;; Transient mark mode hacks.
 
 (defadvice exchange-point-and-mark
@@ -550,10 +573,10 @@ If NEW-SESSION-P, start a new session."
        (select-window window)))))
 
 (defvar mdw-good-url-browsers
        (select-window window)))))
 
 (defvar mdw-good-url-browsers
-  '(browse-url-generic
+  '(browse-url-mozilla
+    browse-url-generic
     (w3m . mdw-w3m-browse-url)
     (w3m . mdw-w3m-browse-url)
-    browse-url-w3
-    browse-url-mozilla)
+    browse-url-w3)
   "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).")
   "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).")
@@ -757,7 +780,7 @@ case."
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (if (fboundp 'hs-minor-mode)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (if (fboundp 'hs-minor-mode)
-      (hs-minor-mode t)
+      (trap (hs-minor-mode t))
     (outline-minor-mode t))
   (reveal-mode t)
   (trap (turn-on-font-lock)))
     (outline-minor-mode t))
   (reveal-mode t)
   (trap (turn-on-font-lock)))
@@ -842,6 +865,9 @@ doesn't match any of the regular expressions in
   (((type tty) (class color)) :background "blue")
   (((type tty) (class mono)) :inverse-video t)
   (t :background "grey30"))
   (((type tty) (class color)) :background "blue")
   (((type tty) (class mono)) :inverse-video t)
   (t :background "grey30"))
+(mdw-define-face mc/cursor-face
+  (((type tty) (class mono)) :inverse-video t)
+  (t :background "red"))
 (mdw-define-face minibuffer-prompt
   (t :weight bold))
 (mdw-define-face mode-line
 (mdw-define-face minibuffer-prompt
   (t :weight bold))
 (mdw-define-face mode-line
@@ -852,6 +878,9 @@ doesn't match any of the regular expressions in
   (((class color)) :foreground "yellow" :background "blue"
                   :box (:line-width 1 :style released-button))
   (t :inverse-video t))
   (((class color)) :foreground "yellow" :background "blue"
                   :box (:line-width 1 :style released-button))
   (t :inverse-video t))
+(mdw-define-face nobreak-space
+  (((type tty)))
+  (t :inherit escape-glyph :underline t))
 (mdw-define-face scroll-bar
   (t :foreground "black" :background "lightgrey"))
 (mdw-define-face fringe
 (mdw-define-face scroll-bar
   (t :foreground "black" :background "lightgrey"))
 (mdw-define-face fringe
@@ -891,6 +920,7 @@ doesn't match any of the regular expressions in
   (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
 (mdw-define-face mdw-number-face
   (t :foreground "yellow"))
   (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
 (mdw-define-face mdw-number-face
   (t :foreground "yellow"))
+(mdw-define-face mdw-trivial-face)
 (mdw-define-face font-lock-function-name-face
   (t :slant italic))
 (mdw-define-face font-lock-keyword-face
 (mdw-define-face font-lock-function-name-face
   (t :slant italic))
 (mdw-define-face font-lock-keyword-face
@@ -916,6 +946,7 @@ doesn't match any of the regular expressions in
 (mdw-define-face font-lock-string-face
   (((class mono)) :weight bold)
   (((class color)) :foreground "SkyBlue1"))
 (mdw-define-face font-lock-string-face
   (((class mono)) :weight bold)
   (((class color)) :foreground "SkyBlue1"))
+
 (mdw-define-face message-separator
   (t :background "red" :foreground "white" :weight bold))
 (mdw-define-face message-cited-text
 (mdw-define-face message-separator
   (t :background "red" :foreground "white" :weight bold))
 (mdw-define-face message-cited-text
@@ -966,6 +997,10 @@ doesn't match any of the regular expressions in
   (((class color) (type x)) :background "RoyalBlue4")
   (t :underline t))
 
   (((class color) (type x)) :background "RoyalBlue4")
   (t :underline t))
 
+(mdw-define-face dylan-header-background
+  (((class color) (type x)) :background "NavyBlue")
+  (t :background "blue"))
+
 (mdw-define-face magit-diff-add
   (t :foreground "green"))
 (mdw-define-face magit-diff-del
 (mdw-define-face magit-diff-add
   (t :foreground "green"))
 (mdw-define-face magit-diff-del
@@ -977,6 +1012,18 @@ doesn't match any of the regular expressions in
 (mdw-define-face magit-item-highlight
   (((type tty)) :background "blue")
   (t :background "DarkSeaGreen4"))
 (mdw-define-face magit-item-highlight
   (((type tty)) :background "blue")
   (t :background "DarkSeaGreen4"))
+(mdw-define-face magit-log-head-label-remote
+  (((type tty)) :background "cyan" :foreground "green")
+  (t :background "grey11" :foreground "DarkSeaGreen2" :box t))
+(mdw-define-face magit-log-head-label-local
+  (((type tty)) :background "cyan" :foreground "yellow")
+  (t :background "grey11" :foreground "LightSkyBlue1" :box t))
+(mdw-define-face magit-log-head-label-tags
+  (((type tty)) :background "red" :foreground "yellow")
+  (t :background "LemonChiffon1" :foreground "goldenrod4" :box t))
+(mdw-define-face magit-log-graph
+  (((type tty)) :foreground "magenta")
+  (t :foreground "grey80"))
 
 (mdw-define-face erc-input-face
   (t :foreground "red"))
 
 (mdw-define-face erc-input-face
   (t :foreground "red"))
@@ -1153,7 +1200,6 @@ doesn't match any of the regular expressions in
                      "explicit"        ;C++
                      "export"          ;C++
                      "extern"          ;K&R, C89
                      "explicit"        ;C++
                      "export"          ;C++
                      "extern"          ;K&R, C89
-                     "false"           ;C++, C9X macro
                      "float"           ;K&R, C89
                      "for"             ;K&R, C89
                      ;; "fortran"      ;K&R
                      "float"           ;K&R, C89
                      "for"             ;K&R, C89
                      ;; "fortran"      ;K&R
@@ -1185,9 +1231,7 @@ doesn't match any of the regular expressions in
                      "struct"           ;K&R, C89
                      "switch"           ;K&R, C89
                      "template"         ;C++
                      "struct"           ;K&R, C89
                      "switch"           ;K&R, C89
                      "template"         ;C++
-                     "this"             ;C++
                      "throw"            ;C++
                      "throw"            ;C++
-                     "true"             ;C++, C9X macro
                      "try"              ;C++
                      "this"             ;C++
                      "typedef"          ;C89
                      "try"              ;C++
                      "this"             ;C++
                      "typedef"          ;C89
@@ -1222,6 +1266,11 @@ doesn't match any of the regular expressions in
                      "__typeof__"       ;GCC
                      "__volatile__"     ;GCC
                      ))
                      "__typeof__"       ;GCC
                      "__volatile__"     ;GCC
                      ))
+       (c-constants
+        (mdw-regexps "false"           ;C++, C9X macro
+                     "this"             ;C++
+                     "true"             ;C++, C9X macro
+                     ))
        (preprocessor-keywords
         (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
                      "ident" "if" "ifdef" "ifndef" "import" "include"
        (preprocessor-keywords
         (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
                      "ident" "if" "ifdef" "ifndef" "import" "include"
@@ -1253,6 +1302,9 @@ doesn't match any of the regular expressions in
           (list (concat "\\<\\(" c-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
 
           (list (concat "\\<\\(" c-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
 
+          (list (concat "\\<\\(" c-constants "\\)\\>")
+                '(0 font-lock-variable-name-face))
+
           ;; Handle numbers too.
           ;;
           ;; This looks strange, I know.  It corresponds to the
           ;; Handle numbers too.
           ;;
           ;; This looks strange, I know.  It corresponds to the
@@ -1357,11 +1409,11 @@ doesn't match any of the regular expressions in
                      "for" "goto" "if" "implements" "import" "instanceof"
                      "int" "interface" "long" "native" "new" "package"
                      "private" "protected" "public" "return" "short"
                      "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"
+                     "static" "switch" "synchronized" "throw" "throws"
+                     "transient" "try" "void" "volatile" "while"))
 
 
-                     "false" "null" "true")))
+       (java-constants
+        (mdw-regexps "false" "null" "super" "this" "true")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
@@ -1370,6 +1422,10 @@ doesn't match any of the regular expressions in
           (list (concat "\\<\\(" java-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
 
           (list (concat "\\<\\(" java-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
 
+          ;; Handle the magic constants defined above.
+          (list (concat "\\<\\(" java-constants "\\)\\>")
+                '(0 font-lock-variable-name-face))
+
           ;; Handle numbers too.
           ;;
           ;; The following isn't quite right, but it's close enough.
           ;; Handle numbers too.
           ;;
           ;; The following isn't quite right, but it's close enough.
@@ -1447,6 +1503,81 @@ doesn't match any of the regular expressions in
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
+;;; Scala programming configuration.
+
+(defun mdw-fontify-scala ()
+
+  ;; Comment filling.
+  (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
+
+  ;; Define things to be fontified.
+  (make-local-variable 'font-lock-keywords)
+  (let ((scala-keywords
+        (mdw-regexps "abstract" "case" "catch" "class" "def" "do" "else"
+                     "extends" "final" "finally" "for" "forSome" "if"
+                     "implicit" "import" "lazy" "match" "new" "object"
+                     "override" "package" "private" "protected" "return"
+                     "sealed" "throw" "trait" "try" "type" "val"
+                     "var" "while" "with" "yield"))
+       (scala-constants
+        (mdw-regexps "false" "null" "super" "this" "true"))
+       (punctuation "[-!%^&*=+:@#~/?\\|`]"))
+
+    (setq font-lock-keywords
+         (list
+
+          ;; Magical identifiers between backticks.
+          (list (concat "`\\([^`]+\\)`")
+                '(1 font-lock-variable-name-face))
+
+          ;; Handle the keywords defined above.
+          (list (concat "\\_<\\(" scala-keywords "\\)\\_>")
+                '(0 font-lock-keyword-face))
+
+          ;; Handle the constants defined above.
+          (list (concat "\\_<\\(" scala-constants "\\)\\_>")
+                '(0 font-lock-variable-name-face))
+
+          ;; Magical identifiers between backticks.
+          (list (concat "`\\([^`]+\\)`")
+                '(1 font-lock-variable-name-face))
+
+          ;; Handle numbers too.
+          ;;
+          ;; As usual, not quite right.
+          (list (concat "\\_<\\("
+                        "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
+                        "[0-9]+\\(\\.[0-9]*\\|\\)"
+                        "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
+                        "[lLfFdD]?")
+                '(0 mdw-number-face))
+
+          ;; Identifiers with trailing operators.
+          (list (concat "_\\(" punctuation "\\)+")
+                '(0 mdw-trivial-face))
+
+          ;; And everything else is punctuation.
+          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                '(0 mdw-punct-face)))
+
+         font-lock-syntactic-keywords
+         (list
+
+          ;; Single quotes around characters.  But not when used to quote
+          ;; symbol names.  Ugh.
+          (list (concat "\\('\\)"
+                        "\\(" "."
+                        "\\|" "\\\\" "\\(" "\\\\\\\\" "\\)*"
+                              "u+" "[0-9a-fA-F]\\{4\\}"
+                        "\\|" "\\\\" "[0-7]\\{1,3\\}"
+                        "\\|" "\\\\" "." "\\)"
+                        "\\('\\)")
+                '(1 "\"")
+                '(4 "\"")))))
+
+  (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
 ;;; C# programming configuration.
 
 ;; Make indentation nice.
 ;;; C# programming configuration.
 
 ;; Make indentation nice.
@@ -1475,22 +1606,22 @@ doesn't match any of the regular expressions in
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
   (let ((csharp-keywords
   ;; 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")))
+        (mdw-regexps "abstract" "as" "bool" "break" "byte" "case" "catch"
+                     "char" "checked" "class" "const" "continue" "decimal"
+                     "default" "delegate" "do" "double" "else" "enum"
+                     "event" "explicit" "extern" "finally" "fixed" "float"
+                     "for" "foreach" "goto" "if" "implicit" "in" "int"
+                     "interface" "internal" "is" "lock" "long" "namespace"
+                     "new" "object" "operator" "out" "override" "params"
+                     "private" "protected" "public" "readonly" "ref"
+                     "return" "sbyte" "sealed" "short" "sizeof"
+                     "stackalloc" "static" "string" "struct" "switch"
+                     "throw" "try" "typeof" "uint" "ulong" "unchecked"
+                     "unsafe" "ushort" "using" "virtual" "void" "volatile"
+                     "while" "yield"))
+
+       (csharp-constants
+        (mdw-regexps "base" "false" "null" "this" "true")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
@@ -1499,6 +1630,10 @@ doesn't match any of the regular expressions in
           (list (concat "\\<\\(" csharp-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
 
           (list (concat "\\<\\(" csharp-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
 
+          ;; Handle the magic constants defined above.
+          (list (concat "\\<\\(" csharp-constants "\\)\\>")
+                '(0 font-lock-variable-name-face))
+
           ;; Handle numbers too.
           ;;
           ;; The following isn't quite right, but it's close enough.
           ;; Handle numbers too.
           ;;
           ;; The following isn't quite right, but it's close enough.
@@ -1519,6 +1654,127 @@ doesn't match any of the regular expressions in
   "Major mode for editing C# code.")
 
 ;;;--------------------------------------------------------------------------
   "Major mode for editing C# code.")
 
 ;;;--------------------------------------------------------------------------
+;;; F# programming configuration.
+
+(setq fsharp-indent-offset 2)
+
+(defun mdw-fontify-fsharp ()
+
+  (let ((punct "=<>+-*/|&%!@?"))
+    (do ((i 0 (1+ i)))
+       ((>= i (length punct)))
+      (modify-syntax-entry (aref punct i) ".")))
+
+  (modify-syntax-entry ?_ "_")
+  (modify-syntax-entry ?( "(")
+  (modify-syntax-entry ?) ")")
+
+  (setq indent-tabs-mode nil)
+
+  (let ((fsharp-keywords
+        (mdw-regexps "abstract" "and" "as" "assert" "atomic"
+                     "begin" "break"
+                     "checked" "class" "component" "const" "constraint"
+                     "constructor" "continue"
+                     "default" "delegate" "do" "done" "downcast" "downto"
+                     "eager" "elif" "else" "end" "exception" "extern"
+                     "finally" "fixed" "for" "fori" "fun" "function"
+                     "functor"
+                     "global"
+                     "if" "in" "include" "inherit" "inline" "interface"
+                     "internal"
+                     "lazy" "let"
+                     "match" "measure" "member" "method" "mixin" "module"
+                     "mutable"
+                     "namespace" "new"
+                     "object" "of" "open" "or" "override"
+                     "parallel" "params" "private" "process" "protected"
+                     "public" "pure"
+                     "rec" "recursive" "return"
+                     "sealed" "sig" "static" "struct"
+                     "tailcall" "then" "to" "trait" "try" "type"
+                     "upcast" "use"
+                     "val" "virtual" "void" "volatile"
+                     "when" "while" "with"
+                     "yield"))
+
+       (fsharp-builtins
+        (mdw-regexps "asr" "land" "lor" "lsl" "lsr" "lxor" "mod"
+                     "base" "false" "null" "true"))
+
+       (bang-keywords
+        (mdw-regexps "do" "let" "return" "use" "yield"))
+
+       (preprocessor-keywords
+        (mdw-regexps "if" "indent" "else" "endif")))
+
+    (setq font-lock-keywords
+         (list (list (concat "\\(^\\|[^\"]\\)"
+                             "\\(" "(\\*"
+                                   "[^*]*\\*+"
+                                   "\\(" "[^)*]" "[^*]*" "\\*+" "\\)*"
+                                   ")"
+                             "\\|"
+                                   "//.*"
+                             "\\)")
+                     '(2 font-lock-comment-face))
+
+               (list (concat "'" "\\("
+                                   "\\\\"
+                                   "\\(" "[ntbr'\\]"
+                                   "\\|" "[0-9][0-9][0-9]"
+                                   "\\|" "u" "[0-9a-fA-F]\\{4\\}"
+                                   "\\|" "U" "[0-9a-fA-F]\\{8\\}"
+                                   "\\)"
+                                 "\\|"
+                                 "." "\\)" "'"
+                             "\\|"
+                             "\"" "[^\"\\]*"
+                                   "\\(" "\\\\" "\\(.\\|\n\\)"
+                                         "[^\"\\]*" "\\)*"
+                             "\\(\"\\|\\'\\)")
+                     '(0 font-lock-string-face))
+
+               (list (concat "\\_<\\(" bang-keywords "\\)!" "\\|"
+                             "^#[ \t]*\\(" preprocessor-keywords "\\)\\_>"
+                             "\\|"
+                             "\\_<\\(" fsharp-keywords "\\)\\_>")
+                     '(0 font-lock-keyword-face))
+               (list (concat "\\<\\(" fsharp-builtins "\\)\\_>")
+                     '(0 font-lock-variable-name-face))
+
+               (list (concat "\\_<"
+                             "\\(" "0[bB][01]+" "\\|"
+                                   "0[oO][0-7]+" "\\|"
+                                   "0[xX][0-9a-fA-F]+" "\\)"
+                             "\\(" "lf\\|LF" "\\|"
+                                   "[uU]?[ysnlL]?" "\\)"
+                             "\\|"
+                             "\\_<"
+                             "[0-9]+" "\\("
+                               "[mMQRZING]"
+                               "\\|"
+                               "\\(\\.[0-9]*\\)?"
+                               "\\([eE][-+]?[0-9]+\\)?"
+                               "[fFmM]?"
+                               "\\|"
+                               "[uU]?[ysnlL]?"
+                             "\\)")
+                     '(0 mdw-number-face))
+
+               (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                     '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
+
+(defun mdw-fontify-inferior-fsharp ()
+  (mdw-fontify-fsharp)
+  (setq font-lock-keywords
+       (append (list (list "^[#-]" '(0 font-lock-comment-face))
+                     (list "^>" '(0 font-lock-keyword-face)))
+               font-lock-keywords)))
+
+;;;--------------------------------------------------------------------------
 ;;; Go programming configuration.
 
 (defun mdw-fontify-go ()
 ;;; Go programming configuration.
 
 (defun mdw-fontify-go ()
@@ -1529,7 +1785,16 @@ doesn't match any of the regular expressions in
                      "default" "defer" "else" "fallthrough" "for"
                      "func" "go" "goto" "if" "import"
                      "interface" "map" "package" "range" "return"
                      "default" "defer" "else" "fallthrough" "for"
                      "func" "go" "goto" "if" "import"
                      "interface" "map" "package" "range" "return"
-                     "select" "struct" "switch" "type" "var")))
+                     "select" "struct" "switch" "type" "var"))
+       (go-intrinsics
+        (mdw-regexps "bool" "byte" "complex64" "complex128" "error"
+                     "float32" "float64" "int" "uint8" "int16" "int32"
+                     "int64" "rune" "string" "uint" "uint8" "uint16"
+                     "uint32" "uint64" "uintptr" "void"
+                     "false" "iota" "nil" "true"
+                     "init" "main"
+                     "append" "cap" "copy" "delete" "imag" "len" "make"
+                     "new" "panic" "real" "recover")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
@@ -1537,6 +1802,26 @@ doesn't match any of the regular expressions in
           ;; Handle the keywords defined above.
           (list (concat "\\<\\(" go-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
           ;; Handle the keywords defined above.
           (list (concat "\\<\\(" go-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
+          (list (concat "\\<\\(" go-intrinsics "\\)\\>")
+                '(0 font-lock-variable-name-face))
+
+          ;; Strings and characters.
+          (list (concat "'"
+                        "\\(" "[^\\']" "\\|"
+                              "\\\\"
+                              "\\(" "[abfnrtv\\'\"]" "\\|"
+                                    "[0-7]\\{3\\}" "\\|"
+                                    "x" "[0-9A-Fa-f]\\{2\\}" "\\|"
+                                    "u" "[0-9A-Fa-f]\\{4\\}" "\\|"
+                                    "U" "[0-9A-Fa-f]\\{8\\}" "\\)" "\\)"
+                        "'"
+                        "\\|"
+                        "\""
+                        "\\(" "[^\n\\\"]+" "\\|" "\\\\." "\\)*"
+                        "\\(\"\\|$\\)"
+                        "\\|"
+                        "`" "[^`]+" "`")
+                '(0 font-lock-string-face))
 
           ;; Handle numbers too.
           ;;
 
           ;; Handle numbers too.
           ;;
@@ -1864,9 +2149,9 @@ strip numbers instead."
 
         ;; And anything else is punctuation.
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
         ;; And anything else is punctuation.
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face)))
+              '(0 mdw-punct-face))))
 
 
-  (mdw-post-config-mode-hack))
+  (mdw-post-config-mode-hack)
   (run-hooks 'arm-assembler-mode-hook))
 
 ;;;--------------------------------------------------------------------------
   (run-hooks 'arm-assembler-mode-hook))
 
 ;;;--------------------------------------------------------------------------
@@ -1896,6 +2181,118 @@ strip numbers instead."
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
+;;; Dylan programming configuration.
+
+(defun mdw-fontify-dylan ()
+
+  (make-local-variable 'font-lock-keywords)
+
+  ;; Horrors.  `dylan-mode' sets the `major-mode' name after calling this
+  ;; hook, which undoes all of our configuration.
+  (setq major-mode 'dylan-mode)
+  (font-lock-set-defaults)
+
+  (let* ((word "[-_a-zA-Z!*@<>$%]+")
+        (dylan-keywords (mdw-regexps
+
+                         "C-address" "C-callable-wrapper" "C-function"
+                         "C-mapped-subtype" "C-pointer-type" "C-struct"
+                         "C-subtype" "C-union" "C-variable"
+
+                         "above" "abstract" "afterwards" "all"
+                         "begin" "below" "block" "by"
+                         "case" "class" "cleanup" "constant" "create"
+                         "define" "domain"
+                         "else" "elseif" "end" "exception" "export"
+                         "finally" "for" "from" "function"
+                         "generic"
+                         "handler"
+                         "if" "in" "instance" "interface" "iterate"
+                         "keyed-by"
+                         "let" "library" "local"
+                         "macro" "method" "module"
+                         "otherwise"
+                         "profiling"
+                         "select" "slot" "subclass"
+                         "table" "then" "to"
+                         "unless" "until" "use"
+                         "variable" "virtual"
+                         "when" "while"))
+        (sharp-keywords (mdw-regexps
+                         "all-keys" "key" "next" "rest" "include"
+                         "t" "f")))
+    (setq font-lock-keywords
+         (list (list (concat "\\<\\(" dylan-keywords
+                             "\\|" "with\\(out\\)?-" word
+                             "\\)\\>")
+                     '(0 font-lock-keyword-face))
+               (list (concat "\\<" word ":" "\\|"
+                             "#\\(" sharp-keywords "\\)\\>")
+                     '(0 font-lock-variable-name-face))
+               (list (concat "\\("
+                             "\\([-+]\\|\\<\\)[0-9]+" "\\("
+                               "\\(\\.[0-9]+\\)?" "\\([eE][-+][0-9]+\\)?"
+                               "\\|" "/[0-9]+"
+                             "\\)"
+                             "\\|" "\\.[0-9]+" "\\([eE][-+][0-9]+\\)?"
+                             "\\|" "#b[01]+"
+                             "\\|" "#o[0-7]+"
+                             "\\|" "#x[0-9a-zA-Z]+"
+                             "\\)\\>")
+                     '(0 mdw-number-face))
+               (list (concat "\\("
+                             "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\|"
+                             "\\_<[-+*/=<>:&|]+\\_>"
+                             "\\)")
+                     '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
+;;; Algol 68 configuration.
+
+(setq a68-indent-step 2)
+
+(defun mdw-fontify-algol-68 ()
+
+  ;; Fix up the syntax table.
+  (modify-syntax-entry ?# "!" a68-mode-syntax-table)
+  (dolist (ch '(?- ?+ ?= ?< ?> ?* ?/ ?| ?&))
+    (modify-syntax-entry ch "." a68-mode-syntax-table))
+
+  (make-local-variable 'font-lock-keywords)
+
+  (let ((not-comment
+        (let ((word "COMMENT"))
+          (do ((regexp (concat "[^" (substring word 0 1) "]+")
+                       (concat regexp "\\|"
+                               (substring word 0 i)
+                               "[^" (substring word i (1+ i)) "]"))
+               (i 1 (1+ i)))
+              ((>= i (length word)) regexp)))))
+    (setq font-lock-keywords
+         (list (list (concat "\\<COMMENT\\>"
+                             "\\(" not-comment "\\)\\{0,5\\}"
+                             "\\(\\'\\|\\<COMMENT\\>\\)")
+                     '(0 font-lock-comment-face))
+               (list (concat "\\<CO\\>"
+                             "\\([^C]+\\|C[^O]\\)\\{0,5\\}"
+                             "\\($\\|\\<CO\\>\\)")
+                     '(0 font-lock-comment-face))
+               (list "\\<[A-Z_]+\\>"
+                     '(0 font-lock-keyword-face))
+               (list (concat "\\<"
+                             "[0-9]+"
+                             "\\(\\.[0-9]+\\)?"
+                             "\\([eE][-+]?[0-9]+\\)?"
+                             "\\>")
+                     '(0 mdw-number-face))
+               (list "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"
+                     '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
 ;;; REXX configuration.
 
 (defun mdw-rexx-electric-* ()
 ;;; REXX configuration.
 
 (defun mdw-rexx-electric-* ()
@@ -2028,32 +2425,73 @@ strip numbers instead."
 (defun mdw-fontify-haskell ()
 
   ;; Fiddle with syntax table to get comments right.
 (defun mdw-fontify-haskell ()
 
   ;; Fiddle with syntax table to get comments right.
-  (modify-syntax-entry ?' "\"")
-  (modify-syntax-entry ?- ". 123")
-  (modify-syntax-entry ?{ ". 1b")
-  (modify-syntax-entry ?} ". 4b")
+  (modify-syntax-entry ?' "_")
+  (modify-syntax-entry ?- ". 12")
   (modify-syntax-entry ?\n ">")
 
   (modify-syntax-entry ?\n ">")
 
+  ;; Make punctuation be punctuation
+  (let ((punct "=<>+-*/|&%!@?$.^:#`"))
+    (do ((i 0 (1+ i)))
+       ((>= i (length punct)))
+      (modify-syntax-entry (aref punct i) ".")))
+
   ;; Set fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*{?--?[ \t]*\\)")
 
   ;; Fiddle with fontification.
   (make-local-variable 'font-lock-keywords)
   (let ((haskell-keywords
   ;; Set fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*{?--?[ \t]*\\)")
 
   ;; Fiddle with fontification.
   (make-local-variable 'font-lock-keywords)
   (let ((haskell-keywords
-        (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")))
+        (mdw-regexps "as"
+                     "case" "ccall" "class"
+                     "data" "default" "deriving" "do"
+                     "else" "exists"
+                     "forall" "foreign"
+                     "hiding"
+                     "if" "import" "in" "infix" "infixl" "infixr" "instance"
+                     "let"
+                     "mdo" "module"
+                     "newtype"
+                     "of"
+                     "proc"
+                     "qualified"
+                     "rec"
+                     "safe" "stdcall"
+                     "then" "type"
+                     "unsafe"
+                     "where"))
+       (control-sequences
+        (mdw-regexps "ACK" "BEL" "BS" "CAN" "CR" "DC1" "DC2" "DC3" "DC4"
+                     "DEL" "DLE" "EM" "ENQ" "EOT" "ESC" "ETB" "ETX" "FF"
+                     "FS" "GS" "HT" "LF" "NAK" "NUL" "RS" "SI" "SO" "SOH"
+                     "SP" "STX" "SUB" "SYN" "US" "VT")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
-          (list "--.*$"
+          (list (concat "{-" "[^-]*" "\\(-+[^-}][^-]*\\)*"
+                             "\\(-+}\\|-*\\'\\)"
+                        "\\|"
+                        "--.*$")
                 '(0 font-lock-comment-face))
                 '(0 font-lock-comment-face))
-          (list (concat "\\<\\(" haskell-keywords "\\)\\>")
+          (list (concat "\\_<\\(" haskell-keywords "\\)\\_>")
                 '(0 font-lock-keyword-face))
                 '(0 font-lock-keyword-face))
-          (list (concat "\\<0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
-                        "\\<[0-9][0-9_]*\\(\\.[0-9]*\\|\\)"
+          (list (concat "'\\("
+                        "[^\\]"
+                        "\\|"
+                        "\\\\"
+                        "\\(" "[abfnrtv\\\"']" "\\|"
+                              "^" "\\(" control-sequences "\\|"
+                                        "[]A-Z@[\\^_]" "\\)" "\\|"
+                              "\\|"
+                              "[0-9]+" "\\|"
+                              "[oO][0-7]+" "\\|"
+                              "[xX][0-9A-Fa-f]+"
+                        "\\)"
+                        "\\)'")
+                '(0 font-lock-string-face))
+          (list "\\_<[A-Z]\\(\\sw+\\|\\s_+\\)*\\_>"
+                '(0 font-lock-variable-name-face))
+          (list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[oO][0-7]+\\)\\|"
+                        "\\_<[0-9]+\\(\\.[0-9]*\\|\\)"
                         "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
                 '(0 mdw-number-face))
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                         "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
                 '(0 mdw-number-face))
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
@@ -2602,9 +3040,26 @@ setting once it's actually been made."
   ;; Not much fontification needed.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
   ;; Not much fontification needed.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
-       (list
-        (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face))))
+       (list (list (concat "\\("
+                           "\\_<[-+]?"
+                           "\\(" "[0-9]+/[0-9]+"
+                           "\\|" "\\(" "[0-9]+" "\\(\\.[0-9]*\\)?" "\\|"
+                                       "\\.[0-9]+" "\\)"
+                                 "\\([dDeEfFlLsS][-+]?[0-9]+\\)?"
+                           "\\)"
+                           "\\|"
+                           "#"
+                           "\\(" "x" "[-+]?"
+                                 "[0-9A-Fa-f]+" "\\(/[0-9A-Fa-f]+\\)?"
+                           "\\|" "o" "[-+]?" "[0-7]+" "\\(/[0-7]+\\)?"
+                           "\\|" "b" "[-+]?" "[01]+" "\\(/[01]+\\)?"
+                           "\\|" "[0-9]+" "r" "[-+]?"
+                                 "[0-9a-zA-Z]+" "\\(/[0-9a-zA-Z]+\\)?"
+                           "\\)"
+                           "\\)\\_>")
+                   '(0 mdw-number-face))
+             (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                   '(0 mdw-punct-face))))
 
   (mdw-post-config-mode-hack))
 
 
   (mdw-post-config-mode-hack))
 
@@ -2615,6 +3070,13 @@ setting once it's actually been made."
        (indent-for-tab-command)))
 
 (defun mdw-setup-m4 ()
        (indent-for-tab-command)))
 
 (defun mdw-setup-m4 ()
+
+  ;; Inexplicably, Emacs doesn't match braces in m4 mode.  This is very
+  ;; annoying: fix it.
+  (modify-syntax-entry ?{ "(")
+  (modify-syntax-entry ?} ")")
+
+  ;; Fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
 
 ;;;--------------------------------------------------------------------------
   (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
 
 ;;;--------------------------------------------------------------------------