From 3457edf8f1a44a7d1dafe89010d1c53803089baa Mon Sep 17 00:00:00 2001 From: Andreas Gerler Date: Sat, 10 Dec 2022 18:48:25 +0100 Subject: [PATCH] add bba-orgmode.org Signed-off-by: Andreas Gerler --- bba-orgmode.org | 1856 +++++++++++++++++++++++++++++++++++++++++++++++ bba.org | 1844 +++------------------------------------------- 2 files changed, 1970 insertions(+), 1730 deletions(-) create mode 100644 bba-orgmode.org diff --git a/bba-orgmode.org b/bba-orgmode.org new file mode 100644 index 00000000..441f5bef --- /dev/null +++ b/bba-orgmode.org @@ -0,0 +1,1856 @@ +* org-mode + +See [[http://orgmode.org/worg/org-tutorials/orgtutorial_dto.html][orgtutorial_dto]] for details. + +It's worth to use Emacs for org-mode alone. +[[http://howardism.org/Technical/Emacs/literate-devops.html][Literate DevOps]] and [[http://www.howardism.org/Technical/Emacs/literate-database.html][Literate Database Work]] are only 2 use cases. +With [[https://github.com/fniessen/org-html-themes.git][org html themes]] it's easy to generate beautiful output. + +#+BEGIN_SRC emacs-lisp + (require 'ox-md nil t) + (setq org-use-speed-commands t) +#+END_SRC + +** org-mac-link +[2018-11-06 Tue 14:20] + +#+BEGIN_SRC emacs-lisp + (if (string-equal system-type "darwin") + (progn (require 'org-mac-link) + (define-key org-mode-map (kbd "C-c g") 'org-mac-grab-link))) +#+END_SRC + +** org-eldoc +[2017-01-06 Fri 14:23] + +#+BEGIN_SRC emacs-lisp + (load-file (expand-file-name "~/.emacs.d/lisp/org-eldoc.el")) +#+END_SRC + +** org-plus-contrib + +Some extra functionality from the org package repository. + +#+BEGIN_SRC emacs-lisp :tangle no + (if (>= emacs-major-version 24) + (progn + (add-to-list 'load-path "~/.emacs.d/elpa/org-plus-contrib-20191028" t) + )) + +#+END_SRC + +** org-protocol + +Run these commands to make org-protocol work in gnome: + +#+BEGIN_SRC sh :eval no :tangle no + gconftool-2 -s /desktop/gnome/url-handlers/org-protocol/command '/usr/bin/emacsclient %s' --type String + gconftool-2 -s /desktop/gnome/url-handlers/org-protocol/enabled --type Boolean true +#+END_SRC + +this is how your firefox bookmark must look like: + +#+BEGIN_SRC :eval no :tangle no + javascript:location.href='org-protocol://capture:/l/'%20+%20encodeURIComponent(location.href)+'/'%20+%20encodeURIComponent(document.title)+%20'/'%20+%20encodeURIComponent(window.getSelection()%20) +#+END_SRC + + +#+BEGIN_SRC emacs-lisp + (require 'org-protocol) + + (add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) + (define-key global-map "\C-cl" 'org-store-link) + (define-key global-map "\C-ca" 'org-agenda) + (setq org-log-done t) + (setq org-id-method (quote uuidgen)) + (setq org-src-window-setup 'current-window) + (setq org-startup-indented 1) + + (if (equal "work" (getenv "SYSENV")) + (setq org-agenda-files (list "~/workorg/work.org" + "~/org/todo.org" + "~/org/notes.org" + "~/org/emacs.org" + "~/org/it.org" + "~/org/refile.org")) + (setq org-agenda-files (list "~/org/work.org" + "~/org/todo.org" + "~/org/notes.org" + "~/org/emacs.org" + "~/org/it.org" + "~/org/refile.org"))) + +#+END_SRC + +** org sync to icloud +[2022-09-07 Wed 11:11] + +With [[https://beorgapp.com][beorg]] we can have our tasks with us. +As it supports icloud drive we can use a git hook to sync files after commit: + +#+begin_src sh :eval never + #!/bin/bash + + for file in notes todo motorcycles; do + rsync -tuvq ~/org/${file}.org ~/Library/Mobile\ Documents/iCloud~com~appsonthemove~beorg/Documents/org/${file}.org + rsync -tuvq ~/Library/Mobile\ Documents/iCloud~com~appsonthemove~beorg/Documents/org/${file}.org ~/org/${file}.org + done +#+end_src + +However sometimes it's nice to sync manually as well. +Why leave Emacs for that? + +#+begin_src emacs-lisp + (defun isync () + "sync org files to and from icloud drive." + (interactive) + (save-some-buffers) + (shell-command "git --work-tree ~/org/ --git-dir ~/org/.git commit -a -m 'autocommit'")) + ;; will be executed via the commit: (shell-command "~/org/.git-hooks/post-commit_icloudsync") + (define-key global-map (kbd "S-") 'isync) +#+end_src + +** org-man +[2018-08-28 Tue 16:57] + +#+BEGIN_SRC emacs-lisp + (org-add-link-type "man" 'org-man-open) + (add-hook 'org-store-link-functions 'org-man-store-link) + + (defcustom org-man-command 'man + "The Emacs command to be used to display a man page." + :group 'org-link + :type '(choice (const man) (const woman))) + + (defun org-man-open (path) + "Visit the manpage on PATH. + PATH should be a topic that can be thrown at the man command." + (funcall org-man-command path)) + + (defun org-man-store-link () + "Store a link to a manpage." + (when (memq major-mode '(Man-mode woman-mode)) + ;; This is a man page, we do make this link + (let* ((page (org-man-get-page-name)) + (link (concat "man:" page)) + (description (format "Manpage for %s" page))) + (org-store-link-props + :type "man" + :link link + :description description)))) + + (defun org-man-get-page-name () + "Extract the page name from the buffer name." + ;; This works for both `Man-mode' and `woman-mode'. + (if (string-match " \\(\\S-+\\)\\*" (buffer-name)) + (match-string 1 (buffer-name)) + (error "Cannot create link to this man page"))) + +#+END_SRC + +** org-clocktable +[2022-08-03 Wed 17:02] + +https://www.erichgrunewald.com/posts/how-i-track-my-hour-balance-with-a-custom-org-mode-clock-table/ + +#+begin_src emacs-lisp + (require 'cl-lib) + (require 'org-clock) + (defun org-dblock-write:work-report (params) + "Calculate how many hours too many or too few I have worked. + PARAMS are defined in the template, they are :tstart for the + first day for which there's data (e.g. <2022-01-01>) + and :tend for the last date (e.g. )." + ;; cl-flet is a macro from the common lisp emulation package that allows us to + ;; bind functions, just like let allows us to do with values. + (cl-flet* + ((format-time (time) (format-time-string + (org-time-stamp-format t t) time)) + (get-minutes-from-log (t1 t2) (cl-second + (org-clock-get-table-data + (buffer-file-name) + (list :maxlevel 0 + :tstart (format-time t1) + :tend (format-time t2)))))) + (let* ((start + (seconds-to-time (org-matcher-time (plist-get params :tstart)))) + (end + (seconds-to-time (org-matcher-time (plist-get params :tend)))) + (time start) + (total-days-worked 0)) + (progn + ;; loop through all the days in the time frame provided and count how + ;; many days minutes were reported. + (while (time-less-p time end) + (let* ((next-day (time-add time (date-to-time "1970-01-02T00:00Z"))) + (minutes-in-day (get-minutes-from-log time next-day))) + ;; exclude weekend + (if (and (> (string-to-number (format-time-string "%w" time)) 0) + (< (string-to-number (format-time-string "%w" time)) 6) + (> minutes-in-day 0)) (cl-incf total-days-worked 1)) + (setq time next-day))) + ;; now we can just do some simple arithmetic to get the difference + ;; between hours ideally worked and hours actually worked. + (let* ((total-minutes-worked (get-minutes-from-log start end)) + (hours-worked (/ total-minutes-worked 60.0)) + (hours-per-workday 8) + (hours-should-work (* total-days-worked hours-per-workday)) + (hour-difference (- hours-worked hours-should-work))) + (insert (format "%0.1f" hour-difference))))))) +#+end_src + +#+begin_src org :eval never + ,#+BEGIN: work-report :tstart "<2022-04-01>" :tend "<2022-04-27>" + ,#+END: +#+end_src + +#+begin_quote +One limitation is that the algorithm assumes that any day you worked +on is a day on which you should have worked the full number of +hours. So if I log a session that goes from Friday afternoon to after +midnight (that is, early Saturday morning), it assumes I should have +worked 16 hours those days, whereas in fact only Friday was a +workday. I solve this by editing my hour reports manually whenever +this happens. +#+end_quote + +** [[https://github.com/stig/ob-applescript.el][ob-applescript]] +[2016-09-27 Tue 09:34] + +This module lets you run AppleScript from AppleScript source code +blocks with Org Babel. + +This package is a direct result of attempting to answer a question on +this [[http://emacs.stackexchange.com/q/26374/10625][emacs.stackexchange.com thread]]. + +#+BEGIN_SRC emacs-lisp + (require 'ob-applescript) +#+END_SRC + +** [[https://github.com/stig/ox-jira.el][ox-jira]] +[2016-05-22 Sun 20:53] + +Org-mode export backend for JIRA markup + +#+BEGIN_SRC emacs-lisp + (if (>= emacs-major-version 24) + (require 'ox-jira)) +#+END_SRC + +We are lazy and want to speed up things: + +#+BEGIN_SRC emacs-lisp + (defun bba-org-export-jira-clipboard() + "narrow to org subtree and store content in jira format in clipboard." + (interactive) + (org-narrow-to-subtree) + (bba-export-jira-org) + (let ((org-export-use-babel nil)) + (ox-jira-export-as-jira)) + (delete-region (point) (progn (forward-line 1)(point))) + (push-mark (point)) + (push-mark (point-max) nil t) + (goto-char (point-min)) + (kill-ring-save 1 1 1) + (other-window -1) + (widen) + (other-window 1) + ) + + (define-key org-mode-map "\C-c\S-j" 'bba-org-export-jira-clipboard) +#+END_SRC + +Besides the clipboard we want also an org file in =/tmp/= to attach to +the jira ticket. Of course some boiler plate for the poor souls who +never heard of orgmode. + + +#+BEGIN_SRC emacs-lisp + (defun bba-export-jira-org() + "export current narrowed view to file in tmp and open a finder window on OS-X." + (interactive) + (goto-char (point-min)) + (insert "# This file is just plain text called orgmode") + (newline) + (insert "# https://en.wikipedia.org/wiki/Org-mode") + (newline) + (insert "# You can open it in any text editor or file reader.") + (newline) + (insert "# You might want to use Emacs for best experience.") + (newline) + (if (re-search-forward "jira:" nil t 1) + (if (org-in-regexp org-bracket-link-regexp 1) + (let ((remove (list (match-beginning 0) (match-end 0))) + (description (last (split-string (if (match-end 3) + (match-string-no-properties 3) + (match-string-no-properties 1)) ":")))) + (org-open-at-point) + (push-mark (point)) + (push-mark (point-max) nil t) + (goto-char (point-min)) + (write-region (mark) (point) (concat "/tmp/" (car description) ".org") nil nil ) + (deactivate-mark) + (if (string-equal system-type "darwin")(shell-command "open /tmp/")) + ))) + (goto-char (point-min)) + (kill-line 4) + ) +#+END_SRC + +#+BEGIN_SRC emacs-lisp + (defun bba-open-jira() + "open current ticket." + (interactive) + (let ((oldpoint (point-marker))) + (org-narrow-to-subtree) + (goto-char (point-min)) + (if (re-search-forward "jira:" nil t 1) + (org-open-at-point) + (progn (widen) + (outline-up-heading 1 t) + (bba-open-jira) + )) + (widen) + (goto-char oldpoint) + ) + ) + + (define-key org-mode-map "\C-xl\S-j" 'bba-open-jira) +#+END_SRC + +** ox-reveal +[2017-11-06 Mon 23:26] + +Get reveal.js as well: + +#+BEGIN_SRC sh :tangle never + git clone https://github.com/hakimel/reveal.js/ +#+END_SRC + +#+BEGIN_SRC emacs-lisp + (require 'ox-reveal) +#+END_SRC + +** ox-publish +[2018-01-24 Wed 20:29] + + #+BEGIN_SRC emacs-lisp + (require 'ox-html) + (require 'ox-publish) + (require 'ox-rss) + (require 'htmlize) + #+END_SRC + +#+BEGIN_SRC emacs-lisp + (setq org-mode-websrc-directory (concat (getenv "HOME") "/git/website/org")) + (setq org-mode-publishing-directory (concat (getenv "HOME") "/git/website/html/")) + + (setq org-publish-project-alist + `(("all" + :components ("blog-content" "blog-static" "blog-rss")) + + ("blog-content" + :base-directory ,org-mode-websrc-directory + :base-extension "org" + :exclude-tags ("noexport") + :publishing-directory ,org-mode-publishing-directory + :recursive t + :publishing-function org-html-publish-to-html + ; :preparation-function org-mode-blog-prepare + :export-with-tags nil + :headline-levels 4 + :auto-preamble t + :auto-postamble nil + :auto-sitemap t + :sitemap-title "Bundesbrandschatzamt" + :section-numbers nil + :table-of-contents nil + :with-toc nil + :with-author nil + :with-creator nil + :with-tags t + :with-smart-quotes t + + :html-doctype "html5" + :html-html5-fancy t + :html-preamble org-mode-blog-preamble + :html-postamble org-mode-blog-postamble + :html-head " + + + \n" + :html-head-extra " + + + + " + :html-head-include-default-style nil + ) + + ("blog-static" + :base-directory ,org-mode-websrc-directory + :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|svg" + :publishing-directory ,org-mode-publishing-directory + :recursive t + :exclude-tags ("noexport") + :publishing-function org-publish-attachment + ) + + ("blog-rss" + :base-directory ,org-mode-websrc-directory + :base-extension "org" + :rss-image-url "http://www.bundesbrandschatzamt.de/~baron/img/dragon-head.png" + :publishing-directory ,org-mode-publishing-directory + :publishing-function (org-rss-publish-to-rss) + :html-link-home "http://www.bundesbrandschatzamt.de/~baron/" + :html-link-use-abs-url t + :with-toc nil + :with-author nil + :with-email nil + :with-creator nil + :exclude ".*" + :exclude-tags ("noexport") + :include ("index.org")))) + + (defun org-mode-blog-preamble (options) + "The function that creates the preamble top section for the blog. + OPTIONS contains the property list from the org-mode export." + (let ((base-directory (plist-get options :base-directory))) + (org-babel-with-temp-filebuffer (expand-file-name "top-bar.html" base-directory) (buffer-string)))) + + (defun org-mode-blog-postamble (options) + "The function that creates the postamble, or bottom section for the blog. + OPTIONS contains the property list from the org-mode export." + (let ((base-directory (plist-get options :base-directory))) + (org-babel-with-temp-filebuffer (expand-file-name "bottom.html" base-directory) (buffer-string)))) + + (defun org-mode-blog-prepare () + "`index.org' should always be exported so touch the file before publishing." + (let* ((base-directory (plist-get project-plist :base-directory)) + (buffer (find-file-noselect (expand-file-name "index.org" base-directory) t))) + (with-current-buffer buffer + (set-buffer-modified-p t) + (save-buffer 0)) + (kill-buffer buffer))) +#+END_SRC + +** [[https://github.com/tarsius/ox-texinfo-plus][ox-texinfo+]] +[2019-01-23 Wed 16:08] + +#+BEGIN_SRC emacs-lisp + (load-file (expand-file-name "~/.emacs.d/lisp/ox-texinfo+.el")) +#+END_SRC + +** bba-ox-clip-formatted-copy +[2016-12-13 Tue 15:29] + +#+BEGIN_SRC emacs-lisp + (defun bba-ox-clip-formatted-copy() + "wrapper for ox-clip-formatted-copy to disable org-export-use-babel." + (interactive) + (let ((org-export-use-babel nil)) + (ox-clip-formatted-copy (mark) (point))) + ) + + (define-key org-mode-map "\M-\S-w" 'bba-ox-clip-formatted-copy) +#+END_SRC + +** org-edit-special +[2022-09-08 Thu 14:00] + +For whatever reason rainbow-delimiter was not active in the special +buffer. SQL is so much better with rainbows. + +#+begin_src emacs-lisp :tangle no + (define-advice org-edit-special (:after (&optional arg) my-big-advice) + (rainbow-delimiters-mode 1)) +#+end_src + +** comint +[2022-02-25 Fri 11:49] + +remove duplicates in modes like sqli. + +#+begin_src emacs-lisp + (add-hook 'comint-mode-hook + '(lambda () (setq comint-input-ignoredups t))) +#+end_src + +** comint-write-buffer +[2018-01-09 Tue 14:10] +#+BEGIN_SRC emacs-lisp + (defun comint-write-output-buffer (buffername &optional append) + "Write output from interpreter since last input to BUFFER. + Any prompt at the end of the output is not written. + + If the optional argument APPEND (the prefix argument when interactive) + is non-nil, the output is appended to the buffer instead. + If it is nil existing buffer gets killed upon request." + (interactive + (list (read-buffer + (if current-prefix-arg + "Append output to buffer: " + "Write output to buffer: ")) + current-prefix-arg + )) + (if append + (get-buffer-create buffername) + (progn + (if (get-buffer buffername) + (kill-buffer-ask (get-buffer buffername))) + (get-buffer-create buffername) + ) + ) + (save-excursion + (goto-char (process-mark (get-buffer-process (current-buffer)))) + (forward-line 0) + (append-to-buffer buffername comint-last-input-end (point)))) + (define-key comint-mode-map (kbd "C-c s-s") 'comint-write-output-buffer) + +#+END_SRC +** bba-create-ticket-tmp-dir +[2017-07-28 Fri 13:07] + +#+BEGIN_SRC emacs-lisp + (defun bba-create-ticket-tmp-dir-open-dir-screen() + "Create directory for the current ticket in tmp if not exist. + Open the directory of the current ticket in iterm screen via keyboard maestro." + (interactive) + (org-narrow-to-subtree) + (let ((beg (point))) + (goto-char (point-min)) + (if (re-search-forward "jira:" nil t 1) + (if (org-in-regexp org-bracket-link-regexp 1) + (let ((remove (list (match-beginning 0) (match-end 0))) + (description (last (split-string (if (match-end 3) + (match-string-no-properties 3) + (match-string-no-properties 1)) ":")))) + (unless (file-exists-p (concat "~/tmp/" (downcase (car description)))) + (mkdir (concat "~/tmp/" (downcase (car description)))) + ) + (kill-new (concat "~/tmp/" (downcase (car description)))) + ))) + (goto-char beg) + ) + (widen) + (shell-command "osascript -e \'tell app \"Keyboard Maestro Engine\" to do script \"screen-start-cd-to-clipboard\"'") + ) +#+END_SRC +** bba-remove-comments-and-empty-lines +[2018-03-06 Tue 13:58] + +#+BEGIN_SRC emacs-lisp + (defun bba-remove-comments-and-empty-lines() + "Remove all lines containing comments or nothing at all." + (interactive) + (goto-char (point-min)) + (let (kill-ring) + (comment-kill (count-lines (point-min)(point-max)))) + (goto-char (point-min)) + (flush-lines "^$")) +#+END_SRC + +** bba-edit-sql +[2022-05-13 Fri 13:23] + +use edit-indirect-region to zoom into a END_PREPARE region in +sql-mode. Handy for embedded SQL in Perl. + +#+begin_src emacs-lisp + (defun bba-edit-sql () + "Find the region between previous END_PREPARE and the one after it. + Open that block in edit-indirect-region and switch to sql-mode." + (interactive) + (save-mark-and-excursion + (search-backward "END_PREPARE") + (next-line) + (beginning-of-line) + (set-mark-command nil) + (search-forward "END_PREPARE") + (beginning-of-line) + (edit-indirect-region (mark) (point) t) + (sql-mode) + )) + (global-set-key (kbd "s-S") 'bba-edit-sql) +#+end_src +** search notes +[2018-02-09 Fri 10:57] + +Your notes are more useful if you can easily search them! + +#+BEGIN_SRC emacs-lisp + (defun snw () + "Search work notes." + (interactive) + (rgrep (read-regexp "Search for" 'grep-tag-default 'grep-regexp-history) "*.org" (file-truename "~/workorg"))) + + (defun sn () + "Search notes." + (interactive) + (rgrep (read-regexp "Search for" 'grep-tag-default 'grep-regexp-history) "*.org" (file-truename "~/org"))) + +#+END_SRC + +** search last miliseconds and convert to hours at point +[2022-04-21 Thu 13:17] + +#+begin_src emacs-lisp + (defun bba-ms-to-h () + "search for last miliseconds and convert to hours at point. + Useful for Vertica timing output." + (interactive) + (save-mark-and-excursion + (let (bounds pos1 pos2 mything oldpos) + (setq oldpos (point)) + (search-backward " ms") + (search-backward " ") + (right-char) + (setq bounds (bounds-of-thing-at-point 'symbol)) + (setq pos1 (car bounds)) + (setq pos2 (cdr bounds)) + (setq mything (buffer-substring-no-properties pos1 pos2)) + (setq mything (/ (round (/ (string-to-number mything) 10 60 60.0)) 100.0)) + (goto-char oldpos) + (insert-before-markers (format "%s hours." mything))))) +#+end_src + +** Some initial languages we want org-babel to support + +#+BEGIN_SRC emacs-lisp + (org-babel-do-load-languages + 'org-babel-load-languages + '( + (shell . t) + (python . t) + (R . t) + (ruby . t) + (ditaa . t) + (dot . t) + (octave . t) + (sqlite . t) + (perl . t) + (sql . t) + (tmux . sh) + )) + + ;;(setq org-html-preamble nil + ;; org-html-postamble nil + ;; org-html-head "") + + ;; (setq org-html-preamble nil + ;; org-html-postamble nil + ;; org-html-include-default-style nil + ;; org-html-head "" + ;; org-export-html-with-timestamp nil + ;; org-export-html-style "body-only" + ;; ) + ;; body-only option ? + + ;; (setq html (org-export-as-html 3 nil nil 1)) + (setq org-babel-tmux-location "/opt/local/bin/tmux") + +#+END_SRC + +** trusty org-babel +[2022-12-08 Thu 15:32] + +Since org 9.6 eval of my variables is not [[https://orgmode.org/manual/Code-Evaluation-Security.html][considered safe anymore]]. +This is not yet working: + +#+begin_src emacs-lisp + (defun my-org-confirm-babel-evaluate (lang body) + (not (string= lang "emacs-lisp"))) ;don't ask for ditaa + (setq org-confirm-babel-evaluate #'my-org-confirm-babel-evaluate) +#+end_src + +** holidays +[2022-09-06 Tue 18:32] + +#+begin_src emacs-lisp + (add-to-list 'load-path "~/.emacs.d/elpa/german-holidays-20181213.644") + (require 'german-holidays) + (setq holiday-local-holidays holiday-german-HH-holidays) +#+end_src + +** open current directory in finder +[2017-01-09 Mon 15:18] + +Sometimes you need a file finder in the current buffers directory. + +#+BEGIN_SRC emacs-lisp + (defun bba-open-file-dir-finder () + "Open the directory of the current file in finder." + (interactive) + (if (string-equal system-type "darwin") + (shell-command (concat "open " (file-name-directory (buffer-file-name)))) + ) + ) + +#+END_SRC + +** open current file via osx open +[2017-06-07 Wed 13:50] + +#+BEGIN_SRC emacs-lisp + (defun bba-open-file-system () + "Open the current file via osx open." + (interactive) + (if (string-equal system-type "darwin") + (shell-command (concat "open " (buffer-file-name))) + ) + ) + +#+END_SRC + +** open current directory in iterm screen +[2017-02-14 Tue 12:24] + +Open current buffers directory in gnu screen in iterm. + +#+BEGIN_SRC emacs-lisp + (defun bba-open-file-dir-screen () + "Open the directory of the current file in iterm screen via keyboard maestro." + (interactive) + (if (string-equal system-type "darwin") + (progn + (if (null buffer-file-name) + (kill-new default-directory) + (kill-new (file-name-directory (buffer-file-name)))) + (shell-command "osascript -e \'tell app \"Keyboard Maestro Engine\" to do script \"screen-start-cd-to-clipboard\"'") + ) + ) + ) + + + +#+END_SRC + +** Find next and previous =#+BEGIN_SRC sh= block. +Very useful for repetitive literate devops jobs. + then and so on. + +#+BEGIN_SRC emacs-lisp + (add-hook 'org-mode-hook + (lambda () + + (fset 'bba/org-search-src-sh + (lambda (&optional arg) "Find next BEGIN_SRC sh block." (interactive "p") (kmacro-exec-ring-item (quote ([19 94 35 92 43 66 69 71 73 78 95 83 82 67 32 115 104 down] 0 "%d")) arg))) + (define-key org-mode-map "\C-c\S-n" 'bba/org-search-src-sh) + + (fset 'bba/org-search-src-sh-reverse + (lambda (&optional arg) "Find previous BEGIN_SRC sh block." (interactive "p") (kmacro-exec-ring-item (quote ([18 94 35 92 43 66 69 71 73 78 95 83 82 67 32 115 104 18 down] 0 "%d")) arg))) + (define-key org-mode-map "\C-c\S-p" 'bba/org-search-src-sh-reverse) + )) + +#+END_SRC + +** copy previous src block +[2016-08-25 Thu 23:36] + +This is helpful in training sessions. + +#+BEGIN_SRC emacs-lisp + (defun bba-copy-and-yank-org-src-block() + "copy last org src block and insert it at point. + If region is active copy only the src begin and src end lines." + (interactive) + (if (use-region-p) + (progn + (let (-p1 -p2 srclength) + (setq -p1 (region-beginning) -p2 (region-end)) + (setq mark-active nil) + (re-search-backward "\#\\+BEGIN_SRC") + (forward-line -1) + (if (looking-at "\#\\+RESULTS:")(re-search-backward "\#\\+BEGIN_SRC")) + (forward-line -1) + (if (not (looking-at "\#"))(forward-line)) + (set-mark-command nil) + (forward-line) + (beginning-of-line) + (kill-ring-save 1 1 1) + (goto-char -p1) + (set-mark-command nil) + (insert (pop kill-ring)) + (setq srclength (- (region-end) (region-beginning))) + (setq mark-active nil) + (re-search-backward "\#\\+END_SRC") + (set-mark-command nil) + (forward-line) + (beginning-of-line) + (kill-ring-save 1 1 1) + (kill-append "\n" nil) + (goto-char (+ -p2 srclength)) + (insert (pop kill-ring)) + ) + ) + (progn + (push-mark) + (re-search-backward "\#\\+BEGIN_SRC") + (forward-line -1) + (if (looking-at "\#\\+RESULTS:")(re-search-backward "\#\\+BEGIN_SRC")) + (forward-line -1) + (if (not (looking-at "\#"))(forward-line)) + (set-mark-command nil) + (re-search-forward "\#\\+END_SRC") + (forward-line) + (beginning-of-line) + (kill-ring-save 1 1 1) + (set-mark-command '1) + (set-mark-command '1) + (insert (pop kill-ring)) + (re-search-backward "\#\\+BEGIN_SRC") + (forward-line) + )) + ) + + (defun bba-copy-org-src-block(arg) + "copy org src block. Can be around point, too. If POSITION is negative look backwards for x occurance, if positive search forwards." + (interactive "p") + (push-mark) + (goto-char (point-at-bol)) + (if (not current-prefix-arg) + (progn + (message "foo %s" arg) + (if (not (looking-at "\#\\+BEGIN_SRC"))(re-search-backward "\#\\+BEGIN_SRC")) + (forward-line -1) + (if (looking-at "\#\\+RESULTS:")(re-search-backward "\#\\+BEGIN_SRC")) + (forward-line -1) + (if (not (looking-at "\#"))(forward-line)) + (set-mark-command nil) + (re-search-forward "\#\\+END_SRC") + (forward-line) + (goto-char (point-at-bol)) + (kill-ring-save 1 1 1) + (set-mark-command '1) + (set-mark-command '1)) + (progn + (re-search-forward "\#\\+BEGIN_SRC" nil nil arg) + (forward-line -1) + (if (not (looking-at "\#"))(forward-line)) + (set-mark-command nil) + (re-search-forward "\#\\+END_SRC") + (forward-line) + (goto-char (point-at-bol)) + (kill-ring-save 1 1 1) + (set-mark-command '1) + (set-mark-command '1) + (insert (pop kill-ring)) + (re-search-backward "\#\\+BEGIN_SRC") + (forward-line))) + ) + + + ;; (defun bba-copy-org-src-block() + ;; "copy last org src block. Can be around point, too." + ;; (interactive) + ;; (push-mark) + ;; (goto-char (point-at-bol)) + ;; (if (not (looking-at "\#\\+BEGIN_SRC"))(re-search-backward "\#\\+BEGIN_SRC")) + ;; (forward-line -1) + ;; (if (not (looking-at "\#"))(forward-line)) + ;; (set-mark-command nil) + ;; (re-search-forward "\#\\+END_SRC") + ;; (forward-line) + ;; (goto-char (point-at-bol)) + ;; (kill-ring-save 1 1 1) + ;; (set-mark-command '1) + ;; (set-mark-command '1) + ;; ) + + (define-key org-mode-map "\C-c\S-w" 'bba-copy-and-yank-org-src-block) + (define-key org-mode-map (kbd "C-c s-w") 'bba-copy-org-src-block) + +#+END_SRC + +** org-babel-async +[2016-12-27 Tue 15:45] + +Thanks to [[http://kitchingroup.cheme.cmu.edu/blog/2015/11/20/Asynchronously-running-python-blocks-in-org-mode/#disqus_thread][Asynchronously running pyton bocks in org-mode]] + +Still some work to do on the shell counterpart. +=:dir= is not recongnised. + +#+BEGIN_SRC emacs-lisp + (defun org-babel-async-execute:shell () + "Execute the sh src-block at point asynchronously. + :var headers are supported. + :results output is all that is supported for output. + + A new window will pop up showing you the output as it appears, + and the output in that window will be put in the RESULTS section + of the code block." + (interactive) + (require 'org-id) + (require 'ob-core) + (let* ((current-file (buffer-file-name)) + (uuid (org-id-uuid)) + (code (org-element-property :value (org-element-context))) + (temporary-file-directory "/tmp/") + (tempfile (make-temp-file "sh-")) + (pbuffer (format "*%s*" uuid)) + (varcmds (org-babel-variable-assignments:shell + (nth 2 (org-babel-get-src-block-info)))) + process) + + ;; get rid of old results, and put a place-holder for the new results to + ;; come. + (org-babel-remove-result) + + (save-excursion + (re-search-forward "#\\+END_SRC") + (insert (format + "\n\n#+RESULTS: %s\n: %s" + (or (org-element-property :name (org-element-context)) + "") + uuid))) + + ;; open the results buffer to see the results in. + ;; (switch-to-buffer-other-window pbuffer) + + ;; Create temp file containing the code. + (with-temp-file tempfile + ;; if there are :var headers insert them. + (dolist (cmd varcmds) + (insert cmd) + (insert "\n")) + (insert code)) + + ;; run the code + (setq process (start-process + uuid + pbuffer + "bash" + tempfile)) + + ;; when the process is done, run this code to put the results in the + ;; org-mode buffer. + (set-process-sentinel + process + `(lambda (process event) + (save-window-excursion + (save-excursion + (save-restriction + (with-current-buffer (find-file-noselect ,current-file) + (goto-char (point-min)) + (re-search-forward ,uuid) + (beginning-of-line) + (kill-line) + (insert "#+begin_example") + (newline) + (insert + (mapconcat + (lambda (x) + (format "%s" x)) + (butlast (split-string + (with-current-buffer + ,pbuffer + (buffer-string)) + "\n")) + "\n")) + (newline) + (insert "#+end_example") + + )))) + + ;; delete the results buffer then delete the tempfile. + ;; finally, delete the process. + (when (get-buffer ,pbuffer) + (kill-buffer ,pbuffer) + (delete-window)) + (delete-file ,tempfile) + (delete-process process)))) + ) + (define-key org-mode-map (kbd "C-c C-S-c") 'org-babel-async-execute:shell) +#+END_SRC + +#+BEGIN_SRC emacs-lisp + (defun org-babel-async-execute:python () + "Execute the python src-block at point asynchronously. + :var headers are supported. + :results output is all that is supported for output. + + A new window will pop up showing you the output as it appears, + and the output in that window will be put in the RESULTS section + of the code block." + (interactive) + (let* ((current-file (buffer-file-name)) + (uuid (org-id-uuid)) + (code (org-element-property :value (org-element-context))) + (temporary-file-directory ".") + (tempfile (make-temp-file "py-")) + (pbuffer (format "*%s*" uuid)) + (varcmds (org-babel-variable-assignments:python + (nth 2 (org-babel-get-src-block-info)))) + process) + + ;; get rid of old results, and put a place-holder for the new results to + ;; come. + (org-babel-remove-result) + + (save-excursion + (re-search-forward "#\\+END_SRC") + (insert (format + "\n\n#+RESULTS: %s\n: %s" + (or (org-element-property :name (org-element-context)) + "") + uuid))) + + ;; open the results buffer to see the results in. + (switch-to-buffer-other-window pbuffer) + + ;; Create temp file containing the code. + (with-temp-file tempfile + ;; if there are :var headers insert them. + (dolist (cmd varcmds) + (insert cmd) + (insert "\n")) + (insert code)) + + ;; run the code + (setq process (start-process + uuid + pbuffer + "python" + tempfile)) + + ;; when the process is done, run this code to put the results in the + ;; org-mode buffer. + (set-process-sentinel + process + `(lambda (process event) + (save-window-excursion + (save-excursion + (save-restriction + (with-current-buffer (find-file-noselect ,current-file) + (goto-char (point-min)) + (re-search-forward ,uuid) + (beginning-of-line) + (kill-line) + (insert + (mapconcat + (lambda (x) + (format ": %s" x)) + (butlast (split-string + (with-current-buffer + ,pbuffer + (buffer-string)) + "\n")) + "\n")))))) + ;; delete the results buffer then delete the tempfile. + ;; finally, delete the process. + (when (get-buffer ,pbuffer) + (kill-buffer ,pbuffer) + (delete-window)) + (delete-file ,tempfile) + (delete-process process))))) +#+END_SRC + +** tmux capture-pane +[2016-10-08 Sat 13:43] + +Recently I had to get screen-shots of a ncurses based tool. +=script=, =gnu screen= and =iterm2= were not very helpful because +ncurses repositions the cursor and this information get's lost in +the log files created with them. [[https://tmux.github.io][tmux]] and [[http://www.andre-simon.de/doku/ansifilter/en/ansifilter.php][ansifilter]] came to the +rescue. + +Of course I wanted the screen-shots in my orgmode files. + +To make it short you can run a terminal window in standard 80x24 with +tmux in it. start your tasks and every time you need a screen-shot run +=bba-org-tmux-capture-pane= in your org notes file. +You get a src sh code block with the screen-shot. Additionally save +the below code snippet as =tmuxhardcopy.sh=. Then you have the ANSI +color version sitting in your =/tmp/= directory. + +Of course you will loose the information of what was selected in your +ncurses tool. But don't worry: Select the start and end point in that +line of your screen-shot and call =bba-insert-arrows=. Here is an +example what you will have finally: + +#+BEGIN_SRC sh :tangle no + ────────────────────────────────────────────────────────────────────────────── + + ┌──────────────────────────────────────────────────────────┐ + │ Main Menu │ + │ ┌──────────────────────────────────────────────────────┐ │ + │ │ 1 View Database Cluster State │ │ + │ │ -> 2 Connect to Database <- │ │ + │ │ 3 Start Database │ │ + │ │ 4 Stop Database │ │ + │ │ 5 Restart Vertica on Host │ │ + │ │ 6 Configuration Menu │ │ + │ │ 7 Advanced Menu │ │ + │ │ 8 Help Using the Administration Tools │ │ + │ │ E Exit │ │ + │ └──────────────────────────────────────────────────────┘ │ + ├──────────────────────────────────────────────────────────┤ + │ < OK > < Help > │ + └──────────────────────────────────────────────────────────┘ +#+END_SRC + +Here is the code: + +#+BEGIN_SRC emacs-lisp + (defun bba-org-tmux-capture-pane() + "capture pane of tmux window and insert it as org-mode sh src block." + (interactive) + (insert "#+BEGIN_SRC sh") + (newline) + (insert (shell-command-to-string "tmux capture-pane -eJp | ansifilter")) + (shell-command "tmuxhardcopy.sh") + (insert "#+END_SRC") + (newline) + (forward-line -2) + (org-edit-special) + (delete-trailing-whitespace) + (org-edit-src-exit) + (forward-line 2) + ) +#+END_SRC + +To capture the raw output from tmux including the ANSI colors and see +selections I call this script: + +#+NAME: tmuxhardcopy.sh +#+BEGIN_SRC sh :tangle no + #!/bin/sh + COUNTER=00 + FILE=/tmp/tmux.hardcopy + /opt/local/bin/tmux capture-pane -eJ + + for i in 0{1..9} {10..99}; do + if ! [ -e ${FILE}${i} ]; then + COUNTER=${i} + break + fi + done + + /opt/local/bin/tmux save-buffer ${FILE}${COUNTER} + +#+END_SRC + +** insert arrow +[2016-10-07 Fri 12:25] + +I am using ansifilter to convert ncurses screenshots to ascii only. +That way I can include them into org files as documentation. +The downside of this process: I loose the selections. +As a replacement you can use this function. +Select the start and end points where you want to have ascii arrows +and call this function. + +#+BEGIN_SRC emacs-lisp + (defun bba-insert-arrows() + "insert ascii arrows at start and end of selection." + (interactive) + (insert "<-") + (delete-char 2) + (exchange-point-and-mark) + (insert "->") + (delete-char 2) + (exchange-point-and-mark) + ) +#+END_SRC + +** Define some shortcuts to access major org files. + +#+BEGIN_SRC emacs-lisp + + + (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/org/notes.org"))) + + (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/org/todo.org"))) + (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/org/workhours.org"))) + (if (equal "work" (getenv "SYSENV")) + (progn + (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/workorg/work.org"))) + (global-set-key (kbd "C-c S-") '(lambda () (interactive) (find-file "~/workorg/work_archive.org"))) + (global-set-key (kbd "C-c C-") '(lambda () (interactive) (org-id-goto "0C6EAD45-9046-4A56-96C3-3B378A444263"))) + ) + (progn + (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/org/work.org"))) + )) + + (global-set-key (kbd "C-c ") '(lambda () (interactive) + ( if (file-exists-p "~/org/emacs.org") + (find-file "~/org/emacs.org") + (find-file "~/.emacs.d/org/emacs.org")))) + (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/.emacs.d/bba.org"))) + +#+END_SRC + +** Tag tasks with GTD contexts + +#+BEGIN_SRC emacs-lisp + (setq org-tag-alist '(("@work" . ?b) + ("@home" . ?h) + ("@errands" . ?e) + ("@coding" . ?c) + ("@phone" . ?p) + ("@reading" . ?r) + ("@computer" . ?l) + )) + +#+END_SRC + +** org-capture + +#+BEGIN_SRC emacs-lisp + + ;; (setq org-clock-persist 'history) + (org-clock-persistence-insinuate) + (setq org-clock-persist t) + (setq org-default-notes-file (concat org-directory "/refile.org")) + (define-key global-map "\C-cc" 'org-capture) + + (setq org-capture-templates + '(("t" "todo" entry (file "~/org/todo.org") + "* TODO %^{Task}\n%U\n + + %i\n + %a\n + %? + " :prepend t) + + ("m" "Meeting" entry (file "~/org/refile.org") + "* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t) + + ("n" "note" entry (file+headline "~/org/refile.org" "Note") + "* NOTE %?\n%U\n + + %i\n + %a") + + ("w" "work todo" entry (file+headline "~/workorg/work.org" "Tasks") + "* TODO %? %^{Task}\n%U\n + + %i\n + %a\n\n" :prepend t) + + ("j" "Journal" entry (file+datetree "~/org/diary.org") + "* %?\n%U\n" :clock-in t :clock-resume t) + + ("l" "Links (it)" entry (file+headline "~/org/refile.org" "Links") + "** %c\n\n %u\n %i" + :empty-lines 1) ; (org-capture-string (org-mac-link-safari-get-frontmost-url) "u") + ("C" "Cookbook" entry (file+headline "~/org/kitchen.org" "[[http://allrecipes.com][AllRecipes.com]]") + "%(org-chef-get-recipe-from-url)" + :empty-lines 1))) +#+END_SRC + +https://raw.githubusercontent.com/howardabrams/hamacs/main/ha-capturing-notes.org + +Using =emacsclient=, the operating system or other applications can trigger a call to capture content into Emacs. I started with the functions from [[https://macowners.club/posts/org-capture-from-everywhere-macos/][this essay]], which made a nice approach to opening and closing a frame: +#+begin_src emacs-lisp + (defun start-capture-frame () + "Create a new frame and run `org-capture'." + (interactive) + (make-frame '((name . "capture") + (top . 300) + (left . 700) + (width . 80) + (height . 25))) + (select-frame-by-name "capture") + (delete-other-windows) + (cl-letf (((symbol-function 'switch-to-buffer-other-window) 'switch-to-buffer)) + (org-capture))) +#+end_src +When I call [[help:org-capture][org-capture]] in its own frame, I don’t want any other windows around, so we /rebind/ =org-capture= ’s call to switch the buffer to another window, to switch to the capture buffer. + +Wouldn’t it be grand if when we finished capturing, the frame automatically closed: +#+begin_src emacs-lisp + (defun org-capture-delete-frame () + "Hook for `org-capture-after-finalize-hook' to delete the frame." + (message "Finished with the org-capture-after-finalize-hook") + (when (equal "capture" (frame-parameter nil 'name)) + (delete-frame))) + + (add-hook 'org-capture-after-finalize-hook 'org-capture-delete-frame) +#+end_src + +This external shell script calls the function to kick everything off from applications that aren’t Emacs: +#+begin_src sh :shebang "#!/bin/bash" :tangle ~/bin/emacs-capture + /usr/local/bin/emacsclient -s work -n -e "(start-capture-frame)" +#+end_src + + +** Define some handy link abbreviations + +#+BEGIN_SRC emacs-lisp + + (setq org-link-abbrev-alist '( + ("bing" . "http://www.bing.com/search?q=%sform=OSDSRC") + ("cpan" . "http://search.cpan.org/search?query=%s&mode=all") + ("google" . "http://www.google.com/search?q=") + ("gmap" . "http://maps.google.com/maps?q=%s") + ("omap" . "http://nominatim.openstreetmap.org/search?q=%s&polygon=1") + ("bmap" . "http://www.bing.com/maps/default.aspx?q=%s&mkt=en&FORM=HDRSC4") + ("wiki" . "http://en.wikipedia.org/wiki/") + ("rfc" . "http://tools.ietf.org/rfc/rfc%s.txt") + ("ads" . "http://adsabs.harvard.edu/cgi-bin/nph-abs_connect?author=%s&db_key=AST") + ("vertica" . "https://my.vertica.com/docs/7.2.x/HTML/Content/Search/index.htm?q=%s") + )) + ;; example: [[bmap:space needle]] + +#+END_SRC + +** Some clock stuff. +taken from http://doc.norang.ca/org-mode.org + +#+BEGIN_SRC emacs-lisp + ;; + ;; Resume clocking task when emacs is restarted + (org-clock-persistence-insinuate) + ;; + ;; Show lot of clocking history so it's easy to pick items off the C-F11 list + (setq org-clock-history-length 23) + ;; Resume clocking task on clock-in if the clock is open + (setq org-clock-in-resume t) + ;; Change tasks to NEXT when clocking in + (setq org-clock-in-switch-to-state 'bh/clock-in-to-next) + ;; Separate drawers for clocking and logs + (setq org-drawers (quote ("PROPERTIES" "LOGBOOK" "RESULTS"))) + ;; Save clock data and state changes and notes in the LOGBOOK drawer + (setq org-clock-into-drawer t) + ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration + (setq org-clock-out-remove-zero-time-clocks t) + ;; Clock out when moving task to a done state + (setq org-clock-out-when-done t) + ;; Save the running clock and all clock history when exiting Emacs, load it on startup + (setq org-clock-persist t) + ;; Do not prompt to resume an active clock + (setq org-clock-persist-query-resume nil) + ;; Enable auto clock resolution for finding open clocks + (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running)) + ;; Include current clocking task in clock reports + (setq org-clock-report-include-clocking-task t) + (setq org-duration-format + '(:hours "%d" :require-hours t :minutes ":%02d" :require-minutes t)) + (setq bh/keep-clock-running nil) + + (defun bh/is-project-p () + "Any task with a todo keyword subtask" + (save-restriction + (widen) + (let ((has-subtask) + (subtree-end (save-excursion (org-end-of-subtree t))) + (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1))) + (save-excursion + (forward-line 1) + (while (and (not has-subtask) + (< (point) subtree-end) + (re-search-forward "^\*+ " subtree-end t)) + (when (member (org-get-todo-state) org-todo-keywords-1) + (setq has-subtask t)))) + (and is-a-task has-subtask)))) + + (defun bh/clock-in-to-next (kw) + "Switch a task from TODO to NEXT when clocking in. + Skips capture tasks, projects, and subprojects. + Switch projects and subprojects from NEXT back to TODO" + (when (not (and (boundp 'org-capture-mode) org-capture-mode)) + (cond + ((and (member (org-get-todo-state) (list "TODO")) + (bh/is-task-p)) + "NEXT") + ((and (member (org-get-todo-state) (list "NEXT")) + (bh/is-project-p)) + "TODO")))) + + (defun bh/find-project-task () + "Move point to the parent (project) task if any" + (save-restriction + (widen) + (let ((parent-task (save-excursion (org-back-to-heading 'invisible-ok) (point)))) + (while (org-up-heading-safe) + (when (member (nth 2 (org-heading-components)) org-todo-keywords-1) + (setq parent-task (point)))) + (goto-char parent-task) + parent-task))) + + (defun bh/punch-in (arg) + "Start continuous clocking and set the default task to the + selected task. If no task is selected set the Organization task + as the default task." + (interactive "p") + (setq bh/keep-clock-running t) + (if (equal major-mode 'org-agenda-mode) + ;; + ;; We're in the agenda + ;; + (let* ((marker (org-get-at-bol 'org-hd-marker)) + (tags (org-with-point-at marker (org-get-tags-at)))) + (if (and (eq arg 4) tags) + (org-agenda-clock-in '(16)) + (bh/clock-in-organization-task-as-default))) + ;; + ;; We are not in the agenda + ;; + (save-restriction + (widen) + ; Find the tags on the current task + (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4)) + (org-clock-in '(16)) + (bh/clock-in-organization-task-as-default))))) + + (defun bh/punch-out () + (interactive) + (setq bh/keep-clock-running nil) + (when (org-clock-is-active) + (org-clock-out)) + (org-agenda-remove-restriction-lock)) + + (defun bh/clock-in-default-task () + (save-excursion + (org-with-point-at org-clock-default-task + (org-clock-in)))) + + (defun bh/clock-in-parent-task () + "Move point to the parent (project) task if any and clock in" + (let ((parent-task)) + (save-excursion + (save-restriction + (widen) + (while (and (not parent-task) (org-up-heading-safe)) + (when (member (nth 2 (org-heading-components)) org-todo-keywords-1) + (setq parent-task (point)))) + (if parent-task + (org-with-point-at parent-task + (org-clock-in)) + (when bh/keep-clock-running + (bh/clock-in-default-task))))))) + + ;; (defvar bh/organization-task-id "eb155a82-92b2-4f25-a3c6-0304591af2f9") + (defvar bh/organization-task-id "20140625-424242-424242") + + (defun bh/clock-in-organization-task-as-default () + (interactive) + (org-with-point-at (org-id-find bh/organization-task-id 'marker) + (org-clock-in '(16)))) + + (defun bh/clock-out-maybe () + (when (and bh/keep-clock-running + (not org-clock-clocking-in) + (marker-buffer org-clock-default-task) + (not org-clock-resolving-clocks-due-to-idleness)) + (bh/clock-in-parent-task))) + + (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append) + + (defvar bh/insert-inactive-timestamp t) + + (defun bh/toggle-insert-inactive-timestamp () + (interactive) + (setq bh/insert-inactive-timestamp (not bh/insert-inactive-timestamp)) + (message "Heading timestamps are %s" (if bh/insert-inactive-timestamp "ON" "OFF"))) + + (defun bh/insert-inactive-timestamp () + (interactive) + (org-insert-time-stamp nil t t nil nil nil)) + + (defun bh/insert-heading-inactive-timestamp () + (save-excursion + (when bh/insert-inactive-timestamp + (org-return) + (org-cycle) + (bh/insert-inactive-timestamp)))) + + (add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append) + + ; Targets include this file and any file contributing to the agenda - up to 9 levels deep + (setq org-refile-targets (quote ((nil :maxlevel . 9) + (org-agenda-files :maxlevel . 9)))) + + ; Use full outline paths for refile targets - we file directly with IDO + (setq org-refile-use-outline-path t) + + ; Targets complete directly with IDO + (setq org-outline-path-complete-in-steps nil) + + ; Allow refile to create parent tasks with confirmation + (setq org-refile-allow-creating-parent-nodes (quote confirm)) + + ;; Use IDO for both buffer and file completion and ido-everywhere to t + ;(setq org-completion-use-ido t) + ;(setq ido-everywhere t) + ;(setq ido-max-directory-size 100000) + ;(ido-mode (quote both)) + ; Use the current window when visiting files and buffers with ido + ;(setq ido-default-file-method 'selected-window) + ;(setq ido-default-buffer-method 'selected-window) + ; Use the current window for indirect buffer display + (setq org-indirect-buffer-display 'current-window) + + ;;;; Refile settings + ; Exclude DONE state tasks from refile targets + (defun bh/verify-refile-target () + "Exclude todo keywords with a done state from refile targets" + (not (member (nth 2 (org-heading-components)) org-done-keywords))) + + (setq org-refile-target-verify-function 'bh/verify-refile-target) + + (defun bba-clock-in () + "Clock in of workhours." + (interactive) + (find-file "~/org/workhours.org") + (goto-char (point-min)) + (if (re-search-forward (concat "^\*\* "(format-time-string "%Y-%m")) nil t) + (progn (org-beginning-of-line) + (re-search-forward "^ *:LOGBOOK:") + (next-line) + (org-beginning-of-line) + (insert (format-time-string "CLOCK: [%Y-%m-%d %a %H:%M]")) + (newline) + ))) + + (defun bba-clock-out () + "Clock out of workhours." + (interactive) + (find-file "~/org/workhours.org") + (goto-char (point-min)) + (if (re-search-forward (concat "^\*\* "(format-time-string "%Y-%m")) nil t) + (progn (org-beginning-of-line) + (re-search-forward "^ *:LOGBOOK:") + (next-line) + (org-end-of-line) + (insert (format-time-string "--[%Y-%m-%d %a %H:%M]")) + (org-ctrl-c-ctrl-c)))) + + + (global-set-key (kbd "") 'org-agenda) + (global-set-key (kbd " c") 'calendar) + (global-set-key (kbd " I") 'bba-clock-in) + (global-set-key (kbd " O") 'bba-clock-out) + (global-set-key (kbd " t") 'bh/insert-inactive-timestamp) + (global-set-key (kbd " T") 'bh/toggle-insert-inactive-timestamp) + (global-set-key (kbd "C-") 'previous-buffer) + (global-set-key (kbd "C-") 'next-buffer) + (global-set-key (kbd "") 'org-clock-goto) + (global-set-key (kbd "C-") 'org-clock-in) + + + + (if (>= emacs-major-version 24) + (progn + (add-hook 'org-mode-hook + (lambda () + (auto-fill-mode) + (which-function-mode) + (flyspell-mode -1) + (define-key org-mode-map "\C-h\C-y" '(lambda () (interactive) (find-file "~/.emacs.d/snippets/org-mode.org"))) + (when (display-graphic-p) + (progn + (rainbow-delimiters-mode)) + ) + ) + ) + (add-hook 'text-mode-hook + (lambda () + (auto-fill-mode) + (flyspell-mode) + ) + ) + (add-hook 'snippet-mode-hook + (lambda () + (auto-fill-mode -1) + (flyspell-mode -1) + ) + ) + (add-hook 'prog-mode-hook + (lambda () + (when (display-graphic-p) + (rainbow-delimiters-mode)) + ) + ) + (add-hook 'eshell-mode-hook + (lambda () + (smartparens-mode t) + ) + ) + ) + (progn + (add-hook 'org-mode-hook + (lambda () + (auto-fill-mode) + (define-key org-mode-map "\C-h\C-y" '(lambda () (interactive) (find-file "~/.emacs.d/snippets/org-mode.org")))) + )) + + ) + + +#+END_SRC + +#+BEGIN_SRC emacs-lisp + (setq org-duration-format '((special . h:mm))) +#+END_SRC + +** clocktable +[2016-04-15 Fri 17:05] + +Assuming that I understood your problem correctly, I hacked together a +quick solution. First, you should ensure that you create only one +outline entry per day, if you are checking in and out multiple +times. Define the following function that'll compute the overtime for +a given day. + +#+BEGIN_SRC emacs-lisp + (defun compute-overtime (duration-string) + "Computes overtime duration string for the given time DURATION-STRING." + (let (minutes-in-a-workday + work-minutes + overtime-minutes) + (defconst minutes-in-a-workday 480) + (setq work-minutes (org-duration-to-minutes duration-string) + overtime-minutes (- work-minutes minutes-in-a-workday)) + (if (< overtime-minutes 0) (setq overtime-minutes 0)) + (org-minutes-to-hh:mm-string overtime-minutes))) +#+END_SRC + +Then, use this in a clock table formula in the file whatnot. + +#+BEGIN_SRC org + ,#+BEGIN: clocktable :maxlevel 1 :emphasize nil :scope file :formula "$3='(compute-overtime $2)::@2$3=string(\"Overtime\")" + ,#+END: clocktable +#+END_SRC + +** youtube links + +Thanks to [[http://endlessparentheses.com/embedding-youtube-videos-with-org-mode-links.html][endlessparentheses]]: Youtube makes it pretty simple +to embed videos, they give you the entire iframe HTML code to use, but +this wouldn’t really be Emacs if we couldn’t make things just a little +bit easier. + +#+BEGIN_SRC emacs-lisp :tangle never + (defvar yt-iframe-format + ;; You may want to change your width and height. + (concat "")) + + (org-add-link-type + "yt" + (lambda (handle) + (browse-url + (concat "https://www.youtube.com/embed/" + handle))) + (lambda (path desc backend) + (cl-case backend + (html (format yt-iframe-format + path (or desc ""))) + (latex (format "\href{%s}{%s}" + path (or desc "video")))))) +#+END_SRC + +To use this, just write your org links in the following way (optionally adding a description). + +[[yt:A3JAlWM8qRM]] + +When you export to HTML, this will produce that same inlined snippet +that Youtube specifies. The advantage (over simply writing out the +iframe) is that this link can be clicked in org-mode, and can be +exported to other formats as well. + +** [[http://kitchingroup.cheme.cmu.edu/blog/2016/03/21/Displaying-image-overlays-on-image-filenames-in-Emacs/][Displaying image overlays on image filenames in Emacs]] +[2016-11-09 Wed 12:57] + +Thanks to John Kitchin we can display images in Emacs. + +#+BEGIN_SRC emacs-lisp + (defvar image-tooltip-re (concat "\\(?3:'\\|\"\\)\\(?1:.*\\." + (regexp-opt '("png" "PNG" "JPG" "jpeg" + "jpg" "JPEG" "eps" "EPS")) + "\\)\\(?:\\3\\)") + "Regexp to match image filenames in quotes") + + (defun image-tooltip (window object position) + (save-excursion + (goto-char position) + (let (beg end imgfile img s) + (while (not (looking-at image-tooltip-re)) + (forward-char -1)) + (setq imgfile (match-string-no-properties 1)) + (when (file-exists-p imgfile) + (setq img (create-image (expand-file-name imgfile) + 'imagemagick nil :width 200)) + (propertize "Look in the minibuffer" + 'display img))))) + + (font-lock-add-keywords + nil + `((,image-tooltip-re + 0 '(face font-lock-keyword-face + help-echo image-tooltip)))) + + (font-lock-ensure) +#+END_SRC + +** org-mime-org-buffer-htmlize + +Use =C-c M= to send a multipart email with .org as text and exported +html. + +#+BEGIN_SRC emacs-lisp + (load-file "~/.emacs.d/elpa/org-mime-20191226.2309/org-mime.el") + (add-hook 'org-mode-hook + (lambda() + (define-key org-mode-map "\C-c\S-m" 'org-mime-org-buffer-htmlize))) +#+END_SRC + +** org-bullets +#+BEGIN_SRC emacs-lisp + (when (display-graphic-p) + (load-file "~/.emacs.d/lisp/org-bullets.el") + (require 'org-bullets) + (add-hook 'org-mode-hook (lambda () + (progn + (org-bullets-mode 1))))) +#+END_SRC + +** org-ellipsis + +#+BEGIN_SRC emacs-lisp + (when (display-graphic-p) + (setq org-ellipsis " ↴↴↴") + ) + +#+END_SRC + +** fontify + +#+BEGIN_SRC emacs-lisp + (setq org-src-fontify-natively t) +#+END_SRC + +** hide emphasis-markers + +#+BEGIN_SRC emacs-lisp + (setq org-hide-emphasis-markers t) + (setq org-catch-invisible-edits 'smart) +#+END_SRC + +** underscore in export +[2016-10-28 Fri 12:08] + +#+BEGIN_SRC emacs-lisp + (setq org-export-with-sub-superscripts nil) +#+END_SRC + +** css style html export +[2016-10-28 Fri 12:21] + +run =toggle-org-custom-inline-style= in a org buffer associated with a +file. + +#+BEGIN_SRC emacs-lisp + ;; put your css files there + (defvar org-theme-css-dir "~/.emacs.d/org-css/") + (defvar org-theme-css) + + (defun toggle-org-custom-inline-style () + (interactive) + (let ((hook 'org-export-before-parsing-hook) + (fun 'set-org-html-style)) + (if (memq fun (eval hook)) + (progn + (remove-hook hook fun 'buffer-local) + (message "Removed %s from %s" (symbol-name fun) (symbol-name hook))) + (add-hook hook fun nil 'buffer-local) + (message "Added %s to %s" (symbol-name fun) (symbol-name hook))))) + + (defun org-theme () + (interactive) + (let* ((cssdir org-theme-css-dir) + (css-choices (directory-files cssdir nil ".css$")) + (css (completing-read "theme: " css-choices nil t))) + (concat cssdir css))) + + (defun set-org-html-style (&optional backend) + (interactive) + (when (or (null backend) (eq backend 'html)) + (let ((f (or (and (boundp 'org-theme-css) org-theme-css) (org-theme)))) + (if (file-exists-p f) + (progn + (set (make-local-variable 'org-theme-css) f) + (set (make-local-variable 'org-html-head) + (with-temp-buffer + (insert "\n") + (buffer-string))) + (set (make-local-variable 'org-html-head-include-default-style) + nil) + (message "Set custom style from %s" f)) + (message "Custom header file %s doesnt exist" f))))) +#+END_SRC + +** org-sticky-header +[2017-04-26 Wed 13:09] + +#+BEGIN_SRC emacs-lisp + (add-to-list 'load-path "~/.emacs.d/elpa/org-sticky-header-20191117.549" t) + (add-hook 'org-mode-hook + (lambda ()(org-sticky-header-mode 1)) + ) +#+END_SRC + +** [[https://github.com/dfeich/org-listcruncher][org-listcruncher]] +[2018-05-24 Thu 09:08] + +#+BEGIN_SRC emacs-lisp + (load-file (expand-file-name "~/.emacs.d/lisp/org-listcruncher.el")) + +#+END_SRC +** additional org settings +[2016-11-03 Thu 09:36] +Thanks to [[https://github.com/dakrone/eos/blob/master/eos-org.org][eos-org]]. + +Special begin/end of line to skip tags and stars + +#+BEGIN_SRC emacs-lisp + (setq org-special-ctrl-a/e t) +#+END_SRC + +Special keys for killing a headline + +#+BEGIN_SRC emacs-lisp + (setq org-special-ctrl-k t) +#+END_SRC + +blank lines are removed when exiting the code edit buffer + +#+BEGIN_SRC emacs-lisp + (setq org-src-strip-leading-and-trailing-blank-lines t) +#+END_SRC + +Return on a link breaks the link? Just follow it. + +#+BEGIN_SRC emacs-lisp + (setq org-return-follows-link t) +#+END_SRC + +Smart yanking: https://www.gnu.org/software/emacs/manual/html_node/org/Structure-editing.html + +#+BEGIN_SRC emacs-lisp + (setq org-yank-adjusted-subtree t) +#+END_SRC + +#+BEGIN_SRC emacs-lisp + (setq org-tags-column -102) + +#+END_SRC + +use emacs as default. Otherwise executables without extension get +executed instead of opened. + +#+BEGIN_SRC emacs-lisp + (setq org-file-apps '((auto-mode . emacs) + ("\\.mm\\'" . default) + ("\\.x?html?\\'" . default) + ("\\.pdf\\'" . default) + ( t . emacs))) +#+END_SRC + diff --git a/bba.org b/bba.org index b04fec72..8c49182f 100644 --- a/bba.org +++ b/bba.org @@ -889,1812 +889,195 @@ I still like ido-find-file. ) #+END_SRC -* org-mode - -See [[http://orgmode.org/worg/org-tutorials/orgtutorial_dto.html][orgtutorial_dto]] for details. - -It's worth to use Emacs for org-mode alone. -[[http://howardism.org/Technical/Emacs/literate-devops.html][Literate DevOps]] and [[http://www.howardism.org/Technical/Emacs/literate-database.html][Literate Database Work]] are only 2 use cases. -With [[https://github.com/fniessen/org-html-themes.git][org html themes]] it's easy to generate beautiful output. - -#+BEGIN_SRC emacs-lisp - (require 'ox-md nil t) - (setq org-use-speed-commands t) -#+END_SRC - -** org-mac-link -[2018-11-06 Tue 14:20] - -#+BEGIN_SRC emacs-lisp - (if (string-equal system-type "darwin") - (progn (require 'org-mac-link) - (define-key org-mode-map (kbd "C-c g") 'org-mac-grab-link))) -#+END_SRC - -** org-eldoc -[2017-01-06 Fri 14:23] - -#+BEGIN_SRC emacs-lisp - (load-file (expand-file-name "~/.emacs.d/lisp/org-eldoc.el")) -#+END_SRC - -** org-plus-contrib - -Some extra functionality from the org package repository. - -#+BEGIN_SRC emacs-lisp :tangle no - (if (>= emacs-major-version 24) - (progn - (add-to-list 'load-path "~/.emacs.d/elpa/org-plus-contrib-20191028" t) - )) - -#+END_SRC - -** org-protocol - -Run these commands to make org-protocol work in gnome: - -#+BEGIN_SRC sh :eval no :tangle no - gconftool-2 -s /desktop/gnome/url-handlers/org-protocol/command '/usr/bin/emacsclient %s' --type String - gconftool-2 -s /desktop/gnome/url-handlers/org-protocol/enabled --type Boolean true -#+END_SRC - -this is how your firefox bookmark must look like: - -#+BEGIN_SRC :eval no :tangle no - javascript:location.href='org-protocol://capture:/l/'%20+%20encodeURIComponent(location.href)+'/'%20+%20encodeURIComponent(document.title)+%20'/'%20+%20encodeURIComponent(window.getSelection()%20) -#+END_SRC - - -#+BEGIN_SRC emacs-lisp - (require 'org-protocol) - - (add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) - (define-key global-map "\C-cl" 'org-store-link) - (define-key global-map "\C-ca" 'org-agenda) - (setq org-log-done t) - (setq org-id-method (quote uuidgen)) - (setq org-src-window-setup 'current-window) - (setq org-startup-indented 1) - - (if (equal "work" (getenv "SYSENV")) - (setq org-agenda-files (list "~/workorg/work.org" - "~/org/todo.org" - "~/org/notes.org" - "~/org/emacs.org" - "~/org/it.org" - "~/org/refile.org")) - (setq org-agenda-files (list "~/org/work.org" - "~/org/todo.org" - "~/org/notes.org" - "~/org/emacs.org" - "~/org/it.org" - "~/org/refile.org"))) - -#+END_SRC - -** org sync to icloud -[2022-09-07 Wed 11:11] - -With [[https://beorgapp.com][beorg]] we can have our tasks with us. -As it supports icloud drive we can use a git hook to sync files after commit: - -#+begin_src sh :eval never - #!/bin/bash - - for file in notes todo motorcycles; do - rsync -tuvq ~/org/${file}.org ~/Library/Mobile\ Documents/iCloud~com~appsonthemove~beorg/Documents/org/${file}.org - rsync -tuvq ~/Library/Mobile\ Documents/iCloud~com~appsonthemove~beorg/Documents/org/${file}.org ~/org/${file}.org - done -#+end_src - -However sometimes it's nice to sync manually as well. -Why leave Emacs for that? - -#+begin_src emacs-lisp - (defun isync () - "sync org files to and from icloud drive." - (interactive) - (save-some-buffers) - (shell-command "git --work-tree ~/org/ --git-dir ~/org/.git commit -a -m 'autocommit'")) - (define-key global-map (kbd "S-") 'isync) -#+end_src - -** org-man -[2018-08-28 Tue 16:57] - -#+BEGIN_SRC emacs-lisp - (org-add-link-type "man" 'org-man-open) - (add-hook 'org-store-link-functions 'org-man-store-link) - - (defcustom org-man-command 'man - "The Emacs command to be used to display a man page." - :group 'org-link - :type '(choice (const man) (const woman))) - - (defun org-man-open (path) - "Visit the manpage on PATH. - PATH should be a topic that can be thrown at the man command." - (funcall org-man-command path)) - - (defun org-man-store-link () - "Store a link to a manpage." - (when (memq major-mode '(Man-mode woman-mode)) - ;; This is a man page, we do make this link - (let* ((page (org-man-get-page-name)) - (link (concat "man:" page)) - (description (format "Manpage for %s" page))) - (org-store-link-props - :type "man" - :link link - :description description)))) - - (defun org-man-get-page-name () - "Extract the page name from the buffer name." - ;; This works for both `Man-mode' and `woman-mode'. - (if (string-match " \\(\\S-+\\)\\*" (buffer-name)) - (match-string 1 (buffer-name)) - (error "Cannot create link to this man page"))) - -#+END_SRC - -** org-clocktable -[2022-08-03 Wed 17:02] - -https://www.erichgrunewald.com/posts/how-i-track-my-hour-balance-with-a-custom-org-mode-clock-table/ - -#+begin_src emacs-lisp - (require 'cl-lib) - (require 'org-clock) - (defun org-dblock-write:work-report (params) - "Calculate how many hours too many or too few I have worked. - PARAMS are defined in the template, they are :tstart for the - first day for which there's data (e.g. <2022-01-01>) - and :tend for the last date (e.g. )." - ;; cl-flet is a macro from the common lisp emulation package that allows us to - ;; bind functions, just like let allows us to do with values. - (cl-flet* - ((format-time (time) (format-time-string - (org-time-stamp-format t t) time)) - (get-minutes-from-log (t1 t2) (cl-second - (org-clock-get-table-data - (buffer-file-name) - (list :maxlevel 0 - :tstart (format-time t1) - :tend (format-time t2)))))) - (let* ((start - (seconds-to-time (org-matcher-time (plist-get params :tstart)))) - (end - (seconds-to-time (org-matcher-time (plist-get params :tend)))) - (time start) - (total-days-worked 0)) - (progn - ;; loop through all the days in the time frame provided and count how - ;; many days minutes were reported. - (while (time-less-p time end) - (let* ((next-day (time-add time (date-to-time "1970-01-02T00:00Z"))) - (minutes-in-day (get-minutes-from-log time next-day))) - ;; exclude weekend - (if (and (> (string-to-number (format-time-string "%w" time)) 0) - (< (string-to-number (format-time-string "%w" time)) 6) - (> minutes-in-day 0)) (cl-incf total-days-worked 1)) - (setq time next-day))) - ;; now we can just do some simple arithmetic to get the difference - ;; between hours ideally worked and hours actually worked. - (let* ((total-minutes-worked (get-minutes-from-log start end)) - (hours-worked (/ total-minutes-worked 60.0)) - (hours-per-workday 8) - (hours-should-work (* total-days-worked hours-per-workday)) - (hour-difference (- hours-worked hours-should-work))) - (insert (format "%0.1f" hour-difference))))))) -#+end_src - -#+begin_src org :eval never - ,#+BEGIN: work-report :tstart "<2022-04-01>" :tend "<2022-04-27>" - ,#+END: + (list + (cons 'name prompt) + (cons 'candidates cands) + '(action . (("Expand" . (lambda (selection) selection)))) + )) + (setq result (helm-other-buffer '(tmpsource) "*helm-select-yasnippet")) + (if (null result) + (signal 'quit "user quit!") + (cdr (assoc result rmap)))) + nil))) #+end_src -#+begin_quote -One limitation is that the algorithm assumes that any day you worked -on is a day on which you should have worked the full number of -hours. So if I log a session that goes from Friday afternoon to after -midnight (that is, early Saturday morning), it assumes I should have -worked 16 hours those days, whereas in fact only Friday was a -workday. I solve this by editing my hour reports manually whenever -this happens. -#+end_quote - -** [[https://github.com/stig/ob-applescript.el][ob-applescript]] -[2016-09-27 Tue 09:34] - -This module lets you run AppleScript from AppleScript source code -blocks with Org Babel. - -This package is a direct result of attempting to answer a question on -this [[http://emacs.stackexchange.com/q/26374/10625][emacs.stackexchange.com thread]]. +Default to snippet-mode if we are in a sub directory of snippets: #+BEGIN_SRC emacs-lisp - (require 'ob-applescript) + (add-to-list 'auto-mode-alist '("\\.emacs.d/snippets/[^/]*/" . snippet-mode)) #+END_SRC -** [[https://github.com/stig/ox-jira.el][ox-jira]] -[2016-05-22 Sun 20:53] +* define some major modes for yasnippets +[2016-05-25 Wed 10:26] -Org-mode export backend for JIRA markup +I use yasnippet for sql a lot. +Languages differ and I need different templates. #+BEGIN_SRC emacs-lisp - (if (>= emacs-major-version 24) - (require 'ox-jira)) + (define-derived-mode sql-oracle-mode sql-mode "OracleSQL" + "Major mode for ORACLE SQL" + (setq sql-product 'oracle) + ) #+END_SRC -We are lazy and want to speed up things: - #+BEGIN_SRC emacs-lisp - (defun bba-org-export-jira-clipboard() - "narrow to org subtree and store content in jira format in clipboard." - (interactive) - (org-narrow-to-subtree) - (bba-export-jira-org) - (let ((org-export-use-babel nil)) - (ox-jira-export-as-jira)) - (delete-region (point) (progn (forward-line 1)(point))) - (push-mark (point)) - (push-mark (point-max) nil t) - (goto-char (point-min)) - (kill-ring-save 1 1 1) - (other-window -1) - (widen) - (other-window 1) - ) + (define-derived-mode sql-vertica-mode sql-mode "VerticaSQL" + "Major mode for Vertica" + (setq sql-product 'ansi) + ) - (define-key org-mode-map "\C-c\S-j" 'bba-org-export-jira-clipboard) #+END_SRC -Besides the clipboard we want also an org file in =/tmp/= to attach to -the jira ticket. Of course some boiler plate for the poor souls who -never heard of orgmode. - - #+BEGIN_SRC emacs-lisp - (defun bba-export-jira-org() - "export current narrowed view to file in tmp and open a finder window on OS-X." - (interactive) - (goto-char (point-min)) - (insert "# This file is just plain text called orgmode") - (newline) - (insert "# https://en.wikipedia.org/wiki/Org-mode") - (newline) - (insert "# You can open it in any text editor or file reader.") - (newline) - (insert "# You might want to use Emacs for best experience.") - (newline) - (if (re-search-forward "jira:" nil t 1) - (if (org-in-regexp org-bracket-link-regexp 1) - (let ((remove (list (match-beginning 0) (match-end 0))) - (description (last (split-string (if (match-end 3) - (match-string-no-properties 3) - (match-string-no-properties 1)) ":")))) - (org-open-at-point) - (push-mark (point)) - (push-mark (point-max) nil t) - (goto-char (point-min)) - (write-region (mark) (point) (concat "/tmp/" (car description) ".org") nil nil ) - (deactivate-mark) - (if (string-equal system-type "darwin")(shell-command "open /tmp/")) - ))) - (goto-char (point-min)) - (kill-line 4) + (define-derived-mode sql-mysql-mode sql-mode "MySQL" + "Major mode for MySQL" + (setq sql-product 'mysql) ) -#+END_SRC - -#+BEGIN_SRC emacs-lisp - (defun bba-open-jira() - "open current ticket." - (interactive) - (let ((oldpoint (point-marker))) - (org-narrow-to-subtree) - (goto-char (point-min)) - (if (re-search-forward "jira:" nil t 1) - (org-open-at-point) - (progn (widen) - (outline-up-heading 1 t) - (bba-open-jira) - )) - (widen) - (goto-char oldpoint) - ) - ) - (define-key org-mode-map "\C-xl\S-j" 'bba-open-jira) #+END_SRC -** ox-reveal -[2017-11-06 Mon 23:26] +* [[https://github.com/flycheck/flycheck][flycheck]] -Get reveal.js as well: +To get puppet-lint: #+BEGIN_SRC sh :tangle never - git clone https://github.com/hakimel/reveal.js/ -#+END_SRC - -#+BEGIN_SRC emacs-lisp - (require 'ox-reveal) -#+END_SRC - -** ox-publish -[2018-01-24 Wed 20:29] - - #+BEGIN_SRC emacs-lisp - (require 'ox-html) - (require 'ox-publish) - (require 'ox-rss) - (require 'htmlize) - #+END_SRC - -#+BEGIN_SRC emacs-lisp - (setq org-mode-websrc-directory (concat (getenv "HOME") "/git/website/org")) - (setq org-mode-publishing-directory (concat (getenv "HOME") "/git/website/html/")) - - (setq org-publish-project-alist - `(("all" - :components ("blog-content" "blog-static" "blog-rss")) - - ("blog-content" - :base-directory ,org-mode-websrc-directory - :base-extension "org" - :publishing-directory ,org-mode-publishing-directory - :recursive t - :publishing-function org-html-publish-to-html - ; :preparation-function org-mode-blog-prepare - :export-with-tags nil - :headline-levels 4 - :auto-preamble t - :auto-postamble nil - :auto-sitemap t - :sitemap-title "Bundesbrandschatzamt" - :section-numbers nil - :table-of-contents nil - :with-toc nil - :with-author nil - :with-creator nil - :with-tags t - :with-smart-quotes t - - :html-doctype "html5" - :html-html5-fancy t - :html-preamble org-mode-blog-preamble - :html-postamble org-mode-blog-postamble - :html-head " - - - \n" - :html-head-extra " - - - - " - :html-head-include-default-style nil - ) - - ("blog-static" - :base-directory ,org-mode-websrc-directory - :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|svg" - :publishing-directory ,org-mode-publishing-directory - :recursive t - :publishing-function org-publish-attachment - ) - - ("blog-rss" - :base-directory ,org-mode-websrc-directory - :base-extension "org" - :rss-image-url "http://www.bundesbrandschatzamt.de/~baron/img/dragon-head.png" - :publishing-directory ,org-mode-publishing-directory - :publishing-function (org-rss-publish-to-rss) - :html-link-home "http://www.bundesbrandschatzamt.de/~baron/" - :html-link-use-abs-url t - :with-toc nil - :with-author nil - :with-email nil - :with-creator nil - :exclude ".*" - :include ("index.org")))) - - (defun org-mode-blog-preamble (options) - "The function that creates the preamble top section for the blog. - OPTIONS contains the property list from the org-mode export." - (let ((base-directory (plist-get options :base-directory))) - (org-babel-with-temp-filebuffer (expand-file-name "top-bar.html" base-directory) (buffer-string)))) - - (defun org-mode-blog-postamble (options) - "The function that creates the postamble, or bottom section for the blog. - OPTIONS contains the property list from the org-mode export." - (let ((base-directory (plist-get options :base-directory))) - (org-babel-with-temp-filebuffer (expand-file-name "bottom.html" base-directory) (buffer-string)))) - - (defun org-mode-blog-prepare () - "`index.org' should always be exported so touch the file before publishing." - (let* ((base-directory (plist-get project-plist :base-directory)) - (buffer (find-file-noselect (expand-file-name "index.org" base-directory) t))) - (with-current-buffer buffer - (set-buffer-modified-p t) - (save-buffer 0)) - (kill-buffer buffer))) -#+END_SRC - -** [[https://github.com/tarsius/ox-texinfo-plus][ox-texinfo+]] -[2019-01-23 Wed 16:08] - -#+BEGIN_SRC emacs-lisp - (load-file (expand-file-name "~/.emacs.d/lisp/ox-texinfo+.el")) + gem install puppet-lint #+END_SRC -** bba-ox-clip-formatted-copy -[2016-12-13 Tue 15:29] +modified puppet-lint definition to include no-80chars-check and fixed +log-format. #+BEGIN_SRC emacs-lisp - (defun bba-ox-clip-formatted-copy() - "wrapper for ox-clip-formatted-copy to disable org-export-use-babel." - (interactive) - (let ((org-export-use-babel nil)) - (ox-clip-formatted-copy (mark) (point))) - ) - - (define-key org-mode-map "\M-\S-w" 'bba-ox-clip-formatted-copy) -#+END_SRC - -** org-edit-special -[2022-09-08 Thu 14:00] - -For whatever reason rainbow-delimiter was not active in the special -buffer. SQL is so much better with rainbows. - -#+begin_src emacs-lisp - (define-advice org-edit-special (:after (&optional arg) my-big-advice) - (rainbow-delimiters-mode 1)) -#+end_src - -** comint -[2022-02-25 Fri 11:49] - -remove duplicates in modes like sqli. - -#+begin_src emacs-lisp - (add-hook 'comint-mode-hook - '(lambda () (setq comint-input-ignoredups t))) -#+end_src - -** comint-write-buffer -[2018-01-09 Tue 14:10] -#+BEGIN_SRC emacs-lisp - (defun comint-write-output-buffer (buffername &optional append) - "Write output from interpreter since last input to BUFFER. - Any prompt at the end of the output is not written. - - If the optional argument APPEND (the prefix argument when interactive) - is non-nil, the output is appended to the buffer instead. - If it is nil existing buffer gets killed upon request." - (interactive - (list (read-buffer - (if current-prefix-arg - "Append output to buffer: " - "Write output to buffer: ")) - current-prefix-arg - )) - (if append - (get-buffer-create buffername) + (if (>= emacs-major-version 24) (progn - (if (get-buffer buffername) - (kill-buffer-ask (get-buffer buffername))) - (get-buffer-create buffername) - ) - ) - (save-excursion - (goto-char (process-mark (get-buffer-process (current-buffer)))) - (forward-line 0) - (append-to-buffer buffername comint-last-input-end (point)))) - (define-key comint-mode-map (kbd "C-c s-s") 'comint-write-output-buffer) - -#+END_SRC -** bba-create-ticket-tmp-dir -[2017-07-28 Fri 13:07] + (add-to-list 'load-path "~/.emacs.d/elpa/flycheck-20210825.1804") + (require 'flycheck) + (add-hook 'after-init-hook #'global-flycheck-mode) + (flycheck-define-checker puppet-lint + "A Puppet DSL style checker using puppet-lint. -#+BEGIN_SRC emacs-lisp - (defun bba-create-ticket-tmp-dir-open-dir-screen() - "Create directory for the current ticket in tmp if not exist. - Open the directory of the current ticket in iterm screen via keyboard maestro." - (interactive) - (org-narrow-to-subtree) - (let ((beg (point))) - (goto-char (point-min)) - (if (re-search-forward "jira:" nil t 1) - (if (org-in-regexp org-bracket-link-regexp 1) - (let ((remove (list (match-beginning 0) (match-end 0))) - (description (last (split-string (if (match-end 3) - (match-string-no-properties 3) - (match-string-no-properties 1)) ":")))) - (unless (file-exists-p (concat "~/tmp/" (downcase (car description)))) - (mkdir (concat "~/tmp/" (downcase (car description)))) - ) - (kill-new (concat "~/tmp/" (downcase (car description)))) - ))) - (goto-char beg) - ) - (widen) - (shell-command "osascript -e \'tell app \"Keyboard Maestro Engine\" to do script \"screen-start-cd-to-clipboard\"'") - ) + See URL `http://puppet-lint.com/'." + ;; We must check the original file, because Puppetlint is quite picky on the + ;; names of files and there place in the directory structure, to comply with + ;; Puppet's autoload directory layout. For instance, a class foo::bar is + ;; required to be in a file foo/bar.pp. Any other place, such as a Flycheck + ;; temporary file will cause an error. + :command ("puppet-lint" + "--no-80chars-check" "--log-format" "%{path}:%{line}:%{kind}: %{message} (%{check})" + source-original) + :error-patterns + ((warning line-start (file-name) ":" line ":warning: " (message) line-end) + (error line-start (file-name) ":" line ":error: " (message) line-end)) + :modes puppet-mode + ;; Since we check the original file, we can only use this syntax checker if + ;; the buffer is actually linked to a file, and if it is not modified. + :predicate flycheck-buffer-saved-p) + )) #+END_SRC -** bba-remove-comments-and-empty-lines -[2018-03-06 Tue 13:58] #+BEGIN_SRC emacs-lisp - (defun bba-remove-comments-and-empty-lines() - "Remove all lines containing comments or nothing at all." - (interactive) - (goto-char (point-min)) - (let (kill-ring) - (comment-kill (count-lines (point-min)(point-max)))) - (goto-char (point-min)) - (flush-lines "^$")) + (setq puppet-lint-command + (concat + "puppet-lint --with-context " + "--no-80chars-check " + "--no-puppet_url_without_modules-check " + "--fail-on-warnings " + "--log-format \"%{path}:%{line}: %{kind}: %{message} (%{check})\"" + ) + ) #+END_SRC -** bba-edit-sql -[2022-05-13 Fri 13:23] - -use edit-indirect-region to zoom into a END_PREPARE region in -sql-mode. Handy for embedded SQL in Perl. - -#+begin_src emacs-lisp - (defun bba-edit-sql () - "Find the region between previous END_PREPARE and the one after it. - Open that block in edit-indirect-region and switch to sql-mode." - (interactive) - (save-mark-and-excursion - (search-backward "END_PREPARE") - (next-line) - (beginning-of-line) - (set-mark-command nil) - (search-forward "END_PREPARE") - (beginning-of-line) - (edit-indirect-region (mark) (point) t) - (sql-mode) - )) - (global-set-key (kbd "s-S") 'bba-edit-sql) -#+end_src -** search notes -[2018-02-09 Fri 10:57] - -Your notes are more useful if you can easily search them! - #+BEGIN_SRC emacs-lisp - (defun snw () - "Search work notes." - (interactive) - (rgrep (read-regexp "Search for" 'grep-tag-default 'grep-regexp-history) "*.org" (file-truename "~/workorg"))) - - (defun sn () - "Search notes." - (interactive) - (rgrep (read-regexp "Search for" 'grep-tag-default 'grep-regexp-history) "*.org" (file-truename "~/org"))) - -#+END_SRC - -** search last miliseconds and convert to hours at point -[2022-04-21 Thu 13:17] - -#+begin_src emacs-lisp - (defun bba-ms-to-h () - "search for last miliseconds and convert to hours at point. - Useful for Vertica timing output." - (interactive) - (save-mark-and-excursion - (let (bounds pos1 pos2 mything oldpos) - (setq oldpos (point)) - (search-backward " ms") - (search-backward " ") - (right-char) - (setq bounds (bounds-of-thing-at-point 'symbol)) - (setq pos1 (car bounds)) - (setq pos2 (cdr bounds)) - (setq mything (buffer-substring-no-properties pos1 pos2)) - (setq mything (/ (round (/ (string-to-number mything) 10 60 60.0)) 100.0)) - (goto-char oldpos) - (insert-before-markers (format "%s hours." mything))))) -#+end_src - -** Some initial languages we want org-babel to support - -#+BEGIN_SRC emacs-lisp - - (org-babel-do-load-languages - 'org-babel-load-languages - '( - (shell . t) - (python . t) - (R . t) - (ruby . t) - (ditaa . t) - (dot . t) - (octave . t) - (sqlite . t) - (perl . t) - (sql . t) - (tmux . sh) - (R . t) - )) - - ;;(setq org-html-preamble nil - ;; org-html-postamble nil - ;; org-html-head "") - - ;; (setq org-html-preamble nil - ;; org-html-postamble nil - ;; org-html-include-default-style nil - ;; org-html-head "" - ;; org-export-html-with-timestamp nil - ;; org-export-html-style "body-only" - ;; ) - ;; body-only option ? - - ;; (setq html (org-export-as-html 3 nil nil 1)) - (setq org-babel-tmux-location "/opt/local/bin/tmux") - + (setq flycheck-json-python-json-executable "python2.7") #+END_SRC -** holidays -[2022-09-06 Tue 18:32] +SQL: -#+begin_src emacs-lisp - (add-to-list 'load-path "~/.emacs.d/elpa/german-holidays-20181213.644") - (require 'german-holidays) - (setq holiday-local-holidays holiday-german-HH-holidays) +#+begin_src sh :tangle never + gem install --user-install sqlint #+end_src -** open current directory in finder -[2017-01-09 Mon 15:18] - -Sometimes you need a file finder in the current buffers directory. - -#+BEGIN_SRC emacs-lisp - (defun bba-open-file-dir-finder () - "Open the directory of the current file in finder." - (interactive) - (if (string-equal system-type "darwin") - (shell-command (concat "open " (file-name-directory (buffer-file-name)))) - ) - ) - -#+END_SRC - -** open current file via osx open -[2017-06-07 Wed 13:50] - -#+BEGIN_SRC emacs-lisp - (defun bba-open-file-system () - "Open the current file via osx open." - (interactive) - (if (string-equal system-type "darwin") - (shell-command (concat "open " (buffer-file-name))) - ) - ) - -#+END_SRC - -** open current directory in iterm screen -[2017-02-14 Tue 12:24] - -Open current buffers directory in gnu screen in iterm. - -#+BEGIN_SRC emacs-lisp - (defun bba-open-file-dir-screen () - "Open the directory of the current file in iterm screen via keyboard maestro." - (interactive) - (if (string-equal system-type "darwin") - (progn - (if (null buffer-file-name) - (kill-new default-directory) - (kill-new (file-name-directory (buffer-file-name)))) - (shell-command "osascript -e \'tell app \"Keyboard Maestro Engine\" to do script \"screen-start-cd-to-clipboard\"'") - ) - ) - ) - - - -#+END_SRC - -** Find next and previous =#+BEGIN_SRC sh= block. -Very useful for repetitive literate devops jobs. - then and so on. - -#+BEGIN_SRC emacs-lisp - (add-hook 'org-mode-hook - (lambda () - - (fset 'bba/org-search-src-sh - (lambda (&optional arg) "Find next BEGIN_SRC sh block." (interactive "p") (kmacro-exec-ring-item (quote ([19 94 35 92 43 66 69 71 73 78 95 83 82 67 32 115 104 down] 0 "%d")) arg))) - (define-key org-mode-map "\C-c\S-n" 'bba/org-search-src-sh) - - (fset 'bba/org-search-src-sh-reverse - (lambda (&optional arg) "Find previous BEGIN_SRC sh block." (interactive "p") (kmacro-exec-ring-item (quote ([18 94 35 92 43 66 69 71 73 78 95 83 82 67 32 115 104 18 down] 0 "%d")) arg))) - (define-key org-mode-map "\C-c\S-p" 'bba/org-search-src-sh-reverse) - )) - -#+END_SRC - -** copy previous src block -[2016-08-25 Thu 23:36] +* [[https://github.com/kai2nenobu/guide-key][guide-key]] -This is helpful in training sessions. +Probably the best help to keep track of the not every day used keybindings. #+BEGIN_SRC emacs-lisp - (defun bba-copy-and-yank-org-src-block() - "copy last org src block and insert it at point. - If region is active copy only the src begin and src end lines." - (interactive) - (if (use-region-p) - (progn - (let (-p1 -p2 srclength) - (setq -p1 (region-beginning) -p2 (region-end)) - (setq mark-active nil) - (re-search-backward "\#\\+BEGIN_SRC") - (forward-line -1) - (if (looking-at "\#\\+RESULTS:")(re-search-backward "\#\\+BEGIN_SRC")) - (forward-line -1) - (if (not (looking-at "\#"))(forward-line)) - (set-mark-command nil) - (forward-line) - (beginning-of-line) - (kill-ring-save 1 1 1) - (goto-char -p1) - (set-mark-command nil) - (insert (pop kill-ring)) - (setq srclength (- (region-end) (region-beginning))) - (setq mark-active nil) - (re-search-backward "\#\\+END_SRC") - (set-mark-command nil) - (forward-line) - (beginning-of-line) - (kill-ring-save 1 1 1) - (kill-append "\n" nil) - (goto-char (+ -p2 srclength)) - (insert (pop kill-ring)) - ) - ) - (progn - (push-mark) - (re-search-backward "\#\\+BEGIN_SRC") - (forward-line -1) - (if (looking-at "\#\\+RESULTS:")(re-search-backward "\#\\+BEGIN_SRC")) - (forward-line -1) - (if (not (looking-at "\#"))(forward-line)) - (set-mark-command nil) - (re-search-forward "\#\\+END_SRC") - (forward-line) - (beginning-of-line) - (kill-ring-save 1 1 1) - (set-mark-command '1) - (set-mark-command '1) - (insert (pop kill-ring)) - (re-search-backward "\#\\+BEGIN_SRC") - (forward-line) - )) - ) - - (defun bba-copy-org-src-block(arg) - "copy org src block. Can be around point, too. If POSITION is negative look backwards for x occurance, if positive search forwards." - (interactive "p") - (push-mark) - (goto-char (point-at-bol)) - (if (not current-prefix-arg) - (progn - (message "foo %s" arg) - (if (not (looking-at "\#\\+BEGIN_SRC"))(re-search-backward "\#\\+BEGIN_SRC")) - (forward-line -1) - (if (looking-at "\#\\+RESULTS:")(re-search-backward "\#\\+BEGIN_SRC")) - (forward-line -1) - (if (not (looking-at "\#"))(forward-line)) - (set-mark-command nil) - (re-search-forward "\#\\+END_SRC") - (forward-line) - (goto-char (point-at-bol)) - (kill-ring-save 1 1 1) - (set-mark-command '1) - (set-mark-command '1)) + (if (>= emacs-major-version 24) (progn - (re-search-forward "\#\\+BEGIN_SRC" nil nil arg) - (forward-line -1) - (if (not (looking-at "\#"))(forward-line)) - (set-mark-command nil) - (re-search-forward "\#\\+END_SRC") - (forward-line) - (goto-char (point-at-bol)) - (kill-ring-save 1 1 1) - (set-mark-command '1) - (set-mark-command '1) - (insert (pop kill-ring)) - (re-search-backward "\#\\+BEGIN_SRC") - (forward-line))) + (add-to-list 'load-path "~/.emacs.d/elpa/popwin-20150315.1300") + (add-to-list 'load-path "~/.emacs.d/elpa/guide-key-20150108.635") + (require 'guide-key) + (setq guide-key/guide-key-sequence '("C-x" "C-x C-k" "C-x 4" "C-c" "C-h" "C-x l" "" "" "s-l")) + (setq guide-key/recursive-key-sequence-flag t) + (setq guide-key/idle-delay 3) + (guide-key-mode 1) + ) ) - - - ;; (defun bba-copy-org-src-block() - ;; "copy last org src block. Can be around point, too." - ;; (interactive) - ;; (push-mark) - ;; (goto-char (point-at-bol)) - ;; (if (not (looking-at "\#\\+BEGIN_SRC"))(re-search-backward "\#\\+BEGIN_SRC")) - ;; (forward-line -1) - ;; (if (not (looking-at "\#"))(forward-line)) - ;; (set-mark-command nil) - ;; (re-search-forward "\#\\+END_SRC") - ;; (forward-line) - ;; (goto-char (point-at-bol)) - ;; (kill-ring-save 1 1 1) - ;; (set-mark-command '1) - ;; (set-mark-command '1) - ;; ) - - (define-key org-mode-map "\C-c\S-w" 'bba-copy-and-yank-org-src-block) - (define-key org-mode-map (kbd "C-c s-w") 'bba-copy-org-src-block) - #+END_SRC -** org-babel-async -[2016-12-27 Tue 15:45] - -Thanks to [[http://kitchingroup.cheme.cmu.edu/blog/2015/11/20/Asynchronously-running-python-blocks-in-org-mode/#disqus_thread][Asynchronously running pyton bocks in org-mode]] - -Still some work to do on the shell counterpart. -=:dir= is not recongnised. - -#+BEGIN_SRC emacs-lisp - (defun org-babel-async-execute:shell () - "Execute the sh src-block at point asynchronously. - :var headers are supported. - :results output is all that is supported for output. - - A new window will pop up showing you the output as it appears, - and the output in that window will be put in the RESULTS section - of the code block." - (interactive) - (require 'org-id) - (require 'ob-core) - (let* ((current-file (buffer-file-name)) - (uuid (org-id-uuid)) - (code (org-element-property :value (org-element-context))) - (temporary-file-directory "/tmp/") - (tempfile (make-temp-file "sh-")) - (pbuffer (format "*%s*" uuid)) - (varcmds (org-babel-variable-assignments:shell - (nth 2 (org-babel-get-src-block-info)))) - process) - - ;; get rid of old results, and put a place-holder for the new results to - ;; come. - (org-babel-remove-result) +* [[https://github.com/jekor/hidepw][hidepw]] +[2016-02-11 Thu 16:10] - (save-excursion - (re-search-forward "#\\+END_SRC") - (insert (format - "\n\n#+RESULTS: %s\n: %s" - (or (org-element-property :name (org-element-context)) - "") - uuid))) - - ;; open the results buffer to see the results in. - ;; (switch-to-buffer-other-window pbuffer) - - ;; Create temp file containing the code. - (with-temp-file tempfile - ;; if there are :var headers insert them. - (dolist (cmd varcmds) - (insert cmd) - (insert "\n")) - (insert code)) - - ;; run the code - (setq process (start-process - uuid - pbuffer - "bash" - tempfile)) - - ;; when the process is done, run this code to put the results in the - ;; org-mode buffer. - (set-process-sentinel - process - `(lambda (process event) - (save-window-excursion - (save-excursion - (save-restriction - (with-current-buffer (find-file-noselect ,current-file) - (goto-char (point-min)) - (re-search-forward ,uuid) - (beginning-of-line) - (kill-line) - (insert "#+begin_example") - (newline) - (insert - (mapconcat - (lambda (x) - (format "%s" x)) - (butlast (split-string - (with-current-buffer - ,pbuffer - (buffer-string)) - "\n")) - "\n")) - (newline) - (insert "#+end_example") - - )))) - - ;; delete the results buffer then delete the tempfile. - ;; finally, delete the process. - (when (get-buffer ,pbuffer) - (kill-buffer ,pbuffer) - (delete-window)) - (delete-file ,tempfile) - (delete-process process)))) - ) - (define-key org-mode-map (kbd "C-c C-S-c") 'org-babel-async-execute:shell) -#+END_SRC +Hide passwords on the screen from shoulder surfing. +Single pipes interfere with org tables. Just go double. #+BEGIN_SRC emacs-lisp - (defun org-babel-async-execute:python () - "Execute the python src-block at point asynchronously. - :var headers are supported. - :results output is all that is supported for output. - - A new window will pop up showing you the output as it appears, - and the output in that window will be put in the RESULTS section - of the code block." - (interactive) - (let* ((current-file (buffer-file-name)) - (uuid (org-id-uuid)) - (code (org-element-property :value (org-element-context))) - (temporary-file-directory ".") - (tempfile (make-temp-file "py-")) - (pbuffer (format "*%s*" uuid)) - (varcmds (org-babel-variable-assignments:python - (nth 2 (org-babel-get-src-block-info)))) - process) - - ;; get rid of old results, and put a place-holder for the new results to - ;; come. - (org-babel-remove-result) - - (save-excursion - (re-search-forward "#\\+END_SRC") - (insert (format - "\n\n#+RESULTS: %s\n: %s" - (or (org-element-property :name (org-element-context)) - "") - uuid))) - - ;; open the results buffer to see the results in. - (switch-to-buffer-other-window pbuffer) - - ;; Create temp file containing the code. - (with-temp-file tempfile - ;; if there are :var headers insert them. - (dolist (cmd varcmds) - (insert cmd) - (insert "\n")) - (insert code)) - - ;; run the code - (setq process (start-process - uuid - pbuffer - "python" - tempfile)) - - ;; when the process is done, run this code to put the results in the - ;; org-mode buffer. - (set-process-sentinel - process - `(lambda (process event) - (save-window-excursion - (save-excursion - (save-restriction - (with-current-buffer (find-file-noselect ,current-file) - (goto-char (point-min)) - (re-search-forward ,uuid) - (beginning-of-line) - (kill-line) - (insert - (mapconcat - (lambda (x) - (format ": %s" x)) - (butlast (split-string - (with-current-buffer - ,pbuffer - (buffer-string)) - "\n")) - "\n")))))) - ;; delete the results buffer then delete the tempfile. - ;; finally, delete the process. - (when (get-buffer ,pbuffer) - (kill-buffer ,pbuffer) - (delete-window)) - (delete-file ,tempfile) - (delete-process process))))) -#+END_SRC - -** tmux capture-pane -[2016-10-08 Sat 13:43] - -Recently I had to get screen-shots of a ncurses based tool. -=script=, =gnu screen= and =iterm2= were not very helpful because -ncurses repositions the cursor and this information get's lost in -the log files created with them. [[https://tmux.github.io][tmux]] and [[http://www.andre-simon.de/doku/ansifilter/en/ansifilter.php][ansifilter]] came to the -rescue. - -Of course I wanted the screen-shots in my orgmode files. - -To make it short you can run a terminal window in standard 80x24 with -tmux in it. start your tasks and every time you need a screen-shot run -=bba-org-tmux-capture-pane= in your org notes file. -You get a src sh code block with the screen-shot. Additionally save -the below code snippet as =tmuxhardcopy.sh=. Then you have the ANSI -color version sitting in your =/tmp/= directory. - -Of course you will loose the information of what was selected in your -ncurses tool. But don't worry: Select the start and end point in that -line of your screen-shot and call =bba-insert-arrows=. Here is an -example what you will have finally: - -#+BEGIN_SRC sh :tangle no - ────────────────────────────────────────────────────────────────────────────── - - ┌──────────────────────────────────────────────────────────┐ - │ Main Menu │ - │ ┌──────────────────────────────────────────────────────┐ │ - │ │ 1 View Database Cluster State │ │ - │ │ -> 2 Connect to Database <- │ │ - │ │ 3 Start Database │ │ - │ │ 4 Stop Database │ │ - │ │ 5 Restart Vertica on Host │ │ - │ │ 6 Configuration Menu │ │ - │ │ 7 Advanced Menu │ │ - │ │ 8 Help Using the Administration Tools │ │ - │ │ E Exit │ │ - │ └──────────────────────────────────────────────────────┘ │ - ├──────────────────────────────────────────────────────────┤ - │ < OK > < Help > │ - └──────────────────────────────────────────────────────────┘ -#+END_SRC - -Here is the code: - -#+BEGIN_SRC emacs-lisp - (defun bba-org-tmux-capture-pane() - "capture pane of tmux window and insert it as org-mode sh src block." - (interactive) - (insert "#+BEGIN_SRC sh") - (newline) - (insert (shell-command-to-string "tmux capture-pane -eJp | ansifilter")) - (shell-command "tmuxhardcopy.sh") - (insert "#+END_SRC") - (newline) - (forward-line -2) - (org-edit-special) - (delete-trailing-whitespace) - (org-edit-src-exit) - (forward-line 2) - ) -#+END_SRC - -To capture the raw output from tmux including the ANSI colors and see -selections I call this script: - -#+NAME: tmuxhardcopy.sh -#+BEGIN_SRC sh :tangle no - #!/bin/sh - COUNTER=00 - FILE=/tmp/tmux.hardcopy - /opt/local/bin/tmux capture-pane -eJ - - for i in 0{1..9} {10..99}; do - if ! [ -e ${FILE}${i} ]; then - COUNTER=${i} - break - fi - done - - /opt/local/bin/tmux save-buffer ${FILE}${COUNTER} - + (load-file (expand-file-name "~/.emacs.d/lisp/hidepw.el")) + (add-hook 'org-mode-hook 'hidepw-mode) + (setq hidepw-pattern "||\\(.*\\)||") #+END_SRC -** insert arrow -[2016-10-07 Fri 12:25] - -I am using ansifilter to convert ncurses screenshots to ascii only. -That way I can include them into org files as documentation. -The downside of this process: I loose the selections. -As a replacement you can use this function. -Select the start and end points where you want to have ascii arrows -and call this function. - -#+BEGIN_SRC emacs-lisp - (defun bba-insert-arrows() - "insert ascii arrows at start and end of selection." - (interactive) - (insert "<-") - (delete-char 2) - (exchange-point-and-mark) - (insert "->") - (delete-char 2) - (exchange-point-and-mark) - ) -#+END_SRC +* latex -** Define some shortcuts to access major org files. +Use [[http://orgmode.org/manual/A-LaTeX-example.html#A-LaTeX-example][orgtbl]] to create tables. #+BEGIN_SRC emacs-lisp + (setq tex-dvi-view-command "(f=*; pdflatex \"${f%.dvi}.tex\" && open \"${f%.dvi}.pdf\")") + (setq TeX-auto-save t) + (setq TeX-parse-self t) + (setq-default TeX-master nil) - - (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/org/notes.org"))) - - (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/org/private.org"))) - (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/org/workhours.org"))) - (if (equal "work" (getenv "SYSENV")) - (progn - (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/workorg/work.org"))) - (global-set-key (kbd "C-c S-") '(lambda () (interactive) (find-file "~/workorg/work_archive.org"))) - (global-set-key (kbd "C-c C-") '(lambda () (interactive) (org-id-goto "0C6EAD45-9046-4A56-96C3-3B378A444263"))) - ) - (progn - (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/org/work.org"))) + (add-hook 'latex-mode-hook + (lambda () + (auto-fill-mode) + (orgtbl-mode) )) - (global-set-key (kbd "C-c ") '(lambda () (interactive) - ( if (file-exists-p "~/org/emacs.org") - (find-file "~/org/emacs.org") - (find-file "~/.emacs.d/org/emacs.org")))) - (global-set-key (kbd "C-c ") '(lambda () (interactive) (find-file "~/.emacs.d/bba.org"))) #+END_SRC -** Tag tasks with GTD contexts - -#+BEGIN_SRC emacs-lisp - (setq org-tag-alist '(("@work" . ?b) - ("@home" . ?h) - ("@errands" . ?e) - ("@coding" . ?c) - ("@phone" . ?p) - ("@reading" . ?r) - ("@computer" . ?l) - )) - -#+END_SRC - -** org-capture +* thesaurus #+BEGIN_SRC emacs-lisp + ;; The file names are absolute, not relative, locations + ;; - e.g. /foobar/mthesaur.txt.cache, not mthesaur.txt.cache + (setq synonyms-file "~/.emacs.d/mthesaur.txt") + (setq synonyms-cache-file "~/.emacs.d/mthesaur.txt.cache") + (require 'synonyms) +;; (define-key global-map (kbd "C-c ?") 'synonyms) - ;; (setq org-clock-persist 'history) - (org-clock-persistence-insinuate) - (setq org-clock-persist t) - (setq org-default-notes-file (concat org-directory "/refile.org")) - (define-key global-map "\C-cc" 'org-capture) - - (setq org-capture-templates - '(("t" "todo" entry (file+headline "~/org/todo.org" "Tasks") - "* TODO %^{Task}\n%U\n - - %i\n - %a\n - %? - " :prepend t) - - ("m" "Meeting" entry (file "~/org/refile.org") - "* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t) - - ("n" "note" entry (file+headline "~/org/refile.org" "Note") - "* NOTE %?\n%U\n - - %i\n - %a") - - ("w" "work todo" entry (file+headline "~/workorg/work.org" "Tasks") - "* TODO %? %^{Task}\n%U\n - - %i\n - %a\n\n" :prepend t) - - ("j" "Journal" entry (file+datetree "~/org/diary.org") - "* %?\n%U\n" :clock-in t :clock-resume t) - - ("l" "Links (it)" entry (file+headline "~/org/refile.org" "Links") - "** %c\n\n %u\n %i" - :empty-lines 1) - ("C" "Cookbook" entry (file+headline "~/org/kitchen.org" "[[http://allrecipes.com][AllRecipes.com]]") - "%(org-chef-get-recipe-from-url)" - :empty-lines 1))) #+END_SRC -** Define some handy link abbreviations +* highlight indentation +[2016-10-09 Sun 17:13] #+BEGIN_SRC emacs-lisp - - (setq org-link-abbrev-alist '( - ("bing" . "http://www.bing.com/search?q=%sform=OSDSRC") - ("cpan" . "http://search.cpan.org/search?query=%s&mode=all") - ("google" . "http://www.google.com/search?q=") - ("gmap" . "http://maps.google.com/maps?q=%s") - ("omap" . "http://nominatim.openstreetmap.org/search?q=%s&polygon=1") - ("bmap" . "http://www.bing.com/maps/default.aspx?q=%s&mkt=en&FORM=HDRSC4") - ("wiki" . "http://en.wikipedia.org/wiki/") - ("rfc" . "http://tools.ietf.org/rfc/rfc%s.txt") - ("ads" . "http://adsabs.harvard.edu/cgi-bin/nph-abs_connect?author=%s&db_key=AST") - ("vertica" . "https://my.vertica.com/docs/7.2.x/HTML/Content/Search/index.htm?q=%s") - )) - ;; example: [[bmap:space needle]] - + (load-file (expand-file-name "~/.emacs.d/lisp/highlight-indentation.el")) + (set-face-background 'highlight-indentation-face "#e3e3d3") + (set-face-background 'highlight-indentation-current-column-face "#c3b3b3") #+END_SRC +* htmlize -** Some clock stuff. -taken from http://doc.norang.ca/org-mode.org +To get syntax highlight for HTML exports: #+BEGIN_SRC emacs-lisp - - - ;; - ;; Resume clocking task when emacs is restarted - (org-clock-persistence-insinuate) - ;; - ;; Show lot of clocking history so it's easy to pick items off the C-F11 list - (setq org-clock-history-length 23) - ;; Resume clocking task on clock-in if the clock is open - (setq org-clock-in-resume t) - ;; Change tasks to NEXT when clocking in - (setq org-clock-in-switch-to-state 'bh/clock-in-to-next) - ;; Separate drawers for clocking and logs - (setq org-drawers (quote ("PROPERTIES" "LOGBOOK" "RESULTS"))) - ;; Save clock data and state changes and notes in the LOGBOOK drawer - (setq org-clock-into-drawer t) - ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration - (setq org-clock-out-remove-zero-time-clocks t) - ;; Clock out when moving task to a done state - (setq org-clock-out-when-done t) - ;; Save the running clock and all clock history when exiting Emacs, load it on startup - (setq org-clock-persist t) - ;; Do not prompt to resume an active clock - (setq org-clock-persist-query-resume nil) - ;; Enable auto clock resolution for finding open clocks - (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running)) - ;; Include current clocking task in clock reports - (setq org-clock-report-include-clocking-task t) - (setq org-duration-format - '(:hours "%d" :require-hours t :minutes ":%02d" :require-minutes t)) - (setq bh/keep-clock-running nil) - - (defun bh/is-project-p () - "Any task with a todo keyword subtask" - (save-restriction - (widen) - (let ((has-subtask) - (subtree-end (save-excursion (org-end-of-subtree t))) - (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1))) - (save-excursion - (forward-line 1) - (while (and (not has-subtask) - (< (point) subtree-end) - (re-search-forward "^\*+ " subtree-end t)) - (when (member (org-get-todo-state) org-todo-keywords-1) - (setq has-subtask t)))) - (and is-a-task has-subtask)))) - - (defun bh/clock-in-to-next (kw) - "Switch a task from TODO to NEXT when clocking in. - Skips capture tasks, projects, and subprojects. - Switch projects and subprojects from NEXT back to TODO" - (when (not (and (boundp 'org-capture-mode) org-capture-mode)) - (cond - ((and (member (org-get-todo-state) (list "TODO")) - (bh/is-task-p)) - "NEXT") - ((and (member (org-get-todo-state) (list "NEXT")) - (bh/is-project-p)) - "TODO")))) - - (defun bh/find-project-task () - "Move point to the parent (project) task if any" - (save-restriction - (widen) - (let ((parent-task (save-excursion (org-back-to-heading 'invisible-ok) (point)))) - (while (org-up-heading-safe) - (when (member (nth 2 (org-heading-components)) org-todo-keywords-1) - (setq parent-task (point)))) - (goto-char parent-task) - parent-task))) - - (defun bh/punch-in (arg) - "Start continuous clocking and set the default task to the - selected task. If no task is selected set the Organization task - as the default task." - (interactive "p") - (setq bh/keep-clock-running t) - (if (equal major-mode 'org-agenda-mode) - ;; - ;; We're in the agenda - ;; - (let* ((marker (org-get-at-bol 'org-hd-marker)) - (tags (org-with-point-at marker (org-get-tags-at)))) - (if (and (eq arg 4) tags) - (org-agenda-clock-in '(16)) - (bh/clock-in-organization-task-as-default))) - ;; - ;; We are not in the agenda - ;; - (save-restriction - (widen) - ; Find the tags on the current task - (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4)) - (org-clock-in '(16)) - (bh/clock-in-organization-task-as-default))))) - - (defun bh/punch-out () - (interactive) - (setq bh/keep-clock-running nil) - (when (org-clock-is-active) - (org-clock-out)) - (org-agenda-remove-restriction-lock)) - - (defun bh/clock-in-default-task () - (save-excursion - (org-with-point-at org-clock-default-task - (org-clock-in)))) - - (defun bh/clock-in-parent-task () - "Move point to the parent (project) task if any and clock in" - (let ((parent-task)) - (save-excursion - (save-restriction - (widen) - (while (and (not parent-task) (org-up-heading-safe)) - (when (member (nth 2 (org-heading-components)) org-todo-keywords-1) - (setq parent-task (point)))) - (if parent-task - (org-with-point-at parent-task - (org-clock-in)) - (when bh/keep-clock-running - (bh/clock-in-default-task))))))) - - ;; (defvar bh/organization-task-id "eb155a82-92b2-4f25-a3c6-0304591af2f9") - (defvar bh/organization-task-id "20140625-424242-424242") - - (defun bh/clock-in-organization-task-as-default () - (interactive) - (org-with-point-at (org-id-find bh/organization-task-id 'marker) - (org-clock-in '(16)))) - - (defun bh/clock-out-maybe () - (when (and bh/keep-clock-running - (not org-clock-clocking-in) - (marker-buffer org-clock-default-task) - (not org-clock-resolving-clocks-due-to-idleness)) - (bh/clock-in-parent-task))) - - (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append) - - (defvar bh/insert-inactive-timestamp t) - - (defun bh/toggle-insert-inactive-timestamp () - (interactive) - (setq bh/insert-inactive-timestamp (not bh/insert-inactive-timestamp)) - (message "Heading timestamps are %s" (if bh/insert-inactive-timestamp "ON" "OFF"))) - - (defun bh/insert-inactive-timestamp () - (interactive) - (org-insert-time-stamp nil t t nil nil nil)) - - (defun bh/insert-heading-inactive-timestamp () - (save-excursion - (when bh/insert-inactive-timestamp - (org-return) - (org-cycle) - (bh/insert-inactive-timestamp)))) - - (add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append) - - ; Targets include this file and any file contributing to the agenda - up to 9 levels deep - (setq org-refile-targets (quote ((nil :maxlevel . 9) - (org-agenda-files :maxlevel . 9)))) - - ; Use full outline paths for refile targets - we file directly with IDO - (setq org-refile-use-outline-path t) - - ; Targets complete directly with IDO - (setq org-outline-path-complete-in-steps nil) - - ; Allow refile to create parent tasks with confirmation - (setq org-refile-allow-creating-parent-nodes (quote confirm)) - - ;; Use IDO for both buffer and file completion and ido-everywhere to t - ;(setq org-completion-use-ido t) - ;(setq ido-everywhere t) - ;(setq ido-max-directory-size 100000) - ;(ido-mode (quote both)) - ; Use the current window when visiting files and buffers with ido - ;(setq ido-default-file-method 'selected-window) - ;(setq ido-default-buffer-method 'selected-window) - ; Use the current window for indirect buffer display - (setq org-indirect-buffer-display 'current-window) - - ;;;; Refile settings - ; Exclude DONE state tasks from refile targets - (defun bh/verify-refile-target () - "Exclude todo keywords with a done state from refile targets" - (not (member (nth 2 (org-heading-components)) org-done-keywords))) - - (setq org-refile-target-verify-function 'bh/verify-refile-target) - - (defun bba-clock-in () - "Clock in of workhours." - (interactive) - (find-file "~/org/workhours.org") - (goto-char (point-min)) - (if (re-search-forward (concat "^\*\* "(format-time-string "%Y-%m")) nil t) - (progn (org-beginning-of-line) - (re-search-forward "^ *:LOGBOOK:") - (next-line) - (org-beginning-of-line) - (insert (format-time-string "CLOCK: [%Y-%m-%d %a %H:%M]")) - (newline) - ))) - - (defun bba-clock-out () - "Clock out of workhours." - (interactive) - (find-file "~/org/workhours.org") - (goto-char (point-min)) - (if (re-search-forward (concat "^\*\* "(format-time-string "%Y-%m")) nil t) - (progn (org-beginning-of-line) - (re-search-forward "^ *:LOGBOOK:") - (next-line) - (org-end-of-line) - (insert (format-time-string "--[%Y-%m-%d %a %H:%M]")) - (org-ctrl-c-ctrl-c)))) - - - (global-set-key (kbd "") 'org-agenda) - (global-set-key (kbd " c") 'calendar) - (global-set-key (kbd " I") 'bba-clock-in) - (global-set-key (kbd " O") 'bba-clock-out) - (global-set-key (kbd " t") 'bh/insert-inactive-timestamp) - (global-set-key (kbd " T") 'bh/toggle-insert-inactive-timestamp) - (global-set-key (kbd "C-") 'previous-buffer) - (global-set-key (kbd "C-") 'next-buffer) - (global-set-key (kbd "") 'org-clock-goto) - (global-set-key (kbd "C-") 'org-clock-in) - - - (if (>= emacs-major-version 24) (progn - (add-hook 'org-mode-hook - (lambda () - (auto-fill-mode) - (which-function-mode) - (flyspell-mode -1) - (define-key org-mode-map "\C-h\C-y" '(lambda () (interactive) (find-file "~/.emacs.d/snippets/org-mode.org"))) - (when (display-graphic-p) - (progn - (rainbow-delimiters-mode)) - ) - ) - ) - (add-hook 'text-mode-hook - (lambda () - (auto-fill-mode) - (flyspell-mode) - ) - ) - (add-hook 'snippet-mode-hook - (lambda () - (auto-fill-mode -1) - (flyspell-mode -1) - ) - ) - (add-hook 'prog-mode-hook - (lambda () - (when (display-graphic-p) - (rainbow-delimiters-mode)) - ) - ) - (add-hook 'eshell-mode-hook - (lambda () - (smartparens-mode t) - ) - ) + (require 'htmlize ) ) - (progn - (add-hook 'org-mode-hook - (lambda () - (auto-fill-mode) - (define-key org-mode-map "\C-h\C-y" '(lambda () (interactive) (find-file "~/.emacs.d/snippets/org-mode.org")))) - )) - - ) - - -#+END_SRC - -#+BEGIN_SRC emacs-lisp - (setq org-duration-format '((special . h:mm))) -#+END_SRC - -** clocktable -[2016-04-15 Fri 17:05] - -Assuming that I understood your problem correctly, I hacked together a -quick solution. First, you should ensure that you create only one -outline entry per day, if you are checking in and out multiple -times. Define the following function that'll compute the overtime for -a given day. - -#+BEGIN_SRC emacs-lisp - (defun compute-overtime (duration-string) - "Computes overtime duration string for the given time DURATION-STRING." - (let (minutes-in-a-workday - work-minutes - overtime-minutes) - (defconst minutes-in-a-workday 480) - (setq work-minutes (org-duration-to-minutes duration-string) - overtime-minutes (- work-minutes minutes-in-a-workday)) - (if (< overtime-minutes 0) (setq overtime-minutes 0)) - (org-minutes-to-hh:mm-string overtime-minutes))) -#+END_SRC - -Then, use this in a clock table formula in the file whatnot. - -#+BEGIN_SRC org - ,#+BEGIN: clocktable :maxlevel 1 :emphasize nil :scope file :formula "$3='(compute-overtime $2)::@2$3=string(\"Overtime\")" - ,#+END: clocktable -#+END_SRC - -** youtube links - -Thanks to [[http://endlessparentheses.com/embedding-youtube-videos-with-org-mode-links.html][endlessparentheses]]: Youtube makes it pretty simple -to embed videos, they give you the entire iframe HTML code to use, but -this wouldn’t really be Emacs if we couldn’t make things just a little -bit easier. - -#+BEGIN_SRC emacs-lisp :tangle never - (defvar yt-iframe-format - ;; You may want to change your width and height. - (concat "")) - - (org-add-link-type - "yt" - (lambda (handle) - (browse-url - (concat "https://www.youtube.com/embed/" - handle))) - (lambda (path desc backend) - (cl-case backend - (html (format yt-iframe-format - path (or desc ""))) - (latex (format "\href{%s}{%s}" - path (or desc "video")))))) -#+END_SRC - -To use this, just write your org links in the following way (optionally adding a description). - -[[yt:A3JAlWM8qRM]] - -When you export to HTML, this will produce that same inlined snippet -that Youtube specifies. The advantage (over simply writing out the -iframe) is that this link can be clicked in org-mode, and can be -exported to other formats as well. - -** [[http://kitchingroup.cheme.cmu.edu/blog/2016/03/21/Displaying-image-overlays-on-image-filenames-in-Emacs/][Displaying image overlays on image filenames in Emacs]] -[2016-11-09 Wed 12:57] - -Thanks to John Kitchin we can display images in Emacs. - -#+BEGIN_SRC emacs-lisp - (defvar image-tooltip-re (concat "\\(?3:'\\|\"\\)\\(?1:.*\\." - (regexp-opt '("png" "PNG" "JPG" "jpeg" - "jpg" "JPEG" "eps" "EPS")) - "\\)\\(?:\\3\\)") - "Regexp to match image filenames in quotes") - - (defun image-tooltip (window object position) - (save-excursion - (goto-char position) - (let (beg end imgfile img s) - (while (not (looking-at image-tooltip-re)) - (forward-char -1)) - (setq imgfile (match-string-no-properties 1)) - (when (file-exists-p imgfile) - (setq img (create-image (expand-file-name imgfile) - 'imagemagick nil :width 200)) - (propertize "Look in the minibuffer" - 'display img))))) - - (font-lock-add-keywords - nil - `((,image-tooltip-re - 0 '(face font-lock-keyword-face - help-echo image-tooltip)))) - - (font-lock-ensure) -#+END_SRC - -** org-mime-org-buffer-htmlize - -Use =C-c M= to send a multipart email with .org as text and exported -html. - -#+BEGIN_SRC emacs-lisp - (load-file "~/.emacs.d/elpa/org-mime-20191226.2309/org-mime.el") - (add-hook 'org-mode-hook - (lambda() - (define-key org-mode-map "\C-c\S-m" 'org-mime-org-buffer-htmlize))) -#+END_SRC - -** org-bullets -#+BEGIN_SRC emacs-lisp - (when (display-graphic-p) - (load-file "~/.emacs.d/lisp/org-bullets.el") - (require 'org-bullets) - (add-hook 'org-mode-hook (lambda () - (progn - (org-bullets-mode 1))))) -#+END_SRC - -** org-ellipsis - -#+BEGIN_SRC emacs-lisp - (when (display-graphic-p) - (setq org-ellipsis " ↴↴↴") - ) - -#+END_SRC - -** fontify - -#+BEGIN_SRC emacs-lisp - (setq org-src-fontify-natively t) -#+END_SRC - -** hide emphasis-markers - -#+BEGIN_SRC emacs-lisp - (setq org-hide-emphasis-markers t) - (setq org-catch-invisible-edits 'smart) -#+END_SRC - -** underscore in export -[2016-10-28 Fri 12:08] - -#+BEGIN_SRC emacs-lisp - (setq org-export-with-sub-superscripts nil) -#+END_SRC - -** css style html export -[2016-10-28 Fri 12:21] - -run =toggle-org-custom-inline-style= in a org buffer associated with a -file. - -#+BEGIN_SRC emacs-lisp - ;; put your css files there - (defvar org-theme-css-dir "~/.emacs.d/org-css/") - (defvar org-theme-css) - - (defun toggle-org-custom-inline-style () - (interactive) - (let ((hook 'org-export-before-parsing-hook) - (fun 'set-org-html-style)) - (if (memq fun (eval hook)) - (progn - (remove-hook hook fun 'buffer-local) - (message "Removed %s from %s" (symbol-name fun) (symbol-name hook))) - (add-hook hook fun nil 'buffer-local) - (message "Added %s to %s" (symbol-name fun) (symbol-name hook))))) - - (defun org-theme () - (interactive) - (let* ((cssdir org-theme-css-dir) - (css-choices (directory-files cssdir nil ".css$")) - (css (completing-read "theme: " css-choices nil t))) - (concat cssdir css))) - - (defun set-org-html-style (&optional backend) - (interactive) - (when (or (null backend) (eq backend 'html)) - (let ((f (or (and (boundp 'org-theme-css) org-theme-css) (org-theme)))) - (if (file-exists-p f) - (progn - (set (make-local-variable 'org-theme-css) f) - (set (make-local-variable 'org-html-head) - (with-temp-buffer - (insert "\n") - (buffer-string))) - (set (make-local-variable 'org-html-head-include-default-style) - nil) - (message "Set custom style from %s" f)) - (message "Custom header file %s doesnt exist" f))))) -#+END_SRC - -** org-sticky-header -[2017-04-26 Wed 13:09] - -#+BEGIN_SRC emacs-lisp - (add-to-list 'load-path "~/.emacs.d/elpa/org-sticky-header-20191117.549" t) - (add-hook 'org-mode-hook - (lambda ()(org-sticky-header-mode 1)) - ) -#+END_SRC - -** [[https://github.com/dfeich/org-listcruncher][org-listcruncher]] -[2018-05-24 Thu 09:08] - -#+BEGIN_SRC emacs-lisp - (load-file (expand-file-name "~/.emacs.d/lisp/org-listcruncher.el")) - -#+END_SRC -** additional org settings -[2016-11-03 Thu 09:36] -Thanks to [[https://github.com/dakrone/eos/blob/master/eos-org.org][eos-org]]. - -Special begin/end of line to skip tags and stars - -#+BEGIN_SRC emacs-lisp - (setq org-special-ctrl-a/e t) -#+END_SRC - -Special keys for killing a headline - -#+BEGIN_SRC emacs-lisp - (setq org-special-ctrl-k t) -#+END_SRC - -blank lines are removed when exiting the code edit buffer - -#+BEGIN_SRC emacs-lisp - (setq org-src-strip-leading-and-trailing-blank-lines t) -#+END_SRC - -Return on a link breaks the link? Just follow it. - -#+BEGIN_SRC emacs-lisp - (setq org-return-follows-link t) -#+END_SRC - -Smart yanking: https://www.gnu.org/software/emacs/manual/html_node/org/Structure-editing.html - -#+BEGIN_SRC emacs-lisp - (setq org-yank-adjusted-subtree t) -#+END_SRC - -#+BEGIN_SRC emacs-lisp - (setq org-tags-column -102) - -#+END_SRC + ) -use emacs as default. Otherwise executables without extension get -executed instead of opened. -#+BEGIN_SRC emacs-lisp - (setq org-file-apps '((auto-mode . emacs) - ("\\.mm\\'" . default) - ("\\.x?html?\\'" . default) - ("\\.pdf\\'" . default) - ( t . emacs))) #+END_SRC * goto-address-mode @@ -5562,7 +3945,8 @@ Amazon instance ID at point. #+begin_src emacs-lisp (defvar bba-emacs-files (flatten-list - `("bba-shell.org")) + `("bba-shell.org" + "bba-orgmode.org")) "List of org files that complete my configuration.") (defun bba-emacs-load (file) -- 2.47.3