dot/emacs, el/dot-emacs.el: Update browser configuration. master
authorMark Wooding <mdw@distorted.org.uk>
Tue, 14 May 2024 12:24:45 +0000 (13:24 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 14 May 2024 12:24:45 +0000 (13:24 +0100)
It seems that `browse-url-mozilla' doesn't work any more, but there's
a `browse-url-firefox' which does, so use that in preference.

Makefile
bin/disorder-play-on-demand [new file with mode: 0755]
dot/emacs
dot/ercrc.el
dot/gnus-local.el.distorted
dot/inputrc
dot/parallel-hosts
dot/profile
dot/shell-rc
el/dot-emacs.el
el/mdw-multiple-cursors.el

index e650635..8bfcef2 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -250,7 +250,7 @@ SCRIPTLINKS         += fixsub
 SCRIPTLINKS            += check-debsyms
 SCRIPTLINKS            += check-blkdev-size
 SCRIPTLINKS            += xremote
-SCRIPTLINKS            += remote-disorder
+SCRIPTLINKS            += disorder-play-on-demand remote-disorder
 SCRIPTLINKS            += remote-slideshow
 
 ## Random odds and ends.
diff --git a/bin/disorder-play-on-demand b/bin/disorder-play-on-demand
new file mode 100755 (executable)
index 0000000..cdf6887
--- /dev/null
@@ -0,0 +1,9 @@
+#! /bin/sh -e
+
+hostname=$(hostname)
+locking -fx $HOME/.disorder/$hostname-local.lock \
+  sh -ec "exec </dev/null >>$HOME/.disorder/$hostname-local.log 2>&1 \
+           \"\$@\"" . \
+  disorder-ondemand -u$HOME/.disorder/passwd.local -- \
+  disorder-playrtp -Apulseaudio -u$HOME/.disorder/passwd.local \
+         --socket $HOME/.disorder/$hostname-local
index 035d132..ea5a476 100644 (file)
--- a/dot/emacs
+++ b/dot/emacs
@@ -33,7 +33,7 @@
     (if (file-exists-p boot)
        (load boot))))
 
-(require 'cl)
+(require 'cl-lib)
 (require 'dot-emacs)
 
 (unless (mdw-emacs-version-p 25)
      (not (and (fboundp 'daemonp) (daemonp)))
      (progn (setq server-temp-file-regexp (concat "^" tmpdir "\\|/draft$")
                  edit-server-new-frame nil
+                 server-raise-frame nil
                  gnuserv-frame t)
-           (trap (let ((warning-suppress-types
-                        (cons '(server)
-                              (and (boundp 'warning-suppress-types)
-                                   warning-suppress-types))))
-                   (server-start)))
+           (trap (progn
+                   (require 'server)
+                   (let ((state (server-running-p)))
+                     (if state
+                         (message "Emacs server %s: not starting"
+                                  (cond ((eq state t) "already running")
+                                        (t "maybe running")))
+                       (server-start)))))
            (trap (progn
                    (require 'edit-server)
                    (edit-server-start)
       wdired-allow-to-change-permissions 'advanced)
 (setq read-quoted-char-radix 16)       ;C-q HEX-STUFF [RET]
 (setq case-fold-file-names nil)                ;Don't translate file names (grr...)
-(setq scroll-step 5)                   ;Don't scroll too much at a time
+(setq scroll-step 5                    ;Don't scroll too much at a time
+      hscroll-step 8
+      auto-hscroll-mode 'current-line)
 (setq custom-unlispify-tag-names nil   ;Display variable names properly
       custom-unlispify-menu-entries nil
       custom-buffer-done-kill t)
 
 (setq browse-url-browser-function (mdw-good-url-browser)
       browse-url-generic-program "mdw-chrome"
-      browse-url-mozilla-program "mdw-iceweasel")
+      browse-url-firefox-program "mdw-iceweasel"
+      browse-url-mozilla-program browse-url-firefox-program)
 
 (setq w3m-default-display-inline-images t
       w3m-use-cookies t)
                    ("application/x-pdf" "\\.pdf\\'" ("xdg-open" file) nil))))
      (dolist (e entries)
        (setq w3m-content-type-alist
-              (cons e (remove* (car e) w3m-content-type-alist
-                               :key #'car :test #'string=))))))
+              (cons e (cl-remove (car e) w3m-content-type-alist
+                                 :key #'car :test #'string=))))))
 
 (setq w3-do-incremental-display t
       w3-use-menus '(file edit view go bookmark options
   (global-set-key [?\C-c ?w ?b] 'w3m-bookmark-view)
   (global-set-key [?\C-c ?w ?c] 'mdw-set-frame-colour)
   (global-set-key [?\C-c ?w ?d] 'mdw-divvy-window)
+  (global-set-key [?\C-c ?w ?f] 'mdw-set-fallback-window)
   (global-set-key [?\C-c ?w ?h] 'windmove-left)
   (global-set-key [?\C-c ?w ?j] 'windmove-down)
   (global-set-key [?\C-c ?w ?k] 'windmove-up)
 
 (eval-after-load "hippie-exp"
   '(setq hippie-expand-try-functions-list
-          (remove-if (lambda (name)
-                       (memq name '(try-expand-list
-                                    try-expand-list-all-buffers)))
-                     hippie-expand-try-functions-list)))
+          (cl-remove-if (lambda (name)
+                          (memq name '(try-expand-list
+                                       try-expand-list-all-buffers)))
+                        hippie-expand-try-functions-list)))
 
 (autoload 'dired-jump "dired-x")
 (autoload 'dired-jump-other-window "dired-x")
 
 (setq completion-ignored-extensions
        (append `(".hc" ".hi") completion-ignored-extensions))
-(dolist (dir (remove-if-not (lambda (ext)
-                             (= (aref ext (- (length ext) 1)) ?/))
-                           completion-ignored-extensions))
+(dolist (dir (cl-remove-if-not (lambda (ext)
+                                (= (aref ext (- (length ext) 1)) ?/))
+                              completion-ignored-extensions))
   (if (/= (aref dir 0) ?/)
       (setq completion-ignored-extensions
              (cons (concat "/" dir)
index a0bc5a6..6a708ac 100644 (file)
@@ -22,7 +22,8 @@
       (while (< i (length string))
        (let ((ch (aref string i)))
          (cond ((and (= (char-width ch) 1)
-                     (not (or (<= #x1f200 ch #x1ffff))))
+                     (not (or (<= #x1f200 ch #x1ffff)
+                              (= ch #x2693))))
                 (when state (princ "*]") (setf state nil))
                 (write-char ch))
                (t
index c208d0f..00f46d6 100644 (file)
 
          ;; Mailing lists, not split out earlier.
          (to "python-list@python\\.org" "lists.python")
-         (to ,(concat "\\(jump-\\(announce\\|discuss\\)\\)@"
+         (to ,(concat "\\(jump-\\(announce\\|discuss\\|vps\\)\\)@"
                       "\\(lists\\.\\)?" "jump\\.net\\.uk")
              "lists.\\1")
          (to "cambridgecryptowhiskyclub@gmail\\.com"
          (from "@warwick\\.ac\\.uk\\>" "lists.warwick-uni" t)
          (to "chiark-\\(motd\\|announce\\)@chiark\\.greenend\\.org\\.uk"
              "lists.chiark-announce")
+         (to "sot@dotat\\.at" "lists.sot" t)
          (any "clive-cambridge-gamers@nsict\\.org" "lists.nsict-games")
 
          ;; Per-sender addresses.
          (from "expiry@letsencrypt\\.org" "admin.letsencrypt")
 
          ;; Other splits I've not given a per-sender address.
-         (from "@\\(.*\\.\\)?lovefilm\\.com\\>" "crap.lovefilm" t)
+         (from "@\\([^.]+\\.\\)?aegon" "crap.aegon" t)
          (from "@\\(.*\\.\\)?amazon\\." "crap.amazon" t)
+         (from "@\\(.*\\.\\)?primevideo\\." "crap.amazon" t)
          (from "@cineworldmail\\.com\\>" "crap.cineworld" t)
-         (from "@picturehouses\\.co\\.uk\\>" "crap.picturehouse" t)
-         (from "@nationwide" "crap.nationwide" t)
-         (from "nationwide@securesuiteemail\\.com\\>" "crap.nationwide" t)
-         (from "@\\(.*\\.\\)?spotify\\(mail\\)?\\.com\\>" "crap.spotify" t)
-         (from "@action\\.openrightsgroup\\.org\\>" "crap.org" t)
          (from "unlimited@cineworld\\.com\\>" "crap.cineworld" t)
-         (from "@tshirthell\\.com\\>" "crap.tshirt-hell" t)
+         (from "@\\(.*\\.\\)?gandi\\.net\\>" "crap.gandi" t)
+         (from "@accounts\\.google\\.com\\>" "crap.google" t)
          (from "campaigns@jolla\\.com\\>" "crap.jolla" t)
+         (from "@\\(.*\\.\\)?lovefilm\\.com\\>" "crap.lovefilm" t)
+         (from "@mythic-beasts\\.com\\>" "crap.mythic-beasts" t)
+         (from "@\\([^.]+\\.\\)?nationwide" "crap.nationwide" t)
+         (from "nationwide@securesuiteemail\\.com\\>" "crap.nationwide" t)
+         (from "@action\\.openrightsgroup\\.org\\>" "crap.org" t)
+         (from "@picturehouses\\.co\\.uk\\>" "crap.picturehouse" t)
+         (from "@\\(.*\\.\\)?spotify\\(mail\\)?\\.com\\>" "crap.spotify" t)
          (from "@thomann\\.de\\>" "crap.thomann" t)
+         (from "@tshirthell\\.com\\>" "crap.tshirt-hell" t)
          (from "@wikimedia\\.org\\>" "crap.wikimedia" t)
-         (from "@\\(.*\\.\\)?gandi\\.net\\>" "crap.gandi" t)
-         (from "@mythic-beasts\\.com\\>" "crap.mythic-beasts" t)
-         (from "@accounts\\.google\\.com\\>" "crap.google" t)
 
          ;; Default.
          "mail.misc"))
index 8621fbb..ff6daa2 100644 (file)
@@ -17,7 +17,6 @@ $if term=dumb
 $else
 set enable-bracketed-paste on
 $endif
-set show-all-if-ambiguous
 
 ## Missing bindings
 "\e\e[C": forward-word
index 4136aab..88a5924 100644 (file)
 @distorted+distorted-mdw/mdw@jem.distorted.org.uk
 @distorted+distorted-mdw/mdw@artist.distorted.org.uk
 @distorted+distorted-mdw/mdw@universe.distorted.org.uk
-@distorted+distorted-mdw/mdw@groove.distorted.org.uk
-@distorted+distorted-mdw/mdw@nfender.distorted.org.uk
-@distorted+distorted-mdw/mdw@nprecision.distorted.org.uk
-@distorted+distorted-mdw/mdw@ntelecaster.distorted.org.uk
-@distorted+distorted-mdw/mdw@nstratocaster.distorted.org.uk
-@distorted+distorted-mdw/mdw@njazz.distorted.org.uk
-##@distorted+distorted-mdw/mdw@vampire.distorted.org.uk
-
-## Colocated servers.
 @distorted+distorted-mdw/mdw@fender.distorted.org.uk
 @distorted+distorted-mdw/mdw@precision.distorted.org.uk
 @distorted+distorted-mdw/mdw@telecaster.distorted.org.uk
 @distorted+distorted-mdw/mdw@stratocaster.distorted.org.uk
 @distorted+distorted-mdw/mdw@jazz.distorted.org.uk
+@distorted+distorted-mdw/mdw@groove.distorted.org.uk
+##@distorted+distorted-mdw/mdw@vampire.distorted.org.uk
+
+## Virtual private servers.
+@distorted+distorted-mdw/mdw@eggle.distorted.org.uk
 @distorted+distorted-mdw/mdw@national.distorted.org.uk
 
 ## Root logins.
 @distorted-root+root/root@jem.distorted.org.uk
 @distorted-root+root/root@artist.distorted.org.uk
 @distorted-root+root/root@universe.distorted.org.uk
-@distorted-root+root/root@nfender.distorted.org.uk
-@distorted-root+root/root@nprecision.distorted.org.uk
-@distorted-root+root/root@ntelecaster.distorted.org.uk
-@distorted-root+root/root@nstratocaster.distorted.org.uk
-@distorted-root+root/root@njazz.distorted.org.uk
-@distorted-root+root/root@groove.distorted.org.uk
-##@distorted-root+root/root@vampire.distorted.org.uk
 @distorted-root+root/root@fender.distorted.org.uk
 @distorted-root+root/root@precision.distorted.org.uk
 @distorted-root+root/root@telecaster.distorted.org.uk
 @distorted-root+root/root@stratocaster.distorted.org.uk
 @distorted-root+root/root@jazz.distorted.org.uk
+@distorted-root+root/root@groove.distorted.org.uk
+##@distorted-root+root/root@vampire.distorted.org.uk
+@distorted-root+root/root@eggle.distorted.org.uk
 @distorted-root+root/root@national.distorted.org.uk
 
 ## Unprivileged logins.
index 93c5421..f8d4dc9 100644 (file)
@@ -308,6 +308,12 @@ PS_PERSONALITY=gnu; export PS_PERSONALITY
 DEB_BUILD_OPTIONS="parallel=$(mdw-conf make-parallel 4)"
 export DEB_BUILD_OPTIONS
 
+## Turn on useful colouring.
+if __mdw_programp dircolors; then eval $(dircolors -b "$HOME/.dircolors")
+else unset LS_COLORS; fi
+export GREP_COLORS="mt=01;31:ms=01;31:mc=031;31:fn=36:ln=36:bn=36:se=34"
+export DIFF_COLORS="hd=1:ln=36:ad=32:de=31"
+
 ## Turn off angry fruit salad error messages from things.
 DPKG_COLORS=never; export DPKG_COLORS
 GCC_COLORS=; export GCC_COLORS
index 33403cb..5251e98 100644 (file)
@@ -241,22 +241,23 @@ alias abcl="rlwrap abcl --noinform"
 ###--------------------------------------------------------------------------
 ### Colour output.
 
-## Arrange for `ls' output to be in colour.
-if __mdw_programp dircolors; then eval $(dircolors -b "$HOME/.dircolors")
-else unset LS_COLORS; fi
+mdw_colour_p () {
+  if ! [ -t 1 ]; then return 1; fi
+  case $TERM in dumb) return 1 ;; esac
+  return 0
+}
 
+## Arrange for `ls' output to be in colour.
 unalias ls 2>/dev/null || :
 ls () {
-  if [ -t 1 ]; then command ls $LS_OPTIONS ${LS_COLORS+--color=auto} "$@"
+  if mdw_colour_p; then command ls $LS_OPTIONS ${LS_COLORS+--color=always} "$@"
   else command ls "$@"; fi
 }
 
 ## Arrange for `grep' output to be in colour.
-export GREP_COLORS="mt=01;31:ms=01;31:mc=031;31:fn=36:ln=36:bn=36:se=34"
-
 greplike () {
   local grep=$1; shift
-  if [ -t 1 ]; then
+  if mdw_colour_p; then
     command $grep ${GREP_COLORS+--color=always} "$@" | mdw-pager
   else
     command $grep "$@"
@@ -268,10 +269,9 @@ alias fgrep="greplike fgrep"
 alias zgrep="greplike zgrep"
 
 ## Arrange for `diff' output to be in colour.
-export DIFF_COLORS="hd=1:ln=36:ad=32:de=31"
 difflike () {
   local diff=$1; shift
-  if [ -t 1 ]; then
+  if mdw_colour_p; then
     command $diff \
            ${DIFF_COLORS+--color=always} \
            ${DIFF_COLORS+--palette="$DIFF_COLORS"} \
index cd648c1..1af6e8e 100644 (file)
@@ -56,13 +56,13 @@ This may be at the expense of cool features.")
 
 (eval-when-compile
   (unless (fboundp 'make-regexp) (load "make-regexp"))
-  (require 'cl))
+  (require 'cl-lib))
 
 (defmacro mdw-regexps (&rest list)
   "Turn a LIST of strings into a single regular expression at compile-time."
   (declare (indent nil)
           (debug 0))
-  `',(make-regexp (sort (copy-list list) #'string<)))
+  `',(make-regexp (sort (cl-copy-list list) #'string<)))
 
 (defun mdw-wrong ()
   "This is not the key sequence you're looking for."
@@ -105,10 +105,10 @@ This may be at the expense of cool features.")
   "Read the configuration variable named SYM."
   (unless mdw-config
     (setq mdw-config
-           (flet ((replace (what with)
-                    (goto-char (point-min))
-                    (while (re-search-forward what nil t)
-                      (replace-match with t))))
+           (cl-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" "")
@@ -215,8 +215,9 @@ cruft."
     (let ((tot 0))
       (dolist (what '(scroll-bar fringe))
        (dolist (side '(left right))
-         (incf tot (funcall (intern (concat (symbol-name what) "-columns"))
-                            side))))
+         (cl-incf tot
+                  (funcall (intern (concat (symbol-name what) "-columns"))
+                           side))))
       tot)))
 
 (defun mdw-split-window-horizontally (&optional width)
@@ -352,7 +353,7 @@ prevailing configuration."
                    (and (consp register-value)
                         (window-configuration-p (car register-value))
                         (integer-or-marker-p (cadr register-value))
-                        (null (caddr register-value)))))
+                        (null (cl-caddr register-value)))))
           (error "Register `%c' is not a window configuration" register))
          (t
           (cond ((null register-value)
@@ -496,8 +497,8 @@ as output rather than a string."
     (if (eq (cdr ddate) 'st-tibs-day)
        (format "St Tib's Day %s" tail)
       (let ((season (cadr ddate))
-           (daynum (caddr ddate))
-           (dayname (cadddr ddate)))
+           (daynum (cl-caddr ddate))
+           (dayname (cl-cadddr ddate)))
       (format "%s, the %d%s day of %s %s"
              dayname
              daynum
@@ -705,10 +706,13 @@ With a prefix argument, clear the designated window."
   (interactive "P")
   (let ((window (selected-window)))
     (cond (cancel
-          (setq mdw-designated-window nil)
-          (unless (mdw-emacs-version-p 24)
-            (setq display-buffer-function nil))
-          (message "Window designation cleared."))
+          (cond (mdw-designated-window
+                 (setq mdw-designated-window nil)
+                 (unless (mdw-emacs-version-p 24)
+                   (setq display-buffer-function nil))
+                 (message "Window designation cleared."))
+                (t
+                 (message "No designated window active."))))
          ((window-dedicated-p window)
           (error "Window is dedicated to its buffer."))
          (t
@@ -765,9 +769,47 @@ Pretend they don't exist.  They might be on other display devices."
   (ad-set-arg 2 nil))
 
 (setq even-window-sizes nil
-      even-window-heights nil)
-
-(setq display-buffer-reuse-frames nil)
+      even-window-heights nil
+      display-buffer-reuse-frames nil)
+
+(defvar mdw-fallback-window-alist nil
+  "Alist mapping frames to fallback windows.")
+
+(defun mdw-cleanup-fallback-window-alist ()
+  "Remove entries for dead frames and windows from the fallback alist."
+  (let ((prev nil)
+       (cursor mdw-fallback-window-alist))
+    (while cursor
+      (let* ((assoc (car cursor))
+            (tail (cdr cursor)))
+       (cond ((and (frame-live-p (car assoc))
+                   (window-live-p (cdr assoc)))
+              (setq prev cursor))
+             ((null prev)
+              (setq mdw-fallback-window-alist tail))
+             (t
+              (setcdr prev tail)))
+       (setq cursor tail)))))
+
+(defun mdw-set-fallback-window (cancel)
+  "Prefer the selected window for pop-up buffers in this frame.
+With a prefix argument, clear the fallback window."
+  (interactive "P")
+  (let* ((frame (selected-frame)) (window (selected-window))
+        (assoc (assq (selected-frame) mdw-fallback-window-alist)))
+    (cond (cancel
+          (cond (assoc
+                 (setcdr assoc nil)
+                 (message "Fallback window cleared."))
+                (t
+                 (message "No fallback window active in this frame."))))
+         ((window-dedicated-p window)
+          (error "Window is dedicated to its buffer."))
+         (t
+          (if assoc (setcdr assoc window)
+            (push (cons frame window) mdw-fallback-window-alist))
+          (message "Fallback window set.")))
+    (mdw-cleanup-fallback-window-alist)))
 
 (defun mdw-last-window-in-frame-p (window)
   "Return whether WINDOW is the last in its frame."
@@ -787,10 +829,18 @@ Begone, foul DWIMmerlaik!
 This is all totally subject to arbitrary change in the future, but the
 emphasis is on predictability rather than crazy DWIMmery."
   (let* ((selected (selected-window)) chosen
+        (fallback (assq (selected-frame) mdw-fallback-window-alist))
         (full-height-p (window-full-height-p selected))
         (full-width-p (window-full-width-p selected)))
     (cond
 
+     ((and fallback (window-live-p (cdr fallback)))
+      ;; There's a fallback window set for this frame.  Use it.
+
+      (setq chosen (cdr fallback)
+           selected nil)
+      (display-buffer-record-window 'window chosen buffer))
+
      ((and full-height-p full-width-p)
       ;; We're basically the only window in the frame.  If we want to get
       ;; anywhere, we'll have to split the window.
@@ -909,14 +959,14 @@ to force interactive compilation."
   (interactive
    (let* ((prefix (prefix-numeric-value current-prefix-arg))
          (command (eval compile-command))
-         (dir (and (plusp (logand prefix #x54))
+         (dir (and (cl-plusp (logand prefix #x54))
                    (read-directory-name "Compile in directory: "))))
      (list (if (or compilation-read-command
-                  (plusp (logand prefix #x42)))
+                  (cl-plusp (logand prefix #x42)))
               (compilation-read-command command)
             command)
           dir
-          (plusp (logand prefix #x58)))))
+          (cl-plusp (logand prefix #x58)))))
   (let ((default-directory (or directory default-directory)))
     (compile command comint)))
 
@@ -926,13 +976,13 @@ to force interactive compilation."
   (catch 'found
     (let* ((src-dir (file-name-as-directory (expand-file-name ".")))
           (dir src-dir))
-      (loop
+      (cl-loop
        (when (file-exists-p (concat dir build-file))
          (throw 'found dir))
        (let ((sub (expand-file-name (file-relative-name src-dir dir)
                                     (concat dir "build/"))))
          (catch 'give-up
-           (loop
+           (cl-loop
              (when (file-exists-p (concat sub build-file))
                (throw 'found sub))
              (when (string= sub dir) (throw 'give-up nil))
@@ -1074,12 +1124,12 @@ Use this to arrange for per-server settings."
 (defun mdw-nnimap-transform-headers ()
   (goto-char (point-min))
   (let (article lines size string)
-    (block nil
+    (cl-block nil
       (while (not (eobp))
        (while (not (looking-at "\\* [0-9]+ FETCH"))
          (delete-region (point) (progn (forward-line 1) (point)))
          (when (eobp)
-           (return)))
+           (cl-return)))
        (goto-char (match-end 0))
        ;; Unfold quoted {number} strings.
        (while (re-search-forward
@@ -1359,7 +1409,8 @@ If NEW-SESSION-P, start a new session."
   '(define-key w3m-mode-map [?\e ?\r] 'w3m-view-this-url-new-session))
 
 (defcustom mdw-good-url-browsers
-  '(browse-url-mozilla
+  '(browse-url-firefox
+    browse-url-mozilla
     browse-url-generic
     (w3m . mdw-w3m-browse-url)
     browse-url-w3)
@@ -1413,7 +1464,7 @@ CHECK is fboundp, and returning the correponding FUNC."
             "http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=%s")
            ("ljlogin" "LJ login" "http://www.livejournal.com/login.bml")))
        (add-to-list 'w3m-search-engine-alist
-                   (list (cadr item) (caddr item) nil))
+                   (list (cadr item) (cl-caddr item) nil))
        (add-to-list 'w3m-uri-replace-alist
                    (list (concat "\\`" (car item) ":")
                          'w3m-search-uri-replace
@@ -1484,12 +1535,12 @@ This is mainly useful in `auto-fill-mode'."
        ((eq (car pat) 'if)
         (if (or (null (cdr pat))
                 (null (cddr pat))
-                (null (cdddr pat))
-                (cddddr pat))
+                (null (cl-cdddr pat))
+                (cl-cddddr pat))
             (error "Invalid `if' pattern `%S'" pat))
         (mdw-fill-prefix-match-p (if (eval (cadr pat))
-                                     (caddr pat)
-                                   (cadddr pat))))
+                                     (cl-caddr pat)
+                                   (cl-cadddr pat))))
        ((eq (car pat) 'and)
         (let ((pats (cdr pat))
               (ok t))
@@ -1609,7 +1660,7 @@ case."
   '(progn
 
      ;; Notice that the comment-delimiters should be in italics too.
-     (pushnew 'font-lock-comment-delimiter-face ps-italic-faces)
+     (cl-pushnew 'font-lock-comment-delimiter-face ps-italic-faces)
 
      ;; Select more suitable colours for the main kinds of tokens.  The
      ;; colours set on the Emacs faces are chosen for use against a dark
@@ -1631,8 +1682,8 @@ case."
                        (line-height . 10.55)
                        (space-width . 5.1)
                        (avg-char-width . 5.1)))
-                    (remove* 'CourierCondensed ps-font-info-database
-                             :key #'car)))))
+                    (cl-remove 'CourierCondensed ps-font-info-database
+                               :key #'car)))))
 
 ;; Arrange to strip overlays from the buffer before we print .  This will
 ;; prevent `flyspell' from interfering with the printout.  (It would be less
@@ -1779,11 +1830,11 @@ doesn't match any of the regular expressions in
   (let ((frame-display (frame-parameter frame 'display)))
     (when (and frame-display
               (eq window-system 'x)
-              (not (some (lambda (fr)
-                           (and (not (eq fr frame))
-                                (string= (frame-parameter fr 'display)
-                                         frame-display)))
-                         (frame-list))))
+              (not (cl-some (lambda (fr)
+                              (and (not (eq fr frame))
+                                   (string= (frame-parameter fr 'display)
+                                            frame-display)))
+                            (frame-list))))
       (run-with-idle-timer 0 nil #'x-close-connection frame-display))))
 (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
 
@@ -1858,6 +1909,9 @@ doesn't match any of the regular expressions in
   (((min-colors 64)) :background "grey30")
   (((class color)) :background "blue")
   (t :inverse-video t))
+(mdw-define-face error
+  (((class color)) :background "red")
+  (t :inverse-video t))
 (mdw-define-face match
   (((class color)) :background "blue")
   (t :inverse-video t))
@@ -1924,6 +1978,15 @@ doesn't match any of the regular expressions in
 (mdw-define-face calendar-today-face
   (t :foreground "yellow" :weight bold))
 
+(mdw-define-face flyspell-incorrect
+  (((type x)) :underline (:color "red" :style wave))
+  (((class color)) :foreground "red" :underline t)
+  (t :underline t))
+(mdw-define-face flyspell-duplicate
+  (((type x)) :underline (:color "orange" :style wave))
+  (((class color)) :foreground "orange" :underline t)
+  (t :underline t))
+
 (mdw-define-face comint-highlight-prompt
   (t :weight bold))
 (mdw-define-face comint-highlight-input
@@ -2188,8 +2251,16 @@ doesn't match any of the regular expressions in
   (((min-colors 64)) :background "NavyBlue")
   (((class color)) :background "blue"))
 
+(mdw-define-face erc-my-nick-face
+  (t :foreground "yellow" :weight bold))
+(mdw-define-face erc-current-nick-face
+  (t :foreground "yellow" :weight bold))
 (mdw-define-face erc-input-face
-  (t :foreground "red"))
+  (t :foreground "yellow"))
+(mdw-define-face erc-action-face
+  ())
+(mdw-define-face erc-button
+  (t :foreground "cyan" :underline t :weight semi-bold))
 
 (mdw-define-face woman-bold
   (t :weight bold))
@@ -2313,11 +2384,11 @@ doesn't match any of the regular expressions in
   :global nil
   (let ((buffer (current-buffer)))
     (setq mdw-point-overlay-buffers
-           (mapcan (lambda (buf)
-                     (if (and (buffer-live-p buf)
-                              (not (eq buf buffer)))
-                         (list buf)))
-                   mdw-point-overlay-buffers))
+           (cl-mapcan (lambda (buf)
+                        (if (and (buffer-live-p buf)
+                                 (not (eq buf buffer)))
+                            (list buf)))
+                      mdw-point-overlay-buffers))
     (if mdw-point-overlay-mode
        (setq mdw-point-overlay-buffers
                (cons buffer mdw-point-overlay-buffers))))
@@ -2390,7 +2461,7 @@ indentation anyway."
        (should-indent-p t))
     (while (and context
                (eq (caar context) 'arglist-cont-nonempty))
-      (when (and (= (caddr (pop context)) pos)
+      (when (and (= (cl-caddr (pop context)) pos)
                 context
                 (memq (caar context) '(arglist-intro
                                        arglist-cont-nonempty)))
@@ -2407,7 +2478,7 @@ indentation anyway."
        (if (let* ((key-name (symbol-name key))
                   (key-len (length key-name)))
              (and (>= key-len 6)
-                  (string= (subseq key-name (- key-len 6)) "-alist")))
+                  (string= (substring key-name (- key-len 6)) "-alist")))
            (push (cons key
                        (mdw-merge-style-alists value
                                                (cdr (assoc key second))))
@@ -2418,7 +2489,7 @@ indentation anyway."
        (push item output)))
     (nreverse output)))
 
-(defmacro* mdw-define-c-style (name (&optional parent) &rest assocs)
+(cl-defmacro mdw-define-c-style (name (&optional parent) &rest assocs)
   "Define a C style, called NAME (a symbol) based on PARENT, setting ASSOCs.
 A function, named `mdw-define-c-style/NAME', is defined to actually install
 the style using `c-add-style', and added to the hook
@@ -2487,11 +2558,12 @@ name, as a symbol."
            (append (mapcar (lambda (mode)
                              (cons mode style))
                            modes)
-                   (remove-if (lambda (assoc)
-                                (memq (car assoc) modes))
-                              (if (listp c-default-style)
-                                  c-default-style
-                                (list (cons 'other c-default-style))))))))
+                   (cl-remove-if (lambda (assoc)
+                                   (memq (car assoc) modes))
+                                 (if (listp c-default-style)
+                                     c-default-style
+                                   (list (cons 'other
+                                               c-default-style))))))))
 (setq c-default-style "mdw-c")
 
 (mdw-set-default-c-style '(c-mode c++-mode) 'mdw-c)
@@ -3035,7 +3107,7 @@ name, as a symbol."
 (defun mdw-fontify-fsharp ()
 
   (let ((punct "=<>+-*/|&%!@?"))
-    (do ((i 0 (1+ i)))
+    (cl-do ((i 0 (1+ i)))
        ((>= i (length punct)))
       (modify-syntax-entry (aref punct i) ".")))
 
@@ -3384,6 +3456,7 @@ name, as a symbol."
   (modify-syntax-entry ?$ "\\" font-lock-syntax-table)
   (modify-syntax-entry ?: "." font-lock-syntax-table)
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
+  (setq auto-fill-function #'do-auto-fill)
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
@@ -4088,11 +4161,11 @@ strip numbers instead."
 
   (let ((not-comment
         (let ((word "COMMENT"))
-          (do ((regexp (concat "[^" (substring word 0 1) "]+")
-                       (concat regexp "\\|"
-                               (substring word 0 i)
-                               "[^" (substring word i (1+ i)) "]"))
-               (i 1 (1+ i)))
+          (cl-do ((regexp (concat "[^" (substring word 0 1) "]+")
+                          (concat regexp "\\|"
+                                  (substring word 0 i)
+                                  "[^" (substring word i (1+ i)) "]"))
+                  (i 1 (1+ i)))
               ((>= i (length word)) regexp)))))
     (setq font-lock-keywords
            (list (list (concat "\\<COMMENT\\>"
@@ -4258,6 +4331,8 @@ strip numbers instead."
 ;;; Haskell configuration.
 
 (setq-default haskell-indent-offset 2)
+(setq haskell-doc-prettify-types nil
+      haskell-interactive-popup-errors nil)
 
 (defun mdw-fontify-haskell ()
 
@@ -4268,7 +4343,7 @@ strip numbers instead."
 
   ;; Make punctuation be punctuation
   (let ((punct "=<>+-*/|&%!@?$.^:#`"))
-    (do ((i 0 (1+ i)))
+    (cl-do ((i 0 (1+ i)))
        ((>= i (length punct)))
       (modify-syntax-entry (aref punct i) ".")))
 
@@ -4629,8 +4704,8 @@ that character only to be normal punctuation."
 (defun mdw-conf-quote-normal-acceptable-value-p (value)
   "Is the VALUE is an acceptable value for `mdw-conf-quote-normal'?"
   (or (booleanp value)
-      (every (lambda (v) (memq v '(?\" ?')))
-            (if (listp value) value (list value)))))
+      (cl-every (lambda (v) (memq v '(?\" ?')))
+               (if (listp value) value (list value)))))
 
 (defun mdw-fix-up-quote ()
   "Apply the setting of `mdw-conf-quote-normal'."
@@ -5064,11 +5139,11 @@ by `mdw-lisp-setf-value-indent' spaces."
                             (while (< (point) start)
                               (condition-case nil (forward-sexp 1)
                                 (scan-error (throw 'done nil)))
-                              (incf count))
+                              (cl-incf count))
                             (1- count)))))))
         (and basic-indent offset
              (list (+ basic-indent
-                      (if (oddp offset) 0
+                      (if (cl-oddp offset) 0
                         mdw-lisp-setf-value-indent))
                    basic-indent)))))
 (progn
@@ -5096,13 +5171,13 @@ align the other subforms beneath it.  Otherwise, indent them
               (eq lisp-indent-backquote-substitution-mode 'corrected))
       (save-excursion
        (goto-char (elt state 1))
-       (incf loop-indentation
-                (cond ((eq (char-before) ?,) -1)
-                      ((and (eq (char-before) ?@)
-                            (progn (backward-char)
-                                   (eq (char-before) ?,)))
-                       -2)
-                      (t 0)))))
+       (cl-incf loop-indentation
+                  (cond ((eq (char-before) ?,) -1)
+                        ((and (eq (char-before) ?@)
+                              (progn (backward-char)
+                                     (eq (char-before) ?,)))
+                         -2)
+                        (t 0)))))
 
     ;; If the first loop item is on the same line as the `loop' itself then
     ;; use that as the baseline.  Otherwise advance by the default indent.
@@ -5239,6 +5314,11 @@ align the other subforms beneath it.  Otherwise, indent them
 (progn
   (add-hook 'makefile-mode-hook 'mdw-misc-mode-config t))
 
+;; nroff/troff.
+
+(progn
+  (add-hook 'nroff-mode-hook 'mdw-misc-mode-config t))
+
 ;;;--------------------------------------------------------------------------
 ;;; Text mode.
 
@@ -5486,6 +5566,11 @@ rather than baking the list into the function."
   "Don't make windows dedicated.  Seriously."
   (set-window-dedicated-p (or window (selected-window)) nil))
 
+(defadvice gud-find-expr
+    (around mdw-inhibit-read-only (&rest args) compile activate)
+  "Inhibit errors caused by my setting of `comint-prompt-read-only'."
+  (let ((inhibit-read-only t)) ad-do-it))
+
 ;;;--------------------------------------------------------------------------
 ;;; SQL stuff.
 
@@ -5619,21 +5704,21 @@ rather than baking the list into the function."
          (funcall func)
          (forward-line)))
     (let ((n (prefix-numeric-value arg)))
-      (cond ((minusp n)
+      (cond ((cl-minusp n)
             (unless (bolp)
               (beginning-of-line)
               (funcall func)
-              (incf n))
-            (while (minusp n)
+              (cl-incf n))
+            (while (cl-minusp n)
               (forward-line -1)
               (funcall func)
-              (incf n)))
+              (cl-incf n)))
            (t
             (beginning-of-line)
-            (while (plusp n)
+            (while (cl-plusp n)
               (funcall func)
               (forward-line)
-              (decf n)))))))
+              (cl-decf n)))))))
 
 (defun mdw-mpc-select-one ()
   (when (and (get-char-property (point) 'mpc-file)
index c384a4b..d5d77a3 100644 (file)
@@ -27,6 +27,8 @@
 ;; (autoload 'mdw-multiple-cursors-keymap "mdw-multiple-cursors.el"
 ;;   "A keymap for Magnar Sveen's awesome multiple-cursors." nil 'keymap)
 
+(require 'cl-lib)
+
 ;;;--------------------------------------------------------------------------
 ;;; Some machinery for omitting key prefixes.
 
@@ -79,7 +81,7 @@ forms) to appear at the start of the wrapper function."
 ;;;--------------------------------------------------------------------------
 ;;; The multiple-cursors key bindings.
 
-(eval-when (load eval)
+(cl-eval-when (load eval)
   (require 'multiple-cursors))
 
 (defvar mdw-multiple-cursors-keymap (make-sparse-keymap)