X-Git-Url: https://git.donarmstrong.com/?p=lib.git;a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=d07925f1f3971a6bbed10f1fae8356fe2c08f5a4;hp=b44910dbbd928f76e59986b0f0d3ab7986b030ad;hb=bec9b00ba4d3e65debb7eeedec3e9987a79904b9;hpb=643ccfd7fa1192f144389d0da1868ef67e2e25a9 diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index b44910d..d07925f 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -1,30 +1,51 @@ +#+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/auctex") - (add-to-list 'load-path '"~/lib/emacs_el/ESS/lisp") - (add-to-list 'load-path '"~/lib/emacs_el/org-mode/lisp") - (add-to-list 'load-path '"~/lib/emacs_el/auctex-beamer") (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 + (package-initialize) + (condition-case nil + (require 'use-package) + (progn (package-install 'use-package) + (require 'use-package))) +#+END_SRC +** Paradox +#+BEGIN_SRC emacs-lisp + (use-package paradox + :ensure paradox + ) +#+END_SRC +* Disable custom-vars +#+BEGIN_SRC emacs-lisp + ;; Set the custom file to /dev/null and don't bother to load it + (setq custom-file "/dev/null") +#+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) @@ -33,60 +54,463 @@ (put 'with-library 'lisp-indent-function 1) #+END_SRC +* Variables +** Safe Local Variables +#+BEGIN_SRC emacs-lisp + (setq safe-local-variable-values + (quote ((auto-save-default) + (make-backup-files) + (cperl-indent-level . 4) + (indent-level . 4) + (indent-tabs-mode . f) + ))) +#+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-" . avy-goto-word-or-subword-1) + ("C-c j j" . avy-goto-word-or-subword-1) + ("M-g g" . avy-goto-line)) + :config (progn (setq avy-background t)) + ) +#+END_SRC +*** Ace-link (jumping to links) +#+BEGIN_SRC emacs-lisp + (use-package ace-link + :ensure t + ; bind o in most modes + :config (ace-link-setup-default)) +#+END_SRC +*** Jumping through edit points (goto-chg) +#+BEGIN_SRC emacs-lisp + (use-package goto-chg + :ensure t + :bind (("C-c j ," . goto-last-change) + ("C-c j ." . goto-last-change-reverse)) + ) +#+END_SRC +*** Jumping to bookmarks (visible bookmarks, bm) +#+BEGIN_SRC emacs-lisp + (use-package bm + :ensure t + :bind (("C-c j b ." . bm-next) + ("C-c j b ," . bm-previous) + ("C-c j b SPC" . bm-toggle))) +#+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 "") nil) + (define-key yas-minor-mode-map (kbd "TAB") nil) + (define-key yas-minor-mode-map (kbd "") 'yas-expand) + (setq yas-snippet-dirs '("~/lib/emacs_el/snippets/" + "~/lib/emacs_el/yasnippet-snippets/snippets/")) + (add-to-list 'hippie-expand-try-functions-list + 'yas-hippie-try-expand) + ) + ) +#+END_SRC +*** Auto-YASnippet +#+BEGIN_SRC emacs-lisp + (use-package auto-yasnippet + :bind (("H-w" . aya-create) + ("H-y" . aya-expand) + ) + ) +#+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 - (require 'cperl-mode) - ;; Use c-mode for perl .xs files - (add-to-list 'auto-mode-alist '("\\.xs\\'" . c-mode)) - (add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\)\\'" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode)) - (setq cperl-hairy t - cperl-indent-level 4 - cperl-auto-newline nil - cperl-auto-newline-after-colon nil - cperl-continued-statement-offset 4 - cperl-brace-offset -1 - cperl-continued-brace-offset 0 - cperl-label-offset -4 - cperl-highlight-variables-indiscriminately t - cperl-electric-lbrace-space nil - cperl-indent-parens-as-block nil - cperl-close-paren-offset -1 - cperl-tab-always-indent t) - ;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle"))) +#+BEGIN_SRC emacs-lisp + (use-package cperl-mode + :config + (progn + ;; Use c-mode for perl .xs files + (add-to-list 'auto-mode-alist '("\\.xs\\'" . c-mode)) + (add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\)\\'" . cperl-mode)) + (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode)) + (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode)) + (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode)) + (setq cperl-hairy t + cperl-indent-level 4 + cperl-auto-newline nil + cperl-auto-newline-after-colon nil + cperl-continued-statement-offset 4 + cperl-brace-offset -1 + cperl-continued-brace-offset 0 + cperl-label-offset -4 + cperl-highlight-variables-indiscriminately t + cperl-electric-lbrace-space nil + cperl-indent-parens-as-block nil + cperl-close-paren-offset -1 + cperl-tab-always-indent t) + ;;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle"))) + )) #+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 +*** 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 +*** Helm Swoop +#+BEGIN_SRC emacs-lisp + + ;;; stolen from https://github.com/malb/emacs.d/blob/master/malb.org + (defun malb/helm-swoop-pre-fill () + (thing-at-point 'symbol)) + (setq malb/helm-swoop-ignore-major-mode '(dired-mode + paradox-menu-mode doc-view-mode pdf-view-mode + mu4e-headers-mode org-mode markdown-mode latex-mode + ein:notebook-multilang-mode)) + + (defun malb/swoop-or-search () + (interactive) + (if (or (> (buffer-size) 1048576) ;; helm-swoop can be slow on big buffers + (memq major-mode malb/helm-swoop-ignore-major-mode)) + (isearch-forward) + (helm-swoop))) + + (use-package helm-swoop + :ensure t + :bind (("C-c o" . helm-multi-swoop-org) + ("C-s" . malb/swoop-or-search) + ("C-M-s" . helm-multi-swoop-all)) + :config (progn + + (setq helm-swoop-pre-input-function #'malb/helm-swoop-pre-fill + helm-swoop-split-with-multiple-windows nil + helm-swoop-split-direction #'split-window-horizontally + helm-swoop-split-window-function 'helm-default-display-buffer + helm-swoop-speed-or-color t) + + ;; https://emacs.stackexchange.com/questions/28790/helm-swoop-how-to-make-it-behave-more-like-isearch + (defun malb/helm-swoop-C-s () + (interactive) + (if (boundp 'helm-swoop-pattern) + (if (equal helm-swoop-pattern "") + (previous-history-element 1) + (helm-next-line)) + (helm-next-line))) + + (bind-key "C-S-s" #'helm-swoop-from-isearch isearch-mode-map) + (bind-key "C-S-s" #'helm-multi-swoop-all-from-helm-swoop helm-swoop-map) + (bind-key "C-r" #'helm-previous-line helm-swoop-map) + (bind-key "C-s" #'malb/helm-swoop-C-s helm-swoop-map) + (bind-key "C-r" #'helm-previous-line helm-multi-swoop-map) + (bind-key "C-s" #'malb/helm-swoop-C-s helm-multi-swoop-map)) + ) + +#+END_SRC +*** Helm Ag +#+BEGIN_SRC emacs-lisp +(use-package helm-ag + :ensure t + :config (setq helm-ag-base-command "ag --nocolor --nogroup" + helm-ag-command-option "--all-text" + helm-ag-insert-at-point 'symbol + helm-ag-fuzzy-match t + helm-ag-use-temp-buffer t + helm-ag-use-grep-ignore-list t + helm-ag-use-agignore t)) +#+END_SRC +*** Helm Descbinds +#+BEGIN_SRC emacs-lisp + (use-package helm-descbinds + :ensure t + :bind ("C-h b" . helm-descbinds) + :init (fset 'describe-bindings 'helm-descbinds)) #+END_SRC + +*** Helm YaSnippet +#+BEGIN_SRC emacs-lisp + (use-package helm-c-yasnippet + :ensure t + :bind ("C-c h y" . helm-yas-complete) + :config (progn + (setq helm-yas-space-match-any-greedy t))) +#+END_SRC +*** Helm Org Rifle +#+BEGIN_SRC emacs-lisp + (use-package helm-org-rifle + :ensure t + :config (progn + (defun malb/helm-org-rifle-agenda-files (arg) + (interactive "p") + (let ((current-prefix-arg nil)) + (cond + ((equal arg 4) (call-interactively #'helm-org-rifle-agenda-files nil)) + ((equal arg 16) (helm-org-rifle-occur-agenda-files)) + (t (helm-org-agenda-files-headings))))))) +#+END_SRC + ** Hydra #+BEGIN_SRC emacs-lisp :tangle don-configuration.el (require 'don-hydra) #+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 @@ -96,106 +520,1258 @@ (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 +** BibTex +#+BEGIN_SRC emacs-lisp + (use-package bibtex + :config (setq bibtex-user-optional-fields + (quote (("annote" "Personal annotation (ignored)") + ("abstract" "") + ("pmid" "") + ("doi" "")))) + ) + +#+END_SRC ** LaTeX -#+BEGIN_SRC emacs-lisp :tangle don-configuration.el - (load "auctex.el" nil t t) - (load "preview-latex.el" nil t t) - (load "latex.el" nil t t) - - ;; 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")) - - -#+END_SRC -** Org -#+BEGIN_SRC emacs-lisp :tangle don-configuration.el - (require 'org-mode-configuration) +#+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" "{")) + ) + ) + (setq font-latex-fontify-script nil) + (setq font-latex-fontify-sectioning (quote color)) + (setq font-latex-script-display (quote (nil))) + ) + +#+END_SRC +** ESS +#+BEGIN_SRC emacs-lisp + (use-package ess + :ensure t + :config + (defun ess-change-directory (path) + "Set the current working directory to PATH for both *R* and Emacs." + (interactive "DDirectory to change to: ") + + (when (file-exists-p path) + (ess-command (concat "setwd(\"" path "\")\n")) + ;; use file-name-as-directory to ensure it has trailing / + (setq default-directory (file-name-as-directory path)))) + (add-hook 'ess-mode-hook 'flyspell-prog-mode) + ;; outlining support for ess modes + (add-hook + 'ess-mode-hook + '(lambda () + (outline-minor-mode) + (setq outline-regexp "\\(^#\\{4,5\\} \\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function\\)") + (defun outline-level () + (cond ((looking-at "^##### ") 1) + ((looking-at "^#### ") 2) + ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3) + (t 1000))) + )) + (add-hook 'ess-mode-hook + '(lambda () + (local-set-key (kbd "C-c C-R") + 'dla/ess-region-remote-eval))) + + ;; Don't restore history or save workspace image + '(inferior-R-args "--no-restore-history --no-save") + ) +#+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 + (defun my/writing-mode () + "Start my writing mode; enable visual-line-mode and auto-fill-mode" + (interactive) + (if writeroom-mode + (progn + (writeroom-mode -1) + (visual-line-mode -1) + (auto-fill-mode -1) + (visual-fill-column-mode -1) + ) + (visual-line-mode 1) + (auto-fill-mode 1) + (visual-fill-column-mode 1) + (writeroom-mode 1)) + ) + ) +#+END_SRC +** GhostText/Atomic Chrome +#+BEGIN_SRC emacs-lisp + (use-package atomic-chrome + :config + (ignore-errors (atomic-chrome-start-server)) + (setq atomic-chrome-buffer-open-style 'full) + ) +#+END_SRC +** Multiple Cursors + :PROPERTIES: + :ID: 6fcf218b-a762-4c37-9339-a8202ddeb544 + :END: +[[https://github.com/magnars/multiple-cursors.el][Multiple Cursors]] +#+BEGIN_SRC emacs-lisp + (use-package multiple-cursors + :bind (("C-;" . mc/mark-all-dwim) + ("C-<" . mc/mark-previous-like-this) + ("C->" . mc/mark-next-like-this) + ("C-S-c C-S-c" . mc/edit-lines)) + ) +#+END_SRC +** Web Mode +#+BEGIN_SRC emacs-lisp + (use-package web-mode + :config + (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . web-mode)) + (setq web-mode-enable-engine-detection t) + (setq web-mode-engines-alist + '(("template-toolkit" . "\\.tmpl\\'"))) + ) +#+END_SRC +* Email +** Message Mode +#+BEGIN_SRC emacs-lisp + (use-package post + :config + (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) + ) +#+END_SRC +** Mutt +*** Message-mode +#+BEGIN_SRC emacs-lisp + (use-package message-mode + + :mode "muttng-[a-z0-9]+-[0-9]+-" + :mode "mutt-[a-z0-9]+-[0-9]+-" + :hook 'my/message-mode-settings + :hook 'turn-on-flyspell + :bind (:map message-mode-map + ("C-c C-a" . my/post-attach-file)) + :config + (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)))) + ) + + (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))) + + (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 "> ") + ) +#+END_SRC +*** Muttrc mode +#+BEGIN_SRC emacs-lisp + (use-package muttrc-mode + :mode "muttngrc" + :mode "muttrc" + ) + +#+END_SRC +* Org Mode +** Use-package and load things +#+BEGIN_SRC emacs-lisp + + (use-package org + :config + +#+END_SRC +** Agenda Configuration +#+BEGIN_SRC emacs-lisp + ;; The following lines are always needed. Choose your own keys. + (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode)) + (global-set-key "\C-cl" 'org-store-link) + (global-set-key "\C-ca" 'org-agenda) + (global-set-key "\C-cb" 'org-iswitchb) + (setq-default org-log-done 'time) + (setq-default org-agenda-ndays 5) + + ;; agenda configuration + ;; Do not dim blocked tasks + (setq org-agenda-dim-blocked-tasks nil) + (setq org-agenda-inhibit-startup t) + (setq org-agenda-use-tag-inheritance nil) + + ;; Compact the block agenda view + (setq org-agenda-compact-blocks t) + + ;; Custom agenda command definitions + (setq org-agenda-custom-commands + (quote (("N" "Notes" tags "NOTE" + ((org-agenda-overriding-header "Notes") + (org-tags-match-list-sublevels t))) + ("h" "Habits" tags-todo "STYLE=\"habit\"" + ((org-agenda-overriding-header "Habits") + (org-agenda-sorting-strategy + '(todo-state-down effort-up category-keep)))) + (" " "Agenda" + ((agenda "" nil) + (tags "REFILE" + ((org-agenda-overriding-header "Tasks to Refile") + (org-tags-match-list-sublevels nil))) + (tags-todo "-CANCELLED/!" + ((org-agenda-overriding-header "Stuck Projects") + (org-agenda-skip-function 'bh/skip-non-stuck-projects) + (org-agenda-sorting-strategy + '(category-keep)))) + (tags-todo "-HOLD-CANCELLED/!" + ((org-agenda-overriding-header "Projects") + (org-agenda-skip-function 'bh/skip-non-projects) + (org-tags-match-list-sublevels 'indented) + (org-agenda-sorting-strategy + '(category-keep)))) + (tags-todo "-CANCELLED/!NEXT" + ((org-agenda-overriding-header (concat "Project Next Tasks" + (if bh/hide-scheduled-and-waiting-next-tasks + "" + " (including WAITING and SCHEDULED tasks)"))) + (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks) + (org-tags-match-list-sublevels t) + (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-sorting-strategy + '(todo-state-down effort-up category-keep)))) + (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!" + ((org-agenda-overriding-header (concat "Project Subtasks" + (if bh/hide-scheduled-and-waiting-next-tasks + "" + " (including WAITING and SCHEDULED tasks)"))) + (org-agenda-skip-function 'bh/skip-non-project-tasks) + (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-sorting-strategy + '(category-keep)))) + (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!" + ((org-agenda-overriding-header (concat "Standalone Tasks" + (if bh/hide-scheduled-and-waiting-next-tasks + "" + " (including WAITING and SCHEDULED tasks)"))) + (org-agenda-skip-function 'bh/skip-project-tasks) + (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks) + (org-agenda-sorting-strategy + '(category-keep)))) + (tags-todo "-CANCELLED+WAITING|HOLD/!" + ((org-agenda-overriding-header "Waiting and Postponed Tasks") + (org-agenda-skip-function 'bh/skip-stuck-projects) + (org-tags-match-list-sublevels nil) + (org-agenda-todo-ignore-scheduled t) + (org-agenda-todo-ignore-deadlines t))) + (tags "-REFILE/" + ((org-agenda-overriding-header "Tasks to Archive") + (org-agenda-skip-function 'bh/skip-non-archivable-tasks) + (org-tags-match-list-sublevels nil)))) + nil)))) + + ; org mode agenda files + (setq org-agenda-files + (quote ("~/projects/org-notes/debbugs.org" + "~/projects/org-notes/notes.org" + "~/projects/org-notes/holidays.org" + "~/projects/org-notes/refile.org" + "~/projects/org-notes/diary.org" + "~/projects/org-notes/ool.org" + "~/projects/org-notes/sndservers.org" + "~/projects/org-notes/chaim.org" + "~/projects/org-notes/wildman.org" + "~/projects/org-notes/uddin.org" + "~/projects/org-notes/reviews.org" + "~/projects/org-notes/hpcbio.org" + "~/org-mode/from-mobile.org" + "~/projects/org-notes/fh.org"))) + + (set-register ?n (cons 'file "~/projects/org-notes/notes.org")) + (set-register ?r (cons 'file "~/projects/org-notes/refile.org")) + (set-register ?o (cons 'file "~/projects/org-notes/ool.org")) + (set-register ?s (cons 'file "~/projects/org-notes/sndservers.org")) + (set-register ?c (cons 'file "~/projects/org-notes/chaim.org")) + (set-register ?w (cons 'file "~/projects/org-notes/wildman.org")) + (set-register ?u (cons 'file "~/projects/org-notes/uddin.org")) + (set-register ?R (cons 'file "~/projects/reviews/reviews.org")) + (set-register ?d (cons 'file "~/projects/org-notes/diary.org")) + ; from https://emacs.stackexchange.com/questions/909/how-can-i-have-an-agenda-timeline-view-of-multiple-files + (defun org-agenda-timeline-all (&optional arg) + (interactive "P") + (with-temp-buffer + (dolist (org-agenda-file org-agenda-files) + (insert-file-contents org-agenda-file nil) + (end-of-buffer) + (newline)) + (write-file "/tmp/timeline.org") + (org-agenda arg "L"))) + (define-key org-mode-map (kbd "C-c t") 'org-agenda-timeline-all) + ;; add automatic reminders for appointments + (defadvice org-agenda-redo (after org-agenda-redo-add-appts) + "Pressing `r' on the agenda will also add appointments." + (progn + (setq appt-time-msg-list nil) + (org-agenda-to-appt))) + +#+END_SRC +** General config +#+BEGIN_SRC emacs-lisp + (setq org-global-properties '(("Effort_ALL 0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00"))) + (setq org-columns-default-format "%40ITEM(Task) %6Effort{:} %CLOCKSUM %PRIORITY %TODO %13SCHEDULED %13DEADLINE %TAGS") + + (setq org-default-notes-file "~/projects/org-notes/notes.org") + (setq org-id-link-to-org-use-id 'use-existing) +#+END_SRC +** Capture Templates +#+BEGIN_SRC emacs-lisp + (setq org-capture-templates ;; mail-specific note template, identified by "m" + '(("m" "Mail" entry (file "~/projects/org-notes/refile.org") + "* %?\n\n Source: %u, [[%:link][%:description]]\n %:initial") + ("t" "todo" entry (file "~/projects/org-notes/refile.org") + "* TODO %?\n :PROPERTIES:\n :END:\n :LOGBOOK:\n :END:\n%U\n%a\n" :clock-in t :clock-resume t) + ("r" "respond" entry (file "~/projects/org-notes/refile.org") + "* NEXT Respond to %:from on %:subject\nSCHEDULED: %t\n%U\n%a\n" :clock-in t :clock-resume t :immediate-finish t) + ("n" "note" entry (file "~/projects/org-notes/refile.org") + "* %? :NOTE:\n%U\n%a\n" :clock-in t :clock-resume t) + ("s" "schedule" entry (file "~/projects/org-notes/refile.org") + "* %? :cal:\n%^{scheduled:}t\n%U\n%a\n" :clock-in t :clock-resume t) + ("j" "Journal" entry (file+datetree "~/projects/org-notes/diary.org") + "* %?\n%U\n" :clock-in t :clock-resume t) + ("w" "org-protocol" entry (file "~/projects/org-notes/refile.org") + "* TODO Review %c\n%U\n" :immediate-finish t) + ("M" "Meeting" entry (file "~/projects/org-notes/refile.org") + "* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t) + ("S" "Seminar" entry (file "~/projects/org-notes/refile.org") + "* SEMINAR notes %? :SEMINAR:\n%U" :clock-in t :clock-resume t) + ("P" "Paper to read" entry (file+headline "~/projects/research/papers_to_read.org" "Refile") + "* TODO Get/Read %? \n%U" :clock-in t :clock-resume t) + ("p" "Phone call" entry (file "~/projects/org-notes/refile.org") + "* PHONE %? :PHONE:\n%U" :clock-in t :clock-resume t) + ("J" "job" entry (file "~/projects/org-notes/refile.org") + "* TODO Apply for %a%? :job:\nSCHEDULED: %(format-time-string \"<%Y-%m-%d 17:00-17:30>\")\n%U\n%a\n" :clock-in t :clock-resume t) + ("h" "Habit" entry (file "~/projects/org-notes/refile.org") + "* NEXT %?\n%U\n%a\nSCHEDULED: %(format-time-string \"<%Y-%m-%d .+1d/3d>\")\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\n%a\n") + ) + ) + + ;; Remove empty LOGBOOK drawers on clock out + (defun bh/remove-empty-drawer-on-clock-out () + (interactive) + (save-excursion + (beginning-of-line 0) + (org-remove-empty-drawer-at (point)))) + + (defun my/org-add-id () + (interactive) + (save-excursion + (if (org-current-level) + () + (forward-char 1) + ) + (org-id-get-create) + ) + ) + +#+END_SRC +** Org mode key bindings +#+BEGIN_SRC emacs-lisp + ; org mode configuration from http://doc.norang.ca/org-mode.html + ;; Custom Key Bindings + (global-set-key (kbd "") 'org-agenda) + (global-set-key (kbd "") 'bh/org-todo) + (global-set-key (kbd "") 'bh/widen) + (global-set-key (kbd "") 'bh/set-truncate-lines) + (global-set-key (kbd "") 'org-cycle-agenda-files) + (global-set-key (kbd " ") 'bh/show-org-agenda) + (global-set-key (kbd " b") 'bbdb) + (global-set-key (kbd " c") 'calendar) + (global-set-key (kbd " f") 'boxquote-insert-file) + (global-set-key (kbd " h") 'bh/hide-other) + (global-set-key (kbd " n") 'bh/toggle-next-task-display) + (global-set-key (kbd " w") 'widen) + + ; change the outline mode prefix from C-c @ to C-c C-2 + (setq outline-minor-mode-prefix "C-c C-2") + ;(add-hook 'outline-minor-mode-hook + ; (lambda () (local-set-key (kbd "C-c C-2") + ; outline-mode-prefix-map))) + + (global-set-key (kbd " I") 'bh/punch-in) + (global-set-key (kbd " O") 'bh/punch-out) + + (global-set-key (kbd " o") 'bh/make-org-scratch) + + (global-set-key (kbd " r") 'boxquote-region) + (global-set-key (kbd " s") 'bh/switch-to-scratch) + + (global-set-key (kbd " t") 'bh/insert-inactive-timestamp) + (global-set-key (kbd " T") 'bh/toggle-insert-inactive-timestamp) + + (global-set-key (kbd " v") 'visible-mode) + (global-set-key (kbd " l") 'org-toggle-link-display) + (global-set-key (kbd " SPC") 'bh/clock-in-last-task) + (global-set-key (kbd "C-") 'previous-buffer) + (global-set-key (kbd "M-") 'org-toggle-inline-images) + (global-set-key (kbd "C-x n r") 'narrow-to-region) + (global-set-key (kbd "C-") 'next-buffer) + (global-set-key (kbd "") 'org-clock-goto) + (global-set-key (kbd "C-") 'org-clock-in) + (global-set-key (kbd "C-s-") 'bh/save-then-publish) + (global-set-key (kbd "C-c c") 'org-capture) + +#+END_SRC +** Utility Functions +#+BEGIN_SRC emacs-lisp + (defun bh/hide-other () + (interactive) + (save-excursion + (org-back-to-heading 'invisible-ok) + (hide-other) + (org-cycle) + (org-cycle) + (org-cycle))) + + (defun bh/set-truncate-lines () + "Toggle value of truncate-lines and refresh window display." + (interactive) + (setq truncate-lines (not truncate-lines)) + ;; now refresh window display (an idiom from simple.el): + (save-excursion + (set-window-start (selected-window) + (window-start (selected-window))))) + + (defun bh/make-org-scratch () + (interactive) + (find-file "/tmp/publish/scratch.org") + (gnus-make-directory "/tmp/publish")) + + (defun bh/switch-to-scratch () + (interactive) + (switch-to-buffer "*scratch*")) + + (setq org-use-fast-todo-selection t) + (setq org-treat-S-cursor-todo-selection-as-state-change nil) + + ; create function to create headlines in file. This comes from + ; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode + (defun my/org-add-ids-to-headlines-in-file () + "Add ID properties to all headlines in the current file which + do not already have one." + (interactive) + (org-map-entries 'org-id-get-create)) + ; if we wanted to do this to every buffer, do the following: + ; (add-hook 'org-mode-hook + ; (lambda () + ; (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local))) +#+END_SRC +** Keywords (TODO) +#+BEGIN_SRC emacs-lisp + (setq org-todo-keywords + (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)") + (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING")))) + + (setq org-todo-keyword-faces + (quote (("TODO" :foreground "red" :weight bold) + ("NEXT" :foreground "blue" :weight bold) + ("DONE" :foreground "forest green" :weight bold) + ("WAITING" :foreground "orange" :weight bold) + ("HOLD" :foreground "magenta" :weight bold) + ("CANCELLED" :foreground "forest green" :weight bold) + ("MEETING" :foreground "forest green" :weight bold) + ("PHONE" :foreground "forest green" :weight bold)))) + + (setq org-todo-state-tags-triggers + (quote (("CANCELLED" ("CANCELLED" . t)) + ("WAITING" ("WAITING" . t)) + ("HOLD" ("WAITING") ("HOLD" . t)) + (done ("WAITING") ("HOLD")) + ("TODO" ("WAITING") ("CANCELLED") ("HOLD")) + ("NEXT" ("WAITING") ("CANCELLED") ("HOLD")) + ("DONE" ("WAITING") ("CANCELLED") ("HOLD"))))) + + + + ; (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append) + ; add ids on creation of nodes + (add-hook 'org-capture-prepare-finalize-hook 'my/org-add-id) + + + ; resolve clocks after 10 minutes of idle; use xprintidle + ; (setq org-clock-idle-time 10) + ; (setq org-clock-x11idle-program-name "xprintidle") + + ; this is from http://doc.norang.ca/org-mode.html#Capture + ; use C-M-r for org mode capture + (global-set-key (kbd "C-M-r") 'org-capture) + + ; Targets include this file and any file contributing to the agenda - up to 9 levels deep + (setq org-refile-targets (quote ((nil :maxlevel . 9) + (org-agenda-files :maxlevel . 9)))) + + ; Use full outline paths for refile targets - we file directly with IDO + (setq org-refile-use-outline-path t) + + ; Targets complete directly with IDO + (setq org-outline-path-complete-in-steps nil) + + ; Allow refile to create parent tasks with confirmation + (setq org-refile-allow-creating-parent-nodes (quote confirm)) + + ; ; Use IDO for both buffer and file completion and ido-everywhere to t + ; (setq org-completion-use-ido t) + ; (setq ido-everywhere t) + ; (setq ido-max-directory-size 100000) + ; (ido-mode (quote both)) + ; ; Use the current window when visiting files and buffers with ido + ; (setq ido-default-file-method 'selected-window) + ; (setq ido-default-buffer-method 'selected-window) + ; ; Use the current window for indirect buffer display + ; (setq org-indirect-buffer-display 'current-window) + + + ;;;; Refile settings + ; Exclude DONE state tasks from refile targets + (defun bh/verify-refile-target () + "Exclude todo keywords with a done state from refile targets" + (not (member (nth 2 (org-heading-components)) org-done-keywords))) + + (setq org-refile-target-verify-function 'bh/verify-refile-target) + + ;; ensure that emacsclient will show just the note to be edited when invoked + ;; from Mutt, and that it will shut down emacsclient once finished; + ;; fallback to legacy behavior when not invoked via org-protocol. + (require 'org-protocol) + ; (add-hook 'org-capture-mode-hook 'delete-other-windows) + (setq my-org-protocol-flag nil) + (defadvice org-capture-finalize (after delete-frame-at-end activate) + "Delete frame at remember finalization" + (progn (if my-org-protocol-flag (delete-frame)) + (setq my-org-protocol-flag nil))) + (defadvice org-capture-refile (around delete-frame-after-refile activate) + "Delete frame at remember refile" + (if my-org-protocol-flag + (progn + (setq my-org-protocol-flag nil) + ad-do-it + (delete-frame)) + ad-do-it) + ) + (defadvice org-capture-kill (after delete-frame-at-end activate) + "Delete frame at remember abort" + (progn (if my-org-protocol-flag (delete-frame)) + (setq my-org-protocol-flag nil))) + (defadvice org-protocol-capture (before set-org-protocol-flag activate) + (setq my-org-protocol-flag t)) + + (defadvice org-insert-todo-heading (after dla/create-id activate) + (org-id-get-create) + ) + + ;; org modules + (add-to-list 'org-modules 'org-habit) + + ; this comes from http://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/ + (defun open-mail-in-mutt (message) + "Open a mail message in Mutt, using an external terminal. + + Message can be specified either by a path pointing inside a + Maildir, or by Message-ID." + (interactive "MPath or Message-ID: ") + (shell-command + (format "faf xterm -e \"%s %s\"" + (substitute-in-file-name "$HOME/bin/mutt_open") message))) + + ;; add support for "mutt:ID" links + (org-add-link-type "mutt" 'open-mail-in-mutt) + + (defun my-org-mode-setup () + ; (load-library "reftex") + (and (buffer-file-name) + (file-exists-p (buffer-file-name)) + (progn + ; (reftex-parse-all) + (reftex-set-cite-format + '((?b . "[[bib:%l][%l-bib]]") + (?n . "[[notes:%l][%l-notes]]") + (?c . "\\cite{%l}") + (?h . "*** %t\n:PROPERTIES:\n:Custom_ID: %l\n:END:\n[[papers:%l][%l xoj]] [[papers-pdf:%l][pdf]]"))) + )) + (define-key org-mode-map (kbd "C-c )") 'reftex-citation) + (define-key org-mode-map (kbd "C-c [") 'reftex-citation) + (define-key org-mode-map (kbd "C-c (") 'org-mode-reftex-search) + (define-key org-mode-map (kbd "C-c 0") 'reftex-view-crossref) + ) + (add-hook 'org-mode-hook 'my-org-mode-setup) + + (defun org-mode-reftex-search () + (interactive) + (org-open-link-from-string (format "[[notes:%s]]" (first (reftex-citation t))))) + + (defun open-research-paper (bibtexkey) + "Open a paper by bibtex key" + (interactive "bibtex key: ") + (shell-command + (format "%s %s" + (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey))) + (org-add-link-type "papers" 'open-research-paper) + (defun open-research-paper-pdf (bibtexkey) + "Open a paper pdf by bibtex key" + (interactive "bibtex key: ") + (shell-command + (format "%s -p evince_annot %s" + (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey))) + (org-add-link-type "papers-pdf" 'open-research-paper-pdf) + + (add-to-list 'org-link-abbrev-alist + '("notes" . + "~/projects/research/paper_notes.org::#%s")) + + ; I pretty much always want hiearchical checkboxes + (setq org-hierachical-checkbox-statistics nil) + + ;; Add \begin{equation}\end{equation} templates to the org mode easy templates + (add-to-list 'org-structure-template-alist + '("E" "\\begin{equation}\n?\n\\end{equation}")) + + ;; stolen from + ;; http://www-public.it-sudparis.eu/~berger_o/weblog/2012/03/23/how-to-manage-and-export-bibliographic-notesrefs-in-org-mode/ + (defun my-rtcite-export-handler (path desc format) + (message "my-rtcite-export-handler is called : path = %s, desc = %s, format = %s" path desc format) + (let* ((search (when (string-match "::#?\\(.+\\)\\'" path) + (match-string 1 path))) + (path (substring path 0 (match-beginning 0)))) + (cond ((eq format 'latex) + (if (or (not desc) + (equal 0 (search "rtcite:" desc))) + (format "\\cite{%s}" search) + (format "\\cite[%s]{%s}" desc search)))))) + + (org-add-link-type "rtcite" + 'org-bibtex-open + 'my-rtcite-export-handler) + + #+END_SRC +** Org Mobile Configuration +#+BEGIN_SRC emacs-lisp + (setq-default org-mobile-directory "/linnode.donarmstrong.com:/sites/dav.donarmstrong.com/root/org/") + (when (string= system-name "linnode") + (setq-default org-mobile-directory "/sites/dav.donarmstrong.com/root/org/")) + (setq-default org-directory "/home/don/org-mode/") + (setq-default org-mobile-inbox-for-pull "/home/don/org-mode/from-mobile.org") + +#+END_SRC +** Org iCal Support +#+BEGIN_SRC emacs-lisp + ;; org mode ical export + (setq org-icalendar-timezone "America/Los_Angeles") + (setq org-icalendar-use-scheduled '(todo-start event-if-todo)) + ;; we already add the id manually + (setq org-icalendar-store-UID t) + +#+END_SRC +** General Org Babel Configuration +#+BEGIN_SRC emacs-lisp + ;; org babel support + (org-babel-do-load-languages + 'org-babel-load-languages + '((emacs-lisp . t ) + (R . t) + (latex . t) + (ditaa . t) + (dot . t) + )) + ;; use graphviz-dot for dot things + (add-to-list 'org-src-lang-modes '("dot" . graphviz-dot)) + ;; org-babel-by-backend + (defmacro org-babel-by-backend (&rest body) + `(case (if (boundp 'backend) + (org-export-backend-name backend) + nil) ,@body)) + + (defun my/fix-inline-images () + (when org-inline-image-overlays + (org-redisplay-inline-images))) + + (add-hook 'org-babel-after-execute-hook + 'my/fix-inline-images) + +#+END_SRC +** LaTeX configuration + :PROPERTIES: + :ID: 7135ba17-6a50-4eed-84ca-b90afa5b12f8 + :END: +#+BEGIN_SRC emacs-lisp + (require 'ox-latex) + (add-to-list 'org-latex-classes + '("memarticle" + "\\documentclass[11pt,oneside,article]{memoir}\n" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + + (setq org-beamer-outline-frame-options "") + (add-to-list 'org-latex-classes + '("beamer" + "\\documentclass[ignorenonframetext]{beamer} + [NO-DEFAULT-PACKAGES] + [PACKAGES] + [EXTRA]" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + + (add-to-list 'org-latex-classes + '("membook" + "\\documentclass[11pt,oneside]{memoir}\n" + ("\\chapter{%s}" . "\\chapter*{%s}") + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))) + + (add-to-list 'org-latex-classes + '("letter" + "\\documentclass[11pt]{letter} + [NO-DEFAULT-PACKAGES] + [PACKAGES] + [EXTRA]" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + + (add-to-list 'org-latex-classes + '("dlacv" + "\\documentclass{dlacv} + [NO-DEFAULT-PACKAGES] + [NO-PACKAGES] + [NO-EXTRA]" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + + + (add-to-list 'org-latex-classes + '("dlaresume" + "\\documentclass{dlaresume} + [NO-DEFAULT-PACKAGES] + [NO-PACKAGES] + [NO-EXTRA]" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + + + ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432 + ;; but adapted to use latexmk 4.22 or higher. + (setq org-latex-pdf-process '("latexmk -f -pdflatex=xelatex -bibtex -use-make -pdf %f")) + + ;; Default packages included in /every/ tex file, latex, pdflatex or xelatex + (setq org-latex-default-packages-alist + '(("" "amsmath" t) + ("" "unicode-math" t) + )) + (setq org-latex-packages-alist + '(("" "graphicx" t) + ("" "fontspec" t) + ("" "xunicode" t) + ("" "hyperref" t) + ("" "url" t) + ("" "rotating" t) + ("" "longtable" nil) + ("" "float" ))) + + ;; make equations larger + (setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0)) + + (defun org-create-formula--latex-header () + "Return LaTeX header appropriate for previewing a LaTeX snippet." + (let ((info (org-combine-plists (org-export--get-global-options + (org-export-get-backend 'latex)) + (org-export--get-inbuffer-options + (org-export-get-backend 'latex))))) + (org-latex-guess-babel-language + (org-latex-guess-inputenc + (org-splice-latex-header + org-format-latex-header + org-latex-default-packages-alist + nil t + (plist-get info :latex-header))) + info))) + + + ; support ignoring headers in org mode export to latex + ; from http://article.gmane.org/gmane.emacs.orgmode/67692 + (defadvice org-latex-headline (around my-latex-skip-headlines + (headline contents info) activate) + (if (member "ignoreheading" (org-element-property :tags headline)) + (setq ad-return-value contents) + ad-do-it)) + + ;; keep latex logfiles + + (setq org-latex-remove-logfiles nil) + + ;; Resume clocking task when emacs is restarted + (org-clock-persistence-insinuate) + ;; + ;; Show lot of clocking history so it's easy to pick items off the C-F11 list + (setq org-clock-history-length 23) + ;; Resume clocking task on clock-in if the clock is open + (setq org-clock-in-resume t) + ;; Change tasks to NEXT when clocking in; this avoids clocking in when + ;; there are things like PHONE calls + (setq org-clock-in-switch-to-state 'bh/clock-in-to-next) + ;; Separate drawers for clocking and logs + (setq org-drawers (quote ("PROPERTIES" "LOGBOOK"))) + ;; Save clock data and state changes and notes in the LOGBOOK drawer + (setq org-clock-into-drawer t) + (setq org-log-into-drawer t) + ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration + (setq org-clock-out-remove-zero-time-clocks t) + ;; Clock out when moving task to a done state + (setq org-clock-out-when-done t) + ;; Save the running clock and all clock history when exiting Emacs, load it on startup + (setq org-clock-persist t) + ;; Do not prompt to resume an active clock + (setq org-clock-persist-query-resume nil) + ;; Enable auto clock resolution for finding open clocks + (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running)) + ;; Include current clocking task in clock reports + (setq org-clock-report-include-clocking-task t) + + ;; the cache seems to be broken + (setq org-element-use-cache nil) + + (defvar bh/keep-clock-running nil) + + (defun bh/is-task-p () + "Any task with a todo keyword and no subtask" + (save-restriction + (widen) + (let ((has-subtask) + (subtree-end (save-excursion (org-end-of-subtree t))) + (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1))) + (save-excursion + (forward-line 1) + (while (and (not has-subtask) + (< (point) subtree-end) + (re-search-forward "^\*+ " subtree-end t)) + (when (member (org-get-todo-state) org-todo-keywords-1) + (setq has-subtask t)))) + (and is-a-task (not has-subtask))))) + (defun bh/is-project-p () + "Any task with a todo keyword subtask" + (save-restriction + (widen) + (let ((has-subtask) + (subtree-end (save-excursion (org-end-of-subtree t))) + (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1))) + (save-excursion + (forward-line 1) + (while (and (not has-subtask) + (< (point) subtree-end) + (re-search-forward "^\*+ " subtree-end t)) + (when (member (org-get-todo-state) org-todo-keywords-1) + (setq has-subtask t)))) + (and is-a-task has-subtask)))) + (defun bh/is-subproject-p () + "Any task which is a subtask of another project" + (let ((is-subproject) + (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1))) + (save-excursion + (while (and (not is-subproject) (org-up-heading-safe)) + (when (member (nth 2 (org-heading-components)) org-todo-keywords-1) + (setq is-subproject t)))) + (and is-a-task is-subproject))) + + + (defun bh/clock-in-to-next (kw) + "Switch a task from TODO to NEXT when clocking in. + Skips capture tasks, projects, and subprojects. + Switch projects and subprojects from NEXT back to TODO" + (when (not (and (boundp 'org-capture-mode) org-capture-mode)) + (cond + ((and (member (org-get-todo-state) (list "TODO")) + (bh/is-task-p)) + "NEXT") + ((and (member (org-get-todo-state) (list "NEXT")) + (bh/is-project-p)) + "TODO")))) + + (defun bh/punch-in (arg) + "Start continuous clocking and set the default task to the + selected task. If no task is selected set the Organization task + as the default task." + (interactive "p") + (setq bh/keep-clock-running t) + (if (equal major-mode 'org-agenda-mode) + ;; + ;; We're in the agenda + ;; + (let* ((marker (org-get-at-bol 'org-hd-marker)) + (tags (org-with-point-at marker (org-get-tags-at)))) + (if (and (eq arg 4) tags) + (org-agenda-clock-in '(16)) + (bh/clock-in-organization-task-as-default))) + ;; + ;; We are not in the agenda + ;; + (save-restriction + (widen) + ; Find the tags on the current task + (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4)) + (org-clock-in '(16)) + (bh/clock-in-organization-task-as-default))))) + + (defun bh/punch-out () + (interactive) + (setq bh/keep-clock-running nil) + (when (org-clock-is-active) + (org-clock-out)) + (org-agenda-remove-restriction-lock)) + + (defun bh/clock-in-default-task () + (save-excursion + (org-with-point-at org-clock-default-task + (org-clock-in)))) + + (defun bh/clock-in-parent-task () + "Move point to the parent (project) task if any and clock in" + (let ((parent-task)) + (save-excursion + (save-restriction + (widen) + (while (and (not parent-task) (org-up-heading-safe)) + (when (member (nth 2 (org-heading-components)) org-todo-keywords-1) + (setq parent-task (point)))) + (if parent-task + (org-with-point-at parent-task + (org-clock-in)) + (when bh/keep-clock-running + (bh/clock-in-default-task))))))) + + (defvar bh/organization-task-id "e22cb8bf-07c7-408b-8f60-ff3aadac95e4") + + (defun bh/clock-in-organization-task-as-default () + (interactive) + (org-with-point-at (org-id-find bh/organization-task-id 'marker) + (org-clock-in '(16)))) + + (defun bh/clock-out-maybe () + (when (and bh/keep-clock-running + (not org-clock-clocking-in) + (marker-buffer org-clock-default-task) + (not org-clock-resolving-clocks-due-to-idleness)) + (bh/clock-in-parent-task))) + + ; (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append) + + (require 'org-id) + (defun bh/clock-in-task-by-id (id) + "Clock in a task by id" + (org-with-point-at (org-id-find id 'marker) + (org-clock-in nil))) + + (defun bh/clock-in-last-task (arg) + "Clock in the interrupted task if there is one + Skip the default task and get the next one. + A prefix arg forces clock in of the default task." + (interactive "p") + (let ((clock-in-to-task + (cond + ((eq arg 4) org-clock-default-task) + ((and (org-clock-is-active) + (equal org-clock-default-task (cadr org-clock-history))) + (caddr org-clock-history)) + ((org-clock-is-active) (cadr org-clock-history)) + ((equal org-clock-default-task (car org-clock-history)) (cadr org-clock-history)) + (t (car org-clock-history))))) + (widen) + (org-with-point-at clock-in-to-task + (org-clock-in nil)))) + + + (defun org-export-to-ods () + (interactive) + (let ((csv-file "data.csv")) + (org-table-export csv-file "orgtbl-to-csv") + (org-odt-convert csv-file "ods" 'open))) + + ; allow for zero-width-space to be a break in regexp too + ; (setcar org-emphasis-regexp-components "​ [:space:] \t('\"{") + ; (setcar (nthcdr 1 org-emphasis-regexp-components) "​ [:space:]- \t.,:!?;'\")}\\") + ; (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components) + + ;; support inserting screen shots + (defun my/org-insert-screenshot () + "Take a screenshot into a time stamped unique-named file in the + same directory as the org-buffer and insert a link to this file." + (interactive) + (defvar my/org-insert-screenshot/filename) + (setq my/org-insert-screenshot/filename + (read-file-name + "Screenshot to insert: " + nil + (concat (buffer-file-name) "_" (format-time-string "%Y%m%d_%H%M%S") ".png") + ) + ) + (call-process "import" nil nil nil my/org-insert-screenshot/filename) + (insert (concat "[[" my/org-insert-screenshot/filename "]]")) + (org-display-inline-images)) + + (defun my/fix-inline-images () + (when org-inline-image-overlays + (org-redisplay-inline-images))) + + (add-hook 'org-babel-after-execute-hook 'my/fix-inline-images) + + ;; use xelatex to preview with imagemagick + (add-to-list 'org-preview-latex-process-alist + '(xelateximagemagick + :programs ("xelatex" "convert") + :description "pdf > png" + :message "you need to install xelatex and imagemagick" + :use-xcolor t + :image-input-type "pdf" + :image-output-type "png" + :image-size-adjust (1.0 . 1.0) + :latex-compiler ("xelatex -interaction nonstopmode -output-directory %o %f") + :image-converter ("convert -density %D -trim -antialias %f -quality 100 %O")) + ) + ;; use xelatex by default + (setq org-preview-latex-default-process 'xelateximagemagick) + + ; from http://orgmode.org/Changes.html + (defun my/org-repair-property-drawers () + "Fix properties drawers in current buffer. + Ignore non Org buffers." + (interactive) + (when (eq major-mode 'org-mode) + (org-with-wide-buffer + (goto-char (point-min)) + (let ((case-fold-search t) + (inline-re (and (featurep 'org-inlinetask) + (concat (org-inlinetask-outline-regexp) + "END[ \t]*$")))) + (org-map-entries + (lambda () + (unless (and inline-re (org-looking-at-p inline-re)) + (save-excursion + (let ((end (save-excursion (outline-next-heading) (point)))) + (forward-line) + (when (org-looking-at-p org-planning-line-re) (forward-line)) + (when (and (< (point) end) + (not (org-looking-at-p org-property-drawer-re)) + (save-excursion + (and (re-search-forward org-property-drawer-re end t) + (eq (org-element-type + (save-match-data (org-element-at-point))) + 'drawer)))) + (insert (delete-and-extract-region + (match-beginning 0) + (min (1+ (match-end 0)) end))) + (unless (bolp) (insert "\n")))))))))))) + +#+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 +** End use-package +#+BEGIN_SRC emacs-lisp + ) +#+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 (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) + ; use mc everywhere + (define-key my-keys-minor-mode-map (kbd "C-;") 'mc/mark-all-dwim) ;; 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." @@ -214,8 +1790,407 @@ (add-to-list 'minor-mode-map-alist mykeys)))) (ad-activate 'load) #+END_SRC +** Goto line +#+BEGIN_SRC emacs-lisp + (global-unset-key "\M-g") + (global-set-key (kbd "M-g l") 'goto-line) +#+END_SRC +* Misc (uncharacterized) +#+BEGIN_SRC emacs-lisp + (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) + (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 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 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) + + (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) + + ;; self-insert-command hack. + ;; Without this, "if" 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) + + ; (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) + + ; 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 "") + (css-mode ""))) + (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" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s" tkey))) + ;; home + (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s" tkey))) + ;; end + (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s" tkey))) + ;; page up + (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; page down + (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; insert + (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; delete + (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f1 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s" tkey))) + ;; f2 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s" tkey))) + ;; f3 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s" tkey))) + ;; f4 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s" tkey))) + ;; f5 + (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f6 + (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f7 + (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f8 + (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f9 + (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f10 + (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f11 + (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f12 + (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f13 + (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f14 + (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f15 + (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f16 + (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f17 + (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f18 + (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f19 + (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f20 + (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s" 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-;") 'mc/mark-all-dwim) + + (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) + (global-set-key "\M- " 'hippie-expand) + +#+END_SRC + +* Server +#+BEGIN_SRC emacs-lisp + (unless (server-running-p) + (server-start)) +#+END_SRC + + * END -#+BEGIN_SRC emacs-lisp :tangle don-configuration.el +#+BEGIN_SRC emacs-lisp (provide 'don-configuration) #+END_SRC