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