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