dot-emacs: Fix the C mode hacking.
[profile] / dot-emacs.el
index cb2047d..0376bad 100644 (file)
@@ -1,7 +1,5 @@
 ;;; -*- mode: emacs-lisp; coding: utf-8 -*-
 ;;;
-;;; $Id$
-;;;
 ;;; Functions and macros for .emacs
 ;;;
 ;;; (c) 2004 Mark Wooding
@@ -29,8 +27,6 @@
   "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)
@@ -317,22 +313,26 @@ get itself into a twist."
 (defadvice write-file (after mdw-autorevert activate)
   (mdw-check-autorevert))
 
-(defun mdwmail-mode ()
+(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."
-  (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))
+  :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 ---
 
@@ -364,6 +364,29 @@ Not much right now.  Just support for doing MailCrypt stuff."
     (perform-replace "\n-- \n" "\n-- " nil nil nil)))
 (add-hook 'mail-setup-hook 'mdwmail-mangle-signature)
 
+;;;----- 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 --------------------------------------------------------
 
 (defun mdw-w3m-browse-url (url &optional new-session-p)
@@ -426,7 +449,10 @@ a list of things:
 (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'.")
 
@@ -518,40 +544,6 @@ doesn't cope with anything approximating a complicated case."
 
 ;;;----- 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
@@ -567,14 +559,13 @@ doesn't cope with anything approximating a complicated case."
             (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)
+  (outline-minor-mode t)
   (mdw-set-font))
 
 ;; --- Set up all sorts of faces ---
@@ -586,6 +577,26 @@ doesn't cope with anything approximating a complicated case."
 (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)
@@ -637,7 +648,7 @@ doesn't cope with anything approximating a complicated case."
     (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")
@@ -653,6 +664,30 @@ doesn't cope with anything approximating a complicated case."
     (font-lock-keyword-face :weight bold)
     (font-lock-constant-face :weight bold)
     (font-lock-reference-face :weight bold)
+    (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)
     (diff-index :weight bold)
@@ -691,10 +726,14 @@ doesn't cope with anything approximating a complicated case."
 
 ;; --- 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-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)
@@ -711,7 +750,6 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Fiddle with some syntax codes ---
 
-  (modify-syntax-entry ?_ "w")
   (modify-syntax-entry ?* ". 23")
   (modify-syntax-entry ?/ ". 124b")
   (modify-syntax-entry ?\n "> b")
@@ -893,7 +931,6 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Fiddle with some syntax codes ---
 
-  (modify-syntax-entry ?_ "w")
   (modify-syntax-entry ?* ". 23")
   (modify-syntax-entry ?/ ". 14")
 
@@ -950,7 +987,6 @@ doesn't cope with anything approximating a complicated case."
 (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 . +)
@@ -966,7 +1002,6 @@ doesn't cope with anything approximating a complicated case."
   ;; --- Other stuff ---
 
   (mdw-java-style)
-  (modify-syntax-entry ?_ "w")
   (setq c-hanging-comment-ender-p nil)
   (setq c-backslash-column 72)
   (setq comment-start "/* ")
@@ -1025,7 +1060,6 @@ doesn't cope with anything approximating a complicated case."
 (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 . +)
@@ -1041,7 +1075,6 @@ doesn't cope with anything approximating a complicated case."
   ;; --- Other stuff ---
 
   (mdw-csharp-style)
-  (modify-syntax-entry ?_ "w")
   (setq c-hanging-comment-ender-p nil)
   (setq c-backslash-column 72)
   (setq comment-start "/* ")
@@ -1113,7 +1146,6 @@ doesn't cope with anything approximating a complicated case."
 (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 . +)))
@@ -1125,7 +1157,6 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Miscellaneous fiddling ---
 
-  (modify-syntax-entry ?_ "w")
   (mdw-awk-style)
   (setq c-backslash-column 72)
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
@@ -1174,8 +1205,6 @@ doesn't cope with anything approximating a complicated case."
 
 ;; --- 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)
@@ -1189,7 +1218,6 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Miscellaneous fiddling ---
 
-  (modify-syntax-entry ?_ "w")
   (modify-syntax-entry ?$ "\\")
   (modify-syntax-entry ?$ "\\" font-lock-syntax-table)
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
@@ -1247,7 +1275,6 @@ strip numbers instead."
 
   ;; --- Miscellaneous fiddling ---
 
-  (modify-syntax-entry ?_ "w")
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
 
   ;; --- Now define fontification things ---
@@ -1414,7 +1441,7 @@ strip numbers instead."
   (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 ---
@@ -1424,7 +1451,6 @@ strip numbers instead."
 
   (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)
@@ -1477,7 +1503,6 @@ strip numbers instead."
 
   ;; --- Make underscore an honorary letter ---
 
-  (modify-syntax-entry ?_ "w")
   (modify-syntax-entry ?' "w")
 
   ;; --- Set fill prefix ---
@@ -1533,7 +1558,6 @@ strip numbers instead."
 
   ;; --- Fiddle with syntax table to get comments right ---
 
-  (modify-syntax-entry ?_ "w")
   (modify-syntax-entry ?' "\"")
   (modify-syntax-entry ?- ". 123")
   (modify-syntax-entry ?{ ". 1b")
@@ -1567,6 +1591,41 @@ strip numbers instead."
           (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 ()
@@ -1740,8 +1799,6 @@ strip numbers instead."
 (defun message-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)
@@ -1989,6 +2046,17 @@ strip numbers instead."
    "\\([ \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 ()