el/dot-emacs.el: Fix Scala keywords.
[profile] / el / dot-emacs.el
index dc96aaf..e341b93 100644 (file)
@@ -190,6 +190,29 @@ fringes is not taken out of the allowance for WIDTH, unlike
       (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
@@ -852,6 +875,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))
+(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
@@ -891,6 +917,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"))
+(mdw-define-face mdw-trivial-face)
 (mdw-define-face font-lock-function-name-face
   (t :slant italic))
 (mdw-define-face font-lock-keyword-face
@@ -982,6 +1009,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-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"))
@@ -1452,6 +1491,78 @@ doesn't match any of the regular expressions in
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
+;;; Scala programming configuration.
+
+(defun mdw-fontify-scala ()
+
+  ;; 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 "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"))
+
+    (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.
@@ -1654,7 +1765,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"
-                     "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
@@ -1662,6 +1782,26 @@ doesn't match any of the regular expressions in
           ;; 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.
           ;;
@@ -2063,11 +2203,11 @@ strip numbers instead."
                          "t" "f")))
     (setq font-lock-keywords
          (list (list (concat "\\<\\(" dylan-keywords
-                             "\\|" (concat "with\\(out\\)?-" word)
-                             "\\|" (concat word ":")
+                             "\\|" "with\\(out\\)?-" word
                              "\\)\\>")
                      '(0 font-lock-keyword-face))
-               (list (concat "#\\(" sharp-keywords "\\)\\>")
+               (list (concat "\\<" word ":" "\\|"
+                             "#\\(" sharp-keywords "\\)\\>")
                      '(0 font-lock-variable-name-face))
                (list (concat "\\("
                              "\\([-+]\\|\\<\\)[0-9]+" "\\("
@@ -2265,32 +2405,73 @@ strip numbers instead."
 (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 ">")
 
+  ;; 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
-        (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
-          (list "--.*$"
+          (list (concat "{-" "[^-]*" "\\(-+[^-}][^-]*\\)*"
+                             "\\(-+}\\|-*\\'\\)"
+                        "\\|"
+                        "--.*$")
                 '(0 font-lock-comment-face))
-          (list (concat "\\<\\(" haskell-keywords "\\)\\>")
+          (list (concat "\\_<\\(" haskell-keywords "\\)\\_>")
                 '(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/\\)"
@@ -2839,9 +3020,26 @@ setting once it's actually been made."
   ;; 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))
 
@@ -2852,6 +3050,13 @@ setting once it's actually been made."
        (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]*\\)"))
 
 ;;;--------------------------------------------------------------------------