-;;; -*-emacs-lisp-*-
+;;; -*- mode: emacs-lisp; coding: utf-8 -*-
;;;
;;; $Id$
;;;
;;; 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 ---------------------------------------------
+(evan-when-compile (or (fboundp 'make-regexp)
+ (load "make-regexp")))
+
+(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
"Execute FORMS without allowing errors to propagate outside."
`(condition-case err
,(if (cdr forms) (cons 'progn forms) (car forms))
- (error (message "Error (trapped): %s" (error-message-string err)))))
+ (error (message "Error (trapped): %s in %s"
+ (error-message-string err)
+ ',forms))))
;; --- Configuration reading ---
;; --- Splitting windows ---
-(defconst mdw-scrollbar-width (if window-system 6 1)
- "Guessed width of scroll bar.")
+(or (and (fboundp 'scroll-bar-columns)
+ (fboundp 'fringe-columns))
+ (progn
+ (defun scroll-bar-columns (side)
+ (cond ((eq side 'left) 0)
+ (window-system 3)
+ (t 1)))
+ (defun fringe-columns (side)
+ (cond ((not window-system) 0)
+ ((eq side 'left) 1)
+ (t 2)))))
+
(defun mdw-divvy-window (&optional w)
"Split a wide window into appropriate widths."
(interactive)
- (or w (setq w 78))
- (let ((win (selected-window))
- (c (/ (+ (window-width) mdw-scrollbar-width)
- (+ w mdw-scrollbar-width))))
+ (or w (setq w (if (and window-system
+ (>= emacs-major-version 22))
+ 77
+ 78)))
+ (let* ((win (selected-window))
+ (sb-width (if (not window-system)
+ 1
+ (+ (scroll-bar-columns 'left)
+ (scroll-bar-columns 'right)
+ (fringe-columns 'left)
+ (fringe-columns 'right))))
+ (c (/ (+ (window-width) sb-width)
+ (+ w sb-width))))
(while (> c 1)
(setq c (1- c))
- (split-window-horizontally (+ w mdw-scrollbar-width))
+ (split-window-horizontally (+ w sb-width))
(other-window 1))
(select-window win)))
;;;----- Utility functions --------------------------------------------------
-(defun line-number-at-pos (&optional pos)
- "Print the current buffer line number and narrowed line number of point."
- (let ((opoint (or pos (point))) start)
- (save-excursion
- (save-restriction
- (goto-char (point-min))
- (widen)
- (forward-line 0)
- (setq start (point))
- (goto-char opoint)
- (forward-line 0)
- (1+ (count-lines 1 (point)))))))
+(or (fboundp 'line-number-at-pos)
+ (defun line-number-at-pos (&optional pos)
+ (let ((opoint (or pos (point))) start)
+ (save-excursion
+ (save-restriction
+ (goto-char (point-min))
+ (widen)
+ (forward-line 0)
+ (setq start (point))
+ (goto-char opoint)
+ (forward-line 0)
+ (1+ (count-lines 1 (point))))))))
;; --- mdw-uniquify-alist ---
(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)))
+(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
,@(cond ((eq window-system 'w32)
'(:family "courier new" :height 85))
((eq window-system 'x)
- '(:family "misc-fixed" :width semi-condensed))))
- (modeline :foreground "blue" :background "yellow"
- :box (:line-width 1 :style released-button))
+ '(:family "misc-fixed" :height 130 :width semi-condensed))))
+ (fixed-pitch)
+ (minibuffer-prompt)
+ (mode-line :foreground "blue" :background "yellow"
+ :box (:line-width 1 :style released-button))
+ (mode-line-inactive :foreground "yellow" :background "blue"
+ :box (:line-width 1 :style released-button))
(scroll-bar :foreground "black" :background "lightgrey")
- (fringe :foreground "yellow" :background "grey30")
+ (fringe :foreground "yellow" :background "black")
(show-paren-match-face :background "darkgreen")
(show-paren-mismatch-face :background "red")
(font-lock-warning-face :background "red" :weight bold)
(mdw-number-face :foreground "yellow")
(font-lock-function-name-face :weight bold)
(font-lock-variable-name-face :slant italic)
+ (font-lock-comment-delimiter-face
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :slant italic)
(font-lock-comment-face
:foreground ,(if window-system "SeaGreen1" "green")
:slant italic)
(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")
(label . 0)
(case-label . +)
(access-label . -)
- (inclass . ++)
+ (inclass . +)
(inline-open . ++)
(statement-cont . 0)
(statement-case-intro . +)))
(make-local-variable 'font-lock-keywords)
(let ((c-keywords
- (make-regexp '(
+ (mdw-regexps '(
"and" ;C++
"and_eq" ;C++
"asm" ;K&R, GCC
"__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"))))
(setq font-lock-keywords
(list
- 't
;; --- Fontify include files as strings ---
(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"))))
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
(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"
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
(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"
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
(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"
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
(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"
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
;; --- Define Python fontification style ---
-(trap (require 'pyrex-mode))
(defun mdw-fontify-python ()
;; --- Miscellaneous fiddling ---
(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"
"while" "yield"))))
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
(make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
;; --- Handle numbers too ---
;;
(make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
(list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
"\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
"\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
(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"
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
(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"
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
(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"
(setq font-lock-keywords
(list
- 't
(list "--.*$"
'(0 font-lock-comment-face))
(list (concat "\\<\\(" haskell-keywords "\\)\\>")
(make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
;; --- Environment names are keywords ---
(make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
;; --- Environment names are keywords ---
(list "[$^_{}#&]"
'(0 mdw-punct-face)))))
+;;;----- SGML hacking -------------------------------------------------------
+
+(defun mdw-sgml-mode ()
+ (interactive)
+ (sgml-mode)
+ (mdw-standard-fill-prefix "")
+ (make-variable-buffer-local 'sgml-delimiters)
+ (setq sgml-delimiters
+ '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]"
+ "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\""
+ "LITA" "'" "MDC" ">" "MDO" "<!" "MINUS" "-" "MSC" "]]" "NESTC" "{"
+ "NET" "}" "OPT" "?" "OR" "|" "PERO" "%" "PIC" ">" "PIO" "<?"
+ "PLUS" "+" "REFC" "." "REP" "*" "RNI" "#" "SEQ" "," "STAGO" ":"
+ "TAGC" "." "VI" "=" "MS-START" "<![" "MS-END" "]]>"
+ "XML-ECOM" "-->" "XML-PIC" "?>" "XML-SCOM" "<!--" "XML-TAGCE" "/>"
+ "NULL" ""))
+ (setq major-mode 'mdw-sgml-mode)
+ (setq mode-name "[mdw] SGML")
+ (run-hooks 'mdw-sgml-mode-hook))
+
;;;----- Shell scripts ------------------------------------------------------
(defun mdw-setup-sh-script-mode ()
(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"
(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
(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
(make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
(list "\\<[A-Z][a-zA-Z0-9]*\\>"
'(0 font-lock-keyword-face))
(list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
(make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face)))))
(and mdw-auto-indent
(indent-for-tab-command)))
+(defun mdw-setup-m4 ()
+ (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
+
;;;----- Text mode ----------------------------------------------------------
(defun mdw-text-mode ()
(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 ---------------------------------------------------------
'comint-watch-for-password-prompt))
(defun mdw-term-mode-setup ()
- (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *")
+ (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *")
(make-local-variable 'mouse-yank-at-point)
(make-local-variable 'transient-mark-mode)
(setq mouse-yank-at-point t)