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