From 39b47b7ffcb262ab94dfb3d9944cda439b9bbd2f Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Sun, 20 Apr 2025 21:50:25 +0000 Subject: [PATCH] deploy: 68f8a284769ff1368db1e2064be8e07e25db46f0 --- configs/console/index.html | 103 +- configs/desktop/index.html | 954 +-- configs/emacs/index.html | 5543 +++++++++-------- configs/guix/index.html | 288 +- configs/index.xml | 6 +- configs/mail/index.html | 173 +- index.html | 2 +- index.xml | 161 +- packages/biome/index.html | 8 +- packages/elfeed-summary/index.html | 98 +- packages/eshell-atuin/index.html | 2 + packages/index.xml | 158 +- packages/org-clock-agg/index.html | 38 +- packages/org-journal-tags/index.html | 2 +- packages/password-store-completion/index.html | 8 +- packages/pomm/index.html | 2 +- posts/2023-04-13-emacs/index.html | 3 +- posts/index.xml | 3 +- stats/all.png | Bin 124170 -> 124236 bytes stats/emacs-vim.png | Bin 63407 -> 64079 bytes stats/literate-config.png | Bin 69251 -> 70408 bytes tags/emacs/index.xml | 2 +- 22 files changed, 3908 insertions(+), 3646 deletions(-) diff --git a/configs/console/index.html b/configs/console/index.html index 92d095c..78c173c 100644 --- a/configs/console/index.html +++ b/configs/console/index.html @@ -76,8 +76,7 @@
-

No matter from which side you approach penguins, more always come from behind

-
+

No matter from which side you approach penguins, more always come from behind

@@ -90,8 +89,8 @@ color))

(let ((val (if (ct-light-p (my/color-value name))
-	       (my/color-value 'black)
-	     (my/color-value 'white))))
+               (my/color-value 'black)
+             (my/color-value 'white))))
   (if (eq quote 1)
       (concat "\"" val "\"")
     val))
@@ -137,31 +136,38 @@
 

ssh-agent

I’m paranoid so I encrypt my SSH keys.

Got the idea for below from ArchWiki:

-
if ! pgrep -u "$USER" ssh-agent > /dev/null; then
-    ssh-agent -t 1h > "$XDG_RUNTIME_DIR/ssh-agent.env"
+
SSH_AGENT_DIR="/tmp"
+
+if [ "$IS_ANDROID" == "true" ]; then
+    SSH_AGENT_DIR="/data/data/com.termux/files/tmp"
+    mkdir -p $SSH_AGENT_DIR
+fi
+
+if ! pgrep -u "$USER" ssh-agent > /dev/null; then
+    ssh-agent -t 1h > "$SSH_AGENT_DIR/ssh-agent.env"
 fi
 if [[ ! -f "$SSH_AUTH_SOCK" ]]; then
-    source "$XDG_RUNTIME_DIR/ssh-agent.env" >/dev/null
+    source "$SSH_AGENT_DIR/ssh-agent.env" >/dev/null
 fi
 

Guix settings

Enable extra profiles

if [ -z "$IS_ANDROID" ] && [ -z "$NO_GUIX" ] ; then
     GUIX_EXTRA_PROFILES=$HOME/.guix-extra-profiles
     for i in $GUIX_EXTRA_PROFILES/*; do
-	profile=$i/$(basename "$i")
-	if [ -f "$profile"/etc/profile ]; then
-	    GUIX_PROFILE="$profile"
-	    . "$GUIX_PROFILE"/etc/profile
-	fi
-	if [ -d "$profile"/share/man ]; then
-	    if command -v manpath; then
-		export MANPATH="${MANPATH:-$(manpath)}:$profile/share/man"
-	    else
-		export MANPATH="${MANPATH}:$profile/share/man"
-	    fi
-	fi
-	export XDG_DATA_DIRS="$XDG_DATA_DIRS:$profile/share"
-	unset profile
+        profile=$i/$(basename "$i")
+        if [ -f "$profile"/etc/profile ]; then
+            GUIX_PROFILE="$profile"
+            . "$GUIX_PROFILE"/etc/profile
+        fi
+        if [ -d "$profile"/share/man ]; then
+            if command -v manpath >/dev/null 2>/dev/null; then
+                export MANPATH="${MANPATH:-$(manpath)}:$profile/share/man"
+            else
+                export MANPATH="${MANPATH}:$profile/share/man"
+            fi
+        fi
+        export XDG_DATA_DIRS="$XDG_DATA_DIRS:$profile/share"
+        unset profile
     done
 fi
 

Set Jupyter config PATH. It defaults to readonly directory somewhere in Guix profile.

@@ -276,7 +282,7 @@

If termux-setup-storage is available, then we’re running inside termux. It is necessary to source ~/.profile manually.

if command -v termux-setup-storage > /dev/null; then
     if [[ -z "$IS_ANDROID" ]]; then
-	source ~/.profile
+        source ~/.profile
     fi
 fi
 

Source the system-wide file

@@ -298,7 +304,7 @@

Allow other users to access X server. Necessary for stuff like aw-watcher-window.

xhost +local:root > /dev/null 2>&1
 

Set manpager to bat

-
export MANPAGER="sh -c 'sed -e s/.\\\\x08//g | bat -l man -p'"
+
# export MANPAGER="sh -c 'sed -e s/.\\\\x08//g | bat -l man -p'"
 

eat integration

[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/bash"
 

Launch fish

@@ -331,17 +337,17 @@
if ${use_color} ; then # Enable colors for ls, etc. Prefer ~/.dir_colors #64489 if type -P dircolors >/dev/null ; then - if [[ -f ~/.dir_colors ]] ; then - eval $(dircolors -b ~/.dir_colors) - elif [[ -f /etc/DIR_COLORS ]] ; then - eval $(dircolors -b /etc/DIR_COLORS) - fi + if [[ -f ~/.dir_colors ]] ; then + eval $(dircolors -b ~/.dir_colors) + elif [[ -f /etc/DIR_COLORS ]] ; then + eval $(dircolors -b /etc/DIR_COLORS) + fi fi if [[ ${EUID} == 0 ]] ; then - PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] ' + PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] ' else - PS1='\[\033[01;32m\][\u@\h\[\033[01;37m\] \W\[\033[01;32m\]]\$\[\033[00m\] ' + PS1='\[\033[01;32m\][\u@\h\[\033[01;37m\] \W\[\033[01;32m\]]\$\[\033[00m\] ' fi alias ls='ls --color=auto' @@ -350,10 +356,10 @@ alias fgrep='fgrep --colour=auto' else if [[ ${EUID} == 0 ]] ; then - # show root@ when we don't have colors - PS1='\u@\h \W \$ ' + # show root@ when we don't have colors + PS1='\u@\h \W \$ ' else - PS1='\u@\h \w \$ ' + PS1='\u@\h \w \$ ' fi fi @@ -401,21 +407,20 @@

Micromamba

I’ve moved from conda to micromamba because it’s faster.

-

managed by ‘mamba init’ !!!

-
+

managed by ‘mamba init’ !!!

Yeah, tell this to yourself

init_mamba () {
     export MAMBA_EXE="/home/pavel/.guix-extra-profiles/dev/dev/bin/micromamba";
     export MAMBA_ROOT_PREFIX="/home/pavel/micromamba";
     __mamba_setup="$("$MAMBA_EXE" shell hook --shell bash --prefix "$MAMBA_ROOT_PREFIX" 2> /dev/null)"
     if [ $? -eq 0 ]; then
-	eval "$__mamba_setup"
+        eval "$__mamba_setup"
     else
-	if [ -f "/home/pavel/micromamba/etc/profile.d/micromamba.sh" ]; then
-	    . "/home/pavel/micromamba/etc/profile.d/micromamba.sh"
-	else
-	    export  PATH="/home/pavel/micromamba/bin:$PATH"  # extra space after export prevents interference from conda init
-	fi
+        if [ -f "/home/pavel/micromamba/etc/profile.d/micromamba.sh" ]; then
+            . "/home/pavel/micromamba/etc/profile.d/micromamba.sh"
+        else
+            export  PATH="/home/pavel/micromamba/bin:$PATH"  # extra space after export prevents interference from conda init
+        fi
     fi
     unset __mamba_setup
 }
@@ -456,8 +461,8 @@
     starship init fish | source
 else
     function fish_prompt -d "Write out the prompt"
-	printf '%s@%s %s%s%s > ' $USER $hostname \
-	    (set_color $fish_color_cwd) (basename (pwd)) (set_color normal)
+        printf '%s@%s %s%s%s > ' $USER $hostname \
+            (set_color $fish_color_cwd) (basename (pwd)) (set_color normal)
     end
 end
 

Enable vi keybindings & aliases. The alias syntax is the same as in bash, so it’s just a noweb reference to .bashrc.

@@ -964,6 +969,14 @@ aria2 Download tool + + man-db + + + + pv + +

ripgrep config

@@ -1034,9 +1047,9 @@ notify () { if command -v notify-send; then - notify-send -u ${LEVEL:-normal} "$1" "$2" + notify-send -u ${LEVEL:-normal} "$1" "$2" else - echo "$1" "$2" + echo "$1" "$2" fi } diff --git a/configs/desktop/index.html b/configs/desktop/index.html index 72ccba5..4e6c98a 100644 --- a/configs/desktop/index.html +++ b/configs/desktop/index.html @@ -111,8 +111,8 @@

Also, get a foreground for the current color:

(let ((val (if (ct-light-p (my/color-value name))
-	       (my/color-value 'black)
-	     (my/color-value 'white))))
+               (my/color-value 'black)
+             (my/color-value 'white))))
   (if (eq quote 1)
       (concat "\"" val "\"")
     val))
@@ -203,7 +203,7 @@
    (concat "*" (nth 1 elem) ": " (my/color-value (nth 0 elem))))
  (seq-filter
   (lambda (elem) (and (nth 1 elem)
-		      (not (string-empty-p (nth 1 elem)))))
+                      (not (string-empty-p (nth 1 elem)))))
   table)
  "\n")
 
<<get-xresources()>>
@@ -216,10 +216,10 @@
 

(let ((hostname (system-name)))
   (cond ((string-equal hostname "azure") 120)
-	((string-equal hostname "eminence") 120)
-	((string-equal hostname "violet") 120)
-	((string-equal hostname "iris") 120)
-	(t 96)))
+        ((string-equal hostname "eminence") 120)
+        ((string-equal hostname "violet") 120)
+        ((string-equal hostname "iris") 120)
+        (t 96)))
 
Xft.dpi: <<get-dpi()>>
 

Themes

A few programs I use to customize the apperance are listed below.

@@ -446,21 +446,21 @@
Does not take the minibuffer into account." (cl-some (lambda (dir) - (let ((win (windmove-find-other-window dir))) - (and win (not (window-minibuffer-p win))))) - (pcase dir - ('width '(left right)) - ('height '(up down))))) + (let ((win (windmove-find-other-window dir))) + (and win (not (window-minibuffer-p win))))) + (pcase dir + ('width '(left right)) + ('height '(up down)))))

And a function to implement that:

(defun my/exwm-move-window (dir)
   "Move the current window in the direction DIR."
   (let ((other-window (windmove-find-other-window dir))
-	(other-direction (my/exwm-direction-exists-p
-			  (pcase dir
-			    ('up 'width)
-			    ('down 'width)
-			    ('left 'height)
-			    ('right 'height)))))
+        (other-direction (my/exwm-direction-exists-p
+                          (pcase dir
+                            ('up 'width)
+                            ('down 'width)
+                            ('left 'height)
+                            ('right 'height)))))
     (cond
      ((and other-window (not (window-minibuffer-p other-window)))
       (window-swap-states (selected-window) other-window))
@@ -483,20 +483,20 @@
   (unless value
     (setq value my/exwm-resize-value))
   (let* ((is-exwm-floating
-	  (and (derived-mode-p 'exwm-mode)
-	       exwm--floating-frame))
-	 (func (if is-exwm-floating
-		   (intern
-		    (concat
-		     "exwm-layout-"
-		     (pcase kind ('shrink "shrink") ('grow "enlarge"))
-		     "-window"
-		     (pcase dir ('height "") ('width "-horizontally"))))
-		 (intern
-		  (concat
-		   "evil-window"
-		   (pcase kind ('shrink "-decrease-") ('grow "-increase-"))
-		   (symbol-name dir))))))
+          (and (derived-mode-p 'exwm-mode)
+               exwm--floating-frame))
+         (func (if is-exwm-floating
+                   (intern
+                    (concat
+                     "exwm-layout-"
+                     (pcase kind ('shrink "shrink") ('grow "enlarge"))
+                     "-window"
+                     (pcase dir ('height "") ('width "-horizontally"))))
+                 (intern
+                  (concat
+                   "evil-window"
+                   (pcase kind ('shrink "-decrease-") ('grow "-increase-"))
+                   (symbol-name dir))))))
     (when is-exwm-floating
       (setq value (* 5 value)))
     (funcall func value)))
@@ -524,17 +524,17 @@
   (interactive)
   (when (and (eq major-mode 'exwm-mode) (not (eq (next-window) (get-buffer-window))))
     (let ((other-exwm-buffer
-	   (cl-loop with other-buffer = (persp-other-buffer)
-		    for buf in (sort (persp-current-buffers) (lambda (a _) (eq a other-buffer)))
-		    with current-buffer = (current-buffer)
-		    when (and (not (eq current-buffer buf))
-			      (buffer-live-p buf)
-			      (not (string-match-p (persp--make-ignore-buffer-rx) (buffer-name buf)))
-			      (not (get-buffer-window buf)))
-		    return buf)))
+           (cl-loop with other-buffer = (persp-other-buffer)
+                    for buf in (sort (persp-current-buffers) (lambda (a _) (eq a other-buffer)))
+                    with current-buffer = (current-buffer)
+                    when (and (not (eq current-buffer buf))
+                              (buffer-live-p buf)
+                              (not (string-match-p (persp--make-ignore-buffer-rx) (buffer-name buf)))
+                              (not (get-buffer-window buf)))
+                    return buf)))
       (when other-exwm-buffer
-	(with-selected-window (next-window)
-	  (switch-to-buffer other-exwm-buffer))))))
+        (with-selected-window (next-window)
+          (switch-to-buffer other-exwm-buffer))))))
 

This is meant to be called after doing an either vertical or horizontal split, so it’s advised like that:

(advice-add 'evil-window-split :after #'my/exwm-fill-other-window)
 (advice-add 'evil-window-vsplit :after #'my/exwm-fill-other-window)
@@ -557,11 +557,11 @@
   :straight t
   :config
   (setq perspective-exwm-override-initial-name
-	'((0 . "misc")
-	  (1 . "core")
-	  (2 . "browser")
-	  (3 . "comms")
-	  (4 . "dev")))
+        '((0 . "misc")
+          (1 . "core")
+          (2 . "browser")
+          (3 . "comms")
+          (4 . "dev")))
   (setq perspective-exwm-cycle-max-message-length 180)
   (general-define-key
    :keymaps 'perspective-map
@@ -575,23 +575,23 @@
     (pcase exwm-class-name
       ((or "Firefox" "Nightly")
        (perspective-exwm-assign-window
-	:workspace-index 2
-	:persp-name "browser"))
+        :workspace-index 2
+        :persp-name "browser"))
       ("Nyxt"
        (perspective-exwm-assign-window
-	:workspace-index 2
-	:persp-name "browser"))
+        :workspace-index 2
+        :persp-name "browser"))
       ("Alacritty"
        (perspective-exwm-assign-window
-	:persp-name "term"))
+        :persp-name "term"))
       ((or "VK" "Slack" "discord" "TelegramDesktop" "Rocket.Chat")
        (perspective-exwm-assign-window
-	:workspace-index 3
-	:persp-name "comms"))
+        :workspace-index 3
+        :persp-name "comms"))
       ((or "Chromium-browser" "jetbrains-datagrip")
        (perspective-exwm-assign-window
-	:workspace-index 4
-	:persp-name "dev")))))
+        :workspace-index 4
+        :persp-name "dev")))))
 
 (add-hook 'exwm-manage-finish-hook #'my/exwm-configure-window)
 

Workspaces and multi-monitor setup

@@ -611,35 +611,35 @@ (defun my/exwm-store-last-workspace () "Save the last workspace to `my/exwm-last-workspaces'." (setq my/exwm-last-workspaces - (seq-uniq (cons exwm-workspace-current-index - my/exwm-last-workspaces)))) + (seq-uniq (cons exwm-workspace-current-index + my/exwm-last-workspaces)))) (add-hook 'exwm-workspace-switch-hook - #'my/exwm-store-last-workspace) + #'my/exwm-store-last-workspace)

The variable my/exwm-last-workspaces stores the workspace indices; the first item is the index of the current workspace, the second item is the index of the previous workspace, and so on.

One note here is that workspaces may also disappear (e.g. after M-x exwm-workspace-delete), so we also need a function to clean the list:

(defun my/exwm-last-workspaces-clear ()
   "Clean `my/exwm-last-workspaces' from deleted workspaces."
   (setq my/exwm-last-workspaces
-	(seq-filter
-	 (lambda (i) (nth i exwm-workspace--list))
-	 my/exwm-last-workspaces)))
+        (seq-filter
+         (lambda (i) (nth i exwm-workspace--list))
+         my/exwm-last-workspaces)))
 

The monitor list

The second piece of the puzzle is getting the monitor list in the right order.

While it is possible to retrieve the monitor list from exwm-randr-workspace-monitor-plist, this won’t scale well beyond two monitors, mainly because changing this variable may screw up the order.

So the easiest way is to just define the variable like that:

(setq my/exwm-monitor-list
       (pcase (system-name)
-	("indigo" '(nil "DVI-D-0"))
-	("violet" '(nil "DP-1"))
-	(_ '(nil))))
+        ("indigo" '(nil "DVI-D-0"))
+        ("violet" '(nil "DP-1"))
+        (_ '(nil))))
 

If you are changing the RandR configuration on the fly, this variable will also need to be changed, but for now, I don’t have such a necessity.

A function to get the current monitor:

(defun my/exwm-get-current-monitor ()
   "Return the current monitor name or nil."
   (plist-get exwm-randr-workspace-monitor-plist
-	     (cl-position (selected-frame)
-			  exwm-workspace--list)))
+             (cl-position (selected-frame)
+                          exwm-workspace--list)))
 

And a function to cycle the monitor list in either direction:

(defun my/exwm-get-other-monitor (dir)
   "Cycle the monitor list in the direction DIR.
@@ -647,13 +647,13 @@
 DIR is either 'left or 'right."
   (nth
    (% (+ (cl-position
-	  (my/exwm-get-current-monitor)
-	  my/exwm-monitor-list
-	  :test #'string-equal)
-	 (length my/exwm-monitor-list)
-	 (pcase dir
-	   ('right 1)
-	   ('left -1)))
+          (my/exwm-get-current-monitor)
+          my/exwm-monitor-list
+          :test #'string-equal)
+         (length my/exwm-monitor-list)
+         (pcase dir
+           ('right 1)
+           ('left -1)))
       (length my/exwm-monitor-list))
    my/exwm-monitor-list))
 

Switch to another monitor

@@ -666,15 +666,15 @@ (let ((mouse-autoselect-window nil)) (exwm-workspace-switch (cl-loop with other-monitor = (my/exwm-get-other-monitor (or dir 'right)) - for i in (append my/exwm-last-workspaces - (cl-loop for i from 0 - for _ in exwm-workspace--list - collect i)) - if (if other-monitor - (string-equal (plist-get exwm-randr-workspace-monitor-plist i) - other-monitor) - (not (plist-get exwm-randr-workspace-monitor-plist i))) - return i)))) + for i in (append my/exwm-last-workspaces + (cl-loop for i from 0 + for _ in exwm-workspace--list + collect i)) + if (if other-monitor + (string-equal (plist-get exwm-randr-workspace-monitor-plist i) + other-monitor) + (not (plist-get exwm-randr-workspace-monitor-plist i))) + return i))))

I bind this function to s-q, as I’m used from i3.

Move the workspace to another monitor

Now, moving the workspace to another monitor.

@@ -683,20 +683,20 @@ "Move the current workspace to another monitor." (interactive) (let ((new-monitor (my/exwm-get-other-monitor 'right)) - (current-monitor (my/exwm-get-current-monitor))) + (current-monitor (my/exwm-get-current-monitor))) (when (and current-monitor - (>= 1 - (cl-loop for (key value) on exwm-randr-workspace-monitor-plist - by 'cddr - if (string-equal value current-monitor) sum 1))) + (>= 1 + (cl-loop for (key value) on exwm-randr-workspace-monitor-plist + by 'cddr + if (string-equal value current-monitor) sum 1))) (error "Can't remove the last workspace on the monitor!")) (setq exwm-randr-workspace-monitor-plist - (map-delete exwm-randr-workspace-monitor-plist exwm-workspace-current-index)) + (map-delete exwm-randr-workspace-monitor-plist exwm-workspace-current-index)) (when new-monitor (setq exwm-randr-workspace-monitor-plist - (plist-put exwm-randr-workspace-monitor-plist - exwm-workspace-current-index - new-monitor)))) + (plist-put exwm-randr-workspace-monitor-plist + exwm-workspace-current-index + new-monitor)))) (exwm-randr-refresh))

In my configuration this is bound to s-<tab>.

Windmove between monitors

@@ -707,16 +707,16 @@ (if (or (eq dir 'down) (eq dir 'up)) (windmove-do-window-select dir) (let ((other-window (windmove-find-other-window dir)) - (other-monitor (my/exwm-get-other-monitor dir)) - (opposite-dir (pcase dir - ('left 'right) - ('right 'left)))) + (other-monitor (my/exwm-get-other-monitor dir)) + (opposite-dir (pcase dir + ('left 'right) + ('right 'left)))) (if other-window - (windmove-do-window-select dir) - (let ((mouse-autoselect-window nil)) - (my/exwm-switch-to-other-monitor dir)) - (cl-loop while (windmove-find-other-window opposite-dir) - do (windmove-do-window-select opposite-dir)))))) + (windmove-do-window-select dir) + (let ((mouse-autoselect-window nil)) + (my/exwm-switch-to-other-monitor dir)) + (cl-loop while (windmove-find-other-window opposite-dir) + do (windmove-do-window-select opposite-dir))))))

Completions

Setting up some completion interfaces that fit particularly well to use with EXWM. While rofi also works, I want to use Emacs functionality wherever possible to have one completion interface everywhere.

ivy-posframe

@@ -728,27 +728,27 @@ :disabled :config (setq ivy-posframe-parameters '((left-fringe . 10) - (right-fringe . 10) - (parent-frame . nil) - (max-width . 80))) + (right-fringe . 10) + (parent-frame . nil) + (max-width . 80))) (setq ivy-posframe-height-alist '((t . 20))) (setq ivy-posframe-width 180) (setq ivy-posframe-min-height 5) (setq ivy-posframe-display-functions-alist - '((swiper . ivy-display-function-fallback) - (swiper-isearch . ivy-display-function-fallback) - (t . ivy-posframe-display))) + '((swiper . ivy-display-function-fallback) + (swiper-isearch . ivy-display-function-fallback) + (t . ivy-posframe-display))) (ivy-posframe-mode 1))
Disable mouse movement

SOURCE: https://github.com/ch11ng/exwm/issues/550#issuecomment-744784838

(defun my/advise-fn-suspend-follow-mouse (fn &rest args)
   (let ((focus-follows-mouse nil)
-	(mouse-autoselect-window nil)
-	(pos (x-mouse-absolute-pixel-position)))
+        (mouse-autoselect-window nil)
+        (pos (x-mouse-absolute-pixel-position)))
     (unwind-protect
-	(apply fn args)
+        (apply fn args)
       (x-set-mouse-absolute-pixel-position (car pos)
-					   (cdr pos)))))
+                                           (cdr pos)))))
 (with-eval-after-load 'ivy-posframe
   (advice-add #'ivy-posframe--read :around #'my/advise-fn-suspend-follow-mouse))
 
Disable changing focus
@@ -768,11 +768,11 @@ (lambda () (mapc (lambda (var) - (kill-local-variable var) - (setf (symbol-value var) t)) + (kill-local-variable var) + (setf (symbol-value var) t)) '(exwm-workspace-warp-cursor - mouse-autoselect-window - focus-follows-mouse))))) + mouse-autoselect-window + focus-follows-mouse))))) (with-eval-after-load 'ivy-posframe (advice-add #'posframe--create-posframe :after #'my/setup-posframe) @@ -816,9 +816,9 @@

First, some prefixes for keybindings that are always passed to EXWM instead of the X application in line-mode:

(setq exwm-input-prefix-keys
       `(?\C-x
-	?\C-w
-	?\M-x
-	?\M-u))
+        ?\C-w
+        ?\M-x
+        ?\M-u))
 

Also other local keybindings, that are also available only in line-mode:

(defmacro my/app-command (command)
   `(lambda () (interactive) (my/run-in-background ,command)))
@@ -833,106 +833,106 @@
  "M-SPC" (general-key "SPC"))
 

Simulation keys.

(setopt exwm-input-simulation-keys `(
-				   ;; (,(kbd "M-w") . ,(kbd "C-w"))
-				   (,(kbd "M-c") . ,(kbd "C-c"))))
+                                   ;; (,(kbd "M-w") . ,(kbd "C-w"))
+                                   (,(kbd "M-c") . ,(kbd "C-c"))))
 

A quit function with a confirmation.

(defun my/exwm-quit ()
   (interactive)
   (when (or (not (eq (selected-window) (next-window)))
-	    (y-or-n-p "This is the last window. Are you sure?"))
+            (y-or-n-p "This is the last window. Are you sure?"))
     (evil-quit)))
 

And keybindings that are available in both char-mode and line-mode:

(setq exwm-input-global-keys
       `(
-	;; Reset to line-mode
-	(,(kbd "s-R") . exwm-reset)
+        ;; Reset to line-mode
+        (,(kbd "s-R") . exwm-reset)
 
-	;; Switch windows
-	(,(kbd "s-<left>") . (lambda () (interactive) (my/exwm-windmove 'left)))
-	(,(kbd "s-<right>") . (lambda () (interactive) (my/exwm-windmove 'right)))
-	(,(kbd "s-<up>") . (lambda () (interactive) (my/exwm-windmove 'up)))
-	(,(kbd "s-<down>") . (lambda () (interactive) (my/exwm-windmove 'down)))
+        ;; Switch windows
+        (,(kbd "s-<left>") . (lambda () (interactive) (my/exwm-windmove 'left)))
+        (,(kbd "s-<right>") . (lambda () (interactive) (my/exwm-windmove 'right)))
+        (,(kbd "s-<up>") . (lambda () (interactive) (my/exwm-windmove 'up)))
+        (,(kbd "s-<down>") . (lambda () (interactive) (my/exwm-windmove 'down)))
 
-	(,(kbd "s-h"). (lambda () (interactive) (my/exwm-windmove 'left)))
-	(,(kbd "s-l") . (lambda () (interactive) (my/exwm-windmove 'right)))
-	(,(kbd "s-k") . (lambda () (interactive) (my/exwm-windmove 'up)))
-	(,(kbd "s-j") . (lambda () (interactive) (my/exwm-windmove 'down)))
+        (,(kbd "s-h"). (lambda () (interactive) (my/exwm-windmove 'left)))
+        (,(kbd "s-l") . (lambda () (interactive) (my/exwm-windmove 'right)))
+        (,(kbd "s-k") . (lambda () (interactive) (my/exwm-windmove 'up)))
+        (,(kbd "s-j") . (lambda () (interactive) (my/exwm-windmove 'down)))
 
-	;; Moving windows
-	(,(kbd "s-H") . (lambda () (interactive) (my/exwm-move-window 'left)))
-	(,(kbd "s-L") . (lambda () (interactive) (my/exwm-move-window 'right)))
-	(,(kbd "s-K") . (lambda () (interactive) (my/exwm-move-window 'up)))
-	(,(kbd "s-J") . (lambda () (interactive) (my/exwm-move-window 'down)))
+        ;; Moving windows
+        (,(kbd "s-H") . (lambda () (interactive) (my/exwm-move-window 'left)))
+        (,(kbd "s-L") . (lambda () (interactive) (my/exwm-move-window 'right)))
+        (,(kbd "s-K") . (lambda () (interactive) (my/exwm-move-window 'up)))
+        (,(kbd "s-J") . (lambda () (interactive) (my/exwm-move-window 'down)))
 
-	;; Fullscreen
-	(,(kbd "s-f") . exwm-layout-toggle-fullscreen)
-	(,(kbd "s-F") . exwm-floating-toggle-floating)
+        ;; Fullscreen
+        (,(kbd "s-f") . exwm-layout-toggle-fullscreen)
+        (,(kbd "s-F") . exwm-floating-toggle-floating)
 
-	;; Quit
-	(,(kbd "s-Q") . my/exwm-quit)
+        ;; Quit
+        (,(kbd "s-Q") . my/exwm-quit)
 
-	;; Split windows
-	(,(kbd "s-s") . evil-window-vsplit)
-	(,(kbd "s-v") . evil-window-hsplit)
+        ;; Split windows
+        (,(kbd "s-s") . evil-window-vsplit)
+        (,(kbd "s-v") . evil-window-hsplit)
 
-	;; Switch perspectives
-	(,(kbd "s-,") . persp-prev)
-	(,(kbd "s-.") . persp-next)
+        ;; Switch perspectives
+        (,(kbd "s-,") . persp-prev)
+        (,(kbd "s-.") . persp-next)
 
-	;; Switch buffers
-	(,(kbd "s-e") . persp-switch-to-buffer*)
-	;; (,(kbd "s-E") . my/persp-ivy-switch-buffer-other-window)
+        ;; Switch buffers
+        (,(kbd "s-e") . persp-switch-to-buffer*)
+        ;; (,(kbd "s-E") . my/persp-ivy-switch-buffer-other-window)
 
-	;; Resize windows
-	(,(kbd "s-r") . my/exwm-resize-hydra/body)
+        ;; Resize windows
+        (,(kbd "s-r") . my/exwm-resize-hydra/body)
 
-	;; Apps & stuff
-	(,(kbd "s-p") . app-launcher-run-app)
-	(,(kbd "s-P") . async-shell-command)
-	(,(kbd "s-;") . my/exwm-apps-hydra/body)
-	(,(kbd "s--") . password-store-completion)
-	(,(kbd "s-=") . emoji-insert)
-	(,(kbd "s-i") . ,(my/app-command "copyq menu"))
+        ;; Apps & stuff
+        (,(kbd "s-p") . app-launcher-run-app)
+        (,(kbd "s-P") . async-shell-command)
+        (,(kbd "s-;") . my/exwm-apps-hydra/body)
+        (,(kbd "s--") . password-store-completion)
+        (,(kbd "s-=") . emoji-insert)
+        (,(kbd "s-i") . ,(my/app-command "copyq menu"))
 
-	;; Basic controls
-	(,(kbd "<XF86AudioRaiseVolume>") . ,(my/app-command "ponymix increase 5 --max-volume 150"))
-	(,(kbd "<XF86AudioLowerVolume>") . ,(my/app-command "ponymix decrease 5 --max-volume 150"))
-	(,(kbd "<XF86MonBrightnessUp>") . ,(my/app-command "light -A 5"))
-	(,(kbd "<XF86MonBrightnessDown>") . ,(my/app-command "light -U 5"))
-	(,(kbd "<XF86AudioMute>") . ,(my/app-command "ponymix toggle"))
+        ;; Basic controls
+        (,(kbd "<XF86AudioRaiseVolume>") . ,(my/app-command "ponymix increase 5 --max-volume 150"))
+        (,(kbd "<XF86AudioLowerVolume>") . ,(my/app-command "ponymix decrease 5 --max-volume 150"))
+        (,(kbd "<XF86MonBrightnessUp>") . ,(my/app-command "light -A 5"))
+        (,(kbd "<XF86MonBrightnessDown>") . ,(my/app-command "light -U 5"))
+        (,(kbd "<XF86AudioMute>") . ,(my/app-command "ponymix toggle"))
 
-	(,(kbd "<XF86AudioPlay>") . ,(my/app-command "mpc toggle"))
-	(,(kbd "<XF86AudioPause>") . ,(my/app-command "mpc pause"))
-	(,(kbd "<print>") . ,(my/app-command "flameshot gui"))
+        (,(kbd "<XF86AudioPlay>") . ,(my/app-command "mpc toggle"))
+        (,(kbd "<XF86AudioPause>") . ,(my/app-command "mpc pause"))
+        (,(kbd "<print>") . ,(my/app-command "flameshot gui"))
 
-	;; Input method
-	(,(kbd "M-\\") . my/toggle-input-method)
+        ;; Input method
+        (,(kbd "M-\\") . my/toggle-input-method)
 
-	;; Switch workspace
-	(,(kbd "s-q") . my/exwm-switch-to-other-monitor)
-	(,(kbd "s-w") . exwm-workspace-switch)
-	(,(kbd "s-W") . exwm-workspace-move-window)
-	(,(kbd "s-<tab>") . my/exwm-workspace-switch-monitor)
+        ;; Switch workspace
+        (,(kbd "s-q") . my/exwm-switch-to-other-monitor)
+        (,(kbd "s-w") . exwm-workspace-switch)
+        (,(kbd "s-W") . exwm-workspace-move-window)
+        (,(kbd "s-<tab>") . my/exwm-workspace-switch-monitor)
 
-	;; Perspectives
-	(,(kbd "s-{") . perspective-exwm-cycle-all-buffers-backward)
-	(,(kbd "s-}") . perspective-exwm-cycle-all-buffers-forward)
-	(,(kbd "s-[") . perspective-exwm-cycle-exwm-buffers-backward)
-	(,(kbd "s-]") . perspective-exwm-cycle-exwm-buffers-forward)
-	(,(kbd "s-<mouse-4>") . perspective-exwm-cycle-exwm-buffers-backward)
-	(,(kbd "s-<mouse-5>") . perspective-exwm-cycle-exwm-buffers-forward)
-	(,(kbd "s-`") . perspective-exwm-switch-perspective)
-	(,(kbd "s-o") . ,(my/app-command "rofi -show window"))
+        ;; Perspectives
+        (,(kbd "s-{") . perspective-exwm-cycle-all-buffers-backward)
+        (,(kbd "s-}") . perspective-exwm-cycle-all-buffers-forward)
+        (,(kbd "s-[") . perspective-exwm-cycle-exwm-buffers-backward)
+        (,(kbd "s-]") . perspective-exwm-cycle-exwm-buffers-forward)
+        (,(kbd "s-<mouse-4>") . perspective-exwm-cycle-exwm-buffers-backward)
+        (,(kbd "s-<mouse-5>") . perspective-exwm-cycle-exwm-buffers-forward)
+        (,(kbd "s-`") . perspective-exwm-switch-perspective)
+        (,(kbd "s-o") . ,(my/app-command "rofi -show window"))
 
-	;; 's-N': Switch to certain workspace with Super (Win) plus a number key (0 - 9)
-	,@(mapcar (lambda (i)
-		    `(,(kbd (format "s-%d" i)) .
-		      (lambda ()
-			(interactive)
-			(when (or (< ,i (exwm-workspace--count))
-				  (y-or-n-p (format "Create workspace %d" ,i)))
-			  (exwm-workspace-switch-create ,i) ))))
-		  (number-sequence 0 9))))
+        ;; 's-N': Switch to certain workspace with Super (Win) plus a number key (0 - 9)
+        ,@(mapcar (lambda (i)
+                    `(,(kbd (format "s-%d" i)) .
+                      (lambda ()
+                        (interactive)
+                        (when (or (< ,i (exwm-workspace--count))
+                                  (y-or-n-p (format "Create workspace %d" ,i)))
+                          (exwm-workspace-switch-create ,i) ))))
+                  (number-sequence 0 9))))
 

A function to apply changes to exwm-input-global-keys.

(defun my/exwm-update-global-keys ()
   (interactive)
@@ -973,15 +973,15 @@
   (setq last-command #'exwm-input--noop)
   (condition-case hook-error
       (progn
-	(run-hooks 'pre-command-hook)
-	(run-hooks 'post-command-hook))
+        (run-hooks 'pre-command-hook)
+        (run-hooks 'post-command-hook))
     ((error)
      (exwm--log "Error occurred while running command hooks: %s\n\nBacktrace:\n\n%s"
-		hook-error
-		(with-temp-buffer
-		  (setq-local standard-output (current-buffer))
-		  (backtrace)
-		  (buffer-string))))))
+                hook-error
+                (with-temp-buffer
+                  (setq-local standard-output (current-buffer))
+                  (backtrace)
+                  (buffer-string))))))
 

Improve floating windows behavior

These 3 settings seem to cause particular trouble with floating windows. Setting them to nil improves the stability greatly.

(defun my/fix-exwm-floating-windows ()
@@ -995,183 +995,183 @@
 
(defun exwm--on-ClientMessage-old (raw-data _synthetic)
   "Handle ClientMessage event."
   (let ((obj (make-instance 'xcb:ClientMessage))
-	type id data)
+        type id data)
     (xcb:unmarshal obj raw-data)
     (setq type (slot-value obj 'type)
-	  id (slot-value obj 'window)
-	  data (slot-value (slot-value obj 'data) 'data32))
+          id (slot-value obj 'window)
+          data (slot-value (slot-value obj 'data) 'data32))
     (exwm--log "atom=%s(%s)" (x-get-atom-name type exwm-workspace--current)
-	       type)
+               type)
     (cond
      ;; _NET_NUMBER_OF_DESKTOPS.
      ((= type xcb:Atom:_NET_NUMBER_OF_DESKTOPS)
       (let ((current (exwm-workspace--count))
-	    (requested (elt data 0)))
-	;; Only allow increasing/decreasing the workspace number by 1.
-	(cond
-	 ((< current requested)
-	  (make-frame))
-	 ((and (> current requested)
-	       (> current 1))
-	  (let ((frame (car (last exwm-workspace--list))))
-	    (exwm-workspace--get-remove-frame-next-workspace frame)
-	    (delete-frame frame))))))
+            (requested (elt data 0)))
+        ;; Only allow increasing/decreasing the workspace number by 1.
+        (cond
+         ((< current requested)
+          (make-frame))
+         ((and (> current requested)
+               (> current 1))
+          (let ((frame (car (last exwm-workspace--list))))
+            (exwm-workspace--get-remove-frame-next-workspace frame)
+            (delete-frame frame))))))
      ;; _NET_CURRENT_DESKTOP.
      ((= type xcb:Atom:_NET_CURRENT_DESKTOP)
       (exwm-workspace-switch (elt data 0)))
      ;; _NET_ACTIVE_WINDOW.
      ((= type xcb:Atom:_NET_ACTIVE_WINDOW)
       (let ((buffer (exwm--id->buffer id))
-	    iconic window)
-	(when (buffer-live-p buffer)
-	  (with-current-buffer buffer
-	    (when (eq exwm--frame exwm-workspace--current)
-	      (if exwm--floating-frame
-		  (select-frame exwm--floating-frame)
-		(setq iconic (exwm-layout--iconic-state-p))
-		(when iconic
-		  ;; State change: iconic => normal.
-		  (set-window-buffer (frame-selected-window exwm--frame)
-				     (current-buffer)))
-		;; Focus transfer.
-		(setq window (get-buffer-window nil t))
-		(when (or iconic
-			  (not (eq window (selected-window))))
-		  (select-window window))))))))
+            iconic window)
+        (when (buffer-live-p buffer)
+          (with-current-buffer buffer
+            (when (eq exwm--frame exwm-workspace--current)
+              (if exwm--floating-frame
+                  (select-frame exwm--floating-frame)
+                (setq iconic (exwm-layout--iconic-state-p))
+                (when iconic
+                  ;; State change: iconic => normal.
+                  (set-window-buffer (frame-selected-window exwm--frame)
+                                     (current-buffer)))
+                ;; Focus transfer.
+                (setq window (get-buffer-window nil t))
+                (when (or iconic
+                          (not (eq window (selected-window))))
+                  (select-window window))))))))
      ;; _NET_CLOSE_WINDOW.
      ((= type xcb:Atom:_NET_CLOSE_WINDOW)
       (let ((buffer (exwm--id->buffer id)))
-	(when (buffer-live-p buffer)
-	  (exwm--defer 0 #'kill-buffer buffer))))
+        (when (buffer-live-p buffer)
+          (exwm--defer 0 #'kill-buffer buffer))))
      ;; _NET_WM_MOVERESIZE
      ((= type xcb:Atom:_NET_WM_MOVERESIZE)
       (let ((direction (elt data 2))
-	    (buffer (exwm--id->buffer id)))
-	(unless (and buffer
-		     (not (buffer-local-value 'exwm--floating-frame buffer)))
-	  (cond ((= direction
-		    xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_KEYBOARD)
-		 ;; FIXME
-		 )
-		((= direction
-		    xcb:ewmh:_NET_WM_MOVERESIZE_MOVE_KEYBOARD)
-		 ;; FIXME
-		 )
-		((= direction xcb:ewmh:_NET_WM_MOVERESIZE_CANCEL)
-		 (exwm-floating--stop-moveresize))
-		;; In case it's a workspace frame.
-		((and (not buffer)
-		      (catch 'break
-			(dolist (f exwm-workspace--list)
-			  (when (or (eq id (frame-parameter f 'exwm-outer-id))
-				    (eq id (frame-parameter f 'exwm-id)))
-			    (throw 'break t)))
-			nil)))
-		(t
-		 ;; In case it's a floating frame,
-		 ;; move the corresponding X window instead.
-		 (unless buffer
-		   (catch 'break
-		     (dolist (pair exwm--id-buffer-alist)
-		       (with-current-buffer (cdr pair)
-			 (when
-			     (and exwm--floating-frame
-				  (or (eq id
-					  (frame-parameter exwm--floating-frame
-							   'exwm-outer-id))
-				      (eq id
-					  (frame-parameter exwm--floating-frame
-							   'exwm-id))))
-			   (setq id exwm--id)
-			   (throw 'break nil))))))
-		 ;; Start to move it.
-		 (exwm-floating--start-moveresize id direction))))))
+            (buffer (exwm--id->buffer id)))
+        (unless (and buffer
+                     (not (buffer-local-value 'exwm--floating-frame buffer)))
+          (cond ((= direction
+                    xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_KEYBOARD)
+                 ;; FIXME
+                 )
+                ((= direction
+                    xcb:ewmh:_NET_WM_MOVERESIZE_MOVE_KEYBOARD)
+                 ;; FIXME
+                 )
+                ((= direction xcb:ewmh:_NET_WM_MOVERESIZE_CANCEL)
+                 (exwm-floating--stop-moveresize))
+                ;; In case it's a workspace frame.
+                ((and (not buffer)
+                      (catch 'break
+                        (dolist (f exwm-workspace--list)
+                          (when (or (eq id (frame-parameter f 'exwm-outer-id))
+                                    (eq id (frame-parameter f 'exwm-id)))
+                            (throw 'break t)))
+                        nil)))
+                (t
+                 ;; In case it's a floating frame,
+                 ;; move the corresponding X window instead.
+                 (unless buffer
+                   (catch 'break
+                     (dolist (pair exwm--id-buffer-alist)
+                       (with-current-buffer (cdr pair)
+                         (when
+                             (and exwm--floating-frame
+                                  (or (eq id
+                                          (frame-parameter exwm--floating-frame
+                                                           'exwm-outer-id))
+                                      (eq id
+                                          (frame-parameter exwm--floating-frame
+                                                           'exwm-id))))
+                           (setq id exwm--id)
+                           (throw 'break nil))))))
+                 ;; Start to move it.
+                 (exwm-floating--start-moveresize id direction))))))
      ;; _NET_REQUEST_FRAME_EXTENTS
      ((= type xcb:Atom:_NET_REQUEST_FRAME_EXTENTS)
       (let ((buffer (exwm--id->buffer id))
-	    top btm)
-	(if (or (not buffer)
-		(not (buffer-local-value 'exwm--floating-frame buffer)))
-	    (setq top 0
-		  btm 0)
-	  (setq top (window-header-line-height)
-		btm (window-mode-line-height)))
-	(xcb:+request exwm--connection
-	    (make-instance 'xcb:ewmh:set-_NET_FRAME_EXTENTS
-			   :window id
-			   :left 0
-			   :right 0
-			   :top top
-			   :bottom btm)))
+            top btm)
+        (if (or (not buffer)
+                (not (buffer-local-value 'exwm--floating-frame buffer)))
+            (setq top 0
+                  btm 0)
+          (setq top (window-header-line-height)
+                btm (window-mode-line-height)))
+        (xcb:+request exwm--connection
+            (make-instance 'xcb:ewmh:set-_NET_FRAME_EXTENTS
+                           :window id
+                           :left 0
+                           :right 0
+                           :top top
+                           :bottom btm)))
       (xcb:flush exwm--connection))
      ;; _NET_WM_DESKTOP.
      ((= type xcb:Atom:_NET_WM_DESKTOP)
       (let ((buffer (exwm--id->buffer id)))
-	(when (buffer-live-p buffer)
-	  (exwm-workspace-move-window (elt data 0) id))))
+        (when (buffer-live-p buffer)
+          (exwm-workspace-move-window (elt data 0) id))))
      ;; _NET_WM_STATE
      ((= type xcb:Atom:_NET_WM_STATE)
       (let ((action (elt data 0))
-	    (props (list (elt data 1) (elt data 2)))
-	    (buffer (exwm--id->buffer id))
-	    props-new)
-	;; only support _NET_WM_STATE_FULLSCREEN / _NET_WM_STATE_ADD for frames
-	(when (and (not buffer)
-		   (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN props)
-		   (= action xcb:ewmh:_NET_WM_STATE_ADD))
-	  (xcb:+request
-	      exwm--connection
-	      (make-instance 'xcb:ewmh:set-_NET_WM_STATE
-			     :window id
-			     :data (vector xcb:Atom:_NET_WM_STATE_FULLSCREEN)))
-	  (xcb:flush exwm--connection))
-	(when buffer                    ;ensure it's managed
-	  (with-current-buffer buffer
-	    ;; _NET_WM_STATE_FULLSCREEN
-	    (when (or (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN props)
-		      (memq xcb:Atom:_NET_WM_STATE_ABOVE props))
-	      (cond ((= action xcb:ewmh:_NET_WM_STATE_ADD)
-		     (unless (exwm-layout--fullscreen-p)
-		       (exwm-layout-set-fullscreen id))
-		     (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new))
-		    ((= action xcb:ewmh:_NET_WM_STATE_REMOVE)
-		     (when (exwm-layout--fullscreen-p)
-		       (exwm-layout-unset-fullscreen id)))
-		    ((= action xcb:ewmh:_NET_WM_STATE_TOGGLE)
-		     (if (exwm-layout--fullscreen-p)
-			 (exwm-layout-unset-fullscreen id)
-		       (exwm-layout-set-fullscreen id)
-		       (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new)))))
-	    ;; _NET_WM_STATE_DEMANDS_ATTENTION
-	    ;; FIXME: check (may require other properties set)
-	    (when (memq xcb:Atom:_NET_WM_STATE_DEMANDS_ATTENTION props)
-	      (when (= action xcb:ewmh:_NET_WM_STATE_ADD)
-		(unless (eq exwm--frame exwm-workspace--current)
-		  (set-frame-parameter exwm--frame 'exwm-urgency t)
-		  (setq exwm-workspace--switch-history-outdated t)))
-	      ;; xcb:ewmh:_NET_WM_STATE_REMOVE?
-	      ;; xcb:ewmh:_NET_WM_STATE_TOGGLE?
-	      )
-	    (xcb:+request exwm--connection
-		(make-instance 'xcb:ewmh:set-_NET_WM_STATE
-			       :window id :data (vconcat props-new)))
-	    (xcb:flush exwm--connection)))))
+            (props (list (elt data 1) (elt data 2)))
+            (buffer (exwm--id->buffer id))
+            props-new)
+        ;; only support _NET_WM_STATE_FULLSCREEN / _NET_WM_STATE_ADD for frames
+        (when (and (not buffer)
+                   (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN props)
+                   (= action xcb:ewmh:_NET_WM_STATE_ADD))
+          (xcb:+request
+              exwm--connection
+              (make-instance 'xcb:ewmh:set-_NET_WM_STATE
+                             :window id
+                             :data (vector xcb:Atom:_NET_WM_STATE_FULLSCREEN)))
+          (xcb:flush exwm--connection))
+        (when buffer                    ;ensure it's managed
+          (with-current-buffer buffer
+            ;; _NET_WM_STATE_FULLSCREEN
+            (when (or (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN props)
+                      (memq xcb:Atom:_NET_WM_STATE_ABOVE props))
+              (cond ((= action xcb:ewmh:_NET_WM_STATE_ADD)
+                     (unless (exwm-layout--fullscreen-p)
+                       (exwm-layout-set-fullscreen id))
+                     (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new))
+                    ((= action xcb:ewmh:_NET_WM_STATE_REMOVE)
+                     (when (exwm-layout--fullscreen-p)
+                       (exwm-layout-unset-fullscreen id)))
+                    ((= action xcb:ewmh:_NET_WM_STATE_TOGGLE)
+                     (if (exwm-layout--fullscreen-p)
+                         (exwm-layout-unset-fullscreen id)
+                       (exwm-layout-set-fullscreen id)
+                       (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new)))))
+            ;; _NET_WM_STATE_DEMANDS_ATTENTION
+            ;; FIXME: check (may require other properties set)
+            (when (memq xcb:Atom:_NET_WM_STATE_DEMANDS_ATTENTION props)
+              (when (= action xcb:ewmh:_NET_WM_STATE_ADD)
+                (unless (eq exwm--frame exwm-workspace--current)
+                  (set-frame-parameter exwm--frame 'exwm-urgency t)
+                  (setq exwm-workspace--switch-history-outdated t)))
+              ;; xcb:ewmh:_NET_WM_STATE_REMOVE?
+              ;; xcb:ewmh:_NET_WM_STATE_TOGGLE?
+              )
+            (xcb:+request exwm--connection
+                (make-instance 'xcb:ewmh:set-_NET_WM_STATE
+                               :window id :data (vconcat props-new)))
+            (xcb:flush exwm--connection)))))
      ((= type xcb:Atom:WM_PROTOCOLS)
       (let ((type (elt data 0)))
-	(cond ((= type xcb:Atom:_NET_WM_PING)
-	       (setq exwm-manage--ping-lock nil))
-	      (t (exwm--log "Unhandled WM_PROTOCOLS of type: %d" type)))))
+        (cond ((= type xcb:Atom:_NET_WM_PING)
+               (setq exwm-manage--ping-lock nil))
+              (t (exwm--log "Unhandled WM_PROTOCOLS of type: %d" type)))))
      ((= type xcb:Atom:WM_CHANGE_STATE)
       (let ((buffer (exwm--id->buffer id)))
-	(when (and (buffer-live-p buffer)
-		   (= (elt data 0) xcb:icccm:WM_STATE:IconicState))
-	  (with-current-buffer buffer
-	    (if exwm--floating-frame
-		(call-interactively #'exwm-floating-hide)
-	      (bury-buffer))))))
+        (when (and (buffer-live-p buffer)
+                   (= (elt data 0) xcb:icccm:WM_STATE:IconicState))
+          (with-current-buffer buffer
+            (if exwm--floating-frame
+                (call-interactively #'exwm-floating-hide)
+              (bury-buffer))))))
      (t
       (exwm--log "Unhandled: %s(%d)"
-		 (x-get-atom-name type exwm-workspace--current) type)))))
+                 (x-get-atom-name type exwm-workspace--current) type)))))
 
 (with-eval-after-load 'exwm
   (advice-add 'exwm--on-ClientMessage :override #'exwm--on-ClientMessage-old))
@@ -1179,7 +1179,7 @@
 

Start Nyxt in char-mode.

(setq exwm-manage-configurations
    '(((member exwm-class-name '("Nyxt"))
-	   char-mode t)))
+           char-mode t)))
 

EXWM config

And the EXWM config itself.

(defun my/exwm-init ()
@@ -1197,9 +1197,9 @@
 
 (defun my/exwm-set-alpha (alpha)
   (setf (alist-get 'alpha default-frame-alist)
-	`(,alpha . ,alpha))
+        `(,alpha . ,alpha))
   (cl-loop for frame being the frames
-	   do (set-frame-parameter frame 'alpha `(,alpha . ,alpha))))
+           do (set-frame-parameter frame 'alpha `(,alpha . ,alpha))))
 
 (use-package exwm
   :straight t
@@ -1666,12 +1666,12 @@
     output HDMI-A-0
     tray_output none
     colors {
-	background $bg-color
-	separator #757575
-	#                  border             background         text
-	focused_workspace  $bg-color          $bg-color          $text-color
-	inactive_workspace $inactive-bg-color $inactive-bg-color $inactive-text-color
-	urgent_workspace   $urgent-bg-color   $urgent-bg-color   $urgent-text-color
+        background $bg-color
+        separator #757575
+        #                  border             background         text
+        focused_workspace  $bg-color          $bg-color          $text-color
+        inactive_workspace $inactive-bg-color $inactive-bg-color $inactive-text-color
+        urgent_workspace   $urgent-bg-color   $urgent-bg-color   $urgent-text-color
     }
 }
 
@@ -1681,12 +1681,12 @@
     font pango:monospace 10
     output DVI-D-0
     colors {
-	background $bg-color
-	separator #757575
-	#                  border             background         text
-	focused_workspace  $bg-color          $bg-color          $text-color
-	inactive_workspace $inactive-bg-color $inactive-bg-color $inactive-text-color
-	urgent_workspace   $urgent-bg-color   $urgent-bg-color   $urgent-text-color
+        background $bg-color
+        separator #757575
+        #                  border             background         text
+        focused_workspace  $bg-color          $bg-color          $text-color
+        inactive_workspace $inactive-bg-color $inactive-bg-color $inactive-text-color
+        urgent_workspace   $urgent-bg-color   $urgent-bg-color   $urgent-text-color
     }
 }
 

Keyboard Layout

@@ -1771,28 +1771,28 @@
(cl-reduce (lambda (acc name) (let* ((color (my/color-value name))) - (unless (member name '("black")) - (setq color (ct-iterate - color - (lambda (c) (ct-edit-hsl-l-inc c 2)) - (lambda (c) - (ct-light-p c 65))))) - (push (cons name color) acc) - (push (cons (format "light-%s" name) - (ct-edit-lab-l-inc - color - my/alpha-for-light)) - acc) - (push (cons (format "dark-%s" name) - (ct-edit-lab-l-dec - color - my/alpha-for-light)) - acc) ) + (unless (member name '("black")) + (setq color (ct-iterate + color + (lambda (c) (ct-edit-hsl-l-inc c 2)) + (lambda (c) + (ct-light-p c 65))))) + (push (cons name color) acc) + (push (cons (format "light-%s" name) + (ct-edit-lab-l-inc + color + my/alpha-for-light)) + acc) + (push (cons (format "dark-%s" name) + (ct-edit-lab-l-dec + color + my/alpha-for-light)) + acc) ) acc) '("black" "red" "green" "yellow" "blue" "magenta" "cyan" "white") :initial-value nil)) `(("background" . ,(or (my/color-value 'bg-active) - (my/color-value 'bg))) + (my/color-value 'bg))) ("foreground" . "#000000"))) "\n")
[colors]
@@ -2021,33 +2021,33 @@
 
 

(let* ((monitors
-	(thread-last
-	  exclude-table
-	  (seq-map (lambda (el) (nth 0 el)))
-	  (seq-uniq)))
+        (thread-last
+          exclude-table
+          (seq-map (lambda (el) (nth 0 el)))
+          (seq-uniq)))
        (exclude-combinations
-	(seq-map
-	 (lambda (monitor)
-	   (seq-map
-	    (lambda (el) (nth 1 el))
-	    (seq-filter
-	     (lambda (el) (and (string-equal (nth 0 el) monitor)
-			       (nth 1 el)))
-	     exclude-table)))
-	 `(,@monitors "")))
+        (seq-map
+         (lambda (monitor)
+           (seq-map
+            (lambda (el) (nth 1 el))
+            (seq-filter
+             (lambda (el) (and (string-equal (nth 0 el) monitor)
+                               (nth 1 el)))
+             exclude-table)))
+         `(,@monitors "")))
        (module-glyph-combinations
-	(thread-last
-	  exclude-combinations
-	  (seq-map
-	   (lambda (exclude)
-	     (thread-last
-	       table
-	       (seq-filter
-		(lambda (elt)
-		  (not (or
-			(member (nth 1 elt) exclude)
-			(not (string-equal (nth 3 elt) "+")))))))))
-	  (seq-uniq)))
+        (thread-last
+          exclude-combinations
+          (seq-map
+           (lambda (exclude)
+             (thread-last
+               table
+               (seq-filter
+                (lambda (elt)
+                  (not (or
+                        (member (nth 1 elt) exclude)
+                        (not (string-equal (nth 3 elt) "+")))))))))
+          (seq-uniq)))
        (color-changes nil))
   (dolist (e extra)
     (add-to-list
@@ -2058,8 +2058,8 @@
       (add-to-list
        'color-changes
        (concat (nth 2 (nth i comb))
-	       "--"
-	       (nth 2 (nth (1+ i) comb))))))
+               "--"
+               (nth 2 (nth (1+ i) comb))))))
   (mapconcat
    (lambda (el)
      (let ((colors (split-string el "--")))
@@ -2070,10 +2070,10 @@
 content-foreground = ${colors.%s}
 content = ${glyph.gright}
 content-font = 5"
-	       (nth 0 colors)
-	       (nth 1 colors)
-	       (nth 0 colors)
-	       (nth 1 colors))))
+               (nth 0 colors)
+               (nth 1 colors)
+               (nth 0 colors)
+               (nth 1 colors))))
    color-changes
    "\n"))
 

Here’s a rough outline of how the code works:

@@ -2104,14 +2104,14 @@

(let* ((exclude-modules
-	(thread-last
-	  exclude-table
-	  (seq-filter (lambda (el) (string-equal (nth 0 el) monitor)))
-	  (seq-map (lambda (el) (nth 1 el)))))
+        (thread-last
+          exclude-table
+          (seq-filter (lambda (el) (string-equal (nth 0 el) monitor)))
+          (seq-map (lambda (el) (nth 1 el)))))
        (modules
-	(thread-last
-	  table
-	  (seq-filter (lambda (el) (not (member (nth 1 el) exclude-modules))))))
+        (thread-last
+          table
+          (seq-filter (lambda (el) (not (member (nth 1 el) exclude-modules))))))
        (prev-color first-color)
        (ret nil))
   (concat
@@ -2120,11 +2120,11 @@
       (apply
        #'concat
        (list
-	(when (string-equal (nth 3 el) "+")
-	  (setq ret (format "glyph-%s--%s " prev-color (nth 2 el)))
-	  (setq prev-color (nth 2 el))
-	  ret)
-	(nth 1 el))))
+        (when (string-equal (nth 3 el) "+")
+          (setq ret (format "glyph-%s--%s " prev-color (nth 2 el)))
+          (setq prev-color (nth 2 el))
+          ret)
+        (nth 1 el))))
     modules
     " ")
    (unless (string-empty-p last-color) (format " glyph-%s--%s " prev-color last-color))))
@@ -2212,9 +2212,9 @@
     TRAY_MONITOR="eDP-1"
 elif [ "$hostname" = "eminence" ]; then
     if xrandr --query | grep " connected" | cut -d" " -f1 | grep -q "HDMI-A-0"; then
-	TRAY_MONITOR="HDMI-A-0"
+        TRAY_MONITOR="HDMI-A-0"
     else
-	TRAY_MONITOR="eDP"
+        TRAY_MONITOR="eDP"
     fi
 elif [ "$hostname" = "iris" ]; then
     TRAY_MONITOR="HDMI-1"
@@ -2275,15 +2275,15 @@
 for m in $(xrandr --query | grep " connected" | cut -d" " -f1); do
     export MONITOR=$m
     if [ "$MONITOR" = "$TRAY_MONITOR" ]; then
-	export TRAY="right"
+        export TRAY="right"
     else
-	export TRAY="none"
+        export TRAY="none"
     fi
     SIZE=${FONT_SIZES[$MONITOR]}
     SCALE=${EMOJI_SCALE[$MONITOR]}
     TEMP=${TEMP_HWMON_PATHS[$(hostname)]}
     if [[ -z "$SCALE" ]]; then
-	continue
+        continue
     fi
     # export FONT0="pango:monospace:size=$SIZE;1"
     # export FONT1="NotoEmoji:scale=$SCALE:antialias=false;1"
@@ -2478,8 +2478,8 @@
 
 function check_proc_net_dev {
     if [ ! -f "/proc/net/dev" ]; then
-	echo "/proc/net/dev not found"
-	exit 1
+        echo "/proc/net/dev not found"
+        exit 1
     fi
 }
 
@@ -2491,12 +2491,12 @@
 
 while getopts i:t:u:p:lh opt; do
     case "$opt" in
-	i) iface="$OPTARG" ;;
-	t) dt="$OPTARG" ;;
-	u) unit="$OPTARG" ;;
-	p) printf_command="$OPTARG" ;;
-	l) list_interfaces && exit 0 ;;
-	h) printf \
+        i) iface="$OPTARG" ;;
+        t) dt="$OPTARG" ;;
+        u) unit="$OPTARG" ;;
+        p) printf_command="$OPTARG" ;;
+        l) list_interfaces && exit 0 ;;
+        h) printf \
 "Usage: bandwidth3 [-i interface] [-t time] [-u unit] [-p printf_command] [-l] [-h]
 Options:
 -i\tNetwork interface to measure. Default determined using \`ip route\`.
@@ -2557,8 +2557,8 @@
     old_received=received;
     old_sent=sent;
     if(rx >= 0 && wx >= 0){
-	'"$printf_command"';
-	fflush(stdout);
+        '"$printf_command"';
+        fflush(stdout);
     }
 }
 '
@@ -2817,16 +2817,16 @@
     CMDLINE=$(ps -p "$PID" -o args=)
 
     if [[ "$CMDLINE" == *"$EXCLUDE_PATTERN"* ]]; then
-	continue
+        continue
     fi
 
     kill -SIGUSR2 "$PID" 2>/dev/null
 
     if [ $? -eq 0 ]; then
-	echo "Sent SIGUSR2 to Emacs (PID: $PID)"
-	SIGNAL_SENT=true
+        echo "Sent SIGUSR2 to Emacs (PID: $PID)"
+        SIGNAL_SENT=true
     else
-	echo "Failed to send SIGUSR2 to Emacs (PID: $PID)"
+        echo "Failed to send SIGUSR2 to Emacs (PID: $PID)"
     fi
 done
 
@@ -3514,34 +3514,34 @@
   (with-output-to-string
     (with-current-buffer standard-output
       (call-process "node" nil t nil
-		    (expand-file-name "~/bin/firefox-theme/main.js")
-		    string))))
+                    (expand-file-name "~/bin/firefox-theme/main.js")
+                    string))))
 
 (defun my/color-value-rgb (color)
   (let ((color (if (stringp color)
-		   color
-		 (my/color-value color))))
+                   color
+                 (my/color-value color))))
     `((r . ,(* 2.55 (ct-get-rgb-r color)))
       (g . ,(* 2.55 (ct-get-rgb-g color)))
       (b . ,(* 2.55 (ct-get-rgb-b color))))))
 
 (defun my/firefox-get-json ()
   (let ((toolbar-color
-	 (my/color-value-rgb
-	  'modeline))
-	(text-color
-	 (my/color-value-rgb
-	  (if (my/light-p) 'fg 'yellow))))
+         (my/color-value-rgb
+          'modeline))
+        (text-color
+         (my/color-value-rgb
+          (if (my/light-p) 'fg 'yellow))))
     `((colors . ((toolbar . ,toolbar-color)
-		 (toolbar_text . ,text-color)
-		 (frame . ,(my/color-value-rgb 'bg))
-		 (tab_background_text . ,(my/color-value-rgb 'fg))
-		 (toolbar_field . ,(my/color-value-rgb 'bg))
-		 (toolbar_field_text . ,(my/color-value-rgb 'blue))
-		 (tab_line . ,text-color)
-		 (popup . ,(my/color-value-rgb 'bg-alt))
-		 (popup_text . ,(my/color-value-rgb 'fg))
-		 (tab_loading . ,text-color))))))
+                 (toolbar_text . ,text-color)
+                 (frame . ,(my/color-value-rgb 'bg))
+                 (tab_background_text . ,(my/color-value-rgb 'fg))
+                 (toolbar_field . ,(my/color-value-rgb 'bg))
+                 (toolbar_field_text . ,(my/color-value-rgb 'blue))
+                 (tab_line . ,text-color)
+                 (popup . ,(my/color-value-rgb 'bg-alt))
+                 (popup_text . ,(my/color-value-rgb 'fg))
+                 (tab_loading . ,text-color))))))
 
 (defun my/firefox-get-color-url ()
   (concat
@@ -3826,8 +3826,8 @@
 c.url.start_pages = ['https://licht.sqrtminusone.xyz']
 
 c.zoom.levels = ['25%', '33%', '50%', '67%', '75%', '90%', '100%', '110%',
-		 '125%', '133%', '150%', '175%', '200%', '250%', '300%',
-		 '400%', '500%']
+                 '125%', '133%', '150%', '175%', '200%', '250%', '300%',
+                 '400%', '500%']
 

Theme

Taken from the dracula theme from qutebrowser.

palette = {
@@ -4575,8 +4575,8 @@
     #:provides '(deterred-mpd)
     #:respawn? #t
     #:start (make-forkexec-constructor
-	     '("python" "/home/pavel/10-19 Code/13 Other Projects/13.02 sqrt-data/13.02.R Repos/13.02.R.05 deterred/watchers/deterred-mpd.py"
-	       "--db" "/home/pavel/.deterred/database.db"))
+             '("python" "/home/pavel/10-19 Code/13 Other Projects/13.02 sqrt-data/13.02.R Repos/13.02.R.05 deterred/watchers/deterred-mpd.py"
+               "--db" "/home/pavel/.deterred/database.db"))
     #:stop (make-kill-destructor)
     #:requires '(mpd)))
 

GNU Mcron

@@ -4747,23 +4747,23 @@
(action 'shepherd 'daemonize)
 

Run services

(for-each start '(mpd
-		  sqrt-data-agent-mpd
-		  deterred-mpd
-		  mcron
-		  aw-server
-		  aw-watcher-afk
-		  aw-watcher-window
-		  pulseeffects
-		  xsettingsd
-		  ;; discord-rich-presence
-		  ;; polkit-gnome
-		  davmail
-		  ;; ; xmodmap
-		  ;; nm-applet
-		  vnstatd
-		  ;; opensnitchd
-		  ;; opensnitch-ui
-		  ))
+                  sqrt-data-agent-mpd
+                  deterred-mpd
+                  mcron
+                  aw-server
+                  aw-watcher-afk
+                  aw-watcher-window
+                  pulseeffects
+                  xsettingsd
+                  ;; discord-rich-presence
+                  ;; polkit-gnome
+                  davmail
+                  ;; ; xmodmap
+                  ;; nm-applet
+                  vnstatd
+                  ;; opensnitchd
+                  ;; opensnitch-ui
+                  ))
 

Guix settings

Other desktop programs I use are listed below.

diff --git a/configs/emacs/index.html b/configs/emacs/index.html index 17981c9..0c028fd 100644 --- a/configs/emacs/index.html +++ b/configs/emacs/index.html @@ -76,8 +76,7 @@
-

One day we won’t hate one another, no young boy will march to war and I will clean up my Emacs config. But that day isn’t today.

-
+

One day we won’t hate one another, no young boy will march to war and I will clean up my Emacs config. But that day isn’t today.

@@ -244,9 +243,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp (bootstrap-version 5)) (unless (file-exists-p bootstrap-file) (with-current-buffer - (url-retrieve-synchronously - "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el" - 'silent 'inhibit-cookies) + (url-retrieve-synchronously + "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el" + 'silent 'inhibit-cookies) (goto-char (point-max)) (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage)) @@ -265,8 +264,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp

The following is true is Emacs is run on a remote server where I don’t need stuff like my org workflow

(setq my/remote-server
       (or (string= (getenv "IS_REMOTE") "true")
-	  (string= (system-name) "dev-digital")
-	  (string= (system-name) "viridian")))
+          (string= (system-name) "dev-digital")
+          (string= (system-name) "viridian")))
 

And the following is true if Emacs is run from termux on Android.

(setq my/is-termux (string-match-p (rx (* nonl) "com.termux" (* nonl)) (getenv "HOME")))
 

Custom system name logic because on termux it’s always “localhost”.

@@ -286,13 +285,13 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(setq my/emacs-started nil)
 
 (add-hook 'emacs-startup-hook
-	  (lambda ()
-	    (message "*** Emacs loaded in %s with %d garbage collections."
-		     (format "%.2f seconds"
-			     (float-time
-			      (time-subtract after-init-time before-init-time)))
-		     gcs-done)
-	    (setq my/emacs-started t)))
+          (lambda ()
+            (message "*** Emacs loaded in %s with %d garbage collections."
+                     (format "%.2f seconds"
+                             (float-time
+                              (time-subtract after-init-time before-init-time)))
+                     gcs-done)
+            (setq my/emacs-started t)))
 

Set the following to t to print debug information during the startup. This will include package loading order and time.

(setq use-package-verbose nil)
 
(setq use-package-compute-statistics t)
@@ -304,30 +303,30 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 

Run GC when Emacs loses focus. Time will tell if that’s a good idea.

I still don’t know if there is any quantifiable advantage to this, but it doesn’t hurt.

(add-hook 'emacs-startup-hook
-	  (lambda ()
-	    (if (boundp 'after-focus-change-function)
-		(add-function :after after-focus-change-function
-			      (lambda ()
-				(unless (frame-focus-state)
-				  (garbage-collect))))
-	      (add-hook 'after-focus-change-function 'garbage-collect))))
+          (lambda ()
+            (if (boundp 'after-focus-change-function)
+                (add-function :after after-focus-change-function
+                              (lambda ()
+                                (unless (frame-focus-state)
+                                  (garbage-collect))))
+              (add-hook 'after-focus-change-function 'garbage-collect))))
 

Measure RAM usage

I’ve noticed that Emacs occasionally eats a lot of RAM, especially when used with EXWM. This is my attempt to measure RAM usage.

I have some concerns that ps -o rss may be unrepresentative because of shared memory, but I guess this shouldn’t be a problem here because there’s only one process of Emacs.

(defun my/get-ram-usage-async (callback)
   (let* ((temp-buffer (generate-new-buffer "*ps*"))
-	 (proc (start-process "ps" temp-buffer "ps"
-			      "-p" (number-to-string (emacs-pid)) "-o" "rss")))
+         (proc (start-process "ps" temp-buffer "ps"
+                              "-p" (number-to-string (emacs-pid)) "-o" "rss")))
     (set-process-sentinel
      proc
      (lambda (process _msg)
        (when (eq (process-status process) 'exit)
-	 (let* ((output (with-current-buffer temp-buffer
-			  (buffer-string)))
-		(usage (string-to-number (nth 1 (split-string output "\n")))))
-	   (ignore-errors
-	     (funcall callback usage)))
-	 (kill-buffer temp-buffer))))))
+         (let* ((output (with-current-buffer temp-buffer
+                          (buffer-string)))
+                (usage (string-to-number (nth 1 (split-string output "\n")))))
+           (ignore-errors
+             (funcall callback usage)))
+         (kill-buffer temp-buffer))))))
 
 (defun my/ram-usage ()
   (interactive)
@@ -405,7 +404,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (which-key-mode)
   (which-key-setup-side-window-bottom)
   (set-face-attribute 'which-key-local-map-description-face nil
-		      :weight 'bold)
+                      :weight 'bold)
   :straight t)
 
dump keybindings

A function to dump keybindings starting with a prefix to a buffer in a tree-like form.

@@ -413,11 +412,11 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(dolist (key (which-key--get-bindings (kbd prefix))) (with-current-buffer buffer (when level - (insert (make-string level ? ))) + (insert (make-string level ? ))) (insert (apply #'format "%s%s%s\n" key))) (when (string-match-p - (rx bos "+" (* nonl)) - (substring-no-properties (elt key 2))) + (rx bos "+" (* nonl)) + (substring-no-properties (elt key 2))) (my/dump-bindings-recursive (concat prefix " " (substring-no-properties (car key))) (+ 2 (or level 0)) @@ -482,8 +481,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp :after evil :config :hook ((prog-mode . turn-on-evil-quickscope-mode) - (LaTeX-mode . turn-on-evil-quickscope-mode) - (org-mode . turn-on-evil-quickscope-mode))) + (LaTeX-mode . turn-on-evil-quickscope-mode) + (org-mode . turn-on-evil-quickscope-mode)))

evil-numbers allows incrementing and decrementing numbers at point.

(use-package evil-numbers
   :straight t
@@ -509,7 +508,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 

Do ex search in other buffer. Like *, but switch to other buffer and search there.

(defun my/evil-ex-search-word-forward-other-window (count &optional symbol)
   (interactive (list (prefix-numeric-value current-prefix-arg)
-		     evil-symbol-word-search))
+                     evil-symbol-word-search))
   (save-excursion
     (evil-ex-start-word-search nil 'forward count symbol))
   (other-window 1)
@@ -526,10 +525,10 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :config
   (evil-collection-init
    '(eww devdocs proced emms pass calendar dired debug guix calc
-	 docker ibuffer geiser pdf info elfeed edebug bookmark company
-	 vterm flycheck profiler cider explain-pause-mode notmuch custom
-	 xref eshell helpful compile comint git-timemachine magit prodigy
-	 slime forge deadgrep vc-annonate telega doc-view gnus outline)))
+         docker ibuffer geiser pdf info elfeed edebug bookmark company
+         vterm flycheck profiler cider explain-pause-mode notmuch custom
+         xref eshell helpful compile comint git-timemachine magit prodigy
+         slime forge deadgrep vc-annonate telega doc-view gnus outline)))
 

My keybindings

Various keybinding settings that I can’t put anywhere else.

Escape key
@@ -556,10 +555,10 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(general-define-key :keymaps '(minibuffer-local-map - minibuffer-local-ns-map - minibuffer-local-completion-map - minibuffer-local-must-match-map - minibuffer-local-isearch-map) + minibuffer-local-ns-map + minibuffer-local-completion-map + minibuffer-local-must-match-map + minibuffer-local-isearch-map) [escape] 'minibuffer-keyboard-quit)
Home & end
(general-def :states '(normal insert visual)
@@ -643,9 +642,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :infix "b"
   "" '(:which-key "buffers")
   "s" '(my/lisp-interaction-buffer
-	:which-key "*lisp-interaction*")
+        :which-key "*lisp-interaction*")
   "m" '((lambda () (interactive) (persp-switch-to-buffer "*Messages*"))
-	:which-key "*Messages*")
+        :which-key "*Messages*")
   "l" 'next-buffer
   "h" 'previous-buffer
   "k" 'kill-buffer
@@ -678,15 +677,15 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   "Increase font size by 10 points"
   (interactive)
   (set-face-attribute 'default nil
-		      :height
-		      (+ (face-attribute 'default :height) 10)))
+                      :height
+                      (+ (face-attribute 'default :height) 10)))
 
 (defun my/zoom-out ()
   "Decrease font size by 10 points"
   (interactive)
   (set-face-attribute 'default nil
-		      :height
-		      (- (face-attribute 'default :height) 10)))
+                      :height
+                      (- (face-attribute 'default :height) 10)))
 
 ;; change font size, interactively
 (global-set-key (kbd "C-+") 'my/zoom-in)
@@ -728,7 +727,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/emacs-i3-windmove (dir)
   (let ((other-window (windmove-find-other-window dir)))
     (if (or (null other-window) (window-minibuffer-p other-window))
-	(i3-msg "focus" (symbol-name dir))
+        (i3-msg "focus" (symbol-name dir))
       (windmove-do-window-select dir))))
 

For the move I want the following behavior:

    @@ -741,20 +740,20 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp

    So here is a simple predicate which checks whether there is space in the given direction.

    (defun my/emacs-i3-direction-exists-p (dir)
       (cl-some (lambda (dir)
    -	  (let ((win (windmove-find-other-window dir)))
    -	    (and win (not (window-minibuffer-p win)))))
    -	(pcase dir
    -	  ('width '(left right))
    -	  ('height '(up down)))))
    +          (let ((win (windmove-find-other-window dir)))
    +            (and win (not (window-minibuffer-p win)))))
    +        (pcase dir
    +          ('width '(left right))
    +          ('height '(up down)))))
     

    And the implementation of the move command.

    (defun my/emacs-i3-move-window (dir)
       (let ((other-window (windmove-find-other-window dir))
    -	(other-direction (my/emacs-i3-direction-exists-p
    -			  (pcase dir
    -			    ('up 'width)
    -			    ('down 'width)
    -			    ('left 'height)
    -			    ('right 'height)))))
    +        (other-direction (my/emacs-i3-direction-exists-p
    +                          (pcase dir
    +                            ('up 'width)
    +                            ('down 'width)
    +                            ('left 'height)
    +                            ('right 'height)))))
         (cond
          ((and other-window (not (window-minibuffer-p other-window)))
           (window-swap-states (selected-window) other-window))
    @@ -765,23 +764,23 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     

    This function also checks whether there is space to resize in the given direction with the help of the predicate defined above. The command is forwarded back to i3 if there is not.

    (defun my/emacs-i3-resize-window (dir kind value)
       (if (or (one-window-p)
    -	  (not (my/emacs-i3-direction-exists-p dir)))
    +          (not (my/emacs-i3-direction-exists-p dir)))
           (i3-msg "resize" (symbol-name kind) (symbol-name dir)
    -	      (format "%s px or %s ppt" value value))
    +              (format "%s px or %s ppt" value value))
         (setq value (/ value 2))
         (pcase kind
           ('shrink
            (pcase dir
    -	 ('width
    -	  (evil-window-decrease-width value))
    -	 ('height
    -	  (evil-window-decrease-height value))))
    +         ('width
    +          (evil-window-decrease-width value))
    +         ('height
    +          (evil-window-decrease-height value))))
           ('grow
            (pcase dir
    -	 ('width
    -	  (evil-window-increase-width value))
    -	 ('height
    -	  (evil-window-increase-height value)))))))
    +         ('width
    +          (evil-window-increase-width value))
    +         ('height
    +          (evil-window-increase-height value)))))))
     

    transpose-frame is a package to “transpose” the current frame layout, which behaves someone similar to the layout toggle split command in i3, so I’ll use it as well.

    (use-package transpose-frame
       :straight t
    @@ -826,9 +825,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     (require 'cl-extra)
     
     (add-hook 'before-save-hook
    -	  (lambda ()
    -	    (unless (cl-some #'derived-mode-p my/trailing-whitespace-modes)
    -	      (delete-trailing-whitespace))))
    +          (lambda ()
    +            (unless (cl-some #'derived-mode-p my/trailing-whitespace-modes)
    +              (delete-trailing-whitespace))))
     
    Tabs

    Some default settings to manage tabs.

    (setq tab-always-indent nil)
    @@ -890,9 +889,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
       :straight t
       :config
       (setq yas-snippet-dirs
    -	`(,(concat (expand-file-name user-emacs-directory) "snippets")
    -	  ;; yasnippet-snippets-dir
    -	  ))
    +        `(,(concat (expand-file-name user-emacs-directory) "snippets")
    +          ;; yasnippet-snippets-dir
    +          ))
       (setq yas-triggers-in-field t)
       (yas-global-mode 1)
       (my-leader-def
    @@ -906,8 +905,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     (general-imap "M-TAB" 'company-yasnippet)
     

    Input Method

    -

    I have to switch layouts all the time, especially in LaTeX documents, because for some reason the Bolsheviks abandoned the idea of replacing Russian Cyrillic letters with Latin ones.

    -
    +

    I have to switch layouts all the time, especially in LaTeX documents, because for some reason the Bolsheviks abandoned the idea of replacing Russian Cyrillic letters with Latin ones.

    @@ -936,11 +934,11 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    (if (derived-mode-p 'exwm-mode) (my/run-in-background "xkb-switch -n") (if (or - (not (executable-find "xkb-switch")) - (equal (string-trim - (shell-command-to-string "xkb-switch -p")) - "us")) - (toggle-input-method) + (not (executable-find "xkb-switch")) + (equal (string-trim + (shell-command-to-string "xkb-switch -p")) + "us")) + (toggle-input-method) (my/run-in-background "xkb-switch -s us"))))

    M-x delete-horizontal-space doesn’t feel that useful to me.

    (general-define-key
    @@ -982,13 +980,13 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
       (require 'accent)
       (message "%s" arg)
       (let* ((after? (eq accent-position 'after))
    -	 (char (if after? (char-after) (char-before)))
    -	 (curr (intern (string char)))
    -	 (default-diac (cdr (assoc curr my/default-accents))))
    +         (char (if after? (char-after) (char-before)))
    +         (curr (intern (string char)))
    +         (default-diac (cdr (assoc curr my/default-accents))))
         (if (and default-diac (not arg))
    -	(progn
    -	  (delete-char (if after? 1 -1))
    -	  (insert (format "%c" default-diac)))
    +        (progn
    +          (delete-char (if after? 1 -1))
    +          (insert (format "%c" default-diac)))
           (call-interactively #'accent-company))))
     
     (use-package accent
    @@ -1009,7 +1007,27 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
        "M-j" #'popup-next
        "M-k" #'popup-previous)
       (setq accent-custom '((a (ā))
    -			(A (Ā)))))
    +                        (A (Ā)))))
    +

    Random editing tricks

    +
    Round number at point
    +
    (defun my/round-number-at-point (word signs)
    +  (interactive
    +   (list (or (when (region-active-p)
    +               (buffer-substring-no-properties
    +                (region-beginning)
    +                (region-end)))
    +             (thing-at-point 'number 'no-properties))
    +         (read-number "Decimal signs: " 2)))
    +  (when (stringp word)
    +    (setq word (string-to-number word)))
    +  (let ((number (/ (float (round (* (expt 10 signs) word)))
    +                   (expt 10 signs))))
    +    (save-excursion
    +      (replace-string-in-region
    +       (number-to-string word)
    +       (number-to-string number)
    +       (line-beginning-position)
    +       (line-end-position)))))
     

    Working with projects

    Packages related to managing projects.

    I used to have Treemacs here, but in the end decided that dired with dired-sidebar does a better job. Dired has its separate section in “Applications”.

    @@ -1046,13 +1064,13 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp :config (require 'forge) (setq magit-blame-styles - '((headings - (heading-format . "%-20a %C %s\n")) - (highlight - (highlight-face . magit-blame-highlight)) - (lines - (show-lines . t) - (show-message . t))))) + '((headings + (heading-format . "%-20a %C %s\n")) + (highlight + (highlight-face . magit-blame-highlight)) + (lines + (show-lines . t) + (show-message . t)))))

git-gutter is shows git changes for each line (added/changed/deleted lines).

(use-package git-gutter
   :straight t
@@ -1078,9 +1096,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(use-package difftastic
   :straight t
   :commands (difftastic-magit-diff
-	     difftastic-magit-show
-	     difftastic-files
-	     difftastic-buffers)
+             difftastic-magit-show
+             difftastic-files
+             difftastic-buffers)
   :init
   (with-eval-after-load 'magit-diff
     (transient-append-suffix 'magit-diff '(-1 -1)
@@ -1116,9 +1134,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :straight t
   :config
   (add-to-list 'forge-alist '("gitlab.etu.ru"
-			      "gitlab.etu.ru/api/v4"
-			      "gitlab.etu.ru"
-			      forge-gitlab-repository)))
+                              "gitlab.etu.ru/api/v4"
+                              "gitlab.etu.ru"
+                              forge-gitlab-repository)))
 

forge depends on a package called ghub. I don’t like that it uses auth-source to store the token so I’ll advise it to use password-store.

(defun my/password-store-get-field (entry field)
   (if-let (field (password-store-get-field entry field))
@@ -1127,12 +1145,12 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
 (defun my/ghub--token (host username package &optional nocreate forge)
   (cond ((and (or (equal host "gitlab.etu.ru/api/v4")
-		  (equal host "gitlab.etu.ru/api"))
-	      (equal username "pvkorytov"))
-	 (my/password-store-get-field
-	  "Job/Digital/Infrastructure/gitlab.etu.ru"
-	  (format "%s-token" package)))
-	(t (error "Don't know token: %s %s %s" host username package))))
+                  (equal host "gitlab.etu.ru/api"))
+              (equal username "pvkorytov"))
+         (my/password-store-get-field
+          "Job/Digital/Infrastructure/gitlab.etu.ru"
+          (format "%s-token" package)))
+        (t (error "Don't know token: %s %s %s" host username package))))
 
 (with-eval-after-load 'ghub
   (advice-add #'ghub--token :override #'my/ghub--token))
@@ -1180,7 +1198,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :straight t
   :config
   (add-to-list 'editorconfig-indentation-alist
-	       '(emmet-mode emmet-indentation))
+               '(emmet-mode emmet-indentation))
   (editorconfig-mode))
 

Editing files

A minor mode to remember recently edited files.

@@ -1264,7 +1282,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
:config (setq avy-timeout-seconds 0.5) (setq avy-ignored-modes - '(image-mode doc-view-mode pdf-view-mode exwm-mode)) + '(image-mode doc-view-mode pdf-view-mode exwm-mode)) (general-define-key :states '(normal motion) "-" #'avy-goto-char-timer)) @@ -1272,8 +1290,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(defun avy-action-embark (pt)
   (unwind-protect
       (save-excursion
-	(goto-char pt)
-	(embark-act))
+        (goto-char pt)
+        (embark-act))
     (select-window
      (cdr (ring-ref avy-ring 0))))
   t)
@@ -1300,11 +1318,11 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 

Add prompt indicator to completing-read-multiple:

(defun crm-indicator (args)
   (cons (format "[CRM%s] %s"
-		(replace-regexp-in-string
-		 "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" ""
-		 crm-separator)
-		(car args))
-	(cdr args)))
+                (replace-regexp-in-string
+                 "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" ""
+                 crm-separator)
+                (car args))
+        (cdr args)))
 (with-eval-after-load 'crm
   (advice-add #'completing-read-multiple :filter-args #'crm-indicator))
 

Persist history over Emacs restarts.

@@ -1329,7 +1347,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(defun my/sort-directories-first (files)
   (setq files (vertico-sort-alpha files))
   (nconc (seq-filter (lambda (x) (string-suffix-p "/" x)) files)
-	 (seq-remove (lambda (x) (string-suffix-p "/" x)) files)))
+         (seq-remove (lambda (x) (string-suffix-p "/" x)) files)))
 
 (use-package vertico-multiform
   :after vertico
@@ -1340,14 +1358,14 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    "M-b" #'vertico-multiform-buffer
    "M-g" #'vertico-multiform-grid)
   (setq vertico-multiform-categories
-	'((file (vertico-sort-function . my/sort-directories-first))
-	  (password-store-pass grid)))
+        '((file (vertico-sort-function . my/sort-directories-first))
+          (password-store-pass grid)))
   (setq vertico-multiform-commands
-	'((eshell-atuin-history (vertico-sort-function . nil))
-	  (my/index-nav (vertico-sort-function . nil))
-	  (org-ql-view (vertico-sort-function . nil))
-	  (my/consult-line (vertico-sort-function . nil))
-	  (telega-msg-add-reaction grid))))
+        '((eshell-atuin-history (vertico-sort-function . nil))
+          (my/index-nav (vertico-sort-function . nil))
+          (org-ql-view (vertico-sort-function . nil))
+          (my/consult-line (vertico-sort-function . nil))
+          (telega-msg-add-reaction grid))))
 

vertico-quick enables ivy-like bindings to choose candidates.

(use-package vertico-quick
   :after vertico
@@ -1365,9 +1383,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (setq completion-styles '(orderless basic))
   (setq completion-category-defaults nil)
   (setq completion-category-overrides
-	'((file (styles partial-completion))))
+        '((file (styles partial-completion))))
   (setq orderless-matching-styles
-	'(orderless-literal orderless-initialism orderless-regexp)))
+        '(orderless-literal orderless-initialism orderless-regexp)))
 

Disable orderless for company:

(defun company-completion-styles (capf-fn &rest args)
   (let ((completion-styles '(basic partial-completion)))
@@ -1381,8 +1399,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :straight t
   :config
   (setq consult-preview-excluded-files
-	`("\\`/[^/|:]+:"
-	  ,(rx "html" eos))))
+        `("\\`/[^/|:]+:"
+          ,(rx "html" eos))))
 

marginalia

marginalia provides annotations in the completion interface.

(use-package marginalia
@@ -1390,7 +1408,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :config
   (marginalia-mode)
   (push '(projectile-find-file . file)
-	marginalia-command-categories))
+        marginalia-command-categories))
 

embark

embark provides minibuffer actions.

(use-package embark
@@ -1413,32 +1431,32 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 targets."
   (lambda (&optional keymap targets prefix)
     (if (null keymap)
-	(which-key--hide-popup-ignore-command)
+        (which-key--hide-popup-ignore-command)
       (which-key--show-keymap
        (if (eq (plist-get (car targets) :type) 'embark-become)
-	   "Become"
-	 (format "Act on %s '%s'%s"
-		 (plist-get (car targets) :type)
-		 (embark--truncate-target (plist-get (car targets) :target))
-		 (if (cdr targets) "…" "")))
+           "Become"
+         (format "Act on %s '%s'%s"
+                 (plist-get (car targets) :type)
+                 (embark--truncate-target (plist-get (car targets) :target))
+                 (if (cdr targets) "…" "")))
        (if prefix
-	   (pcase (lookup-key keymap prefix 'accept-default)
-	     ((and (pred keymapp) km) km)
-	     (_ (key-binding prefix 'accept-default)))
-	 keymap)
+           (pcase (lookup-key keymap prefix 'accept-default)
+             ((and (pred keymapp) km) km)
+             (_ (key-binding prefix 'accept-default)))
+         keymap)
        nil nil t (lambda (binding)
-		   (not (string-suffix-p "-argument" (cdr binding))))))))
+                   (not (string-suffix-p "-argument" (cdr binding))))))))
 
 (defun embark-hide-which-key-indicator (fn &rest args)
   "Hide the which-key indicator immediately when using the completing-read prompter."
   (which-key--hide-popup-ignore-command)
   (let ((embark-indicators
-	 (remq #'embark-which-key-indicator embark-indicators)))
+         (remq #'embark-which-key-indicator embark-indicators)))
     (apply fn args)))
 
 (with-eval-after-load 'embark
   (advice-add #'embark-completing-read-prompter
-	      :around #'embark-hide-which-key-indicator)
+              :around #'embark-hide-which-key-indicator)
   (setq embark-indicators (delq #'embark-mixed-indicator embark-indicators))
   (push #'embark-which-key-indicator embark-indicators))
 

keybindings

@@ -1497,11 +1515,11 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(use-package helpful
   :straight t
   :commands (helpful-callable
-	     helpful-variable
-	     helpful-key
-	     helpful-macro
-	     helpful-function
-	     helpful-command))
+             helpful-variable
+             helpful-key
+             helpful-macro
+             helpful-function
+             helpful-command))
 

As I use C-h to switch buffers, I moved the help to SPC-h with the code below.

(my-leader-def
   "h" '(:keymap help-map :which-key "help"))
@@ -1543,14 +1561,14 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :config
   (setq wakatime-ignore-exit-codes '(0 1 102 112))
   (advice-add 'wakatime-init :after
-	      (lambda ()
-		(setq wakatime-cli-path (or
-					 (executable-find "wakatime-cli")
-					 (expand-file-name "~/bin/wakatime-cli")))))
+              (lambda ()
+                (setq wakatime-cli-path (or
+                                         (executable-find "wakatime-cli")
+                                         (expand-file-name "~/bin/wakatime-cli")))))
   (when (file-exists-p "~/.wakatime.cfg")
     (setq wakatime-api-key
-	  (string-trim
-	   (shell-command-to-string "awk '/api-key/{print $NF}' ~/.wakatime.cfg"))))
+          (string-trim
+           (shell-command-to-string "awk '/api-key/{print $NF}' ~/.wakatime.cfg"))))
   ;; (setq wakatime-cli-path (executable-find "wakatime"))
   (global-wakatime-mode))
 

ActivityWatch

@@ -1618,14 +1636,14 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp

Custom frame format

Title format, which used to look something like emacs:project@hostname. Now it’s just emacs.

(setq-default frame-title-format
-	      '(""
-		"emacs"
-		;; (:eval
-		;;  (let ((project-name (projectile-project-name)))
-		;;    (if (not (string= "-" project-name))
-		;;        (format ":%s@%s" project-name (system-name))
-		;;      (format "@%s" (system-name)))))
-		))
+              '(""
+                "emacs"
+                ;; (:eval
+                ;;  (let ((project-name (projectile-project-name)))
+                ;;    (if (not (string= "-" project-name))
+                ;;        (format ":%s@%s" project-name (system-name))
+                ;;      (format "@%s" (system-name)))))
+                ))
 

Olivetti

Olivetti is a package that limits the current text body width. It’s pretty nice to use when writing texts.

(use-package olivetti
@@ -1643,9 +1661,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     "Keycast mode"
     :global t
     (if keycast-mode
-	(progn
-	  (add-to-list 'global-mode-string '("" keycast-mode-line " "))
-	  (add-hook 'pre-command-hook 'keycast--update t) )
+        (progn
+          (add-to-list 'global-mode-string '("" keycast-mode-line " "))
+          (add-hook 'pre-command-hook 'keycast--update t) )
       (remove-hook 'pre-command-hook 'keycast--update)
       (setq global-mode-string (delete '("" keycast-mode-line " ") global-mode-string))))
   :commands (keycast--update))
@@ -1657,7 +1675,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   ;; Not deferring becuase I want `doom-themes-visual-bell-config'
   :config
   (setq doom-themes-enable-bold t
-	doom-themes-enable-italic t)
+        doom-themes-enable-italic t)
   ;; (if my/remote-server
   ;;     (load-theme 'doom-gruvbox t)
   ;;   (load-theme 'doom-palenight t))
@@ -1671,7 +1689,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :straight t
   :config
   (setq ef-duo-light-palette-overrides
-	'((constant green))))
+        '((constant green))))
 

Custom theme

Here I define a few things on the top of Emacs theme, because:

    @@ -1686,15 +1704,15 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp

    As of now I want this to support doom-themes and modus-themes. So, let’s get which one is enabled:

    (defun my/doom-p ()
       (seq-find (lambda (x) (string-match-p (rx bos "doom") (symbol-name x)))
    -	    custom-enabled-themes))
    +            custom-enabled-themes))
     
     (defun my/modus-p ()
       (seq-find (lambda (x) (string-match-p (rx bos "modus") (symbol-name x)))
    -	    custom-enabled-themes))
    +            custom-enabled-themes))
     
     (defun my/ef-p ()
       (seq-find (lambda (x) (string-match-p (rx bos "ef") (symbol-name x)))
    -	    custom-enabled-themes))
    +            custom-enabled-themes))
     

    I also want to know if the current theme is light or not:

    (defun my/light-p ()
       (ct-light-p (my/color-value 'bg)))
    @@ -1716,30 +1734,30 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     (defun my/doom-color (color)
       (when (doom-color 'bg)
         (let ((override (alist-get (my/doom-p) my/theme-override))
    -	  (color-name (symbol-name color))
    -	  (is-light (ct-light-p (doom-color 'bg))))
    +          (color-name (symbol-name color))
    +          (is-light (ct-light-p (doom-color 'bg))))
           (or
            (alist-get color override)
            (cond
    -	((eq 'black color)
    -	 (if is-light (doom-color 'fg) (doom-color 'bg)))
    -	((eq 'white color)
    -	 (if is-light (doom-color 'bg) (doom-color 'fg)))
    -	((eq 'border color)
    -	 (if is-light (doom-color 'base0) (doom-color 'base8)))
    -	((string-match-p (rx bos "light-") color-name)
    -	 (ct-edit-hsl-l-inc (my/doom-color (intern (substring color-name 6)))
    -			    my/alpha-for-light))
    -	((string-match-p (rx bos "dark-") color-name)
    -	 (or (doom-color color)
    -	     (ct-edit-hsl-l-dec (my/doom-color (intern (substring color-name 5)))
    -				my/alpha-for-light)))
    -	(t (doom-color color)))))))
    +        ((eq 'black color)
    +         (if is-light (doom-color 'fg) (doom-color 'bg)))
    +        ((eq 'white color)
    +         (if is-light (doom-color 'bg) (doom-color 'fg)))
    +        ((eq 'border color)
    +         (if is-light (doom-color 'base0) (doom-color 'base8)))
    +        ((string-match-p (rx bos "light-") color-name)
    +         (ct-edit-hsl-l-inc (my/doom-color (intern (substring color-name 6)))
    +                            my/alpha-for-light))
    +        ((string-match-p (rx bos "dark-") color-name)
    +         (or (doom-color color)
    +             (ct-edit-hsl-l-dec (my/doom-color (intern (substring color-name 5)))
    +                                my/alpha-for-light)))
    +        (t (doom-color color)))))))
     

    And the same for modus-themes. my/modus-color has to accept the same arguments as I use for my/doom-color for backward compatibility, which requires a bit more tuning.

    (defun my/modus-get-base (color)
       (let ((base-value (string-to-number (substring (symbol-name color) 4 5)))
    -	(base-start (cadr (assoc 'bg-main (modus-themes--current-theme-palette))))
    -	(base-end (cadr (assoc 'fg-dim (modus-themes--current-theme-palette)))))
    +        (base-start (cadr (assoc 'bg-main (modus-themes--current-theme-palette))))
    +        (base-end (cadr (assoc 'fg-dim (modus-themes--current-theme-palette)))))
         (nth base-value (ct-gradient 9 base-start base-end t))))
     
     (defun my/prot-color (color palette)
    @@ -1747,16 +1765,16 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
         (cond
          ((member color '(black white light-black light-white))
           (let ((bg-main (cadr (assoc 'bg-main palette)))
    -	    (fg-main (cadr (assoc 'fg-main palette))))
    -	(pcase color
    -	  ('black (if is-light fg-main bg-main))
    -	  ('white (if is-light bg-main fg-main))
    -	  ('light-black (ct-edit-hsl-l-inc
    -			 (if is-light fg-main bg-main)
    -			 15))
    -	  ('light-white (ct-edit-hsl-l-inc
    -			 (if is-light bg-main fg-main)
    -			 15)))))
    +            (fg-main (cadr (assoc 'fg-main palette))))
    +        (pcase color
    +          ('black (if is-light fg-main bg-main))
    +          ('white (if is-light bg-main fg-main))
    +          ('light-black (ct-edit-hsl-l-inc
    +                         (if is-light fg-main bg-main)
    +                         15))
    +          ('light-white (ct-edit-hsl-l-inc
    +                         (if is-light bg-main fg-main)
    +                         15)))))
          ((or (eq color 'bg))
           (cadr (assoc 'bg-main palette)))
          ((or (eq color 'fg))
    @@ -1769,7 +1787,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
           (my/modus-get-base color))
          ((string-match-p (rx bos "dark-") (symbol-name color))
           (cadr (assoc (intern (format "%s-cooler" (substring (symbol-name color) 5)))
    -		   palette)))
    +                   palette)))
          ((eq color 'grey)
           (my/modus-get-base 'base5))
          ((string-match-p (rx bos "light-") (symbol-name color))
    @@ -1786,10 +1804,10 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     

    Test the three functions.

    (defconst my/test-colors-list
       '(black red green yellow blue magenta cyan white light-black
    -	  dark-red dark-green dark-yellow dark-blue dark-magenta dark-cyan
    -	  light-red light-green light-yellow light-blue light-magenta
    -	  light-cyan light-white bg bg-alt fg fg-alt violet grey base0 base1
    -	  base2 base3 base4 base5 base6 base7 base8 border))
    +          dark-red dark-green dark-yellow dark-blue dark-magenta dark-cyan
    +          light-red light-green light-yellow light-blue light-magenta
    +          light-cyan light-white bg bg-alt fg fg-alt violet grey base0 base1
    +          base2 base3 base4 base5 base6 base7 base8 border))
     
     (defun my/test-colors ()
       (interactive)
    @@ -1797,12 +1815,12 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
         (with-current-buffer buf
           (insert (format "%-20s %-10s %-10s %-10s" "Color" "Doom" "Modus" "Ef") "\n")
           (cl-loop for color in my/test-colors-list
    -	       do (insert
    -		   (format "%-20s %-10s %-10s %-10s\n"
    -			   (prin1-to-string color)
    -			   (my/doom-color color)
    -			   (my/modus-color color)
    -			   (my/ef-color color))))
    +               do (insert
    +                   (format "%-20s %-10s %-10s %-10s\n"
    +                           (prin1-to-string color)
    +                           (my/doom-color color)
    +                           (my/modus-color color)
    +                           (my/ef-color color))))
           (special-mode)
           (rainbow-mode))
         (switch-to-buffer buf)))
    @@ -1812,16 +1830,16 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
        ((stringp color) (my/color-value (intern color)))
        ((eq color 'bg-other)
         (or (my/color-value 'bg-dim)
    -	(let ((color (my/color-value 'bg)))
    -	  (if (ct-light-p color)
    -	      (ct-edit-hsl-l-dec color 2)
    -	    (ct-edit-hsl-l-dec color 3)))))
    +        (let ((color (my/color-value 'bg)))
    +          (if (ct-light-p color)
    +              (ct-edit-hsl-l-dec color 2)
    +            (ct-edit-hsl-l-dec color 3)))))
        ((eq color 'modeline)
         (or
          (my/color-value 'bg-mode-line-active)
          (my/color-value 'bg-mode-line)
          (if (my/light-p)
    -	 (ct-edit-hsl-l-dec (my/color-value 'bg-alt) 10)
    +         (ct-edit-hsl-l-dec (my/color-value 'bg-alt) 10)
            (ct-edit-hsl-l-inc (my/color-value 'bg-alt) 15))))
        ((my/doom-p) (my/doom-color color))
        ((my/modus-p) (my/modus-color color))
    @@ -1836,20 +1854,20 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     (defmacro my/use-colors (&rest data)
       `(progn
          ,@(cl-loop for i in data collect
    -		`(setf (alist-get ',(car i) my/my-theme-update-color-params)
    -		       (list ,@(cl-loop for (key value) on (cdr i) by #'cddr
    -					append `(,key ',value)))))
    +                `(setf (alist-get ',(car i) my/my-theme-update-color-params)
    +                       (list ,@(cl-loop for (key value) on (cdr i) by #'cddr
    +                                        append `(,key ',value)))))
          (when (and (or (my/doom-p) (my/modus-p)) my/emacs-started)
            (my/update-my-theme))))
     

    This macro puts lambdas to my/my-theme-update-colors-hook that updates faces in my-theme-1. Now I have to call this hook:

    (defun my/update-my-theme (&rest _)
       (interactive)
       (cl-loop for (face . values) in my/my-theme-update-color-params
    -	   do (custom-theme-set-faces
    -	       'my-theme-1
    -	       `(,face ((t ,@(cl-loop for (key value) on values by #'cddr
    -				      collect key
    -				      collect (eval value)))))))
    +           do (custom-theme-set-faces
    +               'my-theme-1
    +               `(,face ((t ,@(cl-loop for (key value) on values by #'cddr
    +                                      collect key
    +                                      collect (eval value)))))))
       (enable-theme 'my-theme-1))
     
     (unless my/is-termux
    @@ -1858,22 +1876,22 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     

    Defining colors for tab-bar.el:

    (my/use-colors
      (tab-bar-tab :background (my/color-value 'bg)
    -	      :foreground (my/color-value 'yellow)
    -	      :underline (my/color-value 'yellow))
    +              :foreground (my/color-value 'yellow)
    +              :underline (my/color-value 'yellow))
      (tab-bar :background 'unspecified :foreground 'unspecified)
      (magit-section-secondary-heading :foreground (my/color-value 'blue)
    -				  :weight 'bold))
    +                                  :weight 'bold))
     
    Switch theme

    The built-in load-theme does not deactivate the previous theme, so here’s a function that does that:

    (defun my/switch-theme (theme)
       (interactive
        (list (intern (completing-read "Load custom theme: "
    -				  (mapcar #'symbol-name
    -					  (custom-available-themes))))))
    +                                  (mapcar #'symbol-name
    +                                          (custom-available-themes))))))
       (cl-loop for enabled-theme in custom-enabled-themes
    -	   if (not (or (eq enabled-theme 'my-theme-1)
    -		       (eq enabled-theme theme)))
    -	   do (disable-theme enabled-theme))
    +           if (not (or (eq enabled-theme 'my-theme-1)
    +                       (eq enabled-theme theme)))
    +           do (disable-theme enabled-theme))
       (load-theme theme t)
       (when current-prefix-arg
         (my/regenerate-desktop)))
    @@ -1948,8 +1966,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     
    (when (display-graphic-p)
       (if (x-list-fonts "JetBrainsMono Nerd Font")
           (let ((font "-JB  -JetBrainsMono Nerd Font-medium-normal-normal-*-17-*-*-*-m-0-iso10646-1"))
    -	(set-frame-font font nil t)
    -	(add-to-list 'default-frame-alist `(font . ,font)))
    +        (set-frame-font font nil t)
    +        (add-to-list 'default-frame-alist `(font . ,font)))
         (message "Install JetBrainsMono Nerd Font!")))
     

    To make the icons work (e.g. in the Doom Modeline), run M-x all-the-icons-install-fonts. The package definition is somewhere later in the config.

    Other fonts

    @@ -2006,17 +2024,17 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    (use-package nerd-icons
       :straight t)
     

    Text highlight

    -

    Highlight indent guides. I used highlight-indent-guides before but indent-bars seems to work better, and also doesn’t break with treesit-fold.

    +

    Highlight indent guides. I used highlight-indent-guides before but indent-bars seems to work better, and it doesn’t break with treesit-fold.

    (use-package indent-bars
       :straight (:host github :repo "jdtsmith/indent-bars")
       :if (not (or my/remote-server))
       :hook ((prog-mode . indent-bars-mode)
    -	 (LaTeX-mode . indent-bars-mode))
    +         (LaTeX-mode . indent-bars-mode))
       :config
       (require 'indent-bars-ts)
       (setopt indent-bars-no-descend-lists t
    -	  indent-bars-treesit-support t
    -	  indent-bars-width-frac 0.3))
    +          indent-bars-treesit-support t
    +          indent-bars-width-frac 0.3))
     

    Rainbow parentheses.

    (use-package rainbow-delimiters
       :straight t
    @@ -2059,58 +2077,58 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     
    (defun my/tab-bar-mode-line--format ()
       (unless (derived-mode-p 'company-box-mode)
         (cl-letf (((symbol-function 'window-pixel-width)
    -	       'frame-pixel-width)
    -	      ((symbol-function 'window-margins)
    -	       (lambda (&rest _)
    -		 (list nil))))
    +               'frame-pixel-width)
    +              ((symbol-function 'window-margins)
    +               (lambda (&rest _)
    +                 (list nil))))
           (let ((doom-modeline-window-width-limit nil)
    -	    (doom-modeline--limited-width-p nil))
    -	(format-mode-line
    -	 '("%e"
    -	   (:eval
    -	    (doom-modeline-format--main))))))))
    +            (doom-modeline--limited-width-p nil))
    +        (format-mode-line
    +         '("%e"
    +           (:eval
    +            (doom-modeline-format--main))))))))
     
     (defun my/hide-mode-line-if-only-window ()
       (let* ((windows (window-list))
    -	 (hide-mode-line-p (length= windows 1)))
    +         (hide-mode-line-p (length= windows 1)))
         (dolist (win windows)
           (with-current-buffer (window-buffer win)
    -	(unless (eq hide-mode-line-p hide-mode-line-mode)
    -	  (hide-mode-line-mode
    -	   (if hide-mode-line-p +1 -1)))))))
    +        (unless (eq hide-mode-line-p hide-mode-line-mode)
    +          (hide-mode-line-mode
    +           (if hide-mode-line-p +1 -1)))))))
     
     (define-minor-mode my/tab-bar-mode-line-mode
       "Use tab-bar as mode line mode."
       :global t
       (if my/tab-bar-mode-line-mode
           (progn
    -	(tab-bar-mode +1)
    -	(setq tab-bar-format '(my/tab-bar-mode-line--format))
    -	(set-face-attribute 'tab-bar nil :inherit 'mode-line)
    -	(add-hook 'window-configuration-change-hook #'my/hide-mode-line-if-only-window)
    +        (tab-bar-mode +1)
    +        (setq tab-bar-format '(my/tab-bar-mode-line--format))
    +        (set-face-attribute 'tab-bar nil :inherit 'mode-line)
    +        (add-hook 'window-configuration-change-hook #'my/hide-mode-line-if-only-window)
     
    -	(dolist (buf (buffer-list))
    -	  (with-current-buffer buf
    -	    (doom-modeline-set-modeline 'minimal)))
    -	(doom-modeline-set-modeline 'minimal 'default)
    +        (dolist (buf (buffer-list))
    +          (with-current-buffer buf
    +            (doom-modeline-set-modeline 'minimal)))
    +        (doom-modeline-set-modeline 'minimal 'default)
     
    -	(dolist (frame (frame-list))
    -	  (with-selected-frame frame
    -	    (my/hide-mode-line-if-only-window))
    -	  (when-let (cb-frame (company-box--get-frame frame))
    -	    (set-frame-parameter cb-frame 'tab-bar-lines 0)))
    -	(setenv "POLYBAR_BOTTOM" "false")
    -	(when (fboundp #'my/exwm-run-polybar)
    -	  (my/exwm-run-polybar)))
    +        (dolist (frame (frame-list))
    +          (with-selected-frame frame
    +            (my/hide-mode-line-if-only-window))
    +          (when-let (cb-frame (company-box--get-frame frame))
    +            (set-frame-parameter cb-frame 'tab-bar-lines 0)))
    +        (setenv "POLYBAR_BOTTOM" "false")
    +        (when (fboundp #'my/exwm-run-polybar)
    +          (my/exwm-run-polybar)))
         (tab-bar-mode -1)
         (setq tab-bar-format
    -	  '(tab-bar-format-history tab-bar-format-tabs tab-bar-separator tab-bar-format-add-tab))
    +          '(tab-bar-format-history tab-bar-format-tabs tab-bar-separator tab-bar-format-add-tab))
         (set-face-attribute 'tab-bar nil :inherit 'default)
         (remove-hook 'window-configuration-change-hook #'my/hide-mode-line-if-only-window)
         (global-hide-mode-line-mode -1)
         (dolist (buf (buffer-list))
           (with-current-buffer buf
    -	(doom-modeline-set-modeline 'main)))
    +        (doom-modeline-set-modeline 'main)))
         (doom-modeline-set-modeline 'main 'default)
         (setenv "POLYBAR_BOTTOM" "true")
         (when (fboundp #'my/exwm-run-polybar)
    @@ -2173,22 +2191,22 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     
     (defun my/perspective-assign ()
       (when-let* ((_ (not my/perspective-assign-ignore))
    -	      (rule (alist-get major-mode my/perspective-assign-alist)))
    +              (rule (alist-get major-mode my/perspective-assign-alist)))
         (let ((workspace-index (car rule))
    -	  (persp-name (cadr rule))
    -	  (buffer (current-buffer)))
    +          (persp-name (cadr rule))
    +          (buffer (current-buffer)))
           (if (fboundp #'perspective-exwm-assign-window)
    -	  (progn
    -	    (perspective-exwm-assign-window
    -	     :workspace-index workspace-index
    -	     :persp-name persp-name)
    -	    (when workspace-index
    -	      (exwm-workspace-switch workspace-index))
    -	    (when persp-name
    -	      (persp-switch persp-name)))
    -	(with-perspective persp-name
    -	  (persp-set-buffer buffer))
    -	(persp-switch-to-buffer buffer)))))
    +          (progn
    +            (perspective-exwm-assign-window
    +             :workspace-index workspace-index
    +             :persp-name persp-name)
    +            (when workspace-index
    +              (exwm-workspace-switch workspace-index))
    +            (when persp-name
    +              (persp-switch persp-name)))
    +        (with-perspective persp-name
    +          (persp-set-buffer buffer))
    +        (persp-switch-to-buffer buffer)))))
     

    Also advise to ignore the assignment:

    (defun my/perspective-assign-ignore-advice (fun &rest args)
       (let ((my/perspective-assign-ignore t))
    @@ -2204,12 +2222,12 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
       (let (result)
         (while body
           (let ((major-mode (pop body))
    -	    (workspace-index (pop body))
    -	    (persp-name (pop body)))
    -	(push
    -	 `(add-to-list 'my/perspective-assign-alist
    -		       '(,major-mode . (,workspace-index ,persp-name)))
    -	 result)))
    +            (workspace-index (pop body))
    +            (persp-name (pop body)))
    +        (push
    +         `(add-to-list 'my/perspective-assign-alist
    +                       '(,major-mode . (,workspace-index ,persp-name)))
    +         result)))
         `(progn
            ,@result)))
     

    Also, the logic above works only for cases when the buffer is created. Occasionally, packages run switch-to-buffer, which screws both EXWM workspaces and perspectives; to work around that, I define a macro that runs a command in the context of a given perspective and workspace.

    @@ -2217,7 +2235,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    `'((lambda () (interactive) (when (and ,workspace-index (fboundp #'exwm-workspace-switch-create)) - (exwm-workspace-switch-create ,workspace-index)) + (exwm-workspace-switch-create ,workspace-index)) (persp-switch ,persp-name) (delete-other-windows) ,@args) @@ -2261,18 +2279,18 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp :straight t :if (not (or my/is-termux my/remote-server)) :hook ( - (typescript-mode . lsp) - (js-mode . lsp) - (vue-mode . lsp) - (go-mode . lsp) - (svelte-mode . lsp) - ;; (python-mode . lsp) - (json-mode . lsp) - (haskell-mode . lsp) - (haskell-literate-mode . lsp) - (java-mode . lsp) - ;; (csharp-mode . lsp) - ) + (typescript-mode . lsp) + (js-mode . lsp) + (vue-mode . lsp) + (go-mode . lsp) + (svelte-mode . lsp) + ;; (python-mode . lsp) + (json-mode . lsp) + (haskell-mode . lsp) + (haskell-literate-mode . lsp) + (java-mode . lsp) + ;; (csharp-mode . lsp) + ) :commands lsp :init (setq lsp-keymap-prefix nil) @@ -2312,30 +2330,53 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    (defun my/lsp--progress-status ()
       "Returns the status of the progress for the current workspaces."
       (-let ((progress-status
    -	  (s-join
    -	   "|"
    -	   (-keep
    -	    (lambda (workspace)
    -	      (let ((tokens (lsp--workspace-work-done-tokens workspace)))
    -		(unless (ht-empty? tokens)
    -		  (mapconcat
    -		   (-lambda ((&WorkDoneProgressBegin :message? :title :percentage?))
    -		     (concat (if percentage?
    -				 (if (numberp percentage?)
    -				     (format "%.0f%%%% " percentage?)
    -				   (format "%s%%%% " percentage?))
    -			       "")
    -			     (let ((msg (url-unhex-string (or message\? title))))
    -			       (if (string-match-p "\\`file:///" msg)
    -				   (file-name-nondirectory msg)))))
    -		   (ht-values tokens)
    -		   "|"))))
    -	    (lsp-workspaces)))))
    +          (s-join
    +           "|"
    +           (-keep
    +            (lambda (workspace)
    +              (let ((tokens (lsp--workspace-work-done-tokens workspace)))
    +                (unless (ht-empty? tokens)
    +                  (mapconcat
    +                   (-lambda ((&WorkDoneProgressBegin :message? :title :percentage?))
    +                     (concat (if percentage?
    +                                 (if (numberp percentage?)
    +                                     (format "%.0f%%%% " percentage?)
    +                                   (format "%s%%%% " percentage?))
    +                               "")
    +                             (let ((msg (url-unhex-string (or message\? title))))
    +                               (if (string-match-p "\\`file:///" msg)
    +                                   (file-name-nondirectory msg)))))
    +                   (ht-values tokens)
    +                   "|"))))
    +            (lsp-workspaces)))))
         (unless (s-blank? progress-status)
           (concat lsp-progress-prefix progress-status))))
     
     (with-eval-after-load 'lsp-mode
       (advice-add 'lsp--progress-status :override #'my/lsp--progress-status))
    +
    Fix vue-semantic-server
    +

    Somehow, for me vue-semantic-server sends an empty textDocument/publishDiagnostics message a second or two after the real one, causing the diagnostics to disappear.

    +

    For now, I’ve advised this away by ignoring empty messages unless they show up more than 5 seconds after a non-empty message.

    +
    (setq my/lsp--vue-diagnostics-last-update (make-hash-table :test #'equal))
    +
    +(defun my/lsp--on-diagnostics (fn workspace params)
    +  (if (equal (gethash 'vue-semantic-server lsp-clients)
    +             (lsp--workspace-client workspace))
    +      (progn
    +        (let* ((is-empty (seq-empty-p (gethash "diagnostics" params)))
    +               (uri (gethash "uri" params))
    +               (last-update (gethash uri my/lsp--vue-diagnostics-last-update))
    +               (current-update (time-convert nil #'integer)))
    +          (unless is-empty
    +            (puthash uri current-update my/lsp--vue-diagnostics-last-update))
    +          (when (or (not is-empty)
    +                    (not last-update)
    +                    (> (- current-update (or last-update 0)) 5))
    +            (funcall fn workspace params))))
    +    (funcall fn workspace params)))
    +
    +(with-eval-after-load 'lsp
    +  (advice-add #'lsp--on-diagnostics :around #'my/lsp--on-diagnostics))
     

    Flycheck

    A syntax checking extension for Emacs. Integrates with LSP-mode, but can also use various standalone checkers.

    References:

    @@ -2355,12 +2396,12 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    ;; )) (advice-add 'flycheck-eslint-config-exists-p :override (lambda() t)) (add-to-list 'display-buffer-alist - `(,(rx bos "*Flycheck errors*" eos) - (display-buffer-reuse-window - display-buffer-in-side-window) - (side . bottom) - (reusable-frames . visible) - (window-height . 0.33)))) + `(,(rx bos "*Flycheck errors*" eos) + (display-buffer-reuse-window + display-buffer-in-side-window) + (side . bottom) + (reusable-frames . visible) + (window-height . 0.33))))

    General additional config

    Have to put this before tree-sitter because I need my/set-smartparens-indent there.

    Make smartparens behave the way I like for C-like languages.

    @@ -2391,42 +2432,42 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    :if (featurep 'treesit) :config (setq treesit-language-source-alist - (mapcar - (lambda (item) - (let ((lang (nth 0 item)) - (url (nth 1 item)) - (rev (nth 2 item)) - (source-dir (nth 3 item))) - `(,lang ,url ,rev ,source-dir - ,(executable-find "gcc") ,(executable-find "c++")))) - '((bash "https://github.com/tree-sitter/tree-sitter-bash") - (cmake "https://github.com/uyha/tree-sitter-cmake") - (css "https://github.com/tree-sitter/tree-sitter-css") - (elisp "https://github.com/Wilfred/tree-sitter-elisp") - (go "https://github.com/tree-sitter/tree-sitter-go") - (html "https://github.com/tree-sitter/tree-sitter-html") - (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "master" "src") - (json "https://github.com/tree-sitter/tree-sitter-json") - (make "https://github.com/alemuller/tree-sitter-make") - (markdown "https://github.com/ikatyang/tree-sitter-markdown") - (python "https://github.com/tree-sitter/tree-sitter-python") - (toml "https://github.com/tree-sitter/tree-sitter-toml") - (tsx "https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src") - (typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src") - (yaml "https://github.com/ikatyang/tree-sitter-yaml")))) + (mapcar + (lambda (item) + (let ((lang (nth 0 item)) + (url (nth 1 item)) + (rev (nth 2 item)) + (source-dir (nth 3 item))) + `(,lang ,url ,rev ,source-dir + ,(executable-find "gcc") ,(executable-find "c++")))) + '((bash "https://github.com/tree-sitter/tree-sitter-bash") + (cmake "https://github.com/uyha/tree-sitter-cmake") + (css "https://github.com/tree-sitter/tree-sitter-css") + (elisp "https://github.com/Wilfred/tree-sitter-elisp") + (go "https://github.com/tree-sitter/tree-sitter-go") + (html "https://github.com/tree-sitter/tree-sitter-html") + (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "master" "src") + (json "https://github.com/tree-sitter/tree-sitter-json") + (make "https://github.com/alemuller/tree-sitter-make") + (markdown "https://github.com/ikatyang/tree-sitter-markdown") + (python "https://github.com/tree-sitter/tree-sitter-python") + (toml "https://github.com/tree-sitter/tree-sitter-toml") + (tsx "https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src") + (typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src") + (yaml "https://github.com/ikatyang/tree-sitter-yaml")))) (setq treesit-font-lock-level 4) (setq major-mode-remap-alist - '((typescript-mode . typescript-ts-mode) - (js-mode . javascript-ts-mode) - (python-mode . python-ts-mode) - (json-mode . json-ts-mode))) + '((typescript-mode . typescript-ts-mode) + (js-mode . javascript-ts-mode) + (python-mode . python-ts-mode) + (json-mode . json-ts-mode))) (cl-loop for (old-mode . new-mode) in major-mode-remap-alist - do (my/set-smartparens-indent new-mode) - do (set (intern (concat (symbol-name new-mode) "-hook")) - (list - (eval `(lambda () - (run-hooks - ',(intern (concat (symbol-name old-mode) "-hook"))))))))) + do (my/set-smartparens-indent new-mode) + do (set (intern (concat (symbol-name new-mode) "-hook")) + (list + (eval `(lambda () + (run-hooks + ',(intern (concat (symbol-name old-mode) "-hook")))))))))
    treesit-fold

    treesit-fold uses treesit.el for folding.

    (use-package treesit-fold
    @@ -2439,32 +2480,32 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
       (when-let*
           ((node (ignore-errors (treesit-buffer-root-node)))
            (patterns (seq-mapcat (lambda (fold-range) `((,(car fold-range)) @name))
    -			     (alist-get major-mode treesit-fold-range-alist)))
    +                             (alist-get major-mode treesit-fold-range-alist)))
            (query (ignore-errors
    -		(treesit-query-compile (treesit-node-language node)
    -				       patterns)))
    +                (treesit-query-compile (treesit-node-language node)
    +                                       patterns)))
            (nodes-to-fold (treesit-query-capture node query))
            (mode-ranges (alist-get major-mode treesit-fold-range-alist))
            (nodes-to-fold
    -	(cl-remove-if (lambda (node)
    -			(treesit-fold--non-foldable-node-p (cdr node) mode-ranges))
    -		      nodes-to-fold)))
    +        (cl-remove-if (lambda (node)
    +                        (treesit-fold--non-foldable-node-p (cdr node) mode-ranges))
    +                      nodes-to-fold)))
         nodes-to-fold))
     

    Then filter children of the current foldable node and fold them:

    (defun my/treesit-fold-hide-children ()
       (interactive)
       (let* ((current-node (treesit-fold--foldable-node-at-pos))
    -	 (all-nodes-to-fold (my/treesit-fold--get-nodes-to-fold))
    -	 ;; Find foldable children of `current-node'
    -	 (target-nodes-to-fold
    -	  (seq-filter
    -	   (lambda (n)
    -	     (cl-block tree-iter
    -	       (while n
    -		 (setq n (treesit-node-parent n))
    -		 (when (equal n current-node)
    -		   (cl-return-from tree-iter t)))))
    -	   (mapcar #'cdr all-nodes-to-fold))))
    +         (all-nodes-to-fold (my/treesit-fold--get-nodes-to-fold))
    +         ;; Find foldable children of `current-node'
    +         (target-nodes-to-fold
    +          (seq-filter
    +           (lambda (n)
    +             (cl-block tree-iter
    +               (while n
    +                 (setq n (treesit-node-parent n))
    +                 (when (equal n current-node)
    +                   (cl-return-from tree-iter t)))))
    +           (mapcar #'cdr all-nodes-to-fold))))
         (dolist (node target-nodes-to-fold)
           (treesit-fold-close node))))
     
    (defun my/evil-fold-hide-level ()
    @@ -2523,8 +2564,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
            ,(concat "Toggle DAP " name "buffer")
            (interactive)
            (if-let (window (get-buffer-window ,(intern (concat "dap-ui--" name "-buffer"))))
    -	   (quit-window nil window)
    -	 (,(intern (concat "dap-ui-" name))))))
    +           (quit-window nil window)
    +         (,(intern (concat "dap-ui-" name))))))
     
       (my/define-dap-ui-window-toggler "locals")
       (my/define-dap-ui-window-toggler "expressions")
    @@ -2541,8 +2582,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     _o_: Step out      _ul_: Locals             _sf_: Stack frame          _ba_: Add             _dl_: Debug last            _es_: Eval thing at point
     _c_: Continue      _ur_: REPL               _su_: Up stack frame       _bc_: Set condition   _de_: Edit debug template   _ea_: Add expression
     _r_: Restart frame _uo_: Output             _sd_: Down stack frame     _bh_: Set hit count   _Q_:  Disconnect            _ed_: Remove expression
    -		 _us_: Sessions           _sF_: Stack frame filtered _bl_: Set log message                           _eu_: Refresh expressions
    -		 _ub_: Breakpoints                                                                               "
    +                 _us_: Sessions           _sF_: Stack frame filtered _bl_: Set log message                           _eu_: Refresh expressions
    +                 _ub_: Breakpoints                                                                               "
     
       ("n" dap-next)
       ("i" dap-step-in)
    @@ -2593,10 +2634,10 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
       (defmacro my/define-dap-tree-buffer-fixer (buffer-var buffer-name)
         `(defun ,(intern (concat "my/fix-dap-ui-" buffer-name "-buffer")) (&rest _)
            (with-current-buffer ,buffer-var
    -	 (unless my/dap-mode-buffer-fixed
    -	   (toggle-truncate-lines 1)
    -	   (doom-modeline-set-modeline 'info)
    -	   (setq-local my/dap-mode-buffer-fixed t)))))
    +         (unless my/dap-mode-buffer-fixed
    +           (toggle-truncate-lines 1)
    +           (doom-modeline-set-modeline 'info)
    +           (setq-local my/dap-mode-buffer-fixed t)))))
     
       (my/define-dap-tree-buffer-fixer dap-ui--locals-buffer "locals")
       (my/define-dap-tree-buffer-fixer dap-ui--expressions-buffer "expressions")
    @@ -2625,27 +2666,27 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
       (let ((value (plist-get (button-get node :item) :value)))
         (when value
           (let ((buffer (generate-new-buffer "dap-value")))
    -	(with-current-buffer buffer
    -	  (insert value))
    -	(select-window (display-buffer buffer))))))
    +        (with-current-buffer buffer
    +          (insert value))
    +        (select-window (display-buffer buffer))))))
     
    Switch to stack frame with filter

    One significant improvement over Chrome Inspector for my particular stack is an ability to filter the stack frame list, for instance, to see only frames that relate to my current project.

    So, here are functions that customize the filters:

    (with-eval-after-load 'dap-mode
       (setq my/dap-stack-frame-filters
    -	`(("node_modules,node:internal" . ,(rx (or "node_modules" "node:internal")))
    -	  ("node_modules" . ,(rx (or "node_modules")))
    -	  ("node:internal" . ,(rx (or "node:internal")))))
    +        `(("node_modules,node:internal" . ,(rx (or "node_modules" "node:internal")))
    +          ("node_modules" . ,(rx (or "node_modules")))
    +          ("node:internal" . ,(rx (or "node:internal")))))
     
       (setq my/dap-stack-frame-current-filter (cdar my/dap-stack-frame-filters))
     
       (defun my/dap-stack-frame-filter-set ()
         (interactive)
         (setq my/dap-stack-frame-current-filter
    -	  (cdr
    -	   (assoc
    -	    (completing-read "Filter: " my/dap-stack-frame-filters)
    -	    my/dap-stack-frame-filters))))
    +          (cdr
    +           (assoc
    +            (completing-read "Filter: " my/dap-stack-frame-filters)
    +            my/dap-stack-frame-filters))))
     
       (defun my/dap-stack-frame-filter (frame)
         (when-let (path (dap--get-path-for-frame frame))
    @@ -2659,30 +2700,30 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     
       (-if-let (thread-id (dap--debug-session-thread-id (dap--cur-session)))
           (-if-let (stack-frames
    -		(gethash
    -		 thread-id
    -		 (dap--debug-session-thread-stack-frames (dap--cur-session))))
    -	  (let* ((index 0)
    -		 (stack-framces-filtered
    -		  (-filter
    -		   #'my/dap-stack-frame-filter
    -		   stack-frames))
    -		 (new-stack-frame
    -		  (dap--completing-read
    -		   "Select active frame: "
    -		   stack-framces-filtered
    -		   (-lambda ((frame &as &hash "name"))
    -		     (if-let (frame-path (dap--get-path-for-frame frame))
    -			 (format "%s: %s (in %s)"
    -				 (cl-incf index) name frame-path)
    -		       (format "%s: %s" (cl-incf index) name)))
    -		   nil
    -		   t)))
    -	    (dap--go-to-stack-frame (dap--cur-session) new-stack-frame))
    -	(->> (dap--cur-session)
    -	     dap--debug-session-name
    -	     (format "Current session %s is not stopped")
    -	     error))
    +                (gethash
    +                 thread-id
    +                 (dap--debug-session-thread-stack-frames (dap--cur-session))))
    +          (let* ((index 0)
    +                 (stack-framces-filtered
    +                  (-filter
    +                   #'my/dap-stack-frame-filter
    +                   stack-frames))
    +                 (new-stack-frame
    +                  (dap--completing-read
    +                   "Select active frame: "
    +                   stack-framces-filtered
    +                   (-lambda ((frame &as &hash "name"))
    +                     (if-let (frame-path (dap--get-path-for-frame frame))
    +                         (format "%s: %s (in %s)"
    +                                 (cl-incf index) name frame-path)
    +                       (format "%s: %s" (cl-incf index) name)))
    +                   nil
    +                   t)))
    +            (dap--go-to-stack-frame (dap--cur-session) new-stack-frame))
    +        (->> (dap--cur-session)
    +             dap--debug-session-name
    +             (format "Current session %s is not stopped")
    +             error))
         (error "No thread is currently active %s" (dap--debug-session-name (dap--cur-session)))))
     
    Smarter switch to stack frame
      @@ -2695,18 +2736,18 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp Returns (<buffer> . <workspace-index>) or nil." (let* ((buf (cl-loop for buf being buffers - if (and (buffer-file-name buf) - (f-equal-p (buffer-file-name buf) path)) - return buf)) - (target-workspace - (and buf - (cl-loop for frame in exwm-workspace--list - if (with-selected-frame frame - (cl-loop for persp-name being the hash-keys of (perspectives-hash) - if (member buf (persp-buffers - (gethash persp-name (perspectives-hash)))) - return persp-name)) - return (cl-position frame exwm-workspace--list))))) + if (and (buffer-file-name buf) + (f-equal-p (buffer-file-name buf) path)) + return buf)) + (target-workspace + (and buf + (cl-loop for frame in exwm-workspace--list + if (with-selected-frame frame + (cl-loop for persp-name being the hash-keys of (perspectives-hash) + if (member buf (persp-buffers + (gethash persp-name (perspectives-hash)))) + return persp-name)) + return (cl-position frame exwm-workspace--list))))) (when target-workspace (cons buf target-workspace))))

      And override dap--go-to-stack-frame to take that into account. For some reason, evaluating this before dap-mode doesn’t work.

      (defun my/dap--go-to-stack-frame-override (debug-session stack-frame)
      @@ -2714,25 +2755,25 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
         (with-lsp-workspace (dap--debug-session-workspace debug-session)
           (when stack-frame
             (-let* (((&hash "line" line "column" column "name" name) stack-frame)
      -	      (path (dap--get-path-for-frame stack-frame)))
      -	(setf (dap--debug-session-active-frame debug-session) stack-frame)
      -	;; If we have a source file with path attached, open it and
      -	;; position the point in the line/column referenced in the
      -	;; stack trace.
      -	(if (and path (file-exists-p path))
      -	    (progn
      -	      (let ((exwm-target (my/exwm-perspective-find-buffer path)))
      -		(if exwm-target
      -		    (progn
      -		      (unless (= (cdr exwm-target) exwm-workspace-current-index)
      -			(exwm-workspace-switch (cdr exwm-target)))
      -		      (persp-switch-to-buffer (car exwm-target)))
      -		  (select-window (get-mru-window (selected-frame) nil))
      -		  (find-file path)))
      -	      (goto-char (point-min))
      -	      (forward-line (1- line))
      -	      (forward-char column))
      -	  (message "No source code for %s. Cursor at %s:%s." name line column))))
      +              (path (dap--get-path-for-frame stack-frame)))
      +        (setf (dap--debug-session-active-frame debug-session) stack-frame)
      +        ;; If we have a source file with path attached, open it and
      +        ;; position the point in the line/column referenced in the
      +        ;; stack trace.
      +        (if (and path (file-exists-p path))
      +            (progn
      +              (let ((exwm-target (my/exwm-perspective-find-buffer path)))
      +                (if exwm-target
      +                    (progn
      +                      (unless (= (cdr exwm-target) exwm-workspace-current-index)
      +                        (exwm-workspace-switch (cdr exwm-target)))
      +                      (persp-switch-to-buffer (car exwm-target)))
      +                  (select-window (get-mru-window (selected-frame) nil))
      +                  (find-file path)))
      +              (goto-char (point-min))
      +              (forward-line (1- line))
      +              (forward-char column))
      +          (message "No source code for %s. Cursor at %s:%s." name line column))))
           (run-hook-with-args 'dap-stack-frame-changed-hook debug-session)))
       
       (with-eval-after-load 'exwm
      @@ -2746,19 +2787,19 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
         (dap-register-debug-template
          "Node::Nest.js"
          (list :type "node"
      -	 :request "attach"
      -	 :name "Node::Attach"
      -	 :port 9229
      -	 :outFiles ["${workspaceFolder}/dist/**/*.js"]
      -	 :sourceMaps t
      -	 :program "${workspaceFolder}/src/app.ts"))
      +         :request "attach"
      +         :name "Node::Attach"
      +         :port 9229
      +         :outFiles ["${workspaceFolder}/dist/**/*.js"]
      +         :sourceMaps t
      +         :program "${workspaceFolder}/src/app.ts"))
         (dap-register-debug-template
          "Node::Babel"
          (list :type "node"
      -	 :request "attach"
      -	 :name "Node::Attach"
      -	 :port 9229
      -	 :program "${workspaceFolder}/dist/bin/www.js")))
      +         :request "attach"
      +         :name "Node::Attach"
      +         :port 9229
      +         :program "${workspaceFolder}/dist/bin/www.js")))
       

      Reformatter

      A general-purpose package to run formatters on files. While the most popular formatters are already packaged for Emacs, those that aren’t can be invoked with this package.

      (use-package reformatter
      @@ -2770,9 +2811,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
         (or (copilot-accept-completion)
             (when (my/should-run-emmet-p) (my/emmet-or-tab))
             (when (and (eq evil-state 'normal)
      -		 (or hs-minor-mode treesit-fold-mode outline-minor-mode))
      -	(evil-toggle-fold)
      -	t)
      +                 (or hs-minor-mode treesit-fold-mode outline-minor-mode))
      +        (evil-toggle-fold)
      +        t)
             (indent-for-tab-command)))
       
       (use-package copilot
      @@ -2781,8 +2822,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
         :disabled t
         :init
         (add-hook 'emacs-startup-hook
      -	    (lambda ()
      -	      (add-hook 'prog-mode-hook #'copilot-mode)))
      +            (lambda ()
      +              (add-hook 'prog-mode-hook #'copilot-mode)))
         :config
         (push '(copilot) warning-suppress-types)
         (setq copilot-node-executable "/home/pavel/.guix-extra-profiles/dev/dev/bin/node")
      @@ -2797,7 +2838,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
       

      Web development

      Configs for various web development technologies I’m using.

      Emmet

      -

      Emmet is a toolkit which greatly speeds up typing HTML & CSS.

      +

      Emmet is a toolkit which greatly speeds up typing HTML & CSS.

@@ -2820,24 +2861,24 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(defun my/should-run-emmet-p ()
   (and (bound-and-true-p emmet-mode)
        (or (and (derived-mode-p 'web-mode)
-		(member (web-mode-language-at-pos) '("html" "css")))
-	   (not (derived-mode-p 'web-mode)))))
+                (member (web-mode-language-at-pos) '("html" "css")))
+           (not (derived-mode-p 'web-mode)))))
 
 (use-package emmet-mode
   :straight t
   :hook ((vue-html-mode . emmet-mode)
-	 (svelte-mode . emmet-mode)
-	 (web-mode . emmet-mode)
-	 (html-mode . emmet-mode)
-	 (css-mode . emmet-mode)
-	 (scss-mode . emmet-mode))
+         (svelte-mode . emmet-mode)
+         (web-mode . emmet-mode)
+         (html-mode . emmet-mode)
+         (css-mode . emmet-mode)
+         (scss-mode . emmet-mode))
   :config
   (defun my/emmet-or-tab (&optional arg)
     (interactive)
     (if (my/should-run-emmet-p)
-	(or (emmet-expand-line arg)
-	    (emmet-go-to-edit-point 1)
-	    (indent-for-tab-command arg))
+        (or (emmet-expand-line arg)
+            (emmet-go-to-edit-point 1)
+            (indent-for-tab-command arg))
       (indent-for-tab-command arg)))
   (general-imap :keymaps 'emmet-mode-keymap
     "TAB" 'my/emmet-or-tab
@@ -2849,11 +2890,11 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :init
   (my-leader-def
     :keymaps '(js-mode-map
-	       web-mode-map
-	       typescript-mode-map
-	       typescript-ts-mode-map
-	       vue-mode-map
-	       svelte-mode-map)
+               web-mode-map
+               typescript-mode-map
+               typescript-ts-mode-map
+               vue-mode-map
+               svelte-mode-map)
     "rr" #'prettier-prettify))
 

TypeScript

(use-package typescript-mode
@@ -2873,7 +2914,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(use-package jest-test-mode
   :straight t
   :hook ((typescript-mode . jest-test-mode)
-	 (js-mode . jest-test-mode))
+         (js-mode . jest-test-mode))
   :config
   (my-leader-def
     :keymaps 'jest-test-mode-map
@@ -2886,7 +2927,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     "Execute FORM with debugger flags set."
     (declare (indent 0))
     `(let ((jest-test-options (seq-concatenate 'list jest-test-options (list "--runInBand") ))
-	   (jest-test-npx-options (seq-concatenate 'list jest-test-npx-options (list "--node-options" "--inspect-brk"))))
+           (jest-test-npx-options (seq-concatenate 'list jest-test-npx-options (list "--node-options" "--inspect-brk"))))
        ,form))
   (defun my/jest-test-debug ()
     "Run the test with an inline debugger attached."
@@ -2906,16 +2947,16 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (advice-add #'jest-test-debug :override #'my/jest-test-debug)
   (advice-add #'jest-test-debug-rerun-test :override #'my/jest-test-debug-rerun-test)
   (advice-add #'jest-test-debug-run-at-point
-	      :override #'my/jest-test-debug-run-at-point))
+              :override #'my/jest-test-debug-run-at-point))
 
(defun my/jest-test-run-at-point-copy ()
   "Run the top level describe block of the current buffer's point."
   (interactive)
   (let ((filename (jest-test-find-file))
-	(example  (jest-test-unit-at-point)))
+        (example  (jest-test-unit-at-point)))
     (if (and filename example)
-	(jest-test-from-project-directory filename
-	  (let ((jest-test-options (seq-concatenate 'list jest-test-options (list "-t" example))))
-	    (kill-new (jest-test-command filename))))
+        (jest-test-from-project-directory filename
+          (let ((jest-test-options (seq-concatenate 'list jest-test-options (list "-t" example))))
+            (kill-new (jest-test-command filename))))
       (message jest-test-not-found-message))))
 

web-mode

web-mode.el is a major mode to edit various web templates.

@@ -2931,16 +2972,20 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(add-hook 'web-mode-hook 'smartparens-mode) (add-hook 'web-mode-hook 'hs-minor-mode) (my/set-smartparens-indent 'web-mode) + (with-eval-after-load 'editorconfig + (push + 'standard-indent + (alist-get 'web-mode editorconfig-indentation-alist))) (setq web-mode-auto-pairs nil))

Hooking this up with lsp.

(setq my/web-mode-lsp-extensions
       `(,(rx ".svelte" eos)
-	,(rx ".vue" eos)))
+        ,(rx ".vue" eos)))
 
 (defun my/web-mode-lsp ()
   (when (seq-some
-	 (lambda (regex) (string-match-p regex (buffer-file-name)))
-	 my/web-mode-lsp-extensions)
+         (lambda (regex) (string-match-p regex (buffer-file-name)))
+         my/web-mode-lsp-extensions)
     (lsp-deferred)))
 
 (add-hook 'web-mode-hook #'my/web-mode-lsp)
@@ -2948,7 +2993,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/web-mode-vue-setup (&rest _)
   (let ((filename (buffer-file-name)))
     (when (and (stringp filename)
-	       (string-match-p (rx ".vue" eos) filename))
+               (string-match-p (rx ".vue" eos) filename))
       (setq-local web-mode-script-padding 0)
       (setq-local web-mode-style-padding 0)
       (setq-local create-lockfiles nil)
@@ -3000,20 +3045,20 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     (assoc-delete-all "---" tex--prettify-symbols-alist))
 
   (add-hook 'LaTeX-mode-hook
-	    (lambda ()
-	      (TeX-fold-mode 1)
-	      (outline-minor-mode)))
+            (lambda ()
+              (TeX-fold-mode 1)
+              (outline-minor-mode)))
 
   (add-to-list 'TeX-view-program-selection
-	       '(output-pdf "Zathura"))
+               '(output-pdf "Zathura"))
 
   ;; Do not run lsp within templated TeX files
   (add-hook 'LaTeX-mode-hook
-	    (lambda ()
-	      (unless (string-match "\.hogan\.tex$" (buffer-name))
-		(lsp))
-	      (setq-local lsp-diagnostic-package :none)
-	      (setq-local flycheck-checker 'tex-chktex)))
+            (lambda ()
+              (unless (string-match "\.hogan\.tex$" (buffer-name))
+                (lsp))
+              (setq-local lsp-diagnostic-package :none)
+              (setq-local flycheck-checker 'tex-chktex)))
 
   (add-hook 'LaTeX-mode-hook #'rainbow-delimiters-mode)
   (add-hook 'LaTeX-mode-hook #'smartparens-mode)
@@ -3041,37 +3086,37 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
      (directory-files
       (seq-some
        (lambda (dir)
-	 (if (and
-	      (f-directory-p dir)
-	      (seq-some
-	       (lambda (file) (string-match ".*\.sty$" file))
-	       (directory-files dir))
-	      ) dir nil))
+         (if (and
+              (f-directory-p dir)
+              (seq-some
+               (lambda (file) (string-match ".*\.sty$" file))
+               (directory-files dir))
+              ) dir nil))
        (list "./styles" "../styles/" "." "..")) :full))
     (lambda (f1 f2)
       (let ((f1b (file-name-base f1))
-	    (f1b (file-name-base f2)))
-	(cond
-	 ((string-match-p ".*BibTex" f1) t)
-	 ((and (string-match-p ".*Locale" f1) (not (string-match-p ".*BibTex" f2))) t)
-	 ((string-match-p ".*Preamble" f2) t)
-	 (t (string-lessp f1 f2))))))))
+            (f1b (file-name-base f2)))
+        (cond
+         ((string-match-p ".*BibTex" f1) t)
+         ((and (string-match-p ".*Locale" f1) (not (string-match-p ".*BibTex" f2))) t)
+         ((string-match-p ".*Preamble" f2) t)
+         (t (string-lessp f1 f2))))))))
 
 (defun my/import-sty ()
   (interactive)
   (insert
    (apply #'concat
-	  (cl-mapcar
-	   (lambda (file) (concat "\\usepackage{" (file-name-sans-extension (file-relative-name file default-directory)) "}\n"))
-	   (my/list-sty)))))
+          (cl-mapcar
+           (lambda (file) (concat "\\usepackage{" (file-name-sans-extension (file-relative-name file default-directory)) "}\n"))
+           (my/list-sty)))))
 
 (defun my/import-sty-org ()
   (interactive)
   (insert
    (apply #'concat
-	  (cl-mapcar
-	   (lambda (file) (concat "#+LATEX_HEADER: \\usepackage{" (file-name-sans-extension (file-relative-name file default-directory)) "}\n"))
-	   (my/list-sty)))))
+          (cl-mapcar
+           (lambda (file) (concat "#+LATEX_HEADER: \\usepackage{" (file-name-sans-extension (file-relative-name file default-directory)) "}\n"))
+           (my/list-sty)))))
 

Snippets

@@ -3092,43 +3137,43 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp

Noweb points to the AUCTeX config block.

(setq my/greek-alphabet
       '(("a" . "\\alpha")
-	("b" . "\\beta" )
-	("g" . "\\gamma")
-	("d" . "\\delta")
-	("e" . "\\epsilon")
-	("z" . "\\zeta")
-	("h" . "\\eta")
-	("o" . "\\theta")
-	("i" . "\\iota")
-	("k" . "\\kappa")
-	("l" . "\\lambda")
-	("m" . "\\mu")
-	("n" . "\\nu")
-	("x" . "\\xi")
-	("p" . "\\pi")
-	("r" . "\\rho")
-	("s" . "\\sigma")
-	("t" . "\\tau")
-	("u" . "\\upsilon")
-	("f" . "\\phi")
-	("c" . "\\chi")
-	("v" . "\\psi")
-	("g" . "\\omega")))
+        ("b" . "\\beta" )
+        ("g" . "\\gamma")
+        ("d" . "\\delta")
+        ("e" . "\\epsilon")
+        ("z" . "\\zeta")
+        ("h" . "\\eta")
+        ("o" . "\\theta")
+        ("i" . "\\iota")
+        ("k" . "\\kappa")
+        ("l" . "\\lambda")
+        ("m" . "\\mu")
+        ("n" . "\\nu")
+        ("x" . "\\xi")
+        ("p" . "\\pi")
+        ("r" . "\\rho")
+        ("s" . "\\sigma")
+        ("t" . "\\tau")
+        ("u" . "\\upsilon")
+        ("f" . "\\phi")
+        ("c" . "\\chi")
+        ("v" . "\\psi")
+        ("g" . "\\omega")))
 
 (setq my/latex-greek-prefix "'")
 
 ;; The same for capitalized letters
 (dolist (elem my/greek-alphabet)
   (let ((key (car elem))
-	(value (cdr elem)))
+        (value (cdr elem)))
     (when (string-equal key (downcase key))
       (add-to-list 'my/greek-alphabet
-		   (cons
-		    (capitalize (car elem))
-		    (concat
-		     (substring value 0 1)
-		     (capitalize (substring value 1 2))
-		     (substring value 2)))))))
+                   (cons
+                    (capitalize (car elem))
+                    (concat
+                     (substring value 0 1)
+                     (capitalize (substring value 1 2))
+                     (substring value 2)))))))
 
 (yas-define-snippets
  'latex-mode
@@ -3155,21 +3200,21 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
Math symbols
(setq my/latex-math-symbols
       '(("x" . "\\times")
-	("." . "\\cdot")
-	("v" . "\\forall")
-	("s" . "\\sum_{$1}^{$2}$0")
-	("p" . "\\prod_{$1}^{$2}$0")
-	("d" . "\\partial")
-	("e" . "\\exists")
-	("i" . "\\int_{$1}^{$2}$0")
-	("c" . "\\cap")
-	("u" . "\\cup")
-	("0" . "\\emptyset")
-	("^" . "\\widehat{$1}$0")
-	("_" . "\\overline{$1}$0")
-	("~" . "\\sim")
-	("|" . "\\mid")
-	("_|" . "\\perp")))
+        ("." . "\\cdot")
+        ("v" . "\\forall")
+        ("s" . "\\sum_{$1}^{$2}$0")
+        ("p" . "\\prod_{$1}^{$2}$0")
+        ("d" . "\\partial")
+        ("e" . "\\exists")
+        ("i" . "\\int_{$1}^{$2}$0")
+        ("c" . "\\cap")
+        ("u" . "\\cup")
+        ("0" . "\\emptyset")
+        ("^" . "\\widehat{$1}$0")
+        ("_" . "\\overline{$1}$0")
+        ("~" . "\\sim")
+        ("|" . "\\mid")
+        ("_|" . "\\perp")))
 
 (setq my/latex-math-prefix ";")
 
@@ -3178,44 +3223,44 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
  (mapcar
   (lambda (elem)
     (let ((key (car elem))
-	  (value (cdr elem)))
+          (value (cdr elem)))
       (list (concat my/latex-math-prefix key) value (concat "Math symbol " value))))
   my/latex-math-symbols))
 
Section snippets

Section snippets. The code turned out to be more complicated than just writing the snippets by hand.

(setq my/latex-section-snippets
       '(("ch" . "\\chapter{$1}")
-	("sec" . "\\section{$1}")
-	("ssec" . "\\subsection{$1}")
-	("sssec" . "\\subsubsection{$1}")
-	("par" . "\\paragraph{$1}}")))
+        ("sec" . "\\section{$1}")
+        ("ssec" . "\\subsection{$1}")
+        ("sssec" . "\\subsubsection{$1}")
+        ("par" . "\\paragraph{$1}}")))
 
 (setq my/latex-section-snippets
       (mapcar
        (lambda (elem)
-	 `(,(car elem)
-	   ,(cdr elem)
-	   ,(progn
-	      (string-match "[a-z]+" (cdr elem))
-	      (match-string 0 (cdr elem)))))
+         `(,(car elem)
+           ,(cdr elem)
+           ,(progn
+              (string-match "[a-z]+" (cdr elem))
+              (match-string 0 (cdr elem)))))
        my/latex-section-snippets))
 
 (dolist (elem my/latex-section-snippets)
   (let* ((key (nth 0 elem))
-	 (value (nth 1 elem))
-	 (desc (nth 2 elem))
-	 (star-index (string-match "\{\$1\}" value)))
+         (value (nth 1 elem))
+         (desc (nth 2 elem))
+         (star-index (string-match "\{\$1\}" value)))
     (add-to-list 'my/latex-section-snippets
-		 `(,(concat key "*")
-		   ,(concat
-		     (substring value 0 star-index)
-		     "*"
-		     (substring value star-index))
-		   ,(concat desc " with *")))
+                 `(,(concat key "*")
+                   ,(concat
+                     (substring value 0 star-index)
+                     "*"
+                     (substring value star-index))
+                   ,(concat desc " with *")))
     (add-to-list 'my/latex-section-snippets
-		 `(,(concat key "l")
-		   ,(concat value "%\n\\label{sec:$2}")
-		   ,(concat desc " with label")))))
+                 `(,(concat key "l")
+                   ,(concat value "%\n\\label{sec:$2}")
+                   ,(concat desc " with label")))))
 
 (dolist (elem my/latex-section-snippets)
   (setf (nth 1 elem) (concat (nth 1 elem) "\n$0")))
@@ -3230,13 +3275,13 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :mode "\\.md\\'"
   :config
   (setq markdown-command
-	(concat
-	 "pandoc"
-	 " --from=markdown --to=html"
-	 " --standalone --mathjax --highlight-style=pygments"
-	 " --css=pandoc.css"
-	 " --quiet"
-	 ))
+        (concat
+         "pandoc"
+         " --from=markdown --to=html"
+         " --standalone --mathjax --highlight-style=pygments"
+         " --css=pandoc.css"
+         " --quiet"
+         ))
   (setq markdown-live-preview-delete-export 'delete-on-export)
   (setq markdown-asymmetric-header t)
   (setq markdown-open-command "/home/pavel/bin/scripts/chromium-sep")
@@ -3290,7 +3335,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 

A major mode to work with subtitles.

(use-package subed
   :straight (:host github :repo "rndusr/subed" :files ("subed/*.el")
-		   :build (:not native-compile))
+                   :build (:not native-compile))
   ;; (cons (rx (| "srt" "vtt" "ass") eos) #'subed-mode)
   :mode ("\\(?:ass\\|\\(?:sr\\|vt\\)t\\)\\'" . subed-mode)
   :config
@@ -3312,8 +3357,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/ltex-lang ()
   (interactive)
   (setq lsp-ltex-language (completing-read
-			   "Language: "
-			   '("en-GB" "ru-RU" "de-DE")))
+                           "Language: "
+                           '("en-GB" "ru-RU" "de-DE")))
   (lsp-workspace-restart (lsp--read-workspace)))
 

Check whether it’s necessary to run LTeX:

(defun my/ltex-need-p ()
@@ -3479,25 +3524,25 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 (defun my/get-pipenv-python ()
   (let ((default-directory (projectile-project-root)))
     (if (file-exists-p "Pipfile")
-	(let ((asc (assoc default-directory my/pipenv-python-alist)))
-	  (if asc
-	      (cdr asc)
-	    (let ((python-executable
-		   (string-trim (shell-command-to-string "PIPENV_IGNORE_VIRTUALENVS=1 pipenv run which python 2>/dev/null"))))
-	      (if (string-match-p ".*not found.*" python-executable)
-		  (message "Pipfile found, but not pipenv executable!")
-		(message (format "Found pipenv python: %s" python-executable))
-		(add-to-list 'my/pipenv-python-alist (cons default-directory python-executable))
-		python-executable))))
+        (let ((asc (assoc default-directory my/pipenv-python-alist)))
+          (if asc
+              (cdr asc)
+            (let ((python-executable
+                   (string-trim (shell-command-to-string "PIPENV_IGNORE_VIRTUALENVS=1 pipenv run which python 2>/dev/null"))))
+              (if (string-match-p ".*not found.*" python-executable)
+                  (message "Pipfile found, but not pipenv executable!")
+                (message (format "Found pipenv python: %s" python-executable))
+                (add-to-list 'my/pipenv-python-alist (cons default-directory python-executable))
+                python-executable))))
       "python")))
 
 (use-package lsp-pyright
   :straight t
   :defer t
   :hook (python-mode . (lambda ()
-			 (require 'lsp-pyright)
-			 (setq-local lsp-pyright-python-executable-cmd (my/get-pipenv-python))
-			 (lsp))))
+                         (require 'lsp-pyright)
+                         (setq-local lsp-pyright-python-executable-cmd (my/get-pipenv-python))
+                         (lsp))))
 
 (add-hook 'python-mode-hook #'smartparens-mode)
 (add-hook 'python-mode-hook #'treesit-fold-mode)
@@ -3535,9 +3580,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :straight (:repo "JorisE/yapfify" :host github)
   :disabled
   :commands (yapfify-region
-	     yapfify-buffer
-	     yapfify-region-or-buffer
-	     yapf-mode))
+             yapfify-buffer
+             yapfify-region-or-buffer
+             yapf-mode))
 

Global config:

[style]
 based_on_style = facebook
@@ -3588,10 +3633,10 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(my-leader-def
   :keymaps '(python-mode-map python-ts-mode-map)
   "rr" (lambda ()
-	 (interactive)
-	 (unless (and (fboundp #'org-src-edit-buffer-p) (org-src-edit-buffer-p))
-	   (py-isort-buffer))
-	 (python-black-buffer)))
+         (interactive)
+         (unless (and (fboundp #'org-src-edit-buffer-p) (org-src-edit-buffer-p))
+           (py-isort-buffer))
+         (python-black-buffer)))
 

OFF sphinx-doc

A package to generate sphinx-compatible docstrings.

(use-package sphinx-doc
@@ -3646,30 +3691,30 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(cl-defun python-pytest--run-as-comint (&key command)
   "Run a pytest comint session for COMMAND."
   (let* ((buffer (python-pytest--get-buffer))
-	 (process (get-buffer-process buffer)))
+         (process (get-buffer-process buffer)))
     (with-current-buffer buffer
       (when (comint-check-proc buffer)
-	(unless (or compilation-always-kill
-		    (yes-or-no-p "Kill running pytest process?"))
-	  (user-error "Aborting; pytest still running")))
+        (unless (or compilation-always-kill
+                    (yes-or-no-p "Kill running pytest process?"))
+          (user-error "Aborting; pytest still running")))
       (when process
-	(delete-process process))
+        (delete-process process))
       (let ((inhibit-read-only t))
-	(erase-buffer))
+        (erase-buffer))
       (unless (eq major-mode 'python-pytest-mode)
-	(python-pytest-mode))
+        (python-pytest-mode))
       (compilation-forget-errors)
       (display-buffer buffer)
       (setq command (format "export COLUMNS=%s; %s"
-			    (- (window-width (get-buffer-window buffer)) 5)
-			    command))
+                            (- (window-width (get-buffer-window buffer)) 5)
+                            command))
       (insert (format "cwd: %s\ncmd: %s\n\n" default-directory command))
       (setq python-pytest--current-command command)
       (when python-pytest-pdb-track
-	(add-hook
-	 'comint-output-filter-functions
-	 'python-pdbtrack-comint-output-filter-function
-	 nil t))
+        (add-hook
+         'comint-output-filter-functions
+         'python-pdbtrack-comint-output-filter-function
+         nil t))
       (run-hooks 'python-pytest-setup-hook)
       (make-comint-in-buffer "pytest" buffer "bash" nil "-c" command)
       (run-hooks 'python-pytest-started-hook)
@@ -3740,7 +3785,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(use-package gitignore-templates
   :straight t
   :commands (gitignore-templates-insert
-	     gitignore-templates-new-file))
+             gitignore-templates-new-file))
 

Docker

(use-package dockerfile-mode
   :mode "Dockerfile\\'"
@@ -3790,7 +3835,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   "Set dialect for sql-formatter"
   (interactive)
   (setq my/sqlformatter-dialect
-	(completing-read "Dialect: " my/sqlformatter-dialect-choice)))
+        (completing-read "Dialect: " my/sqlformatter-dialect-choice)))
 
 (reformatter-define sqlformat
   :program (executable-find "sql-formatter")
@@ -3845,7 +3890,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(use-package x509-mode
   :commands (x509-dwim)
   :straight (:host github :repo "jobbflykt/x509-mode"
-		   :build (:not native-compile)))
+                   :build (:not native-compile)))
 

Java

(use-package lsp-java
   :straight t
@@ -3947,13 +3992,13 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (setq org-src-tab-acts-natively nil)
   (add-hook 'org-mode-hook 'smartparens-mode)
   (add-hook 'org-agenda-mode-hook
-	    (lambda ()
-	      (visual-line-mode -1)
-	      (toggle-truncate-lines 1)
-	      (display-line-numbers-mode 0)))
+            (lambda ()
+              (visual-line-mode -1)
+              (toggle-truncate-lines 1)
+              (display-line-numbers-mode 0)))
   (add-hook 'org-mode-hook
-	    (lambda ()
-	      (rainbow-delimiters-mode -1))))
+            (lambda ()
+              (rainbow-delimiters-mode -1))))
 

Encryption

Setting up org-crypt to encrypt parts of file.

(with-eval-after-load 'org
@@ -3964,14 +4009,14 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(with-eval-after-load 'epg
   (setq epg-gpg-program "gpg")
   (setq epg-config--program-alist
-	`((OpenPGP
-	   epg-gpg-program
-	   ;; ("gpg2" . ,epg-gpg2-minimum-version)
-	   ("gpg" . ((,epg-gpg-minimum-version . "2.0")
-		     ,epg-gpg2-minimum-version)))
-	  (CMS
-	   epg-gpgsm-program
-	   ("gpgsm" . "2.0.4")))))
+        `((OpenPGP
+           epg-gpg-program
+           ;; ("gpg2" . ,epg-gpg2-minimum-version)
+           ("gpg" . ((,epg-gpg-minimum-version . "2.0")
+                     ,epg-gpg2-minimum-version)))
+          (CMS
+           epg-gpgsm-program
+           ("gpgsm" . "2.0.4")))))
 

This enables encryption for Org segments tagged :crypt:.

Another way to encrypt Org files is to save them with the extension .org.gpg. However, by default EPA always prompts for the key, which is not what I want when there is only one key to select. Hence the following advice:

(defun my/epa--select-keys-around (fun prompt keys)
@@ -3992,9 +4037,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 

This used to have org-contacts and ol-notmuch at some point, but they have since been migrated to separate repos.

(use-package org-contrib
   :straight (org-contrib
-	     :type git
-	     :repo "https://git.sr.ht/~bzg/org-contrib"
-	     :build t)
+             :type git
+             :repo "https://git.sr.ht/~bzg/org-contrib"
+             :build t)
   :after (org)
   :if (not my/remote-server)
   :config
@@ -4020,8 +4065,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :hook (org-mode . evil-org-mode)
   :config
   (add-hook 'evil-org-mode-hook
-	    (lambda ()
-	      (evil-org-set-key-theme '(navigation insert textobjects additional calendar todo))))
+            (lambda ()
+              (evil-org-set-key-theme '(navigation insert textobjects additional calendar todo))))
   (add-to-list 'evil-emacs-state-modes 'org-agenda-mode)
   (require 'evil-org-agenda)
   (evil-org-agenda-set-keys))
@@ -4038,7 +4083,13 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 

Keybindings & stuff

I’ve moved this block above because the my-leader-def expression in the next block seems to override the previous ones. So it has to be on the top.

General keybindings

-
(with-eval-after-load 'org
+
(defun my/outline-prev-or-up-heading ()
+  (interactive)
+  (if (outline-on-heading-p)
+      (outline-up-heading 1)
+    (outline-previous-visible-heading 1)))
+
+(with-eval-after-load 'org
   (general-define-key
    :keymaps 'org-mode-map
    "C-c d" #'org-decrypt-entry
@@ -4057,6 +4108,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    "M-9" #'org-previous-visible-heading
    "C-0" #'org-forward-heading-same-level
    "C-9" #'org-backward-heading-same-level
+   "(" #'my/outline-prev-or-up-heading
    "M-]" #'org-babel-next-src-block
    "M-[" #'org-babel-previous-src-block)
 
@@ -4071,9 +4123,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   "Extract URL from org-mode link and add it to kill ring."
   (interactive "P")
   (let* ((link (org-element-lineage (org-element-context) '(link) t))
-	 (type (org-element-property :type link))
-	 (url (org-element-property :path link))
-	 (url (concat type ":" url)))
+         (type (org-element-property :type link))
+         (url (org-element-property :path link))
+         (url (concat type ":" url)))
     (kill-new url)
     (message (concat "Copied URL: " url))))
 
@@ -4090,22 +4142,22 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (interactive "p")
   (let ((regexp org-babel-src-block-regexp))
     (if (< arg 0)
-	(beginning-of-line)
+        (beginning-of-line)
       (end-of-line))
     (while (and (< arg 0) (re-search-backward regexp nil :move))
       (unless (bobp)
-	(while (pcase (get-char-property-and-overlay (point) 'invisible)
-		 (`(outline . ,o)
-		  (goto-char (overlay-start o))
-		  (re-search-backward regexp nil :move))
-		 (_ nil))))
+        (while (pcase (get-char-property-and-overlay (point) 'invisible)
+                 (`(outline . ,o)
+                  (goto-char (overlay-start o))
+                  (re-search-backward regexp nil :move))
+                 (_ nil))))
       (cl-incf arg))
     (while (and (> arg 0) (re-search-forward regexp nil t))
       (while (pcase (get-char-property-and-overlay (point) 'invisible)
-	       (`(outline . ,o)
-		(goto-char (overlay-end o))
-		(re-search-forward regexp nil :move))
-	       (_ (end-of-line) nil)))
+               (`(outline . ,o)
+                (goto-char (overlay-end o))
+                (re-search-forward regexp nil :move))
+               (_ (end-of-line) nil)))
       (re-search-backward regexp nil :move)
       (cl-decf arg))
     (if (> arg 0) (goto-char (point-max)) (beginning-of-line))))
@@ -4128,18 +4180,18 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/org-file-open ()
   (interactive)
   (let* ((files
-	  (thread-last
-	    '("projects" "misc" "learning")
-	    (mapcar (lambda (f)
-		      (directory-files (concat org-directory "/" f) t (rx ".org" eos))))
-	    (apply #'append)
-	    (mapcar (lambda (file)
-		      (string-replace (concat org-directory "/") "" file)))
-	    (append
-	     '("inbox.org" "contacts.org")))))
+          (thread-last
+            '("projects" "misc" "learning")
+            (mapcar (lambda (f)
+                      (directory-files (concat org-directory "/" f) t (rx ".org" eos))))
+            (apply #'append)
+            (mapcar (lambda (file)
+                      (string-replace (concat org-directory "/") "" file)))
+            (append
+             '("inbox.org" "contacts.org" "recurring.org")))))
     (find-file
      (concat org-directory "/"
-	     (completing-read "Org file: " files)))))
+             (completing-read "Org file: " files)))))
 

UI

LaTeX fragments

A function to enable LaTeX native highlighting. Not setting this as default, because it loads LaTeX stuff.

@@ -4172,12 +4224,12 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
\\pagestyle{empty}") (setq org-preview-latex-process-alist - (mapcar - (lambda (item) - (cons - (car item) - (plist-put (cdr item) :latex-header my/latex-preview-header))) - org-preview-latex-process-alist))) + (mapcar + (lambda (item) + (cons + (car item) + (plist-put (cdr item) :latex-header my/latex-preview-header))) + org-preview-latex-process-alist)))

Better headers

org-superstar-mode is a package that makes Org heading lines look a bit prettier.

Disabled it for now because of overlapping functionality with org-bars.

@@ -4206,7 +4258,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(my/use-colors
  (org-block :background (my/color-value 'bg-other))
  (org-block-begin-line :background (my/color-value 'bg-other)
-		       :foreground (my/color-value 'grey)))
+                       :foreground (my/color-value 'grey)))
 

Hide stuff in buffer

org-appear is a package that toggles visibility of hidden elements upon entering and leaving them.

(use-package org-appear
@@ -4263,16 +4315,16 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 (defun my/org-view-html ()
   (interactive)
   (let ((elem (org-element-at-point))
-	(temp-file-path (concat my/org-view-html-tmp-dir (number-to-string (random (expt 2 32))) ".html")))
+        (temp-file-path (concat my/org-view-html-tmp-dir (number-to-string (random (expt 2 32))) ".html")))
     (cond
      ((not (eq 'export-block (car elem)))
       (message "Not in an export block!"))
      ((not (string-equal (plist-get (car (cdr elem)) :type) "HTML"))
       (message "Export block is not HTML!"))
      (t (progn
-	  (f-mkdir my/org-view-html-tmp-dir)
-	  (f-write (plist-get (car (cdr elem)) :value) 'utf-8 temp-file-path)
-	  (start-process "org-html-preview" nil "xdg-open" temp-file-path))))))
+          (f-mkdir my/org-view-html-tmp-dir)
+          (f-write (plist-get (car (cdr elem)) :value) 'utf-8 temp-file-path)
+          (start-process "org-html-preview" nil "xdg-open" temp-file-path))))))
 

PlantUML

(with-eval-after-load 'org
   (setq org-plantuml-executable-path "/home/pavel/.guix-extra-profiles/emacs/emacs/bin/plantuml")
@@ -4330,12 +4382,12 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (org-babel-jupyter-override-src-block "hy"))
 

Turn of some minor modes in source blocks.

(add-hook 'org-src-mode-hook
-	  (lambda ()
-	    ;; (hs-minor-mode -1)
-	    ;; (electric-indent-local-mode -1)
-	    ;; (rainbow-delimiters-mode -1)
-	    ;; (highlight-indent-guides-mode -1)
-	    ))
+          (lambda ()
+            ;; (hs-minor-mode -1)
+            ;; (electric-indent-local-mode -1)
+            ;; (rainbow-delimiters-mode -1)
+            ;; (highlight-indent-guides-mode -1)
+            ))
 

Async code blocks evaluations. Jupyter blocks have a built-in async, so they are set as ignored.

(use-package ob-async
   :straight t
@@ -4364,12 +4416,12 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
 (defun my/select-jupyter-kernel ()
   (let ((ports (my/get-open-ports))
-	(files (my/list-jupyter-kernel-files)))
+        (files (my/list-jupyter-kernel-files)))
     (completing-read
      "Jupyter kernels: "
      (seq-filter
       (lambda (file)
-	(member (cdr file) ports))
+        (member (cdr file) ports))
       files))))
 
 (defun my/insert-jupyter-kernel ()
@@ -4386,20 +4438,20 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   "Open Jupyter QtConsole, connected to a Jupyter kernel"
   (interactive)
   (start-process "jupyter-qtconsole" nil "setsid" "jupyter" "qtconsole" "--existing"
-		 (file-name-nondirectory (my/select-jupyter-kernel))))
+                 (file-name-nondirectory (my/select-jupyter-kernel))))
 

I’ve also noticed that there are JSON files left in the runtime folder whenever the kernel isn’t stopped correctly. So here is a cleanup function.

(defun my/jupyter-cleanup-kernels ()
   (interactive)
   (let* ((ports (my/get-open-ports))
-	 (files (my/list-jupyter-kernel-files))
-	 (to-delete (seq-filter
-		     (lambda (file)
-		       (not (member (cdr file) ports)))
-		     files)))
+         (files (my/list-jupyter-kernel-files))
+         (to-delete (seq-filter
+                     (lambda (file)
+                       (not (member (cdr file) ports)))
+                     files)))
     (when (and (length> to-delete 0)
-	       (y-or-n-p (format "Delete %d files?" (length to-delete))))
+               (y-or-n-p (format "Delete %d files?" (length to-delete))))
       (dolist (file to-delete)
-	(delete-file (car file))))))
+        (delete-file (car file))))))
 

Output post-processing

Do not wrap the output in emacs-jupyter

Emacs-jupyter has its own insertion mechanisms, which always prepends output statements with :. That is not desirable in cases where a kernel supports only plain output, e.g. calysto_hy kernel.

@@ -4432,19 +4484,19 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp

As for now, it looks sufficient to format source code outputs to get a tolerable LaTeX.

(defun my/org-caption-wrap (data &optional name caption attrs strip-drawer src-wrap)
   (let* ((data-s (if (and strip-drawer (not (string-empty-p strip-drawer)))
-		     (my/org-strip-results data)
-		   data))
-	 (drawer-start (if (string-match-p "^:RESULTS:.*" data-s) 10 0)))
+                     (my/org-strip-results data)
+                   data))
+         (drawer-start (if (string-match-p "^:RESULTS:.*" data-s) 10 0)))
     (concat
      (substring data-s 0 drawer-start)
      (and name (not (string-empty-p name)) (concat "#+NAME:" name "\n"))
      (and caption (not (string-empty-p caption)) (concat "#+CAPTION:" caption "\n"))
      (and attrs (not (string-empty-p attrs)) (concat "#+ATTR_LATEX:" attrs "\n"))
      (if (and src-wrap (not (string-empty-p src-wrap)))
-	 (concat "#+begin_src " src-wrap "\n"
-		 (substring data-s drawer-start)
-		 (when (not (string-match-p ".*\n" data-s)) "\n")
-		 "#+end_src")
+         (concat "#+begin_src " src-wrap "\n"
+                 (substring data-s drawer-start)
+                 (when (not (string-match-p ".*\n" data-s)) "\n")
+                 "#+end_src")
        (substring data-s drawer-start)))))
 

To use, add the following snippet to the org file:

#+NAME: out_wrap
@@ -4461,9 +4513,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     (save-excursion
       (goto-char beg)
       (when (looking-at org-babel-result-regexp)
-	(let ((end (org-babel-result-end))
-	      (ansi-color-context-region nil))
-	  (ansi-color-apply-on-region beg end))))))
+        (let ((end (org-babel-result-end))
+              (ansi-color-context-region nil))
+          (ansi-color-apply-on-region beg end))))))
 
 (define-minor-mode org-babel-ansi-colors-mode
   "Apply ANSI color codes to Org Babel results."
@@ -4481,11 +4533,11 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (let ((point (point)))
     (org-save-outline-visibility t
       (org-babel-map-executables nil
-	(when (>= (point) point)
-	  (if (memq (org-element-type (org-element-context))
-		    '(babel-call inline-babel-call))
-	      (org-babel-lob-execute-maybe)
-	    (org-babel-execute-src-block arg)))))))
+        (when (>= (point) point)
+          (if (memq (org-element-type (org-element-context))
+                    '(babel-call inline-babel-call))
+              (org-babel-lob-execute-maybe)
+            (org-babel-execute-src-block arg)))))))
 
 (defun my/org-babel-execute-buffer-above (&optional arg)
   (interactive "P")
@@ -4493,34 +4545,34 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (let ((point (point)))
     (org-save-outline-visibility t
       (org-babel-map-executables nil
-	(when (<= (point) point)
-	  (if (memq (org-element-type (org-element-context))
-		    '(babel-call inline-babel-call))
-	      (org-babel-lob-execute-maybe)
-	    (org-babel-execute-src-block arg)))))))
+        (when (<= (point) point)
+          (if (memq (org-element-type (org-element-context))
+                    '(babel-call inline-babel-call))
+              (org-babel-lob-execute-maybe)
+            (org-babel-execute-src-block arg)))))))
 

Execute all code blocks marked with :startup t:

(defun my/org-babel-execute-marked (&optional arg)
   (interactive "P")
   (let (markers)
     (org-element-map (org-element-parse-buffer) 'src-block
       (lambda (elem)
-	(let ((params (org-element-property :parameters elem)))
-	  (when (and params
-		     (string-match-p (rx "startup t") params))
-	    (let ((m (make-marker)))
-	      (set-marker m (org-element-property :begin elem))
-	      (set-marker-insertion-type m t)
-	      (push m markers))))))
+        (let ((params (org-element-property :parameters elem)))
+          (when (and params
+                     (string-match-p (rx "startup t") params))
+            (let ((m (make-marker)))
+              (set-marker m (org-element-property :begin elem))
+              (set-marker-insertion-type m t)
+              (push m markers))))))
     (setq markers (nreverse markers))
     (when arg
       (setq markers
-	    (seq-filter
-	     (lambda (m) (> (marker-position m) (point)))
-	     markers)))
+            (seq-filter
+             (lambda (m) (> (marker-position m) (point)))
+             markers)))
     (dolist (m markers)
       (goto-char m)
       (ignore-errors
-	(org-babel-execute-src-block)))))
+        (org-babel-execute-src-block)))))
 

Some keybindings:

(with-eval-after-load 'org
   (general-define-key
@@ -4570,36 +4622,36 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    "<next>" 'my/present-next-with-latex
    "<prior>" 'my/present-prev-with-latex)
   (setq org-present-mode-hook
-	(list (lambda ()
-		(blink-cursor-mode 0)
-		(org-present-big)
-		(org-bars-mode -1)
-		;; (org-display-inline-images)
-		(org-present-hide-cursor)
-		(org-present-read-only)
-		(display-line-numbers-mode 0)
-		(hide-mode-line-mode +1)
-		(setq-local org-format-latex-options
-			    (plist-put org-format-latex-options
-				       :scale (* org-present-text-scale my/org-latex-scale 0.5)))
-		;; (org-latex-preview '(16))
-		;; TODO ^somehow this stucks at running LaTeX^
-		(setq-local olivetti-body-width 60)
-		(olivetti-mode 1))))
+        (list (lambda ()
+                (blink-cursor-mode 0)
+                (org-present-big)
+                (org-bars-mode -1)
+                ;; (org-display-inline-images)
+                (org-present-hide-cursor)
+                (org-present-read-only)
+                (display-line-numbers-mode 0)
+                (hide-mode-line-mode +1)
+                (setq-local org-format-latex-options
+                            (plist-put org-format-latex-options
+                                       :scale (* org-present-text-scale my/org-latex-scale 0.5)))
+                ;; (org-latex-preview '(16))
+                ;; TODO ^somehow this stucks at running LaTeX^
+                (setq-local olivetti-body-width 60)
+                (olivetti-mode 1))))
   (setq org-present-mode-quit-hook
-	(list (lambda ()
-		(blink-cursor-mode 1)
-		(org-present-small)
-		(org-bars-mode 1)
-		;; (org-remove-inline-images)
-		(org-present-show-cursor)
-		(org-present-read-write)
-		(display-line-numbers-mode 1)
-		(hide-mode-line-mode 0)
-		(setq-local org-format-latex-options (plist-put org-format-latex-options :scale my/org-latex-scale))
-		(org-latex-preview '(64))
-		(olivetti-mode -1)
-		(setq-local olivetti-body-width (default-value 'olivetti-body-width))))))
+        (list (lambda ()
+                (blink-cursor-mode 1)
+                (org-present-small)
+                (org-bars-mode 1)
+                ;; (org-remove-inline-images)
+                (org-present-show-cursor)
+                (org-present-read-write)
+                (display-line-numbers-mode 1)
+                (hide-mode-line-mode 0)
+                (setq-local org-format-latex-options (plist-put org-format-latex-options :scale my/org-latex-scale))
+                (org-latex-preview '(64))
+                (olivetti-mode -1)
+                (setq-local olivetti-body-width (default-value 'olivetti-body-width))))))
 

TOC

Make a TOC inside the org file.

References:

@@ -4620,7 +4672,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp

A nice package to make screenshots and insert them to the Org document.

(use-package org-attach-screenshot
   :commands (org-attach-screenshot)
-  :straight t)
+  :straight t
+  :config
+  (setq org-attach-screenshot-auto-refresh 'never))
 

Transclusion

A package that implements transclusions in Org Mode, i.e. rendering part of one file inside another file.

(use-package org-transclusion
@@ -4655,14 +4709,14 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (org-table-map-tables
    (lambda ()
      (when-let
-	 (name
-	  (plist-get (cadr (org-element-at-point)) :name))
+         (name
+          (plist-get (cadr (org-element-at-point)) :name))
        (org-table-export
-	(concat
-	 (file-name-directory
-	  (buffer-file-name))
-	 name ".csv")
-	"orgtbl-to-csv")))))
+        (concat
+         (file-name-directory
+          (buffer-file-name))
+         name ".csv")
+        "orgtbl-to-csv")))))
 

Partial scrolling

(use-package phscroll
   :straight (:host github :repo "misohena/phscroll")
@@ -4694,31 +4748,31 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/update-org-agenda ()
   (interactive)
   (let ((project-files
-	 (when (file-directory-p (concat org-directory "/projects"))
-	   (thread-last "/projects"
-			(concat org-directory)
-			(directory-files)
-			(mapcar (lambda (f)
-				  (concat
-				   org-directory "/projects/" f)))
-			(seq-filter (lambda (f)
-				      (not (file-directory-p f))))))))
+         (when (file-directory-p (concat org-directory "/projects"))
+           (thread-last "/projects"
+                        (concat org-directory)
+                        (directory-files)
+                        (mapcar (lambda (f)
+                                  (concat
+                                   org-directory "/projects/" f)))
+                        (seq-filter (lambda (f)
+                                      (not (file-directory-p f))))))))
     (setq org-agenda-files
-	  (seq-filter #'file-exists-p
-		      (append
-		       project-files
-		       (mapcar (lambda (f)
-				 (concat org-directory "/" f))
-			       '("inbox.org"
-				 "misc/habit.org"
-				 "contacts.org")))))
+          (seq-filter #'file-exists-p
+                      (append
+                       project-files
+                       (mapcar (lambda (f)
+                                 (concat org-directory "/" f))
+                               '("inbox.org"
+                                 "misc/habit.org"
+                                 "contacts.org")))))
     (setq org-refile-targets
-	  `(,@(mapcar
-	       (lambda (f) `(,f . (:tag . "refile")))
-	       project-files)
-	    ,@(mapcar
-	       (lambda (f) `(,f . (:regexp . "Tasks")))
-	       project-files)))
+          `(,@(mapcar
+               (lambda (f) `(,f . (:tag . "refile")))
+               project-files)
+            ,@(mapcar
+               (lambda (f) `(,f . (:regexp . "Tasks")))
+               project-files)))
     (when (file-exists-p (concat org-directory "/scripts/refile.el"))
       (load-file (concat org-directory "/scripts/refile.el"))
       (run-hooks 'my/org-refile-hooks))))
@@ -4741,27 +4795,27 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    (format-time-string "%Y%m%d%H%M%S")
    (let ((note-name (read-string "Note name: ")))
      (if (not (string-empty-p note-name))
-	 (string-replace " " "-" (concat "-" (downcase note-name)))
+         (string-replace " " "-" (concat "-" (downcase note-name)))
        ""))))
 
 (setq org-capture-templates
       `(("i" "Inbox" entry  (file "inbox.org")
-	 ,(concat "* TODO %?\n"
-		  "/Entered on/ %U"))
-	("e" "email" entry (file "inbox.org")
-	 ,(concat "* TODO %:from %:subject \n"
-		  "/Entered on/ %U\n"
-		  "/Received on/ %:date-timestamp-inactive\n"
-		  "%a\n"))
-	("f" "elfeed" entry (file "inbox.org")
-	 ,(concat "* TODO %:elfeed-entry-title\n"
-		  "/Entered on/ %U\n"
-		  "%a\n"))
-	("n" "note" plain (file my/generate-inbox-note-name)
-	 ,(concat "#+TODO: PROCESSED(p)\n"
-		  "\n"
-		  "* %?\n"
-		  "/Entered on/ %U"))))
+         ,(concat "* TODO %?\n"
+                  "/Entered on/ %U"))
+        ("e" "email" entry (file "inbox.org")
+         ,(concat "* TODO %:from %:subject \n"
+                  "/Entered on/ %U\n"
+                  "/Received on/ %:date-timestamp-inactive\n"
+                  "%a\n"))
+        ("f" "elfeed" entry (file "inbox.org")
+         ,(concat "* TODO %:elfeed-entry-title\n"
+                  "/Entered on/ %U\n"
+                  "%a\n"))
+        ("n" "note" plain (file my/generate-inbox-note-name)
+         ,(concat "#+TODO: PROCESSED(p)\n"
+                  "\n"
+                  "* %?\n"
+                  "/Entered on/ %U"))))
 
org-clock & org-clock-agg

org-clock allows for tracking time spent in Org entries. org-clock-agg is my package for creating reports from org-clock records.

It’s been somewhat complicated to integrate into my workflow, but I think it’s been worth it because I can now create reports for:

@@ -4784,16 +4838,16 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(setq org-clock-agg-node-title-width-delta 47) (push (cons "Agenda+Archive" - (append - (org-agenda-files) - (thread-last "/projects/archive" - (concat org-directory) - (directory-files) - (mapcar (lambda (f) - (concat - org-directory "/projects/archive/" f))) - (seq-filter (lambda (f) - (not (file-directory-p f))))))) + (append + (org-agenda-files) + (thread-last "/projects/archive" + (concat org-directory) + (directory-files) + (mapcar (lambda (f) + (concat + org-directory "/projects/archive/" f))) + (seq-filter (lambda (f) + (not (file-directory-p f))))))) org-clock-agg-files-preset))

The following enables org-clock persistence between Emacs sessions.

(with-eval-after-load 'org
@@ -4811,24 +4865,24 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/org-clock-in--fix-mode-line ()
   (when (memq 'org-mode-line-string global-mode-string)
     (let (new-global-mode-string
-	  appended
-	  (is-first t))
+          appended
+          (is-first t))
       (dolist (item global-mode-string)
-	(cond
-	 ((or (equal item '(:eval (exwm-modeline-segment)))
-	      (equal item '(:eval (persp-mode-line))))
-	  (unless appended
-	    (when is-first
-	      (push "" new-global-mode-string))
-	    (push 'org-mode-line-string new-global-mode-string)
-	    (setq appended t))
-	  (push item new-global-mode-string))
-	 ((equal item 'org-mode-line-string))
-	 (t
-	  (push item new-global-mode-string)))
-	(setq is-first nil))
+        (cond
+         ((or (equal item '(:eval (exwm-modeline-segment)))
+              (equal item '(:eval (persp-mode-line))))
+          (unless appended
+            (when is-first
+              (push "" new-global-mode-string))
+            (push 'org-mode-line-string new-global-mode-string)
+            (setq appended t))
+          (push item new-global-mode-string))
+         ((equal item 'org-mode-line-string))
+         (t
+          (push item new-global-mode-string)))
+        (setq is-first nil))
       (unless appended
-	(push 'org-mode-line-string new-global-mode-string))
+        (push 'org-mode-line-string new-global-mode-string))
       (setq global-mode-string (nreverse new-global-mode-string)))))
 
 (add-hook 'org-clock-in-hook #'my/org-clock-in--fix-mode-line)
@@ -4854,9 +4908,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/org-clock-get-total-minutes-at-point ()
   "Get total clocked time for heading at point."
   (let* ((element (org-element-at-point-no-context))
-	 (s (buffer-substring-no-properties
-	     (org-element-property :begin element)
-	     (org-element-property :end element))))
+         (s (buffer-substring-no-properties
+             (org-element-property :begin element)
+             (org-element-property :end element))))
     (with-temp-buffer
       (insert s)
       (org-clock-sum)
@@ -4883,18 +4937,18 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/org-clock-recent ()
   (interactive)
   (let* ((entries (org-ql-query
-		    :select #'element-with-markers
-		    :from (org-agenda-files)
-		    :where '(clocked :from -1)))
-	 (entries-data (mapcar (lambda (e)
-				 (cons (org-element-property :raw-value e) e))
-			       entries)))
+                    :select #'element-with-markers
+                    :from (org-agenda-files)
+                    :where '(clocked :from -1)))
+         (entries-data (mapcar (lambda (e)
+                                 (cons (org-element-property :raw-value e) e))
+                               entries)))
     (unless entries
       (user-error "No recently clocked entries!"))
     entries-data
     (let* ((entry (alist-get (completing-read "Entry: " entries-data)
-			     entries-data nil nil #'equal))
-	   (marker (org-element-property :org-marker entry)))
+                             entries-data nil nil #'equal))
+           (marker (org-element-property :org-marker entry)))
       (pop-to-buffer-same-window (marker-buffer marker))
       (goto-char marker))))
 
@@ -4907,17 +4961,17 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/org-fix-task-kind ()
   (interactive)
   (let ((entries (org-ql-query
-		   :select #'element-with-markers
-		   :from (current-buffer)
-		   :where '(and (olp "Tasks")
-				(not (property "TASK_KIND"))
-				(clocked)))))
+                   :select #'element-with-markers
+                   :from (current-buffer)
+                   :where '(and (olp "Tasks")
+                                (not (property "TASK_KIND"))
+                                (clocked)))))
     (org-fold-show-all)
     (dolist (entry entries)
       (let ((marker (org-element-property :org-marker entry)))
-	(org-with-point-at marker
-	  (let ((value (org-read-property-value "TASK_KIND")))
-	    (org-set-property "TASK_KIND" value)))))))
+        (org-with-point-at marker
+          (let ((value (org-read-property-value "TASK_KIND")))
+            (org-set-property "TASK_KIND" value)))))))
 
org-super-agenda

org-super-agenda is alphapapa’s extension to group items in org-agenda. I don’t use it instead of the standard agenda, but org-ql uses it for some of its views.

(use-package org-super-agenda
@@ -4936,8 +4990,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     (org-super-agenda--when-with-marker-buffer (org-super-agenda--get-marker item)
       ;; org-ql depends on f and s anyway
       (s-join "/" (cons
-		   (f-filename (buffer-file-name))
-		   (org-get-outline-path))))))
+                   (f-filename (buffer-file-name))
+                   (org-get-outline-path))))))
 

It doesn’t look great with org-bars mode, so…

(defun my/org-super-agenda--make-agenda-header-around (fun name)
   (remove-text-properties 0 (length name) '(line-prefix nil) name)
@@ -4957,8 +5011,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :init
   ;; See https://github.com/alphapapa/org-ql/pull/237
   (setq org-ql-regexp-part-ts-time
-	(rx " " (repeat 1 2 digit) ":" (repeat 2 digit)
-	    (optional "-" (repeat 1 2 digit) ":" (repeat 2 digit))))
+        (rx " " (repeat 1 2 digit) ":" (repeat 2 digit)
+            (optional "-" (repeat 1 2 digit) ":" (repeat 2 digit))))
   (my-leader-def
     :infix "o"
     "v" #'org-ql-view
@@ -4967,23 +5021,23 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 

I just want to change the default grouping in org-ql-view-recent-items

(cl-defun my/org-ql-view-recent-items
     (&key num-days (type 'ts)
-	  (files (org-agenda-files))
-	  (groups '((:auto-outline-path-file t)
-		    (:auto-todo t))))
+          (files (org-agenda-files))
+          (groups '((:auto-outline-path-file t)
+                    (:auto-todo t))))
   "Show items in FILES from last NUM-DAYS days with timestamps of TYPE.
 TYPE may be `ts', `ts-active', `ts-inactive', `clocked', or
 `closed'."
   (interactive (list :num-days (read-number "Days: ")
-		     :type (->> '(ts ts-active ts-inactive clocked closed)
-				(completing-read "Timestamp type: ")
-				intern)))
+                     :type (->> '(ts ts-active ts-inactive clocked closed)
+                                (completing-read "Timestamp type: ")
+                                intern)))
   ;; It doesn't make much sense to use other date-based selectors to
   ;; look into the past, so to prevent confusion, we won't allow them.
   (-let* ((query (pcase-exhaustive type
-		   ((or 'ts 'ts-active 'ts-inactive)
-		    `(,type :from ,(- num-days) :to 0))
-		   ((or 'clocked 'closed)
-		    `(,type :from ,(- num-days) :to 0)))))
+                   ((or 'ts 'ts-active 'ts-inactive)
+                    `(,type :from ,(- num-days) :to 0))
+                   ((or 'clocked 'closed)
+                    `(,type :from ,(- num-days) :to 0)))))
     (org-ql-search files query
       :title "Recent items"
       :sort '(todo priority date)
@@ -4994,19 +5048,19 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (interactive)
   ;; The hack I borrowed from notmuch to make " " a separator
   (let* ((crm-separator " ")
-	 (crm-local-completion-map
-	  (let ((map (make-sparse-keymap)))
-	    (set-keymap-parent map crm-local-completion-map)
-	    (define-key map " " 'self-insert-command)
-	    map))
-	 (vertico-sort-function nil)
-	 (categories (completing-read-multiple
-		      "Categories: "
-		      '("TEACH" "EDU" "JOB" "LIFE" "COMP"))))
+         (crm-local-completion-map
+          (let ((map (make-sparse-keymap)))
+            (set-keymap-parent map crm-local-completion-map)
+            (define-key map " " 'self-insert-command)
+            map))
+         (vertico-sort-function nil)
+         (categories (completing-read-multiple
+                      "Categories: "
+                      '("TEACH" "EDU" "JOB" "LIFE" "COMP"))))
     (org-ql-search (org-agenda-files)
       `(and (todo)
-	    ,@(unless (seq-empty-p categories)
-		`((category ,@categories))))
+            ,@(unless (seq-empty-p categories)
+                `((category ,@categories))))
       :sort '(priority todo deadline)
       :super-groups '((:auto-outline-path-file t)))))
 
Items clocked or closed today
@@ -5014,58 +5068,58 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(defun my/org-ql-clocked-today ()
   (interactive)
   (let ((today (format-time-string
-		"%Y-%m-%d"
-		(days-to-time
-		 (- (org-today) (time-to-days 0))))))
+                "%Y-%m-%d"
+                (days-to-time
+                 (- (org-today) (time-to-days 0))))))
     (org-ql-search (org-agenda-files) `(clocked :from ,today)
       :title "Clocked today"
       :sort '(todo priority date)
       :super-groups '((:auto-outline-path-file t)
-		      (:auto-todo t)))))
+                      (:auto-todo t)))))
 
(defun my/org-ql-closed-today ()
   (interactive)
   (let ((today (format-time-string
-		"%Y-%m-%d"
-		(days-to-time
-		 (- (org-today) (time-to-days 0))))))
+                "%Y-%m-%d"
+                (days-to-time
+                 (- (org-today) (time-to-days 0))))))
     (org-ql-search (org-agenda-files) `(closed :from ,today)
       :title "Closed today"
       :sort '(todo priority date)
       :super-groups '((:auto-outline-path-file t)
-		      (:auto-todo t)))))
+                      (:auto-todo t)))))
 
Configuring views

Putting all the above in org-ql-views.

(setq org-ql-views
       (list
        (cons "Overview: All TODO" #'my/org-ql-all-todo)
        (cons "Review: Stale tasks"
-	     (list :buffers-files #'org-agenda-files
-		   :query '(and (todo)
-				(not (tags "nots"))
-				(not (ts :from -14)))
-		   :title "Review: Stale tasks"
-		   :sort '(todo priority date)
-		   :super-groups '((:auto-outline-path-file t))))
+             (list :buffers-files #'org-agenda-files
+                   :query '(and (todo)
+                                (not (tags "nots"))
+                                (not (ts :from -14)))
+                   :title "Review: Stale tasks"
+                   :sort '(todo priority date)
+                   :super-groups '((:auto-outline-path-file t))))
        (cons "Review: Unclocked tasks"
-	     (list :buffers-files #'org-agenda-files
-		   :query '(and (done)
-				(ts :from -14)
-				(not (clocked))
-				(not (tags "nots")))
-		   :title "Review: Unclocked tasks"
-		   :sort '(todo priority date)
-		   :super-groups '((:auto-outline-path-file t))))
+             (list :buffers-files #'org-agenda-files
+                   :query '(and (done)
+                                (ts :from -14)
+                                (not (clocked))
+                                (not (tags "nots")))
+                   :title "Review: Unclocked tasks"
+                   :sort '(todo priority date)
+                   :super-groups '((:auto-outline-path-file t))))
        (cons "Review: Recently timestamped" #'my/org-ql-view-recent-items)
        (cons "Review: Clocked today" #'my/org-ql-clocked-today)
        (cons "Review: Closed today" #'my/org-ql-closed-today)
        (cons "Fix: tasks without TASK_KIND"
-	     (lambda ()
-	       (interactive)
-	       (org-ql-search (current-buffer)
-		 '(and (olp "Tasks")
-		       (not (property "TASK_KIND"))
-		       (clocked))
-		 :super-groups '((:auto-outline-path-file t)))))))
+             (lambda ()
+               (interactive)
+               (org-ql-search (current-buffer)
+                 '(and (olp "Tasks")
+                       (not (property "TASK_KIND"))
+                       (clocked))
+                 :super-groups '((:auto-outline-path-file t)))))))
 
Custom format element

Changing the default org-ql-view--format-element to include effort estimation and the clocked time. I wish it were more configurable out-of-the-box.

(defun my/org-ql-view--format-element-override (element)
@@ -5077,60 +5131,60 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
       ""
     (setf element (org-ql-view--resolve-element-properties element))
     (let* ((properties (cadr element))
-	   (properties (cl-loop for (key val) on properties by #'cddr
-				for symbol = (intern (cl-subseq (symbol-name key) 1))
-				unless (member symbol '(parent))
-				append (list symbol val)))
-	   (title (--> (org-ql-view--add-faces element)
-		       (org-element-property :raw-value it)
-		       (org-link-display-format it)))
-	   (todo-keyword (-some--> (org-element-property :todo-keyword element)
-			   (org-ql-view--add-todo-face it)))
-	   (tag-list (if org-use-tag-inheritance
-			 (if-let ((marker (or (org-element-property :org-hd-marker element)
-					      (org-element-property :org-marker element))))
-			     (with-current-buffer (marker-buffer marker)
-			       (org-with-wide-buffer
-				(goto-char marker)
-				(cl-loop for type in (org-ql--tags-at marker)
-					 unless (or (eq 'org-ql-nil type)
-						    (not type))
-					 append type)))
-			   (display-warning 'org-ql (format "No marker found for item: %s" title))
-			   (org-element-property :tags element))
-		       (org-element-property :tags element)))
-	   (tag-string (when tag-list
-			 (--> tag-list
-			      (s-join ":" it)
-			      (s-wrap it ":")
-			      (org-add-props it nil 'face 'org-tag))))
-	   ;;  (category (org-element-property :category element))
-	   (priority-string (-some->> (org-element-property :priority element)
-			      (char-to-string)
-			      (format "[#%s]")
-			      (org-ql-view--add-priority-face)))
-	   (clock-string (let ((effort (org-element-property :EFFORT element))
-			       (clocked (org-element-property my/org-clock-total-prop element)))
-			   (cond
-			    ((and clocked effort) (format "[%s/%s]" clocked effort))
-			    ((and clocked (not effort) (format "[%s]" clocked)))
-			    ((and (not clocked) effort) (format "[EST: %s]" effort)))))
-	   (habit-property (org-with-point-at (or (org-element-property :org-hd-marker element)
-						  (org-element-property :org-marker element))
-			     (when (org-is-habit-p)
-			       (org-habit-parse-todo))))
-	   (due-string (pcase (org-element-property :relative-due-date element)
-			 ('nil "")
-			 (string (format " %s " (org-add-props string nil 'face 'org-ql-view-due-date)))))
-	   (string (s-join " " (-non-nil (list todo-keyword priority-string title due-string clock-string tag-string)))))
+           (properties (cl-loop for (key val) on properties by #'cddr
+                                for symbol = (intern (cl-subseq (symbol-name key) 1))
+                                unless (member symbol '(parent))
+                                append (list symbol val)))
+           (title (--> (org-ql-view--add-faces element)
+                       (org-element-property :raw-value it)
+                       (org-link-display-format it)))
+           (todo-keyword (-some--> (org-element-property :todo-keyword element)
+                           (org-ql-view--add-todo-face it)))
+           (tag-list (if org-use-tag-inheritance
+                         (if-let ((marker (or (org-element-property :org-hd-marker element)
+                                              (org-element-property :org-marker element))))
+                             (with-current-buffer (marker-buffer marker)
+                               (org-with-wide-buffer
+                                (goto-char marker)
+                                (cl-loop for type in (org-ql--tags-at marker)
+                                         unless (or (eq 'org-ql-nil type)
+                                                    (not type))
+                                         append type)))
+                           (display-warning 'org-ql (format "No marker found for item: %s" title))
+                           (org-element-property :tags element))
+                       (org-element-property :tags element)))
+           (tag-string (when tag-list
+                         (--> tag-list
+                              (s-join ":" it)
+                              (s-wrap it ":")
+                              (org-add-props it nil 'face 'org-tag))))
+           ;;  (category (org-element-property :category element))
+           (priority-string (-some->> (org-element-property :priority element)
+                              (char-to-string)
+                              (format "[#%s]")
+                              (org-ql-view--add-priority-face)))
+           (clock-string (let ((effort (org-element-property :EFFORT element))
+                               (clocked (org-element-property my/org-clock-total-prop element)))
+                           (cond
+                            ((and clocked effort) (format "[%s/%s]" clocked effort))
+                            ((and clocked (not effort) (format "[%s]" clocked)))
+                            ((and (not clocked) effort) (format "[EST: %s]" effort)))))
+           (habit-property (org-with-point-at (or (org-element-property :org-hd-marker element)
+                                                  (org-element-property :org-marker element))
+                             (when (org-is-habit-p)
+                               (org-habit-parse-todo))))
+           (due-string (pcase (org-element-property :relative-due-date element)
+                         ('nil "")
+                         (string (format " %s " (org-add-props string nil 'face 'org-ql-view-due-date)))))
+           (string (s-join " " (-non-nil (list todo-keyword priority-string title due-string clock-string tag-string)))))
       (remove-list-of-text-properties 0 (length string) '(line-prefix) string)
       (--> string
-	   (concat "  " it)
-	   (org-add-props it properties
-	     'org-agenda-type 'search
-	     'todo-state todo-keyword
-	     'tags tag-list
-	     'org-habit-p habit-property)))))
+           (concat "  " it)
+           (org-add-props it properties
+             'org-agenda-type 'search
+             'todo-state todo-keyword
+             'tags tag-list
+             'org-habit-p habit-property)))))
 
 (with-eval-after-load 'org-ql
   (advice-add #'org-ql-view--format-element :override #'my/org-ql-view--format-element-override))
@@ -5166,9 +5220,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 Here MATCH is a match string of the same format used by
 `org-tags-view'."
   (funcall (cdr (org-make-tags-matcher match))
-	   (org-get-todo-state)
-	   (org-get-tags-at)
-	   (org-reduced-level (org-current-level))))
+           (org-get-todo-state)
+           (org-get-tags-at)
+           (org-reduced-level (org-current-level))))
 
 (defun my/org-agenda-skip-without-match (match)
   "Skip current headline unless it matches MATCH.
@@ -5183,32 +5237,32 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (save-excursion
     (unless (org-at-heading-p) (org-back-to-heading))
     (let ((next-headline (save-excursion
-			   (or (outline-next-heading) (point-max)))))
+                           (or (outline-next-heading) (point-max)))))
       (if (my/org-match-at-point-p match) nil next-headline))))
 

And the agendas themselves:

(defun my/org-scheduled-get-time ()
   (let ((scheduled (org-get-scheduled-time (point))))
     (if scheduled
-	(format-time-string "%Y-%m-%d" scheduled)
+        (format-time-string "%Y-%m-%d" scheduled)
       "")))
 
 (setq org-agenda-hide-tags-regexp (rx (or "org" "refile" "proj" "habit")))
 
 (setq org-agenda-custom-commands
       `(("p" "My outline"
-	 ((agenda "" ((org-agenda-skip-function '(my/org-agenda-skip-without-match "-habit"))))
-	  (tags-todo "inbox"
-		     ((org-agenda-overriding-header "Inbox")
-		      (org-agenda-prefix-format " %i %-12:c")
-		      (org-agenda-hide-tags-regexp ".")))
-	  (tags-todo "+waitlist+SCHEDULED<=\"<+14d>\""
-		     ((org-agenda-overriding-header "Waitlist")
-		      (org-agenda-hide-tags-regexp "waitlist")
-		      (org-agenda-prefix-format " %i %-12:c %-12(my/org-scheduled-get-time)")))
-	  (tags-todo "habit+SCHEDULED<=\"<+0d>\""
-		     ((org-agenda-overriding-header "Habits")
-		      (org-agenda-prefix-format " %i %-12:c")
-		      (org-agenda-hide-tags-regexp ".")))))))
+         ((agenda "" ((org-agenda-skip-function '(my/org-agenda-skip-without-match "-habit"))))
+          (tags-todo "inbox"
+                     ((org-agenda-overriding-header "Inbox")
+                      (org-agenda-prefix-format " %i %-12:c")
+                      (org-agenda-hide-tags-regexp ".")))
+          (tags-todo "+waitlist+SCHEDULED<=\"<+14d>\""
+                     ((org-agenda-overriding-header "Waitlist")
+                      (org-agenda-hide-tags-regexp "waitlist")
+                      (org-agenda-prefix-format " %i %-12:c %-12(my/org-scheduled-get-time)")))
+          (tags-todo "habit+SCHEDULED<=\"<+0d>\""
+                     ((org-agenda-overriding-header "Habits")
+                      (org-agenda-prefix-format " %i %-12:c")
+                      (org-agenda-hide-tags-regexp ".")))))))
 
Alerts
  • Me at 10:00: Open Org Agenga oh, there’s a meeting at 15:00
  • @@ -5237,18 +5291,18 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp (defun my/org-alert--is-scheduled (label time) "Check if LABEL is scheduled to be shown an TIME." (gethash (cons label time) - my/org-alert--alerts nil)) + my/org-alert--alerts nil)) (defun my/org-alert--schedule (label time) "Schedule LABEL to be shown at TIME, unless it's already scheduled." (unless (my/org-alert--is-scheduled label time) (puthash (cons label time) - (run-at-time time - nil - (lambda () - (alert label - :title "PROXIMITY ALERT"))) - my/org-alert--alerts))) + (run-at-time time + nil + (lambda () + (alert label + :title "PROXIMITY ALERT"))) + my/org-alert--alerts)))

And unschedule items that need to be unscheduled:

(defun my/org-alert-cleanup (&optional keys)
   "Unschedule items that do not appear in KEYS.
@@ -5256,44 +5310,44 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 KEYS is a list of cons cells like (<label> . <time>)."
   (let ((existing-hash (make-hash-table :test #'equal)))
     (cl-loop for key in keys
-	     do (puthash key t existing-hash))
+             do (puthash key t existing-hash))
     (cl-loop for key being the hash-keys of my/org-alert--alerts
-	     unless (gethash key existing-hash)
-	     do (progn
-		  (cancel-timer (gethash key my/org-alert--alerts))
-		  (remhash key my/org-alert--alerts)))))
+             unless (gethash key existing-hash)
+             do (progn
+                  (cancel-timer (gethash key my/org-alert--alerts))
+                  (remhash key my/org-alert--alerts)))))
 

And a function to extract the required items with org-ql-query and schedule them:

(defun my/org-alert--update-today-alerts ()
   (when-let* ((files (org-agenda-files))
-	      (items
-	       (org-ql-query
-		 :select 'element
-		 :from files
-		 :where `(and
-			  (todo "FUTURE")
-			  (ts-active :from ,(format-time-string "%Y-%m-%d %H:%M")
-				     :to ,(format-time-string
-					   "%Y-%m-%d"
-					   (time-add
-					    (current-time)
-					    (* 60 60 24)))
-				     :with-time t))
-		 :order-by 'date)))
+              (items
+               (org-ql-query
+                 :select 'element
+                 :from files
+                 :where `(and
+                          (todo "FUTURE")
+                          (ts-active :from ,(format-time-string "%Y-%m-%d %H:%M")
+                                     :to ,(format-time-string
+                                           "%Y-%m-%d"
+                                           (time-add
+                                            (current-time)
+                                            (* 60 60 24)))
+                                     :with-time t))
+                 :order-by 'date)))
     (let (scheduled-keys)
       (cl-loop
        for item in items
        for scheduled = (org-timestamp-to-time (org-element-property :scheduled item))
        do (cl-loop
-	   for before-time in my/org-alert-notify-times
-	   for label = (format "%s at %s [%s min. remaining]"
-			       (org-element-property :raw-value item)
-			       (format-time-string "%H:%M" scheduled)
-			       (number-to-string (/ before-time 60)))
-	   for time = (time-convert
-		       (+ (time-convert scheduled 'integer) (- before-time)))
-	   do (progn
-		(my/org-alert--schedule label time)
-		(push (cons label time) scheduled-keys))))
+           for before-time in my/org-alert-notify-times
+           for label = (format "%s at %s [%s min. remaining]"
+                               (org-element-property :raw-value item)
+                               (format-time-string "%H:%M" scheduled)
+                               (number-to-string (/ before-time 60)))
+           for time = (time-convert
+                       (+ (time-convert scheduled 'integer) (- before-time)))
+           do (progn
+                (my/org-alert--schedule label time)
+                (push (cons label time) scheduled-keys))))
       (my/org-alert-cleanup scheduled-keys))))
 

Let’s wrap it into a minor mode:

(setq my/org-alert--timer nil)
@@ -5303,11 +5357,11 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :after-hook
   (if my/org-alert-mode
       (progn
-	(my/org-alert--update-today-alerts)
-	(when (timerp my/org-alert--timer)
-	  (cancel-timer my/org-alert--timer))
-	(setq my/org-alert--timer
-	      (run-at-time 600 t #'my/org-alert--update-today-alerts)))
+        (my/org-alert--update-today-alerts)
+        (when (timerp my/org-alert--timer)
+          (cancel-timer my/org-alert--timer))
+        (setq my/org-alert--timer
+              (run-at-time 600 t #'my/org-alert--update-today-alerts)))
     (when (timerp my/org-alert--timer)
       (cancel-timer my/org-alert--timer))
     (my/org-alert-cleanup)))
@@ -5331,82 +5385,82 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (unless (wholenump n) (user-error "Invalid number of replications %s" n))
   (when (org-before-first-heading-p) (user-error "No subtree to clone"))
   (let* ((beg (save-excursion (org-back-to-heading t) (point)))
-	 (end-of-tree (save-excursion (org-end-of-subtree t t) (point)))
-	 (shift
-	  (or shift
-	      (if (and (not (equal current-prefix-arg '(4)))
-		       (save-excursion
-			 (goto-char beg)
-			 (re-search-forward org-ts-regexp-both end-of-tree t)))
-		  (read-from-minibuffer
-		   "Date shift per clone (e.g. +1w, empty to copy unchanged): ")
-		"")))                   ;No time shift
-	 (doshift
-	  (and (org-string-nw-p shift)
-	       (or (string-match "\\`[ \t]*\\([+-]?[0-9]+\\)\\([hdwmy]\\)[ \t]*\\'"
-				 shift)
-		   (user-error "Invalid shift specification %s" shift)))))
+         (end-of-tree (save-excursion (org-end-of-subtree t t) (point)))
+         (shift
+          (or shift
+              (if (and (not (equal current-prefix-arg '(4)))
+                       (save-excursion
+                         (goto-char beg)
+                         (re-search-forward org-ts-regexp-both end-of-tree t)))
+                  (read-from-minibuffer
+                   "Date shift per clone (e.g. +1w, empty to copy unchanged): ")
+                "")))                   ;No time shift
+         (doshift
+          (and (org-string-nw-p shift)
+               (or (string-match "\\`[ \t]*\\([+-]?[0-9]+\\)\\([hdwmy]\\)[ \t]*\\'"
+                                 shift)
+                   (user-error "Invalid shift specification %s" shift)))))
     (goto-char end-of-tree)
     (unless (bolp) (insert "\n"))
     (let* ((end (point))
-	   (template (buffer-substring beg end))
-	   (shift-n (and doshift (string-to-number (match-string 1 shift))))
-	   (shift-what (pcase (and doshift (match-string 2 shift))
-			 (`nil nil)
-			 ("h" 'hour)
-			 ("d" 'day)
-			 ("w" (setq shift-n (* 7 shift-n)) 'day)
-			 ("m" 'month)
-			 ("y" 'year)
-			 (_ (error "Unsupported time unit"))))
-	   (nmin 1)
-	   (nmax n)
-	   (n-no-remove -1)
-	   (org-id-overriding-file-name (buffer-file-name (buffer-base-buffer)))
-	   (idprop (org-entry-get beg "ID")))
+           (template (buffer-substring beg end))
+           (shift-n (and doshift (string-to-number (match-string 1 shift))))
+           (shift-what (pcase (and doshift (match-string 2 shift))
+                         (`nil nil)
+                         ("h" 'hour)
+                         ("d" 'day)
+                         ("w" (setq shift-n (* 7 shift-n)) 'day)
+                         ("m" 'month)
+                         ("y" 'year)
+                         (_ (error "Unsupported time unit"))))
+           (nmin 1)
+           (nmax n)
+           (n-no-remove -1)
+           (org-id-overriding-file-name (buffer-file-name (buffer-base-buffer)))
+           (idprop (org-entry-get beg "ID")))
       (when (and doshift
-		 (string-match-p "<[^<>\n]+ [.+]?\\+[0-9]+[hdwmy][^<>\n]*>"
-				 template))
-	(delete-region beg end)
-	(setq end beg)
-	(setq nmin 0)
-	(setq nmax (1+ nmax))
-	(setq n-no-remove nmax))
+                 (string-match-p "<[^<>\n]+ [.+]?\\+[0-9]+[hdwmy][^<>\n]*>"
+                                 template))
+        (delete-region beg end)
+        (setq end beg)
+        (setq nmin 0)
+        (setq nmax (1+ nmax))
+        (setq n-no-remove nmax))
       (goto-char end)
       (cl-loop for n from nmin to nmax do
-	       (insert
-		;; Prepare clone.
-		(with-temp-buffer
-		  (insert template)
-		  (org-mode)
-		  (goto-char (point-min))
-		  (org-show-subtree)
-		  (and idprop (if org-clone-delete-id
-				  (org-entry-delete nil "ID")
-				(org-id-get-create t)))
-		  (unless (= n 0)
-		    (while (re-search-forward org-clock-line-re nil t)
-		      (delete-region (line-beginning-position)
-				     (line-beginning-position 2)))
-		    (goto-char (point-min))
-		    (while (re-search-forward org-drawer-regexp nil t)
-		      (org-remove-empty-drawer-at (point))))
-		  (goto-char (point-min))
+               (insert
+                ;; Prepare clone.
+                (with-temp-buffer
+                  (insert template)
+                  (org-mode)
+                  (goto-char (point-min))
+                  (org-show-subtree)
+                  (and idprop (if org-clone-delete-id
+                                  (org-entry-delete nil "ID")
+                                (org-id-get-create t)))
+                  (unless (= n 0)
+                    (while (re-search-forward org-clock-line-re nil t)
+                      (delete-region (line-beginning-position)
+                                     (line-beginning-position 2)))
+                    (goto-char (point-min))
+                    (while (re-search-forward org-drawer-regexp nil t)
+                      (org-remove-empty-drawer-at (point))))
+                  (goto-char (point-min))
 
-		  (when doshift
-		    (while (re-search-forward org-ts-regexp-both nil t)
-		      (org-timestamp-change (* n shift-n) shift-what))
-		    (save-excursion
-		      (goto-char (point-min))
-		      (evil-numbers/inc-at-pt n (point-min)))
-		    (unless (= n n-no-remove)
-		      (goto-char (point-min))
-		      (while (re-search-forward org-ts-regexp nil t)
-			(save-excursion
-			  (goto-char (match-beginning 0))
-			  (when (looking-at "<[^<>\n]+\\( +[.+]?\\+[0-9]+[hdwmy]\\)")
-			    (delete-region (match-beginning 1) (match-end 1)))))))
-		  (buffer-string)))))
+                  (when doshift
+                    (while (re-search-forward org-ts-regexp-both nil t)
+                      (org-timestamp-change (* n shift-n) shift-what))
+                    (save-excursion
+                      (goto-char (point-min))
+                      (evil-numbers/inc-at-pt n (point-min)))
+                    (unless (= n n-no-remove)
+                      (goto-char (point-min))
+                      (while (re-search-forward org-ts-regexp nil t)
+                        (save-excursion
+                          (goto-char (match-beginning 0))
+                          (when (looking-at "<[^<>\n]+\\( +[.+]?\\+[0-9]+[hdwmy]\\)")
+                            (delete-region (match-beginning 1) (match-end 1)))))))
+                  (buffer-string)))))
     (goto-char beg)))
 

My addition to that is the form with evil-numbers/inc-at-pt.

Keeping consistency among sequential records
@@ -5415,18 +5469,18 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(defun my/org--headings-in-outline ()
   (org-ql-query
     :select (lambda () (propertize
-			(substring-no-properties (org-get-heading t t t))
-			'marker (copy-marker (point))))
+                        (substring-no-properties (org-get-heading t t t))
+                        'marker (copy-marker (point))))
     :from (append
-	   (list (buffer-file-name))
-	   (let ((archive
-		  (concat (file-name-directory (buffer-file-name))
-			  "archive/"
-			  (file-name-nondirectory (buffer-file-name)))))
-	     (when (file-exists-p archive)
-	       (list archive))))
+           (list (buffer-file-name))
+           (let ((archive
+                  (concat (file-name-directory (buffer-file-name))
+                          "archive/"
+                          (file-name-nondirectory (buffer-file-name)))))
+             (when (file-exists-p archive)
+               (list archive))))
     :where `(and (outline-path ,@(org-get-outline-path))
-		 (level ,(org-current-level)))))
+                 (level ,(org-current-level)))))
 
 (defun my/org--heading-strip (heading)
   (thread-last
@@ -5443,38 +5497,38 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
     (seq-group-by #'my/org--heading-strip)
     (seq-sort-by #'car #'string-lessp)
     (mapcar (lambda (group)
-	      (cons (car group)
-		    (seq-sort-by
-		     (lambda (heading)
-		       (save-match-data
-			 (or
-			  (and (string-match (rx (group (+ digit)))
-					     heading)
-			       (string-to-number (match-string 1 heading)))
-			  -1)))
-		     #'<
-		     (cdr group)))))))
+              (cons (car group)
+                    (seq-sort-by
+                     (lambda (heading)
+                       (save-match-data
+                         (or
+                          (and (string-match (rx (group (+ digit)))
+                                             heading)
+                               (string-to-number (match-string 1 heading)))
+                          -1)))
+                     #'<
+                     (cdr group)))))))
 

Then, display all such headings a buffer:

(defun my/org-headings-seq ()
   (interactive)
   (let* ((headings (my/org--headings-in-outline))
-	 (headings-seq (my/org--headings-group-seq headings))
-	 (buffer (generate-new-buffer "*Sequential Headings in Outline*")))
+         (headings-seq (my/org--headings-group-seq headings))
+         (buffer (generate-new-buffer "*Sequential Headings in Outline*")))
     (with-current-buffer buffer
       (outline-mode)
       (setq-local widget-push-button-prefix "")
       (setq-local widget-push-button-suffix "")
       (dolist (group headings-seq)
-	(insert (format "* %s\n" (car group)))
-	(dolist (heading (cdr group))
-	  (widget-create 'push-button
-			 :marker (get-text-property 0 'marker heading)
-			 :notify (lambda (widget &rest ignore)
-				   (let ((marker (widget-get widget :marker)))
-				     (pop-to-buffer (marker-buffer marker))
-				     (goto-char marker)))
-			 (concat "** " (substring-no-properties heading)))
-	  (insert "\n")))
+        (insert (format "* %s\n" (car group)))
+        (dolist (heading (cdr group))
+          (widget-create 'push-button
+                         :marker (get-text-property 0 'marker heading)
+                         :notify (lambda (widget &rest ignore)
+                                   (let ((marker (widget-get widget :marker)))
+                                     (pop-to-buffer (marker-buffer marker))
+                                     (goto-char marker)))
+                         (concat "** " (substring-no-properties heading)))
+          (insert "\n")))
       (widget-setup)
       (setq buffer-read-only t)
       (goto-char (point-min)))
@@ -5483,21 +5537,21 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/org-heading-seq-insert ()
   (interactive)
   (let* ((headings (my/org--headings-in-outline))
-	 (headings-seq (my/org--headings-group-seq headings))
-	 (heading (completing-read "Headings: " headings-seq))
-	 (last-number
-	  (thread-last headings-seq
-		       (assoc heading)
-		       (cdr)
-		       (mapcar (lambda (x)
-				 (save-match-data
-				   (or
-				    (when (string-match (rx (group (+ digit)))
-							x)
-				      (string-to-number (match-string 1 x)))
-				    1))))
-		       (seq-max)
-		       (1+))))
+         (headings-seq (my/org--headings-group-seq headings))
+         (heading (completing-read "Headings: " headings-seq))
+         (last-number
+          (thread-last headings-seq
+                       (assoc heading)
+                       (cdr)
+                       (mapcar (lambda (x)
+                                 (save-match-data
+                                   (or
+                                    (when (string-match (rx (group (+ digit)))
+                                                        x)
+                                      (string-to-number (match-string 1 x)))
+                                    1))))
+                       (seq-max)
+                       (1+))))
     (org-insert-heading '(4))
     (insert (format "FUTURE %s %s" heading last-number))))
 
Archiving records
@@ -5510,9 +5564,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
(defun my/org-archive--get-file ()
   "Get an archive version of the file."
   (let ((archive-file
-	 (concat
-	  (file-name-directory (buffer-file-name))
-	  "archive/" (file-name-nondirectory (buffer-file-name)))))
+         (concat
+          (file-name-directory (buffer-file-name))
+          "archive/" (file-name-nondirectory (buffer-file-name)))))
     (unless (file-exists-p archive-file)
       (make-empty-file archive-file))
     archive-file))
@@ -5521,53 +5575,53 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
(defun my/org-refile--assert-path-exists (refile-path)
   (cl-assert (equal org-refile-use-outline-path 'file))
   (let* ((parts (string-split refile-path "/"))
-	 (tbl (mapcar
-	       (lambda (x)
-		 (cons (concat (car x) "/") (cdr x)))
-	       org-refile-target-table)))
+         (tbl (mapcar
+               (lambda (x)
+                 (cons (concat (car x) "/") (cdr x)))
+               org-refile-target-table)))
     (cl-loop for i from 1
-	     for part in (cdr parts)
-	     for target = (org-refile--get-location
-			   (string-join (seq-take parts (1+ i)) "/")
-			   tbl)
-	     unless target
-	     do (let ((parent-target
-		       (org-refile--get-location
-			(string-join (seq-take parts i) "/")
-			tbl)))
-		  (push (org-refile-new-child parent-target part) tbl)))))
+             for part in (cdr parts)
+             for target = (org-refile--get-location
+                           (string-join (seq-take parts (1+ i)) "/")
+                           tbl)
+             unless target
+             do (let ((parent-target
+                       (org-refile--get-location
+                        (string-join (seq-take parts i) "/")
+                        tbl)))
+                  (push (org-refile-new-child parent-target part) tbl)))))
 

Now we can make a function to archive one record interactively.

(defun my/org-archive-refile ()
   (interactive)
   (let* ((org-refile-targets `((,(my/org-archive--get-file) . (:maxlevel . 6))))
-	 (org-refile-target-table (org-refile-get-targets))
-	 (org-refile-history nil)
-	 (org-refile-use-outline-path 'file)
-	 (org-refile-allow-creating-parent-nodes t)
-	 (org-outline-path-complete-in-steps nil)
-	 (refile-path (string-join
-		       (append
-			(list (file-name-nondirectory
-			       (buffer-file-name)))
-			(org-get-outline-path nil t))
-		       "/")))
+         (org-refile-target-table (org-refile-get-targets))
+         (org-refile-history nil)
+         (org-refile-use-outline-path 'file)
+         (org-refile-allow-creating-parent-nodes t)
+         (org-outline-path-complete-in-steps nil)
+         (refile-path (string-join
+                       (append
+                        (list (file-name-nondirectory
+                               (buffer-file-name)))
+                        (org-get-outline-path nil t))
+                       "/")))
     ;; The path is already known
     (cl-letf (((symbol-function 'completing-read)
-	       (lambda (&rest _) refile-path)))
+               (lambda (&rest _) refile-path)))
       (my/org-refile--assert-path-exists refile-path)
       (org-refile))))
 

And a function to archive all records older than the given number of days. I’ll use org-ql to find these records.

(defun my/org-archive-refile-all (days)
   (interactive (list (read-number "Days: " 60)))
   (let ((records (org-ql-query
-		   :select #'element-with-markers
-		   :from (current-buffer)
-		   :where `(and (ts :to ,(- days)) (done)))))
+                   :select #'element-with-markers
+                   :from (current-buffer)
+                   :where `(and (ts :to ,(- days)) (done)))))
     (when (y-or-n-p (format "Archive %d records? " (length records)))
       (dolist (record records)
-	(let ((marker (org-element-property :org-marker record)))
-	  (org-with-point-at marker
-	    (my/org-archive-refile)))))))
+        (let ((marker (org-element-property :org-marker record)))
+          (org-with-point-at marker
+            (my/org-archive-refile)))))))
 
Keybindings

Global keybindings:

(my-leader-def
@@ -5636,29 +5690,29 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
 
 (defun my/weather-get ()
   (when (> (- (time-convert nil 'integer) my/weather-last-time)
-	   (* 60 5))
+           (* 60 5))
     (request (format "https://wttr.in/%s" my/location)
       :params '(("format" . "%l:%20%C%20%t%20%w%20%p"))
       :sync t
       :parser (lambda () (url-unhex-string (buffer-string)))
       :timeout 10
       :success (cl-function
-		(lambda (&key data &allow-other-keys)
-		  (setq my/weather-value data)
-		  (setq my/weather-last-time (time-convert nil 'integer))))
+                (lambda (&key data &allow-other-keys)
+                  (setq my/weather-value data)
+                  (setq my/weather-last-time (time-convert nil 'integer))))
       :error
       (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
-		     (message "Got error: %S" error-thrown)))))
+                     (message "Got error: %S" error-thrown)))))
   my/weather-value)
 

Let’s also try to log the current mood:

(defun my/get-mood ()
   (let* ((crm-separator " ")
-	 (crm-local-completion-map
-	  (let ((map (make-sparse-keymap)))
-	    (set-keymap-parent map crm-local-completion-map)
-	    (define-key map " " 'self-insert-command)
-	    map))
-	 (vertico-sort-function nil))
+         (crm-local-completion-map
+          (let ((map (make-sparse-keymap)))
+            (set-keymap-parent map crm-local-completion-map)
+            (define-key map " " 'self-insert-command)
+            map))
+         (vertico-sort-function nil))
     (mapconcat
      #'identity
      (completing-read-multiple
@@ -5688,24 +5742,24 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   (when (fboundp 'emms-playlist-current-selected-track)
     (let ((track (emms-playlist-current-selected-track)))
       (when track
-	(let ((album (cdr (assoc 'info-album track)))
-	      (artist (or (cdr (assoc 'info-albumartist track))
-			  (cdr (assoc 'info-album track))))
-	      (title (cdr (assoc 'info-title track)))
-	      (string ""))
-	  (when artist
-	    (setq string (concat string "[" artist "] ")))
-	  (when album
-	    (setq string (concat string album " - ")))
-	  (when title
-	    (setq string (concat string title)))
-	  (when (> (length string) 0)
-	    (org-set-property "EMMS_Track" string))))))
+        (let ((album (cdr (assoc 'info-album track)))
+              (artist (or (cdr (assoc 'info-albumartist track))
+                          (cdr (assoc 'info-album track))))
+              (title (cdr (assoc 'info-title track)))
+              (string ""))
+          (when artist
+            (setq string (concat string "[" artist "] ")))
+          (when album
+            (setq string (concat string album " - ")))
+          (when title
+            (setq string (concat string title)))
+          (when (> (length string) 0)
+            (org-set-property "EMMS_Track" string))))))
   (when-let (mood (my/get-mood))
     (org-set-property "Mood" mood)))
 
 (add-hook 'org-journal-after-entry-create-hook
-	  #'my/set-journal-header)
+          #'my/set-journal-header)
 

Also, a function to decrypt the current file:

(defun my/org-journal-decrypt ()
   "Decrypt the current org journal file."
@@ -5733,9 +5787,9 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    org-cite-activate-processor 'citar
    citar-bibliography org-cite-global-bibliography)
   (setq org-cite-export-processors
-	'((latex bibtex "numeric")))
+        '((latex bibtex "numeric")))
   (setq citar-library-paths
-	'("~/30-39 Life/33 Library/33.01 Documents/"))
+        '("~/30-39 Life/33 Library/33.01 Documents/"))
   (add-hook 'latex-mode #'citar-capf-setup)
   (add-hook 'org-mode #'citar-capf-setup))
 
@@ -5752,7 +5806,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
   :straight (:files (:defaults "citeproc" (:exclude "*helm*")))
   :if (not my/remote-server)
   :commands (org-ref-insert-link-hydra/body
-	     org-ref-bibtex-hydra/body)
+             org-ref-bibtex-hydra/body)
   :init
   (setq bibtex-dialect 'biblatex)
   (add-hook 'bibtex-mode 'smartparens-mode)
@@ -5765,8 +5819,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
    :keymaps 'bibtex-mode-map
    "M-RET" 'org-ref-bibtex-hydra/body)
   (setq org-ref-insert-cite-function
-	(lambda ()
-	  (call-interactively #'citar-insert-citation))))
+        (lambda ()
+          (call-interactively #'citar-insert-citation))))
 

Org Roam

org-roam is a plain-text knowledge database.

Things I tried with Org Roam:

@@ -5804,8 +5858,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsAbout installing the package on Guix (CREDIT: thanks @Ashraz on the SystemCrafters discord)

So, for all those interested: unfortunately, org-roam (or rather emacsql-sqlite) cannot compile the sqlite.c and emacsql.c due to missing headers (linux/falloc.h) on Guix. You would have to properly set all the include paths on Guix, and also adjust the PATH to have gcc actually find as later on in the compilation process.

-

Instead, you should remove all Org-Roam related packages from your Emacs installation (via M-x package-delete org-roam RET and M-x package-autoremove RET y RET) and then use the Guix package called emacs-org-roam.

-
+

Instead, you should remove all Org-Roam related packages from your Emacs installation (via M-x package-delete org-roam RET and M-x package-autoremove RET y RET) and then use the Guix package called emacs-org-roam.

References:

  • Hitchhiker’s Rough Guide to Org roam V2
  • @@ -5818,7 +5871,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (use-package org-roam :straight (:host github :repo "org-roam/org-roam" - :files (:defaults "extensions/*.el")) + :files (:defaults "extensions/*.el")) :if (and (not my/remote-server) (file-directory-p org-roam-directory)) @@ -5834,14 +5887,14 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsCapture templates for org-roam-capture. As for now, nothing too complicated here.

    (setq org-roam-capture-templates
           `(("d" "default" plain "%?"
    -	 :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
    -	 :unnarrowed t)
    -	("f" "fleeting" plain "%?"
    -	 :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+filetags: :fleeting:\n")
    -	 :unnarrowed t)
    -	("e" "encrypted" plain "%?"
    -	 :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org.gpg" "#+title: ${title}\n")
    -	 :unnarrowed t)))
    +         :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
    +         :unnarrowed t)
    +        ("f" "fleeting" plain "%?"
    +         :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+filetags: :fleeting:\n")
    +         :unnarrowed t)
    +        ("e" "encrypted" plain "%?"
    +         :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org.gpg" "#+title: ${title}\n")
    +         :unnarrowed t)))
     
    org-roam-ql

    org-roam-ql is a package to query org-roam files like org-ql.

    (use-package org-roam-ql
    @@ -5937,12 +5990,12 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
     (defun my/org-roam--count-overlay-make (pos count)
       (let* ((overlay-value (concat
    -			 " "
    -			 (propertize
    -			  (format "%d" count)
    -			  'face 'my/org-roam-count-overlay-face)
    -			 " "))
    -	 (ov (make-overlay pos pos (current-buffer) nil t)))
    +                         " "
    +                         (propertize
    +                          (format "%d" count)
    +                          'face 'my/org-roam-count-overlay-face)
    +                         " "))
    +         (ov (make-overlay pos pos (current-buffer) nil t)))
         (overlay-put ov 'roam-backlinks-count count)
         (overlay-put ov 'priority 1)
         (overlay-put ov 'after-string overlay-value)))
    @@ -5957,48 +6010,48 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (org-element-map (org-element-parse-buffer) 'link
         (lambda (elem)
           (when (string-equal (org-element-property :type elem) "id")
    -	(let* ((id (org-element-property :path elem))
    -	       (count (caar
    -		       (org-roam-db-query
    -			[:select (funcall count source)
    -			 :from links
    -			 :where (= dest $s1)
    -			 :and (= type "id")]
    -			id))))
    -	  (when (< 0 count)
    -	    (my/org-roam--count-overlay-make
    -	     (org-element-property :end elem)
    -	     count)))))))
    +        (let* ((id (org-element-property :path elem))
    +               (count (caar
    +                       (org-roam-db-query
    +                        [:select (funcall count source)
    +                         :from links
    +                         :where (= dest $s1)
    +                         :and (= type "id")]
    +                        id))))
    +          (when (< 0 count)
    +            (my/org-roam--count-overlay-make
    +             (org-element-property :end elem)
    +             count)))))))
     

    And a minor mode to toggle the display in a particular org-roam buffer.

    (define-minor-mode my/org-roam-count-overlay-mode
       "Display backlink count for org-roam links."
       :after-hook
       (if my/org-roam-count-overlay-mode
           (progn
    -	(my/org-roam--count-overlay-make-all)
    -	(add-hook 'after-save-hook #'my/org-roam--count-overlay-make-all nil t))
    +        (my/org-roam--count-overlay-make-all)
    +        (add-hook 'after-save-hook #'my/org-roam--count-overlay-make-all nil t))
         (my/org-roam--count-overlay-remove-all)
         (remove-hook 'after-save-hook #'my/org-roam--count-overlay-remove-all t)))
     
    (defun my/org-roam-extract-links ()
       (interactive)
       (let ((buffer (generate-new-buffer "*roam-links*"))
    -	elems)
    +        elems)
         (org-element-map (org-element-parse-buffer) 'link
           (lambda (elem)
    -	(when (string-equal (org-element-property :type elem) "id")
    -	  (push elem elems))))
    +        (when (string-equal (org-element-property :type elem) "id")
    +          (push elem elems))))
         (with-current-buffer buffer
           (cl-loop for elem in elems
    -	       for file-name =
    -	       (file-name-nondirectory
    -		(caar
    -		 (org-roam-db-query
    -		  [:select [file]
    -			   :from nodes
    -			   :where (= id $s1)]
    -		  (org-element-property :path elem))))
    -	       do (insert file-name "\n")))
    +               for file-name =
    +               (file-name-nondirectory
    +                (caar
    +                 (org-roam-db-query
    +                  [:select [file]
    +                           :from nodes
    +                           :where (= id $s1)]
    +                  (org-element-property :path elem))))
    +               do (insert file-name "\n")))
         (switch-to-buffer buffer)))
     
    Org Roam UI

    A browser frontend to visualize the Roam database as a graph.

    @@ -6024,7 +6077,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
    (setq deft-recursive t) (setq deft-use-filter-string-for-filename t) (add-hook 'deft-mode-hook - (lambda () (display-line-numbers-mode -1))) + (lambda () (display-line-numbers-mode -1))) (general-define-key :keymaps 'deft-mode-map :states '(normal motion) @@ -6038,9 +6091,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags

The default deft view does not look that great because of various Roam metadata. To improve that, we can tweak deft-strip-summary-regexp:

(setq deft-strip-summary-regexp
       (rx (or
-	   (: ":PROPERTIES:" (* anything) ":END:")
-	   (: "#+" (+ alnum) ":" (* nonl))
-	   (regexp "[\n\t]"))))
+           (: ":PROPERTIES:" (* anything) ":END:")
+           (: "#+" (+ alnum) ":" (* nonl))
+           (regexp "[\n\t]"))))
 

And advise deft-parse-summary to filter out Org links:

(defun my/deft-parse-summary-around (fun contents title)
   (funcall fun (org-link-display-format contents) title))
@@ -6053,7 +6106,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags    (insert contents)
     (goto-char (point-min))
     (if (search-forward-regexp (rx (| "#+title:" "#+TITLE:")) nil t)
-	(string-trim (buffer-substring-no-properties (point) (line-end-position)))
+        (string-trim (buffer-substring-no-properties (point) (line-end-position)))
       file)))
 
 (defun my/deft-parse-title-around (fun file contents)
@@ -6091,22 +6144,22 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsFirst, as I have autocommit set up in my org directory, here is a function to get an alist of changed files in a form (status . path). The rev parameter can be a commit, tag, etc. but here I’m interested in the date form (e.g. @{2021-08-30}).

(setq my/git-diff-status
       '(("A" . added)
-	("C" . copied)
-	("D" . deleted)
-	("M" . modified)
-	("R" . renamed)
-	("R100" . moved)
-	("T" . type-changed)
-	("U" . unmerged)))
+        ("C" . copied)
+        ("D" . deleted)
+        ("M" . modified)
+        ("R" . renamed)
+        ("R100" . moved)
+        ("T" . type-changed)
+        ("U" . unmerged)))
 
 (defun my/get-files-status (rev)
   (let ((files (shell-command-to-string (concat "git diff --name-status " rev))))
     (mapcar
      (lambda (file)
        (let ((elems (split-string file "\t")))
-	 (cons
-	  (cdr (assoc (car elems) my/git-diff-status))
-	  (car (last elems)))))
+         (cons
+          (cdr (assoc (car elems) my/git-diff-status))
+          (car (last elems)))))
      (split-string files "\n" t))))
 

I’ll use it to get a list of added and changed files in the Org directory since the last review. The date should be in a format YYYY-MM-DD.

(defun my/org-changed-files-since-date (date)
@@ -6114,68 +6167,108 @@ Didn’t work out as I expected, so I’ve made org-journal-tags    (my/get-files-status (format "@{%s}" date))))
 
Data from org-roam

I’ll use data from git to get the list of what I’ve been working on. The directories include org-roam itself and inbox-notes, where my in-process notes live.

-
(defun my/org-review-format-org-roam (date)
+
(defun my/org-review--org-roam-get-changes (date)
   (let ((changes (my/org-changed-files-since-date date))
-	(nodes (org-roam-node-list))
-	(nodes-by-file (make-hash-table :test #'equal)))
+        (nodes (org-roam-node-list))
+        (nodes-by-file (make-hash-table :test #'equal)))
     (cl-loop for node in nodes
-	     for file = (org-roam-node-file node)
-	     do (puthash file node nodes-by-file))
+             for file = (org-roam-node-file node)
+             do (puthash file node nodes-by-file))
+    (let* ((changed-nodes
+            (thread-last
+              changes
+              (mapcar (lambda (c)
+                        (cons (car c)
+                              (gethash
+                               (concat org-directory "/" (cdr c))
+                               nodes-by-file))))
+              (seq-filter #'cdr)))
+           (changed-inbox
+            (thread-last
+              changes
+              (seq-filter
+               (lambda (file) (string-match-p (rx bos "inbox-notes") (cdr file))))))
+           (changed-fleeting
+            (thread-last
+              changed-nodes
+              (seq-filter (lambda (c)
+                            (seq-contains-p (org-roam-node-tags (cdr c))
+                                            "fleeting")))
+              (seq-sort-by (lambda (c) (concat (symbol-name (car c))
+                                               (org-roam-node-title (cdr c))))
+                           #'string-lessp)))
+           (changed-permanent
+            (thread-last
+              changed-nodes
+              (seq-filter (lambda (c)
+                            (not (seq-contains-p (org-roam-node-tags (cdr c))
+                                                 "fleeting"))))
+              (seq-sort-by (lambda (c) (concat (symbol-name (car c))
+                                               (org-roam-node-title (cdr c))))
+                           #'string-lessp))))
+      (list
+       changed-inbox
+       changed-fleeting
+       changed-permanent))))
+
+(defun my/org-review-org-roam-format (date)
+  (let* ((data (my/org-review--org-roam-get-changes date))
+         (changed-inbox (nth 0 data))
+         (changed-fleeting (nth 1 data))
+         (changed-permanent (nth 2 data)))
     (concat
-     "*** Zettelkasten Updates\n"
-     "TODO Sort the updates by topics\n\n"
      "Changes in inbox:\n"
      (thread-last
-       changes
-       (seq-filter
-	(lambda (file) (string-match-p (rx bos "inbox-notes") (cdr file))))
-       (seq-sort-by (lambda (s) (symbol-name (car s)))
-		    #'string-lessp)
+       changed-inbox
        (mapcar (lambda (change)
-		 (format "- %s :: %s\n"
-			 (cond
-			  ((or (member (car change) '(deleted moved))
-			       (string-match-p "figured-out" (cdr change)))
-			   "Processed")
-			  (t (capitalize (symbol-name (car change)))))
-			 (cdr change))))
+                 (format "- %s :: %s\n"
+                         (cond
+                          ((or (member (car change) '(deleted moved))
+                               (string-match-p "figured-out" (cdr change)))
+                           "Processed")
+                          (t (capitalize (symbol-name (car change)))))
+                         (cdr change))))
        (apply #'concat))
-     "\nChanges in notes:\n"
+     "\nChanges in fleeting notes:\n"
      (thread-last
-       changes
+       changed-fleeting
        (mapcar (lambda (c)
-		 (cons (car c)
-		       (gethash
-			(concat org-directory "/" (cdr c))
-			nodes-by-file))))
-       (seq-filter #'cdr)
-       (seq-sort-by (lambda (c) (concat (symbol-name (car c))
-					(org-roam-node-title (cdr c))))
-		    #'string-lessp)
+                 (format "- %s :: [[id:%s][%s]]\n"
+                         (capitalize (symbol-name (car c)))
+                         (org-roam-node-id (cdr c))
+                         (org-roam-node-title (cdr c)))))
+       (apply #'concat))
+     "\nChanges in permanent notes:\n"
+     (thread-last
+       changed-permanent
        (mapcar (lambda (c)
-		 (format "- %s :: [[id:%s][%s]]\n"
-			 (capitalize (symbol-name (car c)))
-			 (org-roam-node-id (cdr c))
-			 (org-roam-node-title (cdr c)))))
+                 (format "- %s :: [[id:%s][%s]]\n"
+                         (capitalize (symbol-name (car c)))
+                         (org-roam-node-id (cdr c))
+                         (org-roam-node-title (cdr c)))))
        (apply #'concat)))))
 
General review logic
(defun my/org-review-get-last-review-date (kind)
   (let* ((start-of-day (- (time-convert nil #'integer)
-			  (% (time-convert nil #'integer)
-			     (* 24 60 60))))
-	 (query-res (org-journal-tags-query
-		     :tag-names (list (format "review.%s" kind))
-		     :start-date (pcase kind
-				   ('weekly
-				    (- start-of-day
-				       (* 21 24 60 60)))
-				   (_ (error "Unsupported kind: %s" kind)))
-		     :location 'section
-		     :order 'descending)))
+                          (% (time-convert nil #'integer)
+                             (* 24 60 60))))
+         (query-res (org-journal-tags-query
+                     :tag-names (list (format "review.%s" kind))
+                     :start-date (pcase kind
+                                   ('weekly
+                                    (- start-of-day
+                                       (* 21 24 60 60)))
+                                   ('zk
+                                    (- start-of-day
+                                       (* 45 24 60 60)))
+                                   (_ (error "Unsupported kind: %s" kind)))
+                     :location 'section
+                     :order 'descending)))
     (if query-res
-	(org-journal-tag-reference-date (car query-res))
+        (org-journal-tag-reference-date (car query-res))
       (pcase kind
-	('weekly (- start-of-day (* 7 24 60 60)))))))
+        ('weekly (- start-of-day (* 7 24 60 60)))
+        ('zk (- start-of-day (* 45 24 60 60)))))))
 
Weekly review
(defun my/org-review-set-weekly-record ()
   (save-excursion
@@ -6185,12 +6278,12 @@ Didn’t work out as I expected, so I’ve made org-journal-tags      (goto-char (point-max))
 
       (insert "Last review date: "
-	      (format-time-string
-	       "[%Y-%m-%d]"
-	       (seconds-to-time last-review-date)))
+              (format-time-string
+               "[%Y-%m-%d]"
+               (seconds-to-time last-review-date)))
       (insert "
 
-Review checklist:
+Review checklist (/delete this/):
 - [ ] Clear email inbox
 - [ ] Reconcile ledger
 - [ ] Clear [[file:~/Downloads][downloads]] and [[file:~/00-Scratch][scratch]] folders
@@ -6207,8 +6300,6 @@ Didn’t work out as I expected, so I’ve made org-journal-tags- [ ] Review journal records
 ")
 
-      (insert (my/org-review-format-org-roam
-	       (format-time-string "%Y-%m-%d" (seconds-to-time last-review-date))))
       (insert "
 *** Summary
 TODO Write something, maybe? "))))
@@ -6216,8 +6307,8 @@ Didn’t work out as I expected, so I’ve made org-journal-tags(defun my/org-review-weekly ()
   (interactive)
   (let ((org-journal-after-entry-create-hook
-	 `(,@org-journal-after-entry-create-hook
-	   my/org-review-set-weekly-record)))
+         `(,@org-journal-after-entry-create-hook
+           my/org-review-set-weekly-record)))
     (org-journal-new-entry nil)
     (org-fold-show-subtree)))
 
(with-eval-after-load 'org-journal
@@ -6233,12 +6324,17 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (call-process-shell-command "pkill -f 'bwrap --args 36 element'")
   (call-process-shell-command "pkill -f element-desktop"))
 
(defun my/org-review-set-daily-record ()
-  (save-excursion
-    (org-journal-tags-prop-apply-delta :add '("review.daily"))
-    (insert "Daily Review")
-    (goto-char (point-max))
+  (let* ((today (format-time-string
+                 "%Y-%m-%d"
+                 (days-to-time
+                  (- (org-today) (time-to-days 0)))))
+         (roam-changes (my/org-review--org-roam-get-changes today)))
+    (save-excursion
+      (org-journal-tags-prop-apply-delta :add '("review.daily"))
+      (insert "Daily Review")
+      (goto-char (point-max))
 
-    (insert "
+      (insert "
 Maintenance checklist (/delete this/):
 - [ ] [[elisp:(my/kill-messengers)][Close all messengers]]
 - [ ] Process [[file:../inbox.org][inbox]]
@@ -6257,22 +6353,117 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
 *** New ideas
 /Write them down in org-roam with the \"fleeting\" tag; leave links here. Perhaps note what sparked that idea?/
-
+"
+              (thread-last
+                (nth 1 roam-changes)
+                (seq-filter (lambda (c) (eq 'added (car c))))
+                (mapcar (lambda (c)
+                          (format "- [[id:%s][%s]]\n"
+                                  (org-roam-node-id (cdr c))
+                                  (org-roam-node-title (cdr c)))))
+                (apply #'concat))
+              "
 *** Interactions today
 /Any meaninginful interactions, conflicts or tensions?/
 
 *** Emotions today
 /How did I feel?/
-")))
+"))))
 
(defun my/org-review-daily ()
   (interactive)
   (let ((org-journal-after-entry-create-hook
-	 `(,@org-journal-after-entry-create-hook
-	   my/org-review-set-daily-record)))
+         `(,@org-journal-after-entry-create-hook
+           my/org-review-set-daily-record)))
     (org-journal-new-entry nil)
     (org-fold-show-subtree)))
 
(with-eval-after-load 'org-journal
   (my-leader-def "ojd" #'my/org-review-daily))
+
ZK review
+

Mostly incorporating or discarding my fleeting notes here.

+

This function formats the list of notes to review:

+
(defun my/org-review-org-roam-format-zk-before (date)
+  (let* ((data (my/org-review--org-roam-get-changes date))
+         (changed-inbox (nth 0 data))
+         (changed-fleeting (nth 1 data))
+         (changed-permanent (nth 2 data)))
+    (concat
+     (when changed-inbox
+       (concat
+        "Process these changes in inbox:\n"
+        (thread-last
+          changed-inbox
+          (mapcar (lambda (change)
+                    (format "- [ ] %s :: %s\n"
+                            (cond
+                             ((or (member (car change) '(deleted moved))
+                                  (string-match-p "figured-out" (cdr change)))
+                              "Processed")
+                             (t (capitalize (symbol-name (car change)))))
+                            (cdr change))))
+          (apply #'concat))
+        "\n"))
+     (when changed-fleeting
+       (concat
+        "Process these fleeting notes:\n"
+        (thread-last
+          changed-fleeting
+          (mapcar (lambda (c)
+                    (format "- [ ] %s :: [[id:%s][%s]]\n"
+                            (capitalize (symbol-name (car c)))
+                            (org-roam-node-id (cdr c))
+                            (org-roam-node-title (cdr c)))))
+          (apply #'concat))
+        "\n"))
+     (when changed-permanent
+       (concat
+        "Check these changes in permanent notes:\n"
+        (thread-last
+          changed-permanent
+          (mapcar (lambda (c)
+                    (format "- [ ] %s :: [[id:%s][%s]]\n"
+                            (capitalize (symbol-name (car c)))
+                            (org-roam-node-id (cdr c))
+                            (org-roam-node-title (cdr c)))))
+          (apply #'concat)))))))
+
(defun my/org-review-org-roam-finish (date)
+  (org-roam-db-sync)
+  (save-excursion
+    (org-back-to-heading)
+    (replace-regexp
+     (rx
+      ":BEGIN_REVIEW:" (* anything) ":END_REVIEW:")
+     (string-trim
+      (my/org-review-org-roam-format date)))))
+
(defun my/org-review-set-zk-record ()
+  (save-excursion
+    (let ((last-review-date (my/org-review-get-last-review-date 'zk)))
+      (org-journal-tags-prop-apply-delta :add '("review.zk"))
+      (insert "Zettelkasten Review")
+      (goto-char (point-max))
+
+      (insert "Last review date: "
+              (format-time-string
+               "[%Y-%m-%d]"
+               (seconds-to-time last-review-date)))
+
+      (insert "\n\n:BEGIN_REVIEW:\n"
+              "Process all the required categories in this block, then execute \"Finish review\".\n\n"
+              (string-trim
+               (my/org-review-org-roam-format-zk-before last-review-date))
+              "\n\n[[elisp:(my/org-review-org-roam-finish \""
+              (format-time-string "%Y-%m-%d" last-review-date)
+              "\")][Finish review]]"
+              "\n:END_REVIEW:\n"))))
+
(defun my/org-review-zk ()
+  (interactive)
+  (let ((org-journal-after-entry-create-hook
+         `(,@org-journal-after-entry-create-hook
+           my/org-review-set-zk-record)))
+    (org-journal-new-entry nil)
+    (org-fold-show-subtree)))
+
+(with-eval-after-load 'org-journal
+  (my-leader-def "ojz" #'my/org-review-zk))
 

Contacts

org-contacts is a package to store contacts in an org file.

It seems the package has been somewhat revived in the recent months. It used things like lexical-let when I first found it.

@@ -6282,7 +6473,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
:after (org) :config (setq org-contacts-files (list - (concat org-directory "/contacts.org")))) + (concat org-directory "/contacts.org"))))

An example contact entry can look like this:

* Pavel Korytov
 :PROPERTIES:
@@ -6366,8 +6557,8 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(with-eval-after-load 'org-ref
   (setq org-ref-csl-default-locale "ru-RU")
   (setq org-ref-csl-default-style (expand-file-name
-				   (concat user-emacs-directory
-					   "gost-r-7-0-5-2008-numeric.csl"))))
+                                   (concat user-emacs-directory
+                                           "gost-r-7-0-5-2008-numeric.csl"))))
 

LaTeX

Add a custom LaTeX template without default packages. Packages are indented to be imported with function from Import *.sty.

(defun my/setup-org-latex ()
@@ -6376,47 +6567,47 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (setq org-latex-pdf-process '("latexmk -outdir=%o %f")) ;; Use latexmk
   (setq org-latex-listings 'minted) ;; Use minted to highlight source code
   (setq org-latex-minted-options    ;; Some minted options I like
-	'(("breaklines" "true")
-	  ("tabsize" "4")
-	  ("autogobble")
-	  ("linenos")
-	  ("numbersep" "0.5cm")
-	  ("xleftmargin" "1cm")
-	  ("frame" "single")))
+        '(("breaklines" "true")
+          ("tabsize" "4")
+          ("autogobble")
+          ("linenos")
+          ("numbersep" "0.5cm")
+          ("xleftmargin" "1cm")
+          ("frame" "single")))
   ;; Use extarticle without the default packages
   (add-to-list 'org-latex-classes
-	       '("org-plain-extarticle"
-		 "\\documentclass{extarticle}
+               '("org-plain-extarticle"
+                 "\\documentclass{extarticle}
 [NO-DEFAULT-PACKAGES]
 [PACKAGES]
 [EXTRA]"
-		 ("\\section{%s}" . "\\section*{%s}")
-		 ("\\subsection{%s}" . "\\subsection*{%s}")
-		 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-		 ("\\paragraph{%s}" . "\\paragraph*{%s}")
-		 ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+                 ("\\section{%s}" . "\\section*{%s}")
+                 ("\\subsection{%s}" . "\\subsection*{%s}")
+                 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+                 ("\\paragraph{%s}" . "\\paragraph*{%s}")
+                 ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
   (add-to-list 'org-latex-classes
-	       '("org-plain-extreport"
-		 "\\documentclass{extreport}
+               '("org-plain-extreport"
+                 "\\documentclass{extreport}
 [NO-DEFAULT-PACKAGES]
 [PACKAGES]
 [EXTRA]"
-		 ("\\chapter{%s}" . "\\chapter*{%s}")
-		 ("\\section{%s}" . "\\section*{%s}")
-		 ("\\subsection{%s}" . "\\subsection*{%s}")
-		 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-		 ("\\paragraph{%s}" . "\\paragraph*{%s}")))
+                 ("\\chapter{%s}" . "\\chapter*{%s}")
+                 ("\\section{%s}" . "\\section*{%s}")
+                 ("\\subsection{%s}" . "\\subsection*{%s}")
+                 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+                 ("\\paragraph{%s}" . "\\paragraph*{%s}")))
   ;; Use beamer without the default packages
   (add-to-list 'org-latex-classes
-	       '("org-latex-beamer"
-		 "\\documentclass{beamer}
+               '("org-latex-beamer"
+                 "\\documentclass{beamer}
 [NO-DEFAULT-PACKAGES]
 [PACKAGES]
 [EXTRA]"
-		 ("beamer" "\\documentclass[presentation]{beamer}"
-		  ("\\section{%s}" . "\\section*{%s}")
-		  ("\\subsection{%s}" . "\\subsection*{%s}")
-		  ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))))
+                 ("beamer" "\\documentclass[presentation]{beamer}"
+                  ("\\section{%s}" . "\\section*{%s}")
+                  ("\\subsection{%s}" . "\\subsection*{%s}")
+                  ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))))
 
 ;; Make sure to eval the function when org-latex-classes list already exists
 (with-eval-after-load 'ox-latex
@@ -6425,14 +6616,14 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsNo idea why, but somehow the exported file uses english words if there isn’t :default key in the dictionary.

(with-eval-after-load 'ox
   (setq org-export-dictionary
-	(cl-loop for item in org-export-dictionary collect
-		 (cons
-		  (car item)
-		  (cl-loop for entry in (cdr item)
-			   if (and (equal (car entry) "ru")
-				   (plist-get (cdr entry) :utf-8))
-			   collect (list "ru" :default (plist-get (cdr entry) :utf-8))
-			   else collect entry)))))
+        (cl-loop for item in org-export-dictionary collect
+                 (cons
+                  (car item)
+                  (cl-loop for entry in (cdr item)
+                           if (and (equal (car entry) "ru")
+                                   (plist-get (cdr entry) :utf-8))
+                           collect (list "ru" :default (plist-get (cdr entry) :utf-8))
+                           else collect entry)))))
 

System configuration

Functions related to literate configuration.

Tables for Guix Dependencies

@@ -6478,49 +6669,49 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(org-table-map-tables (lambda () (let* ((table - (seq-filter - (lambda (q) (not (eq q 'hline))) - (org-table-to-lisp))) - (dep-name-index - (cl-position - nil - (mapcar #'substring-no-properties (nth 0 table)) - :test (lambda (_ elem) - (string-match-p "[G|g]uix.*dep" elem)))) - (category-name-index - (cl-position - nil - (mapcar #'substring-no-properties (nth 0 table)) - :test (lambda (_ elem) - (string-match-p ".*[C|c]ategory.*" elem)))) - (disabled-name-index - (cl-position - nil - (mapcar #'substring-no-properties (nth 0 table)) - :test (lambda (_ elem) - (string-match-p ".*[D|d]isabled.*" elem))))) - (when dep-name-index - (dolist (elem (cdr table)) - (when - (and - ;; Category - (or - ;; Category not set and not present in the table - (and - (or (not category) (string-empty-p category)) - (not category-name-index)) - ;; Category is set and present in the table - (and - category-name-index - (not (string-empty-p category)) - (string-match-p category (nth category-name-index elem)))) - ;; Not disabled - (or - (not disabled-name-index) - (string-empty-p (nth disabled-name-index elem)))) - (add-to-list - 'dependencies - (substring-no-properties (nth dep-name-index elem))))))))) + (seq-filter + (lambda (q) (not (eq q 'hline))) + (org-table-to-lisp))) + (dep-name-index + (cl-position + nil + (mapcar #'substring-no-properties (nth 0 table)) + :test (lambda (_ elem) + (string-match-p "[G|g]uix.*dep" elem)))) + (category-name-index + (cl-position + nil + (mapcar #'substring-no-properties (nth 0 table)) + :test (lambda (_ elem) + (string-match-p ".*[C|c]ategory.*" elem)))) + (disabled-name-index + (cl-position + nil + (mapcar #'substring-no-properties (nth 0 table)) + :test (lambda (_ elem) + (string-match-p ".*[D|d]isabled.*" elem))))) + (when dep-name-index + (dolist (elem (cdr table)) + (when + (and + ;; Category + (or + ;; Category not set and not present in the table + (and + (or (not category) (string-empty-p category)) + (not category-name-index)) + ;; Category is set and present in the table + (and + category-name-index + (not (string-empty-p category)) + (string-match-p category (nth category-name-index elem)))) + ;; Not disabled + (or + (not disabled-name-index) + (string-empty-p (nth disabled-name-index elem)))) + (add-to-list + 'dependencies + (substring-no-properties (nth dep-name-index elem))))))))) dependencies))

To make it work in the configuration, it is necessary to format the list so that Scheme could read it:

(defun my/format-guix-dependencies (&optional category)
@@ -6550,15 +6741,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tags      (mapcar
        #'expand-file-name
        '("~/Emacs.org"
-	 "~/Desktop.org"
-	 "~/Console.org"
-	 "~/Guix.org"
-	 "~/Mail.org")))
+         "~/Desktop.org"
+         "~/Console.org"
+         "~/Guix.org"
+         "~/Mail.org")))
 
 (add-hook 'org-mode-hook
-	  (lambda ()
-	    (when (member (buffer-file-name) my/org-config-files)
-	      (setq-local org-confirm-babel-evaluate nil))))
+          (lambda ()
+            (when (member (buffer-file-name) my/org-config-files)
+              (setq-local org-confirm-babel-evaluate nil))))
 

yadm hook

A script to run tangle from CLI.

(require 'org)
@@ -6583,11 +6774,11 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (setq-local comment-start-skip "#+ *"))
 
 (mapcar #'org-babel-tangle-file
-	'("/home/pavel/Emacs.org"
-	  "/home/pavel/Desktop.org"
-	  "/home/pavel/Console.org"
-	  "/home/pavel/Guix.org"
-	  "/home/pavel/Mail.org"))
+        '("/home/pavel/Emacs.org"
+          "/home/pavel/Desktop.org"
+          "/home/pavel/Console.org"
+          "/home/pavel/Guix.org"
+          "/home/pavel/Mail.org"))
 

To launch from CLI, run:

emacs -Q --batch -l run-tangle.el
 

I have added this line to yadm’s post_alt hook, so to run tangle after yadm alt

@@ -6603,7 +6794,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(call-process "herd" nil nil nil "restart" "xsettingsd") (when (fboundp #'my/exwm-set-alpha) (if (my/light-p) - (my/exwm-set-alpha 100) + (my/exwm-set-alpha 100) (my/exwm-set-alpha 90))))

Applications

Dired

@@ -6623,9 +6814,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(setq dired-recursive-deletes 'always) (setq dired-kill-when-opening-new-dired-buffer t) (add-hook 'dired-mode-hook - (lambda () - (setq truncate-lines t) - (visual-line-mode nil))) + (lambda () + (setq truncate-lines t) + (visual-line-mode nil))) (when my/is-termux (add-hook 'dired-mode-hook #'dired-hide-details-mode)) @@ -6673,8 +6864,8 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (if (not current-prefix-arg) (dired-sidebar-toggle-sidebar) (let ((dired-sidebar-follow-file-at-point-on-toggle-open - current-prefix-arg) - (current-prefix-arg nil)) + current-prefix-arg) + (current-prefix-arg nil)) (dired-sidebar-toggle-sidebar)))) (use-package dired-sidebar @@ -6686,7 +6877,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (general-define-key :keymaps '(normal override global) "C-n" `(my/dired-sidebar-toggle - :wk "dired-sidebar")) + :wk "dired-sidebar")) :config (setq dired-sidebar-width 45) (defun my/dired-sidebar-setup () @@ -6732,15 +6923,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tags :after (dired) :if (display-graphic-p) :hook (dired-mode . (lambda () - (unless (string-match-p "/gnu/store" default-directory) - (all-the-icons-dired-mode))))) + (unless (string-match-p "/gnu/store" default-directory) + (all-the-icons-dired-mode)))))
(use-package nerd-icons-dired
   :straight t
   :after (dired)
   :hook (dired-mode . (lambda ()
-			(unless (or (file-remote-p default-directory)
-				    (string-match-p "/gnu/store" default-directory))
-			  (nerd-icons-dired-mode))))
+                        (unless (or (file-remote-p default-directory)
+                                    (string-match-p "/gnu/store" default-directory))
+                          (nerd-icons-dired-mode))))
   :config
   (advice-add #'dired-create-empty-file :around #'nerd-icons-dired--refresh-advice))
 

Provides stuff like dired-open-xdg

@@ -6780,9 +6971,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags

dired-rsync allows using rsync instead of the default synchronous copy operation. The only trouble is that it doesn’t replace dired-do-copy completely, so…

(defun my/dired-rsync--refresh ()
   (cl-loop for window being the windows
-	   do (with-current-buffer (window-buffer window)
-		(when (derived-mode-p 'dired-mode)
-		  (revert-buffer)))))
+           do (with-current-buffer (window-buffer window)
+                (when (derived-mode-p 'dired-mode)
+                  (revert-buffer)))))
 
 (use-package dired-rsync
   :straight t
@@ -6844,7 +7035,25 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (when (executable-find "xdg-open")
     (let ((file (ignore-errors (dired-get-file-for-visit))))
       (start-process "dired-open" nil
-		     "xdg-open" (file-truename file)))))
+                     "xdg-open" (file-truename file)))))
+

Run a command on the marked files. Unlike dired-do-async-shell-command, this uses start-process instead of shell-command, which prevents the output buffer from popping up.

+
(defun my/dired-do-async-shell-command (command &optional arg file-list)
+  (interactive
+   (let ((files (dired-get-marked-files t current-prefix-arg nil nil t)))
+     (list
+      ;; Want to give feedback whether this file or marked files are used:
+      (dired-read-shell-command "& on %s: " current-prefix-arg files)
+      current-prefix-arg
+      files)))
+  (start-process-shell-command
+   "*Dired Command*" nil
+   (dired-shell-stuff-it command file-list arg)))
+
+(with-eval-after-load 'dired
+  (general-define-key
+   :states '(normal insert)
+   :keymaps '(dired-mode-map)
+   "&" #'my/dired-do-async-shell-command))
 

Bookmarks

A simple bookmark list for Dired, mainly to use with TRAMP. I may look into a proper bookmarking system later.

Bookmarks are listed in the private.el file, which has an expression like this:

@@ -6855,9 +7064,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/dired-bookmark-open ()
   (interactive)
   (let ((bookmarks
-	 (mapcar
-	  (lambda (el) (cons (format "%-30s %s" (car el) (cdr el)) (cdr el)))
-	  my/dired-bookmarks)))
+         (mapcar
+          (lambda (el) (cons (format "%-30s %s" (car el) (cdr el)) (cdr el)))
+          my/dired-bookmarks)))
     (dired
      (cdr
       (assoc
@@ -6873,25 +7082,25 @@ Didn’t work out as I expected, so I’ve made org-journal-tags    if (eq (buffer-local-value 'major-mode buf) buffer-major-mode)
     collect buf into all-buffers
     if (and (eq (buffer-local-value 'major-mode buf) buffer-major-mode)
-	    (get-buffer-window buf t))
+            (get-buffer-window buf t))
     collect buf into visible-buffers
     finally return (if (= (length visible-buffers) 1)
-		       (car visible-buffers)
-		     (if (= (length all-buffers) 1)
-			 (car all-buffers)
-		       (when-let ((buffers-by-name (mapcar (lambda (b)
-							     (cons (buffer-name b) b))
-							   all-buffers)))
-			 (cdr
-			  (assoc
-			   (completing-read prompt buffers-by-name nil t)
-			   buffers-by-name))))))
+                       (car visible-buffers)
+                     (if (= (length all-buffers) 1)
+                         (car all-buffers)
+                       (when-let ((buffers-by-name (mapcar (lambda (b)
+                                                             (cons (buffer-name b) b))
+                                                           all-buffers)))
+                         (cdr
+                          (assoc
+                           (completing-read prompt buffers-by-name nil t)
+                           buffers-by-name))))))
    (user-error "No buffer found!")))
 

Attach file to telega.

(defun my/dired-attach-to-telega (files telega-buffer)
   (interactive
    (list (dired-get-marked-files nil nil #'dired-nondirectory-p)
-	 (my/get-good-buffer 'telega-chat-mode "Telega buffer: ")))
+         (my/get-good-buffer 'telega-chat-mode "Telega buffer: ")))
   (unless files
     (user-error "No (non-directory) files selected"))
   (with-current-buffer telega-buffer
@@ -6901,13 +7110,13 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/telega-save-to-dired (msg arg)
   (interactive
    (list (telega-msg-for-interactive)
-	 (prefix-numeric-value current-prefix-arg)))
+         (prefix-numeric-value current-prefix-arg)))
   (if (eq arg 4)
       (progn
-	(setq telega-msg-save-dir
-	      (with-current-buffer (my/get-good-buffer 'dired-mode "Dired buffer: ")
-		(dired-current-directory)))
-	(telega-msg-save msg))
+        (setq telega-msg-save-dir
+              (with-current-buffer (my/get-good-buffer 'dired-mode "Dired buffer: ")
+                (dired-current-directory)))
+        (telega-msg-save msg))
     (setq default-directory (expand-file-name "~"))
     (setq telega-msg-save-dir nil)
     (telega-msg-save msg)))
@@ -6915,58 +7124,58 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/dired-attach-to-notmuch (files notmuch-buffer)
   (interactive
    (list (dired-get-marked-files nil nil #'dired-nondirectory-p)
-	 (my/get-good-buffer 'notmuch-message-mode "Notmuch message buffer: ")))
+         (my/get-good-buffer 'notmuch-message-mode "Notmuch message buffer: ")))
   (unless files
     (user-error "No (non-directory) files selected"))
   (with-current-buffer notmuch-buffer
     (goto-char (point-max))
     (dolist (file files)
       (let ((type
-	     (or (mm-default-file-type file)
-		 "application/octet-stream")))
-	(mml-attach-file
-	 file
-	 type
-	 (mml-minibuffer-read-description)
-	 (mml-minibuffer-read-disposition type nil file))))))
+             (or (mm-default-file-type file)
+                 "application/octet-stream")))
+        (mml-attach-file
+         file
+         type
+         (mml-minibuffer-read-description)
+         (mml-minibuffer-read-disposition type nil file))))))
 

Save a notmuch file to a dired buffer.

(defun my/notmuch-save-to-dired (arg)
   (interactive
    (list (prefix-numeric-value current-prefix-arg)))
   (if (eq arg 4)
       (let ((default-directory
-	     (with-current-buffer (my/get-good-buffer 'dired-mode "Dired buffer: ")
-	       (dired-current-directory))))
-	(notmuch-show-save-part))
+             (with-current-buffer (my/get-good-buffer 'dired-mode "Dired buffer: ")
+               (dired-current-directory))))
+        (notmuch-show-save-part))
     (notmuch-show-save-part)))
 

Attach files to ement.

(defun my/dired-attach-to-ement (files ement-buffer)
   (interactive
    (list (dired-get-marked-files nil nil #'dired-nondirectory-p)
-	 (my/get-good-buffer 'ement-room-mode "Ement room buffer: ")))
+         (my/get-good-buffer 'ement-room-mode "Ement room buffer: ")))
   (unless files
     (user-error "No (non-directory) files selected"))
   (with-current-buffer ement-buffer
     (ement-with-room-and-session
       (dolist (file files)
-	(ement-room-send-file
-	 file
-	 (read-from-minibuffer (format "Message body for %s: " file))
-	 ement-room
-	 ement-session)))))
+        (ement-room-send-file
+         file
+         (read-from-minibuffer (format "Message body for %s: " file))
+         ement-room
+         ement-session)))))
 

Attach files to mastodon.

(defun my/dired-attach-to-mastodon (files mastodon-buffer)
   (interactive
    (list (dired-get-marked-files nil nil #'dired-nondirectory-p)
-	 (or (cl-loop for buf being the buffers
-		      if (eq (buffer-local-value 'mastodon-toot-mode buf) t)
-		      return buf)
-	     (user-error "No buffer found!"))))
+         (or (cl-loop for buf being the buffers
+                      if (eq (buffer-local-value 'mastodon-toot-mode buf) t)
+                      return buf)
+             (user-error "No buffer found!"))))
   (unless files
     (user-error "No (non-directory) files selected"))
   (with-current-buffer mastodon-buffer
     (dolist (file files)
-      (mastodon-toot--attach-media
+      (mastodon-toot-attach-media
        file
        (read-from-minibuffer (format "Description for %s: " file))))))
 

And the keybindings:

@@ -6995,13 +7204,13 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(setq remote-file-name-inhibit-cache nil)
 (setq vc-ignore-dir-regexp
       (format "\\(%s\\)\\|\\(%s\\)"
-	      vc-ignore-dir-regexp
-	      tramp-file-name-regexp))
+              vc-ignore-dir-regexp
+              tramp-file-name-regexp))
 

Also, a hack to make TRAMP find ls on Guix:

(with-eval-after-load 'tramp
   (setq tramp-remote-path
-	(append tramp-remote-path
-		'(tramp-own-remote-path))))
+        (append tramp-remote-path
+                '(tramp-own-remote-path))))
 

Set the default shell to bin/bash for TRAMP or on a remote server.

(when (or my/remote-server)
   (setq explicit-shell-file-name "/bin/bash"))
@@ -7030,9 +7239,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags(with-eval-after-load 'editorconfig
   (advice-add #'editorconfig-apply :around #'my/tramp-void-if-tramp)
   (advice-add #'editorconfig--disabled-for-filename
-	      :around #'my/tramp-void-if-file-is-tramp)
+              :around #'my/tramp-void-if-file-is-tramp)
   (advice-add #'editorconfig--advice-find-file-noselect :around
-	      #'my/editorconfig--advice-find-file-noselect-around))
+              #'my/editorconfig--advice-find-file-noselect-around))
 

all-the-icons-dired runs test on every file in the directory.

(with-eval-after-load 'all-the-icons-dired
   (advice-add #'all-the-icons-dired-mode :around #'my/tramp-void-if-tramp))
@@ -7074,7 +7283,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/vterm-setup ()
   (display-line-numbers-mode 0)
   (setq-local term-prompt-regexp
-	      (rx bol (| ">" "✕") " ")))
+              (rx bol (| ">" "✕") " ")))
 
 (use-package vterm
   :commands (vterm vterm-other-window)
@@ -7129,27 +7338,27 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsOpen a terminal in the lower third of the frame with the ` key.

I guess that’s the first Emacs function I wrote!

(add-to-list 'display-buffer-alist
-	     `(,"vterm-subterminal.*"
-	       (display-buffer-reuse-window
-		display-buffer-in-side-window)
-	       (side . bottom)
-	       (reusable-frames . visible)
-	       (window-height . 0.33)))
+             `(,"vterm-subterminal.*"
+               (display-buffer-reuse-window
+                display-buffer-in-side-window)
+               (side . bottom)
+               (reusable-frames . visible)
+               (window-height . 0.33)))
 
 (defun my/toggle-vterm-subteminal ()
   "Toogle subteminal."
   (interactive)
   (let ((vterm-window
-	 (seq-find
-	  (lambda (window)
-	    (string-match
-	     "vterm-subterminal.*"
-	     (buffer-name (window-buffer window))))
-	  (window-list))))
+         (seq-find
+          (lambda (window)
+            (string-match
+             "vterm-subterminal.*"
+             (buffer-name (window-buffer window))))
+          (window-list))))
     (if vterm-window
-	(if (eq (get-buffer-window (current-buffer)) vterm-window)
-	    (kill-buffer (current-buffer))
-	  (select-window vterm-window))
+        (if (eq (get-buffer-window (current-buffer)) vterm-window)
+            (kill-buffer (current-buffer))
+          (select-window vterm-window))
       (vterm-other-window "vterm-subterminal"))))
 
 ;; (unless my/slow-ssh
@@ -7238,10 +7447,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  ;; XXX 90 to override `evil-collection'
   (add-hook 'eshell-first-time-mode-hook 'my/configure-eshell 90)
   (setq eshell-command-aliases-list
-	'(("q" "exit")
-	  ("c" "clear")
-	  ("ll" "ls -la")
-	  ("e" "find-file")))
+        '(("q" "exit")
+          ("c" "clear")
+          ("ll" "ls -la")
+          ("e" "find-file")))
   (setq eshell-banner-message "")
   ;; (setq eshell-visual-commands
   ;;       `(,@eshell-visual-commands "jless"))
@@ -7253,25 +7462,25 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
 (defun my/get-starship-prompt ()
   (let ((cmd (format "TERM=xterm starship prompt --status=%d --cmd-duration=%d --logical-path=%s"
-		     eshell-last-command-status
-		     (if my/eshell-last-command-start-time
-			 (let ((delta (float-time
-				       (time-subtract
-					(current-time)
-					my/eshell-last-command-start-time))))
-			   (setq my/eshell-last-command-start-time nil)
-			   (round (* delta 1000)))
-		       0)
-		     (shell-quote-argument default-directory))))
+                     eshell-last-command-status
+                     (if my/eshell-last-command-start-time
+                         (let ((delta (float-time
+                                       (time-subtract
+                                        (current-time)
+                                        my/eshell-last-command-start-time))))
+                           (setq my/eshell-last-command-start-time nil)
+                           (round (* delta 1000)))
+                       0)
+                     (shell-quote-argument default-directory))))
     (with-temp-buffer
       (call-process "bash" nil t nil "-c" cmd)
       (when my/is-termux
-	(let ((inhibit-message t))
-	  (replace-string "\\[" "" nil (point-min) (point-max))
-	  (replace-string "\\]" "" nil (point-min) (point-max))))
+        (let ((inhibit-message t))
+          (replace-string "\\[" "" nil (point-min) (point-max))
+          (replace-string "\\]" "" nil (point-min) (point-max))))
       (thread-first "\n"
-		    (concat (string-trim (buffer-string)))
-		    (ansi-color-apply)))))
+                    (concat (string-trim (buffer-string)))
+                    (ansi-color-apply)))))
 
 (defun my/eshell-set-start-time (&rest _args)
   (setq-local my/eshell-last-command-start-time (current-time)))
@@ -7341,20 +7550,20 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/shell-unquote-argument-without-process (string)
   (save-match-data
     (let ((idx 0) next inside
-	  (quote-chars (rx (| "'" "`" "\"" "\\"))))
+          (quote-chars (rx (| "'" "`" "\"" "\\"))))
       (while (and (< idx (length string))
-		  (setq next (string-match quote-chars string next)))
-	(cond ((= (aref string next) ?\\)
-	       (setq string (replace-match "" nil nil string))
-	       (setq next (1+ next)))
-	      ((and inside (= (aref string next) inside))
-	       (setq string (replace-match "" nil nil string))
-	       (setq inside nil))
-	      (inside
-	       (setq next (1+ next)))
-	      (t
-	       (setq inside (aref string next))
-	       (setq string (replace-match "" nil nil string)))))
+                  (setq next (string-match quote-chars string next)))
+        (cond ((= (aref string next) ?\\)
+               (setq string (replace-match "" nil nil string))
+               (setq next (1+ next)))
+              ((and inside (= (aref string next) inside))
+               (setq string (replace-match "" nil nil string))
+               (setq inside nil))
+              (inside
+               (setq next (1+ next)))
+              (t
+               (setq inside (aref string next))
+               (setq string (replace-match "" nil nil string)))))
       string)))
 

Now, verify one suggestion against the current input. At the moment, outside of checking the prefix, it does the following:

    @@ -7365,18 +7574,18 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
    (defun my/eshell-history-is-good-suggestion (input suggestion)
       (and (string-prefix-p input suggestion)
            (if (string-prefix-p "cd " input)
    -	   (let ((suggested-dir
    -		  (my/shell-unquote-argument-without-process
    -		   (substring suggestion 3))))
    -	     (if (or (string-prefix-p "/" suggested-dir)
    -		     (string-prefix-p "~" suggested-dir))
    -		 (file-directory-p suggested-dir)
    -	       (file-directory-p (concat (eshell/pwd) "/" suggested-dir))))
    -	 t)
    +           (let ((suggested-dir
    +                  (my/shell-unquote-argument-without-process
    +                   (substring suggestion 3))))
    +             (if (or (string-prefix-p "/" suggested-dir)
    +                     (string-prefix-p "~" suggested-dir))
    +                 (file-directory-p suggested-dir)
    +               (file-directory-p (concat (eshell/pwd) "/" suggested-dir))))
    +         t)
            (if (string-prefix-p "git" suggestion)
    -	   ;; How is this faster than 'magit-toplevel'?
    -	   (vc-git-root)
    -	 t)))
    +           ;; How is this faster than 'magit-toplevel'?
    +           (vc-git-root)
    +         t)))
     

And propose one suggestion for the current input, because I don’t need more. It users two sources:

  • eshell-history-ring
  • @@ -7387,34 +7596,34 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (unless (seq-empty-p input) (or (when-let (s (cl-loop for elem in (ring-elements eshell-history-ring) - for proc-elem = (string-trim (substring-no-properties elem)) - when (my/eshell-history-is-good-suggestion input proc-elem) - return proc-elem)) + for proc-elem = (string-trim (substring-no-properties elem)) + when (my/eshell-history-is-good-suggestion input proc-elem) + return proc-elem)) (substring s (length input))) (ignore-errors (when-let* ((pcomplete-stub input) - (completions (pcomplete-completions)) - (one-completion (car (all-completions pcomplete-stub completions))) - (bound (car (completion-boundaries pcomplete-stub completions nil "")))) - (unless (zerop bound) - (setq one-completion (concat (substring pcomplete-stub 0 bound) one-completion))) - ;; (message "%s %s" pcomplete-stub one-completion) - (comint-quote-filename - (substring one-completion (min - (length pcomplete-stub) - (length one-completion))))))))) + (completions (pcomplete-completions)) + (one-completion (car (all-completions pcomplete-stub completions))) + (bound (car (completion-boundaries pcomplete-stub completions nil "")))) + (unless (zerop bound) + (setq one-completion (concat (substring pcomplete-stub 0 bound) one-completion))) + ;; (message "%s %s" pcomplete-stub one-completion) + (comint-quote-filename + (substring one-completion (min + (length pcomplete-stub) + (length one-completion)))))))))

As I said, I want to use an overlay to display the suggestion. I tried to store the current overlay in a buffer-local variable, but somehow it was getting lost at times… And there aren’t many overlays anyway, so this doesn’t seem to slow down Emacs that much.

(defun my/eshell-overlay-get ()
   (seq-find (lambda (ov)
-	      (overlay-get ov 'my/eshell-completion-overlay))
-	    (overlays-in (point-min) (point-max))))
+              (overlay-get ov 'my/eshell-completion-overlay))
+            (overlays-in (point-min) (point-max))))
 

Thanks this answer on StackExchange for pointing out the cursor text property.

(defun my/eshell-overlay-update (pos value)
   (let ((overlay-value (propertize value 'face 'shadow
-				   'cursor t))
-	(overlay (my/eshell-overlay-get)))
+                                   'cursor t))
+        (overlay (my/eshell-overlay-get)))
     (if overlay
-	(move-overlay overlay pos pos)
+        (move-overlay overlay pos pos)
       (setq overlay (make-overlay pos pos (current-buffer) nil t))
       (overlay-put overlay 'my/eshell-completion-overlay t))
     (overlay-put overlay 'after-string overlay-value)))
@@ -7427,8 +7636,8 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsThis also hides the overlay if company completion is active because company sometimes creates its own overlays that intersect with mine… I don’t yet understand when it happens because sometimes company just creates the completion dialog with no overlay, and I couldn’t find a way to check if the overlay is created or not.

(defun my/eshell-overlay-suggest (&rest _args)
   (if-let* ((input (my/eshell-get-input))
-	    (suggestion (my/eshell-history-suggest-one input))
-	    (_ (not company-prefix)))
+            (suggestion (my/eshell-history-suggest-one input))
+            (_ (not company-prefix)))
       (my/eshell-overlay-update (line-end-position) suggestion)
     (my/eshell-overlay-remove)))
 

The function can be added in after-change-functions, which is executed on every text modification. This shouldn’t slow eshell down because eshell-send-input sets inhibit-modification-hooks to t.

@@ -7437,9 +7646,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
:after-hook (if my/eshell-overlay-suggest-mode (progn - (add-hook 'after-change-functions #'my/eshell-overlay-suggest nil t) - (add-hook 'company-completion-started-hook #'my/eshell-overlay-suggest nil t) - (add-hook 'company-after-completion-hook #'my/eshell-overlay-suggest nil t)) + (add-hook 'after-change-functions #'my/eshell-overlay-suggest nil t) + (add-hook 'company-completion-started-hook #'my/eshell-overlay-suggest nil t) + (add-hook 'company-after-completion-hook #'my/eshell-overlay-suggest nil t)) (remove-hook 'after-change-functions #'my/eshell-overlay-suggest t) (add-hook 'company-completion-started-hook #'my/eshell-overlay-suggest t) (add-hook 'company-after-completion-hook #'my/eshell-overlay-suggest t) @@ -7451,10 +7660,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (interactive) (if (and (= (point) (line-end-position))) (if-let ((overlay (my/eshell-overlay-get))) - (progn - (delete-overlay overlay) - (insert (overlay-get overlay 'after-string))) - (company-complete)) + (progn + (delete-overlay overlay) + (insert (overlay-get overlay 'after-string))) + (company-complete)) (company-complete)))
Atuin integration

eshell-atuin is my package that integrates eshell with atuin.

@@ -7472,12 +7681,12 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
Dedicated buffer

Make a dedicated buffer for eshell in the bottom of the screen.

(add-to-list 'display-buffer-alist
-	     '("eshell-dedicated.*"
-	       (display-buffer-reuse-window
-		display-buffer-in-side-window)
-	       (side . bottom)
-	       (reusable-frames . visible)
-	       (window-height . 0.33)))
+             '("eshell-dedicated.*"
+               (display-buffer-reuse-window
+                display-buffer-in-side-window)
+               (side . bottom)
+               (reusable-frames . visible)
+               (window-height . 0.33)))
 
 (defun my/eshell-dedicated ()
   (interactive)
@@ -7486,13 +7695,13 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  ;; How?
   (require 'eshell)
   (let* ((eshell-buffer-name "eshell-dedicated")
-	 (dedicated-buffer (get-buffer eshell-buffer-name)))
+         (dedicated-buffer (get-buffer eshell-buffer-name)))
     (if (not dedicated-buffer)
-	(eshell)
+        (eshell)
       (let ((window (get-buffer-window dedicated-buffer)))
-	(if (eq (selected-window) window)
-	    (kill-buffer-and-window)
-	  (select-window window))))))
+        (if (eq (selected-window) window)
+            (kill-buffer-and-window)
+          (select-window window))))))
 
Custom commands
(defun eshell/prt ()
   (if-let ((root (projectile-project-root)))
@@ -7509,10 +7718,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsStill, I’ll probably switch to eat if eshell doesn’t work for me.

(use-package eat
   :straight (:files ("*.el" ("term" "term/*.el") "*.texi"
-		     "*.ti" ("terminfo/e" "terminfo/e/*")
-		     ("terminfo/65" "terminfo/65/*")
-		     ("integration" "integration/*")
-		     (:exclude ".dir-locals.el" "*-tests.el")))
+                     "*.ti" ("terminfo/e" "terminfo/e/*")
+                     ("terminfo/65" "terminfo/65/*")
+                     ("integration" "integration/*")
+                     (:exclude ".dir-locals.el" "*-tests.el")))
   :commands (eat eat-shell-mode)
   :config
   (setq eat-shell "/bin/bash"))
@@ -7545,12 +7754,12 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
 
(with-eval-after-load 'tramp
   (add-to-list 'tramp-methods
-	       `("yadm"
-		 (tramp-login-program "yadm")
-		 (tramp-login-args (("enter")))
-		 (tramp-login-env (("SHELL") "/bin/sh"))
-		 (tramp-remote-shell "/bin/sh")
-		 (tramp-remote-shell-args ("-c")))))
+               `("yadm"
+                 (tramp-login-program "yadm")
+                 (tramp-login-args (("enter")))
+                 (tramp-login-env (("SHELL") "/bin/sh"))
+                 (tramp-remote-shell "/bin/sh")
+                 (tramp-remote-shell-args ("-c")))))
 
 
 (defun my/yadm-magit ()
@@ -7675,14 +7884,14 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
 (with-eval-after-load 'elfeed
   (setq elfeed-search-face-alist
-	'((podcasts elfeed-podcasts-entry)
-	  (music elfeed-music-entry)
-	  (gov elfeed-govt-entry)
-	  (twitter elfeed-twitter-entry)
-	  (videos elfeed-videos-entry)
-	  (emacs elfeed-emacs-entry)
-	  (blogs elfeed-blogs-entry)
-	  (unread elfeed-search-unread-title-face))))
+        '((podcasts elfeed-podcasts-entry)
+          (music elfeed-music-entry)
+          (gov elfeed-govt-entry)
+          (twitter elfeed-twitter-entry)
+          (videos elfeed-videos-entry)
+          (emacs elfeed-emacs-entry)
+          (blogs elfeed-blogs-entry)
+          (unread elfeed-search-unread-title-face))))
 

elfeed-summary

elfeed-summary is my package that provides a feed summary interface for elfeed.

The default interface of elfeed is just a list of all entries, so it gets hard to navigate when there are a lot of sources with varying frequencies of posts. This is my attempt to address this issue.

@@ -7708,12 +7917,12 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsThere are multiple kinds of entries that I want to be opened by EMMS. First, a function that returns a YouTube URL:

(defun my/get-youtube-url (entry)
   (let ((watch-id (cadr
-		   (assoc "watch?v"
-			  (url-parse-query-string
-			   (substring
-			    (url-filename
-			     (url-generic-parse-url (elfeed-entry-link entry)))
-			    1))))))
+                   (assoc "watch?v"
+                          (url-parse-query-string
+                           (substring
+                            (url-filename
+                             (url-generic-parse-url (elfeed-entry-link entry)))
+                            1))))))
     (when watch-id
       (concat "https://www.youtube.com/watch?v=" watch-id))))
 

Second, a function that returns a URL to an enclosure. This is generally how podcasts are distributed.

@@ -7734,12 +7943,12 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(with-eval-after-load 'emms
   (define-emms-source elfeed (entry)
     (let ((url (or (my/get-enclosures-url entry)
-		   (my/get-youtube-url entry))))
+                   (my/get-youtube-url entry))))
       (unless url
-	(error "URL not found"))
+        (error "URL not found"))
       (let ((track (emms-track 'url url)))
-	(emms-track-set track 'info-title (elfeed-entry-title entry))
-	(emms-playlist-insert-track track)))))
+        (emms-track-set track 'info-title (elfeed-entry-title entry))
+        (emms-playlist-insert-track track)))))
 
 (defun my/elfeed-add-emms ()
   (interactive)
@@ -7780,61 +7989,61 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
 Call CALLBACK with the output."
   (let* ((buffer (generate-new-buffer "rdrview"))
-	 (proc (start-process "rdrview" buffer "rdrview"
-			      url "-T" "title,sitename,body"
-			      "-H")))
+         (proc (start-process "rdrview" buffer "rdrview"
+                              url "-T" "title,sitename,body"
+                              "-H")))
     (set-process-sentinel
      proc
      (lambda (process _msg)
        (let ((status (process-status process))
-	     (code (process-exit-status process)))
-	 (cond ((and (eq status 'exit) (= code 0))
-		(progn
-		  (funcall callback
-			   (with-current-buffer (process-buffer process)
-			     (buffer-string)))
-		  (kill-buffer (process-buffer process))) )
-	       ((or (and (eq status 'exit) (> code 0))
-		    (eq status 'signal))
-		(let ((err (with-current-buffer (process-buffer process)
-			     (buffer-string))))
-		  (kill-buffer (process-buffer process))
-		  (user-error "Error in rdrview: %s" err)))))))
+             (code (process-exit-status process)))
+         (cond ((and (eq status 'exit) (= code 0))
+                (progn
+                  (funcall callback
+                           (with-current-buffer (process-buffer process)
+                             (buffer-string)))
+                  (kill-buffer (process-buffer process))) )
+               ((or (and (eq status 'exit) (> code 0))
+                    (eq status 'signal))
+                (let ((err (with-current-buffer (process-buffer process)
+                             (buffer-string))))
+                  (kill-buffer (process-buffer process))
+                  (user-error "Error in rdrview: %s" err)))))))
     proc))
 

The function calls callback with the output of rdrview. This usually doesn’t take long, but it’s still nice to avoid freezing Emacs that way.

Now we have to parse the output. The -T flag puts the title in the <h1> tag, the site name site in the <h2> tag, and the content in a <div>. What’s more, headers of the content are often shifted, e.g. the top-level header may well end up being and <h2> or <h3>, which does not look great in LaTeX.

With that said, here’s a function that does the required changes:

(defun my/rdrview-parse (dom-string)
   (let ((dom (with-temp-buffer
-	       (insert dom-string)
-	       (libxml-parse-html-region (point-min) (point-max)))))
+               (insert dom-string)
+               (libxml-parse-html-region (point-min) (point-max)))))
     (let (title sitename content (i 0))
       (dolist (child (dom-children (car (dom-by-id dom "readability-page-1"))))
-	(when (listp child)
-	  (cond
-	   ((eq (car child) 'h1)
-	    (setq title (dom-text child)))
-	   ((eq (car child) 'h2)
-	    (setq sitename (dom-text child)))
-	   ((eq (car child) 'div)
-	    (setq content child)))))
+        (when (listp child)
+          (cond
+           ((eq (car child) 'h1)
+            (setq title (dom-text child)))
+           ((eq (car child) 'h2)
+            (setq sitename (dom-text child)))
+           ((eq (car child) 'div)
+            (setq content child)))))
       (while (and
-	      (not (dom-by-tag content 'h1))
-	      (dom-search
-	       content
-	       (lambda (el)
-		 (when (listp el)
-		   (pcase (car el)
-		     ('h2 (setf (car el) 'h1))
-		     ('h3 (setf (car el) 'h2))
-		     ('h4 (setf (car el) 'h3))
-		     ('h5 (setf (car el) 'h4))
-		     ('h6 (setf (car el) 'h5))))))))
+              (not (dom-by-tag content 'h1))
+              (dom-search
+               content
+               (lambda (el)
+                 (when (listp el)
+                   (pcase (car el)
+                     ('h2 (setf (car el) 'h1))
+                     ('h3 (setf (car el) 'h2))
+                     ('h4 (setf (car el) 'h3))
+                     ('h5 (setf (car el) 'h4))
+                     ('h6 (setf (car el) 'h5))))))))
       `((title . ,title)
-	(sitename . ,sitename)
-	(content . ,(with-temp-buffer
-		      (dom-print content)
-		      (buffer-string)))))))
+        (sitename . ,sitename)
+        (content . ,(with-temp-buffer
+                      (dom-print content)
+                      (buffer-string)))))))
 
Using rdrview from elfeed

Because I didn’t find a smart way to advise the desired behavior into elfeed, here’s a modification of the elfeed-show-refresh--mail-style function with two changes:

    @@ -7852,45 +8061,45 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (elfeed-entry-link elfeed-show-entry) (lambda (result) (let* ((data (my/rdrview-parse result)) - (inhibit-read-only t) - (title (elfeed-entry-title elfeed-show-entry)) - (date (seconds-to-time (elfeed-entry-date elfeed-show-entry))) - (authors (elfeed-meta elfeed-show-entry :authors)) - (link (elfeed-entry-link elfeed-show-entry)) - (tags (elfeed-entry-tags elfeed-show-entry)) - (tagsstr (mapconcat #'symbol-name tags ", ")) - (nicedate (format-time-string "%a, %e %b %Y %T %Z" date)) - (content (alist-get 'content data)) - (feed (elfeed-entry-feed elfeed-show-entry)) - (feed-title (elfeed-feed-title feed)) - (base (and feed (elfeed-compute-base (elfeed-feed-url feed))))) + (inhibit-read-only t) + (title (elfeed-entry-title elfeed-show-entry)) + (date (seconds-to-time (elfeed-entry-date elfeed-show-entry))) + (authors (elfeed-meta elfeed-show-entry :authors)) + (link (elfeed-entry-link elfeed-show-entry)) + (tags (elfeed-entry-tags elfeed-show-entry)) + (tagsstr (mapconcat #'symbol-name tags ", ")) + (nicedate (format-time-string "%a, %e %b %Y %T %Z" date)) + (content (alist-get 'content data)) + (feed (elfeed-entry-feed elfeed-show-entry)) + (feed-title (elfeed-feed-title feed)) + (base (and feed (elfeed-compute-base (elfeed-feed-url feed))))) (erase-buffer) (insert (format (propertize "Title: %s\n" 'face 'message-header-name) - (propertize title 'face 'message-header-subject))) + (propertize title 'face 'message-header-subject))) (when elfeed-show-entry-author - (dolist (author authors) - (let ((formatted (elfeed--show-format-author author))) - (insert - (format (propertize "Author: %s\n" 'face 'message-header-name) - (propertize formatted 'face 'message-header-to)))))) + (dolist (author authors) + (let ((formatted (elfeed--show-format-author author))) + (insert + (format (propertize "Author: %s\n" 'face 'message-header-name) + (propertize formatted 'face 'message-header-to)))))) (insert (format (propertize "Date: %s\n" 'face 'message-header-name) - (propertize nicedate 'face 'message-header-other))) + (propertize nicedate 'face 'message-header-other))) (insert (format (propertize "Feed: %s\n" 'face 'message-header-name) - (propertize feed-title 'face 'message-header-other))) + (propertize feed-title 'face 'message-header-other))) (when tags - (insert (format (propertize "Tags: %s\n" 'face 'message-header-name) - (propertize tagsstr 'face 'message-header-other)))) + (insert (format (propertize "Tags: %s\n" 'face 'message-header-name) + (propertize tagsstr 'face 'message-header-other)))) (insert (propertize "Link: " 'face 'message-header-name)) (elfeed-insert-link link link) (insert "\n") (cl-loop for enclosure in (elfeed-entry-enclosures elfeed-show-entry) - do (insert (propertize "Enclosure: " 'face 'message-header-name)) - do (elfeed-insert-link (car enclosure)) - do (insert "\n")) + do (insert (propertize "Enclosure: " 'face 'message-header-name)) + do (elfeed-insert-link (car enclosure)) + do (insert "\n")) (insert "\n") (if content - (elfeed-insert-html content base) - (insert (propertize "(empty)\n" 'face 'italic))) + (elfeed-insert-html content base) + (insert (propertize "(empty)\n" 'face 'italic))) (setq-local my/elfeed-show-rdrview-html content) (goto-char (point-min))))))

That way, calling M-x my/rdrview-elfeed-show replaces the original content with one from rdrview.

@@ -7919,7 +8128,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsInvoking pandoc

Now that we have the template, let’s save it somewhere and store the path to a variable:

(setq my/rdrview-template (expand-file-name
-			   (concat user-emacs-directory "rdrview.tex")))
+                           (concat user-emacs-directory "rdrview.tex")))
 

And let’s invoke pandoc. We need to pass the following flags:

  • --pdf-engine=xelatex, of course
  • @@ -7930,7 +8139,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsIn fact, pandoc is a pretty awesome tool in the sense that it allows for feeding custom variables to rich-language templates.

    So, the rendering function is as follows:

    (cl-defun my/rdrview-render (content type variables callback
    -				     &key file-name overwrite)
    +                                     &key file-name overwrite)
       "Render CONTENT with pandoc.
     
     TYPE is a file extension as supported by pandoc, for instance,
    @@ -7947,34 +8156,34 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (unless file-name
         (setq file-name (format "/tmp/%d.pdf" (random 100000000))))
       (let (params
    -	(temp-file-name (format "/tmp/%d.%s" (random 100000000) type)))
    +        (temp-file-name (format "/tmp/%d.%s" (random 100000000) type)))
         (cl-loop for (key . value) in variables
    -	     when value
    -	     do (progn
    -		  (push "--variable" params)
    -		  (push (format "%s=%s" key value) params)))
    +             when value
    +             do (progn
    +                  (push "--variable" params)
    +                  (push (format "%s=%s" key value) params)))
         (setq params (nreverse params))
         (if (and (file-exists-p file-name) (not overwrite))
    -	(funcall callback file-name)
    +        (funcall callback file-name)
           (with-temp-file temp-file-name
    -	(insert content))
    +        (insert content))
           (let ((proc (apply #'start-process
    -			 "pandoc" (get-buffer-create "*Pandoc*") "pandoc"
    -			 temp-file-name "-o" file-name
    -			 "--pdf-engine=xelatex" "--template" my/rdrview-template
    -			 params)))
    -	(set-process-sentinel
    -	 proc
    -	 (lambda (process _msg)
    -	   (let ((status (process-status process))
    -		 (code (process-exit-status process)))
    -	     (cond ((and (eq status 'exit) (= code 0))
    -		    (progn
    -		      (message "Done!")
    -		      (funcall callback file-name)))
    -		   ((or (and (eq status 'exit) (> code 0))
    -			(eq status 'signal))
    -		    (user-error "Error in pandoc. Check the *Pandoc* buffer"))))))))))
    +                         "pandoc" (get-buffer-create "*Pandoc*") "pandoc"
    +                         temp-file-name "-o" file-name
    +                         "--pdf-engine=xelatex" "--template" my/rdrview-template
    +                         params)))
    +        (set-process-sentinel
    +         proc
    +         (lambda (process _msg)
    +           (let ((status (process-status process))
    +                 (code (process-exit-status process)))
    +             (cond ((and (eq status 'exit) (= code 0))
    +                    (progn
    +                      (message "Done!")
    +                      (funcall callback file-name)))
    +                   ((or (and (eq status 'exit) (> code 0))
    +                        (eq status 'signal))
    +                    (user-error "Error in pandoc. Check the *Pandoc* buffer"))))))))))
     
    Opening elfeed entries

    Now we have everything required to open elfeed entries.

    Also, in my case elfeed entries come in two languages, so I have to set main-lang and other-lang variables accordingly. Here’s the main function:

    @@ -7987,30 +8196,30 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsPDF already exists." (interactive (list elfeed-show-entry current-prefix-arg)) (let ((authors (mapcar (lambda (m) (plist-get m :name)) (elfeed-meta entry :authors))) - (feed-title (elfeed-feed-title (elfeed-entry-feed entry))) - (tags (mapconcat #'symbol-name (elfeed-entry-tags entry) ", ")) - (date (format-time-string "%a, %e %b %Y" - (seconds-to-time (elfeed-entry-date entry)))) - (content (elfeed-deref (elfeed-entry-content entry))) - (file-name (concat my/elfeed-pdf-dir - (elfeed-ref-id (elfeed-entry-content entry)) - ".pdf")) - (main-language "english") - (other-language "russian")) + (feed-title (elfeed-feed-title (elfeed-entry-feed entry))) + (tags (mapconcat #'symbol-name (elfeed-entry-tags entry) ", ")) + (date (format-time-string "%a, %e %b %Y" + (seconds-to-time (elfeed-entry-date entry)))) + (content (elfeed-deref (elfeed-entry-content entry))) + (file-name (concat my/elfeed-pdf-dir + (elfeed-ref-id (elfeed-entry-content entry)) + ".pdf")) + (main-language "english") + (other-language "russian")) (unless content (user-error "No content!")) (setq subtitle - (cond - ((seq-empty-p authors) feed-title) - ((and (not (seq-empty-p (car authors))) - (string-match-p (regexp-quote (car authors)) feed-title)) feed-title) - (t (concat (string-join authors ", ") "\\\\" feed-title)))) + (cond + ((seq-empty-p authors) feed-title) + ((and (not (seq-empty-p (car authors))) + (string-match-p (regexp-quote (car authors)) feed-title)) feed-title) + (t (concat (string-join authors ", ") "\\\\" feed-title)))) (when (member 'ru (elfeed-entry-tags entry)) (setq main-language "russian") (setq other-language "english")) (my/rdrview-render (if (bound-and-true-p my/elfeed-show-rdrview-html) - my/elfeed-show-rdrview-html + my/elfeed-show-rdrview-html content) (elfeed-entry-content-type entry) `((title . ,(elfeed-entry-title entry)) @@ -8034,18 +8243,18 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsAs you may have noticed, we also can display arbitrary web pages with this setup, so let’s go ahead and implement that:

    (defun my/get-languages (url)
       (let ((main-lang "english")
    -	(other-lang "russian"))
    +        (other-lang "russian"))
         (when (string-match-p (rx ".ru") url)
           (setq main-lang "russian"
    -	    other-lang "english"))
    +            other-lang "english"))
         (list main-lang other-lang)))
     
     (defun my/rdrview-open (url overwrite)
       (interactive
        (let ((url (read-from-minibuffer
    -	       "URL: "
    -	       (if (bound-and-true-p elfeed-show-entry)
    -		   (elfeed-entry-link elfeed-show-entry)))))
    +               "URL: "
    +               (if (bound-and-true-p elfeed-show-entry)
    +                   (elfeed-entry-link elfeed-show-entry)))))
          (when (string-empty-p url)
            (user-error "URL is empty"))
          (list url current-prefix-arg)))
    @@ -8053,16 +8262,16 @@ Didn’t work out as I expected, so I’ve made org-journal-tags   url
        (lambda (res)
          (let ((data (my/rdrview-parse res))
    -	   (langs (my/get-languages url)))
    +           (langs (my/get-languages url)))
            (my/rdrview-render
    -	(alist-get 'content data)
    -	'html
    -	`((title . ,(alist-get 'title data))
    -	  (subtitle . ,(alist-get 'sitename data))
    -	  (main-lang . ,(nth 0 langs))
    -	  (other-lang . ,(nth 1 langs)))
    -	(lambda (file-name)
    -	  (start-process "xdg-open" nil "xdg-open" file-name)))))))
    +        (alist-get 'content data)
    +        'html
    +        `((title . ,(alist-get 'title data))
    +          (subtitle . ,(alist-get 'sitename data))
    +          (main-lang . ,(nth 0 langs))
    +          (other-lang . ,(nth 1 langs)))
    +        (lambda (file-name)
    +          (start-process "xdg-open" nil "xdg-open" file-name)))))))
     

    Unfortunately, this part doesn’t work that well, so we can’t just uninstall Firefox or Chromium and browse the web from a PDF viewer.

    The most common problem I’ve encountered is incorrectly formed pictures, such as .png files without the boundary info. I’m sure you’ve also come across this if you ever tried to insert a lot of Internet pictures into a LaTeX document.

    However, sans the pictures issue, for certain sites like Wikipedia this is usable.

    @@ -8095,37 +8304,37 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
    invoke CALLBACK straight away without doing the rendering, unless OVERWRITE is non-nil." (interactive (list (read-string "Video ID: ") - (lambda (file-name) - (find-file file-name)) - :file-name nil - :overwrite t)) + (lambda (file-name) + (find-file file-name)) + :file-name nil + :overwrite t)) (unless file-name (setq file-name (format "/tmp/%d.vtt" (random 100000000)))) (if (and (file-exists-p file-name) (not overwrite)) (funcall callback file-name) (let* ((buffer (generate-new-buffer "youtube-transcripts")) - (proc (start-process "youtube_transcript_api" buffer - "youtube_transcript_api" video-id - "--languages" "en" "ru" "de" - "--format" "webvtt"))) + (proc (start-process "youtube_transcript_api" buffer + "youtube_transcript_api" video-id + "--languages" "en" "ru" "de" + "--format" "webvtt"))) (set-process-sentinel proc (lambda (process _msg) - (let ((status (process-status process)) - (code (process-exit-status process))) - (cond ((and (eq status 'exit) (= code 0)) - (progn - (with-current-buffer (process-buffer process) - (setq buffer-file-name file-name) - (save-buffer)) - (kill-buffer (process-buffer process)) - (funcall callback file-name))) - ((or (and (eq status 'exit) (> code 0)) - (eq status 'signal)) - (let ((err (with-current-buffer (process-buffer process) - (buffer-string)))) - (kill-buffer (process-buffer process)) - (user-error "Error in youtube_transcript_api: %s" err))))))) + (let ((status (process-status process)) + (code (process-exit-status process))) + (cond ((and (eq status 'exit) (= code 0)) + (progn + (with-current-buffer (process-buffer process) + (setq buffer-file-name file-name) + (save-buffer)) + (kill-buffer (process-buffer process)) + (funcall callback file-name))) + ((or (and (eq status 'exit) (> code 0)) + (eq status 'signal)) + (let ((err (with-current-buffer (process-buffer process) + (buffer-string)))) + (kill-buffer (process-buffer process)) + (user-error "Error in youtube_transcript_api: %s" err))))))) proc)))
elfeed and subed

Now that we have a standalone function, let’s invoke it with the current elfeed-show-entry:

@@ -8140,23 +8349,23 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
they were fetched before." (interactive (list elfeed-show-entry current-prefix-arg)) (let ((video-id (cadr - (assoc "watch?v" - (url-parse-query-string - (substring - (url-filename - (url-generic-parse-url (elfeed-entry-link entry))) - 1)))))) + (assoc "watch?v" + (url-parse-query-string + (substring + (url-filename + (url-generic-parse-url (elfeed-entry-link entry))) + 1)))))) (unless video-id (user-error "Can't get video ID from the entry")) (my/youtube-subtitles-get video-id (lambda (file-name) (with-current-buffer (find-file-other-window file-name) - (setq-local elfeed-show-entry entry) - (goto-char (point-min)))) + (setq-local elfeed-show-entry entry) + (goto-char (point-min)))) :file-name (concat my/elfeed-srt-dir - (elfeed-ref-id (elfeed-entry-content entry)) - ".vtt") + (elfeed-ref-id (elfeed-entry-content entry)) + ".vtt") :overwrite arg)))

That opens up a .vtt buffer with the subtitles for the current video, which means now we can use the functionality of Sacha Chua’s awesome package called subed.

This package, besides syntax highlighting, allows for controlling the MPV playback, for instance by moving the cursor in the subtitles buffer. Using that requires having the URL of the video in this buffer, which necessitates the line with setq-local in the previous function.

@@ -8172,8 +8381,8 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(unless (derived-mode-p 'subed-mode) (user-error "Not subed mode!")) (setq-local subed-mpv-arguments - (seq-uniq - (append subed-mpv-arguments emms-player-mpv-parameters))) + (seq-uniq + (append subed-mpv-arguments emms-player-mpv-parameters))) (setq-local subed-mpv-video-file (elfeed-entry-link entry)) (subed-mpv--play subed-mpv-video-file))

Keep in mind that this function has to be launched inside the buffer opened by the my/elfeed-youtube-subtitles function.

@@ -8183,7 +8392,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(unless (or my/remote-server)
   (let ((mail-file (expand-file-name "mail.el" user-emacs-directory)))
     (if (file-exists-p mail-file)
-	(load-file mail-file)
+        (load-file mail-file)
       (message "Can't load mail.el"))))
 

Gnus

Gnus is an Emacs newsreader.

@@ -8222,10 +8431,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(when (gnus-group-topic-p) (let ((topic (gnus-topic-find-topology (gnus-current-topic)))) (if (eq (cadadr topic) 'visible) - (progn - (gnus-topic-goto-topic (gnus-current-topic)) - (gnus-topic-remove-topic nil nil)) - (gnus-topic-remove-topic t nil))))) + (progn + (gnus-topic-goto-topic (gnus-current-topic)) + (gnus-topic-remove-topic nil nil)) + (gnus-topic-remove-topic t nil)))))

Custom keybindings.

(with-eval-after-load 'gnus-group
   ;; Group
@@ -8261,10 +8470,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  :straight t
   :if (not (or my/remote-server my/is-termux))
   :commands (emms-smart-browse
-	     emms-browser
-	     emms-add-url
-	     emms-add-file
-	     emms-add-find)
+             emms-browser
+             emms-add-url
+             emms-add-file
+             emms-add-find)
   :init
   (my-leader-def
     :infix "as"
@@ -8319,12 +8528,12 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(add-hook 'emms-playlist-cleared-hook 'emms-player-mpd-clear)
 

Set a custom regex for MPD. EMMS sets up the default one from MPD’s diagnostic output so that regex opens basically everything, including videos, https links, etc. That is fine if MPD is the only player in EMMS, but as I want to use MPV as well, I override the regex.

(emms-player-set emms-player-mpd
-		 'regex
-		 (rx (or (: "https://" (* nonl) (or "acast.com") (* nonl))
-			 (+ (? (or "https://" "http://"))
-			    (* nonl)
-			    (regexp (eval (emms-player-simple-regexp
-					   "m3u" "ogg" "flac" "mp3" "wav" "mod" "au" "aiff" "m4a")))))))
+                 'regex
+                 (rx (or (: "https://" (* nonl) (or "acast.com") (* nonl))
+                         (+ (? (or "https://" "http://"))
+                            (* nonl)
+                            (regexp (eval (emms-player-simple-regexp
+                                           "m3u" "ogg" "flac" "mp3" "wav" "mod" "au" "aiff" "m4a")))))))
 

After all this is done, run M-x emms-cache-set-from-mpd-all to set cache from MPD. If everything is correct, EMMS browser will be populated with MPD database.

MPV
@@ -8349,17 +8558,17 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(add-to-list 'emms-player-list 'emms-player-mpv t)
 

Also a custom regex. My demands for MPV include running yt-dlp, so there is a regex that matches youtube.com or some of the video formats.

(emms-player-set emms-player-mpv
-		 'regex
-		 (rx (or (: "https://" (* nonl) "youtube.com" (* nonl))
-			 (+ (? (or "https://" "http://"))
-			    (* nonl)
-			    (regexp (eval (emms-player-simple-regexp
-			    "mp4" "mov" "wmv" "webm" "flv" "avi" "mkv")))))))
+                 'regex
+                 (rx (or (: "https://" (* nonl) "youtube.com" (* nonl))
+                         (+ (? (or "https://" "http://"))
+                            (* nonl)
+                            (regexp (eval (emms-player-simple-regexp
+                            "mp4" "mov" "wmv" "webm" "flv" "avi" "mkv")))))))
 

By default, MPV plays the video in the best possible quality, which may be pretty high, even too high with limited bandwidth. So here is the logic to choose the quality.

(setq my/youtube-dl-quality-list
       '("bestvideo[height<=720]+bestaudio/best[height<=720]"
-	"bestvideo[height<=480]+bestaudio/best[height<=480]"
-	"bestvideo[height<=1080]+bestaudio/best[height<=1080]"))
+        "bestvideo[height<=480]+bestaudio/best[height<=480]"
+        "bestvideo[height<=1080]+bestaudio/best[height<=1080]"))
 
 (setq my/default-emms-player-mpv-parameters
       '("--quiet" "--really-quiet" "--no-audio-display"))
@@ -8369,7 +8578,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (unless quality
     (setq quality (completing-read "Quality: " my/youtube-dl-quality-list nil t)))
   (setq emms-player-mpv-parameters
-	`(,@my/default-emms-player-mpv-parameters ,(format "--ytdl-format=%s" quality))))
+        `(,@my/default-emms-player-mpv-parameters ,(format "--ytdl-format=%s" quality))))
 
 (my/set-emms-mpd-youtube-quality (car my/youtube-dl-quality-list))
 

Now emms-add-url should work on YouTube URLs just fine. Just keep in mind that it will only add the URL to the playlist, not play it right away.

@@ -8379,9 +8588,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (interactive) (let ((keys-to-delete '())) (maphash (lambda (key value) - (when (eq (cdr (assoc 'type value)) 'url) - (add-to-list 'keys-to-delete key))) - emms-cache-db) + (when (eq (cdr (assoc 'type value)) 'url) + (add-to-list 'keys-to-delete key))) + emms-cache-db) (dolist (key keys-to-delete) (remhash key emms-cache-db))) (setq emms-cache-dirty t)) @@ -8398,7 +8607,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags "asT" #'lyrics-fetcher-show-lyrics-query) :config (setq lyrics-fetcher-genius-access-token - (my/password-store-get "My_Online/APIs/genius.com")) + (my/password-store-get "My_Online/APIs/genius.com")) (general-define-key :states '(emacs normal) :keymaps 'emms-browser-mode-map @@ -8408,23 +8617,23 @@ Didn’t work out as I expected, so I’ve made org-journal-tags "go" 'lyrics-fetcher-emms-browser-open-large-cover-at-point) (advice-add #'emms-lyrics-mode-line - :override #'my/emms-lyrics-mode-line-override)) + :override #'my/emms-lyrics-mode-line-override))

Also advice to change the location of the lyrics in the mode line.

(defun my/emms-lyrics-mode-line-override ()
   (add-to-list 'global-mode-string
-	       '(:eval emms-lyrics-mode-line-string)))
+               '(:eval emms-lyrics-mode-line-string)))
 
 (defun my/emms-lyrics-restore-mode-line-override ()
   "Restore the mode line."
   (setq global-mode-string
-	(remove '(:eval emms-lyrics-mode-line-string) global-mode-string))
+        (remove '(:eval emms-lyrics-mode-line-string) global-mode-string))
   (force-mode-line-update))
 
 (with-eval-after-load 'emms-lyrics
   (advice-add #'emms-lyrics-mode-line
-	      :override #'my/emms-lyrics-mode-line-override)
+              :override #'my/emms-lyrics-mode-line-override)
   (advice-add #'emms-lyrics-restore-mode-line
-	      :override #'my/emms-lyrics-restore-mode-line-override))
+              :override #'my/emms-lyrics-restore-mode-line-override))
 
Some keybindings
(with-eval-after-load 'emms-browser
   (general-define-key
@@ -8440,9 +8649,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
Setting volume
(defun my/set-volume (value)
   (start-process "ponymix" nil "ponymix"
-		 (if (< 0 value) "increase" "decrease")
-		 (number-to-string (abs value))
-		 "--max-volume" "150"))
+                 (if (< 0 value) "increase" "decrease")
+                 (number-to-string (abs value))
+                 "--max-volume" "150"))
 
 (setq emms-volume-change-function #'my/set-volume)
 (setq emms-volume-change-amount 5)
@@ -8452,23 +8661,23 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun emms-info-mpd-process (track info)
   (dolist (data info)
     (let ((name (car data))
-	  (value (cdr data)))
+          (value (cdr data)))
       (setq name (cond ((string= name "artist") 'info-artist)
-		       ((string= name "albumartist") 'info-albumartist)
-		       ((string= name "composer") 'info-composer)
-		       ((string= name "performer") 'info-performer)
-		       ((string= name "title") 'info-title)
-		       ((string= name "album") 'info-album)
-		       ((string= name "track") 'info-tracknumber)
-		       ((string= name "disc") 'info-discnumber)
-		       ((string= name "date") 'info-year)
-		       ((string= name "genre") 'info-genre)
-		       ((string= name "time")
-			(setq value (string-to-number value))
-			'info-playing-time)
-		       (t nil)))
+                       ((string= name "albumartist") 'info-albumartist)
+                       ((string= name "composer") 'info-composer)
+                       ((string= name "performer") 'info-performer)
+                       ((string= name "title") 'info-title)
+                       ((string= name "album") 'info-album)
+                       ((string= name "track") 'info-tracknumber)
+                       ((string= name "disc") 'info-discnumber)
+                       ((string= name "date") 'info-year)
+                       ((string= name "genre") 'info-genre)
+                       ((string= name "time")
+                        (setq value (string-to-number value))
+                        'info-playing-time)
+                       (t nil)))
       (when name
-	(emms-track-set track name value)))))
+        (emms-track-set track name value)))))
 

Also, emms-player-mpd-get-alists has an interesting bug. This function parses the response to listallinfo, which looks something like this:

tag1: value1
 tag2: value2
@@ -8487,19 +8696,19 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
 The list will be in reverse order."
   (when (and info
-	     (null (car info))          ; no error has occurred
-	     (cdr info))                ; data exists
+             (null (car info))          ; no error has occurred
+             (cdr info))                ; data exists
     (let ((alists nil)
-	  (alist nil)
-	  cell)
+          (alist nil)
+          cell)
       (dolist (line (cdr info))
-	(when (setq cell (emms-player-mpd-parse-line line))
-	  (if (member (car cell) '("file" "directory" "playlist"))
-	      (setq alists (cons alist alists)
-		    alist (list cell))
-	    (setq alist (cons cell alist)))))
+        (when (setq cell (emms-player-mpd-parse-line line))
+          (if (member (car cell) '("file" "directory" "playlist"))
+              (setq alists (cons alist alists)
+                    alist (list cell))
+            (setq alist (cons cell alist)))))
       (when alist
-	(setq alists (cons alist alists)))
+        (setq alists (cons alist alists)))
       alists)))
 

EWW

Emacs built-in web browser. I wonder if anyone actually uses it.

@@ -8529,9 +8738,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
'face (mapcar (lambda (face) - (if (eq face 'my/shr-face) - 'link - face)) + (if (eq face 'my/shr-face) + 'link + face)) (if (sequencep faces) faces (list faces)))))) (with-eval-after-load 'shr @@ -8561,21 +8770,21 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (add-to-list 'erc-modules 'log) (erc-update-modules) (setq erc-autojoin-channels-alist - `((,(rx "libera.chat") - "#systemcrafters" "#systemcrafters-emacs"))) + `((,(rx "libera.chat") + "#systemcrafters" "#systemcrafters-emacs"))) (setq erc-kill-buffer-on-part t) (setq erc-track-shorten-start 8))

Exclude everything but actual messages from notifications.

(setq erc-track-exclude-types '("NICK" "JOIN" "LEAVE" "QUIT" "PART"
-				"301"   ; away notice
-				"305"   ; return from awayness
-				"306"   ; set awayness
-				"324"   ; modes
-				"329"   ; channel creation date
-				"332"   ; topic notice
-				"333"   ; who set the topic
-				"353"   ; Names notice
-				))
+                                "301"   ; away notice
+                                "305"   ; return from awayness
+                                "306"   ; set awayness
+                                "324"   ; modes
+                                "329"   ; channel creation date
+                                "332"   ; topic notice
+                                "333"   ; who set the topic
+                                "353"   ; Names notice
+                                ))
 

A plugin to highlight IRC nicknames:

(use-package erc-hl-nicks
   :hook (erc-mode . erc-hl-nicks-mode)
@@ -8591,18 +8800,18 @@ Didn’t work out as I expected, so I’ve made org-journal-tags    erc-mode 3 "ERC")
   :config
   (setq znc-servers
-	`(("sqrtminusone.xyz" 6697 t
-	   ((libera "sqrtminusone"
-		    ,(my/password-store-get "Selfhosted/ZNC")))))))
+        `(("sqrtminusone.xyz" 6697 t
+           ((libera "sqrtminusone"
+                    ,(my/password-store-get "Selfhosted/ZNC")))))))
 

Send /detach to all servers. Kinda strange that there’s no such function already

(defun my/erc-detach-all ()
   (interactive)
   (cl-loop for buf being the buffers
-	   if (eq (buffer-local-value 'major-mode buf) 'erc-mode)
-	   do (with-current-buffer buf
-		(when (erc-server-process-alive)
-		  (let ((tgt (erc-default-target)))
-		    (erc-server-send (format "DETACH %s" tgt) nil tgt))))))
+           if (eq (buffer-local-value 'major-mode buf) 'erc-mode)
+           do (with-current-buffer buf
+                (when (erc-server-process-alive)
+                  (let ((tgt (erc-default-target)))
+                    (erc-server-send (format "DETACH %s" tgt) nil tgt))))))
 

Mastodon

Mastodon is a decentralized social media network. I use an instance called emacs.ch.

Package configuration
@@ -8623,22 +8832,22 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(setq mastodon-tl--timeline-posts-count "40") (setq mastodon-tl--show-avatars t) (setq mastodon-tl--horiz-bar - (make-string shr-max-width - (if (char-displayable-p ?―) ?― ?-))) + (make-string shr-max-width + (if (char-displayable-p ?―) ?― ?-))) ;; The default emojis take two characters for me (mapcar (lambda (item) - (setf (alist-get (car item) mastodon-tl--symbols) - (cdr item))) - '((reply "" . "R") - (boost "" . "B") - (favourite "" . "F") - (bookmark "" . "K") - (media "" . "[media]") - (verified "" . "V") - (locked "" . "[locked]") - (private "" . "[followers]") - (direct "" . "[direct]") - (edited "" . "[edited]")))) + (setf (alist-get (car item) mastodon-tl--symbols) + (cdr item))) + '((reply "" . "R") + (boost "" . "B") + (favourite "" . "F") + (bookmark "" . "K") + (media "" . "[media]") + (verified "" . "V") + (locked "" . "[locked]") + (private "" . "[followers]") + (direct "" . "[direct]") + (edited "" . "[edited]")))) (use-package mastodon-alt :straight (:host github :repo "rougier/mastodon-alt") @@ -8664,22 +8873,22 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/mastodon-reset ()
   (interactive)
   (cl-loop for process in (process-list)
-	   if (string-match-p "emacs.ch" (process-name process))
-	   do (delete-process process)))
+           if (string-match-p "emacs.ch" (process-name process))
+           do (delete-process process)))
 

The package also doesn’t have evil bindings. I implement a few basic bindings here:

(with-eval-after-load 'mastodon
   (general-define-key
    :states '(normal motion)
    :keymaps '(mastodon-mode-map)
-   "J" #'mastodon-tl--goto-next-item
-   "K" #'mastodon-tl--goto-prev-item
-   "M-j" #'mastodon-tl--next-tab-item
-   "M-k" #'mastodon-tl--prev-tab-item
-   "<tab>" #'mastodon-tl--next-tab-item
-   "<backtab>" #'mastodon-tl--previous-tab-item
+   "J" #'mastodon-tl-goto-next-item
+   "K" #'mastodon-tl-goto-prev-item
+   "M-j" #'mastodon-tl-next-tab-item
+   "M-k" #'mastodon-tl-prev-tab-item
+   "<tab>" #'mastodon-tl-next-tab-item
+   "<backtab>" #'mastodon-tl-previous-tab-item
    "o" #'my/mastodon-toot
-   "r" 'mastodon-tl--update
-   "c" #'mastodon-tl--toggle-spoiler-text-in-toot
+   "r" 'mastodon-tl-update
+   "c" #'mastodon-tl-toggle-spoiler-text-in-toot
    "q" #'kill-current-buffer))
 
Modeline segment

This is my attempt to make a modeline indicator for new mastodon notifications.

@@ -8699,30 +8908,30 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(when (file-exists-p my/mastodon-mode-line-file) (ignore-errors (with-temp-buffer - (insert-file-contents my/mastodon-mode-line-file) - (setq my/mastodon-mode-line-saved-ids - (read (current-buffer))))))) + (insert-file-contents my/mastodon-mode-line-file) + (setq my/mastodon-mode-line-saved-ids + (read (current-buffer))))))) (defun my/mastodon-mode-line-persist-meta () (mkdir (file-name-directory my/mastodon-mode-line-file) t) (let ((coding-system-for-write 'utf-8)) (ignore-errors (with-temp-file my/mastodon-mode-line-file - (let ((standard-output (current-buffer)) - (print-level nil) - (print-length nil) - (print-circle nil)) - (princ ";;; Mastodon Saved Notifications\n\n") - (prin1 my/mastodon-mode-line-saved-ids)))))) + (let ((standard-output (current-buffer)) + (print-level nil) + (print-length nil) + (print-circle nil)) + (princ ";;; Mastodon Saved Notifications\n\n") + (prin1 my/mastodon-mode-line-saved-ids)))))) (defun my/mastodon-mode-line-update () (if my/mastodon-mode-line-unread-ids (setq my/mastodon-mode-string - (concat "[" - (propertize (number-to-string - (length my/mastodon-mode-line-unread-ids)) - 'face 'success) - "]")) + (concat "[" + (propertize (number-to-string + (length my/mastodon-mode-line-unread-ids)) + 'face 'success) + "]")) (setq my/mastodon-mode-string ""))) (defun my/mastodon-mode-line-update-fetch () @@ -8730,21 +8939,21 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (mastodon-http--api "notifications") nil (lambda (data) (let ((fetched-ids - (cl-loop for datum in data collect (alist-get 'id datum)))) + (cl-loop for datum in data collect (alist-get 'id datum)))) (setq my/mastodon-mode-line-unread-ids - (seq-difference fetched-ids my/mastodon-mode-line-saved-ids)) + (seq-difference fetched-ids my/mastodon-mode-line-saved-ids)) (setq my/mastodon-mode-line-saved-ids - (seq-intersection my/mastodon-mode-line-saved-ids fetched-ids))) + (seq-intersection my/mastodon-mode-line-saved-ids fetched-ids))) (my/mastodon-mode-line-update)))) (defun my/mastodon-notifications--timeline-before (toots) (let* ((all-ids (seq-uniq - (append - my/mastodon-mode-line-saved-ids - (cl-loop for datum in toots - collect (alist-get 'id datum)))))) + (append + my/mastodon-mode-line-saved-ids + (cl-loop for datum in toots + collect (alist-get 'id datum)))))) (setq my/mastodon-mode-line-unread-ids - (seq-difference my/mastodon-mode-line-unread-ids all-ids)) + (seq-difference my/mastodon-mode-line-unread-ids all-ids)) (setq my/mastodon-mode-line-saved-ids all-ids)) (my/mastodon-mode-line-update)) @@ -8757,43 +8966,43 @@ Didn’t work out as I expected, so I’ve made org-journal-tags :after-hook (progn (when (timerp my/mastodon-mode-line-timer) - (cancel-timer my/mastodon-mode-line-timer)) + (cancel-timer my/mastodon-mode-line-timer)) (if my/mastodon-mode-line - (progn - (add-to-list 'mode-line-misc-info '(:eval my/mastodon-mode-string) t) - (my/mastodon-mode-line-load-meta) - (setq my/mastodon-mode-line-timer - (run-with-timer 0 150 #'my/mastodon-mode-line-update-fetch)) - (advice-add #'mastodon-notifications--timeline :before - #'my/mastodon-notifications--timeline-before) - (add-hook 'kill-emacs-hook #'my/mastodon-mode-line-persist-meta)) - (setq mode-line-misc-info (delete '(:eval my/mastodon-mode-string) - mode-line-misc-info)) - (advice-remove #'mastodon-notifications--timeline - #'my/mastodon-notifications--timeline-before) - (remove-hook 'kill-emacs-hook #'my/mastodon-mode-line-persist-meta) - (my/mastodon-mode-line-persist-meta))))) + (progn + (add-to-list 'mode-line-misc-info '(:eval my/mastodon-mode-string) t) + (my/mastodon-mode-line-load-meta) + (setq my/mastodon-mode-line-timer + (run-with-timer 0 150 #'my/mastodon-mode-line-update-fetch)) + (advice-add #'mastodon-notifications--timeline :before + #'my/mastodon-notifications--timeline-before) + (add-hook 'kill-emacs-hook #'my/mastodon-mode-line-persist-meta)) + (setq mode-line-misc-info (delete '(:eval my/mastodon-mode-string) + mode-line-misc-info)) + (advice-remove #'mastodon-notifications--timeline + #'my/mastodon-notifications--timeline-before) + (remove-hook 'kill-emacs-hook #'my/mastodon-mode-line-persist-meta) + (my/mastodon-mode-line-persist-meta)))))
Timeline Transient

The default mastodon-tl--get-home-timeline allows only to hide replies, and not boosted posts.

So here’s a custom update function:

(defun my/mastodon-get-update-funciton (hide-replies hide-boosts)
   (lambda (toots)
     (let* ((is-profile (eq (mastodon-tl--get-buffer-type) 'profile-statuses))
-	   (hide-replies (and (not is-profile) hide-replies))
-	   (hide-boosts (and (not is-profile) hide-boosts))
-	   (toots (seq-filter
-		   (lambda (toot)
-		     (and
-		      (or (not hide-replies)
-			  (not (mastodon-tl--is-reply toot)))
-		      (or (not hide-boosts)
-			  (not (alist-get 'reblog toot)))))
-		   toots))
-	   (start-pos (point)))
+           (hide-replies (and (not is-profile) hide-replies))
+           (hide-boosts (and (not is-profile) hide-boosts))
+           (toots (seq-filter
+                   (lambda (toot)
+                     (and
+                      (or (not hide-replies)
+                          (not (mastodon-tl--is-reply toot)))
+                      (or (not hide-boosts)
+                          (not (alist-get 'reblog toot)))))
+                   toots))
+           (start-pos (point)))
       (mapc #'mastodon-tl--toot toots)
       (when mastodon-tl--display-media-p
-	(save-excursion
-	  (mastodon-media--inline-images start-pos (point)))))))
+        (save-excursion
+          (mastodon-media--inline-images start-pos (point)))))))
 

In order to use it, the function has to be passed to mastodon-tl--init:

(defun my/mastodon-tl--get-home (hide-replies hide-boosts)
   (mastodon-tl--init
@@ -8815,15 +9024,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tags    ["Timelines"
      :class transient-row
      ("t" "Home" (lambda (args)
-		   (interactive (list (transient-args transient-current-command)))
-		   (my/mastodon-tl--get-home
-		    (seq-contains-p args "--hide-replies")
-		    (seq-contains-p args "--hide-boosts"))))
-     ("l" "Local" mastodon-tl--get-local-timeline)
-     ("f" "Federated" mastodon-tl--get-federated-timeline)
-     ("g" "One tag" mastodon-tl--get-tag-timeline)
-     ("a" "Followed tags" mastodon-tl--followed-tags-timeline)
-     ("s" "Some followed tags" mastodon-tl--some-followed-tags-timeline)]
+                   (interactive (list (transient-args transient-current-command)))
+                   (my/mastodon-tl--get-home
+                    (seq-contains-p args "--hide-replies")
+                    (seq-contains-p args "--hide-boosts"))))
+     ("l" "Local" mastodon-tl-get-local-timeline)
+     ("f" "Federated" mastodon-tl-get-federated-timeline)
+     ("g" "One tag" mastodon-tl-get-tag-timeline)
+     ("a" "Followed tags" mastodon-tl-followed-tags-timeline)
+     ("s" "Some followed tags" mastodon-tl-some-followed-tags-timeline)]
     ["Misc"
      :class transient-row
      ("q" "Quit" transient-quit-one)]))
@@ -8839,26 +9048,26 @@ Didn’t work out as I expected, so I’ve made org-journal-tags     ("m" "Mastodon" mastodon)
      ("t" "Timelines" my/mastodon-tl)
      ("n" "Notifications" mastodon-notifications-get)
-     ("s" "Search query" mastodon-search--query)]
+     ("s" "Search query" mastodon-search-query)]
     ["Tags"
      :class transient-row
-     ("aa" "Followed tags" mastodon-tl--list-followed-tags)
-     ("af" "Follow tag" mastodon-tl--follow-tag)
-     ("aF" "Unfollow tag" mastodon-tl--unfollow-tag)]
+     ("aa" "Followed tags" mastodon-tl-list-followed-tags)
+     ("af" "Follow tag" mastodon-tl-follow-tag)
+     ("aF" "Unfollow tag" mastodon-tl-unfollow-tag)]
     ["Own profile"
      :class transient-row
      ("c" "Toot" mastodon-toot)
-     ("o" "My profile" mastodon-profile--my-profile)
-     ("u" "Update profile note" mastodon-profile--update-user-profile-note)
-     ("f" "Favourites" mastodon-profile--view-favourites)
-     ("b" "Bookmarks" mastodon-profile--view-bookmarks)]
+     ("o" "My profile" mastodon-profile-my-profile)
+     ("u" "Update profile note" mastodon-profile-update-user-profile-note)
+     ("f" "Favourites" mastodon-profile-view-favourites)
+     ("b" "Bookmarks" mastodon-profile-view-bookmarks)]
     ["Minor views"
      :class transient-row
-     ("F" "Follow requests" mastodon-views--view-follow-requests)
-     ("S" "Scheduled toots" mastodon-views--view-scheduled-toots)
-     ("I" "Filters" mastodon-views--view-filters)
-     ("G" "Follow suggestions" mastodon-views--view-follow-suggestions)
-     ("L" "Lists" mastodon-views--view-lists)]
+     ("F" "Follow requests" mastodon-views-view-follow-requests)
+     ("S" "Scheduled toots" mastodon-views-view-scheduled-toots)
+     ("I" "Filters" mastodon-views-view-filters)
+     ("G" "Follow suggestions" mastodon-views-view-follow-suggestions)
+     ("L" "Lists" mastodon-views-view-lists)]
     ["Misc"
      :class transient-row
      ("/" "Switch to buffer" mastodon-switch-to-buffer)
@@ -8879,60 +9088,60 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsbase toot."
   (interactive)
   (let* ((toot (or (mastodon-tl--property 'base-toot)
-		   (mastodon-tl--property 'toot-json)))
-	 (url (if (mastodon-tl--field 'reblog toot)
-		  (alist-get 'url (alist-get 'reblog toot))
-		(alist-get 'url toot))))
+                   (mastodon-tl--property 'toot-json)))
+         (url (if (mastodon-tl--field 'reblog toot)
+                  (alist-get 'url (alist-get 'reblog toot))
+                (alist-get 'url toot))))
     (browse-url url)))
 

And the prefix itself:

(with-eval-after-load 'mastodon
-  (my/def-confirmer mastodon-toot--toggle-boost "Toggle boost for this post? ")
-  (my/def-confirmer mastodon-toot--toggle-favourite "Toggle favourite this post? ")
-  (my/def-confirmer mastodon-toot--toggle-bookmark "Toggle bookmark this post? ")
-  (my/def-confirmer mastodon-tl--follow-user "Follow this user? ")
-  (my/def-confirmer mastodon-tl--unfollow-user "Unfollow this user? ")
-  (my/def-confirmer mastodon-tl--block-user "Block this user? ")
-  (my/def-confirmer mastodon-tl--unblock-user "Unblock this user? ")
-  (my/def-confirmer mastodon-tl--mute-user "Mute this user? ")
-  (my/def-confirmer mastodon-tl--unmute-user "Unmute this user? ")
-  (my/def-confirmer mastodon-tl--unmute-user "Unmute this user? ")
+  (my/def-confirmer mastodon-toot-toggle-boost "Toggle boost for this post? ")
+  (my/def-confirmer mastodon-toot-toggle-favourite "Toggle favourite this post? ")
+  (my/def-confirmer mastodon-toot-toggle-bookmark "Toggle bookmark this post? ")
+  (my/def-confirmer mastodon-tl-follow-user "Follow this user? ")
+  (my/def-confirmer mastodon-tl-unfollow-user "Unfollow this user? ")
+  (my/def-confirmer mastodon-tl-block-user "Block this user? ")
+  (my/def-confirmer mastodon-tl-unblock-user "Unblock this user? ")
+  (my/def-confirmer mastodon-tl-mute-user "Mute this user? ")
+  (my/def-confirmer mastodon-tl-unmute-user "Unmute this user? ")
+  (my/def-confirmer mastodon-tl-unmute-user "Unmute this user? ")
 
   (transient-define-prefix my/mastodon-toot ()
     "Mastodon toot actions."
     ["View"
      :class transient-row
-     ("o" "Thread" mastodon-tl--thread)
+     ("o" "Thread" mastodon-tl-thread)
      ("w" "Browser" my/mastodon-toot--browse)
-     ("le" "List edits" mastodon-toot--view-toot-edits)
-     ("lf" "List favouriters" mastodon-toot--list-favouriters)
-     ("lb" "List boosters" mastodon-toot--list-boosters)]
+     ("le" "List edits" mastodon-toot-view-toot-edits)
+     ("lf" "List favouriters" mastodon-toot-list-favouriters)
+     ("lb" "List boosters" mastodon-toot-list-boosters)]
     ["Toot Actions"
      :class transient-row
-     ("r" "Reply" mastodon-toot--reply)
-     ("v" "Vote" mastodon-tl--poll-vote)
+     ("r" "Reply" mastodon-toot-reply)
+     ("v" "Vote" mastodon-tl-poll-vote)
      ("b" "Boost" my/mastodon-toot--toggle-boost-confirm)
      ("f" "Favourite" my/mastodon-toot--toggle-favourite-confirm)
      ("k" "Bookmark" my/mastodon-toot--toggle-bookmark-confirm)]
     ["My Toot Actions"
      :class transient-row
-     ("md" "Delete" mastodon-toot--delete-toot)
-     ("mD" "Delete and redraft" mastodon-toot--delete-and-redraft-toot)
-     ("mp" "Pin" mastodon-toot--pin-toot-toggle)
-     ("me" "Edit" mastodon-toot--edit-toot-at-point)]
+     ("md" "Delete" mastodon-toot-delete-toot)
+     ("mD" "Delete and redraft" mastodon-toot-delete-and-redraft-toot)
+     ("mp" "Pin" mastodon-toot-pin-toot-toggle)
+     ("me" "Edit" mastodon-toot-edit-toot-at-point)]
     ["Profile Actions"
      :class transient-row
-     ("pp" "Profile" mastodon-profile--show-user)
-     ("pf" "List followers" mastodon-profile--open-followers)
-     ("pF" "List following" mastodon-profile--open-following)
-     ("ps" "List statues (no reblogs)" mastodon-profile--open-statuses-no-reblogs)]
+     ("pp" "Profile" mastodon-profile-show-user)
+     ("pf" "List followers" mastodon-profile-open-followers)
+     ("pF" "List following" mastodon-profile-open-following)
+     ("ps" "List statues (no reblogs)" mastodon-profile-open-statuses-no-reblogs)]
     ["User Actions"
      :class transient-row
-     ("uf" "Follow user" my/mastodon-tl--follow-user-confirm)
-     ("uF" "Unfollow user" my/mastodon-tl--unfollow-user-confirm)
-     ("ub" "Block user" my/mastodon-tl--block-user-confirm)
-     ("uB" "Unblock user" my/mastodon-tl--unblock-user-confirm)
-     ("um" "Mute user" my/mastodon-tl--mute-user-confirm)
-     ("uB" "Unmute user" my/mastodon-tl--unmute-user-confirm)]
+     ("uf" "Follow user" my/mastodon-tl-follow-user-confirm)
+     ("uF" "Unfollow user" my/mastodon-tl-unfollow-user-confirm)
+     ("ub" "Block user" my/mastodon-tl-block-user-confirm)
+     ("uB" "Unblock user" my/mastodon-tl-unblock-user-confirm)
+     ("um" "Mute user" my/mastodon-tl-mute-user-confirm)
+     ("uB" "Unmute user" my/mastodon-tl-unmute-user-confirm)]
     ["Misc"
      :class transient-row
      ("q" "Quit" transient-quit-one)]))
@@ -8940,8 +9149,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tagswallabag is a self-hosted “read it later” app.

This might be the best online reading advice I’ve heard:

-

I have a different approach: waiting periods. Every time I come across something I may want to read/watch, I’m totally allowed to. No limits! The only requirement is I have to save it to Pocket, and then choose to consume it at a later time.

-
+

I have a different approach: waiting periods. Every time I come across something I may want to read/watch, I’m totally allowed to. No limits! The only requirement is I have to save it to Pocket, and then choose to consume it at a later time.

Source: Tiago Forte - The Secret Power of ‘Read It Later’ Apps

(use-package wallabag
   :straight (:host github :repo "chenyanming/wallabag.el" :files (:defaults "default.css" "emojis.alist"))
@@ -8993,18 +9201,18 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (set-face-attribute 'ement-room-reactions-key nil :height 'unspecified)
   (set-face-attribute 'ement-room-timestamp nil :inherit 'font-lock-function-name-face)
   (set-face-attribute 'ement-room-membership nil :height 0.9
-		      :inherit 'font-lock-warning-face)
+                      :inherit 'font-lock-warning-face)
   (set-face-attribute 'ement-room-wrap-prefix nil :inherit 'unspecified)
   (set-face-attribute 'ement-room-timestamp-header nil :height 'unspecified)
   (set-face-attribute 'ement-room-wrap-prefix nil :inherit 'unspecified)
   ;; Notify only on mentions
   (setq ement-notify-notification-predicates
-	'(ement-notify--event-mentions-session-user-p
-	  ement-notify--event-mentions-room-p
-	  ement-notify--room-unread-p))
+        '(ement-notify--event-mentions-session-user-p
+          ement-notify--event-mentions-room-p
+          ement-notify--room-unread-p))
   ;; Fix the anti-synergy with major mode re-activation in `ement-room-list-revert'
   (advice-add #'ement-room-list-revert
-	      :around #'my/perspective-assign-ignore-advice))
+              :around #'my/perspective-assign-ignore-advice))
 
Keybindings

Some custom keymaps for room lists:

(with-eval-after-load 'ement-room-list
@@ -9025,14 +9233,14 @@ Didn’t work out as I expected, so I’ve made org-journal-tags   "q" #'quit-window))
 
(defun my/ement-room-send-reaction (key position)
   (interactive (list
-		(completing-read "Add reaction: " (append telega-emoji-reaction-list '("👋")))
-		(point)))
+                (completing-read "Add reaction: " (append telega-emoji-reaction-list '("👋")))
+                (point)))
   (ement-room-send-reaction key position))
 
 (defun my/ement-room-compose-quit ()
   (interactive)
   (when (or (string-empty-p (buffer-string))
-	    (y-or-n-p "Quit compose? "))
+            (y-or-n-p "Quit compose? "))
     (quit-window t)))
 
 (defun my/ement-room-compose-setup ()
@@ -9086,16 +9294,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsScroll to the previous mention.

alphapapa 🐃​> And, yes, that is a currently unsolved problem. As I said, in the future we can try using a different API endpoint to access those notifications similarly to Element. In the meantime, you can load old messages (e.g. “C-u 1000 M-v” to load 1000 old ones at a time), until you find it, maybe using “C-s sqrtm” to search for messages mentioning you.

-

Or you can load up Element for a moment to see what the mention was, if that’s easier.

-
+

Or you can load up Element for a moment to see what the mention was, if that’s easier.

(defun my/ement-about-me-p (event)
   (let ((me (ement-user-id (ement-session-user ement-session))))
     (or
      (equal (ement-user-id (ement-event-sender event)) me)
      (when-let ((formatted-body
-		 (alist-get
-		  'formatted_body
-		  (ement-event-content event))))
+                 (alist-get
+                  'formatted_body
+                  (ement-event-content event))))
        (string-match-p me formatted-body)))))
 
 (defun my/ement-scroll-to-previous-about-me ()
@@ -9104,20 +9311,20 @@ Didn’t work out as I expected, so I’ve made org-journal-tags    (when (< (line-number-at-pos) 20)
       (forward-line 20))
     (if ement-room-retro-loading
-	(run-with-timer 0.5 nil #'my/ement-scroll-to-previous-about-me)
+        (run-with-timer 0.5 nil #'my/ement-scroll-to-previous-about-me)
       (while (let ((event (ewoc-data (ewoc-locate ement-ewoc))))
-	       (and
-		(not ement-room-retro-loading)
-		(or
-		 (not (ement-event-p event))
-		 (not (my/ement-about-me-p event)))))
-	(condition-case _err
-	    (scroll-down 1)
-	  (beginning-of-buffer
-	   (call-interactively #'ement-room-retro)
-	   (run-with-timer 0.5 nil #'my/ement-scroll-to-previous-about-me)))
-	(cl-incf scrolled)
-	(message "Scrolled %s" scrolled)))))
+               (and
+                (not ement-room-retro-loading)
+                (or
+                 (not (ement-event-p event))
+                 (not (my/ement-about-me-p event)))))
+        (condition-case _err
+            (scroll-down 1)
+          (beginning-of-buffer
+           (call-interactively #'ement-room-retro)
+           (run-with-timer 0.5 nil #'my/ement-scroll-to-previous-about-me)))
+        (cl-incf scrolled)
+        (message "Scrolled %s" scrolled)))))
 

Telega

telega.el is a Telegam client for Emacs.

@@ -9148,17 +9355,19 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (my-leader-def "a l" (my/command-in-persp "telega" "telega" 3 (telega))) (my/use-colors (telega-button-active :foreground (my/color-value 'base0) - :background (my/color-value 'cyan)) + :background (my/color-value 'cyan)) (telega-webpage-chat-link :foreground (my/color-value 'base0) - :background (my/color-value 'fg))) + :background (my/color-value 'fg)) + (telega-entity-type-spoiler :background (my/color-value 'base8))) :config - (when (file-directory-p "~/.guix-extra-profiles/emacs/") + (when (file-exists-p "~/.guix-extra-profiles/emacs/emacs/bin/telega-server") (setq telega-server-command - (expand-file-name - "~/.guix-extra-profiles/emacs/emacs/bin/telega-server"))) + (expand-file-name + "~/.guix-extra-profiles/emacs/emacs/bin/telega-server"))) (setq telega-emoji-use-images nil) (setq telega-chat-fill-column 80) (setq telega-completing-read-function #'completing-read) + (setq telega-sticker-size '(12 . 24)) (add-to-list 'savehist-additional-variables 'telega-msg-add-reaction) (remove-hook 'telega-chat-mode-hook #'telega-chat-auto-fill-mode) (general-define-key @@ -9180,72 +9389,72 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/telega-server-build ()
   (interactive)
   (setq telega-server-libs-prefix
-	(if (executable-find "guix")
-	    (string-trim
-	     (shell-command-to-string "guix build tdlib"))
-	  (expand-file-name "~/bin/td/build/res/usr/local")))
+        (if (executable-find "guix")
+            (string-trim
+             (shell-command-to-string "guix build tdlib"))
+          (expand-file-name "~/bin/td/build/res/usr/local")))
   (telega-server-build "CC=gcc"))
 

Setting up the modeline. The default mode string doesn’t look great with my other modeline modules, so I override that.

(add-hook 'telega-load-hook #'telega-mode-line-mode)
 (setq telega-mode-line-string-format
       '("["
-	(:eval
-	 (telega-mode-line-online-status))
-	(:eval
-	 (when telega-use-tracking-for
-	   (telega-mode-line-tracking)))
-	(:eval
-	 (telega-mode-line-unread-unmuted))
-	(:eval
-	 (telega-mode-line-mentions 'messages))
-	"]"))
+        (:eval
+         (telega-mode-line-online-status))
+        (:eval
+         (when telega-use-tracking-for
+           (telega-mode-line-tracking)))
+        (:eval
+         (telega-mode-line-unread-unmuted))
+        (:eval
+         (telega-mode-line-mentions 'messages))
+        "]"))
 

Configuring company backends for the chat buffer, as recommended in the manual:

(defun my/telega-chat-setup ()
   (interactive)
   (set (make-local-variable 'company-backends)
        (append (list 'telega-company-emoji
-		     'telega-company-username
-		     'telega-company-hashtag
-		     'telega-company-markdown-precode)
-	       (when (telega-chat-bot-p telega-chatbuf--chat)
-		 '(telega-company-botcmd))))
+                     'telega-company-username
+                     'telega-company-hashtag
+                     'telega-company-markdown-precode)
+               (when (telega-chat-bot-p telega-chatbuf--chat)
+                 '(telega-company-botcmd))))
   (company-mode 1)
   (setopt visual-fill-column-width
-	  (+ telega-chat-fill-column
-	     (if (display-graphic-p) 5 6)))
+          (+ telega-chat-fill-column
+             (if (display-graphic-p) 5 6)))
   (setq-local split-width-threshold 1))
 (add-hook 'telega-chat-mode-hook #'my/telega-chat-setup)
 

And custom online status. By default it marks you online when the Emacs frame is active, but I use EXWM, so I change that to when telega.el buffer is active. Otherwise, I’m online all the time.

(defun my/telega-online-status ()
   (derived-mode-p 'telega-root-mode 'telega-chat-mode
-		  'telega-image-mode 'telega-webpage-mode))
+                  'telega-image-mode 'telega-webpage-mode))
 
 (setq telega-online-status-function #'my/telega-online-status)
 

Switch to topic in forum chats.

(defun my/telega-switch-to-topic ()
   (interactive)
   (let* ((topics-data (gethash
-		       (plist-get telega-chatbuf--chat :id)
-		       telega--chat-topics))
-	 (topics-string
-	  (mapcar
-	   (lambda (topic)
-	     (let* ((name (plist-get (plist-get topic :info) :name))
-		    (unread-count (plist-get topic :unread_count))
-		    (name-string (with-temp-buffer
-				   (telega-ins--topic-title topic 'with-icon)
-				   (buffer-string))))
-	       (if (zerop unread-count)
-		   name-string
-		 (format "%-40s (%s)"
-			 name-string
-			 (propertize (format "%d" unread-count)
-				     'face 'telega-unread-unmuted-modeline)))))
-	   topics-data))
-	 (topics-collection (cl-loop for datum in topics-data
-				     for string in topics-string
-				     collect (cons string datum)))
-	 (topic (completing-read "Topic: " topics-collection nil t)))
+                       (plist-get telega-chatbuf--chat :id)
+                       telega--chat-topics))
+         (topics-string
+          (mapcar
+           (lambda (topic)
+             (let* ((name (plist-get (plist-get topic :info) :name))
+                    (unread-count (plist-get topic :unread_count))
+                    (name-string (with-temp-buffer
+                                   (telega-ins--topic-title topic 'with-icon)
+                                   (buffer-string))))
+               (if (zerop unread-count)
+                   name-string
+                 (format "%-40s (%s)"
+                         name-string
+                         (propertize (format "%d" unread-count)
+                                     'face 'telega-unread-unmuted-modeline)))))
+           topics-data))
+         (topics-collection (cl-loop for datum in topics-data
+                                     for string in topics-string
+                                     collect (cons string datum)))
+         (topic (completing-read "Topic: " topics-collection nil t)))
     (telega-chat--goto-thread
      telega-chatbuf--chat
      (plist-get
@@ -9273,10 +9482,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  :if (not my/remote-server)
   :functions (my-google-translate-at-point google-translate--search-tkk)
   :commands (google-translate-at-point
-	     google-translate-at-point-reverse
-	     google-translate-query-translate
-	     google-translate-query-translate-reverse
-	     google-translate-smooth-translate)
+             google-translate-at-point-reverse
+             google-translate-query-translate
+             google-translate-query-translate-reverse
+             google-translate-smooth-translate)
   :custom
   (google-translate-backend-method 'curl)
   :config
@@ -9288,13 +9497,13 @@ Didn’t work out as I expected, so I’ve made org-journal-tags    "reverse translate if prefix"
     (interactive)
     (if current-prefix-arg
-	(google-translate-at-point)
+        (google-translate-at-point)
       (google-translate-at-point-reverse)))
   (setq google-translate-translation-directions-alist
-	'(("en" . "ru")
-	  ("ru" . "en")
-	  ("de" . "en")
-	  ("en" . "de"))))
+        '(("en" . "ru")
+          ("ru" . "en")
+          ("de" . "en")
+          ("en" . "de"))))
 
 (my-leader-def
   :infix "at"
@@ -9316,9 +9525,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags    (setq biome-api-try-parse-error-as-response t))
   :config
   (add-to-list 'biome-query-coords
-	       '("Saint-Petersburg, Russia" 59.942651 30.229930))
+               '("Saint-Petersburg, Russia" 59.942651 30.229930))
   (add-to-list 'biome-query-coords
-	       '("Tyumen, Russia" 57.15222 65.52722)))
+               '("Tyumen, Russia" 57.15222 65.52722)))
 

Reading documentation

tldr

tldr is a collaborative project providing cheatsheets for various console commands. For some reason, the built-in download in the package is broken, so I use my own function.

@@ -9364,13 +9573,13 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(use-package devdocs-browser
   :straight t
   :commands (devdocs-browser-open
-	     devdocs-browser-open-in
-	     devdocs-browser-install-doc
-	     devdocs-browser-uninstall-doc
-	     devdocs-browser-download-offline-data
-	     devdocs-browser-remove-offline-data
-	     devdocs-browser-upgrade-all-docs
-	     devdocs-browser-update-docs)
+             devdocs-browser-open-in
+             devdocs-browser-install-doc
+             devdocs-browser-uninstall-doc
+             devdocs-browser-download-offline-data
+             devdocs-browser-remove-offline-data
+             devdocs-browser-upgrade-all-docs
+             devdocs-browser-update-docs)
   :init
   (my-leader-def
     :infix "hd"
@@ -9434,7 +9643,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags   "hS" #'sx-tab-frontpage)
   (my/use-colors
    (sx-question-mode-accepted :foreground (my/color-value 'green)
-			      :weight 'bold)
+                              :weight 'bold)
    (sx-question-mode-content :background nil))
   (add-hook 'sx-question-mode-hook #'doom-modeline-mode)
   (add-hook 'sx-question-list-mode-hook #'doom-modeline-mode))
@@ -9456,28 +9665,34 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  :commands (gptel gptel-send gptel-menu)
   :config
   (setq gptel-mode "llama3:latest")
-  (setq gptel-backend (gptel-make-ollama "Ollama"
-			:host "localhost:11434"
-			:stream t
-			:models '("llama3.1:8b" "deepseek-r1:32b"
-				  "qwen2.5:32b" "qwen2.5-coder:32b"
-				  "eva-qwen2.5-q4_k_l-32b:latest"
-				  "t-pro-1.0-q4_k_m:latest")))
+  (setq gptel-track-media t)
+  (setq gptel-backend
+        (gptel-make-ollama "Ollama"
+          :host "localhost:11434"
+          :stream t
+          :models '("llama3.1:8b" "deepseek-r1:32b"
+                    "qwen2.5:32b" "qwen2.5-coder:32b"
+                    "eva-qwen2.5-q4_k_l-32b:latest"
+                    "t-pro-1.0-q4_k_m:latest"
+                    "qwq:32b"
+                    (gemma3:32b
+                     :capabilities (media)
+                     :mime-types ("image/jpeg" "image/png")))))
   (gptel-make-openai "OpenRouter"
     :host "openrouter.ai/api"
     :key (lambda () (my/password-store-get-field
-		     "My_Online/Accounts/openrouter" "api-key"))
+                     "My_Online/Accounts/openrouter" "api-key"))
     :stream t
     :models '("anthropic/claude-3.5-haiku"))
   (setq gptel--known-backends
-	(seq-filter
-	 (lambda (cell)
-	   (not (equal (car cell) "ChatGPT")))
-	 gptel--known-backends))
+        (seq-filter
+         (lambda (cell)
+           (not (equal (car cell) "ChatGPT")))
+         gptel--known-backends))
   (setq gptel-response-prefix-alist
-	'((markdown-mode . "[Response] ")
-	  (org-mode . "*** Response: ")
-	  (text-mode . "[Response]")))
+        '((markdown-mode . "[Response] ")
+          (org-mode . "*** Response: ")
+          (text-mode . "[Response]")))
 
   (general-define-key
    :keymaps '(gptel-mode-map)
@@ -9497,24 +9712,24 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (setq ellama-long-lines-length 100000)
 
   (setq ellama-provider (make-llm-ollama
-			 :chat-model "qwen2.5:32b"
-			 :embedding-model "qwen2.5:32b"))
+                         :chat-model "qwen2.5:32b"
+                         :embedding-model "qwen2.5:32b"))
   (setq ellama-coding-provider (make-llm-ollama
-				:chat-model "qwen2.5-coder:32b"
-				:embedding-model "qwen2.5-coder:32b"))
+                                :chat-model "qwen2.5-coder:32b"
+                                :embedding-model "qwen2.5-coder:32b"))
   (setq ellama-providers
-	`(("llama3.1:8b" . ,(make-llm-ollama
-			     :chat-model "llama3.1:latest"
-			     :embedding-model "llama3.1:latest"))
-	  ("phi4:latest" . ,(make-llm-ollama
-			     :chat-model "phi4:latest"
-			     :embedding-model "phi4:latest"))
-	  ("qwen2.5:32b" . ,(make-llm-ollama
-			     :chat-model "qwen2.5:32b"
-			     :embedding-model "qwen2.5:32b"))
-	  ("qwen2.5-coder:32b" . ,(make-llm-ollama
-				   :chat-model "qwen2.5-coder:32b"
-				   :embedding-model "qwen2.5-coder:32b")))))
+        `(("llama3.1:8b" . ,(make-llm-ollama
+                             :chat-model "llama3.1:latest"
+                             :embedding-model "llama3.1:latest"))
+          ("phi4:latest" . ,(make-llm-ollama
+                             :chat-model "phi4:latest"
+                             :embedding-model "phi4:latest"))
+          ("qwen2.5:32b" . ,(make-llm-ollama
+                             :chat-model "qwen2.5:32b"
+                             :embedding-model "qwen2.5:32b"))
+          ("qwen2.5-coder:32b" . ,(make-llm-ollama
+                                   :chat-model "qwen2.5-coder:32b"
+                                   :embedding-model "qwen2.5-coder:32b")))))
 

The keybindings are a bit crazy to use even with which-key, so here goes transient.el.

(with-eval-after-load 'ellama
   (transient-define-prefix my/ellama-transient ()
@@ -9568,18 +9783,18 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsSo first, I need to diff two strings.

(defun my/diff-strings (str1 str2)
   (let ((file1 (make-temp-file "diff1"))
-	(file2 (make-temp-file "diff2")))
+        (file2 (make-temp-file "diff2")))
     (unwind-protect
-	(progn
-	  (with-temp-file file1
-	    (insert str1))
-	  (with-temp-file file2
-	    (insert str2))
-	  (with-temp-buffer
-	    (diff-mode)
-	    (diff-no-select file1 file2 (diff-switches) t (current-buffer))
-	    (font-lock-fontify-buffer)
-	    (buffer-string)))
+        (progn
+          (with-temp-file file1
+            (insert str1))
+          (with-temp-file file2
+            (insert str2))
+          (with-temp-buffer
+            (diff-mode)
+            (diff-no-select file1 file2 (diff-switches) t (current-buffer))
+            (font-lock-fontify-buffer)
+            (buffer-string)))
       (delete-file file1)
       (delete-file file2))))
 

And the function to do the prompting iself. Llama tends to output in Markdown, so I use a function from Ellama to convert the output back to Org-mode, if necessary.

@@ -9590,22 +9805,22 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(format prompt text)) (lambda (response) (let* ((parts (split-string response "-FIXED TEXT ENDS-")) - (changed-text (nth 0 parts)) - (comments (nth 1 parts)) - (buffer (generate-new-buffer "*ellama-diff*"))) + (changed-text (nth 0 parts)) + (comments (nth 1 parts)) + (buffer (generate-new-buffer "*ellama-diff*"))) (when is-org-mode - (setq changed-text (ellama--translate-markdown-to-org-filter changed-text))) + (setq changed-text (ellama--translate-markdown-to-org-filter changed-text))) (with-current-buffer buffer - (text-mode) - (insert - (propertize "Changed text:\n" 'face 'transient-heading) - (string-trim changed-text) - "\n\n" - (propertize "Comments:\n" 'face 'transient-heading) - (string-trim comments) - "\n\n" - (propertize "Diff:\n" 'face 'transient-heading) - (my/diff-strings text changed-text))) + (text-mode) + (insert + (propertize "Changed text:\n" 'face 'transient-heading) + (string-trim changed-text) + "\n\n" + (propertize "Comments:\n" 'face 'transient-heading) + (string-trim comments) + "\n\n" + (propertize "Diff:\n" 'face 'transient-heading) + (my/diff-strings text changed-text))) (display-buffer buffer))) (lambda (&rest err) (message "Error: %s" err)))) @@ -9626,8 +9841,8 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (defun my/ellama--text () (if (region-active-p) - (buffer-substring-no-properties (region-beginning) (region-end)) - (buffer-substring-no-properties (point-min) (point-max)))) + (buffer-substring-no-properties (region-beginning) (region-end)) + (buffer-substring-no-properties (point-min) (point-max)))) (defun my/ellama-proof-read (text is-org-mode) (interactive (list (my/ellama--text) (derived-mode-p 'org-mode))) @@ -9672,51 +9887,51 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/whisper--format-vtt-seconds (seconds)
   (if (numberp seconds)
       (let* ((hours (/ (floor seconds) (* 60 60)))
-	     (minutes (/ (- (floor seconds) (* hours 60 60)) 60))
-	     (sec (% (floor seconds) 60))
-	     (ms (floor (* 1000 (- seconds (floor seconds))))))
-	(format "%.2d:%.2d:%.2d.%.3d" hours minutes sec ms))
+             (minutes (/ (- (floor seconds) (* hours 60 60)) 60))
+             (sec (% (floor seconds) 60))
+             (ms (floor (* 1000 (- seconds (floor seconds))))))
+        (format "%.2d:%.2d:%.2d.%.3d" hours minutes sec ms))
     ""))
 
 (defun my/whisper--save-chucks-vtt (path data)
   (with-temp-file path
     (insert "WEBVTT\n\n")
     (cl-loop for chunk across (alist-get 'chunks data)
-	     for start = (my/whisper--format-vtt-seconds
-			  (aref (alist-get 'timestamp chunk) 0))
-	     for end = (my/whisper--format-vtt-seconds
-			(aref (alist-get 'timestamp chunk) 1))
-	     do (insert (format "%s --> %s" start end) "\n")
-	     do (insert (string-trim (alist-get 'text chunk)) "\n\n"))))
+             for start = (my/whisper--format-vtt-seconds
+                          (aref (alist-get 'timestamp chunk) 0))
+             for end = (my/whisper--format-vtt-seconds
+                        (aref (alist-get 'timestamp chunk) 1))
+             do (insert (format "%s --> %s" start end) "\n")
+             do (insert (string-trim (alist-get 'text chunk)) "\n\n"))))
 
 (defun my/whisper--save-speakers-vtt (path data)
   (with-temp-file path
     (insert "WEBVTT\n\n")
     (cl-loop for chunk across (alist-get 'speakers data)
-	     for start = (my/whisper--format-vtt-seconds
-			  (aref (alist-get 'timestamp chunk) 0))
-	     for end = (my/whisper--format-vtt-seconds
-			(aref (alist-get 'timestamp chunk) 1))
-	     do (insert (format "%s --> %s" start end) "\n")
-	     do (insert
-		 (format "<v %s>" (alist-get 'speaker chunk))
-		 (string-trim (alist-get 'text chunk)) "\n\n"))))
+             for start = (my/whisper--format-vtt-seconds
+                          (aref (alist-get 'timestamp chunk) 0))
+             for end = (my/whisper--format-vtt-seconds
+                        (aref (alist-get 'timestamp chunk) 1))
+             do (insert (format "%s --> %s" start end) "\n")
+             do (insert
+                 (format "<v %s>" (alist-get 'speaker chunk))
+                 (string-trim (alist-get 'text chunk)) "\n\n"))))
 
 (defun my/whisper--save-speakers-txt (path data)
   (with-temp-file path
     (cl-loop with prev-speaker
-	     for chunk across (alist-get 'speakers data)
-	     for speaker = (alist-get 'speaker chunk)
-	     if (not (equal speaker prev-speaker))
-	     do (progn
-		  (when prev-speaker
-		    (fill-region
-		     (line-beginning-position)
-		     (line-end-position))
-		    (insert "\n\n"))
-		  (insert (format "[%s]" speaker) "\n")
-		  (setq prev-speaker speaker))
-	     do (insert (string-trim (alist-get 'text chunk)) " "))
+             for chunk across (alist-get 'speakers data)
+             for speaker = (alist-get 'speaker chunk)
+             if (not (equal speaker prev-speaker))
+             do (progn
+                  (when prev-speaker
+                    (fill-region
+                     (line-beginning-position)
+                     (line-end-position))
+                    (insert "\n\n"))
+                  (insert (format "[%s]" speaker) "\n")
+                  (setq prev-speaker speaker))
+             do (insert (string-trim (alist-get 'text chunk)) " "))
     (fill-region
      (line-beginning-position)
      (line-end-position))))
@@ -9725,10 +9940,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (let ((data (json-read-file transcript-path)))
     (when (alist-get 'text data)
       (with-temp-file (concat
-		       (file-name-sans-extension transcript-path)
-		       ".txt")
-	(insert (string-trim (alist-get 'text data)))
-	(do-auto-fill)))
+                       (file-name-sans-extension transcript-path)
+                       ".txt")
+        (insert (string-trim (alist-get 'text data)))
+        (do-auto-fill)))
     (unless (seq-empty-p (alist-get 'speakers data))
       (my/whisper--save-speakers-vtt
        (concat (file-name-sans-extension transcript-path) "-spk.vtt")
@@ -9752,36 +9967,36 @@ Didn’t work out as I expected, so I’ve made org-journal-tags      (if (string-empty-p lang) nil lang))
     (let ((num (read-number "Number of speakers (optional): " 0)))
       (when (> num 0)
-	(number-to-string num)))))
+        (number-to-string num)))))
   (let* ((transcript-path (concat
-			   (expand-file-name (file-name-as-directory output-dir))
-			   (file-name-base input)
-			   ".json"))
-	 (args
-	  `("--file-name" ,(expand-file-name input)
-	    "--transcript-path" ,transcript-path
-	    "--hf-token" ,(my/password-store-get-field "My_Online/Accounts/huggingface.co" "token")
-	    ,@(when language
-		`("--language" ,language))
-	    ,@(when num-speakers
-		`("--num-speakers" ,num-speakers))))
-	 (buffer (generate-new-buffer "*whisper*"))
-	 (proc (apply #'start-process "whisper" buffer my/whisper-path args)))
+                           (expand-file-name (file-name-as-directory output-dir))
+                           (file-name-base input)
+                           ".json"))
+         (args
+          `("--file-name" ,(expand-file-name input)
+            "--transcript-path" ,transcript-path
+            "--hf-token" ,(my/password-store-get-field "My_Online/Accounts/huggingface.co" "token")
+            ,@(when language
+                `("--language" ,language))
+            ,@(when num-speakers
+                `("--num-speakers" ,num-speakers))))
+         (buffer (generate-new-buffer "*whisper*"))
+         (proc (apply #'start-process "whisper" buffer my/whisper-path args)))
     (set-process-sentinel
      proc
      (lambda (process _msg)
        (let ((status (process-status process))
-	     (code (process-exit-status process)))
-	 (cond ((and (eq status 'exit) (= code 0))
-		(my/whisper--process-output transcript-path)
-		(notifications-notify :body "Audio conversion completed"
-				      :title "Whisper")
-		(kill-buffer (process-buffer process)))
-	       ((or (and (eq status 'exit) (> code 0))
-		    (eq status 'signal))
-		(let ((err (with-current-buffer (process-buffer process)
-			     (buffer-string))))
-		  (user-error "Error in Whisper: %s" err)))))))))
+             (code (process-exit-status process)))
+         (cond ((and (eq status 'exit) (= code 0))
+                (my/whisper--process-output transcript-path)
+                (notifications-notify :body "Audio conversion completed"
+                                      :title "Whisper")
+                (kill-buffer (process-buffer process)))
+               ((or (and (eq status 'exit) (> code 0))
+                    (eq status 'signal))
+                (let ((err (with-current-buffer (process-buffer process)
+                             (buffer-string))))
+                  (user-error "Error in Whisper: %s" err)))))))))
 

If run interactively, the defined function prompts for paths to both files.

The process sentinel sends a desktop notification because it’s a bit more noticeable than message, and the process is expected to take some time.

Integrating with elfeed
@@ -9796,14 +10011,14 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/elfeed-whisper-get-transcript-new (entry) (interactive (list elfeed-show-entry)) (let* ((url (caar (elfeed-entry-enclosures entry))) - (file-name (concat - (elfeed-ref-id (elfeed-entry-content entry)) - "." - (file-name-extension url))) - (file-path (expand-file-name - (concat - my/elfeed-whisper-podcast-files-directory - file-name)))) + (file-name (concat + (elfeed-ref-id (elfeed-entry-content entry)) + "." + (file-name-extension url))) + (file-path (expand-file-name + (concat + my/elfeed-whisper-podcast-files-directory + file-name)))) (message "Download started") (unless (file-exists-p my/elfeed-whisper-podcast-files-directory) (mkdir my/elfeed-whisper-podcast-files-directory)) @@ -9813,36 +10028,36 @@ Didn’t work out as I expected, so I’ve made org-journal-tags :complete (cl-function (lambda (&key data &allow-other-keys) - (let ((coding-system-for-write 'binary) - (write-region-annotate-functions nil) - (write-region-post-annotation-function nil)) - (write-region data nil file-path nil :silent)) - (message "Conversion started") - (my/invoke-whisper file-path my/elfeed-srt-dir))) + (let ((coding-system-for-write 'binary) + (write-region-annotate-functions nil) + (write-region-post-annotation-function nil)) + (write-region data nil file-path nil :silent)) + (message "Conversion started") + (my/invoke-whisper file-path my/elfeed-srt-dir))) :error (cl-function (lambda (&key error-thrown &allow-other-keys) - (message "Error!: %S" error-thrown)))))) + (message "Error!: %S" error-thrown))))))

I also experimented with a bunch of options to write binary data in Emacs, of which the way with write-region (as implemented in f.el) seems to be the fastest. This thread on StackExchange suggests that it may screw some bytes towards the end, but whether or not this is the case, mp3 files survive the procedure. The proposed solution with seq-doseq takes at least a few seconds.

As my/invoke-whisper creates multiple files, here’s a function to select related files:

(defun my/elfeed-show-related-files (entry)
   (interactive (list elfeed-show-entry))
   (let* ((files
-	  (mapcar
-	   (lambda (file) (cons (file-name-extension file) file))
-	   (seq-filter
-	    (lambda (file)
-	      (string-match-p
-	       (rx bos (literal (elfeed-ref-id (elfeed-entry-content entry))) ".")
-	       file))
-	    (directory-files my/elfeed-srt-dir))))
-	 (buffer
-	  (find-file-other-window
-	   (concat
-	    my/elfeed-srt-dir
-	    (alist-get
-	     (completing-read "File: " files)
-	     files nil nil #'equal)))))
+          (mapcar
+           (lambda (file) (cons (file-name-extension file) file))
+           (seq-filter
+            (lambda (file)
+              (string-match-p
+               (rx bos (literal (elfeed-ref-id (elfeed-entry-content entry))) ".")
+               file))
+            (directory-files my/elfeed-srt-dir))))
+         (buffer
+          (find-file-other-window
+           (concat
+            my/elfeed-srt-dir
+            (alist-get
+             (completing-read "File: " files)
+             files nil nil #'equal)))))
     (with-current-buffer buffer
       (setq-local elfeed-show-entry entry))))
 

Finally, we need a function to show the transcript if it exists or invoke my/elfeed-whisper-get-transcript-new if it doesn’t. And this is the function that we’ll call from an elfeed-entry buffer.

@@ -9853,13 +10068,13 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(unless enclosure (user-error "No enclosure found!")) (let ((srt-path (concat my/elfeed-srt-dir - (elfeed-ref-id (elfeed-entry-content entry)) - ".srt"))) + (elfeed-ref-id (elfeed-entry-content entry)) + ".srt"))) (if (file-exists-p srt-path) - (let ((buffer (find-file-other-window srt-path))) - (with-current-buffer buffer - (setq-local elfeed-show-entry entry))) - (my/elfeed-whisper-get-transcript-new entry))))) + (let ((buffer (find-file-other-window srt-path))) + (with-current-buffer buffer + (setq-local elfeed-show-entry entry))) + (my/elfeed-whisper-get-transcript-new entry)))))
Integrating with subed

Now that we’ve produced a .srt file, we can use a package called subed to control the playback, as I have done in the YouTube section.

By the way, this wasn’t the most straightforward thing to figure out, because the MPV window doesn’t show up for an audio file, and the player itself starts in the paused state. So I thought nothing was happening until I enabled the debug log.

@@ -9874,10 +10089,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(unless (derived-mode-p 'subed-mode) (user-error "Not subed mode!")) (setq-local subed-mpv-video-file - (expand-file-name - (concat my/elfeed-whisper-podcast-files-directory - (my/get-file-name-from-url - (caar (elfeed-entry-enclosures entry)))))) + (expand-file-name + (concat my/elfeed-whisper-podcast-files-directory + (my/get-file-name-from-url + (caar (elfeed-entry-enclosures entry)))))) (subed-mpv--play subed-mpv-video-file))

After running M-x my/elfeed-whisper-subed, run M-x subed-toggle-loop-over-current-subtitle (C-c C-l), because somehow it’s turned on by default, and M-x subed-toggle-pause-while-typing (C-c C-p), because sometimes this made my instance of MPV lag.

After that, M-x subed-mpv-toggle-pause should start the playback, which you can control by moving the cursor in the buffer.

@@ -9888,15 +10103,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/whisper-url (url file-name output-dir &optional language num-speakers)
   (interactive
    (list (read-from-minibuffer "URL: ")
-	 (read-from-minibuffer "File name: ")
-	 (read-directory-name "Output directory: ")
-	 (let ((lang (read-string "Language (optional): ")))
-	   (if (string-empty-p lang) nil lang))
-	 (let ((num (read-number "Number of speakers (optional): " 0)))
-	   (when (> num 0)
-	     (number-to-string num)))))
+         (read-from-minibuffer "File name: ")
+         (read-directory-name "Output directory: ")
+         (let ((lang (read-string "Language (optional): ")))
+           (if (string-empty-p lang) nil lang))
+         (let ((num (read-number "Number of speakers (optional): " 0)))
+           (when (> num 0)
+             (number-to-string num)))))
   (let ((file-path
-	 (concat output-dir file-name "." (file-name-extension url))))
+         (concat output-dir file-name "." (file-name-extension url))))
     (message "Download started")
     (request url
       :type "GET"
@@ -9904,16 +10119,16 @@ Didn’t work out as I expected, so I’ve made org-journal-tags      :complete
       (cl-function
        (lambda (&key data &allow-other-keys)
-	 (let ((coding-system-for-write 'binary)
-	       (write-region-annotate-functions nil)
-	       (write-region-post-annotation-function nil))
-	   (write-region data nil file-path nil :silent))
-	 (message "Conversion started")
-	 (my/invoke-whisper file-path output-dir language num-speakers)))
+         (let ((coding-system-for-write 'binary)
+               (write-region-annotate-functions nil)
+               (write-region-post-annotation-function nil))
+           (write-region data nil file-path nil :silent))
+         (message "Conversion started")
+         (my/invoke-whisper file-path output-dir language num-speakers)))
       :error
       (cl-function
        (lambda (&key error-thrown &allow-other-keys)
-	 (message "Error!: %S" error-thrown))))))
+         (message "Error!: %S" error-thrown))))))
 
Some observations

So, the functions above work for my purposes.

Vosk API works much faster than Whisper. The smallest Vosk model requires ~10 times less than the playback time, and even the tiny.en Whisper model on my PC requires maybe 1.2x playback time.

@@ -10051,33 +10266,33 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsThe return value is an alist; see `my/index--tree-get' for details." (when (eq (org-element-type heading) 'headline) (let (val - (new-path (concat - (or path my/index-root) - (org-element-property :raw-value heading) - "/"))) + (new-path (concat + (or path my/index-root) + (org-element-property :raw-value heading) + "/"))) (when-let* ((children (thread-last - (org-element-contents heading) - (mapcar (lambda (e) - (my/index--tree-get-recursive - e new-path))) - (seq-filter #'identity)))) - (setf (alist-get :children val) children)) + (org-element-contents heading) + (mapcar (lambda (e) + (my/index--tree-get-recursive + e new-path))) + (seq-filter #'identity)))) + (setf (alist-get :children val) children)) (when-let ((machine (org-element-property :MACHINE heading))) - (setf (alist-get :machine val) (split-string machine))) + (setf (alist-get :machine val) (split-string machine))) (when-let ((symlink (org-element-property :SYMLINK heading))) - (setf (alist-get :symlink val) symlink)) + (setf (alist-get :symlink val) symlink)) (when (org-element-property :PROJECT heading) - (setf (alist-get :project val) t)) + (setf (alist-get :project val) t)) (when-let* ((kind-str (org-element-property :KIND heading)) - (kind (intern kind-str))) - (setf (alist-get :kind val) kind) - (when (equal kind 'git) - (let ((remote (org-element-property :REMOTE heading))) - (unless remote - (user-error "No remote for %s" (alist-get :name val))) - (setf (alist-get :remote val) remote)))) + (kind (intern kind-str))) + (setf (alist-get :kind val) kind) + (when (equal kind 'git) + (let ((remote (org-element-property :REMOTE heading))) + (unless remote + (user-error "No remote for %s" (alist-get :name val))) + (setf (alist-get :remote val) remote)))) (setf (alist-get :name val) (org-element-property :raw-value heading) - (alist-get :path val) new-path) + (alist-get :path val) new-path) val))) (defun my/index--tree-get () @@ -10093,15 +10308,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tags- `:kind' - one of \"git\", \"mega\", or \"dummy\" - `:remote' - the remote to use for git nodes" (let* ((tree - (thread-last - (org-element-map (org-element-parse-buffer) 'headline #'identity) - (seq-filter (lambda (el) - (and - (= (org-element-property :level el) 1) - (seq-contains-p - (mapcar #'substring-no-properties (org-element-property :tags el)) - "folder")))) - (mapcar #'my/index--tree-get-recursive)))) + (thread-last + (org-element-map (org-element-parse-buffer) 'headline #'identity) + (seq-filter (lambda (el) + (and + (= (org-element-property :level el) 1) + (seq-contains-p + (mapcar #'substring-no-properties (org-element-property :tags el)) + "folder")))) + (mapcar #'my/index--tree-get-recursive)))) tree))
Verify tree

I also want to make sure that I didn’t mess up the numbers, i.e., didn’t place 10.02 under 11, and so on.

@@ -10122,25 +10337,25 @@ Didn’t work out as I expected, so I’ve made org-journal-tags CURRENT is the current number or name of the parent element." (let* ((name (alist-get :name elem)) - (number (my/index--extact-number name))) + (number (my/index--extact-number name))) (unless number (user-error "Can't find number: %s" name)) (cond ((and (listp current) (not (null current))) (unless (seq-some (lambda (cand) (string-prefix-p cand name)) current) - (user-error "Name: %s doesn't match: %s" name current))) + (user-error "Name: %s doesn't match: %s" name current))) ((stringp current) (unless (string-prefix-p current name) - (user-error "Name: %s doesn't match: %s" name current)))) + (user-error "Name: %s doesn't match: %s" name current)))) (let ((recur-value - (if (string-match-p (rx (+ num) "-" (+ num)) number) - (let* ((borders (split-string number "-")) - (start (string-to-number (nth 0 borders))) - (end (string-to-number (nth 1 borders)))) - (cl-loop for i from start to (1- end) collect (number-to-string i))) - number))) + (if (string-match-p (rx (+ num) "-" (+ num)) number) + (let* ((borders (split-string number "-")) + (start (string-to-number (nth 0 borders))) + (end (string-to-number (nth 1 borders)))) + (cl-loop for i from start to (1- end) collect (number-to-string i))) + number))) (mapcar (lambda (e) (my/tree--verfify-recursive e recur-value)) - (alist-get :children elem)))) + (alist-get :children elem)))) t) (defun my/index--tree-verify (tree) @@ -10155,15 +10370,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(defun my/index--tree-narrow-recursive (elem machine)
   "Remove all children of ELEM that are not active on MACHINE."
   (unless (when-let ((elem-machines (alist-get :machine elem)))
-	    (not (seq-some (lambda (elem-machine)
-			     (string-equal elem-machine machine))
-			   elem-machines)))
+            (not (seq-some (lambda (elem-machine)
+                             (string-equal elem-machine machine))
+                           elem-machines)))
     (setf (alist-get :children elem)
-	  (seq-filter
-	   #'identity
-	   (mapcar (lambda (e)
-		     (my/index--tree-narrow-recursive e machine))
-		   (alist-get :children elem))))
+          (seq-filter
+           #'identity
+           (mapcar (lambda (e)
+                     (my/index--tree-narrow-recursive e machine))
+                   (alist-get :children elem))))
     elem))
 
 (defun my/index--tree-narrow (tree)
@@ -10205,34 +10420,34 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  the folder."
   (let ((active-paths (or active-paths (my/index--tree-get-paths tree))))
     (cl-loop for elem in full-tree
-	     for path = (alist-get :path elem)
-	     for extra-folders = (when (and (alist-get :children elem)
-					    (file-directory-p path))
-				   (seq-difference
-				    (mapcar (lambda (d) (if (file-directory-p d)
-							    (concat d "/")
-							  d))
-					    (directory-files path t (rx (not ".") eos)))
-				    (cl-loop for child in (alist-get :children elem)
-					     collect (alist-get :path child))))
-	     for folder-exists = (file-directory-p path)
-	     for folder-has-to-exist = (seq-contains-p active-paths path)
-	     collect `((path . ,path)
-		       (exists . ,folder-exists)
-		       (has-to-exist . ,folder-has-to-exist)
-		       (children . ,(append
-				     (cl-loop for f in extra-folders
-					      collect
-					      `((path . ,f)
-						(exists . t)
-						(has-to-exist
-						 . ,(member
-						     (file-name-nondirectory
-						      (directory-file-name f))
-						     my/index-keep-files))
-						(extra . t)))
-				     (my/index--filesystem-tree-mapping
-				      (alist-get :children elem) tree active-paths)))))))
+             for path = (alist-get :path elem)
+             for extra-folders = (when (and (alist-get :children elem)
+                                            (file-directory-p path))
+                                   (seq-difference
+                                    (mapcar (lambda (d) (if (file-directory-p d)
+                                                            (concat d "/")
+                                                          d))
+                                            (directory-files path t (rx (not ".") eos)))
+                                    (cl-loop for child in (alist-get :children elem)
+                                             collect (alist-get :path child))))
+             for folder-exists = (file-directory-p path)
+             for folder-has-to-exist = (seq-contains-p active-paths path)
+             collect `((path . ,path)
+                       (exists . ,folder-exists)
+                       (has-to-exist . ,folder-has-to-exist)
+                       (children . ,(append
+                                     (cl-loop for f in extra-folders
+                                              collect
+                                              `((path . ,f)
+                                                (exists . t)
+                                                (has-to-exist
+                                                 . ,(member
+                                                     (file-name-nondirectory
+                                                      (directory-file-name f))
+                                                     my/index-keep-files))
+                                                (extra . t)))
+                                     (my/index--filesystem-tree-mapping
+                                      (alist-get :children elem) tree active-paths)))))))
 

And generate commands from the results of the above:

(defun my/index--filesystem-commands (mapping)
   "Get commands to sync filesystem with the tree.
@@ -10244,17 +10459,17 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsThe return value is a list of commands as defined by
 `my/index--commands-display'."
   (cl-loop for elem in mapping
-	   for path = (alist-get 'path elem)
-	   for exists = (alist-get 'exists elem)
-	   for has-to-exist = (alist-get 'has-to-exist elem)
-	   for extra = (alist-get 'extra elem)
-	   when (and (not exists) has-to-exist)
-	   collect (list (format "mkdir \"%s\"" path) "Make directories" 1)
-	   when (and exists (not has-to-exist))
-	   collect (list (format "rm -rf \"%s\"" path)
-			 (if extra "Remove extra files" "Remove directories")
-			 (if extra 20 10))
-	   append (my/index--filesystem-commands (alist-get 'children elem))))
+           for path = (alist-get 'path elem)
+           for exists = (alist-get 'exists elem)
+           for has-to-exist = (alist-get 'has-to-exist elem)
+           for extra = (alist-get 'extra elem)
+           when (and (not exists) has-to-exist)
+           collect (list (format "mkdir \"%s\"" path) "Make directories" 1)
+           when (and exists (not has-to-exist))
+           collect (list (format "rm -rf \"%s\"" path)
+                         (if extra "Remove extra files" "Remove directories")
+                         (if extra 20 10))
+           append (my/index--filesystem-commands (alist-get 'children elem))))
 
MEGA

As I said above, MEGA provides MEGAcmd, which is a convenient way to access MEGA via CLI.

To initialize the session, run

@@ -10276,25 +10491,25 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
The functions also skips lines in [square brackets] and ones that start with more than 3 spaces." (when-let* ((lines (seq-filter - (lambda (s) (not (or (string-empty-p s) - (string-match-p (rx bos "[" (* nonl) "]") s) - (string-match-p (rx bos (>= 3 " ")) s)))) - (split-string string "\n"))) - (first-line (car lines)) - (headers (split-string first-line)) - (header-indices (mapcar - (lambda (header) - (cl-search header first-line)) - headers))) + (lambda (s) (not (or (string-empty-p s) + (string-match-p (rx bos "[" (* nonl) "]") s) + (string-match-p (rx bos (>= 3 " ")) s)))) + (split-string string "\n"))) + (first-line (car lines)) + (headers (split-string first-line)) + (header-indices (mapcar + (lambda (header) + (cl-search header first-line)) + headers))) (cl-loop for line in (cdr lines) - collect (cl-loop for header in headers - for start in header-indices - for end in (append (cdr header-indices) - (list (length line))) - collect (cons - (intern header) - (string-trim - (substring line start end))))))) + collect (cl-loop for header in headers + for start in header-indices + for end in (append (cdr header-indices) + (list (length line))) + collect (cons + (intern header) + (string-trim + (substring line start end)))))))

Now we can invoke mega-sync to get the current sync status. --path-display-size=10000 disables truncation of long paths.

(defun my/index--mega-data-from-sync ()
   "Get the current MEGA sync status.
@@ -10303,14 +10518,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tags- path - path to file or directory
 - enabled - whether the file or directory is enabled for sync"
   (let ((mega-result (my/parse-table-str
-		      (shell-command-to-string "mega-sync --path-display-size=10000"))))
+                      (shell-command-to-string "mega-sync --path-display-size=10000"))))
     (cl-loop for value in mega-result
-	     for localpath = (alist-get 'LOCALPATH value)
-	     collect `((path . ,(if (file-directory-p localpath)
-				    (concat localpath "/")
-				  localpath))
-		       (enabled . ,(string-equal (alist-get 'ACTIVE value)
-						 "Enabled"))))))
+             for localpath = (alist-get 'LOCALPATH value)
+             collect `((path . ,(if (file-directory-p localpath)
+                                    (concat localpath "/")
+                                  localpath))
+                       (enabled . ,(seq-contains-p
+                                    '("Pending" "Loading" "Running")
+                                    (alist-get 'RUN_STATE value)))))))
 

And get the same data from the tree.

(defun my/index--tree-get-paths (tree &optional kind)
   "Get paths from TREE.
@@ -10321,10 +10537,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
 The return value is a list of strings."
   (cl-loop for elem in tree
-	   when (or (null kind) (eq (alist-get :kind elem) kind))
-	   collect (alist-get :path elem)
-	   append (my/index--tree-get-paths
-		   (alist-get :children elem) kind)))
+           when (or (null kind) (eq (alist-get :kind elem) kind))
+           collect (alist-get :path elem)
+           append (my/index--tree-get-paths
+                   (alist-get :children elem) kind)))
 

With that information, we can generate commands to synchronize the required and actual sync paths.

(defun my/index--mega-local-path (path)
   "Get path in the MEGA cloud by the local path PATH."
@@ -10339,34 +10555,34 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsThe return value is a list of commands as defined by
 `my/index--commands-display'."
   (let* ((paths-all (my/index--tree-get-paths full-tree))
-	 (mega-paths-to-enable (my/index--tree-get-paths tree 'mega))
-	 (mega-info (my/index--mega-data-from-sync))
-	 (mega-paths-enabled (seq-map
-			      (lambda (e) (alist-get 'path e))
-			      (seq-filter (lambda (e) (alist-get 'enabled e))
-					  mega-info)))
-	 (mega-paths-disabled (seq-map
-			       (lambda (e) (alist-get 'path e))
-			       (seq-filter (lambda (e) (not (alist-get 'enabled e)))
-					   mega-info))))
+         (mega-paths-to-enable (my/index--tree-get-paths tree 'mega))
+         (mega-info (my/index--mega-data-from-sync))
+         (mega-paths-enabled (seq-map
+                              (lambda (e) (alist-get 'path e))
+                              (seq-filter (lambda (e) (alist-get 'enabled e))
+                                          mega-info)))
+         (mega-paths-disabled (seq-map
+                               (lambda (e) (alist-get 'path e))
+                               (seq-filter (lambda (e) (not (alist-get 'enabled e)))
+                                           mega-info))))
     (append
      (cl-loop for path in (seq-difference mega-paths-to-enable mega-paths-enabled)
-	      if (seq-contains-p mega-paths-disabled path)
-	      collect (list (format "mega-sync -e \"%s\"" path) "Mega enable sync" 5)
-	      else append (list
-			   (list (format "mega-mkdir -p \"%s\""
-					 (my/index--mega-local-path path))
-				 "Mega mkdirs" 4)
-			   (list (format "mega-sync \"%s\" \"%s\""
-					 path (my/index--mega-local-path path))
-				 "Mega add sync" 5)))
+              if (seq-contains-p mega-paths-disabled path)
+              collect (list (format "mega-sync -r \"%s\"" path) "Mega enable sync" 5)
+              else append (list
+                           (list (format "mega-mkdir -p \"%s\""
+                                         (my/index--mega-local-path path))
+                                 "Mega mkdirs" 4)
+                           (list (format "mega-sync \"%s\" \"%s\""
+                                         path (my/index--mega-local-path path))
+                                 "Mega add sync" 5)))
      (cl-loop for path in (seq-difference
-			   (seq-intersection mega-paths-enabled paths-all)
-			   mega-paths-to-enable)
-	      collect (list
-		       (format "mega-sync -d \"%s\""
-			       (substring path 0 (1- (length path))))
-		       "Mega remove sync" 4)))))
+                           (seq-intersection mega-paths-enabled paths-all)
+                           mega-paths-to-enable)
+              collect (list
+                       (format "mega-sync -d \"%s\""
+                               (substring path 0 (1- (length path))))
+                       "Mega remove sync" 4)))))
 
my/index--mega-commands
 
Git repos

To sync git, we just need to clone the required git repos. Removing the repos is handled by the folder sync commands.

@@ -10379,15 +10595,15 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsThe return value is a list of commands as defined by `my/index--commands-display'." (cl-loop for elem in tree - for path = (alist-get :path elem) - when (and (eq (alist-get :kind elem) 'git) - (or (not (file-directory-p path)) - (directory-empty-p path))) - collect (list (format "git clone \"%s\" \"%s\"" - (alist-get :remote elem) - path) - "Init git repos" 2) - append (my/index--git-commands (alist-get :children elem)))) + for path = (alist-get :path elem) + when (and (eq (alist-get :kind elem) 'git) + (or (not (file-directory-p path)) + (directory-empty-p path))) + collect (list (format "git clone \"%s\" \"%s\"" + (alist-get :remote elem) + path) + "Init git repos" 2) + append (my/index--git-commands (alist-get :children elem))))
Wakatime

So, that’s it for synchronization. A few other things are needed here.

I use WakaTime to track my coding activity, and I don’t like the alphanumeric prefixes in my coding stats. Fortunately, wakatime-cli provides an option called projectmap to rename projects, so we just have to generate its contents.

@@ -10413,23 +10629,23 @@ Didn’t work out as I expected, so I’ve made org-journal-tags\"bare-project-name\" is project name without the alphanumeric prefix." (cl-loop for elem in tree - for name = (alist-get :name elem) - if (eq (alist-get :kind elem) 'git) - collect (cons (my/index--wakatime-escape name) - (my/index--wakatime-escape - (my/index--bare-project-name name))) - if (and (eq (alist-get :kind elem) 'git) - (alist-get :symlink elem)) - collect (cons (my/index--wakatime-escape - ;; lmao - ;; /a/b/c/ -> c - ;; /a/b/c -> b - (file-name-nondirectory - (directory-file-name - (file-name-directory (alist-get :symlink elem))))) - (my/index--wakatime-escape - (my/index--bare-project-name name))) - append (my/index--wakatime-get-map-tree (alist-get :children elem)))) + for name = (alist-get :name elem) + if (eq (alist-get :kind elem) 'git) + collect (cons (my/index--wakatime-escape name) + (my/index--wakatime-escape + (my/index--bare-project-name name))) + if (and (eq (alist-get :kind elem) 'git) + (alist-get :symlink elem)) + collect (cons (my/index--wakatime-escape + ;; lmao + ;; /a/b/c/ -> c + ;; /a/b/c -> b + (file-name-nondirectory + (directory-file-name + (file-name-directory (alist-get :symlink elem))))) + (my/index--wakatime-escape + (my/index--bare-project-name name))) + append (my/index--wakatime-get-map-tree (alist-get :children elem))))

And insert that in wakatime.cfg if necessary.

(defun my/index--wakatime-commands (tree)
   "Get commands to update WakaTime config from TREE.
@@ -10438,18 +10654,18 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsa list of commands as defined by `my/index--commands-display'."
   (require 'ini)
   (let* ((map-tree (my/index--wakatime-get-map-tree tree))
-	 (map-tree-encoding (ini-encode `(("projectmap" . ,map-tree))))
-	 (map-tree-saved (with-temp-buffer
-			   (insert-file-contents (expand-file-name "~/.wakatime.cfg"))
-			   (string-match-p (regexp-quote map-tree-encoding)
-					   (buffer-string)))))
+         (map-tree-encoding (ini-encode `(("projectmap" . ,map-tree))))
+         (map-tree-saved (with-temp-buffer
+                           (insert-file-contents (expand-file-name "~/.wakatime.cfg"))
+                           (string-match-p (regexp-quote map-tree-encoding)
+                                           (buffer-string)))))
     (unless map-tree-saved
       (let ((insert-command (list (format "echo \"\n\n%s\" >> ~/.wakatime.cfg"
-					  map-tree-encoding)
-				  "Update WakaTime config" 9)))
-	(list (list (format "sed -i -z 's/\\[projectmap\\]\\n[^[]*//g' ~/.wakatime.cfg")
-		    "Update WakaTime config" 9)
-	      insert-command)))))
+                                          map-tree-encoding)
+                                  "Update WakaTime config" 9)))
+        (list (list (format "sed -i -z 's/\\[projectmap\\]\\n[^[]*//g' ~/.wakatime.cfg")
+                    "Update WakaTime config" 9)
+              insert-command)))))
 

The last part here is creating symbolic links.

(defun my/index-get-symlink-commands (tree)
@@ -10458,22 +10674,22 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsTREE is a form a defined by `my/index--tree-get'. The return value is
 a list of commands as defined by `my/index--commands-display'."
   (cl-loop for elem in tree
-	   for path = (alist-get :path elem)
-	   for symlink = (alist-get :symlink elem)
-	   when (and symlink (not (string-match-p (rx "/" eos) symlink)))
-	   do (user-error "Wrong symlink: %s (should be a directory)" symlink)
-	   when (and path symlink
-		     (or (file-exists-p symlink)
-			 (file-exists-p (substring symlink 0 -1)))
-		     (not (file-symlink-p (substring symlink 0 -1))))
-	   collect (list (format "rm -rf %s" (substring symlink 0 -1))
-			 "Remove files to make symlinks" 6)
-	   when (and path symlink
-		     (not (file-symlink-p (substring symlink 0 -1))))
-	   collect (list (format "ln -s '%s' '%s'" path
-				 (substring symlink 0 -1))
-			 "Make symlinks" 7)
-	   append (my/index-get-symlink-commands (alist-get :children elem))))
+           for path = (alist-get :path elem)
+           for symlink = (alist-get :symlink elem)
+           when (and symlink (not (string-match-p (rx "/" eos) symlink)))
+           do (user-error "Wrong symlink: %s (should be a directory)" symlink)
+           when (and path symlink
+                     (or (file-exists-p symlink)
+                         (file-exists-p (substring symlink 0 -1)))
+                     (not (file-symlink-p (substring symlink 0 -1))))
+           collect (list (format "rm -rf %s" (substring symlink 0 -1))
+                         "Remove files to make symlinks" 6)
+           when (and path symlink
+                     (not (file-symlink-p (substring symlink 0 -1))))
+           collect (list (format "ln -s '%s' '%s'" path
+                                 (substring symlink 0 -1))
+                         "Make symlinks" 7)
+           append (my/index-get-symlink-commands (alist-get :children elem))))
 
my/index-get-symlink-commands
 
Run all commands

And put that all together.

@@ -10485,7 +10701,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (define-key keymap (kbd "q") #'my/quit-window-and-buffer) (when (fboundp 'evil-define-key*) (evil-define-key* 'normal keymap - "q" #'my/quit-window-and-buffer)) + "q" #'my/quit-window-and-buffer)) keymap) "Keymap for `biome-api-error-mode'.") @@ -10501,25 +10717,25 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (unless commands (user-error "No commands to display")) (let ((buffer (get-buffer-create "*index commands*")) - (groups (seq-sort-by - (lambda (g) (nth 2 (nth 1 g))) - #'< - (seq-group-by (lambda (c) (nth 1 c)) - commands)))) + (groups (seq-sort-by + (lambda (g) (nth 2 (nth 1 g))) + #'< + (seq-group-by (lambda (c) (nth 1 c)) + commands)))) (with-current-buffer buffer (my/index-commands-mode) (let ((inhibit-read-only t) - commands-sequence) - (erase-buffer) - (setq-local my/index-commands nil) - (cl-loop for g in groups - for group-name = (car g) - for elems = (cdr g) - do (insert "# " group-name "\n") - do (cl-loop for elem in elems - do (push (nth 0 elem) my/index-commands) - do (insert (nth 0 elem) "\n"))) - (setq-local buffer-read-only t))) + commands-sequence) + (erase-buffer) + (setq-local my/index-commands nil) + (cl-loop for g in groups + for group-name = (car g) + for elems = (cdr g) + do (insert "# " group-name "\n") + do (cl-loop for elem in elems + do (push (nth 0 elem) my/index-commands) + do (insert (nth 0 elem) "\n"))) + (setq-local buffer-read-only t))) (switch-to-buffer buffer)))

In order to execute these commands, compile with bash -x on a temporary file is quite sufficient.

(defun my/index-commands-exec ()
@@ -10541,14 +10757,14 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (setq
    my/index--tree
    (cond ((string-equal (buffer-file-name) my/index-file)
-	  (my/index--tree-get))
-	 ((or (null my/index--tree)
-	      (file-has-changed-p my/index-file 'index))
-	  (with-temp-buffer
-	    (insert-file-contents my/index-file)
-	    (let ((buffer-file-name my/index-file))
-	      (my/index--tree-get))))
-	 (t my/index--tree))))
+          (my/index--tree-get))
+         ((or (null my/index--tree)
+              (file-has-changed-p my/index-file 'index))
+          (with-temp-buffer
+            (insert-file-contents my/index-file)
+            (let ((buffer-file-name my/index-file))
+              (my/index--tree-get))))
+         (t my/index--tree))))
 

With that, we can make the main entrypoint.

(defun my/index-commands-sync ()
   "Sync the filesystem with the index."
@@ -10556,14 +10772,14 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (let* ((full-tree (my/index--tree-retrive)))
     (my/index--tree-verify full-tree)
     (let* ((tree (my/index--tree-narrow full-tree))
-	   (mega-commands (my/index--mega-commands full-tree tree))
-	   (mapping (my/index--filesystem-tree-mapping full-tree tree))
-	   (folder-commands (my/index--filesystem-commands mapping))
-	   (git-commands (my/index--git-commands tree))
-	   (waka-commands (my/index--wakatime-commands tree))
-	   (symlink-commands (my/index-get-symlink-commands tree)))
+           (mega-commands (my/index--mega-commands full-tree tree))
+           (mapping (my/index--filesystem-tree-mapping full-tree tree))
+           (folder-commands (my/index--filesystem-commands mapping))
+           (git-commands (my/index--git-commands tree))
+           (waka-commands (my/index--wakatime-commands tree))
+           (symlink-commands (my/index-get-symlink-commands tree)))
       (my/index--commands-display (append mega-commands folder-commands git-commands
-					  waka-commands symlink-commands)))))
+                                          waka-commands symlink-commands)))))
 

The last piece is the navigation interface.

Of course, plain dired does the job fine, thanks to the relatively low-depth filesystem structure. But I still want a navigation interface like M-x projectile-switch-project.

@@ -10582,27 +10798,27 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
The return value is a form as defined by `my/index--nav-get'." (when (file-directory-p path) (let* ((number (my/index--extact-number name)) - (files (mapcar - (lambda (f) (cons f (concat path f))) - (seq-filter (lambda (f) (not (string-prefix-p "." f))) - (directory-files path)))) - (matching-files - (seq-filter - (lambda (f) (and (file-directory-p (cdr f)) - (string-prefix-p number (car f)))) - files))) + (files (mapcar + (lambda (f) (cons f (concat path f))) + (seq-filter (lambda (f) (not (string-prefix-p "." f))) + (directory-files path)))) + (matching-files + (seq-filter + (lambda (f) (and (file-directory-p (cdr f)) + (string-prefix-p number (car f)))) + files))) (when (and (length> matching-files 0) - (length< matching-files (length files))) - (user-error "Extraneuous files in %s" path)) + (length< matching-files (length files))) + (user-error "Extraneuous files in %s" path)) (cl-loop for (name-1 . path-1) in matching-files - append (if-let ((child-files (my/index--nav-extend name-1 (concat path-1 "/")))) - (mapcar - (lambda (child-datum) - (push name-1 (alist-get :names child-datum)) - child-datum) - child-files) - `(((:names . (,name-1)) - (:path . ,(concat path-1 "/"))))))))) + append (if-let ((child-files (my/index--nav-extend name-1 (concat path-1 "/")))) + (mapcar + (lambda (child-datum) + (push name-1 (alist-get :names child-datum)) + child-datum) + child-files) + `(((:names . (,name-1)) + (:path . ,(concat path-1 "/")))))))))

And one to get the navigation data structure.

(defun my/index--nav-get (tree &optional names)
   "Get the navigation structure from TREE.
@@ -10623,31 +10839,31 @@ Didn’t work out as I expected, so I’ve made org-journal-tags   (cl-reduce
     (lambda (acc elem)
       (let* ((name (alist-get :name elem))
-	     (path (alist-get :path elem)))
-	(cond ((alist-get :project elem)
-	       (let ((current-nav `((:names . (,@names ,name))
-				    (:path . ,path))))
-		 (when-let (child-navs
-			    (and (alist-get :children elem)
-				 (my/index--nav-get (alist-get :children elem))))
-		   (setf (alist-get :child-navs current-nav) child-navs))
-		 (push current-nav acc)))
-	      ((alist-get :children elem)
-	       (when-let (child-navs (my/index--nav-get
-				      (alist-get :children elem)
-				      `(,@names ,name)))
-		 (cl-loop for child-nav in child-navs
-			  do (push child-nav acc))))
-	      (t (if-let ((extended-nav (my/index--nav-extend name path)))
-		     (cl-loop for child-nav in extended-nav
-			      do (setf (alist-get :names child-nav)
-				       (append names (list name)
-					       (alist-get :names child-nav)))
-			      do (push child-nav acc))
-		   (push `((:names . (,@names ,name))
-			   (:path . ,path))
-			 acc))))
-	acc))
+             (path (alist-get :path elem)))
+        (cond ((alist-get :project elem)
+               (let ((current-nav `((:names . (,@names ,name))
+                                    (:path . ,path))))
+                 (when-let (child-navs
+                            (and (alist-get :children elem)
+                                 (my/index--nav-get (alist-get :children elem))))
+                   (setf (alist-get :child-navs current-nav) child-navs))
+                 (push current-nav acc)))
+              ((alist-get :children elem)
+               (when-let (child-navs (my/index--nav-get
+                                      (alist-get :children elem)
+                                      `(,@names ,name)))
+                 (cl-loop for child-nav in child-navs
+                          do (push child-nav acc))))
+              (t (if-let ((extended-nav (my/index--nav-extend name path)))
+                     (cl-loop for child-nav in extended-nav
+                              do (setf (alist-get :names child-nav)
+                                       (append names (list name)
+                                               (alist-get :names child-nav)))
+                              do (push child-nav acc))
+                   (push `((:names . (,@names ,name))
+                           (:path . ,path))
+                         acc))))
+        acc))
     tree
     :initial-value nil)))
 

It also makes sense to cache results of the above.

@@ -10659,10 +10875,10 @@ Didn’t work out as I expected, so I’ve made org-journal-tags The return value is a form as defined by `my/index--nav-get'." (if (or (null my/index--nav) - (file-has-changed-p my/index-file 'nav)) + (file-has-changed-p my/index-file 'nav)) (let ((tree (my/index--tree-retrive))) - (setq my/index--nav (my/index--nav-get - (my/index--tree-narrow tree)))) + (setq my/index--nav (my/index--nav-get + (my/index--tree-narrow tree)))) my/index--nav))
Emacs interface

As for Emacs interface, completing-read is sufficient, except that I don’t want prescient.el to interfere with the default ordering of elements.

@@ -10671,11 +10887,11 @@ Didn’t work out as I expected, so I’ve made org-journal-tags NAV is a structure as defined by `my/index--nav-get'." (let* ((collection - (mapcar (lambda (item) - (cons (car (last (alist-get :names item))) - (alist-get :path item))) - nav)) - (vertico-sort-function nil)) + (mapcar (lambda (item) + (cons (car (last (alist-get :names item))) + (alist-get :path item))) + nav)) + (vertico-sort-function nil)) (cdr (assoc (completing-read "Index: " collection nil t) @@ -10701,20 +10917,20 @@ Didn’t work out as I expected, so I’ve made org-journal-tagsto `dired' if used interactively." (interactive (list current-prefix-arg #'dired)) (let* ((nav (my/index--nav-retrive)) - (current-nav (my/index--nav-find-path - nav (expand-file-name default-directory))) - (current-child-navs (alist-get :child-navs current-nav))) + (current-nav (my/index--nav-find-path + nav (expand-file-name default-directory))) + (current-child-navs (alist-get :child-navs current-nav))) (cond ((null arg) - (let ((selected (my/index--nav-find-path - nav - (my/index--nav-prompt nav)))) - (if-let (child-navs (alist-get :child-navs selected)) - (funcall func (my/index--nav-prompt child-navs)) - (funcall func (alist-get :path selected))))) - ((and (equal arg '(4)) current-child-navs) - (funcall func (my/index--nav-prompt current-child-navs))) - ((and (equal arg '(4)) (null current-child-navs)) - (funcall func (my/index--nav-prompt nav)))))) + (let ((selected (my/index--nav-find-path + nav + (my/index--nav-prompt nav)))) + (if-let (child-navs (alist-get :child-navs selected)) + (funcall func (my/index--nav-prompt child-navs)) + (funcall func (alist-get :path selected))))) + ((and (equal arg '(4)) current-child-navs) + (funcall func (my/index--nav-prompt current-child-navs))) + ((and (equal arg '(4)) (null current-child-navs)) + (funcall func (my/index--nav-prompt nav))))))

Finally, something that I can bind to a key.

(defun my/index-nav-with-select-file (arg)
   (interactive (list current-prefix-arg))
@@ -10785,8 +11001,8 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
 
(use-package screenshot
   :straight (:repo "tecosaur/screenshot"
-		   :host github
-		   :build (:not compile))
+                   :host github
+                   :build (:not compile))
   :if (display-graphic-p)
   :commands (screenshot)
   :init
@@ -10796,9 +11012,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(my-leader-def "ah" 'proced)
 (setq proced-auto-update-interval 1)
 (add-hook 'proced-mode-hook (lambda ()
-			      (visual-line-mode -1)
-			      (setq-local truncate-lines t)
-			      (proced-toggle-auto-update 1)))
+                              (visual-line-mode -1)
+                              (setq-local truncate-lines t)
+                              (proced-toggle-auto-update 1)))
 

Guix

An Emacs package to help managing GNU Guix.

(use-package guix
@@ -10849,7 +11065,7 @@ Didn’t work out as I expected, so I’ve made org-journal-tags  (pomm-mode-line-mode)
   (add-hook 'pomm-on-status-changed-hook #'pomm--sync-org-clock)
   (add-hook 'pomm-third-time-on-status-changed-hook
-	    #'pomm-third-time--sync-org-clock))
+            #'pomm-third-time--sync-org-clock))
 

hledger

is a plain-text double-entry accounting software. I use it for managing my personal finances, and thus far it’s great.

@@ -10870,9 +11086,9 @@ Didn’t work out as I expected, so I’ve made org-journal-tags :config (setq hledger-jfile (concat org-directory "/ledger/ledger.journal")) (add-hook 'hledger-mode-hook - (lambda () - (make-local-variable 'company-backends) - (add-to-list 'company-backends 'hledger-company)))) + (lambda () + (make-local-variable 'company-backends) + (add-to-list 'company-backends 'hledger-company)))) (use-package flycheck-hledger :straight t @@ -10955,11 +11171,11 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (defun org-babel-execute:pgn (body params) (let ((out-file (or (alist-get :file params) - (org-babel-temp-file "pgn-" ".png")))) + (org-babel-temp-file "pgn-" ".png")))) (org-babel-eval (format "%s %s '%s' '%s'" my/chess-python - "~/bin/python-scripts/render_pgn.py" - body out-file) + "~/bin/python-scripts/render_pgn.py" + body out-file) "") nil)) @@ -10969,11 +11185,11 @@ Didn’t work out as I expected, so I’ve made org-journal-tags (defun org-babel-execute:fen (body params) (let ((out-file (or (alist-get :file params) - (org-babel-temp-file "fen-" ".png")))) + (org-babel-temp-file "fen-" ".png")))) (org-babel-eval (format "%s %s '%s' '%s' true" my/chess-python - "~/bin/python-scripts/render_pgn.py" - body out-file) + "~/bin/python-scripts/render_pgn.py" + body out-file) "") nil)) @@ -11014,11 +11230,11 @@ Didn’t work out as I expected, so I’ve made org-journal-tags
(use-package elcord
   :straight t
   :if (and (or
-	    (string= (system-name) "violet")
-	    (string= (system-name) "eminence")
-	    (string= (system-name) "iris"))
-	   (not my/remote-server)
-	   (not my/nested-emacs))
+            (string= (system-name) "violet")
+            (string= (system-name) "eminence")
+            (string= (system-name) "iris"))
+           (not my/remote-server)
+           (not my/nested-emacs))
   :config
   (setq elcord-buffer-details-format-function #'my/elcord-buffer-details-format-functions)
   (advice-add 'elcord--try-update-presence :filter-args #'my/elcord-update-presence-mask-advice)
@@ -11051,11 +11267,11 @@ Didn’t work out as I expected, so I’ve made org-journal-tags(defun my/zone-with-select ()
   (interactive)
   (let ((zone-programs
-	 (vector
-	  (intern
-	   (completing-read
-	    "Zone programs"
-	    (cl-mapcar 'symbol-name original-zone-programs))))))
+         (vector
+          (intern
+           (completing-read
+            "Zone programs"
+            (cl-mapcar 'symbol-name original-zone-programs))))))
     (zone)))
 

Gource

Gource is a program that draws an animated graph of users changing the repository over time.

@@ -11073,10 +11289,10 @@ It may happen when people use forges like GitLab
(defun my/gravatar-retrieve-sync (email file-name)
   "Get gravatar for EMAIL and save it to FILE-NAME."
   (let ((gravatar-default-image "identicon")
-	(gravatar-size nil)
-	(coding-system-for-write 'binary)
-	(write-region-annotate-functions nil)
-	(write-region-post-annotation-function nil))
+        (gravatar-size nil)
+        (coding-system-for-write 'binary)
+        (write-region-annotate-functions nil)
+        (write-region-post-annotation-function nil))
     (write-region
      (image-property (gravatar-retrieve-synchronously email) :data)
      nil file-name nil :silent)))
@@ -11119,70 +11335,70 @@ It may happen when people use forges like GitLab- author: the most popular username
 I.e. one alist is all emails and usernames of one author."
   (let* ((default-directory repo)
-	 (data (shell-command-to-string
-		"git log --pretty=format:\"%ae|%an\" | sort | uniq -c | sed \"s/^[ \t]*//;s/ /|/\""))
-	 (authors
-	  (cl-loop for string in (split-string data "\n")
-		   if (= (length (split-string string "|")) 3)
-		   collect (let ((datum (split-string string "|")))
-			     `((count . ,(string-to-number (nth 0 datum)))
-			       (email . ,(downcase (nth 1 datum)))
-			       (author . ,(nth 2 datum)))))))
+         (data (shell-command-to-string
+                "git log --pretty=format:\"%ae|%an\" | sort | uniq -c | sed \"s/^[ \t]*//;s/ /|/\""))
+         (authors
+          (cl-loop for string in (split-string data "\n")
+                   if (= (length (split-string string "|")) 3)
+                   collect (let ((datum (split-string string "|")))
+                             `((count . ,(string-to-number (nth 0 datum)))
+                               (email . ,(downcase (nth 1 datum)))
+                               (author . ,(nth 2 datum)))))))
     (mapcar
      (lambda (datum)
        (setf (alist-get 'author datum)
-	     (car (cl-reduce
-		   (lambda (acc author)
-		     (if (> (cdr author) (cdr acc))
-			 author
-		       acc))
-		   (alist-get 'authors datum)
-		   :initial-value '(nil . -1))))
+             (car (cl-reduce
+                   (lambda (acc author)
+                     (if (> (cdr author) (cdr acc))
+                         author
+                       acc))
+                   (alist-get 'authors datum)
+                   :initial-value '(nil . -1))))
        (setf (alist-get 'email datum)
-	     (car (cl-reduce
-		   (lambda (acc email)
-		     (if (> (cdr email) (cdr acc))
-			 email
-		       acc))
-		   (alist-get 'emails datum)
-		   :initial-value '(nil . -1))))
+             (car (cl-reduce
+                   (lambda (acc email)
+                     (if (> (cdr email) (cdr acc))
+                         email
+                       acc))
+                   (alist-get 'emails datum)
+                   :initial-value '(nil . -1))))
        datum)
      (cl-reduce
       (lambda (acc val)
-	(let* ((author (alist-get 'author val))
-	       (email (alist-get 'email val))
-	       (count (alist-get 'count val))
-	       (saved-value
-		(seq-find
-		 (lambda (cand)
-		   (or (alist-get email (alist-get 'emails cand)
-				  nil nil #'string-equal)
-		       (alist-get author (alist-get 'authors cand)
-				  nil nil #'string-equal)
-		       (alist-get email (alist-get 'authors cand)
-				  nil nil #'string-equal)
-		       (alist-get author (alist-get 'emails cand)
-				  nil nil #'string-equal)))
-		 acc)))
-	  (if saved-value
-	      (progn
-		(if (alist-get email (alist-get 'emails saved-value)
-			       nil nil #'string-equal)
-		    (cl-incf (alist-get email (alist-get 'emails saved-value)
-					nil nil #'string-equal)
-			     count)
-		  (push (cons email count) (alist-get 'emails saved-value)))
-		(if (alist-get author (alist-get 'authors saved-value)
-			       nil nil #'string-equal)
-		    (cl-incf (alist-get author (alist-get 'authors saved-value)
-					nil nil #'string-equal)
-			     count)
-		  (push (cons author count) (alist-get 'authors saved-value))))
-	    (setq saved-value
-		  (push `((emails . ((,email . ,count)))
-			  (authors . ((,author . ,count))))
-			acc)))
-	  acc))
+        (let* ((author (alist-get 'author val))
+               (email (alist-get 'email val))
+               (count (alist-get 'count val))
+               (saved-value
+                (seq-find
+                 (lambda (cand)
+                   (or (alist-get email (alist-get 'emails cand)
+                                  nil nil #'string-equal)
+                       (alist-get author (alist-get 'authors cand)
+                                  nil nil #'string-equal)
+                       (alist-get email (alist-get 'authors cand)
+                                  nil nil #'string-equal)
+                       (alist-get author (alist-get 'emails cand)
+                                  nil nil #'string-equal)))
+                 acc)))
+          (if saved-value
+              (progn
+                (if (alist-get email (alist-get 'emails saved-value)
+                               nil nil #'string-equal)
+                    (cl-incf (alist-get email (alist-get 'emails saved-value)
+                                        nil nil #'string-equal)
+                             count)
+                  (push (cons email count) (alist-get 'emails saved-value)))
+                (if (alist-get author (alist-get 'authors saved-value)
+                               nil nil #'string-equal)
+                    (cl-incf (alist-get author (alist-get 'authors saved-value)
+                                        nil nil #'string-equal)
+                             count)
+                  (push (cons author count) (alist-get 'authors saved-value))))
+            (setq saved-value
+                  (push `((emails . ((,email . ,count)))
+                          (authors . ((,author . ,count))))
+                        acc)))
+          acc))
       authors
       :initial-value authors-init))))
 

Despite the probable we-enjoy-typing-ness of the implementation, it’s actually pretty simple:

@@ -11221,28 +11437,28 @@ I’ve seen a couple of cases where people would swap their username and ema
AUTHORS is the output of `my/git-get-authors'." (let ((log (shell-command-to-string - (concat - "gource --output-custom-log - " - repo))) - (authors-mapping (make-hash-table :test #'equal)) - (prefix (file-name-base repo))) + (concat + "gource --output-custom-log - " + repo))) + (authors-mapping (make-hash-table :test #'equal)) + (prefix (file-name-base repo))) (cl-loop for author-datum in authors - for author = (alist-get 'author author-datum) - do (my/gravatar-save (alist-get 'email author-datum) author) - do (cl-loop for other-author in (alist-get 'authors author-datum) - unless (string-equal (car other-author) author) - do (puthash (car other-author) author - authors-mapping))) + for author = (alist-get 'author author-datum) + do (my/gravatar-save (alist-get 'email author-datum) author) + do (cl-loop for other-author in (alist-get 'authors author-datum) + unless (string-equal (car other-author) author) + do (puthash (car other-author) author + authors-mapping))) (cl-loop for line in (split-string log "\n") - concat (let ((fragments (split-string line "|"))) - (when (> (length fragments) 3) - (when-let (mapped-author (gethash (nth 1 fragments) - authors-mapping)) - (setf (nth 1 fragments) mapped-author)) - (setf (nth 3 fragments) - (concat "/" prefix (nth 3 fragments)))) - (string-join fragments "|")) - concat "\n"))) + concat (let ((fragments (split-string line "|"))) + (when (> (length fragments) 3) + (when-let (mapped-author (gethash (nth 1 fragments) + authors-mapping)) + (setf (nth 1 fragments) mapped-author)) + (setf (nth 3 fragments) + (concat "/" prefix (nth 3 fragments)))) + (string-join fragments "|")) + concat "\n")))

This function:

  • Working with projects diff --git a/configs/guix/index.html b/configs/guix/index.html index e0268b2..b628650 100644 --- a/configs/guix/index.html +++ b/configs/guix/index.html @@ -122,9 +122,9 @@ # Source the new profile GUIX_PROFILE="$profilePath/$profileName" if [ -f $GUIX_PROFILE/etc/profile ]; then - . "$GUIX_PROFILE"/etc/profile + . "$GUIX_PROFILE"/etc/profile else - echo -e "${RED}Couldn't find profile:" $GUIX_PROFILE/etc/profile "${NC}" + echo -e "${RED}Couldn't find profile:" $GUIX_PROFILE/etc/profile "${NC}" fi else echo "No profile found at path" $profilePath @@ -246,16 +246,16 @@
    (kernel
       (let*
           ((channels
    -	(list (channel
    -	       (name 'nonguix)
    -	       (url "https://gitlab.com/nonguix/nonguix")
    -	       (commit "213be7ee6676fc4a3db0e3ac9ce5cd79e2ed209e"))
    -	      (channel
    -	       (name 'guix)
    -	       (url "https://git.savannah.gnu.org/git/guix.git")
    -	       (commit "6311493d7a6271bfbc51f4693857f9a12fe9965d"))))
    +        (list (channel
    +               (name 'nonguix)
    +               (url "https://gitlab.com/nonguix/nonguix")
    +               (commit "213be7ee6676fc4a3db0e3ac9ce5cd79e2ed209e"))
    +              (channel
    +               (name 'guix)
    +               (url "https://git.savannah.gnu.org/git/guix.git")
    +               (commit "6311493d7a6271bfbc51f4693857f9a12fe9965d"))))
            (inferior
    -	(inferior-for-channels channels)))
    +        (inferior-for-channels channels)))
         (first (lookup-inferior-packages inferior "linux" "6.2.9"))))
     ;; (kernel linux)
     (initrd microcode-initrd)
    @@ -266,32 +266,32 @@
     
    (keyboard-layout (keyboard-layout "us,ru" #:options '("grp:alt_shift_toggle")))
     

    User accounts.

    (users (cons* (user-account
    -	       (name "pavel")
    -	       (comment "Pavel")
    -	       (group "users")
    -	       (home-directory "/home/pavel")
    -	       (supplementary-groups
    -		'("wheel"  ;; sudo
    -		  "netdev" ;; network devices
    -		  "audio"
    -		  "video"
    -		  "input"
    -		  "tty"
    -		  "docker"
    -		  "scanner"
    -		  "libvirt"
    -		  "lp")))
    -	      %base-user-accounts))
    +               (name "pavel")
    +               (comment "Pavel")
    +               (group "users")
    +               (home-directory "/home/pavel")
    +               (supplementary-groups
    +                '("wheel"  ;; sudo
    +                  "netdev" ;; network devices
    +                  "audio"
    +                  "video"
    +                  "input"
    +                  "tty"
    +                  "docker"
    +                  "scanner"
    +                  "libvirt"
    +                  "lp")))
    +              %base-user-accounts))
     

    Base packages, necessary right after the installation.

    (packages
      (append
       (list nss-certs
    -	    git
    -	i3-gaps
    -	i3lock
    -	openbox
    -	xterm
    -	    vim)
    +            git
    +        i3-gaps
    +        i3lock
    +        openbox
    +        xterm
    +            vim)
       %base-packages))
     

    Default services for each machine:

      @@ -310,31 +310,31 @@ (extra-special-file "/lib64/ld-linux-x86-64.so.2" (file-append glibc "/lib/ld-linux-x86-64.so.2")) (service nix-service-type) (service cups-service-type - (cups-configuration - (web-interface? #t))) + (cups-configuration + (web-interface? #t))) (service docker-service-type) (service libvirt-service-type - (libvirt-configuration - (unix-sock-group "libvirt") - (tls-port "16555"))) + (libvirt-configuration + (unix-sock-group "libvirt") + (tls-port "16555"))) (service virtlog-service-type) (bluetooth-service #:auto-enable? #f) (modify-services %desktop-services - (network-manager-service-type - config => - (network-manager-configuration - (inherit config) - (vpn-plugins (list network-manager-openvpn)))) - (guix-service-type - config => - (guix-configuration - (inherit config) - (substitute-urls - (append (list "https://substitutes.nonguix.org") - %default-substitute-urls)) - (authorized-keys - (append (list (local-file "./signing-key.pub")) - %default-authorized-guix-keys))))))) + (network-manager-service-type + config => + (network-manager-configuration + (inherit config) + (vpn-plugins (list network-manager-openvpn)))) + (guix-service-type + config => + (guix-configuration + (inherit config) + (substitute-urls + (append (list "https://substitutes.nonguix.org") + %default-substitute-urls)) + (authorized-keys + (append (list (local-file "./signing-key.pub")) + %default-authorized-guix-keys)))))))

    indigo

    indigo is my desktop PC.

    <<system-common>>
    @@ -344,10 +344,10 @@
     
      (host-name "indigo")
      (services (cons*
    -	    (set-xorg-configuration
    -	     (xorg-configuration
    -	      (keyboard-layout keyboard-layout)))
    -	    %my-base-services))
    +            (set-xorg-configuration
    +             (xorg-configuration
    +              (keyboard-layout keyboard-layout)))
    +            %my-base-services))
     
      (bootloader
       (bootloader-configuration
    @@ -360,14 +360,14 @@
     
      (file-systems
       (cons* (file-system
    -	  (mount-point "/")
    -	  (device (file-system-label "my-root"))
    -	  (type "ext4"))
    -	     (file-system
    -	      (mount-point "/boot/efi")
    -	      (device "/dev/sda1")
    -	      (type "vfat"))
    -	 %base-file-systems)))
    +          (mount-point "/")
    +          (device (file-system-label "my-root"))
    +          (type "ext4"))
    +             (file-system
    +              (mount-point "/boot/efi")
    +              (device "/dev/sda1")
    +              (type "vfat"))
    +         %base-file-systems)))
     

    eminence

    eminence is a HP 15s laptop.

    %backlight-udev-rule should enable members of video group change the display backlight. See the relevant page at Arch Wiki.

    @@ -377,31 +377,31 @@
    (udev-rule "90-backlight.rules" (string-append "ACTION==\"add\", SUBSYSTEM==\"backlight\", " - "RUN+=\"/run/current-system/profile/bin/chgrp video /sys/class/backlight/%k/brightness\"" - "\n" - "ACTION==\"add\", SUBSYSTEM==\"backlight\", " - "RUN+=\"/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\""))) + "RUN+=\"/run/current-system/profile/bin/chgrp video /sys/class/backlight/%k/brightness\"" + "\n" + "ACTION==\"add\", SUBSYSTEM==\"backlight\", " + "RUN+=\"/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\""))) (operating-system <<system-base>> (host-name "eminence") (services (cons* - (set-xorg-configuration - (xorg-configuration - (keyboard-layout keyboard-layout))) - (modify-services %my-base-services - (elogind-service-type - config => - (elogind-configuration - (inherit config) - (handle-lid-switch-external-power 'suspend))) - (udev-service-type - config => - (udev-configuration - (inherit config) - (rules (cons %backlight-udev-rule - (udev-configuration-rules config)))))))) + (set-xorg-configuration + (xorg-configuration + (keyboard-layout keyboard-layout))) + (modify-services %my-base-services + (elogind-service-type + config => + (elogind-configuration + (inherit config) + (handle-lid-switch-external-power 'suspend))) + (udev-service-type + config => + (udev-configuration + (inherit config) + (rules (cons %backlight-udev-rule + (udev-configuration-rules config)))))))) (bootloader (bootloader-configuration @@ -414,16 +414,16 @@ (file-systems (cons* (file-system - (mount-point "/") - (device - (uuid "1d937704-bbeb-43b5-bc63-453886c426af" - 'ext4)) - (type "ext4")) - (file-system - (mount-point "/boot/efi") - (device (uuid "0031-3784" 'fat32)) - (type "vfat")) - %base-file-systems))) + (mount-point "/") + (device + (uuid "1d937704-bbeb-43b5-bc63-453886c426af" + 'ext4)) + (type "ext4")) + (file-system + (mount-point "/boot/efi") + (device (uuid "0031-3784" 'fat32)) + (type "vfat")) + %base-file-systems)))

    azure

    azure is a Lenovo Ideapad 330 laptop.

    %backlight-udev-rule should enable members of video group change the display backlight. See the relevant page at Arch Wiki.

    @@ -433,27 +433,27 @@ (udev-rule "90-backlight.rules" (string-append "ACTION==\"add\", SUBSYSTEM==\"backlight\", " - "RUN+=\"/run/current-system/profile/bin/chgrp video /sys/class/backlight/%k/brightness\"" - "\n" - "ACTION==\"add\", SUBSYSTEM==\"backlight\", " - "RUN+=\"/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\""))) + "RUN+=\"/run/current-system/profile/bin/chgrp video /sys/class/backlight/%k/brightness\"" + "\n" + "ACTION==\"add\", SUBSYSTEM==\"backlight\", " + "RUN+=\"/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\""))) (operating-system <<system-base>> (host-name "azure") (services (cons* - (set-xorg-configuration - (xorg-configuration - (keyboard-layout keyboard-layout))) - (modify-services %my-base-services - (elogind-service-type config => - (elogind-configuration (inherit config) - (handle-lid-switch-external-power 'suspend))) - (udev-service-type config => - (udev-configuration (inherit config) - (rules (cons %backlight-udev-rule - (udev-configuration-rules config)))))))) + (set-xorg-configuration + (xorg-configuration + (keyboard-layout keyboard-layout))) + (modify-services %my-base-services + (elogind-service-type config => + (elogind-configuration (inherit config) + (handle-lid-switch-external-power 'suspend))) + (udev-service-type config => + (udev-configuration (inherit config) + (rules (cons %backlight-udev-rule + (udev-configuration-rules config)))))))) (bootloader (bootloader-configuration @@ -466,14 +466,14 @@ (file-systems (cons* (file-system - (mount-point "/") - (device (file-system-label "my-root")) - (type "ext4")) - (file-system - (mount-point "/boot/efi") - (device "/dev/sda1") - (type "vfat")) - %base-file-systems))) + (mount-point "/") + (device (file-system-label "my-root")) + (type "ext4")) + (file-system + (mount-point "/boot/efi") + (device "/dev/sda1") + (type "vfat")) + %base-file-systems)))

    iris

    iris is my work machine.

    <<system-common>>
    @@ -483,34 +483,34 @@
     
      (host-name "iris")
      (services (cons*
    -	    (set-xorg-configuration
    -	     (xorg-configuration
    -	      (keyboard-layout keyboard-layout)))
    -	    %my-base-services))
    +            (set-xorg-configuration
    +             (xorg-configuration
    +              (keyboard-layout keyboard-layout)))
    +            %my-base-services))
     
      (bootloader (bootloader-configuration
    -	      (bootloader grub-bootloader)
    -	      (targets (list "/dev/sdb"))
    -	      (keyboard-layout keyboard-layout)))
    +              (bootloader grub-bootloader)
    +              (targets (list "/dev/sdb"))
    +              (keyboard-layout keyboard-layout)))
      (swap-devices (list (swap-space
    -		      (target (uuid
    -			       "bc284384-ff00-4fbc-abda-1c46f69c0505")))))
    +                      (target (uuid
    +                               "bc284384-ff00-4fbc-abda-1c46f69c0505")))))
      (mapped-devices (list (mapped-device
    -			(source (uuid
    -				 "21876acb-e05a-4731-8df0-ba5761910ca8"))
    -			(target "cryptroot")
    -			(type luks-device-mapping))))
    +                        (source (uuid
    +                                 "21876acb-e05a-4731-8df0-ba5761910ca8"))
    +                        (target "cryptroot")
    +                        (type luks-device-mapping))))
     
      (file-systems (cons* (file-system
    -		       (mount-point "/")
    -		       (device "/dev/mapper/cryptroot")
    -		       (type "ext4")
    -		       (dependencies mapped-devices))
    -		      (file-system
    -		       (mount-point "/boot/efi")
    -		       (device (uuid "782E-F6D3"
    -				     'fat32))
    -		       (type "vfat")) %base-file-systems)))
    +                       (mount-point "/")
    +                       (device "/dev/mapper/cryptroot")
    +                       (type "ext4")
    +                       (dependencies mapped-devices))
    +                      (file-system
    +                       (mount-point "/boot/efi")
    +                       (device (uuid "782E-F6D3"
    +                                     'fat32))
    +                       (type "vfat")) %base-file-systems)))
     

    System installation

    Preparation

    In my case, the provided ISO doesn’t work because of the Libre kernel.

    @@ -735,11 +735,11 @@ Also not necessary now. Just herd stop vpn and sudo pkill vpn for env in "${CONDA_ENVS_ALL[@]}"; do env="${env:1:${#env}-2}" if [ -w "$env" ]; then - if [ -f "$env/bin/npm" ]; then - CONDA_ENVS_NPM+=($env) - else - CONDA_ENVS_NO_NPM+=($env) - fi + if [ -f "$env/bin/npm" ]; then + CONDA_ENVS_NPM+=($env) + else + CONDA_ENVS_NO_NPM+=($env) + fi fi done diff --git a/configs/index.xml b/configs/index.xml index 49e268f..c5f7d46 100644 --- a/configs/index.xml +++ b/configs/index.xml @@ -12,7 +12,7 @@ https://sqrtminusone.xyz/configs/console/ Mon, 01 Jan 0001 00:00:00 +0000 https://sqrtminusone.xyz/configs/console/ - <blockquote> <p>No matter from which side you approach penguins, more always come from behind</p> </blockquote> <ul> <li>A friend of mine</li> </ul> <h2 id="colors">Colors</h2> <p>Noweb function to get colors.</p> <p><a id="code-snippet--get-color"></a></p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">let</span> ((<span style="color:#19177c">color</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">my/color-value</span> <span style="color:#19177c">name</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> (<span style="color:#00f">&gt;</span> <span style="color:#008000">quote</span> <span style="color:#666">0</span>) </span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span> <span style="color:#19177c">color</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#19177c">color</span>)) </span></span></code></pre></div><p><a id="code-snippet--get-fg-for-color"></a></p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">let</span> ((<span style="color:#19177c">val</span> (<span style="color:#008000">if</span> (<span style="color:#19177c">ct-light-p</span> (<span style="color:#19177c">my/color-value</span> <span style="color:#19177c">name</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/color-value</span> <span style="color:#19177c">&#39;black</span>) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/color-value</span> <span style="color:#19177c">&#39;white</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> (<span style="color:#00f">eq</span> <span style="color:#008000">quote</span> <span style="color:#666">1</span>) </span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span> <span style="color:#19177c">val</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#19177c">val</span>)) </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq-local</span> <span style="color:#19177c">org-confirm-babel-evaluate</span> <span style="color:#800">nil</span>) </span></span></code></pre></div><h2 id="dot-profile"><code>.profile</code></h2> <h3 id="environment">Environment</h3> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">QT_QPA_PLATFORMTHEME</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;qt5ct&#34;</span> </span></span><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">QT_AUTO_SCREEN_SCALE_FACTOR</span><span style="color:#666">=</span><span style="color:#666">0</span> </span></span></code></pre></div><p>Set ripgrep config path</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">RIPGREP_CONFIG_PATH</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.config/ripgrep/ripgreprc </span></span></code></pre></div><p>hledger path</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">LEDGER_FILE</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/30-39 Life/32 org-mode/ledger/ledger.journal&#34;</span> </span></span></code></pre></div><p>Checking if running inside termux</p> + <blockquote> <p>No matter from which side you approach penguins, more always come from behind</p></blockquote> <ul> <li>A friend of mine</li> </ul> <h2 id="colors">Colors</h2> <p>Noweb function to get colors.</p> <p><a id="code-snippet--get-color"></a></p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">let</span> ((<span style="color:#19177c">color</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">my/color-value</span> <span style="color:#19177c">name</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> (<span style="color:#00f">&gt;</span> <span style="color:#008000">quote</span> <span style="color:#666">0</span>) </span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span> <span style="color:#19177c">color</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#19177c">color</span>)) </span></span></code></pre></div><p><a id="code-snippet--get-fg-for-color"></a></p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">let</span> ((<span style="color:#19177c">val</span> (<span style="color:#008000">if</span> (<span style="color:#19177c">ct-light-p</span> (<span style="color:#19177c">my/color-value</span> <span style="color:#19177c">name</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/color-value</span> <span style="color:#19177c">&#39;black</span>) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/color-value</span> <span style="color:#19177c">&#39;white</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> (<span style="color:#00f">eq</span> <span style="color:#008000">quote</span> <span style="color:#666">1</span>) </span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span> <span style="color:#19177c">val</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#19177c">val</span>)) </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq-local</span> <span style="color:#19177c">org-confirm-babel-evaluate</span> <span style="color:#800">nil</span>) </span></span></code></pre></div><h2 id="dot-profile"><code>.profile</code></h2> <h3 id="environment">Environment</h3> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">QT_QPA_PLATFORMTHEME</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;qt5ct&#34;</span> </span></span><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">QT_AUTO_SCREEN_SCALE_FACTOR</span><span style="color:#666">=</span><span style="color:#666">0</span> </span></span></code></pre></div><p>Set ripgrep config path</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">RIPGREP_CONFIG_PATH</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.config/ripgrep/ripgreprc </span></span></code></pre></div><p>hledger path</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">LEDGER_FILE</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/30-39 Life/32 org-mode/ledger/ledger.journal&#34;</span> </span></span></code></pre></div><p>Checking if running inside termux</p> Desktop @@ -26,7 +26,7 @@ https://sqrtminusone.xyz/configs/emacs/ Mon, 01 Jan 0001 00:00:00 +0000 https://sqrtminusone.xyz/configs/emacs/ - <blockquote> <p>One day we won&rsquo;t hate one another, no young boy will march to war and I will clean up my Emacs config. But that day isn&rsquo;t today.</p> </blockquote> <ul> <li>Me, <span class="timestamp-wrapper"><span class="timestamp">&lt;2021-05-27 Thu 17:35&gt; </span></span> in commit 93a0573. Adapted from <a href="https://www.youtube.com/watch?v=pIdBinlW40E">The Dark Element - &ldquo;The Pallbearer Walks Alone&rdquo;</a>. T_T</li> </ul> <h2 id="introduction">Introduction</h2> <p>My configuration of <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>, an awesome <del>text editor</del> piece of software that can do almost anything.</p> <p>At the moment of writing this, that &ldquo;almost anything&rdquo; includes:</p> + <blockquote> <p>One day we won&rsquo;t hate one another, no young boy will march to war and I will clean up my Emacs config. But that day isn&rsquo;t today.</p></blockquote> <ul> <li>Me, <span class="timestamp-wrapper"><span class="timestamp">&lt;2021-05-27 Thu 17:35&gt; </span></span> in commit 93a0573. Adapted from <a href="https://www.youtube.com/watch?v=pIdBinlW40E">The Dark Element - &ldquo;The Pallbearer Walks Alone&rdquo;</a>. T_T</li> </ul> <h2 id="introduction">Introduction</h2> <p>My configuration of <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>, an awesome <del>text editor</del> piece of software that can do almost anything.</p> <p>At the moment of writing this, that &ldquo;almost anything&rdquo; includes:</p> Guix @@ -40,7 +40,7 @@ https://sqrtminusone.xyz/configs/mail/ Mon, 01 Jan 0001 00:00:00 +0000 https://sqrtminusone.xyz/configs/mail/ - <p>:TOC: :include all :depth 3</p> <p>My email configration. Currently I use <a href="https://github.com/gauteh/lieer">lieer</a> to fetch emails from Gmail, <a href="http://davmail.sourceforge.net/">davmail</a> &amp; <a href="http://www.offlineimap.org/">offlineimap</a> to fetch emails from MS Exchange, <a href="https://notmuchmail.org/">notmuch</a> to index, <a href="https://marlam.de/msmtp/">msmtp</a> to send emails. Also using notmuch frontend from Emacs.</p> <p>My problem with any particular mail setup was that I use Gmail labels quite extensively, and handling these over IMAP is rather awkward. Notmuch seems to be the only software that provides the same first-class support for labels.</p> + <p>My email configration. Currently I use <a href="https://github.com/gauteh/lieer">lieer</a> to fetch emails from Gmail, <a href="http://davmail.sourceforge.net/">davmail</a> &amp; <a href="http://www.offlineimap.org/">offlineimap</a> to fetch emails from MS Exchange, <a href="https://notmuchmail.org/">notmuch</a> to index, <a href="https://marlam.de/msmtp/">msmtp</a> to send emails. Also using notmuch frontend from Emacs.</p> <p>My problem with any particular mail setup was that I use Gmail labels quite extensively, and handling these over IMAP is rather awkward. Notmuch seems to be the only software that provides the same first-class support for labels.</p> <p>But I also have an Exchange account, with which I communicate via IMAP/SMTP adapter, and in this case, I synchronize notmuch tags and IMAP folders.</p> My dotfiles diff --git a/configs/mail/index.html b/configs/mail/index.html index 0e6961e..c4d6f7e 100644 --- a/configs/mail/index.html +++ b/configs/mail/index.html @@ -75,8 +75,7 @@ Mail -

    :TOC: :include all :depth 3

    -

    My email configration. Currently I use lieer to fetch emails from Gmail, davmail & offlineimap to fetch emails from MS Exchange, notmuch to index, msmtp to send emails. Also using notmuch frontend from Emacs.

    +

    My email configration. Currently I use lieer to fetch emails from Gmail, davmail & offlineimap to fetch emails from MS Exchange, notmuch to index, msmtp to send emails. Also using notmuch frontend from Emacs.

    My problem with any particular mail setup was that I use Gmail labels quite extensively, and handling these over IMAP is rather awkward. Notmuch seems to be the only software that provides the same first-class support for labels.

    But I also have an Exchange account, with which I communicate via IMAP/SMTP adapter, and in this case, I synchronize notmuch tags and IMAP folders.

    References:

    @@ -147,12 +146,16 @@

    pass show Job/Digital/Email/pvkorytov@etu.ru | head -n 1
     
    [general]
    -accounts = pvkorytov
    +accounts = pvkorytov,pvkorytov-mbox
     
     [Account pvkorytov]
     localrepository = pvkorytov-local
     remoterepository = pvkorytov-remote
     
    +[Account pvkorytov-mbox]
    +localrepository = pvkorytov-mbox-local
    +remoterepository = pvkorytov-mbox-remote
    +
     [Repository pvkorytov-local]
     type = Maildir
     localfolders = ~/Mail/pvkorytov_etu/
    @@ -166,6 +169,18 @@
     starttls = no
     ssl = no
     sslcacertfile = /etc/ssl/certs/ca-certificates.crt
    +
    +[Repository pvkorytov-mbox-local]
    +type = Maildir
    +localfolders = ~/Mail/pvkorytov_etu_mbox/
    +
    +[Repository pvkorytov-mbox-remote]
    +type = IMAP
    +remotehost = mbox.etu.ru
    +remoteuser = <<mail-username()>>
    +remotepass = <<mail-password()>>
    +remoteport = 993
    +cert_fingerprint = 07bdfab4eaa79f5fc8ab93cd9ad0ba025ea0b4e5
     

    Notmuch

  • @@ -278,6 +293,7 @@
    +

    &BCMENAQwBDsENQQ9BD0ESwQ1-

    And below is a noweb function, which generates the following commands for notmuch to execute:

    • before sync: @@ -304,39 +320,40 @@ Remove TAG from emails which are outside the matching PATH(let ((rules '())) (dolist (row tags) (let ((tag (nth 0 row)) - (folder (nth 1 row))) + (folder (nth 1 row))) (unless (string-empty-p make_tag) - (add-to-list - 'rules - (format "notmuch tag +%s \"path:%s/%s/cur/** AND NOT tag:%s\"" - tag root folder tag) - t)) + (add-to-list + 'rules + (format "notmuch tag +%s \"path:%s/%s/cur/** AND NOT tag:%s\"" + tag root folder tag) + t)) (unless (string-empty-p remove) - (add-to-list - 'rules - (format "notmuch tag -%s \"NOT path:%s/%s/cur/** AND tag:%s AND tag:%s\"" - tag root folder tag root_tag) - t)) + (add-to-list + 'rules + (format + "notmuch tag -%s \"NOT path:%s/%s/cur/** AND path:%s/** AND tag:%s AND tag:%s\"" + tag root folder root tag root_tag) + t)) (unless (string-empty-p move) - (add-to-list - 'rules - (concat - (format "notmuch search --output=files \"NOT path:%s/%s/cur/** AND tag:%s AND tag:%s\"" - root folder tag root_tag) - (format " | xargs -I ! mv ! %s/%s/%s/cur/" my/maildir-root root folder)) - t)))) + (add-to-list + 'rules + (concat + (format "notmuch search --output=files \"NOT path:%s/%s/cur/** AND path:%s/** AND tag:%s AND tag:%s\"" + root folder root tag root_tag) + (format " | xargs -I ! mv ! %s/%s/%s/cur/" my/maildir-root root folder)) + t)))) (unless (string-empty-p archive_root) (add-to-list 'rules (concat - (format "notmuch search --output=files \"NOT path:%s/%s/cur/** AND %s AND tag:%s\"" - root archive_root - (mapconcat - (lambda (row) - (format "NOT tag:%s" (car row))) - tags - " AND ") - root_tag) + (format "notmuch search --output=files \"NOT path:%s/%s/cur/** AND path:%s/** AND %s AND tag:%s\"" + root archive_root root + (mapconcat + (lambda (row) + (format "NOT tag:%s" (car row))) + tags + " AND ") + root_tag) (format " | xargs -I ! mv ! %s/%s/%s/cur/" my/maildir-root root archive_root)) t)) (string-join rules "\n")) @@ -345,24 +362,31 @@ Remove TAG from emails which are outside the matching PATHIt isn’t necessary to run cd for offlineimap, but it’s easier to write that way.

      (my/mail-format-tags-rules tags "pvkorytov_etu" "pvkorytov" nil nil t "Archive")
      -
      # GMI="/home/pavel/Programs/miniconda3/envs/mail/bin/gmi"
      +
      GMI="/home/pavel/Programs/miniconda3/envs/mail/bin/gmi"
       GMI="gmi"
       
       echo "Running pre-new filters"
       <<mail-tags(move="t",archive_root="Archive")>>
      -echo "Pre-new filters done"
       
      -parallel --link -j0 "(cd /home/pavel/Mail/{1}/ && {2} {3})" ::: thexcloud progin6304 pvkorytov_etu ::: "$GMI" "$GMI" "offlineimap" ::: sync sync ""
      -

      post_new

      +
      <<mail-tags(move="t",archive_root="Archive",root="pvkorytov_etu_mbox")>> +echo "Pre-new filters done" + +parallel --link -j0 "(cd /home/pavel/Mail/{1}/ && {2} {3})" ::: thexcloud progin6304 pvkorytov_etu ::: "$GMI" "$GMI" "offlineimap" ::: sync sync "" +

    post_new

    And this hook tags different mailboxes with different tags.

    (my/mail-format-tags-rules tags "pvkorytov_etu" "pvkorytov" t t)
     
    notmuch tag +main "path:thexcloud/** AND tag:new"
     notmuch tag +progin "path:progin6304/** AND tag:new"
     notmuch tag +pvkorytov "path:pvkorytov_etu/** AND tag:new"
    +notmuch tag +pvkorytov "path:pvkorytov_etu_mbox/** AND tag:new"
    +notmuch tag +mbox "path:pvkorytov_etu_mbox/** AND tag:new"
     
     echo "Running post-new filters"
    -<<mail-tags(make_tag="t",remove="t")>>
    +<<mail-tags(make_tag="t",remove="t")>>
    +
    +<<mail-tags(make_tag="t",remove="t",root="pvkorytov_etu_mbox")>>
    +
     echo "Post-new filters done"
     notmuch tag -new "tag:new"
     

    Sync script

    @@ -432,10 +456,11 @@ Remove TAG from emails which are outside the matching PATH
    passwordeval "pass show My_Online/ETU/progin6304@gmail.com | head -n 1" account pvkorytov -tls off -auth plain -host localhost -port 1025 +host mbox.etu.ru +port 465 +tls on +tls_starttls off +tls_fingerprint 87:1F:17:1C:12:A4:DE:82:6F:CF:E5:E6:9C:EE:F8:0B:D1:7D:B2:00:F9:7B:2C:96:21:65:FA:0A:F5:24:8E:0E from pvkorytov@etu.ru user pvkorytov passwordeval "pass show Job/Digital/Email/pvkorytov@etu.ru | head -n 1" @@ -482,6 +507,9 @@ Remove TAG from emails which are outside the matching PATH (my/use-colors (notmuch-wash-cited-text :foreground (doom-color 'yellow))) :config + (setq notmuch-fcc-dirs + '(("pvkorytov@etu.ru" . "pvkorytov_etu_mbox/Sent") + (".*" . "sent"))) (setq mail-specify-envelope-from t) (setq message-sendmail-envelope-from 'header) (setq mail-envelope-from 'header) @@ -501,7 +529,7 @@ Remove TAG from emails which are outside the matching PATH (require 'org-contacts) (setq notmuch-address-command 'as-is) (add-hook 'notmuch-hello-mode-hook - (lambda () (display-line-numbers-mode 0)))) + (lambda () (display-line-numbers-mode 0))))

    The file is read in init.el.

    Keybindings

    I used to have a more complicated keybinding system here, but that seemed to go against the Dao.

    @@ -512,7 +540,8 @@ Remove TAG from emails which are outside the matching PATH
    notmuch-hello-mode 0 "mail" notmuch-search-mode 0 "mail" notmuch-tree-mode 0 "mail" - notmuch-message-mode 0 "mail") + notmuch-message-mode 0 "mail" + notmuch-show-mode 0 "mail")

    @@ -580,18 +609,18 @@ Remove TAG from emails which are outside the matching PATH (add-to-list 'searches (format "(:name \"%s\" :query \"%s\" :key \"%s\")" - (format "%s (%s)" - (nth 0 root_tag) - (nth 2 tag)) - (concat "tag:" (nth 0 root_tag) - (unless (string-empty-p (nth 0 tag)) - (concat " AND tag:" (nth 0 tag)))) - (concat (nth 1 root_tag) (nth 1 tag))) + (format "%s (%s)" + (nth 0 root_tag) + (nth 2 tag)) + (concat "tag:" (nth 0 root_tag) + (unless (string-empty-p (nth 0 tag)) + (concat " AND tag:" (nth 0 tag)))) + (concat (nth 1 root_tag) (nth 1 tag))) t))) (string-join searches "\n"))
    (setq notmuch-saved-searches
           '((:name "drafts" :query "tag:draft" :key "d")
    -	<<format-notmuch-saved-searches()>>))
    +        <<format-notmuch-saved-searches()>>))
     (setq notmuch-show-empty-saved-searches nil)
     
    (general-define-key
      :states '(normal visual)
    @@ -603,12 +632,12 @@ Remove TAG from emails which are outside the matching PATH
     (setq mml-secure-key-preferences
           '((OpenPGP
    -	 (sign
    -	  ("thexcloud@gmail.com" "914472A1FD6775C166F96EBEED739ADF81C78160"))
    -	 (encrypt))
    -	(CMS
    -	 (sign)
    -	 (encrypt))))
    +         (sign
    +          ("thexcloud@gmail.com" "914472A1FD6775C166F96EBEED739ADF81C78160"))
    +         (encrypt))
    +        (CMS
    +         (sign)
    +         (encrypt))))
     

    Tuning signature

    Edit <2024-08-19 Mon>: Apparently this was a feature, not a bug. Disabling this.

    By default, message.el inserts the signature at the bottom of the message, like this:

    @@ -643,11 +672,11 @@ Remove TAG from emails which are outside the matching PATH (save-excursion (goto-char (point-min)) (when (re-search-forward message-signature-separator nil t) - (move-beginning-of-line 0) - (kill-region (point) (point-max))) + (move-beginning-of-line 0) + (kill-region (point) (point-max))) (message-goto-body) (when (re-search-forward (rx "sign=pgpmime") nil t) - (forward-line)) + (forward-line)) (insert (current-kill 0)) (insert "\n\n") (set-buffer-modified-p nil)))) @@ -657,7 +686,7 @@ Remove TAG from emails which are outside the matching PATH

    Warn if no subject

    (defun my/message-ensure-subject ()
       (unless (or (message-field-value "Subject")
    -	      (y-or-n-p "No subject. Send? "))
    +              (y-or-n-p "No subject. Send? "))
         (user-error "Aborting.")))
     
     (add-hook 'notmuch-mua-send-hook #'my/message-ensure-subject)
    @@ -676,20 +705,20 @@ Remove TAG from emails which are outside the matching PATH    (message-goto-body)
         (cl-block nil
           (let ((case-fold-search nil)
    -	    confirmed)
    -	(while (re-search-forward my/ru-formal-pronous-regex nil t)
    -	  (let* ((match (match-string 0))
    -		 (capitalized (capitalize match))
    -		 (beg (match-beginning 0))
    -		 (end (match-end 0)))
    -	    (if (or confirmed
    -		    (y-or-n-p (format "Replace %s with %s? "
    -				      match capitalized)))
    -		(progn
    -		  (delete-region beg end)
    -		  (insert capitalized)
    -		  (setq confirmed t))
    -	      (cl-return))))))))
    +            confirmed)
    +        (while (re-search-forward my/ru-formal-pronous-regex nil t)
    +          (let* ((match (match-string 0))
    +                 (capitalized (capitalize match))
    +                 (beg (match-beginning 0))
    +                 (end (match-end 0)))
    +            (if (or confirmed
    +                    (y-or-n-p (format "Replace %s with %s? "
    +                                      match capitalized)))
    +                (progn
    +                  (delete-region beg end)
    +                  (insert capitalized)
    +                  (setq confirmed t))
    +              (cl-return))))))))
     
     (add-hook 'notmuch-mua-send-hook #'my/message-ensure-capitalized-formal-pronouns)
     

    Ensure password is loaded

    diff --git a/index.html b/index.html index 3567601..e690e67 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,6 @@ - + diff --git a/index.xml b/index.xml index 5a44a65..d91e9d7 100644 --- a/index.xml +++ b/index.xml @@ -90,6 +90,8 @@ <p>See <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Custom-Format-Strings.html">(emacs) Custom Format Strings</a> for information on the general <code>format-spec</code> syntax.</p> <p>I suspect the package might be slow if your history has a lot of records (I haven&rsquo;t checked yet). In this case, it might be worth setting a limit:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">eshell-atuin-search-options</span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;--exit&#34;</span> <span style="color:#ba2121">&#34;0&#34;</span> <span style="color:#ba2121">&#34;--limit&#34;</span> <span style="color:#ba2121">&#34;10000&#34;</span>)) +</span></span></code></pre></div><p>If the package ignores imported history, remove <code>--exit 0</code> from the options (see <a href="https://github.com/SqrtMinusOne/eshell-atuin/issues/9">#9</a>).</p> +<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">eshell-atuin-search-options</span> <span style="color:#800">nil</span>) </span></span></code></pre></div><h2 id="usage">Usage</h2> <p>Enable <code>eshell-atuin-mode</code> to turn on storing eshell commands in <code>atuin</code>.</p> <p>Run <code>eshell-atuin-history</code> inside an <code>eshell</code> buffer to browse the saved history. Accepting the completion will insert the command.</p> @@ -147,11 +149,11 @@ <p>By default, the package selects <code>org-clock</code> records from <code>(org-agenda-files)</code>. Additional options can be included by customizing the <code>org-clock-agg-files-preset</code> variable. For instance:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">org-clock-agg-files-preset</span> </span></span><span style="display:flex;"><span> <span style="color:#666">`</span>((<span style="color:#ba2121">&#34;Org Agenda + Archive&#34;</span> -</span></span><span style="display:flex;"><span> <span style="color:#666">.</span> -</span></span><span style="display:flex;"><span> <span style="color:#666">,</span>(<span style="color:#00f">append</span> (<span style="color:#19177c">org-agenda-files</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">cl-remove-if</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> (<span style="color:#19177c">f</span>) (<span style="color:#19177c">string-match-p</span> (<span style="color:#008000">rx</span> <span style="color:#ba2121">&#34;.&#34;</span> <span style="color:#19177c">eos</span>) <span style="color:#19177c">f</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#00f">directory-files</span> (<span style="color:#00f">concat</span> <span style="color:#19177c">org-directory</span> <span style="color:#ba2121">&#34;/archive/&#34;</span>) <span style="color:#800">t</span>)))))) +</span></span><span style="display:flex;"><span> <span style="color:#666">.</span> +</span></span><span style="display:flex;"><span> <span style="color:#666">,</span>(<span style="color:#00f">append</span> (<span style="color:#19177c">org-agenda-files</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">cl-remove-if</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> (<span style="color:#19177c">f</span>) (<span style="color:#19177c">string-match-p</span> (<span style="color:#008000">rx</span> <span style="color:#ba2121">&#34;.&#34;</span> <span style="color:#19177c">eos</span>) <span style="color:#19177c">f</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#00f">directory-files</span> (<span style="color:#00f">concat</span> <span style="color:#19177c">org-directory</span> <span style="color:#ba2121">&#34;/archive/&#34;</span>) <span style="color:#800">t</span>)))))) </span></span></code></pre></div><p>Note that after updating any of these variables, you&rsquo;ll need to reopen the <code>*org-clock-agg*</code> buffer to view the changes.</p> <p>Alternatively, you can directly specify the list of files within the buffer by selecting &ldquo;Custom list&rdquo; in the &ldquo;Files&rdquo; control.</p> <h3 id="date-range">Date Range</h3> @@ -328,22 +330,22 @@ Customize the formatting of these records through <code>org-clock-agg-elem </span></span><span style="display:flex;"><span> <span style="color:#008000">:readable-name</span> <span style="color:#ba2121">&#34;Event&#34;</span> </span></span><span style="display:flex;"><span> <span style="color:#008000">:default-sort</span> <span style="color:#19177c">total</span> </span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">title</span> (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:raw-value</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:headline</span> <span style="color:#19177c">elem</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">is-meeting</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">string-match-p</span> <span style="color:#ba2121">&#34;meeting&#34;</span> (<span style="color:#00f">downcase</span> <span style="color:#19177c">title</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq-contains-p</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:tags</span> <span style="color:#19177c">elem</span>) <span style="color:#ba2121">&#34;mt&#34;</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">is-offline</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">string-match-p</span> <span style="color:#ba2121">&#34;offline&#34;</span> (<span style="color:#00f">downcase</span> <span style="color:#19177c">title</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq-contains-p</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:tags</span> <span style="color:#19177c">elem</span>) <span style="color:#ba2121">&#34;offline&#34;</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">title-without-stuff</span> (<span style="color:#19177c">string-trim</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">replace-regexp-in-string</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">rx</span> (<span style="color:#008000">or</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#00f">+</span> (<span style="color:#008000">or</span> <span style="color:#19177c">digit</span> <span style="color:#ba2121">&#34;.&#34;</span>))) -</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;(offline)&#34;</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq</span> <span style="color:#ba2121">&#34;[&#34;</span> (<span style="color:#00f">+</span> <span style="color:#19177c">alnum</span>) <span style="color:#ba2121">&#34;]&#34;</span>) )) -</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;&#34;</span> <span style="color:#19177c">title</span>)))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">is-meeting</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">string-match-p</span> <span style="color:#ba2121">&#34;meeting&#34;</span> (<span style="color:#00f">downcase</span> <span style="color:#19177c">title</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq-contains-p</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:tags</span> <span style="color:#19177c">elem</span>) <span style="color:#ba2121">&#34;mt&#34;</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">is-offline</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">string-match-p</span> <span style="color:#ba2121">&#34;offline&#34;</span> (<span style="color:#00f">downcase</span> <span style="color:#19177c">title</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq-contains-p</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:tags</span> <span style="color:#19177c">elem</span>) <span style="color:#ba2121">&#34;offline&#34;</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">title-without-stuff</span> (<span style="color:#19177c">string-trim</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">replace-regexp-in-string</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">rx</span> (<span style="color:#008000">or</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#00f">+</span> (<span style="color:#008000">or</span> <span style="color:#19177c">digit</span> <span style="color:#ba2121">&#34;.&#34;</span>))) +</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;(offline)&#34;</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq</span> <span style="color:#ba2121">&#34;[&#34;</span> (<span style="color:#00f">+</span> <span style="color:#19177c">alnum</span>) <span style="color:#ba2121">&#34;]&#34;</span>) )) +</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;&#34;</span> <span style="color:#19177c">title</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> <span style="color:#19177c">is-meeting</span> </span></span><span style="display:flex;"><span> <span style="color:#666">`</span>(<span style="color:#ba2121">&#34;Meeting&#34;</span> -</span></span><span style="display:flex;"><span> <span style="color:#666">,@</span>(<span style="color:#008000">when</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:events-online</span> <span style="color:#19177c">extra-params</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> <span style="color:#19177c">is-offline</span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;Offline&#34;</span>) <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;Online&#34;</span>))) -</span></span><span style="display:flex;"><span> <span style="color:#666">,</span><span style="color:#19177c">title-without-stuff</span>)))) +</span></span><span style="display:flex;"><span> <span style="color:#666">,@</span>(<span style="color:#008000">when</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:events-online</span> <span style="color:#19177c">extra-params</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> <span style="color:#19177c">is-offline</span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;Offline&#34;</span>) <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;Online&#34;</span>))) +</span></span><span style="display:flex;"><span> <span style="color:#666">,</span><span style="color:#19177c">title-without-stuff</span>)))) </span></span></code></pre></div><p>For the following result:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>* Results </span></span><span style="display:flex;"><span>** Meetings @@ -1212,8 +1214,8 @@ Customize the formatting of these records through <code>org-clock-agg-elem <p>Global variables must always include a location (section &ldquo;Select Coordinates or City&rdquo;). To enter a location, you can either enter latitude and longitude (Open Meteo has an <a href="https://open-meteo.com/en/docs/geocoding-api">API for those</a> as well) or select a location from <code>biome-query-coords</code>. Example configuration:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">biome-query-coords</span> </span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>((<span style="color:#ba2121">&#34;Helsinki, Finland&#34;</span> <span style="color:#666">60.16952</span> <span style="color:#666">24.93545</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;Berlin, Germany&#34;</span> <span style="color:#666">52.52437</span> <span style="color:#666">13.41053</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;Dubai, UAE&#34;</span> <span style="color:#666">25.0657</span> <span style="color:#666">55.17128</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;Berlin, Germany&#34;</span> <span style="color:#666">52.52437</span> <span style="color:#666">13.41053</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;Dubai, UAE&#34;</span> <span style="color:#666">25.0657</span> <span style="color:#666">55.17128</span>))) </span></span></code></pre></div><p>A timezone (&ldquo;Settings&rdquo; &gt; &ldquo;Timezone&rdquo;) may not be required, but be sure to set it because <strong>the default one is UTC+0</strong>.</p> <p>The current group is switched with <code>&lt;tab&gt;</code>. Each group&rsquo;s section has a set of variables that can be toggled on and off, such as temperature, precipitation, etc. Check out the <a href="https://open-meteo.com/en/docs">API docs</a> if you&rsquo;re interested in the meaning of more esoteric ones.</p> <p>Press <code>RET</code> after you&rsquo;ve configured the query to call the API. If something goes wrong, it will output an error, such as:</p> @@ -1239,8 +1241,8 @@ Customize the formatting of these records through <code>org-clock-agg-elem <p>Alternatively, use the <code>add-to-list</code> form (generated below the <code>biome-def-preset</code> form). Presets added that way will show up in <code>M-x biome-presets</code> or &ldquo;Presets&rdquo; in <code>M-x biome</code>.</p> <p>Table formatting can be configured with <code>biome-grid-format</code>; check the docstring for more information. For instance, if you want to disable all gradients:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">biome-grid-format</span> (<span style="color:#19177c">seq-filter</span> (<span style="color:#008000">lambda</span> (<span style="color:#19177c">f</span>) (<span style="color:#19177c">not</span> (<span style="color:#00f">eq</span> (<span style="color:#00f">car-safe</span> (<span style="color:#00f">nth</span> <span style="color:#666">2</span> <span style="color:#19177c">f</span>)) -</span></span><span style="display:flex;"><span> <span style="color:#19177c">&#39;gradient</span>))) -</span></span><span style="display:flex;"><span> <span style="color:#19177c">biome-grid-format</span>)) +</span></span><span style="display:flex;"><span> <span style="color:#19177c">&#39;gradient</span>))) +</span></span><span style="display:flex;"><span> <span style="color:#19177c">biome-grid-format</span>)) </span></span></code></pre></div><p>Turn off highlighting of the current hour or day as follows:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">biome-grid-highlight-current</span> <span style="color:#800">nil</span>) </span></span></code></pre></div><h2 id="composite-queries">Composite queries</h2> @@ -1329,8 +1331,7 @@ Customize the formatting of these records through <code>org-clock-agg-elem } </style> <blockquote> -<p>Poof I made my free-time disappear</p> -</blockquote> +<p>Poof I made my free-time disappear</p></blockquote> <p class="quote-title">- <a href="https://elken.dev">Ellis Kenyő</a>, on being called an "elisp mage" <p>Little did I know on the fateful day of <strong><span class="timestamp-wrapper"><span class="timestamp">[2020-10-09 Fri]</span></span></strong>, when I had installed <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>. I wasn&rsquo;t thinking about the <a href="https://www.gnu.org/philosophy/philosophy.html">ethical aspects</a> of free software, the <a href="https://www.webofstories.com/play/marvin.minsky/44">aesthetics of Lisp</a>, or these other things with which an occasional layperson might explain how an almost <a href="https://www.jwz.org/doc/emacs-timeline.html">half a century old</a> program can still be in <a href="https://emacsconf.org/2022/talks/survey/">active use</a>.</p> <p>In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.</p> @@ -2914,55 +2915,55 @@ assigned to group with the least amount of members.</li> <p>Here is an excerpt from my configuration that was used to produce this screenshot:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">elfeed-summary-settings</span> </span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>((<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;GitHub&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#19177c">url</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;SqrtMinusOne.private.atom&#34;</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> <span style="color:#666">.</span> ((<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Guix packages&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">github</span> <span style="color:#19177c">guix_packages</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:hide</span> <span style="color:#800">t</span>))))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Blogs [Software]&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> <span style="color:#19177c">software_blogs</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Blogs [People]&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">blogs</span> <span style="color:#19177c">people</span> (<span style="color:#19177c">not</span> <span style="color:#19177c">emacs</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Emacs&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">blogs</span> <span style="color:#19177c">people</span> <span style="color:#19177c">emacs</span>)))))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Podcasts&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> <span style="color:#19177c">podcasts</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Videos&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Music&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">music</span>)))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Tech&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">tech</span>)))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;History&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">history</span>)))) -</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; ...</span> -</span></span><span style="display:flex;"><span> )) -</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; ...</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Miscellaneous&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Searches&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">search</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:filter</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;@6-months-ago sqrtminusone&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;About me&#34;</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">search</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:filter</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;+later&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Check later&#34;</span>)))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Ungrouped&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> <span style="color:#008000">:misc</span>)))))) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#19177c">url</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;SqrtMinusOne.private.atom&#34;</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> <span style="color:#666">.</span> ((<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Guix packages&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">github</span> <span style="color:#19177c">guix_packages</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:hide</span> <span style="color:#800">t</span>))))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Blogs [Software]&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> <span style="color:#19177c">software_blogs</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Blogs [People]&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">blogs</span> <span style="color:#19177c">people</span> (<span style="color:#19177c">not</span> <span style="color:#19177c">emacs</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Emacs&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">blogs</span> <span style="color:#19177c">people</span> <span style="color:#19177c">emacs</span>)))))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Podcasts&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> <span style="color:#19177c">podcasts</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Videos&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Music&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">music</span>)))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Tech&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">tech</span>)))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;History&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">history</span>)))) +</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; ...</span> +</span></span><span style="display:flex;"><span> )) +</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; ...</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Miscellaneous&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Searches&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">search</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:filter</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;@6-months-ago sqrtminusone&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;About me&#34;</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">search</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:filter</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;+later&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Check later&#34;</span>)))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Ungrouped&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> <span style="color:#008000">:misc</span>)))))) </span></span></code></pre></div><h3 id="automatic-generation-of-groups">Automatic generation of groups</h3> <h4 id="auto-tags"><code>auto-tags</code></h4> <p>As described in the <a href="#tree-configuration-1">tree configuration</a> section, there are two ways to avoid defining all the relevant groups manually, <code>auto-tags</code> and <code>tag-groups</code>. Both use tags that are defined in <code>elfeed-feeds</code>.</p> @@ -3198,10 +3199,10 @@ assigned to group with the least amount of members.</li> </ul> <p>The default value is as follows:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span><span style="color:#666">&#39;</span>((<span style="color:#19177c">autotype</span> <span style="color:#666">.</span> (<span style="color:#19177c">wait</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;username&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">key</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Tab&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#19177c">secret</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">key</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Return&#34;</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;username&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">key</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Tab&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#19177c">secret</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">key</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Return&#34;</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">password</span> <span style="color:#666">.</span> (<span style="color:#19177c">wait</span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#19177c">secret</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">username</span> <span style="color:#666">.</span> (<span style="color:#19177c">wait</span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;username&#34;</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">url</span> <span style="color:#666">.</span> (<span style="color:#19177c">wait</span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;url&#34;</span>)))) @@ -3870,7 +3871,7 @@ timestamps by their date.</li> </span></span><span style="display:flex;"><span> (<span style="color:#19177c">org-journal-tags-prop-apply-delta</span> <span style="color:#008000">:add</span> (<span style="color:#00f">list</span> <span style="color:#19177c">my/loc-tag</span>)))) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;org-journal-after-entry-create-hook</span> -</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/set-journal-header</span>) +</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/set-journal-header</span>) </span></span></code></pre></div><h3 id="encryption">Encryption</h3> <p>There are two ways how org-journal can be encrypted:</p> <ul> @@ -4542,7 +4543,7 @@ interval = 1 <p>The package can be used with <a href="https://orgmode.org/manual/Clocking-commands.html">org-clock</a> in the following way. Set up these two hooks:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;pomm-on-status-changed-hook</span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">pomm--sync-org-clock</span>) </span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;pomm-third-time-on-status-changed-hook</span> -</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">pomm-third-time--sync-org-clock</span> +</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">pomm-third-time--sync-org-clock</span> </span></span></code></pre></div><p>Then, start the timer (either <code>pomm</code> or <code>pomm-third-time</code>) and <code>org-clock-in</code>, in whichever order. The package will call <code>org-clock-out</code> when a break starts and <code>org-clock-in-last</code> when it ends.</p> <p>Setting <code>pomm-org-clock-in-immediately</code> to <code>nil</code> &ldquo;defers&rdquo; calling <code>org-clock-in-last</code> until after any command from the user (via <code>post-command-hook</code>). I&rsquo;ve added this because I occasionally return to my PC a few minutes after the break ends, so I don&rsquo;t want these minutes to show up in <code>org-clock</code>.</p> <p>Also see <a href="https://github.com/SqrtMinusOne/pomm.el/issues/13#issuecomment-2216868331">this comment</a> (<a href="https://github.com/SqrtMinusOne/pomm.el/issues/13">#13</a>) for an alternative approach.</p> diff --git a/packages/biome/index.html b/packages/biome/index.html index 98285d7..e1d7c3d 100644 --- a/packages/biome/index.html +++ b/packages/biome/index.html @@ -111,8 +111,8 @@

    Global variables must always include a location (section “Select Coordinates or City”). To enter a location, you can either enter latitude and longitude (Open Meteo has an API for those as well) or select a location from biome-query-coords. Example configuration:

    (setq biome-query-coords
           '(("Helsinki, Finland" 60.16952 24.93545)
    -	("Berlin, Germany" 52.52437 13.41053)
    -	("Dubai, UAE" 25.0657 55.17128)))
    +        ("Berlin, Germany" 52.52437 13.41053)
    +        ("Dubai, UAE" 25.0657 55.17128)))
     

    A timezone (“Settings” > “Timezone”) may not be required, but be sure to set it because the default one is UTC+0.

    The current group is switched with <tab>. Each group’s section has a set of variables that can be toggled on and off, such as temperature, precipitation, etc. Check out the API docs if you’re interested in the meaning of more esoteric ones.

    Press RET after you’ve configured the query to call the API. If something goes wrong, it will output an error, such as:

    @@ -138,8 +138,8 @@

    Alternatively, use the add-to-list form (generated below the biome-def-preset form). Presets added that way will show up in M-x biome-presets or “Presets” in M-x biome.

    Table formatting can be configured with biome-grid-format; check the docstring for more information. For instance, if you want to disable all gradients:

    (setq biome-grid-format (seq-filter (lambda (f) (not (eq (car-safe (nth 2 f))
    -							 'gradient)))
    -				    biome-grid-format))
    +                                                         'gradient)))
    +                                    biome-grid-format))
     

    Turn off highlighting of the current hour or day as follows:

    (setq biome-grid-highlight-current nil)
     

    Composite queries

    diff --git a/packages/elfeed-summary/index.html b/packages/elfeed-summary/index.html index 2adde81..f093ca2 100644 --- a/packages/elfeed-summary/index.html +++ b/packages/elfeed-summary/index.html @@ -234,55 +234,55 @@ assigned to group with the least amount of members.

    Here is an excerpt from my configuration that was used to produce this screenshot:

    (setq elfeed-summary-settings
           '((group (:title . "GitHub")
    -	       (:elements
    -		(query . (url . "SqrtMinusOne.private.atom"))
    -		(group . ((:title . "Guix packages")
    -			  (:elements
    -			   (query . (and github guix_packages)))
    -			  (:hide t)))))
    -	(group (:title . "Blogs [Software]")
    -	       (:elements
    -		(query . software_blogs)))
    -	(group (:title . "Blogs [People]")
    -	       (:elements
    -		(query . (and blogs people (not emacs)))
    -		(group (:title . "Emacs")
    -		       (:elements
    -			(query . (and blogs people emacs))))))
    -	(group (:title . "Podcasts")
    -	       (:elements
    -		(query . podcasts)))
    -	(group (:title . "Videos")
    -	       (:elements
    -		(group
    -		 (:title . "Music")
    -		 (:elements
    -		  (query . (and videos music))))
    -		(group
    -		 (:title . "Tech")
    -		 (:elements
    -		  (query . (and videos tech))))
    -		(group
    -		 (:title . "History")
    -		 (:elements
    -		  (query . (and videos history))))
    -		;; ...
    -		))
    -	;; ...
    -	(group (:title . "Miscellaneous")
    -	       (:elements
    -		(group
    -		 (:title . "Searches")
    -		 (:elements
    -		  (search
    -		   (:filter . "@6-months-ago sqrtminusone")
    -		   (:title . "About me"))
    -		  (search
    -		   (:filter . "+later")
    -		   (:title . "Check later"))))
    -		(group
    -		 (:title . "Ungrouped")
    -		 (:elements :misc))))))
    +               (:elements
    +                (query . (url . "SqrtMinusOne.private.atom"))
    +                (group . ((:title . "Guix packages")
    +                          (:elements
    +                           (query . (and github guix_packages)))
    +                          (:hide t)))))
    +        (group (:title . "Blogs [Software]")
    +               (:elements
    +                (query . software_blogs)))
    +        (group (:title . "Blogs [People]")
    +               (:elements
    +                (query . (and blogs people (not emacs)))
    +                (group (:title . "Emacs")
    +                       (:elements
    +                        (query . (and blogs people emacs))))))
    +        (group (:title . "Podcasts")
    +               (:elements
    +                (query . podcasts)))
    +        (group (:title . "Videos")
    +               (:elements
    +                (group
    +                 (:title . "Music")
    +                 (:elements
    +                  (query . (and videos music))))
    +                (group
    +                 (:title . "Tech")
    +                 (:elements
    +                  (query . (and videos tech))))
    +                (group
    +                 (:title . "History")
    +                 (:elements
    +                  (query . (and videos history))))
    +                ;; ...
    +                ))
    +        ;; ...
    +        (group (:title . "Miscellaneous")
    +               (:elements
    +                (group
    +                 (:title . "Searches")
    +                 (:elements
    +                  (search
    +                   (:filter . "@6-months-ago sqrtminusone")
    +                   (:title . "About me"))
    +                  (search
    +                   (:filter . "+later")
    +                   (:title . "Check later"))))
    +                (group
    +                 (:title . "Ungrouped")
    +                 (:elements :misc))))))
     

    Automatic generation of groups

    auto-tags

    As described in the tree configuration section, there are two ways to avoid defining all the relevant groups manually, auto-tags and tag-groups. Both use tags that are defined in elfeed-feeds.

    diff --git a/packages/eshell-atuin/index.html b/packages/eshell-atuin/index.html index be9bd65..2bc8aa4 100644 --- a/packages/eshell-atuin/index.html +++ b/packages/eshell-atuin/index.html @@ -155,6 +155,8 @@

    See (emacs) Custom Format Strings for information on the general format-spec syntax.

    I suspect the package might be slow if your history has a lot of records (I haven’t checked yet). In this case, it might be worth setting a limit:

    (setq eshell-atuin-search-options '("--exit" "0" "--limit" "10000"))
    +

    If the package ignores imported history, remove --exit 0 from the options (see #9).

    +
    (setq eshell-atuin-search-options nil)
     

    Usage

    Enable eshell-atuin-mode to turn on storing eshell commands in atuin.

    Run eshell-atuin-history inside an eshell buffer to browse the saved history. Accepting the completion will insert the command.

    diff --git a/packages/index.xml b/packages/index.xml index 4a2e115..941d546 100644 --- a/packages/index.xml +++ b/packages/index.xml @@ -90,6 +90,8 @@ <p>See <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Custom-Format-Strings.html">(emacs) Custom Format Strings</a> for information on the general <code>format-spec</code> syntax.</p> <p>I suspect the package might be slow if your history has a lot of records (I haven&rsquo;t checked yet). In this case, it might be worth setting a limit:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">eshell-atuin-search-options</span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;--exit&#34;</span> <span style="color:#ba2121">&#34;0&#34;</span> <span style="color:#ba2121">&#34;--limit&#34;</span> <span style="color:#ba2121">&#34;10000&#34;</span>)) +</span></span></code></pre></div><p>If the package ignores imported history, remove <code>--exit 0</code> from the options (see <a href="https://github.com/SqrtMinusOne/eshell-atuin/issues/9">#9</a>).</p> +<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">eshell-atuin-search-options</span> <span style="color:#800">nil</span>) </span></span></code></pre></div><h2 id="usage">Usage</h2> <p>Enable <code>eshell-atuin-mode</code> to turn on storing eshell commands in <code>atuin</code>.</p> <p>Run <code>eshell-atuin-history</code> inside an <code>eshell</code> buffer to browse the saved history. Accepting the completion will insert the command.</p> @@ -147,11 +149,11 @@ <p>By default, the package selects <code>org-clock</code> records from <code>(org-agenda-files)</code>. Additional options can be included by customizing the <code>org-clock-agg-files-preset</code> variable. For instance:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">org-clock-agg-files-preset</span> </span></span><span style="display:flex;"><span> <span style="color:#666">`</span>((<span style="color:#ba2121">&#34;Org Agenda + Archive&#34;</span> -</span></span><span style="display:flex;"><span> <span style="color:#666">.</span> -</span></span><span style="display:flex;"><span> <span style="color:#666">,</span>(<span style="color:#00f">append</span> (<span style="color:#19177c">org-agenda-files</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">cl-remove-if</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> (<span style="color:#19177c">f</span>) (<span style="color:#19177c">string-match-p</span> (<span style="color:#008000">rx</span> <span style="color:#ba2121">&#34;.&#34;</span> <span style="color:#19177c">eos</span>) <span style="color:#19177c">f</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#00f">directory-files</span> (<span style="color:#00f">concat</span> <span style="color:#19177c">org-directory</span> <span style="color:#ba2121">&#34;/archive/&#34;</span>) <span style="color:#800">t</span>)))))) +</span></span><span style="display:flex;"><span> <span style="color:#666">.</span> +</span></span><span style="display:flex;"><span> <span style="color:#666">,</span>(<span style="color:#00f">append</span> (<span style="color:#19177c">org-agenda-files</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">cl-remove-if</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> (<span style="color:#19177c">f</span>) (<span style="color:#19177c">string-match-p</span> (<span style="color:#008000">rx</span> <span style="color:#ba2121">&#34;.&#34;</span> <span style="color:#19177c">eos</span>) <span style="color:#19177c">f</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#00f">directory-files</span> (<span style="color:#00f">concat</span> <span style="color:#19177c">org-directory</span> <span style="color:#ba2121">&#34;/archive/&#34;</span>) <span style="color:#800">t</span>)))))) </span></span></code></pre></div><p>Note that after updating any of these variables, you&rsquo;ll need to reopen the <code>*org-clock-agg*</code> buffer to view the changes.</p> <p>Alternatively, you can directly specify the list of files within the buffer by selecting &ldquo;Custom list&rdquo; in the &ldquo;Files&rdquo; control.</p> <h3 id="date-range">Date Range</h3> @@ -328,22 +330,22 @@ Customize the formatting of these records through <code>org-clock-agg-elem </span></span><span style="display:flex;"><span> <span style="color:#008000">:readable-name</span> <span style="color:#ba2121">&#34;Event&#34;</span> </span></span><span style="display:flex;"><span> <span style="color:#008000">:default-sort</span> <span style="color:#19177c">total</span> </span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">title</span> (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:raw-value</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:headline</span> <span style="color:#19177c">elem</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">is-meeting</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">string-match-p</span> <span style="color:#ba2121">&#34;meeting&#34;</span> (<span style="color:#00f">downcase</span> <span style="color:#19177c">title</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq-contains-p</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:tags</span> <span style="color:#19177c">elem</span>) <span style="color:#ba2121">&#34;mt&#34;</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">is-offline</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">string-match-p</span> <span style="color:#ba2121">&#34;offline&#34;</span> (<span style="color:#00f">downcase</span> <span style="color:#19177c">title</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq-contains-p</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:tags</span> <span style="color:#19177c">elem</span>) <span style="color:#ba2121">&#34;offline&#34;</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">title-without-stuff</span> (<span style="color:#19177c">string-trim</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">replace-regexp-in-string</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">rx</span> (<span style="color:#008000">or</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#00f">+</span> (<span style="color:#008000">or</span> <span style="color:#19177c">digit</span> <span style="color:#ba2121">&#34;.&#34;</span>))) -</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;(offline)&#34;</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq</span> <span style="color:#ba2121">&#34;[&#34;</span> (<span style="color:#00f">+</span> <span style="color:#19177c">alnum</span>) <span style="color:#ba2121">&#34;]&#34;</span>) )) -</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;&#34;</span> <span style="color:#19177c">title</span>)))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">is-meeting</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">string-match-p</span> <span style="color:#ba2121">&#34;meeting&#34;</span> (<span style="color:#00f">downcase</span> <span style="color:#19177c">title</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq-contains-p</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:tags</span> <span style="color:#19177c">elem</span>) <span style="color:#ba2121">&#34;mt&#34;</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">is-offline</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">string-match-p</span> <span style="color:#ba2121">&#34;offline&#34;</span> (<span style="color:#00f">downcase</span> <span style="color:#19177c">title</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq-contains-p</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:tags</span> <span style="color:#19177c">elem</span>) <span style="color:#ba2121">&#34;offline&#34;</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">title-without-stuff</span> (<span style="color:#19177c">string-trim</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">replace-regexp-in-string</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">rx</span> (<span style="color:#008000">or</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#00f">+</span> (<span style="color:#008000">or</span> <span style="color:#19177c">digit</span> <span style="color:#ba2121">&#34;.&#34;</span>))) +</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;(offline)&#34;</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">seq</span> <span style="color:#ba2121">&#34;[&#34;</span> (<span style="color:#00f">+</span> <span style="color:#19177c">alnum</span>) <span style="color:#ba2121">&#34;]&#34;</span>) )) +</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;&#34;</span> <span style="color:#19177c">title</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> <span style="color:#19177c">is-meeting</span> </span></span><span style="display:flex;"><span> <span style="color:#666">`</span>(<span style="color:#ba2121">&#34;Meeting&#34;</span> -</span></span><span style="display:flex;"><span> <span style="color:#666">,@</span>(<span style="color:#008000">when</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:events-online</span> <span style="color:#19177c">extra-params</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> <span style="color:#19177c">is-offline</span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;Offline&#34;</span>) <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;Online&#34;</span>))) -</span></span><span style="display:flex;"><span> <span style="color:#666">,</span><span style="color:#19177c">title-without-stuff</span>)))) +</span></span><span style="display:flex;"><span> <span style="color:#666">,@</span>(<span style="color:#008000">when</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:events-online</span> <span style="color:#19177c">extra-params</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> <span style="color:#19177c">is-offline</span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;Offline&#34;</span>) <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;Online&#34;</span>))) +</span></span><span style="display:flex;"><span> <span style="color:#666">,</span><span style="color:#19177c">title-without-stuff</span>)))) </span></span></code></pre></div><p>For the following result:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>* Results </span></span><span style="display:flex;"><span>** Meetings @@ -394,8 +396,8 @@ Customize the formatting of these records through <code>org-clock-agg-elem <p>Global variables must always include a location (section &ldquo;Select Coordinates or City&rdquo;). To enter a location, you can either enter latitude and longitude (Open Meteo has an <a href="https://open-meteo.com/en/docs/geocoding-api">API for those</a> as well) or select a location from <code>biome-query-coords</code>. Example configuration:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">biome-query-coords</span> </span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>((<span style="color:#ba2121">&#34;Helsinki, Finland&#34;</span> <span style="color:#666">60.16952</span> <span style="color:#666">24.93545</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;Berlin, Germany&#34;</span> <span style="color:#666">52.52437</span> <span style="color:#666">13.41053</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;Dubai, UAE&#34;</span> <span style="color:#666">25.0657</span> <span style="color:#666">55.17128</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;Berlin, Germany&#34;</span> <span style="color:#666">52.52437</span> <span style="color:#666">13.41053</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;Dubai, UAE&#34;</span> <span style="color:#666">25.0657</span> <span style="color:#666">55.17128</span>))) </span></span></code></pre></div><p>A timezone (&ldquo;Settings&rdquo; &gt; &ldquo;Timezone&rdquo;) may not be required, but be sure to set it because <strong>the default one is UTC+0</strong>.</p> <p>The current group is switched with <code>&lt;tab&gt;</code>. Each group&rsquo;s section has a set of variables that can be toggled on and off, such as temperature, precipitation, etc. Check out the <a href="https://open-meteo.com/en/docs">API docs</a> if you&rsquo;re interested in the meaning of more esoteric ones.</p> <p>Press <code>RET</code> after you&rsquo;ve configured the query to call the API. If something goes wrong, it will output an error, such as:</p> @@ -421,8 +423,8 @@ Customize the formatting of these records through <code>org-clock-agg-elem <p>Alternatively, use the <code>add-to-list</code> form (generated below the <code>biome-def-preset</code> form). Presets added that way will show up in <code>M-x biome-presets</code> or &ldquo;Presets&rdquo; in <code>M-x biome</code>.</p> <p>Table formatting can be configured with <code>biome-grid-format</code>; check the docstring for more information. For instance, if you want to disable all gradients:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">biome-grid-format</span> (<span style="color:#19177c">seq-filter</span> (<span style="color:#008000">lambda</span> (<span style="color:#19177c">f</span>) (<span style="color:#19177c">not</span> (<span style="color:#00f">eq</span> (<span style="color:#00f">car-safe</span> (<span style="color:#00f">nth</span> <span style="color:#666">2</span> <span style="color:#19177c">f</span>)) -</span></span><span style="display:flex;"><span> <span style="color:#19177c">&#39;gradient</span>))) -</span></span><span style="display:flex;"><span> <span style="color:#19177c">biome-grid-format</span>)) +</span></span><span style="display:flex;"><span> <span style="color:#19177c">&#39;gradient</span>))) +</span></span><span style="display:flex;"><span> <span style="color:#19177c">biome-grid-format</span>)) </span></span></code></pre></div><p>Turn off highlighting of the current hour or day as follows:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">biome-grid-highlight-current</span> <span style="color:#800">nil</span>) </span></span></code></pre></div><h2 id="composite-queries">Composite queries</h2> @@ -926,55 +928,55 @@ assigned to group with the least amount of members.</li> <p>Here is an excerpt from my configuration that was used to produce this screenshot:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">elfeed-summary-settings</span> </span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>((<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;GitHub&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#19177c">url</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;SqrtMinusOne.private.atom&#34;</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> <span style="color:#666">.</span> ((<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Guix packages&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">github</span> <span style="color:#19177c">guix_packages</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:hide</span> <span style="color:#800">t</span>))))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Blogs [Software]&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> <span style="color:#19177c">software_blogs</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Blogs [People]&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">blogs</span> <span style="color:#19177c">people</span> (<span style="color:#19177c">not</span> <span style="color:#19177c">emacs</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Emacs&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">blogs</span> <span style="color:#19177c">people</span> <span style="color:#19177c">emacs</span>)))))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Podcasts&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> <span style="color:#19177c">podcasts</span>))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Videos&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Music&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">music</span>)))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Tech&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">tech</span>)))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;History&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">history</span>)))) -</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; ...</span> -</span></span><span style="display:flex;"><span> )) -</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; ...</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Miscellaneous&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Searches&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">search</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:filter</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;@6-months-ago sqrtminusone&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;About me&#34;</span>)) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">search</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:filter</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;+later&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Check later&#34;</span>)))) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Ungrouped&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> <span style="color:#008000">:misc</span>)))))) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#19177c">url</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;SqrtMinusOne.private.atom&#34;</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> <span style="color:#666">.</span> ((<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Guix packages&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">github</span> <span style="color:#19177c">guix_packages</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:hide</span> <span style="color:#800">t</span>))))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Blogs [Software]&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> <span style="color:#19177c">software_blogs</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Blogs [People]&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">blogs</span> <span style="color:#19177c">people</span> (<span style="color:#19177c">not</span> <span style="color:#19177c">emacs</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Emacs&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">blogs</span> <span style="color:#19177c">people</span> <span style="color:#19177c">emacs</span>)))))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Podcasts&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> <span style="color:#19177c">podcasts</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Videos&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Music&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">music</span>)))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Tech&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">tech</span>)))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;History&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">query</span> <span style="color:#666">.</span> (<span style="color:#008000">and</span> <span style="color:#19177c">videos</span> <span style="color:#19177c">history</span>)))) +</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; ...</span> +</span></span><span style="display:flex;"><span> )) +</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; ...</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Miscellaneous&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Searches&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">search</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:filter</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;@6-months-ago sqrtminusone&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;About me&#34;</span>)) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">search</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:filter</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;+later&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Check later&#34;</span>)))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">group</span> +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:title</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Ungrouped&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#008000">:elements</span> <span style="color:#008000">:misc</span>)))))) </span></span></code></pre></div><h3 id="automatic-generation-of-groups">Automatic generation of groups</h3> <h4 id="auto-tags"><code>auto-tags</code></h4> <p>As described in the <a href="#tree-configuration-1">tree configuration</a> section, there are two ways to avoid defining all the relevant groups manually, <code>auto-tags</code> and <code>tag-groups</code>. Both use tags that are defined in <code>elfeed-feeds</code>.</p> @@ -1210,10 +1212,10 @@ assigned to group with the least amount of members.</li> </ul> <p>The default value is as follows:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span><span style="color:#666">&#39;</span>((<span style="color:#19177c">autotype</span> <span style="color:#666">.</span> (<span style="color:#19177c">wait</span> -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;username&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">key</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Tab&#34;</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#19177c">secret</span>) -</span></span><span style="display:flex;"><span> (<span style="color:#19177c">key</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Return&#34;</span>))) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;username&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">key</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Tab&#34;</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#19177c">secret</span>) +</span></span><span style="display:flex;"><span> (<span style="color:#19177c">key</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;Return&#34;</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">password</span> <span style="color:#666">.</span> (<span style="color:#19177c">wait</span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#19177c">secret</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">username</span> <span style="color:#666">.</span> (<span style="color:#19177c">wait</span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;username&#34;</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">url</span> <span style="color:#666">.</span> (<span style="color:#19177c">wait</span> (<span style="color:#19177c">field</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;url&#34;</span>)))) @@ -1371,7 +1373,7 @@ timestamps by their date.</li> </span></span><span style="display:flex;"><span> (<span style="color:#19177c">org-journal-tags-prop-apply-delta</span> <span style="color:#008000">:add</span> (<span style="color:#00f">list</span> <span style="color:#19177c">my/loc-tag</span>)))) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;org-journal-after-entry-create-hook</span> -</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/set-journal-header</span>) +</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/set-journal-header</span>) </span></span></code></pre></div><h3 id="encryption">Encryption</h3> <p>There are two ways how org-journal can be encrypted:</p> <ul> @@ -1656,7 +1658,7 @@ interval = 1 <p>The package can be used with <a href="https://orgmode.org/manual/Clocking-commands.html">org-clock</a> in the following way. Set up these two hooks:</p> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;pomm-on-status-changed-hook</span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">pomm--sync-org-clock</span>) </span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;pomm-third-time-on-status-changed-hook</span> -</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">pomm-third-time--sync-org-clock</span> +</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">pomm-third-time--sync-org-clock</span> </span></span></code></pre></div><p>Then, start the timer (either <code>pomm</code> or <code>pomm-third-time</code>) and <code>org-clock-in</code>, in whichever order. The package will call <code>org-clock-out</code> when a break starts and <code>org-clock-in-last</code> when it ends.</p> <p>Setting <code>pomm-org-clock-in-immediately</code> to <code>nil</code> &ldquo;defers&rdquo; calling <code>org-clock-in-last</code> until after any command from the user (via <code>post-command-hook</code>). I&rsquo;ve added this because I occasionally return to my PC a few minutes after the break ends, so I don&rsquo;t want these minutes to show up in <code>org-clock</code>.</p> <p>Also see <a href="https://github.com/SqrtMinusOne/pomm.el/issues/13#issuecomment-2216868331">this comment</a> (<a href="https://github.com/SqrtMinusOne/pomm.el/issues/13">#13</a>) for an alternative approach.</p> diff --git a/packages/org-clock-agg/index.html b/packages/org-clock-agg/index.html index fcdfdc3..78a76e3 100644 --- a/packages/org-clock-agg/index.html +++ b/packages/org-clock-agg/index.html @@ -104,11 +104,11 @@

    By default, the package selects org-clock records from (org-agenda-files). Additional options can be included by customizing the org-clock-agg-files-preset variable. For instance:

    (setq org-clock-agg-files-preset
           `(("Org Agenda + Archive"
    -	 .
    -	 ,(append (org-agenda-files)
    -		  (cl-remove-if
    -		   (lambda (f) (string-match-p (rx "." eos) f))
    -		   (directory-files (concat org-directory "/archive/") t))))))
    +         .
    +         ,(append (org-agenda-files)
    +                  (cl-remove-if
    +                   (lambda (f) (string-match-p (rx "." eos) f))
    +                   (directory-files (concat org-directory "/archive/") t))))))
     

    Note that after updating any of these variables, you’ll need to reopen the *org-clock-agg* buffer to view the changes.

    Alternatively, you can directly specify the list of files within the buffer by selecting “Custom list” in the “Files” control.

    Date Range

    @@ -285,22 +285,22 @@ Customize the formatting of these records through org-clock-agg-elem-forma
    :readable-name "Event" :default-sort total (let* ((title (org-element-property :raw-value (alist-get :headline elem))) - (is-meeting (or (string-match-p "meeting" (downcase title)) - (seq-contains-p (alist-get :tags elem) "mt"))) - (is-offline (or (string-match-p "offline" (downcase title)) - (seq-contains-p (alist-get :tags elem) "offline"))) - (title-without-stuff (string-trim - (replace-regexp-in-string - (rx (or - (group (+ (or digit "."))) - "(offline)" - (seq "[" (+ alnum) "]") )) - "" title)))) + (is-meeting (or (string-match-p "meeting" (downcase title)) + (seq-contains-p (alist-get :tags elem) "mt"))) + (is-offline (or (string-match-p "offline" (downcase title)) + (seq-contains-p (alist-get :tags elem) "offline"))) + (title-without-stuff (string-trim + (replace-regexp-in-string + (rx (or + (group (+ (or digit "."))) + "(offline)" + (seq "[" (+ alnum) "]") )) + "" title)))) (when is-meeting `("Meeting" - ,@(when (alist-get :events-online extra-params) - (if is-offline '("Offline") '("Online"))) - ,title-without-stuff)))) + ,@(when (alist-get :events-online extra-params) + (if is-offline '("Offline") '("Online"))) + ,title-without-stuff))))

    For the following result:

    * Results
     ** Meetings
    diff --git a/packages/org-journal-tags/index.html b/packages/org-journal-tags/index.html
    index 8b4f79a..d950a2f 100644
    --- a/packages/org-journal-tags/index.html
    +++ b/packages/org-journal-tags/index.html
    @@ -210,7 +210,7 @@ timestamps by their date.
         (org-journal-tags-prop-apply-delta :add (list my/loc-tag))))
     
     (add-hook 'org-journal-after-entry-create-hook
    -	  #'my/set-journal-header)
    +          #'my/set-journal-header)
     

    Encryption

    There are two ways how org-journal can be encrypted:

      diff --git a/packages/password-store-completion/index.html b/packages/password-store-completion/index.html index 53f8cc2..713c610 100644 --- a/packages/password-store-completion/index.html +++ b/packages/password-store-completion/index.html @@ -126,10 +126,10 @@

    The default value is as follows:

    '((autotype . (wait
    -	       (field . "username")
    -	       (key . "Tab")
    -	       (field . secret)
    -	       (key . "Return")))
    +               (field . "username")
    +               (key . "Tab")
    +               (field . secret)
    +               (key . "Return")))
       (password . (wait (field . secret)))
       (username . (wait (field . "username")))
       (url . (wait (field . "url"))))
    diff --git a/packages/pomm/index.html b/packages/pomm/index.html
    index 7b82cad..218879e 100644
    --- a/packages/pomm/index.html
    +++ b/packages/pomm/index.html
    @@ -181,7 +181,7 @@ interval = 1
     

    The package can be used with org-clock in the following way. Set up these two hooks:

    (add-hook 'pomm-on-status-changed-hook #'pomm--sync-org-clock)
     (add-hook 'pomm-third-time-on-status-changed-hook
    -	  #'pomm-third-time--sync-org-clock
    +          #'pomm-third-time--sync-org-clock
     

    Then, start the timer (either pomm or pomm-third-time) and org-clock-in, in whichever order. The package will call org-clock-out when a break starts and org-clock-in-last when it ends.

    Setting pomm-org-clock-in-immediately to nil “defers” calling org-clock-in-last until after any command from the user (via post-command-hook). I’ve added this because I occasionally return to my PC a few minutes after the break ends, so I don’t want these minutes to show up in org-clock.

    Also see this comment (#13) for an alternative approach.

    diff --git a/posts/2023-04-13-emacs/index.html b/posts/2023-04-13-emacs/index.html index f4fd16f..979dd14 100644 --- a/posts/2023-04-13-emacs/index.html +++ b/posts/2023-04-13-emacs/index.html @@ -84,8 +84,7 @@ }
    -

    Poof I made my free-time disappear

    -
    +

    Poof I made my free-time disappear

    - Ellis Kenyő, on being called an "elisp mage"

    Little did I know on the fateful day of [2020-10-09 Fri], when I had installed GNU Emacs. I wasn’t thinking about the ethical aspects of free software, the aesthetics of Lisp, or these other things with which an occasional layperson might explain how an almost half a century old program can still be in active use.

    In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.

    diff --git a/posts/index.xml b/posts/index.xml index 29e0268..f4c4a2c 100644 --- a/posts/index.xml +++ b/posts/index.xml @@ -838,8 +838,7 @@ } </style> <blockquote> -<p>Poof I made my free-time disappear</p> -</blockquote> +<p>Poof I made my free-time disappear</p></blockquote> <p class="quote-title">- <a href="https://elken.dev">Ellis Kenyő</a>, on being called an "elisp mage" <p>Little did I know on the fateful day of <strong><span class="timestamp-wrapper"><span class="timestamp">[2020-10-09 Fri]</span></span></strong>, when I had installed <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>. I wasn&rsquo;t thinking about the <a href="https://www.gnu.org/philosophy/philosophy.html">ethical aspects</a> of free software, the <a href="https://www.webofstories.com/play/marvin.minsky/44">aesthetics of Lisp</a>, or these other things with which an occasional layperson might explain how an almost <a href="https://www.jwz.org/doc/emacs-timeline.html">half a century old</a> program can still be in <a href="https://emacsconf.org/2022/talks/survey/">active use</a>.</p> <p>In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.</p> diff --git a/stats/all.png b/stats/all.png index a46f62bc31847b93a7f3176fb0ff9cc8cffc3436..70bf7c348eb3f5aae00d19916a43a81cb0d11f45 100644 GIT binary patch literal 124236 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

    W6Me_nIKn~#BZA!tbzNc7Um2h8 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 aHNSD>o)z;rU+7Gn+^OSA^2u^nZvQWcAAvjo literal 124170 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%0Dt=My#JA`# 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 Z>lc&c;{Mh87O}#b7j-V={(k52e*wwE^RWN` literal 63407 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 E0%zCrYXATM diff --git a/stats/literate-config.png b/stats/literate-config.png index a1cd669a65cf66f6cc359276c5df38257b63d645..5413498587e5ca5b40613ea3b8210eb24344df0a 100644 GIT binary patch literal 70408 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 diff --git a/tags/emacs/index.xml b/tags/emacs/index.xml index 0f21130..5cf09c0 100644 --- a/tags/emacs/index.xml +++ b/tags/emacs/index.xml @@ -20,7 +20,7 @@ https://sqrtminusone.xyz/posts/2023-04-13-emacs/ Thu, 13 Apr 2023 00:00:00 +0000 https://sqrtminusone.xyz/posts/2023-04-13-emacs/ - <style> .quote-title { margin-left: 24px; } </style> <blockquote> <p>Poof I made my free-time disappear</p> </blockquote> <p class="quote-title">- <a href="https://elken.dev">Ellis Kenyő</a>, on being called an "elisp mage" <p>Little did I know on the fateful day of <strong><span class="timestamp-wrapper"><span class="timestamp">[2020-10-09 Fri]</span></span></strong>, when I had installed <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>. I wasn&rsquo;t thinking about the <a href="https://www.gnu.org/philosophy/philosophy.html">ethical aspects</a> of free software, the <a href="https://www.webofstories.com/play/marvin.minsky/44">aesthetics of Lisp</a>, or these other things with which an occasional layperson might explain how an almost <a href="https://www.jwz.org/doc/emacs-timeline.html">half a century old</a> program can still be in <a href="https://emacsconf.org/2022/talks/survey/">active use</a>.</p> <p>In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.</p> + <style> .quote-title { margin-left: 24px; } </style> <blockquote> <p>Poof I made my free-time disappear</p></blockquote> <p class="quote-title">- <a href="https://elken.dev">Ellis Kenyő</a>, on being called an "elisp mage" <p>Little did I know on the fateful day of <strong><span class="timestamp-wrapper"><span class="timestamp">[2020-10-09 Fri]</span></span></strong>, when I had installed <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>. I wasn&rsquo;t thinking about the <a href="https://www.gnu.org/philosophy/philosophy.html">ethical aspects</a> of free software, the <a href="https://www.webofstories.com/play/marvin.minsky/44">aesthetics of Lisp</a>, or these other things with which an occasional layperson might explain how an almost <a href="https://www.jwz.org/doc/emacs-timeline.html">half a century old</a> program can still be in <a href="https://emacsconf.org/2022/talks/survey/">active use</a>.</p> Running Gource with Emacs