]> git.donarmstrong.com Git - lib.git/blob - emacs_el/configuration/don-configuration.org
46c122425d2f8ac88f323d0354d56561aa57f448
[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   ;; REFTEX (much enhanced management of cross-ref, labels, etc)
368   ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/
369   (autoload 'reftex-mode     "reftex" "RefTeX Minor Mode" t)
370   (autoload 'turn-on-reftex  "reftex" "RefTeX Minor Mode" nil)
371   (autoload 'reftex-citation "reftex-cite" "Make citation" nil)
372   (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t)
373   (add-hook 'LaTeX-mode-hook 'turn-on-reftex)   ; with AUCTeX LaTeX mode
374   (add-hook 'latex-mode-hook 'turn-on-reftex)   ; with Emacs latex mode
375   (add-hook 'LaTeX-mode-hook 'outline-minor-mode)   ; with AUCTeX LaTeX mode
376   (add-hook 'latex-mode-hook 'outline-minor-mode)   ; with Emacs latex mode
377
378   ; use smart quotes by default instead of `` and ''
379   ; taken from http://kieranhealy.org/esk/kjhealy.html
380   (setq TeX-open-quote "“")
381   (setq TeX-close-quote "”")
382
383   ;; (TeX-add-style-hook
384   ;;  "latex"
385   ;;  (lambda ()
386   ;;    (TeX-add-symbols
387   ;;     '("DLA" 1))))
388   ;; (custom-set-variables
389   ;;  '(font-latex-user-keyword-classes 
390   ;;    '(("fixme" 
391   ;;       ("DLA" "RZ")
392   ;;       font-lock-function-name-face 2 (command 1 t))))
393   ;; ) 
394
395   (require 'font-latex)
396   (setq font-latex-match-reference-keywords
397         '(
398           ("fref" "{")
399           ("Fref" "{")
400           ("citep" "{")
401           ("citet" "{")
402           ("acs" "{")
403           ("acsp" "{")
404           ("ac" "{")
405           ("acp" "{")
406           ("acl" "{")
407           ("aclp" "{")
408           ("acsu" "{")
409           ("aclu" "{")
410           ("acused" "{")
411   ;         ))
412   ; (setq font-latex-match-warning-keywords
413   ;       '(
414           ("DLA" "{")
415           ("RZ" "{")
416           ("OM" "{")
417           ("DL" "{")
418           ("fixme" "{")))
419       
420   (setq-default TeX-parse-self t)
421   (setq-default TeX-auto-save t)
422   (setq-default TeX-master nil)
423   (eval-after-load
424       "latex"
425     '(TeX-add-style-hook
426       "cleveref"
427       (lambda ()
428         (if (boundp 'reftex-ref-style-alist)
429         (add-to-list
430          'reftex-ref-style-alist
431          '("Cleveref" "cleveref"
432            (("\\cref" ?c) ("\\Cref" ?C) ("\\cpageref" ?d) ("\\Cpageref" ?D)))))
433         (reftex-ref-style-activate "Cleveref")
434         (TeX-add-symbols
435          '("cref" TeX-arg-ref)
436          '("Cref" TeX-arg-ref)
437          '("cpageref" TeX-arg-ref)
438          '("Cpageref" TeX-arg-ref)))))
439   ;; this doesn't seem to work; not currently sure why
440   ; (setq font-latex-user-keyword-classes
441   ;       '(("my-warning-commands"
442   ;          (("DLA" "{")
443   ;           ("RZ" "{")
444   ;           ("OM" "{")
445   ;           ("DL" "{")
446   ;           ("fixme" "{")
447   ;           )
448   ;          (:foreground "red" :weight bold :underline (:color foreground-color :style line)))
449   ;         ))
450
451   (setq-default reftex-default-bibliography
452         '("~/projects/research/references.bib"))
453
454
455 #+END_SRC
456 ** Org
457 #+BEGIN_SRC emacs-lisp
458   (require 'org-mode-configuration)
459 #+END_SRC
460 ** ESS
461 #+BEGIN_SRC emacs-lisp
462   (require 'ess_configuration)
463 #+END_SRC
464
465
466 ** Polymode
467 #+BEGIN_SRC emacs-lisp
468   (setq load-path
469         (append '("~/lib/emacs_el/polymode/modes")
470                 load-path))
471   (require 'polymode)
472   (require 'poly-R)
473   (require 'poly-noweb)
474   (require 'poly-markdown)
475   (add-to-list 'auto-mode-alist '("\\.Snw" . poly-noweb+r-mode))
476   (add-to-list 'auto-mode-alist '("\\.Rnw" . poly-noweb+r-mode))
477   (add-to-list 'auto-mode-alist '("\\.Rmd" . poly-markdown+r-mode))
478 #+END_SRC
479
480 * Keybindings
481 ** Override other things
482 #+BEGIN_SRC emacs-lisp
483   ; apparently things like to step on C-;, so we'll use a hack from
484   ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this
485
486   (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
487
488   ; use iedit everywhere
489   (define-key my-keys-minor-mode-map (kbd "C-;") 'iedit-mode)
490   ;; use outline mode keybindings everywhere
491   (define-key my-keys-minor-mode-map (kbd "C-;") 'my/mydra-outline/body)
492
493   (define-minor-mode my-keys-minor-mode
494     "A minor mode so that my key settings override annoying major modes."
495     t " my-keys" 'my-keys-minor-mode-map)
496
497   (my-keys-minor-mode 1)
498   (defun my-minibuffer-setup-hook ()
499     (my-keys-minor-mode 0))
500
501   (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
502   (defadvice load (after give-my-keybindings-priority)
503     "Try to ensure that my keybindings always have priority."
504     (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode))
505         (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
506           (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
507           (add-to-list 'minor-mode-map-alist mykeys))))
508   (ad-activate 'load)
509 #+END_SRC
510
511 * Misc (uncharacterized)
512 #+BEGIN_SRC emacs-lisp
513   (setq bibtex-user-optional-fields (quote (("annote" "Personal annotation (ignored)") ("abstract" "") ("pmid" "") ("doi" ""))))
514   (setq calendar-latitude 40.11)
515   (setq calendar-longitude -88.24)
516   (setq case-fold-search t)
517   (setq confirm-kill-emacs (quote y-or-n-p))
518   (setq cperl-lazy-help-time nil)
519   (setq debian-changelog-mailing-address "don@debian.org")
520   (display-time)
521   (setq display-time-24hr-format t)
522   (setq display-time-day-and-date t)
523   (display-time-mode 1)
524   (setq font-latex-fontify-script nil)
525   (setq font-latex-fontify-sectioning (quote color))
526   (setq font-latex-script-display (quote (nil)))
527   (global-auto-revert-mode 1)
528   (global-font-lock-mode 1)
529   (icomplete-mode 1)
530   (setq log-edit-keep-buffer t)
531   (setq mail-user-agent (quote sendmail-user-agent))
532   (setq markdown-enable-math t)
533   (setq markdown-follow-wiki-link-on-enter nil)
534   (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases")))
535   (setq post-email-address "don@donarmstrong.com")
536   (setq post-kill-quoted-sig nil)
537   (setq post-mail-message "mutt\\(ng\\|\\)-[a-z0-9]+-[0-9]+-.*")
538   (setq post-uses-fill-mode nil)
539   (setq ps-footer-font-size (quote (8 . 10)))
540   (setq ps-header-font-size (quote (8 . 10)))
541   (setq ps-header-title-font-size (quote (10 . 10)))
542   (setq ps-line-number-color "blue")
543   (setq ps-print-footer t)
544   (setq ps-print-footer-frame nil)
545   (setq ps-print-only-one-header t)
546   (setq safe-local-variable-values (quote ((auto-save-default) (make-backup-files))))
547   (setq sentence-end "[.?!][]\"')]*\\($\\|   \\| \\)[    
548   ]*")
549   (setq sentence-end-double-space nil)
550   ; enable matching parenthesis
551   (show-paren-mode 1)
552   (tool-bar-mode -1)
553   (setq user-mail-address "don@donarmstrong.com")
554   (setq vc-delete-logbuf-window nil)
555   (setq vc-follow-symlinks t)
556
557   ;; use git before SVN; use CVS earlier, because I have CVS
558   ;; repositories inside of git directories
559   (setq vc-handled-backends (quote (CVS Git RCS SVN SCCS Bzr Hg Mtn Arch)))
560
561   ;; switch back to the old primary selection method
562   (setq x-select-enable-clipboard nil)
563   (setq x-select-enable-primary t)
564   ; (setq mouse-drag-copy-region t)
565
566   (fset 'perl-mode 'cperl-mode)
567   ;;(load-file "cperl-mode.el")
568
569   (require 'vcl-mode)
570
571   (require 'tex-site)
572   ;;(require 'psvn)
573   ;;(require 'ecasound)
574   ;;(require 'emacs-wiki)
575   (require 'bibtex)
576   (require 'post)
577   ;;(require 'fixme)
578   ; (require 'google-weather)
579   ; (require 'org-google-weather)
580   ; (setq-default org-google-weather-format "%i %c, [%l,%h] %s %C")
581
582   ; http://julien.danjou.info/projects/emacs-packages#rainbow-mode
583   ; this colorizes color strings
584   (require 'rainbow-mode)
585   ; add ess to the x major mode
586   (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S])
587   (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R])
588
589   (global-set-key "\C-xp" 'server-edit)
590
591   (setq-default auto-mode-alist (cons '("\.wml$" . 
592                     (lambda () (html-mode) (auto-fill-mode)))
593                   auto-mode-alist))
594
595
596   ; use markdown mode for mdwn files
597   (add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode))
598   (add-to-list 'auto-mode-alist '("\\.md$" . markdown-mode))
599
600
601   ;; tramp configuration
602   (setq tramp-use-ssh-controlmaster-options nil)
603
604   ; mail configuration
605   (add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . message-mode))
606   (add-to-list 'auto-mode-alist '("muttngrc" . muttrc-mode))
607
608   (add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . message-mode))
609   (add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode))
610   (defun my-message-mode-settings ()
611     (font-lock-add-keywords nil
612                             '(("^[ \t]*>[ \t]*>[ \t]*>.*$"
613                                (0 'message-multiply-quoted-text-face))
614                               ("^[ \t]*>[ \t]*>.*$"
615                                (0 'message-double-quoted-text-face))))
616     (local-set-key (kbd "C-c C-a") 'my-post-attach-file)
617     )
618   (add-hook 'message-mode-hook 'my-message-mode-settings)
619
620   (defun my-post-attach-file ()
621     "Prompt for an attachment."
622     (interactive)
623     (let ((file (read-file-name "Attach file: " nil nil t nil))
624           (description (string-read "Description: ")))
625       (my-header-attach-file file description)))
626
627   (symbol-function 'my-post-attach-file)
628
629   (defun my-header-attach-file (file description)
630     "Attach a FILE to the current message (works with Mutt).
631   Argument DESCRIPTION MIME description."
632     (interactive "fAttach file: \nsDescription: ")
633     (when (> (length file) 0)
634       (save-excursion
635         (save-match-data
636           (save-restriction
637             (widen)
638             (goto-char (point-min))
639             (search-forward-regexp "^$")
640             (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " "
641                             description "\n"))
642             (message (concat "Attached '" file "'."))
643             (setq post-has-attachment t))))))
644
645
646
647   (setq mail-yank-prefix "> ")
648
649   (global-unset-key "\M-g")
650   (global-set-key "\M-g" 'goto-line)
651
652   ;; self-insert-command hack.
653   ;;   Without this, "if<SP>" expands to
654   ;;   if ( -!-) {
655   ;;   }
656   ;;   which really should be,
657   ;;   if (-!-) {
658   ;;   }
659
660
661
662   ;(load-library "php-mode")
663
664   (setq-default c-indent-level 4)
665   (setq-default c-brace-imaginary-offset 0)
666   (setq-default c-brace-offset -4)
667   (setq-default c-argdecl-indent 4)
668   (setq-default c-label-offset -4)
669   (setq-default c-continued-statement-offset 4)
670   ; tabs are annoying
671   (setq-default indent-tabs-mode nil)
672   (setq-default tab-width 4)
673
674
675   ;; (autoload 'php-mode "php-mode" "PHP editing mode" t)
676   ;; (add-to-list 'auto-mode-alist '("\\.php3?\\'" . php-mode))
677   ;; (add-to-list 'auto-mode-alist '("\\.phtml?\\'" . php-mode))
678   ;; (add-to-list 'auto-mode-alist '("\\.php?\\'" . php-mode))
679   ;; (add-to-list 'auto-mode-alist '("\\.php4?\\'" . php-mode))
680
681
682   (defun insert-date ()
683     "Insert date at point."
684     (interactive)
685     (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z")))
686   (global-set-key "\C-[d" 'insert-date)
687
688   (defun unfill-paragraph (arg)
689     "Pull this whole paragraph up onto one line."
690     (interactive "*p")
691     (let ((fill-column 10000))
692       (fill-paragraph arg))
693     )
694
695   (column-number-mode t)
696   (setq-default reftex-plug-into-AUCTeX t)
697
698   (server-start)
699
700   ; (require 'mode-compile)
701
702   (defadvice server-process-filter (after post-mode-message first activate)
703     "If the buffer is in post mode, overwrite the server-edit
704       message with a post-save-current-buffer-and-exit message."
705     (if (eq major-mode 'post-mode)
706         (message
707          (substitute-command-keys "Type \\[describe-mode] for help composing; \\[post-save-current-buffer-and-exit] when done."))))
708                       ; This is also needed to see the magic message.  Set to a higher
709                       ; number if you have a faster computer or read slower than me.
710   '(font-lock-verbose 1000)
711   ;(setq-default server-temp-file-regexp "mutt\(-\|ng-\)")
712   ; (add-hook 'server-switch-hook 
713   ;     (function (lambda()
714   ;             (cond ((string-match "Post" mode-name)
715   ;                (post-goto-body)))
716   ;             set-buffer-file-coding-system 'utf-8
717   ;             )))
718   ; 
719
720   (add-hook 'post-mode-hook
721         (auto-fill-mode nil)
722         )
723   ; abbrev mode settings
724   ; load abbreviations from 
725   (setq abbrev-file-name       
726         "~/.emacs_abbrev_def")
727
728   ; read the abbrev file if it exists
729   (if (file-exists-p abbrev-file-name)
730       (quietly-read-abbrev-file))
731
732   ; for now, use abbrev mode everywhere
733   (setq default-abbrev-mode t)
734
735
736   (defun insert-function-documentation ()
737     "Insert function documentation"
738     (interactive)
739     (insert-file-contents "/home/don/lib/templates/perl_function_documentation" nil))
740   (global-set-key "\M-f" 'insert-function-documentation)
741
742   (eval-after-load "lilypond-mode" 
743     '(progn
744        (load-library "lyqi-mode")
745        (define-key LilyPond-mode-map "\C-cq" 'lyqi-mode)))
746
747   (autoload 'spamassassin-mode "spamassassin-mode" nil t)
748
749   (desktop-load-default)
750   (desktop-read)
751   '(icomplete-mode on)
752   (custom-set-faces
753    ;; custom-set-faces was added by Custom.
754    ;; If you edit it by hand, you could mess it up, so be careful.
755    ;; Your init file should contain only one such instance.
756    ;; If there is more than one, they won't work right.
757    '(menu ((((type x-toolkit)) (:background "black" :foreground "grey90")))))
758
759
760   (put 'upcase-region 'disabled nil)
761   (put 'downcase-region 'disabled nil)
762   (put 'narrow-to-region 'disabled nil)
763
764
765   (autoload 'flyspell-mode "flyspell" "On-the-fly spelling checker." t)
766   (add-hook 'message-mode-hook 'turn-on-flyspell)
767   (add-hook 'text-mode-hook 'turn-on-flyspell)
768   (add-hook 'c-mode-common-hook 'flyspell-prog-mode)
769   (add-hook 'cperl-mode-hook 'flyspell-prog-mode)
770   (add-hook 'tcl-mode-hook 'flyspell-prog-mode)
771   ; (defun turn-on-flyspell ()
772   ;    "Force flyspell-mode on using a positive arg.  For use in hooks."
773   ;    (interactive)
774   ;    (flyspell-mode 1))
775
776
777    ; Outline-minor-mode key map
778    (define-prefix-command 'cm-map nil "Outline-")
779    ; HIDE
780    (define-key cm-map "q" 'hide-sublevels)    ; Hide everything but the top-level headings
781    (define-key cm-map "t" 'hide-body)         ; Hide everything but headings (all body lines)
782    (define-key cm-map "o" 'hide-other)        ; Hide other branches
783    (define-key cm-map "c" 'hide-entry)        ; Hide this entry's body
784    (define-key cm-map "l" 'hide-leaves)       ; Hide body lines in this entry and sub-entries
785    (define-key cm-map "d" 'hide-subtree)      ; Hide everything in this entry and sub-entries
786    ; SHOW
787    (define-key cm-map "a" 'show-all)          ; Show (expand) everything
788    (define-key cm-map "e" 'show-entry)        ; Show this heading's body
789    (define-key cm-map "i" 'show-children)     ; Show this heading's immediate child sub-headings
790    (define-key cm-map "k" 'show-branches)     ; Show all sub-headings under this heading
791    (define-key cm-map "s" 'show-subtree)      ; Show (expand) everything in this heading & below
792    ; MOVE
793    (define-key cm-map "u" 'outline-up-heading)                ; Up
794    (define-key cm-map "n" 'outline-next-visible-heading)      ; Next
795    (define-key cm-map "p" 'outline-previous-visible-heading)  ; Previous
796    (define-key cm-map "f" 'outline-forward-same-level)        ; Forward - same level
797    (define-key cm-map "b" 'outline-backward-same-level)       ; Backward - same level
798    (global-set-key "\M-o" cm-map)
799
800
801   ; debian stuff
802   (setq-default debian-changelog-mailing-address "don@debian.org")
803   (setq-default debian-changelog-full-name "Don Armstrong")
804
805   ; ediff configuration
806   ; don't use the multi-window configuration
807   (setq ediff-window-setup-function 'ediff-setup-windows-plain)
808
809   ; use iedit
810   (require 'iedit)
811   (define-key global-map (kbd "C-;") 'iedit-mode)
812   (global-set-key  (kbd "C-;") 'iedit-mode)
813
814   ; fix up css mode to not be silly
815   ; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/
816   (setq cssm-indent-level 4)
817   (setq cssm-newline-before-closing-bracket t)
818   (setq cssm-indent-function #'cssm-c-style-indenter)
819   (setq cssm-mirror-mode nil)
820
821   (require 'multi-web-mode)
822   (setq mweb-default-major-mode 'html-mode)
823   (setq mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>")
824                     (js-mode "<script +\\(type=\"text/javascript\"\\|language=\"javascript\"\\)[^>]*>" "</script>")
825                     (css-mode "<style +type=\"text/css\"[^>]*>" "</style>")))
826   (setq mweb-filename-extensions '("php" "htm" "html" "ctp" "phtml" "php4" "php5"))
827   (multi-web-global-mode 1)
828
829   ;;; alias the new `flymake-report-status-slim' to
830   ;;; `flymake-report-status'
831   (defalias 'flymake-report-status 'flymake-report-status-slim)
832   (defun flymake-report-status-slim (e-w &optional status)
833     "Show \"slim\" flymake status in mode line."
834     (when e-w
835       (setq flymake-mode-line-e-w e-w))
836     (when status
837       (setq flymake-mode-line-status status))
838     (let* ((mode-line " Φ"))
839       (when (> (length flymake-mode-line-e-w) 0)
840         (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
841       (setq mode-line (concat mode-line flymake-mode-line-status))
842       (setq flymake-mode-line mode-line)
843       (force-mode-line-update)))
844
845   ; load sql-indent when sql is loaded
846   (eval-after-load "sql"
847     '(load-library "sql-indent"))
848
849   ; fix up tmux xterm keys
850   ; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux
851   (if (getenv "TMUX")
852       (progn
853         (let ((x 2) (tkey ""))
854           (while (<= x 8)
855             ;; shift
856             (if (= x 2)
857                 (setq tkey "S-"))
858             ;; alt
859             (if (= x 3)
860                 (setq tkey "M-"))
861             ;; alt + shift
862             (if (= x 4)
863                 (setq tkey "M-S-"))
864             ;; ctrl
865             (if (= x 5)
866                 (setq tkey "C-"))
867             ;; ctrl + shift
868             (if (= x 6)
869                 (setq tkey "C-S-"))
870             ;; ctrl + alt
871             (if (= x 7)
872                 (setq tkey "C-M-"))
873             ;; ctrl + alt + shift
874             (if (= x 8)
875                 (setq tkey "C-M-S-"))
876   
877             ;; arrows
878             (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
879             (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
880             (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
881             (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
882             ;; home
883             (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
884             ;; end
885             (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
886             ;; page up
887             (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
888             ;; page down
889             (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
890             ;; insert
891             (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
892             ;; delete
893             (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
894             ;; f1
895             (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
896             ;; f2
897             (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
898             ;; f3
899             (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
900             ;; f4
901             (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
902             ;; f5
903             (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
904             ;; f6
905             (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
906             ;; f7
907             (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
908             ;; f8
909             (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
910             ;; f9
911             (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
912             ;; f10
913             (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
914             ;; f11
915             (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
916             ;; f12
917             (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
918             ;; f13
919             (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
920             ;; f14
921             (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
922             ;; f15
923             (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
924             ;; f16
925             (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
926             ;; f17
927             (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
928             ;; f18
929             (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
930             ;; f19
931             (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
932             ;; f20
933             (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))
934
935             (setq x (+ x 1))
936             ))
937         )
938     )
939
940   ; procmailmode configuration
941   (load "procmail_mode")
942
943   (load "mode-line-cleaner")
944
945   (defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary)
946     "Call ask-user-about-supersession-threat only if the buffer is actually obsolete."
947     (if (or (buffer-modified-p)
948             (verify-visited-file-modtime)
949             (< (* 8 1024 1024) (buffer-size))
950             (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-")))
951         ad-do-it
952       (clear-visited-file-modtime)
953       (not-modified)))
954   (ad-activate 'ask-user-about-supersession-threat)
955
956   ; apparently things like to step on C-;, so we'll use a hack from
957   ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this
958
959   (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
960
961   ; use iedit everywhere
962   (define-key my-keys-minor-mode-map (kbd "C-;") 'iedit-mode)
963
964   (define-minor-mode my-keys-minor-mode
965     "A minor mode so that my key settings override annoying major modes."
966     t " my-keys" 'my-keys-minor-mode-map)
967
968   (my-keys-minor-mode 1)
969   (defun my-minibuffer-setup-hook ()
970     (my-keys-minor-mode 0))
971
972   (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
973   (defadvice load (after give-my-keybindings-priority)
974     "Try to ensure that my keybindings always have priority."
975     (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode))
976         (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
977           (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
978           (add-to-list 'minor-mode-map-alist mykeys))))
979   (ad-activate 'load)
980   (global-set-key "\M- " 'hippie-expand)
981
982 #+END_SRC
983
984 * END
985 #+BEGIN_SRC emacs-lisp
986   (provide 'don-configuration)
987 #+END_SRC