X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/88158dafd82e4c589fbcbe1cb287a608c10889e8..8bf730c6637646109e668181faf19dc2013f17b2:/el/dot-emacs.el diff --git a/el/dot-emacs.el b/el/dot-emacs.el index 316b9e0..d254154 100644 --- a/el/dot-emacs.el +++ b/el/dot-emacs.el @@ -57,6 +57,12 @@ This may be at the expense of cool features.") (interactive) (error "wrong button")) +(defun mdw-emacs-version-p (major &optional minor) + "Return non-nil if the running Emacs is at least version MAJOR.MINOR." + (or (> emacs-major-version major) + (and (= emacs-major-version major) + (>= emacs-minor-version (or minor 0))))) + ;; Some error trapping. ;; ;; If individual bits of this file go tits-up, we don't particularly want @@ -189,8 +195,7 @@ fringes is not taken out of the allowance for WIDTH, unlike "Split a wide window into appropriate widths." (interactive "P") (setq width (cond (width (prefix-numeric-value width)) - ((and window-system - (>= emacs-major-version 22)) + ((and window-system (mdw-emacs-version-p 22)) 77) (t 78))) (let* ((win (selected-window)) @@ -226,6 +231,13 @@ frame is actually mapped on the screen." (mdw-advise-to-inhibit-raise-frame select-frame-set-input-focus) +;; Bug fix for markdown-mode, which breaks point positioning during +;; `query-replace'. +(defadvice markdown-check-change-for-wiki-link + (around mdw-save-match activate compile) + "Save match data around the `markdown-mode' `after-change-functions' hook." + (save-match-data ad-do-it)) + ;; Transient mark mode hacks. (defadvice exchange-point-and-mark @@ -247,6 +259,11 @@ it's currently off." ;; Functions for sexp diary entries. +(defun mdw-not-org-mode (form) + "As FORM, but not in Org mode agenda." + (and (not mdw-diary-for-org-mode-p) + (eval form))) + (defun mdw-weekday (l) "Return non-nil if `date' falls on one of the days of the week in L. L is a list of day numbers (from 0 to 6 for Sunday through to @@ -258,6 +275,50 @@ function returns non-nil." (memq (nth d '(sunday monday tuesday wednesday thursday friday saturday)) l)))) +(defun mdw-discordian-date (date) + "Return the Discordian calendar date corresponding to DATE. + +The return value is (YOLD . st-tibs-day) or (YOLD SEASON DAYNUM DOW). + +The original is by David Pearson. I modified it to produce date components +as output rather than a string." + (let* ((days ["Sweetmorn" "Boomtime" "Pungenday" + "Prickle-Prickle" "Setting Orange"]) + (months ["Chaos" "Discord" "Confusion" + "Bureaucracy" "Aftermath"]) + (day-count [0 31 59 90 120 151 181 212 243 273 304 334]) + (year (- (extract-calendar-year date) 1900)) + (month (1- (extract-calendar-month date))) + (day (1- (extract-calendar-day date))) + (julian (+ (aref day-count month) day)) + (dyear (+ year 3066))) + (if (and (= month 1) (= day 28)) + (cons dyear 'st-tibs-day) + (list dyear + (aref months (floor (/ julian 73))) + (1+ (mod julian 73)) + (aref days (mod julian 5)))))) + +(defun mdw-diary-discordian-date () + "Convert the date in `date' to a string giving the Discordian date." + (let* ((ddate (mdw-discordian-date date)) + (tail (format "in the YOLD %d" (car ddate)))) + (if (eq (cdr ddate) 'st-tibs-day) + (format "St Tib's Day %s" tail) + (let ((season (cadr ddate)) + (daynum (caddr ddate)) + (dayname (cadddr ddate))) + (format "%s, the %d%s day of %s %s" + dayname + daynum + (let ((ldig (mod daynum 10))) + (cond ((= ldig 1) "st") + ((= ldig 2) "nd") + ((= ldig 3) "rd") + (t "th"))) + season + tail))))) + (defun mdw-todo (&optional when) "Return non-nil today, or on WHEN, whichever is later." (let ((w (calendar-absolute-from-gregorian (calendar-current-date))) @@ -277,6 +338,34 @@ function returns non-nil." (nth 2 when)))))))) (eq w d))) +(defvar mdw-diary-for-org-mode-p nil) + +(defadvice org-agenda-list (around mdw-preserve-links activate) + (let ((mdw-diary-for-org-mode-p t)) + ad-do-it)) + +(defadvice diary-add-to-list (before mdw-trim-leading-space activate) + "Trim leading space from the diary entry string." + (save-match-data + (let ((str (ad-get-arg 1))) + (ad-set-arg 1 + (cond ((null str) nil) + ((and mdw-diary-for-org-mode-p + (string-match (concat + "^[ \t]*" + "\\(" diary-time-regexp + "\\(-" diary-time-regexp "\\)?" + "\\)[ \t]+") + str)) + (replace-match "\\1 " nil nil str)) + ((string-match "^[ \t]+" str) + (replace-match "" nil nil str)) + ((and (not mdw-diary-for-org-mode-p) + (string-match "\\[\\[[^][]*]\\[\\([^][]*\\)]]" + str)) + (replace-match "\\1" nil nil str)) + (t str)))))) + ;; Fighting with Org-mode's evil key maps. (defvar mdw-evil-keymap-keys @@ -444,6 +533,27 @@ so that it can be used for convenient filtering." (setenv "REAL_MOVEMAIL" try)) (setq path (cdr path))))) +;; AUTHINFO GENERIC kludge. + +(defvar nntp-authinfo-generic nil + "Set to the `NNTPAUTH' string to pass on to `authinfo-kludge'. + +Use this to arrange for per-server settings.") + +(defun nntp-open-authinfo-kludge (buffer) + "Open a connection to SERVER using `authinfo-kludge'." + (let ((proc (start-process "nntpd" buffer + "env" (concat "NNTPAUTH=" + (or nntp-authinfo-generic + (getenv "NNTPAUTH") + (error "NNTPAUTH unset"))) + "authinfo-kludge" nntp-address))) + (set-buffer buffer) + (nntp-wait-for-string "^\r*200") + (beginning-of-line) + (delete-region (point-min) (point)) + proc)) + (eval-after-load "erc" '(load "~/.ercrc.el")) @@ -810,6 +920,8 @@ case." (whitespace-mode arg)) (setq show-trailing-whitespace whitespace-mode))) +(defvar mdw-do-misc-mode-hacking nil) + (defun mdw-misc-mode-config () (and mdw-auto-indent (cond ((eq major-mode 'lisp-mode) @@ -819,14 +931,13 @@ case." nil) (t (local-set-key "\C-m" 'newline-and-indent)))) + (set (make-local-variable 'mdw-do-misc-mode-hacking) t) (local-set-key [C-return] 'newline) (make-local-variable 'page-delimiter) (setq page-delimiter "\f\\|^.*-\\{6\\}.*$") (setq comment-column 40) (auto-fill-mode 1) (setq fill-column 77) - (setq show-trailing-whitespace t) - (mdw-whitespace-mode 1) (and (fboundp 'gtags-mode) (gtags-mode)) (if (fboundp 'hs-minor-mode) @@ -835,8 +946,17 @@ case." (reveal-mode t) (trap (turn-on-font-lock))) -(defun mdw-post-config-mode-hack () - (mdw-whitespace-mode 1)) +(defun mdw-post-local-vars-misc-mode-config () + (when (and mdw-do-misc-mode-hacking + (not buffer-read-only)) + (setq show-trailing-whitespace t) + (mdw-whitespace-mode 1))) +(add-hook 'hack-local-variables-hook 'mdw-post-local-vars-misc-mode-config) + +(defadvice toggle-read-only (after mdw-angry-fruit-salad activate) + (when mdw-do-misc-mode-hacking + (setq show-trailing-whitespace (not buffer-read-only)) + (mdw-whitespace-mode (if buffer-read-only 0 1)))) (eval-after-load 'gtags '(progn @@ -997,7 +1117,7 @@ doesn't match any of the regular expressions in (((type w32)) :family "courier new" :height 85) (((type x)) :family "6x13" :foundry "trad" :height 130) (t :foreground "white" :background "black")) -(if (>= emacs-major-version 23) +(if (mdw-emacs-version-p 23) (mdw-define-face variable-pitch (((type x)) :family "sans" :height 100)) (mdw-define-face variable-pitch @@ -1156,7 +1276,7 @@ doesn't match any of the regular expressions in (t :foreground "SkyBlue1")) (mdw-define-face magit-item-highlight (((type tty)) :background "blue") - (t :background "DarkSeaGreen4")) + (t :background "grey11")) (mdw-define-face magit-log-head-label-remote (((type tty)) :background "cyan" :foreground "green") (t :background "grey11" :foreground "DarkSeaGreen2" :box t)) @@ -1226,7 +1346,7 @@ doesn't match any of the regular expressions in (mdw-define-face mdw-ellipsis-face (((type tty)) :foreground "blue") (t :foreground "grey60")) (let ((dollar (make-glyph-code ?$ 'mdw-ellipsis-face)) - (backslash (make-glyph-code ?\ 'mdw-ellipsis-face)) + (backslash (make-glyph-code ?\\ 'mdw-ellipsis-face)) (dot (make-glyph-code ?. 'mdw-ellipsis-face)) (bar (make-glyph-code ?| mdw-ellipsis-face))) (set-display-table-slot standard-display-table 0 dollar) @@ -1316,69 +1436,82 @@ doesn't match any of the regular expressions in ;; Now define things to be fontified. (make-local-variable 'font-lock-keywords) (let ((c-keywords - (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 - "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 + (mdw-regexps "alignas" ;C11 macro, C++11 + "alignof" ;C++11 + "and" ;C++, C95 macro + "and_eq" ;C++, C95 macro + "asm" ;K&R, C++, GCC + "atomic" ;C11 macro, C++11 template type + "auto" ;K&R, C89 + "bitand" ;C++, C95 macro + "bitor" ;C++, C95 macro + "bool" ;C++, C99 macro + "break" ;K&R, C89 + "case" ;K&R, C89 + "catch" ;C++ + "char" ;K&R, C89 + "char16_t" ;C++11, C11 library type + "char32_t" ;C++11, C11 library type + "class" ;C++ + "complex" ;C99 macro, C++ template type + "compl" ;C++, C95 macro + "const" ;C89 + "constexpr" ;C++11 + "const_cast" ;C++ + "continue" ;K&R, C89 + "decltype" ;C++11 + "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 + "float" ;K&R, C89 + "for" ;K&R, C89 + ;; "fortran" ;K&R + "friend" ;C++ + "goto" ;K&R, C89 + "if" ;K&R, C89 + "imaginary" ;C99 macro + "inline" ;C++, C99, GCC + "int" ;K&R, C89 + "long" ;K&R, C89 + "mutable" ;C++ + "namespace" ;C++ + "new" ;C++ + "noexcept" ;C++11 + "noreturn" ;C11 macro + "not" ;C++, C95 macro + "not_eq" ;C++, C95 macro + "nullptr" ;C++11 + "operator" ;C++ + "or" ;C++, C95 macro + "or_eq" ;C++, C95 macro + "private" ;C++ + "protected" ;C++ + "public" ;C++ + "register" ;K&R, C89 "reinterpret_cast" ;C++ - "restrict" ;C9X + "restrict" ;C99 "return" ;K&R, C89 "short" ;K&R, C89 "signed" ;C89 "sizeof" ;K&R, C89 "static" ;K&R, C89 + "static_assert" ;C11 macro, C++11 "static_cast" ;C++ "struct" ;K&R, C89 "switch" ;K&R, C89 "template" ;C++ "throw" ;C++ "try" ;C++ - "this" ;C++ + "thread_local" ;C11 macro, C++11 "typedef" ;C89 "typeid" ;C++ "typeof" ;GCC @@ -1391,12 +1524,19 @@ doesn't match any of the regular expressions in "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 + "xor" ;C++, C95 macro + "xor_eq" ;C++, C95 macro + "_Alignas" ;C11 + "_Alignof" ;C11 + "_Atomic" ;C11 + "_Bool" ;C99 + "_Complex" ;C99 + "_Generic" ;C11 + "_Imaginary" ;C99 + "_Noreturn" ;C11 + "_Pragma" ;C99 preprocessor + "_Static_assert" ;C11 + "_Thread_local" ;C11 "__alignof__" ;GCC "__asm__" ;GCC "__attribute__" ;GCC @@ -1412,9 +1552,9 @@ doesn't match any of the regular expressions in "__volatile__" ;GCC )) (c-constants - (mdw-regexps "false" ;C++, C9X macro + (mdw-regexps "false" ;C++, C99 macro "this" ;C++ - "true" ;C++, C9X macro + "true" ;C++, C99 macro )) (preprocessor-keywords (mdw-regexps "assert" "define" "elif" "else" "endif" "error" @@ -1461,9 +1601,7 @@ doesn't match any of the regular expressions in ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face)))) - - (mdw-post-config-mode-hack))) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; AP calc mode. @@ -1515,9 +1653,7 @@ doesn't match any of the regular expressions in ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Java programming configuration. @@ -1583,9 +1719,7 @@ doesn't match any of the regular expressions in ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Javascript programming configuration. @@ -1643,9 +1777,7 @@ doesn't match any of the regular expressions in ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Scala programming configuration. @@ -1718,9 +1850,7 @@ doesn't match any of the regular expressions in "\\|" "\\\\" "." "\\)" "\\('\\)") '(1 "\"") - '(4 "\""))))) - - (mdw-post-config-mode-hack)) + '(4 "\"")))))) ;;;-------------------------------------------------------------------------- ;;; C# programming configuration. @@ -1791,9 +1921,7 @@ doesn't match any of the regular expressions in ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) (define-derived-mode csharp-mode java-mode "C#" "Major mode for editing C# code.") @@ -1908,9 +2036,7 @@ doesn't match any of the regular expressions in '(0 mdw-number-face)) (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) (defun mdw-fontify-inferior-fsharp () (mdw-fontify-fsharp) @@ -1979,9 +2105,7 @@ doesn't match any of the regular expressions in ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Rust programming configuration. @@ -2057,10 +2181,7 @@ doesn't match any of the regular expressions in ;; Hack key bindings. (local-set-key [?{] 'mdw-self-insert-and-indent) - (local-set-key [?}] 'mdw-self-insert-and-indent) - - ;; Final hacking. - (mdw-post-config-mode-hack)) + (local-set-key [?}] 'mdw-self-insert-and-indent)) ;;;-------------------------------------------------------------------------- ;;; Awk programming configuration. @@ -2118,9 +2239,7 @@ doesn't match any of the regular expressions in ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Perl programming style. @@ -2182,9 +2301,7 @@ doesn't match any of the regular expressions in ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) (defun perl-number-tests (&optional arg) "Assign consecutive numbers to lines containing `#t'. With ARG, @@ -2227,9 +2344,7 @@ strip numbers instead." ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face)))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face))))) ;; Define Python fontification styles. @@ -2303,9 +2418,7 @@ strip numbers instead." ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Assembler mode. @@ -2339,8 +2452,7 @@ strip numbers instead." "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)") '(0 mdw-number-face)) (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face)))) - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face))))) ;;;-------------------------------------------------------------------------- ;;; Dylan programming configuration. @@ -2406,9 +2518,7 @@ strip numbers instead." "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\|" "\\_<[-+*/=<>:&|]+\\_>" "\\)") - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Algol 68 configuration. @@ -2450,9 +2560,7 @@ strip numbers instead." "\\>") '(0 mdw-number-face)) (list "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; REXX configuration. @@ -2525,9 +2633,7 @@ strip numbers instead." ;; And everything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Standard ML programming style. @@ -2577,9 +2683,7 @@ strip numbers instead." ;; And anything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Haskell configuration. @@ -2657,9 +2761,7 @@ strip numbers instead." "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)") '(0 mdw-number-face)) (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Erlang configuration. @@ -2692,9 +2794,7 @@ strip numbers instead." (list "\\<[0-9]+\\(\\|#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)\\>" '(0 mdw-number-face)) (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face))))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face)))))) ;;;-------------------------------------------------------------------------- ;;; Texinfo configuration. @@ -2728,9 +2828,7 @@ strip numbers instead." ;; Fontify TeX special characters as punctuation. (list "[{}]+" - '(0 mdw-punct-face)))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face))))) ;;;-------------------------------------------------------------------------- ;;; TeX and LaTeX configuration. @@ -2744,6 +2842,10 @@ strip numbers instead." (modify-syntax-entry ?$ "." font-lock-syntax-table) (local-set-key [?$] 'self-insert-command) + ;; Make `tab' be useful, given that tab stops in TeX don't work well. + (local-set-key "\C-i" 'indent-relative) + (setq indent-tabs-mode nil) + ;; Set fill prefix. (mdw-standard-fill-prefix "\\([ \t]*%+[ \t]*\\)") @@ -2796,9 +2898,7 @@ strip numbers instead." ;; Fontify TeX special characters as punctuation. (list "[$^_{}#&]" - '(0 mdw-punct-face)))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face))))) ;;;-------------------------------------------------------------------------- ;;; SGML hacking. @@ -3158,8 +3258,7 @@ that character only to be normal punctuation.") "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)") '(0 mdw-number-face)) (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face)))) - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face))))) ;; Lispy languages. @@ -3216,9 +3315,7 @@ that character only to be normal punctuation.") "\\)\\_>") '(0 mdw-number-face)) (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" - '(0 mdw-punct-face)))) - - (mdw-post-config-mode-hack)) + '(0 mdw-punct-face))))) (defun comint-send-and-indent () (interactive)