dot/emacs, el/dot-emacs.el: Support for Dylan code.
[profile] / el / dot-emacs.el
index f229905..4f9bd59 100644 (file)
@@ -124,6 +124,14 @@ library."
   (and (library-exists-p file)
        (autoload symbol file docstring interactivep type)))
 
+(defun mdw-kick-menu-bar (&optional frame)
+  "Regenerate FRAME's menu bar so it doesn't have empty menus."
+  (interactive)
+  (unless frame (setq frame (selected-frame)))
+  (let ((old (frame-parameter frame 'menu-bar-lines)))
+    (set-frame-parameter frame 'menu-bar-lines 0)
+    (set-frame-parameter frame 'menu-bar-lines old)))
+
 ;; Splitting windows.
 
 (unless (fboundp 'scroll-bar-columns)
@@ -637,21 +645,15 @@ This is mainly useful in `auto-fill-mode'.")
 
 ;; Utility functions.
 
-(defun mdw-tabify (s)
-  "Tabify the string S.  This is a horrid hack."
-  (save-excursion
-    (save-match-data
-      (let (start end)
-       (beginning-of-line)
-       (setq start (point-marker))
+(defun mdw-maybe-tabify (s)
+  "Tabify or untabify the string S, according to `indent-tabs-mode'."
+  (let ((tabfun (if indent-tabs-mode #'tabify #'untabify)))
+    (with-temp-buffer
+      (save-match-data
        (insert s "\n")
-       (setq end (point-marker))
-       (tabify start end)
-       (setq s (buffer-substring start (1- end)))
-       (delete-region start end)
-       (set-marker start nil)
-       (set-marker end nil)
-       s))))
+       (let ((start (point-min)) (end (point-max)))
+         (funcall tabfun (point-min) (point-max))
+         (setq s (buffer-substring (point-min) (1- (point-max)))))))))
 
 (defun mdw-examine-fill-prefixes (l)
   "Given a list of dynamic fill prefixes, pick one which matches
@@ -659,9 +661,9 @@ context and return the static fill prefix to use.  Point must be
 at the start of a line, and match data must be saved."
   (cond ((not l) nil)
               ((looking-at (car (car l)))
-               (mdw-tabify (apply (function concat)
-                                  (mapcar (function mdw-do-prefix-match)
-                                          (cdr (car l))))))
+               (mdw-maybe-tabify (apply #'concat
+                                        (mapcar #'mdw-do-prefix-match
+                                                (cdr (car l))))))
               (t (mdw-examine-fill-prefixes (cdr l)))))
 
 (defun mdw-maybe-car (p)
@@ -755,7 +757,7 @@ case."
   (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)))
@@ -914,6 +916,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 message-separator
   (t :background "red" :foreground "white" :weight bold))
 (mdw-define-face message-cited-text
@@ -964,6 +967,22 @@ doesn't match any of the regular expressions in
   (((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
+  (t :foreground "red"))
+(mdw-define-face magit-diff-file-header
+  (t :weight bold))
+(mdw-define-face magit-diff-hunk-header
+  (t :foreground "SkyBlue1"))
+(mdw-define-face magit-item-highlight
+  (((type tty)) :background "blue")
+  (t :background "DarkSeaGreen4"))
+
 (mdw-define-face erc-input-face
   (t :foreground "red"))
 
@@ -972,6 +991,21 @@ doesn't match any of the regular expressions in
 (mdw-define-face woman-italic
   (t :slant italic))
 
+(eval-after-load "rst"
+  '(progn
+     (mdw-define-face rst-level-1-face
+       (t :foreground "SkyBlue1" :weight bold))
+     (mdw-define-face rst-level-2-face
+       (t :foreground "SeaGreen1" :weight bold))
+     (mdw-define-face rst-level-3-face
+       (t :weight bold))
+     (mdw-define-face rst-level-4-face
+       (t :slant italic))
+     (mdw-define-face rst-level-5-face
+       (t :underline t))
+     (mdw-define-face rst-level-6-face
+       ())))
+
 (mdw-define-face p4-depot-added-face
   (t :foreground "green"))
 (mdw-define-face p4-depot-branch-op-face
@@ -991,6 +1025,11 @@ doesn't match any of the regular expressions in
 (mdw-define-face p4-diff-ins-face
   (t :foreground "green"))
 
+(mdw-define-face w3m-anchor-face
+  (t :foreground "SkyBlue1" :underline t))
+(mdw-define-face w3m-arrived-anchor-face
+  (t :foreground "SkyBlue1" :underline t))
+
 (mdw-define-face whizzy-slice-face
   (t :background "grey10"))
 (mdw-define-face whizzy-error-face
@@ -1389,17 +1428,17 @@ doesn't match any of the regular expressions in
          (list
 
           ;; Handle the keywords defined above.
-          (list (concat "\\<\\(" javascript-keywords "\\)\\>")
+          (list (concat "\\_<\\(" javascript-keywords "\\)\\_>")
                 '(0 font-lock-keyword-face))
 
           ;; Handle the predefined constants defined above.
-          (list (concat "\\<\\(" javascript-constants "\\)\\>")
+          (list (concat "\\_<\\(" javascript-constants "\\)\\_>")
                 '(0 font-lock-variable-name-face))
 
           ;; Handle numbers too.
           ;;
           ;; The following isn't quite right, but it's close enough.
-          (list (concat "\\<\\("
+          (list (concat "\\_<\\("
                         "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
                         "[0-9]+\\(\\.[0-9]*\\|\\)"
                         "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
@@ -1659,12 +1698,12 @@ strip numbers instead."
        (list
 
         ;; Set up the keywords defined above.
-        (list (concat "\\<\\(" keywords "\\)\\>")
+        (list (concat "\\_<\\(" keywords "\\)\\_>")
               '(0 font-lock-keyword-face))
 
         ;; At least numbers are simpler than C.
-        (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
-                      "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
+        (list (concat "\\_<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
+                      "\\_<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
                       "\\([eE]\\([-+]\\|\\)[0-9_]+\\|[lL]\\|\\)")
               '(0 mdw-number-face))
 
@@ -1830,9 +1869,9 @@ strip numbers instead."
 
         ;; 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))
 
 ;;;--------------------------------------------------------------------------
@@ -1862,6 +1901,74 @@ strip numbers instead."
   (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
+                             "\\|" (concat "with\\(out\\)?-" word)
+                             "\\|" (concat word ":")
+                             "\\)\\>")
+                     '(0 font-lock-keyword-face))
+               (list (concat "#\\(" 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))
+
+;;;--------------------------------------------------------------------------
 ;;; REXX configuration.
 
 (defun mdw-rexx-electric-* ()