]> git.donarmstrong.com Git - lib.git/blob - emacs_el/configuration/don-configuration.org
fix missing parenthesis in tinyprocmail
[lib.git] / emacs_el / configuration / don-configuration.org
1 #+PROPERTY: header-args:emacs-lisp :tangle don-configuration.el
2 * Load debugger
3
4 # if for some reason, things get pear-shaped, we want to be able to
5 # enter the debugger by sending -USR2 to emacs
6
7 #+BEGIN_SRC emacs-lisp
8 (setq debug-on-event 'siguser2)
9 #+END_SRC
10 * Add library paths
11
12 #+BEGIN_SRC emacs-lisp
13   (add-to-list 'load-path '"~/lib/emacs_el/")
14   (add-to-list 'load-path '"~/lib/emacs_el/helm")
15   (add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/tiny")
16   (add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/other")
17   (add-to-list 'load-path '"~/lib/emacs_el/auctex/lisp")
18   (add-to-list 'load-path '"~/lib/emacs_el/auctex")
19   (add-to-list 'load-path '"~/lib/emacs_el/ESS/lisp")
20   (add-to-list 'load-path '"~/lib/emacs_el/org-mode/lisp")
21   (add-to-list 'load-path '"~/lib/emacs_el/auctex-beamer")
22   (add-to-list 'load-path '"~/lib/emacs_el/magit-annex")
23   (add-to-list 'load-path '"~/lib/emacs_el/polymode")
24 #+END_SRC
25
26 * Package management
27 ** package repositories and package manager
28 #+BEGIN_SRC emacs-lisp
29   (require 'package)
30   (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
31                            ("melpa" . "https://melpa.org/packages/")
32                            ("org" . "http://orgmode.org/elpa/") ))
33 #+END_SRC
34 ** [[https://github.com/jwiegley/use-package/][use-package]]
35 #+BEGIN_SRC emacs-lisp
36   (require 'use-package)
37   (package-initialize)
38 #+END_SRC
39 ** Paradox
40 #+BEGIN_SRC emacs-lisp
41   (package-initialize)
42   (use-package paradox
43     :ensure paradox
44   )
45 #+END_SRC
46 * Misc functions
47 ** with-library
48 #+BEGIN_SRC emacs-lisp
49 ;; From http://www.emacswiki.org/emacs/LoadingLispFiles
50 ;; execute conditional code when loading libraries
51 (defmacro with-library (symbol &rest body)
52   `(when (require ,symbol nil t)
53      ,@body))
54 (put 'with-library 'lisp-indent-function 1)
55 #+END_SRC
56
57
58 * Memory
59 #+BEGIN_SRC emacs-lisp
60   (setq global-mark-ring-max 128
61         mark-ring-max 128
62         kill-ring-max 128)
63
64   (defun don/minibuffer-setup-hook ()
65     (setq gc-cons-threshold most-positive-fixnum))
66
67   (defun don/minibuffer-exit-hook ()
68     (setq gc-cons-threshold 1048576))
69
70   (add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook)
71   (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook)
72 #+END_SRC
73 * Modules
74 ** Winnermode
75 #+BEGIN_SRC emacs-lisp
76   (winner-mode 1)
77 #+END_SRC
78 ** Eyebrowse
79
80 #+BEGIN_SRC emacs-lisp
81   ;; (use-package eyebrowse
82   ;;   :ensure t
83   ;;   :diminish eyebrowse-mode
84   ;;   :init (setq eyebrowse-keymap-prefix (kbd "C-c C-\\"))
85   ;;   :config (progn
86   ;;             (setq eyebrowse-wrap-around t)
87   ;;             (eyebrowse-mode t)
88   ;; 
89   ;;             (defun my/eyebrowse-new-window-config ()
90   ;;               (interactive)
91   ;;               (let ((done nil))
92   ;;                 (dotimes (i 10)
93   ;;                   ;; start at 1 run till 0
94   ;;                   (let ((j (mod (+ i 1) 10)))
95   ;;                     (when (and (not done)
96   ;;                                (not (eyebrowse--window-config-present-p j)))
97   ;;                       (eyebrowse-switch-to-window-config j)
98   ;;                       (call-interactively 'eyebrowse-rename-window-config2 j)
99   ;;                       (setq done t)
100   ;;                       ))
101   ;;                   )))
102   ;; 
103   ;;             ;; I don't use latex-preview-pane
104   ;;             ;; (require 'latex-preview-pane)
105   ;;             ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch ()
106   ;;             ;;   ;; latex-preview-pane uses window-parameters which are
107   ;;             ;;   ;; not preserved by eyebrowse, so we close the preview
108   ;;             ;;   ;; pane before switching, it will be regenerated when we
109   ;;             ;;   ;; edit the TeX file.
110   ;;             ;;   (when (lpp/window-containing-preview)
111   ;;             ;;     (delete-window (lpp/window-containing-preview))))
112   ;; 
113   ;;             ;; (add-to-list 'eyebrowse-pre-window-switch-hook
114   ;;             ;;              #'my/close-latex-preview-pane-before-eyebrowse-switch)
115   ;; 
116   ;;             ;; (my/set-menu-key "["  #'my/eyebrowse-new-window-config)
117   ;;             ;; (my/set-menu-key ";"  #'eyebrowse-prev-window-config)
118   ;;             ;; (my/set-menu-key "'"  #'eyebrowse-next-window-config)
119   ;;             ;; (my/set-menu-key "]"  #'eyebrowse-close-window-config)
120   ;;             ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config)
121   ;;             )
122   ;;   )
123 #+END_SRC
124
125 ** Window handling
126
127 *** Splitting
128 #+BEGIN_SRC emacs-lisp
129   (defun my/vsplit-last-buffer ()
130     "Split the window vertically and display the previous buffer."
131     (interactive)
132     (split-window-vertically)
133     (other-window 1 nil)
134     (switch-to-next-buffer))
135
136   (defun my/hsplit-last-buffer ()
137     "Split the window horizontally and display the previous buffer."
138     (interactive)
139     (split-window-horizontally)
140     (other-window 1 nil)
141     (switch-to-next-buffer))
142
143   (bind-key "C-x 2" 'my/vsplit-last-buffer)
144   (bind-key "C-x 3" 'my/hsplit-last-buffer)
145
146   (setq split-width-threshold  100)
147   (setq split-height-threshold 60)
148
149   (defun my/split-window-prefer-horizontally (window)
150     "If there's only one window (excluding any possibly active
151            minibuffer), then split the current window horizontally."
152     (if (and (one-window-p t)
153              (not (active-minibuffer-window))
154              ( > (frame-width) (frame-height))
155              )
156         (let ((split-height-threshold nil))
157           (split-window-sensibly window))
158       (split-window-sensibly window)))
159
160   (setq split-window-preferred-function #'my/split-window-prefer-horizontally)
161   (setq window-combination-resize t)
162 #+END_SRC
163
164 *** Compilation window
165
166 If there is no compilation window, open one at the bottom, spanning
167 the complete width of the frame. Otherwise, reuse existing window. In
168 the former case, if there was no error the window closes
169 automatically.
170
171 #+BEGIN_SRC emacs-lisp
172   (add-to-list 'display-buffer-alist
173                `(,(rx bos "*compilation*" eos)
174                  (display-buffer-reuse-window
175                   display-buffer-in-side-window)
176                  (reusable-frames . visible)
177                  (side            . bottom)
178                  (window-height   . 0.4)))
179 #+END_SRC
180
181 #+BEGIN_SRC emacs-lisp
182   (defun my/compilation-exit-autoclose (status code msg)
183     ;; If M-x compile exists with a 0
184     (when (and (eq status 'exit) (zerop code))
185       ;; and delete the *compilation* window
186       (let ((compilation-window (get-buffer-window (get-buffer "*compilation*"))))
187         (when (and (not (window-at-side-p compilation-window 'top))
188                    (window-at-side-p compilation-window 'left)
189                    (window-at-side-p compilation-window 'right))
190           (delete-window compilation-window))))
191     ;; Always return the anticipated result of compilation-exit-message-function
192     (cons msg code))
193
194   ;; Specify my function (maybe I should have done a lambda function)
195   (setq compilation-exit-message-function #'my/compilation-exit-autoclose)
196 #+END_SRC
197
198 If you change the variable ~compilation-scroll-output~ to a ~non-nil~
199 value, the compilation buffer scrolls automatically to follow the
200 output. If the value is ~first-error~, scrolling stops when the first
201 error appears, leaving point at that error. For any other non-nil
202 value, scrolling continues until there is no more output.
203
204 #+BEGIN_SRC emacs-lisp
205   (setq compilation-scroll-output 'first-error)
206 #+END_SRC
207
208 ** Mode line cleaning
209 *** Diminish
210 #+BEGIN_SRC emacs-lisp
211   (use-package diminish
212     :ensure t)
213 #+END_SRC
214
215 *** Delight 
216 #+BEGIN_SRC emacs-lisp
217   (use-package delight
218     :ensure t)
219 #+END_SRC
220
221 ** Jumping
222 *** Avy
223 #+BEGIN_SRC emacs-lisp
224 (use-package avy
225   :ensure t
226   :bind ("C-c C-SPC" . avy-goto-word-1)
227   :config (progn
228             (setq avy-background t)
229             (key-chord-define-global "jj"  #'avy-goto-word-1)))
230 #+END_SRC
231
232 ** Snippets
233
234 *** Yasnippet
235 #+BEGIN_SRC emacs-lisp
236 (use-package yasnippet
237   :ensure t
238   :diminish yas-minor-mode
239   :config (progn
240             (yas-global-mode)
241             (setq yas-verbosity 1)))
242 #+END_SRC
243
244 ** Helm Flx
245
246 [[https://github.com/PythonNut/helm-flx][helm-flx]] implements intelligent helm fuzzy sorting, provided by [[https://github.com/lewang/flx][flx]].
247
248 #+BEGIN_SRC emacs-lisp
249 (use-package helm-flx
250   :ensure t
251   :config (progn
252             ;; these are helm configs, but they kind of fit here nicely
253             (setq helm-M-x-fuzzy-match                  t
254                   helm-bookmark-show-location           t
255                   helm-buffers-fuzzy-matching           t
256                   helm-completion-in-region-fuzzy-match t
257                   helm-file-cache-fuzzy-match           t
258                   helm-imenu-fuzzy-match                t
259                   helm-mode-fuzzy-match                 t
260                   helm-locate-fuzzy-match               nil
261                   helm-quick-update                     t
262                   helm-recentf-fuzzy-match              nil
263                   helm-semantic-fuzzy-match             t)
264             (helm-flx-mode +1)))
265 #+END_SRC
266
267
268 ** Tinyprocmail
269
270 #+BEGIN_SRC emacs-lisp
271   ;; load tinyprocmail
272   (use-package tinyprocmail
273     :ensure f
274     :config (with-library 'tinyprocmail
275               ;; (setq tinyprocmail--procmail-version "v3.22")
276               (add-hook 'tinyprocmail--load-hook 'tinyprocmail-install))
277   )
278 #+END_SRC
279
280 ** Magit
281 #+BEGIN_SRC emacs-lisp :tangle don-configuration.el
282   (use-package magit
283     :ensure f
284     :config
285     ;; don't verify where we are pushing
286     (setq magit-push-always-verify nil)
287     ;; refine diffs always (hilight words)
288     (setq magit-diff-refine-hunk nil)
289     ;; load magit-annex
290     (setq load-path
291           (append '("~/lib/emacs_el/magit-annex")
292                   load-path))
293     )
294   (use-package magit-annex
295     :ensure f
296     :config (require 'magit-annex)
297   )
298 #+END_SRC
299
300 ** Perl
301 #+BEGIN_SRC emacs-lisp
302   (require 'cperl-mode)
303   ;; Use c-mode for perl .xs files
304   (add-to-list 'auto-mode-alist '("\\.xs\\'" . c-mode))
305   (add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\)\\'" . cperl-mode))
306   (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
307   (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
308   (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
309   (setq cperl-hairy t
310         cperl-indent-level 4
311         cperl-auto-newline nil
312         cperl-auto-newline-after-colon nil
313         cperl-continued-statement-offset 4
314         cperl-brace-offset -1
315         cperl-continued-brace-offset 0
316         cperl-label-offset -4
317         cperl-highlight-variables-indiscriminately t
318         cperl-electric-lbrace-space nil
319         cperl-indent-parens-as-block nil
320         cperl-close-paren-offset -1
321         cperl-tab-always-indent t)
322   ;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle")))
323 #+END_SRC
324
325 ** Helm
326 #+BEGIN_SRC emacs-lisp
327   (use-package helm
328     :ensure t
329     :config
330     (helm-mode 1)
331     (define-key global-map [remap find-file] 'helm-find-files)
332     (define-key global-map [remap occur] 'helm-occur)
333     (define-key global-map [remap list-buffers] 'helm-buffers-list)
334     (define-key global-map [remap dabbrev-expand] 'helm-dabbrev)
335     (global-set-key (kbd "M-x") 'helm-M-x)
336     (unless (boundp 'completion-in-region-function)
337       (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)
338       (define-key emacs-lisp-mode-map       [remap completion-at-point] 'helm-lisp-completion-at-point))
339     (add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$TMP") (delete-file "$TMP"))))
340   )
341 #+END_SRC
342 ** Hydra
343 #+BEGIN_SRC emacs-lisp :tangle don-configuration.el
344 (require 'don-hydra)
345 #+END_SRC
346
347 ** Tramp
348 #+BEGIN_SRC emacs-lisp
349   (add-to-list 'tramp-methods '("vcsh"
350                                 (tramp-login-program "vcsh")
351                                 (tramp-login-args
352                                  (("enter")
353                                   ("%h")))
354                                 (tramp-remote-shell "/bin/sh")
355                                 (tramp-remote-shell-args
356                                  ("-c"))))
357 #+END_SRC
358 ** LaTeX
359 #+BEGIN_SRC emacs-lisp
360   (load "auctex.el" nil t t)
361   (load "preview-latex.el" nil t t)
362   (load "latex.el" nil t t)
363
364   ;; this is in the very newest auctex; avoid for now
365   (add-to-list 'LaTeX-fill-excluded-macros
366                '("Sexpr"))
367   (add-to-list 'TeX-style-path '"/home/don/lib/emacs_el/auctex/style")
368   ;; REFTEX (much enhanced management of cross-ref, labels, etc)
369   ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/
370   (autoload 'reftex-mode     "reftex" "RefTeX Minor Mode" t)
371   (autoload 'turn-on-reftex  "reftex" "RefTeX Minor Mode" nil)
372   (autoload 'reftex-citation "reftex-cite" "Make citation" nil)
373   (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t)
374   (add-hook 'LaTeX-mode-hook 'turn-on-reftex)   ; with AUCTeX LaTeX mode
375   (add-hook 'latex-mode-hook 'turn-on-reftex)   ; with Emacs latex mode
376   (add-hook 'LaTeX-mode-hook 'outline-minor-mode)   ; with AUCTeX LaTeX mode
377   (add-hook 'latex-mode-hook 'outline-minor-mode)   ; with Emacs latex mode
378
379   ; use smart quotes by default instead of `` and ''
380   ; taken from http://kieranhealy.org/esk/kjhealy.html
381   (setq TeX-open-quote "“")
382   (setq TeX-close-quote "”")
383
384   ;; (TeX-add-style-hook
385   ;;  "latex"
386   ;;  (lambda ()
387   ;;    (TeX-add-symbols
388   ;;     '("DLA" 1))))
389   ;; (custom-set-variables
390   ;;  '(font-latex-user-keyword-classes 
391   ;;    '(("fixme" 
392   ;;       ("DLA" "RZ")
393   ;;       font-lock-function-name-face 2 (command 1 t))))
394   ;; ) 
395
396   (require 'font-latex)
397   (setq font-latex-match-reference-keywords
398         '(
399           ("fref" "{")
400           ("Fref" "{")
401           ("citep" "{")
402           ("citet" "{")
403           ("acs" "{")
404           ("acsp" "{")
405           ("ac" "{")
406           ("acp" "{")
407           ("acl" "{")
408           ("aclp" "{")
409           ("acsu" "{")
410           ("aclu" "{")
411           ("acused" "{")
412   ;         ))
413   ; (setq font-latex-match-warning-keywords
414   ;       '(
415           ("DLA" "{")
416           ("RZ" "{")
417           ("OM" "{")
418           ("DL" "{")
419           ("fixme" "{")))
420
421   (setq-default TeX-parse-self t)
422   (setq-default TeX-auto-save t)
423   (setq-default TeX-master nil)
424   (eval-after-load
425       "latex"
426     '(TeX-add-style-hook
427       "cleveref"
428       (lambda ()
429         (if (boundp 'reftex-ref-style-alist)
430         (add-to-list
431          'reftex-ref-style-alist
432          '("Cleveref" "cleveref"
433            (("\\cref" ?c) ("\\Cref" ?C) ("\\cpageref" ?d) ("\\Cpageref" ?D)))))
434         (reftex-ref-style-activate "Cleveref")
435         (TeX-add-symbols
436          '("cref" TeX-arg-ref)
437          '("Cref" TeX-arg-ref)
438          '("cpageref" TeX-arg-ref)
439          '("Cpageref" TeX-arg-ref)))))
440   ;; this doesn't seem to work; not currently sure why
441   ; (setq font-latex-user-keyword-classes
442   ;       '(("my-warning-commands"
443   ;          (("DLA" "{")
444   ;           ("RZ" "{")
445   ;           ("OM" "{")
446   ;           ("DL" "{")
447   ;           ("fixme" "{")
448   ;           )
449   ;          (:foreground "red" :weight bold :underline (:color foreground-color :style line)))
450   ;         ))
451
452   (setq-default reftex-default-bibliography
453         '("~/projects/research/references.bib"))
454
455
456 #+END_SRC
457 ** Org
458 #+BEGIN_SRC emacs-lisp
459   (require 'org-mode-configuration)
460 #+END_SRC
461 ** ESS
462 #+BEGIN_SRC emacs-lisp
463   (use-package ess
464     :ensure t
465     :config (require 'ess_configuration))
466 #+END_SRC
467
468
469 ** Polymode
470 #+BEGIN_SRC emacs-lisp
471   (setq load-path
472         (append '("~/lib/emacs_el/polymode/modes")
473                 load-path))
474   (require 'polymode)
475   (require 'poly-R)
476   (require 'poly-noweb)
477   (require 'poly-markdown)
478   (add-to-list 'auto-mode-alist '("\\.Snw" . poly-noweb+r-mode))
479   (add-to-list 'auto-mode-alist '("\\.Rnw" . poly-noweb+r-mode))
480   (add-to-list 'auto-mode-alist '("\\.Rmd" . poly-markdown+r-mode))
481 #+END_SRC
482
483 * Keybindings
484 ** Override other things
485 #+BEGIN_SRC emacs-lisp
486   ; apparently things like to step on C-;, so we'll use a hack from
487   ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this
488
489   (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
490
491   ; use iedit everywhere
492   (define-key my-keys-minor-mode-map (kbd "C-;") 'iedit-mode)
493   ;; use outline mode keybindings everywhere
494   (define-key my-keys-minor-mode-map (kbd "C-;") 'my/mydra-outline/body)
495
496   (define-minor-mode my-keys-minor-mode
497     "A minor mode so that my key settings override annoying major modes."
498     t " my-keys" 'my-keys-minor-mode-map)
499
500   (my-keys-minor-mode 1)
501   (defun my-minibuffer-setup-hook ()
502     (my-keys-minor-mode 0))
503
504   (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
505   (defadvice load (after give-my-keybindings-priority)
506     "Try to ensure that my keybindings always have priority."
507     (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode))
508         (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
509           (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
510           (add-to-list 'minor-mode-map-alist mykeys))))
511   (ad-activate 'load)
512 #+END_SRC
513
514 * Misc (uncharacterized)
515 #+BEGIN_SRC emacs-lisp
516   (setq bibtex-user-optional-fields (quote (("annote" "Personal annotation (ignored)") ("abstract" "") ("pmid" "") ("doi" ""))))
517   (setq calendar-latitude 40.11)
518   (setq calendar-longitude -88.24)
519   (setq case-fold-search t)
520   (setq confirm-kill-emacs (quote y-or-n-p))
521   (setq cperl-lazy-help-time nil)
522   (setq debian-changelog-mailing-address "don@debian.org")
523   (display-time)
524   (setq display-time-24hr-format t)
525   (setq display-time-day-and-date t)
526   (display-time-mode 1)
527   (setq font-latex-fontify-script nil)
528   (setq font-latex-fontify-sectioning (quote color))
529   (setq font-latex-script-display (quote (nil)))
530   (global-auto-revert-mode 1)
531   (global-font-lock-mode 1)
532   (icomplete-mode 1)
533   (setq log-edit-keep-buffer t)
534   (setq mail-user-agent (quote sendmail-user-agent))
535   (setq markdown-enable-math t)
536   (setq markdown-follow-wiki-link-on-enter nil)
537   (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases")))
538   (setq post-email-address "don@donarmstrong.com")
539   (setq post-kill-quoted-sig nil)
540   (setq post-mail-message "mutt\\(ng\\|\\)-[a-z0-9]+-[0-9]+-.*")
541   (setq post-uses-fill-mode nil)
542   (setq ps-footer-font-size (quote (8 . 10)))
543   (setq ps-header-font-size (quote (8 . 10)))
544   (setq ps-header-title-font-size (quote (10 . 10)))
545   (setq ps-line-number-color "blue")
546   (setq ps-print-footer t)
547   (setq ps-print-footer-frame nil)
548   (setq ps-print-only-one-header t)
549   (setq safe-local-variable-values (quote ((auto-save-default) (make-backup-files))))
550   (setq sentence-end "[.?!][]\"')]*\\($\\|   \\| \\)[    
551   ]*")
552   (setq sentence-end-double-space nil)
553   ; enable matching parenthesis
554   (show-paren-mode 1)
555   (tool-bar-mode -1)
556   (setq user-mail-address "don@donarmstrong.com")
557   (setq vc-delete-logbuf-window nil)
558   (setq vc-follow-symlinks t)
559
560   ;; use git before SVN; use CVS earlier, because I have CVS
561   ;; repositories inside of git directories
562   (setq vc-handled-backends (quote (CVS Git RCS SVN SCCS Bzr Hg Mtn Arch)))
563
564   ;; switch back to the old primary selection method
565   (setq x-select-enable-clipboard nil)
566   (setq x-select-enable-primary t)
567   ; (setq mouse-drag-copy-region t)
568
569   (fset 'perl-mode 'cperl-mode)
570   ;;(load-file "cperl-mode.el")
571
572   (require 'vcl-mode)
573
574   (require 'tex-site)
575   ;;(require 'psvn)
576   ;;(require 'ecasound)
577   ;;(require 'emacs-wiki)
578   (require 'bibtex)
579   (require 'post)
580   ;;(require 'fixme)
581   ; (require 'google-weather)
582   ; (require 'org-google-weather)
583   ; (setq-default org-google-weather-format "%i %c, [%l,%h] %s %C")
584
585   ; http://julien.danjou.info/projects/emacs-packages#rainbow-mode
586   ; this colorizes color strings
587   (require 'rainbow-mode)
588   ; add ess to the x major mode
589   (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S])
590   (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R])
591
592   (global-set-key "\C-xp" 'server-edit)
593
594   (setq-default auto-mode-alist (cons '("\.wml$" . 
595                     (lambda () (html-mode) (auto-fill-mode)))
596                   auto-mode-alist))
597
598
599   ; use markdown mode for mdwn files
600   (add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode))
601   (add-to-list 'auto-mode-alist '("\\.md$" . markdown-mode))
602
603
604   ;; tramp configuration
605   (setq tramp-use-ssh-controlmaster-options nil)
606
607   ; mail configuration
608   (add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . message-mode))
609   (add-to-list 'auto-mode-alist '("muttngrc" . muttrc-mode))
610
611   (add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . message-mode))
612   (add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode))
613   (defun my-message-mode-settings ()
614     (font-lock-add-keywords nil
615                             '(("^[ \t]*>[ \t]*>[ \t]*>.*$"
616                                (0 'message-multiply-quoted-text-face))
617                               ("^[ \t]*>[ \t]*>.*$"
618                                (0 'message-double-quoted-text-face))))
619     (local-set-key (kbd "C-c C-a") 'my-post-attach-file)
620     )
621   (add-hook 'message-mode-hook 'my-message-mode-settings)
622
623   (defun my-post-attach-file ()
624     "Prompt for an attachment."
625     (interactive)
626     (let ((file (read-file-name "Attach file: " nil nil t nil))
627           (description (string-read "Description: ")))
628       (my-header-attach-file file description)))
629
630   (symbol-function 'my-post-attach-file)
631
632   (defun my-header-attach-file (file description)
633     "Attach a FILE to the current message (works with Mutt).
634   Argument DESCRIPTION MIME description."
635     (interactive "fAttach file: \nsDescription: ")
636     (when (> (length file) 0)
637       (save-excursion
638         (save-match-data
639           (save-restriction
640             (widen)
641             (goto-char (point-min))
642             (search-forward-regexp "^$")
643             (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " "
644                             description "\n"))
645             (message (concat "Attached '" file "'."))
646             (setq post-has-attachment t))))))
647
648
649
650   (setq mail-yank-prefix "> ")
651
652   (global-unset-key "\M-g")
653   (global-set-key "\M-g" 'goto-line)
654
655   ;; self-insert-command hack.
656   ;;   Without this, "if<SP>" expands to
657   ;;   if ( -!-) {
658   ;;   }
659   ;;   which really should be,
660   ;;   if (-!-) {
661   ;;   }
662
663
664
665   ;(load-library "php-mode")
666
667   (setq-default c-indent-level 4)
668   (setq-default c-brace-imaginary-offset 0)
669   (setq-default c-brace-offset -4)
670   (setq-default c-argdecl-indent 4)
671   (setq-default c-label-offset -4)
672   (setq-default c-continued-statement-offset 4)
673   ; tabs are annoying
674   (setq-default indent-tabs-mode nil)
675   (setq-default tab-width 4)
676
677
678   ;; (autoload 'php-mode "php-mode" "PHP editing mode" t)
679   ;; (add-to-list 'auto-mode-alist '("\\.php3?\\'" . php-mode))
680   ;; (add-to-list 'auto-mode-alist '("\\.phtml?\\'" . php-mode))
681   ;; (add-to-list 'auto-mode-alist '("\\.php?\\'" . php-mode))
682   ;; (add-to-list 'auto-mode-alist '("\\.php4?\\'" . php-mode))
683
684
685   (defun insert-date ()
686     "Insert date at point."
687     (interactive)
688     (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z")))
689   (global-set-key "\C-[d" 'insert-date)
690
691   (defun unfill-paragraph (arg)
692     "Pull this whole paragraph up onto one line."
693     (interactive "*p")
694     (let ((fill-column 10000))
695       (fill-paragraph arg))
696     )
697
698   (column-number-mode t)
699   (setq-default reftex-plug-into-AUCTeX t)
700
701   (server-start)
702
703   ; (require 'mode-compile)
704
705   (defadvice server-process-filter (after post-mode-message first activate)
706     "If the buffer is in post mode, overwrite the server-edit
707       message with a post-save-current-buffer-and-exit message."
708     (if (eq major-mode 'post-mode)
709         (message
710          (substitute-command-keys "Type \\[describe-mode] for help composing; \\[post-save-current-buffer-and-exit] when done."))))
711                       ; This is also needed to see the magic message.  Set to a higher
712                       ; number if you have a faster computer or read slower than me.
713   '(font-lock-verbose 1000)
714   ;(setq-default server-temp-file-regexp "mutt\(-\|ng-\)")
715   ; (add-hook 'server-switch-hook 
716   ;     (function (lambda()
717   ;             (cond ((string-match "Post" mode-name)
718   ;                (post-goto-body)))
719   ;             set-buffer-file-coding-system 'utf-8
720   ;             )))
721   ; 
722
723   (add-hook 'post-mode-hook
724         (auto-fill-mode nil)
725         )
726   ; abbrev mode settings
727   ; load abbreviations from 
728   (setq abbrev-file-name       
729         "~/.emacs_abbrev_def")
730
731   ; read the abbrev file if it exists
732   (if (file-exists-p abbrev-file-name)
733       (quietly-read-abbrev-file))
734
735   ; for now, use abbrev mode everywhere
736   (setq default-abbrev-mode t)
737
738
739   (defun insert-function-documentation ()
740     "Insert function documentation"
741     (interactive)
742     (insert-file-contents "/home/don/lib/templates/perl_function_documentation" nil))
743   (global-set-key "\M-f" 'insert-function-documentation)
744
745   (eval-after-load "lilypond-mode" 
746     '(progn
747        (load-library "lyqi-mode")
748        (define-key LilyPond-mode-map "\C-cq" 'lyqi-mode)))
749
750   (autoload 'spamassassin-mode "spamassassin-mode" nil t)
751
752   (desktop-load-default)
753   (desktop-read)
754   '(icomplete-mode on)
755   (custom-set-faces
756    ;; custom-set-faces was added by Custom.
757    ;; If you edit it by hand, you could mess it up, so be careful.
758    ;; Your init file should contain only one such instance.
759    ;; If there is more than one, they won't work right.
760    '(menu ((((type x-toolkit)) (:background "black" :foreground "grey90")))))
761
762
763   (put 'upcase-region 'disabled nil)
764   (put 'downcase-region 'disabled nil)
765   (put 'narrow-to-region 'disabled nil)
766
767
768   (autoload 'flyspell-mode "flyspell" "On-the-fly spelling checker." t)
769   (add-hook 'message-mode-hook 'turn-on-flyspell)
770   (add-hook 'text-mode-hook 'turn-on-flyspell)
771   (add-hook 'c-mode-common-hook 'flyspell-prog-mode)
772   (add-hook 'cperl-mode-hook 'flyspell-prog-mode)
773   (add-hook 'tcl-mode-hook 'flyspell-prog-mode)
774   ; (defun turn-on-flyspell ()
775   ;    "Force flyspell-mode on using a positive arg.  For use in hooks."
776   ;    (interactive)
777   ;    (flyspell-mode 1))
778
779
780    ; Outline-minor-mode key map
781    (define-prefix-command 'cm-map nil "Outline-")
782    ; HIDE
783    (define-key cm-map "q" 'hide-sublevels)    ; Hide everything but the top-level headings
784    (define-key cm-map "t" 'hide-body)         ; Hide everything but headings (all body lines)
785    (define-key cm-map "o" 'hide-other)        ; Hide other branches
786    (define-key cm-map "c" 'hide-entry)        ; Hide this entry's body
787    (define-key cm-map "l" 'hide-leaves)       ; Hide body lines in this entry and sub-entries
788    (define-key cm-map "d" 'hide-subtree)      ; Hide everything in this entry and sub-entries
789    ; SHOW
790    (define-key cm-map "a" 'show-all)          ; Show (expand) everything
791    (define-key cm-map "e" 'show-entry)        ; Show this heading's body
792    (define-key cm-map "i" 'show-children)     ; Show this heading's immediate child sub-headings
793    (define-key cm-map "k" 'show-branches)     ; Show all sub-headings under this heading
794    (define-key cm-map "s" 'show-subtree)      ; Show (expand) everything in this heading & below
795    ; MOVE
796    (define-key cm-map "u" 'outline-up-heading)                ; Up
797    (define-key cm-map "n" 'outline-next-visible-heading)      ; Next
798    (define-key cm-map "p" 'outline-previous-visible-heading)  ; Previous
799    (define-key cm-map "f" 'outline-forward-same-level)        ; Forward - same level
800    (define-key cm-map "b" 'outline-backward-same-level)       ; Backward - same level
801    (global-set-key "\M-o" cm-map)
802
803
804   ; debian stuff
805   (setq-default debian-changelog-mailing-address "don@debian.org")
806   (setq-default debian-changelog-full-name "Don Armstrong")
807
808   ; ediff configuration
809   ; don't use the multi-window configuration
810   (setq ediff-window-setup-function 'ediff-setup-windows-plain)
811
812   ; use iedit
813   (require 'iedit)
814   (define-key global-map (kbd "C-;") 'iedit-mode)
815   (global-set-key  (kbd "C-;") 'iedit-mode)
816
817   ; fix up css mode to not be silly
818   ; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/
819   (setq cssm-indent-level 4)
820   (setq cssm-newline-before-closing-bracket t)
821   (setq cssm-indent-function #'cssm-c-style-indenter)
822   (setq cssm-mirror-mode nil)
823
824   (require 'multi-web-mode)
825   (setq mweb-default-major-mode 'html-mode)
826   (setq mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>")
827                     (js-mode "<script +\\(type=\"text/javascript\"\\|language=\"javascript\"\\)[^>]*>" "</script>")
828                     (css-mode "<style +type=\"text/css\"[^>]*>" "</style>")))
829   (setq mweb-filename-extensions '("php" "htm" "html" "ctp" "phtml" "php4" "php5"))
830   (multi-web-global-mode 1)
831
832   ;;; alias the new `flymake-report-status-slim' to
833   ;;; `flymake-report-status'
834   (defalias 'flymake-report-status 'flymake-report-status-slim)
835   (defun flymake-report-status-slim (e-w &optional status)
836     "Show \"slim\" flymake status in mode line."
837     (when e-w
838       (setq flymake-mode-line-e-w e-w))
839     (when status
840       (setq flymake-mode-line-status status))
841     (let* ((mode-line " Φ"))
842       (when (> (length flymake-mode-line-e-w) 0)
843         (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
844       (setq mode-line (concat mode-line flymake-mode-line-status))
845       (setq flymake-mode-line mode-line)
846       (force-mode-line-update)))
847
848   ; load sql-indent when sql is loaded
849   (eval-after-load "sql"
850     '(load-library "sql-indent"))
851
852   ; fix up tmux xterm keys
853   ; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux
854   (if (getenv "TMUX")
855       (progn
856         (let ((x 2) (tkey ""))
857           (while (<= x 8)
858             ;; shift
859             (if (= x 2)
860                 (setq tkey "S-"))
861             ;; alt
862             (if (= x 3)
863                 (setq tkey "M-"))
864             ;; alt + shift
865             (if (= x 4)
866                 (setq tkey "M-S-"))
867             ;; ctrl
868             (if (= x 5)
869                 (setq tkey "C-"))
870             ;; ctrl + shift
871             (if (= x 6)
872                 (setq tkey "C-S-"))
873             ;; ctrl + alt
874             (if (= x 7)
875                 (setq tkey "C-M-"))
876             ;; ctrl + alt + shift
877             (if (= x 8)
878                 (setq tkey "C-M-S-"))
879   
880             ;; arrows
881             (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
882             (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
883             (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
884             (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
885             ;; home
886             (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
887             ;; end
888             (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
889             ;; page up
890             (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
891             ;; page down
892             (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
893             ;; insert
894             (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
895             ;; delete
896             (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
897             ;; f1
898             (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
899             ;; f2
900             (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
901             ;; f3
902             (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
903             ;; f4
904             (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
905             ;; f5
906             (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
907             ;; f6
908             (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
909             ;; f7
910             (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
911             ;; f8
912             (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
913             ;; f9
914             (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
915             ;; f10
916             (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
917             ;; f11
918             (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
919             ;; f12
920             (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
921             ;; f13
922             (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
923             ;; f14
924             (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
925             ;; f15
926             (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
927             ;; f16
928             (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
929             ;; f17
930             (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
931             ;; f18
932             (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
933             ;; f19
934             (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
935             ;; f20
936             (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))
937
938             (setq x (+ x 1))
939             ))
940         )
941     )
942
943   ; procmailmode configuration
944   (load "procmail_mode")
945
946   (load "mode-line-cleaner")
947
948   (defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary)
949     "Call ask-user-about-supersession-threat only if the buffer is actually obsolete."
950     (if (or (buffer-modified-p)
951             (verify-visited-file-modtime)
952             (< (* 8 1024 1024) (buffer-size))
953             (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-")))
954         ad-do-it
955       (clear-visited-file-modtime)
956       (not-modified)))
957   (ad-activate 'ask-user-about-supersession-threat)
958
959   ; apparently things like to step on C-;, so we'll use a hack from
960   ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this
961
962   (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
963
964   ; use iedit everywhere
965   (define-key my-keys-minor-mode-map (kbd "C-;") 'iedit-mode)
966
967   (define-minor-mode my-keys-minor-mode
968     "A minor mode so that my key settings override annoying major modes."
969     t " my-keys" 'my-keys-minor-mode-map)
970
971   (my-keys-minor-mode 1)
972   (defun my-minibuffer-setup-hook ()
973     (my-keys-minor-mode 0))
974
975   (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
976   (defadvice load (after give-my-keybindings-priority)
977     "Try to ensure that my keybindings always have priority."
978     (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode))
979         (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
980           (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
981           (add-to-list 'minor-mode-map-alist mykeys))))
982   (ad-activate 'load)
983   (global-set-key "\M- " 'hippie-expand)
984
985 #+END_SRC
986
987 * END
988 #+BEGIN_SRC emacs-lisp
989   (provide 'don-configuration)
990 #+END_SRC