1465 lines
61 KiB
EmacsLisp
1465 lines
61 KiB
EmacsLisp
;;; org-settings.el --- Org settings -*- lexical-binding: t -*-
|
||
|
||
;; Package-Requires: ((emacs) (org-mode) (org-bullets) (org-cliplink))
|
||
|
||
;; This file is not part of GNU Emacs.
|
||
|
||
;; direct LaTeX (not org)
|
||
;; hyphen via AUCTeX (not installed)
|
||
;; https://tex.stackexchange.com/questions/282448/why-does-emacs-or-auctex-turns-into
|
||
|
||
;;; Commentary:
|
||
;; `org-export-default-language'
|
||
;; `org-options-keywords'
|
||
|
||
;; * Overview of modes and commands
|
||
;; --------------------------------
|
||
;;
|
||
;; ** `org-appear'
|
||
;; ---------------
|
||
;; auto toogle entities, emphasis markers, links, subscripts and superscripts,
|
||
;; keywords
|
||
;; `org-appear-autoentities', `org-appear-autoemphasis', `org-appear-autolinks'
|
||
;; `org-appear-autosubmarkers', `org-appear-autokeywords'
|
||
;; and from `org': `org-pretty-entries', `org-hide-emphasis-markers',
|
||
;; `org-link-descriptive', `org-hidden-keywords'
|
||
;;
|
||
;; ** Export `ox-reveal'
|
||
;; ---------------------
|
||
;; (org-export-get-all-options 'reveal)
|
||
;;
|
||
;; *** KEYWORDs
|
||
;; ------------
|
||
;; *Note*: Using an option which is also set in the configuration will
|
||
;; overwrite it.
|
||
;;
|
||
;; #+REVEAL_ROOT:
|
||
;; - path to reveal.js root directory, can be used once
|
||
;; - is defined in the configuration, see `org-reveal-root'
|
||
;;
|
||
;; #+REVEAL_EXTRA_CSS:
|
||
;; - path to css file, can be used multiple times
|
||
;; - is defined in the configuration, see `org-reveal-extra-css'
|
||
;;
|
||
;; #+REVEAL_POSTAMBLE:
|
||
;; - postamble content, can be used once
|
||
;; - is defined in the configuration, see `org-reveal-postamble'
|
||
;;
|
||
;; #+REVEAL_HLEVEL:
|
||
;; - can be configured, see `org-reveal-hlevel'
|
||
;;
|
||
;; #+REVEAL: split
|
||
;; #+REVEAL: split:t
|
||
;;
|
||
;; #+REVEAL_THEME:
|
||
;;
|
||
;; #+OPTIONS: reveal_title_slide:auto|"string"|nil
|
||
;; #+REVEAL_TITLE_SLIDE:
|
||
;; - path to css file, can be used multiple times
|
||
;; - can be configured, see `org-reveal-title-slide'
|
||
;;
|
||
;; #+REVEAL_TITLE_SLIDE_BACKGROUND: #123456|rgb(0,0,0)|./image/path.jpg
|
||
;; #+REVEAL_TITLE_SLIDE_BACKGROUND_SIZE: 200px
|
||
;; #+REVEAL_TITLE_SLIDE_BACKGROUND_REPEAT: repeat
|
||
;; #+REVEAL_TITLE_SLIDE_BACKGROUND_OPACITY: 0.2
|
||
;;
|
||
;; #+REVEAL_TOC_SLIDE_BACKGROUND: #123456|rgb(0,0,0)|./image/path.jpg
|
||
;; #+REVEAL_TOC_SLIDE_BACKGROUND_SIZE: 200px
|
||
;; #+REVEAL_TOC_SLIDE_BACKGROUND_REPEAT: repeat
|
||
;; #+REVEAL_TOC_SLIDE_BACKGROUND_OPACITY: 0.2
|
||
;;
|
||
;; #+REVEAL_DEFAULT_SLIDE_BACKGROUND: #123456|rgb(0,0,0)|./image/path.jpg
|
||
;; #+REVEAL_DEFAULT_SLIDE_BACKGROUND_SIZE: 200px
|
||
;; #+REVEAL_DEFAULT_SLIDE_BACKGROUND_POSITION:
|
||
;; #+REVEAL_DEFAULT_SLIDE_BACKGROUND_REPEAT: repeat
|
||
;; #+REVEAL_DEFAULT_SLIDE_BACKGROUND_TRANSITION:
|
||
;;
|
||
;; #+OPTIONS: reveal_width: org-reveal-width
|
||
;; #+OPTIONS: reveal_height: org-reveal-height
|
||
;; #+REVEAL_MARGIN: org-reveal-margin
|
||
;; #+REVEAL_MIN_SCALE: org-reveal-min-scale
|
||
;; #+REVEAL_MAX_SCALE: org-reveal-max-scale
|
||
;;
|
||
;; #+REVEAL_INIT_OPTIONS: slideNumber:true|“h.v”|“h/v”|“c”|“c/t”
|
||
;;
|
||
;; #+REVEAL_SLIDE_HEADER: css class slide-header
|
||
;; #+REVEAL_SLIDE_FOOTER: css class slide-footer
|
||
;; #+OPTIONS: reveal_global_header:t reveal_global_footer:t
|
||
;;
|
||
;; *** Properties
|
||
;; --------------
|
||
;; see `org-reveal-slide-section-tag' (org-element-property :xxx headline)
|
||
;; :PROPERTIES:
|
||
;; :reveal_background: #123456|rgb(0,0,0)|./image/path.jpg
|
||
;; :reveal_background_trans: slide
|
||
;; :reveal_background_size: 200px
|
||
;; :reveal_background_repeat: repeat
|
||
;; :reveal_background_opacity: 0.2
|
||
;; :reveal_background_iframe: https://domain.tld
|
||
;; :END:
|
||
;;
|
||
;; *** Variables
|
||
;; -------------
|
||
;; - `org-reveal-root' - string
|
||
;; - `org-reveal-extra-css' - string - multiple values separated by \n
|
||
;; - `org-reveal-postamble' - string - only one line
|
||
;; - `org-reveal-single-file' - t|nil
|
||
;; - `org-reveal-hlevel'
|
||
;;
|
||
;; {{(my-list-to-org-table (org-export-get-all-options 'reveal))}}
|
||
;;
|
||
|
||
;;; Code:
|
||
(defgroup my-org nil
|
||
"My org-mode concept mapping"
|
||
:prefix "my-org-"
|
||
:group 'my)
|
||
|
||
(defcustom my-org-default-notes-file (convert-standard-filename "~/.notes")
|
||
"Documention see `org-default-notes-file' in `org.el'."
|
||
:group 'my-org
|
||
:type '(choice file (const "~/.notes") (const "~/Sync/notes.org")))
|
||
|
||
(defcustom my-org-agenda-files nil
|
||
"Documention see `org-agenda-files' in `org.el'."
|
||
:group 'my-org
|
||
:type '(choice
|
||
(repeat :tag "List of files and directories" file)
|
||
(file :tag "Store list in a file\n" :value "~/.agenda_files")
|
||
(const "~/Sync/tasks.org")))
|
||
|
||
(defcustom my-org-refile-targets nil
|
||
"Documention see `org-refile-targets' in `org.el'.
|
||
|
||
Example:
|
||
Current buffer (nil) :maxlevel 3
|
||
All agenda files (variable org-agenda-files) Max Level number 3
|
||
Variable org-default-notes-file Max Level number 3"
|
||
:group 'my-org
|
||
:type '(repeat
|
||
(cons
|
||
(choice :value org-agenda-files
|
||
(const :tag "All agenda files" org-agenda-files)
|
||
(const :tag "Current buffer" nil)
|
||
(function) (variable) (file))
|
||
(choice :tag "Identify target headline by"
|
||
(cons :tag "Specific tag" (const :value :tag) (string))
|
||
(cons :tag "TODO keyword" (const :value :todo) (string))
|
||
(cons :tag "Regular expression" (const :value :regexp) (regexp))
|
||
(cons :tag "Level number" (const :value :level) (integer))
|
||
(cons :tag "Max Level number" (const :value :maxlevel) (integer))))))
|
||
|
||
(defcustom my-org-publish-project-base-directory "~/org/project/"
|
||
"Documention see :base-directory of `org-publish-project-alist'.
|
||
|
||
Used for the example in `my-org-publish-project-alist'."
|
||
:group 'my-org
|
||
:type '(choice directory (const "~/org/project/") (const "~/Sync/workspace/emacs/org/")))
|
||
|
||
(defcustom my-org-publish-project-publish-directory "~/public_html/"
|
||
"Documention see :publish-directory of `org-publish-project-alist'.
|
||
|
||
Used for the example in `my-org-publish-project-alist'."
|
||
:group 'my-org
|
||
:type '(choice directory (const "~/public_html/")))
|
||
|
||
(defcustom my-org-publish-project-alist nil
|
||
"Documention see `org-publish-project-alist' in `ox-publish.el'.
|
||
|
||
Example defines
|
||
org-notes and org-static with
|
||
base-directory to `my-org-publish-project-base-directory'
|
||
publishing-directory `my-org-publish-project-publish-directory'."
|
||
:group 'my-org
|
||
:type '(choice alist
|
||
(const :tag "Example" :value (list
|
||
;; The notes component
|
||
(list "org-notes"
|
||
:base-directory my-org-publish-project-base-directory
|
||
:base-extension "org"
|
||
:publishing-directory my-org-publish-project-publish-directory
|
||
:recursive t
|
||
:publishing-function org-html-publish-to-html
|
||
;;:publishing-function org-html-publish-to-tufte-html
|
||
:headline-levels 4 ; Just the default for this project.
|
||
:auto-preamble t
|
||
:auto-sitemap t ; Generate sitemap.org automatically...
|
||
:sitemap-filename "sitemap.org" ; ... call it sitemap.org (it's the default)...
|
||
:sitemap-title "Sitemap" ; ... with title 'Sitemap'.
|
||
)
|
||
;; The static component
|
||
(list "org-static"
|
||
:base-directory my-org-publish-project-base-directory
|
||
:base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
|
||
:publishing-directory my-org-publish-project-publish-directory
|
||
:recursive t
|
||
:publishing-function org-publish-attachment
|
||
)
|
||
;; The publish component
|
||
(list "org" :components (list "org-notes" "org-static"))))))
|
||
|
||
(defcustom my-org-brain-path (expand-file-name "brain" "~/org")
|
||
"Documention see `org-brain-path' in `ox-brain.el'."
|
||
:group 'my-org
|
||
:type '(choice directory
|
||
(const (expand-file-name "brain" "~/org"))
|
||
(const "~/Sync/workspace/emacs/org-brain")))
|
||
|
||
(defun my-org-commentary ()
|
||
"View org documentation in `outline-mode'."
|
||
(interactive)
|
||
(let ((buf "*Org: Commentary*"))
|
||
;; kill buffer if aleady open
|
||
(when (buffer-live-p (get-buffer buf))
|
||
(kill-buffer buf))
|
||
;; Use `finder-commentary' to generate the buffer.
|
||
(require 'finder)
|
||
(cl-letf (((symbol-function 'finder-summary) #'ignore))
|
||
(finder-commentary "org-settings"))
|
||
;; change commentary text
|
||
(let ((inhibit-read-only t))
|
||
;;(insert "org-settings.el\n\n")
|
||
;; point under headline
|
||
(forward-line 1)
|
||
(save-excursion
|
||
;; remove --- under headlines
|
||
(while (re-search-forward "^-+$" nil :noerror)
|
||
(replace-match ""))
|
||
;; replace `xxx' with =xxx=
|
||
(goto-char (point-min))
|
||
(while (re-search-forward (rx (and "`" (group (+? anything)) "'")) nil :noerror)
|
||
(replace-match (concat "=" (match-string 1) "=")))
|
||
;; find {{xxx}} and eval xxx
|
||
(goto-char (point-min))
|
||
(while (re-search-forward (rx (and "{{" (group (+? anything)) "}}")) nil :noerror)
|
||
(replace-match (eval (my-eval-string (match-string 1)))))
|
||
;; align all tables
|
||
(org-table-map-tables 'org-table-align)
|
||
))
|
||
(rename-buffer buf)
|
||
;; Enable `org-mode' and `view-mode' for user convenience.
|
||
(org-mode)
|
||
(view-mode 1)))
|
||
|
||
;; uses the org version from the org ELPA repository instead of the
|
||
;; one shipped with emacs. Therefore, any org related code should not
|
||
;; be loaded before, otherwise both versions will be loaded and will
|
||
;; conflict.
|
||
(use-package org
|
||
:commands org-mode
|
||
:delight (org-mode "Org") ;; "Org " "\u01F15E"
|
||
;;:bind (("C-c <del>" . org-mark-ring-goto)) ;; normally at C-c & but it is redefined by yasnippet
|
||
:init
|
||
;; (require 'org-loaddefs)
|
||
(setq org-export-backends '(ascii html icalendar latex md odt reveal tufte))
|
||
:config
|
||
(setq org-preview-latex-process-alist
|
||
'((dvipng :programs
|
||
("latex" "dvipng")
|
||
:description "dvi > png" :message "you need to install the programs: latex and dvipng." :image-input-type "dvi" :image-output-type "png" :image-size-adjust
|
||
(1.1 . 1.0)
|
||
:latex-compiler
|
||
("dvilualatex -interaction nonstopmode -output-directory %o %f")
|
||
:image-converter
|
||
("dvipng -D %D -T tight -bg Transparent -o %O %f"))
|
||
(dvisvgm :programs
|
||
("latex" "dvisvgm")
|
||
:description "dvi > svg (use-pacakge setq)" :message "you need to install the programs: latex and dvisvgm." :image-input-type "dvi" :image-output-type "svg" :image-size-adjust
|
||
(1.7 . 1.5)
|
||
:latex-compiler
|
||
("latex -interaction nonstopmode -output-directory %o %f")
|
||
:image-converter
|
||
("dvisvgm %o%b -n -b min -c %S -o %O")
|
||
;; ("dvisvgm %f -n -b min -c %S -o %O")
|
||
;; Creating LaTeX preview...
|
||
;; ERROR: can't open file '../../../../../../../tmp/orgtexvseQuS.dvi' for reading
|
||
;; NB: %o%b.dvi instead of %f forces use of absolute path
|
||
)
|
||
(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
|
||
(1.0 . 1.0)
|
||
:latex-compiler
|
||
("lualatex -interaction nonstopmode -output-directory %o %f")
|
||
:image-converter
|
||
("convert -density %D -trim -antialias %f -quality 100 %O"))))
|
||
(setq org-hidden-keywords nil) ;; hide keywords like `#+TITLE:` or not, see also `org-appear'
|
||
(setq org-hide-emphasis-markers nil) ;; hide emphasis marker *_=~/+, see also `org-appear'
|
||
(setq org-startup-folded nil) ;; nil = showall = #+STARTUP: showall
|
||
(setq org-startup-with-inline-images t) ;; #+STARTUP: inlineimages|noinlineimages, show inline images when loading a new Org file
|
||
(setq org-use-sub-superscripts '{}) ;; braces are *required* in order to trigger interpretations as sub/superscript, see also `org-export-with-sub-superscripts'. C-c C-x \ (`org-toggle-pretty-entities')
|
||
(setq org-pretty-entities nil) ;; so much trouble in an article, see also `org-appear' and [C-c C-x \] (`org-toggle-pretty-entities')
|
||
(setq org-pretty-entities-include-sub-superscripts t) ;; if `org-pretty-entities' is active include also sub-superscripts.
|
||
(setq org-image-actual-width '(600)) ;; image width displayed in org
|
||
(setq org-startup-with-latex-preview nil) ;; #+STARTUP: latexpreview|nolatexpreview
|
||
;; scale of latex image preview via `org-format-latex-options'. setting this here will overwrite settings in custom.el.
|
||
;; see also `org-preview-latex-process-alist', `org-preview-latex-default-process' and `org-format-latex-header' using `org-latex-default-packages-alist' and `org-latex-packages-alist'
|
||
(add-to-list 'org-latex-default-packages-alist '("" "eurosym" t) t) ;; add \euro{} (also to latex snippets)
|
||
(setq org-tag-persistent-alist '(("ignore" . ?i) ("noexport" . ?n)))
|
||
;; todo see also org-todo-keyword-faces and org-superstar-todo-bullet-alist
|
||
(setq org-todo-keywords ;; (x!) record a time stamp, (x@) add a note (with time), (y/z) entering the state / leaving the state
|
||
'((sequence "TODO(t)" "WAIT(w)" "|" "DONE(d)" "CANC(c)")))
|
||
(setq org-hierarchical-todo-statistics nil) ;; TODO statistics covers all entries in the subtree.
|
||
(setq org-refile-use-outline-path t) ;; show levels
|
||
(setq org-outline-path-complete-in-steps nil) ;; not in steps bc of using ivy completion
|
||
(setq org-default-notes-file my-org-default-notes-file)
|
||
(setq org-agenda-files my-org-agenda-files)
|
||
(setq org-refile-targets my-org-refile-targets)
|
||
(defun my-org-refile-target-verify-function ()
|
||
"exclude done keywords of todos."
|
||
(not
|
||
(member
|
||
(nth 2 (org-heading-components)) ;; get todo keyword from current heading
|
||
org-done-keywords))) ;; is filled buffer-wise
|
||
(setq org-refile-target-verify-function 'my-org-refile-target-verify-function)
|
||
|
||
;; C-c C-c for code blocks (otherwise e.g.: No org-babel-execute function for shell)
|
||
(org-babel-do-load-languages
|
||
'org-babel-load-languages
|
||
'(;; t enabled, nil disabled
|
||
(awk . t)
|
||
(C . t)
|
||
(calc . t)
|
||
(dot . t)
|
||
(emacs-lisp . t)
|
||
(haskell . t)
|
||
(js . t)
|
||
(jupyter . t)
|
||
(latex . t)
|
||
(octave . t)
|
||
(R . t)
|
||
;; Error message regarding R:
|
||
;; (invalid-function org-babel-header-args-safe-fn)
|
||
;; Invalid function: org-babel-header-args-safe-fn
|
||
;; M-x byte-compile-file <path to org>/ob-R.el
|
||
;; restart emacs. The compilation of ob-R.el must be done twice if necessary
|
||
(shell . t)
|
||
(sql . t)))
|
||
|
||
(add-to-list 'image-file-name-extensions "eps" t)) ;; TODO: eps not needed?
|
||
|
||
;; org core libs
|
||
(use-package org-src
|
||
:defer t
|
||
:config
|
||
(setq org-edit-src-content-indentation 0)
|
||
(setq org-src-preserve-indentation t))
|
||
|
||
;; (require 'org-contrib-autoloads)
|
||
(use-package org-contrib
|
||
;; :defer t
|
||
;; :init
|
||
;; (require 'org-contrib-autoloads)
|
||
)
|
||
|
||
;;; org-contrib libs
|
||
|
||
;; Make invisible parts of Org elements appear visible.
|
||
(use-package org-appear
|
||
:commands (org-appear-mode)
|
||
;; :hook (org-mode . org-appear-mode)
|
||
:config
|
||
(setq org-appear-autoentities t) ;; toogle entities: \alpha -> ɑ, needs `org-pretty-entities' active
|
||
(setq org-appear-autoemphasis t) ;; toggle emphasis markers, t by default, needs `org-hide-emphasis-markers' active
|
||
(setq org-appear-autolinks t) ;; toogle links, needs `org-link-descriptive' active
|
||
(setq org-appear-autosubmarkers t) ;; toogle subscripts and superscripts: ^3 -> ³, needs `org-pretty-entities' active
|
||
(setq org-appear-autokeywords t) ;; toogle keywords: #+TITLE: foo -> foo, needs `org-hidden-keywords' active
|
||
(setq org-appear-delay 0.5) ;; with delay a mouse click open a link directly and holding down shows the description
|
||
(setq org-appear-trigger 'manual)) ;; 'always toggled every time with cursor
|
||
|
||
(use-package org-brain ;; uses org-id If you find that org-brain is missing entries, or list entries which doesn’t exist, try using M-x org-brain-update-id-locations, which syncs the org-brain entries with the org-id caching system.
|
||
:commands (org-brain-visualize)
|
||
:init
|
||
(setq org-brain-path my-org-brain-path)
|
||
:config
|
||
(require 'org-capture)
|
||
;; make org-brain commands more accessable if you edit entries from org-mode
|
||
(bind-key "C-c B" 'org-brain-prefix-map org-mode-map)
|
||
;; org-brain use org-id in order to speed things up. Because of
|
||
;; this, the variable org-id-track-globally should be t (which it
|
||
;; already is by default). You may want to modify
|
||
;; org-id-locations-file too. If you add entries to org-brain
|
||
;; directly from org-mode you must assign headliens an ID. A
|
||
;; comfortable way to do this is with the command
|
||
;; org-brain-ensure-ids-in-buffer. Even more comfortable is to add
|
||
;; that to before-save-hook, so that it runs when saving.
|
||
(add-hook 'before-save-hook #'org-brain-ensure-ids-in-buffer)
|
||
;; to add information at the end of an entry, without visiting the file.
|
||
(push '("b" "Brain" plain (function org-brain-goto-end)
|
||
"* %i%?" :empty-lines 1)
|
||
org-capture-templates)
|
||
;; (setq org-brain-visualize-default-choices 'all)
|
||
;; (setq org-brain-show-resources t)
|
||
;; (setq org-brain-show-text t)
|
||
;; (setq org-brain-title-max-length 12)
|
||
;; Some users find it confusing having both headline entries and
|
||
;; file entries (see below). It may be preferable to only use
|
||
;; headline entries, by setting org-brain-include-file-entries to
|
||
;; nil. If doing this, you should probably also set
|
||
;; org-brain-file-entries-use-title to nil. Another possibility is
|
||
;; if you’re only using file entries, in which case you can set
|
||
;; org-brain-scan-for-header-entries to nil.
|
||
;; (setq org-brain-include-file-entries nil)
|
||
;; (setq org-brain-file-entries-use-title nil)
|
||
|
||
(require 'all-the-icons)
|
||
(defun org-brain-insert-resource-icon (link)
|
||
"Insert an icon, based on content of org-mode LINK."
|
||
(insert (format "%s "
|
||
(cond ((string-prefix-p "brain:" link)
|
||
(all-the-icons-fileicon "brain"))
|
||
((string-prefix-p "info:" link)
|
||
(all-the-icons-octicon "info"))
|
||
((string-prefix-p "help:" link)
|
||
(all-the-icons-material "help"))
|
||
((string-prefix-p "http" link)
|
||
(all-the-icons-icon-for-url link))
|
||
(t
|
||
(all-the-icons-icon-for-file link))))))
|
||
(add-hook 'org-brain-after-resource-button-functions #'org-brain-insert-resource-icon)
|
||
|
||
(require 'deft)
|
||
(defun org-brain-deft ()
|
||
"Use `deft' for files in `org-brain-path'."
|
||
(interactive)
|
||
(let ((deft-directory org-brain-path)
|
||
(deft-recursive t)
|
||
(deft-extensions '("org")))
|
||
(deft)))
|
||
|
||
(require 'org-cliplink)
|
||
(defun org-brain-cliplink-resource ()
|
||
"Add a URL from the clipboard as an org-brain resource.
|
||
Suggest the URL title as a description for resource."
|
||
(interactive)
|
||
(let ((url (org-cliplink-clipboard-content)))
|
||
(org-brain-add-resource
|
||
url
|
||
(org-cliplink-retrieve-title-synchronously url)
|
||
t)))
|
||
(define-key org-brain-visualize-mode-map (kbd "L") #'org-brain-cliplink-resource))
|
||
|
||
(use-package org-capture
|
||
:defer t
|
||
:config
|
||
;; https://www.gnu.org/software/emacs/manual/html_node/org/Capture-templates.html
|
||
(add-to-list 'org-capture-templates
|
||
'(;; put entries under the heading 'Tasks' in default notes file
|
||
("t" "Todo" entry (file+headline "" "Tasks") ;; empty string is the file, e.g. "~/org/gtd.org"
|
||
"* TODO %?\n %i\n %a")))
|
||
(add-to-list 'org-capture-templates
|
||
'(;; put entries under a date tree (year - month - day - entry) in the default file
|
||
("j" "Journal" entry (file+olp+datetree "") ;; empty string is the file, e.g. "~/org/journal.org"
|
||
"* %?\nEntered on %U\n %i\n %a"))))
|
||
;; see also org-cliplink K, org-brain b
|
||
|
||
(use-package org-cliplink
|
||
:commands (org-cliplink org-cliplink-capture)
|
||
:config
|
||
(defun my-org-link-description-update ()
|
||
"."
|
||
;; content is the link description
|
||
(interactive)
|
||
(let ((elem (org-element-context)))
|
||
(if (eq (car elem) 'link)
|
||
(let* ((content-begin (org-element-property :contents-begin elem))
|
||
(content-end (org-element-property :contents-end elem))
|
||
(link-begin (org-element-property :begin elem))
|
||
(link-end (org-element-property :end elem))
|
||
(raw-link (org-element-property :raw-link elem)))
|
||
(save-excursion
|
||
;; if content-begin (and content-end) is not nil (will be nil if there is no description)
|
||
(if (and content-begin content-end)
|
||
(progn
|
||
(delete-region content-begin content-end)
|
||
(insert (org-cliplink-retrieve-title-synchronously raw-link)))
|
||
(delete-region link-begin link-end)
|
||
(insert (org-cliplink-org-mode-link-transformer
|
||
raw-link (org-cliplink-retrieve-title-synchronously raw-link)))))))))
|
||
|
||
(with-eval-after-load 'org-capture
|
||
(add-to-list 'org-capture-templates
|
||
'("K" "Cliplink capture task" entry (file "")
|
||
"* TODO %(org-cliplink-capture) \n SCHEDULED: %t\n" :empty-lines 0))))
|
||
|
||
(use-package org-collector ;; collect properties into tables, using #+BEGIN: propview
|
||
;; org-contrib
|
||
:defer 0.1
|
||
:after org-table)
|
||
|
||
(use-package org-drill ;; requires persist https://elpa.gnu.org/packages/persist.html
|
||
:commands org-drill)
|
||
|
||
(use-package org-faces
|
||
:defer t
|
||
:config
|
||
(setq org-todo-keyword-faces ;; TODO keywords
|
||
'(("TODO" . "LightSkyBlue4") ;; org-warning (bold red), DeepSkyBlue3
|
||
("WAIT" . "LightSkyBlue4") ;;
|
||
("DONE" . "#5e5079") ;; DarkSlateGray4 PaleTurquoise4, CadetBlue4, LightSkyBlue4
|
||
("CANC" . "#5e5079") ;;
|
||
("STARTED" . "yellow")
|
||
("CANCELED" . (:foreground "blue" :weight bold)))))
|
||
|
||
(use-package org-fancy-priorities
|
||
:commands org-fancy-priorities-mode
|
||
:delight (org-fancy-priorities-mode "Fp") ;; FancyPriorities "\u24C5"
|
||
:hook (org-mode . org-fancy-priorities-mode)
|
||
:config
|
||
;; 🅐🅑🅒🅓 🅰🅱🅲🅳 ❗⬆⬇☕ ⚡⮬⮮☕
|
||
;; HIGH MID LOW OPTIONAL
|
||
;; ?x to get the interger of character
|
||
;; (setq org-fancy-priorities-list
|
||
;; '((?A . "HIGH")
|
||
;; (?B . "MID")
|
||
;; (?C . "LOW")
|
||
;; (?D . "OPTIONAL")
|
||
;; (?1 . "⚡")
|
||
;; (?2 . "⮬")
|
||
;; (?3 . "⮮")
|
||
;; (?4 . "☕")
|
||
;; (?I . "Important")))
|
||
(setq org-fancy-priorities-list
|
||
'((?A . "🅰")
|
||
(?B . "🅱")
|
||
(?C . "🅲")
|
||
(?D . "🅳")))
|
||
;; (setq org-priority-faces
|
||
;; '((?A :foreground "#df5f5f" :weight bold) ;; "IndianRed1"
|
||
;; (?B :foreground "DarkOrange1")
|
||
;; (?C :foreground "yellow1")
|
||
;; (?D :foreground "green1") ;; DeepSkyBlue1
|
||
;; (?1 :foreground "#df5f5f" :weight bold)
|
||
;; (?2 :foreground "DarkOrange1")
|
||
;; (?3 :foreground "yellow1")
|
||
;; (?4 :foreground "green1")
|
||
;; (?I :foreground "#df5f5f" :weight bold)))
|
||
(setq org-priority-faces
|
||
(list (list ?A :foreground "#df5f5f" :height (- (face-attribute 'default :height) 20) :weight 'bold)
|
||
(list ?B :foreground "DarkOrange1" :height (- (face-attribute 'default :height) 20) :weight 'bold)
|
||
(list ?C :foreground "yellow1" :height (- (face-attribute 'default :height) 20) :weight 'bold)
|
||
(list ?D :foreground "green1" :height (- (face-attribute 'default :height) 20) :weight 'bold)
|
||
(list ?1 :foreground "#df5f5f" :weight 'bold)
|
||
(list ?2 :foreground "DarkOrange1")
|
||
(list ?3 :foreground "yellow1")
|
||
(list ?4 :foreground "green1")
|
||
(list ?I :foreground "#df5f5f" :weight 'bold))))
|
||
|
||
(use-package org-fragtog
|
||
:hook (org-mode . org-fragtog-mode))
|
||
|
||
(use-package org-id ;; used by org-brain
|
||
:defer t
|
||
:config
|
||
;; (setq org-id-track-globally t) ;; default is t
|
||
(setq org-id-locations-file (concat user-cache-directory ".org-id-locations")))
|
||
|
||
(use-package org-mouse ;; to load mouse features, like clicking on the bullet of a heading
|
||
:after (org))
|
||
|
||
(use-package org-num ;; numbering of headings
|
||
:commands (org-num-mode)
|
||
:delight (org-num-mode "#") ;; o# "\uFF03"
|
||
:config
|
||
(setq org-num-skip-tags '("ignore"))
|
||
(setq org-num-skip-unnumbered t))
|
||
|
||
(use-package org-roam
|
||
;; builds SQLite db and requires gcc or clang, check `org-roam--sqlite-available-p'
|
||
;; create roam directory beforehand
|
||
;; do not sync the db file, only the org files.
|
||
;; to sync manually run `org-roam-db-sync' from a file within a roam directory
|
||
;; to greate a node inside an org file, on a header execute `org-id-get-create'
|
||
:bind (("C-c r l" . org-roam-buffer-toggle)
|
||
("C-c r L" . org-roam-buffer-display-dedicated)
|
||
("C-c r f" . org-roam-node-find)
|
||
("C-c r n" . org-roam-node-random)
|
||
("C-c r c" . org-roam-capture)
|
||
(:map org-mode-map
|
||
(("C-c r i" . org-roam-node-insert)
|
||
("C-c r a" . org-roam-alias-add)
|
||
("C-c r A" . org-roam-alias-remove)
|
||
("C-c r d" . org-id-get-create) ;; create id for file or header
|
||
("C-c r t" . org-roam-tag-add)
|
||
("C-c r T" . org-roam-tag-remove)
|
||
("C-c r r" . org-roam-ref-add)
|
||
("C-c r R" . org-roam-ref-remove)))
|
||
;; Dailies
|
||
("C-c r j" . org-roam-dailies-capture-today))
|
||
:init
|
||
(setq org-roam-v2-ack t) ;; no migration warning
|
||
(setq org-roam-directory (expand-file-name "~/Sync/workspace/emacs/org-roam")) ;; check if folder exists
|
||
(setq org-roam-db-location (concat user-cache-directory "org-roam.db"))
|
||
(setq org-roam-database-connector 'sqlite-builtin)
|
||
;; (setq org-roam-graph-viewer nil)
|
||
(with-eval-after-load 'which-key
|
||
(which-key-add-key-based-replacements
|
||
"C-c r" "org-roam"))
|
||
:config
|
||
;; when browsing notes display also tags
|
||
;; set tags `org-roam-tag-add': file: #+FILETAGS: :tag1:...: / * headline :tag1:...:
|
||
(setq org-roam-node-display-template "${title} ${tags}")
|
||
(org-roam-db-autosync-mode) ;; sync on file change
|
||
;;(org-roam-setup)
|
||
)
|
||
|
||
(use-package org-roam-graph
|
||
:bind (("C-c r g" . org-roam-graph)))
|
||
|
||
(use-package org-roam-timestamps
|
||
:after (org-roam)
|
||
:config
|
||
(org-roam-timestamps-mode))
|
||
|
||
(use-package org-roam-ui
|
||
:commands (org-roam-ui-mode)
|
||
:bind (("C-c r u" . org-roam-ui-mode))
|
||
:config
|
||
(setq org-roam-ui-sync-theme t)
|
||
(setq org-roam-ui-follow t)
|
||
(setq org-roam-ui-update-on-save t)
|
||
;;(setq org-roam-ui-open-on-start t)
|
||
)
|
||
|
||
(use-package org-sticky-header
|
||
:after (org-table-sticky-header) ;; org-table-sticky-header-mode must be set before
|
||
:hook (org-mode . org-sticky-header-mode)
|
||
:config
|
||
;;(setq org-sticky-header-always-show-header nil)
|
||
(setq org-sticky-header-full-path 'reversed))
|
||
|
||
(use-package org-superstar
|
||
;; formerly
|
||
;; after changing settings run `org-superstar-restart'
|
||
:hook (org-mode . org-superstar-mode) ;; defers the loading.
|
||
:config
|
||
;; headlines
|
||
(setq org-superstar-leading-bullet " ·") ;; " ․" " ·" " ⚫" or to hide: ?\s (without quotation marks)
|
||
(setq org-superstar-remove-leading-stars nil) ;; to remove the indentation, needs org-superstar-leading-bullet set to ?\s
|
||
(setq org-superstar-headline-bullets-list
|
||
'(?◉
|
||
?○
|
||
?✸
|
||
?✿))
|
||
;; (setq org-superstar-leading-bullet ?\s)
|
||
;; (setq org-superstar-leading-bullet "\u200b")
|
||
;; (setq org-superstar-headline-bullets-list '(?\s))
|
||
;; (setq org-superstar-headline-bullets-list '("\u200b"))
|
||
;; (setq org-superstar-headline-bullets-list '(?․))
|
||
|
||
;; items
|
||
(setq org-superstar-prettify-item-bullets t) ;; can cause slowdown when using a lot of lists (thousands), run command org-superstar-toggle-lightweight-list or set this variable to nil or see hack on the source web page
|
||
(setq org-superstar-item-bullet-alist
|
||
'((?* . ?•)
|
||
(?+ . ?➤)
|
||
(?- . ?–)))
|
||
(setq org-superstar-special-todo-items t) ;; using symbols defined in org-superstar-todo-bullet-alist
|
||
(setq org-superstar-todo-bullet-alist ;; ☐ ☑
|
||
'(("TODO" . ?☐)
|
||
("WAIT" . ?☐)
|
||
("DONE" . ?☐)
|
||
("CANC" . ?☐)))
|
||
|
||
(set-face-attribute 'org-superstar-leading nil :foreground "#42444a")) ;; "#42444a"
|
||
|
||
(use-package org-table
|
||
:defer t
|
||
:config
|
||
(setq org-table-convert-region-max-lines 9999))
|
||
|
||
(use-package org-table-sticky-header
|
||
:delight (org-table-sticky-header-mode "Tsh") ;; \u24C4t OTSH "\u24C9"
|
||
:hook (org-mode . org-table-sticky-header-mode)) ;; must be set before org-sticky-header-mode, maybe orgtbl-show-header can also be used
|
||
|
||
(use-package org-tempo ;; expand <s to a src block, ...
|
||
:after (org))
|
||
|
||
(use-package ob-core
|
||
:defer t
|
||
:hook (org-babel-after-execute . org-redisplay-inline-images)
|
||
:config
|
||
(setq org-babel-inline-result-wrap "%s") ;; default "=%s="
|
||
(setq org-confirm-babel-evaluate nil) ;; no "Evaluate this gnuplot code block on your system? (y or n)"
|
||
|
||
;; also used in preamble
|
||
(defmacro by-backend (&rest body)
|
||
"BODY is one or more plist element.
|
||
The key of plist elements is one of the following lisp symbols:
|
||
html, latex, ascii, or t (meaning all other cases). If BODY is
|
||
nil the return value is nil"
|
||
`(case org-export-current-backend ,@body))
|
||
|
||
;; obsolete function
|
||
(defalias 'if-latex 'by-backend)
|
||
(make-obsolete 'if-latex 'by-backend "2020.09.07")
|
||
(advice-add 'if-latex :before
|
||
(lambda (&rest r)
|
||
"Warning: Function `if-latex' is obsolete.
|
||
Probably used inside an org file for a src block and/or for an org export.
|
||
Updating an old preamble.org should remove this warning."
|
||
(message "Warning: Function `if-latex' is obsolete.
|
||
Probably used inside an org file for a src block and/or for an org export.
|
||
Updating an old preamble.org should remove this warning."))
|
||
'((name . "obsolete")))
|
||
|
||
;; TODO: still useful?
|
||
(defun svg-fname (filename)
|
||
(concat filename (by-backend
|
||
(latex "_light")
|
||
(article-latex "_light")
|
||
(t "_dark"))
|
||
".svg")))
|
||
|
||
(use-package ob-async ;; https://melpa.org/#/ob-async execute src blocks async, insert in block header (without argument) :async
|
||
;; apply: Wrong number of arguments: (lambda (&optional orig-fun arg info params) "Like org-babel-execute-src-block, but run asynchronously.
|
||
;; emacs-version or org version
|
||
:defer t
|
||
:after (org))
|
||
|
||
(use-package ob-csharp
|
||
:defer t
|
||
:config
|
||
(with-eval-after-load 'org
|
||
(add-to-list 'org-babel-load-languages '(csharp . t))))
|
||
|
||
(use-package ob-ditaa
|
||
:defer t
|
||
:config
|
||
;; org-ditaa-jar-path (car (directory-files "/usr/share/java/ditaa" 'full "[.]*.jar" #'file-newer-than-file-p))
|
||
;; config to change from a ditaa.jar file to a ditaa executable file
|
||
;; org-babel-ditaa-java-cmd "" ; default is "java". set to "" because system ditaa executable includes java
|
||
;; org-babel-default-header-args:ditaa ; default is ((:results . "file") (:exports . "results") (:java . "-Dfile.encoding=UTF-8"))
|
||
;; '((:results . "file")
|
||
;; (:exports . "results"))
|
||
;; org-ditaa-jar-option "" ; default is "-jar". set to "" because system ditaa executable includes -jar
|
||
;; org-ditaa-jar-path (concat "" (executable-find "ditaa"))
|
||
;; TODO: find file e.g. (shell-command "cat `which ditaa`") or (shell-command "ls /usr/share/java/ditaa")
|
||
(setq org-ditaa-jar-path "/usr/share/java/ditaa/ditaa-0.11.jar")
|
||
(with-eval-after-load 'org
|
||
(add-to-list 'org-babel-load-languages '(ditaa . t))))
|
||
|
||
(use-package ob-gnuplot
|
||
:init
|
||
(with-eval-after-load 'org
|
||
(add-to-list 'org-babel-load-languages '(gnuplot . t)))
|
||
:config
|
||
;; gnuplot config for own org export projects, used in preamble
|
||
(defvar gnuplot-init-light "reset ; \
|
||
theme_type = 'light' ; \
|
||
set border lc rgb 'black' ; \
|
||
set title textcolor 'black' ; \
|
||
set xtics textcolor rgb 'black' ; \
|
||
set ytics textcolor rgb 'black' ; \
|
||
set xlabel textcolor rgb 'black' ; \
|
||
set ylabel textcolor rgb 'black' ; \
|
||
set zlabel textcolor rgb 'black' ; \
|
||
set key textcolor rgb 'black' ; \
|
||
set linetype 1 lc rgb '#0071bc' lw 2 pt 5 ; \
|
||
set linetype 2 lc rgb '#d85218' lw 2 pt 5 ; \
|
||
set linetype 3 lc rgb '#ecb01f' lw 2 pt 5 ; \
|
||
set linetype 4 lc rgb '#7d2e8d' lw 2 pt 5 ; \
|
||
set linetype 5 lc rgb '#76ab2f' lw 2 pt 5 ; \
|
||
set linetype 6 lc rgb '#4cbded' lw 2 pt 5 ; \
|
||
set linetype 7 lc rgb '#a1132e' lw 2 pt 5 ; \
|
||
filter(x,min,max) = (x >= min && x <= max) ? x : 1/0 ; \
|
||
set datafile separator '\\t' # treat empty fields in a org-table as 'missing' rather than 'bad' (ignoring, shifting column) ")
|
||
(defvar gnuplot-init-dark "reset ; \
|
||
theme_type = 'dark' ; \
|
||
set border lc rgb '#cccccc' ; \
|
||
set title textcolor '#cccccc' ; \
|
||
set xtics textcolor rgb '#cccccc' ; \
|
||
set ytics textcolor rgb '#cccccc' ; \
|
||
set xlabel textcolor rgb '#cccccc' ; \
|
||
set ylabel textcolor rgb '#cccccc' ; \
|
||
set zlabel textcolor rgb '#cccccc' ; \
|
||
set key textcolor rgb '#cccccc' ; \
|
||
set linetype 1 lc rgb '#0060ad' lw 2 pt 5 ; \
|
||
set linetype 2 lc rgb '#dd181f' lw 2 pt 5 ; \
|
||
set linetype 3 lc rgb '#9356a6' lw 2 pt 5 ; \
|
||
set linetype 4 lc rgb '#4d92cc' lw 2 pt 5 ; \
|
||
set linetype 5 lc rgb '#cc5279' lw 2 pt 5 ; \
|
||
set linetype 6 lc rgb '#76ab2f' lw 2 pt 5 ; \
|
||
set linetype 7 lc rgb '#ecb01f' lw 2 pt 5 ; \
|
||
filter(x,min,max) = (x >= min && x <= max) ? x : 1/0 ; \
|
||
set datafile separator '\\t' # treat empty fields in a org-table as 'missing' rather than 'bad' (ignoring, shifting column) ")
|
||
|
||
(defun gpl-file (filename)
|
||
"\
|
||
FILENAME: the file name
|
||
|
||
returns: file name with extension for the org src header :file
|
||
- for LaTeX export it is set to: FILENAME.tikz
|
||
- for other export it is set to: FILENAME.svg
|
||
|
||
usage: #+HEADER: :file (gpl-file \"ledger-income\")
|
||
|
||
See also: http://www.gnuplot.info/docs_5.2/Gnuplot_5.2.pdf#section*.519
|
||
"
|
||
;;(concat filename (by-backend (latex ".tex") (t ".svg")) )
|
||
(concat filename (by-backend (latex ".tikz") (article-latex ".tikz") (t ".svg")) )
|
||
;;(by-backend (latex "") (t (concat filename ".svg")))
|
||
)
|
||
(defun gpl-term (lsize osize)
|
||
"\
|
||
LSIZE: latex export size
|
||
OSIZE: other export size
|
||
|
||
returns: term settings for the org src gnuplot header :term
|
||
- for LaTeX export it is set to: lua tikz size LSIZE color colortext
|
||
- for other export it is set to: svg size OSIZE mouse standalone background '#11000000'
|
||
|
||
usage: #+HEADER: :term (gpl-term \"15cm,12cm\" \"380,300\")
|
||
"
|
||
(concat
|
||
;;(by-backend (latex "epslatex size ") (t "svg size "))
|
||
(by-backend (latex "lua tikz size ") (article-latex "lua tikz size ") (t "svg size "))
|
||
(by-backend (latex lsize) (article-latex lsize) (t osize))
|
||
(by-backend (latex " color") (article-latex " color") (t " mouse standalone background '#11000000'"))))
|
||
)
|
||
|
||
(use-package ob-latex
|
||
:defer t
|
||
:config
|
||
;; tikz config for own org export projects
|
||
(defun tpl-file (filename)
|
||
"\
|
||
FILENAME: the file name
|
||
|
||
returns: file name with extension for the org src header :file
|
||
- for LaTeX export it is set to: nil
|
||
- for other export it is set to: FILENAME.svg
|
||
|
||
usage: #+HEADER: :file (tpl-file \"ledger-income\")
|
||
"
|
||
(by-backend (latex nil)
|
||
(article-latex nil)
|
||
(t (concat filename ".svg"))))
|
||
(defun tpl-results ()
|
||
"\
|
||
TikZ
|
||
|
||
returns: result type for the org src header :results
|
||
- for LaTeX export it is set to: raw
|
||
- for other export it is set to: raw file
|
||
|
||
usage: #+HEADER: :results (tpl-results)
|
||
"
|
||
(by-backend (latex "raw")
|
||
(article-latex "raw")
|
||
(t "raw file")))
|
||
|
||
;; overwrite so svg is not combiled by `org-babel-latex-tex-to-pdf'
|
||
;; but like html with `org-babel-latex-htlatex' and
|
||
;; `org-babel-latex-htlatex-packages'. htlatex uses pdflatex
|
||
(defun org-babel-execute:latex (body params)
|
||
"Execute a block of Latex code with Babel.
|
||
This function is called by `org-babel-execute-src-block'."
|
||
(setq body (org-babel-expand-body:latex body params))
|
||
(if (cdr (assq :file params))
|
||
(let* ((out-file (cdr (assq :file params)))
|
||
(extension (file-name-extension out-file))
|
||
(tex-file (org-babel-temp-file "latex-" ".tex"))
|
||
(border (cdr (assq :border params)))
|
||
(imagemagick (cdr (assq :imagemagick params)))
|
||
(im-in-options (cdr (assq :iminoptions params)))
|
||
(im-out-options (cdr (assq :imoutoptions params)))
|
||
(fit (or (cdr (assq :fit params)) border))
|
||
(height (and fit (cdr (assq :pdfheight params))))
|
||
(width (and fit (cdr (assq :pdfwidth params))))
|
||
(headers (cdr (assq :headers params)))
|
||
(in-buffer (not (string= "no" (cdr (assq :buffer params)))))
|
||
(org-latex-packages-alist
|
||
(append (cdr (assq :packages params)) org-latex-packages-alist)))
|
||
(cond
|
||
((and (string-suffix-p ".png" out-file) (not imagemagick))
|
||
(let ((org-format-latex-header
|
||
(concat org-format-latex-header "\n"
|
||
(mapconcat #'identity headers "\n"))))
|
||
(org-create-formula-image
|
||
body out-file org-format-latex-options in-buffer)))
|
||
;; ((string= "svg" extension)
|
||
;; (with-temp-file tex-file
|
||
;; (insert (concat (funcall org-babel-latex-preamble params)
|
||
;; (mapconcat #'identity headers "\n")
|
||
;; (funcall org-babel-latex-begin-env params)
|
||
;; body
|
||
;; (funcall org-babel-latex-end-env params))))
|
||
;; (let ((tmp-pdf (org-babel-latex-tex-to-pdf tex-file)))
|
||
;; (let* ((log-buf (get-buffer-create "*Org Babel LaTeX Output*"))
|
||
;; (err-msg "org babel latex failed")
|
||
;; (img-out (org-compile-file
|
||
;; tmp-pdf
|
||
;; (list org-babel-latex-pdf-svg-process)
|
||
;; extension err-msg log-buf)))
|
||
;; (shell-command (format "mv %s %s" img-out out-file)))))
|
||
((string-suffix-p ".tikz" out-file)
|
||
(when (file-exists-p out-file) (delete-file out-file))
|
||
(with-temp-file out-file
|
||
(insert body)))
|
||
((and (or (string= "html" extension) (string= "svg" extension)) ;; CHANGED from only html to html and svg
|
||
(executable-find org-babel-latex-htlatex))
|
||
;; TODO: this is a very different way of generating the
|
||
;; frame latex document than in the pdf case. Ideally, both
|
||
;; would be unified. This would prevent bugs creeping in
|
||
;; such as the one fixed on Aug 16 2014 whereby :headers was
|
||
;; not included in the SVG/HTML case.
|
||
(with-temp-file tex-file
|
||
(insert (concat
|
||
"\\documentclass[preview]{standalone}
|
||
\\def\\pgfsysdriver{pgfsys-tex4ht.def}
|
||
"
|
||
(mapconcat (lambda (pkg)
|
||
(concat "\\usepackage" pkg))
|
||
org-babel-latex-htlatex-packages
|
||
"\n")
|
||
(if headers
|
||
(concat "\n"
|
||
(if (listp headers)
|
||
(mapconcat #'identity headers "\n")
|
||
headers) "\n")
|
||
"")
|
||
"\\begin{document}"
|
||
body
|
||
"\\end{document}")))
|
||
(when (file-exists-p out-file) (delete-file out-file))
|
||
(let ((default-directory (file-name-directory tex-file)))
|
||
(shell-command (format "%s %s" org-babel-latex-htlatex tex-file)))
|
||
(cond
|
||
((file-exists-p (concat (file-name-sans-extension tex-file) "-1.svg"))
|
||
(if (string-suffix-p ".svg" out-file)
|
||
(progn
|
||
(shell-command "pwd")
|
||
(shell-command (format "mv %s %s"
|
||
(concat (file-name-sans-extension tex-file) "-1.svg")
|
||
out-file)))
|
||
(error "SVG file produced but HTML file requested")))
|
||
((file-exists-p (concat (file-name-sans-extension tex-file) ".html"))
|
||
(if (string-suffix-p ".html" out-file)
|
||
(shell-command "mv %s %s"
|
||
(concat (file-name-sans-extension tex-file)
|
||
".html")
|
||
out-file)
|
||
(error "HTML file produced but SVG file requested")))))
|
||
((or (string= "pdf" extension) imagemagick)
|
||
(with-temp-file tex-file
|
||
(require 'ox-latex)
|
||
(insert
|
||
(org-latex-guess-inputenc
|
||
(org-splice-latex-header
|
||
org-format-latex-header
|
||
(delq
|
||
nil
|
||
(mapcar
|
||
(lambda (el)
|
||
(unless (and (listp el) (string= "hyperref" (cadr el)))
|
||
el))
|
||
org-latex-default-packages-alist))
|
||
org-latex-packages-alist
|
||
nil))
|
||
(if fit "\n\\usepackage[active, tightpage]{preview}\n" "")
|
||
(if border (format "\\setlength{\\PreviewBorder}{%s}" border) "")
|
||
(if height (concat "\n" (format "\\pdfpageheight %s" height)) "")
|
||
(if width (concat "\n" (format "\\pdfpagewidth %s" width)) "")
|
||
(if headers
|
||
(concat "\n"
|
||
(if (listp headers)
|
||
(mapconcat #'identity headers "\n")
|
||
headers) "\n")
|
||
"")
|
||
(if fit
|
||
(concat "\n\\begin{document}\n\\begin{preview}\n" body
|
||
"\n\\end{preview}\n\\end{document}\n")
|
||
(concat "\n\\begin{document}\n" body "\n\\end{document}\n"))))
|
||
(when (file-exists-p out-file) (delete-file out-file))
|
||
(let ((transient-pdf-file (org-babel-latex-tex-to-pdf tex-file)))
|
||
(cond
|
||
((string= "pdf" extension)
|
||
(rename-file transient-pdf-file out-file))
|
||
(imagemagick
|
||
(org-babel-latex-convert-pdf
|
||
transient-pdf-file out-file im-in-options im-out-options)
|
||
(when (file-exists-p transient-pdf-file)
|
||
(delete-file transient-pdf-file)))
|
||
(t
|
||
(error "Can not create %s files, please specify a .png or .pdf file or try the :imagemagick header argument"
|
||
extension))))))
|
||
nil) ;; signal that output has already been written to file
|
||
body))
|
||
;; end of ob-latex
|
||
)
|
||
|
||
(use-package ob-python
|
||
:after (org-src python)
|
||
;; :commands (org-babel-execute:python
|
||
;; org-babel-variable-assignments:python)
|
||
:init
|
||
(with-eval-after-load 'org
|
||
(add-to-list 'org-babel-load-languages '(python . t)))
|
||
:config
|
||
(defun mpl-var (filename)
|
||
"\
|
||
FILENAME: the file name
|
||
|
||
returns: file name varible with extension for the org src header :var
|
||
- for LaTeX export it is set to: FILENAME.pgf
|
||
- for other export it is set to: FILENAME.svg
|
||
|
||
usage: #+HEADER: :var fname=(mpl-var \"ledger-income\")
|
||
"
|
||
(concat filename (by-backend (latex ".pgf") (article-latex ".pgf") (t ".svg"))))
|
||
(defun mpl-prologue (&optional mplstyle)
|
||
"\
|
||
Matplotlib
|
||
|
||
returns: style settings for a org src python matplotlib code block
|
||
- for LaTeX export it is not set.
|
||
- for other export it is set to load kpfonts and my.mplstyle.
|
||
Optional Argument MPLSTYLE:
|
||
- my (default)
|
||
- my-tex (uses latex to render fonts)
|
||
|
||
usage:
|
||
#+HEADER: :prologue (mpl-prologue)
|
||
#+HEADER: :prologue (mpl-prologue \"my-tex\")
|
||
"
|
||
(by-backend (latex "")
|
||
(article-latex "")
|
||
(t (format "\
|
||
import matplotlib.font_manager
|
||
kpfonts = matplotlib.font_manager.findSystemFonts(fontpaths=['%s'])
|
||
[matplotlib.font_manager.fontManager.addfont(i) for i in kpfonts]
|
||
|
||
import matplotlib.style
|
||
matplotlib.style.reload_library()
|
||
|
||
import matplotlib.pyplot as plt
|
||
styles = plt.style.core.read_style_directory('%s')
|
||
plt.style.core.update_nested_dict(plt.style.library, styles)
|
||
try:
|
||
plt.style.use('%s')
|
||
except:
|
||
pass
|
||
"
|
||
(concat config-dir "scripts/fonts")
|
||
(concat config-dir "scripts/matplotlib-stylelib")
|
||
(or mplstyle "my"))))))
|
||
|
||
(use-package ol
|
||
:after org
|
||
:config
|
||
(setq org-link-descriptive nil) ;; toggle with: `org-toggle-link-display`
|
||
(setq org-link-frame-setup
|
||
'((vm . vm-visit-folder-other-frame)
|
||
(vm-imap . vm-visit-imap-folder-other-frame)
|
||
(gnus . org-gnus-no-new-news)
|
||
(file . find-file)
|
||
(wl . wl-other-frame))))
|
||
|
||
(use-package ol-notmuch
|
||
:defer t)
|
||
|
||
(use-package ox
|
||
:defer t
|
||
:config
|
||
;; https://orgmode.org/manual/Advanced-Export-Configuration.html
|
||
;; https://en.wikibooks.org/wiki/LaTeX/Internationalization
|
||
;; (defun my-org-export-filter-hyphen-shy (text backend info)
|
||
;; "Convert \"- to ­ in HTML export."
|
||
;; (when (org-export-derived-backend-p backend 'html)
|
||
;; (replace-regexp-in-string "\"-" "­" text))
|
||
;; )
|
||
;; (defun my-org-export-filter-hyphen-hard (text backend info)
|
||
;; "Convert \"= to - in HTML export."
|
||
;; (when (org-export-derived-backend-p backend 'html)
|
||
;; (replace-regexp-in-string "\"=" "-" text))
|
||
;; )
|
||
;; (add-to-list 'org-export-filter-body-functions
|
||
;; 'my-org-export-filter-hyphen-shy)
|
||
;; (add-to-list 'org-export-filter-body-functions
|
||
;; 'my-org-export-filter-hyphen-hard)
|
||
;;(add-to-list 'org-export-filter-latex-fragment-functions
|
||
;; 'my-org-export-filter-hyphen-shy)
|
||
(setq org-export-with-smart-quotes t) ;; OPTIONS keyword, e.g., "’:t".
|
||
(setq org-export-with-sub-superscripts '{}) ;; OPTIONS keyword, e.g., "^:{}".
|
||
|
||
;; http://permalink.gmane.org/gmane.emacs.orgmode/93971
|
||
;; https://emacs.stackexchange.com/questions/30575/adding-latex-newpage-before-a-heading/30892
|
||
(defun my-org-headline-string-element (headline backend info)
|
||
"Return the org element representation of an element. Won't work on ~verb~/=code=-only headers"
|
||
(let ((prop-point (next-property-change 0 headline)))
|
||
(if prop-point (plist-get (text-properties-at prop-point headline) :parent))))
|
||
(defun my-org-latex-ensure-clearpage (headline backend info)
|
||
"Insert a clearpage before the heading if property clearpage is non-nil.
|
||
Uses function `my-org-headline-string-element'"
|
||
(when (org-export-derived-backend-p backend 'latex)
|
||
(let ((elmnt (my-org-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
|
||
'my-org-latex-ensure-clearpage))
|
||
|
||
(use-package ox-extra
|
||
:defer 0.1
|
||
:after (org) ;; defer t is not enough bc/ ox-extra is not loaded by default
|
||
:config
|
||
;; https://emacs.stackexchange.com/questions/9492/is-it-possible-to-export-content-of-subtrees-without-their-headings
|
||
;; https://emacs.stackexchange.com/questions/44018/use-package-ensure-not-working-package-downloaded-but-gives-warning-and-skips-c
|
||
(ox-extras-activate '(ignore-headlines))) ;; see in variable `ox-extras'
|
||
|
||
(use-package ox-html
|
||
:defer t ;; will be loaded via `org-export-backends' see above inside `org'
|
||
:config
|
||
(setq org-html-doctype "html5")
|
||
(setq org-html-html5-fancy t)
|
||
(setq org-html-validation-link nil) ;; remove the "Validate" link at the bottom of the page
|
||
(setq org-html-mathjax-options ;; variables used in `org-html-mathjax-template'
|
||
'((path "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js")
|
||
(scale "1.0")
|
||
(align "center")
|
||
(font "TeX")
|
||
(overflow "overflow")
|
||
(tags "ams")
|
||
(indent "0em")
|
||
(multlinewidth "85%")
|
||
(tagindent ".8em")
|
||
(tagside "right"))) ;; #+HTML_MATHJAX: align: left indent: 5em tagside: left font: Neo-Euler
|
||
;; http://docs.mathjax.org/en/latest/input/tex/macros/
|
||
;; TODO: old config v2 to v3
|
||
;; variable ONLY in upper-case!
|
||
(setq org-html-mathjax-template "
|
||
<script>
|
||
MathJax = {
|
||
chtml: {
|
||
scale: %SCALE
|
||
},
|
||
svg: {
|
||
scale: %SCALE
|
||
},
|
||
tex: {
|
||
inlineMath: [['\\\\(', '\\\\)']],
|
||
tags: \"%TAGS\",
|
||
multlineWidth: \"%MULTLINEWIDTH\",
|
||
tagSide: \"%TAGSIDE\",
|
||
tagIndent: \"%TAGINDENT\",
|
||
macros: {
|
||
ti: [\"{_\\\\text{#1}}\",1],
|
||
ho: [\"{^\\\\text{#1}}\",1],
|
||
field: [\"\\\\mathbb{#1}\",1],
|
||
fC: \"{\\\\field{C}}\",
|
||
fN: \"{\\\\field{N}}\",
|
||
fR: \"{\\\\field{R}}\",
|
||
fQ: \"{\\\\field{Q}}\",
|
||
fI: \"{\\\\field{I}}\",
|
||
fZ: \"{\\\\field{Z}}\",
|
||
qed: \"{\\\\blacksquare}\",
|
||
T: \"{\\\\mathrm{T}}\",
|
||
dif: \"{\\\\,\\\\mathop{}\\\\!\\\\mathrm{d}}\",
|
||
norm: [\"{\\\\lVert{}#1\\\\rVert}\",1],
|
||
abs: [\"{\\\\lvert{}#1\\\\rvert}\",1],
|
||
corresponds: \"{{\\\\kern0em\\\\raise{.5ex}{\\\\Large\\\\hat{}}\\\\kern-.73em\\\\raise{-.2ex}{=}}\\\\ }\",
|
||
dt: [\"{\\\\overset{{\\\\large\\\\bf{}.}}{#1}}\",1],
|
||
ddt: [\"{\\\\overset{{\\\\large\\\\bf{}.\\\\hspace{-0.1ex}.}}{#1}}\",1],
|
||
Eval: [\"{\\\\left.#1\\\\phantom{\\\\Big|}\\\\!\\\\!\\\\right\\\\rvert_{#2}^{#3}}\",3],
|
||
tensor: [\"{\\\\mathbf{#1}}\",1],
|
||
tensorI: [\"{\\\\underline{\\\\mathbf{#1}}}\",1],
|
||
tensorII: [\"{\\\\underline{\\\\underline{\\\\mathbf{#1}}}}\",1],
|
||
tensorIII: [\"{\\\\underset{\\\\raise{.5ex}{\\\\Large\\\\tilde{\\\\small{}3}}}{\\\\mathbf{#1}}}\",1],
|
||
tensorIV: [\"{\\\\underset{\\\\raise{.5ex}{\\\\Large\\\\tilde{\\\\small{}4}}}{\\\\mathbf{#1}}}\",1],
|
||
tensori: [\"{\\\\overrightarrow{#1}}\",1],
|
||
tensorii: [\"{\\\\overleftrightarrow{#1}}\",1],
|
||
tensoriii: [\"{\\\\overrightarrow{\\\\overleftrightarrow{#1}}}\",1],
|
||
tensoriv: [\"{\\\\overleftrightarrow{\\\\overleftrightarrow{#1}}}\",1],
|
||
rank: \"{\\\\mathop{\\\\mathrm{rank}}}\",
|
||
tr: \"{\\\\mathop{\\\\mathrm{tr}}}\",
|
||
dev: \"{\\\\mathop{\\\\mathrm{dev}}}\",
|
||
var: \"{\\\\mathop{\\\\mathrm{var}}}\",
|
||
grad: \"{\\\\mathop{\\\\mathrm{grad}}}\",
|
||
divergence: \"{\\\\mathop{\\\\mathrm{div}}}\",
|
||
rot: \"{\\\\mathop{\\\\mathrm{rot}}}\",
|
||
diag: \"{\\\\mathop{\\\\mathrm{diag}}}\",
|
||
adjungate: \"{\\\\mathop{\\\\mathrm{adj}}}\",
|
||
EUR: \"{\\\\text{€}}\"
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
<script type=\"text/javascript\" id=\"MathJax-script\" async
|
||
src=\"%PATH\"></script>
|
||
")
|
||
)
|
||
|
||
(use-package ox-latex
|
||
:defer t ;; will be loaded via `org-export-backends' see above inside `org'
|
||
:config
|
||
(setq org-latex-compiler "lualatex") ;; %latex in org-latex-pdf-process
|
||
(setq org-latex-bib-compiler "biber") ;; %bib in org-latex-pdf-process
|
||
(setq org-latex-pdf-process
|
||
(if (executable-find "latexmk")
|
||
'("latexmk -f -pdf -%latex -shell-escape -interaction=nonstopmode -output-directory=%o %f")
|
||
(cond ((string-equal org-latex-compiler "lualatex")
|
||
'("lualatex --interaction=nonstopmode --output-directory=%o %f"
|
||
"biber %b"
|
||
"lualatex --interaction=nonstopmode --output-directory=%o %f"
|
||
"lualatex --interaction=nonstopmode --output-directory=%o %f"))
|
||
((string-equal org-latex-compiler "pdflatex")
|
||
'("%latex -shell-escape -interaction nonstopmode -output-directory %o %f"
|
||
"%bib %b"
|
||
"%latex -shell-escape -interaction nonstopmode -output-directory %o %f"
|
||
"%latex -shell-escape -interaction nonstopmode -output-directory %o %f"))
|
||
(t '("%latex -interaction nonstopmode -output-directory %o %f"
|
||
"%latex -interaction nonstopmode -output-directory %o %f"
|
||
"%latex -interaction nonstopmode -output-directory %o %f")))))
|
||
(setq org-latex-listings t)
|
||
(setq org-latex-listings-options
|
||
'(("numbers" "left")
|
||
;; ("captionpos" "t") ;; not working, see org-latex-caption-above
|
||
))
|
||
(setq org-latex-caption-above '(table src-block))
|
||
(setq org-latex-logfiles-extensions
|
||
'("aux" "bcf" "blg" "fdb_latexmk" "fls" "figlist" "idx" "log" "nav" "out"
|
||
"ptc" "run.xml" "snm" "toc" "vrb" "xdv"
|
||
"lof" "lot" "lol"
|
||
"bbl" ;; biblatex package, biber; biblatex auxiliary file
|
||
"ist" ;; glossaries package; makeindex style file
|
||
"alg" "acr" "acn" ;; glossaries package; acronyms
|
||
"glg" "gls" "glo" ;; glossaries package; glossary
|
||
"los.glg" "los.gls" "los.glo" ;; glossaries package; list of symbols
|
||
;; "nlg" "not" "ntn" ;; glossaries package; notation
|
||
"idx" "ind" "ilg" ;; imakeidx package; index
|
||
;; minitoc
|
||
"mtc" ;; minitoc package; temp file
|
||
"maf" ;; minitoc package; list of discardable auxiliary files used by minitoc
|
||
"mtc0" ;; minitoc package; table of contents for a chapter
|
||
))
|
||
|
||
;; overwrite org ox-latex
|
||
(defun org-latex--inline-image (link info)
|
||
"Return LaTeX code for an inline image.
|
||
LINK is the link pointing to the inline image. INFO is a plist
|
||
used as a communication channel."
|
||
(let* ((parent (org-export-get-parent-element link))
|
||
(path (let ((raw-path (org-element-property :path link)))
|
||
(if (not (file-name-absolute-p raw-path)) raw-path
|
||
(expand-file-name raw-path))))
|
||
(filetype (file-name-extension path))
|
||
(caption (org-latex--caption/label-string parent info))
|
||
(caption-above-p (org-latex--caption-above-p link info))
|
||
;; Retrieve latex attributes from the element around.
|
||
(attr (org-export-read-attribute :attr_latex parent))
|
||
(float (let ((float (plist-get attr :float)))
|
||
(cond ((string= float "wrap") 'wrap)
|
||
((string= float "sideways") 'sideways)
|
||
((string= float "multicolumn") 'multicolumn)
|
||
((and (plist-member attr :float) (not float)) 'nonfloat)
|
||
((or float
|
||
(org-element-property :caption parent)
|
||
(org-string-nw-p (plist-get attr :caption)))
|
||
'figure)
|
||
(t 'nonfloat))))
|
||
(placement
|
||
(let ((place (plist-get attr :placement)))
|
||
(cond
|
||
(place (format "%s" place))
|
||
((eq float 'wrap) "{l}{0.5\\textwidth}")
|
||
((eq float 'figure)
|
||
(format "[%s]" (plist-get info :latex-default-figure-position)))
|
||
(t ""))))
|
||
(center
|
||
(if (plist-member attr :center) (plist-get attr :center)
|
||
(plist-get info :latex-images-centered)))
|
||
(comment-include (if (plist-get attr :comment-include) "%" ""))
|
||
;; It is possible to specify width and height in the
|
||
;; ATTR_LATEX line, and also via default variables.
|
||
(width (cond ((plist-get attr :width))
|
||
((plist-get attr :height) "")
|
||
((eq float 'wrap) "0.48\\textwidth")
|
||
(t (plist-get info :latex-image-default-width))))
|
||
(height (cond ((plist-get attr :height))
|
||
((or (plist-get attr :width)
|
||
(memq float '(figure wrap))) "")
|
||
(t (plist-get info :latex-image-default-height))))
|
||
(options (let ((opt (or (plist-get attr :options)
|
||
(plist-get info :latex-image-default-option))))
|
||
(if (not (string-match "\\`\\[\\(.*\\)\\]\\'" opt)) opt
|
||
(match-string 1 opt))))
|
||
image-code)
|
||
(if (member filetype '("tikz" "pgf"))
|
||
;; For tikz images:
|
||
;; - use \input to read in image file.
|
||
;; - if options are present, wrap in a tikzpicture environment.
|
||
;; - if width or height are present, use \resizebox to change
|
||
;; the image size.
|
||
(progn
|
||
(setq image-code (format "\\input{%s}" path))
|
||
(when (org-string-nw-p options)
|
||
(setq image-code
|
||
(format "\\begin{tikzpicture}[%s]\n%s\n\\end{tikzpicture}"
|
||
options
|
||
image-code)))
|
||
(when (or (org-string-nw-p width) (org-string-nw-p height))
|
||
(setq image-code (format "\\resizebox{%s}{%s}{%s}"
|
||
(if (org-string-nw-p width) width "!")
|
||
(if (org-string-nw-p height) height "!")
|
||
image-code))))
|
||
;; For other images:
|
||
;; - add width and height to options.
|
||
;; - include the image with \includegraphics.
|
||
(when (org-string-nw-p width)
|
||
(setq options (concat options ",width=" width)))
|
||
(when (org-string-nw-p height)
|
||
(setq options (concat options ",height=" height)))
|
||
(let ((search-option (org-element-property :search-option link)))
|
||
(when (and search-option
|
||
(equal filetype "pdf")
|
||
(string-match-p "\\`[0-9]+\\'" search-option)
|
||
(not (string-match-p "page=" options)))
|
||
(setq options (concat options ",page=" search-option))))
|
||
(setq image-code
|
||
(format "\\includegraphics%s{%s}"
|
||
(cond ((not (org-string-nw-p options)) "")
|
||
((string-prefix-p "," options)
|
||
(format "[%s]" (substring options 1)))
|
||
(t (format "[%s]" options)))
|
||
path))
|
||
(when (equal filetype "eps")
|
||
(setq image-code (replace-regexp-in-string "^\\\\includegraphics\\[.+\\]"
|
||
"\\input"
|
||
image-code
|
||
nil t))
|
||
(setq image-code (replace-regexp-in-string "\\.eps}"
|
||
".tex}"
|
||
image-code
|
||
nil t)))
|
||
(when (equal filetype "svg")
|
||
(setq image-code (replace-regexp-in-string "^\\\\includegraphics"
|
||
"\\includesvg"
|
||
image-code
|
||
nil t))
|
||
(setq image-code (replace-regexp-in-string "\\.svg}"
|
||
"}"
|
||
image-code
|
||
nil t)))
|
||
)
|
||
;; Return proper string, depending on FLOAT.
|
||
(pcase float
|
||
(`wrap (format "\\begin{wrapfigure}%s
|
||
%s%s
|
||
%s%s
|
||
%s\\end{wrapfigure}"
|
||
placement
|
||
(if caption-above-p caption "")
|
||
(if center "\\centering" "")
|
||
comment-include image-code
|
||
(if caption-above-p "" caption)))
|
||
(`sideways (format "\\begin{sidewaysfigure}
|
||
%s%s
|
||
%s%s
|
||
%s\\end{sidewaysfigure}"
|
||
(if caption-above-p caption "")
|
||
(if center "\\centering" "")
|
||
comment-include image-code
|
||
(if caption-above-p "" caption)))
|
||
(`multicolumn (format "\\begin{figure*}%s
|
||
%s%s
|
||
%s%s
|
||
%s\\end{figure*}"
|
||
placement
|
||
(if caption-above-p caption "")
|
||
(if center "\\centering" "")
|
||
comment-include image-code
|
||
(if caption-above-p "" caption)))
|
||
(`figure (format "\\begin{figure}%s
|
||
%s%s
|
||
%s%s
|
||
%s\\end{figure}"
|
||
placement
|
||
(if caption-above-p caption "")
|
||
(if center "\\centering" "")
|
||
comment-include image-code
|
||
(if caption-above-p "" caption)))
|
||
((guard center)
|
||
(format "\\begin{center}
|
||
%s%s
|
||
%s\\end{center}"
|
||
(if caption-above-p caption "")
|
||
image-code
|
||
(if caption-above-p "" caption)))
|
||
(_
|
||
(concat (if caption-above-p caption "")
|
||
image-code
|
||
(if caption-above-p caption "")))))))
|
||
|
||
(use-package ox-md
|
||
:after (ox)) ;; not loaded via `org-export-backends' (inside `org')
|
||
|
||
(use-package ox-publish
|
||
:defer t
|
||
:config
|
||
(setq org-publish-timestamp-directory (concat user-cache-directory "org-timestamps/"))
|
||
(setq org-publish-project-alist my-org-publish-project-alist))
|
||
|
||
(use-package ox-reveal
|
||
:after (ox) ;; not loaded via `org-export-backends' (inside `org')
|
||
:config
|
||
;; #+REVEAL_EXTRA_CSS:
|
||
(setq org-reveal-extra-css (concat "file://" (expand-file-name config-dir) "scripts/flipcard/flipcard.css")) ;; multiple files seperated with \n
|
||
;; #+REVEAL_POSTAMBLE:
|
||
(setq org-reveal-postamble (replace-regexp-in-string "\n" "" (concat "<script>" (org-reveal--read-file (concat (expand-file-name config-dir) "scripts/flipcard/flipcard.js")) "\n</script>"))) ;; only one line!
|
||
(setq org-reveal-root (concat "file://" (expand-file-name config-dir) "scripts/reveal.js"))
|
||
(setq org-reveal-single-file t))
|
||
|
||
(use-package ox-tufte ;; https://melpa.org/#/ox-tufte
|
||
:defer t
|
||
;; :after (ox) ;; not loaded via `org-export-backends' (inside `org')
|
||
:config
|
||
(defun org-tufte-src-block (src-block _contents info)
|
||
"Transcode a SRC-BLOCK element from Org to HTML.
|
||
CONTENTS holds the contents of the item. INFO is a plist holding
|
||
contextual information."
|
||
(if (org-export-read-attribute :attr_html src-block :textarea)
|
||
(org-html--textarea-block src-block)
|
||
(let* ((lang (org-element-property :language src-block))
|
||
(code (org-html-format-code src-block info))
|
||
(label (let ((lbl (and (org-element-property :name src-block)
|
||
(org-export-get-reference src-block info))))
|
||
(if lbl (format " id=\"%s\"" lbl) "")))
|
||
(klipsify (and (plist-get info :html-klipsify-src)
|
||
(member lang '("javascript" "js"
|
||
"ruby" "scheme" "clojure" "php" "html")))))
|
||
(if (not lang) (format "<pre class=\"example\"%s>\n%s</pre>" label code)
|
||
(format "<div class=\"org-src-container\">\n%s%s\n</div>"
|
||
;; Build caption.
|
||
(let ((caption (org-export-get-caption src-block)))
|
||
(if (not caption) ""
|
||
(let ((listing-number
|
||
(format
|
||
"<span class=\"listing-number\">%s </span>"
|
||
(format
|
||
(org-html--translate "Listing %d:" info)
|
||
(org-export-get-ordinal
|
||
src-block info nil #'org-html--has-caption-p)))))
|
||
(format "<label class=\"org-src-name\">%s%s</label>"
|
||
listing-number
|
||
(org-trim (org-export-data caption info))))))
|
||
;; Contents.
|
||
(if klipsify
|
||
(format "<pre><code class=\"src src-%s\"%s%s>%s</code></pre>"
|
||
lang
|
||
label
|
||
(if (string= lang "html")
|
||
" data-editor-type=\"html\""
|
||
"")
|
||
code)
|
||
(format "<pre class=\"src src-%s\"%s>%s</pre>"
|
||
lang label code))))))))
|
||
|
||
;; Allows you to edit entries directly from org-brain-visualize
|
||
(use-package polymode
|
||
:defer t
|
||
:config
|
||
(add-hook 'org-brain-visualize-mode-hook #'org-brain-polymode))
|
||
|
||
|
||
(provide 'org-settings)
|
||
;;; org-settings.el ends here
|