X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=5cbe55ec83a137ef613c553c575fd4ab61c5c778;hb=75fca1d773f7f59037a4f063b7cd799e540f4424;hp=b700f978fcebd1822617e8cb60aeae4bcd763607;hpb=530f68e1fe316d6bbbacca6cc8d304d9054c0449;p=lib.git diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index b700f97..5cbe55e 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -1,4 +1,11 @@ #+PROPERTY: header-args:emacs-lisp :tangle don-configuration.el +#+OPTIONS: auto-id:f + +* General Notes + +** Delight +To look up options for symbols for delight, check out https://en.wikipedia.org/wiki/Emoji#Unicode_blocks + * Load debugger # if for some reason, things get pear-shaped, we want to be able to @@ -6,102 +13,90 @@ #+BEGIN_SRC emacs-lisp (setq debug-on-event 'siguser2) +#+END_SRC +* Paths +** Update PATH +#+BEGIN_SRC emacs-lisp +(add-to-list 'exec-path '"/usr/local/bin") +(add-to-list 'exec-path '"~/bin/") +#+END_SRC +** Add library paths +#+BEGIN_SRC emacs-lisp +(let ((default-directory "~/lib/emacs_el/")) + (normal-top-level-add-subdirs-to-load-path)) +;; (eval-and-compile +;; (let ((default-directory "~/var/emacs/elpa")) +;; (normal-top-level-add-subdirs-to-load-path)) +;; ) +(add-to-list 'load-path '"~/lib/emacs_el") +(setq package-user-dir "~/var/emacs/elpa") + #+END_SRC * Initial startup stuff ** Disable startup screen #+BEGIN_SRC emacs-lisp - (setq inhibit-startup-screen t) +(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)) +; (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)) +(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 - (eval-and-compile - ;; add /etc/ssl/ca-global/ca-certificates.crt so that we can - ;; download packages when we're on Debian hosts which chop down the - ;; list of available certificates - (require 'gnutls) - (add-to-list 'gnutls-trustfiles "/etc/ssl/ca-global/ca-certificates.crt") - (setq package-enable-at-startup nil) - (setq package--init-file-ensured t) - (setq package-user-dir "~/var/emacs/elpa") - (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "http://orgmode.org/elpa/"))) - (setq use-package-verbose (not (bound-and-true-p byte-compile-current-file)))) - (mapc #'(lambda (add) (add-to-list 'load-path add)) - (eval-when-compile - (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)))))) - - ;;; fix up info paths for packages - (with-eval-after-load "info" - (info-initialize) - (dolist (dir (directory-files package-user-dir)) - (let ((fdir (concat (file-name-as-directory package-user-dir) dir))) - (unless (or (member dir '("." ".." "archives" "gnupg")) - (not (file-directory-p fdir)) - (not (file-exists-p (concat (file-name-as-directory fdir) "dir")))) - (add-to-list 'Info-directory-list fdir))))) - - - (eval-when-compile - (require 'use-package)) - (require 'diminish) - (require 'bind-key) +** Bootstrap straight.el +#+BEGIN_SRC emacs-lisp +(defvar bootstrap-version) +(setq straight-base-dir '"~/var/emacs/") +(let ((bootstrap-file + (expand-file-name "straight/repos/straight.el/bootstrap.el" straight-base-dir)) + (bootstrap-version 6)) + (unless (file-exists-p bootstrap-file) + (with-current-buffer + (url-retrieve-synchronously + "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" + 'silent 'inhibit-cookies) + (goto-char (point-max)) + (eval-print-last-sexp))) + (load bootstrap-file nil 'nomessage)) #+END_SRC -** Paradox +** package repositories and package manager #+BEGIN_SRC emacs-lisp - (use-package paradox - :ensure paradox - :commands (paradox-upgrade-packages paradox-list-packages) - :config (setq paradox-execute-asynchronously t) - ) +(straight-use-package 'use-package) +(setq straight-use-package-by-default t) +(setq use-package-verbose (not (bound-and-true-p byte-compile-current-file))) +(require 'gnutls) +(add-to-list 'gnutls-trustfiles "/etc/ssl/ca-global/ca-certificates.crt") #+END_SRC -* Add library paths - +** Paradox #+BEGIN_SRC emacs-lisp - (add-to-list 'load-path '"~/lib/emacs_el/") - (add-to-list 'load-path '"~/lib/emacs_el/magit-annex") +(use-package paradox + ;:ensure paradox + :commands (paradox-upgrade-packages paradox-list-packages) + :config + (setq paradox-execute-asynchronously t) + (setq paradox-github-token t) ; I don't want to be prompted about this integration + ) #+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") +;; Set the custom file to /dev/null and don't bother to load it +(setq custom-file "/dev/null") #+END_SRC * Misc functions ** with-library #+BEGIN_SRC emacs-lisp ;; From http://www.emacswiki.org/emacs/LoadingLispFiles ;; execute conditional code when loading libraries -(defmacro with-library (symbol &rest body) - `(when (require ,symbol nil t) - ,@body)) -(put 'with-library 'lisp-indent-function 1) +; (defmacro with-library (symbol &rest body) +; `(when (require ,symbol nil t) +; ,@body)) +; (put 'with-library 'lisp-indent-function 1) #+END_SRC * Variables @@ -118,54 +113,136 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster #+END_SRC * Memory #+BEGIN_SRC emacs-lisp - (setq global-mark-ring-max 128 - mark-ring-max 128 - kill-ring-max 128) +(setq global-mark-ring-max 128 + mark-ring-max 128 + kill-ring-max 128) - (defun don/minibuffer-setup-hook () - (setq gc-cons-threshold most-positive-fixnum)) +(defun don/minibuffer-setup-hook () + (setq gc-cons-threshold most-positive-fixnum)) - (defun don/minibuffer-exit-hook () - (setq gc-cons-threshold 1048576)) +(defun don/minibuffer-exit-hook () + (setq gc-cons-threshold 1048576)) - (add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook) - (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook) +(add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook) +(add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook) #+END_SRC * Modules +** Tree sitter +#+BEGIN_SRC emacs-lisp +(use-package tree-sitter + :defer t + :config + (global-tree-sitter-mode) + ) +(use-package tree-sitter-langs + :ensure t + :defer 1 + :after tree-sitter +; :config +; (defun dla/python-function-at-point () +; "Return a list of function arguments +; +; Borrowed from https://xenodium.com/emacs-generate-a-swift-initializer/ +; " +; (interactive) +; (cl-assert (seq-contains-p local-minor-modes 'tree-sitter-mode) "tree-sitter-mode not enabled") +; (let* ((node (tree-sitter-node-at-point 'function_definition) +; ) +; (args) +; (arg) +; (ret)) +; (unless node +; (error "Not in function")) +; (mapc +; (lambda (item) +; (cond ((eq 'func_name +; (car item)) +; ; (when arg +; ; (setq args (append args (list arg))) +; ; ) +; (setq arg (list (cons 'function (tsc-node-text +; (cdr item)))))) +; ((eq 'ident +; (car item)) +; (setq arg (map-insert arg 'ident (tsc-node-text +; (cdr item))))) +; ((eq 'ident_type +; (car item)) +; (setq arg (map-insert arg 'ident_type (tsc-node-text +; (cdr item))))) +; ((eq 'ret_type +; (car item)) +; (setq arg (map-insert arg 'ret_type (tsc-node-text +; (cdr item))))) +; )) +; (tsc-query-captures +; (tsc-make-query tree-sitter-language +; "(function_definition (identifier) @func_name (parameters [(identifier) @ident (typed_parameter (identifier) @ident (type) @ident_type)]) (type)? @ret_type)") +; (tree-sitter-node-at-point 'function_definition) nil)) +; (when arg +; (setq args (append args (list arg)))) +; args)) + +) +#+END_SRC ** Spacemacs theme #+BEGIN_SRC emacs-lisp (use-package spacemacs-theme - :ensure t - :init - (load-theme 'spacemacs-dark) + :config + (load-theme 'spacemacs-dark t) ) #+END_SRC ** Hippie Expand #+BEGIN_SRC emacs-lisp - (use-package hippie-exp - :bind* (("M-" . hippie-expand)) - ) +(use-package hippie-exp + :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") - ) - +(use-package flyspell + ; :delight flyspell-mode 🐝 + :config + (setq flyspell-mode-line-string " 🐝") + (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 + +** Flycheck #+begin_src emacs-lisp :tangle yes +(use-package flycheck + :delight 🦋 + :if (version<= "24.4" emacs-version) + :commands flycheck-mode + :hook ((prog-mode . flycheck-mode) + ) +) +;; Other pkgs +(use-package flycheck-tip + :commands 'flycheck-tip-cycle + :after flycheck + :bind (:map flycheck-mode-map + ("C-c C-n" . flycheck-tip-cycle))) + +(use-package flycheck-package) + +(use-package flycheck-checkpatch + :config (flycheck-checkpatch-setup) + :config (setq flycheck-checkers (delete 'checkpatch + flycheck-checkers)) + :config (add-to-list 'flycheck-checkers 'checkpatch t)) +#+end_src + +** Flymake +#+BEGIN_SRC emacs-lisp (use-package flymake - :diminish "Φ") -#+end_src + :delight "Φ") +#+END_SRC ** Winnermode #+BEGIN_SRC emacs-lisp @@ -176,7 +253,7 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster #+BEGIN_SRC emacs-lisp (use-package eyebrowse :ensure t - :diminish eyebrowse-mode + :delight eyebrowse-mode :init (setq eyebrowse-keymap-prefix (kbd "C-c e")) :config (progn (setq eyebrowse-wrap-around t) @@ -302,16 +379,10 @@ value, scrolling continues until there is no more output. #+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) +(use-package delight + :demand t) #+END_SRC ** Jumping @@ -353,1012 +424,987 @@ value, scrolling continues until there is no more output. ** 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) - (yas-reload-all) - ) - ) +(use-package yasnippet + :ensure t + :delight 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 "") nil) + (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) + (yas-reload-all) + ) + ) #+END_SRC *** Auto-YASnippet #+BEGIN_SRC emacs-lisp - (use-package auto-yasnippet - :ensure t - :bind (("H-w" . aya-create) - ("H-y" . aya-expand) - ) - ) -#+END_SRC -** Company -#+BEGIN_SRC emacs-lisp -(use-package company +(use-package auto-yasnippet :ensure t - :bind (("M-/" . company-complete)) - :config - (setq company-echo-delay 0 ; remove blinking - company-show-numbers t ; show numbers for easy selection - company-selection-wrap-around t - company-require-match nil - company-dabbrev-ignore-case t - company-dabbrev-ignore-invisible t - company-dabbrev-other-buffers t - company-dabbrev-downcase nil - company-dabbrev-code-everywhere t - company-tooltip-align-annotations t - company-minimum-prefix-length 1 - company-global-modes '(not) - company-lighter-base "(C)") - (global-company-mode 1) - :bind (:map company-active-map - ("C-n" . company-select-next) - ("C-p" . company-select-previous) - ("M-?" . company-show-doc-buffer) - ("M-." . company-show-location) - ) + :bind (("H-w" . aya-create) + ("H-y" . aya-expand) + ) ) #+END_SRC -*** C/C++ +** Treemacs: Tree file viewer #+BEGIN_SRC emacs-lisp - (use-package company-c-headers - :ensure t - :config (progn - (defun malb/ede-object-system-include-path () - "Return the system include path for the current buffer." - (when ede-object - (ede-system-include-path ede-object))) +;; Provides workspaces with file browsing (tree file viewer) +;; and project management when coupled with `projectile`. - (setq company-c-headers-path-system - #'malb/ede-object-system-include-path) - - (add-to-list 'company-backends #'company-c-headers))) -#+END_SRC -*** Python -#+BEGIN_SRC emacs-lisp -(use-package company-anaconda - :ensure t - :config (add-to-list 'company-backends #'company-anaconda)) +; (use-package treemacs +; :ensure t +; :defer t +; :config +; (setq treemacs-no-png-images t +; treemacs-width 24) +; :bind ("C-c t" . treemacs)) #+END_SRC -*** Perl +** LSP mode #+BEGIN_SRC emacs-lisp - (use-package company-plsense - :ensure t - ) -#+END_SRC -*** LaTeX -#+BEGIN_SRC emacs-lisp - (use-package company-math - :ensure t) -#+END_SRC -#+BEGIN_SRC emacs-lisp - (use-package company-auctex - :ensure t - :config (progn - (defun company-auctex-labels (command &optional arg &rest ignored) - "company-auctex-labels backend" - (interactive (list 'interactive)) - (case command - (interactive (company-begin-backend 'company-auctex-labels)) - (prefix (company-auctex-prefix "\\\\.*ref{\\([^}]*\\)\\=")) - (candidates (company-auctex-label-candidates arg)))) - - (add-to-list 'company-backends - '(company-auctex-macros - company-auctex-environments - company-math-symbols-unicode - company-math-symbols-latex)) - - (add-to-list 'company-backends #'company-auctex-labels) - (add-to-list 'company-backends #'company-auctex-bibs) - ) - ) -#+END_SRC -#+BEGIN_SRC emacs-lisp - (use-package company-bibtex - :ensure t - ) -#+END_SRC -*** Shell - - #+BEGIN_SRC emacs-lisp - (use-package company-shell - :ensure t - :config (progn - (setq company-shell-modes '(sh-mode shell-mode)) - (add-to-list 'company-backends 'company-shell))) - #+END_SRC - -*** YaSnippet - - Add YasSippet support for all company backends. ([[https://github.com/syl20bnr/spacemacs/pull/179][source]]) - - *Note:* Do this at the end of =company-mode= config. - - #+BEGIN_SRC emacs-lisp - (defvar malb/company-mode/enable-yas t - "Enable yasnippet for all backends.") - - (defun malb/company-mode/backend-with-yas (backend) - (if (or (not malb/company-mode/enable-yas) - (and (listp backend) - (member 'company-yasnippet backend))) - backend - (append (if (consp backend) backend (list backend)) - '(:with company-yasnippet)))) +(use-package lsp-mode + :defer t + :commands (lsp lsp-deferred) + :init (setq lsp-keymap-prefix "C-c l") + (defun my/orderless-dispatch-flex-first (_pattern index _total) + (and (eq index 0) 'orderless-flex)) - (setq company-backends - (mapcar #'malb/company-mode/backend-with-yas company-backends)) - #+END_SRC + (defun my/lsp-mode-setup-completion () + (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) + '(orderless))) -*** All the words + ;; Optionally configure the first word as flex filtered. + (add-hook 'orderless-style-dispatchers #'my/orderless-dispatch-flex-first nil 'local) - Enable/disable company completion from ispell dictionaries ([[https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-company.el][source]]) + ;; Optionally configure the cape-capf-buster. + ; (setq-local completion-at-point-functions (list (cape-capf-buster #'lsp-completion-at-point))) - #+BEGIN_SRC emacs-lisp - (defun malb/toggle-company-ispell () - (interactive) - (cond - ((member '(company-ispell :with company-yasnippet) company-backends) - (setq company-backends (delete '(company-ispell :with company-yasnippet) company-backends)) - (add-to-list 'company-backends '(company-dabbrev :with company-yasnippet) t) - (message "company-ispell disabled")) - (t - (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends)) - (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t) - (message "company-ispell enabled!")))) - - (defun malb/company-ispell-setup () - ;; @see https://github.com/company-mode/company-mode/issues/50 - (when (boundp 'company-backends) - (make-local-variable 'company-backends) - (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends)) - (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t) - ;; https://github.com/redguardtoo/emacs.d/issues/473 - (if (and (boundp 'ispell-alternate-dictionary) - ispell-alternate-dictionary) - (setq company-ispell-dictionary ispell-alternate-dictionary)))) - #+END_SRC - -*** Tab DWIM - - 1. =yas-expand= is run first and does what it has to, then it calls =malb/indent-fold-or-complete=. - - 2. This function then hopefully does what I want: - - a. if a region is active, just indent - b. if we’re looking at a space after a non-whitespace character, we try some company-expansion - c. If =hs-minor-mode= or =outline-minor-mode= is active, try those next - d. otherwise call whatever would have been called otherwise. - - ([[http://emacs.stackexchange.com/q/21182/8930][source]], [[http://emacs.stackexchange.com/q/7908/8930][source]]) - -#+BEGIN_SRC emacs-lisp - (defun malb/indent-fold-or-complete (&optional arg) - (interactive "P") - (cond - ;; if a region is active, indent - ((use-region-p) - (indent-region (region-beginning) - (region-end))) - ;; if the next char is space or eol, but prev char not whitespace - ((and (not (active-minibuffer-window)) - (or (looking-at " ") - (looking-at "$")) - (looking-back "[^[:space:]]") - (not (looking-back "^"))) - - (cond (company-mode (company-complete-common)) - (auto-complete-mode (auto-complete)))) - - ;; no whitespace anywhere - ((and (not (active-minibuffer-window)) - (looking-at "[^[:space:]]") - (looking-back "[^[:space:]]") - (not (looking-back "^"))) - (cond - ((bound-and-true-p hs-minor-mode) - (save-excursion (end-of-line) (hs-toggle-hiding))) - ((bound-and-true-p outline-minor-mode) - (save-excursion (outline-cycle))))) - - ;; by default just call whatever was bound - (t - (let ((fn (or (lookup-key (current-local-map) (kbd "TAB")) - 'indent-for-tab-command))) - (if (not (called-interactively-p 'any)) - (fn arg) - (setq this-command fn) - (call-interactively fn)))))) - - (defun malb/toggle-fold () - (interactive) - (cond ((eq major-mode 'org-mode) - (org-force-cycle-archived)) - ((bound-and-true-p hs-minor-mode) - (save-excursion - (end-of-line) - (hs-toggle-hiding))) - - ((bound-and-true-p outline-minor-mode) - (save-excursion - (outline-cycle))))) + :hook (python-mode . lsp-deferred) + (lsp-completion-mode . my/lsp-mode-setup-completion) + :custom + (lsp-completion-provider :none) ;; we use Corfu! +) +;; Provides visual help in the buffer +;; For example definitions on hover. +;; The `imenu` lets me browse definitions quickly. +(use-package lsp-ui + :defer t + :config + (setq lsp-ui-sideline-enable nil + lsp-ui-doc-delay 2) + :hook (lsp-mode . lsp-ui-mode) + :bind (:map lsp-ui-mode-map + ("C-c i" . lsp-ui-imenu))) +;; Language server for Python +;; Read the docs for the different variables set in the config. +(use-package lsp-pyright + :defer t + :config + (setq lsp-clients-python-library-directories '("/usr/")) + (setq lsp-pyright-disable-language-service nil + lsp-pyright-disable-organize-imports nil + lsp-pyright-auto-import-completions t + lsp-pyright-use-library-code-for-types t + lsp-pyright-venv-path "venv") + :hook ((python-mode . (lambda () + (require 'lsp-pyright) (lsp-deferred))))) +#+END_SRC +** Corfu +#+BEGIN_SRC emacs-lisp +(use-package corfu + :ensure t + :demand t + ;; Optional customizations + :custom + (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' + (corfu-auto t) ;; Enable auto completion + (corfu-separator ?\s) ;; Orderless field separator + (corfu-quit-at-boundary nil) ;; Never quit at completion boundary + (corfu-quit-no-match nil) ;; Never quit, even if there is no match + (corfu-preview-current nil) ;; Disable current candidate preview + (corfu-preselect 'prompt) ;; Preselect the prompt + (corfu-on-exact-match nil) ;; Configure handling of exact matches + (corfu-scroll-margin 5) ;; Use scroll margin - (bind-key "" #'malb/indent-fold-or-complete) - (bind-key "C-" #'malb/toggle-fold) + :config + (global-corfu-mode)) +#+END_SRC +** Dabbrv +#+BEGIN_SRC emacs-lisp +(use-package dabbrev + :ensure t + ;; Swap M-/ and C-M-/ + :bind (("M-/" . dabbrev-completion) + ("C-M-/" . dabbrev-expand)) + ;; Other useful Dabbrev configurations. + :custom + (dabbrev-ignored-buffer-regexps '("\\.\\(?:pdf\\|jpe?g\\|png\\)\\'"))) #+END_SRC ** Tinyprocmail #+BEGIN_SRC emacs-lisp - ;; load tinyprocmail - (use-package tinyprocmail - :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny" - :mode (".procmailrc" . turn-on-tinyprocmail-mode) - ) +;; load tinyprocmail +(use-package tinyprocmail + :straight (tinytools :type git :type git :host github :repo "jaalto/project--emacs-tiny-tools") + ; :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 - (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/" - ) +#+BEGIN_SRC emacs-lisp +(use-package magit + :defer 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 + :defer t + ) +(use-package magit-vcsh + :defer t + ) +#+END_SRC + +*** Forge (github/gitlab) +#+BEGIN_SRC emacs-lisp +(use-package forge + :after magit + ) #+END_SRC ** Perl #+BEGIN_SRC emacs-lisp - (use-package cperl-mode - :config - (progn - ;; Use c-mode for perl .xs files - (add-to-list 'auto-mode-alist '("\\.xs\\'" . c-mode)) - (add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\)\\'" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode)) - (setq cperl-hairy t - cperl-indent-level 4 - cperl-auto-newline nil - cperl-auto-newline-after-colon nil - cperl-continued-statement-offset 4 - cperl-brace-offset -1 - cperl-continued-brace-offset 0 - cperl-label-offset -4 - cperl-highlight-variables-indiscriminately t - cperl-electric-lbrace-space nil - cperl-indent-parens-as-block nil - cperl-close-paren-offset -1 - cperl-tab-always-indent t) - ;;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle"))) - )) +(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) + (setq cperl-lazy-help-time nil) + ;;(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) - ) +(use-package markdown-mode + :ensure t + :defer 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 +; load sql-indent when sql is loaded +(use-package sql-indent + :hook sql-mode + ) (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) - ) +(use-package ediff + :commands ediff ediff3 + :config + ;; ediff configuration + ;; don't use the multi-window configuration + (setq ediff-window-setup-function 'ediff-setup-windows-plain) +) #+END_SRC ** Do the Right Thing Indenting Attempts to automatically identify the right indentation for a file #+BEGIN_SRC emacs-lisp (use-package dtrt-indent - :ensure t ) #+END_SRC ** VCL --editing varnish configuration files #+BEGIN_SRC emacs-lisp - (use-package vcl-mode - :ensure t - :mode "\\.vcl\\'" - ) - +(use-package vcl-mode + :mode "\\.vcl\\'" + ) #+END_SRC -** Helm +** Vertico #+BEGIN_SRC emacs-lisp - (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")))) +(use-package vertico + :demand t + :config + (vertico-mode) + ; (define-key vertico-map "\r" #'vertico-directory-enter) + ; (define-key vertico-map "\d" #'vertico-directory-delete-char) + ; (define-key vertico-map "\M-\d" #'vertico-directory-delete-word) + ; (add-hook 'rfn-eshadow-update-overlay-hook #'vertico-directory-tidy) + + ;; Different scroll margin + ;; (setq vertico-scroll-margin 0) + + ;; Show more candidates + ;; (setq vertico-count 20) + + ;; Grow and shrink the Vertico minibuffer + ;; (setq vertico-resize t) + + ;; Optionally enable cycling for `vertico-next' and `vertico-previous'. + ;; (setq vertico-cycle t) + :custom + (vertico-grid-separator " ") + (vertico-grid-lookahead 50) +) +(use-package vertico-multiform + :straight nil + :load-path "~/var/emacs/straight/build/vertico/extensions/" + :after vertico + :config + (setq vertico-multiform-categories + '((file reverse) + (consult-grep buffer) + (consult-location) + (imenu buffer) + (library reverse indexed) + (org-roam-node reverse indexed) + ; (t reverse) + ) + ) + (setq vertico-multiform-commands + '(("flyspell-correct-*" grid reverse) + (org-refile grid reverse indexed) + (consult-yank-pop indexed) + (consult-flycheck) + (consult-lsp-diagnostics) + ) + ) + (vertico-multiform-mode) ) -#+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 +(use-package vertico-grid + :straight nil + :after vertico + ) +(use-package vertico-reverse + :straight nil + :after vertico + ) +(use-package vertico-indexed + :straight nil + :after vertico + ) +(use-package vertico-buffer + :straight nil + :after vertico + ) -*** 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 +;; Persist history over Emacs restarts. Vertico sorts by history position. +(use-package savehist + :demand t + :config + (savehist-mode)) + +#+END_SRC +** Orderless: advanced completion style #+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) +(use-package orderless + :demand t + :config + ;; Configure a custom style dispatcher (see the Consult wiki) + ;; (setq orderless-style-dispatchers '(+orderless-dispatch) + ;; orderless-component-separator #'orderless-escapable-split-on-space) + (setq completion-styles '(orderless basic) + completion-category-defaults nil + completion-category-overrides '((file (styles partial-completion))))) +#+end_src +** Marginalia: Rich annotations in the minibuffer +#+begin_src emacs-lisp +(use-package marginalia + :demand t + :bind (:map minibuffer-local-map + ("M-A" . marginalia-cycle)) + :config + (marginalia-mode) + ) +#+end_src +** Embark: Minibuffer actions and context menu +#+begin_src emacs-lisp +(use-package embark + :bind + (("C-." . embark-act) ;; pick some comfortable binding + ("C-;" . embark-dwim) ;; good alternative: M-. + ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings' - (setq projectile-make-test-cmd "make check" - projectile-switch-project-action 'helm-projectile - projectile-mode-line '(:eval (format "»{%s}" (projectile-project-name)))) + :init + + ;; Optionally replace the key help with a completing-read interface + (setq prefix-help-command #'embark-prefix-help-command) + + :config - (projectile-global-mode))) + ;; Hide the mode line of the Embark live/completions buffers + (add-to-list 'display-buffer-alist + '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*" + nil + (window-parameters (mode-line-format . none))))) + +(use-package embark-consult + :hook + (embark-collect-mode . consult-preview-at-point-mode)) #+end_src +** Consult +#+begin_src emacs-lisp +(use-package consult + ;; Replace bindings. Lazily loaded due by `use-package'. + :bind (;; C-c bindings in `mode-specific-map' + ("C-c M-x" . consult-mode-command) + ("C-c h" . consult-history) + ("C-c k" . consult-kmacro) + ("C-c m" . consult-man) + ("C-c i" . consult-info) + ([remap Info-search] . consult-info) + ;; C-x bindings in `ctl-x-map' + ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command + ("C-x b" . consult-buffer) ;; orig. switch-to-buffer + ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window + ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame + ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump + ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer + ;; Custom M-# bindings for fast register access + ("M-#" . consult-register-load) + ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) + ("C-M-#" . consult-register) + ;; Other custom bindings + ("M-y" . consult-yank-pop) ;; orig. yank-pop + ;; M-g bindings in `goto-map' + ("M-g e" . consult-compile-error) + ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g g" . consult-goto-line) ;; orig. goto-line + ("M-g M-g" . consult-goto-line) ;; orig. goto-line + ("M-g o" . consult-outline) ;; Alternative: consult-org-heading + ("M-g m" . consult-mark) + ("M-g k" . consult-global-mark) + ("M-g i" . consult-imenu) + ("M-g I" . consult-imenu-multi) + ;; M-s bindings in `search-map' + ("M-s d" . consult-find) + ("M-s D" . consult-locate) + ("M-s g" . consult-grep) + ("M-s G" . consult-git-grep) + ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line) + ("M-s L" . consult-line-multi) + ("M-s k" . consult-keep-lines) + ("M-s u" . consult-focus-lines) + ;; Isearch integration + ("M-s e" . consult-isearch-history) + :map isearch-mode-map + ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s l" . consult-line) ;; needed by consult-line to detect isearch + ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch + ;; Minibuffer history + :map minibuffer-local-map + ("M-s" . consult-history) ;; orig. next-matching-history-element + ("M-r" . consult-history)) ;; orig. previous-matching-history-element + + ;; Enable automatic preview at point in the *Completions* buffer. This is + ;; relevant when you use the default completion UI. + :hook (completion-list-mode . consult-preview-at-point-mode) + + :commands (consult-xref) + + ;; The :init configuration is always executed (Not lazy) + :init + + ;; Optionally configure the register formatting. This improves the register + ;; preview for `consult-register', `consult-register-load', + ;; `consult-register-store' and the Emacs built-ins. + (setq register-preview-delay 0.5 + register-preview-function #'consult-register-format) + + ;; Optionally tweak the register preview window. + ;; This adds thin lines, sorting and hides the mode line of the window. + (advice-add #'register-preview :override #'consult-register-window) + + ;; Use Consult to select xref locations with preview + (setq xref-show-xrefs-function #'consult-xref + xref-show-definitions-function #'consult-xref) -*** helm integration + ;; Configure other variables and modes in the :config section, + ;; after lazily loading the package. + :config + ;; Optionally configure preview. The default value + ;; is 'any, such that any key triggers the preview. + ;; (setq consult-preview-key 'any) + ;; (setq consult-preview-key "M-.") + ;; (setq consult-preview-key '("S-" "S-")) + ;; For some commands and buffer sources it is useful to configure the + ;; :preview-key on a per-command basis using the `consult-customize' macro. + (consult-customize + consult-theme :preview-key '(:debounce 0.2 any) + consult-ripgrep consult-git-grep consult-grep + consult-bookmark consult-recent-file consult-xref + consult--source-bookmark consult--source-file-register + consult--source-recent-file consult--source-project-recent-file + ;; :preview-key "M-." + :preview-key '(:debounce 0.4 any)) + + ;; Optionally configure the narrowing key. + ;; Both < and C-+ work reasonably well. + (setq consult-narrow-key "<") ;; "C-+" + + ;; Optionally make narrowing help available in the minibuffer. + ;; You may want to use `embark-prefix-help-command' or which-key instead. + ;; (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help) + + ;; By default `consult-project-function' uses `project-root' from project.el. + ;; Optionally configure a different project root function. + ;;;; 1. project.el (the default) + ;; (setq consult-project-function #'consult--default-project--function) + ;;;; 2. vc.el (vc-root-dir) + ;; (setq consult-project-function (lambda (_) (vc-root-dir))) + ;;;; 3. locate-dominating-file + ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git"))) + ;;;; 4. projectile.el (projectile-project-root) + ;; (autoload 'projectile-project-root "projectile") + ;; (setq consult-project-function (lambda (_) (projectile-project-root))) + ;;;; 5. No project support + ;; (setq consult-project-function nil) +) +#+end_src +** Projectile -- Project management #+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))) +(use-package projectile + :bind (("" . projectile-compile-project) + ("" . next-error)) + :config (projectile-global-mode)) #+end_src + ** Zap to char #+BEGIN_SRC emacs-lisp - (use-package avy-zap - :ensure t - :bind ("M-z" . avy-zap-up-to-char-dwim)) +(use-package avy-zap + :bind ("M-z" . avy-zap-up-to-char-dwim)) #+END_SRC ** 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 +(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" (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 +_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 my/org-refile-file)) + ("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 - ("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")) - ) +^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 #+BEGIN_SRC emacs-lisp - (use-package tramp - :config - (add-to-list 'tramp-methods '("vcsh" - (tramp-login-program "vcsh") - (tramp-login-args - (("enter") - ("%h"))) - (tramp-remote-shell "/bin/sh") - (tramp-remote-shell-args - ("-c"))))) +(use-package tramp + :demand t + ; use the built in tramp + :straight nil + :config + (setq tramp-use-ssh-controlmaster-options nil) + (add-to-list 'tramp-methods '("vcsh" + (tramp-login-program "vcsh") + (tramp-login-args + (("enter") + ("%h"))) + (tramp-remote-shell "/bin/sh") + (tramp-remote-shell-args + ("-c"))))) #+END_SRC ** Reftex #+BEGIN_SRC emacs-lisp - (use-package reftex - :ensure t - :config - (setq-default reftex-default-bibliography - '("~/projects/research/references.bib"))) +(use-package reftex + :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" "")))) - ) +(use-package bibtex + :config (setq bibtex-user-optional-fields + (quote (("annote" "Personal annotation (ignored)") + ("abstract" "") + ("pmid" "") + ("doi" "")))) + ) #+END_SRC ** LaTeX #+BEGIN_SRC emacs-lisp - (use-package tex - :defer t - :ensure auctex - :config - ; (add-to-list 'TeX-style-path '"/home/don/lib/emacs_el/auctex/style") - ;; REFTEX (much enhanced management of cross-ref, labels, etc) - ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/ - ; (autoload 'reftex-mode "reftex" "RefTeX Minor Mode" t) - ; (autoload 'turn-on-reftex "reftex" "RefTeX Minor Mode" nil) - ; (autoload 'reftex-citation "reftex-cite" "Make citation" nil) - ; (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t) - (add-hook 'LaTeX-mode-hook 'turn-on-reftex) ; with AUCTeX LaTeX mode - (add-hook 'latex-mode-hook 'turn-on-reftex) ; with Emacs latex mode - (add-hook 'LaTeX-mode-hook 'outline-minor-mode) ; with AUCTeX LaTeX mode - (add-hook 'latex-mode-hook 'outline-minor-mode) ; with Emacs latex mode - - (setq-default reftex-plug-into-AUCTeX t) - ;; support fake section headers - (setq TeX-outline-extra - '(("%chapter" 1) - ("%section" 2) - ("%subsection" 3) - ("%subsubsection" 4) - ("%paragraph" 5))) - ;; add font locking to the headers - (font-lock-add-keywords - 'latex-mode - '(("^%\\(chapter\\|\\(sub\\|subsub\\)?section\\|paragraph\\)" - 0 'font-lock-keyword-face t) - ("^%chapter{\\(.*\\)}" 1 'font-latex-sectioning-1-face t) - ("^%section{\\(.*\\)}" 1 'font-latex-sectioning-2-face t) - ("^%subsection{\\(.*\\)}" 1 'font-latex-sectioning-3-face t) - ("^%subsubsection{\\(.*\\)}" 1 'font-latex-sectioning-4-face t) - ("^%paragraph{\\(.*\\)}" 1 'font-latex-sectioning-5-face t))) - - ;; use smart quotes by default instead of `` and '' - ;; taken from http://kieranhealy.org/esk/kjhealy.html - (setq TeX-open-quote "“") - (setq TeX-close-quote "”") - - ;; (TeX-add-style-hook - ;; "latex" - ;; (lambda () - ;; (TeX-add-symbols - ;; '("DLA" 1)))) - ;; (custom-set-variables - ;; '(font-latex-user-keyword-classes - ;; '(("fixme" - ;; ("DLA" "RZ") - ;; font-lock-function-name-face 2 (command 1 t)))) - ;; ) - (setq-default TeX-parse-self t) - (setq-default TeX-auto-save t) - (setq-default TeX-master nil) - (eval-after-load - "latex" - '(TeX-add-style-hook - "cleveref" - (lambda () - (if (boundp 'reftex-ref-style-alist) - (add-to-list - 'reftex-ref-style-alist - '("Cleveref" "cleveref" - (("\\cref" ?c) ("\\Cref" ?C) ("\\cpageref" ?d) ("\\Cpageref" ?D))))) - (reftex-ref-style-activate "Cleveref") - (TeX-add-symbols - '("cref" TeX-arg-ref) - '("Cref" TeX-arg-ref) - '("cpageref" TeX-arg-ref) - '("Cpageref" TeX-arg-ref))))) - (eval-after-load - "latex" - '(add-to-list 'LaTeX-fill-excluded-macros - '("Sexpr"))) - - (use-package font-latex - :config - (setq font-latex-match-reference-keywords - '( - ("fref" "{") - ("Fref" "{") - ("citep" "{") - ("citet" "{") - ("acs" "{") - ("acsp" "{") - ("ac" "{") - ("acp" "{") - ("acl" "{") - ("aclp" "{") - ("acsu" "{") - ("aclu" "{") - ("acused" "{") - ("DLA" "{") - ("RZ" "{") - ("OM" "{") - ("DL" "{") - ("fixme" "{")) - ) - ) - (setq font-latex-fontify-script nil) - (setq font-latex-fontify-sectioning (quote color)) - (setq font-latex-script-display (quote (nil))) - ) +(use-package tex-site + :straight auctex + :mode ("\\.tex\\'" . LaTeX-mode) + :mode ("\\.bib\\'" . bibtex-mode) + :config + ; (add-to-list 'TeX-style-path '"/home/don/lib/emacs_el/auctex/style") + ;; REFTEX (much enhanced management of cross-ref, labels, etc) + ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/ + ; (autoload 'reftex-mode "reftex" "RefTeX Minor Mode" t) + ; (autoload 'turn-on-reftex "reftex" "RefTeX Minor Mode" nil) + ; (autoload 'reftex-citation "reftex-cite" "Make citation" nil) + ; (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t) + (add-hook 'LaTeX-mode-hook 'turn-on-reftex) ; with AUCTeX LaTeX mode + (add-hook 'latex-mode-hook 'turn-on-reftex) ; with Emacs latex mode + (add-hook 'LaTeX-mode-hook 'outline-minor-mode) ; with AUCTeX LaTeX mode + (add-hook 'latex-mode-hook 'outline-minor-mode) ; with Emacs latex mode + + (setq-default reftex-plug-into-AUCTeX t) + ;; support fake section headers + (setq TeX-outline-extra + '(("%chapter" 1) + ("%section" 2) + ("%subsection" 3) + ("%subsubsection" 4) + ("%paragraph" 5))) + ;; add font locking to the headers + (font-lock-add-keywords + 'latex-mode + '(("^%\\(chapter\\|\\(sub\\|subsub\\)?section\\|paragraph\\)" + 0 'font-lock-keyword-face t) + ("^%chapter{\\(.*\\)}" 1 'font-latex-sectioning-1-face t) + ("^%section{\\(.*\\)}" 1 'font-latex-sectioning-2-face t) + ("^%subsection{\\(.*\\)}" 1 'font-latex-sectioning-3-face t) + ("^%subsubsection{\\(.*\\)}" 1 'font-latex-sectioning-4-face t) + ("^%paragraph{\\(.*\\)}" 1 'font-latex-sectioning-5-face t))) + + ;; use smart quotes by default instead of `` and '' + ;; taken from http://kieranhealy.org/esk/kjhealy.html + (setq TeX-open-quote "“") + (setq TeX-close-quote "”") + + ;; (TeX-add-style-hook + ;; "latex" + ;; (lambda () + ;; (TeX-add-symbols + ;; '("DLA" 1)))) + ;; (custom-set-variables + ;; '(font-latex-user-keyword-classes + ;; '(("fixme" + ;; ("DLA" "RZ") + ;; font-lock-function-name-face 2 (command 1 t)))) + ;; ) + (setq-default TeX-parse-self t) + (setq-default TeX-auto-save t) + (setq-default TeX-master nil) + (add-to-list 'LaTeX-font-list + '(?\C-a "\\alert{","}")) + (eval-after-load + "latex" + '(TeX-add-style-hook + "cleveref" + (lambda () + (if (boundp 'reftex-ref-style-alist) + (add-to-list + 'reftex-ref-style-alist + '("Cleveref" "cleveref" + (("\\cref" ?c) ("\\Cref" ?C) ("\\cpageref" ?d) ("\\Cpageref" ?D))))) + (reftex-ref-style-activate "Cleveref") + (TeX-add-symbols + '("cref" TeX-arg-ref) + '("Cref" TeX-arg-ref) + '("cpageref" TeX-arg-ref) + '("Cpageref" TeX-arg-ref))))) + (eval-after-load + "latex" + '(add-to-list 'LaTeX-fill-excluded-macros + '("Sexpr"))) + + (setq font-latex-match-reference-keywords + '( + ("fref" "{") + ("Fref" "{") + ("citep" "{") + ("citet" "{") + ("acs" "{") + ("acsp" "{") + ("ac" "{") + ("acp" "{") + ("acl" "{") + ("aclp" "{") + ("acsu" "{") + ("aclu" "{") + ("acused" "{") + ("DLA" "{") + ("RZ" "{") + ("OM" "{") + ("DL" "{") + ("fixme" "{")) + ) + (setq font-latex-fontify-script nil) + (setq font-latex-fontify-sectioning (quote color)) + (setq font-latex-script-display (quote (nil))) +) #+END_SRC ** ESS #+BEGIN_SRC emacs-lisp - (use-package ess - :ensure t - :commands R - :mode ("\\.R\\'" . ess-r-mode) - :bind (:map ess-mode-map - ("C-c C-R" . dla/ess-region-remote-eval)) - :init - (autoload 'ess-r-mode "ess-site" nil t) - (autoload 'R "ess-site" nil t) - :config - ; actually load the rest of ess - (require 'ess-site) - (defun ess-change-directory (path) - "Set the current working directory to PATH for both *R* and Emacs." - (interactive "Directory 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") - ) +(use-package ess + :commands R + :mode ("\\.R\\'" . ess-r-mode) + :bind (:map ess-mode-map + ("C-c C-R" . dla/ess-region-remote-eval)) + :init + (autoload 'ess-r-mode "ess-site" nil t) + (autoload 'R "ess-site" nil t) + :config + ; actually load the rest of ess + (require 'ess-site) + (defun ess-change-directory (path) + "Set the current working directory to PATH for both *R* and Emacs." + (interactive "Directory 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***") nil nil nil) + (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]) - ) +(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 + +** YAML Mode +#+BEGIN_SRC emacs-lisp +(use-package yaml-mode + ;; add ess to the x major mode + :mode ("\\.\\(yaml|yml\\)\\'" . yaml-mode) +) #+END_SRC ** Polymode #+BEGIN_SRC emacs-lisp -(use-package poly-R - :ensure t - :after polymode - ) (use-package poly-noweb - :ensure t :after polymode ) (use-package poly-markdown - :ensure t :after polymode ) -(use-package polymode - :ensure t +(use-package poly-R + :after (:all polymode poly-markdown poly-noweb) :mode ("\\.Snw" . poly-noweb+r-mode) :mode ("\\.Rnw" . poly-noweb+r-mode) :mode ("\\.Rmd" . poly-markdown+r-mode) ) +(use-package polymode + ) #+END_SRC ** Outlining -*** Outline magic +*** outline minor mode #+BEGIN_SRC emacs-lisp - (use-package outline-magic) +(use-package outline + :straight nil + :delight + :init + (setq outline-minor-mode-prefix "C-c C-2") +) #+END_SRC -*** Outline mode +*** outshine (outlining) integration #+BEGIN_SRC emacs-lisp -;; change the outline mode prefix from C-c @ to C-c C-2 -(setq outline-minor-mode-prefix "C-c C-2") -;;(add-hook 'outline-minor-mode-hook -;; (lambda () (local-set-key (kbd "C-c C-2") -;; outline-mode-prefix-map))) - +(use-package outshine + :after outline + :hook (outline-minor-mode . outshine-mode) +) #+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)) - ) +(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) - ) +(use-package atomic-chrome + :config + (ignore-errors (atomic-chrome-start-server)) + (setq atomic-chrome-buffer-open-style 'full) + ) +#+END_SRC +** Edit Server +#+BEGIN_SRC emacs-lisp +(use-package edit-server + :commands edit-server-start + :init (if after-init-time + (edit-server-start) + (add-hook 'after-init-hook + #'(lambda() (edit-server-start)))) + :config (setq edit-server-new-frame-alist + '((name . "Edit with Emacs FRAME") + (top . 200) + (left . 200) + (width . 80) + (height . 25) + (minibuffer . t) + (menu-bar-lines . t) + (window-system . x))) + ) #+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)) - ) +(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 - :load-path "/home/don/projects/web-mode/" - :mode ("\\.\\(tx|tmpl\\)\\'" . web-mode) - :config - (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . web-mode)) - (setq web-mode-enable-engine-detection t) - (setq web-mode-engines-alist - '(("template-toolkit" . "\\.tmpl\\'"))) - ) +(use-package web-mode + :mode ("\\.\\(tx|tmpl\\)\\'" . 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 - :commands spamassassin-mode - :ensure f - ) +(use-package spamassassin-mode + :straight nil + :load-path "~/lib/emacs_el" + :commands spamassassin-mode + ) #+END_SRC ** Password Store #+BEGIN_SRC emacs-lisp - (use-package password-store - :ensure f - :commands password-store-edit password-store-generate - ) +(use-package password-store + :commands password-store-edit password-store-generate + :config + (defun dla/password-store-edit (entry) + "Edit password for ENTRY which doesn't require it to already exist" + (interactive (list (password-store--completing-read nil))) + (password-store--run-edit entry)) + (advice-add 'password-store-edit :override #'dla/password-store-edit) + ) #+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)) +(use-package css + :straight css-mode + :mode "\\.css'" + :config + ;; fix up css mode to not be silly + ;; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/ + (setq cssm-indent-level 4) + (setq cssm-newline-before-closing-bracket t) + (setq cssm-indent-function #'cssm-c-style-indenter) + (setq cssm-mirror-mode nil)) #+END_SRC ** Abbrev Mode #+BEGIN_SRC emacs-lisp - (use-package abbrev - :diminish abbrev-mode - :config - ;; load abbreviations from - (setq abbrev-file-name - "~/.emacs_abbrev_def") +(use-package abbrev + :straight nil + :delight abbrev-mode + :config + ;; load abbreviations from + (setq abbrev-file-name + "~/.emacs_abbrev_def") - ;; read the abbrev file if it exists - (if (file-exists-p abbrev-file-name) - (quietly-read-abbrev-file)) + ;; 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)) + ;; for now, use abbrev mode everywhere + :init + (setq default-abbrev-mode t)) #+END_SRC +** Debugging (realgud) +#+BEGIN_SRC emacs-lisp +(use-package realgud + :commands (realgud:pdb realgud:gdb) + ) +#+END_SRC +** Python Programming +#+BEGIN_SRC emacs-lisp +(use-package python-mode + :delight Py 🐍 + :hook + (python-mode . pyenv-mode) + (python-mode . flycheck-mode) + (python-mode . blacken-mode) + (python-mode . yas-minor-mode) + (python-mode . anaconda-mode) + ) +(use-package pyenv-mode + :after python-mode + ) +(use-package blacken + :delight ⚑ + :after python-mode + :config + (setq-default blacken-fast-unsafe t) +) +#+END_SRC +*** Black +#+begin_src emacs-lisp :tangle yes +(use-package python-black + :demand t + :after python) +#+end_src +*** Sphinx Documentation +#+begin_src emacs-lisp :tangle yes +(use-package numpydoc + :after python + :bind (:map python-mode-map + ("C-c C-n" . numpydoc-generate))) +(use-package sphinx-doc + :config + (sphinx-doc-mode t) + (setq sphinx-doc-include-types t) + :after python + :hook (python-mode . sphinx-doc) + ) +(use-package python-docstring + :delight + :after python + :hook (python-mode . python-docstring-mode) + ) +#+end_src ** Go language #+BEGIN_SRC emacs-lisp (use-package go-mode - :diminish "go" + :delight "go" :mode "\\.go" ) #+END_SRC @@ -1370,20 +1416,54 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ) #+END_SRC +** Dockerfile +#+BEGIN_SRC emacs-lisp +(use-package dockerfile-mode + :mode "Dockerfile" + ) +#+END_SRC + +** Beancount +#+BEGIN_SRC emacs-lisp +(use-package beancount + :straight nil + :load-path "~/lib/emacs_el/beancount-mode/" + :mode "\\.beancount\\'" + + ) +#+END_SRC +** Apache +#+BEGIN_SRC emacs-lisp +(use-package apache-mode + :delight 🪶 + :mode "apache\\.conf\\'" + ) +#+END_SRC +** ELDoc +#+BEGIN_SRC emacs-lisp +(use-package eldoc + :delight + :commands eldoc-mode + :straight nil + ) +#+END_SRC + * Email ** Mutt *** Message-mode #+BEGIN_SRC emacs-lisp (use-package message - :ensure f - :diminish (message "✉") + :straight nil + :delight (message "✉") + :delight (message-mode "✉") :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 "✉") + ("C-c C-a" . my/post-attach-file) + ("C-x p" . my/message-kill-buffer) + ) :config (defun my/message-mode-settings () (font-lock-add-keywords nil @@ -1392,7 +1472,10 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ("^[ \t]*>[ \t]*>.*$" (0 'message-double-quoted-text-face)))) ) - + (defun my/message-kill-buffer () + (interactive) + (kill-buffer nil) + ) (defun my/post-attach-file () "Prompt for an attachment." (interactive) @@ -1421,33 +1504,45 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+END_SRC *** Muttrc mode #+BEGIN_SRC emacs-lisp - (use-package muttrc-mode - :mode "muttngrc" - :mode "muttrc" - ) - +(use-package mutt-mode + :mode "muttngrc" + :mode "muttrc" +) +#+END_SRC +*** Set mail User agent +#+BEGIN_SRC emacs-lisp +(setq mail-user-agent (quote sendmail-user-agent)) +#+END_SRC +*** Mail aliases +#+BEGIN_SRC emacs-lisp +; (use-package +; :straight t +; :hook message +; :config +; (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases"))) +; ) #+END_SRC * Base emacs ** Reverting buffers #+BEGIN_SRC emacs-lisp - (use-package autorevert - :diminish auto-revert-mode - :config - (setq global-auto-revert-non-file-buffers t - global-auto-revert-ignore-modes '(pdf-view-mode) - auto-revert-verbose nil) - (global-auto-revert-mode 1)) +(use-package autorevert + :delight auto-revert-mode + :config + (setq global-auto-revert-non-file-buffers t + global-auto-revert-ignore-modes '(pdf-view-mode) + auto-revert-verbose nil) + (global-auto-revert-mode 1)) #+END_SRC * Org Mode ** Use-package and load things #+BEGIN_SRC emacs-lisp - (use-package org - :delight (org-mode "ø") - :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode) - :bind (("C-c l" . org-store-link) - ("C-c a" . org-agenda) - ("C-c b" . org-iswitchb)) +(use-package org + :delight (org-mode "ø") + :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode) + :bind (("C-c l" . org-store-link) + ("C-c a" . org-agenda) + ("C-c b" . org-iswitchb)) #+END_SRC ** Agenda Configuration #+BEGIN_SRC emacs-lisp @@ -1555,24 +1650,19 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ; org mode agenda files (setq org-agenda-files - (quote ("~/projects/org-notes/debbugs.org" - "~/projects/org-notes/notes.org" - "~/projects/org-notes/holidays.org" - "~/projects/org-notes/refile.org" - "~/projects/org-notes/diary.org" - "~/projects/org-notes/ool.org" - "~/projects/org-notes/sndservers.org" - "~/projects/org-notes/chaim.org" - "~/projects/org-notes/wildman.org" - "~/projects/org-notes/uddin.org" - "~/projects/org-notes/reviews.org" - "~/projects/org-notes/laurel.org" - "~/projects/org-notes/from-calendar.org" - "~/org-mode/from-mobile.org" - "~/projects/org-notes/fh.org"))) + (append + (file-expand-wildcards "~/projects/org-notes/*.org") + (file-expand-wildcards "~/org-mode/from-mobile.org") + (file-expand-wildcards "~/org-notes-*/*.org") + ) + ) + (setq my/org-refile-file + (car (seq-filter + (lambda (file) (string-match-p (regexp-quote "/refile.org") file)) + org-agenda-files))) (set-register ?n (cons 'file "~/projects/org-notes/notes.org")) - (set-register ?r (cons 'file "~/projects/org-notes/refile.org")) + (set-register ?r (cons 'file my/org-refile-file)) (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")) @@ -1581,16 +1671,16 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (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) + ; (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) #+END_SRC ** General config @@ -1604,33 +1694,33 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** Capture Templates #+BEGIN_SRC emacs-lisp (setq org-capture-templates ;; mail-specific note template, identified by "m" - `(("m" "Mail" entry (file "~/projects/org-notes/refile.org") + `(("m" "Mail" entry (file my/org-refile-file) "* %?\n\n Source: %u, [[%:link][%:description]]\n %:initial") - ("t" "todo" entry (file "~/projects/org-notes/refile.org") + ("t" "todo" entry (file my/org-refile-file) "* 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") + ("r" "respond" entry (file my/org-refile-file) "* 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") + ("n" "note" entry (file my/org-refile-file) "* %? :NOTE:\n%U\n%a\n" :clock-in t :clock-resume t) - ("s" "schedule" entry (file "~/projects/org-notes/refile.org") + ("s" "schedule" entry (file my/org-refile-file) "* %? :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") + ("w" "org-protocol" entry (file my/org-refile-file) "* TODO Review %c\n%U\n" :immediate-finish t) - ("M" "Meeting" entry (file "~/projects/org-notes/refile.org") + ("M" "Meeting" entry (file my/org-refile-file) "* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t) - ("S" "Seminar" entry (file "~/projects/org-notes/refile.org") + ("S" "Seminar" entry (file my/org-refile-file) "* 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") + ("p" "Phone call" entry (file my/org-refile-file) "* PHONE %? :PHONE:\n%U" :clock-in t :clock-resume t) ("J" "job" entry (file+olp "~/projects/org-notes/notes.org" "Jobs" ,(format-time-string "Positions %Y")) "* TODO Apply for %? :job:\nSCHEDULED: <%<%Y-%m-%d>>\n%U\n%x\n" :clock-in t :clock-resume t) - ("h" "Habit" entry (file "~/projects/org-notes/refile.org") + ("h" "Habit" entry (file my/org-refile-file) "* 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") ) ) @@ -1696,52 +1786,57 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+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/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)) - (defun dla/org-update-ids-to-headlines-in-file () - "Add or replace ID properties to all headlines in the current file - (or narrowed region)." - (interactive) - (org-map-entries '(lambda () (org-id-get-create t)))) - ; if we wanted to do this to every buffer, do the following: - ; (add-hook 'org-mode-hook - ; (lambda () - ; (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local))) +(defun bh/hide-other () + (interactive) + (save-excursion + (org-back-to-heading 'invisible-ok) + (outline-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/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) + (save-excursion + (widen) + (goto-char (point-min)) + (when (not (re-search-forward "^#\\+OPTIONS:.*auto-id:f" (point-max) t)) + (org-map-entries 'org-id-get-create)))) +(defun dla/org-update-ids-to-headlines-in-file () + "Add or replace ID properties to all headlines in the current file +(or narrowed region)." + (interactive) + + (org-map-entries '(lambda () (org-id-get-create t)))) +; if we wanted to do this to every buffer, do the following: +(add-hook 'org-mode-hook + (lambda () + (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local))) #+END_SRC ** Org ID locations #+BEGIN_SRC emacs-lisp (use-package find-lisp - :ensure t) + :demand t) (setq org-agenda-text-search-extra-files (append '(agenda-archives) (find-lisp-find-files "~/projects/org-notes" "\.org$") @@ -1750,191 +1845,191 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+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) - (unless (org-in-item-p) - (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) +(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) + (unless (org-in-item-p) + (org-id-get-create) ) - (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) +;; 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 @@ -1988,390 +2083,394 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+END_SRC ** LaTeX configuration - :PROPERTIES: - :ID: 7135ba17-6a50-4eed-84ca-b90afa5b12f8 - :END: #+BEGIN_SRC emacs-lisp +(use-package org-contrib + :no-require t + :after org + :config + (require 'ox-extra) + (ox-extras-activate '(latex-header-blocks ignore-headlines)) (require 'ox-latex) - (add-to-list 'org-latex-classes - '("memarticle" - "\\documentclass[11pt,oneside,article]{memoir}\n" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) - - (setq org-beamer-outline-frame-options "") - (add-to-list 'org-latex-classes - '("beamer" - "\\documentclass[ignorenonframetext]{beamer} - [NO-DEFAULT-PACKAGES] - [PACKAGES] - [EXTRA]" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) - - (add-to-list 'org-latex-classes - '("membook" - "\\documentclass[11pt,oneside]{memoir}\n" - ("\\chapter{%s}" . "\\chapter*{%s}") - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))) - - (add-to-list 'org-latex-classes - '("letter" - "\\documentclass[11pt]{letter} - [NO-DEFAULT-PACKAGES] - [PACKAGES] - [EXTRA]" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) - - (add-to-list 'org-latex-classes - '("dlacv" - "\\documentclass{dlacv} - [NO-DEFAULT-PACKAGES] - [NO-PACKAGES] - [NO-EXTRA]" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) - - - (add-to-list 'org-latex-classes - '("dlaresume" - "\\documentclass{dlaresume} - [NO-DEFAULT-PACKAGES] - [NO-PACKAGES] - [NO-EXTRA]" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) - - - ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432 - ;; but adapted to use latexmk 4.22 or higher. - (setq org-latex-pdf-process '("latexmk -f -pdflatex=xelatex -bibtex -use-make -pdf %f")) - - ;; Default packages included in /every/ tex file, latex, pdflatex or xelatex - (setq org-latex-default-packages-alist - '(("" "amsmath" t) - ("" "unicode-math" t) - )) - (setq org-latex-packages-alist - '(("" "graphicx" t) - ("" "fontspec" t) - ("" "xunicode" t) - ("" "hyperref" t) - ("" "url" t) - ("" "rotating" t) - ("" "longtable" nil) - ("" "float" ))) - - ;; make equations larger - (setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0)) - - (defun org-create-formula--latex-header () - "Return LaTeX header appropriate for previewing a LaTeX snippet." - (let ((info (org-combine-plists (org-export--get-global-options - (org-export-get-backend 'latex)) - (org-export--get-inbuffer-options - (org-export-get-backend 'latex))))) - (org-latex-guess-babel-language - (org-latex-guess-inputenc - (org-splice-latex-header - org-format-latex-header - org-latex-default-packages-alist - nil t - (plist-get info :latex-header))) - info))) - - - ; support ignoring headers in org mode export to latex - ; from http://article.gmane.org/gmane.emacs.orgmode/67692 - (defadvice org-latex-headline (around my-latex-skip-headlines - (headline contents info) activate) - (if (member "ignoreheading" (org-element-property :tags headline)) - (setq ad-return-value contents) - ad-do-it)) - - ;; keep latex logfiles - - (setq org-latex-remove-logfiles nil) - - ;; Resume clocking task when emacs is restarted - (org-clock-persistence-insinuate) - ;; - ;; Show lot of clocking history so it's easy to pick items off the C-F11 list - (setq org-clock-history-length 23) - ;; Resume clocking task on clock-in if the clock is open - (setq org-clock-in-resume t) - ;; Change tasks to NEXT when clocking in; this avoids clocking in when - ;; there are things like PHONE calls - (setq org-clock-in-switch-to-state 'bh/clock-in-to-next) - ;; Separate drawers for clocking and logs - (setq org-drawers (quote ("PROPERTIES" "LOGBOOK"))) - ;; Save clock data and state changes and notes in the LOGBOOK drawer - (setq org-clock-into-drawer t) - (setq org-log-into-drawer t) - ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration - (setq org-clock-out-remove-zero-time-clocks t) - ;; Clock out when moving task to a done state - (setq org-clock-out-when-done t) - ;; Save the running clock and all clock history when exiting Emacs, load it on startup - (setq org-clock-persist t) - ;; Do not prompt to resume an active clock - (setq org-clock-persist-query-resume nil) - ;; Enable auto clock resolution for finding open clocks - (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running)) - ;; Include current clocking task in clock reports - (setq org-clock-report-include-clocking-task t) - - ;; the cache seems to be broken - (setq org-element-use-cache nil) - - (defvar bh/keep-clock-running nil) - - (defun bh/is-task-p () - "Any task with a todo keyword and no subtask" - (save-restriction - (widen) - (let ((has-subtask) - (subtree-end (save-excursion (org-end-of-subtree t))) - (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1))) - (save-excursion - (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) +(add-to-list 'org-latex-classes + '("memarticle" + "\\documentclass[11pt,oneside,article]{memoir}\n" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + +(setq org-beamer-outline-frame-options "") +(add-to-list 'org-latex-classes + '("beamer" + "\\documentclass[ignorenonframetext]{beamer} +[NO-DEFAULT-PACKAGES] +[PACKAGES] +[EXTRA]" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + +(add-to-list 'org-latex-classes + '("membook" + "\\documentclass[11pt,oneside]{memoir}\n" + ("\\chapter{%s}" . "\\chapter*{%s}") + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))) + +(add-to-list 'org-latex-classes + '("letter" + "\\documentclass[11pt]{letter} +[NO-DEFAULT-PACKAGES] +[PACKAGES] +[EXTRA]" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + +(add-to-list 'org-latex-classes + '("dlacv" + "\\documentclass{dlacv} +[NO-DEFAULT-PACKAGES] +[NO-PACKAGES] +[NO-EXTRA]" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + + +(add-to-list 'org-latex-classes + '("dlaresume" + "\\documentclass{dlaresume} +[NO-DEFAULT-PACKAGES] +[NO-PACKAGES] +[NO-EXTRA]" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + + +;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432 +;; but adapted to use latexmk 4.22 or higher. +(setq org-latex-pdf-process '("latexmk -f -pdflatex=xelatex -bibtex -use-make -pdf %f")) + +;; Default packages included in /every/ tex file, latex, pdflatex or xelatex +(setq org-latex-default-packages-alist + '(("" "amsmath" t) + ("" "unicode-math" t) + )) +(setq org-latex-packages-alist + '(("" "graphicx" t) + ("" "fontspec" t) + ("" "xunicode" t) + ("" "hyperref" t) + ("" "url" t) + ("" "rotating" t) + ("" "longtable" nil) + ("" "float" ))) + +;; make equations larger +(setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0)) + +(defun org-create-formula--latex-header () + "Return LaTeX header appropriate for previewing a LaTeX snippet." + (let ((info (org-combine-plists (org-export--get-global-options + (org-export-get-backend 'latex)) + (org-export--get-inbuffer-options + (org-export-get-backend 'latex))))) + (org-latex-guess-babel-language + (org-latex-guess-inputenc + (org-splice-latex-header + org-format-latex-header + org-latex-default-packages-alist + nil t + (plist-get info :latex-header))) + info))) + + +; support ignoring headers in org mode export to latex +; from http://article.gmane.org/gmane.emacs.orgmode/67692 +(defadvice org-latex-headline (around my-latex-skip-headlines + (headline contents info) activate) + (if (member "ignoreheading" (org-element-property :tags headline)) + (setq ad-return-value contents) + ad-do-it)) + +;; keep latex logfiles + +(setq org-latex-remove-logfiles nil) +) + +;; Resume clocking task when emacs is restarted +(org-clock-persistence-insinuate) +;; +;; Show lot of clocking history so it's easy to pick items off the C-F11 list +(setq org-clock-history-length 23) +;; Resume clocking task on clock-in if the clock is open +(setq org-clock-in-resume t) +;; Change tasks to NEXT when clocking in; this avoids clocking in when +;; there are things like PHONE calls +(setq org-clock-in-switch-to-state 'bh/clock-in-to-next) +;; Separate drawers for clocking and logs +(setq org-drawers (quote ("PROPERTIES" "LOGBOOK"))) +;; Save clock data and state changes and notes in the LOGBOOK drawer +(setq org-clock-into-drawer t) +(setq org-log-into-drawer t) +;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration +(setq org-clock-out-remove-zero-time-clocks t) +;; Clock out when moving task to a done state +(setq org-clock-out-when-done t) +;; Save the running clock and all clock history when exiting Emacs, load it on startup +(setq org-clock-persist t) +;; Do not prompt to resume an active clock +(setq org-clock-persist-query-resume nil) +;; Enable auto clock resolution for finding open clocks +(setq org-clock-auto-clock-resolution (quote when-no-clock-is-running)) +;; Include current clocking task in clock reports +(setq org-clock-report-include-clocking-task t) + +;; the cache seems to be broken +(setq org-element-use-cache nil) + +(defvar bh/keep-clock-running nil) + +(defun bh/is-task-p () + "Any task with a todo keyword and no subtask" + (save-restriction + (widen) + (let ((has-subtask) + (subtree-end (save-excursion (org-end-of-subtree t))) (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1))) (save-excursion - (while (and (not is-subproject) (org-up-heading-safe)) - (when (member (nth 2 (org-heading-components)) org-todo-keywords-1) - (setq is-subproject t)))) - (and is-a-task is-subproject))) - - - (defun bh/clock-in-to-next (kw) - "Switch a task from TODO to NEXT when clocking in. - Skips capture tasks, projects, and subprojects. - Switch projects and subprojects from NEXT back to TODO" - (when (not (and (boundp 'org-capture-mode) org-capture-mode)) - (cond - ((and (member (org-get-todo-state) (list "TODO")) - (bh/is-task-p)) - "NEXT") - ((and (member (org-get-todo-state) (list "NEXT")) - (bh/is-project-p)) - "TODO")))) - - (defun bh/punch-in (arg) - "Start continuous clocking and set the default task to the - selected task. If no task is selected set the Organization task - as the default task." - (interactive "p") - (setq bh/keep-clock-running t) - (if (equal major-mode 'org-agenda-mode) - ;; - ;; We're in the agenda - ;; - (let* ((marker (org-get-at-bol 'org-hd-marker)) - (tags (org-with-point-at marker (org-get-tags-at)))) - (if (and (eq arg 4) tags) - (org-agenda-clock-in '(16)) - (bh/clock-in-organization-task-as-default))) - ;; - ;; We are not in the agenda - ;; - (save-restriction + (forward-line 1) + (while (and (not has-subtask) + (< (point) subtree-end) + (re-search-forward "^\*+ " subtree-end t)) + (when (member (org-get-todo-state) org-todo-keywords-1) + (setq has-subtask t)))) + (and is-a-task (not has-subtask))))) +(defun bh/is-project-p () + "Any task with a todo keyword subtask" + (save-restriction (widen) - ; Find the tags on the current task - (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4)) - (org-clock-in '(16)) - (bh/clock-in-organization-task-as-default))))) - - (defun bh/punch-out () - (interactive) - (setq bh/keep-clock-running nil) - (when (org-clock-is-active) - (org-clock-out)) - (org-agenda-remove-restriction-lock)) - - (defun bh/clock-in-default-task () + (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 - (org-with-point-at org-clock-default-task - (org-clock-in)))) + (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-parent-task () - "Move point to the parent (project) task if any and clock in" - (let ((parent-task)) - (save-excursion + +(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)))) + (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) - (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))))))) + (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)) - (defvar bh/organization-task-id "e22cb8bf-07c7-408b-8f60-ff3aadac95e4") +(defun my/fix-inline-images () + (when org-inline-image-overlays + (org-redisplay-inline-images))) - (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")))))))))))) +(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 @@ -2392,45 +2491,45 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+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 +(use-package appt + :straight nil + :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 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)))) - ) ) + ;; 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 @@ -2439,19 +2538,25 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ) #+END_SRC * Keybindings +** Home/End Begining/End of line +#+BEGIN_SRC emacs-lisp + (global-set-key [home] 'move-beginning-of-line) + (global-set-key [end] 'move-end-of-line) +#+END_SRC ** Goto line #+BEGIN_SRC emacs-lisp - (global-unset-key "\M-g") - (global-set-key (kbd "M-g l") 'goto-line) + ; (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-mode - :mode "debian/changelog" - :config - (setq debian-changelog-mailing-address "don@debian.org") - (setq debian-changelog-full-name "Don Armstrong")) +(use-package debian-changelog-mode + :mode "debian/changelog" + :ensure debian-el + :config + (setq debian-changelog-mailing-address "don@debian.org") + (setq debian-changelog-full-name "Don Armstrong")) #+END_SRC * Misc (uncharacterized) #+BEGIN_SRC emacs-lisp @@ -2459,14 +2564,14 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (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) + +#+END_SRC +** Turn on fontlock +#+BEGIN_SRC emacs-lisp (global-font-lock-mode 1) - (icomplete-mode 1) - (setq log-edit-keep-buffer t) - (setq mail-user-agent (quote sendmail-user-agent)) - (setq markdown-enable-math t) - (setq markdown-follow-wiki-link-on-enter nil) - (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases"))) +#+END_SRC +** PS Printing +#+BEGIN_SRC emacs-lisp (setq ps-footer-font-size (quote (8 . 10))) (setq ps-header-font-size (quote (8 . 10))) (setq ps-header-title-font-size (quote (10 . 10))) @@ -2474,238 +2579,226 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (setq ps-print-footer t) (setq ps-print-footer-frame nil) (setq ps-print-only-one-header t) +#+END_SRC +** Only single spacing on sentences +#+BEGIN_SRC emacs-lisp (setq sentence-end "[.?!][]\"')]*\\($\\| \\| \\)[ ]*") (setq sentence-end-double-space nil) ; enable matching parenthesis +#+END_SRC +** Display paren mode +#+BEGIN_SRC emacs-lisp (show-paren-mode 1) - (tool-bar-mode -1) - (setq user-mail-address "don@donarmstrong.com") - (setq vc-delete-logbuf-window nil) - (setq vc-follow-symlinks t) - - ;; use git before SVN; use CVS earlier, because I have CVS - ;; repositories inside of git directories - (setq vc-handled-backends (quote (CVS Git RCS SVN SCCS Bzr Hg Mtn Arch))) - - ;; switch back to the old primary selection method - (setq x-select-enable-clipboard nil) - (setq x-select-enable-primary t) - ; (setq mouse-drag-copy-region t) - - (fset 'perl-mode 'cperl-mode) - ;;(load-file "cperl-mode.el") - - ;; tramp configuration - (setq tramp-use-ssh-controlmaster-options nil) + (setq show-paren-delay 0.2) - (setq-default c-indent-level 4) - (setq-default c-brace-imaginary-offset 0) - (setq-default c-brace-offset -4) - (setq-default c-argdecl-indent 4) - (setq-default c-label-offset -4) - (setq-default c-continued-statement-offset 4) - ; tabs are annoying - (setq-default indent-tabs-mode nil) - (setq-default tab-width 4) - - - ;; (autoload 'php-mode "php-mode" "PHP editing mode" t) - ;; (add-to-list 'auto-mode-alist '("\\.php3?\\'" . php-mode)) - ;; (add-to-list 'auto-mode-alist '("\\.phtml?\\'" . php-mode)) - ;; (add-to-list 'auto-mode-alist '("\\.php?\\'" . php-mode)) - ;; (add-to-list 'auto-mode-alist '("\\.php4?\\'" . php-mode)) +#+END_SRC +** My Username +#+BEGIN_SRC emacs-lisp + (setq user-mail-address "don@donarmstrong.com") +#+END_SRC +** Use primary selection on unix machines +#+BEGIN_SRC emacs-lisp +;; switch back to the old primary selection method +(if (or (string-equal system-type "darwin") + (string-equal system-type "windows") + ) + (progn + (setq select-enable-clipboard t) + (setq select-enable-primary nil) + ) + (progn + (setq select-enable-clipboard nil) + (setq select-enable-primary t) + )) +; (setq mouse-drag-copy-region t) + +(setq-default c-indent-level 4) +(setq-default c-brace-imaginary-offset 0) +(setq-default c-brace-offset -4) +(setq-default c-argdecl-indent 4) +(setq-default c-label-offset -4) +(setq-default c-continued-statement-offset 4) +; tabs are annoying +(setq-default indent-tabs-mode nil) +(setq-default tab-width 4) + +(defun insert-date () + "Insert date at point." + (interactive) + (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z"))) +(global-set-key "\C-[d" 'insert-date) + +(defun unfill-paragraph (arg) + "Pull this whole paragraph up onto one line." + (interactive "*p") + (let ((fill-column 10000)) + (fill-paragraph arg)) + ) - (defun insert-date () - "Insert date at point." - (interactive) - (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z"))) - (global-set-key "\C-[d" 'insert-date) - - (defun unfill-paragraph (arg) - "Pull this whole paragraph up onto one line." - (interactive "*p") - (let ((fill-column 10000)) - (fill-paragraph arg)) - ) +(column-number-mode t) - (column-number-mode t) - #+END_SRC ** Desktop-save-mode If the envvar EMACS_SERVER_NAME is set, consider this a separate emacs, and use a different desktop file to restore history #+BEGIN_SRC emacs-lisp - (use-package desktop - :demand - :config - (setq desktop-base-file-name - (convert-standard-filename - (concat ".emacs" - (or (getenv "EMACS_SERVER_NAME") - "") - ".desktop") - )) - (setq desktop-base-lock-name - (convert-standard-filename - (concat desktop-base-file-name - ".lock"))) - (setq desktop-auto-save-timeout 60) - (setq desktop-restore-eager 5) - (setq desktop-lazy-verbose nil) - (desktop-save-mode 1) - ; (desktop-read) - ) +(use-package desktop + :demand + :config + (setq desktop-base-file-name + (convert-standard-filename + (concat ".emacs" + (or (getenv "EMACS_SERVER_NAME") + "") + ".desktop") + )) + (setq desktop-base-lock-name + (convert-standard-filename + (concat desktop-base-file-name + ".lock"))) + (setq desktop-auto-save-timeout 60) + (setq desktop-restore-eager 5) + (setq desktop-lazy-verbose nil) + (desktop-save-mode 1) + ; (desktop-read) +) #+END_SRC ** Misc (Uncharacterized) #+BEGIN_SRC emacs-lisp - '(icomplete-mode on) - (custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(menu ((((type x-toolkit)) (:background "black" :foreground "grey90"))))) - - - (put 'upcase-region 'disabled nil) - (put 'downcase-region 'disabled nil) - (put 'narrow-to-region 'disabled nil) - - ; (defun turn-on-flyspell () - ; "Force flyspell-mode on using a positive arg. For use in hooks." - ; (interactive) - ; (flyspell-mode 1)) - - - ; Outline-minor-mode key map - (define-prefix-command 'cm-map nil "Outline-") - ; HIDE - (define-key cm-map "q" '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" '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 - (define-key cm-map "p" 'outline-previous-visible-heading) ; Previous - (define-key cm-map "f" 'outline-forward-same-level) ; Forward - same level - (define-key cm-map "b" 'outline-backward-same-level) ; Backward - same level - (global-set-key "\M-o" cm-map) - ; fix up tmux xterm keys - ; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux - (defun fix-up-tmux-keys () - "Fix up tmux xterm keys" - (if (getenv "TMUX") - (progn - (let ((x 2) (tkey "")) - (while (<= x 8) - ;; shift - (if (= x 2) - (setq tkey "S-")) - ;; alt - (if (= x 3) - (setq tkey "M-")) - ;; alt + shift - (if (= x 4) - (setq tkey "M-S-")) - ;; ctrl - (if (= x 5) - (setq tkey "C-")) - ;; ctrl + shift - (if (= x 6) - (setq tkey "C-S-")) - ;; ctrl + alt - (if (= x 7) - (setq tkey "C-M-")) - ;; ctrl + alt + shift - (if (= x 8) - (setq tkey "C-M-S-")) - - ;; arrows - (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s" tkey))) - (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s" tkey))) - (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s" tkey))) - (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s" tkey))) - ;; home - (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s" tkey))) - ;; end - (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s" tkey))) - ;; page up - (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; page down - (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; insert - (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; delete - (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f1 - (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s" tkey))) - ;; f2 - (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s" tkey))) - ;; f3 - (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s" tkey))) - ;; f4 - (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s" tkey))) - ;; f5 - (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f6 - (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f7 - (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f8 - (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f9 - (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f10 - (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f11 - (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f12 - (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f13 - (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f14 - (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f15 - (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f16 - (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f17 - (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f18 - (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f19 - (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f20 - (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s" tkey))) - - (setq x (+ x 1)) - )) - ) - ) + +(put 'upcase-region 'disabled nil) +(put 'downcase-region 'disabled nil) +(put 'narrow-to-region 'disabled nil) + +; Outline-minor-mode key map +(define-prefix-command 'cm-map nil "Outline-") +; HIDE +(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" '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 +(define-key cm-map "p" 'outline-previous-visible-heading) ; Previous +(define-key cm-map "f" 'outline-forward-same-level) ; Forward - same level +(define-key cm-map "b" 'outline-backward-same-level) ; Backward - same level +(global-set-key "\M-o" cm-map) +; fix up tmux xterm keys +; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux +(defun fix-up-tmux-keys () + "Fix up tmux xterm keys" + (if (getenv "TMUX") + (progn + (let ((x 2) (tkey "")) + (while (<= x 8) + ;; shift + (if (= x 2) + (setq tkey "S-")) + ;; alt + (if (= x 3) + (setq tkey "M-")) + ;; alt + shift + (if (= x 4) + (setq tkey "M-S-")) + ;; ctrl + (if (= x 5) + (setq tkey "C-")) + ;; ctrl + shift + (if (= x 6) + (setq tkey "C-S-")) + ;; ctrl + alt + (if (= x 7) + (setq tkey "C-M-")) + ;; ctrl + alt + shift + (if (= x 8) + (setq tkey "C-M-S-")) + + ;; arrows + (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s" tkey))) + ;; home + (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s" tkey))) + ;; end + (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s" tkey))) + ;; page up + (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; page down + (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; insert + (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; delete + (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f1 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s" tkey))) + ;; f2 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s" tkey))) + ;; f3 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s" tkey))) + ;; f4 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s" tkey))) + ;; f5 + (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f6 + (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f7 + (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f8 + (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f9 + (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f10 + (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f11 + (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f12 + (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f13 + (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f14 + (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f15 + (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f16 + (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f17 + (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f18 + (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f19 + (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f20 + (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s" tkey))) + + (setq x (+ x 1)) + )) + ) ) - ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys) - - (defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary) - "Call ask-user-about-supersession-threat only if the buffer is actually obsolete." - (if (or (buffer-modified-p) - (verify-visited-file-modtime) - (< (* 8 1024 1024) (buffer-size)) - (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-"))) - ad-do-it - (clear-visited-file-modtime) - (not-modified))) - (ad-activate 'ask-user-about-supersession-threat) + ) +; (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." + (if (or (buffer-modified-p) + (verify-visited-file-modtime) + (< (* 8 1024 1024) (buffer-size)) + (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-"))) + ad-do-it + (clear-visited-file-modtime) + (not-modified))) +(ad-activate 'ask-user-about-supersession-threat) #+END_SRC * Start Server @@ -2716,13 +2809,11 @@ emacs, and use a different desktop file to restore history (or (getenv "EMACS_SERVER_NAME") "server")) (unless (server-running-p) - (global-set-key "\C-xp" 'server-edit) + ; (global-set-key "\C-xp" 'server-edit) (server-start))) #+END_SRC - - * END #+BEGIN_SRC emacs-lisp - (provide 'don-configuration) +(provide 'don-configuration) #+END_SRC