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