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