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