]> git.donarmstrong.com Git - lib.git/blob - emacs_el/configuration/don-configuration.org
hide eldoc mode
[lib.git] / emacs_el / configuration / don-configuration.org
1 #+PROPERTY: header-args:emacs-lisp :tangle don-configuration.el
2 #+OPTIONS: auto-id:f
3
4 * General Notes
5
6 ** Delight
7 To look up options for symbols for delight, check out https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
8
9 * Load debugger
10
11 # if for some reason, things get pear-shaped, we want to be able to
12 # enter the debugger by sending -USR2 to emacs
13
14 #+BEGIN_SRC emacs-lisp
15 (setq debug-on-event 'siguser2)
16 #+END_SRC
17 * Paths
18 ** Update PATH
19 #+BEGIN_SRC emacs-lisp
20 (add-to-list 'exec-path '"/usr/local/bin")
21 (add-to-list 'exec-path '"~/bin/")
22 #+END_SRC
23 ** Add library paths
24 #+BEGIN_SRC emacs-lisp
25 (let ((default-directory "~/lib/emacs_el/"))
26   (normal-top-level-add-subdirs-to-load-path))
27 ;; (eval-and-compile
28 ;;   (let ((default-directory "~/var/emacs/elpa"))
29 ;;     (normal-top-level-add-subdirs-to-load-path))
30 ;; )
31 (add-to-list 'load-path '"~/lib/emacs_el")
32 (setq package-user-dir "~/var/emacs/elpa")
33
34 #+END_SRC
35 * Initial startup stuff
36 ** Disable startup screen
37 #+BEGIN_SRC emacs-lisp
38 (setq inhibit-startup-screen t)
39 #+END_SRC
40 ** Disable cluter
41 #+BEGIN_SRC emacs-lisp
42 ; (if (fboundp 'menu-bar-mode) (menu-bar-mode -1))
43 (if (fboundp 'tool-bar-mode) (tool-bar-mode -1))
44 (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
45 #+END_SRC
46 ** Fullscreen
47 #+BEGIN_SRC emacs-lisp
48 (setq frame-resize-pixelwise t)
49 (add-to-list 'default-frame-alist '(fullscreen . maximixed))
50 #+END_SRC
51 * Package management
52 ** Bootstrap straight.el
53 #+BEGIN_SRC emacs-lisp
54 (defvar bootstrap-version)
55 (setq straight-base-dir '"~/var/emacs/")
56 (let ((bootstrap-file
57        (expand-file-name "straight/repos/straight.el/bootstrap.el" straight-base-dir))
58       (bootstrap-version 6))
59   (unless (file-exists-p bootstrap-file)
60     (with-current-buffer
61         (url-retrieve-synchronously
62          "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
63          'silent 'inhibit-cookies)
64       (goto-char (point-max))
65       (eval-print-last-sexp)))
66   (load bootstrap-file nil 'nomessage))
67 #+END_SRC
68 ** package repositories and package manager
69 #+BEGIN_SRC emacs-lisp
70 (straight-use-package 'use-package)
71 (setq straight-use-package-by-default t)
72 (setq use-package-verbose (not (bound-and-true-p byte-compile-current-file)))
73 (require 'gnutls)
74 (add-to-list 'gnutls-trustfiles "/etc/ssl/ca-global/ca-certificates.crt")
75 #+END_SRC
76 ** Paradox
77 #+BEGIN_SRC emacs-lisp
78 (use-package paradox
79   ;:ensure paradox
80   :commands (paradox-upgrade-packages paradox-list-packages)
81   :config
82   (setq paradox-execute-asynchronously t)
83   (setq paradox-github-token t) ; I don't want to be prompted about this integration
84   )
85 #+END_SRC
86 * Disable custom-vars
87 #+BEGIN_SRC emacs-lisp
88 ;; Set the custom file to /dev/null and don't bother to load it
89 (setq custom-file "/dev/null")
90 #+END_SRC
91 * Misc functions
92 ** with-library
93 #+BEGIN_SRC emacs-lisp
94 ;; From http://www.emacswiki.org/emacs/LoadingLispFiles
95 ;; execute conditional code when loading libraries
96 ; (defmacro with-library (symbol &rest body)
97 ;   `(when (require ,symbol nil t)
98 ;     ,@body))
99 ; (put 'with-library 'lisp-indent-function 1)
100 #+END_SRC
101
102 * Variables
103 ** Safe Local Variables
104 #+BEGIN_SRC emacs-lisp
105 (setq safe-local-variable-values
106       (quote ((auto-save-default)
107               (make-backup-files)
108               (cperl-indent-level . 4)
109               (indent-level . 4)
110               (indent-tabs-mode . f)
111               (vcl-indent-level . 4)
112               )))
113 #+END_SRC
114 * Memory
115 #+BEGIN_SRC emacs-lisp
116 (setq global-mark-ring-max 128
117       mark-ring-max 128
118       kill-ring-max 128)
119
120 (defun don/minibuffer-setup-hook ()
121   (setq gc-cons-threshold most-positive-fixnum))
122
123 (defun don/minibuffer-exit-hook ()
124   (setq gc-cons-threshold 1048576))
125
126 (add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook)
127 (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook)
128 #+END_SRC
129 * Modules
130 ** Tree sitter
131 #+BEGIN_SRC emacs-lisp
132 (use-package tree-sitter
133   :defer t
134   :config
135   (global-tree-sitter-mode)
136   )
137 (use-package tree-sitter-langs
138   :ensure t
139   :defer 1
140   :after tree-sitter
141 ;   :config
142 ;   (defun dla/python-function-at-point ()
143 ;     "Return a list of function arguments
144
145 ; Borrowed from https://xenodium.com/emacs-generate-a-swift-initializer/
146 ; "
147 ;   (interactive)
148 ;   (cl-assert (seq-contains-p local-minor-modes 'tree-sitter-mode) "tree-sitter-mode not enabled")
149 ;   (let* ((node (tree-sitter-node-at-point 'function_definition)
150 ;                )
151 ;          (args)
152 ;          (arg)
153 ;          (ret))
154 ;     (unless node
155 ;       (error "Not in function"))
156 ;     (mapc
157 ;      (lambda (item)
158 ;        (cond ((eq 'func_name
159 ;                   (car item))
160 ;               ; (when arg
161 ;               ;   (setq args (append args (list arg)))
162 ;               ;   )
163 ;               (setq arg (list (cons 'function (tsc-node-text
164 ;                                            (cdr item))))))
165 ;              ((eq 'ident
166 ;                   (car item))
167 ;               (setq arg (map-insert arg 'ident (tsc-node-text
168 ;                                                (cdr item)))))
169 ;              ((eq 'ident_type
170 ;                   (car item))
171 ;               (setq arg (map-insert arg 'ident_type (tsc-node-text
172 ;                                                (cdr item)))))
173 ;              ((eq 'ret_type
174 ;                   (car item))
175 ;               (setq arg (map-insert arg 'ret_type (tsc-node-text
176 ;                                                (cdr item)))))
177 ;              ))
178 ;      (tsc-query-captures
179 ;       (tsc-make-query tree-sitter-language
180 ;                       "(function_definition (identifier) @func_name (parameters [(identifier) @ident (typed_parameter (identifier) @ident (type) @ident_type)]) (type)? @ret_type)")
181 ;       (tree-sitter-node-at-point 'function_definition) nil))
182 ;     (when arg
183 ;       (setq args (append args (list arg))))
184 ;     args))
185
186 )
187 #+END_SRC
188 ** Spacemacs theme
189 #+BEGIN_SRC emacs-lisp
190 (use-package spacemacs-theme
191   :config
192   (load-theme 'spacemacs-dark t)
193   )
194 #+END_SRC
195 ** Hippie Expand
196 #+BEGIN_SRC emacs-lisp
197 (use-package hippie-exp
198   :bind* (("M-<SPC>" . hippie-expand))
199   )
200 #+END_SRC
201 ** Flyspell 🐝 
202 #+BEGIN_SRC emacs-lisp
203 (use-package flyspell
204   ; :delight flyspell-mode 🐝
205   :config
206   (setq flyspell-mode-line-string " 🐝")
207   (add-hook 'text-mode-hook 'turn-on-flyspell)
208   (add-hook 'c-mode-common-hook 'flyspell-prog-mode)
209   (add-hook 'cperl-mode-hook 'flyspell-prog-mode)
210   (add-hook 'tcl-mode-hook 'flyspell-prog-mode)
211   :init
212   (setq ispell-program-name "ispell")
213   )
214 #+END_SRC
215
216 ** Flycheck
217 #+begin_src emacs-lisp :tangle yes
218 (use-package flycheck
219   :delight 🦋
220   :if (version<= "24.4" emacs-version)
221   :commands flycheck-mode
222   :hook ((prog-mode . flycheck-mode)
223          )
224 )
225 ;; Other pkgs
226 (use-package flycheck-tip
227   :commands 'flycheck-tip-cycle
228   :after flycheck
229   :bind (:map flycheck-mode-map
230               ("C-c C-n" . flycheck-tip-cycle)))
231
232 (use-package flycheck-package)
233
234 (use-package flycheck-checkpatch
235   :config (flycheck-checkpatch-setup)
236   :config (setq flycheck-checkers (delete 'checkpatch
237   flycheck-checkers))
238   :config (add-to-list 'flycheck-checkers 'checkpatch t))
239 #+end_src  
240
241 ** Flymake
242 #+BEGIN_SRC emacs-lisp
243   (use-package flymake
244     :delight "Φ")
245 #+END_SRC
246
247 ** Winnermode
248 #+BEGIN_SRC emacs-lisp
249   (winner-mode 1)
250 #+END_SRC
251 ** Eyebrowse
252
253 #+BEGIN_SRC emacs-lisp
254   (use-package eyebrowse
255     :ensure t
256     :delight eyebrowse-mode
257     :init (setq eyebrowse-keymap-prefix (kbd "C-c e"))
258     :config (progn
259               (setq eyebrowse-wrap-around t)
260               (eyebrowse-mode t)
261
262               (defun my/eyebrowse-new-window-config ()
263                 (interactive)
264                 (let ((done nil))
265                   (dotimes (i 10)
266                     ;; start at 1 run till 0
267                     (let ((j (mod (+ i 1) 10)))
268                       (when (and (not done)
269                                  (not (eyebrowse--window-config-present-p j)))
270                         (eyebrowse-switch-to-window-config j)
271                         (call-interactively 'eyebrowse-rename-window-config2 j)
272                         (setq done t)
273                         ))
274                     )))
275
276               ;; I don't use latex-preview-pane
277               ;; (require 'latex-preview-pane)
278               ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch ()
279               ;;   ;; latex-preview-pane uses window-parameters which are
280               ;;   ;; not preserved by eyebrowse, so we close the preview
281               ;;   ;; pane before switching, it will be regenerated when we
282               ;;   ;; edit the TeX file.
283               ;;   (when (lpp/window-containing-preview)
284               ;;     (delete-window (lpp/window-containing-preview))))
285
286               ;; (add-to-list 'eyebrowse-pre-window-switch-hook
287               ;;              #'my/close-latex-preview-pane-before-eyebrowse-switch)
288
289               ;; (my/set-menu-key "["  #'my/eyebrowse-new-window-config)
290               ;; (my/set-menu-key ";"  #'eyebrowse-prev-window-config)
291               ;; (my/set-menu-key "'"  #'eyebrowse-next-window-config)
292               ;; (my/set-menu-key "]"  #'eyebrowse-close-window-config)
293               ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config)
294               )
295     )
296 #+END_SRC
297
298 ** Window handling
299
300 *** Splitting
301 #+BEGIN_SRC emacs-lisp
302   (defun my/vsplit-last-buffer ()
303     "Split the window vertically and display the previous buffer."
304     (interactive)
305     (split-window-vertically)
306     (other-window 1 nil)
307     (switch-to-next-buffer))
308
309   (defun my/hsplit-last-buffer ()
310     "Split the window horizontally and display the previous buffer."
311     (interactive)
312     (split-window-horizontally)
313     (other-window 1 nil)
314     (switch-to-next-buffer))
315
316   (bind-key "C-x 2" 'my/vsplit-last-buffer)
317   (bind-key "C-x 3" 'my/hsplit-last-buffer)
318
319   (setq split-width-threshold  100)
320   (setq split-height-threshold 60)
321
322   (defun my/split-window-prefer-vertically (window)
323     "If there's only one window (excluding any possibly active
324            minibuffer), then split the current window horizontally."
325     (if (and (one-window-p t)
326              (not (active-minibuffer-window))
327              ( < (frame-width) (frame-height))
328              )
329         (let ((split-width-threshold nil))
330           (split-window-sensibly window))
331       (split-window-sensibly window)))
332
333   (setq split-window-preferred-function #'my/split-window-prefer-vertically)
334   (setq window-combination-resize t)
335 #+END_SRC
336
337 *** Compilation window
338
339 If there is no compilation window, open one at the bottom, spanning
340 the complete width of the frame. Otherwise, reuse existing window. In
341 the former case, if there was no error the window closes
342 automatically.
343
344 #+BEGIN_SRC emacs-lisp
345   (add-to-list 'display-buffer-alist
346                `(,(rx bos "*compilation*" eos)
347                  (display-buffer-reuse-window
348                   display-buffer-in-side-window)
349                  (reusable-frames . visible)
350                  (side            . bottom)
351                  (window-height   . 0.4)))
352 #+END_SRC
353
354 #+BEGIN_SRC emacs-lisp
355   (defun my/compilation-exit-autoclose (status code msg)
356     ;; If M-x compile exists with a 0
357     (when (and (eq status 'exit) (zerop code))
358       ;; and delete the *compilation* window
359       (let ((compilation-window (get-buffer-window (get-buffer "*compilation*"))))
360         (when (and (not (window-at-side-p compilation-window 'top))
361                    (window-at-side-p compilation-window 'left)
362                    (window-at-side-p compilation-window 'right))
363           (delete-window compilation-window))))
364     ;; Always return the anticipated result of compilation-exit-message-function
365     (cons msg code))
366
367   ;; Specify my function (maybe I should have done a lambda function)
368   (setq compilation-exit-message-function #'my/compilation-exit-autoclose)
369 #+END_SRC
370
371 If you change the variable ~compilation-scroll-output~ to a ~non-nil~
372 value, the compilation buffer scrolls automatically to follow the
373 output. If the value is ~first-error~, scrolling stops when the first
374 error appears, leaving point at that error. For any other non-nil
375 value, scrolling continues until there is no more output.
376
377 #+BEGIN_SRC emacs-lisp
378   (setq compilation-scroll-output 'first-error)
379 #+END_SRC
380
381 ** Mode line cleaning
382 *** Delight 
383 #+BEGIN_SRC emacs-lisp
384 (use-package delight
385   :demand t)
386 #+END_SRC
387
388 ** Jumping
389 *** Avy
390 #+BEGIN_SRC emacs-lisp
391   (use-package avy
392     :if (>= emacs-major-version 25)
393     :ensure t
394     :bind (("C-c C-<SPC>" . avy-goto-word-or-subword-1)
395            ("C-c j j" . avy-goto-word-or-subword-1)
396            ("M-g g" . avy-goto-line))
397     :config (progn (setq avy-background t))
398     )
399 #+END_SRC
400 *** Ace-link (jumping to links)
401 #+BEGIN_SRC emacs-lisp
402   (use-package ace-link
403     :ensure t
404     ; bind o in most modes
405     :config (ace-link-setup-default))
406 #+END_SRC
407 *** Jumping through edit points (goto-chg)
408 #+BEGIN_SRC emacs-lisp
409   (use-package goto-chg
410     :ensure t
411     :bind (("C-c j ," . goto-last-change)
412            ("C-c j ." . goto-last-change-reverse))
413     )
414 #+END_SRC
415 *** Jumping to bookmarks (visible bookmarks, bm)
416 #+BEGIN_SRC emacs-lisp
417   (use-package bm
418     :ensure t
419     :bind (("C-c j b ." . bm-next)
420            ("C-c j b ," . bm-previous)
421            ("C-c j b SPC" . bm-toggle)))
422 #+END_SRC
423
424 ** Snippets
425 *** Yasnippet
426 #+BEGIN_SRC emacs-lisp
427 (use-package yasnippet
428   :ensure t
429   :delight yas-minor-mode
430   :config (progn
431             (yas-global-mode)
432             (setq yas-verbosity 1)
433             (define-key yas-minor-mode-map (kbd "<tab>") nil)
434             (define-key yas-minor-mode-map (kbd "TAB") nil)
435             (define-key yas-minor-mode-map (kbd "<backtab>") nil)
436             (setq yas-snippet-dirs '("~/lib/emacs_el/snippets/"
437                                      "~/lib/emacs_el/yasnippet-snippets/snippets/"))
438             (add-to-list 'hippie-expand-try-functions-list
439                              'yas-hippie-try-expand)
440             (yas-reload-all)
441             )
442   )
443 #+END_SRC
444 *** Auto-YASnippet
445 #+BEGIN_SRC emacs-lisp
446 (use-package auto-yasnippet
447   :ensure t
448   :bind (("H-w" . aya-create)
449          ("H-y" . aya-expand)
450          )
451   )
452 #+END_SRC
453 ** Treemacs: Tree file viewer
454 #+BEGIN_SRC emacs-lisp
455 ;; Provides workspaces with file browsing (tree file viewer)
456 ;; and project management when coupled with `projectile`.
457
458 ; (use-package treemacs
459 ;   :ensure t
460 ;   :defer t
461 ;   :config
462 ;   (setq treemacs-no-png-images t
463 ;         treemacs-width 24)
464 ;   :bind ("C-c t" . treemacs))
465 #+END_SRC
466 ** LSP mode
467 #+BEGIN_SRC emacs-lisp
468 (use-package lsp-mode
469   :defer t
470   :commands (lsp lsp-deferred)
471   :init (setq lsp-keymap-prefix "C-c l")
472   (defun my/orderless-dispatch-flex-first (_pattern index _total)
473     (and (eq index 0) 'orderless-flex))
474
475   (defun my/lsp-mode-setup-completion ()
476     (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults))
477           '(orderless)))
478
479   ;; Optionally configure the first word as flex filtered.
480   (add-hook 'orderless-style-dispatchers #'my/orderless-dispatch-flex-first nil 'local)
481
482   ;; Optionally configure the cape-capf-buster.
483   ; (setq-local completion-at-point-functions (list (cape-capf-buster #'lsp-completion-at-point)))
484
485   :hook (python-mode . lsp-deferred)
486   (lsp-completion-mode . my/lsp-mode-setup-completion)
487   :custom
488   (lsp-completion-provider :none) ;; we use Corfu!
489 )
490 ;; Provides visual help in the buffer 
491 ;; For example definitions on hover. 
492 ;; The `imenu` lets me browse definitions quickly.
493 (use-package lsp-ui
494   :defer t
495   :config
496   (setq lsp-ui-sideline-enable nil
497             lsp-ui-doc-delay 2)
498   :hook (lsp-mode . lsp-ui-mode)
499   :bind (:map lsp-ui-mode-map
500               ("C-c i" . lsp-ui-imenu)))
501 ;; Language server for Python 
502 ;; Read the docs for the different variables set in the config.
503 (use-package lsp-pyright
504   :defer t
505   :config
506   (setq lsp-clients-python-library-directories '("/usr/"))
507   (setq lsp-pyright-disable-language-service nil
508         lsp-pyright-disable-organize-imports nil
509         lsp-pyright-auto-import-completions t
510         lsp-pyright-use-library-code-for-types t
511         lsp-pyright-venv-path "venv")
512   :hook ((python-mode . (lambda () 
513                           (require 'lsp-pyright) (lsp-deferred)))))
514 #+END_SRC
515 ** Corfu
516 #+BEGIN_SRC emacs-lisp
517 (use-package corfu
518   :ensure t
519   :demand t
520   ;; Optional customizations
521   :custom
522   (corfu-cycle t)                ;; Enable cycling for `corfu-next/previous'
523   (corfu-auto t)                 ;; Enable auto completion
524   (corfu-separator ?\s)          ;; Orderless field separator
525   (corfu-quit-at-boundary nil)   ;; Never quit at completion boundary
526   (corfu-quit-no-match nil)      ;; Never quit, even if there is no match
527   (corfu-preview-current nil)    ;; Disable current candidate preview
528   (corfu-preselect 'prompt)      ;; Preselect the prompt
529   (corfu-on-exact-match nil)     ;; Configure handling of exact matches
530   (corfu-scroll-margin 5)        ;; Use scroll margin
531
532   :config
533   (global-corfu-mode))
534 #+END_SRC
535 ** Dabbrv
536 #+BEGIN_SRC emacs-lisp
537 (use-package dabbrev
538   :ensure t
539   ;; Swap M-/ and C-M-/
540   :bind (("M-/" . dabbrev-completion)
541          ("C-M-/" . dabbrev-expand))
542   ;; Other useful Dabbrev configurations.
543   :custom
544   (dabbrev-ignored-buffer-regexps '("\\.\\(?:pdf\\|jpe?g\\|png\\)\\'")))
545 #+END_SRC
546 ** Tinyprocmail
547
548 #+BEGIN_SRC emacs-lisp
549 ;; load tinyprocmail
550 (use-package tinyprocmail
551   :straight (tinytools :type git :type git :host github :repo "jaalto/project--emacs-tiny-tools")
552   ; :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny"
553   :mode (".procmailrc" . turn-on-tinyprocmail-mode)
554   )
555 #+END_SRC
556
557 ** Magit
558 #+BEGIN_SRC emacs-lisp
559 (use-package magit
560   :defer t
561   :bind (("C-x g" . magit-status)
562          ("C-x C-g" . magit-status))
563   :config
564   ;; refine diffs always (hilight words)
565   (setq magit-diff-refine-hunk nil)
566   )
567 (use-package magit-annex
568   :defer t
569   )
570 (use-package magit-vcsh
571   :defer t
572   )
573 #+END_SRC
574
575 *** Forge (github/gitlab)
576 #+BEGIN_SRC emacs-lisp
577 (use-package forge
578   :after magit
579   )
580 #+END_SRC
581
582 ** Perl
583 #+BEGIN_SRC emacs-lisp
584 (use-package cperl-mode
585   :config
586   (progn
587     ;; Use c-mode for perl .xs files
588     (add-to-list 'auto-mode-alist '("\\.xs\\'" . c-mode))
589     (add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\)\\'" . cperl-mode))
590     (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
591     (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
592     (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
593     (setq cperl-hairy t
594           cperl-indent-level 4
595           cperl-auto-newline nil
596           cperl-auto-newline-after-colon nil
597           cperl-continued-statement-offset 4
598           cperl-brace-offset -1
599           cperl-continued-brace-offset 0
600           cperl-label-offset -4
601           cperl-highlight-variables-indiscriminately t
602           cperl-electric-lbrace-space nil
603           cperl-indent-parens-as-block nil
604           cperl-close-paren-offset -1
605           cperl-tab-always-indent t)
606     (setq cperl-lazy-help-time nil)
607     ;;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle")))
608 ))
609 #+END_SRC
610
611 ** Markdown mode
612 #+BEGIN_SRC emacs-lisp
613 (use-package markdown-mode
614   :ensure t
615   :defer t
616   :mode (("\\.md\\'" . markdown-mode)
617          ("\\.mdwn\\'" . markdown-mode)
618          ("README\\.md\\'" . gfm-mode)
619          )
620   :config
621   (setq markdown-enable-math t)
622   (setq markdown-follow-wiki-link-on-enter nil)
623   (bind-key "M-." #'markdown-jump markdown-mode-map)
624   (add-hook 'markdown-mode-hook #'flyspell-mode)
625   (add-hook 'markdown-mode-hook #'outline-minor-mode)
626   (bind-key "C-<tab>" #'outline-cycle markdown-mode-map)
627 )
628
629 #+END_SRC
630 ** SQL mode
631 #+BEGIN_SRC emacs-lisp
632 ; load sql-indent when sql is loaded
633 (use-package sql-indent
634   :hook sql-mode
635   )
636 (use-package sql
637   :mode (("\\.sql\\'" . sql-mode))
638   )
639 #+END_SRC
640 ** Ediff
641 #+BEGIN_SRC emacs-lisp
642 (use-package ediff
643   :commands ediff ediff3
644   :config
645   ;; ediff configuration
646   ;; don't use the multi-window configuration
647   (setq ediff-window-setup-function 'ediff-setup-windows-plain)
648 )
649 #+END_SRC
650 ** Do the Right Thing Indenting
651 Attempts to automatically identify the right indentation for a file
652 #+BEGIN_SRC emacs-lisp
653 (use-package dtrt-indent
654 )  
655 #+END_SRC
656 ** VCL --editing varnish configuration files
657 #+BEGIN_SRC emacs-lisp
658 (use-package vcl-mode
659   :mode "\\.vcl\\'"
660   )
661 #+END_SRC
662 ** Vertico
663 #+BEGIN_SRC emacs-lisp
664 (use-package vertico
665   :demand t
666   :config
667   (vertico-mode)
668   ; (define-key vertico-map "\r" #'vertico-directory-enter)
669   ; (define-key vertico-map "\d" #'vertico-directory-delete-char)
670   ; (define-key vertico-map "\M-\d" #'vertico-directory-delete-word)
671   ; (add-hook 'rfn-eshadow-update-overlay-hook #'vertico-directory-tidy)
672
673   ;; Different scroll margin
674   ;; (setq vertico-scroll-margin 0)
675
676   ;; Show more candidates
677   ;; (setq vertico-count 20)
678
679   ;; Grow and shrink the Vertico minibuffer
680   ;; (setq vertico-resize t)
681
682   ;; Optionally enable cycling for `vertico-next' and `vertico-previous'.
683   ;; (setq vertico-cycle t)
684   :custom
685   (vertico-grid-separator "       ")
686   (vertico-grid-lookahead 50)
687 )
688 (use-package vertico-multiform
689   :straight nil
690   :load-path "~/var/emacs/straight/build/vertico/extensions/"
691   :after vertico
692   :config
693   (setq vertico-multiform-categories
694      '((file reverse)
695        (consult-grep buffer)
696        (consult-location)
697        (imenu buffer)
698        (library reverse indexed)
699        (org-roam-node reverse indexed)
700        ; (t reverse)
701        )
702      )
703   (setq vertico-multiform-commands
704         '(("flyspell-correct-*" grid reverse)
705           (org-refile grid reverse indexed)
706           (consult-yank-pop indexed)
707           (consult-flycheck)
708           (consult-lsp-diagnostics)
709           )
710         )
711   (vertico-multiform-mode)
712   )
713
714 (use-package vertico-grid
715   :straight nil
716   :after vertico
717   )
718 (use-package vertico-reverse
719   :straight nil
720   :after vertico
721   )
722 (use-package vertico-indexed
723   :straight nil
724   :after vertico
725   )
726 (use-package vertico-buffer
727   :straight nil
728   :after vertico
729   )
730
731
732 ;; Persist history over Emacs restarts. Vertico sorts by history position.
733 (use-package savehist
734   :demand t
735   :config
736   (savehist-mode))
737
738 #+END_SRC
739 ** Orderless: advanced completion style
740 #+begin_src emacs-lisp
741 (use-package orderless
742   :demand t
743   :config
744   ;; Configure a custom style dispatcher (see the Consult wiki)
745   ;; (setq orderless-style-dispatchers '(+orderless-dispatch)
746   ;;       orderless-component-separator #'orderless-escapable-split-on-space)
747   (setq completion-styles '(orderless basic)
748         completion-category-defaults nil
749         completion-category-overrides '((file (styles partial-completion)))))
750 #+end_src
751 ** Marginalia: Rich annotations in the minibuffer
752 #+begin_src emacs-lisp
753 (use-package marginalia
754   :demand t
755   :bind (:map minibuffer-local-map
756          ("M-A" . marginalia-cycle))
757   :config
758   (marginalia-mode)
759   )
760 #+end_src
761 ** Embark: Minibuffer actions and context menu
762 #+begin_src emacs-lisp
763 (use-package embark
764   :bind
765   (("C-." . embark-act)         ;; pick some comfortable binding
766    ("C-;" . embark-dwim)        ;; good alternative: M-.
767    ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings'
768
769   :init
770
771   ;; Optionally replace the key help with a completing-read interface
772   (setq prefix-help-command #'embark-prefix-help-command)
773
774   :config
775
776   ;; Hide the mode line of the Embark live/completions buffers
777   (add-to-list 'display-buffer-alist
778                '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*"
779                  nil
780                  (window-parameters (mode-line-format . none)))))
781
782 (use-package embark-consult
783   :hook
784   (embark-collect-mode . consult-preview-at-point-mode))
785 #+end_src
786 ** Consult
787 #+begin_src emacs-lisp
788 (use-package consult
789   ;; Replace bindings. Lazily loaded due by `use-package'.
790   :bind (;; C-c bindings in `mode-specific-map'
791          ("C-c M-x" . consult-mode-command)
792          ("C-c h" . consult-history)
793          ("C-c k" . consult-kmacro)
794          ("C-c m" . consult-man)
795          ("C-c i" . consult-info)
796          ([remap Info-search] . consult-info)
797          ;; C-x bindings in `ctl-x-map'
798          ("C-x M-:" . consult-complex-command)     ;; orig. repeat-complex-command
799          ("C-x b" . consult-buffer)                ;; orig. switch-to-buffer
800          ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window
801          ("C-x 5 b" . consult-buffer-other-frame)  ;; orig. switch-to-buffer-other-frame
802          ("C-x r b" . consult-bookmark)            ;; orig. bookmark-jump
803          ("C-x p b" . consult-project-buffer)      ;; orig. project-switch-to-buffer
804          ;; Custom M-# bindings for fast register access
805          ("M-#" . consult-register-load)
806          ("M-'" . consult-register-store)          ;; orig. abbrev-prefix-mark (unrelated)
807          ("C-M-#" . consult-register)
808          ;; Other custom bindings
809          ("M-y" . consult-yank-pop)                ;; orig. yank-pop
810          ;; M-g bindings in `goto-map'
811          ("M-g e" . consult-compile-error)
812          ("M-g f" . consult-flymake)               ;; Alternative: consult-flycheck
813          ("M-g g" . consult-goto-line)             ;; orig. goto-line
814          ("M-g M-g" . consult-goto-line)           ;; orig. goto-line
815          ("M-g o" . consult-outline)               ;; Alternative: consult-org-heading
816          ("M-g m" . consult-mark)
817          ("M-g k" . consult-global-mark)
818          ("M-g i" . consult-imenu)
819          ("M-g I" . consult-imenu-multi)
820          ;; M-s bindings in `search-map'
821          ("M-s d" . consult-find)
822          ("M-s D" . consult-locate)
823          ("M-s g" . consult-grep)
824          ("M-s G" . consult-git-grep)
825          ("M-s r" . consult-ripgrep)
826          ("M-s l" . consult-line)
827          ("M-s L" . consult-line-multi)
828          ("M-s k" . consult-keep-lines)
829          ("M-s u" . consult-focus-lines)
830          ;; Isearch integration
831          ("M-s e" . consult-isearch-history)
832          :map isearch-mode-map
833          ("M-e" . consult-isearch-history)         ;; orig. isearch-edit-string
834          ("M-s e" . consult-isearch-history)       ;; orig. isearch-edit-string
835          ("M-s l" . consult-line)                  ;; needed by consult-line to detect isearch
836          ("M-s L" . consult-line-multi)            ;; needed by consult-line to detect isearch
837          ;; Minibuffer history
838          :map minibuffer-local-map
839          ("M-s" . consult-history)                 ;; orig. next-matching-history-element
840          ("M-r" . consult-history))                ;; orig. previous-matching-history-element
841
842   ;; Enable automatic preview at point in the *Completions* buffer. This is
843   ;; relevant when you use the default completion UI.
844   :hook (completion-list-mode . consult-preview-at-point-mode)
845
846   :commands (consult-xref)
847
848   ;; The :init configuration is always executed (Not lazy)
849   :init
850
851   ;; Optionally configure the register formatting. This improves the register
852   ;; preview for `consult-register', `consult-register-load',
853   ;; `consult-register-store' and the Emacs built-ins.
854   (setq register-preview-delay 0.5
855         register-preview-function #'consult-register-format)
856
857   ;; Optionally tweak the register preview window.
858   ;; This adds thin lines, sorting and hides the mode line of the window.
859   (advice-add #'register-preview :override #'consult-register-window)
860
861   ;; Use Consult to select xref locations with preview
862   (setq xref-show-xrefs-function #'consult-xref
863         xref-show-definitions-function #'consult-xref)
864
865   ;; Configure other variables and modes in the :config section,
866   ;; after lazily loading the package.
867   :config
868   ;; Optionally configure preview. The default value
869   ;; is 'any, such that any key triggers the preview.
870   ;; (setq consult-preview-key 'any)
871   ;; (setq consult-preview-key "M-.")
872   ;; (setq consult-preview-key '("S-<down>" "S-<up>"))
873   ;; For some commands and buffer sources it is useful to configure the
874   ;; :preview-key on a per-command basis using the `consult-customize' macro.
875   (consult-customize
876    consult-theme :preview-key '(:debounce 0.2 any)
877    consult-ripgrep consult-git-grep consult-grep
878    consult-bookmark consult-recent-file consult-xref
879    consult--source-bookmark consult--source-file-register
880    consult--source-recent-file consult--source-project-recent-file
881    ;; :preview-key "M-."
882    :preview-key '(:debounce 0.4 any))
883
884   ;; Optionally configure the narrowing key.
885   ;; Both < and C-+ work reasonably well.
886   (setq consult-narrow-key "<") ;; "C-+"
887
888   ;; Optionally make narrowing help available in the minibuffer.
889   ;; You may want to use `embark-prefix-help-command' or which-key instead.
890   ;; (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help)
891
892   ;; By default `consult-project-function' uses `project-root' from project.el.
893   ;; Optionally configure a different project root function.
894   ;;;; 1. project.el (the default)
895   ;; (setq consult-project-function #'consult--default-project--function)
896   ;;;; 2. vc.el (vc-root-dir)
897   ;; (setq consult-project-function (lambda (_) (vc-root-dir)))
898   ;;;; 3. locate-dominating-file
899   ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git")))
900   ;;;; 4. projectile.el (projectile-project-root)
901   ;; (autoload 'projectile-project-root "projectile")
902   ;; (setq consult-project-function (lambda (_) (projectile-project-root)))
903   ;;;; 5. No project support
904   ;; (setq consult-project-function nil)
905 )
906 #+end_src
907 ** Projectile -- Project management
908 #+begin_src emacs-lisp
909 (use-package projectile
910   :bind (("<f5>" . projectile-compile-project)
911          ("<f6>" . next-error))
912   :config (projectile-global-mode))
913 #+end_src
914
915 ** Zap to char
916 #+BEGIN_SRC emacs-lisp
917 (use-package avy-zap
918   :bind ("M-z" . avy-zap-up-to-char-dwim))
919 #+END_SRC
920 ** Hydra
921 #+BEGIN_SRC emacs-lisp
922 (use-package hydra
923   :bind (("C-c 2" . my/hydra-orgmodes/body)
924          ("C-c @" . my/hydra-orgmodes/body)
925          ("C-c #" . my/hydra-outline/body)
926          ("C-c 3" . my/hydra-outline/body)
927          )
928   :config
929   (defhydra my/hydra-orgmodes (:color blue :hint nil)
930   "
931 _n_: notes _c_: chaim _w_: wildman _o_: ool
932 _u_: uddin _s_: steve _r_: refile  _f_: fh    
933 _p_: read papers      _R_: paper notes
934 _h_: hpcbio
935 _q_: quit
936 _z_: quit
937 "
938   ("n" (find-file "~/projects/org-notes/notes.org"))
939   ("c" (find-file "~/projects/org-notes/chaim.org"))
940   ("w" (find-file "~/projects/org-notes/wildman.org"))
941   ("u" (find-file "~/projects/org-notes/uddin.org"))
942   ("o" (find-file "~/projects/org-notes/ool.org"))
943   ("f" (find-file "~/projects/org-notes/fh.org"))
944   ("s" (find-file "~/projects/org-notes/sndservers.org"))
945   ("r" (find-file my/org-refile-file))
946   ("p" (find-file "~/projects/research/papers_to_read.org"))
947   ("R" (find-file "~/projects/research/paper_notes.org"))
948   ("h" (find-file "~/projects/org-notes/hpcbio.org"))
949   ("q" nil "quit")
950   ("z" nil "quit")
951   )
952
953   ;; from https://github.com/abo-abo/hydra/wiki/Emacs
954   (defhydra my/hydra-outline (:color pink :hint nil)
955   "
956 ^Hide^             ^Show^           ^Move
957 ^^^^^^------------------------------------------------------
958 _q_: sublevels     _a_: all         _u_: up
959 _t_: body          _e_: entry       _n_: next visible
960 _o_: other         _i_: children    _p_: previous visible
961 _c_: entry         _k_: branches    _f_: forward same level
962 _l_: leaves        _s_: subtree     _b_: backward same level
963 _d_: subtree
964
965 "
966   ;; Hide
967   ("q" outline-hide-sublevels)    ; Hide everything but the top-level headings
968   ("t" outline-hide-body)         ; Hide everything but headings (all body lines)
969   ("o" outline-hide-other)        ; Hide other branches
970   ("c" outline-hide-entry)        ; Hide this entry's body
971   ("l" outline-hide-leaves)       ; Hide body lines in this entry and sub-entries
972   ("d" outline-hide-subtree)      ; Hide everything in this entry and sub-entries
973   ;; Show
974   ("a" outline-show-all)          ; Show (expand) everything
975   ("e" outline-show-entry)        ; Show this heading's body
976   ("i" outline-show-children)     ; Show this heading's immediate child sub-headings
977   ("k" outline-show-branches)     ; Show all sub-headings under this heading
978   ("s" outline-show-subtree)      ; Show (expand) everything in this heading & below
979   ;; Move
980   ("u" outline-up-heading)                ; Up
981   ("n" outline-next-visible-heading)      ; Next
982   ("p" outline-previous-visible-heading)  ; Previous
983   ("f" outline-forward-same-level)        ; Forward - same level
984   ("b" outline-backward-same-level)       ; Backward - same level
985   ("z" nil "leave"))
986 )
987 #+END_SRC
988
989 ** Tramp
990 #+BEGIN_SRC emacs-lisp
991 (use-package tramp
992   :demand t
993   ; use the built in tramp
994   :straight nil
995   :config
996   (setq tramp-use-ssh-controlmaster-options nil)
997   (add-to-list 'tramp-methods '("vcsh"
998                                 (tramp-login-program "vcsh")
999                                 (tramp-login-args
1000                                  (("enter")
1001                                   ("%h")))
1002                                 (tramp-remote-shell "/bin/sh")
1003                                 (tramp-remote-shell-args
1004                                  ("-c")))))
1005 #+END_SRC
1006 ** Reftex
1007 #+BEGIN_SRC emacs-lisp
1008 (use-package reftex
1009   :config
1010   (setq-default reftex-default-bibliography
1011                   '("~/projects/research/references.bib")))
1012 #+END_SRC
1013 ** BibTex
1014 #+BEGIN_SRC emacs-lisp
1015 (use-package bibtex
1016   :config (setq bibtex-user-optional-fields
1017                 (quote (("annote" "Personal annotation (ignored)")
1018                         ("abstract" "")
1019                 ("pmid" "")
1020                 ("doi" ""))))
1021   )
1022
1023 #+END_SRC
1024 ** LaTeX
1025 #+BEGIN_SRC emacs-lisp
1026 (use-package tex-site
1027   :straight auctex
1028   :mode ("\\.tex\\'" . LaTeX-mode)
1029   :mode ("\\.bib\\'" . bibtex-mode)
1030   :config
1031   ; (add-to-list 'TeX-style-path '"/home/don/lib/emacs_el/auctex/style")
1032   ;; REFTEX (much enhanced management of cross-ref, labels, etc)
1033   ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/
1034   ; (autoload 'reftex-mode     "reftex" "RefTeX Minor Mode" t)
1035   ; (autoload 'turn-on-reftex  "reftex" "RefTeX Minor Mode" nil)
1036   ; (autoload 'reftex-citation "reftex-cite" "Make citation" nil)
1037   ; (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t)
1038   (add-hook 'LaTeX-mode-hook 'turn-on-reftex)   ; with AUCTeX LaTeX mode
1039   (add-hook 'latex-mode-hook 'turn-on-reftex)   ; with Emacs latex mode
1040   (add-hook 'LaTeX-mode-hook 'outline-minor-mode)   ; with AUCTeX LaTeX mode
1041   (add-hook 'latex-mode-hook 'outline-minor-mode)   ; with Emacs latex mode
1042
1043   (setq-default reftex-plug-into-AUCTeX t)
1044   ;; support fake section headers
1045   (setq TeX-outline-extra
1046         '(("%chapter" 1)
1047           ("%section" 2)
1048           ("%subsection" 3)
1049           ("%subsubsection" 4)
1050           ("%paragraph" 5)))
1051   ;; add font locking to the headers
1052   (font-lock-add-keywords
1053    'latex-mode
1054    '(("^%\\(chapter\\|\\(sub\\|subsub\\)?section\\|paragraph\\)"
1055       0 'font-lock-keyword-face t)
1056      ("^%chapter{\\(.*\\)}"       1 'font-latex-sectioning-1-face t)
1057      ("^%section{\\(.*\\)}"       1 'font-latex-sectioning-2-face t)
1058      ("^%subsection{\\(.*\\)}"    1 'font-latex-sectioning-3-face t)
1059      ("^%subsubsection{\\(.*\\)}" 1 'font-latex-sectioning-4-face t)
1060      ("^%paragraph{\\(.*\\)}"     1 'font-latex-sectioning-5-face t)))
1061
1062   ;; use smart quotes by default instead of `` and ''
1063   ;; taken from http://kieranhealy.org/esk/kjhealy.html
1064   (setq TeX-open-quote "“")
1065   (setq TeX-close-quote "”")
1066
1067   ;; (TeX-add-style-hook
1068   ;;  "latex"
1069   ;;  (lambda ()
1070   ;;    (TeX-add-symbols
1071   ;;     '("DLA" 1))))
1072   ;; (custom-set-variables
1073   ;;  '(font-latex-user-keyword-classes 
1074   ;;    '(("fixme" 
1075   ;;       ("DLA" "RZ")
1076   ;;       font-lock-function-name-face 2 (command 1 t))))
1077   ;; ) 
1078   (setq-default TeX-parse-self t)
1079   (setq-default TeX-auto-save t)
1080   (setq-default TeX-master nil)
1081   (add-to-list 'LaTeX-font-list
1082                '(?\C-a "\\alert{","}"))
1083   (eval-after-load
1084       "latex"
1085     '(TeX-add-style-hook
1086       "cleveref"
1087       (lambda ()
1088         (if (boundp 'reftex-ref-style-alist)
1089             (add-to-list
1090              'reftex-ref-style-alist
1091              '("Cleveref" "cleveref"
1092                (("\\cref" ?c) ("\\Cref" ?C) ("\\cpageref" ?d) ("\\Cpageref" ?D)))))
1093         (reftex-ref-style-activate "Cleveref")
1094         (TeX-add-symbols
1095          '("cref" TeX-arg-ref)
1096          '("Cref" TeX-arg-ref)
1097          '("cpageref" TeX-arg-ref)
1098          '("Cpageref" TeX-arg-ref)))))
1099   (eval-after-load
1100       "latex"
1101     '(add-to-list 'LaTeX-fill-excluded-macros
1102                   '("Sexpr")))
1103   
1104   (setq font-latex-match-reference-keywords
1105         '(
1106           ("fref" "{")
1107           ("Fref" "{")
1108           ("citep" "{")
1109           ("citet" "{")
1110           ("acs" "{")
1111           ("acsp" "{")
1112           ("ac" "{")
1113           ("acp" "{")
1114           ("acl" "{")
1115           ("aclp" "{")
1116           ("acsu" "{")
1117           ("aclu" "{")
1118           ("acused" "{")
1119           ("DLA" "{")
1120           ("RZ" "{")
1121           ("OM" "{")
1122           ("DL" "{")
1123           ("fixme" "{"))
1124         )
1125   (setq font-latex-fontify-script nil)
1126   (setq font-latex-fontify-sectioning (quote color))
1127   (setq font-latex-script-display (quote (nil)))
1128 )
1129
1130 #+END_SRC
1131 ** ESS
1132 #+BEGIN_SRC emacs-lisp
1133 (use-package ess
1134   :commands R
1135   :mode ("\\.R\\'" . ess-r-mode)
1136   :bind (:map ess-mode-map
1137               ("C-c C-R" . dla/ess-region-remote-eval))
1138   :init
1139   (autoload 'ess-r-mode "ess-site" nil t)
1140   (autoload 'R "ess-site" nil t)
1141   :config
1142   ; actually load the rest of ess
1143   (require 'ess-site)
1144   (defun ess-change-directory (path)
1145     "Set the current working directory to PATH for both *R* and Emacs."
1146     (interactive "Directory to change to: ")
1147
1148     (when (file-exists-p path)
1149       (ess-command (concat "setwd(\"" path "\")\n"))
1150       ;; use file-name-as-directory to ensure it has trailing /
1151       (setq default-directory (file-name-as-directory path))))
1152   (add-hook 'ess-mode-hook 'flyspell-prog-mode)
1153   ;; outlining support for ess modes
1154   (add-hook
1155    'ess-mode-hook
1156    '(lambda ()
1157       (outline-minor-mode)
1158       (setq outline-regexp "\\(^#\\{4,5\\} \\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function\\)")
1159       (defun outline-level ()
1160         (cond ((looking-at "^##### ") 1)
1161               ((looking-at "^#### ") 2)
1162               ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3)
1163               (t 1000)))
1164       ))
1165   (defun dla/ess-region-remote-eval (start end)
1166     "Evaluate region in a remote ESS instance"
1167     (interactive "r")
1168     (shell-command-on-region start end "eval_r" (get-buffer-create "***essregionremoteeval***") nil nil nil)
1169     (kill-buffer "***essregionremoteeval***"))
1170   ;; Don't restore history or save workspace image
1171   '(inferior-R-args "--no-restore-history --no-save")
1172   )
1173 #+END_SRC
1174
1175 ** Rainbowmode
1176 From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colorizes color strings
1177
1178 #+BEGIN_SRC emacs-lisp
1179 (use-package rainbow-mode
1180   ;; add ess to the x major mode
1181   :config (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S])
1182   (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R])
1183 )
1184 #+END_SRC
1185
1186 ** YAML Mode
1187 #+BEGIN_SRC emacs-lisp
1188 (use-package yaml-mode
1189   ;; add ess to the x major mode
1190   :mode ("\\.\\(yaml|yml\\)\\'" . yaml-mode)
1191 )
1192 #+END_SRC
1193
1194 ** Polymode
1195 #+BEGIN_SRC emacs-lisp
1196 (use-package poly-noweb
1197   :after polymode
1198
1199   )
1200 (use-package poly-markdown
1201   :after polymode
1202   )
1203 (use-package poly-R
1204   :after (:all polymode poly-markdown poly-noweb)
1205   :mode ("\\.Snw" . poly-noweb+r-mode)
1206   :mode ("\\.Rnw" . poly-noweb+r-mode)
1207   :mode ("\\.Rmd" . poly-markdown+r-mode)
1208   )
1209 (use-package polymode
1210   )
1211
1212 #+END_SRC
1213
1214 ** Outlining
1215 *** outline minor mode
1216 #+BEGIN_SRC emacs-lisp
1217 (use-package outline
1218    :straight nil
1219    :delight
1220    :init
1221    (setq outline-minor-mode-prefix "C-c C-2")
1222 )
1223 #+END_SRC
1224 *** outshine (outlining) integration
1225 #+BEGIN_SRC emacs-lisp
1226 (use-package outshine
1227   :after outline
1228   :hook (outline-minor-mode . outshine-mode)
1229 )
1230 #+END_SRC
1231 ** Writeroom Mode
1232 #+BEGIN_SRC emacs-lisp
1233 (use-package writeroom-mode
1234   :config
1235   (defun my/writing-mode ()
1236     "Start my writing mode; enable visual-line-mode and auto-fill-mode"
1237     (interactive)
1238     (if writeroom-mode
1239         (progn
1240           (writeroom-mode -1)
1241           (visual-line-mode -1)
1242           (auto-fill-mode -1)
1243           (visual-fill-column-mode -1)
1244           )
1245       (visual-line-mode 1)
1246       (auto-fill-mode 1)
1247       (visual-fill-column-mode 1)
1248       (writeroom-mode 1))
1249     )
1250   )
1251 #+END_SRC
1252 ** GhostText/Atomic Chrome
1253 #+BEGIN_SRC emacs-lisp
1254 (use-package atomic-chrome
1255   :config
1256   (ignore-errors (atomic-chrome-start-server))
1257   (setq atomic-chrome-buffer-open-style 'full)
1258   )
1259 #+END_SRC
1260 ** Edit Server
1261 #+BEGIN_SRC emacs-lisp
1262 (use-package edit-server
1263   :commands edit-server-start
1264   :init (if after-init-time
1265             (edit-server-start)
1266           (add-hook 'after-init-hook
1267                     #'(lambda() (edit-server-start))))
1268   :config (setq edit-server-new-frame-alist
1269                 '((name . "Edit with Emacs FRAME")
1270                   (top . 200)
1271                   (left . 200)
1272                   (width . 80)
1273                   (height . 25)
1274                   (minibuffer . t)
1275                   (menu-bar-lines . t)
1276                   (window-system . x)))
1277   )
1278 #+END_SRC
1279 ** Multiple Cursors
1280 [[https://github.com/magnars/multiple-cursors.el][Multiple Cursors]]
1281 #+BEGIN_SRC emacs-lisp
1282 (use-package multiple-cursors
1283   :bind* (("C-;" . mc/mark-all-dwim)
1284           ("C-<" . mc/mark-previous-like-this)
1285           ("C->" . mc/mark-next-like-this)
1286           ("C-S-c C-S-c" . mc/edit-lines))
1287   )
1288 #+END_SRC
1289 ** Web Mode
1290 #+BEGIN_SRC emacs-lisp
1291 (use-package web-mode
1292   :mode ("\\.\\(tx|tmpl\\)\\'" . web-mode)
1293   :config
1294   (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . web-mode))
1295   (setq web-mode-enable-engine-detection t)
1296   (setq web-mode-engines-alist
1297         '(("template-toolkit" . "\\.tmpl\\'")))
1298   )
1299 #+END_SRC
1300 ** Spamassassin Mode
1301 #+BEGIN_SRC emacs-lisp
1302 (use-package spamassassin-mode
1303   :straight nil
1304   :load-path "~/lib/emacs_el"
1305   :commands spamassassin-mode
1306   )
1307 #+END_SRC
1308 ** Password Store
1309 #+BEGIN_SRC emacs-lisp
1310 (use-package password-store
1311   :commands password-store-edit password-store-generate
1312   :config
1313   (defun dla/password-store-edit (entry)
1314     "Edit password for ENTRY which doesn't require it to already exist"
1315     (interactive (list (password-store--completing-read nil)))
1316     (password-store--run-edit entry))
1317   (advice-add 'password-store-edit :override #'dla/password-store-edit)
1318   )
1319 #+END_SRC
1320 ** CSS mode
1321 #+BEGIN_SRC emacs-lisp
1322 (use-package css
1323   :straight css-mode
1324   :mode "\\.css'"
1325   :config
1326   ;; fix up css mode to not be silly
1327   ;; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/
1328   (setq cssm-indent-level 4)
1329   (setq cssm-newline-before-closing-bracket t)
1330   (setq cssm-indent-function #'cssm-c-style-indenter)
1331   (setq cssm-mirror-mode nil))
1332 #+END_SRC
1333 ** Abbrev Mode
1334 #+BEGIN_SRC emacs-lisp
1335 (use-package abbrev
1336   :straight nil
1337   :delight abbrev-mode
1338   :config
1339   ;; load abbreviations from 
1340   (setq abbrev-file-name       
1341         "~/.emacs_abbrev_def")
1342
1343   ;; read the abbrev file if it exists
1344   (if (file-exists-p abbrev-file-name)
1345       (quietly-read-abbrev-file))
1346
1347   ;; for now, use abbrev mode everywhere
1348   :init 
1349   (setq default-abbrev-mode t))
1350 #+END_SRC
1351
1352 ** Debugging (realgud)
1353 #+BEGIN_SRC emacs-lisp
1354 (use-package realgud
1355   :commands (realgud:pdb realgud:gdb)
1356   )
1357 #+END_SRC
1358 ** Python Programming
1359 #+BEGIN_SRC emacs-lisp
1360 (use-package python-mode
1361   :delight Py 🐍
1362   :hook
1363   (python-mode . pyenv-mode)
1364   (python-mode . flycheck-mode)
1365   (python-mode . blacken-mode)
1366   (python-mode . yas-minor-mode)
1367   (python-mode . anaconda-mode)
1368   )
1369 (use-package pyenv-mode
1370   :after python-mode
1371   )
1372 (use-package blacken
1373   :delight ⚑
1374   :after python-mode
1375   :config
1376   (setq-default blacken-fast-unsafe t)
1377 )
1378 #+END_SRC
1379 *** Black
1380 #+begin_src emacs-lisp :tangle yes
1381 (use-package python-black
1382   :demand t
1383   :after python)
1384 #+end_src
1385 *** Sphinx Documentation
1386 #+begin_src emacs-lisp :tangle yes
1387 (use-package numpydoc
1388   :after python
1389   :bind (:map python-mode-map
1390               ("C-c C-n" . numpydoc-generate)))
1391 (use-package sphinx-doc
1392   :config
1393   (sphinx-doc-mode t)
1394   (setq sphinx-doc-include-types t)
1395   :after python
1396   :hook (python-mode . sphinx-doc)
1397   )
1398 (use-package python-docstring
1399   :delight 
1400   :after python
1401   :hook (python-mode . python-docstring-mode)
1402   )
1403 #+end_src
1404 ** Go language
1405 #+BEGIN_SRC emacs-lisp
1406 (use-package go-mode
1407              :delight "go"
1408              :mode "\\.go"
1409              )
1410 #+END_SRC
1411
1412 ** Expand region
1413 #+BEGIN_SRC emacs-lisp
1414 (use-package expand-region
1415   :bind (("C-=" . 'er/expand-region))
1416   )
1417 #+END_SRC
1418
1419 ** Dockerfile
1420 #+BEGIN_SRC emacs-lisp
1421 (use-package dockerfile-mode
1422   :mode "Dockerfile"
1423   )
1424 #+END_SRC
1425
1426 ** Beancount
1427 #+BEGIN_SRC emacs-lisp
1428 (use-package beancount
1429   :straight nil
1430   :load-path "~/lib/emacs_el/beancount-mode/"
1431   :mode "\\.beancount\\'"
1432   
1433   )
1434 #+END_SRC
1435 ** Apache
1436 #+BEGIN_SRC emacs-lisp
1437 (use-package apache-mode
1438   :delight 🪶
1439   :mode "apache\\.conf\\'"
1440   )
1441 #+END_SRC
1442 ** ELDoc
1443 #+BEGIN_SRC emacs-lisp
1444 (use-package eldoc
1445   :delight
1446   :commands eldoc-mode
1447   :straight nil
1448   )
1449 #+END_SRC
1450
1451 * Email
1452 ** Mutt
1453 *** Message-mode
1454 #+BEGIN_SRC emacs-lisp
1455 (use-package message
1456   :straight nil
1457   :delight (message "✉")
1458   :delight (message-mode "✉")
1459   :mode ("muttng-[a-z0-9]+-[0-9]+-" . message-mode)
1460   :mode ("mutt-[a-z0-9]+-[0-9]+-" . message-mode)
1461   :hook 'my/message-mode-settings
1462   :hook 'turn-on-flyspell
1463   :bind (:map message-mode-map
1464       ("C-c C-a" . my/post-attach-file)
1465       ("C-x p" . my/message-kill-buffer)
1466       )
1467   :config
1468   (defun my/message-mode-settings ()
1469     (font-lock-add-keywords nil
1470                 '(("^[ \t]*>[ \t]*>[ \t]*>.*$"
1471                (0 'message-multiply-quoted-text-face))
1472               ("^[ \t]*>[ \t]*>.*$"
1473                (0 'message-double-quoted-text-face))))
1474     )
1475   (defun my/message-kill-buffer ()
1476     (interactive)
1477     (kill-buffer nil)
1478     )
1479   (defun my/post-attach-file ()
1480     "Prompt for an attachment."
1481     (interactive)
1482     (let ((file (read-file-name "Attach file: " nil nil t nil)))
1483       (my/header-attach-file file "")))
1484
1485   (defun my/header-attach-file (file description)
1486     "Attach a FILE to the current message (works with Mutt).
1487   Argument DESCRIPTION MIME description."
1488     (interactive "fAttach file: \nsDescription: ")
1489     (when (> (length file) 0)
1490   (save-excursion
1491     (save-match-data
1492       (save-restriction
1493         (widen)
1494         (goto-char (point-min))
1495         (search-forward-regexp "^$")
1496         (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " "
1497                 description "\n"))
1498         (message (concat "Attached '" file "'."))
1499         (setq post-has-attachment t))))))
1500
1501   (setq mail-yank-prefix "> ")
1502   (setq mail-header-separator "") ; fix broken header detection
1503 )
1504 #+END_SRC
1505 *** Muttrc mode
1506 #+BEGIN_SRC emacs-lisp
1507 (use-package mutt-mode
1508   :mode "muttngrc"
1509   :mode "muttrc"
1510 )
1511 #+END_SRC
1512 *** Set mail User agent
1513 #+BEGIN_SRC emacs-lisp
1514 (setq mail-user-agent (quote sendmail-user-agent))
1515 #+END_SRC
1516 *** Mail aliases
1517 #+BEGIN_SRC emacs-lisp
1518 ; (use-package
1519 ;   :straight t
1520 ;   :hook message
1521 ;   :config
1522 ;   (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases")))
1523 ; )
1524 #+END_SRC
1525 * Base emacs
1526 ** Reverting buffers
1527 #+BEGIN_SRC emacs-lisp
1528 (use-package autorevert
1529   :delight auto-revert-mode
1530   :config
1531   (setq global-auto-revert-non-file-buffers t
1532         global-auto-revert-ignore-modes '(pdf-view-mode)
1533         auto-revert-verbose nil)
1534   (global-auto-revert-mode 1))
1535 #+END_SRC
1536 * Org Mode
1537 ** Use-package and load things
1538 #+BEGIN_SRC emacs-lisp
1539
1540 (use-package org
1541   :delight (org-mode "ø")
1542   :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode)
1543   :bind (("C-c l"  . org-store-link)
1544          ("C-c a"  . org-agenda)
1545          ("C-c b"  . org-iswitchb))
1546 #+END_SRC
1547 ** Agenda Configuration
1548 #+BEGIN_SRC emacs-lisp
1549   :config
1550   (setq-default org-log-done 'time)
1551   (setq-default org-agenda-ndays 5)
1552
1553   (setq org-agenda-sticky t)
1554   (defun dla/show-org-agenda ()
1555     (interactive)
1556     (let (agendabuffer
1557           '(delq nil 
1558                 (mapcar (lambda (x)
1559                           (and (string-match-p
1560                                 "\*Org Agenda.*\*"
1561                                 (buffer-name x))
1562                                x)
1563                           )
1564                         (buffer-list))))
1565       (if agendabuffer
1566           (switch-to-buffer
1567            (buffer-name agendabuffer))
1568         (org-agenda-list)))
1569       (delete-other-windows))
1570
1571   ;; agenda configuration
1572   ;; Do not dim blocked tasks
1573   (setq org-agenda-dim-blocked-tasks nil)
1574   (setq org-agenda-inhibit-startup t)
1575   (setq org-agenda-use-tag-inheritance nil)
1576
1577   ;; Compact the block agenda view
1578   (setq org-agenda-compact-blocks t)
1579
1580   ;; Custom agenda command definitions
1581   (setq org-agenda-custom-commands
1582         (quote (("N" "Notes" tags "NOTE"
1583                  ((org-agenda-overriding-header "Notes")
1584                   (org-tags-match-list-sublevels t)))
1585                 ("h" "Habits" tags-todo "STYLE=\"habit\""
1586                  ((org-agenda-overriding-header "Habits")
1587                   (org-agenda-sorting-strategy
1588                    '(todo-state-down effort-up category-keep))))
1589                 (" " "Agenda"
1590                  ((agenda "" nil)
1591                   (tags "REFILE"
1592                         ((org-agenda-overriding-header "Tasks to Refile")
1593                          (org-tags-match-list-sublevels nil)))
1594                   (tags-todo "-CANCELLED/!"
1595                              ((org-agenda-overriding-header "Stuck Projects")
1596                               (org-agenda-skip-function 'bh/skip-non-stuck-projects)
1597                               (org-agenda-sorting-strategy
1598                                '(category-keep))))
1599                   (tags-todo "-HOLD-CANCELLED/!"
1600                              ((org-agenda-overriding-header "Projects")
1601                               (org-agenda-skip-function 'bh/skip-non-projects)
1602                               (org-tags-match-list-sublevels 'indented)
1603                               (org-agenda-sorting-strategy
1604                                '(category-keep))))
1605                   (tags-todo "-CANCELLED/!NEXT"
1606                              ((org-agenda-overriding-header (concat "Project Next Tasks"
1607                                                                     (if bh/hide-scheduled-and-waiting-next-tasks
1608                                                                         ""
1609                                                                       " (including WAITING and SCHEDULED tasks)")))
1610                               (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
1611                               (org-tags-match-list-sublevels t)
1612                               (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
1613                               (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
1614                               (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
1615                               (org-agenda-sorting-strategy
1616                                '(todo-state-down effort-up category-keep))))
1617                   (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!"
1618                              ((org-agenda-overriding-header (concat "Project Subtasks"
1619                                                                     (if bh/hide-scheduled-and-waiting-next-tasks
1620                                                                         ""
1621                                                                       " (including WAITING and SCHEDULED tasks)")))
1622                               (org-agenda-skip-function 'bh/skip-non-project-tasks)
1623                               (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
1624                               (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
1625                               (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
1626                               (org-agenda-sorting-strategy
1627                                '(category-keep))))
1628                   (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!"
1629                              ((org-agenda-overriding-header (concat "Standalone Tasks"
1630                                                                     (if bh/hide-scheduled-and-waiting-next-tasks
1631                                                                         ""
1632                                                                       " (including WAITING and SCHEDULED tasks)")))
1633                               (org-agenda-skip-function 'bh/skip-project-tasks)
1634                               (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
1635                               (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
1636                               (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
1637                               (org-agenda-sorting-strategy
1638                                '(category-keep))))
1639                   (tags-todo "-CANCELLED+WAITING|HOLD/!"
1640                              ((org-agenda-overriding-header "Waiting and Postponed Tasks")
1641                               (org-agenda-skip-function 'bh/skip-stuck-projects)
1642                               (org-tags-match-list-sublevels nil)
1643                               (org-agenda-todo-ignore-scheduled t)
1644                               (org-agenda-todo-ignore-deadlines t)))
1645                   (tags "-REFILE/"
1646                         ((org-agenda-overriding-header "Tasks to Archive")
1647                          (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
1648                          (org-tags-match-list-sublevels nil))))
1649                  nil))))
1650
1651   ; org mode agenda files
1652   (setq org-agenda-files
1653         (append
1654         (file-expand-wildcards "~/projects/org-notes/*.org")
1655         (file-expand-wildcards "~/org-mode/from-mobile.org")
1656         (file-expand-wildcards "~/org-notes-*/*.org")
1657         )
1658   )
1659   (setq my/org-refile-file
1660         (car (seq-filter
1661               (lambda (file) (string-match-p (regexp-quote "/refile.org") file))
1662               org-agenda-files)))
1663
1664   (set-register ?n (cons 'file "~/projects/org-notes/notes.org"))
1665   (set-register ?r (cons 'file my/org-refile-file))
1666   (set-register ?o (cons 'file "~/projects/org-notes/ool.org"))
1667   (set-register ?s (cons 'file "~/projects/org-notes/sndservers.org"))
1668   (set-register ?c (cons 'file "~/projects/org-notes/chaim.org"))
1669   (set-register ?w (cons 'file "~/projects/org-notes/wildman.org"))
1670   (set-register ?u (cons 'file "~/projects/org-notes/uddin.org"))
1671   (set-register ?R (cons 'file "~/projects/reviews/reviews.org"))
1672   (set-register ?d (cons 'file "~/projects/org-notes/diary.org"))
1673   ; from https://emacs.stackexchange.com/questions/909/how-can-i-have-an-agenda-timeline-view-of-multiple-files
1674   ; (defun org-agenda-timeline-all (&optional arg)
1675   ;   (interactive "P")
1676   ;   (with-temp-buffer
1677   ;     (dolist (org-agenda-file org-agenda-files)
1678   ;       (insert-file-contents org-agenda-file nil)
1679   ;       (goto-char (point-max))
1680   ;       (newline))
1681   ;     (write-file "/tmp/timeline.org")
1682   ;     (org-agenda arg "L")))
1683   ; (define-key org-mode-map (kbd "C-c t") 'org-agenda-timeline-all)
1684
1685 #+END_SRC
1686 ** General config
1687 #+BEGIN_SRC emacs-lisp
1688   (setq org-global-properties '(("Effort_ALL 0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00")))
1689   (setq org-columns-default-format "%40ITEM(Task) %6Effort{:} %CLOCKSUM %PRIORITY %TODO %13SCHEDULED %13DEADLINE %TAGS")
1690
1691   (setq org-default-notes-file "~/projects/org-notes/notes.org")
1692   (setq org-id-link-to-org-use-id 'use-existing)
1693 #+END_SRC
1694 ** Capture Templates
1695 #+BEGIN_SRC emacs-lisp
1696   (setq org-capture-templates  ;; mail-specific note template, identified by "m"
1697         `(("m" "Mail" entry (file my/org-refile-file)
1698            "* %?\n\n  Source: %u, [[%:link][%:description]]\n  %:initial")
1699           ("t" "todo" entry (file my/org-refile-file)
1700            "* TODO %?\n  :PROPERTIES:\n  :END:\n  :LOGBOOK:\n  :END:\n%U\n%a\n" :clock-in t :clock-resume t)
1701           ("r" "respond" entry (file my/org-refile-file)
1702            "* NEXT Respond to %:from on %:subject\nSCHEDULED: %t\n%U\n%a\n" :clock-in t :clock-resume t :immediate-finish t)
1703           ("n" "note" entry (file my/org-refile-file)
1704            "* %? :NOTE:\n%U\n%a\n" :clock-in t :clock-resume t)
1705           ("s" "schedule" entry (file my/org-refile-file)
1706            "* %? :cal:\n%^{scheduled:}t\n%U\n%a\n" :clock-in t :clock-resume t)
1707           ("j" "Journal" entry (file+datetree "~/projects/org-notes/diary.org")
1708            "* %?\n%U\n" :clock-in t :clock-resume t)
1709           ("w" "org-protocol" entry (file my/org-refile-file)
1710            "* TODO Review %c\n%U\n" :immediate-finish t)
1711           ("M" "Meeting" entry (file my/org-refile-file)
1712            "* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t)
1713           ("S" "Seminar" entry (file my/org-refile-file)
1714            "* SEMINAR notes %? :SEMINAR:\n%U" :clock-in t :clock-resume t)
1715           ("P" "Paper to read" entry (file+headline "~/projects/research/papers_to_read.org" "Refile")
1716            "* TODO Get/Read %? \n%U" :clock-in t :clock-resume t)
1717           ("p" "Phone call" entry (file my/org-refile-file)
1718            "* PHONE %? :PHONE:\n%U" :clock-in t :clock-resume t)
1719            ("J" "job" entry (file+olp "~/projects/org-notes/notes.org"
1720                                        "Jobs"
1721                                        ,(format-time-string "Positions %Y"))
1722            "* TODO Apply for %? :job:\nSCHEDULED: <%<%Y-%m-%d>>\n%U\n%x\n" :clock-in t :clock-resume t)
1723           ("h" "Habit" entry (file my/org-refile-file)
1724            "* 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")
1725           )
1726         )
1727
1728   ;; Remove empty LOGBOOK drawers on clock out
1729   (defun bh/remove-empty-drawer-on-clock-out ()
1730     (interactive)
1731     (save-excursion
1732       (beginning-of-line 0)
1733       (org-remove-empty-drawer-at (point))))
1734
1735   (defun my/org-add-id ()
1736     (interactive)
1737     (save-excursion
1738       (if (org-current-level)
1739           ()
1740         (forward-char 1)
1741         )
1742       (org-id-get-create)
1743       )
1744   )
1745
1746 #+END_SRC
1747 ** Org mode key bindings
1748 #+BEGIN_SRC emacs-lisp
1749   ;; org mode configuration from http://doc.norang.ca/org-mode.html
1750   ;; Custom Key Bindings
1751   :bind* (("<f9> a" . org-agenda)
1752           ("<f9> I" . bh/punch-in)
1753           ("<f9> O" . bh/punch-out)
1754           ("<f9> SPC" . bh/clock-in-last-task)
1755           ("<f12>" . dla/show-org-agenda)
1756           ;; ("<f5>" . bh/org-todo)
1757           ("<S-f5>" . bh/widen)
1758           ("<f7>" . bh/set-truncate-lines)
1759           ("<f8>" . org-cycle-agenda-files)
1760           ("<f9> <f9>" . dla/show-org-agenda)
1761           ("<f9> b" . bbdb)
1762           ("<f9> c" . calendar)
1763           ("<f9> f" . boxquote-insert-file)
1764           ("<f9> h" . bh/hide-other)
1765           ("<f9> n" . bh/toggle-next-task-display)
1766           ("<f9> w" . widen)
1767
1768           ("<f9> r" . boxquote-region)
1769           ("<f9> s" . bh/switch-to-scratch)
1770
1771           ("<f9> t" . bh/insert-inactive-timestamp)
1772           ("<f9> T" . bh/toggle-insert-inactive-timestamp)
1773
1774           ("<f9> v" . visible-mode)
1775           ("<f9> l" . org-toggle-link-display)
1776           ("<f9> SPC" . bh/clock-in-last-task)
1777           ("C-<f9>" . previous-buffer)
1778           ("M-<f9>" . org-toggle-inline-images)
1779           ("C-x n r" . narrow-to-region)
1780           ("C-<f10>" . next-buffer)
1781           ("<f11>" . org-clock-goto)
1782           ("C-<f11>" . org-clock-in)
1783           ("C-s-<f12>" . bh/save-then-publish)
1784           ("C-c c" . org-capture))
1785   :config
1786 #+END_SRC
1787 ** Utility Functions
1788 #+BEGIN_SRC emacs-lisp
1789 (defun bh/hide-other ()
1790   (interactive)
1791   (save-excursion
1792     (org-back-to-heading 'invisible-ok)
1793     (outline-hide-other)
1794     (org-cycle)
1795     (org-cycle)
1796     (org-cycle)))
1797
1798 (defun bh/set-truncate-lines ()
1799   "Toggle value of truncate-lines and refresh window display."
1800   (interactive)
1801   (setq truncate-lines (not truncate-lines))
1802   ;; now refresh window display (an idiom from simple.el):
1803   (save-excursion
1804     (set-window-start (selected-window)
1805                       (window-start (selected-window)))))
1806
1807 (defun bh/switch-to-scratch ()
1808   (interactive)
1809   (switch-to-buffer "*scratch*"))
1810
1811 (setq org-use-fast-todo-selection t)
1812 (setq org-treat-S-cursor-todo-selection-as-state-change nil)
1813
1814 ; create function to create headlines in file. This comes from
1815 ; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode
1816 (defun my/org-add-ids-to-headlines-in-file ()
1817   "Add ID properties to all headlines in the current file which
1818 do not already have one."
1819   (interactive)
1820   (save-excursion
1821     (widen)
1822     (goto-char (point-min))
1823     (when (not (re-search-forward "^#\\+OPTIONS:.*auto-id:f" (point-max) t))
1824       (org-map-entries 'org-id-get-create))))
1825 (defun dla/org-update-ids-to-headlines-in-file ()
1826   "Add or replace ID properties to all headlines in the current file 
1827 (or narrowed region)."
1828   (interactive)
1829
1830   (org-map-entries '(lambda () (org-id-get-create t))))
1831 ; if we wanted to do this to every buffer, do the following:
1832 (add-hook 'org-mode-hook
1833           (lambda ()
1834             (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))
1835 #+END_SRC
1836 ** Org ID locations
1837 #+BEGIN_SRC emacs-lisp
1838 (use-package find-lisp
1839   :demand t)
1840 (setq org-agenda-text-search-extra-files
1841       (append '(agenda-archives)
1842               (find-lisp-find-files "~/projects/org-notes" "\.org$")
1843               (find-lisp-find-files "~/projects/org-notes" "\.org_archive$")
1844               ))
1845 #+END_SRC
1846 ** Keywords (TODO)
1847 #+BEGIN_SRC emacs-lisp
1848 (setq org-todo-keywords
1849       (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
1850               (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
1851
1852 (setq org-todo-keyword-faces
1853       (quote (("TODO" :foreground "red" :weight bold)
1854               ("NEXT" :foreground "blue" :weight bold)
1855               ("DONE" :foreground "forest green" :weight bold)
1856               ("WAITING" :foreground "orange" :weight bold)
1857               ("HOLD" :foreground "magenta" :weight bold)
1858               ("CANCELLED" :foreground "forest green" :weight bold)
1859               ("MEETING" :foreground "forest green" :weight bold)
1860               ("PHONE" :foreground "forest green" :weight bold))))
1861
1862 (setq org-todo-state-tags-triggers
1863       (quote (("CANCELLED" ("CANCELLED" . t))
1864               ("WAITING" ("WAITING" . t))
1865               ("HOLD" ("WAITING") ("HOLD" . t))
1866               (done ("WAITING") ("HOLD"))
1867               ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
1868               ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
1869               ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
1870
1871
1872
1873 ; (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
1874 ; add ids on creation of nodes
1875 (add-hook 'org-capture-prepare-finalize-hook 'my/org-add-id)
1876
1877
1878 ; resolve clocks after 10 minutes of idle; use xprintidle
1879 ; (setq org-clock-idle-time 10)
1880 ; (setq org-clock-x11idle-program-name "xprintidle")
1881
1882 ; this is from http://doc.norang.ca/org-mode.html#Capture
1883 ; use C-M-r for org mode capture
1884 (global-set-key (kbd "C-M-r") 'org-capture)
1885
1886 ; Targets include this file and any file contributing to the agenda - up to 9 levels deep
1887 (setq org-refile-targets (quote ((nil :maxlevel . 9)
1888                                  (org-agenda-files :maxlevel . 9))))
1889
1890 ; Use full outline paths for refile targets - we file directly with IDO
1891 (setq org-refile-use-outline-path t)
1892
1893 ; Targets complete directly with IDO
1894 (setq org-outline-path-complete-in-steps nil)
1895
1896 ; Allow refile to create parent tasks with confirmation
1897 (setq org-refile-allow-creating-parent-nodes (quote confirm))
1898
1899 ; ; Use IDO for both buffer and file completion and ido-everywhere to t
1900 ; (setq org-completion-use-ido t)
1901 ; (setq ido-everywhere t)
1902 ; (setq ido-max-directory-size 100000)
1903 ; (ido-mode (quote both))
1904 ; ; Use the current window when visiting files and buffers with ido
1905 ; (setq ido-default-file-method 'selected-window)
1906 ; (setq ido-default-buffer-method 'selected-window)
1907 ; ; Use the current window for indirect buffer display
1908 ; (setq org-indirect-buffer-display 'current-window)
1909
1910
1911 ;;;; Refile settings
1912 ; Exclude DONE state tasks from refile targets
1913 (defun bh/verify-refile-target ()
1914   "Exclude todo keywords with a done state from refile targets"
1915   (not (member (nth 2 (org-heading-components)) org-done-keywords)))
1916
1917 (setq org-refile-target-verify-function 'bh/verify-refile-target)
1918
1919 ;; ensure that emacsclient will show just the note to be edited when invoked
1920 ;; from Mutt, and that it will shut down emacsclient once finished;
1921 ;; fallback to legacy behavior when not invoked via org-protocol.
1922 (require 'org-protocol)
1923 ; (add-hook 'org-capture-mode-hook 'delete-other-windows)
1924 (setq my-org-protocol-flag nil)
1925 (defadvice org-capture-finalize (after delete-frame-at-end activate)
1926   "Delete frame at remember finalization"
1927   (progn (if my-org-protocol-flag (delete-frame))
1928          (setq my-org-protocol-flag nil)))
1929 (defadvice org-capture-refile (around delete-frame-after-refile activate)
1930   "Delete frame at remember refile"
1931   (if my-org-protocol-flag
1932       (progn
1933         (setq my-org-protocol-flag nil)
1934         ad-do-it
1935         (delete-frame))
1936     ad-do-it)
1937   )
1938 (defadvice org-capture-kill (after delete-frame-at-end activate)
1939   "Delete frame at remember abort"
1940   (progn (if my-org-protocol-flag (delete-frame))
1941          (setq my-org-protocol-flag nil)))
1942 (defadvice org-protocol-capture (before set-org-protocol-flag activate)
1943   (setq my-org-protocol-flag t))
1944
1945 (defadvice org-insert-todo-heading (after dla/create-id activate)
1946   (unless (org-in-item-p)
1947     (org-id-get-create)
1948     )
1949   )
1950
1951 ;; org modules
1952 (add-to-list 'org-modules 'org-habit)
1953
1954 ; this comes from http://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/
1955 (defun open-mail-in-mutt (message)
1956   "Open a mail message in Mutt, using an external terminal.
1957
1958 Message can be specified either by a path pointing inside a
1959 Maildir, or by Message-ID."
1960   (interactive "MPath or Message-ID: ")
1961   (shell-command
1962    (format "faf xterm -e \"%s %s\""
1963        (substitute-in-file-name "$HOME/bin/mutt_open") message)))
1964
1965 ;; add support for "mutt:ID" links
1966 (org-add-link-type "mutt" 'open-mail-in-mutt)
1967
1968 (defun my-org-mode-setup ()
1969   ; (load-library "reftex")
1970   (and (buffer-file-name)
1971        (file-exists-p (buffer-file-name))
1972        (progn
1973          ; (reftex-parse-all)
1974          (reftex-set-cite-format
1975           '((?b . "[[bib:%l][%l-bib]]")
1976             (?n . "[[notes:%l][%l-notes]]")
1977             (?c . "\\cite{%l}")
1978             (?h . "*** %t\n:PROPERTIES:\n:Custom_ID: %l\n:END:\n[[papers:%l][%l xoj]] [[papers-pdf:%l][pdf]]")))
1979          ))
1980   (define-key org-mode-map (kbd "C-c )") 'reftex-citation)
1981   (define-key org-mode-map (kbd "C-c [") 'reftex-citation)
1982   (define-key org-mode-map (kbd "C-c (") 'org-mode-reftex-search)
1983   (define-key org-mode-map (kbd "C-c 0") 'reftex-view-crossref)
1984   )
1985 (add-hook 'org-mode-hook 'my-org-mode-setup)
1986
1987 (defun org-mode-reftex-search ()
1988   (interactive)
1989   (org-open-link-from-string (format "[[notes:%s]]" (first (reftex-citation t)))))
1990
1991 (defun open-research-paper (bibtexkey)
1992   "Open a paper by bibtex key"
1993   (interactive "bibtex key: ")
1994   (shell-command
1995    (format "%s %s"
1996        (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
1997 (org-add-link-type "papers" 'open-research-paper)
1998 (defun open-research-paper-pdf (bibtexkey)
1999   "Open a paper pdf by bibtex key"
2000   (interactive "bibtex key: ")
2001   (shell-command
2002    (format "%s -p evince_annot %s"
2003        (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
2004 (org-add-link-type "papers-pdf" 'open-research-paper-pdf)
2005
2006 (add-to-list 'org-link-abbrev-alist
2007              '("notes" .
2008                "~/projects/research/paper_notes.org::#%s"))
2009
2010 ; I pretty much always want hiearchical checkboxes
2011 (setq org-hierachical-checkbox-statistics nil)
2012
2013 ;; Add \begin{equation}\end{equation} templates to the org mode easy templates
2014 (add-to-list 'org-structure-template-alist
2015              '("E" "\\begin{equation}\n?\n\\end{equation}"))
2016
2017  ;; stolen from
2018 ;; http://www-public.it-sudparis.eu/~berger_o/weblog/2012/03/23/how-to-manage-and-export-bibliographic-notesrefs-in-org-mode/
2019 (defun my-rtcite-export-handler (path desc format)
2020   (message "my-rtcite-export-handler is called : path = %s, desc = %s, format = %s" path desc format)
2021   (let* ((search (when (string-match "::#?\\(.+\\)\\'" path)
2022                    (match-string 1 path)))
2023          (path (substring path 0 (match-beginning 0))))
2024     (cond ((eq format 'latex)
2025            (if (or (not desc) 
2026                    (equal 0 (search "rtcite:" desc)))
2027                (format "\\cite{%s}" search)
2028              (format "\\cite[%s]{%s}" desc search))))))
2029
2030 (org-add-link-type "rtcite" 
2031                    'org-bibtex-open
2032                    'my-rtcite-export-handler)
2033
2034
2035 #+END_SRC
2036 ** Org Mobile Configuration
2037 #+BEGIN_SRC emacs-lisp
2038   (setq-default org-mobile-directory "/linnode.donarmstrong.com:/sites/dav.donarmstrong.com/root/org/")
2039   (when (string= system-name "linnode")
2040     (setq-default org-mobile-directory "/sites/dav.donarmstrong.com/root/org/"))
2041   (setq-default org-directory "/home/don/org-mode/")
2042   (setq-default org-mobile-inbox-for-pull "/home/don/org-mode/from-mobile.org")
2043
2044 #+END_SRC
2045 ** Org iCal Support
2046 #+BEGIN_SRC emacs-lisp
2047   ;; org mode ical export
2048   (setq org-icalendar-timezone "America/Los_Angeles")
2049   (setq org-icalendar-use-scheduled '(todo-start event-if-todo))
2050   ;; we already add the id manually
2051   (setq org-icalendar-store-UID t)
2052
2053 #+END_SRC
2054 ** General Org Babel Configuration
2055 #+BEGIN_SRC emacs-lisp
2056 ;; org babel support
2057 (org-babel-do-load-languages
2058  'org-babel-load-languages
2059  '((emacs-lisp . t )
2060    (R . t)
2061    (latex . t)
2062    (ditaa . t)
2063    (dot . t)
2064    ))
2065 ;; set the right path to ditaa.jar
2066 (setq org-ditaa-jar-path "/usr/share/ditaa/ditaa.jar")
2067 ;; use graphviz-dot for dot things
2068 (add-to-list 'org-src-lang-modes '("dot" . graphviz-dot))
2069 ;; do not indent begin_src blocks
2070 (setq org-edit-src-content-indentation 0)
2071 ;; org-babel-by-backend
2072 (defmacro org-babel-by-backend (&rest body)
2073    `(case (if (boundp 'backend) 
2074               (org-export-backend-name backend)
2075             nil) ,@body))
2076
2077 (defun my/fix-inline-images ()
2078   (when org-inline-image-overlays
2079     (org-redisplay-inline-images)))
2080
2081 (add-hook 'org-babel-after-execute-hook
2082            'my/fix-inline-images)
2083
2084 #+END_SRC
2085 ** LaTeX configuration
2086 #+BEGIN_SRC emacs-lisp
2087 (use-package org-contrib
2088   :no-require t
2089   :after org
2090   :config
2091   (require 'ox-extra)
2092   (ox-extras-activate '(latex-header-blocks ignore-headlines))
2093   (require 'ox-latex)
2094 (add-to-list 'org-latex-classes
2095          '("memarticle"
2096        "\\documentclass[11pt,oneside,article]{memoir}\n"
2097        ("\\section{%s}" . "\\section*{%s}")
2098        ("\\subsection{%s}" . "\\subsection*{%s}")
2099        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
2100        ("\\paragraph{%s}" . "\\paragraph*{%s}")
2101        ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
2102
2103 (setq org-beamer-outline-frame-options "")
2104 (add-to-list 'org-latex-classes
2105          '("beamer"
2106        "\\documentclass[ignorenonframetext]{beamer}
2107 [NO-DEFAULT-PACKAGES]
2108 [PACKAGES]
2109 [EXTRA]"
2110        ("\\section{%s}" . "\\section*{%s}")
2111        ("\\subsection{%s}" . "\\subsection*{%s}")
2112        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
2113        ("\\paragraph{%s}" . "\\paragraph*{%s}")
2114        ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
2115
2116 (add-to-list 'org-latex-classes
2117          '("membook"
2118        "\\documentclass[11pt,oneside]{memoir}\n"
2119        ("\\chapter{%s}" . "\\chapter*{%s}")
2120        ("\\section{%s}" . "\\section*{%s}")
2121        ("\\subsection{%s}" . "\\subsection*{%s}")
2122        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
2123
2124 (add-to-list 'org-latex-classes
2125          '("letter"
2126        "\\documentclass[11pt]{letter}
2127 [NO-DEFAULT-PACKAGES]
2128 [PACKAGES]
2129 [EXTRA]"
2130    ("\\section{%s}" . "\\section*{%s}")
2131        ("\\subsection{%s}" . "\\subsection*{%s}")
2132        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
2133        ("\\paragraph{%s}" . "\\paragraph*{%s}")
2134        ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
2135
2136 (add-to-list 'org-latex-classes
2137          '("dlacv"
2138        "\\documentclass{dlacv}
2139 [NO-DEFAULT-PACKAGES]
2140 [NO-PACKAGES]
2141 [NO-EXTRA]"
2142        ("\\section{%s}" . "\\section*{%s}")
2143        ("\\subsection{%s}" . "\\subsection*{%s}")
2144        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
2145        ("\\paragraph{%s}" . "\\paragraph*{%s}")
2146        ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
2147
2148
2149 (add-to-list 'org-latex-classes
2150          '("dlaresume"
2151        "\\documentclass{dlaresume}
2152 [NO-DEFAULT-PACKAGES]
2153 [NO-PACKAGES]
2154 [NO-EXTRA]"
2155        ("\\section{%s}" . "\\section*{%s}")
2156        ("\\subsection{%s}" . "\\subsection*{%s}")
2157        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
2158        ("\\paragraph{%s}" . "\\paragraph*{%s}")
2159        ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
2160
2161
2162 ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
2163 ;; but adapted to use latexmk 4.22 or higher.  
2164 (setq org-latex-pdf-process '("latexmk -f -pdflatex=xelatex -bibtex -use-make -pdf %f"))
2165
2166 ;; Default packages included in /every/ tex file, latex, pdflatex or xelatex
2167 (setq org-latex-default-packages-alist
2168   '(("" "amsmath" t)
2169     ("" "unicode-math" t)
2170     ))
2171 (setq org-latex-packages-alist
2172   '(("" "graphicx" t)
2173     ("" "fontspec" t)
2174     ("" "xunicode" t)
2175     ("" "hyperref" t)
2176     ("" "url" t)
2177     ("" "rotating" t)
2178     ("" "longtable" nil)
2179     ("" "float" )))
2180
2181 ;; make equations larger
2182 (setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0))
2183
2184 (defun org-create-formula--latex-header ()
2185   "Return LaTeX header appropriate for previewing a LaTeX snippet."
2186   (let ((info (org-combine-plists (org-export--get-global-options
2187            (org-export-get-backend 'latex))
2188           (org-export--get-inbuffer-options
2189            (org-export-get-backend 'latex)))))
2190     (org-latex-guess-babel-language
2191      (org-latex-guess-inputenc
2192   (org-splice-latex-header
2193    org-format-latex-header
2194    org-latex-default-packages-alist
2195    nil t
2196    (plist-get info :latex-header)))
2197      info)))
2198
2199
2200 ; support ignoring headers in org mode export to latex
2201 ; from http://article.gmane.org/gmane.emacs.orgmode/67692
2202 (defadvice org-latex-headline (around my-latex-skip-headlines
2203                   (headline contents info) activate)
2204   (if (member "ignoreheading" (org-element-property :tags headline))
2205   (setq ad-return-value contents)
2206     ad-do-it))
2207
2208 ;; keep latex logfiles
2209
2210 (setq org-latex-remove-logfiles nil)
2211 )
2212
2213 ;; Resume clocking task when emacs is restarted
2214 (org-clock-persistence-insinuate)
2215 ;;
2216 ;; Show lot of clocking history so it's easy to pick items off the C-F11 list
2217 (setq org-clock-history-length 23)
2218 ;; Resume clocking task on clock-in if the clock is open
2219 (setq org-clock-in-resume t)
2220 ;; Change tasks to NEXT when clocking in; this avoids clocking in when
2221 ;; there are things like PHONE calls
2222 (setq org-clock-in-switch-to-state 'bh/clock-in-to-next)
2223 ;; Separate drawers for clocking and logs
2224 (setq org-drawers (quote ("PROPERTIES" "LOGBOOK")))
2225 ;; Save clock data and state changes and notes in the LOGBOOK drawer
2226 (setq org-clock-into-drawer t)
2227 (setq org-log-into-drawer t)
2228 ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration
2229 (setq org-clock-out-remove-zero-time-clocks t)
2230 ;; Clock out when moving task to a done state
2231 (setq org-clock-out-when-done t)
2232 ;; Save the running clock and all clock history when exiting Emacs, load it on startup
2233 (setq org-clock-persist t)
2234 ;; Do not prompt to resume an active clock
2235 (setq org-clock-persist-query-resume nil)
2236 ;; Enable auto clock resolution for finding open clocks
2237 (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
2238 ;; Include current clocking task in clock reports
2239 (setq org-clock-report-include-clocking-task t)
2240
2241 ;; the cache seems to be broken
2242 (setq org-element-use-cache nil)
2243
2244 (defvar bh/keep-clock-running nil)
2245
2246 (defun bh/is-task-p ()
2247   "Any task with a todo keyword and no subtask"
2248   (save-restriction
2249     (widen)
2250     (let ((has-subtask)
2251           (subtree-end (save-excursion (org-end-of-subtree t)))
2252           (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
2253       (save-excursion
2254         (forward-line 1)
2255         (while (and (not has-subtask)
2256                     (< (point) subtree-end)
2257                     (re-search-forward "^\*+ " subtree-end t))
2258           (when (member (org-get-todo-state) org-todo-keywords-1)
2259             (setq has-subtask t))))
2260       (and is-a-task (not has-subtask)))))
2261 (defun bh/is-project-p ()
2262   "Any task with a todo keyword subtask"
2263   (save-restriction
2264     (widen)
2265     (let ((has-subtask)
2266           (subtree-end (save-excursion (org-end-of-subtree t)))
2267           (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
2268       (save-excursion
2269         (forward-line 1)
2270         (while (and (not has-subtask)
2271                     (< (point) subtree-end)
2272                     (re-search-forward "^\*+ " subtree-end t))
2273           (when (member (org-get-todo-state) org-todo-keywords-1)
2274             (setq has-subtask t))))
2275       (and is-a-task has-subtask))))
2276
2277 (defun bh/is-subproject-p ()
2278   "Any task which is a subtask of another project"
2279   (let ((is-subproject)
2280         (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
2281     (save-excursion
2282       (while (and (not is-subproject) (org-up-heading-safe))
2283         (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
2284           (setq is-subproject t))))
2285     (and is-a-task is-subproject)))
2286
2287
2288 (defun bh/clock-in-to-next (kw)
2289   "Switch a task from TODO to NEXT when clocking in.
2290 Skips capture tasks, projects, and subprojects.
2291 Switch projects and subprojects from NEXT back to TODO"
2292   (when (not (and (boundp 'org-capture-mode) org-capture-mode))
2293     (cond
2294      ((and (member (org-get-todo-state) (list "TODO"))
2295        (bh/is-task-p))
2296   "NEXT")
2297      ((and (member (org-get-todo-state) (list "NEXT"))
2298        (bh/is-project-p))
2299   "TODO"))))
2300
2301 (defun bh/punch-in (arg)
2302   "Start continuous clocking and set the default task to the
2303 selected task.  If no task is selected set the Organization task
2304 as the default task."
2305   (interactive "p")
2306   (setq bh/keep-clock-running t)
2307   (if (equal major-mode 'org-agenda-mode)
2308   ;;
2309   ;; We're in the agenda
2310   ;;
2311   (let* ((marker (org-get-at-bol 'org-hd-marker))
2312          (tags (org-with-point-at marker (org-get-tags))))
2313     (if (and (eq arg 4) tags)
2314         (org-agenda-clock-in '(16))
2315       (bh/clock-in-organization-task-as-default)))
2316     ;;
2317     ;; We are not in the agenda
2318     ;;
2319     (save-restriction
2320   (widen)
2321   ; Find the tags on the current task
2322   (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4))
2323       (org-clock-in '(16))
2324     (bh/clock-in-organization-task-as-default)))))
2325
2326 (defun bh/punch-out ()
2327   (interactive)
2328   (setq bh/keep-clock-running nil)
2329   (when (org-clock-is-active)
2330     (org-clock-out))
2331   (org-agenda-remove-restriction-lock))
2332
2333 (defun bh/clock-in-default-task ()
2334   (save-excursion
2335     (org-with-point-at org-clock-default-task
2336   (org-clock-in))))
2337
2338 (defun bh/clock-in-parent-task ()
2339   "Move point to the parent (project) task if any and clock in"
2340   (let ((parent-task))
2341     (save-excursion
2342   (save-restriction
2343     (widen)
2344     (while (and (not parent-task) (org-up-heading-safe))
2345       (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
2346         (setq parent-task (point))))
2347     (if parent-task
2348         (org-with-point-at parent-task
2349       (org-clock-in))
2350       (when bh/keep-clock-running
2351         (bh/clock-in-default-task)))))))
2352
2353 (defvar bh/organization-task-id "e22cb8bf-07c7-408b-8f60-ff3aadac95e4")
2354
2355 (defun bh/clock-in-organization-task-as-default ()
2356   (interactive)
2357   (org-with-point-at (org-id-find bh/organization-task-id 'marker)
2358     (org-clock-in '(16))))
2359
2360 (defun bh/clock-out-maybe ()
2361   (when (and bh/keep-clock-running
2362          (not org-clock-clocking-in)
2363          (marker-buffer org-clock-default-task)
2364          (not org-clock-resolving-clocks-due-to-idleness))
2365     (bh/clock-in-parent-task)))
2366
2367 ; (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
2368
2369 (require 'org-id)
2370 (defun bh/clock-in-task-by-id (id)
2371   "Clock in a task by id"
2372   (org-with-point-at (org-id-find id 'marker)
2373     (org-clock-in nil)))
2374
2375 (defun bh/clock-in-last-task (arg)
2376   "Clock in the interrupted task if there is one
2377 Skip the default task and get the next one.
2378 A prefix arg forces clock in of the default task."
2379   (interactive "p")
2380   (let ((clock-in-to-task
2381      (cond
2382       ((eq arg 4) org-clock-default-task)
2383       ((and (org-clock-is-active)
2384         (equal org-clock-default-task (cadr org-clock-history)))
2385        (caddr org-clock-history))
2386       ((org-clock-is-active) (cadr org-clock-history))
2387       ((equal org-clock-default-task (car org-clock-history)) (cadr org-clock-history))
2388       (t (car org-clock-history)))))
2389     (widen)
2390     (org-with-point-at clock-in-to-task
2391   (org-clock-in nil))))
2392
2393
2394 (defun org-export-to-ods ()
2395   (interactive)
2396   (let ((csv-file "data.csv"))
2397     (org-table-export csv-file "orgtbl-to-csv")
2398     (org-odt-convert csv-file "ods" 'open)))
2399
2400 ; allow for zero-width-space to be a break in regexp too
2401 ; (setcar org-emphasis-regexp-components "​ [:space:] \t('\"{")
2402 ; (setcar (nthcdr 1 org-emphasis-regexp-components) "​ [:space:]- \t.,:!?;'\")}\\")
2403 ; (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)
2404
2405 ;; support inserting screen shots
2406 (defun my/org-insert-screenshot ()
2407   "Take a screenshot into a time stamped unique-named file in the
2408 same directory as the org-buffer and insert a link to this file."
2409   (interactive)
2410   (defvar my/org-insert-screenshot/filename)
2411   (setq my/org-insert-screenshot/filename
2412     (read-file-name
2413      "Screenshot to insert: "
2414      nil
2415      (concat (buffer-file-name) "_" (format-time-string "%Y%m%d_%H%M%S") ".png")
2416      )
2417     )
2418   (call-process "import" nil nil nil my/org-insert-screenshot/filename)
2419   (insert (concat "[[" my/org-insert-screenshot/filename "]]"))
2420   (org-display-inline-images))
2421
2422 (defun my/fix-inline-images ()
2423   (when org-inline-image-overlays
2424     (org-redisplay-inline-images)))
2425
2426 (add-hook 'org-babel-after-execute-hook 'my/fix-inline-images)
2427
2428 ;; use xelatex to preview with imagemagick
2429 (add-to-list 'org-preview-latex-process-alist
2430          '(xelateximagemagick
2431       :programs ("xelatex" "convert")
2432       :description "pdf > png"
2433       :message "you need to install xelatex and imagemagick"
2434       :use-xcolor t
2435       :image-input-type "pdf"
2436       :image-output-type "png"
2437       :image-size-adjust (1.0 . 1.0)
2438       :latex-compiler ("xelatex -interaction nonstopmode -output-directory %o %f")
2439       :image-converter ("convert -density %D -trim -antialias %f -quality 100 %O"))
2440          )
2441 ;; use xelatex by default
2442 (setq org-preview-latex-default-process 'xelateximagemagick)
2443
2444 ; from http://orgmode.org/Changes.html
2445 (defun my/org-repair-property-drawers ()
2446   "Fix properties drawers in current buffer.
2447  Ignore non Org buffers."
2448   (interactive)
2449   (when (eq major-mode 'org-mode)
2450     (org-with-wide-buffer
2451      (goto-char (point-min))
2452      (let ((case-fold-search t)
2453        (inline-re (and (featurep 'org-inlinetask)
2454                (concat (org-inlinetask-outline-regexp)
2455                    "END[ \t]*$"))))
2456    (org-map-entries
2457     (lambda ()
2458       (unless (and inline-re (org-looking-at-p inline-re))
2459         (save-excursion
2460       (let ((end (save-excursion (outline-next-heading) (point))))
2461         (forward-line)
2462         (when (org-looking-at-p org-planning-line-re) (forward-line))
2463         (when (and (< (point) end)
2464                (not (org-looking-at-p org-property-drawer-re))
2465                (save-excursion
2466                  (and (re-search-forward org-property-drawer-re end t)
2467                   (eq (org-element-type
2468                    (save-match-data (org-element-at-point)))
2469                   'drawer))))
2470           (insert (delete-and-extract-region
2471                (match-beginning 0)
2472                (min (1+ (match-end 0)) end)))
2473           (unless (bolp) (insert "\n"))))))))))))
2474
2475 #+END_SRC
2476 ** Org-Gcal
2477 #+BEGIN_SRC emacs-lisp
2478 (use-package calfw
2479   :ensure f
2480   )
2481 (use-package calfw-org
2482   :ensure f
2483   )
2484 (use-package org-gcal
2485   :if (file-readable-p "~/.hide/org_gcal.el")
2486   :ensure f
2487   :config '((if (file-readable-p "~/.hide/org_gcal.el")
2488                 (load-file "~/.hide/org_gcal.el"))
2489             )
2490   )
2491 #+END_SRC
2492 ** appt integration
2493 #+BEGIN_SRC emacs-lisp
2494   (use-package appt
2495     :ensure f
2496     :config
2497     ;; Show notification 10 minutes before event
2498     (setq appt-message-warning-time 10)
2499     ;; Disable multiple reminders
2500     (setq appt-display-interval appt-message-warning-time)
2501     (setq appt-display-mode-line nil)
2502
2503     ;; add automatic reminders for appointments
2504     (defun my/org-agenda-to-appt ()
2505       (interactive)
2506       (setq appt-time-msg-list nil)
2507       (org-agenda-to-appt))
2508     ;; add reminders when starting emacs
2509     (my/org-agenda-to-appt)
2510     ;; when rebuilding the agenda
2511     (defadvice  org-agenda-redo (after org-agenda-redo-add-appts)
2512       "Pressing `r' on the agenda will also add appointments."
2513       (my/org-agenda-to-appt)
2514       )
2515     ;; when saving all org buffers
2516     (defadvice org-save-all-org-buffers (after org-save-all-org-buffers-add-appts)
2517       "Re-add appts after saving all org buffers"
2518       (my/org-agenda-to-appt))
2519     ;; Display appointments as a window manager notification
2520     (setq appt-disp-window-function 'my/appt-display)
2521     (setq appt-delete-window-function (lambda () t))
2522
2523     (setq my/appt-notification-app (concat (getenv "HOME") "/bin/appt_notification"))
2524
2525     (defun my/appt-display (min-to-app new-time msg)
2526       (if (atom min-to-app)
2527       (start-process "my/appt-notification-app" nil my/appt-notification-app min-to-app msg)
2528     (dolist (i (number-sequence 0 (1- (length min-to-app))))
2529       (start-process "my/appt-notification-app" nil my/appt-notification-app
2530                      (nth i min-to-app) (nth i msg))))
2531       )
2532     )
2533
2534
2535 #+END_SRC
2536 ** End use-package
2537 #+BEGIN_SRC emacs-lisp
2538   )
2539 #+END_SRC
2540 * Keybindings
2541 ** Home/End Begining/End of line
2542 #+BEGIN_SRC emacs-lisp
2543   (global-set-key [home] 'move-beginning-of-line)
2544   (global-set-key [end] 'move-end-of-line)
2545 #+END_SRC
2546 ** Goto line
2547 #+BEGIN_SRC emacs-lisp
2548   ; (global-unset-key "\M-g")
2549   ; (global-set-key (kbd "M-g l") 'goto-line)
2550 #+END_SRC
2551 * Debian
2552 ** debian-changelog
2553 #+BEGIN_SRC emacs-lisp
2554 (use-package debian-changelog-mode
2555   :mode "debian/changelog"
2556   :ensure debian-el
2557   :config
2558   (setq debian-changelog-mailing-address "don@debian.org")
2559   (setq debian-changelog-full-name "Don Armstrong"))
2560 #+END_SRC
2561 * Misc (uncharacterized)
2562 #+BEGIN_SRC emacs-lisp
2563   (setq calendar-latitude 38.6)
2564   (setq calendar-longitude -121.5)
2565   (setq case-fold-search t)
2566   (setq confirm-kill-emacs (quote y-or-n-p))
2567
2568 #+END_SRC
2569 ** Turn on fontlock
2570 #+BEGIN_SRC emacs-lisp
2571   (global-font-lock-mode 1)
2572 #+END_SRC
2573 ** PS Printing
2574 #+BEGIN_SRC emacs-lisp
2575   (setq ps-footer-font-size (quote (8 . 10)))
2576   (setq ps-header-font-size (quote (8 . 10)))
2577   (setq ps-header-title-font-size (quote (10 . 10)))
2578   (setq ps-line-number-color "blue")
2579   (setq ps-print-footer t)
2580   (setq ps-print-footer-frame nil)
2581   (setq ps-print-only-one-header t)
2582 #+END_SRC
2583 ** Only single spacing on sentences
2584 #+BEGIN_SRC emacs-lisp
2585   (setq sentence-end "[.?!][]\"')]*\\($\\|   \\| \\)[    
2586   ]*")
2587   (setq sentence-end-double-space nil)
2588   ; enable matching parenthesis
2589 #+END_SRC
2590 ** Display paren mode
2591 #+BEGIN_SRC emacs-lisp
2592   (show-paren-mode 1)
2593   (setq show-paren-delay 0.2)
2594
2595 #+END_SRC
2596 ** My Username
2597 #+BEGIN_SRC emacs-lisp
2598   (setq user-mail-address "don@donarmstrong.com")
2599
2600 #+END_SRC
2601 ** Use primary selection on unix machines
2602 #+BEGIN_SRC emacs-lisp
2603 ;; switch back to the old primary selection method
2604 (if (or (string-equal system-type "darwin")
2605         (string-equal system-type "windows")
2606         )
2607     (progn
2608       (setq select-enable-clipboard t)
2609       (setq select-enable-primary nil)
2610       )
2611   (progn
2612     (setq select-enable-clipboard nil)
2613     (setq select-enable-primary t)
2614     ))
2615 ; (setq mouse-drag-copy-region t)
2616
2617 (setq-default c-indent-level 4)
2618 (setq-default c-brace-imaginary-offset 0)
2619 (setq-default c-brace-offset -4)
2620 (setq-default c-argdecl-indent 4)
2621 (setq-default c-label-offset -4)
2622 (setq-default c-continued-statement-offset 4)
2623 ; tabs are annoying
2624 (setq-default indent-tabs-mode nil)
2625 (setq-default tab-width 4)
2626
2627 (defun insert-date ()
2628   "Insert date at point."
2629   (interactive)
2630   (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z")))
2631 (global-set-key "\C-[d" 'insert-date)
2632
2633 (defun unfill-paragraph (arg)
2634   "Pull this whole paragraph up onto one line."
2635   (interactive "*p")
2636   (let ((fill-column 10000))
2637     (fill-paragraph arg))
2638   )
2639
2640 (column-number-mode t)
2641
2642 #+END_SRC
2643 ** Desktop-save-mode
2644 If the envvar EMACS_SERVER_NAME is set, consider this a separate
2645 emacs, and use a different desktop file to restore history
2646 #+BEGIN_SRC emacs-lisp
2647 (use-package desktop
2648   :demand
2649   :config
2650   (setq desktop-base-file-name
2651         (convert-standard-filename
2652          (concat ".emacs"
2653                  (or (getenv "EMACS_SERVER_NAME")
2654                      "")
2655                  ".desktop")
2656          ))
2657   (setq desktop-base-lock-name
2658         (convert-standard-filename
2659          (concat desktop-base-file-name
2660                  ".lock")))
2661   (setq desktop-auto-save-timeout 60)
2662   (setq desktop-restore-eager 5)
2663   (setq desktop-lazy-verbose nil)
2664   (desktop-save-mode 1)
2665   ; (desktop-read)
2666 )
2667 #+END_SRC
2668 ** Misc (Uncharacterized)
2669 #+BEGIN_SRC emacs-lisp
2670
2671 (put 'upcase-region 'disabled nil)
2672 (put 'downcase-region 'disabled nil)
2673 (put 'narrow-to-region 'disabled nil)
2674
2675 ; Outline-minor-mode key map
2676 (define-prefix-command 'cm-map nil "Outline-")
2677 ; HIDE
2678 (define-key cm-map "q" 'outline-hide-sublevels)    ; Hide everything but the top-level headings
2679 (define-key cm-map "t" 'outline-hide-body)         ; Hide everything but headings (all body lines)
2680 (define-key cm-map "o" 'outline-hide-other)        ; Hide other branches
2681 (define-key cm-map "c" 'outline-hide-entry)        ; Hide this entry's body
2682 (define-key cm-map "l" 'outline-hide-leaves)       ; Hide body lines in this entry and sub-entries
2683 (define-key cm-map "d" 'outline-hide-subtree)      ; Hide everything in this entry and sub-entries
2684 ; SHOW
2685 (define-key cm-map "a" 'outline-show-all)          ; Show (expand) everything
2686 (define-key cm-map "e" 'outline-show-entry)        ; Show this heading's body
2687 (define-key cm-map "i" 'outline-show-children)     ; Show this heading's immediate child sub-headings
2688 (define-key cm-map "k" 'outline-show-branches)     ; Show all sub-headings under this heading
2689 (define-key cm-map "s" 'outline-show-subtree)      ; Show (expand) everything in this heading & below
2690 ; MOVE
2691 (define-key cm-map "u" 'outline-up-heading)                ; Up
2692 (define-key cm-map "n" 'outline-next-visible-heading)      ; Next
2693 (define-key cm-map "p" 'outline-previous-visible-heading)  ; Previous
2694 (define-key cm-map "f" 'outline-forward-same-level)        ; Forward - same level
2695 (define-key cm-map "b" 'outline-backward-same-level)       ; Backward - same level
2696 (global-set-key "\M-o" cm-map)
2697 ; fix up tmux xterm keys
2698 ; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux
2699 (defun fix-up-tmux-keys ()
2700     "Fix up tmux xterm keys"
2701     (if (getenv "TMUX")
2702         (progn
2703           (let ((x 2) (tkey ""))
2704             (while (<= x 8)
2705               ;; shift
2706               (if (= x 2)
2707                   (setq tkey "S-"))
2708               ;; alt
2709               (if (= x 3)
2710                   (setq tkey "M-"))
2711               ;; alt + shift
2712               (if (= x 4)
2713                   (setq tkey "M-S-"))
2714               ;; ctrl
2715               (if (= x 5)
2716                   (setq tkey "C-"))
2717               ;; ctrl + shift
2718               (if (= x 6)
2719                   (setq tkey "C-S-"))
2720               ;; ctrl + alt
2721               (if (= x 7)
2722                   (setq tkey "C-M-"))
2723               ;; ctrl + alt + shift
2724               (if (= x 8)
2725                   (setq tkey "C-M-S-"))
2726
2727               ;; arrows
2728               (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
2729               (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
2730               (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
2731               (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
2732               ;; home
2733               (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
2734               ;; end
2735               (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
2736               ;; page up
2737               (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
2738               ;; page down
2739               (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
2740               ;; insert
2741               (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
2742               ;; delete
2743               (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
2744               ;; f1
2745               (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
2746               ;; f2
2747               (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
2748               ;; f3
2749               (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
2750               ;; f4
2751               (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
2752               ;; f5
2753               (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
2754               ;; f6
2755               (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
2756               ;; f7
2757               (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
2758               ;; f8
2759               (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
2760               ;; f9
2761               (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
2762               ;; f10
2763               (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
2764               ;; f11
2765               (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
2766               ;; f12
2767               (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
2768               ;; f13
2769               (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
2770               ;; f14
2771               (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
2772               ;; f15
2773               (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
2774               ;; f16
2775               (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
2776               ;; f17
2777               (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
2778               ;; f18
2779               (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
2780               ;; f19
2781               (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
2782               ;; f20
2783               (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))
2784
2785               (setq x (+ x 1))
2786               ))
2787           )
2788       )
2789     )
2790 ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys)
2791
2792 (defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary)
2793   "Call ask-user-about-supersession-threat only if the buffer is actually obsolete."
2794   (if (or (buffer-modified-p)
2795           (verify-visited-file-modtime)
2796           (< (* 8 1024 1024) (buffer-size))
2797           (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-")))
2798       ad-do-it
2799     (clear-visited-file-modtime)
2800     (not-modified)))
2801 (ad-activate 'ask-user-about-supersession-threat)
2802 #+END_SRC
2803
2804 * Start Server
2805 #+BEGIN_SRC emacs-lisp
2806   (use-package server
2807     :config
2808     (setq server-name
2809           (or (getenv "EMACS_SERVER_NAME")
2810               "server"))
2811     (unless (server-running-p)
2812       ; (global-set-key "\C-xp" 'server-edit)
2813       (server-start)))
2814 #+END_SRC
2815
2816 * END
2817 #+BEGIN_SRC emacs-lisp
2818 (provide 'don-configuration)
2819 #+END_SRC