chiark / gitweb /
el/dot-emacs.el (mdw-fontify-pythonic): Numbers can't contain `_'.
[profile] / el / dot-emacs.el
index 5314fd90cbdd5e0f761814bd1cfb010e3dd52a8b..945333260ce7efc6e1f9bc5f519b32b7851d19b6 100644 (file)
@@ -200,13 +200,16 @@ (defun mdw-split-window-horizontally (&optional width)
         ((>= width 0) (+ width (mdw-horizontal-window-overhead)))
         ((< width 0) width))))
 
+(defun mdw-preferred-column-width ()
+  "Return the preferred column width."
+  (if (and window-system (mdw-emacs-version-p 22)) mdw-column-width
+    (1+ mdw-column-width)))
+
 (defun mdw-divvy-window (&optional width)
   "Split a wide window into appropriate widths."
   (interactive "P")
-  (setq width (cond (width (prefix-numeric-value width))
-                   ((and window-system (mdw-emacs-version-p 22))
-                    mdw-column-width)
-                   (t (1+ mdw-column-width))))
+  (setq width (if width (prefix-numeric-value width)
+               (mdw-preferred-column-width)))
   (let* ((win (selected-window))
         (sb-width (mdw-horizontal-window-overhead))
         (c (/ (+ (window-width) sb-width)
@@ -217,6 +220,17 @@ (defun mdw-divvy-window (&optional width)
       (other-window 1))
     (select-window win)))
 
+(defun mdw-set-frame-width (columns &optional width)
+  (interactive "nColumns: 
+P")
+  (setq width (if width (prefix-numeric-value width)
+               (mdw-preferred-column-width)))
+  (let ((sb-width (mdw-horizontal-window-overhead)))
+    (set-frame-width (selected-frame)
+                    (- (* columns (+ width sb-width))
+                       sb-width))
+    (mdw-divvy-window width)))
+
 ;; Don't raise windows unless I say so.
 
 (defvar mdw-inhibit-raise-frame nil
@@ -457,26 +471,52 @@     (define-key keymap key nil))
        (dolist (key replacements)
          (define-key keymap key binding))))))
 
-(eval-after-load "org-latex"
-  '(progn
-     (push '("strayman"
-            "\\documentclass{strayman}
+(defvar mdw-org-latex-defs
+  '(("strayman"
+     "\\documentclass{strayman}
 \\usepackage[utf8]{inputenc}
 \\usepackage[palatino, helvetica, courier, maths=cmr]{mdwfonts}
-\\usepackage[T1]{fontenc}
 \\usepackage{graphicx, tikz, mdwtab, mdwmath, crypto, longtable}"
-            ("\\section{%s}" . "\\section*{%s}")
-            ("\\subsection{%s}" . "\\subsection*{%s}")
-            ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-            ("\\paragraph{%s}" . "\\paragraph*{%s}")
-            ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
-          org-export-latex-classes)))
+     ("\\section{%s}" . "\\section*{%s}")
+     ("\\subsection{%s}" . "\\subsection*{%s}")
+     ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+     ("\\paragraph{%s}" . "\\paragraph*{%s}")
+     ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))
+
+(eval-after-load "org-latex"
+  '(setq org-export-latex-classes
+        (append mdw-org-latex-defs org-export-latex-classes)))
+
+(eval-after-load "ox-latex"
+  '(setq org-latex-classes (append mdw-org-latex-defs org-latex-classes)
+        org-latex-default-packages-alist '(("AUTO" "inputenc" t)
+                                           ("T1" "fontenc" t)
+                                           ("" "fixltx2e" nil)
+                                           ("" "graphicx" t)
+                                           ("" "longtable" nil)
+                                           ("" "float" nil)
+                                           ("" "wrapfig" nil)
+                                           ("" "rotating" nil)
+                                           ("normalem" "ulem" t)
+                                           ("" "textcomp" t)
+                                           ("" "marvosym" t)
+                                           ("" "wasysym" t)
+                                           ("" "amssymb" t)
+                                           ("" "hyperref" nil)
+                                           "\\tolerance=1000")))
+
 
 (setq org-export-docbook-xslt-proc-command "xsltproc --output %o %s %i"
       org-export-docbook-xsl-fo-proc-command "fop %i.safe %o"
       org-export-docbook-xslt-stylesheet
       "/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl")
 
+;; Glasses.
+
+(setq glasses-separator "-"
+      glasses-separate-parentheses-p nil
+      glasses-uncapitalize-p t)
+
 ;; Some hacks to do with window placement.
 
 (defun mdw-clobber-other-windows-showing-buffer (buffer-or-name)
@@ -717,7 +757,79 @@ (defun nntp-open-authinfo-kludge (buffer)
     proc))
 
 (eval-after-load "erc"
-    '(load "~/.ercrc.el"))
+  '(load "~/.ercrc.el"))
+
+;; Heavy-duty Gnus patching.
+
+(defun mdw-nnimap-transform-headers ()
+  (goto-char (point-min))
+  (let (article lines size string)
+    (block nil
+      (while (not (eobp))
+       (while (not (looking-at "\\* [0-9]+ FETCH"))
+         (delete-region (point) (progn (forward-line 1) (point)))
+         (when (eobp)
+           (return)))
+       (goto-char (match-end 0))
+       ;; Unfold quoted {number} strings.
+       (while (re-search-forward
+               "[^]][ (]{\\([0-9]+\\)}\r?\n"
+               (save-excursion
+                 ;; Start of the header section.
+                 (or (re-search-forward "] {[0-9]+}\r?\n" nil t)
+                     ;; Start of the next FETCH.
+                     (re-search-forward "\\* [0-9]+ FETCH" nil t)
+                     (point-max)))
+               t)
+         (setq size (string-to-number (match-string 1)))
+         (delete-region (+ (match-beginning 0) 2) (point))
+         (setq string (buffer-substring (point) (+ (point) size)))
+         (delete-region (point) (+ (point) size))
+         (insert (format "%S" (mm-subst-char-in-string ?\n ?\s string)))
+         ;; [mdw] missing from upstream
+         (backward-char 1))
+       (beginning-of-line)
+       (setq article
+             (and (re-search-forward "UID \\([0-9]+\\)" (line-end-position)
+                                     t)
+                  (match-string 1)))
+       (setq lines nil)
+       (setq size
+             (and (re-search-forward "RFC822.SIZE \\([0-9]+\\)"
+                                     (line-end-position)
+                                     t)
+                  (match-string 1)))
+       (beginning-of-line)
+       (when (search-forward "BODYSTRUCTURE" (line-end-position) t)
+         (let ((structure (ignore-errors
+                            (read (current-buffer)))))
+           (while (and (consp structure)
+                       (not (atom (car structure))))
+             (setq structure (car structure)))
+           (setq lines (if (and
+                            (stringp (car structure))
+                            (equal (upcase (nth 0 structure)) "MESSAGE")
+                            (equal (upcase (nth 1 structure)) "RFC822"))
+                           (nth 9 structure)
+                         (nth 7 structure)))))
+       (delete-region (line-beginning-position) (line-end-position))
+       (insert (format "211 %s Article retrieved." article))
+       (forward-line 1)
+       (when size
+         (insert (format "Chars: %s\n" size)))
+       (when lines
+         (insert (format "Lines: %s\n" lines)))
+       ;; Most servers have a blank line after the headers, but
+       ;; Davmail doesn't.
+       (unless (re-search-forward "^\r$\\|^)\r?$" nil t)
+         (goto-char (point-max)))
+       (delete-region (line-beginning-position) (line-end-position))
+       (insert ".")
+       (forward-line 1)))))
+
+(eval-after-load 'nnimap
+  '(defalias 'nnimap-transform-headers
+     (symbol-function 'mdw-nnimap-transform-headers)))
 
 ;;;--------------------------------------------------------------------------
 ;;; Utility functions.
@@ -851,6 +963,12 @@ (defadvice find-file (after mdw-autorevert activate)
 (defadvice write-file (after mdw-autorevert activate)
   (mdw-check-autorevert))
 
+(defun mdw-auto-revert ()
+  "Recheck all of the autorevertable buffers, and update VC modelines."
+  (interactive)
+  (let ((auto-revert-check-vc-info t))
+    (auto-revert-buffers)))
+
 ;;;--------------------------------------------------------------------------
 ;;; Dired hacking.
 
@@ -884,6 +1002,12 @@ (defun mdw-dired-run (args &optional syncp)
           (concat (shell-quote-argument (dired-get-filename nil))
                   " " args)))
 
+(defadvice dired-do-flagged-delete
+    (around mdw-delete-if-prefix-argument activate compile)
+  (let ((delete-by-moving-to-trash (and (null current-prefix-arg)
+                                       delete-by-moving-to-trash)))
+    ad-do-it))
+
 (eval-after-load "dired"
   '(define-key dired-mode-map "X" 'mdw-dired-run))
 
@@ -906,8 +1030,12 @@ (defun mdw-w3m-browse-url (url &optional new-session-p)
            (w3m-browse-url url new-session-p))
        (select-window window)))))
 
+(eval-after-load 'w3m
+  '(define-key w3m-mode-map [?\e ?\r] 'w3m-view-this-url-new-session))
+
 (defvar mdw-good-url-browsers
-  '(browse-url-mozilla
+  '(browse-url-chromium
+    browse-url-mozilla
     browse-url-generic
     (w3m . mdw-w3m-browse-url)
     browse-url-w3)
@@ -996,10 +1124,6 @@ (defvar mdw-hanging-indents
   "*Standard regexp matching parts of a hanging indent.
 This is mainly useful in `auto-fill-mode'.")
 
-;; Setting things up.
-
-(fset 'mdw-do-auto-fill (symbol-function 'do-auto-fill))
-
 ;; Utility functions.
 
 (defun mdw-maybe-tabify (s)
@@ -1017,11 +1141,11 @@ (defun mdw-examine-fill-prefixes (l)
 context and return the static fill prefix to use.  Point must be
 at the start of a line, and match data must be saved."
   (cond ((not l) nil)
-              ((looking-at (car (car l)))
-               (mdw-maybe-tabify (apply #'concat
-                                        (mapcar #'mdw-do-prefix-match
-                                                (cdr (car l))))))
-              (t (mdw-examine-fill-prefixes (cdr l)))))
+       ((looking-at (car (car l)))
+        (mdw-maybe-tabify (apply #'concat
+                                 (mapcar #'mdw-do-prefix-match
+                                         (cdr (car l))))))
+       (t (mdw-examine-fill-prefixes (cdr l)))))
 
 (defun mdw-maybe-car (p)
   "If P is a pair, return (car P), otherwise just return P."
@@ -1040,26 +1164,26 @@ (defun mdw-do-prefix-match (m)
   "Expand a dynamic prefix match element.
 See `mdw-fill-prefix' for details."
   (cond ((not (consp m)) (format "%s" m))
-          ((eq (car m) 'match) (match-string (mdw-maybe-car (cdr m))))
-          ((eq (car m) 'pad) (mdw-padding (match-string
-                                           (mdw-maybe-car (cdr m)))))
-          ((eq (car m) 'eval) (eval (cdr m)))
-          (t "")))
+       ((eq (car m) 'match) (match-string (mdw-maybe-car (cdr m))))
+       ((eq (car m) 'pad) (mdw-padding (match-string
+                                        (mdw-maybe-car (cdr m)))))
+       ((eq (car m) 'eval) (eval (cdr m)))
+       (t "")))
 
 (defun mdw-choose-dynamic-fill-prefix ()
   "Work out the dynamic fill prefix based on the variable `mdw-fill-prefix'."
   (cond ((and fill-prefix (not (string= fill-prefix ""))) fill-prefix)
-          ((not mdw-fill-prefix) fill-prefix)
-          (t (save-excursion
-               (beginning-of-line)
-               (save-match-data
-                 (mdw-examine-fill-prefixes mdw-fill-prefix))))))
+       ((not mdw-fill-prefix) fill-prefix)
+       (t (save-excursion
+            (beginning-of-line)
+            (save-match-data
+              (mdw-examine-fill-prefixes mdw-fill-prefix))))))
 
-(defun do-auto-fill ()
+(defadvice do-auto-fill (around mdw-dynamic-fill-prefix () activate compile)
   "Handle auto-filling, working out a dynamic fill prefix in the
 case where there isn't a sensible static one."
   (let ((fill-prefix (mdw-choose-dynamic-fill-prefix)))
-    (mdw-do-auto-fill)))
+    ad-do-it))
 
 (defun mdw-fill-paragraph ()
   "Fill paragraph, getting a dynamic fill prefix."
@@ -1073,9 +1197,9 @@ (defun mdw-standard-fill-prefix (rx &optional mat)
 design it doesn't cope with anything approximating a complicated
 case."
   (setq mdw-fill-prefix
-          `((,(concat rx mdw-hanging-indents)
-             (match . 1)
-             (pad . ,(or mat 2))))))
+       `((,(concat rx mdw-hanging-indents)
+          (match . 1)
+          (pad . ,(or mat 2))))))
 
 ;;;--------------------------------------------------------------------------
 ;;; Other common declarations.
@@ -1535,6 +1659,18 @@ (mdw-define-face magit-diff-removed
 (mdw-define-face magit-diff-removed-highlight
   (((min-colors 64)) :foreground "#eecccc" :background "#663333")
   (((class color)) :foreground "red" :background "blue"))
+(mdw-define-face magit-blame-heading
+  (((min-colors 64)) :foreground "white" :background "grey25"
+                    :weight normal :slant normal)
+  (((class color)) :foreground "white" :background "blue"
+                  :weight normal :slant normal))
+(mdw-define-face magit-blame-name
+  (t :inherit magit-blame-heading :slant italic))
+(mdw-define-face magit-blame-date
+  (((min-colors 64)) :inherit magit-blame-heading :foreground "grey60")
+  (((class color)) :inherit magit-blame-heading :foreground "cyan"))
+(mdw-define-face magit-blame-summary
+  (t :inherit magit-blame-heading :weight bold))
 
 (mdw-define-face dylan-header-background
   (((min-colors 64)) :background "NavyBlue")
@@ -1809,7 +1945,7 @@ (mdw-set-default-c-style '(c-mode c++-mode) 'mdw-c)
 
 (defvar mdw-c-comment-fill-prefix
   `((,(concat "\\([ \t]*/?\\)"
-             "\\(\*\\|//]\\)"
+             "\\(\\*\\|//\\)"
              "\\([ \t]*\\)"
              "\\([A-Za-z]+:[ \t]*\\)?"
              mdw-hanging-indents)
@@ -2065,20 +2201,33 @@ (mdw-set-default-c-style 'java-mode 'mdw-java)
 
 (defun mdw-fontify-java ()
 
+  ;; Fiddle with some syntax codes.
+  (modify-syntax-entry ?@ ".")
+  (modify-syntax-entry ?@ "." font-lock-syntax-table)
+
   ;; Other stuff.
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
   (let ((java-keywords
-        (mdw-regexps "abstract" "boolean" "break" "byte" "case" "catch"
-                     "char" "class" "const" "continue" "default" "do"
-                     "double" "else" "extends" "final" "finally" "float"
-                     "for" "goto" "if" "implements" "import" "instanceof"
-                     "int" "interface" "long" "native" "new" "package"
-                     "private" "protected" "public" "return" "short"
-                     "static" "switch" "synchronized" "throw" "throws"
-                     "transient" "try" "void" "volatile" "while"))
+        (mdw-regexps "abstract" "assert"
+                     "boolean" "break" "byte"
+                     "case" "catch" "char" "class" "const" "continue"
+                     "default" "do" "double"
+                     "else" "enum" "extends"
+                     "final" "finally" "float" "for"
+                     "goto"
+                     "if" "implements" "import" "instanceof" "int"
+                     "interface"
+                     "long"
+                     "native" "new"
+                     "package" "private" "protected" "public"
+                     "return"
+                     "short" "static" "strictfp" "switch" "synchronized"
+                     "throw" "throws" "transient" "try"
+                     "void" "volatile"
+                     "while"))
 
        (java-constants
         (mdw-regexps "false" "null" "super" "this" "true")))
@@ -2216,10 +2365,6 @@ (defun mdw-fontify-scala ()
                         "[lLfFdD]?")
                 '(0 mdw-number-face))
 
-          ;; Identifiers with trailing operators.
-          (list (concat "_\\(" punctuation "\\)+")
-                '(0 mdw-trivial-face))
-
           ;; And everything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                 '(0 mdw-punct-face)))
@@ -2514,15 +2659,15 @@ (defun mdw-fontify-rust ()
                      "const" "continue" "create"
                      "do"
                      "else" "enum" "extern"
-                     "false" "final" "fn" "for"
+                     "final" "fn" "for"
                      "if" "impl" "in"
                      "let" "loop"
                      "macro" "match" "mod" "move" "mut"
                      "offsetof" "override"
-                     "priv" "pub" "pure"
+                     "priv" "proc" "pub" "pure"
                      "ref" "return"
-                     "self" "sizeof" "static" "struct" "super"
-                     "true" "trait" "type" "typeof"
+                     "sizeof" "static" "struct" "super"
+                     "trait" "type" "typeof"
                      "unsafe" "unsized" "use"
                      "virtual"
                      "where" "while"
@@ -2533,7 +2678,8 @@ (defun mdw-fontify-rust ()
                      "f32" "f64"
                      "i8" "i16" "i32" "i64" "isize"
                      "u8" "u16" "u32" "u64" "usize"
-                     "char" "str")))
+                     "char" "str"
+                     "self" "Self")))
     (setq font-lock-keywords
          (list
 
@@ -2719,9 +2865,9 @@ (defun mdw-fontify-pythonic (keywords)
               '(0 font-lock-keyword-face))
 
         ;; At least numbers are simpler than C.
-        (list (concat "\\_<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
-                      "\\_<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
-                      "\\([eE]\\([-+]\\|\\)[0-9_]+\\|[lL]\\|\\)")
+        (list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
+                      "\\_<[0-9][0-9]*\\(\\.[0-9]*\\|\\)"
+                      "\\([eE]\\([-+]\\|\\)[0-9]+\\|[lL]\\|\\)")
               '(0 mdw-number-face))
 
         ;; And anything else is punctuation.
@@ -2861,13 +3007,17 @@ (defun mdw-fontify-asm ()
   (modify-syntax-entry ?. "w")
   (modify-syntax-entry ?\n ">")
   (setf fill-prefix nil)
+  (modify-syntax-entry ?. "_")
+  (modify-syntax-entry ?* ". 23")
+  (modify-syntax-entry ?/ ". 124b")
+  (modify-syntax-entry ?\n "> b")
   (local-set-key ";" 'self-insert-command)
   (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)"))
 
 (defun mdw-asm-set-comment ()
   (modify-syntax-entry ?; "."
                       )
-  (modify-syntax-entry asm-comment-char "<b")
+  (modify-syntax-entry asm-comment-char "< b")
   (setq comment-start (string asm-comment-char ? )))
 (add-hook 'asm-mode-local-variables-hook 'mdw-asm-set-comment)
 (put 'asm-comment-char 'safe-local-variable 'characterp)
@@ -3334,6 +3484,8 @@ (defun mdw-fontify-tex ()
         (list "[$^_{}#&]"
               '(0 mdw-punct-face)))))
 
+(setq TeX-install-font-lock 'tex-font-setup)
+
 (eval-after-load 'font-latex
   '(defun font-latex-jit-lock-force-redisplay (buf start end)
      "Compatibility for Emacsen not offering `jit-lock-force-redisplay'."
@@ -3353,6 +3505,9 @@ (eval-after-load 'font-latex
           (unless modified
             (restore-buffer-modified-p nil)))))))
 
+(setq LaTeX-syntactic-comments nil
+      LaTeX-fill-break-at-separators '(\\\[))
+
 ;;;--------------------------------------------------------------------------
 ;;; SGML hacking.
 
@@ -3888,7 +4043,7 @@ (defun ssh (host)
   (ansi-term (list "ssh" host) (format "ssh@%s" host)))
 
 (defvar git-grep-command
-  "env PAGER=cat git grep --no-color -nH -e "
+  "env GIT_PAGER=cat git grep --no-color -nH -e "
   "*The default command for \\[git-grep].")
 
 (defvar git-grep-history nil)
@@ -3898,7 +4053,8 @@ (defun git-grep (command-args)
   (interactive
    (list (read-shell-command "Run git grep (like this): "
                             git-grep-command 'git-grep-history)))
-  (grep command-args))
+  (let ((grep-use-null-device nil))
+    (grep command-args)))
 
 ;;;--------------------------------------------------------------------------
 ;;; Magit configuration.
@@ -3915,6 +4071,7 @@ (eval-after-load "magit"
          (magit-wip-after-apply-mode 1)
          (magit-wip-before-change-mode 1)
          (add-to-list 'magit-no-confirm 'safe-with-wip)
+         (add-to-list 'magit-no-confirm 'trash)
          (push '(:eval (if (or magit-wip-after-save-local-mode
                                magit-wip-after-apply-mode
                                magit-wip-before-change-mode)
@@ -3933,6 +4090,13 @@ (defadvice magit-wip-commit-buffer-file
     (around mdw-just-this-buffer activate compile)
   (let ((magit-save-repository-buffers nil)) ad-do-it))
 
+(defadvice magit-discard
+    (around mdw-delete-if-prefix-argument activate compile)
+  (let ((magit-delete-by-moving-to-trash
+        (and (null current-prefix-arg)
+             magit-delete-by-moving-to-trash)))
+    ad-do-it))
+
 (setq magit-repolist-columns
       '(("Name" 16 magit-repolist-column-ident nil)
        ("Version" 18 magit-repolist-column-version nil)
@@ -3966,6 +4130,26 @@ (defun mdw-repolist-column-unpushed-to-upstream (_id)
           (propertize (number-to-string n) 'face
                       (if (> n 0) 'bold 'shadow))))))
 
+(defun mdw-try-smerge ()
+  (save-excursion
+    (goto-char (point-min))
+    (when (re-search-forward "^<<<<<<< " nil t)
+      (smerge-mode 1))))
+(add-hook 'find-file-hook 'mdw-try-smerge t)
+
+;;;--------------------------------------------------------------------------
+;;; GUD, and especially GDB.
+
+;; Inhibit window dedication.  I mean, seriously, wtf?
+(defadvice gdb-display-buffer (after mdw-undedicated (buf) compile activate)
+  "Don't make windows dedicated.  Seriously."
+  (set-window-dedicated-p ad-return-value nil))
+(defadvice gdb-set-window-buffer
+    (after mdw-undedicated (name &optional ignore-dedicated window)
+     compile activate)
+  "Don't make windows dedicated.  Seriously."
+  (set-window-dedicated-p (or window (selected-window)) nil))
+
 ;;;--------------------------------------------------------------------------
 ;;; MPC configuration.