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