(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)
(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)
(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")
- (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))
- (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)
-
;;;----- Dired hacking ------------------------------------------------------
(defadvice dired-maybe-insert-subdir
(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)
(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)
+ (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")
;; --- 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)
(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++ ()
(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 ()
(defun mdw-fontify-tex ()
(setq ispell-parser 'tex)
+ (turn-on-reftex)
;; --- Don't make maths into a string ---
;;;----- 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 ?0 "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
(mdw-regexps "array" "bitmap" "callback" "docs[ \t]+enum"
"export" "enum" "fixed-octetstring" "flags"
"primitive-nullfree" "relaxed[ \t]+enum"
"set" "table" "tagged-optional" "union"
"variadic" "vector" "version" "version-tag")))
- (setq message-mode-keywords
+ (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 "/* ")
(mdw-regexps "assert" "define" "elif" "else" "endif" "error"
"ident" "if" "ifdef" "ifndef" "import" "include"
"line" "pragma" "unassert" "undef" "warning")))
- (setq message-mode-keywords
+ (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))
;; --- 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 ---
"\\([ \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)