X-Git-Url: https://git.donarmstrong.com/?p=lib.git;a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=e9b962c70cd52f580753485b5174653864aae21f;hp=32664b2e21559302c6d2e28d3d9ddd9b26fd7a7c;hb=bc8ab5fa2e2107be64a9d0399b603607731caac5;hpb=20482dafd6081969f98e314e2fe4836bc1ab3c9a diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index 32664b2..e9b962c 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -7,39 +7,73 @@ #+BEGIN_SRC emacs-lisp (setq debug-on-event 'siguser2) #+END_SRC -* Add library paths - +* Initial startup stuff +** Disable startup screen #+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") - (add-to-list 'load-path '"~/lib/emacs_el/polymode") + (setq inhibit-startup-screen t) +#+END_SRC +** Disable cluter +#+BEGIN_SRC emacs-lisp + ; (if (fboundp 'menu-bar-mode) (menu-bar-mode -1)) + (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) + (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) +#+END_SRC +** Fullscreen +#+BEGIN_SRC emacs-lisp + (setq frame-resize-pixelwise t) + (add-to-list 'default-frame-alist '(fullscreen . maximixed)) #+END_SRC - * Package management ** package repositories and package manager +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 + (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 + (package-initialize) + (unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) + (let ((package-user-dir-real (file-truename package-user-dir))) + ;; The reverse is necessary, because outside we mapc + ;; add-to-list element-by-element, which reverses. + (nreverse (apply #'nconc + ;; Only keep package.el provided loadpaths. + (mapcar #'(lambda (path) + (if (string-prefix-p package-user-dir-real path) + (list path) + nil)) + load-path)))))) + (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "http://orgmode.org/elpa/") )) - (package-initialize) -#+END_SRC -** [[https://github.com/jwiegley/use-package/][use-package]] -#+BEGIN_SRC emacs-lisp + ("melpa" . "https://melpa.org/packages/") + ("org" . "http://orgmode.org/elpa/") )) (require 'use-package) + (require 'diminish) + (require 'bind-key) #+END_SRC ** Paradox #+BEGIN_SRC emacs-lisp (use-package paradox :ensure paradox - ) + :commands (paradox-upgrade-packages paradox-list-packages) + :config (setq paradox-execute-asynchronously t) + ) +#+END_SRC +* Add library paths + +#+BEGIN_SRC emacs-lisp + (add-to-list 'load-path '"~/lib/emacs_el/") + (add-to-list 'load-path '"~/lib/emacs_el/magit-annex") +#+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 @@ -52,7 +86,17 @@ (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 @@ -69,9 +113,36 @@ (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook) #+END_SRC * Modules +** Hippie Expand +#+BEGIN_SRC emacs-lisp + (use-package hippie-expand + :bind* (("M-" . hippie-expand)) + ) +#+END_SRC +** Flyspell 🐝 +#+BEGIN_SRC emacs-lisp + (use-package flyspell + :ensure t + :diminish flyspell-mode 🐝 + :config + (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 +** Flymake +#+begin_src emacs-lisp :tangle yes + (use-package flymake + :diminish "Φ") +#+end_src + ** Winnermode #+BEGIN_SRC emacs-lisp -(winner-mode 1) + (winner-mode 1) #+END_SRC ** Eyebrowse @@ -79,7 +150,7 @@ (use-package eyebrowse :ensure t :diminish eyebrowse-mode - :init (setq eyebrowse-keymap-prefix (kbd "C-c C-\\")) + :init (setq eyebrowse-keymap-prefix (kbd "C-c e")) :config (progn (setq eyebrowse-wrap-around t) (eyebrowse-mode t) @@ -98,80 +169,607 @@ )) ))) - (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)) + ;; 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 ;; load tinyprocmail - (with-library 'tinyprocmail - ; (setq tinyprocmail--procmail-version "v3.22") - (add-hook 'tinyprocmail--load-hook 'tinyprocmail-install)) + (use-package tinyprocmail + :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny" + :mode (".procmailrc" . turn-on-tinyprocmail-mode) + ) #+END_SRC ** Magit #+BEGIN_SRC emacs-lisp :tangle don-configuration.el - ; don't verify where we are pushing - (setq magit-push-always-verify nil) - ;; refine diffs always (hilight words) - (setq magit-diff-refine-hunk 'all) - ;; load magit-annex - (setq load-path - (append '("~/lib/emacs_el/magit-annex") - load-path)) - (require 'magit-annex) + (use-package magit + :ensure t + :bind (("C-x g" . magit-status) + ("C-x C-g" . magit-status)) + :config + ;; refine diffs always (hilight words) + (setq magit-diff-refine-hunk nil) + ) + (use-package magit-annex + :ensure t + :load-path "~/lib/emacs_el/magit-annex/" + ) + (use-package magit-vcsh + :ensure f ; currently not in melpa, so don't try to install + :load-path "~/lib/emacs_el/magit-vcsh/" + ) #+END_SRC ** Perl #+BEGIN_SRC emacs-lisp - (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"))) + (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 +** 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 +** VCL --editing varnish configuration files +#+BEGIN_SRC emacs-lisp + (use-package vcl-mode + :ensure t + :mode "\\.vcl\\'" + ) + +#+END_SRC ** Helm #+BEGIN_SRC emacs-lisp -(require 'don-helm) + (defun malb/helm-omni (&rest arg) + ;; just in case someone decides to pass an argument, helm-omni won't fail. + (interactive) + (unless helm-source-buffers-list + (setq helm-source-buffers-list + (helm-make-source "Buffers" 'helm-source-buffers))) + (helm-other-buffer + (append + + (if (projectile-project-p) + '(helm-source-projectile-buffers-list + helm-source-buffers-list) + '(helm-source-buffers-list)) ;; list of all open buffers + + `(((name . "Virtual Workspace") + (candidates . ,(--map (cons (eyebrowse-format-slot it) (car it)) + (eyebrowse--get 'window-configs))) + (action . (lambda (candidate) + (eyebrowse-switch-to-window-config candidate))))) + + (if (projectile-project-p) + '(helm-source-projectile-recentf-list + helm-source-recentf) + '(helm-source-recentf)) ;; all recent files + + ;; always make some common files easily accessible + ;;'(((name . "Common Files") + ;; (candidates . malb/common-file-targets) + ;; (action . (("Open" . (lambda (x) (find-file (eval x)))))))) + + '(helm-source-files-in-current-dir + helm-source-locate + helm-source-bookmarks + helm-source-buffer-not-found ;; ask to create a buffer otherwise + )) + "*Helm all the things*")) + (use-package helm + :ensure helm + :diminish helm-mode + :bind (("M-x" . helm-M-x) + ("C-x C-f" . helm-find-files) + ("C-x b" . helm-buffers-list) ; malb/helm-omni) + ("C-x C-b" . helm-buffers-list) ; malb/helm-omni) + ("C-c " . helm-all-mark-rings)) + :config + (require 'helm-config) + (require 'helm-for-files) + (require 'helm-bookmark) + + (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) + (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)) + (defvar malb/helm-swoop-ignore-major-mode "List of major modes to ignore for helm-swoop") + (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 + :commands helm-swoop + :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 +*** Helm Google +This can be used to link things pretty quickly if necessary +#+BEGIN_SRC emacs-lisp + (use-package helm-google + :ensure t + :bind ("C-c h g" . helm-google) + :config + (progn (add-to-list 'helm-google-actions + '("Copy URL" . (lambda (candidate) + (let ((url + (replace-regexp-in-string + "https://.*q=\\(.*\\)\&sa=.*" + "\\1" candidate))) + (kill-new url)))) + t + ) + + (add-to-list 'helm-google-actions + '("Org Store Link" . (lambda (candidate) + (let ((title (car (split-string candidate "[\n]+"))) + (url + (replace-regexp-in-string + "https://.*q=\\(.*\\)\&sa=.*" + "\\1" candidate))) + (push (list url title) org-stored-links)))) + t) + )) +#+END_SRC + +** Projectile -- Project management +#+begin_src emacs-lisp + (use-package projectile + :ensure t + :bind (("" . projectile-compile-project) + ("" . next-error)) + :config (progn + (use-package magit :ensure t) + (require 'helm-projectile) + (helm-projectile-on) + + (setq projectile-make-test-cmd "make check" + projectile-switch-project-action 'helm-projectile + projectile-mode-line '(:eval (format "»{%s}" (projectile-project-name)))) + + (projectile-global-mode))) +#+end_src + +*** helm integration +#+begin_src emacs-lisp + (use-package helm-projectile + :ensure t + :config (progn + (defvar malb/helm-source-file-not-found + (helm-build-dummy-source + "Create file" + :action 'find-file)) + + (add-to-list + 'helm-projectile-sources-list + malb/helm-source-file-not-found t) + + (helm-delete-action-from-source + "Grep in projects `C-s'" + helm-source-projectile-projects) + + (helm-add-action-to-source + "Grep in projects `C-s'" + 'helm-do-ag helm-source-projectile-projects 4))) +#+end_src +** Zap to char +#+BEGIN_SRC emacs-lisp + (use-package avy-zap + :ensure t + :bind ("M-z" . avy-zap-up-to-char-dwim)) #+END_SRC ** Hydra -#+BEGIN_SRC emacs-lisp :tangle don-configuration.el -(require 'don-hydra) +#+BEGIN_SRC emacs-lisp + (use-package hydra + :bind (("C-c 2" . my/hydra-orgmodes/body) + ("C-c @" . my/hydra-orgmodes/body) + ("C-c #" . my/hydra-outline/body) + ("C-c 3" . my/hydra-outline/body) + ) + :config + (defhydra my/hydra-orgmodes (:color blue :hint nil) + " + _n_: notes _c_: chaim _w_: wildman _o_: ool + _u_: uddin _s_: steve _r_: refile _f_: fh + _p_: read papers _R_: paper notes + _h_: hpcbio + _q_: quit + _z_: quit + " + ("n" (find-file "~/projects/org-notes/notes.org")) + ("c" (find-file "~/projects/org-notes/chaim.org")) + ("w" (find-file "~/projects/org-notes/wildman.org")) + ("u" (find-file "~/projects/org-notes/uddin.org")) + ("o" (find-file "~/projects/org-notes/ool.org")) + ("f" (find-file "~/projects/org-notes/fh.org")) + ("s" (find-file "~/projects/org-notes/sndservers.org")) + ("r" (find-file "~/projects/org-notes/refile.org")) + ("p" (find-file "~/projects/research/papers_to_read.org")) + ("R" (find-file "~/projects/research/paper_notes.org")) + ("h" (find-file "~/projects/org-notes/hpcbio.org")) + ("q" nil "quit") + ("z" nil "quit") + ) + + ;; from https://github.com/abo-abo/hydra/wiki/Emacs + (defhydra my/hydra-outline (:color pink :hint nil) + " + ^Hide^ ^Show^ ^Move + ^^^^^^------------------------------------------------------ + _q_: sublevels _a_: all _u_: up + _t_: body _e_: entry _n_: next visible + _o_: other _i_: children _p_: previous visible + _c_: entry _k_: branches _f_: forward same level + _l_: leaves _s_: subtree _b_: backward same level + _d_: subtree + + " + ;; Hide + ("q" outline-hide-sublevels) ; Hide everything but the top-level headings + ("t" outline-hide-body) ; Hide everything but headings (all body lines) + ("o" outline-hide-other) ; Hide other branches + ("c" outline-hide-entry) ; Hide this entry's body + ("l" outline-hide-leaves) ; Hide body lines in this entry and sub-entries + ("d" outline-hide-subtree) ; Hide everything in this entry and sub-entries + ;; Show + ("a" outline-show-all) ; Show (expand) everything + ("e" outline-show-entry) ; Show this heading's body + ("i" outline-show-children) ; Show this heading's immediate child sub-headings + ("k" outline-show-branches) ; Show all sub-headings under this heading + ("s" outline-show-subtree) ; Show (expand) everything in this heading & below + ;; Move + ("u" outline-up-heading) ; Up + ("n" outline-next-visible-heading) ; Next + ("p" outline-previous-visible-heading) ; Previous + ("f" outline-forward-same-level) ; Forward - same level + ("b" outline-backward-same-level) ; Backward - same level + ("z" nil "leave")) + ) #+END_SRC ** Tramp @@ -185,176 +783,1357 @@ (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 - (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) - (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))))) - ;; 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 - (require 'org-mode-configuration) + (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 - (require 'ess_configuration) + (use-package ess + :ensure t + :commands R + :mode "\\.R\\'" + :bind (:map ess-mode-map + ("C-c C-R" . dla/ess-region-remote-eval)) + :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))) + )) + (defun dla/ess-region-remote-eval (start end) + "Evaluate region in a remote ESS instance" + (interactive "r") + (shell-command-on-region start end "eval_r" (get-buffer-create "***essregionremoteeval***")) + kill-buffer "***essregionremoteeval***") + ;; 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 - (setq load-path - (append '("~/lib/emacs_el/polymode/modes") - load-path)) - (require 'polymode) - (require 'poly-R) - (require 'poly-noweb) - (require 'poly-markdown) - (add-to-list 'auto-mode-alist '("\\.Snw" . poly-noweb+r-mode)) - (add-to-list 'auto-mode-alist '("\\.Rnw" . poly-noweb+r-mode)) - (add-to-list 'auto-mode-alist '("\\.Rmd" . poly-markdown+r-mode)) + (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 -* Keybindings -** Override other things +** Outlining +*** Outline magic #+BEGIN_SRC emacs-lisp - ; apparently things like to step on C-;, so we'll use a hack from - ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this + (use-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 +** Spamassassin Mode +#+BEGIN_SRC emacs-lisp + (use-package spamassassin-mode + :defer + :ensure f + ) +#+END_SRC +** Password Store +#+BEGIN_SRC emacs-lisp + (use-package password-store + :ensure f + :commands password-store-edit password-store-create + ) +#+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 + :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 + +* Email +** Mutt +*** Message-mode +#+BEGIN_SRC emacs-lisp + (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))) + (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 "> ") + ) +#+END_SRC +*** Muttrc mode +#+BEGIN_SRC emacs-lisp + (use-package muttrc-mode + :mode "muttngrc" + :mode "muttrc" + ) - (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.") +#+END_SRC +* 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) +#+END_SRC +* Org Mode +** Use-package and load things +#+BEGIN_SRC emacs-lisp - ; use iedit everywhere - (define-key my-keys-minor-mode-map (kbd "C-;") 'iedit-mode) - ;; use outline mode keybindings everywhere - (define-key my-keys-minor-mode-map (kbd "C-;") 'my/mydra-outline/body) + (use-package org + :delight (org-mode "ø") + :config - (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) +#+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) + + ;; 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" + "~/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) + (goto-char (point-max)) + (newline)) + (write-file "/tmp/timeline.org") + (org-agenda arg "L"))) + (define-key org-mode-map (kbd "C-c t") 'org-agenda-timeline-all) - (my-keys-minor-mode 1) - (defun my-minibuffer-setup-hook () - (my-keys-minor-mode 0)) +#+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") - (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) + (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 +** appt integration +#+BEGIN_SRC emacs-lisp + (use-package appt + :ensure f + :config + ;; Show notification 10 minutes before event + (setq appt-message-warning-time 10) + ;; Disable multiple reminders + (setq appt-display-interval appt-message-warning-time) + (setq appt-display-mode-line nil) + + ;; add automatic reminders for appointments + (defun my/org-agenda-to-appt () + (interactive) + (setq appt-time-msg-list nil) + (org-agenda-to-appt)) + ;; add reminders when starting emacs + (my/org-agenda-to-appt) + ;; when rebuilding the agenda + (defadvice org-agenda-redo (after org-agenda-redo-add-appts) + "Pressing `r' on the agenda will also add appointments." + (my/org-agenda-to-appt) + ) + ;; when saving all org buffers + (defadvice org-save-all-org-buffers (after org-save-all-org-buffers-add-appts) + "Re-add appts after saving all org buffers" + (my/org-agenda-to-appt)) + ;; Display appointments as a window manager notification + (setq appt-disp-window-function 'my/appt-display) + (setq appt-delete-window-function (lambda () t)) + + (setq my/appt-notification-app (concat (getenv "HOME") "/bin/appt_notification")) + + (defun my/appt-display (min-to-app new-time msg) + (if (atom min-to-app) + (start-process "my/appt-notification-app" nil my/appt-notification-app min-to-app msg) + (dolist (i (number-sequence 0 (1- (length min-to-app)))) + (start-process "my/appt-notification-app" nil my/appt-notification-app + (nth i min-to-app) (nth i msg)))) + ) + ) + + +#+END_SRC +** End use-package +#+BEGIN_SRC emacs-lisp + ) +#+END_SRC +* Keybindings +** Goto line +#+BEGIN_SRC emacs-lisp + (global-unset-key "\M-g") + (global-set-key (kbd "M-g l") 'goto-line) +#+END_SRC +* Debian +** debian-changelog +#+BEGIN_SRC emacs-lisp + (use-package debian-changelog + :ensure f + :mode "debian/changelog" + :config + (setq debian-changelog-mailing-address "don@debian.org") + (setq debian-changelog-full-name "Don Armstrong")) +#+END_SRC * Misc (uncharacterized) #+BEGIN_SRC emacs-lisp - (setq bibtex-user-optional-fields (quote (("annote" "Personal annotation (ignored)") ("abstract" "") ("pmid" "") ("doi" "")))) - (setq calendar-latitude 40.11) - (setq calendar-longitude -88.24) + (setq calendar-latitude 38.6) + (setq calendar-longitude -121.5) (setq case-fold-search t) (setq confirm-kill-emacs (quote y-or-n-p)) (setq cperl-lazy-help-time nil) - (setq debian-changelog-mailing-address "don@debian.org") (display-time) (setq display-time-24hr-format t) (setq display-time-day-and-date t) (display-time-mode 1) - (setq font-latex-fontify-script nil) - (setq font-latex-fontify-sectioning (quote color)) - (setq font-latex-script-display (quote (nil))) - (global-auto-revert-mode 1) (global-font-lock-mode 1) (icomplete-mode 1) (setq log-edit-keep-buffer t) @@ -362,10 +2141,6 @@ (setq markdown-enable-math t) (setq markdown-follow-wiki-link-on-enter nil) (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases"))) - (setq post-email-address "don@donarmstrong.com") - (setq post-kill-quoted-sig nil) - (setq post-mail-message "mutt\\(ng\\|\\)-[a-z0-9]+-[0-9]+-.*") - (setq post-uses-fill-mode nil) (setq ps-footer-font-size (quote (8 . 10))) (setq ps-header-font-size (quote (8 . 10))) (setq ps-header-title-font-size (quote (10 . 10))) @@ -373,7 +2148,6 @@ (setq ps-print-footer t) (setq ps-print-footer-frame nil) (setq ps-print-only-one-header t) - (setq safe-local-variable-values (quote ((auto-save-default) (make-backup-files)))) (setq sentence-end "[.?!][]\"')]*\\($\\| \\| \\)[ ]*") (setq sentence-end-double-space nil) @@ -396,101 +2170,9 @@ (fset 'perl-mode 'cperl-mode) ;;(load-file "cperl-mode.el") - (require 'vcl-mode) - - (require 'tex-site) - ;;(require 'psvn) - ;;(require 'ecasound) - ;;(require 'emacs-wiki) - (require 'bibtex) - (require 'post) - ;;(require 'fixme) - ; (require 'google-weather) - ; (require 'org-google-weather) - ; (setq-default org-google-weather-format "%i %c, [%l,%h] %s %C") - - ; http://julien.danjou.info/projects/emacs-packages#rainbow-mode - ; this colorizes color strings - (require 'rainbow-mode) - ; add ess to the x major mode - (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S]) - (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R]) - - (global-set-key "\C-xp" 'server-edit) - - (setq-default auto-mode-alist (cons '("\.wml$" . - (lambda () (html-mode) (auto-fill-mode))) - auto-mode-alist)) - - - ; use markdown mode for mdwn files - (add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode)) - (add-to-list 'auto-mode-alist '("\\.md$" . markdown-mode)) - - ;; tramp configuration (setq tramp-use-ssh-controlmaster-options nil) - ; mail configuration - (add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . message-mode)) - (add-to-list 'auto-mode-alist '("muttngrc" . muttrc-mode)) - - (add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . message-mode)) - (add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode)) - (defun my-message-mode-settings () - (font-lock-add-keywords nil - '(("^[ \t]*>[ \t]*>[ \t]*>.*$" - (0 'message-multiply-quoted-text-face)) - ("^[ \t]*>[ \t]*>.*$" - (0 'message-double-quoted-text-face)))) - (local-set-key (kbd "C-c C-a") 'my-post-attach-file) - ) - (add-hook 'message-mode-hook 'my-message-mode-settings) - - (defun my-post-attach-file () - "Prompt for an attachment." - (interactive) - (let ((file (read-file-name "Attach file: " nil nil t nil)) - (description (string-read "Description: "))) - (my-header-attach-file file description))) - - (symbol-function 'my-post-attach-file) - - (defun my-header-attach-file (file description) - "Attach a FILE to the current message (works with Mutt). - Argument DESCRIPTION MIME description." - (interactive "fAttach file: \nsDescription: ") - (when (> (length file) 0) - (save-excursion - (save-match-data - (save-restriction - (widen) - (goto-char (point-min)) - (search-forward-regexp "^$") - (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " " - description "\n")) - (message (concat "Attached '" file "'.")) - (setq post-has-attachment t)))))) - - - - (setq mail-yank-prefix "> ") - - (global-unset-key "\M-g") - (global-set-key "\M-g" 'goto-line) - - ;; self-insert-command hack. - ;; Without this, "if" 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) @@ -523,60 +2205,8 @@ ) (column-number-mode t) - (setq-default reftex-plug-into-AUCTeX t) - - (server-start) - - ; (require 'mode-compile) - - (defadvice server-process-filter (after post-mode-message first activate) - "If the buffer is in post mode, overwrite the server-edit - message with a post-save-current-buffer-and-exit message." - (if (eq major-mode 'post-mode) - (message - (substitute-command-keys "Type \\[describe-mode] for help composing; \\[post-save-current-buffer-and-exit] when done.")))) - ; This is also needed to see the magic message. Set to a higher - ; number if you have a faster computer or read slower than me. - '(font-lock-verbose 1000) - ;(setq-default server-temp-file-regexp "mutt\(-\|ng-\)") - ; (add-hook 'server-switch-hook - ; (function (lambda() - ; (cond ((string-match "Post" mode-name) - ; (post-goto-body))) - ; set-buffer-file-coding-system 'utf-8 - ; ))) - ; - - (add-hook 'post-mode-hook - (auto-fill-mode nil) - ) - ; abbrev mode settings - ; load abbreviations from - (setq abbrev-file-name - "~/.emacs_abbrev_def") - - ; read the abbrev file if it exists - (if (file-exists-p abbrev-file-name) - (quietly-read-abbrev-file)) - - ; for now, use abbrev mode everywhere - (setq default-abbrev-mode t) - - - (defun insert-function-documentation () - "Insert function documentation" - (interactive) - (insert-file-contents "/home/don/lib/templates/perl_function_documentation" nil)) - (global-set-key "\M-f" 'insert-function-documentation) - - (eval-after-load "lilypond-mode" - '(progn - (load-library "lyqi-mode") - (define-key LilyPond-mode-map "\C-cq" 'lyqi-mode))) - - (autoload 'spamassassin-mode "spamassassin-mode" nil t) - - (desktop-load-default) + + (desktop-save-mode) (desktop-read) '(icomplete-mode on) (custom-set-faces @@ -591,13 +2221,6 @@ (put 'downcase-region 'disabled nil) (put 'narrow-to-region 'disabled nil) - - (autoload 'flyspell-mode "flyspell" "On-the-fly spelling checker." t) - (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) ; (defun turn-on-flyspell () ; "Force flyspell-mode on using a positive arg. For use in hooks." ; (interactive) @@ -607,18 +2230,18 @@ ; 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 + (define-key cm-map "q" 'outline-hide-sublevels) ; Hide everything but the top-level headings + (define-key cm-map "t" 'outline-hide-body) ; Hide everything but headings (all body lines) + (define-key cm-map "o" 'outline-hide-other) ; Hide other branches + (define-key cm-map "c" 'outline-hide-entry) ; Hide this entry's body + (define-key cm-map "l" 'outline-hide-leaves) ; Hide body lines in this entry and sub-entries + (define-key cm-map "d" 'outline-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 + (define-key cm-map "a" 'outline-show-all) ; Show (expand) everything + (define-key cm-map "e" 'outline-show-entry) ; Show this heading's body + (define-key cm-map "i" 'outline-show-children) ; Show this heading's immediate child sub-headings + (define-key cm-map "k" 'outline-show-branches) ; Show all sub-headings under this heading + (define-key cm-map "s" 'outline-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 @@ -626,151 +2249,100 @@ (define-key cm-map "f" 'outline-forward-same-level) ; Forward - same level (define-key cm-map "b" 'outline-backward-same-level) ; Backward - same level (global-set-key "\M-o" cm-map) - - - ; debian stuff - (setq-default debian-changelog-mailing-address "don@debian.org") - (setq-default debian-changelog-full-name "Don Armstrong") - - ; ediff configuration - ; don't use the multi-window configuration - (setq ediff-window-setup-function 'ediff-setup-windows-plain) - - ; use iedit - (require 'iedit) - (define-key global-map (kbd "C-;") 'iedit-mode) - (global-set-key (kbd "C-;") 'iedit-mode) - - ; fix up css mode to not be silly - ; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/ - (setq cssm-indent-level 4) - (setq cssm-newline-before-closing-bracket t) - (setq cssm-indent-function #'cssm-c-style-indenter) - (setq cssm-mirror-mode nil) - - (require 'multi-web-mode) - (setq mweb-default-major-mode 'html-mode) - (setq mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>") - (js-mode "") - (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 - (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)) - )) + (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)) + )) + ) ) - ) - - ; procmailmode configuration - (load "procmail_mode") - - (load "mode-line-cleaner") + ) + ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys) (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." @@ -782,34 +2354,15 @@ (clear-visited-file-modtime) (not-modified))) (ad-activate 'ask-user-about-supersession-threat) +#+END_SRC - ; apparently things like to step on C-;, so we'll use a hack from - ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this - - (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.") - - ; use iedit everywhere - (define-key my-keys-minor-mode-map (kbd "C-;") 'iedit-mode) - - (define-minor-mode my-keys-minor-mode - "A minor mode so that my key settings override annoying major modes." - t " my-keys" 'my-keys-minor-mode-map) - - (my-keys-minor-mode 1) - (defun my-minibuffer-setup-hook () - (my-keys-minor-mode 0)) +* Server +#+BEGIN_SRC emacs-lisp + (unless (server-running-p) + (server-start)) +#+END_SRC - (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 * END #+BEGIN_SRC emacs-lisp