;;;--------------------------------------------------------------------------
;;; Check command-line.
+(defun mdw-check-command-line-switch (switch)
+ (let ((probe nil) (next command-line-args) (found nil))
+ (while next
+ (cond ((string= (car next) switch)
+ (setq found t)
+ (if probe (rplacd probe (cdr next))
+ (setq command-line-args (cdr next))))
+ (t
+ (setq probe next)))
+ (setq next (cdr next)))
+ found))
+
(defvar mdw-fast-startup nil
"Whether .emacs should optimize for rapid startup.
This may be at the expense of cool features.")
-(let ((probe nil) (next command-line-args))
- (while next
- (cond ((string= (car next) "--mdw-fast-startup")
- (setq mdw-fast-startup t)
- (if probe
- (rplacd probe (cdr next))
- (setq command-line-args (cdr next))))
- (t
- (setq probe next)))
- (setq next (cdr next))))
+(setq mdw-fast-startup
+ (mdw-check-command-line-switch "--mdw-fast-startup"))
+
+(defvar mdw-splashy-startup nil
+ "Whether to show a splash screen and related frippery.")
+(setq mdw-splashy-startup
+ (mdw-check-command-line-switch "--mdw-splashy-startup"))
;;;--------------------------------------------------------------------------
;;; Some general utilities.
(set-frame-parameter frame 'menu-bar-lines 0)
(set-frame-parameter frame 'menu-bar-lines old)))
+;; Page motion.
+
+(defun mdw-fixup-page-position ()
+ (unless (eq (char-before (point)) ?\f)
+ (forward-line 0)))
+
+(defadvice backward-page (after mdw-fixup compile activate)
+ (mdw-fixup-page-position))
+(defadvice forward-page (after mdw-fixup compile activate)
+ (mdw-fixup-page-position))
+
;; Splitting windows.
(unless (fboundp 'scroll-bar-columns)
((>= 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)
(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)))
+
+(defvar mdw-frame-width-fudge
+ (cond ((<= emacs-major-version 20) 1)
+ ((= emacs-major-version 26) 3)
+ (t 0))
+ "The number of extra columns to add to the desired frame width.
+
+This is sadly necessary because Emacs 26 is broken in this regard.")
+
;; Don't raise windows unless I say so.
(defvar mdw-inhibit-raise-frame nil
(mdw-advise-to-inhibit-raise-frame select-frame-set-input-focus)
(mdw-advise-to-inhibit-raise-frame appt-disp-window)
+(mdw-advise-to-inhibit-raise-frame mouse-select-window)
;; Bug fix for markdown-mode, which breaks point positioning during
;; `query-replace'.
(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)))
+ (year (- (calendar-extract-year date) 1900))
+ (month (1- (calendar-extract-month date)))
+ (day (1- (calendar-extract-day date)))
(julian (+ (aref day-count month) day))
(dyear (+ year 3066)))
(if (and (= month 1) (= day 28))
(let ((mdw-diary-for-org-mode-p t))
ad-do-it))
+(defvar diary-time-regexp nil)
+
(defadvice diary-add-to-list (before mdw-trim-leading-space compile activate)
"Trim leading space from the diary entry string."
(save-match-data
(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)
(let ((home-frame (selected-frame))
(buffer (get-buffer buffer-or-name))
(safe-buffer (get-buffer "*scratch*")))
- (mapc (lambda (frame)
- (or (eq frame home-frame)
- (mapc (lambda (window)
- (and (eq (window-buffer window) buffer)
- (set-window-buffer window safe-buffer)))
- (window-list frame))))
- (frame-list))))
+ (dolist (frame (frame-list))
+ (unless (eq frame home-frame)
+ (dolist (window (window-list frame))
+ (when (eq (window-buffer window) buffer)
+ (set-window-buffer window safe-buffer)))))))
(defvar mdw-inhibit-walk-windows nil
"If non-nil, then `walk-windows' does nothing.
This is used by advice on `switch-to-buffer-other-frame' to inhibit finding
buffers in random frames.")
+(setq display-buffer--other-frame-action
+ '((display-buffer-reuse-window display-buffer-pop-up-frame)
+ (reusable-frames . nil)
+ (inhibit-same-window . t)))
+
(defadvice walk-windows (around mdw-inhibit activate)
"If `mdw-inhibit-walk-windows' is non-nil, then do nothing."
(and (not mdw-inhibit-walk-windows)
(ad-set-arg 2 nil))
;;;--------------------------------------------------------------------------
+;;; Improved compilation machinery.
+
+;; Uprated version of M-x compile.
+
+(setq compile-command
+ (let ((ncpu (with-temp-buffer
+ (insert-file-contents "/proc/cpuinfo")
+ (buffer-string)
+ (count-matches "^processor\\s-*:"))))
+ (format "make -j%d -k" (* 2 ncpu))))
+
+(defun mdw-compilation-buffer-name (mode)
+ (concat "*" (downcase mode) ": "
+ (abbreviate-file-name default-directory) "*"))
+(setq compilation-buffer-name-function 'mdw-compilation-buffer-name)
+
+(eval-after-load "compile"
+ '(progn
+ (define-key compilation-shell-minor-mode-map "\C-c\M-g" 'recompile)))
+
+(defadvice compile (around hack-environment compile activate)
+ "Hack the environment inherited by inferiors in the compilation."
+ (let ((process-environment (copy-tree process-environment)))
+ (setenv "LD_PRELOAD" nil)
+ ad-do-it))
+
+(defun mdw-compile (command &optional directory comint)
+ "Initiate a compilation COMMAND, maybe in a different DIRECTORY.
+The DIRECTORY may be nil to not change. If COMINT is t, then
+start an interactive compilation.
+
+Interactively, prompt for the command if the variable
+`compilation-read-command' is non-nil, or if requested through
+the prefix argument. Prompt for the directory, and run
+interactively, if requested through the prefix.
+
+Use a prefix of 4, 6, 12, or 14, or type C-u between one and three times, to
+force prompting for a directory.
+
+Use a prefix of 2, 6, 10, or 14, or type C-u three times, to force
+prompting for the command.
+
+Use a prefix of 8, 10, 12, or 14, or type C-u twice or three times,
+to force interactive compilation."
+ (interactive
+ (let* ((prefix (prefix-numeric-value current-prefix-arg))
+ (command (eval compile-command))
+ (dir (and (plusp (logand prefix #x54))
+ (read-directory-name "Compile in directory: "))))
+ (list (if (or compilation-read-command
+ (plusp (logand prefix #x42)))
+ (compilation-read-command command)
+ command)
+ dir
+ (plusp (logand prefix #x58)))))
+ (let ((default-directory (or directory default-directory)))
+ (compile command comint)))
+
+;; Flymake support.
+
+(defun mdw-find-build-dir (build-file)
+ (catch 'found
+ (let* ((src-dir (file-name-as-directory (expand-file-name ".")))
+ (dir src-dir))
+ (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
+ (when (file-exists-p (concat sub build-file))
+ (throw 'found sub))
+ (when (string= sub dir) (throw 'give-up nil))
+ (setq sub (file-name-directory (directory-file-name sub))))))
+ (when (string= dir
+ (setq dir (file-name-directory
+ (directory-file-name dir))))
+ (throw 'found nil))))))
+
+(defun mdw-flymake-make-init ()
+ (let ((build-dir (mdw-find-build-dir "Makefile")))
+ (and build-dir
+ (let ((tmp-src (flymake-init-create-temp-buffer-copy
+ #'flymake-create-temp-inplace)))
+ (flymake-get-syntax-check-program-args
+ tmp-src build-dir t t
+ #'flymake-get-make-cmdline)))))
+
+(setq flymake-allowed-file-name-masks
+ '(("\\.\\(?:[cC]\\|cc\\|cpp\\|cxx\\|c\\+\\+\\)\\'"
+ mdw-flymake-make-init)
+ ("\\.\\(?:[hH]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'"
+ mdw-flymake-master-make-init)
+ ("\\.p[lm]" flymake-perl-init)))
+
+(setq flymake-mode-map
+ (let ((map (if (boundp 'flymake-mode-map)
+ flymake-mode-map
+ (make-sparse-keymap))))
+ (define-key map [?\C-c ?\C-f ?\C-p] 'flymake-goto-prev-error)
+ (define-key map [?\C-c ?\C-f ?\C-n] 'flymake-goto-next-error)
+ (define-key map [?\C-c ?\C-f ?\C-c] 'flymake-compile)
+ (define-key map [?\C-c ?\C-f ?\C-k] 'flymake-stop-all-syntax-checks)
+ (define-key map [?\C-c ?\C-f ?\C-e] 'flymake-popup-current-error-menu)
+ map))
+
+;;;--------------------------------------------------------------------------
;;; Mail and news hacking.
(define-derived-mode mdwmail-mode mail-mode "[mdw] mail"
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" (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)))
+
+(defadvice gnus-other-frame (around mdw-hack-frame-width compile activate)
+ "Always arrange for mail/news frames to be 80 columns wide."
+ (let ((default-frame-alist (cons `(width . ,(+ 80 mdw-frame-width-fudge))
+ (cl-delete 'width default-frame-alist
+ :key #'car))))
+ ad-do-it))
+
+;; Preferred programs.
+
+(setq mailcap-user-mime-data
+ '(((type . "application/pdf") (viewer . "mupdf %s"))))
;;;--------------------------------------------------------------------------
;;; Utility functions.
(erase-buffer)
(shell-command "date +%Y-%m-%d" t)
(goto-char (mark))
- (delete-backward-char 1)
+ (delete-char -1)
(buffer-string))
(kill-buffer buffer))))))
(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)))
+
+(defun comint-send-and-indent ()
+ (interactive)
+ (comint-send-input)
+ (and mdw-auto-indent
+ (indent-for-tab-command)))
+
+(defadvice comint-line-beginning-position
+ (around mdw-calculate-it-properly () activate compile)
+ "Calculate the actual line start for multi-line input."
+ (if (or comint-use-prompt-regexp
+ (eq (field-at-pos (point)) 'output))
+ ad-do-it
+ (setq ad-return-value
+ (constrain-to-field (line-beginning-position) (point)))))
+
;;;--------------------------------------------------------------------------
;;; Dired hacking.
(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))
(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-generic
"*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)
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."
"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."
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.
(and mdw-auto-indent
(cond ((eq major-mode 'lisp-mode)
(local-set-key "\C-m" 'mdw-indent-newline-and-indent))
- ((or (eq major-mode 'slime-repl-mode)
- (eq major-mode 'asm-mode))
+ ((derived-mode-p 'slime-repl-mode 'asm-mode 'comint-mode)
nil)
(t
(local-set-key "\C-m" 'newline-and-indent))))
(add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
;;;--------------------------------------------------------------------------
-;;; Where is point?
-
-(defvar mdw-point-overlay
- (let ((ov (make-overlay 0 0))
- (s "."))
- (overlay-put ov 'priority 2)
- (put-text-property 0 1 'display '(left-fringe vertical-bar) s)
- (overlay-put ov 'before-string s)
- (delete-overlay ov)
- ov)
- "An overlay used for showing where point is in the selected window.")
-
-(defun mdw-remove-point-overlay ()
- "Remove the current-point overlay."
- (delete-overlay mdw-point-overlay))
-
-(defun mdw-update-point-overlay ()
- "Mark the current point position with an overlay."
- (if (not mdw-point-overlay-mode)
- (mdw-remove-point-overlay)
- (overlay-put mdw-point-overlay 'window (selected-window))
- (if (bolp)
- (move-overlay mdw-point-overlay
- (point) (1+ (point)) (current-buffer))
- (move-overlay mdw-point-overlay
- (1- (point)) (point) (current-buffer)))))
-
-(defvar mdw-point-overlay-buffers nil
- "List of buffers using `mdw-point-overlay-mode'.")
-
-(define-minor-mode mdw-point-overlay-mode
- "Indicate current line with an overlay."
- :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))
- (if mdw-point-overlay-mode
- (setq mdw-point-overlay-buffers
- (cons buffer mdw-point-overlay-buffers))))
- (cond (mdw-point-overlay-buffers
- (add-hook 'pre-command-hook 'mdw-remove-point-overlay)
- (add-hook 'post-command-hook 'mdw-update-point-overlay))
- (t
- (mdw-remove-point-overlay)
- (remove-hook 'pre-command-hook 'mdw-remove-point-overlay)
- (remove-hook 'post-command-hook 'mdw-update-point-overlay))))
-
-(define-globalized-minor-mode mdw-global-point-overlay-mode
- mdw-point-overlay-mode
- (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
-
-;;;--------------------------------------------------------------------------
;;; Fullscreen-ness.
(defvar mdw-full-screen-parameters
(((type w32)) :family "courier new" :height 85)
(((type x)) :family "6x13" :foundry "trad" :height 130)
(t :foreground "white" :background "black"))
-(if (mdw-emacs-version-p 23)
- (mdw-define-face variable-pitch
- (((type x)) :family "sans" :height 100))
- (mdw-define-face variable-pitch
- (((type x)) :family "helvetica" :height 90)))
+(mdw-define-face fixed-pitch-serif
+ (((type w32)) :family "courier new" :height 85 :weight bold)
+ (((type x)) :family "6x13" :foundry "trad" :height 130 :weight bold)
+ (t :foreground "white" :background "black" :weight bold))
+(mdw-define-face variable-pitch
+ (((type x)) :family "helvetica" :height 120))
(mdw-define-face region
- (((type tty) (class color)) :background "blue")
- (((type tty) (class mono)) :inverse-video t)
- (t :background "grey30"))
+ (((min-colors 64)) :background "grey30")
+ (((class color)) :background "blue")
+ (t :inverse-video t))
(mdw-define-face match
- (((type tty) (class color)) :background "blue")
- (((type tty) (class mono)) :inverse-video t)
- (t :background "blue"))
+ (((class color)) :background "blue")
+ (t :inverse-video t))
(mdw-define-face mc/cursor-face
- (((type tty) (class mono)) :inverse-video t)
- (t :background "red"))
+ (((class color)) :background "red")
+ (t :inverse-video t))
(mdw-define-face minibuffer-prompt
(t :weight bold))
(mdw-define-face mode-line
(mdw-define-face fringe
(t :foreground "yellow"))
(mdw-define-face show-paren-match
- (((class color)) :background "darkgreen")
+ (((min-colors 64)) :background "darkgreen")
+ (((class color)) :background "green")
(t :underline t))
(mdw-define-face show-paren-mismatch
(((class color)) :background "red")
(t :inverse-video t))
(mdw-define-face highlight
- (((type x) (class color)) :background "DarkSeaGreen4")
- (((type tty) (class color)) :background "cyan")
+ (((min-colors 64)) :background "DarkSeaGreen4")
+ (((class color)) :background "cyan")
(t :inverse-video t))
(mdw-define-face holiday-face
(mdw-define-face comint-highlight-input
(t nil))
+(mdw-define-face Man-underline
+ (((type tty)) :underline t)
+ (t :slant italic))
+
(mdw-define-face ido-subdir
(t :foreground "cyan" :weight bold))
(((class color)) :background "darkred")
(t :inverse-video t))
(mdw-define-face mdw-punct-face
- (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+ (((min-colors 64)) :foreground "burlywood2")
+ (((class color)) :foreground "yellow"))
(mdw-define-face mdw-number-face
(t :foreground "yellow"))
(mdw-define-face mdw-trivial-face)
(mdw-define-face font-lock-variable-name-face
(t :slant italic))
(mdw-define-face font-lock-comment-delimiter-face
- (((class mono)) :weight bold)
- (((type tty) (class color)) :foreground "green")
- (t :slant italic :foreground "SeaGreen1"))
+ (((min-colors 64)) :slant italic :foreground "SeaGreen1")
+ (((class color)) :foreground "green")
+ (t :weight bold))
(mdw-define-face font-lock-comment-face
- (((class mono)) :weight bold)
- (((type tty) (class color)) :foreground "green")
- (t :slant italic :foreground "SeaGreen1"))
+ (((min-colors 64)) :slant italic :foreground "SeaGreen1")
+ (((class color)) :foreground "green")
+ (t :weight bold))
(mdw-define-face font-lock-string-face
- (((class mono)) :weight bold)
- (((class color)) :foreground "SkyBlue1"))
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan")
+ (t :weight bold))
(mdw-define-face message-separator
(t :background "red" :foreground "white" :weight bold))
(mdw-define-face message-cited-text
(default :slant italic)
- (((type tty)) :foreground "cyan") (t :foreground "SkyBlue1"))
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face message-header-cc
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-newsgroups
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-subject
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-to
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-xheader
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-other
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-name
(default :weight bold)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face which-func
(t nil))
(mdw-define-face gnus-header-name
(default :weight bold)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-header-subject
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-header-from
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-header-to
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-header-content
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-cite-1
- (((type tty)) :foreground "cyan") (t :foreground "SkyBlue1"))
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face gnus-cite-2
- (((type tty)) :foreground "blue") (t :foreground "RoyalBlue2"))
+ (((min-colors 64)) :foreground "RoyalBlue2")
+ (((class color)) :foreground "blue"))
(mdw-define-face gnus-cite-3
- (((type tty)) :foreground "magenta") (t :foreground "MediumOrchid"))
+ (((min-colors 64)) :foreground "MediumOrchid")
+ (((class color)) :foreground "magenta"))
(mdw-define-face gnus-cite-4
- (((type tty)) :foreground "red") (t :foreground "firebrick2"))
+ (((min-colors 64)) :foreground "firebrick2")
+ (((class color)) :foreground "red"))
(mdw-define-face gnus-cite-5
- (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+ (((min-colors 64)) :foreground "burlywood2")
+ (((class color)) :foreground "yellow"))
(mdw-define-face gnus-cite-6
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-cite-7
- (((type tty)) :foreground "cyan") (t :foreground "SlateBlue1"))
+ (((min-colors 64)) :foreground "SlateBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face gnus-cite-8
- (((type tty)) :foreground "blue") (t :foreground "RoyalBlue2"))
+ (((min-colors 64)) :foreground "RoyalBlue2")
+ (((class color)) :foreground "blue"))
(mdw-define-face gnus-cite-9
- (((type tty)) :foreground "magenta") (t :foreground "purple2"))
+ (((min-colors 64)) :foreground "purple2")
+ (((class color)) :foreground "magenta"))
(mdw-define-face gnus-cite-10
- (((type tty)) :foreground "red") (t :foreground "DarkOrange2"))
+ (((min-colors 64)) :foreground "DarkOrange2")
+ (((class color)) :foreground "red"))
(mdw-define-face gnus-cite-11
(t :foreground "grey"))
(mdw-define-face diff-file-header
(t :weight bold))
(mdw-define-face diff-hunk-header
- (t :foreground "SkyBlue1"))
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face diff-function
- (t :foreground "SkyBlue1" :weight bold))
+ (default :weight bold)
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face diff-header
- (t :background "grey10"))
+ (((min-colors 64)) :background "grey10"))
(mdw-define-face diff-added
- (t :foreground "green"))
+ (((class color)) :foreground "green"))
(mdw-define-face diff-removed
- (t :foreground "red"))
+ (((class color)) :foreground "red"))
(mdw-define-face diff-context
(t nil))
(mdw-define-face diff-refine-change
- (((class color) (type x)) :background "RoyalBlue4")
+ (((min-colors 64)) :background "RoyalBlue4")
(t :underline t))
(mdw-define-face diff-refine-removed
- (((class color) (type x)) :background "#500")
+ (((min-colors 64)) :background "#500")
(t :underline t))
(mdw-define-face diff-refine-added
- (((class color) (type x)) :background "#050")
+ (((min-colors 64)) :background "#050")
(t :underline t))
(setq ediff-force-faces t)
(mdw-define-face ediff-current-diff-A
- (((class color) (type x)) :background "darkred")
- (((class color) (type tty)) :background "red")
+ (((min-colors 64)) :background "darkred")
+ (((class color)) :background "red")
(t :inverse-video t))
(mdw-define-face ediff-fine-diff-A
- (((class color) (type x)) :background "red3")
- (((class color) (type tty)) :inverse-video t)
+ (((min-colors 64)) :background "red3")
+ (((class color)) :inverse-video t)
(t :inverse-video nil))
(mdw-define-face ediff-even-diff-A
- (((class color) (type x)) :background "#300"))
+ (((min-colors 64)) :background "#300"))
(mdw-define-face ediff-odd-diff-A
- (((class color) (type x)) :background "#300"))
+ (((min-colors 64)) :background "#300"))
(mdw-define-face ediff-current-diff-B
- (((class color) (type x)) :background "darkgreen")
- (((class color) (type tty)) :background "magenta")
+ (((min-colors 64)) :background "darkgreen")
+ (((class color)) :background "magenta")
(t :inverse-video t))
(mdw-define-face ediff-fine-diff-B
- (((class color) (type x)) :background "green4")
- (((class color) (type tty)) :inverse-video t)
+ (((min-colors 64)) :background "green4")
+ (((class color)) :inverse-video t)
(t :inverse-video nil))
(mdw-define-face ediff-even-diff-B
- (((class color) (type x)) :background "#020"))
+ (((min-colors 64)) :background "#020"))
(mdw-define-face ediff-odd-diff-B
- (((class color) (type x)) :background "#020"))
+ (((min-colors 64)) :background "#020"))
(mdw-define-face ediff-current-diff-C
- (((class color) (type x)) :background "darkblue")
- (((class color) (type tty)) :background "blue")
+ (((min-colors 64)) :background "darkblue")
+ (((class color)) :background "blue")
(t :inverse-video t))
(mdw-define-face ediff-fine-diff-C
- (((class color) (type x)) :background "blue1")
- (((class color) (type tty)) :inverse-video t)
+ (((min-colors 64)) :background "blue1")
+ (((class color)) :inverse-video t)
(t :inverse-video nil))
(mdw-define-face ediff-even-diff-C
- (((class color) (type x)) :background "#004"))
+ (((min-colors 64)) :background "#004"))
(mdw-define-face ediff-odd-diff-C
- (((class color) (type x)) :background "#004"))
+ (((min-colors 64)) :background "#004"))
(mdw-define-face ediff-current-diff-Ancestor
- (((class color) (type x)) :background "#630")
- (((class color) (type tty)) :background "blue")
+ (((min-colors 64)) :background "#630")
+ (((class color)) :background "blue")
(t :inverse-video t))
(mdw-define-face ediff-even-diff-Ancestor
- (((class color) (type x)) :background "#320"))
+ (((min-colors 64)) :background "#320"))
(mdw-define-face ediff-odd-diff-Ancestor
- (((class color) (type x)) :background "#320"))
+ (((min-colors 64)) :background "#320"))
(mdw-define-face magit-hash
- (((class color) (type x)) :foreground "grey40")
- (((class color) (type tty)) :foreground "blue"))
+ (((min-colors 64)) :foreground "grey40")
+ (((class color)) :foreground "blue"))
(mdw-define-face magit-diff-hunk-heading
- (((class color) (type x)) :foreground "grey70" :background "grey25")
- (((class color) (type tty)) :foreground "yellow"))
+ (((min-colors 64)) :foreground "grey70" :background "grey25")
+ (((class color)) :foreground "yellow"))
(mdw-define-face magit-diff-hunk-heading-highlight
- (((class color) (type x)) :foreground "grey70" :background "grey35")
- (((class color) (type tty)) :foreground "yellow" :background "blue"))
+ (((min-colors 64)) :foreground "grey70" :background "grey35")
+ (((class color)) :foreground "yellow" :background "blue"))
(mdw-define-face magit-diff-added
- (((class color) (type x)) :foreground "#ddffdd" :background "#335533")
- (((class color) (type tty)) :foreground "green"))
+ (((min-colors 64)) :foreground "#ddffdd" :background "#335533")
+ (((class color)) :foreground "green"))
(mdw-define-face magit-diff-added-highlight
- (((class color) (type x)) :foreground "#cceecc" :background "#336633")
- (((class color) (type tty)) :foreground "green" :background "blue"))
+ (((min-colors 64)) :foreground "#cceecc" :background "#336633")
+ (((class color)) :foreground "green" :background "blue"))
(mdw-define-face magit-diff-removed
- (((class color) (type x)) :foreground "#ffdddd" :background "#553333")
- (((class color) (type tty)) :foreground "red"))
+ (((min-colors 64)) :foreground "#ffdddd" :background "#553333")
+ (((class color)) :foreground "red"))
(mdw-define-face magit-diff-removed-highlight
- (((class color) (type x)) :foreground "#eecccc" :background "#663333")
- (((class color) (type tty)) :foreground "red" :background "blue"))
+ (((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
- (((class color) (type x)) :background "NavyBlue")
- (t :background "blue"))
+ (((min-colors 64)) :background "NavyBlue")
+ (((class color)) :background "blue"))
(mdw-define-face erc-input-face
(t :foreground "red"))
(set-display-table-slot standard-display-table 5 bar))
;;;--------------------------------------------------------------------------
+;;; Where is point?
+
+(mdw-define-face mdw-point-overlay-face
+ (((type graphic)))
+ (((min-colors 64)) :background "darkblue")
+ (((class color)) :background "blue")
+ (((type tty) (class mono)) :inverse-video t))
+
+(defvar mdw-point-overlay-fringe-display '(vertical-bar . vertical-bar))
+
+(defun mdw-configure-point-overlay ()
+ (let ((ov (make-overlay 0 0)))
+ (overlay-put ov 'priority 0)
+ (let* ((fringe (or mdw-point-overlay-fringe-display (cons nil nil)))
+ (left (car fringe)) (right (cdr fringe))
+ (s ""))
+ (when left
+ (let ((ss "."))
+ (put-text-property 0 1 'display `(left-fringe ,left) ss)
+ (setq s (concat s ss))))
+ (when right
+ (let ((ss "."))
+ (put-text-property 0 1 'display `(right-fringe ,right) ss)
+ (setq s (concat s ss))))
+ (when (or left right)
+ (overlay-put ov 'before-string s)))
+ (overlay-put ov 'face 'mdw-point-overlay-face)
+ (delete-overlay ov)
+ ov))
+
+(defvar mdw-point-overlay (mdw-configure-point-overlay)
+ "An overlay used for showing where point is in the selected window.")
+(defun mdw-reconfigure-point-overlay ()
+ (interactive)
+ (setq mdw-point-overlay (mdw-configure-point-overlay)))
+
+(defun mdw-remove-point-overlay ()
+ "Remove the current-point overlay."
+ (delete-overlay mdw-point-overlay))
+
+(defun mdw-update-point-overlay ()
+ "Mark the current point position with an overlay."
+ (if (not mdw-point-overlay-mode)
+ (mdw-remove-point-overlay)
+ (overlay-put mdw-point-overlay 'window (selected-window))
+ (move-overlay mdw-point-overlay
+ (line-beginning-position)
+ (+ (line-end-position) 1))))
+
+(defvar mdw-point-overlay-buffers nil
+ "List of buffers using `mdw-point-overlay-mode'.")
+
+(define-minor-mode mdw-point-overlay-mode
+ "Indicate current line with an overlay."
+ :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))
+ (if mdw-point-overlay-mode
+ (setq mdw-point-overlay-buffers
+ (cons buffer mdw-point-overlay-buffers))))
+ (cond (mdw-point-overlay-buffers
+ (add-hook 'pre-command-hook 'mdw-remove-point-overlay)
+ (add-hook 'post-command-hook 'mdw-update-point-overlay))
+ (t
+ (mdw-remove-point-overlay)
+ (remove-hook 'pre-command-hook 'mdw-remove-point-overlay)
+ (remove-hook 'post-command-hook 'mdw-update-point-overlay))))
+
+(define-globalized-minor-mode mdw-global-point-overlay-mode
+ mdw-point-overlay-mode
+ (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
+
+(defvar mdw-terminal-title-alist nil)
+(defun mdw-update-terminal-title ()
+ (when (let ((term (frame-parameter nil 'tty-type)))
+ (and term (string-match "^xterm" term)))
+ (let* ((tty (frame-parameter nil 'tty))
+ (old (assoc tty mdw-terminal-title-alist))
+ (new (format-mode-line frame-title-format)))
+ (unless (and old (equal (cdr old) new))
+ (if old (rplacd old new)
+ (setq mdw-terminal-title-alist
+ (cons (cons tty new) mdw-terminal-title-alist)))
+ (send-string-to-terminal (concat "\e]2;" new "\e\\"))))))
+
+(add-hook 'post-command-hook 'mdw-update-terminal-title)
+
+;;;--------------------------------------------------------------------------
;;; C programming configuration.
;; Make C indentation nice.
(defvar mdw-c-comment-fill-prefix
`((,(concat "\\([ \t]*/?\\)"
- "\\(\*\\|//]\\)"
+ "\\(\\*\\|//\\)"
"\\([ \t]*\\)"
"\\([A-Za-z]+:[ \t]*\\)?"
mdw-hanging-indents)
"__typeof__" ;GCC
"__volatile__" ;GCC
))
- (c-constants
+ (c-builtins
(mdw-regexps "false" ;C++, C99 macro
"this" ;C++
"true" ;C++, C99 macro
(list (concat "\\<\\(" c-keywords "\\)\\>")
'(0 font-lock-keyword-face))
- (list (concat "\\<\\(" c-constants "\\)\\>")
+ (list (concat "\\<\\(" c-builtins "\\)\\>")
'(0 font-lock-variable-name-face))
;; Handle numbers too.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(define-derived-mode sod-mode c-mode "Sod"
+ "Major mode for editing Sod code.")
+(push '("\\.sod$" . sod-mode) auto-mode-alist)
+
+(dolist (hook '(c-mode-hook objc-mode-hook c++-mode-hook))
+ (add-hook hook 'mdw-misc-mode-config t)
+ (add-hook hook 'mdw-fontify-c-and-c++ t))
+
;;;--------------------------------------------------------------------------
;;; AP calc mode.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'apcalc-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'apcalc-mode-hook 'mdw-fontify-apcalc t))
+
;;;--------------------------------------------------------------------------
;;; Java programming configuration.
(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"))
-
- (java-constants
+ (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-builtins
(mdw-regexps "false" "null" "super" "this" "true")))
(setq font-lock-keywords
(list (concat "\\<\\(" java-keywords "\\)\\>")
'(0 font-lock-keyword-face))
- ;; Handle the magic constants defined above.
- (list (concat "\\<\\(" java-constants "\\)\\>")
+ ;; Handle the magic builtins defined above.
+ (list (concat "\\<\\(" java-builtins "\\)\\>")
'(0 font-lock-variable-name-face))
;; Handle numbers too.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'java-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'java-mode-hook 'mdw-fontify-java t))
+
;;;--------------------------------------------------------------------------
;;; Javascript programming configuration.
"private" "protected" "public" "return" "short"
"static" "super" "switch" "synchronized" "throw"
"throws" "transient" "try" "typeof" "var" "void"
- "volatile" "while" "with" "yield"
-
- "boolean" "byte" "char" "double" "float" "int" "long"
- "short" "void"))
- (javascript-constants
+ "volatile" "while" "with" "yield"))
+ (javascript-builtins
(mdw-regexps "false" "null" "undefined" "Infinity" "NaN" "true"
"arguments" "this")))
(list (concat "\\_<\\(" javascript-keywords "\\)\\_>")
'(0 font-lock-keyword-face))
- ;; Handle the predefined constants defined above.
- (list (concat "\\_<\\(" javascript-constants "\\)\\_>")
+ ;; Handle the predefined builtins defined above.
+ (list (concat "\\_<\\(" javascript-builtins "\\)\\_>")
'(0 font-lock-variable-name-face))
;; Handle numbers too.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'js-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'js-mode-hook 'mdw-fontify-javascript t))
+
;;;--------------------------------------------------------------------------
;;; Scala programming configuration.
"[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)))
'(1 "\"")
'(4 "\""))))))
+(progn
+ (add-hook 'scala-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'scala-mode-hook 'mdw-fontify-scala t))
+
;;;--------------------------------------------------------------------------
;;; C# programming configuration.
"unsafe" "ushort" "using" "virtual" "void" "volatile"
"while" "yield"))
- (csharp-constants
+ (csharp-builtins
(mdw-regexps "base" "false" "null" "this" "true")))
(setq font-lock-keywords
(list (concat "\\<\\(" csharp-keywords "\\)\\>")
'(0 font-lock-keyword-face))
- ;; Handle the magic constants defined above.
- (list (concat "\\<\\(" csharp-constants "\\)\\>")
+ ;; Handle the magic builtins defined above.
+ (list (concat "\\<\\(" csharp-builtins "\\)\\>")
'(0 font-lock-variable-name-face))
;; Handle numbers too.
(define-derived-mode csharp-mode java-mode "C#"
"Major mode for editing C# code.")
+(add-hook 'csharp-mode-hook 'mdw-fontify-csharp t)
+
;;;--------------------------------------------------------------------------
;;; F# programming configuration.
(list "^>" '(0 font-lock-keyword-face)))
font-lock-keywords)))
+(progn
+ (add-hook 'fsharp-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'fsharp-mode-hook 'mdw-fontify-fsharp t)
+ (add-hook 'inferior-fsharp-mode-hooks 'mdw-fontify-inferior-fsharp t))
+
;;;--------------------------------------------------------------------------
;;; Go programming configuration.
;; And anything else is punctuation.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'go-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'go-mode-hook 'mdw-fontify-go t))
;;;--------------------------------------------------------------------------
;;; Rust programming configuration.
(defun mdw-fontify-rust ()
;; Hack syntax categories.
+ (modify-syntax-entry ?$ ".")
+ (modify-syntax-entry ?% ".")
(modify-syntax-entry ?= ".")
;; Fontify keywords and things.
(make-local-variable 'font-lock-keywords)
(let ((rust-keywords
- (mdw-regexps "abstract" "alignof" "as"
+ (mdw-regexps "abstract" "alignof" "as" "async" "await"
"become" "box" "break"
- "const" "continue" "create"
- "do"
+ "const" "continue" "crate"
+ "do" "dyn"
"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"
- "unsafe" "unsized" "use"
+ "sizeof" "static" "struct" "super"
+ "trait" "try" "type" "typeof"
+ "union" "unsafe" "unsized" "use"
"virtual"
"where" "while"
"yield"))
"f32" "f64"
"i8" "i16" "i32" "i64" "isize"
"u8" "u16" "u32" "u64" "usize"
- "char" "str")))
+ "char" "str"
+ "self" "Self")))
(setq font-lock-keywords
(list
;; Handle the keywords defined above.
- (list (concat "\\<\\(" rust-keywords "\\)\\>")
+ (list (concat "\\_<\\(" rust-keywords "\\)\\_>")
'(0 font-lock-keyword-face))
- (list (concat "\\<\\(" rust-builtins "\\)\\>")
+ (list (concat "\\_<\\(" rust-builtins "\\)\\_>")
'(0 font-lock-variable-name-face))
;; Handle numbers too.
- (list (concat "\\<\\("
+ (list (concat "\\_<\\("
"[0-9][0-9_]*"
"\\(" "\\(\\.[0-9_]+\\)?[eE][-+]?[0-9_]+"
"\\|" "\\.[0-9_]+"
"\\|" "0o[0-7_]+"
"\\|" "0b[01_]+"
"\\)"
- "\\([ui]\\(8\\|16\\|32\\|64\\|s\\|size\\)\\)?"
- "\\)\\>")
+ "\\([ui]\\(8\\|16\\|32\\|64\\|size\\)\\)?"
+ "\\)\\_>")
'(0 mdw-number-face))
;; And anything else is punctuation.
(local-set-key [?{] 'mdw-self-insert-and-indent)
(local-set-key [?}] 'mdw-self-insert-and-indent))
+(progn
+ (add-hook 'rust-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'rust-mode-hook 'mdw-fontify-rust t))
+
;;;--------------------------------------------------------------------------
;;; Awk programming configuration.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'awk-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'awk-mode-hook 'mdw-fontify-awk t))
+
;;;--------------------------------------------------------------------------
;;; Perl programming style.
;; Perl indentation style.
-(setq perl-indent-level 2)
+(setq-default perl-indent-level 2)
-(setq cperl-indent-level 2)
-(setq cperl-continued-statement-offset 2)
-(setq cperl-continued-brace-offset 0)
-(setq cperl-brace-offset -2)
-(setq cperl-brace-imaginary-offset 0)
-(setq cperl-label-offset 0)
+(setq-default cperl-indent-level 2
+ cperl-continued-statement-offset 2
+ cperl-continued-brace-offset 0
+ cperl-brace-offset -2
+ cperl-brace-imaginary-offset 0
+ cperl-label-offset 0)
;; Define perl fontification style.
(if (re-search-forward "\\(tests\\s-*=>\\s-*\\)\\w*" nil t)
(replace-match (format "\\1%d" i))))))
+(dolist (hook '(perl-mode-hook cperl-mode-hook))
+ (add-hook hook 'mdw-misc-mode-config t)
+ (add-hook hook 'mdw-fontify-perl t))
+
;;;--------------------------------------------------------------------------
;;; Python programming style.
+(setq-default py-indent-offset 2
+ python-indent 2
+ python-indent-offset 2
+ python-fill-docstring-style 'symmetric)
+
(defun mdw-fontify-pythonic (keywords)
;; Miscellaneous fiddling.
'(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]+\\|[oO]?[0-7]+\\|[bB][01]+\\)\\|"
+ "\\_<[0-9][0-9]*\\(\\.[0-9]*\\|\\)"
+ "\\([eE]\\([-+]\\|\\)[0-9]+\\|[lL]\\|\\)")
'(0 mdw-number-face))
;; And anything else is punctuation.
(defun mdw-fontify-pyrex ()
(mdw-fontify-pythonic
(mdw-regexps "and" "as" "assert" "break" "cdef" "class" "continue"
- "ctypedef" "def" "del" "elif" "else" "except" "exec"
+ "ctypedef" "def" "del" "elif" "else" "enum" "except" "exec"
"extern" "finally" "for" "from" "global" "if"
"import" "in" "is" "lambda" "not" "or" "pass" "print"
- "raise" "return" "struct" "try" "while" "with"
+ "property" "raise" "return" "struct" "try" "while" "with"
"yield")))
+(define-derived-mode pyrex-mode python-mode "Pyrex"
+ "Major mode for editing Pyrex source code")
+(setq auto-mode-alist
+ (append '(("\\.pyx$" . pyrex-mode)
+ ("\\.pxd$" . pyrex-mode)
+ ("\\.pxi$" . pyrex-mode))
+ auto-mode-alist))
+
+(progn
+ (add-hook 'python-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'python-mode-hook 'mdw-fontify-python t)
+ (add-hook 'pyrex-mode-hook 'mdw-fontify-pyrex t))
+
;;;--------------------------------------------------------------------------
;;; Lua programming style.
-(setq lua-indent-level 2)
+(setq-default lua-indent-level 2)
(defun mdw-fontify-lua ()
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'lua-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'lua-mode-hook 'mdw-fontify-lua t))
+
;;;--------------------------------------------------------------------------
;;; Icon programming style.
;; Icon indentation style.
-(setq icon-brace-offset 0
- icon-continued-brace-offset 0
- icon-continued-statement-offset 2
- icon-indent-level 2)
+(setq-default icon-brace-offset 0
+ icon-continued-brace-offset 0
+ icon-continued-statement-offset 2
+ icon-indent-level 2)
;; Define Icon fontification style.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'icon-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'icon-mode-hook 'mdw-fontify-icon t))
+
;;;--------------------------------------------------------------------------
;;; Assembler mode.
(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)
+(progn
+ (add-hook 'asm-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'asm-mode-hook 'mdw-fontify-asm t))
+
;;;--------------------------------------------------------------------------
;;; TCL configuration.
+(setq-default tcl-indent-level 2)
+
(defun mdw-fontify-tcl ()
- (mapcar #'(lambda (ch) (modify-syntax-entry ch ".")) '(?$))
+ (dolist (ch '(?$))
+ (modify-syntax-entry ch "."))
(mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
(make-local-variable 'font-lock-keywords)
(setq font-lock-keywords
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face)))))
+(progn
+ (add-hook 'tcl-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'tcl-mode-hook 'mdw-fontify-tcl t))
+
;;;--------------------------------------------------------------------------
;;; Dylan programming configuration.
"\\)")
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'dylan-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'dylan-mode-hook 'mdw-fontify-dylan t))
+
;;;--------------------------------------------------------------------------
;;; Algol 68 configuration.
-(setq a68-indent-step 2)
+(setq-default a68-indent-step 2)
(defun mdw-fontify-algol-68 ()
(list "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"
'(0 mdw-punct-face))))))
+(dolist (hook '(a68-mode-hook a68-mode-hooks))
+ (add-hook hook 'mdw-misc-mode-config t)
+ (add-hook hook 'mdw-fontify-algol-68 t))
+
;;;--------------------------------------------------------------------------
;;; REXX configuration.
(setq mdw-auto-indent nil)
(local-set-key [?\C-m] 'mdw-rexx-indent-newline-indent)
(local-set-key [?*] 'mdw-rexx-electric-*)
- (mapcar #'(lambda (ch) (modify-syntax-entry ch "w"))
- '(?! ?? ?# ?@ ?$))
+ (dolist (ch '(?! ?? ?# ?@ ?$)) (modify-syntax-entry ch "w"))
+ (dolist (ch '(?¬)) (modify-syntax-entry ch "."))
(mdw-standard-fill-prefix "\\([ \t]*/?\*[ \t]*\\)")
;; Set up keywords and things for fontification.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'rexx-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'rexx-mode-hook 'mdw-fontify-rexx t))
+
;;;--------------------------------------------------------------------------
;;; Standard ML programming style.
+(setq-default sml-nested-if-indent t
+ sml-case-indent nil
+ sml-indent-level 4
+ sml-type-of-indent nil)
+
(defun mdw-fontify-sml ()
;; Make underscore an honorary letter.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'sml-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'sml-mode-hook 'mdw-fontify-sml t))
+
;;;--------------------------------------------------------------------------
;;; Haskell configuration.
+(setq-default haskell-indent-offset 2)
+
(defun mdw-fontify-haskell ()
;; Fiddle with syntax table to get comments right.
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'haskell-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'haskell-mode-hook 'mdw-fontify-haskell t))
+
;;;--------------------------------------------------------------------------
;;; Erlang configuration.
-(setq erlang-electric-commands nil)
+(setq-default erlang-electric-commands nil)
(defun mdw-fontify-erlang ()
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(progn
+ (add-hook 'erlang-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'erlang-mode-hook 'mdw-fontify-erlang t))
+
;;;--------------------------------------------------------------------------
;;; Texinfo configuration.
(list "[{}]+"
'(0 mdw-punct-face)))))
+(dolist (hook '(texinfo-mode-hook TeXinfo-mode-hook))
+ (add-hook hook 'mdw-misc-mode-config t)
+ (add-hook hook 'mdw-fontify-texinfo t))
+
;;;--------------------------------------------------------------------------
;;; TeX and LaTeX configuration.
+(setq-default LaTeX-table-label "tbl:"
+ TeX-auto-untabify nil
+ LaTeX-syntactic-comments nil
+ LaTeX-fill-break-at-separators '(\\\[))
+
(defun mdw-fontify-tex ()
(setq ispell-parser 'tex)
(turn-on-reftex)
(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)
+ (local-set-key "\C-\M-i" 'indent-relative)
(setq indent-tabs-mode nil)
;; Set fill prefix.
(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'."
(unless modified
(restore-buffer-modified-p nil)))))))
+(setq TeX-output-view-style
+ '(("^dvi$"
+ ("^landscape$" "^pstricks$\\|^pst-\\|^psfrag$")
+ "%(o?)dvips -t landscape %d -o && xdg-open %f")
+ ("^dvi$" "^pstricks$\\|^pst-\\|^psfrag$"
+ "%(o?)dvips %d -o && xdg-open %f")
+ ("^dvi$"
+ ("^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$" "^landscape$")
+ "%(o?)xdvi %dS -paper a4r -s 0 %d")
+ ("^dvi$" "^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$"
+ "%(o?)xdvi %dS -paper a4 %d")
+ ("^dvi$"
+ ("^a5\\(?:comb\\|paper\\)$" "^landscape$")
+ "%(o?)xdvi %dS -paper a5r -s 0 %d")
+ ("^dvi$" "^a5\\(?:comb\\|paper\\)$" "%(o?)xdvi %dS -paper a5 %d")
+ ("^dvi$" "^b5paper$" "%(o?)xdvi %dS -paper b5 %d")
+ ("^dvi$" "^letterpaper$" "%(o?)xdvi %dS -paper us %d")
+ ("^dvi$" "^legalpaper$" "%(o?)xdvi %dS -paper legal %d")
+ ("^dvi$" "^executivepaper$" "%(o?)xdvi %dS -paper 7.25x10.5in %d")
+ ("^dvi$" "." "%(o?)xdvi %dS %d")
+ ("^pdf$" "." "xdg-open %o")
+ ("^html?$" "." "sensible-browser %o")))
+
+(setq TeX-view-program-list
+ '(("mupdf" ("mupdf %o" (mode-io-correlate " %(outpage)")))))
+
+(setq TeX-view-program-selection
+ '(((output-dvi style-pstricks) "dvips and gv")
+ (output-dvi "xdvi")
+ (output-pdf "mupdf")
+ (output-html "sensible-browser")))
+
+(setq TeX-open-quote "\""
+ TeX-close-quote "\"")
+
+(setq reftex-use-external-file-finders t
+ reftex-auto-recenter-toc t)
+
+(setq reftex-label-alist
+ '(("theorem" ?T "th:" "~\\ref{%s}" t ("theorems?" "th\\.") -2)
+ ("axiom" ?A "ax:" "~\\ref{%s}" t ("axioms?" "ax\\.") -2)
+ ("definition" ?D "def:" "~\\ref{%s}" t ("definitions?" "def\\.") -2)
+ ("proposition" ?P "prop:" "~\\ref{%s}" t
+ ("propositions?" "prop\\.") -2)
+ ("lemma" ?L "lem:" "~\\ref{%s}" t ("lemmas?" "lem\\.") -2)
+ ("example" ?X "eg:" "~\\ref{%s}" t ("examples?") -2)
+ ("exercise" ?E "ex:" "~\\ref{%s}" t ("exercises?" "ex\\.") -2)
+ ("enumerate" ?i "i:" "~\\ref{%s}" item ("items?"))))
+(setq reftex-section-prefixes
+ '((0 . "part:")
+ (1 . "ch:")
+ (t . "sec:")))
+
+(setq bibtex-field-delimiters 'double-quotes
+ bibtex-align-at-equal-sign t
+ bibtex-entry-format '(realign opts-or-alts required-fields
+ numerical-fields last-comma delimiters
+ unify-case sort-fields braces)
+ bibtex-sort-ignore-string-entries nil
+ bibtex-maintain-sorted-entries 'entry-class
+ bibtex-include-OPTkey t
+ bibtex-autokey-names-stretch 1
+ bibtex-autokey-expand-strings t
+ bibtex-autokey-name-separator "-"
+ bibtex-autokey-year-length 4
+ bibtex-autokey-titleword-separator "-"
+ bibtex-autokey-name-year-separator "-"
+ bibtex-autokey-year-title-separator ":")
+
+(progn
+ (dolist (hook '(tex-mode-hook latex-mode-hook
+ TeX-mode-hook LaTeX-mode-hook))
+ (add-hook hook 'mdw-misc-mode-config t)
+ (add-hook hook 'mdw-fontify-tex t))
+ (add-hook 'bibtex-mode-hook (lambda () (setq fill-column 76))))
+
+;;;--------------------------------------------------------------------------
+;;; HTML, CSS, and other web foolishness.
+
+(setq-default css-indent-offset 2)
+
;;;--------------------------------------------------------------------------
;;; SGML hacking.
+(setq-default psgml-html-build-new-buffer nil)
+
(defun mdw-sgml-mode ()
(interactive)
(sgml-mode)
nil)
(t
(let ((table (copy-syntax-table (syntax-table))))
- (mapc (lambda (ch) (modify-syntax-entry ch "." table))
- (if (listp flag) flag (list flag)))
+ (dolist (ch (if (listp flag) flag (list flag)))
+ (modify-syntax-entry ch "." table))
(set-syntax-table table)
(and font-lock-mode (font-lock-fontify-buffer)))))))
-(add-hook 'conf-mode-local-variables-hook 'mdw-fix-up-quote t t)
+
+(progn
+ (add-hook 'conf-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'conf-mode-local-variables-hook 'mdw-fix-up-quote t t))
;;;--------------------------------------------------------------------------
;;; Shell scripts.
(cons (cons 'rc frag)
sh-mode-syntax-table-input))))))
+(progn
+ (add-hook 'sh-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'sh-mode-hook 'mdw-setup-sh-script-mode t))
+
;;;--------------------------------------------------------------------------
;;; Emacs shell mode.
(concat "~" (substring pwd (length home)))
pwd))
right)))
-(setq eshell-prompt-function 'mdw-eshell-prompt)
-(setq eshell-prompt-regexp "^\\[[^]>]+\\(\\]\\|>>?\\)")
+(setq-default eshell-prompt-function 'mdw-eshell-prompt)
+(setq-default eshell-prompt-regexp "^\\[[^]>]+\\(\\]\\|>>?\\)")
(defun eshell/e (file) (find-file file) nil)
(defun eshell/ee (file) (find-file-other-window file) nil)
(mdw-define-face eshell-ls-readonly (t nil))
(mdw-define-face eshell-ls-symlink (t :foreground "cyan"))
+(defun mdw-eshell-hack () (setenv "LD_PRELOAD" nil))
+(add-hook 'eshell-mode-hook 'mdw-eshell-hack)
+
;;;--------------------------------------------------------------------------
;;; Messages-file mode.
messages-mode-keywords)))
(run-hooks 'cpp-messages-mode-hook))
-(add-hook 'messages-mode-hook 'mdw-misc-mode-config t)
-(add-hook 'cpp-messages-mode-hook 'mdw-misc-mode-config t)
-; (add-hook 'messages-file-hook 'mdw-fontify-messages t)
+(progn
+ (add-hook 'messages-mode-hook 'mdw-misc-mode-config t)
+ (add-hook 'cpp-messages-mode-hook 'mdw-misc-mode-config t)
+ ;; (add-hook 'messages-file-hook 'mdw-fontify-messages t)
+ )
;;;--------------------------------------------------------------------------
;;; Messages-file mode.
(setq comment-end "")
(run-hooks 'mallow-driver-mode-hook))
-(add-hook 'mallow-driver-hook 'mdw-misc-mode-config t)
+(progn
+ (add-hook 'mallow-driver-hook 'mdw-misc-mode-config t))
;;;--------------------------------------------------------------------------
;;; NFast debugs.
(run-hooks 'nfast-debug-mode-hook))
;;;--------------------------------------------------------------------------
-;;; Other languages.
-
-;; Smalltalk.
-
-(defun mdw-setup-smalltalk ()
- (and mdw-auto-indent
- (local-set-key "\C-m" 'smalltalk-newline-and-indent))
- (make-local-variable 'mdw-auto-indent)
- (setq mdw-auto-indent nil)
- (local-set-key "\C-i" 'smalltalk-reindent))
-
-(defun mdw-fontify-smalltalk ()
- (make-local-variable 'font-lock-keywords)
- (setq font-lock-keywords
- (list
- (list "\\<[A-Z][a-zA-Z0-9]*\\>"
- '(0 font-lock-keyword-face))
- (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
- "[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
- "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
- '(0 mdw-number-face))
- (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
- '(0 mdw-punct-face)))))
-
-;; Lispy languages.
+;;; Lispy languages.
;; Unpleasant bodge.
(unless (boundp 'slime-repl-mode-map)
(make-local-variable '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)
+(setq-default lisp-simple-loop-indentation 2
+ lisp-loop-keyword-indentation 6
+ lisp-loop-forms-indentation 6)
+
+(defmacro mdw-advise-hyperspec-lookup (func args)
+ `(defadvice ,func (around mdw-browse-w3m ,args activate compile)
+ (if (fboundp 'w3m)
+ (let ((browse-url-browser-function #'mdw-w3m-browse-url))
+ ad-do-it)
+ ad-do-it)))
+(mdw-advise-hyperspec-lookup common-lisp-hyperspec (symbol))
+(mdw-advise-hyperspec-lookup common-lisp-hyperspec-format (char))
+(mdw-advise-hyperspec-lookup common-lisp-hyperspec-lookup-reader-macro (char))
(defun mdw-fontify-lispy ()
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face)))))
-(defun comint-send-and-indent ()
- (interactive)
- (comint-send-input)
+;; SLIME setup.
+
+(trap
+ (if (not mdw-fast-startup)
+ (progn
+ (require 'slime-autoloads)
+ (slime-setup '(slime-autodoc slime-c-p-c)))))
+
+(let ((stuff '((cmucl ("cmucl"))
+ (sbcl ("sbcl") :coding-system utf-8-unix)
+ (clisp ("clisp") :coding-system utf-8-unix))))
+ (or (boundp 'slime-lisp-implementations)
+ (setq slime-lisp-implementations nil))
+ (while stuff
+ (let* ((head (car stuff))
+ (found (assq (car head) slime-lisp-implementations)))
+ (setq stuff (cdr stuff))
+ (if found
+ (rplacd found (cdr head))
+ (setq slime-lisp-implementations
+ (cons head slime-lisp-implementations))))))
+(setq slime-default-lisp 'sbcl)
+
+;; Hooks.
+
+(progn
+ (dolist (hook '(emacs-lisp-mode-hook
+ scheme-mode-hook
+ lisp-mode-hook
+ inferior-lisp-mode-hook
+ lisp-interaction-mode-hook
+ ielm-mode-hook
+ slime-repl-mode-hook))
+ (add-hook hook 'mdw-misc-mode-config t)
+ (add-hook hook 'mdw-fontify-lispy t))
+ (add-hook 'lisp-mode-hook 'mdw-common-lisp-indent t)
+ (add-hook 'inferior-lisp-mode-hook
+ #'(lambda () (local-set-key "\C-m" 'comint-send-and-indent)) t))
+
+;;;--------------------------------------------------------------------------
+;;; Other languages.
+
+;; Smalltalk.
+
+(defun mdw-setup-smalltalk ()
(and mdw-auto-indent
- (indent-for-tab-command)))
+ (local-set-key "\C-m" 'smalltalk-newline-and-indent))
+ (make-local-variable 'mdw-auto-indent)
+ (setq mdw-auto-indent nil)
+ (local-set-key "\C-i" 'smalltalk-reindent))
+
+(defun mdw-fontify-smalltalk ()
+ (make-local-variable 'font-lock-keywords)
+ (setq font-lock-keywords
+ (list
+ (list "\\<[A-Z][a-zA-Z0-9]*\\>"
+ '(0 font-lock-keyword-face))
+ (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
+ "[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
+ "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
+ '(0 mdw-number-face))
+ (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+ '(0 mdw-punct-face)))))
+
+(progn
+ (add-hook 'smalltalk-mode 'mdw-misc-mode-config t)
+ (add-hook 'smalltalk-mode 'mdw-fontify-smalltalk t))
+
+;; m4.
(defun mdw-setup-m4 ()
;; Fill prefix.
(mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
+(dolist (hook '(m4-mode-hook autoconf-mode-hook autotest-mode-hook))
+ (add-hook hook #'mdw-misc-mode-config t)
+ (add-hook hook #'mdw-setup-m4 t))
+
+;; Make.
+
+(progn
+ (add-hook 'makefile-mode-hook 'mdw-misc-mode-config t))
+
;;;--------------------------------------------------------------------------
;;; Text mode.
"\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
(auto-fill-mode 1))
+(eval-after-load "flyspell"
+ '(define-key flyspell-mode-map "\C-\M-i" nil))
+
+(progn
+ (add-hook 'text-mode-hook 'mdw-text-mode t))
+
;;;--------------------------------------------------------------------------
;;; Outline and hide/show modes.
(ad-set-arg 2 (car program))
(ad-set-arg 4 (cdr program))))))
+(defadvice term-exec-1 (around hack-environment compile activate)
+ "Hack the environment inherited by inferiors in the terminal."
+ (let ((process-environment (copy-tree process-environment)))
+ (setenv "LD_PRELOAD" nil)
+ ad-do-it))
+
+(defadvice shell (around hack-environment compile activate)
+ "Hack the environment inherited by inferiors in the shell."
+ (let ((process-environment (copy-tree process-environment)))
+ (setenv "LD_PRELOAD" nil)
+ ad-do-it))
+
(defun ssh (host)
"Open a terminal containing an ssh session to the HOST."
(interactive "sHost: ")
(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)
(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.
-(setq magit-diff-refine-hunk 'all
+(setq magit-diff-refine-hunk 't
magit-view-git-manual-method 'man
magit-log-margin '(nil age magit-log-margin-width t 18)
magit-wip-after-save-local-mode-lighter ""
(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)
magit-revision-mode-refresh-popup))
(magit-define-popup-switch popup ?R "Reverse diff" "-R"))))
+(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)
(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))
+
+;;;--------------------------------------------------------------------------
+;;; Man pages.
+
+;; Turn off `noip' when running `man': it interferes with `man-db''s own
+;; seccomp(2)-based sandboxing, which is (in this case, at least) strictly
+;; better.
+(defadvice Man-getpage-in-background
+ (around mdw-inhibit-noip (topic) compile activate)
+ "Inhibit the `noip' preload hack when invoking `man'."
+ (let* ((old-preload (getenv "LD_PRELOAD"))
+ (preloads (save-match-data (split-string old-preload ":")))
+ (any nil)
+ (filtered nil))
+ (while preloads
+ (let ((item (pop preloads)))
+ (if (save-match-data
+ (string-match "\\(/\\|^\\)noip\.so\\(:\\|$\\)" item))
+ (setq any t)
+ (push item filtered))))
+ (if any
+ (unwind-protect
+ (progn
+ (setenv "LD_PRELOAD"
+ (and filtered
+ (with-output-to-string
+ (setq filtered (nreverse filtered))
+ (let ((first t))
+ (while filtered
+ (if first (setq first nil)
+ (write-char ?:))
+ (write-string (pop filtered)))))))
+ ad-do-it)
+ (setenv "LD_PRELOAD" old-preload))
+ ad-do-it)))
+
;;;--------------------------------------------------------------------------
;;; MPC configuration.
-(defun mdw-mpc-play-or-pause ()
- (interactive)
- (require 'mpc)
- (if (member (cdr (assq 'state (mpc-cmd-status))) '("play"))
- (mpc-pause)
- (mpc-play)))
+(eval-when-compile (trap (require 'mpc)))
(setq mpc-browser-tags '(Artist|Composer|Performer Album|Playlist))
(t
(message "mpd in unknown state `%s'" state)))))
-(autoload 'mpc-pause "mpc")
-(autoload 'mpc-next "mpc")
-(autoload 'mpc-prev "mpc")
+(defmacro mdw-define-mpc-wrapper (func bvl interactive &rest body)
+ `(defun ,func ,bvl
+ (interactive ,@interactive)
+ (require 'mpc)
+ ,@body
+ (mdw-mpc-now-playing)))
+
+(mdw-define-mpc-wrapper mdw-mpc-play-or-pause () nil
+ (if (member (cdr (assq 'state (mpc-cmd-status))) '("play"))
+ (mpc-pause)
+ (mpc-play)))
+
+(mdw-define-mpc-wrapper mdw-mpc-next () nil (mpc-next))
+(mdw-define-mpc-wrapper mdw-mpc-prev () nil (mpc-prev))
+(mdw-define-mpc-wrapper mdw-mpc-stop () nil (mpc-stop))
+
+(defun mdw-mpc-louder (step)
+ (interactive (list (if current-prefix-arg
+ (prefix-numeric-value current-prefix-arg)
+ +10)))
+ (mpc-proc-cmd (format "volume %+d" step)))
+
+(defun mdw-mpc-quieter (step)
+ (interactive (list (if current-prefix-arg
+ (prefix-numeric-value current-prefix-arg)
+ +10)))
+ (mpc-proc-cmd (format "volume %+d" (- step))))
(defun mdw-mpc-hack-lines (arg interactivep func)
(if (and interactivep (use-region-p))
(decf n)))))))
(defun mdw-mpc-select-one ()
- (unless (get-char-property (point) 'mpc-select)
+ (when (and (get-char-property (point) 'mpc-file)
+ (not (get-char-property (point) 'mpc-select)))
(mpc-select-toggle)))
(defun mdw-mpc-unselect-one ()
(defun mdw-mpc-select (&optional arg interactivep)
(interactive (list current-prefix-arg t))
- (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one)
- (mpc-selection-refresh))
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
(defun mdw-mpc-unselect (&optional arg interactivep)
(interactive (list current-prefix-arg t))
- (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-unselect-one)
- (mpc-selection-refresh))
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-unselect-one))
(defun mdw-mpc-unselect-backwards (arg)
(interactive "p")
- (mdw-mpc-hack-lines (- arg) t 'mdw-mpc-unselect-one)
- (mpc-selection-refresh))
+ (mdw-mpc-hack-lines (- arg) t 'mdw-mpc-unselect-one))
(defun mdw-mpc-unselect-all ()
(interactive)
(beginning-of-line)
(forward-line (- arg)))
+(defun mdw-mpc-playlist-add (&optional arg interactivep)
+ (interactive (list current-prefix-arg t))
+ (let ((mpc-select mpc-select))
+ (when (or arg (and interactivep (use-region-p)))
+ (setq mpc-select nil)
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+ (setq mpc-select (reverse mpc-select))
+ (mpc-playlist-add)))
+
+(defun mdw-mpc-playlist-delete (&optional arg interactivep)
+ (interactive (list current-prefix-arg t))
+ (setq mpc-select (nreverse mpc-select))
+ (mpc-select-save
+ (when (or arg (and interactivep (use-region-p)))
+ (setq mpc-select nil)
+ (mpc-selection-refresh)
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+ (mpc-playlist-delete)))
+
+(defun mdw-mpc-hack-tagbrowsers ()
+ (setq-local mode-line-format
+ '("%e"
+ mode-line-frame-identification
+ mode-line-buffer-identification)))
+(add-hook 'mpc-tagbrowser-mode-hook 'mdw-mpc-hack-tagbrowsers)
+
+(defun mdw-mpc-hack-songs ()
+ (setq-local header-line-format
+ ;; '("MPC " mpc-volume " " mpc-current-song)
+ (list (propertize " " 'display '(space :align-to 0))
+ ;; 'mpc-songs-format-description
+ '(:eval
+ (let ((deactivate-mark) (hscroll (window-hscroll)))
+ (with-temp-buffer
+ (mpc-format mpc-songs-format 'self hscroll)
+ ;; That would be simpler than the hscroll handling in
+ ;; mpc-format, but currently move-to-column does not
+ ;; recognize :space display properties.
+ ;; (move-to-column hscroll)
+ ;; (delete-region (point-min) (point))
+ (buffer-string)))))))
+(add-hook 'mpc-songs-mode-hook 'mdw-mpc-hack-songs)
+
(eval-after-load "mpc"
'(progn
(define-key mpc-mode-map "m" 'mdw-mpc-select)
(define-key mpc-mode-map "\e\177" 'mdw-mpc-unselect-all)
(define-key mpc-mode-map "n" 'mdw-mpc-next-line)
(define-key mpc-mode-map "p" 'mdw-mpc-previous-line)
+ (define-key mpc-mode-map "/" 'mpc-songs-search)
(setq mpc-songs-mode-map (make-sparse-keymap))
(set-keymap-parent mpc-songs-mode-map mpc-mode-map)
(define-key mpc-songs-mode-map "l" 'mpc-playlist)
- (define-key mpc-songs-mode-map "+" 'mpc-playlist-add)
- (define-key mpc-songs-mode-map "-" 'mpc-playlist-delete)))
+ (define-key mpc-songs-mode-map "+" 'mdw-mpc-playlist-add)
+ (define-key mpc-songs-mode-map "-" 'mdw-mpc-playlist-delete)
+ (define-key mpc-songs-mode-map "\r" 'mpc-songs-jump-to)))
;;;--------------------------------------------------------------------------
;;; Inferior Emacs Lisp.