-;;; -*-emacs-lisp-*-
-;;;
-;;; $Id$
+;;; -*- mode: emacs-lisp; coding: utf-8 -*-
;;;
;;; Functions and macros for .emacs
;;;
;;; 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))
+ (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 ---------------------------------------------
+(eval-when-compile
+ (unless (fboundp 'make-regexp)
+ (load "make-regexp"))
+ (require 'cl))
+
+(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 ---
(defun mdw-config (sym)
"Read the configuration variable named SYM."
(unless mdw-config
- (setq mdw-config (with-temp-buffer
- (insert-file-contents "~/.mdw.conf")
- (replace-regexp "^[ \t]*\\(#.*\\|\\)\n" ""
- nil (point-min) (point-max))
- (replace-regexp (concat "^[ \t]*"
- "\\([-a-zA-Z0-9_.]*\\)"
- "[ \t]*=[ \t]*"
- "\\(.*[^ \t\n]\\|\\)"
- "[ \t]**\\(\n\\|$\\)")
- "(\\1 . \"\\2\") "
- nil (point-min) (point-max))
- (car (read-from-string
- (concat "(" (buffer-string) ")"))))))
+ (setq mdw-config
+ (flet ((replace (what with)
+ (goto-char (point-min))
+ (while (re-search-forward what nil t)
+ (replace-match with t))))
+ (with-temp-buffer
+ (insert-file-contents "~/.mdw.conf")
+ (replace "^[ \t]*\\(#.*\\|\\)\n" "")
+ (replace (concat "^[ \t]*"
+ "\\([-a-zA-Z0-9_.]*\\)"
+ "[ \t]*=[ \t]*"
+ "\\(.*[^ \t\n]\\|\\)"
+ "[ \t]**\\(\n\\|$\\)")
+ "(\\1 . \"\\2\")\n")
+ (car (read-from-string
+ (concat "(" (buffer-string) ")")))))))
(cdr (assq sym mdw-config)))
+;; --- Set up the load path convincingly ---
+
+(dolist (dir (append (and (boundp 'debian-emacs-flavor)
+ (list (concat "/usr/share/"
+ (symbol-name debian-emacs-flavor)
+ "/site-lisp")))))
+ (dolist (sub (directory-files dir t))
+ (when (and (file-accessible-directory-p sub)
+ (not (member sub load-path)))
+ (setq load-path (nconc load-path (list sub))))))
+
;; --- Is an Emacs library available? ---
(defun library-exists-p (name)
;; --- Splitting windows ---
-(defconst mdw-scrollbar-width (if window-system 6 1)
- "Guessed width of scroll bar.")
-(defun mdw-divvy-window (&optional w)
+(unless (fboundp 'scroll-bar-columns)
+ (defun scroll-bar-columns (side)
+ (cond ((eq side 'left) 0)
+ (window-system 3)
+ (t 1))))
+(unless (fboundp 'fringe-columns)
+ (defun fringe-columns (side)
+ (cond ((not window-system) 0)
+ ((eq side 'left) 1)
+ (t 2))))
+
+(defun mdw-divvy-window (&optional width)
"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))))
+ (interactive "P")
+ (setq width (cond (width (prefix-numeric-value width))
+ ((and window-system
+ (>= emacs-major-version 22))
+ 77)
+ (t 78)))
+ (let* ((win (selected-window))
+ (sb-width (if (not window-system)
+ 1
+ (let ((tot 0))
+ (dolist (what '(scroll-bar fringe))
+ (dolist (side '(left right))
+ (incf tot
+ (funcall (intern (concat (symbol-name what)
+ "-columns"))
+ side))))
+ tot)))
+ (c (/ (+ (window-width) sb-width)
+ (+ width sb-width))))
(while (> c 1)
(setq c (1- c))
- (split-window-horizontally (+ w mdw-scrollbar-width))
+ (split-window-horizontally (+ width sb-width))
(other-window 1))
(select-window win)))
(nth 2 when))))))))
(eq w d)))
+;; --- Fighting with Org-mode's evil key maps ---
+
+(defvar mdw-evil-keymap-keys
+ '(([S-up] . [?\C-c up])
+ ([S-down] . [?\C-c down])
+ ([S-left] . [?\C-c left])
+ ([S-right] . [?\C-c right])
+ (([M-up] [?\e up]) . [C-up])
+ (([M-down] [?\e down]) . [C-down])
+ (([M-left] [?\e left]) . [C-left])
+ (([M-right] [?\e right]) . [C-right]))
+ "Defines evil keybindings to clobber in `mdw-clobber-evil-keymap'.
+The value is an alist mapping evil keys (as a list, or singleton)
+to good keys (in the same form).")
+
+(defun mdw-clobber-evil-keymap (keymap)
+ "Replace evil key bindings in the KEYMAP.
+Evil key bindings are defined in `mdw-evil-keymap-keys'."
+ (dolist (entry mdw-evil-keymap-keys)
+ (let ((binding nil)
+ (keys (if (listp (car entry))
+ (car entry)
+ (list (car entry))))
+ (replacements (if (listp (cdr entry))
+ (cdr entry)
+ (list (cdr entry)))))
+ (catch 'found
+ (dolist (key keys)
+ (setq binding (lookup-key keymap key))
+ (when binding
+ (throw 'found nil))))
+ (when binding
+ (dolist (key keys)
+ (define-key keymap key nil))
+ (dolist (key replacements)
+ (define-key keymap key binding))))))
+
+;;;----- Mail and news hacking ----------------------------------------------
+
+(define-derived-mode mdwmail-mode mail-mode "[mdw] mail"
+ "Major mode for editing news and mail messages from external programs
+Not much right now. Just support for doing MailCrypt stuff."
+ :syntax-table nil
+ :abbrev-table nil
+ (run-hooks 'mail-setup-hook))
+
+(define-key mdwmail-mode-map [?\C-c ?\C-c] 'disabled-operation)
+
+(add-hook 'mdwail-mode-hook
+ (lambda ()
+ (set-buffer-file-coding-system 'utf-8)
+ (make-local-variable 'paragraph-separate)
+ (make-local-variable 'paragraph-start)
+ (setq paragraph-start
+ (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
+ paragraph-start))
+ (setq paragraph-separate
+ (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
+ paragraph-separate))))
+
+;; --- How to encrypt in mdwmail ---
+
+(defun mdwmail-mc-encrypt (&optional recip scm start end from sign)
+ (or start
+ (setq start (save-excursion
+ (goto-char (point-min))
+ (or (search-forward "\n\n" nil t) (point-min)))))
+ (or end
+ (setq end (point-max)))
+ (mc-encrypt-generic recip scm start end from sign))
+
+;; --- How to sign in mdwmail ---
+
+(defun mdwmail-mc-sign (key scm start end uclr)
+ (or start
+ (setq start (save-excursion
+ (goto-char (point-min))
+ (or (search-forward "\n\n" nil t) (point-min)))))
+ (or end
+ (setq end (point-max)))
+ (mc-sign-generic key scm start end uclr))
+
+;; --- Some signature mangling ---
+
+(defun mdwmail-mangle-signature ()
+ (save-excursion
+ (goto-char (point-min))
+ (perform-replace "\n-- \n" "\n-- " nil nil nil)))
+(add-hook 'mail-setup-hook 'mdwmail-mangle-signature)
+(add-hook 'message-setup-hook 'mdwmail-mangle-signature)
+
+;; --- Insert my login name into message-ids, so I can score replies ---
+
+(defadvice message-unique-id (after mdw-user-name last activate compile)
+ "Ensure that the user's name appears at the end of the message-id string,
+so that it can be used for convenient filtering."
+ (setq ad-return-value (concat ad-return-value "." (user-login-name))))
+
+;; --- Tell my movemail hack where movemail is ---
+;;
+;; This is needed to shup up warnings about LD_PRELOAD.
+
+(let ((path exec-path))
+ (while path
+ (let ((try (expand-file-name "movemail" (car path))))
+ (if (file-executable-p try)
+ (setenv "REAL_MOVEMAIL" try))
+ (setq path (cdr path)))))
+
;;;----- Utility functions --------------------------------------------------
+(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 ---
(defun mdw-uniquify-alist (&rest alists)
(or arg (progn
(goto-char (point-max))
(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 mdwmail-mode ()
- "Major mode for editing news and mail messages from external programs
-Not much right now. Just support for doing MailCrypt stuff."
- (interactive)
- (kill-all-local-variables)
- (use-local-map text-mode-map)
- (setq local-abbrev-table text-mode-abbrev-table)
- (setq major-mode 'mdwmail-mode)
- (setq mode-name "[mdw] mail")
- (make-local-variable 'paragraph-separate)
- (make-local-variable 'paragraph-start)
- (setq paragraph-start (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
- paragraph-start))
- (setq paragraph-separate (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
- paragraph-separate))
- (run-hooks 'text-mode-hook 'mdwmail-mode-hook 'mail-setup-hook))
-
-;; --- How to encrypt in mdwmail ---
-
-(defun mdwmail-mc-encrypt (&optional recip scm start end from sign)
- (or start
- (setq start (save-excursion
- (goto-char (point-min))
- (or (search-forward "\n\n" nil t) (point-min)))))
- (or end
- (setq end (point-max)))
- (mc-encrypt-generic recip scm start end from sign))
-
-;; --- How to sign in mdwmail ---
-
-(defun mdwmail-mc-sign (key scm start end uclr)
- (or start
- (setq start (save-excursion
- (goto-char (point-min))
- (or (search-forward "\n\n" nil t) (point-min)))))
- (or end
- (setq end (point-max)))
- (mc-sign-generic key scm start end uclr))
-
-;; --- Some signature mangling ---
-
-(defun mdwmail-mangle-signature ()
- (save-excursion
- (goto-char (point-min))
- (perform-replace "\n-- \n" "\n-- " nil nil nil)))
-(add-hook 'mail-setup-hook 'mdwmail-mangle-signature)
+ (insert-file-contents np-file)))))
+
+(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 ((not (boundp 'global-auto-revert-ignore-buffer))
+ nil)
+ ((and (buffer-file-name)
+ (fboundp 'tramp-tramp-file-p)
+ (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))
+
+;;;----- Dired hacking ------------------------------------------------------
+
+(defadvice dired-maybe-insert-subdir
+ (around mdw-marked-insertion first activate)
+ "The DIRNAME may be a list of directory names to insert. Interactively, if
+files are marked, then insert all of them. With a numeric prefix argument,
+select that many entries near point; with a non-numeric prefix argument,
+prompt for listing options."
+ (interactive
+ (list (dired-get-marked-files nil
+ (and (integerp current-prefix-arg)
+ current-prefix-arg)
+ #'file-directory-p)
+ (and current-prefix-arg
+ (not (integerp current-prefix-arg))
+ (read-string "Switches for listing: "
+ (or dired-subdir-switches
+ dired-actual-switches)))))
+ (let ((dirs (ad-get-arg 0)))
+ (dolist (dir (if (listp dirs) dirs (list dirs)))
+ (ad-set-arg 0 dir)
+ ad-do-it)))
;;;----- URL viewing --------------------------------------------------------
(make-variable-buffer-local 'mdw-fill-prefix)
(defvar mdw-hanging-indents
- "\\(\\(\\([*o]\\|--\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)[ \t]+\\)?\\)"
+ (concat "\\(\\("
+ "\\([*o]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)"
+ "[ \t]+"
+ "\\)?\\)")
"*Standard regular expression matching things which might be part of a
hanging indent. This is mainly useful in `auto-fill-mode'.")
;;;----- Other common declarations ------------------------------------------
-(defun mdw-set-frame-transparency (&optional n)
- (interactive "P")
- (let* ((alist (frame-parameters))
- (trans (assq 'transparency alist)))
- (if trans
- (rplacd trans (not (if n (zerop n) (cdr trans))))
- (setq trans (cons 'transparency (not (equal 0 n)))))
- (modify-frame-parameters (selected-frame) (list trans))))
-
-;; --- Mouse wheel support ---
-
-(defconst mdw-wheel-scroll-amount 15)
-(defun mdw-wheel-up (click)
- (interactive "@e")
- (mdw-wheel-scroll click (function scroll-down)))
-(defun mdw-wheel-down (click)
- (interactive "@e")
- (mdw-wheel-scroll click (function scroll-up)))
-
-(defun mdw-wheel-scroll (click func)
- (let ((win (selected-window)))
- (unwind-protect
- (progn
- (select-window (posn-window (event-start click)))
- (let ((arg 2))
- (funcall func (/ (window-height) 2))))
- (select-window win))))
-
-;; --- Going backwards ---
-
-(defun other-window-backwards (arg)
- (interactive "p")
- (other-window (- arg)))
-
;; --- Common mode settings ---
(defvar mdw-auto-indent t
(t
(local-set-key "\C-m" 'newline-and-indent))))
(local-set-key [C-return] 'newline)
- (or (eq major-mode 'asm-mode)
- (local-set-key [?\;] 'self-insert-command))
- (local-set-key [?\#] 'self-insert-command)
- (local-set-key [?\"] 'self-insert-command)
+ (make-variable-buffer-local 'page-delimiter)
+ (setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
(setq comment-column 40)
(auto-fill-mode 1)
(setq fill-column 77)
(setq show-trailing-whitespace t)
+ (and (fboundp 'gtags-mode)
+ (gtags-mode))
+ (outline-minor-mode t)
(mdw-set-font))
+(eval-after-load 'gtags
+ '(dolist (key '([mouse-2] [mouse-3]))
+ (define-key gtags-mode-map key nil)))
+
;; --- Set up all sorts of faces ---
(defvar mdw-set-font nil)
(defvar mdw-number-face 'mdw-number-face "Face to use for numbers")
(make-face 'mdw-number-face)
+;; --- Backup file handling ---
+
+(defvar mdw-backup-disable-regexps nil
+ "*List of regular expressions: if a file name matches any of these then the
+file is not backed up.")
+
+(defun mdw-backup-enable-predicate (name)
+ "[mdw]'s default backup predicate: allows a backup if the
+standard predicate would allow it, and it doesn't match any of
+the regular expressions in `mdw-backup-disable-regexps'."
+ (and (normal-backup-enable-predicate name)
+ (let ((answer t) (list mdw-backup-disable-regexps))
+ (save-match-data
+ (while list
+ (if (string-match (car list) name)
+ (setq answer nil))
+ (setq list (cdr list)))
+ answer))))
+(setq backup-enable-predicate 'mdw-backup-enable-predicate)
+
;;;----- General fontification ----------------------------------------------
(defun mdw-set-fonts (frame faces)
,@(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)
(comint-highlight-input)
(font-lock-builtin-face :weight bold)
(font-lock-type-face :weight bold)
- (region :background "grey30")
+ (region :background ,(if window-system "grey30" "blue"))
(isearch :background "palevioletred2")
(mdw-punct-face :foreground ,(if window-system "burlywood2" "yellow"))
(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-keyword-face :weight bold)
(font-lock-constant-face :weight bold)
(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)
+ (message-cited-text
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :slant italic)
+ (message-separator :background "red" :foreground "white" :weight bold)
+ (message-header-cc
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :weight bold)
+ (message-header-newsgroups
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :weight bold)
+ (message-header-subject
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :weight bold)
+ (message-header-to
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :weight bold)
+ (message-header-xheader
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :weight bold)
+ (message-header-other
+ :foreground ,(if window-system "SeaGreen1" "green")
+ :weight bold)
+ (message-header-name
+ :foreground ,(if window-system "SeaGreen1" "green"))
+ (woman-bold :weight bold)
+ (woman-italic :slant italic)
+ (p4-depot-added-face :foreground "green")
+ (p4-depot-branch-op-face :foreground "yellow")
+ (p4-depot-deleted-face :foreground "red")
+ (p4-depot-unmapped-face
+ :foreground ,(if window-system "SkyBlue1" "cyan"))
+ (p4-diff-change-face :foreground "yellow")
+ (p4-diff-del-face :foreground "red")
+ (p4-diff-file-face :foreground "SkyBlue1")
+ (p4-diff-head-face :background "grey10")
+ (p4-diff-ins-face :foreground "green")
+ (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")
;; --- Make C indentation nice ---
+(eval-after-load "cc-mode"
+ '(progn
+ (define-key c-mode-map "*" nil)
+ (define-key c-mode-map "/" nil)))
+
+(defun mdw-c-lineup-arglist (langelem)
+ "Hack for DWIMmery in c-lineup-arglist."
+ (if (save-excursion
+ (c-block-in-arglist-dwim (c-langelem-2nd-pos c-syntactic-element)))
+ 0
+ (c-lineup-arglist langelem)))
+
+(defun mdw-c-indent-extern-mumble (langelem)
+ "Indent `extern \"...\" {' lines."
+ (save-excursion
+ (back-to-indentation)
+ (if (looking-at
+ "\\s-*\\<extern\\>\\s-*\"\\([^\\\\\"]+\\|\\.\\)*\"\\s-*{")
+ c-basic-offset
+ nil)))
+
(defun mdw-c-style ()
(c-add-style "[mdw] C and C++ style"
'((c-basic-offset . 2)
- (c-tab-always-indent . nil)
(comment-column . 40)
(c-class-key . "class")
- (c-offsets-alist (substatement-open . 0)
- (label . 0)
- (case-label . +)
- (access-label . -)
- (inclass . ++)
- (inline-open . ++)
- (statement-cont . 0)
- (statement-case-intro . +)))
+ (c-backslash-column . 72)
+ (c-offsets-alist
+ (substatement-open . (add 0 c-indent-one-line-block))
+ (defun-open . (add 0 c-indent-one-line-block))
+ (arglist-cont-nonempty . mdw-c-lineup-arglist)
+ (topmost-intro . mdw-c-indent-extern-mumble)
+ (cpp-define-intro . 0)
+ (inextern-lang . [0])
+ (label . 0)
+ (case-label . +)
+ (access-label . -)
+ (inclass . +)
+ (inline-open . ++)
+ (statement-cont . 0)
+ (statement-case-intro . +)))
t))
(defun mdw-fontify-c-and-c++ ()
;; --- Fiddle with some syntax codes ---
- (modify-syntax-entry ?_ "w")
(modify-syntax-entry ?* ". 23")
(modify-syntax-entry ?/ ". 124b")
(modify-syntax-entry ?\n "> b")
(make-local-variable 'font-lock-keywords)
(let ((c-keywords
- (make-regexp '(
- "and" ;C++
- "and_eq" ;C++
- "asm" ;K&R, GCC
- "auto" ;K&R, C89
- "bitand" ;C++
- "bitor" ;C++
- "bool" ;C++, C9X macro
- "break" ;K&R, C89
- "case" ;K&R, C89
- "catch" ;C++
- "char" ;K&R, C89
- "class" ;C++
- "complex" ;C9X macro, C++ template type
- "compl" ;C++
- "const" ;C89
- "const_cast" ;C++
- "continue" ;K&R, C89
- "defined" ;C89 preprocessor
- "default" ;K&R, C89
- "delete" ;C++
- "do" ;K&R, C89
- "double" ;K&R, C89
- "dynamic_cast" ;C++
- "else" ;K&R, C89
- ;; "entry" ;K&R -- never used
- "enum" ;C89
- "explicit" ;C++
- "export" ;C++
- "extern" ;K&R, C89
- "false" ;C++, C9X macro
- "float" ;K&R, C89
- "for" ;K&R, C89
- ;; "fortran" ;K&R
- "friend" ;C++
- "goto" ;K&R, C89
- "if" ;K&R, C89
- "imaginary" ;C9X macro
- "inline" ;C++, C9X, GCC
- "int" ;K&R, C89
- "long" ;K&R, C89
- "mutable" ;C++
- "namespace" ;C++
- "new" ;C++
- "operator" ;C++
- "or" ;C++
- "or_eq" ;C++
- "private" ;C++
- "protected" ;C++
- "public" ;C++
- "register" ;K&R, C89
- "reinterpret_cast" ;C++
- "restrict" ;C9X
- "return" ;K&R, C89
- "short" ;K&R, C89
- "signed" ;C89
- "sizeof" ;K&R, C89
- "static" ;K&R, C89
- "static_cast" ;C++
- "struct" ;K&R, C89
- "switch" ;K&R, C89
- "template" ;C++
- "this" ;C++
- "throw" ;C++
- "true" ;C++, C9X macro
- "try" ;C++
- "this" ;C++
- "typedef" ;C89
- "typeid" ;C++
- "typeof" ;GCC
- "typename" ;C++
- "union" ;K&R, C89
- "unsigned" ;K&R, C89
- "using" ;C++
- "virtual" ;C++
- "void" ;C89
- "volatile" ;C89
- "wchar_t" ;C++, C89 library type
- "while" ;K&R, C89
- "xor" ;C++
- "xor_eq" ;C++
- "_Bool" ;C9X
- "_Complex" ;C9X
- "_Imaginary" ;C9X
- "_Pragma" ;C9X preprocessor
- "__alignof__" ;GCC
- "__asm__" ;GCC
- "__attribute__" ;GCC
- "__complex__" ;GCC
- "__const__" ;GCC
- "__extension__" ;GCC
- "__imag__" ;GCC
- "__inline__" ;GCC
- "__label__" ;GCC
- "__real__" ;GCC
- "__signed__" ;GCC
- "__typeof__" ;GCC
- "__volatile__" ;GCC
- )))
+ (mdw-regexps "and" ;C++
+ "and_eq" ;C++
+ "asm" ;K&R, GCC
+ "auto" ;K&R, C89
+ "bitand" ;C++
+ "bitor" ;C++
+ "bool" ;C++, C9X macro
+ "break" ;K&R, C89
+ "case" ;K&R, C89
+ "catch" ;C++
+ "char" ;K&R, C89
+ "class" ;C++
+ "complex" ;C9X macro, C++ template type
+ "compl" ;C++
+ "const" ;C89
+ "const_cast" ;C++
+ "continue" ;K&R, C89
+ "defined" ;C89 preprocessor
+ "default" ;K&R, C89
+ "delete" ;C++
+ "do" ;K&R, C89
+ "double" ;K&R, C89
+ "dynamic_cast" ;C++
+ "else" ;K&R, C89
+ ;; "entry" ;K&R -- never used
+ "enum" ;C89
+ "explicit" ;C++
+ "export" ;C++
+ "extern" ;K&R, C89
+ "false" ;C++, C9X macro
+ "float" ;K&R, C89
+ "for" ;K&R, C89
+ ;; "fortran" ;K&R
+ "friend" ;C++
+ "goto" ;K&R, C89
+ "if" ;K&R, C89
+ "imaginary" ;C9X macro
+ "inline" ;C++, C9X, GCC
+ "int" ;K&R, C89
+ "long" ;K&R, C89
+ "mutable" ;C++
+ "namespace" ;C++
+ "new" ;C++
+ "operator" ;C++
+ "or" ;C++
+ "or_eq" ;C++
+ "private" ;C++
+ "protected" ;C++
+ "public" ;C++
+ "register" ;K&R, C89
+ "reinterpret_cast" ;C++
+ "restrict" ;C9X
+ "return" ;K&R, C89
+ "short" ;K&R, C89
+ "signed" ;C89
+ "sizeof" ;K&R, C89
+ "static" ;K&R, C89
+ "static_cast" ;C++
+ "struct" ;K&R, C89
+ "switch" ;K&R, C89
+ "template" ;C++
+ "this" ;C++
+ "throw" ;C++
+ "true" ;C++, C9X macro
+ "try" ;C++
+ "this" ;C++
+ "typedef" ;C89
+ "typeid" ;C++
+ "typeof" ;GCC
+ "typename" ;C++
+ "union" ;K&R, C89
+ "unsigned" ;K&R, C89
+ "using" ;C++
+ "virtual" ;C++
+ "void" ;C89
+ "volatile" ;C89
+ "wchar_t" ;C++, C89 library type
+ "while" ;K&R, C89
+ "xor" ;C++
+ "xor_eq" ;C++
+ "_Bool" ;C9X
+ "_Complex" ;C9X
+ "_Imaginary" ;C9X
+ "_Pragma" ;C9X preprocessor
+ "__alignof__" ;GCC
+ "__asm__" ;GCC
+ "__attribute__" ;GCC
+ "__complex__" ;GCC
+ "__const__" ;GCC
+ "__extension__" ;GCC
+ "__imag__" ;GCC
+ "__inline__" ;GCC
+ "__label__" ;GCC
+ "__real__" ;GCC
+ "__signed__" ;GCC
+ "__typeof__" ;GCC
+ "__volatile__" ;GCC
+ ))
(preprocessor-keywords
- (make-regexp '("assert" "define" "elif" "else" "endif" "error"
- "ident" "if" "ifdef" "ifndef" "import" "include"
- "line" "pragma" "unassert" "undef" "warning")))
+ (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"
- "interface" "private" "protected" "protocol" "public"
- "selector"))))
+ (mdw-regexps "class" "defs" "encode" "end" "implementation"
+ "interface" "private" "protected" "protocol" "public"
+ "selector")))
(setq font-lock-keywords
(list
- 't
;; --- Fontify include files as strings ---
;; --- Fiddle with some syntax codes ---
- (modify-syntax-entry ?_ "w")
(modify-syntax-entry ?* ". 23")
(modify-syntax-entry ?/ ". 14")
(make-local-variable 'font-lock-keywords)
(let ((c-keywords
- (make-regexp '("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"))))
+ (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 ---
(defun mdw-java-style ()
(c-add-style "[mdw] Java style"
'((c-basic-offset . 2)
- (c-tab-always-indent . nil)
(c-offsets-alist (substatement-open . 0)
(label . +)
(case-label . +)
;; --- Other stuff ---
(mdw-java-style)
- (modify-syntax-entry ?_ "w")
(setq c-hanging-comment-ender-p nil)
(setq c-backslash-column 72)
(setq comment-start "/* ")
(make-local-variable 'font-lock-keywords)
(let ((java-keywords
- (make-regexp '("abstract" "boolean" "break" "byte" "case" "catch"
- "char" "class" "const" "continue" "default" "do"
- "double" "else" "extends" "final" "finally" "float"
- "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"
-
- "false" "null" "true"))))
+ (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"
+ "int" "interface" "long" "native" "new" "package"
+ "private" "protected" "public" "return" "short"
+ "static" "super" "switch" "synchronized" "this"
+ "throw" "throws" "transient" "try" "void" "volatile"
+ "while"
+
+ "false" "null" "true")))
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
(defun mdw-csharp-style ()
(c-add-style "[mdw] C# style"
'((c-basic-offset . 2)
- (c-tab-always-indent . nil)
(c-offsets-alist (substatement-open . 0)
(label . 0)
(case-label . +)
;; --- Other stuff ---
(mdw-csharp-style)
- (modify-syntax-entry ?_ "w")
(setq c-hanging-comment-ender-p nil)
(setq c-backslash-column 72)
(setq comment-start "/* ")
(make-local-variable 'font-lock-keywords)
(let ((csharp-keywords
- (make-regexp '("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" "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")))
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
(defun mdw-awk-style ()
(c-add-style "[mdw] Awk style"
'((c-basic-offset . 2)
- (c-tab-always-indent . nil)
(c-offsets-alist (substatement-open . 0)
(statement-cont . 0)
(statement-case-intro . +)))
;; --- Miscellaneous fiddling ---
- (modify-syntax-entry ?_ "w")
(mdw-awk-style)
(setq c-backslash-column 72)
(mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
(make-local-variable 'font-lock-keywords)
(let ((c-keywords
- (make-regexp '("BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
- "ENVIRON" "ERRNO" "FIELDWIDTHS" "FILENAME" "FNR"
- "FS" "IGNORECASE" "NF" "NR" "OFMT" "OFS" "ORS" "RS"
- "RSTART" "RLENGTH" "RT" "SUBSEP"
- "atan2" "break" "close" "continue" "cos" "delete"
- "do" "else" "exit" "exp" "fflush" "file" "for" "func"
- "function" "gensub" "getline" "gsub" "if" "in"
- "index" "int" "length" "log" "match" "next" "rand"
- "return" "print" "printf" "sin" "split" "sprintf"
- "sqrt" "srand" "strftime" "sub" "substr" "system"
- "systime" "tolower" "toupper" "while"))))
+ (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"
+ "atan2" "break" "close" "continue" "cos" "delete"
+ "do" "else" "exit" "exp" "fflush" "file" "for" "func"
+ "function" "gensub" "getline" "gsub" "if" "in"
+ "index" "int" "length" "log" "match" "next" "rand"
+ "return" "print" "printf" "sin" "split" "sprintf"
+ "sqrt" "srand" "strftime" "sub" "substr" "system"
+ "systime" "tolower" "toupper" "while")))
(setq font-lock-keywords
(list
- 't
;; --- Handle the keywords defined above ---
;; --- Perl indentation style ---
-(setq cperl-tab-always-indent nil)
-
(setq cperl-indent-level 2)
(setq cperl-continued-statement-offset 2)
(setq cperl-continued-brace-offset 0)
;; --- Miscellaneous fiddling ---
- (modify-syntax-entry ?_ "w")
(modify-syntax-entry ?$ "\\")
(modify-syntax-entry ?$ "\\" font-lock-syntax-table)
(mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
(make-local-variable 'font-lock-keywords)
(let ((perl-keywords
- (make-regexp '("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"
- "undef" "unless" "until" "use" "while"))))
+ (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"
+ "undef" "unless" "until" "use" "while")))
(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 ---
- (modify-syntax-entry ?_ "w")
(mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
;; --- Now define fontification things ---
(make-local-variable 'font-lock-keywords)
(let ((python-keywords
- (make-regexp '("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"))))
+ (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" "with" "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_]+\\|\\)")
(local-set-key [?\C-m] 'mdw-rexx-indent-newline-indent)
(local-set-key [?*] 'mdw-rexx-electric-*)
(mapcar #'(lambda (ch) (modify-syntax-entry ch "w"))
- '(?. ?! ?? ?_ ?# ?@ ?$))
+ '(?! ?? ?# ?@ ?$))
(mdw-standard-fill-prefix "\\([ \t]*/?\*[ \t]*\\)")
;; --- Set up keywords and things for fontification ---
(setq rexx-indent 2)
(setq rexx-end-indent rexx-indent)
- (setq rexx-tab-always-indent nil)
(setq rexx-cont-indent rexx-indent)
(make-local-variable 'font-lock-keywords)
(let ((rexx-keywords
- (make-regexp '("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"
- "options" "otherwise" "parse" "procedure" "pull"
- "push" "queue" "return" "say" "select" "signal"
- "scientific" "source" "then" "trace" "to" "until"
- "upper" "value" "var" "version" "when" "while"
- "with"
-
- "abbrev" "abs" "bitand" "bitor" "bitxor" "b2x"
- "center" "center" "charin" "charout" "chars"
- "compare" "condition" "copies" "c2d" "c2x"
- "datatype" "date" "delstr" "delword" "d2c" "d2x"
- "errortext" "format" "fuzz" "insert" "lastpos"
- "left" "length" "lineout" "lines" "max" "min"
- "overlay" "pos" "queued" "random" "reverse" "right"
- "sign" "sourceline" "space" "stream" "strip"
- "substr" "subword" "symbol" "time" "translate"
- "trunc" "value" "verify" "word" "wordindex"
- "wordlength" "wordpos" "words" "xrange" "x2b" "x2c"
- "x2d"))))
+ (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"
+ "options" "otherwise" "parse" "procedure" "pull"
+ "push" "queue" "return" "say" "select" "signal"
+ "scientific" "source" "then" "trace" "to" "until"
+ "upper" "value" "var" "version" "when" "while"
+ "with"
+
+ "abbrev" "abs" "bitand" "bitor" "bitxor" "b2x"
+ "center" "center" "charin" "charout" "chars"
+ "compare" "condition" "copies" "c2d" "c2x"
+ "datatype" "date" "delstr" "delword" "d2c" "d2x"
+ "errortext" "format" "fuzz" "insert" "lastpos"
+ "left" "length" "lineout" "lines" "max" "min"
+ "overlay" "pos" "queued" "random" "reverse" "right"
+ "sign" "sourceline" "space" "stream" "strip"
+ "substr" "subword" "symbol" "time" "translate"
+ "trunc" "value" "verify" "word" "wordindex"
+ "wordlength" "wordpos" "words" "xrange" "x2b" "x2c"
+ "x2d")))
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
;; --- Make underscore an honorary letter ---
- (modify-syntax-entry ?_ "w")
(modify-syntax-entry ?' "w")
;; --- Set fill prefix ---
(make-local-variable 'font-lock-keywords)
(let ((sml-keywords
- (make-regexp '("abstype" "and" "andalso" "as"
- "case"
- "datatype" "do"
- "else" "end" "eqtype" "exception"
- "fn" "fun" "functor"
- "handle"
- "if" "in" "include" "infix" "infixr"
- "let" "local"
- "nonfix"
- "of" "op" "open" "orelse"
- "raise" "rec"
- "sharing" "sig" "signature" "struct" "structure"
- "then" "type"
- "val"
- "where" "while" "with" "withtype"))))
+ (mdw-regexps "abstype" "and" "andalso" "as"
+ "case"
+ "datatype" "do"
+ "else" "end" "eqtype" "exception"
+ "fn" "fun" "functor"
+ "handle"
+ "if" "in" "include" "infix" "infixr"
+ "let" "local"
+ "nonfix"
+ "of" "op" "open" "orelse"
+ "raise" "rec"
+ "sharing" "sig" "signature" "struct" "structure"
+ "then" "type"
+ "val"
+ "where" "while" "with" "withtype")))
(setq font-lock-keywords
(list
- 't
;; --- Set up the keywords defined above ---
;; --- Fiddle with syntax table to get comments right ---
- (modify-syntax-entry ?_ "w")
(modify-syntax-entry ?' "\"")
(modify-syntax-entry ?- ". 123")
(modify-syntax-entry ?{ ". 1b")
(make-local-variable 'font-lock-keywords)
(let ((haskell-keywords
- (make-regexp '("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" "foreign" "hiding" "if"
+ "import" "in" "infix" "infixl" "infixr" "instance"
+ "let" "module" "newtype" "of" "qualified" "safe"
+ "stdcall" "then" "type" "unsafe" "where")))
(setq font-lock-keywords
(list
- 't
(list "--.*$"
'(0 font-lock-comment-face))
(list (concat "\\<\\(" haskell-keywords "\\)\\>")
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+;;;----- Erlang configuration -----------------------------------------------
+
+(setq erlang-electric-commannds
+ '(erlang-electric-newline erlang-electric-semicolon))
+
+(defun mdw-fontify-erlang ()
+
+ ;; --- Set fill prefix ---
+
+ (mdw-standard-fill-prefix "\\([ \t]*{?%*[ \t]*\\)")
+
+ ;; --- Fiddle with fontification ---
+
+ (make-local-variable 'font-lock-keywords)
+ (let ((erlang-keywords
+ (mdw-regexps "after" "and" "andalso"
+ "band" "begin" "bnot" "bor" "bsl" "bsr" "bxor"
+ "case" "catch" "cond"
+ "div" "end" "fun" "if" "let" "not"
+ "of" "or" "orelse"
+ "query" "receive" "rem" "try" "when" "xor")))
+
+ (setq font-lock-keywords
+ (list
+ (list "%.*$"
+ '(0 font-lock-comment-face))
+ (list (concat "\\<\\(" erlang-keywords "\\)\\>")
+ '(0 font-lock-keyword-face))
+ (list (concat "^-\\sw+\\>")
+ '(0 font-lock-keyword-face))
+ (list "\\<[0-9]+\\(\\|#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)\\>"
+ '(0 mdw-number-face))
+ (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+ '(0 mdw-punct-face))))))
+
;;;----- Texinfo configuration ----------------------------------------------
(defun mdw-fontify-texinfo ()
(make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list
- 't
;; --- Environment names are keywords ---
(defun mdw-fontify-tex ()
(setq ispell-parser 'tex)
+ (turn-on-reftex)
;; --- Don't make maths into a string ---
(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 ()
;;;----- Messages-file mode -------------------------------------------------
-(defun message-mode-guts ()
+(defun messages-mode-guts ()
(setq messages-mode-syntax-table (make-syntax-table))
(set-syntax-table messages-mode-syntax-table)
- (modify-syntax-entry ?_ "w" messages-mode-syntax-table)
- (modify-syntax-entry ?- "w" messages-mode-syntax-table)
(modify-syntax-entry ?0 "w" messages-mode-syntax-table)
(modify-syntax-entry ?1 "w" messages-mode-syntax-table)
(modify-syntax-entry ?2 "w" messages-mode-syntax-table)
(setq indent-line-function 'indent-relative)
(mdw-standard-fill-prefix "\\([ \t]*\\(;\\|/?\\*\\)+[ \t]*\\)")
(make-local-variable 'font-lock-defaults)
- (make-local-variable 'message-mode-keywords)
+ (make-local-variable 'messages-mode-keywords)
(let ((keywords
- (make-regexp '("array" "bitmap" "callback" "docs[ \t]+enum"
- "export" "enum" "fixed-octetstring" "flags"
- "harmless" "map" "nested" "optional"
- "optional-tagged" "package" "primitive"
- "primitive-nullfree" "relaxed[ \t]+enum"
- "set" "table" "tagged-optional" "union"
- "variadic" "vector" "version" "version-tag"))))
- (setq message-mode-keywords
+ (mdw-regexps "array" "bitmap" "callback" "docs[ \t]+enum"
+ "export" "enum" "fixed-octetstring" "flags"
+ "harmless" "map" "nested" "optional"
+ "optional-tagged" "package" "primitive"
+ "primitive-nullfree" "relaxed[ \t]+enum"
+ "set" "table" "tagged-optional" "union"
+ "variadic" "vector" "version" "version-tag")))
+ (setq messages-mode-keywords
(list
(list (concat "\\<\\(" keywords "\\)\\>:")
'(0 font-lock-keyword-face))
'("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
(0 mdw-punct-face)))))
(setq font-lock-defaults
- '(message-mode-keywords nil nil nil nil))
+ '(messages-mode-keywords nil nil nil nil))
(run-hooks 'messages-file-hook))
(defun messages-mode ()
(fundamental-mode)
(setq major-mode 'messages-mode)
(setq mode-name "Messages")
- (message-mode-guts)
+ (messages-mode-guts)
(modify-syntax-entry ?# "<" messages-mode-syntax-table)
(modify-syntax-entry ?\n ">" messages-mode-syntax-table)
(setq comment-start "# ")
(fundamental-mode)
(setq major-mode 'cpp-messages-mode)
(setq mode-name "CPP Messages")
- (message-mode-guts)
+ (messages-mode-guts)
(modify-syntax-entry ?* ". 23" messages-mode-syntax-table)
(modify-syntax-entry ?/ ". 14" messages-mode-syntax-table)
(setq comment-start "/* ")
(setq comment-end " */")
(let ((preprocessor-keywords
- (make-regexp '("assert" "define" "elif" "else" "endif" "error"
- "ident" "if" "ifdef" "ifndef" "import" "include"
- "line" "pragma" "unassert" "undef" "warning"))))
- (setq message-mode-keywords
+ (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
+ "ident" "if" "ifdef" "ifndef" "import" "include"
+ "line" "pragma" "unassert" "undef" "warning")))
+ (setq messages-mode-keywords
(append (list (list (concat "^[ \t]*\\#[ \t]*"
"\\(include\\|import\\)"
"[ \t]*\\(<[^>]+\\(>\\|\\)\\)")
preprocessor-keywords
"\\)\\>\\|[0-9]+\\|$\\)\\)")
'(1 font-lock-keyword-face)))
- message-mode-keywords)))
+ messages-mode-keywords)))
(turn-on-font-lock-if-enabled)
(run-hooks 'cpp-messages-mode-hook))
(make-local-variable 'font-lock-defaults)
(make-local-variable 'mallow-driver-mode-keywords)
(let ((keywords
- (make-regexp '("each" "divert" "file" "if"
- "perl" "set" "string" "type" "write"))))
+ (mdw-regexps "each" "divert" "file" "if"
+ "perl" "set" "string" "type" "write")))
(setq mallow-driver-mode-keywords
(list
(list (concat "^%\\s *\\(}\\|\\(" keywords "\\)\\>\\).*$")
(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_]+\\)\\|"
;; --- Lispy languages ---
+;; Unpleasant bodge.
+(unless (boundp 'slime-repl-mode-map)
+ (setq slime-repl-mode-map (make-sparse-keymap)))
+
(defun mdw-indent-newline-and-indent ()
(interactive)
(indent-for-tab-command)
(make-variable-buffer-local 'lisp-indent-function)
(setq lisp-indent-function 'common-lisp-indent-function))
+(setq lisp-simple-loop-indentation 2
+ lisp-loop-keyword-indentation 6
+ lisp-loop-forms-indentation 6)
+
(defun mdw-fontify-lispy ()
;; --- Set fill prefix ---
(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))
+;;;----- Outline mode -------------------------------------------------------
+
+(defun mdw-outline-collapse-all ()
+ "Completely collapse everything in the entire buffer."
+ (interactive)
+ (save-excursion
+ (goto-char (point-min))
+ (while (< (point) (point-max))
+ (hide-subtree)
+ (forward-line))))
+
;;;----- Shell mode ---------------------------------------------------------
(defun mdw-sh-mode-setup ()
'comint-watch-for-password-prompt))
(defun mdw-term-mode-setup ()
- (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *")
+ (setq term-prompt-regexp shell-prompt-pattern)
(make-local-variable 'mouse-yank-at-point)
(make-local-variable 'transient-mark-mode)
(setq mouse-yank-at-point t)
- (setq transient-mark-mode nil)
(auto-fill-mode -1)
(setq tab-width 8))
+(defun term-send-meta-right () (interactive) (term-send-raw-string "\e\e[C"))
+(defun term-send-meta-left () (interactive) (term-send-raw-string "\e\e[D"))
+(defun term-send-ctrl-uscore () (interactive) (term-send-raw-string "\C-_"))
+(defun term-send-meta-meta-something ()
+ (interactive)
+ (term-send-raw-string "\e\e")
+ (term-send-raw))
+(eval-after-load 'term
+ '(progn
+ (define-key term-raw-map [?\e ?\e] nil)
+ (define-key term-raw-map [?\e ?\e t] 'term-send-meta-meta-something)
+ (define-key term-raw-map [?\C-/] 'term-send-ctrl-uscore)
+ (define-key term-raw-map [M-right] 'term-send-meta-right)
+ (define-key term-raw-map [?\e ?\M-O ?C] 'term-send-meta-right)
+ (define-key term-raw-map [M-left] 'term-send-meta-left)
+ (define-key term-raw-map [?\e ?\M-O ?D] 'term-send-meta-left)))
+
;;;----- That's all, folks --------------------------------------------------
(provide 'dot-emacs)