Ricoh GR III, Snapfocus
Automatically add org-files to “org-agenda-files” or remove them, based on whether or not they contain org-keywords
As mentioned before, I use Emacs, org-roam and org-journal. In total I have about 3000 org-files and a tiny fraction of them contains org-keywords. Those files I would like to have in my org-agenda-files (so that they show up in my org-agenda). If there is no TODO or any other org-keyword left, these files should be automatically removed.
This is what I came up with: My solution uses rg (ripgrep) and “~/Documents/GitHub/org/dotfiles/agenda_files.el” is my “org-agenda-files”-file (replace this with yours). Put the snippet below in your .emacs and whenever you save a buffer, “agenda_files.el” is updated. rg is really fast and this causes no tangible delay in my setup.
(defun lt/auto-add-org-agenda () "Automatically add org-files to org-agenda-files or remove them, based on whether or not they contain org-keywords." (interactive) (with-temp-file org-agenda-files (insert (shell-command-to-string (concat "rg -e '\\*.(TODO|NEXT|WAITING|RECREATION|PROJECT).[^%]' -g \"*.org\" -l " org-directory))))) (add-hook 'org-agenda-mode-hook 'lt/auto-add-org-agenda)
2023_02_21-1211: Fixed a stupid typo. 2023_02_24-1445: Corrected add-hook. 2023_02_27-1926: Found a much better hook. Now org-agenda-files is only updated right before the agenda is built. 2023_03_01-0825: If you are working with org-notifications you have to replace org-agenda-files (in the line starting with “(with-temp-file… )” ) with the file specified by org-agenda-files.
Copy org-ified toot to clipboard/org-journal (mastodon.el)
There is a lot of useful information flying around in Mastodon. Some of it I would like to archive in my text-based database (i.e. org-roam). To access Mastodon inside Emacs I use mastodon.el. This little hack copies an org-ified version of the “toot” at point in the mastodon.el timeline to the clipboard. It uses the URL of said toot to pull it’s title from the web (via org-web-tools) and creates an org-link as the heading/context for the toot. The content of the toot is then pasted between #+begin_quote and #+end_quote. I also added a keybinding (“j”) for this to work inside mastodon.el.
Caveats: For boosted toots you need to focus on the original toot first (via “T”).
Line breaks are still a bit of a mess.
((defun lt/mastodon-toot--copy-orgified-toot-to-clipboard () "Copy org-ified toot at point to clipboard." (interactive) (let* ((toot (mastodon-tl--property 'toot-json))) (when toot (let* ((url (alist-get 'url toot)) (content (mastodon-tl--content toot)) (html (org-web-tools--get-url url)) (title (org-web-tools--html-title html))) (with-temp-buffer (emacs-lisp-mode) (insert content) (fill-region (point-min) (point-max)) (let* ((content (buffer-substring (point-min) (point-max))) (complete-toot (concat "\[\[" url "\]\[" title "\]\]\n\n" "#+begin_quote\n\n" content "\n#+end_quote\n\n"))) (kill-new complete-toot) (message "Copied: '%s' to the clipboard." title))))))) (define-key mastodon-mode-map (kbd "j") 'lt/mastodon-toot--copy-orgified-toot-to-clipboard)
Update 2023_02_04: I played around with this setup and decided to directly paste the toot into an org-journal entry. The following code will add that functionality to the keybinding “J” (when in Mastodon.el).
(defun lt/mastodon-toot--copy-orgified-toot-to-org-journal () "Copy org-ified toot at point to org-journal." (interactive) (lt/mastodon-toot--copy-orgified-toot-to-clipboard) (org-journal-new-entry nil) (org-yank)) (define-key mastodon-mode-map (kbd "J") 'lt/mastodon-toot--copy-orgified-toot-to-org-journal)
Btw: If you replace
(org-journal-new-entry nil) in the second snipped with
(org-capture nil "xyz") (whereby xyz stands for a template key) this should also work with org-capture.
Update 2023_02_11: Added a correction for the arbitary line breaks (via
fill-region in a temporary buffer).
An afternoon walk in Duisburg
An afternoon walk in Duisburg. Haven’t been at Landschaftspark for ages – was there with the family and stumbled into a pupplay photoshot…
Ricoh GR III, B&W, pinpoint AF
Add a website from Emacs to Things’ inbox
This code snippet will quickly add a website from any Emacs buffer to Things‘ inbox. The name of the new task is the name of the website, the URL is added as a note. It requires org-web-tools, uses the URL-scheme of Things and in Emacs the cursor must be on the URL you want to add. Everything happens in the background, the focus continues to be on Emacs.
(cl-defun lt/add-url-to-things (&optional (url (org-web-tools--read-url))) "Add a website to Things' inbox." (interactive) (let* ((html (org-web-tools--get-url url)) (title (org-web-tools--html-title html))) (setq things-url (concat "things:///add?title=" title "¬es=" url)) (shell-command (concat "open " "-g " "\"" things-url "\"")) (message "%s" (concat "\"" title "\"" " has been added to Things."))))
Backstory: I’m checking Mastodon with via mastodon.el in Emacs and often encounter interesting websites that I want to come back to later. In the past I’ve used pocket-reader.el to add these sites to Pocket. But this feels like wasting them – I don’t check Pocket just for fun and often just forget that I’ve added something there. Things is (currently) my task manager (despite using org-mode for a lot) and I like to process my findings here.
One reason I enjoy working with Emacs is the relative ease to process text in specific ways. One example: reading Chinese official documents can be quite exhausting, so I let them read to me. For a long time I used read-aloud.el for that. Unfortunately, macOS Ventura broke this package from 2016 – but I was able to replace it with this tiny function:
(defun lt/read-chinese (start end) "Read region in Chinese." (interactive "r") (shell-command-on-region start end "say -v Ting-Ting"))