X-Git-Url: https://git.donarmstrong.com/?p=lib.git;a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=51b159eb8f56c267657332e4908099d5e75b400a;hp=f3468a8c2ae9cd0c42f70d3108c188a644f0b4ae;hb=91f57771c6e0bb956f94e7dce100c4f76f658892;hpb=179b12b7bb2e2c8d964cb13b209760b64f275b33 diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index f3468a8..51b159e 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -7,33 +7,86 @@ #+BEGIN_SRC emacs-lisp (setq debug-on-event 'siguser2) #+END_SRC -* Add library paths - +* Initial startup stuff +** Disable startup screen #+BEGIN_SRC emacs-lisp - (add-to-list 'load-path '"~/lib/emacs_el/") - (add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/tiny") - (add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/other") - (add-to-list 'load-path '"~/lib/emacs_el/magit-annex") + (setq inhibit-startup-screen t) #+END_SRC - -* Package management -** package repositories and package manager +** Disable cluter +#+BEGIN_SRC emacs-lisp + ; (if (fboundp 'menu-bar-mode) (menu-bar-mode -1)) + (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) + (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) +#+END_SRC +** Fullscreen #+BEGIN_SRC emacs-lisp - (require 'package) - (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "http://orgmode.org/elpa/") )) + (setq frame-resize-pixelwise t) + (add-to-list 'default-frame-alist '(fullscreen . maximixed)) #+END_SRC -** [[https://github.com/jwiegley/use-package/][use-package]] +* 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 - (package-initialize) - (require 'use-package) + (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 'bind-key) + (require 'diminish) #+END_SRC ** Paradox #+BEGIN_SRC emacs-lisp (use-package paradox :ensure paradox - ) + :commands (paradox-upgrade-packages paradox-list-packages) + :config (setq paradox-execute-asynchronously t) + ) +#+END_SRC +* Add library paths + +#+BEGIN_SRC emacs-lisp + (add-to-list 'load-path '"~/lib/emacs_el/") + (add-to-list 'load-path '"~/lib/emacs_el/magit-annex") #+END_SRC * Disable custom-vars #+BEGIN_SRC emacs-lisp @@ -54,13 +107,14 @@ * Variables ** Safe Local Variables #+BEGIN_SRC emacs-lisp - (setq safe-local-variable-values - (quote ((auto-save-default) - (make-backup-files) - (cperl-indent-level . 4) - (indent-level . 4) - (indent-tabs-mode . f) - ))) +(setq safe-local-variable-values + (quote ((auto-save-default) + (make-backup-files) + (cperl-indent-level . 4) + (indent-level . 4) + (indent-tabs-mode . f) + (vcl-indent-level . 4) + ))) #+END_SRC * Memory #+BEGIN_SRC emacs-lisp @@ -78,13 +132,26 @@ (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook) #+END_SRC * Modules +** Spacemacs theme +#+BEGIN_SRC emacs-lisp +(use-package spacemacs-common + :ensure spacemacs-theme + :config + (load-theme 'spacemacs-dark t) + ) +#+END_SRC +** Hippie Expand +#+BEGIN_SRC emacs-lisp + (use-package hippie-exp + :bind* (("M-" . hippie-expand)) + ) +#+END_SRC ** Flyspell 🐝 #+BEGIN_SRC emacs-lisp (use-package flyspell :ensure t :diminish flyspell-mode 🐝 :config - (add-hook 'message-mode-hook 'turn-on-flyspell) (add-hook 'text-mode-hook 'turn-on-flyspell) (add-hook 'c-mode-common-hook 'flyspell-prog-mode) (add-hook 'cperl-mode-hook 'flyspell-prog-mode) @@ -94,6 +161,12 @@ ) #+END_SRC +** Flymake +#+begin_src emacs-lisp :tangle yes + (use-package flymake + :diminish "Φ") +#+end_src + ** Winnermode #+BEGIN_SRC emacs-lisp (winner-mode 1) @@ -101,48 +174,48 @@ ** Eyebrowse #+BEGIN_SRC emacs-lisp - ;; (use-package eyebrowse - ;; :ensure t - ;; :diminish eyebrowse-mode - ;; :init (setq eyebrowse-keymap-prefix (kbd "C-c C-\\")) - ;; :config (progn - ;; (setq eyebrowse-wrap-around t) - ;; (eyebrowse-mode t) - ;; - ;; (defun my/eyebrowse-new-window-config () - ;; (interactive) - ;; (let ((done nil)) - ;; (dotimes (i 10) - ;; ;; start at 1 run till 0 - ;; (let ((j (mod (+ i 1) 10))) - ;; (when (and (not done) - ;; (not (eyebrowse--window-config-present-p j))) - ;; (eyebrowse-switch-to-window-config j) - ;; (call-interactively 'eyebrowse-rename-window-config2 j) - ;; (setq done t) - ;; )) - ;; ))) - ;; - ;; ;; I don't use latex-preview-pane - ;; ;; (require 'latex-preview-pane) - ;; ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch () - ;; ;; ;; latex-preview-pane uses window-parameters which are - ;; ;; ;; not preserved by eyebrowse, so we close the preview - ;; ;; ;; pane before switching, it will be regenerated when we - ;; ;; ;; edit the TeX file. - ;; ;; (when (lpp/window-containing-preview) - ;; ;; (delete-window (lpp/window-containing-preview)))) - ;; - ;; ;; (add-to-list 'eyebrowse-pre-window-switch-hook - ;; ;; #'my/close-latex-preview-pane-before-eyebrowse-switch) - ;; - ;; ;; (my/set-menu-key "[" #'my/eyebrowse-new-window-config) - ;; ;; (my/set-menu-key ";" #'eyebrowse-prev-window-config) - ;; ;; (my/set-menu-key "'" #'eyebrowse-next-window-config) - ;; ;; (my/set-menu-key "]" #'eyebrowse-close-window-config) - ;; ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config) - ;; ) - ;; ) + (use-package eyebrowse + :ensure t + :diminish eyebrowse-mode + :init (setq eyebrowse-keymap-prefix (kbd "C-c e")) + :config (progn + (setq eyebrowse-wrap-around t) + (eyebrowse-mode t) + + (defun my/eyebrowse-new-window-config () + (interactive) + (let ((done nil)) + (dotimes (i 10) + ;; start at 1 run till 0 + (let ((j (mod (+ i 1) 10))) + (when (and (not done) + (not (eyebrowse--window-config-present-p j))) + (eyebrowse-switch-to-window-config j) + (call-interactively 'eyebrowse-rename-window-config2 j) + (setq done t) + )) + ))) + + ;; I don't use latex-preview-pane + ;; (require 'latex-preview-pane) + ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch () + ;; ;; latex-preview-pane uses window-parameters which are + ;; ;; not preserved by eyebrowse, so we close the preview + ;; ;; pane before switching, it will be regenerated when we + ;; ;; edit the TeX file. + ;; (when (lpp/window-containing-preview) + ;; (delete-window (lpp/window-containing-preview)))) + + ;; (add-to-list 'eyebrowse-pre-window-switch-hook + ;; #'my/close-latex-preview-pane-before-eyebrowse-switch) + + ;; (my/set-menu-key "[" #'my/eyebrowse-new-window-config) + ;; (my/set-menu-key ";" #'eyebrowse-prev-window-config) + ;; (my/set-menu-key "'" #'eyebrowse-next-window-config) + ;; (my/set-menu-key "]" #'eyebrowse-close-window-config) + ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config) + ) + ) #+END_SRC ** Window handling @@ -245,6 +318,7 @@ value, scrolling continues until there is no more output. *** Avy #+BEGIN_SRC emacs-lisp (use-package avy + :if (>= emacs-major-version 25) :ensure t :bind (("C-c C-" . avy-goto-word-or-subword-1) ("C-c j j" . avy-goto-word-or-subword-1) @@ -292,27 +366,243 @@ value, scrolling continues until there is no more output. "~/lib/emacs_el/yasnippet-snippets/snippets/")) (add-to-list 'hippie-expand-try-functions-list 'yas-hippie-try-expand) + (yas-reload-all) ) ) #+END_SRC *** Auto-YASnippet #+BEGIN_SRC emacs-lisp (use-package auto-yasnippet + :ensure t :bind (("H-w" . aya-create) ("H-y" . aya-expand) ) ) #+END_SRC +** Company +#+BEGIN_SRC emacs-lisp +(use-package company + :ensure t + :bind (("M-/" . company-complete)) + :config + (setq company-echo-delay 0 ; remove blinking + company-show-numbers t ; show numbers for easy selection + company-selection-wrap-around t + company-require-match nil + company-dabbrev-ignore-case t + company-dabbrev-ignore-invisible t + company-dabbrev-other-buffers t + company-dabbrev-downcase nil + company-dabbrev-code-everywhere t + company-tooltip-align-annotations t + company-minimum-prefix-length 1 + company-global-modes '(not) + company-lighter-base "(C)") + (global-company-mode 1) + :bind (:map company-active-map + ("C-n" . company-select-next) + ("C-p" . company-select-previous) + ("M-?" . company-show-doc-buffer) + ("M-." . company-show-location) + ) + ) +#+END_SRC +*** C/C++ +#+BEGIN_SRC emacs-lisp + (use-package company-c-headers + :ensure t + :config (progn + (defun malb/ede-object-system-include-path () + "Return the system include path for the current buffer." + (when ede-object + (ede-system-include-path ede-object))) + + (setq company-c-headers-path-system + #'malb/ede-object-system-include-path) + + (add-to-list 'company-backends #'company-c-headers))) +#+END_SRC +*** Python +#+BEGIN_SRC emacs-lisp +(use-package company-anaconda + :ensure t + :config (add-to-list 'company-backends #'company-anaconda)) +#+END_SRC +*** Perl +#+BEGIN_SRC emacs-lisp + (use-package company-plsense + :ensure t + ) +#+END_SRC +*** LaTeX +#+BEGIN_SRC emacs-lisp + (use-package company-math + :ensure t) +#+END_SRC +#+BEGIN_SRC emacs-lisp + (use-package company-auctex + :ensure t + :config (progn + (defun company-auctex-labels (command &optional arg &rest ignored) + "company-auctex-labels backend" + (interactive (list 'interactive)) + (case command + (interactive (company-begin-backend 'company-auctex-labels)) + (prefix (company-auctex-prefix "\\\\.*ref{\\([^}]*\\)\\=")) + (candidates (company-auctex-label-candidates arg)))) + + (add-to-list 'company-backends + '(company-auctex-macros + company-auctex-environments + company-math-symbols-unicode + company-math-symbols-latex)) + + (add-to-list 'company-backends #'company-auctex-labels) + (add-to-list 'company-backends #'company-auctex-bibs) + ) + ) +#+END_SRC +#+BEGIN_SRC emacs-lisp + (use-package company-bibtex + :ensure t + ) +#+END_SRC +*** Shell + + #+BEGIN_SRC emacs-lisp + (use-package company-shell + :ensure t + :config (progn + (setq company-shell-modes '(sh-mode shell-mode)) + (add-to-list 'company-backends 'company-shell))) + #+END_SRC + +*** YaSnippet + + Add YasSippet support for all company backends. ([[https://github.com/syl20bnr/spacemacs/pull/179][source]]) + + *Note:* Do this at the end of =company-mode= config. + + #+BEGIN_SRC emacs-lisp + (defvar malb/company-mode/enable-yas t + "Enable yasnippet for all backends.") + + (defun malb/company-mode/backend-with-yas (backend) + (if (or (not malb/company-mode/enable-yas) + (and (listp backend) + (member 'company-yasnippet backend))) + backend + (append (if (consp backend) backend (list backend)) + '(:with company-yasnippet)))) + + (setq company-backends + (mapcar #'malb/company-mode/backend-with-yas company-backends)) + #+END_SRC + +*** All the words + + Enable/disable company completion from ispell dictionaries ([[https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-company.el][source]]) + + #+BEGIN_SRC emacs-lisp + (defun malb/toggle-company-ispell () + (interactive) + (cond + ((member '(company-ispell :with company-yasnippet) company-backends) + (setq company-backends (delete '(company-ispell :with company-yasnippet) company-backends)) + (add-to-list 'company-backends '(company-dabbrev :with company-yasnippet) t) + (message "company-ispell disabled")) + (t + (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends)) + (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t) + (message "company-ispell enabled!")))) + + (defun malb/company-ispell-setup () + ;; @see https://github.com/company-mode/company-mode/issues/50 + (when (boundp 'company-backends) + (make-local-variable 'company-backends) + (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends)) + (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t) + ;; https://github.com/redguardtoo/emacs.d/issues/473 + (if (and (boundp 'ispell-alternate-dictionary) + ispell-alternate-dictionary) + (setq company-ispell-dictionary ispell-alternate-dictionary)))) + #+END_SRC + +*** Tab DWIM + + 1. =yas-expand= is run first and does what it has to, then it calls =malb/indent-fold-or-complete=. + + 2. This function then hopefully does what I want: + + a. if a region is active, just indent + b. if we’re looking at a space after a non-whitespace character, we try some company-expansion + c. If =hs-minor-mode= or =outline-minor-mode= is active, try those next + d. otherwise call whatever would have been called otherwise. + + ([[http://emacs.stackexchange.com/q/21182/8930][source]], [[http://emacs.stackexchange.com/q/7908/8930][source]]) + +#+BEGIN_SRC emacs-lisp + (defun malb/indent-fold-or-complete (&optional arg) + (interactive "P") + (cond + ;; if a region is active, indent + ((use-region-p) + (indent-region (region-beginning) + (region-end))) + ;; if the next char is space or eol, but prev char not whitespace + ((and (not (active-minibuffer-window)) + (or (looking-at " ") + (looking-at "$")) + (looking-back "[^[:space:]]") + (not (looking-back "^"))) + + (cond (company-mode (company-complete-common)) + (auto-complete-mode (auto-complete)))) + + ;; no whitespace anywhere + ((and (not (active-minibuffer-window)) + (looking-at "[^[:space:]]") + (looking-back "[^[:space:]]") + (not (looking-back "^"))) + (cond + ((bound-and-true-p hs-minor-mode) + (save-excursion (end-of-line) (hs-toggle-hiding))) + ((bound-and-true-p outline-minor-mode) + (save-excursion (outline-cycle))))) + + ;; by default just call whatever was bound + (t + (let ((fn (or (lookup-key (current-local-map) (kbd "TAB")) + 'indent-for-tab-command))) + (if (not (called-interactively-p 'any)) + (fn arg) + (setq this-command fn) + (call-interactively fn)))))) + + (defun malb/toggle-fold () + (interactive) + (cond ((eq major-mode 'org-mode) + (org-force-cycle-archived)) + ((bound-and-true-p hs-minor-mode) + (save-excursion + (end-of-line) + (hs-toggle-hiding))) + + ((bound-and-true-p outline-minor-mode) + (save-excursion + (outline-cycle))))) + + (bind-key "" #'malb/indent-fold-or-complete) + (bind-key "C-" #'malb/toggle-fold) +#+END_SRC ** Tinyprocmail #+BEGIN_SRC emacs-lisp ;; load tinyprocmail (use-package tinyprocmail - :ensure f - :config (with-library 'tinyprocmail - ;; (setq tinyprocmail--procmail-version "v3.22") - (add-hook 'tinyprocmail--load-hook 'tinyprocmail-install)) - ) + :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny" + :mode (".procmailrc" . turn-on-tinyprocmail-mode) + ) #+END_SRC ** Magit @@ -322,25 +612,17 @@ value, scrolling continues until there is no more output. :bind (("C-x g" . magit-status) ("C-x C-g" . magit-status)) :config - ;; don't verify where we are pushing - (setq magit-push-always-verify nil) ;; refine diffs always (hilight words) (setq magit-diff-refine-hunk nil) - ;; load magit-annex - (setq load-path - (append '("~/lib/emacs_el/magit-annex") - load-path)) - ;; load magit-vcsh - (setq load-path - (append '("~/lib/emacs_el/magit-vcsh") - load-path)) ) (use-package magit-annex :ensure t - ) + :load-path "~/lib/emacs_el/magit-annex/" + ) (use-package magit-vcsh :ensure f ; currently not in melpa, so don't try to install - ) + :load-path "~/lib/emacs_el/magit-vcsh/" + ) #+END_SRC ** Perl @@ -371,17 +653,114 @@ value, scrolling continues until there is no more output. )) #+END_SRC +** Markdown mode +#+BEGIN_SRC emacs-lisp + (use-package markdown-mode + :ensure t + :mode (("\\.md\\'" . markdown-mode) + ("\\.mdwn\\'" . markdown-mode) + ("README\\.md\\'" . gfm-mode) + ) + :config + (setq markdown-enable-math t) + (setq markdown-follow-wiki-link-on-enter nil) + (bind-key "M-." #'markdown-jump markdown-mode-map) + (add-hook 'markdown-mode-hook #'flyspell-mode) + (add-hook 'markdown-mode-hook #'outline-minor-mode) + (bind-key "C-" #'outline-cycle markdown-mode-map) + ) + +#+END_SRC +** SQL mode +#+BEGIN_SRC emacs-lisp + ; load sql-indent when sql is loaded +(use-package sql + :mode (("\\.sql\\'" . sql-mode)) + :config + (require sql-indent)) +#+END_SRC +** Ediff +#+BEGIN_SRC emacs-lisp + (use-package ediff + :commands ediff ediff3 + :ensure f + :config + ;; ediff configuration + ;; don't use the multi-window configuration + (setq ediff-window-setup-function 'ediff-setup-windows-plain) + ) +#+END_SRC +** Do the Right Thing Indenting +Attempts to automatically identify the right indentation for a file +#+BEGIN_SRC emacs-lisp +(use-package dtrt-indent + :ensure t +) +#+END_SRC +** VCL --editing varnish configuration files +#+BEGIN_SRC emacs-lisp + (use-package vcl-mode + :ensure t + :mode "\\.vcl\\'" + ) + +#+END_SRC ** Helm #+BEGIN_SRC emacs-lisp + (defun malb/helm-omni (&rest arg) + ;; 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 t + :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) - (global-set-key (kbd "M-x") 'helm-M-x) (unless (boundp 'completion-in-region-function) (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point) (define-key emacs-lisp-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)) @@ -416,48 +795,50 @@ value, scrolling continues until there is no more output. ;;; stolen from https://github.com/malb/emacs.d/blob/master/malb.org (defun malb/helm-swoop-pre-fill () (thing-at-point 'symbol)) - (setq malb/helm-swoop-ignore-major-mode '(dired-mode - paradox-menu-mode doc-view-mode pdf-view-mode - mu4e-headers-mode org-mode markdown-mode latex-mode - ein:notebook-multilang-mode)) + (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))) + (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)) + ) - (use-package helm-swoop - :ensure t - :bind (("C-c o" . helm-multi-swoop-org) - ("C-s" . malb/swoop-or-search) - ("C-M-s" . helm-multi-swoop-all)) - :config (progn - - (setq helm-swoop-pre-input-function #'malb/helm-swoop-pre-fill - helm-swoop-split-with-multiple-windows nil - helm-swoop-split-direction #'split-window-horizontally - helm-swoop-split-window-function 'helm-default-display-buffer - helm-swoop-speed-or-color t) - - ;; https://emacs.stackexchange.com/questions/28790/helm-swoop-how-to-make-it-behave-more-like-isearch - (defun malb/helm-swoop-C-s () - (interactive) - (if (boundp 'helm-swoop-pattern) - (if (equal helm-swoop-pattern "") - (previous-history-element 1) - (helm-next-line)) - (helm-next-line))) - - (bind-key "C-S-s" #'helm-swoop-from-isearch isearch-mode-map) - (bind-key "C-S-s" #'helm-multi-swoop-all-from-helm-swoop helm-swoop-map) - (bind-key "C-r" #'helm-previous-line helm-swoop-map) - (bind-key "C-s" #'malb/helm-swoop-C-s helm-swoop-map) - (bind-key "C-r" #'helm-previous-line helm-multi-swoop-map) - (bind-key "C-s" #'malb/helm-swoop-C-s helm-multi-swoop-map)) - ) - #+END_SRC *** Helm Ag #+BEGIN_SRC emacs-lisp @@ -500,22 +881,162 @@ value, scrolling continues until there is no more output. ((equal arg 16) (helm-org-rifle-occur-agenda-files)) (t (helm-org-agenda-files-headings))))))) #+END_SRC +*** Helm Google +This can be used to link things pretty quickly if necessary +#+BEGIN_SRC emacs-lisp + (use-package helm-google + :ensure t + :bind ("C-c h g" . helm-google) + :config + (progn (add-to-list 'helm-google-actions + '("Copy URL" . (lambda (candidate) + (let ((url + (replace-regexp-in-string + "https://.*q=\\(.*\\)\&sa=.*" + "\\1" candidate))) + (kill-new url)))) + t + ) + + (add-to-list 'helm-google-actions + '("Org Store Link" . (lambda (candidate) + (let ((title (car (split-string candidate "[\n]+"))) + (url + (replace-regexp-in-string + "https://.*q=\\(.*\\)\&sa=.*" + "\\1" candidate))) + (push (list url title) org-stored-links)))) + t) + )) +#+END_SRC +** Projectile -- Project management +#+begin_src emacs-lisp + (use-package projectile + :ensure t + :bind (("" . projectile-compile-project) + ("" . next-error)) + :config (progn + (use-package magit :ensure t) + (require 'helm-projectile) + (helm-projectile-on) + + (setq projectile-make-test-cmd "make check" + projectile-switch-project-action 'helm-projectile + projectile-mode-line '(:eval (format "»{%s}" (projectile-project-name)))) + + (projectile-global-mode))) +#+end_src + +*** helm integration +#+begin_src emacs-lisp + (use-package helm-projectile + :ensure t + :config (progn + (defvar malb/helm-source-file-not-found + (helm-build-dummy-source + "Create file" + :action 'find-file)) + + (add-to-list + 'helm-projectile-sources-list + malb/helm-source-file-not-found t) + + (helm-delete-action-from-source + "Grep in projects `C-s'" + helm-source-projectile-projects) + + (helm-add-action-to-source + "Grep in projects `C-s'" + 'helm-do-ag helm-source-projectile-projects 4))) +#+end_src +** Zap to char +#+BEGIN_SRC emacs-lisp + (use-package avy-zap + :ensure t + :bind ("M-z" . avy-zap-up-to-char-dwim)) +#+END_SRC ** Hydra -#+BEGIN_SRC emacs-lisp :tangle don-configuration.el -(require 'don-hydra) +#+BEGIN_SRC emacs-lisp + (use-package hydra + :bind (("C-c 2" . my/hydra-orgmodes/body) + ("C-c @" . my/hydra-orgmodes/body) + ("C-c #" . my/hydra-outline/body) + ("C-c 3" . my/hydra-outline/body) + ) + :config + (defhydra my/hydra-orgmodes (:color blue :hint nil) + " + _n_: notes _c_: chaim _w_: wildman _o_: ool + _u_: uddin _s_: steve _r_: refile _f_: fh + _p_: read papers _R_: paper notes + _h_: hpcbio + _q_: quit + _z_: quit + " + ("n" (find-file "~/projects/org-notes/notes.org")) + ("c" (find-file "~/projects/org-notes/chaim.org")) + ("w" (find-file "~/projects/org-notes/wildman.org")) + ("u" (find-file "~/projects/org-notes/uddin.org")) + ("o" (find-file "~/projects/org-notes/ool.org")) + ("f" (find-file "~/projects/org-notes/fh.org")) + ("s" (find-file "~/projects/org-notes/sndservers.org")) + ("r" (find-file "~/projects/org-notes/refile.org")) + ("p" (find-file "~/projects/research/papers_to_read.org")) + ("R" (find-file "~/projects/research/paper_notes.org")) + ("h" (find-file "~/projects/org-notes/hpcbio.org")) + ("q" nil "quit") + ("z" nil "quit") + ) + + ;; from https://github.com/abo-abo/hydra/wiki/Emacs + (defhydra my/hydra-outline (:color pink :hint nil) + " + ^Hide^ ^Show^ ^Move + ^^^^^^------------------------------------------------------ + _q_: sublevels _a_: all _u_: up + _t_: body _e_: entry _n_: next visible + _o_: other _i_: children _p_: previous visible + _c_: entry _k_: branches _f_: forward same level + _l_: leaves _s_: subtree _b_: backward same level + _d_: subtree + + " + ;; Hide + ("q" outline-hide-sublevels) ; Hide everything but the top-level headings + ("t" outline-hide-body) ; Hide everything but headings (all body lines) + ("o" outline-hide-other) ; Hide other branches + ("c" outline-hide-entry) ; Hide this entry's body + ("l" outline-hide-leaves) ; Hide body lines in this entry and sub-entries + ("d" outline-hide-subtree) ; Hide everything in this entry and sub-entries + ;; Show + ("a" outline-show-all) ; Show (expand) everything + ("e" outline-show-entry) ; Show this heading's body + ("i" outline-show-children) ; Show this heading's immediate child sub-headings + ("k" outline-show-branches) ; Show all sub-headings under this heading + ("s" outline-show-subtree) ; Show (expand) everything in this heading & below + ;; Move + ("u" outline-up-heading) ; Up + ("n" outline-next-visible-heading) ; Next + ("p" outline-previous-visible-heading) ; Previous + ("f" outline-forward-same-level) ; Forward - same level + ("b" outline-backward-same-level) ; Backward - same level + ("z" nil "leave")) + ) #+END_SRC ** Tramp #+BEGIN_SRC emacs-lisp - (add-to-list 'tramp-methods '("vcsh" - (tramp-login-program "vcsh") - (tramp-login-args - (("enter") - ("%h"))) - (tramp-remote-shell "/bin/sh") - (tramp-remote-shell-args - ("-c")))) + (use-package tramp + :config + (add-to-list 'tramp-methods '("vcsh" + (tramp-login-program "vcsh") + (tramp-login-args + (("enter") + ("%h"))) + (tramp-remote-shell "/bin/sh") + (tramp-remote-shell-args + ("-c"))))) #+END_SRC ** Reftex #+BEGIN_SRC emacs-lisp @@ -525,6 +1046,17 @@ value, scrolling continues until there is no more output. (setq-default reftex-default-bibliography '("~/projects/research/references.bib"))) #+END_SRC +** BibTex +#+BEGIN_SRC emacs-lisp + (use-package bibtex + :config (setq bibtex-user-optional-fields + (quote (("annote" "Personal annotation (ignored)") + ("abstract" "") + ("pmid" "") + ("doi" "")))) + ) + +#+END_SRC ** LaTeX #+BEGIN_SRC emacs-lisp (use-package tex @@ -626,32 +1158,29 @@ value, scrolling continues until there is no more output. ("fixme" "{")) ) ) + (setq font-latex-fontify-script nil) + (setq font-latex-fontify-sectioning (quote color)) + (setq font-latex-script-display (quote (nil))) ) #+END_SRC -*** Org-Gcal -#+BEGIN_SRC emacs-lisp - (use-package calfw - :ensure f - ) - (use-package calfw-org - :ensure f - ) - (use-package org-gcal - :ensure f - :config '((if (file-readable-p "~/.hide/org_gcal.el") - (load-file "~/.hide/org_gcal.el")) - ) - ) -#+END_SRC ** ESS #+BEGIN_SRC emacs-lisp (use-package ess :ensure t + :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 "DDirectory to change to: ") + (interactive "Directory to change to: ") (when (file-exists-p path) (ess-command (concat "setwd(\"" path "\")\n")) @@ -670,11 +1199,11 @@ value, scrolling continues until there is no more output. ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3) (t 1000))) )) - (add-hook 'ess-mode-hook - '(lambda () - (local-set-key (kbd "C-c C-R") - 'dla/ess-region-remote-eval))) - + (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") ) @@ -693,21 +1222,41 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** Polymode #+BEGIN_SRC emacs-lisp - (use-package polymode - :config - (use-package poly-R) - (use-package poly-noweb) - (use-package poly-markdown) - :mode ("\\.Snw" . poly-noweb+r-mode) - :mode ("\\.Rnw" . poly-noweb+r-mode) - :mode ("\\.Rmd" . poly-markdown+r-mode) - ) +(use-package poly-noweb + :ensure t + :after polymode + + ) +(use-package poly-markdown + :ensure t + :after polymode + ) +(use-package poly-R + :ensure t + :after (:all polymode poly-markdown poly-noweb) + ; :mode ("\\.Snw" . poly-noweb+r-mode) + ; :mode ("\\.Rnw" . poly-noweb+r-mode) + ; :mode ("\\.Rmd" . poly-markdown+r-mode) + ) +(use-package polymode + :ensure t + ) + #+END_SRC ** Outlining *** Outline magic #+BEGIN_SRC emacs-lisp (use-package outline-magic) +#+END_SRC +*** Outline mode +#+BEGIN_SRC emacs-lisp +;; change the outline mode prefix from C-c @ to C-c C-2 +(setq outline-minor-mode-prefix "C-c C-2") +;;(add-hook 'outline-minor-mode-hook +;; (lambda () (local-set-key (kbd "C-c C-2") +;; outline-mode-prefix-map))) + #+END_SRC ** Writeroom Mode #+BEGIN_SRC emacs-lisp @@ -745,15 +1294,17 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori [[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)) + :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) @@ -761,24 +1312,174 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori '(("template-toolkit" . "\\.tmpl\\'"))) ) #+END_SRC +** Spamassassin Mode +#+BEGIN_SRC emacs-lisp + (use-package spamassassin-mode + :commands spamassassin-mode + :ensure f + ) +#+END_SRC +** Password Store +#+BEGIN_SRC emacs-lisp + (use-package password-store + :ensure f + :commands password-store-edit password-store-generate + ) +#+END_SRC +** CSS mode +#+BEGIN_SRC emacs-lisp + (use-package css + :mode "\\.css'" + :config + ;; fix up css mode to not be silly + ;; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/ + (setq cssm-indent-level 4) + (setq cssm-newline-before-closing-bracket t) + (setq cssm-indent-function #'cssm-c-style-indenter) + (setq cssm-mirror-mode nil)) +#+END_SRC +** Abbrev Mode +#+BEGIN_SRC emacs-lisp + (use-package abbrev + :diminish abbrev-mode + :config + ;; load abbreviations from + (setq abbrev-file-name + "~/.emacs_abbrev_def") + + ;; read the abbrev file if it exists + (if (file-exists-p abbrev-file-name) + (quietly-read-abbrev-file)) + + ;; for now, use abbrev mode everywhere + (setq default-abbrev-mode t)) +#+END_SRC + +** Go language +#+BEGIN_SRC emacs-lisp +(use-package go-mode + :diminish "go" + :mode "\\.go" + ) +#+END_SRC + +** Expand region +#+BEGIN_SRC emacs-lisp +(use-package expand-region + :bind (("C-=" . 'er/expand-region)) + ) +#+END_SRC + +** Dockerfile +#+BEGIN_SRC emacs-lisp +(use-package dockerfile-mode + :mode "Dockerfile" + ) +#+END_SRC + +* Email +** Mutt +*** Message-mode +#+BEGIN_SRC emacs-lisp +(use-package message + :ensure f + :diminish (message "✉") + :mode ("muttng-[a-z0-9]+-[0-9]+-" . message-mode) + :mode ("mutt-[a-z0-9]+-[0-9]+-" . message-mode) + :hook 'my/message-mode-settings + :hook 'turn-on-flyspell + :bind (:map message-mode-map + ("C-c C-a" . my/post-attach-file)) + :delight (message-mode "✉") + :config + (defun my/message-mode-settings () + (font-lock-add-keywords nil + '(("^[ \t]*>[ \t]*>[ \t]*>.*$" + (0 'message-multiply-quoted-text-face)) + ("^[ \t]*>[ \t]*>.*$" + (0 'message-double-quoted-text-face)))) + ) + + (defun my/post-attach-file () + "Prompt for an attachment." + (interactive) + (let ((file (read-file-name "Attach file: " nil nil t nil))) + (my/header-attach-file file ""))) + + (defun my/header-attach-file (file description) + "Attach a FILE to the current message (works with Mutt). + Argument DESCRIPTION MIME description." + (interactive "fAttach file: \nsDescription: ") + (when (> (length file) 0) + (save-excursion + (save-match-data + (save-restriction + (widen) + (goto-char (point-min)) + (search-forward-regexp "^$") + (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " " + description "\n")) + (message (concat "Attached '" file "'.")) + (setq post-has-attachment t)))))) + + (setq mail-yank-prefix "> ") + (setq mail-header-separator "") ; fix broken header detection +) +#+END_SRC +*** Muttrc mode +#+BEGIN_SRC emacs-lisp + (use-package muttrc-mode + :mode "muttngrc" + :mode "muttrc" + ) + +#+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)) +#+END_SRC * Org Mode ** Use-package and load things #+BEGIN_SRC emacs-lisp (use-package org - :config - + :delight (org-mode "ø") + :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode) + :bind (("C-c l" . org-store-link) + ("C-c a" . org-agenda) + ("C-c b" . org-iswitchb)) #+END_SRC ** Agenda Configuration #+BEGIN_SRC emacs-lisp - ;; The following lines are always needed. Choose your own keys. - (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode)) - (global-set-key "\C-cl" 'org-store-link) - (global-set-key "\C-ca" 'org-agenda) - (global-set-key "\C-cb" 'org-iswitchb) + :config (setq-default org-log-done 'time) (setq-default org-agenda-ndays 5) + (setq org-agenda-sticky t) + (defun dla/show-org-agenda () + (interactive) + (let (agendabuffer + '(delq nil + (mapcar (lambda (x) + (and (string-match-p + "\*Org Agenda.*\*" + (buffer-name x)) + x) + ) + (buffer-list)))) + (if agendabuffer + (switch-to-buffer + (buffer-name agendabuffer)) + (org-agenda-list))) + (delete-other-windows)) + ;; agenda configuration ;; Do not dim blocked tasks (setq org-agenda-dim-blocked-tasks nil) @@ -872,7 +1573,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori "~/projects/org-notes/wildman.org" "~/projects/org-notes/uddin.org" "~/projects/org-notes/reviews.org" - "~/projects/org-notes/hpcbio.org" + "~/projects/org-notes/laurel.org" + "~/projects/org-notes/from-calendar.org" "~/org-mode/from-mobile.org" "~/projects/org-notes/fh.org"))) @@ -891,17 +1593,11 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (with-temp-buffer (dolist (org-agenda-file org-agenda-files) (insert-file-contents org-agenda-file nil) - (end-of-buffer) + (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) - ;; add automatic reminders for appointments - (defadvice org-agenda-redo (after org-agenda-redo-add-appts) - "Pressing `r' on the agenda will also add appointments." - (progn - (setq appt-time-msg-list nil) - (org-agenda-to-appt))) #+END_SRC ** General config @@ -915,7 +1611,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** Capture Templates #+BEGIN_SRC emacs-lisp (setq org-capture-templates ;; mail-specific note template, identified by "m" - '(("m" "Mail" entry (file "~/projects/org-notes/refile.org") + `(("m" "Mail" entry (file "~/projects/org-notes/refile.org") "* %?\n\n Source: %u, [[%:link][%:description]]\n %:initial") ("t" "todo" entry (file "~/projects/org-notes/refile.org") "* TODO %?\n :PROPERTIES:\n :END:\n :LOGBOOK:\n :END:\n%U\n%a\n" :clock-in t :clock-resume t) @@ -937,8 +1633,10 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori "* TODO Get/Read %? \n%U" :clock-in t :clock-resume t) ("p" "Phone call" entry (file "~/projects/org-notes/refile.org") "* PHONE %? :PHONE:\n%U" :clock-in t :clock-resume t) - ("J" "job" entry (file "~/projects/org-notes/refile.org") - "* TODO Apply for %a%? :job:\nSCHEDULED: %(format-time-string \"<%Y-%m-%d 17:00-17:30>\")\n%U\n%a\n" :clock-in t :clock-resume t) + ("J" "job" entry (file+olp "~/projects/org-notes/notes.org" + "Jobs" + ,(format-time-string "Positions %Y")) + "* TODO Apply for %? :job:\nSCHEDULED: <%<%Y-%m-%d>>\n%U\n%x\n" :clock-in t :clock-resume t) ("h" "Habit" entry (file "~/projects/org-notes/refile.org") "* NEXT %?\n%U\n%a\nSCHEDULED: %(format-time-string \"<%Y-%m-%d .+1d/3d>\")\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\n%a\n") ) @@ -965,50 +1663,43 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+END_SRC ** Org mode key bindings #+BEGIN_SRC emacs-lisp - ; org mode configuration from http://doc.norang.ca/org-mode.html + ;; org mode configuration from http://doc.norang.ca/org-mode.html ;; Custom Key Bindings - (global-set-key (kbd "") 'org-agenda) - (global-set-key (kbd "") 'bh/org-todo) - (global-set-key (kbd "") 'bh/widen) - (global-set-key (kbd "") 'bh/set-truncate-lines) - (global-set-key (kbd "") 'org-cycle-agenda-files) - (global-set-key (kbd " ") 'bh/show-org-agenda) - (global-set-key (kbd " b") 'bbdb) - (global-set-key (kbd " c") 'calendar) - (global-set-key (kbd " f") 'boxquote-insert-file) - (global-set-key (kbd " h") 'bh/hide-other) - (global-set-key (kbd " n") 'bh/toggle-next-task-display) - (global-set-key (kbd " w") 'widen) - - ; change the outline mode prefix from C-c @ to C-c C-2 - (setq outline-minor-mode-prefix "C-c C-2") - ;(add-hook 'outline-minor-mode-hook - ; (lambda () (local-set-key (kbd "C-c C-2") - ; outline-mode-prefix-map))) - - (global-set-key (kbd " I") 'bh/punch-in) - (global-set-key (kbd " O") 'bh/punch-out) - - (global-set-key (kbd " o") 'bh/make-org-scratch) - - (global-set-key (kbd " r") 'boxquote-region) - (global-set-key (kbd " s") 'bh/switch-to-scratch) - - (global-set-key (kbd " t") 'bh/insert-inactive-timestamp) - (global-set-key (kbd " T") 'bh/toggle-insert-inactive-timestamp) - - (global-set-key (kbd " v") 'visible-mode) - (global-set-key (kbd " l") 'org-toggle-link-display) - (global-set-key (kbd " SPC") 'bh/clock-in-last-task) - (global-set-key (kbd "C-") 'previous-buffer) - (global-set-key (kbd "M-") 'org-toggle-inline-images) - (global-set-key (kbd "C-x n r") 'narrow-to-region) - (global-set-key (kbd "C-") 'next-buffer) - (global-set-key (kbd "") 'org-clock-goto) - (global-set-key (kbd "C-") 'org-clock-in) - (global-set-key (kbd "C-s-") 'bh/save-then-publish) - (global-set-key (kbd "C-c c") 'org-capture) - + :bind* ((" a" . org-agenda) + (" I" . bh/punch-in) + (" O" . bh/punch-out) + (" SPC" . bh/clock-in-last-task) + ("" . dla/show-org-agenda) + ;; ("" . bh/org-todo) + ("" . bh/widen) + ("" . bh/set-truncate-lines) + ("" . org-cycle-agenda-files) + (" " . dla/show-org-agenda) + (" b" . bbdb) + (" c" . calendar) + (" f" . boxquote-insert-file) + (" h" . bh/hide-other) + (" n" . bh/toggle-next-task-display) + (" w" . widen) + + (" r" . boxquote-region) + (" s" . bh/switch-to-scratch) + + (" t" . bh/insert-inactive-timestamp) + (" T" . bh/toggle-insert-inactive-timestamp) + + (" v" . visible-mode) + (" l" . org-toggle-link-display) + (" SPC" . bh/clock-in-last-task) + ("C-" . previous-buffer) + ("M-" . org-toggle-inline-images) + ("C-x n r" . narrow-to-region) + ("C-" . next-buffer) + ("" . org-clock-goto) + ("C-" . org-clock-in) + ("C-s-" . bh/save-then-publish) + ("C-c c" . org-capture)) + :config #+END_SRC ** Utility Functions #+BEGIN_SRC emacs-lisp @@ -1030,11 +1721,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (set-window-start (selected-window) (window-start (selected-window))))) - (defun bh/make-org-scratch () - (interactive) - (find-file "/tmp/publish/scratch.org") - (gnus-make-directory "/tmp/publish")) - (defun bh/switch-to-scratch () (interactive) (switch-to-buffer "*scratch*")) @@ -1049,11 +1735,26 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori do not already have one." (interactive) (org-map-entries 'org-id-get-create)) + (defun dla/org-update-ids-to-headlines-in-file () + "Add or replace ID properties to all headlines in the current file + (or narrowed region)." + (interactive) + (org-map-entries '(lambda () (org-id-get-create t)))) ; if we wanted to do this to every buffer, do the following: ; (add-hook 'org-mode-hook ; (lambda () ; (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local))) #+END_SRC +** Org ID locations +#+BEGIN_SRC emacs-lisp +(use-package find-lisp + :ensure t) +(setq org-agenda-text-search-extra-files + (append '(agenda-archives) + (find-lisp-find-files "~/projects/org-notes" "\.org$") + (find-lisp-find-files "~/projects/org-notes" "\.org_archive$") + )) +#+END_SRC ** Keywords (TODO) #+BEGIN_SRC emacs-lisp (setq org-todo-keywords @@ -1154,7 +1855,9 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (setq my-org-protocol-flag t)) (defadvice org-insert-todo-heading (after dla/create-id activate) - (org-id-get-create) + (unless (org-in-item-p) + (org-id-get-create) + ) ) ;; org modules @@ -1262,29 +1965,33 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+END_SRC ** General Org Babel Configuration #+BEGIN_SRC emacs-lisp - ;; org babel support - (org-babel-do-load-languages - 'org-babel-load-languages - '((emacs-lisp . t ) - (R . t) - (latex . t) - (ditaa . t) - (dot . t) - )) - ;; use graphviz-dot for dot things - (add-to-list 'org-src-lang-modes '("dot" . graphviz-dot)) - ;; org-babel-by-backend - (defmacro org-babel-by-backend (&rest body) - `(case (if (boundp 'backend) - (org-export-backend-name backend) - nil) ,@body)) - - (defun my/fix-inline-images () - (when org-inline-image-overlays - (org-redisplay-inline-images))) - - (add-hook 'org-babel-after-execute-hook - 'my/fix-inline-images) +;; org babel support +(org-babel-do-load-languages + 'org-babel-load-languages + '((emacs-lisp . t ) + (R . t) + (latex . t) + (ditaa . t) + (dot . t) + )) +;; set the right path to ditaa.jar +(setq org-ditaa-jar-path "/usr/share/ditaa/ditaa.jar") +;; use graphviz-dot for dot things +(add-to-list 'org-src-lang-modes '("dot" . graphviz-dot)) +;; do not indent begin_src blocks +(setq org-edit-src-content-indentation 0) +;; org-babel-by-backend +(defmacro org-babel-by-backend (&rest body) + `(case (if (boundp 'backend) + (org-export-backend-name backend) + nil) ,@body)) + +(defun my/fix-inline-images () + (when org-inline-image-overlays + (org-redisplay-inline-images))) + +(add-hook 'org-babel-after-execute-hook + 'my/fix-inline-images) #+END_SRC ** LaTeX configuration @@ -1674,62 +2381,92 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (unless (bolp) (insert "\n")))))))))))) #+END_SRC -** End use-package +** Org-Gcal #+BEGIN_SRC emacs-lisp +(use-package calfw + :ensure f + ) +(use-package calfw-org + :ensure f + ) +(use-package org-gcal + :if (file-readable-p "~/.hide/org_gcal.el") + :ensure f + :config '((if (file-readable-p "~/.hide/org_gcal.el") + (load-file "~/.hide/org_gcal.el")) + ) ) #+END_SRC -* Keybindings -** Override other things +** appt integration #+BEGIN_SRC emacs-lisp - ; apparently things like to step on C-;, so we'll use a hack from - ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this - - (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.") - - ; use mc everywhere - (define-key my-keys-minor-mode-map (kbd "C-;") 'mc/mark-all-dwim) - ;; use outline mode keybindings everywhere - ;; (define-key my-keys-minor-mode-map (kbd "C-;") 'my/mydra-outline/body) - - (define-minor-mode my-keys-minor-mode - "A minor mode so that my key settings override annoying major modes." - t " my-keys" 'my-keys-minor-mode-map) + (use-package appt + :ensure f + :config + ;; Show notification 10 minutes before event + (setq appt-message-warning-time 10) + ;; Disable multiple reminders + (setq appt-display-interval appt-message-warning-time) + (setq appt-display-mode-line nil) + + ;; add automatic reminders for appointments + (defun my/org-agenda-to-appt () + (interactive) + (setq appt-time-msg-list nil) + (org-agenda-to-appt)) + ;; add reminders when starting emacs + (my/org-agenda-to-appt) + ;; when rebuilding the agenda + (defadvice org-agenda-redo (after org-agenda-redo-add-appts) + "Pressing `r' on the agenda will also add appointments." + (my/org-agenda-to-appt) + ) + ;; when saving all org buffers + (defadvice org-save-all-org-buffers (after org-save-all-org-buffers-add-appts) + "Re-add appts after saving all org buffers" + (my/org-agenda-to-appt)) + ;; Display appointments as a window manager notification + (setq appt-disp-window-function 'my/appt-display) + (setq appt-delete-window-function (lambda () t)) + + (setq my/appt-notification-app (concat (getenv "HOME") "/bin/appt_notification")) + + (defun my/appt-display (min-to-app new-time msg) + (if (atom min-to-app) + (start-process "my/appt-notification-app" nil my/appt-notification-app min-to-app msg) + (dolist (i (number-sequence 0 (1- (length min-to-app)))) + (start-process "my/appt-notification-app" nil my/appt-notification-app + (nth i min-to-app) (nth i msg)))) + ) + ) - (my-keys-minor-mode 1) - (defun my-minibuffer-setup-hook () - (my-keys-minor-mode 0)) - (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook) - (defadvice load (after give-my-keybindings-priority) - "Try to ensure that my keybindings always have priority." - (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode)) - (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist))) - (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist) - (add-to-list 'minor-mode-map-alist mykeys)))) - (ad-activate 'load) #+END_SRC +** End use-package +#+BEGIN_SRC emacs-lisp + ) +#+END_SRC +* Keybindings ** Goto line #+BEGIN_SRC emacs-lisp (global-unset-key "\M-g") (global-set-key (kbd "M-g l") 'goto-line) #+END_SRC +* Debian +** debian-changelog +#+BEGIN_SRC emacs-lisp + (use-package debian-changelog-mode + :mode "debian/changelog" + :config + (setq debian-changelog-mailing-address "don@debian.org") + (setq debian-changelog-full-name "Don Armstrong")) +#+END_SRC * Misc (uncharacterized) #+BEGIN_SRC emacs-lisp - (setq bibtex-user-optional-fields (quote (("annote" "Personal annotation (ignored)") ("abstract" "") ("pmid" "") ("doi" "")))) - (setq calendar-latitude 40.11) - (setq calendar-longitude -88.24) + (setq calendar-latitude 38.6) + (setq calendar-longitude -121.5) (setq case-fold-search t) (setq confirm-kill-emacs (quote y-or-n-p)) (setq cperl-lazy-help-time nil) - (setq debian-changelog-mailing-address "don@debian.org") - (display-time) - (setq display-time-24hr-format t) - (setq display-time-day-and-date t) - (display-time-mode 1) - (setq font-latex-fontify-script nil) - (setq font-latex-fontify-sectioning (quote color)) - (setq font-latex-script-display (quote (nil))) - (global-auto-revert-mode 1) (global-font-lock-mode 1) (icomplete-mode 1) (setq log-edit-keep-buffer t) @@ -1737,10 +2474,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (setq markdown-enable-math t) (setq markdown-follow-wiki-link-on-enter nil) (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases"))) - (setq post-email-address "don@donarmstrong.com") - (setq post-kill-quoted-sig nil) - (setq post-mail-message "mutt\\(ng\\|\\)-[a-z0-9]+-[0-9]+-.*") - (setq post-uses-fill-mode nil) (setq ps-footer-font-size (quote (8 . 10))) (setq ps-header-font-size (quote (8 . 10))) (setq ps-header-title-font-size (quote (10 . 10))) @@ -1770,91 +2503,9 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (fset 'perl-mode 'cperl-mode) ;;(load-file "cperl-mode.el") - (require 'vcl-mode) - - (require 'tex-site) - ;;(require 'psvn) - ;;(require 'ecasound) - ;;(require 'emacs-wiki) - (require 'bibtex) - (require 'post) - ;;(require 'fixme) - ; (require 'google-weather) - ; (require 'org-google-weather) - ; (setq-default org-google-weather-format "%i %c, [%l,%h] %s %C") - - (global-set-key "\C-xp" 'server-edit) - - (setq-default auto-mode-alist (cons '("\.wml$" . - (lambda () (html-mode) (auto-fill-mode))) - auto-mode-alist)) - - - ; use markdown mode for mdwn files - (add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode)) - (add-to-list 'auto-mode-alist '("\\.md$" . markdown-mode)) - - ;; tramp configuration (setq tramp-use-ssh-controlmaster-options nil) - ; mail configuration - (add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . message-mode)) - (add-to-list 'auto-mode-alist '("muttngrc" . muttrc-mode)) - - (add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . message-mode)) - (add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode)) - (defun my-message-mode-settings () - (font-lock-add-keywords nil - '(("^[ \t]*>[ \t]*>[ \t]*>.*$" - (0 'message-multiply-quoted-text-face)) - ("^[ \t]*>[ \t]*>.*$" - (0 'message-double-quoted-text-face)))) - (local-set-key (kbd "C-c C-a") 'my-post-attach-file) - ) - (add-hook 'message-mode-hook 'my-message-mode-settings) - - (defun my-post-attach-file () - "Prompt for an attachment." - (interactive) - (let ((file (read-file-name "Attach file: " nil nil t nil)) - (description (string-read "Description: "))) - (my-header-attach-file file description))) - - (symbol-function 'my-post-attach-file) - - (defun my-header-attach-file (file description) - "Attach a FILE to the current message (works with Mutt). - Argument DESCRIPTION MIME description." - (interactive "fAttach file: \nsDescription: ") - (when (> (length file) 0) - (save-excursion - (save-match-data - (save-restriction - (widen) - (goto-char (point-min)) - (search-forward-regexp "^$") - (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " " - description "\n")) - (message (concat "Attached '" file "'.")) - (setq post-has-attachment t)))))) - - - - (setq mail-yank-prefix "> ") - - ;; self-insert-command hack. - ;; Without this, "if" expands to - ;; if ( -!-) { - ;; } - ;; which really should be, - ;; if (-!-) { - ;; } - - - - ;(load-library "php-mode") - (setq-default c-indent-level 4) (setq-default c-brace-imaginary-offset 0) (setq-default c-brace-offset -4) @@ -1887,60 +2538,35 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ) (column-number-mode t) - - (server-start) - - ; (require 'mode-compile) - - (defadvice server-process-filter (after post-mode-message first activate) - "If the buffer is in post mode, overwrite the server-edit - message with a post-save-current-buffer-and-exit message." - (if (eq major-mode 'post-mode) - (message - (substitute-command-keys "Type \\[describe-mode] for help composing; \\[post-save-current-buffer-and-exit] when done.")))) - ; This is also needed to see the magic message. Set to a higher - ; number if you have a faster computer or read slower than me. - '(font-lock-verbose 1000) - ;(setq-default server-temp-file-regexp "mutt\(-\|ng-\)") - ; (add-hook 'server-switch-hook - ; (function (lambda() - ; (cond ((string-match "Post" mode-name) - ; (post-goto-body))) - ; set-buffer-file-coding-system 'utf-8 - ; ))) - ; - - (add-hook 'post-mode-hook - (auto-fill-mode nil) - ) - ; abbrev mode settings - ; load abbreviations from - (setq abbrev-file-name - "~/.emacs_abbrev_def") - - ; read the abbrev file if it exists - (if (file-exists-p abbrev-file-name) - (quietly-read-abbrev-file)) - - ; for now, use abbrev mode everywhere - (setq default-abbrev-mode t) - - - (defun insert-function-documentation () - "Insert function documentation" - (interactive) - (insert-file-contents "/home/don/lib/templates/perl_function_documentation" nil)) - (global-set-key "\M-f" 'insert-function-documentation) - - (eval-after-load "lilypond-mode" - '(progn - (load-library "lyqi-mode") - (define-key LilyPond-mode-map "\C-cq" 'lyqi-mode))) - - (autoload 'spamassassin-mode "spamassassin-mode" nil t) - - (desktop-load-default) - (desktop-read) + +#+END_SRC +** Desktop-save-mode +If the envvar EMACS_SERVER_NAME is set, consider this a separate +emacs, and use a different desktop file to restore history +#+BEGIN_SRC emacs-lisp + (use-package desktop + :demand + :config + (setq desktop-base-file-name + (convert-standard-filename + (concat ".emacs" + (or (getenv "EMACS_SERVER_NAME") + "") + ".desktop") + )) + (setq desktop-base-lock-name + (convert-standard-filename + (concat desktop-base-file-name + ".lock"))) + (setq desktop-auto-save-timeout 60) + (setq desktop-restore-eager 5) + (setq desktop-lazy-verbose nil) + (desktop-save-mode 1) + ; (desktop-read) + ) +#+END_SRC +** Misc (Uncharacterized) +#+BEGIN_SRC emacs-lisp '(icomplete-mode on) (custom-set-faces ;; custom-set-faces was added by Custom. @@ -1963,18 +2589,18 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ; Outline-minor-mode key map (define-prefix-command 'cm-map nil "Outline-") ; HIDE - (define-key cm-map "q" 'hide-sublevels) ; Hide everything but the top-level headings - (define-key cm-map "t" 'hide-body) ; Hide everything but headings (all body lines) - (define-key cm-map "o" 'hide-other) ; Hide other branches - (define-key cm-map "c" 'hide-entry) ; Hide this entry's body - (define-key cm-map "l" 'hide-leaves) ; Hide body lines in this entry and sub-entries - (define-key cm-map "d" 'hide-subtree) ; Hide everything in this entry and sub-entries + (define-key cm-map "q" 'outline-hide-sublevels) ; Hide everything but the top-level headings + (define-key cm-map "t" 'outline-hide-body) ; Hide everything but headings (all body lines) + (define-key cm-map "o" 'outline-hide-other) ; Hide other branches + (define-key cm-map "c" 'outline-hide-entry) ; Hide this entry's body + (define-key cm-map "l" 'outline-hide-leaves) ; Hide body lines in this entry and sub-entries + (define-key cm-map "d" 'outline-hide-subtree) ; Hide everything in this entry and sub-entries ; SHOW - (define-key cm-map "a" 'show-all) ; Show (expand) everything - (define-key cm-map "e" 'show-entry) ; Show this heading's body - (define-key cm-map "i" 'show-children) ; Show this heading's immediate child sub-headings - (define-key cm-map "k" 'show-branches) ; Show all sub-headings under this heading - (define-key cm-map "s" 'show-subtree) ; Show (expand) everything in this heading & below + (define-key cm-map "a" 'outline-show-all) ; Show (expand) everything + (define-key cm-map "e" 'outline-show-entry) ; Show this heading's body + (define-key cm-map "i" 'outline-show-children) ; Show this heading's immediate child sub-headings + (define-key cm-map "k" 'outline-show-branches) ; Show all sub-headings under this heading + (define-key cm-map "s" 'outline-show-subtree) ; Show (expand) everything in this heading & below ; MOVE (define-key cm-map "u" 'outline-up-heading) ; Up (define-key cm-map "n" 'outline-next-visible-heading) ; Next @@ -1982,51 +2608,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (define-key cm-map "f" 'outline-forward-same-level) ; Forward - same level (define-key cm-map "b" 'outline-backward-same-level) ; Backward - same level (global-set-key "\M-o" cm-map) - - - ; debian stuff - (setq-default debian-changelog-mailing-address "don@debian.org") - (setq-default debian-changelog-full-name "Don Armstrong") - - ; ediff configuration - ; don't use the multi-window configuration - (setq ediff-window-setup-function 'ediff-setup-windows-plain) - - ; fix up css mode to not be silly - ; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/ - (setq cssm-indent-level 4) - (setq cssm-newline-before-closing-bracket t) - (setq cssm-indent-function #'cssm-c-style-indenter) - (setq cssm-mirror-mode nil) - - (require 'multi-web-mode) - (setq mweb-default-major-mode 'html-mode) - (setq mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>") - (js-mode "") - (css-mode ""))) - (setq mweb-filename-extensions '("php" "htm" "html" "ctp" "phtml" "php4" "php5")) - (multi-web-global-mode 1) - - ;;; alias the new `flymake-report-status-slim' to - ;;; `flymake-report-status' - (defalias 'flymake-report-status 'flymake-report-status-slim) - (defun flymake-report-status-slim (e-w &optional status) - "Show \"slim\" flymake status in mode line." - (when e-w - (setq flymake-mode-line-e-w e-w)) - (when status - (setq flymake-mode-line-status status)) - (let* ((mode-line " Φ")) - (when (> (length flymake-mode-line-e-w) 0) - (setq mode-line (concat mode-line ":" flymake-mode-line-e-w))) - (setq mode-line (concat mode-line flymake-mode-line-status)) - (setq flymake-mode-line mode-line) - (force-mode-line-update))) - - ; load sql-indent when sql is loaded - (eval-after-load "sql" - '(load-library "sql-indent")) - ; fix up tmux xterm keys ; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux (defun fix-up-tmux-keys () @@ -2122,11 +2703,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ) ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys) - ; procmailmode configuration - (load "procmail_mode") - - (load "mode-line-cleaner") - (defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary) "Call ask-user-about-supersession-threat only if the buffer is actually obsolete." (if (or (buffer-modified-p) @@ -2137,34 +2713,21 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (clear-visited-file-modtime) (not-modified))) (ad-activate 'ask-user-about-supersession-threat) +#+END_SRC - ; apparently things like to step on C-;, so we'll use a hack from - ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this - - (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.") - - ; use iedit everywhere - (define-key my-keys-minor-mode-map (kbd "C-;") 'mc/mark-all-dwim) - - (define-minor-mode my-keys-minor-mode - "A minor mode so that my key settings override annoying major modes." - t " my-keys" 'my-keys-minor-mode-map) - - (my-keys-minor-mode 1) - (defun my-minibuffer-setup-hook () - (my-keys-minor-mode 0)) +* Start Server +#+BEGIN_SRC emacs-lisp + (use-package server + :config + (setq server-name + (or (getenv "EMACS_SERVER_NAME") + "server")) + (unless (server-running-p) + (global-set-key "\C-xp" 'server-edit) + (server-start))) +#+END_SRC - (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook) - (defadvice load (after give-my-keybindings-priority) - "Try to ensure that my keybindings always have priority." - (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode)) - (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist))) - (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist) - (add-to-list 'minor-mode-map-alist mykeys)))) - (ad-activate 'load) - (global-set-key "\M- " 'hippie-expand) -#+END_SRC * END #+BEGIN_SRC emacs-lisp