+#+PROPERTY: header-args:emacs-lisp :tangle don-configuration.el
* Load debugger
# if for some reason, things get pear-shaped, we want to be able to
# enter the debugger by sending -USR2 to emacs
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
+#+BEGIN_SRC emacs-lisp
(setq debug-on-event 'siguser2)
#+END_SRC
* Add library paths
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
+#+BEGIN_SRC emacs-lisp
(add-to-list 'load-path '"~/lib/emacs_el/")
- (add-to-list 'load-path '"~/lib/emacs_el/helm")
(add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/tiny")
(add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/other")
- (add-to-list 'load-path '"~/lib/emacs_el/auctex/lisp")
- (add-to-list 'load-path '"~/lib/emacs_el/ESS/lisp")
+ (add-to-list 'load-path '"~/lib/emacs_el/magit-annex")
#+END_SRC
-
+* Package management
+** package repositories and package manager
+#+BEGIN_SRC emacs-lisp
+ (require 'package)
+ (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
+ ("melpa" . "https://melpa.org/packages/")
+ ("org" . "http://orgmode.org/elpa/") ))
+#+END_SRC
+** [[https://github.com/jwiegley/use-package/][use-package]]
+#+BEGIN_SRC emacs-lisp
+ (require 'use-package)
+ (package-initialize)
+#+END_SRC
+** Paradox
+#+BEGIN_SRC emacs-lisp
+ (package-initialize)
+ (use-package paradox
+ :ensure paradox
+ )
+#+END_SRC
* Misc functions
** with-library
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
+#+BEGIN_SRC emacs-lisp
;; From http://www.emacswiki.org/emacs/LoadingLispFiles
;; execute conditional code when loading libraries
(defmacro with-library (symbol &rest body)
#+END_SRC
+* Memory
+#+BEGIN_SRC emacs-lisp
+ (setq global-mark-ring-max 128
+ mark-ring-max 128
+ kill-ring-max 128)
+ (defun don/minibuffer-setup-hook ()
+ (setq gc-cons-threshold most-positive-fixnum))
+
+ (defun don/minibuffer-exit-hook ()
+ (setq gc-cons-threshold 1048576))
+
+ (add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook)
+ (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook)
+#+END_SRC
* Modules
+** Flyspell 🐝
+#+BEGIN_SRC emacs-lisp
+ (use-package flyspell
+ :ensure t
+ :diminish flyspell-mode 🐝
+ :config
+ (add-hook 'message-mode-hook 'turn-on-flyspell)
+ (add-hook 'text-mode-hook 'turn-on-flyspell)
+ (add-hook 'c-mode-common-hook 'flyspell-prog-mode)
+ (add-hook 'cperl-mode-hook 'flyspell-prog-mode)
+ (add-hook 'tcl-mode-hook 'flyspell-prog-mode)
+ :init
+ (setq ispell-program-name "ispell")
+ )
+
+#+END_SRC
+** Winnermode
+#+BEGIN_SRC emacs-lisp
+ (winner-mode 1)
+#+END_SRC
+** Eyebrowse
+
+#+BEGIN_SRC emacs-lisp
+ ;; (use-package eyebrowse
+ ;; :ensure t
+ ;; :diminish eyebrowse-mode
+ ;; :init (setq eyebrowse-keymap-prefix (kbd "C-c C-\\"))
+ ;; :config (progn
+ ;; (setq eyebrowse-wrap-around t)
+ ;; (eyebrowse-mode t)
+ ;;
+ ;; (defun my/eyebrowse-new-window-config ()
+ ;; (interactive)
+ ;; (let ((done nil))
+ ;; (dotimes (i 10)
+ ;; ;; start at 1 run till 0
+ ;; (let ((j (mod (+ i 1) 10)))
+ ;; (when (and (not done)
+ ;; (not (eyebrowse--window-config-present-p j)))
+ ;; (eyebrowse-switch-to-window-config j)
+ ;; (call-interactively 'eyebrowse-rename-window-config2 j)
+ ;; (setq done t)
+ ;; ))
+ ;; )))
+ ;;
+ ;; ;; I don't use latex-preview-pane
+ ;; ;; (require 'latex-preview-pane)
+ ;; ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch ()
+ ;; ;; ;; latex-preview-pane uses window-parameters which are
+ ;; ;; ;; not preserved by eyebrowse, so we close the preview
+ ;; ;; ;; pane before switching, it will be regenerated when we
+ ;; ;; ;; edit the TeX file.
+ ;; ;; (when (lpp/window-containing-preview)
+ ;; ;; (delete-window (lpp/window-containing-preview))))
+ ;;
+ ;; ;; (add-to-list 'eyebrowse-pre-window-switch-hook
+ ;; ;; #'my/close-latex-preview-pane-before-eyebrowse-switch)
+ ;;
+ ;; ;; (my/set-menu-key "[" #'my/eyebrowse-new-window-config)
+ ;; ;; (my/set-menu-key ";" #'eyebrowse-prev-window-config)
+ ;; ;; (my/set-menu-key "'" #'eyebrowse-next-window-config)
+ ;; ;; (my/set-menu-key "]" #'eyebrowse-close-window-config)
+ ;; ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config)
+ ;; )
+ ;; )
+#+END_SRC
+
+** Window handling
+
+*** Splitting
+#+BEGIN_SRC emacs-lisp
+ (defun my/vsplit-last-buffer ()
+ "Split the window vertically and display the previous buffer."
+ (interactive)
+ (split-window-vertically)
+ (other-window 1 nil)
+ (switch-to-next-buffer))
+
+ (defun my/hsplit-last-buffer ()
+ "Split the window horizontally and display the previous buffer."
+ (interactive)
+ (split-window-horizontally)
+ (other-window 1 nil)
+ (switch-to-next-buffer))
+
+ (bind-key "C-x 2" 'my/vsplit-last-buffer)
+ (bind-key "C-x 3" 'my/hsplit-last-buffer)
+
+ (setq split-width-threshold 100)
+ (setq split-height-threshold 60)
+
+ (defun my/split-window-prefer-vertically (window)
+ "If there's only one window (excluding any possibly active
+ minibuffer), then split the current window horizontally."
+ (if (and (one-window-p t)
+ (not (active-minibuffer-window))
+ ( < (frame-width) (frame-height))
+ )
+ (let ((split-width-threshold nil))
+ (split-window-sensibly window))
+ (split-window-sensibly window)))
+
+ (setq split-window-preferred-function #'my/split-window-prefer-vertically)
+ (setq window-combination-resize t)
+#+END_SRC
+
+*** Compilation window
+
+If there is no compilation window, open one at the bottom, spanning
+the complete width of the frame. Otherwise, reuse existing window. In
+the former case, if there was no error the window closes
+automatically.
+
+#+BEGIN_SRC emacs-lisp
+ (add-to-list 'display-buffer-alist
+ `(,(rx bos "*compilation*" eos)
+ (display-buffer-reuse-window
+ display-buffer-in-side-window)
+ (reusable-frames . visible)
+ (side . bottom)
+ (window-height . 0.4)))
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp
+ (defun my/compilation-exit-autoclose (status code msg)
+ ;; If M-x compile exists with a 0
+ (when (and (eq status 'exit) (zerop code))
+ ;; and delete the *compilation* window
+ (let ((compilation-window (get-buffer-window (get-buffer "*compilation*"))))
+ (when (and (not (window-at-side-p compilation-window 'top))
+ (window-at-side-p compilation-window 'left)
+ (window-at-side-p compilation-window 'right))
+ (delete-window compilation-window))))
+ ;; Always return the anticipated result of compilation-exit-message-function
+ (cons msg code))
+
+ ;; Specify my function (maybe I should have done a lambda function)
+ (setq compilation-exit-message-function #'my/compilation-exit-autoclose)
+#+END_SRC
+
+If you change the variable ~compilation-scroll-output~ to a ~non-nil~
+value, the compilation buffer scrolls automatically to follow the
+output. If the value is ~first-error~, scrolling stops when the first
+error appears, leaving point at that error. For any other non-nil
+value, scrolling continues until there is no more output.
+
+#+BEGIN_SRC emacs-lisp
+ (setq compilation-scroll-output 'first-error)
+#+END_SRC
+
+** Mode line cleaning
+*** Diminish
+#+BEGIN_SRC emacs-lisp
+ (use-package diminish
+ :ensure t)
+#+END_SRC
+
+*** Delight
+#+BEGIN_SRC emacs-lisp
+ (use-package delight
+ :ensure t)
+#+END_SRC
+
+** Jumping
+*** Avy
+#+BEGIN_SRC emacs-lisp
+(use-package avy
+ :ensure t
+ :bind ("C-c C-SPC" . avy-goto-word-1)
+ :config (progn
+ (setq avy-background t)
+ (key-chord-define-global "jj" #'avy-goto-word-1)))
+#+END_SRC
+
+** Snippets
+
+*** Yasnippet
+#+BEGIN_SRC emacs-lisp
+ (use-package yasnippet
+ :ensure t
+ :diminish yas-minor-mode
+ :config (progn
+ (yas-global-mode)
+ (setq yas-verbosity 1)
+ (define-key yas-minor-mode-map (kbd "<tab>") nil)
+ (define-key yas-minor-mode-map (kbd "TAB") nil)
+ (define-key yas-minor-mode-map (kbd "<backtab>") 'yas-expand)
+ ))
+#+END_SRC
+
+** Helm Flx
+
+[[https://github.com/PythonNut/helm-flx][helm-flx]] implements intelligent helm fuzzy sorting, provided by [[https://github.com/lewang/flx][flx]].
+
+#+BEGIN_SRC emacs-lisp
+(use-package helm-flx
+ :ensure t
+ :config (progn
+ ;; these are helm configs, but they kind of fit here nicely
+ (setq helm-M-x-fuzzy-match t
+ helm-bookmark-show-location t
+ helm-buffers-fuzzy-matching t
+ helm-completion-in-region-fuzzy-match t
+ helm-file-cache-fuzzy-match t
+ helm-imenu-fuzzy-match t
+ helm-mode-fuzzy-match t
+ helm-locate-fuzzy-match nil
+ helm-quick-update t
+ helm-recentf-fuzzy-match nil
+ helm-semantic-fuzzy-match t)
+ (helm-flx-mode +1)))
+#+END_SRC
+
+
** Tinyprocmail
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
+#+BEGIN_SRC emacs-lisp
;; load tinyprocmail
- (with-library 'tinyprocmail
- ; (setq tinyprocmail--procmail-version "v3.22")
- (add-hook 'tinyprocmail--load-hook 'tinyprocmail-install))
+ (use-package tinyprocmail
+ :ensure f
+ :config (with-library 'tinyprocmail
+ ;; (setq tinyprocmail--procmail-version "v3.22")
+ (add-hook 'tinyprocmail--load-hook 'tinyprocmail-install))
+ )
#+END_SRC
** Magit
#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
- ; don't verify where we are pushing
- (setq magit-push-always-verify nil)
+ (use-package magit
+ :ensure t
+ :bind (("C-x g" . magit-status)
+ ("C-x C-g" . magit-status))
+ :config
+ ;; don't verify where we are pushing
+ (setq magit-push-always-verify nil)
+ ;; refine diffs always (hilight words)
+ (setq magit-diff-refine-hunk nil)
+ ;; load magit-annex
+ (setq load-path
+ (append '("~/lib/emacs_el/magit-annex")
+ load-path))
+ ;; load magit-vcsh
+ (setq load-path
+ (append '("~/lib/emacs_el/magit-vcsh")
+ load-path))
+ )
+ (use-package magit-annex
+ :ensure t
+ )
+ (use-package magit-vcsh
+ :ensure f ; currently not in melpa, so don't try to install
+ )
#+END_SRC
** Perl
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
+#+BEGIN_SRC emacs-lisp
(require 'cperl-mode)
;; Use c-mode for perl .xs files
(add-to-list 'auto-mode-alist '("\\.xs\\'" . c-mode))
#+END_SRC
** Helm
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
-(require 'don-helm)
+#+BEGIN_SRC emacs-lisp
+ (use-package helm
+ :ensure t
+ :config
+ (helm-mode 1)
+ (define-key global-map [remap find-file] 'helm-find-files)
+ (define-key global-map [remap occur] 'helm-occur)
+ (define-key global-map [remap list-buffers] 'helm-buffers-list)
+ (define-key global-map [remap dabbrev-expand] 'helm-dabbrev)
+ (global-set-key (kbd "M-x") 'helm-M-x)
+ (unless (boundp 'completion-in-region-function)
+ (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)
+ (define-key emacs-lisp-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point))
+ (add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$TMP") (delete-file "$TMP"))))
+ )
#+END_SRC
** Hydra
#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
#+END_SRC
** Tramp
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
+#+BEGIN_SRC emacs-lisp
(add-to-list 'tramp-methods '("vcsh"
(tramp-login-program "vcsh")
(tramp-login-args
(tramp-remote-shell-args
("-c"))))
#+END_SRC
+** Reftex
+#+BEGIN_SRC emacs-lisp
+ (use-package reftex
+ :ensure t
+ :config
+ (setq-default reftex-default-bibliography
+ '("~/projects/research/references.bib")))
+#+END_SRC
** LaTeX
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
- ; this is in the very newest auctex; avoid for now
- (add-to-list 'LaTeX-fill-excluded-macros
- '("Sexpr"))
- ;; REFTEX (much enhanced management of cross-ref, labels, etc)
- ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/
- (autoload 'reftex-mode "reftex" "RefTeX Minor Mode" t)
- (autoload 'turn-on-reftex "reftex" "RefTeX Minor Mode" nil)
- (autoload 'reftex-citation "reftex-cite" "Make citation" nil)
- (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t)
- (add-hook 'LaTeX-mode-hook 'turn-on-reftex) ; with AUCTeX LaTeX mode
- (add-hook 'latex-mode-hook 'turn-on-reftex) ; with Emacs latex mode
- (add-hook 'LaTeX-mode-hook 'outline-minor-mode) ; with AUCTeX LaTeX mode
- (add-hook 'latex-mode-hook 'outline-minor-mode) ; with Emacs latex mode
-
- ; use smart quotes by default instead of `` and ''
- ; taken from http://kieranhealy.org/esk/kjhealy.html
- (setq TeX-open-quote "“")
- (setq TeX-close-quote "”")
-
- ;; (TeX-add-style-hook
- ;; "latex"
- ;; (lambda ()
- ;; (TeX-add-symbols
- ;; '("DLA" 1))))
- ;; (custom-set-variables
- ;; '(font-latex-user-keyword-classes
- ;; '(("fixme"
- ;; ("DLA" "RZ")
- ;; font-lock-function-name-face 2 (command 1 t))))
- ;; )
-
- (require 'font-latex)
- (setq font-latex-match-reference-keywords
- '(
- ("fref" "{")
- ("Fref" "{")
- ("citep" "{")
- ("citet" "{")
- ("acs" "{")
- ("acsp" "{")
- ("ac" "{")
- ("acp" "{")
- ("acl" "{")
- ("aclp" "{")
- ("acsu" "{")
- ("aclu" "{")
- ("acused" "{")
- ; ))
- ; (setq font-latex-match-warning-keywords
- ; '(
- ("DLA" "{")
- ("RZ" "{")
- ("OM" "{")
- ("DL" "{")
- ("fixme" "{")))
-
- (setq-default TeX-parse-self t)
- (setq-default TeX-auto-save t)
- (setq-default TeX-master nil)
-
- ;; this doesn't seem to work; not currently sure why
- ; (setq font-latex-user-keyword-classes
- ; '(("my-warning-commands"
- ; (("DLA" "{")
- ; ("RZ" "{")
- ; ("OM" "{")
- ; ("DL" "{")
- ; ("fixme" "{")
- ; )
- ; (:foreground "red" :weight bold :underline (:color foreground-color :style line)))
- ; ))
-
- (setq-default reftex-default-bibliography
- '("~/projects/research/references.bib"))
+#+BEGIN_SRC emacs-lisp
+ (use-package tex
+ :defer t
+ :ensure auctex
+ :config
+ ; (add-to-list 'TeX-style-path '"/home/don/lib/emacs_el/auctex/style")
+ ;; REFTEX (much enhanced management of cross-ref, labels, etc)
+ ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/
+ ; (autoload 'reftex-mode "reftex" "RefTeX Minor Mode" t)
+ ; (autoload 'turn-on-reftex "reftex" "RefTeX Minor Mode" nil)
+ ; (autoload 'reftex-citation "reftex-cite" "Make citation" nil)
+ ; (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t)
+ (add-hook 'LaTeX-mode-hook 'turn-on-reftex) ; with AUCTeX LaTeX mode
+ (add-hook 'latex-mode-hook 'turn-on-reftex) ; with Emacs latex mode
+ (add-hook 'LaTeX-mode-hook 'outline-minor-mode) ; with AUCTeX LaTeX mode
+ (add-hook 'latex-mode-hook 'outline-minor-mode) ; with Emacs latex mode
+
+ (setq-default reftex-plug-into-AUCTeX t)
+ ;; support fake section headers
+ (setq TeX-outline-extra
+ '(("%chapter" 1)
+ ("%section" 2)
+ ("%subsection" 3)
+ ("%subsubsection" 4)
+ ("%paragraph" 5)))
+ ;; add font locking to the headers
+ (font-lock-add-keywords
+ 'latex-mode
+ '(("^%\\(chapter\\|\\(sub\\|subsub\\)?section\\|paragraph\\)"
+ 0 'font-lock-keyword-face t)
+ ("^%chapter{\\(.*\\)}" 1 'font-latex-sectioning-1-face t)
+ ("^%section{\\(.*\\)}" 1 'font-latex-sectioning-2-face t)
+ ("^%subsection{\\(.*\\)}" 1 'font-latex-sectioning-3-face t)
+ ("^%subsubsection{\\(.*\\)}" 1 'font-latex-sectioning-4-face t)
+ ("^%paragraph{\\(.*\\)}" 1 'font-latex-sectioning-5-face t)))
+ ;; use smart quotes by default instead of `` and ''
+ ;; taken from http://kieranhealy.org/esk/kjhealy.html
+ (setq TeX-open-quote "“")
+ (setq TeX-close-quote "”")
+ ;; (TeX-add-style-hook
+ ;; "latex"
+ ;; (lambda ()
+ ;; (TeX-add-symbols
+ ;; '("DLA" 1))))
+ ;; (custom-set-variables
+ ;; '(font-latex-user-keyword-classes
+ ;; '(("fixme"
+ ;; ("DLA" "RZ")
+ ;; font-lock-function-name-face 2 (command 1 t))))
+ ;; )
+ (setq-default TeX-parse-self t)
+ (setq-default TeX-auto-save t)
+ (setq-default TeX-master nil)
+ (eval-after-load
+ "latex"
+ '(TeX-add-style-hook
+ "cleveref"
+ (lambda ()
+ (if (boundp 'reftex-ref-style-alist)
+ (add-to-list
+ 'reftex-ref-style-alist
+ '("Cleveref" "cleveref"
+ (("\\cref" ?c) ("\\Cref" ?C) ("\\cpageref" ?d) ("\\Cpageref" ?D)))))
+ (reftex-ref-style-activate "Cleveref")
+ (TeX-add-symbols
+ '("cref" TeX-arg-ref)
+ '("Cref" TeX-arg-ref)
+ '("cpageref" TeX-arg-ref)
+ '("Cpageref" TeX-arg-ref)))))
+ (eval-after-load
+ "latex"
+ '(add-to-list 'LaTeX-fill-excluded-macros
+ '("Sexpr")))
+
+ (use-package font-latex
+ :config
+ (setq font-latex-match-reference-keywords
+ '(
+ ("fref" "{")
+ ("Fref" "{")
+ ("citep" "{")
+ ("citet" "{")
+ ("acs" "{")
+ ("acsp" "{")
+ ("ac" "{")
+ ("acp" "{")
+ ("acl" "{")
+ ("aclp" "{")
+ ("acsu" "{")
+ ("aclu" "{")
+ ("acused" "{")
+ ("DLA" "{")
+ ("RZ" "{")
+ ("OM" "{")
+ ("DL" "{")
+ ("fixme" "{"))
+ )
+ )
+ )
+
+#+END_SRC
+** Org
+#+BEGIN_SRC emacs-lisp
+ (require 'org-mode-configuration)
+#+END_SRC
+*** Org-Gcal
+#+BEGIN_SRC emacs-lisp
+ (use-package calfw
+ :ensure f
+ )
+ (use-package calfw-org
+ :ensure f
+ )
+ (use-package org-gcal
+ :ensure f
+ :config '((if (file-readable-p "~/.hide/org_gcal.el")
+ (load-file "~/.hide/org_gcal.el"))
+ )
+ )
+#+END_SRC
+** ESS
+#+BEGIN_SRC emacs-lisp
+ (use-package ess
+ :ensure t
+ :config (require 'ess_configuration))
+#+END_SRC
+
+** Rainbowmode
+From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colorizes color strings
+
+#+BEGIN_SRC emacs-lisp
+ (use-package rainbow-mode
+ ;; add ess to the x major mode
+ :config (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S])
+ (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R])
+ )
+#+END_SRC
+
+** Polymode
+#+BEGIN_SRC emacs-lisp
+ (use-package polymode
+ :config
+ (use-package poly-R)
+ (use-package poly-noweb)
+ (use-package poly-markdown)
+ :mode ("\\.Snw" . poly-noweb+r-mode)
+ :mode ("\\.Rnw" . poly-noweb+r-mode)
+ :mode ("\\.Rmd" . poly-markdown+r-mode)
+ )
+#+END_SRC
+
+** Outlining
+*** Outline magic
+#+BEGIN_SRC emacs-lisp
+ (use-package outline-magic)
+#+END_SRC
+** Writeroom Mode
+#+BEGIN_SRC emacs-lisp
+ (use-package writeroom-mode
+ :config (add-hook 'writeroom-mode-hook 'auto-fill-mode)
+ )
+#+END_SRC
+** GhostText/Atomic Chrome
+#+BEGIN_SRC emacs-lisp
+ (use-package atomic-chrome
+ :config (atomic-chrome-start-server)
+ )
#+END_SRC
* Keybindings
** Override other things
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
+#+BEGIN_SRC emacs-lisp
; apparently things like to step on C-;, so we'll use a hack from
; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this
; use iedit everywhere
(define-key my-keys-minor-mode-map (kbd "C-;") 'iedit-mode)
;; use outline mode keybindings everywhere
- (define-key my-keys-minor-mode-map (kbd "C-;") 'my/mydra-outline/body)
+ ;; (define-key my-keys-minor-mode-map (kbd "C-;") 'my/mydra-outline/body)
+
+ (define-minor-mode my-keys-minor-mode
+ "A minor mode so that my key settings override annoying major modes."
+ t " my-keys" 'my-keys-minor-mode-map)
+
+ (my-keys-minor-mode 1)
+ (defun my-minibuffer-setup-hook ()
+ (my-keys-minor-mode 0))
+
+ (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
+ (defadvice load (after give-my-keybindings-priority)
+ "Try to ensure that my keybindings always have priority."
+ (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode))
+ (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
+ (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
+ (add-to-list 'minor-mode-map-alist mykeys))))
+ (ad-activate 'load)
+#+END_SRC
+
+* Misc (uncharacterized)
+#+BEGIN_SRC emacs-lisp
+ (setq bibtex-user-optional-fields (quote (("annote" "Personal annotation (ignored)") ("abstract" "") ("pmid" "") ("doi" ""))))
+ (setq calendar-latitude 40.11)
+ (setq calendar-longitude -88.24)
+ (setq case-fold-search t)
+ (setq confirm-kill-emacs (quote y-or-n-p))
+ (setq cperl-lazy-help-time nil)
+ (setq debian-changelog-mailing-address "don@debian.org")
+ (display-time)
+ (setq display-time-24hr-format t)
+ (setq display-time-day-and-date t)
+ (display-time-mode 1)
+ (setq font-latex-fontify-script nil)
+ (setq font-latex-fontify-sectioning (quote color))
+ (setq font-latex-script-display (quote (nil)))
+ (global-auto-revert-mode 1)
+ (global-font-lock-mode 1)
+ (icomplete-mode 1)
+ (setq log-edit-keep-buffer t)
+ (setq mail-user-agent (quote sendmail-user-agent))
+ (setq markdown-enable-math t)
+ (setq markdown-follow-wiki-link-on-enter nil)
+ (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases")))
+ (setq post-email-address "don@donarmstrong.com")
+ (setq post-kill-quoted-sig nil)
+ (setq post-mail-message "mutt\\(ng\\|\\)-[a-z0-9]+-[0-9]+-.*")
+ (setq post-uses-fill-mode nil)
+ (setq ps-footer-font-size (quote (8 . 10)))
+ (setq ps-header-font-size (quote (8 . 10)))
+ (setq ps-header-title-font-size (quote (10 . 10)))
+ (setq ps-line-number-color "blue")
+ (setq ps-print-footer t)
+ (setq ps-print-footer-frame nil)
+ (setq ps-print-only-one-header t)
+ (setq safe-local-variable-values (quote ((auto-save-default) (make-backup-files))))
+ (setq sentence-end "[.?!][]\"')]*\\($\\| \\| \\)[
+ ]*")
+ (setq sentence-end-double-space nil)
+ ; enable matching parenthesis
+ (show-paren-mode 1)
+ (tool-bar-mode -1)
+ (setq user-mail-address "don@donarmstrong.com")
+ (setq vc-delete-logbuf-window nil)
+ (setq vc-follow-symlinks t)
+
+ ;; use git before SVN; use CVS earlier, because I have CVS
+ ;; repositories inside of git directories
+ (setq vc-handled-backends (quote (CVS Git RCS SVN SCCS Bzr Hg Mtn Arch)))
+
+ ;; switch back to the old primary selection method
+ (setq x-select-enable-clipboard nil)
+ (setq x-select-enable-primary t)
+ ; (setq mouse-drag-copy-region t)
+
+ (fset 'perl-mode 'cperl-mode)
+ ;;(load-file "cperl-mode.el")
+
+ (require 'vcl-mode)
+
+ (require 'tex-site)
+ ;;(require 'psvn)
+ ;;(require 'ecasound)
+ ;;(require 'emacs-wiki)
+ (require 'bibtex)
+ (require 'post)
+ ;;(require 'fixme)
+ ; (require 'google-weather)
+ ; (require 'org-google-weather)
+ ; (setq-default org-google-weather-format "%i %c, [%l,%h] %s %C")
+
+ (global-set-key "\C-xp" 'server-edit)
+
+ (setq-default auto-mode-alist (cons '("\.wml$" .
+ (lambda () (html-mode) (auto-fill-mode)))
+ auto-mode-alist))
+
+
+ ; use markdown mode for mdwn files
+ (add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode))
+ (add-to-list 'auto-mode-alist '("\\.md$" . markdown-mode))
+
+
+ ;; tramp configuration
+ (setq tramp-use-ssh-controlmaster-options nil)
+
+ ; mail configuration
+ (add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . message-mode))
+ (add-to-list 'auto-mode-alist '("muttngrc" . muttrc-mode))
+
+ (add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . message-mode))
+ (add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode))
+ (defun my-message-mode-settings ()
+ (font-lock-add-keywords nil
+ '(("^[ \t]*>[ \t]*>[ \t]*>.*$"
+ (0 'message-multiply-quoted-text-face))
+ ("^[ \t]*>[ \t]*>.*$"
+ (0 'message-double-quoted-text-face))))
+ (local-set-key (kbd "C-c C-a") 'my-post-attach-file)
+ )
+ (add-hook 'message-mode-hook 'my-message-mode-settings)
+
+ (defun my-post-attach-file ()
+ "Prompt for an attachment."
+ (interactive)
+ (let ((file (read-file-name "Attach file: " nil nil t nil))
+ (description (string-read "Description: ")))
+ (my-header-attach-file file description)))
+
+ (symbol-function 'my-post-attach-file)
+
+ (defun my-header-attach-file (file description)
+ "Attach a FILE to the current message (works with Mutt).
+ Argument DESCRIPTION MIME description."
+ (interactive "fAttach file: \nsDescription: ")
+ (when (> (length file) 0)
+ (save-excursion
+ (save-match-data
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (search-forward-regexp "^$")
+ (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " "
+ description "\n"))
+ (message (concat "Attached '" file "'."))
+ (setq post-has-attachment t))))))
+
+
+
+ (setq mail-yank-prefix "> ")
+
+ (global-unset-key "\M-g")
+ (global-set-key "\M-g" 'goto-line)
+
+ ;; self-insert-command hack.
+ ;; Without this, "if<SP>" expands to
+ ;; if ( -!-) {
+ ;; }
+ ;; which really should be,
+ ;; if (-!-) {
+ ;; }
+
+
+
+ ;(load-library "php-mode")
+
+ (setq-default c-indent-level 4)
+ (setq-default c-brace-imaginary-offset 0)
+ (setq-default c-brace-offset -4)
+ (setq-default c-argdecl-indent 4)
+ (setq-default c-label-offset -4)
+ (setq-default c-continued-statement-offset 4)
+ ; tabs are annoying
+ (setq-default indent-tabs-mode nil)
+ (setq-default tab-width 4)
+
+
+ ;; (autoload 'php-mode "php-mode" "PHP editing mode" t)
+ ;; (add-to-list 'auto-mode-alist '("\\.php3?\\'" . php-mode))
+ ;; (add-to-list 'auto-mode-alist '("\\.phtml?\\'" . php-mode))
+ ;; (add-to-list 'auto-mode-alist '("\\.php?\\'" . php-mode))
+ ;; (add-to-list 'auto-mode-alist '("\\.php4?\\'" . php-mode))
+
+
+ (defun insert-date ()
+ "Insert date at point."
+ (interactive)
+ (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z")))
+ (global-set-key "\C-[d" 'insert-date)
+
+ (defun unfill-paragraph (arg)
+ "Pull this whole paragraph up onto one line."
+ (interactive "*p")
+ (let ((fill-column 10000))
+ (fill-paragraph arg))
+ )
+
+ (column-number-mode t)
+
+ (server-start)
+
+ ; (require 'mode-compile)
+
+ (defadvice server-process-filter (after post-mode-message first activate)
+ "If the buffer is in post mode, overwrite the server-edit
+ message with a post-save-current-buffer-and-exit message."
+ (if (eq major-mode 'post-mode)
+ (message
+ (substitute-command-keys "Type \\[describe-mode] for help composing; \\[post-save-current-buffer-and-exit] when done."))))
+ ; This is also needed to see the magic message. Set to a higher
+ ; number if you have a faster computer or read slower than me.
+ '(font-lock-verbose 1000)
+ ;(setq-default server-temp-file-regexp "mutt\(-\|ng-\)")
+ ; (add-hook 'server-switch-hook
+ ; (function (lambda()
+ ; (cond ((string-match "Post" mode-name)
+ ; (post-goto-body)))
+ ; set-buffer-file-coding-system 'utf-8
+ ; )))
+ ;
+
+ (add-hook 'post-mode-hook
+ (auto-fill-mode nil)
+ )
+ ; abbrev mode settings
+ ; load abbreviations from
+ (setq abbrev-file-name
+ "~/.emacs_abbrev_def")
+
+ ; read the abbrev file if it exists
+ (if (file-exists-p abbrev-file-name)
+ (quietly-read-abbrev-file))
+
+ ; for now, use abbrev mode everywhere
+ (setq default-abbrev-mode t)
+
+
+ (defun insert-function-documentation ()
+ "Insert function documentation"
+ (interactive)
+ (insert-file-contents "/home/don/lib/templates/perl_function_documentation" nil))
+ (global-set-key "\M-f" 'insert-function-documentation)
+
+ (eval-after-load "lilypond-mode"
+ '(progn
+ (load-library "lyqi-mode")
+ (define-key LilyPond-mode-map "\C-cq" 'lyqi-mode)))
+
+ (autoload 'spamassassin-mode "spamassassin-mode" nil t)
+
+ (desktop-load-default)
+ (desktop-read)
+ '(icomplete-mode on)
+ (custom-set-faces
+ ;; custom-set-faces was added by Custom.
+ ;; If you edit it by hand, you could mess it up, so be careful.
+ ;; Your init file should contain only one such instance.
+ ;; If there is more than one, they won't work right.
+ '(menu ((((type x-toolkit)) (:background "black" :foreground "grey90")))))
+
+
+ (put 'upcase-region 'disabled nil)
+ (put 'downcase-region 'disabled nil)
+ (put 'narrow-to-region 'disabled nil)
+
+ ; (defun turn-on-flyspell ()
+ ; "Force flyspell-mode on using a positive arg. For use in hooks."
+ ; (interactive)
+ ; (flyspell-mode 1))
+
+
+ ; Outline-minor-mode key map
+ (define-prefix-command 'cm-map nil "Outline-")
+ ; HIDE
+ (define-key cm-map "q" 'hide-sublevels) ; Hide everything but the top-level headings
+ (define-key cm-map "t" 'hide-body) ; Hide everything but headings (all body lines)
+ (define-key cm-map "o" 'hide-other) ; Hide other branches
+ (define-key cm-map "c" 'hide-entry) ; Hide this entry's body
+ (define-key cm-map "l" 'hide-leaves) ; Hide body lines in this entry and sub-entries
+ (define-key cm-map "d" 'hide-subtree) ; Hide everything in this entry and sub-entries
+ ; SHOW
+ (define-key cm-map "a" 'show-all) ; Show (expand) everything
+ (define-key cm-map "e" 'show-entry) ; Show this heading's body
+ (define-key cm-map "i" 'show-children) ; Show this heading's immediate child sub-headings
+ (define-key cm-map "k" 'show-branches) ; Show all sub-headings under this heading
+ (define-key cm-map "s" 'show-subtree) ; Show (expand) everything in this heading & below
+ ; MOVE
+ (define-key cm-map "u" 'outline-up-heading) ; Up
+ (define-key cm-map "n" 'outline-next-visible-heading) ; Next
+ (define-key cm-map "p" 'outline-previous-visible-heading) ; Previous
+ (define-key cm-map "f" 'outline-forward-same-level) ; Forward - same level
+ (define-key cm-map "b" 'outline-backward-same-level) ; Backward - same level
+ (global-set-key "\M-o" cm-map)
+
+
+ ; debian stuff
+ (setq-default debian-changelog-mailing-address "don@debian.org")
+ (setq-default debian-changelog-full-name "Don Armstrong")
+
+ ; ediff configuration
+ ; don't use the multi-window configuration
+ (setq ediff-window-setup-function 'ediff-setup-windows-plain)
+
+ ; use iedit
+ (require 'iedit)
+ (define-key global-map (kbd "C-;") 'iedit-mode)
+ (global-set-key (kbd "C-;") 'iedit-mode)
+
+ ; fix up css mode to not be silly
+ ; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/
+ (setq cssm-indent-level 4)
+ (setq cssm-newline-before-closing-bracket t)
+ (setq cssm-indent-function #'cssm-c-style-indenter)
+ (setq cssm-mirror-mode nil)
+
+ (require 'multi-web-mode)
+ (setq mweb-default-major-mode 'html-mode)
+ (setq mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>")
+ (js-mode "<script +\\(type=\"text/javascript\"\\|language=\"javascript\"\\)[^>]*>" "</script>")
+ (css-mode "<style +type=\"text/css\"[^>]*>" "</style>")))
+ (setq mweb-filename-extensions '("php" "htm" "html" "ctp" "phtml" "php4" "php5"))
+ (multi-web-global-mode 1)
+
+ ;;; alias the new `flymake-report-status-slim' to
+ ;;; `flymake-report-status'
+ (defalias 'flymake-report-status 'flymake-report-status-slim)
+ (defun flymake-report-status-slim (e-w &optional status)
+ "Show \"slim\" flymake status in mode line."
+ (when e-w
+ (setq flymake-mode-line-e-w e-w))
+ (when status
+ (setq flymake-mode-line-status status))
+ (let* ((mode-line " Φ"))
+ (when (> (length flymake-mode-line-e-w) 0)
+ (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
+ (setq mode-line (concat mode-line flymake-mode-line-status))
+ (setq flymake-mode-line mode-line)
+ (force-mode-line-update)))
+
+ ; load sql-indent when sql is loaded
+ (eval-after-load "sql"
+ '(load-library "sql-indent"))
+
+ ; fix up tmux xterm keys
+ ; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux
+ (defun fix-up-tmux-keys ()
+ "Fix up tmux xterm keys"
+ (if (getenv "TMUX")
+ (progn
+ (let ((x 2) (tkey ""))
+ (while (<= x 8)
+ ;; shift
+ (if (= x 2)
+ (setq tkey "S-"))
+ ;; alt
+ (if (= x 3)
+ (setq tkey "M-"))
+ ;; alt + shift
+ (if (= x 4)
+ (setq tkey "M-S-"))
+ ;; ctrl
+ (if (= x 5)
+ (setq tkey "C-"))
+ ;; ctrl + shift
+ (if (= x 6)
+ (setq tkey "C-S-"))
+ ;; ctrl + alt
+ (if (= x 7)
+ (setq tkey "C-M-"))
+ ;; ctrl + alt + shift
+ (if (= x 8)
+ (setq tkey "C-M-S-"))
+
+ ;; arrows
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
+ ;; home
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
+ ;; end
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
+ ;; page up
+ (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
+ ;; page down
+ (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
+ ;; insert
+ (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
+ ;; delete
+ (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
+ ;; f1
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
+ ;; f2
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
+ ;; f3
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
+ ;; f4
+ (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
+ ;; f5
+ (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
+ ;; f6
+ (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
+ ;; f7
+ (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
+ ;; f8
+ (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
+ ;; f9
+ (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
+ ;; f10
+ (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
+ ;; f11
+ (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
+ ;; f12
+ (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
+ ;; f13
+ (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
+ ;; f14
+ (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
+ ;; f15
+ (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
+ ;; f16
+ (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
+ ;; f17
+ (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
+ ;; f18
+ (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
+ ;; f19
+ (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
+ ;; f20
+ (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))
+
+ (setq x (+ x 1))
+ ))
+ )
+ )
+ )
+ ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys)
+
+ ; procmailmode configuration
+ (load "procmail_mode")
+
+ (load "mode-line-cleaner")
+
+ (defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary)
+ "Call ask-user-about-supersession-threat only if the buffer is actually obsolete."
+ (if (or (buffer-modified-p)
+ (verify-visited-file-modtime)
+ (< (* 8 1024 1024) (buffer-size))
+ (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-")))
+ ad-do-it
+ (clear-visited-file-modtime)
+ (not-modified)))
+ (ad-activate 'ask-user-about-supersession-threat)
+
+ ; apparently things like to step on C-;, so we'll use a hack from
+ ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this
+
+ (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
+
+ ; use iedit everywhere
+ (define-key my-keys-minor-mode-map (kbd "C-;") 'iedit-mode)
(define-minor-mode my-keys-minor-mode
"A minor mode so that my key settings override annoying major modes."
(assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
(add-to-list 'minor-mode-map-alist mykeys))))
(ad-activate 'load)
+ (global-set-key "\M- " 'hippie-expand)
+
#+END_SRC
* END
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
+#+BEGIN_SRC emacs-lisp
(provide 'don-configuration)
#+END_SRC