(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)
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
org-export-latex-classes)))
+(setq org-export-docbook-xslt-proc-command "xsltproc --output %o %s %i"
+ org-export-docbook-xsl-fo-proc-command "fop %i.safe %o"
+ org-export-docbook-xslt-stylesheet
+ "/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl")
+
;;;--------------------------------------------------------------------------
;;; Mail and news hacking.
(setenv "REAL_MOVEMAIL" try))
(setq path (cdr path)))))
+(eval-after-load "erc"
+ '(load "~/.ercrc.el"))
+
;;;--------------------------------------------------------------------------
;;; Utility functions.
;; 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
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)
(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)))
(mdw-define-face default
(((type w32)) :family "courier new" :height 85)
- (((type x)) :family "6x13" :height 130)
+ (((type x)) :family "6x13" :foundry "trad" :height 130)
(((type color)) :foreground "white" :background "black")
(t nil))
(mdw-define-face fixed-pitch
(((type w32)) :family "courier new" :height 85)
- (((type x)) :family "6x13" :height 130)
+ (((type x)) :family "6x13" :foundry "trad" :height 130)
(t :foreground "white" :background "black"))
(if (>= emacs-major-version 23)
(mdw-define-face variable-pitch
(((class color)) :background "red")
(t :inverse-video t))
(mdw-define-face highlight
- (((class color)) :background "DarkSeaGreen4")
+ (((type x) (class color)) :background "DarkSeaGreen4")
+ (((type tty) (class color)) :background "cyan")
(t :inverse-video t))
(mdw-define-face holiday-face
(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 which-func
(t nil))
+(mdw-define-face diff-header
+ (t nil))
(mdw-define-face diff-index
(t :weight bold))
(mdw-define-face diff-file-header
(t :foreground "red"))
(mdw-define-face diff-context
(t nil))
+(mdw-define-face diff-refine-change
+ (((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"))
(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
(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
(t :background "darkred"))
+;; Ellipses used to indicate hidden text (and similar).
+(mdw-define-face mdw-ellipsis-face
+ (((type tty)) :foreground "blue") (t :foreground "grey60"))
+(let ((dollar (make-glyph-code ?$ 'mdw-ellipsis-face))
+ (backslash (make-glyph-code ?\ 'mdw-ellipsis-face))
+ (dot (make-glyph-code ?. 'mdw-ellipsis-face))
+ (bar (make-glyph-code ?| mdw-ellipsis-face)))
+ (set-display-table-slot standard-display-table 0 dollar)
+ (set-display-table-slot standard-display-table 1 backslash)
+ (set-display-table-slot standard-display-table 4
+ (vector dot dot dot))
+ (set-display-table-slot standard-display-table 5 bar))
+
;;;--------------------------------------------------------------------------
;;; C programming configuration.
(arglist-cont-nonempty . mdw-c-lineup-arglist)
(topmost-intro . mdw-c-indent-extern-mumble)
(cpp-define-intro . 0)
+ (knr-argdecl . 0)
(inextern-lang . [0])
(label . 0)
(case-label . +)
(access-label . -)
(inclass . +)
(inline-open . ++)
- (statement-cont . 0)
+ (statement-cont . +)
(statement-case-intro . +)))
t))
(mdw-post-config-mode-hack))
;;;--------------------------------------------------------------------------
+;;; Javascript programming configuration.
+
+(defun mdw-javascript-style ()
+ (setq js-indent-level 2)
+ (setq js-expr-indent-offset 0))
+
+(defun mdw-fontify-javascript ()
+
+ ;; Other stuff.
+ (mdw-javascript-style)
+ (setq js-auto-indent-flag t)
+
+ ;; Now define things to be fontified.
+ (make-local-variable 'font-lock-keywords)
+ (let ((javascript-keywords
+ (mdw-regexps "abstract" "boolean" "break" "byte" "case" "catch"
+ "char" "class" "const" "continue" "debugger" "default"
+ "delete" "do" "double" "else" "enum" "export" "extends"
+ "final" "finally" "float" "for" "function" "goto" "if"
+ "implements" "import" "in" "instanceof" "int"
+ "interface" "let" "long" "native" "new" "package"
+ "private" "protected" "public" "return" "short"
+ "static" "super" "switch" "synchronized" "throw"
+ "throws" "transient" "try" "typeof" "var" "void"
+ "volatile" "while" "with" "yield"
+
+ "boolean" "byte" "char" "double" "float" "int" "long"
+ "short" "void"))
+ (javascript-constants
+ (mdw-regexps "false" "null" "undefined" "Infinity" "NaN" "true"
+ "arguments" "this")))
+
+ (setq font-lock-keywords
+ (list
+
+ ;; Handle the keywords defined above.
+ (list (concat "\\_<\\(" javascript-keywords "\\)\\_>")
+ '(0 font-lock-keyword-face))
+
+ ;; Handle the predefined constants defined above.
+ (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 "\\_<\\("
+ "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
+ "[0-9]+\\(\\.[0-9]*\\|\\)"
+ "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
+ "[lLfFdD]?")
+ '(0 mdw-number-face))
+
+ ;; And anything else is punctuation.
+ (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+ '(0 mdw-punct-face)))))
+
+ (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
;;; C# programming configuration.
;; Make indentation nice.
"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"
+ "base" "begin" "break"
+ "checked" "class" "component" "const" "constraint"
+ "constructor" "continue"
+ "default" "delegate" "do" "done" "downcast" "downto"
+ "eager" "elif" "else" "end" "exception" "extern"
+ "false" "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" "null"
+ "object""of" "open" "or" "override"
+ "parallel" "params" "private" "process" "protected"
+ "public" "pure"
+ "rec" "recursive" "return"
+ "sealed" "sig" "static" "struct"
+ "tailcall" "then" "to" "trait" "true" "try" "type"
+ "upcast" "use"
+ "val" "virtual" "void" "volatile"
+ "when" "while" "with"
+ "yield"))
+
+ (fsharp-builtins
+ (mdw-regexps "asr" "land" "lor" "lsl" "lsr" "lxor" "mod"))
+
+ (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 ()
"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
;; 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.
;;
;; Perl indentation style.
+(fset 'perl-mode 'cperl-mode)
(setq cperl-indent-level 2)
(setq cperl-continued-statement-offset 2)
(setq cperl-continued-brace-offset 0)
;; Now define fontification things.
(make-local-variable 'font-lock-keywords)
(let ((perl-keywords
- (mdw-regexps "and" "cmp" "continue" "do" "else" "elsif" "eq"
- "for" "foreach" "ge" "gt" "goto" "if"
+ (mdw-regexps "and" "break" "cmp" "continue" "do" "else" "elsif" "eq"
+ "for" "foreach" "ge" "given" "gt" "goto" "if"
"last" "le" "lt" "local" "my" "ne" "next" "or"
- "package" "redo" "require" "return" "sub"
- "undef" "unless" "until" "use" "while")))
+ "our" "package" "redo" "require" "return" "sub"
+ "undef" "unless" "until" "use" "when" "while")))
(setq font-lock-keywords
(list
(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))
"<" arm-assembler-mode-syntax-table)
(modify-syntax-entry ?\n ">" arm-assembler-mode-syntax-table)
(modify-syntax-entry ?_ "_" arm-assembler-mode-syntax-table)
+ (modify-syntax-entry ?' "\"'" arm-assembler-mode-syntax-table)
(make-local-variable 'comment-start)
(setq comment-start ";")
;; 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))
;;;--------------------------------------------------------------------------
(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-* ()
(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/\\)"
(run-hooks 'mdw-sgml-mode-hook))
;;;--------------------------------------------------------------------------
+;;; Configuration files.
+
+(defvar mdw-conf-quote-normal nil
+ "*Control syntax category of quote characters `\"' and `''.
+If this is `t', consider quote characters to be normal
+punctuation, as for `conf-quote-normal'. If this is `nil' then
+leave quote characters as quotes. If this is a list, then
+consider the quote characters in the list to be normal
+punctuation. If this is a single quote character, then consider
+that character only to be normal punctuation.")
+(defun mdw-conf-quote-normal-acceptable-value-p (value)
+ "Is the VALUE is an acceptable value for `mdw-conf-quote-normal'?"
+ (or (booleanp value)
+ (every (lambda (v) (memq v '(?\" ?')))
+ (if (listp value) value (list value)))))
+(put 'mdw-conf-quote-normal 'safe-local-variable '
+ mdw-conf-quote-normal-acceptable-value-p)
+
+(defun mdw-fix-up-quote ()
+ "Apply the setting of `mdw-conf-quote-normal'."
+ (let ((flag mdw-conf-quote-normal))
+ (cond ((eq flag t)
+ (conf-quote-normal t))
+ ((not flag)
+ nil)
+ (t
+ (let ((table (copy-syntax-table (syntax-table))))
+ (mapc (lambda (ch) (modify-syntax-entry ch "." table))
+ (if (listp flag) flag (list flag)))
+ (set-syntax-table table)
+ (and font-lock-mode (font-lock-fontify-buffer)))))))
+(defun mdw-fix-up-quote-hack ()
+ "Unpleasant hack to call `mdw-fix-up-quote' at the right time.
+Annoyingly, `hack-local-variables' is done after `set-auto-mode'
+so we wouldn't see a local-variable setting of
+`mdw-conf-quote-normal' in `conf-mode-hook'. Instead, wire
+ourselves onto `hack-local-variables-hook' here, and check the
+setting once it's actually been made."
+ (add-hook 'hack-local-variables-hook 'mdw-fix-up-quote t t))
+(add-hook 'conf-mode-hook 'mdw-fix-up-quote-hack t)
+
+;;;--------------------------------------------------------------------------
;;; Shell scripts.
(defun mdw-setup-sh-script-mode ()
(setq sh-indentation 2)
(setq sh-basic-offset 2))
+(setq sh-shell-file "/bin/sh")
+
+;; Awful hacking to override the shell detection for particular scripts.
+(defmacro define-custom-shell-mode (name shell)
+ `(defun ,name ()
+ (interactive)
+ (set (make-local-variable 'sh-shell-file) ,shell)
+ (sh-mode)))
+(define-custom-shell-mode bash-mode "/bin/bash")
+(define-custom-shell-mode rc-mode "/usr/bin/rc")
+(put 'sh-shell-file 'permanent-local t)
+
+;; Hack the rc syntax table. Backquotes aren't paired in rc.
+(eval-after-load "sh-script"
+ '(or (assq 'rc sh-mode-syntax-table-input)
+ (let ((frag '(nil
+ ?# "<"
+ ?\n ">#"
+ ?\" "\"\""
+ ?\' "\"\'"
+ ?$ "'"
+ ?\` "."
+ ?! "_"
+ ?% "_"
+ ?. "_"
+ ?^ "_"
+ ?~ "_"
+ ?, "_"
+ ?= "."
+ ?< "."
+ ?> "."))
+ (assoc (assq 'rc sh-mode-syntax-table-input)))
+ (if assoc
+ (rplacd assoc frag)
+ (setq sh-mode-syntax-table-input
+ (cons (cons 'rc frag)
+ sh-mode-syntax-table-input))))))
+
;;;--------------------------------------------------------------------------
;;; Emacs shell mode.
;; 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))
(define-key term-raw-map [M-left] 'term-send-meta-left)
(define-key term-raw-map [?\e ?\M-O ?D] 'term-send-meta-left)))
+(defadvice term-exec (before program-args-list compile activate)
+ "If the PROGRAM argument is a list, interpret it as (PROGRAM . SWITCHES).
+This allows you to pass a list of arguments through `ansi-term'."
+ (let ((program (ad-get-arg 2)))
+ (if (listp program)
+ (progn
+ (ad-set-arg 2 (car program))
+ (ad-set-arg 4 (cdr program))))))
+
+(defun ssh (host)
+ "Open a terminal containing an ssh session to the HOST."
+ (interactive "sHost: ")
+ (ansi-term (list "ssh" host) (format "ssh@%s" host)))
+
;;;--------------------------------------------------------------------------
;;; Inferior Emacs Lisp.