el/dot-emacs.el: Don't turn on outline-minor-mode all the time.
[profile] / el / dot-emacs.el
CommitLineData
502f4699 1;;; -*- mode: emacs-lisp; coding: utf-8 -*-
f617db13 2;;;
f617db13
MW
3;;; Functions and macros for .emacs
4;;;
5;;; (c) 2004 Mark Wooding
6;;;
7
8;;;----- Licensing notice ---------------------------------------------------
9;;;
10;;; This program is free software; you can redistribute it and/or modify
11;;; it under the terms of the GNU General Public License as published by
12;;; the Free Software Foundation; either version 2 of the License, or
13;;; (at your option) any later version.
852cd5fb 14;;;
f617db13
MW
15;;; This program is distributed in the hope that it will be useful,
16;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;;; GNU General Public License for more details.
852cd5fb 19;;;
f617db13
MW
20;;; You should have received a copy of the GNU General Public License
21;;; along with this program; if not, write to the Free Software Foundation,
22;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
6132bc01
MW
24;;;--------------------------------------------------------------------------
25;;; Check command-line.
c7a8da49
MW
26
27(defvar mdw-fast-startup nil
28 "Whether .emacs should optimize for rapid startup.
29This may be at the expense of cool features.")
30(let ((probe nil) (next command-line-args))
c7a8da49
MW
31 (while next
32 (cond ((string= (car next) "--mdw-fast-startup")
33 (setq mdw-fast-startup t)
34 (if probe
35 (rplacd probe (cdr next))
36 (setq command-line-args (cdr next))))
37 (t
38 (setq probe next)))
39 (setq next (cdr next))))
40
6132bc01
MW
41;;;--------------------------------------------------------------------------
42;;; Some general utilities.
f617db13 43
417dcddd
MW
44(eval-when-compile
45 (unless (fboundp 'make-regexp)
46 (load "make-regexp"))
47 (require 'cl))
c7a8da49
MW
48
49(defmacro mdw-regexps (&rest list)
50 "Turn a LIST of strings into a single regular expression at compile-time."
9e789ed5
MW
51 (declare (indent nil)
52 (debug 0))
417dcddd 53 `',(make-regexp list))
c7a8da49 54
6132bc01 55;; Some error trapping.
f617db13
MW
56;;
57;; If individual bits of this file go tits-up, we don't particularly want
58;; the whole lot to stop right there and then, because it's bloody annoying.
59
60(defmacro trap (&rest forms)
61 "Execute FORMS without allowing errors to propagate outside."
9e789ed5
MW
62 (declare (indent 0)
63 (debug t))
f617db13
MW
64 `(condition-case err
65 ,(if (cdr forms) (cons 'progn forms) (car forms))
8df912e4
MW
66 (error (message "Error (trapped): %s in %s"
67 (error-message-string err)
68 ',forms))))
f617db13 69
6132bc01 70;; Configuration reading.
f141fe0f
MW
71
72(defvar mdw-config nil)
73(defun mdw-config (sym)
74 "Read the configuration variable named SYM."
75 (unless mdw-config
daff679f
MW
76 (setq mdw-config
77 (flet ((replace (what with)
78 (goto-char (point-min))
79 (while (re-search-forward what nil t)
80 (replace-match with t))))
81 (with-temp-buffer
82 (insert-file-contents "~/.mdw.conf")
83 (replace "^[ \t]*\\(#.*\\|\\)\n" "")
84 (replace (concat "^[ \t]*"
85 "\\([-a-zA-Z0-9_.]*\\)"
86 "[ \t]*=[ \t]*"
87 "\\(.*[^ \t\n]\\|\\)"
88 "[ \t]**\\(\n\\|$\\)")
89 "(\\1 . \"\\2\")\n")
90 (car (read-from-string
91 (concat "(" (buffer-string) ")")))))))
f141fe0f
MW
92 (cdr (assq sym mdw-config)))
93
6132bc01 94;; Set up the load path convincingly.
eac7b622
MW
95
96(dolist (dir (append (and (boundp 'debian-emacs-flavor)
97 (list (concat "/usr/share/"
98 (symbol-name debian-emacs-flavor)
99 "/site-lisp")))))
100 (dolist (sub (directory-files dir t))
101 (when (and (file-accessible-directory-p sub)
102 (not (member sub load-path)))
103 (setq load-path (nconc load-path (list sub))))))
104
6132bc01 105;; Is an Emacs library available?
cb6e2cd1
MW
106
107(defun library-exists-p (name)
6132bc01
MW
108 "Return non-nil if NAME is an available library.
109Return non-nil if NAME.el (or NAME.elc) somewhere on the Emacs
110load path. The non-nil value is the filename we found for the
111library."
cb6e2cd1
MW
112 (let ((path load-path) elt (foundp nil))
113 (while (and path (not foundp))
114 (setq elt (car path))
115 (setq path (cdr path))
116 (setq foundp (or (let ((file (concat elt "/" name ".elc")))
117 (and (file-exists-p file) file))
118 (let ((file (concat elt "/" name ".el")))
119 (and (file-exists-p file) file)))))
120 foundp))
121
122(defun maybe-autoload (symbol file &optional docstring interactivep type)
123 "Set an autoload if the file actually exists."
124 (and (library-exists-p file)
125 (autoload symbol file docstring interactivep type)))
126
6132bc01 127;; Splitting windows.
f617db13 128
8c2b05d5
MW
129(unless (fboundp 'scroll-bar-columns)
130 (defun scroll-bar-columns (side)
131 (cond ((eq side 'left) 0)
132 (window-system 3)
133 (t 1))))
134(unless (fboundp 'fringe-columns)
135 (defun fringe-columns (side)
136 (cond ((not window-system) 0)
137 ((eq side 'left) 1)
138 (t 2))))
139
3ba0b777
MW
140(defun mdw-horizontal-window-overhead ()
141 "Computes the horizontal window overhead.
142This is the number of columns used by fringes, scroll bars and other such
143cruft."
144 (if (not window-system)
145 1
146 (let ((tot 0))
147 (dolist (what '(scroll-bar fringe))
148 (dolist (side '(left right))
149 (incf tot (funcall (intern (concat (symbol-name what) "-columns"))
150 side))))
151 tot)))
152
153(defun mdw-split-window-horizontally (&optional width)
154 "Split a window horizontally.
155Without a numeric argument, split the window approximately in
156half. With a numeric argument WIDTH, allocate WIDTH columns to
157the left-hand window (if positive) or -WIDTH columns to the
158right-hand window (if negative). Space for scroll bars and
159fringes is not taken out of the allowance for WIDTH, unlike
160\\[split-window-horizontally]."
161 (interactive "P")
162 (split-window-horizontally
163 (cond ((null width) nil)
164 ((>= width 0) (+ width (mdw-horizontal-window-overhead)))
165 ((< width 0) width))))
166
8c2b05d5 167(defun mdw-divvy-window (&optional width)
f617db13 168 "Split a wide window into appropriate widths."
8c2b05d5
MW
169 (interactive "P")
170 (setq width (cond (width (prefix-numeric-value width))
171 ((and window-system
172 (>= emacs-major-version 22))
173 77)
174 (t 78)))
b5d724dd 175 (let* ((win (selected-window))
3ba0b777 176 (sb-width (mdw-horizontal-window-overhead))
b5d724dd 177 (c (/ (+ (window-width) sb-width)
8c2b05d5 178 (+ width sb-width))))
f617db13
MW
179 (while (> c 1)
180 (setq c (1- c))
8c2b05d5 181 (split-window-horizontally (+ width sb-width))
f617db13
MW
182 (other-window 1))
183 (select-window win)))
184
c4b18360
MW
185;; Transient mark mode hacks.
186
187(defadvice exchange-point-and-mark
188 (around mdw-highlight (&optional arg) activate compile)
189 "Maybe don't actually exchange point and mark.
190If `transient-mark-mode' is on and the mark is inactive, then
191just activate it. A non-trivial prefix argument will force the
192usual behaviour. A trivial prefix argument (i.e., just C-u) will
193activate the mark and temporarily enable `transient-mark-mode' if
194it's currently off."
195 (cond ((or mark-active
196 (and (not transient-mark-mode) (not arg))
197 (and arg (or (not (consp arg))
198 (not (= (car arg) 4)))))
199 ad-do-it)
200 (t
201 (or transient-mark-mode (setq transient-mark-mode 'only))
202 (set-mark (mark t)))))
203
6132bc01 204;; Functions for sexp diary entries.
f617db13
MW
205
206(defun mdw-weekday (l)
207 "Return non-nil if `date' falls on one of the days of the week in L.
6132bc01
MW
208L is a list of day numbers (from 0 to 6 for Sunday through to
209Saturday) or symbols `sunday', `monday', etc. (or a mixture). If
210the date stored in `date' falls on a listed day, then the
211function returns non-nil."
f617db13
MW
212 (let ((d (calendar-day-of-week date)))
213 (or (memq d l)
214 (memq (nth d '(sunday monday tuesday wednesday
215 thursday friday saturday)) l))))
216
217(defun mdw-todo (&optional when)
218 "Return non-nil today, or on WHEN, whichever is later."
219 (let ((w (calendar-absolute-from-gregorian (calendar-current-date)))
220 (d (calendar-absolute-from-gregorian date)))
221 (if when
222 (setq w (max w (calendar-absolute-from-gregorian
223 (cond
224 ((not european-calendar-style)
225 when)
226 ((> (car when) 100)
227 (list (nth 1 when)
228 (nth 2 when)
229 (nth 0 when)))
230 (t
231 (list (nth 1 when)
232 (nth 0 when)
233 (nth 2 when))))))))
234 (eq w d)))
235
6132bc01 236;; Fighting with Org-mode's evil key maps.
16fe7c41
MW
237
238(defvar mdw-evil-keymap-keys
239 '(([S-up] . [?\C-c up])
240 ([S-down] . [?\C-c down])
241 ([S-left] . [?\C-c left])
242 ([S-right] . [?\C-c right])
243 (([M-up] [?\e up]) . [C-up])
244 (([M-down] [?\e down]) . [C-down])
245 (([M-left] [?\e left]) . [C-left])
246 (([M-right] [?\e right]) . [C-right]))
247 "Defines evil keybindings to clobber in `mdw-clobber-evil-keymap'.
248The value is an alist mapping evil keys (as a list, or singleton)
249to good keys (in the same form).")
250
251(defun mdw-clobber-evil-keymap (keymap)
252 "Replace evil key bindings in the KEYMAP.
253Evil key bindings are defined in `mdw-evil-keymap-keys'."
254 (dolist (entry mdw-evil-keymap-keys)
255 (let ((binding nil)
256 (keys (if (listp (car entry))
257 (car entry)
258 (list (car entry))))
259 (replacements (if (listp (cdr entry))
260 (cdr entry)
261 (list (cdr entry)))))
262 (catch 'found
263 (dolist (key keys)
264 (setq binding (lookup-key keymap key))
265 (when binding
266 (throw 'found nil))))
267 (when binding
268 (dolist (key keys)
269 (define-key keymap key nil))
270 (dolist (key replacements)
271 (define-key keymap key binding))))))
272
0f6be0b1 273(eval-after-load "org-latex"
f0dbee84
MW
274 '(progn
275 (push '("strayman"
276 "\\documentclass{strayman}
277\\usepackage[utf8]{inputenc}
278\\usepackage[palatino, helvetica, courier, maths=cmr]{mdwfonts}
279\\usepackage[T1]{fontenc}
280\\usepackage{graphicx, tikz, mdwtab, mdwmath, crypto, longtable}"
281 ("\\section{%s}" . "\\section*{%s}")
282 ("\\subsection{%s}" . "\\subsection*{%s}")
283 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
284 ("\\paragraph{%s}" . "\\paragraph*{%s}")
285 ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
286 org-export-latex-classes)))
287
6132bc01
MW
288;;;--------------------------------------------------------------------------
289;;; Mail and news hacking.
a3bdb4d9
MW
290
291(define-derived-mode mdwmail-mode mail-mode "[mdw] mail"
6132bc01 292 "Major mode for editing news and mail messages from external programs.
a3bdb4d9
MW
293Not much right now. Just support for doing MailCrypt stuff."
294 :syntax-table nil
295 :abbrev-table nil
296 (run-hooks 'mail-setup-hook))
297
298(define-key mdwmail-mode-map [?\C-c ?\C-c] 'disabled-operation)
299
300(add-hook 'mdwail-mode-hook
301 (lambda ()
302 (set-buffer-file-coding-system 'utf-8)
303 (make-local-variable 'paragraph-separate)
304 (make-local-variable 'paragraph-start)
305 (setq paragraph-start
306 (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
307 paragraph-start))
308 (setq paragraph-separate
309 (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
310 paragraph-separate))))
311
6132bc01 312;; How to encrypt in mdwmail.
a3bdb4d9
MW
313
314(defun mdwmail-mc-encrypt (&optional recip scm start end from sign)
315 (or start
316 (setq start (save-excursion
317 (goto-char (point-min))
318 (or (search-forward "\n\n" nil t) (point-min)))))
319 (or end
320 (setq end (point-max)))
321 (mc-encrypt-generic recip scm start end from sign))
322
6132bc01 323;; How to sign in mdwmail.
a3bdb4d9
MW
324
325(defun mdwmail-mc-sign (key scm start end uclr)
326 (or start
327 (setq start (save-excursion
328 (goto-char (point-min))
329 (or (search-forward "\n\n" nil t) (point-min)))))
330 (or end
331 (setq end (point-max)))
332 (mc-sign-generic key scm start end uclr))
333
6132bc01 334;; Some signature mangling.
a3bdb4d9
MW
335
336(defun mdwmail-mangle-signature ()
337 (save-excursion
338 (goto-char (point-min))
339 (perform-replace "\n-- \n" "\n-- " nil nil nil)))
340(add-hook 'mail-setup-hook 'mdwmail-mangle-signature)
341(add-hook 'message-setup-hook 'mdwmail-mangle-signature)
342
6132bc01 343;; Insert my login name into message-ids, so I can score replies.
a3bdb4d9
MW
344
345(defadvice message-unique-id (after mdw-user-name last activate compile)
346 "Ensure that the user's name appears at the end of the message-id string,
347so that it can be used for convenient filtering."
348 (setq ad-return-value (concat ad-return-value "." (user-login-name))))
349
6132bc01 350;; Tell my movemail hack where movemail is.
a3bdb4d9
MW
351;;
352;; This is needed to shup up warnings about LD_PRELOAD.
353
354(let ((path exec-path))
355 (while path
356 (let ((try (expand-file-name "movemail" (car path))))
357 (if (file-executable-p try)
358 (setenv "REAL_MOVEMAIL" try))
359 (setq path (cdr path)))))
360
6132bc01
MW
361;;;--------------------------------------------------------------------------
362;;; Utility functions.
f617db13 363
b5d724dd
MW
364(or (fboundp 'line-number-at-pos)
365 (defun line-number-at-pos (&optional pos)
366 (let ((opoint (or pos (point))) start)
367 (save-excursion
368 (save-restriction
369 (goto-char (point-min))
370 (widen)
371 (forward-line 0)
372 (setq start (point))
373 (goto-char opoint)
374 (forward-line 0)
375 (1+ (count-lines 1 (point))))))))
459c9fb2 376
f617db13 377(defun mdw-uniquify-alist (&rest alists)
f617db13 378 "Return the concatenation of the ALISTS with duplicate elements removed.
6132bc01
MW
379The first association with a given key prevails; others are
380ignored. The input lists are not modified, although they'll
381probably become garbage."
f617db13
MW
382 (and alists
383 (let ((start-list (cons nil nil)))
384 (mdw-do-uniquify start-list
385 start-list
386 (car alists)
387 (cdr alists)))))
388
f617db13 389(defun mdw-do-uniquify (done end l rest)
6132bc01
MW
390 "A helper function for mdw-uniquify-alist.
391The DONE argument is a list whose first element is `nil'. It
392contains the uniquified alist built so far. The leading `nil' is
393stripped off at the end of the operation; it's only there so that
394DONE always references a cons cell. END refers to the final cons
395cell in the DONE list; it is modified in place each time to avoid
396the overheads of `append'ing all the time. The L argument is the
397alist we're currently processing; the remaining alists are given
398in REST."
399
400 ;; There are several different cases to deal with here.
f617db13
MW
401 (cond
402
6132bc01
MW
403 ;; Current list isn't empty. Add the first item to the DONE list if
404 ;; there's not an item with the same KEY already there.
f617db13
MW
405 (l (or (assoc (car (car l)) done)
406 (progn
407 (setcdr end (cons (car l) nil))
408 (setq end (cdr end))))
409 (mdw-do-uniquify done end (cdr l) rest))
410
6132bc01
MW
411 ;; The list we were working on is empty. Shunt the next list into the
412 ;; current list position and go round again.
f617db13
MW
413 (rest (mdw-do-uniquify done end (car rest) (cdr rest)))
414
6132bc01
MW
415 ;; Everything's done. Remove the leading `nil' from the DONE list and
416 ;; return it. Finished!
f617db13
MW
417 (t (cdr done))))
418
f617db13
MW
419(defun date ()
420 "Insert the current date in a pleasing way."
421 (interactive)
422 (insert (save-excursion
423 (let ((buffer (get-buffer-create "*tmp*")))
424 (unwind-protect (progn (set-buffer buffer)
425 (erase-buffer)
426 (shell-command "date +%Y-%m-%d" t)
427 (goto-char (mark))
428 (delete-backward-char 1)
429 (buffer-string))
430 (kill-buffer buffer))))))
431
f617db13
MW
432(defun uuencode (file &optional name)
433 "UUencodes a file, maybe calling it NAME, into the current buffer."
434 (interactive "fInput file name: ")
435
6132bc01 436 ;; If NAME isn't specified, then guess from the filename.
f617db13
MW
437 (if (not name)
438 (setq name
439 (substring file
440 (or (string-match "[^/]*$" file) 0))))
f617db13
MW
441 (print (format "uuencode `%s' `%s'" file name))
442
6132bc01 443 ;; Now actually do the thing.
f617db13
MW
444 (call-process "uuencode" file t nil name))
445
446(defvar np-file "~/.np"
447 "*Where the `now-playing' file is.")
448
449(defun np (&optional arg)
450 "Grabs a `now-playing' string."
451 (interactive)
452 (save-excursion
453 (or arg (progn
852cd5fb 454 (goto-char (point-max))
f617db13 455 (insert "\nNP: ")
daff679f 456 (insert-file-contents np-file)))))
f617db13 457
ae7460d4
MW
458(defun mdw-version-< (ver-a ver-b)
459 "Answer whether VER-A is strictly earlier than VER-B.
460VER-A and VER-B are version numbers, which are strings containing digit
461sequences separated by `.'."
462 (let* ((la (mapcar (lambda (x) (car (read-from-string x)))
463 (split-string ver-a "\\.")))
464 (lb (mapcar (lambda (x) (car (read-from-string x)))
465 (split-string ver-b "\\."))))
466 (catch 'done
467 (while t
468 (cond ((null la) (throw 'done lb))
469 ((null lb) (throw 'done nil))
470 ((< (car la) (car lb)) (throw 'done t))
471 ((= (car la) (car lb)) (setq la (cdr la) lb (cdr lb))))))))
472
c7a8da49 473(defun mdw-check-autorevert ()
6132bc01
MW
474 "Sets global-auto-revert-ignore-buffer appropriately for this buffer.
475This takes into consideration whether it's been found using
476tramp, which seems to get itself into a twist."
46e69f55
MW
477 (cond ((not (boundp 'global-auto-revert-ignore-buffer))
478 nil)
479 ((and (buffer-file-name)
480 (fboundp 'tramp-tramp-file-p)
c7a8da49
MW
481 (tramp-tramp-file-p (buffer-file-name)))
482 (unless global-auto-revert-ignore-buffer
483 (setq global-auto-revert-ignore-buffer 'tramp)))
484 ((eq global-auto-revert-ignore-buffer 'tramp)
485 (setq global-auto-revert-ignore-buffer nil))))
486
487(defadvice find-file (after mdw-autorevert activate)
488 (mdw-check-autorevert))
489(defadvice write-file (after mdw-autorevert activate)
4d9f2d65 490 (mdw-check-autorevert))
eae0aa6d 491
6132bc01
MW
492;;;--------------------------------------------------------------------------
493;;; Dired hacking.
5195cbc3
MW
494
495(defadvice dired-maybe-insert-subdir
496 (around mdw-marked-insertion first activate)
6132bc01
MW
497 "The DIRNAME may be a list of directory names to insert.
498Interactively, if files are marked, then insert all of them.
499With a numeric prefix argument, select that many entries near
500point; with a non-numeric prefix argument, prompt for listing
501options."
5195cbc3
MW
502 (interactive
503 (list (dired-get-marked-files nil
504 (and (integerp current-prefix-arg)
505 current-prefix-arg)
506 #'file-directory-p)
507 (and current-prefix-arg
508 (not (integerp current-prefix-arg))
509 (read-string "Switches for listing: "
510 (or dired-subdir-switches
511 dired-actual-switches)))))
512 (let ((dirs (ad-get-arg 0)))
513 (dolist (dir (if (listp dirs) dirs (list dirs)))
514 (ad-set-arg 0 dir)
515 ad-do-it)))
516
6132bc01
MW
517;;;--------------------------------------------------------------------------
518;;; URL viewing.
a203fba8
MW
519
520(defun mdw-w3m-browse-url (url &optional new-session-p)
521 "Invoke w3m on the URL in its current window, or at least a different one.
522If NEW-SESSION-P, start a new session."
523 (interactive "sURL: \nP")
524 (save-excursion
63fb20c1
MW
525 (let ((window (selected-window)))
526 (unwind-protect
527 (progn
528 (select-window (or (and (not new-session-p)
529 (get-buffer-window "*w3m*"))
530 (progn
531 (if (one-window-p t) (split-window))
532 (get-lru-window))))
533 (w3m-browse-url url new-session-p))
534 (select-window window)))))
a203fba8
MW
535
536(defvar mdw-good-url-browsers
ed5e20a5
MW
537 '(browse-url-generic
538 (w3m . mdw-w3m-browse-url)
a203fba8
MW
539 browse-url-w3
540 browse-url-mozilla)
6132bc01
MW
541 "List of good browsers for mdw-good-url-browsers.
542Each item is a browser function name, or a cons (CHECK . FUNC).
543A symbol FOO stands for (FOO . FOO).")
a203fba8
MW
544
545(defun mdw-good-url-browser ()
6132bc01
MW
546 "Return a good URL browser.
547Trundle the list of such things, finding the first item for which
548CHECK is fboundp, and returning the correponding FUNC."
a203fba8
MW
549 (let ((bs mdw-good-url-browsers) b check func answer)
550 (while (and bs (not answer))
551 (setq b (car bs)
552 bs (cdr bs))
553 (if (consp b)
554 (setq check (car b) func (cdr b))
555 (setq check b func b))
556 (if (fboundp check)
557 (setq answer func)))
558 answer))
559
f36cdb77
MW
560(eval-after-load "w3m-search"
561 '(progn
562 (dolist
563 (item
564 '(("g" "Google" "http://www.google.co.uk/search?q=%s")
565 ("gd" "Google Directory"
566 "http://www.google.com/search?cat=gwd/Top&q=%s")
567 ("gg" "Google Groups" "http://groups.google.com/groups?q=%s")
568 ("ward" "Ward's wiki" "http://c2.com/cgi/wiki?%s")
569 ("gi" "Images" "http://images.google.com/images?q=%s")
570 ("rfc" "RFC"
571 "http://metalzone.distorted.org.uk/ftp/pub/mirrors/rfc/rfc%s.txt.gz")
572 ("wp" "Wikipedia"
573 "http://en.wikipedia.org/wiki/Special:Search?go=Go&search=%s")
574 ("imdb" "IMDb" "http://www.imdb.com/Find?%s")
575 ("nc-wiki" "nCipher wiki"
576 "http://wiki.ncipher.com/wiki/bin/view/Devel/?topic=%s")
577 ("map" "Google maps" "http://maps.google.co.uk/maps?q=%s&hl=en")
578 ("lp" "Launchpad bug by number"
579 "https://bugs.launchpad.net/bugs/%s")
580 ("lppkg" "Launchpad bugs by package"
581 "https://bugs.launchpad.net/%s")
582 ("msdn" "MSDN"
583 "http://social.msdn.microsoft.com/Search/en-GB/?query=%s&ac=8")
584 ("debbug" "Debian bug by number"
585 "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%s")
586 ("debbugpkg" "Debian bugs by package"
587 "http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=%s")
588 ("ljlogin" "LJ login" "http://www.livejournal.com/login.bml")))
589 (add-to-list 'w3m-search-engine-alist
590 (list (cadr item) (caddr item) nil))
591 (add-to-list 'w3m-uri-replace-alist
592 (list (concat "\\`" (car item) ":")
593 'w3m-search-uri-replace
594 (cadr item))))))
595
6132bc01
MW
596;;;--------------------------------------------------------------------------
597;;; Paragraph filling.
f617db13 598
6132bc01 599;; Useful variables.
f617db13
MW
600
601(defvar mdw-fill-prefix nil
6132bc01
MW
602 "*Used by `mdw-line-prefix' and `mdw-fill-paragraph'.
603If there's no fill prefix currently set (by the `fill-prefix'
604variable) and there's a match from one of the regexps here, it
605gets used to set the fill-prefix for the current operation.
f617db13 606
6132bc01
MW
607The variable is a list of items of the form `REGEXP . PREFIX'; if
608the REGEXP matches, the PREFIX is used to set the fill prefix.
609It in turn is a list of things:
f617db13
MW
610
611 STRING -- insert a literal string
612 (match . N) -- insert the thing matched by bracketed subexpression N
613 (pad . N) -- a string of whitespace the same width as subexpression N
614 (expr . FORM) -- the result of evaluating FORM")
615
616(make-variable-buffer-local 'mdw-fill-prefix)
617
618(defvar mdw-hanging-indents
10fa2414 619 (concat "\\(\\("
f8bfe560 620 "\\([*o+]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)"
10fa2414
MW
621 "[ \t]+"
622 "\\)?\\)")
6132bc01
MW
623 "*Standard regexp matching parts of a hanging indent.
624This is mainly useful in `auto-fill-mode'.")
f617db13 625
6132bc01 626;; Setting things up.
f617db13
MW
627
628(fset 'mdw-do-auto-fill (symbol-function 'do-auto-fill))
629
6132bc01 630;; Utility functions.
f617db13
MW
631
632(defun mdw-tabify (s)
633 "Tabify the string S. This is a horrid hack."
634 (save-excursion
635 (save-match-data
636 (let (start end)
637 (beginning-of-line)
638 (setq start (point-marker))
639 (insert s "\n")
640 (setq end (point-marker))
641 (tabify start end)
642 (setq s (buffer-substring start (1- end)))
643 (delete-region start end)
644 (set-marker start nil)
645 (set-marker end nil)
646 s))))
647
648(defun mdw-examine-fill-prefixes (l)
6132bc01
MW
649 "Given a list of dynamic fill prefixes, pick one which matches
650context and return the static fill prefix to use. Point must be
651at the start of a line, and match data must be saved."
f617db13
MW
652 (cond ((not l) nil)
653 ((looking-at (car (car l)))
654 (mdw-tabify (apply (function concat)
655 (mapcar (function mdw-do-prefix-match)
656 (cdr (car l))))))
657 (t (mdw-examine-fill-prefixes (cdr l)))))
658
659(defun mdw-maybe-car (p)
660 "If P is a pair, return (car P), otherwise just return P."
661 (if (consp p) (car p) p))
662
663(defun mdw-padding (s)
664 "Return a string the same width as S but made entirely from whitespace."
665 (let* ((l (length s)) (i 0) (n (make-string l ? )))
666 (while (< i l)
667 (if (= 9 (aref s i))
668 (aset n i 9))
669 (setq i (1+ i)))
670 n))
671
672(defun mdw-do-prefix-match (m)
6132bc01
MW
673 "Expand a dynamic prefix match element.
674See `mdw-fill-prefix' for details."
f617db13
MW
675 (cond ((not (consp m)) (format "%s" m))
676 ((eq (car m) 'match) (match-string (mdw-maybe-car (cdr m))))
677 ((eq (car m) 'pad) (mdw-padding (match-string
678 (mdw-maybe-car (cdr m)))))
679 ((eq (car m) 'eval) (eval (cdr m)))
680 (t "")))
681
682(defun mdw-choose-dynamic-fill-prefix ()
683 "Work out the dynamic fill prefix based on the variable `mdw-fill-prefix'."
684 (cond ((and fill-prefix (not (string= fill-prefix ""))) fill-prefix)
685 ((not mdw-fill-prefix) fill-prefix)
686 (t (save-excursion
687 (beginning-of-line)
688 (save-match-data
689 (mdw-examine-fill-prefixes mdw-fill-prefix))))))
690
691(defun do-auto-fill ()
6132bc01
MW
692 "Handle auto-filling, working out a dynamic fill prefix in the
693case where there isn't a sensible static one."
f617db13
MW
694 (let ((fill-prefix (mdw-choose-dynamic-fill-prefix)))
695 (mdw-do-auto-fill)))
696
697(defun mdw-fill-paragraph ()
698 "Fill paragraph, getting a dynamic fill prefix."
699 (interactive)
700 (let ((fill-prefix (mdw-choose-dynamic-fill-prefix)))
701 (fill-paragraph nil)))
702
703(defun mdw-standard-fill-prefix (rx &optional mat)
704 "Set the dynamic fill prefix, handling standard hanging indents and stuff.
6132bc01
MW
705This is just a short-cut for setting the thing by hand, and by
706design it doesn't cope with anything approximating a complicated
707case."
f617db13
MW
708 (setq mdw-fill-prefix
709 `((,(concat rx mdw-hanging-indents)
710 (match . 1)
711 (pad . ,(or mat 2))))))
712
6132bc01
MW
713;;;--------------------------------------------------------------------------
714;;; Other common declarations.
f617db13 715
6132bc01 716;; Common mode settings.
f617db13
MW
717
718(defvar mdw-auto-indent t
719 "Whether to indent automatically after a newline.")
720
0e58a7c2
MW
721(defun mdw-whitespace-mode (&optional arg)
722 "Turn on/off whitespace mode, but don't highlight trailing space."
723 (interactive "P")
724 (when (and (boundp 'whitespace-style)
725 (fboundp 'whitespace-mode))
726 (let ((whitespace-style (remove 'trailing whitespace-style)))
558fc014
MW
727 (whitespace-mode arg))
728 (setq show-trailing-whitespace whitespace-mode)))
0e58a7c2 729
f617db13
MW
730(defun mdw-misc-mode-config ()
731 (and mdw-auto-indent
732 (cond ((eq major-mode 'lisp-mode)
733 (local-set-key "\C-m" 'mdw-indent-newline-and-indent))
30c8a8fb
MW
734 ((or (eq major-mode 'slime-repl-mode)
735 (eq major-mode 'asm-mode))
736 nil)
f617db13
MW
737 (t
738 (local-set-key "\C-m" 'newline-and-indent))))
739 (local-set-key [C-return] 'newline)
8a425bd7 740 (make-local-variable 'page-delimiter)
8cb7626b 741 (setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
f617db13
MW
742 (setq comment-column 40)
743 (auto-fill-mode 1)
744 (setq fill-column 77)
473ff3b0 745 (setq show-trailing-whitespace t)
0e58a7c2 746 (mdw-whitespace-mode 1)
253f61b4
MW
747 (and (fboundp 'gtags-mode)
748 (gtags-mode))
ddf6e116
MW
749 (if (fboundp 'hs-minor-mode)
750 (hs-minor-mode t)
751 (outline-minor-mode t))
49b2646e 752 (reveal-mode t)
1e7a9479 753 (trap (turn-on-font-lock)))
f617db13 754
ed7b46b9 755(defun mdw-post-config-mode-hack ()
0e58a7c2 756 (mdw-whitespace-mode 1))
ed7b46b9 757
253f61b4 758(eval-after-load 'gtags
506bada9
MW
759 '(progn
760 (dolist (key '([mouse-2] [mouse-3]))
761 (define-key gtags-mode-map key nil))
762 (define-key gtags-mode-map [C-S-mouse-2] 'gtags-find-tag-by-event)
763 (define-key gtags-select-mode-map [C-S-mouse-2]
764 'gtags-select-tag-by-event)
765 (dolist (map (list gtags-mode-map gtags-select-mode-map))
766 (define-key map [C-S-mouse-3] 'gtags-pop-stack))))
253f61b4 767
6132bc01 768;; Backup file handling.
2ae647c4
MW
769
770(defvar mdw-backup-disable-regexps nil
6132bc01
MW
771 "*List of regular expressions: if a file name matches any of
772these then the file is not backed up.")
2ae647c4
MW
773
774(defun mdw-backup-enable-predicate (name)
6132bc01
MW
775 "[mdw]'s default backup predicate.
776Allows a backup if the standard predicate would allow it, and it
777doesn't match any of the regular expressions in
778`mdw-backup-disable-regexps'."
2ae647c4
MW
779 (and (normal-backup-enable-predicate name)
780 (let ((answer t) (list mdw-backup-disable-regexps))
781 (save-match-data
782 (while list
783 (if (string-match (car list) name)
784 (setq answer nil))
785 (setq list (cdr list)))
786 answer))))
787(setq backup-enable-predicate 'mdw-backup-enable-predicate)
788
7bb78c67
MW
789;; Frame cleanup.
790
791(defun mdw-last-one-out-turn-off-the-lights (frame)
792 "Disconnect from an X display if this was the last frame on that display."
793 (let ((frame-display (frame-parameter frame 'display)))
794 (when (and frame-display
795 (eq window-system 'x)
796 (not (some (lambda (fr)
7bb78c67 797 (and (not (eq fr frame))
a04d8f3d 798 (string= (frame-parameter fr 'display)
d70716b5 799 frame-display)))
7bb78c67 800 (frame-list))))
7bb78c67
MW
801 (run-with-idle-timer 0 nil #'x-close-connection frame-display))))
802(add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
803
6132bc01
MW
804;;;--------------------------------------------------------------------------
805;;; General fontification.
f617db13 806
1e7a9479
MW
807(defmacro mdw-define-face (name &rest body)
808 "Define a face, and make sure it's actually set as the definition."
809 (declare (indent 1)
810 (debug 0))
811 `(progn
812 (make-face ',name)
813 (defvar ,name ',name)
814 (put ',name 'face-defface-spec ',body)
88cb9c2b 815 (face-spec-set ',name ',body nil)))
1e7a9479
MW
816
817(mdw-define-face default
818 (((type w32)) :family "courier new" :height 85)
819 (((type x)) :family "6x13" :height 130)
db10ce0a
MW
820 (((type color)) :foreground "white" :background "black")
821 (t nil))
1e7a9479
MW
822(mdw-define-face fixed-pitch
823 (((type w32)) :family "courier new" :height 85)
824 (((type x)) :family "6x13" :height 130)
825 (t :foreground "white" :background "black"))
c383eb8a
MW
826(if (>= emacs-major-version 23)
827 (mdw-define-face variable-pitch
828 (((type x)) :family "sans" :height 100))
829 (mdw-define-face variable-pitch
3f001ff6 830 (((type x)) :family "helvetica" :height 90)))
1e7a9479 831(mdw-define-face region
db10ce0a
MW
832 (((type tty) (class color)) :background "blue")
833 (((type tty) (class mono)) :inverse-video t)
834 (t :background "grey30"))
1e7a9479
MW
835(mdw-define-face minibuffer-prompt
836 (t :weight bold))
837(mdw-define-face mode-line
db10ce0a
MW
838 (((class color)) :foreground "blue" :background "yellow"
839 :box (:line-width 1 :style released-button))
840 (t :inverse-video t))
1e7a9479 841(mdw-define-face mode-line-inactive
db10ce0a
MW
842 (((class color)) :foreground "yellow" :background "blue"
843 :box (:line-width 1 :style released-button))
844 (t :inverse-video t))
1e7a9479
MW
845(mdw-define-face scroll-bar
846 (t :foreground "black" :background "lightgrey"))
847(mdw-define-face fringe
848 (t :foreground "yellow"))
c383eb8a 849(mdw-define-face show-paren-match
db10ce0a
MW
850 (((class color)) :background "darkgreen")
851 (t :underline t))
c383eb8a 852(mdw-define-face show-paren-mismatch
db10ce0a
MW
853 (((class color)) :background "red")
854 (t :inverse-video t))
1e7a9479 855(mdw-define-face highlight
db10ce0a
MW
856 (((class color)) :background "DarkSeaGreen4")
857 (t :inverse-video t))
1e7a9479
MW
858
859(mdw-define-face holiday-face
860 (t :background "red"))
861(mdw-define-face calendar-today-face
862 (t :foreground "yellow" :weight bold))
863
864(mdw-define-face comint-highlight-prompt
865 (t :weight bold))
5fd055c2
MW
866(mdw-define-face comint-highlight-input
867 (t nil))
1e7a9479
MW
868
869(mdw-define-face trailing-whitespace
db10ce0a
MW
870 (((class color)) :background "red")
871 (t :inverse-video t))
1e7a9479
MW
872(mdw-define-face mdw-punct-face
873 (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
874(mdw-define-face mdw-number-face
875 (t :foreground "yellow"))
876(mdw-define-face font-lock-function-name-face
c383eb8a 877 (t :slant italic))
1e7a9479
MW
878(mdw-define-face font-lock-keyword-face
879 (t :weight bold))
880(mdw-define-face font-lock-constant-face
881 (t :slant italic))
882(mdw-define-face font-lock-builtin-face
883 (t :weight bold))
07965a39
MW
884(mdw-define-face font-lock-type-face
885 (t :weight bold :slant italic))
1e7a9479
MW
886(mdw-define-face font-lock-reference-face
887 (t :weight bold))
888(mdw-define-face font-lock-variable-name-face
889 (t :slant italic))
890(mdw-define-face font-lock-comment-delimiter-face
db10ce0a
MW
891 (((class mono)) :weight bold)
892 (((type tty) (class color)) :foreground "green")
893 (t :slant italic :foreground "SeaGreen1"))
1e7a9479 894(mdw-define-face font-lock-comment-face
db10ce0a
MW
895 (((class mono)) :weight bold)
896 (((type tty) (class color)) :foreground "green")
897 (t :slant italic :foreground "SeaGreen1"))
1e7a9479 898(mdw-define-face font-lock-string-face
db10ce0a
MW
899 (((class mono)) :weight bold)
900 (((class color)) :foreground "SkyBlue1"))
1e7a9479
MW
901(mdw-define-face message-separator
902 (t :background "red" :foreground "white" :weight bold))
903(mdw-define-face message-cited-text
904 (default :slant italic)
905 (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
906(mdw-define-face message-header-cc
907 (default :weight bold)
908 (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
909(mdw-define-face message-header-newsgroups
910 (default :weight bold)
911 (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
912(mdw-define-face message-header-subject
913 (default :weight bold)
914 (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
915(mdw-define-face message-header-to
916 (default :weight bold)
917 (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
918(mdw-define-face message-header-xheader
919 (default :weight bold)
920 (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
921(mdw-define-face message-header-other
922 (default :weight bold)
923 (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
924(mdw-define-face message-header-name
925 (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
69498691
MW
926(mdw-define-face which-func
927 (t nil))
1e7a9479
MW
928
929(mdw-define-face diff-index
930 (t :weight bold))
931(mdw-define-face diff-file-header
932 (t :weight bold))
933(mdw-define-face diff-hunk-header
934 (t :foreground "SkyBlue1"))
935(mdw-define-face diff-function
936 (t :foreground "SkyBlue1" :weight bold))
937(mdw-define-face diff-header
938 (t :background "grey10"))
939(mdw-define-face diff-added
940 (t :foreground "green"))
941(mdw-define-face diff-removed
942 (t :foreground "red"))
5fd055c2
MW
943(mdw-define-face diff-context
944 (t nil))
1e7a9479 945
e1b8de18
MW
946(mdw-define-face erc-input-face
947 (t :foreground "red"))
948
1e7a9479
MW
949(mdw-define-face woman-bold
950 (t :weight bold))
951(mdw-define-face woman-italic
952 (t :slant italic))
953
954(mdw-define-face p4-depot-added-face
955 (t :foreground "green"))
956(mdw-define-face p4-depot-branch-op-face
957 (t :foreground "yellow"))
958(mdw-define-face p4-depot-deleted-face
959 (t :foreground "red"))
960(mdw-define-face p4-depot-unmapped-face
961 (t :foreground "SkyBlue1"))
962(mdw-define-face p4-diff-change-face
963 (t :foreground "yellow"))
964(mdw-define-face p4-diff-del-face
965 (t :foreground "red"))
966(mdw-define-face p4-diff-file-face
967 (t :foreground "SkyBlue1"))
968(mdw-define-face p4-diff-head-face
969 (t :background "grey10"))
970(mdw-define-face p4-diff-ins-face
971 (t :foreground "green"))
972
973(mdw-define-face whizzy-slice-face
974 (t :background "grey10"))
975(mdw-define-face whizzy-error-face
976 (t :background "darkred"))
f617db13 977
6132bc01
MW
978;;;--------------------------------------------------------------------------
979;;; C programming configuration.
f617db13 980
6132bc01 981;; Linux kernel hacking.
f617db13
MW
982
983(defvar linux-c-mode-hook)
984
985(defun linux-c-mode ()
986 (interactive)
987 (c-mode)
988 (setq major-mode 'linux-c-mode)
989 (setq mode-name "Linux C")
990 (run-hooks 'linux-c-mode-hook))
991
6132bc01 992;; Make C indentation nice.
f617db13 993
f50c1bed
MW
994(defun mdw-c-lineup-arglist (langelem)
995 "Hack for DWIMmery in c-lineup-arglist."
996 (if (save-excursion
997 (c-block-in-arglist-dwim (c-langelem-2nd-pos c-syntactic-element)))
998 0
999 (c-lineup-arglist langelem)))
1000
1001(defun mdw-c-indent-extern-mumble (langelem)
1002 "Indent `extern \"...\" {' lines."
1003 (save-excursion
1004 (back-to-indentation)
1005 (if (looking-at
1006 "\\s-*\\<extern\\>\\s-*\"\\([^\\\\\"]+\\|\\.\\)*\"\\s-*{")
1007 c-basic-offset
1008 nil)))
1009
f617db13
MW
1010(defun mdw-c-style ()
1011 (c-add-style "[mdw] C and C++ style"
1012 '((c-basic-offset . 2)
f617db13
MW
1013 (comment-column . 40)
1014 (c-class-key . "class")
f50c1bed
MW
1015 (c-backslash-column . 72)
1016 (c-offsets-alist
1017 (substatement-open . (add 0 c-indent-one-line-block))
1018 (defun-open . (add 0 c-indent-one-line-block))
1019 (arglist-cont-nonempty . mdw-c-lineup-arglist)
1020 (topmost-intro . mdw-c-indent-extern-mumble)
1021 (cpp-define-intro . 0)
1022 (inextern-lang . [0])
1023 (label . 0)
1024 (case-label . +)
1025 (access-label . -)
1026 (inclass . +)
1027 (inline-open . ++)
1028 (statement-cont . 0)
1029 (statement-case-intro . +)))
f617db13
MW
1030 t))
1031
0e7d960b
MW
1032(defvar mdw-c-comment-fill-prefix
1033 `((,(concat "\\([ \t]*/?\\)"
1034 "\\(\*\\|//]\\)"
1035 "\\([ \t]*\\)"
1036 "\\([A-Za-z]+:[ \t]*\\)?"
1037 mdw-hanging-indents)
1038 (pad . 1) (match . 2) (pad . 3) (pad . 4) (pad . 5)))
1039 "Fill prefix matching C comments (both kinds).")
1040
f617db13
MW
1041(defun mdw-fontify-c-and-c++ ()
1042
6132bc01 1043 ;; Fiddle with some syntax codes.
f617db13
MW
1044 (modify-syntax-entry ?* ". 23")
1045 (modify-syntax-entry ?/ ". 124b")
1046 (modify-syntax-entry ?\n "> b")
1047
6132bc01 1048 ;; Other stuff.
f617db13
MW
1049 (mdw-c-style)
1050 (setq c-hanging-comment-ender-p nil)
1051 (setq c-backslash-column 72)
1052 (setq c-label-minimum-indentation 0)
0e7d960b 1053 (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
f617db13 1054
6132bc01 1055 ;; Now define things to be fontified.
02109a0d 1056 (make-local-variable 'font-lock-keywords)
f617db13 1057 (let ((c-keywords
8d6d55b9
MW
1058 (mdw-regexps "and" ;C++
1059 "and_eq" ;C++
1060 "asm" ;K&R, GCC
1061 "auto" ;K&R, C89
1062 "bitand" ;C++
1063 "bitor" ;C++
1064 "bool" ;C++, C9X macro
1065 "break" ;K&R, C89
1066 "case" ;K&R, C89
1067 "catch" ;C++
1068 "char" ;K&R, C89
1069 "class" ;C++
1070 "complex" ;C9X macro, C++ template type
1071 "compl" ;C++
1072 "const" ;C89
1073 "const_cast" ;C++
1074 "continue" ;K&R, C89
1075 "defined" ;C89 preprocessor
1076 "default" ;K&R, C89
1077 "delete" ;C++
1078 "do" ;K&R, C89
1079 "double" ;K&R, C89
1080 "dynamic_cast" ;C++
1081 "else" ;K&R, C89
1082 ;; "entry" ;K&R -- never used
1083 "enum" ;C89
1084 "explicit" ;C++
1085 "export" ;C++
1086 "extern" ;K&R, C89
1087 "false" ;C++, C9X macro
1088 "float" ;K&R, C89
1089 "for" ;K&R, C89
1090 ;; "fortran" ;K&R
1091 "friend" ;C++
1092 "goto" ;K&R, C89
1093 "if" ;K&R, C89
1094 "imaginary" ;C9X macro
1095 "inline" ;C++, C9X, GCC
1096 "int" ;K&R, C89
1097 "long" ;K&R, C89
1098 "mutable" ;C++
1099 "namespace" ;C++
1100 "new" ;C++
1101 "operator" ;C++
1102 "or" ;C++
1103 "or_eq" ;C++
1104 "private" ;C++
1105 "protected" ;C++
1106 "public" ;C++
1107 "register" ;K&R, C89
1108 "reinterpret_cast" ;C++
1109 "restrict" ;C9X
1110 "return" ;K&R, C89
1111 "short" ;K&R, C89
1112 "signed" ;C89
1113 "sizeof" ;K&R, C89
1114 "static" ;K&R, C89
1115 "static_cast" ;C++
1116 "struct" ;K&R, C89
1117 "switch" ;K&R, C89
1118 "template" ;C++
1119 "this" ;C++
1120 "throw" ;C++
1121 "true" ;C++, C9X macro
1122 "try" ;C++
1123 "this" ;C++
1124 "typedef" ;C89
1125 "typeid" ;C++
1126 "typeof" ;GCC
1127 "typename" ;C++
1128 "union" ;K&R, C89
1129 "unsigned" ;K&R, C89
1130 "using" ;C++
1131 "virtual" ;C++
1132 "void" ;C89
1133 "volatile" ;C89
1134 "wchar_t" ;C++, C89 library type
1135 "while" ;K&R, C89
1136 "xor" ;C++
1137 "xor_eq" ;C++
1138 "_Bool" ;C9X
1139 "_Complex" ;C9X
1140 "_Imaginary" ;C9X
1141 "_Pragma" ;C9X preprocessor
1142 "__alignof__" ;GCC
1143 "__asm__" ;GCC
1144 "__attribute__" ;GCC
1145 "__complex__" ;GCC
1146 "__const__" ;GCC
1147 "__extension__" ;GCC
1148 "__imag__" ;GCC
1149 "__inline__" ;GCC
1150 "__label__" ;GCC
1151 "__real__" ;GCC
1152 "__signed__" ;GCC
1153 "__typeof__" ;GCC
1154 "__volatile__" ;GCC
1155 ))
f617db13 1156 (preprocessor-keywords
8d6d55b9
MW
1157 (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
1158 "ident" "if" "ifdef" "ifndef" "import" "include"
1159 "line" "pragma" "unassert" "undef" "warning"))
f617db13 1160 (objc-keywords
8d6d55b9
MW
1161 (mdw-regexps "class" "defs" "encode" "end" "implementation"
1162 "interface" "private" "protected" "protocol" "public"
1163 "selector")))
f617db13
MW
1164
1165 (setq font-lock-keywords
1166 (list
f617db13 1167
6132bc01 1168 ;; Fontify include files as strings.
f617db13
MW
1169 (list (concat "^[ \t]*\\#[ \t]*"
1170 "\\(include\\|import\\)"
1171 "[ \t]*\\(<[^>]+\\(>\\|\\)\\)")
1172 '(2 font-lock-string-face))
1173
6132bc01 1174 ;; Preprocessor directives are `references'?.
f617db13
MW
1175 (list (concat "^\\([ \t]*#[ \t]*\\(\\("
1176 preprocessor-keywords
1177 "\\)\\>\\|[0-9]+\\|$\\)\\)")
1178 '(1 font-lock-keyword-face))
1179
6132bc01 1180 ;; Handle the keywords defined above.
f617db13
MW
1181 (list (concat "@\\<\\(" objc-keywords "\\)\\>")
1182 '(0 font-lock-keyword-face))
1183
1184 (list (concat "\\<\\(" c-keywords "\\)\\>")
1185 '(0 font-lock-keyword-face))
1186
6132bc01 1187 ;; Handle numbers too.
f617db13
MW
1188 ;;
1189 ;; This looks strange, I know. It corresponds to the
1190 ;; preprocessor's idea of what a number looks like, rather than
1191 ;; anything sensible.
f617db13
MW
1192 (list (concat "\\(\\<[0-9]\\|\\.[0-9]\\)"
1193 "\\([Ee][+-]\\|[0-9A-Za-z_.]\\)*")
1194 '(0 mdw-number-face))
1195
6132bc01 1196 ;; And anything else is punctuation.
f617db13 1197 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1198 '(0 mdw-punct-face))))
1199
1200 (mdw-post-config-mode-hack)))
f617db13 1201
6132bc01
MW
1202;;;--------------------------------------------------------------------------
1203;;; AP calc mode.
f617db13
MW
1204
1205(defun apcalc-mode ()
1206 (interactive)
1207 (c-mode)
1208 (setq major-mode 'apcalc-mode)
1209 (setq mode-name "AP Calc")
1210 (run-hooks 'apcalc-mode-hook))
1211
1212(defun mdw-fontify-apcalc ()
1213
6132bc01 1214 ;; Fiddle with some syntax codes.
f617db13
MW
1215 (modify-syntax-entry ?* ". 23")
1216 (modify-syntax-entry ?/ ". 14")
1217
6132bc01 1218 ;; Other stuff.
f617db13
MW
1219 (mdw-c-style)
1220 (setq c-hanging-comment-ender-p nil)
1221 (setq c-backslash-column 72)
1222 (setq comment-start "/* ")
1223 (setq comment-end " */")
0e7d960b 1224 (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
f617db13 1225
6132bc01 1226 ;; Now define things to be fontified.
02109a0d 1227 (make-local-variable 'font-lock-keywords)
f617db13 1228 (let ((c-keywords
8d6d55b9
MW
1229 (mdw-regexps "break" "case" "cd" "continue" "define" "default"
1230 "do" "else" "exit" "for" "global" "goto" "help" "if"
1231 "local" "mat" "obj" "print" "quit" "read" "return"
1232 "show" "static" "switch" "while" "write")))
f617db13
MW
1233
1234 (setq font-lock-keywords
1235 (list
f617db13 1236
6132bc01 1237 ;; Handle the keywords defined above.
f617db13
MW
1238 (list (concat "\\<\\(" c-keywords "\\)\\>")
1239 '(0 font-lock-keyword-face))
1240
6132bc01 1241 ;; Handle numbers too.
f617db13
MW
1242 ;;
1243 ;; This looks strange, I know. It corresponds to the
1244 ;; preprocessor's idea of what a number looks like, rather than
1245 ;; anything sensible.
f617db13
MW
1246 (list (concat "\\(\\<[0-9]\\|\\.[0-9]\\)"
1247 "\\([Ee][+-]\\|[0-9A-Za-z_.]\\)*")
1248 '(0 mdw-number-face))
1249
6132bc01 1250 ;; And anything else is punctuation.
f617db13 1251 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1252 '(0 mdw-punct-face)))))
1253
1254 (mdw-post-config-mode-hack))
f617db13 1255
6132bc01
MW
1256;;;--------------------------------------------------------------------------
1257;;; Java programming configuration.
f617db13 1258
6132bc01 1259;; Make indentation nice.
f617db13
MW
1260
1261(defun mdw-java-style ()
1262 (c-add-style "[mdw] Java style"
1263 '((c-basic-offset . 2)
f617db13
MW
1264 (c-offsets-alist (substatement-open . 0)
1265 (label . +)
1266 (case-label . +)
1267 (access-label . 0)
1268 (inclass . +)
1269 (statement-case-intro . +)))
1270 t))
1271
6132bc01 1272;; Declare Java fontification style.
f617db13
MW
1273
1274(defun mdw-fontify-java ()
1275
6132bc01 1276 ;; Other stuff.
f617db13 1277 (mdw-java-style)
f617db13
MW
1278 (setq c-hanging-comment-ender-p nil)
1279 (setq c-backslash-column 72)
0e7d960b 1280 (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
f617db13 1281
6132bc01 1282 ;; Now define things to be fontified.
02109a0d 1283 (make-local-variable 'font-lock-keywords)
f617db13 1284 (let ((java-keywords
8d6d55b9
MW
1285 (mdw-regexps "abstract" "boolean" "break" "byte" "case" "catch"
1286 "char" "class" "const" "continue" "default" "do"
1287 "double" "else" "extends" "final" "finally" "float"
1288 "for" "goto" "if" "implements" "import" "instanceof"
1289 "int" "interface" "long" "native" "new" "package"
1290 "private" "protected" "public" "return" "short"
1291 "static" "super" "switch" "synchronized" "this"
1292 "throw" "throws" "transient" "try" "void" "volatile"
1293 "while"
1294
1295 "false" "null" "true")))
f617db13
MW
1296
1297 (setq font-lock-keywords
1298 (list
f617db13 1299
6132bc01 1300 ;; Handle the keywords defined above.
f617db13
MW
1301 (list (concat "\\<\\(" java-keywords "\\)\\>")
1302 '(0 font-lock-keyword-face))
1303
6132bc01 1304 ;; Handle numbers too.
f617db13
MW
1305 ;;
1306 ;; The following isn't quite right, but it's close enough.
f617db13
MW
1307 (list (concat "\\<\\("
1308 "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
1309 "[0-9]+\\(\\.[0-9]*\\|\\)"
1310 "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
1311 "[lLfFdD]?")
1312 '(0 mdw-number-face))
1313
6132bc01 1314 ;; And anything else is punctuation.
f617db13 1315 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1316 '(0 mdw-punct-face)))))
1317
1318 (mdw-post-config-mode-hack))
f617db13 1319
6132bc01
MW
1320;;;--------------------------------------------------------------------------
1321;;; C# programming configuration.
e808c1e5 1322
6132bc01 1323;; Make indentation nice.
e808c1e5
MW
1324
1325(defun mdw-csharp-style ()
1326 (c-add-style "[mdw] C# style"
1327 '((c-basic-offset . 2)
e808c1e5
MW
1328 (c-offsets-alist (substatement-open . 0)
1329 (label . 0)
1330 (case-label . +)
1331 (access-label . 0)
1332 (inclass . +)
1333 (statement-case-intro . +)))
1334 t))
1335
6132bc01 1336;; Declare C# fontification style.
e808c1e5
MW
1337
1338(defun mdw-fontify-csharp ()
1339
6132bc01 1340 ;; Other stuff.
e808c1e5 1341 (mdw-csharp-style)
e808c1e5
MW
1342 (setq c-hanging-comment-ender-p nil)
1343 (setq c-backslash-column 72)
0e7d960b 1344 (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
e808c1e5 1345
6132bc01 1346 ;; Now define things to be fontified.
e808c1e5
MW
1347 (make-local-variable 'font-lock-keywords)
1348 (let ((csharp-keywords
8d6d55b9
MW
1349 (mdw-regexps "abstract" "as" "base" "bool" "break"
1350 "byte" "case" "catch" "char" "checked"
1351 "class" "const" "continue" "decimal" "default"
1352 "delegate" "do" "double" "else" "enum"
1353 "event" "explicit" "extern" "false" "finally"
1354 "fixed" "float" "for" "foreach" "goto"
1355 "if" "implicit" "in" "int" "interface"
1356 "internal" "is" "lock" "long" "namespace"
1357 "new" "null" "object" "operator" "out"
1358 "override" "params" "private" "protected" "public"
1359 "readonly" "ref" "return" "sbyte" "sealed"
1360 "short" "sizeof" "stackalloc" "static" "string"
1361 "struct" "switch" "this" "throw" "true"
1362 "try" "typeof" "uint" "ulong" "unchecked"
1363 "unsafe" "ushort" "using" "virtual" "void"
1364 "volatile" "while" "yield")))
e808c1e5
MW
1365
1366 (setq font-lock-keywords
1367 (list
e808c1e5 1368
6132bc01 1369 ;; Handle the keywords defined above.
e808c1e5
MW
1370 (list (concat "\\<\\(" csharp-keywords "\\)\\>")
1371 '(0 font-lock-keyword-face))
1372
6132bc01 1373 ;; Handle numbers too.
e808c1e5
MW
1374 ;;
1375 ;; The following isn't quite right, but it's close enough.
e808c1e5
MW
1376 (list (concat "\\<\\("
1377 "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
1378 "[0-9]+\\(\\.[0-9]*\\|\\)"
1379 "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
1380 "[lLfFdD]?")
1381 '(0 mdw-number-face))
1382
6132bc01 1383 ;; And anything else is punctuation.
e808c1e5 1384 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1385 '(0 mdw-punct-face)))))
1386
1387 (mdw-post-config-mode-hack))
e808c1e5 1388
103c5923
MW
1389(define-derived-mode csharp-mode java-mode "C#"
1390 "Major mode for editing C# code.")
e808c1e5 1391
6132bc01 1392;;;--------------------------------------------------------------------------
07965a39
MW
1393;;; Go programming configuration.
1394
1395(defun mdw-fontify-go ()
1396
1397 (make-local-variable 'font-lock-keywords)
1398 (let ((go-keywords
1399 (mdw-regexps "break" "case" "chan" "const" "continue"
1400 "default" "defer" "else" "fallthrough" "for"
1401 "func" "go" "goto" "if" "import"
1402 "interface" "map" "package" "range" "return"
1403 "select" "struct" "switch" "type" "var")))
1404
1405 (setq font-lock-keywords
1406 (list
1407
1408 ;; Handle the keywords defined above.
1409 (list (concat "\\<\\(" go-keywords "\\)\\>")
1410 '(0 font-lock-keyword-face))
1411
1412 ;; Handle numbers too.
1413 ;;
1414 ;; The following isn't quite right, but it's close enough.
1415 (list (concat "\\<\\("
1416 "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
1417 "[0-9]+\\(\\.[0-9]*\\|\\)"
1418 "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)")
1419 '(0 mdw-number-face))
1420
1421 ;; And anything else is punctuation.
1422 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1423 '(0 mdw-punct-face)))))
1424
1425 (mdw-post-config-mode-hack))
07965a39
MW
1426
1427;;;--------------------------------------------------------------------------
6132bc01 1428;;; Awk programming configuration.
f617db13 1429
6132bc01 1430;; Make Awk indentation nice.
f617db13
MW
1431
1432(defun mdw-awk-style ()
1433 (c-add-style "[mdw] Awk style"
1434 '((c-basic-offset . 2)
f617db13
MW
1435 (c-offsets-alist (substatement-open . 0)
1436 (statement-cont . 0)
1437 (statement-case-intro . +)))
1438 t))
1439
6132bc01 1440;; Declare Awk fontification style.
f617db13
MW
1441
1442(defun mdw-fontify-awk ()
1443
6132bc01 1444 ;; Miscellaneous fiddling.
f617db13
MW
1445 (mdw-awk-style)
1446 (setq c-backslash-column 72)
1447 (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
1448
6132bc01 1449 ;; Now define things to be fontified.
02109a0d 1450 (make-local-variable 'font-lock-keywords)
f617db13 1451 (let ((c-keywords
8d6d55b9
MW
1452 (mdw-regexps "BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
1453 "ENVIRON" "ERRNO" "FIELDWIDTHS" "FILENAME" "FNR"
1454 "FS" "IGNORECASE" "NF" "NR" "OFMT" "OFS" "ORS" "RS"
1455 "RSTART" "RLENGTH" "RT" "SUBSEP"
1456 "atan2" "break" "close" "continue" "cos" "delete"
1457 "do" "else" "exit" "exp" "fflush" "file" "for" "func"
1458 "function" "gensub" "getline" "gsub" "if" "in"
1459 "index" "int" "length" "log" "match" "next" "rand"
1460 "return" "print" "printf" "sin" "split" "sprintf"
1461 "sqrt" "srand" "strftime" "sub" "substr" "system"
1462 "systime" "tolower" "toupper" "while")))
f617db13
MW
1463
1464 (setq font-lock-keywords
1465 (list
f617db13 1466
6132bc01 1467 ;; Handle the keywords defined above.
f617db13
MW
1468 (list (concat "\\<\\(" c-keywords "\\)\\>")
1469 '(0 font-lock-keyword-face))
1470
6132bc01 1471 ;; Handle numbers too.
f617db13
MW
1472 ;;
1473 ;; The following isn't quite right, but it's close enough.
f617db13
MW
1474 (list (concat "\\<\\("
1475 "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
1476 "[0-9]+\\(\\.[0-9]*\\|\\)"
1477 "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
1478 "[uUlL]*")
1479 '(0 mdw-number-face))
1480
6132bc01 1481 ;; And anything else is punctuation.
f617db13 1482 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1483 '(0 mdw-punct-face)))))
1484
1485 (mdw-post-config-mode-hack))
f617db13 1486
6132bc01
MW
1487;;;--------------------------------------------------------------------------
1488;;; Perl programming style.
f617db13 1489
6132bc01 1490;; Perl indentation style.
f617db13 1491
f617db13
MW
1492(setq cperl-indent-level 2)
1493(setq cperl-continued-statement-offset 2)
1494(setq cperl-continued-brace-offset 0)
1495(setq cperl-brace-offset -2)
1496(setq cperl-brace-imaginary-offset 0)
1497(setq cperl-label-offset 0)
1498
6132bc01 1499;; Define perl fontification style.
f617db13
MW
1500
1501(defun mdw-fontify-perl ()
1502
6132bc01 1503 ;; Miscellaneous fiddling.
f617db13
MW
1504 (modify-syntax-entry ?$ "\\")
1505 (modify-syntax-entry ?$ "\\" font-lock-syntax-table)
1506 (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
1507
6132bc01 1508 ;; Now define fontification things.
02109a0d 1509 (make-local-variable 'font-lock-keywords)
f617db13 1510 (let ((perl-keywords
8d6d55b9
MW
1511 (mdw-regexps "and" "cmp" "continue" "do" "else" "elsif" "eq"
1512 "for" "foreach" "ge" "gt" "goto" "if"
1513 "last" "le" "lt" "local" "my" "ne" "next" "or"
1514 "package" "redo" "require" "return" "sub"
1515 "undef" "unless" "until" "use" "while")))
f617db13
MW
1516
1517 (setq font-lock-keywords
1518 (list
f617db13 1519
6132bc01 1520 ;; Set up the keywords defined above.
f617db13
MW
1521 (list (concat "\\<\\(" perl-keywords "\\)\\>")
1522 '(0 font-lock-keyword-face))
1523
6132bc01 1524 ;; At least numbers are simpler than C.
f617db13
MW
1525 (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
1526 "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
1527 "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
1528 '(0 mdw-number-face))
1529
6132bc01 1530 ;; And anything else is punctuation.
f617db13 1531 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1532 '(0 mdw-punct-face)))))
1533
1534 (mdw-post-config-mode-hack))
f617db13
MW
1535
1536(defun perl-number-tests (&optional arg)
1537 "Assign consecutive numbers to lines containing `#t'. With ARG,
1538strip numbers instead."
1539 (interactive "P")
1540 (save-excursion
1541 (goto-char (point-min))
1542 (let ((i 0) (fmt (if arg "" " %4d")))
1543 (while (search-forward "#t" nil t)
1544 (delete-region (point) (line-end-position))
1545 (setq i (1+ i))
1546 (insert (format fmt i)))
1547 (goto-char (point-min))
1548 (if (re-search-forward "\\(tests\\s-*=>\\s-*\\)\\w*" nil t)
1549 (replace-match (format "\\1%d" i))))))
1550
6132bc01
MW
1551;;;--------------------------------------------------------------------------
1552;;; Python programming style.
f617db13 1553
99fe6ef5 1554(defun mdw-fontify-pythonic (keywords)
f617db13 1555
6132bc01 1556 ;; Miscellaneous fiddling.
f617db13 1557 (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
7c0fcfde 1558 (setq indent-tabs-mode nil)
f617db13 1559
6132bc01 1560 ;; Now define fontification things.
02109a0d 1561 (make-local-variable 'font-lock-keywords)
99fe6ef5
MW
1562 (setq font-lock-keywords
1563 (list
f617db13 1564
be2cc788 1565 ;; Set up the keywords defined above.
29826b11 1566 (list (concat "\\<\\(" keywords "\\)\\>")
99fe6ef5 1567 '(0 font-lock-keyword-face))
f617db13 1568
be2cc788 1569 ;; At least numbers are simpler than C.
99fe6ef5
MW
1570 (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
1571 "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
1572 "\\([eE]\\([-+]\\|\\)[0-9_]+\\|[lL]\\|\\)")
1573 '(0 mdw-number-face))
f617db13 1574
be2cc788 1575 ;; And anything else is punctuation.
99fe6ef5 1576 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1577 '(0 mdw-punct-face))))
1578
1579 (mdw-post-config-mode-hack))
99fe6ef5 1580
be2cc788 1581;; Define Python fontification styles.
99fe6ef5
MW
1582
1583(defun mdw-fontify-python ()
1584 (mdw-fontify-pythonic
1585 (mdw-regexps "and" "as" "assert" "break" "class" "continue" "def"
1586 "del" "elif" "else" "except" "exec" "finally" "for"
1587 "from" "global" "if" "import" "in" "is" "lambda"
1588 "not" "or" "pass" "print" "raise" "return" "try"
1589 "while" "with" "yield")))
1590
1591(defun mdw-fontify-pyrex ()
1592 (mdw-fontify-pythonic
1593 (mdw-regexps "and" "as" "assert" "break" "cdef" "class" "continue"
1594 "ctypedef" "def" "del" "elif" "else" "except" "exec"
1595 "extern" "finally" "for" "from" "global" "if"
1596 "import" "in" "is" "lambda" "not" "or" "pass" "print"
1597 "raise" "return" "struct" "try" "while" "with"
1598 "yield")))
f617db13 1599
6132bc01
MW
1600;;;--------------------------------------------------------------------------
1601;;; Icon programming style.
cc1980e1 1602
6132bc01 1603;; Icon indentation style.
cc1980e1
MW
1604
1605(setq icon-brace-offset 0
1606 icon-continued-brace-offset 0
1607 icon-continued-statement-offset 2
1608 icon-indent-level 2)
1609
6132bc01 1610;; Define Icon fontification style.
cc1980e1
MW
1611
1612(defun mdw-fontify-icon ()
1613
6132bc01 1614 ;; Miscellaneous fiddling.
cc1980e1
MW
1615 (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
1616
6132bc01 1617 ;; Now define fontification things.
cc1980e1
MW
1618 (make-local-variable 'font-lock-keywords)
1619 (let ((icon-keywords
1620 (mdw-regexps "break" "by" "case" "create" "default" "do" "else"
1621 "end" "every" "fail" "global" "if" "initial"
1622 "invocable" "link" "local" "next" "not" "of"
1623 "procedure" "record" "repeat" "return" "static"
1624 "suspend" "then" "to" "until" "while"))
1625 (preprocessor-keywords
1626 (mdw-regexps "define" "else" "endif" "error" "ifdef" "ifndef"
1627 "include" "line" "undef")))
1628 (setq font-lock-keywords
1629 (list
1630
6132bc01 1631 ;; Set up the keywords defined above.
cc1980e1
MW
1632 (list (concat "\\<\\(" icon-keywords "\\)\\>")
1633 '(0 font-lock-keyword-face))
1634
6132bc01 1635 ;; The things that Icon calls keywords.
cc1980e1
MW
1636 (list "&\\sw+\\>" '(0 font-lock-variable-name-face))
1637
6132bc01 1638 ;; At least numbers are simpler than C.
cc1980e1
MW
1639 (list (concat "\\<[0-9]+"
1640 "\\([rR][0-9a-zA-Z]+\\|"
1641 "\\.[0-9]+\\([eE][+-]?[0-9]+\\)?\\)\\>\\|"
1642 "\\.[0-9]+\\([eE][+-]?[0-9]+\\)?\\>")
1643 '(0 mdw-number-face))
1644
6132bc01 1645 ;; Preprocessor.
cc1980e1
MW
1646 (list (concat "^[ \t]*$[ \t]*\\<\\("
1647 preprocessor-keywords
1648 "\\)\\>")
1649 '(0 font-lock-keyword-face))
1650
6132bc01 1651 ;; And anything else is punctuation.
cc1980e1 1652 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1653 '(0 mdw-punct-face)))))
1654
1655 (mdw-post-config-mode-hack))
cc1980e1 1656
6132bc01
MW
1657;;;--------------------------------------------------------------------------
1658;;; ARM assembler programming configuration.
f617db13 1659
6132bc01 1660;; There doesn't appear to be an Emacs mode for this yet.
f617db13
MW
1661;;
1662;; Better do something about that, I suppose.
1663
1664(defvar arm-assembler-mode-map nil)
1665(defvar arm-assembler-abbrev-table nil)
1666(defvar arm-assembler-mode-syntax-table (make-syntax-table))
1667
1668(or arm-assembler-mode-map
1669 (progn
1670 (setq arm-assembler-mode-map (make-sparse-keymap))
1671 (define-key arm-assembler-mode-map "\C-m" 'arm-assembler-newline)
1672 (define-key arm-assembler-mode-map [C-return] 'newline)
1673 (define-key arm-assembler-mode-map "\t" 'tab-to-tab-stop)))
1674
1675(defun arm-assembler-mode ()
1676 "Major mode for ARM assembler programs"
1677 (interactive)
1678
6132bc01 1679 ;; Do standard major mode things.
f617db13
MW
1680 (kill-all-local-variables)
1681 (use-local-map arm-assembler-mode-map)
1682 (setq local-abbrev-table arm-assembler-abbrev-table)
1683 (setq major-mode 'arm-assembler-mode)
1684 (setq mode-name "ARM assembler")
1685
6132bc01 1686 ;; Set up syntax table.
f617db13
MW
1687 (set-syntax-table arm-assembler-mode-syntax-table)
1688 (modify-syntax-entry ?; ; Nasty hack
1689 "<" arm-assembler-mode-syntax-table)
1690 (modify-syntax-entry ?\n ">" arm-assembler-mode-syntax-table)
1691 (modify-syntax-entry ?_ "_" arm-assembler-mode-syntax-table)
1692
1693 (make-local-variable 'comment-start)
1694 (setq comment-start ";")
1695 (make-local-variable 'comment-end)
1696 (setq comment-end "")
1697 (make-local-variable 'comment-column)
1698 (setq comment-column 48)
1699 (make-local-variable 'comment-start-skip)
1700 (setq comment-start-skip ";+[ \t]*")
1701
6132bc01 1702 ;; Play with indentation.
f617db13
MW
1703 (make-local-variable 'indent-line-function)
1704 (setq indent-line-function 'indent-relative-maybe)
1705
6132bc01 1706 ;; Set fill prefix.
f617db13
MW
1707 (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)")
1708
6132bc01 1709 ;; Fiddle with fontification.
02109a0d 1710 (make-local-variable 'font-lock-keywords)
f617db13
MW
1711 (setq font-lock-keywords
1712 (list
f617db13 1713
6132bc01 1714 ;; Handle numbers too.
f617db13
MW
1715 ;;
1716 ;; The following isn't quite right, but it's close enough.
f617db13
MW
1717 (list (concat "\\("
1718 "&[0-9a-fA-F]+\\|"
1719 "\\<[0-9]+\\(\\.[0-9]*\\|_[0-9a-zA-Z]+\\|\\)"
1720 "\\)")
1721 '(0 mdw-number-face))
1722
6132bc01 1723 ;; Do something about operators.
f617db13
MW
1724 (list "^[^ \t]*[ \t]+\\(GET\\|LNK\\)[ \t]+\\([^;\n]*\\)"
1725 '(1 font-lock-keyword-face)
1726 '(2 font-lock-string-face))
1727 (list ":[a-zA-Z]+:"
1728 '(0 font-lock-keyword-face))
1729
6132bc01 1730 ;; Do menemonics and directives.
f617db13
MW
1731 (list "^[^ \t]*[ \t]+\\([a-zA-Z]+\\)"
1732 '(1 font-lock-keyword-face))
1733
6132bc01 1734 ;; And anything else is punctuation.
f617db13 1735 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9 1736 '(0 mdw-punct-face)))
f617db13 1737
ed7b46b9 1738 (mdw-post-config-mode-hack))
f617db13
MW
1739 (run-hooks 'arm-assembler-mode-hook))
1740
6132bc01
MW
1741;;;--------------------------------------------------------------------------
1742;;; Assembler mode.
30c8a8fb
MW
1743
1744(defun mdw-fontify-asm ()
1745 (modify-syntax-entry ?' "\"")
1746 (modify-syntax-entry ?. "w")
1747 (setf fill-prefix nil)
1748 (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)"))
1749
6132bc01
MW
1750;;;--------------------------------------------------------------------------
1751;;; TCL configuration.
f617db13
MW
1752
1753(defun mdw-fontify-tcl ()
1754 (mapcar #'(lambda (ch) (modify-syntax-entry ch ".")) '(?$))
1755 (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
02109a0d 1756 (make-local-variable 'font-lock-keywords)
f617db13
MW
1757 (setq font-lock-keywords
1758 (list
f617db13
MW
1759 (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
1760 "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
1761 "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
1762 '(0 mdw-number-face))
1763 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1764 '(0 mdw-punct-face))))
1765 (mdw-post-config-mode-hack))
f617db13 1766
6132bc01
MW
1767;;;--------------------------------------------------------------------------
1768;;; REXX configuration.
f617db13
MW
1769
1770(defun mdw-rexx-electric-* ()
1771 (interactive)
1772 (insert ?*)
1773 (rexx-indent-line))
1774
1775(defun mdw-rexx-indent-newline-indent ()
1776 (interactive)
1777 (rexx-indent-line)
1778 (if abbrev-mode (expand-abbrev))
1779 (newline-and-indent))
1780
1781(defun mdw-fontify-rexx ()
1782
6132bc01 1783 ;; Various bits of fiddling.
f617db13
MW
1784 (setq mdw-auto-indent nil)
1785 (local-set-key [?\C-m] 'mdw-rexx-indent-newline-indent)
1786 (local-set-key [?*] 'mdw-rexx-electric-*)
1787 (mapcar #'(lambda (ch) (modify-syntax-entry ch "w"))
e443a4cd 1788 '(?! ?? ?# ?@ ?$))
f617db13
MW
1789 (mdw-standard-fill-prefix "\\([ \t]*/?\*[ \t]*\\)")
1790
6132bc01 1791 ;; Set up keywords and things for fontification.
f617db13
MW
1792 (make-local-variable 'font-lock-keywords-case-fold-search)
1793 (setq font-lock-keywords-case-fold-search t)
1794
1795 (setq rexx-indent 2)
1796 (setq rexx-end-indent rexx-indent)
f617db13
MW
1797 (setq rexx-cont-indent rexx-indent)
1798
02109a0d 1799 (make-local-variable 'font-lock-keywords)
f617db13 1800 (let ((rexx-keywords
8d6d55b9
MW
1801 (mdw-regexps "address" "arg" "by" "call" "digits" "do" "drop"
1802 "else" "end" "engineering" "exit" "expose" "for"
1803 "forever" "form" "fuzz" "if" "interpret" "iterate"
1804 "leave" "linein" "name" "nop" "numeric" "off" "on"
1805 "options" "otherwise" "parse" "procedure" "pull"
1806 "push" "queue" "return" "say" "select" "signal"
1807 "scientific" "source" "then" "trace" "to" "until"
1808 "upper" "value" "var" "version" "when" "while"
1809 "with"
1810
1811 "abbrev" "abs" "bitand" "bitor" "bitxor" "b2x"
1812 "center" "center" "charin" "charout" "chars"
1813 "compare" "condition" "copies" "c2d" "c2x"
1814 "datatype" "date" "delstr" "delword" "d2c" "d2x"
1815 "errortext" "format" "fuzz" "insert" "lastpos"
1816 "left" "length" "lineout" "lines" "max" "min"
1817 "overlay" "pos" "queued" "random" "reverse" "right"
1818 "sign" "sourceline" "space" "stream" "strip"
1819 "substr" "subword" "symbol" "time" "translate"
1820 "trunc" "value" "verify" "word" "wordindex"
1821 "wordlength" "wordpos" "words" "xrange" "x2b" "x2c"
1822 "x2d")))
f617db13
MW
1823
1824 (setq font-lock-keywords
1825 (list
f617db13 1826
6132bc01 1827 ;; Set up the keywords defined above.
f617db13
MW
1828 (list (concat "\\<\\(" rexx-keywords "\\)\\>")
1829 '(0 font-lock-keyword-face))
1830
6132bc01 1831 ;; Fontify all symbols the same way.
f617db13
MW
1832 (list (concat "\\<\\([0-9.][A-Za-z0-9.!?_#@$]*[Ee][+-]?[0-9]+\\|"
1833 "[A-Za-z0-9.!?_#@$]+\\)")
1834 '(0 font-lock-variable-name-face))
1835
6132bc01 1836 ;; And everything else is punctuation.
f617db13 1837 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1838 '(0 mdw-punct-face)))))
1839
1840 (mdw-post-config-mode-hack))
f617db13 1841
6132bc01
MW
1842;;;--------------------------------------------------------------------------
1843;;; Standard ML programming style.
f617db13
MW
1844
1845(defun mdw-fontify-sml ()
1846
6132bc01 1847 ;; Make underscore an honorary letter.
f617db13
MW
1848 (modify-syntax-entry ?' "w")
1849
6132bc01 1850 ;; Set fill prefix.
f617db13
MW
1851 (mdw-standard-fill-prefix "\\([ \t]*(\*[ \t]*\\)")
1852
6132bc01 1853 ;; Now define fontification things.
02109a0d 1854 (make-local-variable 'font-lock-keywords)
f617db13 1855 (let ((sml-keywords
8d6d55b9
MW
1856 (mdw-regexps "abstype" "and" "andalso" "as"
1857 "case"
1858 "datatype" "do"
1859 "else" "end" "eqtype" "exception"
1860 "fn" "fun" "functor"
1861 "handle"
1862 "if" "in" "include" "infix" "infixr"
1863 "let" "local"
1864 "nonfix"
1865 "of" "op" "open" "orelse"
1866 "raise" "rec"
1867 "sharing" "sig" "signature" "struct" "structure"
1868 "then" "type"
1869 "val"
1870 "where" "while" "with" "withtype")))
f617db13
MW
1871
1872 (setq font-lock-keywords
1873 (list
f617db13 1874
6132bc01 1875 ;; Set up the keywords defined above.
f617db13
MW
1876 (list (concat "\\<\\(" sml-keywords "\\)\\>")
1877 '(0 font-lock-keyword-face))
1878
6132bc01 1879 ;; At least numbers are simpler than C.
f617db13
MW
1880 (list (concat "\\<\\(\\~\\|\\)"
1881 "\\(0\\(\\([wW]\\|\\)[xX][0-9a-fA-F]+\\|"
852cd5fb
MW
1882 "[wW][0-9]+\\)\\|"
1883 "\\([0-9]+\\(\\.[0-9]+\\|\\)"
1884 "\\([eE]\\(\\~\\|\\)"
1885 "[0-9]+\\|\\)\\)\\)")
f617db13
MW
1886 '(0 mdw-number-face))
1887
6132bc01 1888 ;; And anything else is punctuation.
f617db13 1889 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1890 '(0 mdw-punct-face)))))
1891
1892 (mdw-post-config-mode-hack))
f617db13 1893
6132bc01
MW
1894;;;--------------------------------------------------------------------------
1895;;; Haskell configuration.
f617db13
MW
1896
1897(defun mdw-fontify-haskell ()
1898
6132bc01 1899 ;; Fiddle with syntax table to get comments right.
f617db13
MW
1900 (modify-syntax-entry ?' "\"")
1901 (modify-syntax-entry ?- ". 123")
1902 (modify-syntax-entry ?{ ". 1b")
1903 (modify-syntax-entry ?} ". 4b")
1904 (modify-syntax-entry ?\n ">")
1905
6132bc01 1906 ;; Set fill prefix.
f617db13
MW
1907 (mdw-standard-fill-prefix "\\([ \t]*{?--?[ \t]*\\)")
1908
6132bc01 1909 ;; Fiddle with fontification.
02109a0d 1910 (make-local-variable 'font-lock-keywords)
f617db13 1911 (let ((haskell-keywords
8d6d55b9
MW
1912 (mdw-regexps "as" "case" "ccall" "class" "data" "default"
1913 "deriving" "do" "else" "foreign" "hiding" "if"
1914 "import" "in" "infix" "infixl" "infixr" "instance"
1915 "let" "module" "newtype" "of" "qualified" "safe"
1916 "stdcall" "then" "type" "unsafe" "where")))
f617db13
MW
1917
1918 (setq font-lock-keywords
1919 (list
f617db13
MW
1920 (list "--.*$"
1921 '(0 font-lock-comment-face))
1922 (list (concat "\\<\\(" haskell-keywords "\\)\\>")
1923 '(0 font-lock-keyword-face))
1924 (list (concat "\\<0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
1925 "\\<[0-9][0-9_]*\\(\\.[0-9]*\\|\\)"
1926 "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
1927 '(0 mdw-number-face))
1928 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1929 '(0 mdw-punct-face)))))
1930
1931 (mdw-post-config-mode-hack))
f617db13 1932
6132bc01
MW
1933;;;--------------------------------------------------------------------------
1934;;; Erlang configuration.
2ded9493
MW
1935
1936(setq erlang-electric-commannds
1937 '(erlang-electric-newline erlang-electric-semicolon))
1938
1939(defun mdw-fontify-erlang ()
1940
6132bc01 1941 ;; Set fill prefix.
2ded9493
MW
1942 (mdw-standard-fill-prefix "\\([ \t]*{?%*[ \t]*\\)")
1943
6132bc01 1944 ;; Fiddle with fontification.
2ded9493
MW
1945 (make-local-variable 'font-lock-keywords)
1946 (let ((erlang-keywords
1947 (mdw-regexps "after" "and" "andalso"
1948 "band" "begin" "bnot" "bor" "bsl" "bsr" "bxor"
1949 "case" "catch" "cond"
1950 "div" "end" "fun" "if" "let" "not"
1951 "of" "or" "orelse"
1952 "query" "receive" "rem" "try" "when" "xor")))
1953
1954 (setq font-lock-keywords
1955 (list
1956 (list "%.*$"
1957 '(0 font-lock-comment-face))
1958 (list (concat "\\<\\(" erlang-keywords "\\)\\>")
1959 '(0 font-lock-keyword-face))
1960 (list (concat "^-\\sw+\\>")
1961 '(0 font-lock-keyword-face))
1962 (list "\\<[0-9]+\\(\\|#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)\\>"
1963 '(0 mdw-number-face))
1964 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
1965 '(0 mdw-punct-face)))))
1966
1967 (mdw-post-config-mode-hack))
2ded9493 1968
6132bc01
MW
1969;;;--------------------------------------------------------------------------
1970;;; Texinfo configuration.
f617db13
MW
1971
1972(defun mdw-fontify-texinfo ()
1973
6132bc01 1974 ;; Set fill prefix.
f617db13
MW
1975 (mdw-standard-fill-prefix "\\([ \t]*@c[ \t]+\\)")
1976
6132bc01 1977 ;; Real fontification things.
02109a0d 1978 (make-local-variable 'font-lock-keywords)
f617db13
MW
1979 (setq font-lock-keywords
1980 (list
f617db13 1981
6132bc01 1982 ;; Environment names are keywords.
f617db13
MW
1983 (list "@\\(end\\) *\\([a-zA-Z]*\\)?"
1984 '(2 font-lock-keyword-face))
1985
6132bc01 1986 ;; Unmark escaped magic characters.
f617db13
MW
1987 (list "\\(@\\)\\([@{}]\\)"
1988 '(1 font-lock-keyword-face)
1989 '(2 font-lock-variable-name-face))
1990
6132bc01 1991 ;; Make sure we get comments properly.
f617db13
MW
1992 (list "@c\\(\\|omment\\)\\( .*\\)?$"
1993 '(0 font-lock-comment-face))
1994
6132bc01 1995 ;; Command names are keywords.
f617db13
MW
1996 (list "@\\([^a-zA-Z@]\\|[a-zA-Z@]*\\)"
1997 '(0 font-lock-keyword-face))
1998
6132bc01 1999 ;; Fontify TeX special characters as punctuation.
f617db13 2000 (list "[{}]+"
ed7b46b9
MW
2001 '(0 mdw-punct-face))))
2002
2003 (mdw-post-config-mode-hack))
f617db13 2004
6132bc01
MW
2005;;;--------------------------------------------------------------------------
2006;;; TeX and LaTeX configuration.
f617db13
MW
2007
2008(defun mdw-fontify-tex ()
2009 (setq ispell-parser 'tex)
55f80fae 2010 (turn-on-reftex)
f617db13 2011
6132bc01 2012 ;; Don't make maths into a string.
f617db13
MW
2013 (modify-syntax-entry ?$ ".")
2014 (modify-syntax-entry ?$ "." font-lock-syntax-table)
2015 (local-set-key [?$] 'self-insert-command)
2016
6132bc01 2017 ;; Set fill prefix.
f617db13
MW
2018 (mdw-standard-fill-prefix "\\([ \t]*%+[ \t]*\\)")
2019
6132bc01 2020 ;; Real fontification things.
02109a0d 2021 (make-local-variable 'font-lock-keywords)
f617db13
MW
2022 (setq font-lock-keywords
2023 (list
f617db13 2024
6132bc01 2025 ;; Environment names are keywords.
f617db13
MW
2026 (list (concat "\\\\\\(begin\\|end\\|newenvironment\\)"
2027 "{\\([^}\n]*\\)}")
2028 '(2 font-lock-keyword-face))
2029
6132bc01 2030 ;; Suspended environment names are keywords too.
f617db13
MW
2031 (list (concat "\\\\\\(suspend\\|resume\\)\\(\\[[^]]*\\]\\)?"
2032 "{\\([^}\n]*\\)}")
2033 '(3 font-lock-keyword-face))
2034
6132bc01 2035 ;; Command names are keywords.
f617db13
MW
2036 (list "\\\\\\([^a-zA-Z@]\\|[a-zA-Z@]*\\)"
2037 '(0 font-lock-keyword-face))
2038
6132bc01 2039 ;; Handle @/.../ for italics.
f617db13 2040 ;; (list "\\(@/\\)\\([^/]*\\)\\(/\\)"
852cd5fb
MW
2041 ;; '(1 font-lock-keyword-face)
2042 ;; '(3 font-lock-keyword-face))
f617db13 2043
6132bc01 2044 ;; Handle @*...* for boldness.
f617db13 2045 ;; (list "\\(@\\*\\)\\([^*]*\\)\\(\\*\\)"
852cd5fb
MW
2046 ;; '(1 font-lock-keyword-face)
2047 ;; '(3 font-lock-keyword-face))
f617db13 2048
6132bc01 2049 ;; Handle @`...' for literal syntax things.
f617db13 2050 ;; (list "\\(@`\\)\\([^']*\\)\\('\\)"
852cd5fb
MW
2051 ;; '(1 font-lock-keyword-face)
2052 ;; '(3 font-lock-keyword-face))
f617db13 2053
6132bc01 2054 ;; Handle @<...> for nonterminals.
f617db13 2055 ;; (list "\\(@<\\)\\([^>]*\\)\\(>\\)"
852cd5fb
MW
2056 ;; '(1 font-lock-keyword-face)
2057 ;; '(3 font-lock-keyword-face))
f617db13 2058
6132bc01 2059 ;; Handle other @-commands.
f617db13 2060 ;; (list "@\\([^a-zA-Z]\\|[a-zA-Z]*\\)"
852cd5fb 2061 ;; '(0 font-lock-keyword-face))
f617db13 2062
6132bc01 2063 ;; Make sure we get comments properly.
f617db13
MW
2064 (list "%.*"
2065 '(0 font-lock-comment-face))
2066
6132bc01 2067 ;; Fontify TeX special characters as punctuation.
f617db13 2068 (list "[$^_{}#&]"
ed7b46b9
MW
2069 '(0 mdw-punct-face))))
2070
2071 (mdw-post-config-mode-hack))
f617db13 2072
6132bc01
MW
2073;;;--------------------------------------------------------------------------
2074;;; SGML hacking.
f25cf300
MW
2075
2076(defun mdw-sgml-mode ()
2077 (interactive)
2078 (sgml-mode)
2079 (mdw-standard-fill-prefix "")
8a425bd7 2080 (make-local-variable 'sgml-delimiters)
f25cf300
MW
2081 (setq sgml-delimiters
2082 '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]"
2083 "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\""
2084 "LITA" "'" "MDC" ">" "MDO" "<!" "MINUS" "-" "MSC" "]]" "NESTC" "{"
2085 "NET" "}" "OPT" "?" "OR" "|" "PERO" "%" "PIC" ">" "PIO" "<?"
2086 "PLUS" "+" "REFC" "." "REP" "*" "RNI" "#" "SEQ" "," "STAGO" ":"
2087 "TAGC" "." "VI" "=" "MS-START" "<![" "MS-END" "]]>"
2088 "XML-ECOM" "-->" "XML-PIC" "?>" "XML-SCOM" "<!--" "XML-TAGCE" "/>"
2089 "NULL" ""))
2090 (setq major-mode 'mdw-sgml-mode)
2091 (setq mode-name "[mdw] SGML")
2092 (run-hooks 'mdw-sgml-mode-hook))
2093
6132bc01
MW
2094;;;--------------------------------------------------------------------------
2095;;; Shell scripts.
f617db13
MW
2096
2097(defun mdw-setup-sh-script-mode ()
2098
6132bc01 2099 ;; Fetch the shell interpreter's name.
f617db13
MW
2100 (let ((shell-name sh-shell-file))
2101
6132bc01 2102 ;; Try reading the hash-bang line.
f617db13
MW
2103 (save-excursion
2104 (goto-char (point-min))
2105 (if (looking-at "#![ \t]*\\([^ \t\n]*\\)")
2106 (setq shell-name (match-string 1))))
2107
6132bc01 2108 ;; Now try to set the shell.
f617db13
MW
2109 ;;
2110 ;; Don't let `sh-set-shell' bugger up my script.
f617db13
MW
2111 (let ((executable-set-magic #'(lambda (s &rest r) s)))
2112 (sh-set-shell shell-name)))
2113
6132bc01 2114 ;; Now enable my keys and the fontification.
f617db13
MW
2115 (mdw-misc-mode-config)
2116
6132bc01 2117 ;; Set the indentation level correctly.
f617db13
MW
2118 (setq sh-indentation 2)
2119 (setq sh-basic-offset 2))
2120
6132bc01 2121;;;--------------------------------------------------------------------------
092f0a38
MW
2122;;; Emacs shell mode.
2123
2124(defun mdw-eshell-prompt ()
2125 (let ((left "[") (right "]"))
2126 (when (= (user-uid) 0)
2127 (setq left "«" right "»"))
2128 (concat left
2129 (save-match-data
2130 (replace-regexp-in-string "\\..*$" "" (system-name)))
2131 " "
2132 (eshell/pwd)
2133 right)))
2134(setq eshell-prompt-function 'mdw-eshell-prompt)
ac4ae7cd 2135(setq eshell-prompt-regexp "^\\[[^]>]+\\(\\]\\|>>?\\)")
092f0a38 2136
415a23dd
MW
2137(defalias 'eshell/e 'find-file)
2138(defalias 'eshell/w3m 'w3m-goto-url)
2139
092f0a38
MW
2140(mdw-define-face eshell-prompt (t :weight bold))
2141(mdw-define-face eshell-ls-archive (t :weight bold :foreground "red"))
2142(mdw-define-face eshell-ls-backup (t :foreground "lightgrey" :slant italic))
2143(mdw-define-face eshell-ls-product (t :foreground "lightgrey" :slant italic))
2144(mdw-define-face eshell-ls-clutter (t :foreground "lightgrey" :slant italic))
2145(mdw-define-face eshell-ls-executable (t :weight bold))
2146(mdw-define-face eshell-ls-directory (t :foreground "cyan" :weight bold))
2147(mdw-define-face eshell-ls-readonly (t nil))
2148(mdw-define-face eshell-ls-symlink (t :foreground "cyan"))
2149
2150;;;--------------------------------------------------------------------------
6132bc01 2151;;; Messages-file mode.
f617db13 2152
4bb22eea 2153(defun messages-mode-guts ()
f617db13
MW
2154 (setq messages-mode-syntax-table (make-syntax-table))
2155 (set-syntax-table messages-mode-syntax-table)
f617db13
MW
2156 (modify-syntax-entry ?0 "w" messages-mode-syntax-table)
2157 (modify-syntax-entry ?1 "w" messages-mode-syntax-table)
2158 (modify-syntax-entry ?2 "w" messages-mode-syntax-table)
2159 (modify-syntax-entry ?3 "w" messages-mode-syntax-table)
2160 (modify-syntax-entry ?4 "w" messages-mode-syntax-table)
2161 (modify-syntax-entry ?5 "w" messages-mode-syntax-table)
2162 (modify-syntax-entry ?6 "w" messages-mode-syntax-table)
2163 (modify-syntax-entry ?7 "w" messages-mode-syntax-table)
2164 (modify-syntax-entry ?8 "w" messages-mode-syntax-table)
2165 (modify-syntax-entry ?9 "w" messages-mode-syntax-table)
2166 (make-local-variable 'comment-start)
2167 (make-local-variable 'comment-end)
2168 (make-local-variable 'indent-line-function)
2169 (setq indent-line-function 'indent-relative)
2170 (mdw-standard-fill-prefix "\\([ \t]*\\(;\\|/?\\*\\)+[ \t]*\\)")
2171 (make-local-variable 'font-lock-defaults)
4bb22eea 2172 (make-local-variable 'messages-mode-keywords)
f617db13 2173 (let ((keywords
8d6d55b9
MW
2174 (mdw-regexps "array" "bitmap" "callback" "docs[ \t]+enum"
2175 "export" "enum" "fixed-octetstring" "flags"
2176 "harmless" "map" "nested" "optional"
2177 "optional-tagged" "package" "primitive"
2178 "primitive-nullfree" "relaxed[ \t]+enum"
2179 "set" "table" "tagged-optional" "union"
2180 "variadic" "vector" "version" "version-tag")))
4bb22eea 2181 (setq messages-mode-keywords
f617db13
MW
2182 (list
2183 (list (concat "\\<\\(" keywords "\\)\\>:")
2184 '(0 font-lock-keyword-face))
2185 '("\\([-a-zA-Z0-9]+:\\)" (0 font-lock-warning-face))
2186 '("\\(\\<[a-z][-_a-zA-Z0-9]*\\)"
2187 (0 font-lock-variable-name-face))
2188 '("\\<\\([0-9]+\\)\\>" (0 mdw-number-face))
2189 '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
2190 (0 mdw-punct-face)))))
2191 (setq font-lock-defaults
4bb22eea 2192 '(messages-mode-keywords nil nil nil nil))
f617db13
MW
2193 (run-hooks 'messages-file-hook))
2194
2195(defun messages-mode ()
2196 (interactive)
2197 (fundamental-mode)
2198 (setq major-mode 'messages-mode)
2199 (setq mode-name "Messages")
4bb22eea 2200 (messages-mode-guts)
f617db13
MW
2201 (modify-syntax-entry ?# "<" messages-mode-syntax-table)
2202 (modify-syntax-entry ?\n ">" messages-mode-syntax-table)
2203 (setq comment-start "# ")
2204 (setq comment-end "")
f617db13
MW
2205 (run-hooks 'messages-mode-hook))
2206
2207(defun cpp-messages-mode ()
2208 (interactive)
2209 (fundamental-mode)
2210 (setq major-mode 'cpp-messages-mode)
2211 (setq mode-name "CPP Messages")
4bb22eea 2212 (messages-mode-guts)
f617db13
MW
2213 (modify-syntax-entry ?* ". 23" messages-mode-syntax-table)
2214 (modify-syntax-entry ?/ ". 14" messages-mode-syntax-table)
2215 (setq comment-start "/* ")
2216 (setq comment-end " */")
2217 (let ((preprocessor-keywords
8d6d55b9
MW
2218 (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
2219 "ident" "if" "ifdef" "ifndef" "import" "include"
2220 "line" "pragma" "unassert" "undef" "warning")))
4bb22eea 2221 (setq messages-mode-keywords
f617db13
MW
2222 (append (list (list (concat "^[ \t]*\\#[ \t]*"
2223 "\\(include\\|import\\)"
2224 "[ \t]*\\(<[^>]+\\(>\\|\\)\\)")
2225 '(2 font-lock-string-face))
2226 (list (concat "^\\([ \t]*#[ \t]*\\(\\("
2227 preprocessor-keywords
852cd5fb 2228 "\\)\\>\\|[0-9]+\\|$\\)\\)")
f617db13 2229 '(1 font-lock-keyword-face)))
4bb22eea 2230 messages-mode-keywords)))
297d60aa 2231 (run-hooks 'cpp-messages-mode-hook))
f617db13 2232
297d60aa
MW
2233(add-hook 'messages-mode-hook 'mdw-misc-mode-config t)
2234(add-hook 'cpp-messages-mode-hook 'mdw-misc-mode-config t)
f617db13
MW
2235; (add-hook 'messages-file-hook 'mdw-fontify-messages t)
2236
6132bc01
MW
2237;;;--------------------------------------------------------------------------
2238;;; Messages-file mode.
f617db13
MW
2239
2240(defvar mallow-driver-substitution-face 'mallow-driver-substitution-face
2241 "Face to use for subsittution directives.")
2242(make-face 'mallow-driver-substitution-face)
2243(defvar mallow-driver-text-face 'mallow-driver-text-face
2244 "Face to use for body text.")
2245(make-face 'mallow-driver-text-face)
2246
2247(defun mallow-driver-mode ()
2248 (interactive)
2249 (fundamental-mode)
2250 (setq major-mode 'mallow-driver-mode)
2251 (setq mode-name "Mallow driver")
2252 (setq mallow-driver-mode-syntax-table (make-syntax-table))
2253 (set-syntax-table mallow-driver-mode-syntax-table)
2254 (make-local-variable 'comment-start)
2255 (make-local-variable 'comment-end)
2256 (make-local-variable 'indent-line-function)
2257 (setq indent-line-function 'indent-relative)
2258 (mdw-standard-fill-prefix "\\([ \t]*\\(;\\|/?\\*\\)+[ \t]*\\)")
2259 (make-local-variable 'font-lock-defaults)
2260 (make-local-variable 'mallow-driver-mode-keywords)
2261 (let ((keywords
8d6d55b9
MW
2262 (mdw-regexps "each" "divert" "file" "if"
2263 "perl" "set" "string" "type" "write")))
f617db13
MW
2264 (setq mallow-driver-mode-keywords
2265 (list
2266 (list (concat "^%\\s *\\(}\\|\\(" keywords "\\)\\>\\).*$")
2267 '(0 font-lock-keyword-face))
2268 (list "^%\\s *\\(#.*\\|\\)$"
2269 '(0 font-lock-comment-face))
2270 (list "^%"
2271 '(0 font-lock-keyword-face))
2272 (list "^|?\\(.+\\)$" '(1 mallow-driver-text-face))
2273 (list "\\${[^}]*}"
2274 '(0 mallow-driver-substitution-face t)))))
2275 (setq font-lock-defaults
2276 '(mallow-driver-mode-keywords nil nil nil nil))
2277 (modify-syntax-entry ?\" "_" mallow-driver-mode-syntax-table)
2278 (modify-syntax-entry ?\n ">" mallow-driver-mode-syntax-table)
2279 (setq comment-start "%# ")
2280 (setq comment-end "")
f617db13
MW
2281 (run-hooks 'mallow-driver-mode-hook))
2282
2283(add-hook 'mallow-driver-hook 'mdw-misc-mode-config t)
2284
6132bc01
MW
2285;;;--------------------------------------------------------------------------
2286;;; NFast debugs.
f617db13
MW
2287
2288(defun nfast-debug-mode ()
2289 (interactive)
2290 (fundamental-mode)
2291 (setq major-mode 'nfast-debug-mode)
2292 (setq mode-name "NFast debug")
2293 (setq messages-mode-syntax-table (make-syntax-table))
2294 (set-syntax-table messages-mode-syntax-table)
2295 (make-local-variable 'font-lock-defaults)
2296 (make-local-variable 'nfast-debug-mode-keywords)
2297 (setq truncate-lines t)
2298 (setq nfast-debug-mode-keywords
2299 (list
2300 '("^\\(NFast_\\(Connect\\|Disconnect\\|Submit\\|Wait\\)\\)"
2301 (0 font-lock-keyword-face))
2302 (list (concat "^[ \t]+\\(\\("
2303 "[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]"
2304 "[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]"
2305 "[ \t]+\\)*"
2306 "[0-9a-fA-F]+\\)[ \t]*$")
2307 '(0 mdw-number-face))
2308 '("^[ \t]+\.status=[ \t]+\\<\\(OK\\)\\>"
2309 (1 font-lock-keyword-face))
2310 '("^[ \t]+\.status=[ \t]+\\<\\([a-zA-Z][0-9a-zA-Z]*\\)\\>"
2311 (1 font-lock-warning-face))
2312 '("^[ \t]+\.status[ \t]+\\<\\(zero\\)\\>"
2313 (1 nil))
2314 (list (concat "^[ \t]+\\.cmd=[ \t]+"
2315 "\\<\\([a-zA-Z][0-9a-zA-Z]*\\)\\>")
2316 '(1 font-lock-keyword-face))
2317 '("-?\\<\\([0-9]+\\|0x[0-9a-fA-F]+\\)\\>" (0 mdw-number-face))
2318 '("^\\([ \t]+[a-z0-9.]+\\)" (0 font-lock-variable-name-face))
2319 '("\\<\\([a-z][a-z0-9.]+\\)\\>=" (1 font-lock-variable-name-face))
2320 '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" (0 mdw-punct-face))))
2321 (setq font-lock-defaults
2322 '(nfast-debug-mode-keywords nil nil nil nil))
f617db13
MW
2323 (run-hooks 'nfast-debug-mode-hook))
2324
6132bc01
MW
2325;;;--------------------------------------------------------------------------
2326;;; Other languages.
f617db13 2327
6132bc01 2328;; Smalltalk.
f617db13
MW
2329
2330(defun mdw-setup-smalltalk ()
2331 (and mdw-auto-indent
2332 (local-set-key "\C-m" 'smalltalk-newline-and-indent))
8a425bd7 2333 (make-local-variable 'mdw-auto-indent)
f617db13
MW
2334 (setq mdw-auto-indent nil)
2335 (local-set-key "\C-i" 'smalltalk-reindent))
2336
2337(defun mdw-fontify-smalltalk ()
02109a0d 2338 (make-local-variable 'font-lock-keywords)
f617db13
MW
2339 (setq font-lock-keywords
2340 (list
f617db13
MW
2341 (list "\\<[A-Z][a-zA-Z0-9]*\\>"
2342 '(0 font-lock-keyword-face))
2343 (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
2344 "[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
2345 "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
2346 '(0 mdw-number-face))
2347 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
2348 '(0 mdw-punct-face))))
2349 (mdw-post-config-mode-hack))
f617db13 2350
6132bc01 2351;; Lispy languages.
f617db13 2352
873d87df
MW
2353;; Unpleasant bodge.
2354(unless (boundp 'slime-repl-mode-map)
2355 (setq slime-repl-mode-map (make-sparse-keymap)))
2356
f617db13
MW
2357(defun mdw-indent-newline-and-indent ()
2358 (interactive)
2359 (indent-for-tab-command)
2360 (newline-and-indent))
2361
2362(eval-after-load "cl-indent"
2363 '(progn
2364 (mapc #'(lambda (pair)
2365 (put (car pair)
2366 'common-lisp-indent-function
2367 (cdr pair)))
2368 '((destructuring-bind . ((&whole 4 &rest 1) 4 &body))
2369 (multiple-value-bind . ((&whole 4 &rest 1) 4 &body))))))
2370
2371(defun mdw-common-lisp-indent ()
8a425bd7 2372 (make-local-variable 'lisp-indent-function)
f617db13
MW
2373 (setq lisp-indent-function 'common-lisp-indent-function))
2374
037be6de 2375(setq lisp-simple-loop-indentation 2
95575d1f
MW
2376 lisp-loop-keyword-indentation 6
2377 lisp-loop-forms-indentation 6)
2378
f617db13
MW
2379(defun mdw-fontify-lispy ()
2380
6132bc01 2381 ;; Set fill prefix.
f617db13
MW
2382 (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)")
2383
6132bc01 2384 ;; Not much fontification needed.
02109a0d 2385 (make-local-variable 'font-lock-keywords)
f617db13
MW
2386 (setq font-lock-keywords
2387 (list
f617db13 2388 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
ed7b46b9
MW
2389 '(0 mdw-punct-face))))
2390
2391 (mdw-post-config-mode-hack))
f617db13
MW
2392
2393(defun comint-send-and-indent ()
2394 (interactive)
2395 (comint-send-input)
2396 (and mdw-auto-indent
2397 (indent-for-tab-command)))
2398
ec007bea
MW
2399(defun mdw-setup-m4 ()
2400 (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
2401
6132bc01
MW
2402;;;--------------------------------------------------------------------------
2403;;; Text mode.
f617db13
MW
2404
2405(defun mdw-text-mode ()
2406 (setq fill-column 72)
2407 (flyspell-mode t)
2408 (mdw-standard-fill-prefix
c7a8da49 2409 "\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
f617db13
MW
2410 (auto-fill-mode 1))
2411
6132bc01 2412;;;--------------------------------------------------------------------------
faf2cef7 2413;;; Outline and hide/show modes.
5de5db48
MW
2414
2415(defun mdw-outline-collapse-all ()
2416 "Completely collapse everything in the entire buffer."
2417 (interactive)
2418 (save-excursion
2419 (goto-char (point-min))
2420 (while (< (point) (point-max))
2421 (hide-subtree)
2422 (forward-line))))
2423
faf2cef7
MW
2424(setq hs-hide-comments-when-hiding-all nil)
2425
b200af26 2426(defadvice hs-hide-all (after hide-first-comment activate)
941c29ba 2427 (save-excursion (hs-hide-initial-comment-block)))
b200af26 2428
6132bc01
MW
2429;;;--------------------------------------------------------------------------
2430;;; Shell mode.
f617db13
MW
2431
2432(defun mdw-sh-mode-setup ()
2433 (local-set-key [?\C-a] 'comint-bol)
2434 (add-hook 'comint-output-filter-functions
2435 'comint-watch-for-password-prompt))
2436
2437(defun mdw-term-mode-setup ()
3d9147ea 2438 (setq term-prompt-regexp shell-prompt-pattern)
f617db13
MW
2439 (make-local-variable 'mouse-yank-at-point)
2440 (make-local-variable 'transient-mark-mode)
2441 (setq mouse-yank-at-point t)
f617db13
MW
2442 (auto-fill-mode -1)
2443 (setq tab-width 8))
2444
3d9147ea
MW
2445(defun term-send-meta-right () (interactive) (term-send-raw-string "\e\e[C"))
2446(defun term-send-meta-left () (interactive) (term-send-raw-string "\e\e[D"))
2447(defun term-send-ctrl-uscore () (interactive) (term-send-raw-string "\C-_"))
2448(defun term-send-meta-meta-something ()
2449 (interactive)
2450 (term-send-raw-string "\e\e")
2451 (term-send-raw))
2452(eval-after-load 'term
2453 '(progn
2454 (define-key term-raw-map [?\e ?\e] nil)
2455 (define-key term-raw-map [?\e ?\e t] 'term-send-meta-meta-something)
2456 (define-key term-raw-map [?\C-/] 'term-send-ctrl-uscore)
2457 (define-key term-raw-map [M-right] 'term-send-meta-right)
2458 (define-key term-raw-map [?\e ?\M-O ?C] 'term-send-meta-right)
2459 (define-key term-raw-map [M-left] 'term-send-meta-left)
2460 (define-key term-raw-map [?\e ?\M-O ?D] 'term-send-meta-left)))
2461
e07e3320
MW
2462;;;--------------------------------------------------------------------------
2463;;; Inferior Emacs Lisp.
2464
2465(setq comint-prompt-read-only t)
2466
2467(eval-after-load "comint"
2468 '(progn
2469 (define-key comint-mode-map "\C-w" 'comint-kill-region)
2470 (define-key comint-mode-map [C-S-backspace] 'comint-kill-whole-line)))
2471
2472(eval-after-load "ielm"
2473 '(progn
2474 (define-key ielm-map "\C-w" 'comint-kill-region)
2475 (define-key ielm-map [C-S-backspace] 'comint-kill-whole-line)))
2476
f617db13
MW
2477;;;----- That's all, folks --------------------------------------------------
2478
2479(provide 'dot-emacs)