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