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