From cde58c3f2d37e5ed2f96459023645b6c2473bb3a Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Tue, 26 May 2020 08:39:24 +0200 Subject: [PATCH] Add org-roam-bibtex, improve key bindings --- dotfiles/doom.org | 482 +++++++++++++++++++++++++----------- dotfiles/emacs-snippets.org | 328 ++++++++++++------------ 2 files changed, 500 insertions(+), 310 deletions(-) diff --git a/dotfiles/doom.org b/dotfiles/doom.org index f9231c6..16484da 100644 --- a/dotfiles/doom.org +++ b/dotfiles/doom.org @@ -1,7 +1,5 @@ #+TITLE: Doom Emacs Configuration :DRAWER: -#+STARTUP: overview - #+LANGUAGE: en #+EMAIL: dehaeze.thomas@gmail.com #+AUTHOR: Dehaeze Thomas @@ -29,9 +27,13 @@ https://github.com/nmartin84/.doom.d/blob/master/config.org Documentation: - https://github.com/hlissner/doom-emacs/blob/develop/docs/index.org +When changing =init.el= or =package.el=, tangle the files and then run =doom sync=. +After that, restart Emacs with =spc q r=. + * Useful Bindings - =align-regexp=: equivalent of [[https://github.com/junegunn/vim-easy-align][vim-easy-align]]. Very useful to align tables and stuff +** General Bindings | =spc := | Execute command | | =spc <= | Switch to buffer | | =spc X= | org-capture | @@ -58,29 +60,38 @@ Documentation: | =spc m s= | org-schedule | | =spc m t= | org-todo | +** Org-Babel Bindings +| =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 | -| 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 | +** Evil bindings + +| ~gv~ | Selects the previous visual | +| ~o~ in visual mode | go to the `Other` end of the selection | +| ~g=~ and ~g-~ | Increase/decrement number | +| ~t~ followed by any char | goes "till" next character (not included) | +| ~f~ followed by any char | "find" next character (included) | +| ~yt.~ | yank until next ~.~ | * Basic Configuration ** Personal Information @@ -188,6 +199,36 @@ Turn off auto-fill mode that add line breaks. (setq magit-diff-refine-hunk 'all) #+end_src +** Dired +- =C-c C-e= Writable Dired mode, when changes are done =C-c C-c=. + This works also with =C-x C-q= +- =C-c C-r= use =rsync= to copy file in the background + +- =+= Create a directory +- =R= Rename / move +- =C= Copy +- =d= Delete +- =m= Mark +- =U= unmark all marked +- =t= invert the selection +- =u= unmark / undelete +- =x= actually delete files/directories marked for deletion +- =!= Execute shell command on this file, or currently marked files +- =%m= mark by pattern +- =o= sort by time/name + +- =(= Hide details +- =)= Show git infos + + +#+begin_src emacs-lisp + (use-package! dired-narrow + :config + (map! :map dired-mode-map + :n "f" + 'dired-narrow-fuzzy)) +#+end_src + ** PDF-Tools #+begin_src emacs-lisp (use-package! pdf-tools @@ -202,6 +243,21 @@ Turn off auto-fill mode that add line breaks. (yas-global-mode 1) #+end_src +** Ox-Hugo +#+begin_src emacs-lisp + (defun tdh-export-everything-to-hugo () + "Export all the .org files in the specified directory to markdown using Hugo" + (interactive) + (setq org-files (directory-files (read-directory-name "Directory:" "/home/thomas/Cloud/brain/") t "org$" t)) + + (while org-files + (setq current-org-file (car org-files)) + (message "Exporting %s" current-org-file) + (find-file current-org-file) + (org-hugo-export-to-md) + (setq org-files (cdr org-files)))) +#+end_src + * Org Mode - http://cachestocaches.com/2016/9/my-workflow-org-agenda/ - http://doc.norang.ca/org-mode.html#TodoKeywords @@ -209,6 +265,7 @@ Turn off auto-fill mode that add line breaks. ** Org General Config #+begin_src emacs-lisp + (setq org-directory "~/Cloud/org/") (after! org (setq org-directory "~/Cloud/org/") @@ -225,6 +282,7 @@ Turn off auto-fill mode that add line breaks. ;; Indent according to the outline structure (setq org-startup-indented t) + (setq org-startup-folded t) ;; Record the information of when the task was marked as DONE (setq org-log-done 'time) @@ -250,10 +308,8 @@ Display the real size of images and not the one set with =attr_latex: :width \li ** Org Links #+begin_src emacs-lisp (after! org - (map! :map org-mode-map "C-c l" 'org-store-link) - (setq org-link-abbrev-alist - '(("bib" . "~/Cloud/brain/references.bib::%s") + '(("bib" . "~/Cloud/brain/biblio/references.bib::%s") ("notes" . "~/Cloud/brain/%s.org") ("papers" . "~/Cloud/pdfs/%s.pdf"))) ) @@ -365,8 +421,6 @@ Archive subtrees under the same hierarchy as original in the archive files General configuration #+begin_src emacs-lisp (after! org - (map! :map org-mode-map "C-c a" 'org-agenda) - ;; File to save todo items (setq org-agenda-files (list "~/Cloud/org/")) @@ -544,11 +598,6 @@ Documentation: - Template expansion: https://orgmode.org/manual/Template-expansion.html#Template-expansion - Capture protocol: https://orgmode.org/manual/capture-protocol.html -#+begin_src emacs-lisp - (after! org - (map! :map org-mode-map "C-c c" 'org-capture)) -#+end_src - #+begin_src emacs-lisp (after! org (setq org-capture-templates @@ -657,7 +706,7 @@ Do not export headline with the =:ignore:= tag: (setq org-html-wrap-src-lines nil) ;; Export with css class instead of inline css - (setq org-html-htmlize-output-type 'css) + (setq org-html-htmlize-output-type 'nil) ) #+end_src @@ -959,18 +1008,18 @@ https://emacs.stackexchange.com/questions/30575/adding-latex-newpage-before-a-he #+begin_src emacs-lisp (after! org - (defun org/get-headline-string-element (headline backend info) + (defun tdh-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) + (defun tdh-ensure-latex-clearpage (headline backend info) (when (org-export-derived-backend-p backend 'latex) - (let ((elmnt (org/get-headline-string-element headline backend info))) + (let ((elmnt (tdh-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) + 'tdh-ensure-latex-clearpage) ) #+end_src @@ -991,7 +1040,7 @@ https://emacs.stackexchange.com/questions/30575/adding-latex-newpage-before-a-he (after! org ;; Setup default option for image size when exporting to LaTeX (setq org-latex-image-default-scale "") - (setq org-latex-image-default-width "") + (setq org-latex-image-default-width "\\linewidth") (setq org-latex-image-default-height "") (setq org-latex-image-default-option "") @@ -1004,6 +1053,9 @@ https://emacs.stackexchange.com/questions/30575/adding-latex-newpage-before-a-he ;; Settings to export code with `minted' instead of `verbatim'. (setq org-latex-listings 'minted) + ;; Set the following as images + (setq org-latex-inline-image-rules '(("file" . "\\.\\(pdf\\|jpeg\\|jpg\\|png\\|ps\\|eps\\|tikz\\|pgf\\|svg\\|gif\\)\\'"))) + ;; 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")) @@ -1092,24 +1144,12 @@ https://emacs.stackexchange.com/questions/156/emacs-function-to-convert-an-arbit (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 +https://kitchingroup.cheme.cmu.edu/blog/2016/11/07/Better-equation-numbering-in-LaTeX-fragments-in-org-mode/ + #+begin_src emacs-lisp (after! org - (defun org-renumber-environment (orig-func &rest args) + (defun tdh-org-renumber-environment (orig-func &rest args) "A function to inject numbers in LaTeX fragment previews." (let ((results '()) (counter -1) @@ -1150,7 +1190,7 @@ https://emacs.stackexchange.com/questions/156/emacs-function-to-convert-an-arbit (apply orig-func args)) - (advice-add 'org-create-formula-image :around #'org-renumber-environment) + (advice-add 'org-create-formula-image :around #'tdh-org-renumber-environment) ) #+end_src @@ -1173,15 +1213,15 @@ https://www.reddit.com/r/orgmode/comments/7u2n0h/tip_for_defining_latex_macros_f (defun org-babel-execute:latex-macros (body _params) (concat - "\n#+HTML_HEAD_EXTRA:
\\(\n" - (prefix-all-lines "#+HTML_HEAD_EXTRA: " body) - "\n#+HTML_HEAD_EXTRA: \\)
\n")) + "\n#+begin_export html\n
\\(\n" + body + "\n\\)
\n#+end_export\n")) ) #+end_src -** TODO Org Projects -#+begin_src emacs-lisp :tangle no +** Org Projects +#+begin_src emacs-lisp (setq org-publish-project-alist '(("config" :base-directory "~/.config/literate-dotfiles/dotfiles/" @@ -1239,7 +1279,7 @@ https://www.reddit.com/r/orgmode/comments/7u2n0h/tip_for_defining_latex_macros_f #+end_src ** TODO Org big org-project -#+begin_src emacs-lisp +#+begin_src emacs-lisp :tangle no (setq org-publish-project-alist '(("website" :components ("nass-simscape" "nass-simscape-images")) @@ -1418,7 +1458,50 @@ https://www.reddit.com/r/emacs/comments/d3a8or/pretty_org_tables_in_the_buffer_c ) #+end_src -** Custom Keybindings - =,= leader key +** TODO [#A] Custom Keybindings - =,= leader key and =C-c= + +| | | +|---------+-------------------| +| =C-c a= | Org Agenda | +| =C-c n= | Narrow to Subtree | +| =C-c l= | Org Link | + +#+begin_src emacs-lisp + (after! org + (map! :map org-mode-map + (:desc "Org Agenda" + :ni "C-c a" 'org-agenda) + (:desc "Archive" + :n "C-c A" 'org-archive-subtree) + (:desc "Org Capture" + :ni "C-c c" 'org-capture) + (:desc "Store Link" + :ni "C-c l" 'org-store-link) + (:desc "Narrow Subtree" + :ni "C-c n" 'org-toggle-narrow-to-subtree) + (:desc "Org Noter" + :ni "C-c N" 'org-noter) + (:desc "Align Block" + :ni "C-c =" 'tdh-align-src-block) + (:desc "Insert Reference" + :ni "C-c r" 'org-ref-insert-ref-link) + (:desc "Insert Image" + :ni "C-c i" 'tdh-insert-image-org-link) + (:desc "Insert Image SXIV" + :ni "C-c I" 'tdh-insert-image-org-link-sxiv) + (:desc "Link to next Figure" + :ni "C-c f" 'tdh-insert-link-to-next-figure) + (:desc "Link to previous Figure" + :ni "C-c F" 'tdh-insert-link-to-previous-figure) + (:desc "Insert Screenshot" + :ni "C-c s" 'tdh-insert-screenshot-org-link) + (:desc "Find Roam" + :ni "C-c r" 'orb-find-non-ref-file) + (:desc "Insert Roam" + :ni "C-c R" 'orb-insert-non-ref) + )) +#+end_src + *** Insert Elements =,i= Insert Link to paper #+begin_src emacs-lisp @@ -1494,12 +1577,17 @@ Take Screenshot and insert a link: #+begin_src emacs-lisp (defun tdh-insert-screenshot-org-link () - "Capture screenshot and insert the resulting file. + "Capture screenshot and insert the resulting file. The screenshot tool is determined by `org-download-screenshot-method'." (interactive) - (setq filename (concat "./figs/" (read-string "Enter file name:") ".png")) - (shell-command (concat "maim -s " filename)) - (insert (format "[[file:%s]]" filename)) + (if (string-match "_" (file-name-base buffer-file-name)) + (setq filename (read-string "Enter file name:" (car (split-string (file-name-base buffer-file-name) "_")))) + (setq filename (read-string "Enter file name:"))) + (setq filepath (concat "./figs/" filename ".png")) + (shell-command (concat "maim -s " filepath)) + (insert (format "#+name: fig:%s\n#+caption:\n[[file:%s]]" filename filepath)) + (search-backward "caption") + (end-of-line) ) #+end_src @@ -1513,6 +1601,16 @@ Insert link to next figure: ) #+end_src +Insert link to previous figure: +#+begin_src emacs-lisp + (defun tdh-insert-link-to-previous-figure () + (interactive) + (save-excursion + (re-search-backward "^#\\+name:\s*\\(fig:.*\\)" nil t 1)) + (insert (concat "[[" (match-string 1) "]]")) + ) +#+end_src + Map Keys #+begin_src emacs-lisp (after! org @@ -1524,6 +1622,7 @@ Map Keys :n "F" 'tdh-insert-image-org-link-sxiv :n "i" 'tdh-insert-phone-picture :n "l" 'tdh-insert-link-to-next-figure + :n "L" 'tdh-insert-link-to-previous-figure :n "s" 'tdh-insert-screenshot-org-link))) #+end_src @@ -1581,7 +1680,7 @@ Map Keys (:prefix (",r" . "References") :n "b" 'helm-bibtex :n "B" 'helm-bibtex-with-local-bibliography - :n "f" 'helm-bibtex-favorites + :n "f" 'tdh-helm-bibtex-favorites :n "r" 'helm-resume))) #+end_src @@ -1635,6 +1734,12 @@ Don't ask for confirmation when evaluating following blocs (setq org-confirm-babel-evaluate 'tdh-org-confirm-babel-evaluate)) #+end_src +Default header arguments. +#+begin_src emacs-lisp + (after! org + (setq org-babel-default-header-args '((:eval . "no-export")))) +#+end_src + Use the current window for C-c ' source editing #+begin_src emacs-lisp (after! org @@ -1788,11 +1893,11 @@ when inside a source block. Otherwise, keep the normal behavior for =ctrl-ret=. #+begin_src emacs-lisp (defun tdh-ctrl-ret () (interactive) - (defun in-src-block-p () + (defun tdh-in-src-block-p () "Returns t when the point is inside a source code block" (string= "src" (org-in-block-p '("src")))) - (if (in-src-block-p) + (if (tdh-in-src-block-p) (progn (org-babel-execute-src-block) (org-babel-next-src-block)) @@ -1889,11 +1994,11 @@ This function: #+begin_src emacs-lisp (defun tdh-ctrl-shift-ret () (interactive) - (defun in-src-block-p () + (defun tdh-in-src-block-p () "Returns t when the point is inside a source code block" (string= "src" (org-in-block-p '("src")))) - (if (in-src-block-p) + (if (tdh-in-src-block-p) (let ((lang (nth 0 (org-babel-get-src-block-info)))) (if (string= lang "matlab") (if (region-active-p) @@ -1916,11 +2021,11 @@ This function: #+begin_src emacs-lisp (defun tdh-align-src-block () (interactive) - (defun in-src-block-p () + (defun tdh-in-src-block-p () "Returns t when the point is inside a source code block" (string= "src" (org-in-block-p '("src")))) - (if (in-src-block-p) + (if (tdh-in-src-block-p) (progn (org-edit-special) (evil-indent (point-min) (point-max)) @@ -1928,12 +2033,6 @@ This function: (org-table-eval-formula))) #+end_src -#+begin_src emacs-lisp - (map! :after evil-org - :map evil-org-mode-map - :n "C-c =" #'tdh-align-src-block) -#+end_src - ** Helping Functions - Tangling =,b= Org-Babel Tangle Sub-tree #+begin_src emacs-lisp @@ -1999,8 +2098,8 @@ Nice Functions: (setq org-ref-bibliography-notes "~/Cloud/brain") ;; Bibliography File - (setq reftex-default-bibliography '("~/Cloud/brain/references.bib")) - (setq org-ref-default-bibliography '("~/Cloud/brain/references.bib")) + (setq reftex-default-bibliography '("~/Cloud/brain/biblio/references.bib")) + (setq org-ref-default-bibliography '("~/Cloud/brain/biblio/references.bib")) ;; Folder where all the pdf are located (setq org-ref-pdf-directory "~/Cloud/pdfs") @@ -2032,10 +2131,12 @@ Nice Functions: ".pdf")))) t) - (map! - :map org-mode-map - (:desc "Insert Link" - :ni "C-c i" #'org-ref-insert-ref-link)) + ;; Let Mathjax deals with equation reference + (defun org-ref-eqref-export (keyword desc format) + (cond + ((eq format 'latex) (format "\\eqref{%s}" keyword)) + ((eq format 'html) (format "\\eqref{%s}" keyword)) + ((eq format 'md) (format "\\eqref{%s}" keyword)))) ) #+end_src @@ -2099,16 +2200,32 @@ Nice Functions: "%?" :file-name "${slug}" :head ,(concat "#+TITLE: ${title}\n" - "#+SETUPFILE ./org-roam-setup-file.org\n" + "#+SETUPFILE: ./setup/org-setup-file.org\n" + "#+HUGO_SECTION: zettels\n" "\n" "- Tags ::\n" - "\n") + "\n" + "* Bibliography :ignore:\n" + "bibliography:./biblio/references.bib" + ) + :unnarrowed t))) + (setq org-roam-capture-ref-templates + `(("r" "ref" plain (function org-roam--capture-get-point) + "%?" + :file-name "${slug}" + :head ,(concat "#+TITLE: ${title}\n" + "#+SETUPFILE: ./setup/org-setup-file.org\n" + "#+HUGO_SECTION: websites\n" + "#+ROAM_KEY: ${ref}\n" + "\n" + "- Tags ::\n" + ) :unnarrowed t))) ) #+end_src #+begin_src emacs-lisp - (defun my/org-roam--backlinks-list (file) + (defun tdh-org-roam--backlinks-list (file) (if (org-roam--org-roam-file-p file) (--reduce-from (concat acc (format "- [[file:%s][%s]]\n" @@ -2117,23 +2234,24 @@ Nice Functions: "" (org-roam-db-query [:select [from] :from links :where (= to $s1)] file)) "")) - (defun my/org-export-preprocessor (backend) - (let ((links (my/org-roam--backlinks-list (buffer-file-name)))) + (defun tdh-org-export-preprocessor (backend) + (let ((links (tdh-org-roam--backlinks-list (buffer-file-name)))) (unless (string= links "") (save-excursion (goto-char (point-max)) (insert (concat "\n* Backlinks\n") links))))) - (add-hook 'org-export-before-processing-hook 'my/org-export-preprocessor) + (add-hook 'org-export-before-processing-hook 'tdh-org-export-preprocessor) #+end_src ** Helm-Bibtex ([[https://github.com/tmalsburg/helm-bibtex][link]]) #+begin_src emacs-lisp (use-package! helm-bibtex + :after-call helm-bibtex :init :config ;; Bibliography file - (setq bibtex-completion-bibliography "~/Cloud/brain/references.bib") + (setq bibtex-completion-bibliography "~/Cloud/brain/biblio/references.bib") ;; Directory with all the pdfs (setq bibtex-completion-library-path "~/Cloud/pdfs") @@ -2160,32 +2278,57 @@ Nice Functions: ;; Template used when creating new Note file (setq bibtex-completion-notes-template-multiple-files (concat "#+TITLE: ${title}\n" - "#+NOTER_DOCUMENT: ../pdfs/${=key=}.pdf\n" - "#+ROAM_KEY: cite:${=key=}\n" + "#+SETUPFILE: ./setup/org-setup-file.org\n" + "#+HUGO_SECTION: ${=type=}\n" + "#+ROAM_KEY: ${=key=}\n" "\n" - "- Author :: ${author}\n" + "- Tags ::\n" + "- Reference :: cite:${=key=}\n" + "- Author(s) :: ${author}\n" "- Year :: ${year}\n" - "- DOI :: ${DOI}\n" - "\n")) + "\n" + "* ${author-abbrev} (${year}): ${title} :${=type=}:ignore:\n" + ":PROPERTIES:\n" + ":NOTER_DOCUMENT: ../pdfs/${=key=}.pdf\n" + ":END:\n" + "\n" + "* Bibliography :ignore:\n" + "bibliography:./biblio/references.bib" + )) ;; Make "Edit notes" the default action (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) (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) + (helm-add-action-to-source "Open PDF Externally" 'tdh-open-pdf-externally helm-source-bibtex 1) + + (helm-add-action-to-source "Insert Link to Note" 'tdh-insert-link-to-note helm-source-bibtex 2) ) #+end_src +#+begin_src emacs-lisp + (defun tdh-insert-link-to-note (key) + "Insert a link to a note associated with the bibtex entry." + (if (and bibtex-completion-notes-path + (f-directory? bibtex-completion-notes-path)) + (let* ((path (f-join bibtex-completion-notes-path + (s-concat key bibtex-completion-notes-extension)))) + (if (file-exists-p path) + (insert (concat "[[" (file-relative-name path) "][Notes]]")) + (message "No note file associated")) + ))) +#+end_src + Open pdf externally #+begin_src emacs-lisp - (defun tdehaeze/open-pdf-externally (key) + (defun tdh-open-pdf-externally (key) (call-process "zathura" nil 0 nil (nth 0 (-cons-to-list (bibtex-completion-find-pdf key))))) #+end_src Special Commands #+begin_src emacs-lisp - (defun helm-bibtex-favorites (&optional arg) + (defun tdh-helm-bibtex-favorites (&optional arg) "Search Favorite BibTeX entries" (interactive "P") (helm-bibtex arg nil "favorite ")) @@ -2213,33 +2356,82 @@ List all element of the bibliography without pdf associated ) #+end_src -** Org-Roam-Bibtex ([[https://github.com/Zaeph/org-roam-bibtex][link]]) +** Deft #+begin_src emacs-lisp - (use-package! org-roam-bibtex - :load-path "~/.config/doom/packages/org-roam-bibtex/" + (use-package! deft + :custom + (deft-directory "~/Cloud/brain/")) +#+end_src + +** Org-Roam-Bibtex ([[https://github.com/Zaeph/org-roam-bibtex][link]]) +Provides nice functions such as: +- =orb-find-non-ref-file= +- =orb-insert-non-ref= +- =orb-note-action= + +#+begin_src emacs-lisp + (use-package! org-roam-bibtex + :hook (org-roam-mode . org-roam-bibtex-mode) + :config + (setq org-roam-bibtex-preformat-keywords `("=key=" "title" "author" "year" "author-abbrev" "=type=")) + + (setq org-roam-bibtex-templates + `(("r" "ref" plain (function org-roam-capture--get-point) "" + :file-name "${=key=}" + :head ,(concat "#+TITLE: ${title}\n" + "#+SETUPFILE: ./setup/org-setup-file.org\n" + "#+HUGO_SECTION: ${=type=}\n" + "#+ROAM_KEY: ${ref}\n" + "\n" + "- Tags ::\n" + "- Reference :: ${ref}\n" + "- Author(s) :: ${author}\n" + "- Year :: ${year}\n" + "\n" + "* ${author-abbrev} (${year}): ${title} :${=type=}:ignore:\n" + ":PROPERTIES:\n" + ":NOTER_DOCUMENT: ../pdfs/${=key=}.pdf\n" + ":END:\n" + "\n" + "* Bibliography :ignore:\n" + "bibliography:./biblio/references.bib" + ) + :unnarrowed t))) + + (setq orb-note-actions-user '(("Open with Zathura" . tdh-open-bib-with-zathura))) + ) +#+end_src + +#+begin_src emacs-lisp + (defun tdh-open-bib-with-zathura (key) + "Open the pdf corresponding to the reference KEY with Zathura" + (if (listp key) + (setq key (car key))) + (call-process "zathura" nil 0 nil (org-ref-get-pdf-filename key))) +#+end_src + +** Org-Ref-Ox-Hugo ([[https://github.com/jethrokuan/org-ref-ox-hugo][link]]) +This package is used to correctly format the bibliography and links when exporting to hugo. + +#+begin_src emacs-lisp + (use-package! org-ref-ox-hugo + :load-path "~/.config/doom/packages/org-ref-ox-hugo/" :config - (org-roam-bibtex-mode) - (setq org-roam-bibtex-preformat-keywords `("=key=" "title" "author" "year" "author-abbrev" "=type=")) - - - - (setq org-roam-bibtex-template - `(("r" "ref" plain (function org-roam-capture--get-point) "" - :file-name "${=key=}" - :head ,(concat "#+TITLE: ${title}\n" - "#+SETUPFILE ./org-notes-setup-file.org\n" - "#+ROAM_KEY: ${ref}\n" - "\n" - "- Tags :: %?\n" - "- Reference :: ${ref}\n" - "- Author(s) :: ${author}\n" - "- Year :: ${year}\n" - "\n" - "* ${author-abbrev} (${year}): ${title} :${=type=}:ignore:\n" - ":PROPERTIES:\n" - ":NOTER_DOCUMENT: ../pdfs/${=key=}.pdf\n" - ":END:\n") - :unnarrowed t))) + (add-to-list 'org-ref-formatted-citation-formats + '("md" + ("article" . "${author}, *${title}*, ${journal}, *${volume}(${number})*, ${pages} (${year}). ${doi}") + ("inproceedings" . "${author}, *${title}*, In ${editor}, ${booktitle} (pp. ${pages}) (${year}). ${address}: ${publisher}.") + ("book" . "${author}, *${title}* (${year}), ${address}: ${publisher}.") + ("phdthesis" . "${author}, *${title}* (${year}). ${school}.") + ("inbook" . "${author}, *${title}*, In ${editor} (Eds.), ${booktitle} (pp. ${pages}) (${year}). ${address}: ${publisher}.") + ("incollection" . "${author}, *${title}*, In ${editor} (Eds.), ${booktitle} (pp. ${pages}) (${year}). ${address}: ${publisher}.") + ("proceedings" . "${editor} (Eds.), _${booktitle}_ (${year}). ${address}: ${publisher}.") + ("unpublished" . "${author}, *${title}* (${year}). Unpublished manuscript.") + ("misc" . "${author} (${year}). *${title}*. Retrieved from [${howpublished}](${howpublished}). ${note}.") + (nil . "${author}, *${title}* (${year})."))) + + (setq reference-link-class "reference-link") + (setq bibtex-entry-class "bibtex-entry") ) #+end_src @@ -2254,7 +2446,7 @@ List all element of the bibliography without pdf associated ** Clean Output Files #+begin_src emacs-lisp - (defun latex/clean () + (defun tdh-latex-clean () "Clean LaTeX output using latexmk" (interactive) (async-shell-command @@ -2265,7 +2457,7 @@ List all element of the bibliography without pdf associated )) (map! :map LaTeX-mode-map - :n ",C" 'latex/clean) + :n ",C" 'tdh-latex-clean) (add-hook 'TeX-mode-hook #'TeX-fold-mode) #+end_src @@ -2338,34 +2530,34 @@ List all element of the bibliography without pdf associated ** Key Bindings #+begin_src emacs-lisp - (defun matlab-add-breakpoint () + (defun tdh-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 () + (defun tdh-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 () + (defun tdh-matlab-list-breakpoints () (interactive) (matlab-shell-run-command (concat "dbstatus " (buffer-name)))) - (defun matlab-clear-breakpoints () + (defun tdh-matlab-clear-breakpoints () (interactive) (matlab-shell-run-command (concat "dbclear in " (buffer-name)))) - (defun matlab-go-to-file-directory () + (defun tdh-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 ",g" 'tdh-matlab-go-to-file-directory + :n ",da" 'tdh-matlab-add-breakpoint + :n ",dr" 'tdh-matlab-remove-breakpoint + :n ",dL" 'tdh-matlab-list-breakpoints + :n ",dc" 'tdh-matlab-clear-breakpoints :n ",dl" 'gud-cont :n ",ds" 'gud-step :n ",dn" 'gud-next @@ -2397,7 +2589,7 @@ Send math and source code: | =d= | Move to Trash | ** Helping function -This is a helper to help determine which account context I am in based on the folder in my maildir the email (eg. ~/.mail/nine27) is located in. +This is a helper to help determine which account context I am in based on the folder in my maildir the email (eg. ~/.mail/nine27) is located in. #+begin_src emacs-lisp (defun mu4e-message-maildir-matches (msg rx) (when rx @@ -2582,10 +2774,11 @@ Choose account label to feed msmtp -a option based on From header in Message buf :ui doom ; what makes DOOM look the way it does + deft 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 + (modeline + +light) ; snazzy, Atom-inspired modeline, plus API ophints ; highlight the region an operation acts on (popup ; tame sudden yet inevitable temporary windows +all ; catch all popups that start with an asterix @@ -2593,7 +2786,6 @@ Choose account label to feed msmtp -a option based on From header in Message buf 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 @@ -2606,7 +2798,7 @@ Choose account label to feed msmtp -a option based on From header in Message buf :emacs (dired +icons) ; making dired pretty [functional] electric ; smarter, keyword-based electric-indent - ibuffer ; interactive buffer management + (ibuffer +icons) ; interactive buffer management vc ; version-control and Emacs, sitting in a tree :term @@ -2676,7 +2868,9 @@ Choose account label to feed msmtp -a option based on From header in Message buf (package! matlab-mode :recipe (:host github :repo "matlab-mode/mirror")) (package! org-ref) + (package! org-roam-bibtex) (package! org-ql) (package! org-fancy-priorities) + (package! evil-escape :disable t) + (package! dired-narrow) #+end_src - diff --git a/dotfiles/emacs-snippets.org b/dotfiles/emacs-snippets.org index a68eee1..0e611fc 100644 --- a/dotfiles/emacs-snippets.org +++ b/dotfiles/emacs-snippets.org @@ -113,6 +113,14 @@ $0 \end{$1} #+end_src +** Caption +#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/caption +#contributor : Thomas Dehaeze +#name :Caption +# -- +#+caption: $0 +#+end_src + ** Block #+begin_src conf :tangle ~/.config/doom/snippets/org-mode/block #contributor : Thomas Dehaeze @@ -147,18 +155,6 @@ $0 $0 #+end_src -** TODO 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 @@ -177,7 +173,7 @@ cite:${1:$$(completing-read (let ((bibtex-files (org-ref-find-bibliography)))(bibtex-global-key-alist)))} #+end_src -** TODO Ref +** Ref #+begin_src conf :tangle ~/.config/doom/snippets/org-mode/ref #name: org-ref ref link with completion #key: ref @@ -229,8 +225,7 @@ $0 # -- #+name: fig:${1:figure_name} #+caption: ${2:Figure caption} -#+attr_latex: :${3:scale 1} -[[file:${4:figs/}$1.${5:pdf}]] +[[file:${3:figs/}$1.${4:pdf}]] $0 #+end_src @@ -250,128 +245,6 @@ $0 \left$1 $0 \right$2 #+end_src -** Mconfig -#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mconfig -#contributor : Thomas Dehaeze -#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 -#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 -#name :Matlab-Figure -# -- -,#+begin_src matlab :tangle no :exports results :results file replace - exportFig('figs/${1:filename}.pdf', 'width', '${2:full}', 'height', '${3:full}') -,#+end_src - -,#+name: fig:$1 -,#+caption: $0 -,#+RESULTS: -[[file:figs/$1.png]] -#+end_src - -** Mfunction -#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mfunction -#contributor : Thomas Dehaeze -#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: -<> - -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 -#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: -<> - -,** 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 @@ -397,34 +270,6 @@ $0 #+END_EXPORT #+end_src -** Minit -#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/minit -#contributor : Thomas Dehaeze -#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) - <> -,#+end_src - -,#+begin_src matlab :exports none :results silent :noweb yes - <> -,#+end_src - -$0 -#+end_src - -** Mtable -#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mtable -#contributor : Thomas Dehaeze -#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 @@ -532,7 +377,7 @@ $1 ,#+begin_src emacs-lisp :tangle user-init.el $1 ,#+end_src -#+end_src +#+end_Sec ** Wrap #+begin_src conf :tangle ~/.config/doom/snippets/org-mode/wrap @@ -542,3 +387,154 @@ $1 #+attr_latex: :float wrap $0 #+end_src + +** Matlab Specific +*** Mconfig +#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mconfig +#contributor : Thomas Dehaeze +#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 +#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 +#name :Matlab-Figure +# -- +,#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/${1:filename}.pdf', 'width', '${2:full}', 'height', '${3:full}'); +,#+end_src + +,#+name: fig:$1 +,#+caption: $0 +,#+RESULTS: +[[file:figs/$1.png]] +#+end_src + +*** Mfunction +#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mfunction +#contributor : Thomas Dehaeze +#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: +<> + +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 +#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: +<> + +,** 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 + +*** Minit +#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/minit +#contributor : Thomas Dehaeze +#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) + <> +,#+end_src + +,#+begin_src matlab :exports none :results silent :noweb yes + <> +,#+end_src + +$0 +#+end_src + +*** Mtable +#+begin_src conf :tangle ~/.config/doom/snippets/org-mode/mtable +#contributor : Thomas Dehaeze +#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