2885 lines
102 KiB
Org Mode
2885 lines
102 KiB
Org Mode
|
#+TITLE: Doom Emacs Configuration
|
||
|
:DRAWER:
|
||
|
#+STARTUP: overview
|
||
|
|
||
|
#+LANGUAGE: en
|
||
|
#+EMAIL: dehaeze.thomas@gmail.com
|
||
|
#+AUTHOR: Dehaeze Thomas
|
||
|
|
||
|
#+HTML_LINK_HOME: ./index.html
|
||
|
#+HTML_LINK_UP: ./index.html
|
||
|
|
||
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
||
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
||
|
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.min.js"></script>
|
||
|
#+HTML_HEAD: <script type="text/javascript" src="./js/bootstrap.min.js"></script>
|
||
|
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.stickytableheaders.min.js"></script>
|
||
|
#+HTML_HEAD: <script type="text/javascript" src="./js/readtheorg.js"></script>
|
||
|
|
||
|
#+PROPERTY: header-args :tangle yes :results none :padline no
|
||
|
:END:
|
||
|
|
||
|
https://medium.com/urbint-engineering/emacs-doom-for-newbies-1f8038604e3b
|
||
|
https://noelwelsh.com/posts/2019-01-10-doom-emacs.html
|
||
|
https://dotdoom.netlify.com/config.html
|
||
|
|
||
|
Documentation:
|
||
|
- https://github.com/hlissner/doom-emacs/blob/develop/docs/index.org
|
||
|
|
||
|
* Useful Bindings
|
||
|
| =spc := | Execute command |
|
||
|
| =spc <= | Switch to buffer |
|
||
|
| =spc X= | org-capture |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc s s= | Search in buffer with swiper |
|
||
|
| =spc s p= | Search in project |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc p p= | Switch project |
|
||
|
| =spc p t= | TODOs in project |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc o f= | Create frame |
|
||
|
| =spc o e= | Toggle Eshell |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc n l= | Store link |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc g g= | Magit status |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc f r= | Open recent file |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc b B= | Switch to buffer |
|
||
|
| =spc b d= | Kill current buffer |
|
||
|
| =spc b i= | ibuffer |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc tab .= | Switch to workspace |
|
||
|
| =spc tab n= | New workspace |
|
||
|
| =spc tab r= | Rename workspace |
|
||
|
|-------------+------------------------------|
|
||
|
| =spc m A= | org-archive-subtree |
|
||
|
| =spc m I= | org-toggle-inline-images |
|
||
|
| =spc m d= | org-deadline |
|
||
|
| =spc m e= | org-export-dispatch |
|
||
|
| =spc m o= | org-set-property |
|
||
|
| =spc m s= | org-schedule |
|
||
|
| =spc m t= | org-todo |
|
||
|
|
||
|
|
||
|
| C-c C-v p | org-babel-previous-src-block |
|
||
|
| C-c C-v n | org-babel-next-src-block |
|
||
|
| C-c C-v e | org-babel-execute-maybe |
|
||
|
| C-c C-v o | org-babel-open-src-block-result |
|
||
|
| C-c C-v v | org-babel-expand-src-block |
|
||
|
| C-c C-v u | org-babel-goto-src-block-head |
|
||
|
| C-c C-v g | org-babel-goto-named-src-block |
|
||
|
| C-c C-v r | org-babel-goto-named-result |
|
||
|
| C-c C-v b | org-babel-execute-buffer |
|
||
|
| C-c C-v s | org-babel-execute-subtree |
|
||
|
| C-c C-v d | org-babel-demarcate-block |
|
||
|
| C-c C-v t | org-babel-tangle |
|
||
|
| C-c C-v f | org-babel-tangle-file |
|
||
|
| C-c C-v c | org-babel-check-src-block |
|
||
|
| C-c C-v j | org-babel-insert-header-arg |
|
||
|
| C-c C-v l | org-babel-load-in-session |
|
||
|
| C-c C-v i | org-babel-lob-ingest |
|
||
|
| C-c C-v I | org-babel-view-src-block-info |
|
||
|
| C-c C-v z | org-babel-switch-to-session-with-code |
|
||
|
| C-c C-v a | org-babel-sha1-hash |
|
||
|
| C-c C-v h | org-babel-describe-bindings |
|
||
|
| C-c C-v x | org-babel-do-key-sequence-in-edit-buffer |
|
||
|
|
||
|
* Personal Information
|
||
|
#+begin_src emacs-lisp
|
||
|
;; These are used for a number of things, particularly for GPG configuration,
|
||
|
;; some email clients, file templates and snippets.
|
||
|
(setq user-full-name "Dehaeze Thomas"
|
||
|
user-mail-address "dehaeze.thomas@gmail.com")
|
||
|
#+end_src
|
||
|
|
||
|
* Doom Config
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq doom-font (font-spec :family "Hack Nerd Font Mono" :size 12 :weight 'semi-light)
|
||
|
doom-variable-pitch-font (font-spec :family "Hack Nerd Font Mono")
|
||
|
doom-unicode-font (font-spec :family "Hack Nerd Font Mono" :size 12)
|
||
|
doom-big-font (font-spec :family "Hack Nerd Font Mono" :size 19))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
;; There are two ways to load a theme. Both assume the theme is installed and
|
||
|
;; available. You can either set `doom-theme' or manually load a theme with the
|
||
|
;; `load-theme' function. These are the defaults.
|
||
|
(setq doom-theme 'doom-gruvbox)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq display-line-numbers-type t)
|
||
|
#+end_src
|
||
|
|
||
|
* Evil
|
||
|
#+begin_src emacs-lisp
|
||
|
(after! evil
|
||
|
(map! :m "-" #'dired-jump))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(map!
|
||
|
(:after evil
|
||
|
:en "C-h" #'evil-window-left
|
||
|
:en "C-j" #'evil-window-down
|
||
|
:en "C-k" #'evil-window-up
|
||
|
:en "C-l" #'evil-window-right))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(after! which-key
|
||
|
(setq which-key-idle-delay 0.5
|
||
|
which-key-idle-secondary-delay 0.01
|
||
|
which-key-sort-order 'which-key-key-order-alpha))
|
||
|
#+end_src
|
||
|
|
||
|
* Basic
|
||
|
** Visual
|
||
|
Automatic line wrap.
|
||
|
#+begin_src emacs-lisp
|
||
|
(global-visual-line-mode t)
|
||
|
#+end_src
|
||
|
|
||
|
Turn off auto-fill mode that add line breaks.
|
||
|
#+begin_src emacs-lisp
|
||
|
(auto-fill-mode -1)
|
||
|
#+end_src
|
||
|
|
||
|
** Change default alert backend
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq alert-default-style 'libnotify)
|
||
|
#+end_src
|
||
|
|
||
|
** Lockfiles
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq create-lockfiles nil)
|
||
|
#+end_src
|
||
|
|
||
|
* Magit
|
||
|
#+begin_src emacs-lisp
|
||
|
(setenv "GIT_ASKPASS" "git-gui--askpass")
|
||
|
|
||
|
(setq magit-diff-refine-hunk 'all)
|
||
|
#+end_src
|
||
|
|
||
|
* Org Mode
|
||
|
- http://cachestocaches.com/2016/9/my-workflow-org-agenda/
|
||
|
- http://doc.norang.ca/org-mode.html#TodoKeywords
|
||
|
- https://emacs.cafe/emacs/orgmode/gtd/2017/06/30/orgmode-gtd.html
|
||
|
|
||
|
** Make sure to load Org
|
||
|
#+begin_src emacs-lisp
|
||
|
(require 'org)
|
||
|
#+end_src
|
||
|
|
||
|
** Org General Config
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-directory "~/Cloud/org/")
|
||
|
|
||
|
(setq org-default-notes-file "~/Cloud/org/refile.org")
|
||
|
|
||
|
;; Highligh latex parts in org mode
|
||
|
(setq org-highlight-latex-and-related '(native))
|
||
|
|
||
|
;; The following setting hides blank lines between headings which keeps folded view nice and compact.
|
||
|
(setq org-cycle-separator-lines 0)
|
||
|
|
||
|
;; Indent according to the outline structure
|
||
|
(setq org-startup-indented t)
|
||
|
|
||
|
;; Record the information of when the task was marked as DONE
|
||
|
(setq org-log-done 'time)
|
||
|
#+end_src
|
||
|
|
||
|
TAB was changed to toggle only the visibility state of the current subtree, rather than cycle through it recursively. This can be reversed with:
|
||
|
#+begin_src emacs-lisp
|
||
|
(after! evil-org
|
||
|
(remove-hook 'org-tab-first-hook #'+org-cycle-only-current-subtree-h))
|
||
|
#+end_src
|
||
|
|
||
|
** Org latex fragment
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-highlight-latex-and-related '(native))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(defvar tdh/org-latex-fragment-last nil
|
||
|
"Holds last fragment/environment you were on.")
|
||
|
|
||
|
(defun tdh/org-in-latex-fragment-p ()
|
||
|
"Return the point where the latex fragment begins, if inside
|
||
|
a latex fragment. Else return false"
|
||
|
(let* ((el (org-element-context))
|
||
|
(el-type (car el)))
|
||
|
(and (or (eq 'latex-fragment el-type) (eq 'latex-environment el-type))
|
||
|
(org-element-property :begin el))))
|
||
|
|
||
|
(defun tdh/org-latex-fragment-toggle ()
|
||
|
"Toggle a latex fragment image "
|
||
|
(and (eq 'org-mode major-mode)
|
||
|
(let ((begin (tdh/org-in-latex-fragment-p)))
|
||
|
(cond
|
||
|
;; were on a fragment and now on a new fragment
|
||
|
((and
|
||
|
;; fragment we were on
|
||
|
tdh/org-latex-fragment-last
|
||
|
;; and are on a fragment now
|
||
|
begin
|
||
|
|
||
|
;; but not on the last one this is a little tricky. as you edit the
|
||
|
;; fragment, it is not equal to the last one. We use the begin
|
||
|
;; property which is less likely to change for the comparison.
|
||
|
(not (and tdh/org-latex-fragment-last
|
||
|
(= begin
|
||
|
tdh/org-latex-fragment-last))))
|
||
|
;; go back to last one and put image back, provided there is still a fragment there
|
||
|
(save-excursion
|
||
|
(goto-char tdh/org-latex-fragment-last)
|
||
|
(when (tdh/org-in-latex-fragment-p) (org-preview-latex-fragment))
|
||
|
|
||
|
;; now remove current image
|
||
|
(goto-char begin)
|
||
|
(let ((ov (loop for ov in (org--list-latex-overlays)
|
||
|
if
|
||
|
(and
|
||
|
r (<= (overlay-start ov) (point))
|
||
|
(>= (overlay-end ov) (point)))
|
||
|
return ov)))
|
||
|
(when ov
|
||
|
(delete-overlay ov)))
|
||
|
;; and save new fragment
|
||
|
(setq tdh/org-latex-fragment-last begin)))
|
||
|
|
||
|
;; were on a fragment and now are not on a fragment
|
||
|
((and
|
||
|
;; not on a fragment now
|
||
|
(not begin)
|
||
|
;; but we were on one
|
||
|
tdh/org-latex-fragment-last)
|
||
|
;; put image back on, provided that there is still a fragment here.
|
||
|
(save-excursion
|
||
|
(goto-char tdh/org-latex-fragment-last)
|
||
|
(when (tdh/org-in-latex-fragment-p) (org-preview-latex-fragment)))
|
||
|
|
||
|
;; unset last fragment
|
||
|
(setq tdh/org-latex-fragment-last nil))
|
||
|
|
||
|
;; were not on a fragment, and now are
|
||
|
((and
|
||
|
;; we were not one one
|
||
|
(not tdh/org-latex-fragment-last)
|
||
|
;; but now we are
|
||
|
begin)
|
||
|
;; remove image
|
||
|
(save-excursion
|
||
|
(goto-char begin)
|
||
|
(let ((ov (loop for ov in (org--list-latex-overlays)
|
||
|
if
|
||
|
(and
|
||
|
(<= (overlay-start ov) (point))
|
||
|
(>= (overlay-end ov) (point)))
|
||
|
return ov)))
|
||
|
(when ov
|
||
|
(delete-overlay ov))))
|
||
|
(setq tdh/org-latex-fragment-last begin))))))
|
||
|
#+end_src
|
||
|
|
||
|
** Org Links
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map "C-c l" 'org-store-link)
|
||
|
#+end_src
|
||
|
|
||
|
** Org Tagging
|
||
|
#+begin_src emacs-lisp
|
||
|
;; Align Tags and flush right
|
||
|
(setq org-tags-column -80)
|
||
|
;; Tags with fast selection keys
|
||
|
(setq org-tag-alist (quote (("@home" . ?h)
|
||
|
("@work" . ?w)
|
||
|
("@christophe" . ?c)
|
||
|
("@veijo" . ?v))))
|
||
|
#+end_src
|
||
|
|
||
|
** Org Refile
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-refile-targets '((org-agenda-files . (:maxlevel . 6))))
|
||
|
#+end_src
|
||
|
|
||
|
** Org TODO
|
||
|
#+begin_src emacs-lisp
|
||
|
;; Tags with fast selection keys
|
||
|
(setq org-todo-keywords '(
|
||
|
(sequence "TODO(t)" "NEXT(n)" "MAIL(m)" "|" "DONE(d)")
|
||
|
(sequence "READ(r)" "BKMK(b)" "EXER(x)" "|" "DONE(d)")
|
||
|
(sequence "WAIT(w@/!)" "SDAY(s)" "|" "CANC(c@/!)")
|
||
|
(sequence "QUES(q)" "|" "ANSW(a)")
|
||
|
(sequence "EXAM(e)" "IDEA(i)" "|")
|
||
|
))
|
||
|
|
||
|
;; Display of the keywords
|
||
|
(setq org-todo-keyword-faces
|
||
|
'(("TODO" . (:foreground "#cc241d" :weight bold)) ;; red
|
||
|
("EXER" . (:foreground "#cc241d" :weight bold)) ;; red
|
||
|
("NEXT" . (:foreground "#cc241d" :weight bold)) ;; red
|
||
|
("MAIL" . (:foreground "#cc241d" :weight bold)) ;; red
|
||
|
("READ" . (:foreground "#cc241d" :weight bold)) ;; red
|
||
|
("ANSW" . (:foreground "#689d6a" :weight bold)) ;; aqua
|
||
|
("DONE" . (:foreground "#689d6a" :weight bold)) ;; aqua
|
||
|
("WAIT" . (:foreground "#d65d0e" :weight bold)) ;; orange
|
||
|
("QUES" . (:foreground "#d79921" :weight bold)) ;; yellow
|
||
|
("CANC" . (:foreground "#a89984" :weight bold)) ;; grey
|
||
|
("SDAY" . (:foreground "#98971a" :weight bold)) ;; green
|
||
|
("BKMK" . (:foreground "#98971a" :weight bold)) ;; green
|
||
|
("IDEA" . (:foreground "#98971a" :weight bold)) ;; green
|
||
|
("EXAM" . (:foreground "#98971a" :weight bold)))) ;; green
|
||
|
#+end_src
|
||
|
|
||
|
** Archive subtrees under the same hierarchy as original in the archive files
|
||
|
https://gist.github.com/Fuco1/e86fb5e0a5bb71ceafccedb5ca22fcfb
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(defadvice org-archive-subtree (around fix-hierarchy activate)
|
||
|
(let* ((fix-archive-p (and (not current-prefix-arg)
|
||
|
(not (use-region-p))))
|
||
|
(location (org-archive--compute-location org-archive-location))
|
||
|
(afile (car location))
|
||
|
(offset (if (= 0 (length (cdr location)))
|
||
|
1
|
||
|
(1+ (string-match "[^*]" (cdr location)))))
|
||
|
(buffer (or (find-buffer-visiting afile) (find-file-noselect afile))))
|
||
|
ad-do-it
|
||
|
(when fix-archive-p
|
||
|
(with-current-buffer buffer
|
||
|
(goto-char (point-max))
|
||
|
(while (> (org-current-level) offset) (org-up-heading-safe))
|
||
|
(let* ((olpath (org-entry-get (point) "ARCHIVE_OLPATH"))
|
||
|
(path (and olpath (split-string olpath "/")))
|
||
|
(level offset)
|
||
|
tree-text)
|
||
|
(when olpath
|
||
|
(org-mark-subtree)
|
||
|
(setq tree-text (buffer-substring (region-beginning) (region-end)))
|
||
|
(let (this-command) (org-cut-subtree))
|
||
|
(goto-char (point-min))
|
||
|
(save-restriction
|
||
|
(widen)
|
||
|
(-each path
|
||
|
(lambda (heading)
|
||
|
(if (re-search-forward
|
||
|
(rx-to-string
|
||
|
`(: bol (repeat ,level "*") (1+ " ") ,heading)) nil t)
|
||
|
(org-narrow-to-subtree)
|
||
|
(goto-char (point-max))
|
||
|
(unless (looking-at "^")
|
||
|
(insert "\n"))
|
||
|
(insert (make-string level ?*)
|
||
|
" "
|
||
|
heading
|
||
|
"\n"))
|
||
|
(cl-incf level)))
|
||
|
(widen)
|
||
|
(org-end-of-subtree t t)
|
||
|
(org-paste-subtree level tree-text))))))))
|
||
|
#+end_src
|
||
|
|
||
|
** Org Agenda
|
||
|
*** General configuration
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map "C-c a" 'org-agenda)
|
||
|
|
||
|
;; File to save todo items
|
||
|
(setq org-agenda-files (list "~/Cloud/org/"))
|
||
|
|
||
|
;; Include archived files
|
||
|
(setq org-agenda-archives-mode t)
|
||
|
|
||
|
;; Set priority range from A to C with default A
|
||
|
(setq org-highest-priority ?A)
|
||
|
(setq org-lowest-priority ?C)
|
||
|
(setq org-default-priority ?C)
|
||
|
|
||
|
;; Set colours for priorities
|
||
|
(setq org-priority-faces '((?A . (:foreground "#CC241D"))
|
||
|
(?B . (:foreground "#D65D0E"))
|
||
|
(?C . (:foreground "#D79921"))))
|
||
|
|
||
|
;; Open agenda in current window
|
||
|
(setq org-agenda-window-setup 'current-window)
|
||
|
|
||
|
(setq org-agenda-prefix-format
|
||
|
'((agenda . " %-12:c %?-12t% s")
|
||
|
(todo . "") ;; Don't show the filename for reading agenda
|
||
|
(tags . " %-12:c")
|
||
|
(search . " %-12:c"))
|
||
|
)
|
||
|
#+end_src
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map "C-c a" 'org-agenda)
|
||
|
|
||
|
;; File to save todo items
|
||
|
(setq org-agenda-files (list "~/Cloud/org/"))
|
||
|
|
||
|
;; Include archived files
|
||
|
(setq org-agenda-archives-mode t)
|
||
|
|
||
|
;; Set priority range from A to C with default A
|
||
|
(setq org-highest-priority ?A)
|
||
|
(setq org-lowest-priority ?C)
|
||
|
(setq org-default-priority ?C)
|
||
|
|
||
|
;; Set colours for priorities
|
||
|
(setq org-priority-faces '((?A . (:foreground "#CC241D"))
|
||
|
(?B . (:foreground "#D65D0E"))
|
||
|
(?C . (:foreground "#D79921"))))
|
||
|
|
||
|
;; Open agenda in current window
|
||
|
(setq org-agenda-window-setup 'current-window)
|
||
|
|
||
|
(setq org-agenda-prefix-format
|
||
|
'((agenda . " %-12:c %?-12t% s")
|
||
|
(todo . "") ;; Don't show the filename for reading agenda
|
||
|
(tags . " %-12:c")
|
||
|
(search . " %-12:c")))
|
||
|
#+end_src
|
||
|
|
||
|
*** Org Agenda Custom Views
|
||
|
https://blog.aaronbieber.com/2016/09/24/an-agenda-for-life-with-org-mode.html
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/org-agenda-skip-scheduled ()
|
||
|
(org-agenda-skip-entry-if 'scheduled 'deadline 'regexp "\n]+>"))
|
||
|
|
||
|
(setq org-agenda-custom-commands
|
||
|
'(("w" "Work" tags-todo "@work") ;; All todos related to work
|
||
|
("h" "Home" tags-todo "@home") ;; All todos not related to work
|
||
|
("q" . "Questions to ask")
|
||
|
("qc" "Questions to Cristophe" tags "@christophe/QUES" ((org-agenda-overriding-header "Questions to Christophe")))
|
||
|
("qm" "Questions to Muriel" tags "@muriel/QUES" ((org-agenda-overriding-header "Questions to Muriel")))
|
||
|
("qo" "Questions to Olivier" tags "@olivier/QUES" ((org-agenda-overriding-header "Questions to Olivier")))
|
||
|
("qq" "All questions" tags "/QUES" ((org-agenda-overriding-header "Other questions")))
|
||
|
("n" "Next things to do"
|
||
|
((tags "+PRIORITY+\"A\""
|
||
|
((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
|
||
|
(org-agenda-overriding-header "High-priority unfinished tasks:")))
|
||
|
(agenda "")
|
||
|
(todo "NEXT" ((org-agenda-skip-function 'tdh/org-agenda-skip-scheduled)(org-agenda-overriding-header "Next thing to do that are not scheduled")))
|
||
|
(todo "MAIL" ((org-agenda-overriding-header "Email to write/reply")))
|
||
|
(todo "WAIT" ((org-agenda-overriding-header "Things Waiting")))))
|
||
|
("u" "Unscheduled tasks" todo "TODO"
|
||
|
((org-agenda-skip-function 'tdh/org-agenda-skip-scheduled)
|
||
|
(org-agenda-overriding-header "Unscheduled TODO entries: ")))
|
||
|
("r" "Things to read"
|
||
|
((todo "READ" ((org-agenda-overriding-header "Things to read"))))
|
||
|
((org-agenda-files '("~/Cloud/thesis/ressources/notes/")))))
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
** Org Notification based on calendar event
|
||
|
https://emacs.stackexchange.com/questions/3844/good-methods-for-setting-up-alarms-audio-visual-triggered-by-org-mode-events
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq appt-message-warning-time 5)
|
||
|
(defun my-org-agenda-to-appt ()
|
||
|
(interactive)
|
||
|
(setq appt-time-msg-list nil)
|
||
|
(org-agenda-to-appt))
|
||
|
|
||
|
(my-org-agenda-to-appt)
|
||
|
; Display appointments as a window manager notification
|
||
|
(setq appt-disp-window-function 'my-appt-display)
|
||
|
(setq appt-delete-window-function (lambda () t))
|
||
|
|
||
|
(setq my-appt-notification-app (concat (getenv "HOME") "/bin/appt-notification"))
|
||
|
(defun my-appt-display (min-to-app new-time msg)
|
||
|
(if (atom min-to-app)
|
||
|
(start-process "my-appt-notification-app" nil my-appt-notification-app min-to-app msg)
|
||
|
(dolist (i (number-sequence 0 (1- (length min-to-app))))
|
||
|
(start-process "my-appt-notification-app" nil my-appt-notification-app (nth i min-to-app) (nth i msg)))))
|
||
|
#+end_src
|
||
|
|
||
|
*** appt-notification script
|
||
|
:PROPERTIES:
|
||
|
:header-args: :tangle ~/.config/doom/bin/appt-notification
|
||
|
:header-args+: :comments none :mkdirp yes
|
||
|
:header-args+: :shebang "#!/usr/bin/env bash"
|
||
|
:END:
|
||
|
#+begin_src bash
|
||
|
TIME="$1"TODO
|
||
|
MSG="$2"
|
||
|
|
||
|
dunstify --replace=85401 "Event in $TIME minutes" "$MSG"
|
||
|
#+end_src
|
||
|
|
||
|
** Org Structure Template
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-structure-template-alist
|
||
|
'(("c" . "center")
|
||
|
("C" . "comment")
|
||
|
("i" . "important")
|
||
|
("e" . "example")
|
||
|
("q" . "quote")
|
||
|
("s" . "src"))
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
** Org Capture
|
||
|
Documentation:
|
||
|
- Template elements: https://orgmode.org/manual/Template-elements.html#Template-elements
|
||
|
- Template expansion: https://orgmode.org/manual/Template-expansion.html#Template-expansion
|
||
|
- Capture protocol: https://orgmode.org/manual/capture-protocol.html
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map "C-c c" 'org-capture)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-capture-templates
|
||
|
(quote (("t" ; key
|
||
|
"todo" ; name
|
||
|
entry ; type
|
||
|
(file+headline "~/Cloud/org/work-notebook.org" "Inbox") ; target
|
||
|
"** TODO %?\n%U\n" ; template
|
||
|
)
|
||
|
("M" ; key
|
||
|
"Meeting" ; name
|
||
|
entry ; type
|
||
|
(file+headline "~/Cloud/org/work-notebook.org" "Meetings") ; target
|
||
|
"** %?\n%(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n" ; template
|
||
|
)
|
||
|
("m" ; key
|
||
|
"mail" ; name
|
||
|
entry ; type
|
||
|
(file+headline "~/Cloud/org/work-notebook.org" "Mails") ; target
|
||
|
"** TODO [#A] %?\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n%a\n" ; template
|
||
|
)
|
||
|
("pm"
|
||
|
"Org-Protocol Mail"
|
||
|
entry
|
||
|
(file+headline "~/Cloud/org/work-notebook.org" "Mails")
|
||
|
"* MAIL %:description [[message:%:link][link]]\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n\n"
|
||
|
:immediate-finish t
|
||
|
)
|
||
|
("pu"
|
||
|
"Org-Protocol Url"
|
||
|
entry
|
||
|
(file+headline "~/Cloud/org/work-notebook.org" "Inbox")
|
||
|
"* [[%:link][%:description]]\nCaptured On: %U\n\n"
|
||
|
:immediate-finish t
|
||
|
)
|
||
|
("pt"
|
||
|
"Org-Protocol text"
|
||
|
entry
|
||
|
(file+headline "~/Cloud/org/work-notebook.org" "Inbox")
|
||
|
"* %:description\nSource: %:link\nCaptured On: %U\n\n#+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n"
|
||
|
:immediate-finish t
|
||
|
)
|
||
|
)))
|
||
|
#+end_src
|
||
|
|
||
|
** Org Export
|
||
|
*** Basic
|
||
|
#+begin_src emacs-lisp
|
||
|
;; How many levels of headline to export
|
||
|
(setq org-export-headline-levels 4)
|
||
|
|
||
|
;; Authorize BIND to set local variables
|
||
|
(setq org-export-allow-bind-keywords t)
|
||
|
|
||
|
(setq org-odt-preferred-output-format "doc")
|
||
|
|
||
|
;; Used to not export headings with :ignore: tag
|
||
|
(require 'ox-extra)
|
||
|
(ox-extras-activate '(ignore-headlines))
|
||
|
#+end_src
|
||
|
|
||
|
*** Ox Latex Subfigure package
|
||
|
#+begin_src emacs-lisp
|
||
|
(use-package! ox-latex-subfigure
|
||
|
:config (require 'ox-latex-subfigure))
|
||
|
#+end_src
|
||
|
|
||
|
*** Clear page before heading
|
||
|
https://emacs.stackexchange.com/questions/30575/adding-latex-newpage-before-a-heading/30892
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun org/get-headline-string-element (headline backend info)
|
||
|
(let ((prop-point (next-property-change 0 headline)))
|
||
|
(if prop-point (plist-get (text-properties-at prop-point headline) :parent))))
|
||
|
|
||
|
(defun org/ensure-latex-clearpage (headline backend info)
|
||
|
(when (org-export-derived-backend-p backend 'latex)
|
||
|
(let ((elmnt (org/get-headline-string-element headline backend info)))
|
||
|
(when (and elmnt (org-element-property :CLEARPAGE elmnt))
|
||
|
(concat "\\clearpage\n" headline)))))
|
||
|
|
||
|
(add-to-list 'org-export-filter-headline-functions
|
||
|
'org/ensure-latex-clearpage)
|
||
|
#+end_src
|
||
|
|
||
|
*** TODO HTML Export
|
||
|
**** MathJax
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-html-mathjax-template
|
||
|
"<script type=\"text/x-mathjax-config\">
|
||
|
MathJax.Hub.Config({
|
||
|
displayAlign: \"%ALIGN\",
|
||
|
displayIndent: \"%INDENT\",
|
||
|
|
||
|
\"HTML-CSS\": { scale: %SCALE,
|
||
|
linebreaks: { automatic: \"%LINEBREAKS\" },
|
||
|
webFont: \"%FONT\"
|
||
|
},
|
||
|
SVG: {scale: %SCALE,
|
||
|
linebreaks: { automatic: \"%LINEBREAKS\" },
|
||
|
font: \"%FONT\"},
|
||
|
NativeMML: {scale: %SCALE},
|
||
|
TeX: { equationNumbers: {autoNumber: \"%AUTONUMBER\"},
|
||
|
MultLineWidth: \"%MULTLINEWIDTH\",
|
||
|
TagSide: \"%TAGSIDE\",
|
||
|
TagIndent: \"%TAGINDENT\",
|
||
|
Macros: {
|
||
|
bm: [\"{\\\\boldsymbol #1}\",1],
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
</script>
|
||
|
<script type=\"text/javascript\"
|
||
|
src=\"%PATH\"></script>")
|
||
|
#+end_src
|
||
|
|
||
|
**** Export with css class instead of inline css
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-html-htmlize-output-type 'css)
|
||
|
#+end_src
|
||
|
|
||
|
**** TODO MP4 movies
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(setq org-html-html5-fancy t)
|
||
|
(setq org-html-doctype "xhtml-strict")
|
||
|
#+end_src
|
||
|
|
||
|
** Org LaTeX
|
||
|
*** Org CdLatex
|
||
|
https://orgmode.org/manual/CDLaTeX-mode.html#CDLaTeX-mode
|
||
|
#+begin_src emacs-lisp
|
||
|
(push "~/.config/doom/local/" load-path)
|
||
|
(require 'cdlatex)
|
||
|
(add-hook 'org-mode-hook 'turn-on-org-cdlatex)
|
||
|
#+end_src
|
||
|
|
||
|
*** LaTeX Classes
|
||
|
#+begin_src emacs-lisp
|
||
|
;; Custom classes to use when exporting to latex
|
||
|
(add-to-list 'org-latex-classes
|
||
|
`("beamer"
|
||
|
,(concat "\\documentclass[presentation]{beamer}\n"
|
||
|
"[DEFAULT-PACKAGES]"
|
||
|
"[PACKAGES]"
|
||
|
"[EXTRA]\n")
|
||
|
("\\section{%s}" . "\\section*{%s}")
|
||
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
||
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
|
||
|
(add-to-list 'org-latex-classes
|
||
|
'("clean-cheatsheet"
|
||
|
"\\documentclass{clean-cheatsheet}"
|
||
|
("\\section{%s}" . "\\section*{%s}")
|
||
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
||
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
|
||
|
("\\paragraph{%s}" . "\\paragraph*{%s}")
|
||
|
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
|
||
|
)
|
||
|
(add-to-list 'org-latex-classes
|
||
|
'("clean-beamer"
|
||
|
"\\documentclass{clean-beamer}"
|
||
|
("\\section{%s}" . "\\section*{%s}")
|
||
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
||
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
|
||
|
("\\paragraph{%s}" . "\\paragraph*{%s}")
|
||
|
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
|
||
|
)
|
||
|
(add-to-list 'org-latex-classes
|
||
|
'("cleanreport"
|
||
|
"\\documentclass{cleanreport}"
|
||
|
("\\section{%s}" . "\\section*{%s}")
|
||
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
||
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
|
||
|
("\\paragraph{%s}" . "\\paragraph*{%s}")
|
||
|
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
|
||
|
)
|
||
|
(add-to-list 'org-latex-classes
|
||
|
'("scrreprt"
|
||
|
"\\documentclass{scrreprt}"
|
||
|
("\\section{%s}" . "\\section*{%s}")
|
||
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
||
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
|
||
|
("\\paragraph{%s}" . "\\paragraph*{%s}")
|
||
|
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
|
||
|
)
|
||
|
(add-to-list 'org-latex-classes
|
||
|
'("biblioreport"
|
||
|
"\\documentclass{biblioreport}"
|
||
|
("\\section{%s}" . "\\section*{%s}")
|
||
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
||
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
|
||
|
("\\paragraph{%s}" . "\\paragraph*{%s}")
|
||
|
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
*** Basic
|
||
|
#+begin_src emacs-lisp
|
||
|
;; Add packages by default
|
||
|
(add-to-list 'org-latex-packages-alist '("" "siunitx" t))
|
||
|
(add-to-list 'org-latex-packages-alist '("" "array" t))
|
||
|
(add-to-list 'org-latex-packages-alist '("" "tabularx" t))
|
||
|
(add-to-list 'org-latex-packages-alist '("" "booktabs" t))
|
||
|
(add-to-list 'org-latex-packages-alist '("" "bm" t))
|
||
|
(add-to-list 'org-latex-packages-alist '("most" "tcolorbox" t))
|
||
|
|
||
|
;; Setup default option for image size when exporting to LaTeX
|
||
|
(setq org-latex-image-default-option "scale=1")
|
||
|
(setq org-latex-image-default-width nil)
|
||
|
|
||
|
;; Use define labels instead of automatic generated ones
|
||
|
(setq org-latex-prefer-user-labels t)
|
||
|
|
||
|
;; Captions above the table
|
||
|
(setq org-latex-caption-above '(table))
|
||
|
|
||
|
;; Settings to export code with `minted' instead of `verbatim'.
|
||
|
(setq org-latex-listings 'minted)
|
||
|
|
||
|
;; Command used when exporting to pdf
|
||
|
(setq org-latex-pdf-process
|
||
|
'("latexmk -cd -pdflatex=\"pdflatex -synctex=1 -shell-escape -interaction nonstopmode -output-directory %o\" -pdf -bibtex -f %f"))
|
||
|
#+end_src
|
||
|
|
||
|
*** Beamer
|
||
|
Bold Text
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/my-beamer-bold (contents backend info)
|
||
|
(when (eq backend 'beamer)
|
||
|
(replace-regexp-in-string
|
||
|
(concat "\\`\\\\" "[A-Za-z0-9]+") ;; If not, orgmode is crazy...
|
||
|
"\\\\textbf"
|
||
|
contents)))
|
||
|
|
||
|
(add-to-list 'org-export-filter-bold-functions 'tdh/my-beamer-bold)
|
||
|
#+end_src
|
||
|
|
||
|
|
||
|
Special Environments
|
||
|
- [ ] Make some comment those special environments
|
||
|
#+begin_src emacs-lisp
|
||
|
(add-to-list 'org-beamer-environments-extra
|
||
|
'("cbox" ;; Name of environment
|
||
|
"m" ;; Selection key
|
||
|
"\\onslide%a{\\begin{cbox}[%h]%O"
|
||
|
"\\end{cbox}}\\vspace{0.5em}"))
|
||
|
(add-to-list 'org-beamer-environments-extra
|
||
|
'("csubbox" ;; Name of environment
|
||
|
"M" ;; Selection key
|
||
|
"\\onslide%a{\\tcbsubtitle{%h}"
|
||
|
"}"))
|
||
|
#+end_src
|
||
|
|
||
|
*** TODO Latex Fragments
|
||
|
- [ ] The remove hook does not seems to work
|
||
|
http://slumpy.org/blog/2017-02-01-automatic-latex-preview-in-org-mode/
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map
|
||
|
;; Activate Automatic LaTeX fragment
|
||
|
:n ",ol" '(lambda () (interactive) (add-hook 'post-command-hook 'tdh/org-latex-fragment-toggle t))
|
||
|
;; ;; Disable Automatic LaTeX fragment
|
||
|
:n ",oL" '(lambda () (interactive) (remove-hook 'post-command-hook 'tdh/org-latex-fragment-toggle)))
|
||
|
|
||
|
;; Use F9 to globally generate all the latex fragments
|
||
|
(map! :map org-mode-map :n "<f9>" (lambda () (interactive) (org-preview-latex-fragment 16)))
|
||
|
|
||
|
;; Put all the preview images in some directory
|
||
|
(setq org-preview-latex-image-directory "~/.ltximg/")
|
||
|
|
||
|
;; Define backends to preview LaTeX fragments
|
||
|
(setq org-preview-latex-process-alist '((imagemagick
|
||
|
:programs ("latex" "convert")
|
||
|
:description "pdf > png"
|
||
|
:message "you need to install the programs: latex and imagemagick."
|
||
|
:image-input-type "pdf"
|
||
|
:image-output-type "png"
|
||
|
:image-size-adjust (0.6 . 0.6)
|
||
|
:latex-compiler ("pdflatex -interaction nonstopmode -output-directory %o %f")
|
||
|
:image-converter ("convert -density %D -trim -antialias %f -quality 100 %O"))
|
||
|
(pdf2svg
|
||
|
:programs ("latex" "pdf2svg")
|
||
|
:description "pdf > svg"
|
||
|
:message "you need to install the programs: pdflatex and pdf2svg."
|
||
|
:image-input-type "pdf"
|
||
|
:image-output-type "svg"
|
||
|
:image-size-adjust (1.0 . 1.0)
|
||
|
:latex-compiler ("pdflatex -interaction nonstopmode -output-directory %o %f")
|
||
|
:image-converter ("pdfcrop %f %f && pdftocairo -svg %f %O"))
|
||
|
;; :image-converter ("pdf2svg %f %O"))
|
||
|
(dvisvgm
|
||
|
:programs ("latex" "dvisvgm")
|
||
|
:description "dvi > svg"
|
||
|
:message "you need to install the programs: latex and dvisvgm."
|
||
|
:image-input-type "dvi"
|
||
|
:image-output-type "svg"
|
||
|
:image-size-adjust (0.8 . 0.8)
|
||
|
:latex-compiler ("latex -interaction nonstopmode -output-directory %o %f")
|
||
|
:image-converter ("dvisvgm %f -n -b min -c %S -o %O"))
|
||
|
))
|
||
|
|
||
|
;; Use imagemagick/dvisvgm to generate png from pdf
|
||
|
(setq org-preview-latex-default-process 'dvisvgm)
|
||
|
#+end_src
|
||
|
|
||
|
*** TODO Custom Export - Add Page and Label for LaTeX export
|
||
|
https://emacs.stackexchange.com/questions/156/emacs-function-to-convert-an-arbitrary-org-property-into-an-arbitrary-string-na?rq=1
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(defcustom tdehaeze/org-property-mapping
|
||
|
'((latex ("CUSTOM_PAGE" . tdehaeze/insert-org-page-latex)
|
||
|
("CUSTOM_LABEL" . tdehaeze/insert-org-label-latex)))
|
||
|
"List of mappings from org property to arbitrary strings.
|
||
|
Each element is a list:
|
||
|
(BACKEND (PROPERTY1 . FUNCTION1) (PROPERTY2 . FUNCTION2) ...)
|
||
|
FUNCTION are functions which get called with a single
|
||
|
argument (the value of PROPERTY) and are responsible for doing
|
||
|
whatever should be done."
|
||
|
:type '(repeat (cons symbol (repeat (cons string string)))))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(defun tdehaeze/replace-org-property (backend)
|
||
|
"Convert org properties using `tdehaeze/org-property-mapping'.
|
||
|
Lookup BACKEND in `tdehaeze/org-property-mapping' for a list of
|
||
|
(PROPERTY REPLACEMENT). For each healine being exported, if it has a
|
||
|
PROPERTY listed insert a string immediately after the healine given by
|
||
|
(format REPLACEMENT PROPERTY-VALUE)"
|
||
|
(let ((map (cdr (assoc backend tdehaeze/org-property-mapping)))
|
||
|
value replacement)
|
||
|
(when map
|
||
|
(org-map-entries
|
||
|
(lambda ()
|
||
|
(dolist (it map)
|
||
|
(save-excursion
|
||
|
(when (setq value (org-entry-get (point) (car it)))
|
||
|
(funcall (cdr it) value)))))))))
|
||
|
|
||
|
(add-hook 'org-export-before-processing-hook #'tdehaeze/replace-org-property)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(defun tdehaeze/insert-org-label-latex (label)
|
||
|
"Insert \"\\\\label{LABEL}\\n\" after the :PROPERTY: drawer."
|
||
|
(search-forward-regexp org-property-end-re)
|
||
|
(forward-char 1)
|
||
|
(insert (format "\\label{%s}\n" label)))
|
||
|
(defun tdehaeze/insert-org-page-latex (page)
|
||
|
"Insert \"\\\\page{PAGE}\\n\" after the :PROPERTY: drawer."
|
||
|
(search-forward-regexp org-property-end-re)
|
||
|
(forward-char 1)
|
||
|
(insert (format "\\page{%s}\n" page)))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(defun org-latex-format-headline-default-function (todo _todo-type priority text tags _info)
|
||
|
"Default format function for a headline.
|
||
|
See `org-latex-format-headline-function' for details."
|
||
|
(concat
|
||
|
(and todo (format "{\\bfseries\\sffamily %s} " todo))
|
||
|
(and priority (format "\\framebox{\\#%c} " priority))
|
||
|
text
|
||
|
(and tags
|
||
|
(format "\\hfill{}\\textsc{%s}"
|
||
|
(mapconcat #'org-latex--protect-text tags ":")))
|
||
|
(and todo (format "{\n\\page{%s} " todo)))
|
||
|
#+end_src
|
||
|
|
||
|
*** Number Equations
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun org-renumber-environment (orig-func &rest args)
|
||
|
"A function to inject numbers in LaTeX fragment previews."
|
||
|
(let ((results '())
|
||
|
(counter -1)
|
||
|
(numberp))
|
||
|
|
||
|
(setq results (loop for (begin . env) in
|
||
|
(org-element-map (org-element-parse-buffer) 'latex-environment
|
||
|
(lambda (env)
|
||
|
(cons
|
||
|
(org-element-property :begin env)
|
||
|
(org-element-property :value env))))
|
||
|
collect
|
||
|
(cond
|
||
|
((and (string-match "\\\\begin{equation}" env)
|
||
|
(not (string-match "\\\\tag{" env)))
|
||
|
(incf counter)
|
||
|
(cons begin counter))
|
||
|
((string-match "\\\\begin{align}" env)
|
||
|
(prog2
|
||
|
(incf counter)
|
||
|
(cons begin counter)
|
||
|
(with-temp-buffer
|
||
|
(insert env)
|
||
|
(goto-char (point-min))
|
||
|
;; \\ is used for a new line. Each one leads to a number
|
||
|
(incf counter (count-matches "\\\\$"))
|
||
|
;; unless there are nonumbers.
|
||
|
(goto-char (point-min))
|
||
|
(decf counter (count-matches "\\nonumber")))))
|
||
|
(t
|
||
|
(cons begin nil)))))
|
||
|
|
||
|
(when (setq numberp (cdr (assoc (point) results)))
|
||
|
(setf (car args)
|
||
|
(concat
|
||
|
(format "\\setcounter{equation}{%s}\n" numberp)
|
||
|
(car args)))))
|
||
|
|
||
|
(apply orig-func args))
|
||
|
|
||
|
(advice-add 'org-create-formula-image :around #'org-renumber-environment)
|
||
|
#+end_src
|
||
|
|
||
|
** TODO [#A] View PDF in org mode
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(defun tdh/org-include-img-from-pdf (&rest _)
|
||
|
"Convert pdf files to image files in org-mode bracket links.
|
||
|
# ()convertfrompdf:t # This is a special comment; tells that the upcoming
|
||
|
# link points to the to-be-converted-to file.
|
||
|
# If you have a foo.pdf that you need to convert to foo.png, use the
|
||
|
# foo.png file name in the link.
|
||
|
[[./foo.png]]
|
||
|
"
|
||
|
(interactive)
|
||
|
(if (executable-find "convert")
|
||
|
(save-excursion
|
||
|
(goto-char (point-min))
|
||
|
(while (re-search-forward "^[ \t]*#\\s-+()convertfrompdf\\s-*:\\s-*t"
|
||
|
nil :noerror)
|
||
|
;; Keep on going to the next line till it finds a line with bracketed
|
||
|
;; file link.
|
||
|
(while (progn
|
||
|
(forward-line 1)
|
||
|
(not (looking-at org-bracket-link-regexp))))
|
||
|
;; Get the sub-group 1 match, the link, from `org-bracket-link-regexp'
|
||
|
(let ((link (match-string-no-properties 1)))
|
||
|
(when (stringp link)
|
||
|
(let* ((imgfile (expand-file-name (file-name-sans-extension link)))
|
||
|
(pdffile (expand-file-name
|
||
|
(concat imgfile
|
||
|
"." "pdf")))
|
||
|
(cmd (concat "pdftocairo -png -transp -singlefile "
|
||
|
pdffile " " imgfile)))
|
||
|
|
||
|
(message "%s" imgfile)
|
||
|
(when (and (file-readable-p pdffile)
|
||
|
(file-newer-than-file-p pdffile imgfile))
|
||
|
;; This block is executed only if pdffile is newer than
|
||
|
;; imgfile or if imgfile does not exist.
|
||
|
(shell-command cmd)
|
||
|
(message "%s" cmd)))))))
|
||
|
(user-error "`convert' executable (part of Imagemagick) is not found")))
|
||
|
(add-hook 'org-export-before-processing-hook #'tdh/org-include-img-from-pdf)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(add-to-list 'image-type-file-name-regexps '("\\.pdf\\'" . imagemagick))
|
||
|
(add-to-list 'image-file-name-extensions "pdf")
|
||
|
(setq imagemagick-types-inhibit (remove 'PDF imagemagick-types-inhibit))
|
||
|
(setq org-image-actual-width 600)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(defun my-latex-filter-nobreaks (text backend info)
|
||
|
"Ensure \" \" are properly handled in LaTeX export."
|
||
|
(when (org-export-derived-backend-p backend 'latex)
|
||
|
(replace-regexp-in-string " " "~" text)))
|
||
|
|
||
|
(add-to-list 'org-export-filter-plain-text-functions
|
||
|
'my-latex-filter-nobreaks)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(setq image-file-name-extensions
|
||
|
(quote
|
||
|
("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm" "svg" "pdf" "bmp")))
|
||
|
|
||
|
(setq org-image-actual-width 600)
|
||
|
|
||
|
(setq org-imagemagick-display-command "convert -density 600 \"%s\" -thumbnail \"%sx%s>\" \"%s\"")
|
||
|
(defun org-display-inline-images (&optional include-linked refresh beg end)
|
||
|
"Display inline images.
|
||
|
Normally only links without a description part are inlined, because this
|
||
|
is how it will work for export. When INCLUDE-LINKED is set, also links
|
||
|
with a description part will be inlined. This
|
||
|
can be nice for a quick
|
||
|
look at those images, but it does not reflect what exported files will look
|
||
|
like.
|
||
|
When REFRESH is set, refresh existing images between BEG and END.
|
||
|
This will create new image displays only if necessary.
|
||
|
BEG and END default to the buffer boundaries."
|
||
|
(interactive "P")
|
||
|
(unless refresh
|
||
|
(org-remove-inline-images)
|
||
|
(if (fboundp 'clear-image-cache) (clear-image-cache)))
|
||
|
(save-excursion
|
||
|
(save-restriction
|
||
|
(widen)
|
||
|
(setq beg (or beg (point-min)) end (or end (point-max)))
|
||
|
(goto-char beg)
|
||
|
(let ((re (concat "\\[\\[\\(\\(file:\\)\\|\\([./~]\\)\\)\\([^]\n]+?"
|
||
|
(substring (org-image-file-name-regexp) 0 -2)
|
||
|
"\\)\\]" (if include-linked "" "\\]")))
|
||
|
old file ov img)
|
||
|
(while (re-search-forward re end t)
|
||
|
(setq old (get-char-property-and-overlay (match-beginning 1)
|
||
|
'org-image-overlay)
|
||
|
file (expand-file-name
|
||
|
(concat (or (match-string 3) "") (match-string 4))))
|
||
|
(when (file-exists-p file)
|
||
|
(let ((file-thumb (format "%s%s_thumb.png" (file-name-directory file) (file-name-base file))))
|
||
|
(if (file-exists-p file-thumb)
|
||
|
(let ((thumb-time (nth 5 (file-attributes file-thumb 'string)))
|
||
|
(file-time (nth 5 (file-attributes file 'string))))
|
||
|
(if (time-less-p thumb-time file-time)
|
||
|
(shell-command (format org-imagemagick-display-command
|
||
|
file org-image-actual-width org-image-actual-width file-thumb) nil nil)))
|
||
|
(shell-command (format org-imagemagick-display-command
|
||
|
file org-image-actual-width org-image-actual-width file-thumb) nil nil))
|
||
|
(if (and (car-safe old) refresh)
|
||
|
(image-refresh (overlay-get (cdr old) 'display))
|
||
|
(setq img (save-match-data (create-image file-thumb)))
|
||
|
(when img
|
||
|
(setq ov (make-overlay (match-beginning 0) (match-end 0)))
|
||
|
(overlay-put ov 'display img)
|
||
|
(overlay-put ov 'face 'default)
|
||
|
(overlay-put ov 'org-image-overlay t)
|
||
|
(overlay-put ov 'modification-hooks
|
||
|
(list 'org-display-inline-remove-overlay))
|
||
|
(push ov org-inline-image-overlays))))))))))
|
||
|
#+end_src
|
||
|
|
||
|
Two options:
|
||
|
- work with =.png= file extension and only replace with =.pdf= when exporting to LaTeX if the corresponding file exists
|
||
|
- work with =.pdf= file, add a special function to display =.pdf= files (using =convert= or =pdftocairo=). Change to =.png= when exporting to html
|
||
|
|
||
|
Let's try the first solution.
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(defun tdh/change-png-to-pdf (text backend info)
|
||
|
"Change png images to pdf images when existing"
|
||
|
(when (org-export-derived-backend-p backend 'latex)
|
||
|
(let ((text (replace-regexp-in-string "[^\\w]\\(:\\)[^\n\t\r]+\\(:\\)[^\\w]" "<mark>" text nil nil 1 nil)))
|
||
|
(replace-regexp-in-string "[^\\w]\\(<mark>\\)[^\n\t\r]+\\(:\\)[^\\w]" "</mark>" text nil nil 2 nil))))
|
||
|
|
||
|
(add-to-list 'org-export-filter-plain-text-fucntions 'my-html-mark-tag)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(save-excursion
|
||
|
(goto-char (point-min))
|
||
|
(while (re-search-forward "^[ \t]*#\\s-+()convertfrompdf\\s-*:\\s-*t"
|
||
|
nil :noerror)
|
||
|
;; Keep on going to the next line till it finds a line with bracketed
|
||
|
;; file link.
|
||
|
(while (progn
|
||
|
(forward-line 1)
|
||
|
(not (looking-at org-bracket-link-regexp))))
|
||
|
;; Get the sub-group 1 match, the link, from `org-bracket-link-regexp'
|
||
|
(let ((link (match-string-no-properties 1)))
|
||
|
(when (stringp link)
|
||
|
(let* ((imgfile (expand-file-name link))
|
||
|
(pdffile (expand-file-name
|
||
|
(concat (file-name-sans-extension imgfile)
|
||
|
"." "pdf")))
|
||
|
(cmd (concat "convert -density 96 -quality 85 "
|
||
|
pdffile " " imgfile)))
|
||
|
(when (and (file-readable-p pdffile)
|
||
|
(file-newer-than-file-p pdffile imgfile))
|
||
|
;; This block is executed only if pdffile is newer than
|
||
|
;; imgfile or if imgfile does not exist.
|
||
|
(shell-command cmd)
|
||
|
(message "%s" cmd)))))))
|
||
|
#+end_src
|
||
|
|
||
|
** Org Ref
|
||
|
Ressources:
|
||
|
- https://github.com/tmalsburg/helm-bibtex
|
||
|
- https://github.com/jkitchin/org-ref
|
||
|
- https://www.reddit.com/r/emacs/comments/4gudyw/help_me_with_my_orgmode_workflow_for_notetaking/
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
;; Folder where the notes files are located (or file if just one Note file)
|
||
|
(setq org-ref-notes-directory "~/Cloud/thesis/ressources/notes")
|
||
|
(setq org-ref-bibliography-notes "~/Cloud/thesis/ressources/notes")
|
||
|
|
||
|
;; Bibliography File
|
||
|
(setq reftex-default-bibliography '("~/Cloud/thesis/ressources/references.bib"))
|
||
|
(setq org-ref-default-bibliography '("~/Cloud/thesis/ressources/references.bib"))
|
||
|
|
||
|
;; Folder where all the pdf are located
|
||
|
(setq org-ref-pdf-directory "~/Cloud/thesis/ressources/pdfs")
|
||
|
|
||
|
;; Tell org-ref to let helm-bibtex find notes for it
|
||
|
(setq org-ref-notes-function
|
||
|
(lambda (thekey)
|
||
|
(let ((bibtex-completion-bibliography (org-ref-find-bibliography)))
|
||
|
(bibtex-completion-edit-notes
|
||
|
(list (car (org-ref-get-bibtex-key-and-file thekey)))))))
|
||
|
|
||
|
;; Problem with speed: don't display broken links
|
||
|
(setq org-ref-show-broken-links nil)
|
||
|
;; Display information on the citation
|
||
|
(setq org-ref-show-citation-on-enter t)
|
||
|
#+end_src
|
||
|
|
||
|
** Org Noter
|
||
|
- https://github.com/weirdNox/org-noter
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-noter-always-create-frame nil)
|
||
|
(setq org-noter-kill-frame-at-session-end nil)
|
||
|
;; Fraction of the frame that the document window will occupy when split
|
||
|
(setq org-noter-doc-split-fraction '(0.6 . 0.6))
|
||
|
;; Save the last visited location automatically; when starting a new session, go to that location
|
||
|
(setq org-noter-auto-save-last-location t)
|
||
|
;; Add an empty line between each note's heading and content
|
||
|
(setq org-noter-separate-notes-from-heading t)
|
||
|
;; List of paths to check (non recursively) when searching for a notes file
|
||
|
(setq org-noter-notes-search-path "~/Cloud/thesis/ressources/notes")
|
||
|
#+end_src
|
||
|
|
||
|
** Custom key bindings
|
||
|
Export to LaTeX
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map :n ",l" 'org-latex-export-to-latex)
|
||
|
#+end_src
|
||
|
|
||
|
Open pdf externally.
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/open-org-pdf-externally ()
|
||
|
(interactive)
|
||
|
(call-process "xdg-open" nil 0 nil (concat (file-name-sans-extension (buffer-file-name)) ".pdf"))
|
||
|
)
|
||
|
|
||
|
(map! :map org-mode-map :n ",vp" 'tdh/open-org-pdf-externally)
|
||
|
#+end_src
|
||
|
|
||
|
Open HTML externally.
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/open-org-html-externally ()
|
||
|
(interactive)
|
||
|
(call-process "xdg-open" nil 0 nil (concat (file-name-sans-extension (buffer-file-name)) ".html"))
|
||
|
)
|
||
|
|
||
|
(map! :map org-mode-map :n ",vh" 'tdh/open-org-html-externally)
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Org-Contacts
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(setq org-contacts-files (list "~/Cloud/org/contacts.org"))
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Org-Wunderlist
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(setq org-wunderlist-client-id "6799d9caeb2f5d8bd641"
|
||
|
org-wunderlist-token "fd5965cde436c2587850a7c517d366561d8a1cbf7b6d96ab62f3fc8c9930"
|
||
|
org-wunderlist-file "~/Cloud/thesis/todos/wunderlist.org"
|
||
|
org-wunderlist-dir "~/.emacs.d/org-wunderlist/")
|
||
|
#+end_src
|
||
|
|
||
|
** Automatically run =startblock= when opening org-mode files
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/eval-startblock ()
|
||
|
(if (member "startblock" (org-babel-src-block-names))
|
||
|
(save-excursion
|
||
|
(org-babel-goto-named-src-block "startblock")
|
||
|
(org-babel-execute-src-block))
|
||
|
nil
|
||
|
)
|
||
|
)
|
||
|
|
||
|
(add-hook 'org-mode-hook 'tdh/eval-startblock)
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Insert ScreenShot or Picture from Phone
|
||
|
http://pragmaticemacs.com/emacs/a-workflow-to-quickly-add-photos-to-org-mode-notes/
|
||
|
|
||
|
- [ ] One function to move file from =~/Picture/= folder (where the screenshots are taken) to current directory and then insert and org link to the picture. Maybe ask if it should be copied in a sub directory (figs folder for instance).
|
||
|
- [ ] One function to copy file from =~/Cloud/Photos/= folder (where the pictures from phone are taken) to current directory (and ask for the new name of the picture) and insert org link.
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
;; required libraries
|
||
|
(require 'dash)
|
||
|
;; (require 'swiper)
|
||
|
(require 's)
|
||
|
|
||
|
;; start directory
|
||
|
(defvar tdh/image-dir (expand-file-name "/home/thomas/Pictures"))
|
||
|
|
||
|
(defun tdh/insert-conference-image ()
|
||
|
"Insert image from conference directory, rename and add link in current file.
|
||
|
|
||
|
The file is taken from a start directory set by `tdh/image-dir' and moved to the current directory, renamed and embedded at the point as an org-mode link. The user is presented with a list of files in the start directory, from which to select the file to move, sorted by most recent first."
|
||
|
(interactive)
|
||
|
(let (file-list target-dir file-list-sorted start-file start-file-full file-ext end-file end-file-base end-file-full file-number)
|
||
|
;; Clean directories from list but keep times
|
||
|
(setq file-list
|
||
|
(-remove (lambda (x) (nth 1 x))
|
||
|
(directory-files-and-attributes tdh/image-dir)))
|
||
|
|
||
|
;; Get target directory
|
||
|
(setq target-dir (file-name-directory (buffer-file-name)))
|
||
|
|
||
|
;; Sort list by most recent
|
||
|
(setq file-list-sorted
|
||
|
(mapcar #'car
|
||
|
(sort file-list
|
||
|
#'(lambda (x y) (time-less-p (nth 6 y) (nth 6 x))))))
|
||
|
|
||
|
;; Use ivy to select start-file
|
||
|
(setq start-file (ivy-read
|
||
|
(concat "Move selected file to " target-dir ":")
|
||
|
file-list-sorted
|
||
|
:re-builder #'ivy--regex
|
||
|
:sort nil
|
||
|
:initial-input nil))
|
||
|
|
||
|
;; add full path to start file and end-file
|
||
|
(setq start-file-full
|
||
|
(expand-file-name start-file tdh/image-dir))
|
||
|
|
||
|
;; final file name including path
|
||
|
(setq end-file-full
|
||
|
(expand-file-name start-file target-dir))
|
||
|
|
||
|
;; rename file
|
||
|
(rename-file start-file-full end-file-full)
|
||
|
(message "moved %s to %s" start-file-full start-file)
|
||
|
|
||
|
;; insert link
|
||
|
(insert (org-make-link-string (format "file:%s" start-file)))
|
||
|
|
||
|
;; display image
|
||
|
(org-display-inline-images t t)))
|
||
|
#+end_src
|
||
|
|
||
|
** TODO [#B] Render Tables
|
||
|
https://www.reddit.com/r/emacs/comments/d3a8or/pretty_org_tables_in_the_buffer_chapter_2_it/
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun my-render-org-table-at-point ()
|
||
|
(interactive)
|
||
|
(save-excursion
|
||
|
(beginning-of-line)
|
||
|
;; removes the overlay is already there
|
||
|
(if (overlays-at (point))
|
||
|
(delete-overlay (car (overlays-at (point))))
|
||
|
|
||
|
(let* ((element-type (org-element-type (org-element-at-point))))
|
||
|
(if (and (not (eq element-type 'table))
|
||
|
(not (eq element-type 'table-row)))
|
||
|
(error "not at an org table")
|
||
|
|
||
|
(while (not (eq 'table (org-element-type (org-element-at-point))))
|
||
|
(forward-line -1))
|
||
|
(my-render-org-table (org-element-at-point))
|
||
|
)))))
|
||
|
|
||
|
|
||
|
(defun my-render-org-table (table)
|
||
|
(interactive)
|
||
|
(let* ((begin (org-element-property :begin table))
|
||
|
(end (let ((pos (org-element-property :end table)))
|
||
|
(goto-char pos)
|
||
|
(beginning-of-line)
|
||
|
;; skip possible space after table
|
||
|
(while (not (looking-at " *[|#]"))
|
||
|
(setq pos (point))
|
||
|
(forward-line -1))
|
||
|
pos))
|
||
|
(tabletxt (buffer-substring-no-properties begin end))
|
||
|
(img (with-temp-buffer
|
||
|
(insert tabletxt)
|
||
|
(mark-whole-buffer)
|
||
|
(org-latex-convert-region-to-latex)
|
||
|
(org-latex-preview)
|
||
|
(goto-char (point-min))
|
||
|
(overlay-get (car (overlays-at (point))) 'display)))
|
||
|
(overlay (make-overlay begin end)))
|
||
|
(overlay-put overlay 'display img)
|
||
|
(forward-line -1))
|
||
|
)
|
||
|
|
||
|
|
||
|
(defun my-render-org-tables-in-buffer ()
|
||
|
(save-excursion
|
||
|
(org-element-map (org-element-parse-buffer) 'table 'my-render-org-table)))
|
||
|
|
||
|
;; Use F9 to globally generate tables
|
||
|
(map! :map org-mode-map :n "<f8>" (lambda () (interactive) (my-render-org-table-at-point)))
|
||
|
#+end_src
|
||
|
|
||
|
** Org Gcal
|
||
|
- https://cestlaz.github.io/posts/using-emacs-26-gcal/#.WIqBud9vGAk
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-gcal-client-id "396102378658-dcmbcmrnthbe925519otsjbd921otq0v.apps.googleusercontent.com"
|
||
|
org-gcal-client-secret "4M5PWrbhQjwYEMXGK85lDYX9"
|
||
|
org-gcal-file-alist '(("dehaeze.thomas@gmail.com" . "~/Cloud/org/gcal.org")
|
||
|
("8kjmhe2ar0abnm054ill1fb0gc@group.calendar.google.com" . "~/Cloud/org/gcal_phd.org")))
|
||
|
;; Automatic fetch of the new events
|
||
|
(add-hook 'org-agenda-mode-hook (lambda () (org-gcal-fetch) ))
|
||
|
#+end_src
|
||
|
|
||
|
* Org Babel
|
||
|
** Main configuration
|
||
|
#+begin_src emacs-lisp
|
||
|
;; Don't ask for confirmation when evalutating latex blocs
|
||
|
(defun my-org-confirm-babel-evaluate (lang body)
|
||
|
(not (member lang '("emacs-lisp" "latex" "matlab" "sh"))))
|
||
|
(setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
;; Use the current window for C-c ' source editing
|
||
|
(setq org-src-window-setup 'current-window)
|
||
|
#+end_src
|
||
|
|
||
|
** Special Shortcuts
|
||
|
https://emacs.stackexchange.com/questions/13869/how-to-toggle-org-mode-source-code-block-eval-no-status
|
||
|
|
||
|
Remap =ctrl-ret= to execute the source block and go to the next source block
|
||
|
when inside a source block. Otherwise, keep the normal behavior for ctrl-ent.
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/ctrl-ret ()
|
||
|
(interactive)
|
||
|
(defun in-src-block-p ()
|
||
|
"Returns t when the point is inside a source code block"
|
||
|
(string= "src" (org-in-block-p '("src"))))
|
||
|
|
||
|
(defun in-src-block-function ()
|
||
|
"Function to do when inside the src block"
|
||
|
(progn
|
||
|
(org-babel-execute-src-block)
|
||
|
(org-babel-next-src-block)))
|
||
|
|
||
|
(if (in-src-block-p)
|
||
|
(in-src-block-function)
|
||
|
(+org--insert-item 'below)))
|
||
|
|
||
|
(map! :map evil-org-mode-map
|
||
|
:n "<C-return>" #'tdh/ctrl-ret)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
;; (evil-define-minor-mode-key 'normal 'org-src-mode "q" 'org-edit-src-exit)
|
||
|
#+end_src
|
||
|
|
||
|
Remap =C-c C-c=:
|
||
|
https://emacs.stackexchange.com/questions/22430/rebind-org-babel-execute-src-block-maybe-to-c-c-c-c/22530#22530
|
||
|
|
||
|
** Library of Babel
|
||
|
Add all named source blocks to =org-babel-library-of-babel=.
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(org-babel-lob-ingest "~/Cloud/thesis/org-mode/org-babel-tutorial/org-babel-library.org")
|
||
|
#+end_src
|
||
|
|
||
|
** Org-Babel Matlab
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-babel-matlab-shell-command "/home/thomas/bin/matlab -nodesktop -nosplash")
|
||
|
|
||
|
(setq org-babel-matlab-emacs-link-wrapper-method
|
||
|
"%s
|
||
|
if ischar(ans);
|
||
|
echo('test');
|
||
|
fid = fopen('%s', 'w');
|
||
|
fprintf(fid, '%s', ans);
|
||
|
fclose(fid);
|
||
|
else;
|
||
|
save -ascii %s ans;
|
||
|
end
|
||
|
delete('%s');
|
||
|
")
|
||
|
#+end_src
|
||
|
|
||
|
** Default options for Matlab code
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-babel-default-header-args:matlab
|
||
|
'((:results . "none")
|
||
|
(:session . "*MATLAB*")
|
||
|
(:comments . "org")
|
||
|
(:exports . "both")
|
||
|
(:cache . "no")
|
||
|
(:noweb . "no")
|
||
|
(:hlines . "no")
|
||
|
(:tangle . "no")
|
||
|
(:mkdir . "yes")
|
||
|
(:eval . "no-export")))
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Asynchronous execution
|
||
|
#+begin_src emacs-lisp
|
||
|
;; (push "~/.emacs.d/private/ob-session-async/lisp/" load-path)
|
||
|
;; (require 'ob-session-async)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
;; (with-eval-after-load "ob"
|
||
|
;; (require 'org-babel-eval-in-repl))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
;; (with-eval-after-load "eval-in-repl"
|
||
|
;; (setq eir-jump-after-eval nil))
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Theme
|
||
|
#+begin_src emacs-lisp
|
||
|
;; (after! org
|
||
|
;; (require 'color)
|
||
|
;; (set-face-attribute 'org-block nil :background (color-darken-name (face-attribute 'default :background) 3))
|
||
|
;; )
|
||
|
#+end_src
|
||
|
|
||
|
** Indentation
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-edit-src-content-indentation 2
|
||
|
org-src-tab-acts-natively nil
|
||
|
org-src-preserve-indentation nil)
|
||
|
#+end_src
|
||
|
|
||
|
** Some functions for using Matlab with Org Babel
|
||
|
*** =whos= matlab function
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/matlab-whos (&optional start end)
|
||
|
"Get what is in the Matlab workspace"
|
||
|
(interactive)
|
||
|
(if (use-region-p)
|
||
|
(let ((regionp (buffer-substring (region-beginning) (region-end))))
|
||
|
(process-send-string "*MATLAB*" (concat "whosEmacs " regionp "\n")))
|
||
|
(process-send-string "*MATLAB*" (concat "whosEmacs" "\n"))))
|
||
|
#+end_src
|
||
|
|
||
|
*** =help= matlab function
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/matlab-help (start end)
|
||
|
"Get help on the selected function"
|
||
|
(interactive "r")
|
||
|
(let ((regionp (buffer-substring start end)))
|
||
|
(process-send-string "*MATLAB*" (concat "help " regionp "\n"))))
|
||
|
#+end_src
|
||
|
|
||
|
*** Execute selected text
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/matlab-execute-selected (start end)
|
||
|
"Execute selected text in the *MATLAB* buffer"
|
||
|
(interactive "r")
|
||
|
(let ((regionp (buffer-substring start end)))
|
||
|
(process-send-string "*MATLAB*" regionp)))
|
||
|
#+end_src
|
||
|
|
||
|
*** Specify a Matlab command to run
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/matlab-run-command ()
|
||
|
"Prompt user to enter a matlab command"
|
||
|
(interactive)
|
||
|
(process-send-string "*MATLAB*" (concat (read-string "Matlab Command: ") "\n")))
|
||
|
#+end_src
|
||
|
|
||
|
*** Execute the current source block with no output
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/org-babel-execute (&optional arg info params)
|
||
|
(interactive)
|
||
|
(let* ((org-babel-current-src-block-location
|
||
|
(or org-babel-current-src-block-location
|
||
|
(nth 5 info)
|
||
|
(org-babel-where-is-src-block-head)))
|
||
|
(info (if info (copy-tree info) (org-babel-get-src-block-info))))
|
||
|
;; Merge PARAMS with INFO before considering source block
|
||
|
;; evaluation since both could disagree.
|
||
|
(cl-callf org-babel-merge-params (nth 2 info) params)
|
||
|
(when (org-babel-check-evaluate info)
|
||
|
(cl-callf org-babel-process-params (nth 2 info))
|
||
|
(let* ((params (nth 2 info))
|
||
|
(cache (let ((c (cdr (assq :cache params))))
|
||
|
(and (not arg) c (string= "yes" c))))
|
||
|
(new-hash (and cache (org-babel-sha1-hash info :eval)))
|
||
|
(old-hash (and cache (org-babel-current-result-hash)))
|
||
|
(current-cache (and new-hash (equal new-hash old-hash))))
|
||
|
(cond
|
||
|
(current-cache
|
||
|
(save-excursion ;Return cached result.
|
||
|
(goto-char (org-babel-where-is-src-block-result nil info))
|
||
|
(forward-line)
|
||
|
(skip-chars-forward " \t")
|
||
|
(let ((result (org-babel-read-result)))
|
||
|
(message (replace-regexp-in-string "%" "%%" (format "%S" result)))
|
||
|
result)))
|
||
|
((org-babel-confirm-evaluate info)
|
||
|
(let* ((lang (nth 0 info))
|
||
|
(result-params (cdr (assq :result-params params)))
|
||
|
;; Expand noweb references in BODY and remove any
|
||
|
;; coderef.
|
||
|
(body
|
||
|
(let ((coderef (nth 6 info))
|
||
|
(expand
|
||
|
(if (org-babel-noweb-p params :eval)
|
||
|
(org-babel-expand-noweb-references info)
|
||
|
(nth 1 info))))
|
||
|
(if (not coderef) expand
|
||
|
(replace-regexp-in-string
|
||
|
(org-src-coderef-regexp coderef) "" expand nil nil 1))))
|
||
|
(dir (cdr (assq :dir params)))
|
||
|
(mkdirp (cdr (assq :mkdirp params)))
|
||
|
(default-directory
|
||
|
(cond
|
||
|
((not dir) default-directory)
|
||
|
((member mkdirp '("no" "nil" nil))
|
||
|
(file-name-as-directory (expand-file-name dir)))
|
||
|
(t
|
||
|
(let ((d (file-name-as-directory (expand-file-name dir))))
|
||
|
(make-directory d 'parents)
|
||
|
d))))
|
||
|
(cmd (intern (concat "org-babel-execute:" lang)))
|
||
|
result)
|
||
|
;; (message "%s" body)
|
||
|
(process-send-string "*MATLAB*" (concat body "\n"))
|
||
|
result))
|
||
|
)))
|
||
|
)
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
*** Execute the source block and go to the next one
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/org-babel-execute-goto-next (&optional arg info params)
|
||
|
(interactive)
|
||
|
(tdh/org-babel-execute arg info params)
|
||
|
(org-babel-next-src-block)
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
*** Org-Babel Tangle Subtree
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/org-babel-tangle-subtree ()
|
||
|
"Tangle the current subtree"
|
||
|
(interactive)
|
||
|
(progn
|
||
|
(org-narrow-to-subtree)
|
||
|
(org-babel-tangle)
|
||
|
(widen))
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map :n ",bT" 'tdh/org-babel-tangle-subtree)
|
||
|
#+end_src
|
||
|
|
||
|
*** Org-Babel Jump to Tangle File
|
||
|
Actually this tangle the file and then go to the file. Maybe I would like to ignore the tangling phase.
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/org-babel-jump-to-tangle-file ()
|
||
|
"Jump to tangle file for the source block at point."
|
||
|
(interactive)
|
||
|
(let (file org-babel-pre-tangle-hook org-babel-post-tangle-hook)
|
||
|
(cl-letf (((symbol-function 'write-region) (lambda (start end filename &rest _ignore)
|
||
|
(setq file filename)))
|
||
|
((symbol-function 'delete-file) #'ignore))
|
||
|
(org-babel-tangle '(4)))
|
||
|
(when file
|
||
|
(setq file (expand-file-name file))
|
||
|
(if (file-readable-p file)
|
||
|
(find-file file)
|
||
|
(error "Cannot open tangle file %S" file)))))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map :n ",bF" 'tdh/org-babel-jump-to-tangle-file)
|
||
|
#+end_src
|
||
|
|
||
|
*** Org-Babel Tangle File and Execute
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/org-babel-execute-tangle-file ()
|
||
|
"Jump to tangle file for the source block at point."
|
||
|
(interactive)
|
||
|
(let (file org-babel-pre-tangle-hook org-babel-post-tangle-hook)
|
||
|
(cl-letf (((symbol-function 'write-region) (lambda (start end filename &rest _ignore)
|
||
|
(setq file filename)))
|
||
|
((symbol-function 'delete-file) #'ignore))
|
||
|
(org-babel-tangle '(4)))
|
||
|
(when file
|
||
|
(setq file (expand-file-name file))
|
||
|
(if (file-readable-p file)
|
||
|
(process-send-string "*MATLAB*" (concat "run " file "\n"))
|
||
|
(error "Cannot open tangle file %S" file)))))
|
||
|
#+end_src
|
||
|
|
||
|
* LaTeX
|
||
|
- https://tex.stackexchange.com/questions/52179/what-is-your-favorite-emacs-and-or-auctex-command-trick
|
||
|
- https://tex.stackexchange.com/questions/20843/useful-shortcuts-or-key-bindings-or-predefined-commands-for-emacsauctex
|
||
|
|
||
|
** Basic LaTeX configuration
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun latex/clean ()
|
||
|
"Clean LaTeX output using latexmk"
|
||
|
(interactive)
|
||
|
(async-shell-command
|
||
|
;; command and parameters
|
||
|
"latexmk -c "
|
||
|
(shell-quote-argument buffer-file-name)
|
||
|
" &"
|
||
|
))
|
||
|
|
||
|
(map! :map LaTeX-mode-map :n ",C" 'latex/clean)
|
||
|
|
||
|
(add-hook 'TeX-mode-hook #'TeX-fold-mode)
|
||
|
#+end_src
|
||
|
|
||
|
** Master file
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq-default TeX-master nil)
|
||
|
#+end_src
|
||
|
|
||
|
** Pdf Viewer
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq TeX-view-program-selection '((output-pdf "Zathura")))
|
||
|
(setq TeX-source-correlate-mode t)
|
||
|
(setq TeX-source-correlate-start-server t)
|
||
|
(setq TeX-source-correlate-method 'synctex)
|
||
|
(setq TeX-view-program-list
|
||
|
'(("PDF Tools" TeX-pdf-tools-sync-view)))
|
||
|
#+end_src
|
||
|
|
||
|
* Helm-Bibtex
|
||
|
** General Config
|
||
|
#+begin_src emacs-lisp
|
||
|
;; Use "tags" field when looking for bib entries
|
||
|
(setq helm-bibtex-additional-search-fields '(keywords))
|
||
|
|
||
|
;; Display of bibtex entries with helm
|
||
|
(setq bibtex-completion-display-formats
|
||
|
'((t . "${author:36} ${title:*} ${year:4} ${=type=:7} ${=has-note=:1}")))
|
||
|
|
||
|
;; Special symbols for notes and pdf
|
||
|
(setq bibtex-completion-pdf-symbol "⌘")
|
||
|
(setq bibtex-completion-notes-symbol "✎")
|
||
|
|
||
|
;; Bibliography file
|
||
|
(setq bibtex-completion-bibliography "~/Cloud/thesis/ressources/references.bib")
|
||
|
|
||
|
;; Directory with all the pdfs
|
||
|
(setq bibtex-completion-library-path "~/Cloud/thesis/ressources/pdfs")
|
||
|
|
||
|
;; Directory with notes files
|
||
|
(setq bibtex-completion-notes-path "~/Cloud/thesis/ressources/notes")
|
||
|
|
||
|
;; Template used when creating new Note file
|
||
|
(setq bibtex-completion-notes-template-multiple-files (concat "#+TITLE: ${title}\n"
|
||
|
":DRAWER:\n"
|
||
|
"#+LATEX_CLASS: biblioreport\n"
|
||
|
"\n"
|
||
|
"#+OPTIONS: toc:nil title:nil\n"
|
||
|
"#+OPTIONS: ':t -:t\n"
|
||
|
"\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refType}{${=type=}}\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refKey}{${=key=}}\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refTitle}{${title}}\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refAuthor}{${author-or-editor}}\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refJournal}{${journal}}\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refYear}{${year}}\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refDoi}{${DOI}}\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refUrl}{${url}}\n"
|
||
|
"#+LATEX_HEADER: \\newcommand{\\refKeywords}{${keywords}}\n"
|
||
|
"#+LATEX_HEADER: \\input{config.tex}\n"
|
||
|
"#+LATEX_HEADER: \\graphicspath{{./figs/${=key=}/}}\n"
|
||
|
"# #+TOC: headlines 2\n"
|
||
|
":END:\n"
|
||
|
"\n"
|
||
|
"#+BEGIN_abstract\n"
|
||
|
"\n"
|
||
|
"#+END_abstract\n"
|
||
|
"\n"
|
||
|
"* ${title} :ignore:\n"
|
||
|
":PROPERTIES:\n"
|
||
|
":CUSTOM_ID: ${=key=}\n"
|
||
|
":AUTHOR: ${author}\n"
|
||
|
":TYPE: ${=type=}\n"
|
||
|
":JOURNAL: ${journal}\n"
|
||
|
":YEAR: ${year}\n"
|
||
|
":VOLUME: ${volume}\n"
|
||
|
":PAGES: ${pages}\n"
|
||
|
":DOI: ${DOI}\n"
|
||
|
":URL: ${url}\n"
|
||
|
":NOTER_DOCUMENT: ../pdfs/${=key=}.pdf\n"
|
||
|
":END:\n"
|
||
|
"\n"))
|
||
|
|
||
|
;; Make "Edit notes" the default action
|
||
|
(after! helm-bibtex
|
||
|
(helm-delete-action-from-source "Edit notes" helm-source-bibtex)
|
||
|
(helm-add-action-to-source "Edit notes" 'helm-bibtex-edit-notes helm-source-bibtex 0)
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
** Open pdf externally
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdehaeze/open-pdf-externally (key)
|
||
|
(call-process "zathura" nil 0 nil (nth 0 (-cons-to-list (bibtex-completion-find-pdf key)))))
|
||
|
|
||
|
;; Action to open the pdf with Zathura
|
||
|
(after! helm-bibtex
|
||
|
(helm-delete-action-from-source "Open PDF Externally" helm-source-bibtex)
|
||
|
(helm-add-action-to-source "Open PDF Externally" 'tdehaeze/open-pdf-externally helm-source-bibtex 1)
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
** Special Commands
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun helm-bibtex-favorites (&optional arg)
|
||
|
"Search Favorite BibTeX entries"
|
||
|
(interactive "P")
|
||
|
(helm-bibtex arg nil "favorite "))
|
||
|
#+end_src
|
||
|
|
||
|
** List all element of the bibliography without pdf associated
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun list-bib-without-pdf-associated ()
|
||
|
(interactive)
|
||
|
(bibtex-completion-init)
|
||
|
(setq candidates (bibtex-completion-candidates))
|
||
|
|
||
|
(defun canditate-is-pdf-present (candidate)
|
||
|
(bibtex-completion-find-pdf-in-library (cdr (assoc "=key=" candidate)))
|
||
|
)
|
||
|
|
||
|
(setq candidates-without-pdf (remove-if #'canditate-is-pdf-present candidates))
|
||
|
|
||
|
(setq candidate-without-pdf-names (mapcar
|
||
|
(lambda (x) (cdr (assoc "title" x)))
|
||
|
candidates-without-pdf))
|
||
|
|
||
|
(with-output-to-temp-buffer "*bib-without-pdf*" (princ (string-join candidate-without-pdf-names "\n")))
|
||
|
(switch-to-buffer-other-window "*bib-without-pdf*")
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
* TODO [#B] Matlab
|
||
|
- https://github.com/yuhonglin/matlab-mode
|
||
|
- https://github.com/pronobis/matlab-mode
|
||
|
|
||
|
** Setup Matlab Mode
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq matlab-shell-command "/home/thomas/bin/matlab")
|
||
|
(setq matlab-shell-command-switches (list "-nodesktop -nosplash"))
|
||
|
(setq mlint-programs '("mlint" "/home/thomas/bin/mlint"))
|
||
|
#+end_src
|
||
|
|
||
|
** Setup Flycheck
|
||
|
#+begin_src emacs-lisp
|
||
|
(defvar mlint-executable "/home/thomas/bin/mlint")
|
||
|
|
||
|
(flycheck-define-command-checker 'matlab-mlint
|
||
|
"A Matlab checker based on mlint."
|
||
|
:command `(,mlint-executable source)
|
||
|
:error-patterns
|
||
|
'((warning line-start "L " line " (C " (1+ digit) "): " (message) line-end))
|
||
|
:modes '(matlab-mode))
|
||
|
|
||
|
(add-to-list 'flycheck-checkers 'matlab-mlint)
|
||
|
|
||
|
;; Automatic startup of flycheck for matlab
|
||
|
(add-hook 'matlab-mode-hook 'flycheck-mode)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(defadvice org-edit-src-code (around set-buffer-file-name activate compile)
|
||
|
(let ((file-name (buffer-file-name))) ;; (1)
|
||
|
ad-do-it ;; (2)
|
||
|
(setq buffer-file-name file-name))) ;; (3)
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Setup Company - not working
|
||
|
#+begin_src emacs-lisp
|
||
|
;; (add-to-list 'company-backends 'company-matlab)
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Beautify code
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun matlab-beautify-buffer ()
|
||
|
"Beautify Current Buffer"
|
||
|
(interactive)
|
||
|
(save-buffer)
|
||
|
(matlab-shell-run-command (concat "MBeautify.formatFile(\"" (buffer-file-name) "\")"))
|
||
|
)
|
||
|
#+end_src
|
||
|
|
||
|
** Key Bindings
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun matlab-add-breakpoint ()
|
||
|
(interactive)
|
||
|
(matlab-shell-run-command (concat "dbstop in " (buffer-name) " at " (number-to-string (line-number-at-pos nil)))))
|
||
|
(defun matlab-remove-breakpoint ()
|
||
|
(interactive)
|
||
|
(matlab-shell-run-command (concat "dbclear in " (buffer-name) " at " (number-to-string (line-number-at-pos nil)))))
|
||
|
(defun matlab-list-breakpoints ()
|
||
|
(interactive)
|
||
|
(matlab-shell-run-command (concat "dbstatus " (buffer-name))))
|
||
|
(defun matlab-clear-breakpoints ()
|
||
|
(interactive)
|
||
|
(matlab-shell-run-command (concat "dbclear in " (buffer-name))))
|
||
|
(defun matlab-go-to-file-directory ()
|
||
|
(interactive)
|
||
|
(matlab-shell-run-command (concat "cd " (file-name-directory buffer-file-name))))
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map matlab-mode-map
|
||
|
:n ",g" 'matlab-go-to-file-directory
|
||
|
:n ",da" 'matlab-add-breakpoint
|
||
|
:n ",dr" 'matlab-remove-breakpoint
|
||
|
:n ",dL" 'matlab-list-breakpoints
|
||
|
:n ",dc" 'matlab-clear-breakpoints
|
||
|
:n ",dl" 'gud-cont
|
||
|
:n ",ds" 'gud-step
|
||
|
:n ",dn" 'gud-next
|
||
|
:n ",dq" 'gud-finish)
|
||
|
#+end_src
|
||
|
|
||
|
** Wrong highlight of comments
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(add-hook 'matlab-mode-hook
|
||
|
;; `highlight-numbers-mode' breaks MATLAB comment coloring --
|
||
|
;; `highlight-numbers-mode' is mostly redundant with
|
||
|
;; `rainbow-identifiers-mode' anyway
|
||
|
(lambda ()
|
||
|
(highlight-numbers-mode -1))
|
||
|
;; We must append the above *after* `spacemacs/run-prog-mode-hooks'
|
||
|
;; in `matlab-mode-hook', since the former hook enables
|
||
|
;; `highlight-numbers-mode'. Note that
|
||
|
;; `spacemacs/run-prog-mode-hooks' is manually added to
|
||
|
;; `matlab-mode-hook' by Spacemacs since the upstream `matlab-mode'
|
||
|
;; package does not derive `matlab-mode' from `prog-mode' (oddly --
|
||
|
;; IIRC the author refused to do so for compatibility with XEmacs).
|
||
|
'append)
|
||
|
#+end_src
|
||
|
|
||
|
* TODO [#B] Mails With Mu4e
|
||
|
:PROPERTIES:
|
||
|
:header-args:emacs-lisp+: :tangle no
|
||
|
:END:
|
||
|
- https://github.com/kzar/davemail
|
||
|
- http://cachestocaches.com/2017/3/complete-guide-email-emacs-using-mu-and-/
|
||
|
- http://spacemacs.org/layers/+email/mu4e/README.html
|
||
|
- http://www.djcbsoftware.nl/code/mu/mu4e/index.html#Top
|
||
|
- https://notanumber.io/2016-10-03/better-email-with-mu4e/
|
||
|
- https://vxlabs.com/2017/02/07/mu4e-0-9-18-e-mailing-with-emacs-now-even-better/
|
||
|
- http://www.brool.com/post/using-mu4e/
|
||
|
- https://www.reddit.com/r/emacs/comments/8q84dl/tip_how_to_easily_manage_your_emails_with_mu4e/
|
||
|
- https://vxlabs.com/2017/02/07/mu4e-0-9-18-e-mailing-with-emacs-now-even-better/
|
||
|
|
||
|
** Set default mail user agent to mu4e
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mail-user-agent 'mu4e-user-agent)
|
||
|
#+end_src
|
||
|
|
||
|
** Default config
|
||
|
*** Default behavior
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-maildir "~/.mail"
|
||
|
mu4e-update-interval nil
|
||
|
mu4e-compose-signature-auto-include t
|
||
|
mu4e-view-show-images t
|
||
|
mu4e-view-show-addresses t)
|
||
|
#+end_src
|
||
|
|
||
|
*** Default folders
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-sent-folder "/gmail/Sent"
|
||
|
mu4e-drafts-folder "/gmail/Drafts"
|
||
|
mu4e-trash-folder "/gmail/Trash"
|
||
|
mu4e-refile-folder "/gmail/Archive"
|
||
|
mu4e-compose-signature "Thomas Dehaeze\n"
|
||
|
user-mail-address "dehaeze.thomas@gmail.com")
|
||
|
#+end_src
|
||
|
|
||
|
*** Default signature and email address
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-compose-signature "Thomas Dehaeze\n"
|
||
|
user-mail-address "dehaeze.thomas@gmail.com")
|
||
|
#+end_src
|
||
|
|
||
|
*** Saving the attachment to Downloads directory
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-attachment-dir "~/Downloads")
|
||
|
#+end_src
|
||
|
|
||
|
*** A list of user's e-mail addresses
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-user-mail-address-list '("dehaeze.thomas@gmail.com" "thomas.dehaeze@esrf.fr" "thomas.dehaeze@doct.ulg.ac.be"))
|
||
|
#+end_src
|
||
|
|
||
|
*** Mail directory shortcuts
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-maildir-shortcuts
|
||
|
'(
|
||
|
("/gmail/Inbox" . ?g)
|
||
|
("/esrf/Inbox" . ?e)
|
||
|
("/ulg/Inbox" . ?u)
|
||
|
))
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Contexts - Email accounts
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(setq mu4e-contexts
|
||
|
`( ,(make-mu4e-context
|
||
|
:name "gmail"
|
||
|
:enter-func (lambda () (mu4e-message "Entering Gmail context"))
|
||
|
:leave-func (lambda () (mu4e-message "Leaving Gmail context"))
|
||
|
:match-func (lambda (msg)
|
||
|
(when msg
|
||
|
(string-match-p "^/gmail" (mu4e-message-field msg :maildir))))
|
||
|
:vars '(
|
||
|
(mu4e-sent-messages-behavior . (delete))
|
||
|
(user-mail-address . "dehaeze.thomas@gmail.com")
|
||
|
(mu4e-sent-folder . "/gmail/Sent")
|
||
|
(mu4e-trash-folder . "/gmail/Trash")
|
||
|
(mu4e-drafts-folder . "/gmail/Drafts")
|
||
|
(mu4e-refile-folder . "/gmail/Archive")
|
||
|
(mu4e-compose-signature .
|
||
|
(concat
|
||
|
"Thomas Dehaeze\n"
|
||
|
"\n"))
|
||
|
))
|
||
|
,(make-mu4e-context
|
||
|
:name "esrf"
|
||
|
:enter-func (lambda () (mu4e-message "Entering ESRF context"))
|
||
|
:leave-func (lambda () (mu4e-message "Leaving ESRF context"))
|
||
|
:match-func (lambda (msg)
|
||
|
(when msg
|
||
|
(string-match-p "^/esrf" (mu4e-message-field msg :maildir))))
|
||
|
:vars '(
|
||
|
(user-mail-address . "thomas.dehaeze@esrf.fr")
|
||
|
(mu4e-sent-folder . "/esrf/Sent")
|
||
|
(mu4e-trash-folder . "/esrf/Trash")
|
||
|
(mu4e-drafts-folder . "/esrf/Drafts")
|
||
|
(mu4e-refile-folder . "/esrf/Archive")
|
||
|
(mu4e-compose-signature .
|
||
|
(concat
|
||
|
"Thomas Dehaeze\n"
|
||
|
"\n"))
|
||
|
))
|
||
|
,(make-mu4e-context
|
||
|
:name "ulg"
|
||
|
:enter-func (lambda () (mu4e-message "Entering ULG context"))
|
||
|
:leave-func (lambda () (mu4e-message "Leaving ULG context"))
|
||
|
:match-func (lambda (msg)
|
||
|
(when msg
|
||
|
(string-match-p "^/ulg" (mu4e-message-field msg :maildir))))
|
||
|
:vars '(
|
||
|
(user-mail-address . "thomas.dehaeze@doct.ulg.ac.be")
|
||
|
(mu4e-sent-folder . "/ulg/Sent")
|
||
|
(mu4e-trash-folder . "/ulg/Trash")
|
||
|
(mu4e-drafts-folder . "/ulg/Drafts")
|
||
|
(mu4e-refile-folder . "/ulg/Archive")
|
||
|
(mu4e-compose-signature .
|
||
|
(concat
|
||
|
"Thomas Dehaeze\n"
|
||
|
"\n"))
|
||
|
))
|
||
|
))
|
||
|
(setq mu4e-context-policy 'pick-first)
|
||
|
#+end_src
|
||
|
|
||
|
** Receiving emails - Mbsync
|
||
|
Let systemd get the mail, then pressing =U= will just run =mu= to reindex everything.
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-get-mail-command "true")
|
||
|
#+end_src
|
||
|
|
||
|
Fix for mbsync found [[http://pragmaticemacs.com/emacs/fixing-duplicate-uid-errors-when-using-mbsync-and-mu4e/][here]].
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-change-filenames-when-moving t)
|
||
|
#+end_src
|
||
|
|
||
|
** Sending emails - Msmtp
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq smtpmail-default-smtp-server "smtp.gmail.com"
|
||
|
smtpmail-smtp-server "smtp.gmail.com"
|
||
|
smtpmail-smtp-service 587)
|
||
|
|
||
|
(setq message-send-mail-function 'message-send-mail-with-sendmail
|
||
|
sendmail-program "msmtp"
|
||
|
user-full-name "Thomas Dehaeze")
|
||
|
#+end_src
|
||
|
|
||
|
** Bookmarks
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(setq mu4e-bookmarks
|
||
|
`(("flag:unread AND NOT flag:trashed" "Unread messages" ?u)
|
||
|
("date:today..now" "Today's messages" ?t)
|
||
|
("date:7d..now" "Last 7 days" ?w)
|
||
|
("mime:image/*" "Messages with images" ?p)
|
||
|
(,(mapconcat 'identity
|
||
|
(mapcar
|
||
|
(lambda (maildir)
|
||
|
(concat "maildir:" (car maildir)))
|
||
|
mu4e-maildir-shortcuts) " OR ")
|
||
|
"All inboxes" ?i)))
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Notifications
|
||
|
#+begin_src emacs-lisp
|
||
|
(with-eval-after-load 'mu4e-alert
|
||
|
(mu4e-alert-set-default-style 'libnotify))
|
||
|
(mu4e-alert-enable-notifications)
|
||
|
#+end_src
|
||
|
|
||
|
Mode-line notifications
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq mu4e-enable-mode-line t)
|
||
|
#+end_src
|
||
|
|
||
|
** Use Org-Mode Tables In Emails
|
||
|
#+begin_src emacs-lisp
|
||
|
(add-hook 'message-mode-hook 'turn-on-orgtbl)
|
||
|
(add-hook 'message-mode-hook 'turn-on-orgstruct++)
|
||
|
#+end_src
|
||
|
|
||
|
** TODO Integration with Org-Mode
|
||
|
Store link to message if in header view, not to header query
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq org-mu4e-link-query-in-headers-mode nil)
|
||
|
#+end_src
|
||
|
|
||
|
** TODO [#A] When putting something on the Trash, it will be in the archive folder on gmail
|
||
|
Even when totally deleting it. It will stay on gmail. How to fix that?
|
||
|
|
||
|
** TODO Verify that sending mails with gmail account works and that there is no duplicate
|
||
|
|
||
|
Should check this variable: mu4e-sent-messages-behavior
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(setq mu4e-sent-messages-behavior 'delete)
|
||
|
#+end_src
|
||
|
|
||
|
And [[https://www.djcbsoftware.nl/code/mu/mu4e/Gmail-configuration.html][here]].
|
||
|
If I put it to delete, it works for gmail but not for the other ones...
|
||
|
Check [[https://github.com/djcb/mu/issues/179][here]].
|
||
|
|
||
|
** TODO Cheatsheet
|
||
|
| Command | Usage |
|
||
|
|---------+-----------------------|
|
||
|
| =C-j= | Next mail |
|
||
|
| =C-k= | Previous mail |
|
||
|
| =R/C/F= | Reply/Compose/Forward |
|
||
|
| =t= | Move to Archive |
|
||
|
| =d= | Move to Trash |
|
||
|
|
||
|
* PDF-Tools
|
||
|
#+begin_src emacs-lisp
|
||
|
(add-hook 'pdf-view-mode-hook (lambda() (linum-mode -1)))
|
||
|
#+end_src
|
||
|
|
||
|
* Custom command and leader keys
|
||
|
** Watch LaTeX file using latexmk
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/latex/watch ()
|
||
|
"Watch LaTeX file using latexmk"
|
||
|
(interactive)
|
||
|
(start-process-shell-command "latexmk-watch" "*latexmk-watch-output*"
|
||
|
"latexmk" (format "-pdflatex=\"xelatex -synctex=1 -shell-escape -interaction nonstopmode -output-directory='%s'\" -pdf -pvc -bibtex -f %s.tex"
|
||
|
(file-name-directory buffer-file-name)
|
||
|
(file-name-base buffer-file-name))))
|
||
|
(defun tdh/latex/watch/kill ()
|
||
|
"Kill the currently running TeX job."
|
||
|
(interactive)
|
||
|
(delete-process "latexmk-watch")
|
||
|
)
|
||
|
|
||
|
(map! :map org-mode-map
|
||
|
:n ",ow" 'tdh/latex/watch
|
||
|
:n ",ok" 'tdh/latex/watch/kill)
|
||
|
#+end_src
|
||
|
|
||
|
** Helm-Bibtex
|
||
|
#+begin_src emacs-lisp
|
||
|
(map! :map org-mode-map
|
||
|
:n ",ob" 'helm-bibtex
|
||
|
:n ",of" 'helm-bibtex-favorites
|
||
|
:n ",or" 'helm-resume)
|
||
|
#+end_src
|
||
|
|
||
|
** Open terminal in current directory
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun tdh/open-terminal-in-workdir ()
|
||
|
(interactive)
|
||
|
(call-process-shell-command
|
||
|
(concat "termite --directory=" default-directory) nil 0))
|
||
|
|
||
|
(map! :map org-mode-map :n ",ot" 'tdh/open-terminal-in-workdir)
|
||
|
#+end_src
|
||
|
|
||
|
** Open ranger in current directory
|
||
|
#+begin_src emacs-lisp
|
||
|
(defun open-ranger-in-workdir ()
|
||
|
(interactive)
|
||
|
(call-process-shell-command
|
||
|
(concat "termite --directory=" default-directory " --exec=ranger") nil 0))
|
||
|
|
||
|
(map! :map org-mode-map :n ",oo" 'open-ranger-in-workdir)
|
||
|
#+end_src
|
||
|
|
||
|
* Yassnippets
|
||
|
#+begin_src emacs-lisp
|
||
|
(push "~/.config/doom/snippets" yas-snippet-dirs)
|
||
|
(yas-global-mode 1)
|
||
|
#+end_src
|
||
|
|
||
|
* Path for Shell
|
||
|
#+begin_src emacs-lisp
|
||
|
;; (when (memq window-system '(mac ns x))
|
||
|
;; (exec-path-from-shell-initialize))
|
||
|
#+end_src
|
||
|
|
||
|
* Proxy
|
||
|
#+begin_src emacs-lisp :tangle no
|
||
|
(setq url-proxy-services
|
||
|
'(("http" . "proxy.esrf.fr:3128")
|
||
|
("https" . "proxy.esrf.fr:3128")
|
||
|
("no_proxy" . "^.*esrf.fr")))
|
||
|
#+end_src
|
||
|
|
||
|
* TODO [#B] Slack
|
||
|
:PROPERTIES:
|
||
|
:header-args:emacs-lisp+: :tangle no
|
||
|
:END:
|
||
|
#+begin_src emacs-lisp
|
||
|
(slack-register-team
|
||
|
:name "emacs-slack"
|
||
|
:default t
|
||
|
:client-id "299050134212.316863429523"
|
||
|
:client-secret "7168a660375090e517fe812ea2d136e5"
|
||
|
:token "xoxp-299050134212-299063259042-715794254097-7c319fdd63315620e86f1fad42c126a2"
|
||
|
:subscribed-channels '())
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(advice-add 'slack-counts-update :override #'ignore)
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq slack-prefer-current-team t)
|
||
|
#+end_src
|
||
|
|
||
|
* TODO [#C] Neomutt connection
|
||
|
https://mentat.za.net/blog/2018/10/31/using-org-mode-with-neomutt/
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(require 'org-protocol)
|
||
|
;; Call this function, which spawns neomutt, whenever org-mode
|
||
|
;; tries to open a link of the form mutt:message-id+goes_here@mail.gmail.com
|
||
|
|
||
|
(defun tdh/mutt-open-message (message-id)
|
||
|
"In neomutt, open the email with the the given Message-ID"
|
||
|
(let*
|
||
|
((message-id (replace-regexp-in-string "^/*" "" message-id))
|
||
|
(mail-file
|
||
|
(replace-regexp-in-string
|
||
|
"\n$" "" (shell-command-to-string
|
||
|
(format "mu find -n 1 -f l i:%s" message-id))))
|
||
|
(mail-dir (replace-regexp-in-string "/\\(cur\\|new\\|tmp\\)/$" ""
|
||
|
(file-name-directory mail-file)))
|
||
|
(message-id-escaped (regexp-quote message-id))
|
||
|
(mutt-keystrokes
|
||
|
(format "L~i %s\n\n" (shell-quote-argument message-id-escaped)))
|
||
|
(mutt-command (list "neomutt" "-R" "-f" mail-dir
|
||
|
"-e" (format "push '%s'" mutt-keystrokes))))
|
||
|
|
||
|
(message "Launching neomutt for message %s" message-id)
|
||
|
(call-process "setsid" nil nil
|
||
|
"-f" "termite" "-e"
|
||
|
(concat "neomutt -R -f " mail-dir " -e \"" (format "push '%s a l'\"" mutt-keystrokes)))))
|
||
|
|
||
|
;; Hook up `message:...` style URLs
|
||
|
(org-add-link-type "message" 'tdh/mutt-open-message)
|
||
|
#+end_src
|
||
|
|
||
|
* Abbreviations
|
||
|
Type the abbreviation and use =C-x a -= to create a new abbreviation.
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(setq-default abbrev-mode t)
|
||
|
;; save abbreviations upon exiting xemacs
|
||
|
(setq save-abbrevs t)
|
||
|
;; set the file storing the abbreviations
|
||
|
(setq abbrev-file-name "~/.config/doom/my-abbreviations.el")
|
||
|
;; reads the abbreviations file on startup
|
||
|
(quietly-read-abbrev-file)
|
||
|
#+end_src
|
||
|
|
||
|
* Other
|
||
|
Here are some additional functions/macros that could help you configure Doom:
|
||
|
|
||
|
- `load!' for loading external *.el files relative to this one
|
||
|
- `use-package' for configuring packages
|
||
|
- `after!' for running code after a package has loaded
|
||
|
- `add-load-path!' for adding directories to the `load-path', where Emacs
|
||
|
looks when you load packages with `require' or `use-package'.
|
||
|
- `map!' for binding new keys
|
||
|
|
||
|
To get information about any of these functions/macros, move the cursor over
|
||
|
the highlighted symbol at press 'K' (non-evil users must press 'C-c g k').
|
||
|
This will open documentation for it, including demos of how they are used.
|
||
|
|
||
|
You can also try 'gd' (or 'C-c g d') to jump to their definition and see how
|
||
|
they are implemented.
|
||
|
|
||
|
* Doom =init.el=
|
||
|
:PROPERTIES:
|
||
|
:header-args: :tangle ~/.config/doom/init.el
|
||
|
:END:
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(doom! :completion
|
||
|
company ; the ultimate code completion backend
|
||
|
helm ; the *other* search engine for love and life
|
||
|
ivy ; a search engine for love and life
|
||
|
|
||
|
:ui
|
||
|
doom ; what makes DOOM look the way it does
|
||
|
doom-dashboard ; a nifty splash screen for Emacs
|
||
|
hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
|
||
|
hydra
|
||
|
modeline ; snazzy, Atom-inspired modeline, plus API
|
||
|
nav-flash ; blink the current line after jumping
|
||
|
ophints ; highlight the region an operation acts on
|
||
|
(popup ; tame sudden yet inevitable temporary windows
|
||
|
+all ; catch all popups that start with an asterix
|
||
|
+defaults) ; default popup rules
|
||
|
unicode ; extended unicode support for various languages
|
||
|
vc-gutter ; vcs diff in the fringe
|
||
|
vi-tilde-fringe ; fringe tildes to mark beyond EOB
|
||
|
window-select ; visually switch windows
|
||
|
workspaces ; tab emulation, persistence & separate workspaces
|
||
|
|
||
|
:editor
|
||
|
(evil +everywhere); come to the dark side, we have cookies
|
||
|
fold ; (nigh) universal code folding
|
||
|
rotate-text ; cycle region at point between text candidates
|
||
|
snippets ; my elves. They type so I don't have to
|
||
|
word-wrap ; soft wrapping with language-aware indent
|
||
|
|
||
|
:emacs
|
||
|
dired ; making dired pretty [functional]
|
||
|
electric ; smarter, keyword-based electric-indent
|
||
|
ibuffer ; interactive buffer management
|
||
|
vc ; version-control and Emacs, sitting in a tree
|
||
|
|
||
|
:term
|
||
|
eshell ; a consistent, cross-platform shell (WIP)
|
||
|
|
||
|
:tools
|
||
|
debugger ; FIXME stepping through code, to help you add bugs
|
||
|
;;ein ; tame Jupyter notebooks with emacs
|
||
|
(eval +overlay) ; run code, run (also, repls)
|
||
|
(lookup ; helps you navigate your code and documentation
|
||
|
+docsets) ; ...or in Dash docsets locally
|
||
|
;;lsp
|
||
|
magit ; a git porcelain for Emacs
|
||
|
;;make ; run make tasks from Emacs
|
||
|
;;pass ; password manager for nerds
|
||
|
pdf ; pdf enhancements
|
||
|
;;rgb ; creating color strings
|
||
|
;;upload ; map local to remote projects via ssh/ftp
|
||
|
|
||
|
:checkers
|
||
|
syntax ; tasing you for every semicolon you forget
|
||
|
spell ; tasing you for misspelling mispelling
|
||
|
|
||
|
:lang
|
||
|
data ; config/data formats
|
||
|
emacs-lisp ; drown in parentheses
|
||
|
;;ess ; emacs speaks statistics
|
||
|
;;go ; the hipster dialect
|
||
|
;;(haskell +dante) ; a language that's lazier than I am
|
||
|
;;javascript ; all(hope(abandon(ye(who(enter(here))))))
|
||
|
latex ; writing papers in Emacs has never been so fun
|
||
|
markdown ; writing docs for people to ignore
|
||
|
(org ; organize your plain life in plain text
|
||
|
+dragndrop ; drag & drop files/images into org buffers
|
||
|
+hugo ; use Emacs for hugo blogging
|
||
|
+journal ;
|
||
|
;;+pomodoro ; be fruitful with the tomato technique
|
||
|
+present) ; using org-mode for presentations
|
||
|
;;python ; beautiful is better than ugly
|
||
|
sh ; she sells {ba,z,fi}sh shells on the C xor
|
||
|
;;web ; the tubes
|
||
|
|
||
|
:email
|
||
|
;;(mu4e +gmail)
|
||
|
|
||
|
:app
|
||
|
;;calendar
|
||
|
;;(rss +org) ; emacs as an RSS reader
|
||
|
;;write ; emacs for writers (fiction, notes, papers, etc.)
|
||
|
|
||
|
:config
|
||
|
literate
|
||
|
(default +bindings +smartparens))
|
||
|
#+end_src
|
||
|
|
||
|
* Doom =packages.el=
|
||
|
:PROPERTIES:
|
||
|
:header-args: :tangle ~/.config/doom/packages.el
|
||
|
:END:
|
||
|
|
||
|
#+begin_src emacs-lisp
|
||
|
(package! org-noter)
|
||
|
(package! poet-theme)
|
||
|
(package! org-alert)
|
||
|
(package! org-gcal)
|
||
|
(package! ox-latex-subfigure
|
||
|
:recipe (:host github :repo "linktohack/ox-latex-subfigure"))
|
||
|
(package! matlab-mode
|
||
|
:recipe (:host github :repo "matlab-mode/mirror"))
|
||
|
(package! org-ref)
|
||
|
#+end_src
|
||
|
|
||
|
* Snippets
|
||
|
:PROPERTIES:
|
||
|
:header-args:conf+: :comments none
|
||
|
:header-args:conf+: :mkdirp yes
|
||
|
:END:
|
||
|
** LaTeX
|
||
|
*** Coordinate
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/latex/coordinate
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :coordinate
|
||
|
# --
|
||
|
\coordinate[${1:->}] (${2:name}) at (${3:pointcoordinate});
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Draw
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/latex/draw
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :draw
|
||
|
# --
|
||
|
\draw[${1:->}] (${2:point1}) -- (${3:point2});
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Node
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/latex/node
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :node
|
||
|
# --
|
||
|
node[${1:below right}] (${2:name}) {${3:label}};
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Path
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/latex/path
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :path
|
||
|
# --
|
||
|
\path[${1}] (${2:point1}) -- (${3:point2});
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
** Matlab
|
||
|
*** Clear
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/matlab/clear
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :clear and close all
|
||
|
# --
|
||
|
clear; close all; clc;
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Function
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/matlab/function
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :function
|
||
|
# --
|
||
|
function [${4:outputs}] = ${1:functionName}(${2:inputs}, ${3:opts_param})
|
||
|
% $1 - Description
|
||
|
%
|
||
|
% Syntax: $1($2, $3)
|
||
|
%
|
||
|
% Inputs:
|
||
|
% - $2 -
|
||
|
% - $3 - Optionals parameters: structure with the following fields:
|
||
|
% -
|
||
|
%
|
||
|
% Outputs:
|
||
|
% - $4 -
|
||
|
|
||
|
%% Default value for opts
|
||
|
opts = struct(...
|
||
|
'${5:outputs}', ${6:default_value} ...
|
||
|
);
|
||
|
|
||
|
if exist('opts_param','var')
|
||
|
for opt = fieldnames($3)'
|
||
|
if sum(strcmp(fieldnames(opts), opt{1})) == 1
|
||
|
opts.(opt{1}) = $3.(opt{1});
|
||
|
else
|
||
|
warning(sprintf('%s is not a valid option.', opt{1}));
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
** Org Mode
|
||
|
*** Begin
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/begin
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :LaTeX Environment
|
||
|
# --
|
||
|
\begin{${1:equation}}
|
||
|
$0
|
||
|
\end{$1}
|
||
|
#+end_src
|
||
|
|
||
|
*** Block
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/block
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Org-Mode Block
|
||
|
#key: block
|
||
|
# --
|
||
|
,#+begin_${1:$$(let ((type (yas-choose-value '("src" "example" "quote" "verse" "center" "latex" "html" "ascii"))))
|
||
|
(if type (concat type (if (equal type "src")
|
||
|
(concat " " (yas-choose-value '("emacs-lisp" "latex" "python" "sh" "matlab")))))))}
|
||
|
$0
|
||
|
#+end_${1:$(car (split-string yas-text))}
|
||
|
#+end_src
|
||
|
|
||
|
*** Custom Box
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/cbox
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Custom Box
|
||
|
# --
|
||
|
#+attr_latex: :options [$1]{${2:blue}}{${3:ams nodisplayskip}}
|
||
|
#+begin_cbox
|
||
|
$0
|
||
|
#+end_cbox
|
||
|
#+end_src
|
||
|
|
||
|
*** Latex Class
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/latex-class
|
||
|
#name: latex-class
|
||
|
#key: lc
|
||
|
#expand-env: ((classes (mapcar 'car org-latex-classes)))
|
||
|
# --
|
||
|
#+latex_class: ${1:$$(yas-choose-value classes)}
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Name Caption Figure
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/name-caption-figure
|
||
|
#name: name-caption-figure
|
||
|
#key: ncf
|
||
|
# --
|
||
|
#+name: fig:${1:name}
|
||
|
#+caption: ${2:Caption}
|
||
|
[[${3:`(read-file-name "File: ")`}]]
|
||
|
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Bibliography with completion
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/bib
|
||
|
#name: bibliography with completion
|
||
|
#key: bib
|
||
|
# --
|
||
|
bibliography:${1:$$(yas-choose-value (org-ref-find-bibliography))}
|
||
|
#+end_src
|
||
|
|
||
|
*** Cite
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/cite
|
||
|
#name: org-ref cite link
|
||
|
#key: cite
|
||
|
# --
|
||
|
cite:${1:$$(completing-read
|
||
|
"bibtex key: "
|
||
|
(let ((bibtex-files (org-ref-find-bibliography)))(bibtex-global-key-alist)))}
|
||
|
#+end_src
|
||
|
|
||
|
*** Ref
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/ref
|
||
|
#name: org-ref ref link with completion
|
||
|
#key: ref
|
||
|
# --
|
||
|
ref:${1:$$(completing-read "label: " (org-ref-get-labels))}
|
||
|
#+end_src
|
||
|
|
||
|
*** Beamer - CBOX
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/bcbox
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Beamer Custom Box
|
||
|
# --
|
||
|
,*** ${1:@@latex:@@} :B_cbox:
|
||
|
,:PROPERTIES:
|
||
|
:BEAMER_env: cbox
|
||
|
:BEAMER_opt: {${2:blue}}{${3:ams nodisplayskip}}
|
||
|
:END:
|
||
|
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Code
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/code
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Code
|
||
|
# --
|
||
|
#+caption: ${1:Listing Caption}
|
||
|
#+label: lst:${2:listing_name}
|
||
|
,#+begin_src ${3:listing_language}
|
||
|
$0
|
||
|
,#+end_src
|
||
|
#+end_src
|
||
|
|
||
|
*** Equation
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/equation
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Equation
|
||
|
# --
|
||
|
#+name: eq:${1:equation_name}
|
||
|
\begin{equation}
|
||
|
$0
|
||
|
\end{equation}
|
||
|
#+end_src
|
||
|
|
||
|
*** Figure
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/figure
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Figure
|
||
|
# --
|
||
|
#+name: fig:${1:figure_name}
|
||
|
#+caption: ${2:Figure caption}
|
||
|
#+attr_latex: :${3:scale 1}
|
||
|
[[file:${4:figs/}$1.${5:pdf}]]
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Frac
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/frac
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :LaTeX Fraction
|
||
|
# --
|
||
|
\frac{$1}{$2} $0
|
||
|
#+end_src
|
||
|
|
||
|
*** Left
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/left
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Left Right mathematical delimitations
|
||
|
# --
|
||
|
\left$1 $0 \right$2
|
||
|
#+end_src
|
||
|
|
||
|
*** Mconfig
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mconfig
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Matlab-Configuration-Header
|
||
|
# --
|
||
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||
|
#+PROPERTY: header-args:matlab+ :tangle ${1:filename}.m
|
||
|
#+PROPERTY: header-args:matlab+ :comments org
|
||
|
#+PROPERTY: header-args:matlab+ :exports both
|
||
|
#+PROPERTY: header-args:matlab+ :results none
|
||
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||
|
#+PROPERTY: header-args:matlab+ :noweb yes
|
||
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||
|
#+PROPERTY: header-args:matlab+ :output-dir ${2:figs}
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Mdescription
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mdescription
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Measurement-Description
|
||
|
# --
|
||
|
,* Measurement description
|
||
|
,** Setup :ignore:
|
||
|
*Setup*:
|
||
|
|
||
|
,** Goal :ignore:
|
||
|
*Goal*:
|
||
|
|
||
|
,** Measurements :ignore:
|
||
|
*Measurements*:
|
||
|
|
||
|
Three measurements are done:
|
||
|
| Measurement File | Description |
|
||
|
|-------------------------+------------------------------|
|
||
|
| =mat/data_${1:001}.mat= | $2 |
|
||
|
|
||
|
Each of the measurement =mat= file contains one =data= array with 3 columns:
|
||
|
| Column number | Description |
|
||
|
|---------------+-------------------|
|
||
|
| 1 | $3 |
|
||
|
| 2 | $4 |
|
||
|
| 3 | Time |
|
||
|
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Mfigure
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mfigure
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Matlab-Figure
|
||
|
# --
|
||
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||
|
,#+begin_src matlab :var filepath="${2:figs}/$1.pdf" :var figsize="${3:full-tall}" :post pdf2svg(file=*this*, ext="png")
|
||
|
<<plt-matlab>>$0
|
||
|
,#+end_src
|
||
|
|
||
|
#+NAME: fig:$1
|
||
|
#+CAPTION: ${4:caption}${5: ([[./figs/$1.png][png]], [[./figs/$1.pdf][pdf]])}
|
||
|
[[file:$2/$1.png]]
|
||
|
#+end_src
|
||
|
|
||
|
*** Mfunction
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mfunction
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Matlab-Function
|
||
|
# --
|
||
|
,* ${1:Function Name}
|
||
|
:PROPERTIES:
|
||
|
:header-args:matlab+: :tangle src/${2:matlab_file_name}.m
|
||
|
:header-args:matlab+: :comments none :mkdirp yes :eval no
|
||
|
:END:
|
||
|
<<sec:$2>>
|
||
|
|
||
|
This Matlab function is accessible [[file:src/$2.m][here]].
|
||
|
|
||
|
,#+begin_src matlab
|
||
|
function [${4:in_data}] = $2(${3:in_data})
|
||
|
% $2 - $0
|
||
|
%
|
||
|
% Syntax: [$4] = $2($3)
|
||
|
%
|
||
|
% Inputs:
|
||
|
% - $3 -
|
||
|
%
|
||
|
% Outputs:
|
||
|
% - $4 -
|
||
|
|
||
|
end
|
||
|
,#+end_src
|
||
|
#+end_src
|
||
|
|
||
|
*** Mheader
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mheader
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Matlab-Header
|
||
|
# --
|
||
|
,* ${1:Heading Name}
|
||
|
:PROPERTIES:
|
||
|
:header-args:matlab+: :tangle matlab/${2:matlab_file_name}.m
|
||
|
:header-args:matlab+: :comments org :mkdirp yes
|
||
|
:END:
|
||
|
<<sec:$2>>
|
||
|
|
||
|
,** ZIP file containing the data and matlab files :ignore:
|
||
|
,#+begin_src bash :exports none :results none
|
||
|
if [ matlab/$2.m -nt data/$2.zip ]; then
|
||
|
cp matlab/$2.m $2.m;
|
||
|
zip data/$2 \
|
||
|
mat/data.mat \
|
||
|
$2.m
|
||
|
rm $2.m;
|
||
|
fi
|
||
|
,#+end_src
|
||
|
|
||
|
,#+begin_note
|
||
|
All the files (data and Matlab scripts) are accessible [[file:data/$2.zip][here]].
|
||
|
,#+end_note
|
||
|
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Minipage
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/minipage
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :minipage
|
||
|
# --
|
||
|
#+BEGIN_EXPORT latex
|
||
|
\begin{figure}[htbp]
|
||
|
\centering
|
||
|
\begin{minipage}[t]{0.49\linewidth}
|
||
|
#+END_EXPORT
|
||
|
#+attr_latex: :float nil :width 0.95\linewidth
|
||
|
$0
|
||
|
#+BEGIN_EXPORT latex
|
||
|
\end{minipage}%
|
||
|
\hfill%
|
||
|
\begin{minipage}[t]{0.49\linewidth}
|
||
|
#+END_EXPORT
|
||
|
#+attr_latex: :float nil :width 0.95\linewidth
|
||
|
|
||
|
#+BEGIN_EXPORT latex
|
||
|
\end{minipage}
|
||
|
\end{figure}
|
||
|
#+END_EXPORT
|
||
|
#+end_src
|
||
|
|
||
|
*** Minit
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/minit
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Matlab-Init
|
||
|
# --
|
||
|
,** Matlab Init :noexport:ignore:
|
||
|
,#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||
|
<<matlab-dir>>
|
||
|
,#+end_src
|
||
|
|
||
|
,#+begin_src matlab :exports none :results silent :noweb yes
|
||
|
<<matlab-init>>
|
||
|
,#+end_src
|
||
|
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Mtable
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mtable
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Matlab-Table
|
||
|
# --
|
||
|
,#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
||
|
data2orgtable(${1:data}, {${2:'rowlabel'}}, {${3:'collabel'}}, ' %.1f ');
|
||
|
,#+end_src
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Multicolumn
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/multicolumn
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Multcolumn
|
||
|
# --
|
||
|
#+attr_latex: :float multicolumn
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Subfigure
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/subfigure
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Subfigure
|
||
|
# --
|
||
|
#+name: fig:${1:figure_name}
|
||
|
#+caption: ${2:figure caption}
|
||
|
#+attr_latex: :environment subfigure :width 0.49\linewidth :align c
|
||
|
| file:${3:sub_fig_name}.${4:pdf} | file:${5:sub_fig_name}.${6:pdf} |
|
||
|
| <<fig:$3>> ${7:sub figure caption} | <<fig:$5>> ${8:sub figure caption} |
|
||
|
$0
|
||
|
#+end_src
|
||
|
|
||
|
*** Table
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/table
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Table
|
||
|
# --
|
||
|
#+name: tab:${1:table_name}
|
||
|
#+caption: ${2:Table caption}
|
||
|
#+attr_latex: :environment tabularx :width ${3:\linewidth} :align ${4:lXX}
|
||
|
#+attr_latex: :center t :booktabs t :float t
|
||
|
| $0 | | |
|
||
|
|---+---+---|
|
||
|
| | | |
|
||
|
#+end_src
|
||
|
|
||
|
*** Tikz
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/tikz
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Tikz figure
|
||
|
# --
|
||
|
,#+begin_src latex :file ${1:figure_name}.pdf :post pdf2svg(file=*this*, ext="png") :exports both
|
||
|
\begin{tikzpicture}
|
||
|
$0
|
||
|
\end{tikzpicture}
|
||
|
,#+end_src
|
||
|
#+end_src
|
||
|
|
||
|
*** Tikzfig
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/tikzfig
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Tikz Figure
|
||
|
# --
|
||
|
#+NAME: fig:${1:figure_name}
|
||
|
#+HEADER: :headers '("\\\\usepackage{tikz}" "\\\\usepackage{import}" "\\\\import{$HOME/Cloud/thesis/LaTeX/}{config.tex}")
|
||
|
#+HEADER: :imagemagick t :fit yes :iminoptions -scale 100% -density 150 :imoutoptions -quality 100
|
||
|
#+HEADER: :results raw replace :buffer no :eval no-export :exports both :mkdirp yes
|
||
|
#+HEADER: :output-dir ${2:figs}
|
||
|
,#+begin_src latex :file $1.pdf :post pdf2svg(file=*this*, ext="png") :exports both
|
||
|
\begin{tikzpicture}
|
||
|
$0
|
||
|
\end{tikzpicture}
|
||
|
,#+end_src
|
||
|
|
||
|
#+NAME: fig:$1
|
||
|
#+CAPTION: ${3:Caption}
|
||
|
#+RESULTS: fig:$1
|
||
|
#+end_src
|
||
|
|
||
|
*** Tikzheader
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/tikzheader
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Tikz Header
|
||
|
# --
|
||
|
,* ${1:Title/Description of the figure}
|
||
|
,#+begin_src latex :file ${2:figure_name}.pdf :tangle figs/$2.tex :exports ${3:both}
|
||
|
\begin{tikzpicture}
|
||
|
$0
|
||
|
\end{tikzpicture}
|
||
|
,#+end_src
|
||
|
|
||
|
#+name: fig:$2
|
||
|
#+caption: $1 ([[./figs/$2.png][png]], [[./figs/$2.pdf][pdf]], [[./figs/$2.tex][tex]]).
|
||
|
#+RESULTS:
|
||
|
[[file:./figs/$2.png]]
|
||
|
#+end_src
|
||
|
|
||
|
*** User-config
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/user-config
|
||
|
# -*- mode: snippet -*-
|
||
|
# name: user-config
|
||
|
# key: uc
|
||
|
# --
|
||
|
,#+begin_src emacs-lisp :tangle user-config.el
|
||
|
$1
|
||
|
,#+end_src
|
||
|
#+end_src
|
||
|
|
||
|
*** User-init
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/user-init
|
||
|
# -*- mode: snippet -*-
|
||
|
# name: user-init
|
||
|
# key: ui
|
||
|
# --
|
||
|
,#+begin_src emacs-lisp :tangle user-init.el
|
||
|
$1
|
||
|
,#+end_src
|
||
|
#+end_src
|
||
|
|
||
|
*** Wrap
|
||
|
#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/wrap
|
||
|
#contributor : Thomas Dehaeze <dehaeze.thomas@gmail.com>
|
||
|
#name :Wrap
|
||
|
# --
|
||
|
#+attr_latex: :float wrap
|
||
|
$0
|
||
|
#+end_src
|