X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/8d6d55b983fb1c1f4cc870195e016380d10fc8dc..c14d77930a7a09295b24c5145c6bc304c1fb971d:/dot-emacs.el diff --git a/dot-emacs.el b/dot-emacs.el index 3da4450..0376bad 100644 --- a/dot-emacs.el +++ b/dot-emacs.el @@ -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) @@ -302,7 +298,10 @@ input lists are not modified, although they'll probably become garbage." "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) + (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))) @@ -314,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 --- @@ -361,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) @@ -423,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'.") @@ -515,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 @@ -564,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 --- @@ -583,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) @@ -634,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") @@ -650,8 +664,32 @@ 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) - (woman-bold-face :weight bold) - (woman-italic-face :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) (diff-index :weight bold) (diff-file-header :weight bold) (diff-hunk-header :foreground "SkyBlue1") @@ -688,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) @@ -708,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") @@ -890,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") @@ -947,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 . +) @@ -963,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 "/* ") @@ -1022,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 . +) @@ -1038,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 "/* ") @@ -1110,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 . +))) @@ -1122,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]*\\)") @@ -1171,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) @@ -1186,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]*\\)") @@ -1244,7 +1275,6 @@ strip numbers instead." ;; --- Miscellaneous fiddling --- - (modify-syntax-entry ?_ "w") (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)") ;; --- Now define fontification things --- @@ -1255,7 +1285,7 @@ strip numbers instead." "del" "elif" "else" "except" "exec" "finally" "for" "from" "global" "if" "import" "in" "is" "lambda" "not" "or" "pass" "print" "raise" "return" "try" - "while" "yield"))) + "while" "with" "yield"))) (setq font-lock-keywords (list @@ -1411,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 --- @@ -1421,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) @@ -1474,7 +1503,6 @@ strip numbers instead." ;; --- Make underscore an honorary letter --- - (modify-syntax-entry ?_ "w") (modify-syntax-entry ?' "w") ;; --- Set fill prefix --- @@ -1530,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") @@ -1564,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 () @@ -1737,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) @@ -1986,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 ()