X-Git-Url: https://git.donarmstrong.com/?p=lib.git;a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=baae5d8763b00c0eee415d3b049959e8697d40ea;hp=e432840f43802492526da32f0f2a629649b0b77f;hb=3d51ea773e5060e2cd5eb8a0003ff45724fc5b58;hpb=f421fa664d75a3b2661d970c9fb5738bd30a4bae diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index e432840..baae5d8 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -28,9 +28,18 @@ Borrowed from https://github.com/nilcons/emacs-use-package-fast/ to load [[https://github.com/jwiegley/use-package/][use-package]] even faster #+BEGIN_SRC emacs-lisp - (setq package-enable-at-startup nil) - (setq package--init-file-ensured t) (eval-and-compile + ;; add /etc/ssl/ca-global/ca-certificates.crt so that we can + ;; download packages when we're on Debian hosts which chop down the + ;; list of available certificates + (require 'gnutls) + (add-to-list 'gnutls-trustfiles "/etc/ssl/ca-global/ca-certificates.crt") + (setq package-enable-at-startup nil) + (setq package--init-file-ensured t) + (setq package-user-dir "~/var/emacs/elpa") + (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("org" . "http://orgmode.org/elpa/"))) (setq use-package-verbose (not (bound-and-true-p byte-compile-current-file)))) (mapc #'(lambda (add) (add-to-list 'load-path add)) (eval-when-compile @@ -49,12 +58,21 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster nil)) load-path)))))) - (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "http://orgmode.org/elpa/") )) - (require 'use-package) - (require 'diminish) + ;;; fix up info paths for packages + (with-eval-after-load "info" + (info-initialize) + (dolist (dir (directory-files package-user-dir)) + (let ((fdir (concat (file-name-as-directory package-user-dir) dir))) + (unless (or (member dir '("." ".." "archives" "gnupg")) + (not (file-directory-p fdir)) + (not (file-exists-p (concat (file-name-as-directory fdir) "dir")))) + (add-to-list 'Info-directory-list fdir))))) + + + (eval-when-compile + (require 'use-package)) (require 'bind-key) + (require 'diminish) #+END_SRC ** Paradox #+BEGIN_SRC emacs-lisp @@ -89,13 +107,14 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster * 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) - ))) +(setq safe-local-variable-values + (quote ((auto-save-default) + (make-backup-files) + (cperl-indent-level . 4) + (indent-level . 4) + (indent-tabs-mode . f) + (vcl-indent-level . 4) + ))) #+END_SRC * Memory #+BEGIN_SRC emacs-lisp @@ -113,9 +132,17 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook) #+END_SRC * Modules +** Spacemacs theme +#+BEGIN_SRC emacs-lisp +(use-package spacemacs-common + :ensure spacemacs-theme + :config + (load-theme 'spacemacs-dark t) + ) +#+END_SRC ** Hippie Expand #+BEGIN_SRC emacs-lisp - (use-package hippie-expand + (use-package hippie-exp :bind* (("M-" . hippie-expand)) ) #+END_SRC @@ -291,6 +318,7 @@ value, scrolling continues until there is no more output. *** Avy #+BEGIN_SRC emacs-lisp (use-package avy + :if (>= emacs-major-version 25) :ensure t :bind (("C-c C-" . avy-goto-word-or-subword-1) ("C-c j j" . avy-goto-word-or-subword-1) @@ -338,17 +366,235 @@ value, scrolling continues until there is no more output. "~/lib/emacs_el/yasnippet-snippets/snippets/")) (add-to-list 'hippie-expand-try-functions-list 'yas-hippie-try-expand) + (yas-reload-all) ) ) #+END_SRC *** Auto-YASnippet #+BEGIN_SRC emacs-lisp (use-package auto-yasnippet + :ensure t :bind (("H-w" . aya-create) ("H-y" . aya-expand) ) ) #+END_SRC +** Company +#+BEGIN_SRC emacs-lisp +(use-package company + :ensure t + :bind (("M-/" . company-complete)) + :config + (setq company-echo-delay 0 ; remove blinking + company-show-numbers t ; show numbers for easy selection + company-selection-wrap-around t + company-require-match nil + company-dabbrev-ignore-case t + company-dabbrev-ignore-invisible t + company-dabbrev-other-buffers t + company-dabbrev-downcase nil + company-dabbrev-code-everywhere t + company-tooltip-align-annotations t + company-minimum-prefix-length 1 + company-global-modes '(not) + company-lighter-base "(C)") + (global-company-mode 1) + :bind (:map company-active-map + ("C-n" . company-select-next) + ("C-p" . company-select-previous) + ("M-?" . company-show-doc-buffer) + ("M-." . company-show-location) + ) + ) +#+END_SRC +*** C/C++ +#+BEGIN_SRC emacs-lisp + (use-package company-c-headers + :ensure t + :config (progn + (defun malb/ede-object-system-include-path () + "Return the system include path for the current buffer." + (when ede-object + (ede-system-include-path ede-object))) + + (setq company-c-headers-path-system + #'malb/ede-object-system-include-path) + + (add-to-list 'company-backends #'company-c-headers))) +#+END_SRC +*** Python +#+BEGIN_SRC emacs-lisp +(use-package company-anaconda + :ensure t + :config (add-to-list 'company-backends #'company-anaconda)) +#+END_SRC +*** Perl +#+BEGIN_SRC emacs-lisp + (use-package company-plsense + :ensure t + ) +#+END_SRC +*** LaTeX +#+BEGIN_SRC emacs-lisp + (use-package company-math + :ensure t) +#+END_SRC +#+BEGIN_SRC emacs-lisp + (use-package company-auctex + :ensure t + :config (progn + (defun company-auctex-labels (command &optional arg &rest ignored) + "company-auctex-labels backend" + (interactive (list 'interactive)) + (case command + (interactive (company-begin-backend 'company-auctex-labels)) + (prefix (company-auctex-prefix "\\\\.*ref{\\([^}]*\\)\\=")) + (candidates (company-auctex-label-candidates arg)))) + + (add-to-list 'company-backends + '(company-auctex-macros + company-auctex-environments + company-math-symbols-unicode + company-math-symbols-latex)) + + (add-to-list 'company-backends #'company-auctex-labels) + (add-to-list 'company-backends #'company-auctex-bibs) + ) + ) +#+END_SRC +#+BEGIN_SRC emacs-lisp + (use-package company-bibtex + :ensure t + ) +#+END_SRC +*** Shell + + #+BEGIN_SRC emacs-lisp + (use-package company-shell + :ensure t + :config (progn + (setq company-shell-modes '(sh-mode shell-mode)) + (add-to-list 'company-backends 'company-shell))) + #+END_SRC + +*** YaSnippet + + Add YasSippet support for all company backends. ([[https://github.com/syl20bnr/spacemacs/pull/179][source]]) + + *Note:* Do this at the end of =company-mode= config. + + #+BEGIN_SRC emacs-lisp + (defvar malb/company-mode/enable-yas t + "Enable yasnippet for all backends.") + + (defun malb/company-mode/backend-with-yas (backend) + (if (or (not malb/company-mode/enable-yas) + (and (listp backend) + (member 'company-yasnippet backend))) + backend + (append (if (consp backend) backend (list backend)) + '(:with company-yasnippet)))) + + (setq company-backends + (mapcar #'malb/company-mode/backend-with-yas company-backends)) + #+END_SRC + +*** All the words + + Enable/disable company completion from ispell dictionaries ([[https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-company.el][source]]) + + #+BEGIN_SRC emacs-lisp + (defun malb/toggle-company-ispell () + (interactive) + (cond + ((member '(company-ispell :with company-yasnippet) company-backends) + (setq company-backends (delete '(company-ispell :with company-yasnippet) company-backends)) + (add-to-list 'company-backends '(company-dabbrev :with company-yasnippet) t) + (message "company-ispell disabled")) + (t + (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends)) + (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t) + (message "company-ispell enabled!")))) + + (defun malb/company-ispell-setup () + ;; @see https://github.com/company-mode/company-mode/issues/50 + (when (boundp 'company-backends) + (make-local-variable 'company-backends) + (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends)) + (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t) + ;; https://github.com/redguardtoo/emacs.d/issues/473 + (if (and (boundp 'ispell-alternate-dictionary) + ispell-alternate-dictionary) + (setq company-ispell-dictionary ispell-alternate-dictionary)))) + #+END_SRC + +*** Tab DWIM + + 1. =yas-expand= is run first and does what it has to, then it calls =malb/indent-fold-or-complete=. + + 2. This function then hopefully does what I want: + + a. if a region is active, just indent + b. if we’re looking at a space after a non-whitespace character, we try some company-expansion + c. If =hs-minor-mode= or =outline-minor-mode= is active, try those next + d. otherwise call whatever would have been called otherwise. + + ([[http://emacs.stackexchange.com/q/21182/8930][source]], [[http://emacs.stackexchange.com/q/7908/8930][source]]) + +#+BEGIN_SRC emacs-lisp + (defun malb/indent-fold-or-complete (&optional arg) + (interactive "P") + (cond + ;; if a region is active, indent + ((use-region-p) + (indent-region (region-beginning) + (region-end))) + ;; if the next char is space or eol, but prev char not whitespace + ((and (not (active-minibuffer-window)) + (or (looking-at " ") + (looking-at "$")) + (looking-back "[^[:space:]]") + (not (looking-back "^"))) + + (cond (company-mode (company-complete-common)) + (auto-complete-mode (auto-complete)))) + + ;; no whitespace anywhere + ((and (not (active-minibuffer-window)) + (looking-at "[^[:space:]]") + (looking-back "[^[:space:]]") + (not (looking-back "^"))) + (cond + ((bound-and-true-p hs-minor-mode) + (save-excursion (end-of-line) (hs-toggle-hiding))) + ((bound-and-true-p outline-minor-mode) + (save-excursion (outline-cycle))))) + + ;; by default just call whatever was bound + (t + (let ((fn (or (lookup-key (current-local-map) (kbd "TAB")) + 'indent-for-tab-command))) + (if (not (called-interactively-p 'any)) + (fn arg) + (setq this-command fn) + (call-interactively fn)))))) + + (defun malb/toggle-fold () + (interactive) + (cond ((eq major-mode 'org-mode) + (org-force-cycle-archived)) + ((bound-and-true-p hs-minor-mode) + (save-excursion + (end-of-line) + (hs-toggle-hiding))) + + ((bound-and-true-p outline-minor-mode) + (save-excursion + (outline-cycle))))) + + (bind-key "" #'malb/indent-fold-or-complete) + (bind-key "C-" #'malb/toggle-fold) +#+END_SRC ** Tinyprocmail #+BEGIN_SRC emacs-lisp @@ -407,6 +653,58 @@ value, scrolling continues until there is no more output. )) #+END_SRC +** Markdown mode +#+BEGIN_SRC emacs-lisp + (use-package markdown-mode + :ensure t + :mode (("\\.md\\'" . markdown-mode) + ("\\.mdwn\\'" . markdown-mode) + ("README\\.md\\'" . gfm-mode) + ) + :config + (setq markdown-enable-math t) + (setq markdown-follow-wiki-link-on-enter nil) + (bind-key "M-." #'markdown-jump markdown-mode-map) + (add-hook 'markdown-mode-hook #'flyspell-mode) + (add-hook 'markdown-mode-hook #'outline-minor-mode) + (bind-key "C-" #'outline-cycle markdown-mode-map) + ) + +#+END_SRC +** SQL mode +#+BEGIN_SRC emacs-lisp + ; load sql-indent when sql is loaded +(use-package sql + :mode (("\\.sql\\'" . sql-mode)) + :config + (require sql-indent)) +#+END_SRC +** Ediff +#+BEGIN_SRC emacs-lisp + (use-package ediff + :commands ediff ediff3 + :ensure f + :config + ;; ediff configuration + ;; don't use the multi-window configuration + (setq ediff-window-setup-function 'ediff-setup-windows-plain) + ) +#+END_SRC +** Do the Right Thing Indenting +Attempts to automatically identify the right indentation for a file +#+BEGIN_SRC emacs-lisp +(use-package dtrt-indent + :ensure t +) +#+END_SRC +** VCL --editing varnish configuration files +#+BEGIN_SRC emacs-lisp + (use-package vcl-mode + :ensure t + :mode "\\.vcl\\'" + ) + +#+END_SRC ** Helm #+BEGIN_SRC emacs-lisp (defun malb/helm-omni (&rest arg) @@ -729,14 +1027,16 @@ This can be used to link things pretty quickly if necessary ** Tramp #+BEGIN_SRC emacs-lisp - (add-to-list 'tramp-methods '("vcsh" - (tramp-login-program "vcsh") - (tramp-login-args - (("enter") - ("%h"))) - (tramp-remote-shell "/bin/sh") - (tramp-remote-shell-args - ("-c")))) + (use-package tramp + :config + (add-to-list 'tramp-methods '("vcsh" + (tramp-login-program "vcsh") + (tramp-login-args + (("enter") + ("%h"))) + (tramp-remote-shell "/bin/sh") + (tramp-remote-shell-args + ("-c"))))) #+END_SRC ** Reftex #+BEGIN_SRC emacs-lisp @@ -759,109 +1059,111 @@ This can be used to link things pretty quickly if necessary #+END_SRC ** LaTeX #+BEGIN_SRC emacs-lisp - (use-package tex - :defer t - :ensure auctex +(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) + (add-to-list 'LaTeX-font-list + '(?\C-a "\\alert{","}")) + (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 - ; (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))) - ) + (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 @@ -869,13 +1171,18 @@ This can be used to link things pretty quickly if necessary (use-package ess :ensure t :commands R - :mode "\\.R\\'" + :mode ("\\.R\\'" . ess-r-mode) :bind (:map ess-mode-map ("C-c C-R" . dla/ess-region-remote-eval)) + :init + (autoload 'ess-r-mode "ess-site" nil t) + (autoload 'R "ess-site" nil t) :config + ; actually load the rest of ess + (require 'ess-site) (defun ess-change-directory (path) "Set the current working directory to PATH for both *R* and Emacs." - (interactive "DDirectory to change to: ") + (interactive "Directory to change to: ") (when (file-exists-p path) (ess-command (concat "setwd(\"" path "\")\n")) @@ -917,21 +1224,41 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** 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) - ) +(use-package poly-noweb + :ensure t + :after polymode + + ) +(use-package poly-markdown + :ensure t + :after polymode + ) +(use-package poly-R + :ensure t + :after (:all polymode poly-markdown poly-noweb) + ; :mode ("\\.Snw" . poly-noweb+r-mode) + ; :mode ("\\.Rnw" . poly-noweb+r-mode) + ; :mode ("\\.Rmd" . poly-markdown+r-mode) + ) +(use-package polymode + :ensure t + ) + #+END_SRC ** Outlining *** Outline magic #+BEGIN_SRC emacs-lisp (use-package outline-magic) +#+END_SRC +*** Outline mode +#+BEGIN_SRC emacs-lisp +;; 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))) + #+END_SRC ** Writeroom Mode #+BEGIN_SRC emacs-lisp @@ -978,6 +1305,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** Web Mode #+BEGIN_SRC emacs-lisp (use-package web-mode + :load-path "/home/don/projects/web-mode/" + :mode ("\\.\\(tx|tmpl\\)\\'" . web-mode) :config (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . web-mode)) (setq web-mode-enable-engine-detection t) @@ -988,7 +1317,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** Spamassassin Mode #+BEGIN_SRC emacs-lisp (use-package spamassassin-mode - :defer + :commands spamassassin-mode :ensure f ) #+END_SRC @@ -996,56 +1325,117 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+BEGIN_SRC emacs-lisp (use-package password-store :ensure f - :commands password-store-edit password-store-create + :commands password-store-edit password-store-generate ) #+END_SRC +** CSS mode +#+BEGIN_SRC emacs-lisp + (use-package css + :mode "\\.css'" + :config + ;; 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)) +#+END_SRC +** Abbrev Mode +#+BEGIN_SRC emacs-lisp + (use-package abbrev + :diminish abbrev-mode + :config + ;; 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)) +#+END_SRC + +** Go language +#+BEGIN_SRC emacs-lisp +(use-package go-mode + :diminish "go" + :mode "\\.go" + ) +#+END_SRC + +** Expand region +#+BEGIN_SRC emacs-lisp +(use-package expand-region + :bind (("C-=" . 'er/expand-region)) + ) +#+END_SRC + +** Dockerfile +#+BEGIN_SRC emacs-lisp +(use-package dockerfile-mode + :mode "Dockerfile" + ) +#+END_SRC + +** Beancount +#+BEGIN_SRC emacs-lisp +(use-package beancount + :load-path "~/lib/emacs_el/beancount-mode/" + :ensure f + :mode "\\.beancount\\'" + + ) +#+END_SRC * Email ** Mutt *** Message-mode #+BEGIN_SRC emacs-lisp - (use-package message - :ensure f - :diminish "✉" - :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)))) - ) +(use-package message + :ensure f + :diminish (message "✉") + :mode ("muttng-[a-z0-9]+-[0-9]+-" . message-mode) + :mode ("mutt-[a-z0-9]+-[0-9]+-" . message-mode) + :hook 'my/message-mode-settings + :hook 'turn-on-flyspell + :bind (:map message-mode-map + ("C-c C-a" . my/post-attach-file)) + :delight (message-mode "✉") + :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 "> ") - ) + (defun my/post-attach-file () + "Prompt for an attachment." + (interactive) + (let ((file (read-file-name "Attach file: " nil nil t nil))) + (my/header-attach-file 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 "> ") + (setq mail-header-separator "") ; fix broken header detection +) #+END_SRC *** Muttrc mode #+BEGIN_SRC emacs-lisp @@ -1058,29 +1448,49 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori * Base emacs ** Reverting buffers #+BEGIN_SRC emacs-lisp - (setq global-auto-revert-non-file-buffers t - global-auto-revert-ignore-modes '(pdf-view-mode) - auto-revert-verbose nil) - (global-auto-revert-mode 1) + (use-package autorevert + :diminish auto-revert-mode + :config + (setq global-auto-revert-non-file-buffers t + global-auto-revert-ignore-modes '(pdf-view-mode) + auto-revert-verbose nil) + (global-auto-revert-mode 1)) #+END_SRC * Org Mode ** Use-package and load things #+BEGIN_SRC emacs-lisp (use-package org - :config - + :delight (org-mode "ø") + :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode) + :bind (("C-c l" . org-store-link) + ("C-c a" . org-agenda) + ("C-c b" . org-iswitchb)) #+END_SRC ** Agenda Configuration #+BEGIN_SRC emacs-lisp - :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode) - :bind (("C-c l" . org-store-link) - ("C-c a" . org-agenda) - ("C-c b" . org-iswitchb)) :config (setq-default org-log-done 'time) (setq-default org-agenda-ndays 5) + (setq org-agenda-sticky t) + (defun dla/show-org-agenda () + (interactive) + (let (agendabuffer + '(delq nil + (mapcar (lambda (x) + (and (string-match-p + "\*Org Agenda.*\*" + (buffer-name x)) + x) + ) + (buffer-list)))) + (if agendabuffer + (switch-to-buffer + (buffer-name agendabuffer)) + (org-agenda-list))) + (delete-other-windows)) + ;; agenda configuration ;; Do not dim blocked tasks (setq org-agenda-dim-blocked-tasks nil) @@ -1174,6 +1584,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori "~/projects/org-notes/wildman.org" "~/projects/org-notes/uddin.org" "~/projects/org-notes/reviews.org" + "~/projects/org-notes/laurel.org" + "~/projects/org-notes/from-calendar.org" "~/org-mode/from-mobile.org" "~/projects/org-notes/fh.org"))) @@ -1210,7 +1622,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** 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") + `(("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) @@ -1232,8 +1644,10 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori "* 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) + ("J" "job" entry (file+olp "~/projects/org-notes/notes.org" + "Jobs" + ,(format-time-string "Positions %Y")) + "* TODO Apply for %? :job:\nSCHEDULED: <%<%Y-%m-%d>>\n%U\n%x\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") ) @@ -1260,50 +1674,43 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+END_SRC ** Org mode key bindings #+BEGIN_SRC emacs-lisp - ; org mode configuration from http://doc.norang.ca/org-mode.html + ;; 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) - + :bind* ((" a" . org-agenda) + (" I" . bh/punch-in) + (" O" . bh/punch-out) + (" SPC" . bh/clock-in-last-task) + ("" . dla/show-org-agenda) + ;; ("" . bh/org-todo) + ("" . bh/widen) + ("" . bh/set-truncate-lines) + ("" . org-cycle-agenda-files) + (" " . dla/show-org-agenda) + (" b" . bbdb) + (" c" . calendar) + (" f" . boxquote-insert-file) + (" h" . bh/hide-other) + (" n" . bh/toggle-next-task-display) + (" w" . widen) + + (" r" . boxquote-region) + (" s" . bh/switch-to-scratch) + + (" t" . bh/insert-inactive-timestamp) + (" T" . bh/toggle-insert-inactive-timestamp) + + (" v" . visible-mode) + (" l" . org-toggle-link-display) + (" SPC" . bh/clock-in-last-task) + ("C-" . previous-buffer) + ("M-" . org-toggle-inline-images) + ("C-x n r" . narrow-to-region) + ("C-" . next-buffer) + ("" . org-clock-goto) + ("C-" . org-clock-in) + ("C-s-" . bh/save-then-publish) + ("C-c c" . org-capture)) + :config #+END_SRC ** Utility Functions #+BEGIN_SRC emacs-lisp @@ -1325,11 +1732,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (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*")) @@ -1344,11 +1746,26 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori do not already have one." (interactive) (org-map-entries 'org-id-get-create)) + (defun dla/org-update-ids-to-headlines-in-file () + "Add or replace ID properties to all headlines in the current file + (or narrowed region)." + (interactive) + (org-map-entries '(lambda () (org-id-get-create t)))) ; 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 +** Org ID locations +#+BEGIN_SRC emacs-lisp +(use-package find-lisp + :ensure t) +(setq org-agenda-text-search-extra-files + (append '(agenda-archives) + (find-lisp-find-files "~/projects/org-notes" "\.org$") + (find-lisp-find-files "~/projects/org-notes" "\.org_archive$") + )) +#+END_SRC ** Keywords (TODO) #+BEGIN_SRC emacs-lisp (setq org-todo-keywords @@ -1449,7 +1866,9 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (setq my-org-protocol-flag t)) (defadvice org-insert-todo-heading (after dla/create-id activate) - (org-id-get-create) + (unless (org-in-item-p) + (org-id-get-create) + ) ) ;; org modules @@ -1557,29 +1976,33 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+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) +;; org babel support +(org-babel-do-load-languages + 'org-babel-load-languages + '((emacs-lisp . t ) + (R . t) + (latex . t) + (ditaa . t) + (dot . t) + )) +;; set the right path to ditaa.jar +(setq org-ditaa-jar-path "/usr/share/ditaa/ditaa.jar") +;; use graphviz-dot for dot things +(add-to-list 'org-src-lang-modes '("dot" . graphviz-dot)) +;; do not indent begin_src blocks +(setq org-edit-src-content-indentation 0) +;; 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 @@ -1587,402 +2010,406 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori :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) +(use-package ox-extra + :config + (ox-extras-activate '(ignore-headlines))) +(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 - (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 + (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) - ; 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)) + (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 - (save-restriction - (widen) - (while (and (not parent-task) (org-up-heading-safe)) + (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 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")))))))))))) + (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")) - ) - ) +(use-package calfw + :ensure f + ) +(use-package calfw-org + :ensure f + ) +(use-package org-gcal + :if (file-readable-p "~/.hide/org_gcal.el") + :ensure f + :config '((if (file-readable-p "~/.hide/org_gcal.el") + (load-file "~/.hide/org_gcal.el")) + ) + ) #+END_SRC ** appt integration #+BEGIN_SRC emacs-lisp @@ -2041,8 +2468,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori * Debian ** debian-changelog #+BEGIN_SRC emacs-lisp - (use-package debian-changelog - :ensure f + (use-package debian-changelog-mode :mode "debian/changelog" :config (setq debian-changelog-mailing-address "don@debian.org") @@ -2055,17 +2481,20 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (setq case-fold-search t) (setq confirm-kill-emacs (quote y-or-n-p)) (setq cperl-lazy-help-time nil) - (display-time) - (setq display-time-24hr-format t) - (setq display-time-day-and-date t) - (display-time-mode 1) +#+END_SRC +** Turn on fontlock and icomplete +#+BEGIN_SRC emacs-lisp (global-font-lock-mode 1) (icomplete-mode 1) (setq log-edit-keep-buffer t) +#+END_SRC +** Set mail User agent +#+BEGIN_SRC emacs-lisp (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"))) +#+END_SRC +** PS Printing +#+BEGIN_SRC emacs-lisp (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))) @@ -2073,19 +2502,20 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (setq ps-print-footer t) (setq ps-print-footer-frame nil) (setq ps-print-only-one-header t) +#+END_SRC +** Only single spacing on sentences +#+BEGIN_SRC emacs-lisp (setq sentence-end "[.?!][]\"')]*\\($\\| \\| \\)[ ]*") (setq sentence-end-double-space nil) ; enable matching parenthesis +#+END_SRC +** Display paren mode +#+BEGIN_SRC emacs-lisp (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) + (setq show-paren-delay 0.2) - ;; 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))) + (setq user-mail-address "don@donarmstrong.com") ;; switch back to the old primary selection method (setq x-select-enable-clipboard nil) @@ -2095,20 +2525,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (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) @@ -2145,20 +2561,34 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (column-number-mode t) - ; 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) - - (desktop-load-default) - (desktop-read) +#+END_SRC +** Desktop-save-mode +If the envvar EMACS_SERVER_NAME is set, consider this a separate +emacs, and use a different desktop file to restore history +#+BEGIN_SRC emacs-lisp + (use-package desktop + :demand + :config + (setq desktop-base-file-name + (convert-standard-filename + (concat ".emacs" + (or (getenv "EMACS_SERVER_NAME") + "") + ".desktop") + )) + (setq desktop-base-lock-name + (convert-standard-filename + (concat desktop-base-file-name + ".lock"))) + (setq desktop-auto-save-timeout 60) + (setq desktop-restore-eager 5) + (setq desktop-lazy-verbose nil) + (desktop-save-mode 1) + ; (desktop-read) + ) +#+END_SRC +** Misc (Uncharacterized) +#+BEGIN_SRC emacs-lisp '(icomplete-mode on) (custom-set-faces ;; custom-set-faces was added by Custom. @@ -2200,30 +2630,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (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) - - ; 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) - - ; 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 () @@ -2331,10 +2737,16 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (ad-activate 'ask-user-about-supersession-threat) #+END_SRC -* Server +* Start Server #+BEGIN_SRC emacs-lisp - (unless (server-running-p) - (server-start)) + (use-package server + :config + (setq server-name + (or (getenv "EMACS_SERVER_NAME") + "server")) + (unless (server-running-p) + (global-set-key "\C-xp" 'server-edit) + (server-start))) #+END_SRC