summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--attic/misc.org1216
-rw-r--r--attic/net/w3m.org (renamed from attic/w3m.org)0
2 files changed, 0 insertions, 1216 deletions
diff --git a/attic/misc.org b/attic/misc.org
deleted file mode 100644
index d3af11a..0000000
--- a/attic/misc.org
+++ /dev/null
@@ -1,1216 +0,0 @@
-#+title: Miscellaneous config bits that i don't use anymore
-
-* portability macros
- #+begin_src emacs-lisp
- (defmacro jao-syscase (clauses)
- (let ((cls (assoc system-type clauses)))
- (when cls `(progn ,@(cdr cls)))))
-
- (defmacro jao-d-l (darw linux)
- `(jao-syscase ((darwin ,darw) (gnu/linux ,linux))))
-
- (defmacro jao-when-darwin (&rest body)
- `(jao-syscase ((darwin ,@body))))
-
- (defmacro jao-when-linux (&rest body)
- `(jao-syscase ((gnu/linux ,@body))))
- #+end_src
-* outlines
- #+begin_src emacs-lisp
-
- (use-package bicycle
- :ensure t
- :after outline
- :bind (:map outline-minor-mode-map
- ("C-<tab>" . bicycle-cycle)
- ("S-<tab>" . bicycle-cycle-global))
- :diminish ((hs-minor-mode . "")
- (outline-minor-mode . "")))
-
- #+end_src
-* elixir
-*** packages
- #+begin_src emacs-lisp
- (use-package elixir-mode
- :ensure t
- :custom (lsp-clients-elixir-server-executable
- (expand-file-name "~/usr/share/elixir-ls/language_server.sh"))
- ;; :bind (:map elixir-mode-map (("C-c C-z" . jao-vterm-repl-pop-to-repl)))
- )
-
- (use-package mix
- :ensure t
- :hook (elixir-mode . mix-minor-mode)
- ;; :init (jao-vterm-repl-register "mix.exs" "iex -S mix" "^iex([0-9]+)> ")
- :diminish ((mix-minor-mode . "")))
-
- (use-package exunit :ensure t)
- #+end_src
-*** hydra
- #+begin_src emacs-lisp
- (major-mode-hydra-define elixir-mode nil
- ("Doc"
- (("dd" lsp-describe-thing-at-point "Describe thing at point"))
- "Xref"
- (("xd" xref-find-definitions "Definitions")
- ("xo" xref-find-definitions-other-window "-> other win")
- ("xr" xref-find-references "References"))
- "LSP"
- (("lg" lsp-goto-implementation "Implementation")
- ("lf" lsp-format-buffer "Format buffer")
- ("ls" lsp-describe-session "Describe session"))
- "LSP modes"
- (("Tl" lsp-lens-mode "Lens mode" :toggle t)
- ("Td" lsp-modeline-diagnostics-mode "Modeline diagnostics" :toggle t)
- ("Tb" lsp-headerline-breadcrumb-mode "Header breadcrumb" :toggle t)
- ("Ti" lsp-toggle-trace-io "Trace I/O" :toggle lsp-print-io))
- "Mix"
- (("me" mix-execute-task "Execute mix task")
- ("mt" mix-test "Run tests")
- ("mc" mix-compile "Compile")
- ("mm" jao-elixir-pop-to-iex "Pop to iex"))
- "Mix subproject"
- (("Me" (lambda () (interactive) (mix-execute-task nil t))
- "Execute task")
- ("Mt" (lambda () (interactive) (mix-compile nil t)) "Compile")
- ("Mt" (lambda () (interactive) (mix-test nil t)) "Run tests"))
- "Tests"
- (("tt" exunit-verify-single "Run single test")
- ("tr" exunit-rerun "Re-run tests")
- ("ta" exunit-verify "Run test suites")
- ("tA" exunit-verify-all "Run all test suites"))))
- #+end_src
-* mpdel
- #+BEGIN_SRC emacs-lisp
- (jao-load-path "libmpdel")
- (jao-load-path "mpdel")
- (jao-load-path "navigel")
-
- (use-package navigel
- :init (setq navigel-display-messages nil))
-
- (defun jao-mpdel-dup-dir-p (dir)
- (and (libmpdel-directory-p dir)
- (string-match-p "\\[.+\\]\\b"
- (or (libmpdel--directory-path dir) ""))))
-
- (defun jao-mpdel--filter (dirs)
- (cl-remove-if 'jao-mpdel-dup-dir-p dirs))
-
- (use-package libmpdel
- :init (setq libmpdel-port 6669))
-
- (use-package mpdel
- :diminish
- :init
- (setq mpdel-browser-list-clean-up-function 'identity
- mpdel-browser-top-level-entries
- '(directories
- empty-line
- stored-playlists current-playlist
- empty-line
- "Spotify/Top Lists/Top artists/Personal"
- "Spotify/Playlists/Featured"
- empty-line
- search-album search-artist search-title))
-
- (defun jao-mpdel--show-osd (data song ml)
- (let* ((no (1+ (string-to-number (or (cdr (assq 'song data)) "0"))))
- (to (or (cdr (assq 'playlistlength data)) "0"))
- (album (or (libmpdel-album-name song) ""))
- (artist (or (libmpdel-artist-name song) ""))
- (tms (split-string (or (cdr (assq 'time data)) "0/0") ":"))
- (tm (format "%s/%s"
- (libmpdel-time-to-string (car tms))
- (libmpdel-time-to-string (cadr tms))))
- (title (format "%s %s/%s. %s" tm no to
- (or (libmpdel-entity-name song) ""))))
- (if ml
- (message "%s %s - %s (%s)" tm title artist album)
- (jao-notify (format "%s (%s)" artist album)
- title
- jao-notify-audio-icon))))
-
- (defun jao-mpdel-show-osd (&optional ml)
- (interactive "P")
- (let ((song (libmpdel-current-song)))
- (when song
- (libmpdel-send-command "status"
- `(lambda (data)
- (jao-mpdel--show-osd data ,song ,ml))))))
-
- (defun jao-mpdel-search (&optional type)
- (interactive
- (list (completing-read "Search by: " '("album" "artist" "title"))))
- (let* ((func (cond ((string= type "album") 'mpdel-core-search-by-album)
- ((string= type "artist") 'mpdel-core-search-by-artist)
- ((string= type "title") 'mpdel-core-search-by-title)))
- (thing (read-from-minibuffer (format "Search for %s: " type))))
- (mpdel-core-open (libmpdel-search-criteria-create :type type :what thing)))))
-
- (use-package mpdel-browser)
- (defalias 'mpdel-pop-to-browser 'mpdel-browser-open)
-
- (mpdel-mode)
- (define-key mpdel-browser-mode-map (kbd "n") #'next-line)
- (define-key mpdel-browser-mode-map (kbd "p") #'previous-line)
- #+END_SRC
-* emms
-*** configuration
- #+BEGIN_SRC emacs-lisp
- (use-package emms
- :pin gnu
- :ensure t
- :init
- (setq emms-score-file "~/.emacs.d/score"
- emms-stream-bookmarks-file "~/.emacs.d/streams"
- emms-history-file "~/.emacs.d/cache/emms-history"
- emms-cache-file "~/.emacs.d/cache/emms-cache"
- emms-show-format "%s")
-
- (setq emms-source-file-default-directory "~/var/lib/music/"
- emms-player-list '(emms-player-mpd)
- emms-player-mpd-server-name "localhost"
- emms-player-mpd-server-port "6600"
- emms-player-mpd-music-directory emms-source-file-default-directory)
-
- (setq emms-volume-change-function 'emms-volume-mpd-change
- emms-volume-change-amount 10
- emms-info-ogginfo-coding-system 'utf-8)
-
- ;; from http://www.shellarchive.co.uk/index.html#%20Prettify%20emms
- (setq emms-browser-info-genre-format "%i· %n"
- emms-browser-info-artist-format "%i· %n"
- emms-browser-info-album-format "%i◨ %n"
- emms-browser-info-title-format "%i♪ %n")
-
- (setq emms-last-played-format-alist
- '(((emms-last-played-seconds-today) . "Today at %H:%M")
- (604800 . "%a at %H:%M")
- ((emms-last-played-seconds-month) . "%d")
- ((emms-last-played-seconds-year) . "%m-%d")
- (t . "")))
-
- :hook ((emms-player-started . emms-player-mpd-show))
-
- :config
- (eval-after-load "emms-info"
- '(add-to-list 'emms-info-functions 'emms-info-mpd)))
-
- (emms-all)
- (emms-mode-line -1)
- (emms-playing-time 1)
- (emms-playing-time-disable-display)
-
- (use-package jao-emms-random-album
- :after emms
- :commands (jao-emms-random-album-next)
- :init (setq jao-emms-random-album-notify-icon jao-notify-audio-icon))
-
- (use-package jao-emms-info-track
- :after emms
- :init (setq jao-emms-show-icon jao-notify-audio-icon)
- :config (jao-emms-info-setup 50))
-
- (use-package jao-emms-lyrics
- :after emms
- :init (setq jao-lyrics-info-function 'jao-emms-lyrics-track-data))
-
- (defvar jao-emms-random-album-notify--pause-icon
- "/usr/share/icons/Tango/scalable/actions/media-playback-pause.svg")
-
- (defun jao-emms--show-status (s status)
- (jao-notify (format "%s%s%s"
- (cadr s)
- (cdr (assoc (car s) status))
- (caddr s))
- "emms"
- (if (string= "pause" (cdr (assoc "state" status)))
- jao-emms-random-album-notify--pause-icon
- jao-notify-audio-icon)))
-
- (defun jao-emms--osd-status (s &optional pref suff)
- (emms-player-mpd-get-status (list s (or pref "") (or suff ""))
- 'jao-emms--show-status))
-
- #+END_SRC
-*** helper functions
- #+begin_src emacs-lisp
- (defun jao-emms-volume-delta (d)
- (funcall emms-volume-change-function d))
-
- (defun jao-emms-show-volume ()
- (jao-emms--osd-status "volume" "Volume " "%"))
-
- (defalias 'jao-emms-update-cache 'emms-player-mpd-update-all-reset-cache)
-
- (defun jao-emms-load-streams ()
- (interactive)
- (emms-play-playlist (expand-file-name "~/var/lib/music/streams.list")))
-
- (defun jao-emms-search ()
- (interactive)
- (let ((by (completing-read "Search by: "
- '("artist"
- "composer"
- "performer"
- "title"
- "album"
- "names"))))
- (if (string= "names" by)
- (emms-browser-search-by-names)
- (emms-browser-search (list (intern (concat "info-" by)))))))
-
- (defun jao-emms-echo ()
- (interactive)
- (emms-show)
- (jao-emms-update-echo-string)
- (emms-show))
- #+end_src
-*** Media global aliases
- #+begin_src emacs-lisp
- (defalias 'jao-player-connect 'emms-player-mpd-connect)
- (defalias 'jao-player-toggle 'emms-pause)
- (defalias 'jao-player-next 'emms-next)
- (defalias 'jao-player-previous 'emms-previous)
- (defalias 'jao-player-stop 'emms-stop)
- (defalias 'jao-player-start 'emms-start)
- (defalias 'jao-player-seek-forward 'emms-seek-forward)
- (defalias 'jao-player-seek-backward 'emms-seek-backward)
- (defalias 'jao-player-play 'emms-start)
- (defalias 'jao-player-search 'jao-emms-search)
- (defalias 'jao-player-vol-delta 'jao-emms-volume-delta)
- (defalias 'jao-player-volume 'jao-emms-show-volume)
- (defalias 'jao-player-osd 'jao-emms-show-osd)
- (defalias 'jao-player-echo 'jao-emms-echo)
- (defalias 'jao-player-list 'emms-playlist-mode-go)
- (defalias 'jao-player-browse 'emms-browser)
- (defalias 'jao-player-random-album 'jao-emms-random-album-next)
- #+end_src
-
-* frm
- #+begin_src emacs-lisp
- (use-package jao-frm
- :init (setq jao-frm-mail-command 'jao-open-gnus-frame))
-
- (defun jao-frm--formatter (mbox n)
- (apply #'format "%s/%s: %s" `(,@(last (split-string mbox "/") 2) ,n)))
-
- (defun jao-frm--show ()
- (interactive)
- (jao-frm-show-mail-numbers #'jao-frm--formatter))
-
- (global-set-key [(f12)] 'jao-frm--show)
- (global-set-key [(f8)] 'jao-frm)
-
- #+end_src
-* mu4e
- #+begin_src emacs-lisp
- (jao-load-path "mu4e")
- (use-package mu4e
- :init
- (setq mu4e-attachment-dir (expand-file-name "~/var/download/attachments")
- mu4e-change-filenames-when-moving nil
- mu4e-completing-read-function 'completing-read
- mu4e-display-update-status-in-modeline nil
- mu4e-get-mail-command "run-mb.sh || [ $? -eq 1 ]"
- mu4e-headers-show-threads t
- mu4e-headers-sort-direction 'ascending
- mu4e-headers-visible-columns 100
- mu4e-headers-visible-lines 12
- mu4e-hide-index-messages t
- mu4e-index-cleanup t ;; don't do a full cleanup check
- mu4e-index-lazy-check t ;; don't consider up-to-date dirs
- mu4e-maildir "~/var/mail/"
- mu4e-split-view 'horizontal ;; 'vertical
- mu4e-update-interval 300
- mu4e-use-fancy-chars nil
- mu4e-user-mail-address-list jao-mails
- mu4e-view-show-addresses t
- mu4e-view-show-images t
- mu4e-maildir-shortcuts '((:maildir "/jao/inbox" :key ?j)
- (:maildir "/bigml/inbox" :key ?b))
- jao-mu4e-uninteresting-mail-query
- (concat
- "flag:unread AND NOT flag:trashed"
- " AND NOT (maildir:/bigml/inbox OR maildir:/bigml/bugs OR"
- " maildir:/bigml/support OR maildir:/jao/inbox)")
- jao-mu4e-interesting-mail-query
- (concat
- "flag:unread AND NOT flag:trashed"
- " AND (maildir:/bigml/inbox OR maildir:/bigml/bugs OR"
- " maildir:/bigml/support OR maildir:/jao/inbox)")
- mu4e-bookmarks
- `((:name "Inbox" :query ,jao-mu4e-interesting-mail-query :key ?i)
- (:name "Other messages"
- :query ,jao-mu4e-uninteresting-mail-query
- :key 117)
- (:name "Today's messages" :query "date:today..now"
- :key 116)
- (:name "Last 7 days" :query "date:7d..now" :hide-unread t
- :key 119)
- (:name "Messages with PDFs"
- :query "mime:application/pdf OR mime:x-application/pdf"
- :key 112)))
-
- :config
- (defun jao-mu4e--maildir (msg)
- (when msg
- (let ((md (mu4e-message-field msg :maildir)))
- (when (string-match "/\\([^/]+\\)/.*" md)
- (match-string 1 md)))))
-
- (defun jao-mu4e--refile-folder (msg)
- (let ((md (jao-mu4e--maildir msg)))
- (if (string= md "trove")
- "/trove/jao"
- (format "/trove/%" md))))
-
- (setq mu4e-sent-folder #'jao-mu4e--refile-folder)
- (setq mu4e-drafts-folder "/trove/drafts")
- (setq mu4e-trash-folder "/trash")
- (setq mu4e-refile-folder 'jao-mu4e--refile-folder)
-
- (setq mu4e-contexts nil)
-
- (setq mu4e-view-show-images t)
- (when (fboundp 'imagemagick-register-types)
- (imagemagick-register-types))
-
- (define-key mu4e-view-mode-map [remap mu4e-view-verify-msg-popup]
- 'epa-mail-verify)
-
- ;; View html message in browser (type aV)
- (add-to-list 'mu4e-view-actions
- '("ViewInBrowser" . mu4e-action-view-in-browser) t))
-
- #+end_src
-* company
- #+begin_src emacs-lisp
- (use-package company
- :ensure t
- :custom ((company-backends '(company-capf
- company-bbdb
- company-files
- company-dabbrev
- company-keywords))
- (company-global-modes '(not slack-message-buffer-mode
- circe-channel-mode
- telega-chat-mode))
- (company-format-margin-function nil) ;; #'company-text-icons-margin
- (company-idle-delay 0.2)
- (company-lighter "")
- (company-lighter-base "")
- (company-show-numbers nil)
- (company-selection-wrap-around t)
- (company-tooltip-limit 15)
- (company-tooltip-align-annotations t)
- (company-tooltip-offset-display 'lines)) ;; 'scrollbar
-
- :config
- (defun jao-complete-at-point ()
- "Complete using company unless we're in the minibuffer."
- (interactive)
- (if (or (not company-mode) (window-minibuffer-p))
- (completion-at-point)
- (company-manual-begin)))
-
- (defun jao-company-use-in-tab ()
- (global-set-key [remap completion-at-point] #'jao-complete-at-point)
- (global-set-key [remap completion-symbol] #'jao-complete-at-point)
- (global-set-key (kbd "M-TAB") #'jao-complete-at-point))
-
- (jao-company-use-in-tab)
-
- :bind (:map company-active-map
-
- ("<tab>" . #'company-complete-common-or-cycle)
- ("TAB" . #'company-complete-common-or-cycle)
-
- ("C-h" . #'company-show-doc-buffer)
- ("M-." . #'company-show-location)
-
- :filter (or (not (derived-mode-p 'eshell-mode))
- (company-explicit-action-p))
- ("<return>" . #'company-complete-selection)
- ("RET" . #'company-complete-selection))
- :diminish)
-
- (global-company-mode 1)
- #+end_src
-* notmuch-addr
- #+begin_src emacs-lisp
- (when (jao-load-path "notmuch-addr")
- (with-eval-after-load 'notmuch-address
- (jao-corfu-no-auto notmuch-message)
- (defun jao-notmuch-message-corfu-setup ()
- (setq-local corfu-quit-no-match nil
- corfu-commit-predicate t
- orderless-component-separator " +"))
- (add-hook 'notmuch-message-mode-hook #'jao-notmuch-message-corfu-setup)
- (require 'notmuch-addr)
- (notmuch-addr-setup)))
- #+end_src
-* rcirc
- #+begin_src emacs-lisp :load no
- (use-package rcirc
- :init
- (setq rcirc-server-alist `(("irc.libera.chat"
- :encryption tls
- :port 6697
- :channels ,jao-irc-channels))
- rcirc-default-user-full-name "http://jao.io/"
- rcirc-buffer-maximum-lines 1000
- rcirc-fill-column 82
- rcirc-fill-prefix " "
- rcirc-time-format "%H:%M "
- rcirc-kill-channel-buffers t
- rcirc-response-formats
- '(("PRIVMSG" . "(%N) %m")
- ("NOTICE" . "-%N- %m")
- ("ACTION" . "(... %N %m)")
- ("COMMAND" . "%m")
- ("ERROR" . "%fw!!! %m")
- (t . "%fp*** %fs%n %r %m"))
- rcirc-prompt ": "
- rcirc-nick-completion-format "%s, "
- rcirc-reconnect-delay 120
- rcirc-omit-responses
- '("JOIN" "PART" "QUIT" "NICK" "AWAY" "MODE" "KEEPALIVE"))
- :config
- (let ((fn (jao--get-user/password "libera"))
- (btl (jao--get-user/password "bitlbee")))
- (setq rcirc-authinfo
- `(("libera" nickserv ,(nth 0 fn) ,(nth 1 fn))
- ("localhost" bitlbee ,(nth 0 btl) ,(nth 1 btl)))))
- (jao-shorten-modes 'rcirc-mode)
-
- (define-minor-mode ncm-mode "" nil
- (:eval (format " [%S]"
- (length (rcirc-channel-nicks (rcirc-buffer-process)
- rcirc-target)))))
-
- (defun jao-rcirc-track ()
- (dolist (b rcirc-activity) (tracking-add-buffer b))
- (jao-minibuffer-refresh))
-
- (add-hook 'rcirc-update-activity-string-hook #'jao-rcirc-track)
- (add-hook 'rcirc-mode-hook #'ncm-mode)
- (add-hook 'rcirc-mode-hook #'rcirc-omit-mode)
-
- :diminish ((rcirc-omit-mode . "")))
- #+end_src
-* nth window
- #+begin_src emacs-lisp
- (defun jao--nth-window (n)
- (let ((jao-minibuffer-mode nil)
- (ignore-window-parameters t))
- (select-window (frame-first-window))
- (other-window n))
- (jao-minibuffer-refresh))
-
- (defalias 'jao-other-window 'other-window)
-
- ;; (global-set-key (kbd "M-o") #'jao-other-window)
-
- (global-set-key (kbd "C-c 0") #'jao-first-window)
- (dolist (n '(0 1 2 3 4 5 6 7 8))
- (global-set-key (format "\C-c%s" (1+ n))
- (lambda () (interactive) (jao--nth-window n))))
-
- #+end_src
-* transpose
- #+begin_src emacs-lisp
- (defun jao-transpose-windows (arg)
- "Transpose the buffers shown in two windows."
- (interactive "p")
- (let ((selector (if (>= arg 0) 'next-window 'previous-window)))
- (while (/= arg 0)
- (let ((this-win (window-buffer))
- (next-win (window-buffer (funcall selector))))
- (set-window-buffer (selected-window) next-win)
- (set-window-buffer (funcall selector) this-win)
- (select-window (funcall selector)))
- (setq arg (if (> arg 0) (1- arg) (1+ arg))))))
-
- (defun jao-transpose-windows-prev ()
- (interactive)
- (jao-transpose-windows -1))
-
- (define-key ctl-x-4-map (kbd "t") #'jao-transpose-windows)
- (global-set-key (kbd "M-O") #'jao-transpose-windows)
- (global-set-key (kbd "M-P") #'jao-transpose-windows-prev)
- #+end_src
-* ace-window
- #+begin_src emacs-lisp
- (defun jao-ace-switch-buffer-other-window ()
- (interactive)
- (aw-select "Other window"
- (if (eq jao-completion-engine 'consult)
- (lambda (w)
- (aw-switch-to-window w)
- (call-interactively 'consult-buffer))
- #'aw-switch-buffer-in-window)))
-
- (defun jao-ace-find-file-other-window ()
- (interactive)
- (aw-select "Other window"
- (lambda (w)
- (let ((df default-directory))
- (aw-switch-to-window w)
- (let ((default-directory df))
- (call-interactively 'find-file))))))
-
- (global-set-key (kbd "C-x 4 f") #'jao-ace-find-file-other-window)
- (global-set-key (kbd "C-x 4 b") #'jao-ace-switch-buffer-other-window)
- #+end_src
-
-* switch window
- An alternative for this one is ace-window, but it has the problem
- of not displaying its overlay over org buffers (sometimes) and
- introducing a dependency (avy).
- #+begin_src emacs-lisp
- (use-package switch-window
- :ensure t
- :custom ((switch-window-minibuffer-shortcut ?z)
- (switch-window-background t)
- (switch-window-shortcut-style 'qwerty)
- (switch-window-shortcut-appearance 'text)
- (switch-window-timeout 7)
- (switch-window-threshold 2))
- :init (defalias 'jao-other-window 'switch-window)
- :config
- (defun jao-switch-window--then (prompt cmd)
- (let ((f `(lambda ()
- (let ((default-directory ,default-directory))
- (call-interactively ',cmd)))))
- (switch-window--then prompt f f)))
-
- (defun jao-switch-window-then-dired ()
- (interactive)
- (jao-switch-window--then "Find directory" 'dired))
-
- (defun jao-switch-window-then-find-file ()
- (interactive)
- (jao-switch-window--then "Find file" 'find-file))
-
- (defun jao-switch-window-then-consult-buffer ()
- (interactive)
- (jao-switch-window--then "Switch to buffer" 'consult-buffer))
-
- :bind (("M-o" . switch-window)
- ("M-O" . switch-window-then-swap-buffer)
- ("s-o" . switch-window)
- ("s-O" . switch-window-then-swap-buffer)
- ("C-x 4 d" . jao-switch-window-then-dired)
- ("C-x 4 f" . jao-switch-window-then-find-file)
- ("C-x 4 b" . jao-switch-window-then-consult-buffer)))
-
- #+end_src
-* vterm
-*** vterm-toggle
- #+begin_src emacs-lisp :tangle no
- (use-package vterm-toggle
- :ensure t
- :config
- (defun jao-vterm--toggle (cd)
- (interactive "P")
- (if cd (vterm-toggle-cd) (vterm-toggle)))
- :bind (("C-<f3>" . jao-vterm--toggle)))
- #+end_src
-*** Vterm repls
- #+begin_src emacs-lisp
- (use-package jao-vterm-repl)
- (jao-define-attached-buffer "^\\* vrepl - .+ \\*.*")
- #+end_src
-* eshell here
- #+begin_src emacs-lisp
- (use-package eshell-toggle
- :ensure t
- :demand t
- :custom ((eshell-toggle-use-git-root t)))
-
- (defun jao-eshell-toggle (current)
- (interactive "P")
- (when (eq eshell-toggle--toggle-buffer-p t)
- (eshell-save-some-history)
- (eshell-autojump-save))
- (let ((eshell-toggle-use-git-root (not current)))
- (eshell-toggle)))
-
- (global-set-key (kbd "<f1>") #'jao-eshell-toggle)
- #+end_src
-* scrolling
- #+begin_src emacs-lisp
- (use-package iscroll
- :ensure t
- :diminish)
- (with-eval-after-load "gnus-art"
- (add-hook 'gnus-article-mode-hook #'iscroll-mode))
- (with-eval-after-load "eww"
- (add-hook 'eww-mode-hook #'iscroll-mode))
- (with-eval-after-load "notmuch-show"
- (add-hook 'notmuch-show-mode #'iscroll-mode))
- #+end_src
-* ednc
- #+begin_src emacs-lisp
- (use-package ednc
- :ensure t
- :diminish)
-
- (use-package jao-ednc
- :after ednc
- :commands (jao-ednc-setup)
- :config
- (jao-ednc-ignore-app "Spotify")
- (jao-ednc-ignore-app "NetworkManager")
- (defhydra jao-hydra-ednc (:color blue)
- "Notifications"
- ("s" jao-ednc-show "show last")
- ("d" jao-ednc-dismiss "dismiss last")
- ("D" jao-ednc-dismiss-all "dismiss all")
- ("i" jao-ednc-invoke-last-action "invoke last action")
- ("n" jao-ednc-pop "show all")))
- #+end_src
-* erc
-*** Package
- #+begin_src emacs-lisp
- (use-package erc
- :init
- (setq erc-modules
- '(autojoin
- button
- dcc
- fill
- irccontrols
- match
- move-to-prompt
- netsplit
- networks
- noncommands
- notify
- pcomplete
- ring
- services
- stamp
- track
- truncate))
-
- (setq erc-auto-query 'bury
- erc-autojoin-channels-alist `(("libera.chat" ,@jao-libera-channels))
- erc-away-nickname "jao"
- erc-button-buttonize-nicks t
- erc-common-server-suffixes '(("libera.chat$" . "lb"))
- erc-current-nick-highlight-type 'nick-or-keyword
- erc-email-userid (car jao-mails)
- erc-fill-column 84
- erc-fill-prefix " "
- erc-format-nick-function 'erc-format-@nick
- erc-header-line-face-method t
- erc-header-line-format nil ;; "%l %o"
- erc-header-line-uses-tabbar-p nil
- erc-hide-list '("JOIN" "PART" "QUIT")
- erc-hide-timestamps nil
- erc-input-line-position -1
- erc-insert-timestamp-function 'erc-insert-timestamp-right
- erc-join-buffer 'bury
- erc-kill-buffer-on-part t
- erc-kill-queries-on-quit t
- erc-log-channels-directory nil
- erc-mode-line-away-status-format "(a)"
- erc-mode-line-format "%t"
- erc-nick "jao"
- erc-notice-highlight-type 'all
- erc-notice-prefix "- "
- erc-notify-signoff-hook 'erc-notify-signoff
- erc-notify-signon-hook 'erc-notify-signon
- erc-pcomplete-nick-postfix ","
- erc-rename-buffers t
- erc-server-send-ping-timeout 60
- erc-prompt ":"
- erc-prompt-for-nickserv-password nil
- erc-use-auth-source-for-nickserv-password t
- erc-prompt-for-password nil
- erc-public-away-p t
- erc-server "irc.libera.chat"
- erc-server-coding-system '(utf-8 . undecided)
- erc-server-reconnect-attempts 10
- erc-server-reconnect-timeout 10
- erc-timestamp-format "%H:%M"
- erc-timestamp-only-if-changed-flag t
- erc-timestamp-right-column 84
- erc-user-full-name "https://jao.io"
- erc-user-mode "+i"
- erc-whowas-on-nosuchnick t)
-
- :config
-
- (define-minor-mode ncm-erc-mode "" nil
- (:eval (format " [%s]" (hash-table-count erc-channel-users))))
-
- (add-hook 'erc-mode-hook (lambda () (ncm-erc-mode 1)))
- (add-hook 'erc-mode-hook (lambda () (auto-fill-mode -1))))
- #+end_src
-*** No angles
- #+begin_src emacs-lisp
- (defun jao-erc--no-angles (old-func &rest args)
- (let ((msg (apply old-func args)))
- (replace-regexp-in-string "^<\\([^>]+\\)>" "(\\1)" msg)))
-
- (with-eval-after-load "erc"
- (modify-syntax-entry ?\( "." erc-mode-syntax-table)
- (modify-syntax-entry ?\) "." erc-mode-syntax-table)
- (advice-add 'erc-format-privmessage :around #'jao-erc--no-angles)
- (advice-add 'erc-format-my-nick :around #'jao-erc--no-angles))
- #+end_src
-*** Tracking
- #+begin_src emacs-lisp
- (defun jao-erc-track-shorten (names)
- (let ((names (erc-track-shorten-names names)))
- (mapcar (lambda (n) (string-remove-prefix "#" n)) names)))
-
- (setq erc-track-exclude-server-buffer t
- erc-track-exclude-types '("NICK" "JOIN" "PART" "QUIT" "MODE" "KICK")
- erc-track-remove-disconnected-buffers t
- erc-track-shorten-aggressively t ;; 'max
- erc-track-shorten-function #'jao-erc-track-shorten
- erc-track-switch-direction 'importance
- erc-track-visibility nil ;; t all, nil only selected frame
- erc-track-position-in-mode-line nil
- erc-track-enable-keybindings nil ;; 'ask
- erc-track-faces-priority-list '(erc-error-face
- erc-current-nick-face
- erc-pal-face
- erc-direct-msg-face
- erc-nick-msg-face
- erc-default-face
- erc-action-face
- erc-notice-face))
- (defun jao-track-erc-buffers ()
- (dolist (e erc-modified-channels-alist)
- (tracking-add-buffer (car e) (list (cddr e)))))
-
- (with-eval-after-load "erc-track"
- (require 'tracking nil t)
- (add-hook 'exwm-workspace-switch-hook #'erc-modified-channels-update)
- (add-hook 'erc-track-list-changed-hook #'jao-track-erc-buffers))
-
- (jao-shorten-modes 'erc-mode)
- (jao-tracking-faces 'erc-error-face
- 'erc-pal-face
- 'erc-current-nick-face
- 'erc-direct-msg-face)
- #+end_src
-*** Commands (/recover &co.)
- #+begin_src emacs-lisp
- (defun erc-cmd-RECOVER (&rest ignore)
- "Recover nick"
- (let ((fn (jao--get-user/password "freenode")))
- (erc-cmd-MSG (format "nickserv IDENTIFY %s %s" (car fn) (cadr fn)))
- (erc-cmd-MSG (format "nickserv GHOST %s" (car fn)))
- (erc-cmd-MSG (format "nickserv RELEASE %s" (car fn)))
- (erc-cmd-NICK (car fn))))
- #+end_src
-*** Startup
- #+begin_src emacs-lisp
- (defun jao-erc (&optional yes)
- (interactive "P")
- ;; (when (or yes (y-or-n-p "Connect to bitlbee using ERC? "))
- ;; (erc-select :server "localhost"))
- (when (or yes (y-or-n-p "Connect to libera using ERC? "))
- (erc-select :server "irc.libera.chat")))
- #+end_src
-* git helpers
- #+begin_src emacs-lisp
-
- (use-package github-review
- :ensure t
- :config
- (defun jao-gnus-github-review ()
- (interactive)
- (gnus-summary-select-article-buffer)
- (goto-char (point-min))
- (when (re-search-forward "https://github\.com/.*/pull/.*" nil t)
- (let ((url (match-string-no-properties 0)))
- (when (yes-or-no-p (format "Start review for %s" url))
- (github-review-start url)))))
- (eval-after-load "gnus-art"
- '(progn
- (define-key gnus-summary-mode-map "\C-cG" 'jao-gnus-github-review)
- (define-key gnus-article-mode-map "\C-cG" 'jao-gnus-github-review)))
-
- (jao-transient-major-mode github-review
- ["Review"
- ("a" "Approve" github-review-approve)
- ("r" "Reject" github-review-reject)
- ("c" "Comment" github-review-reject)]
- ["Quit"
- ("Q" "Bury buffer" bury-buffer)
- ("k" "Kill buffer" kill-buffer)]))
-
- #+end_src
-* cape
- #+begin_src emacs-lisp
- (use-package cape
- :ensure t
- ;; Bind dedicated completion commands
- :bind (("C-c p p" . completion-at-point) ;; capf
- ("C-c p t" . complete-tag) ;; etags
- ("C-c p d" . cape-dabbrev) ;; or dabbrev-completion
- ("M-/" . cape-dabbrev)
- ("C-c p f" . cape-file)
- ("C-c p k" . cape-keyword)
- ("C-c p s" . cape-symbol)
- ("C-c p a" . cape-abbrev)
- ("C-c p i" . cape-ispell)
- ("C-c p l" . cape-line)
- ("C-c p w" . cape-dict))
- :init
- ;; Add `completion-at-point-functions', used by `completion-at-point'.
- (add-to-list 'completion-at-point-functions #'cape-file)
- ;; (add-to-list 'completion-at-point-functions #'cape-dabbrev)
- ;; (add-to-list 'completion-at-point-functions #'cape-keyword)
- ;;(add-to-list 'completion-at-point-functions #'cape-abbrev)
- ;;(add-to-list 'completion-at-point-functions #'cape-ispell)
- ;;(add-to-list 'completion-at-point-functions #'cape-dict)
- ;;(add-to-list 'completion-at-point-functions #'cape-symbol)
- ;;(add-to-list 'completion-at-point-functions #'cape-line)
- )
- #+end_src
-* vertico
- #+begin_src emacs-lisp
- (use-package vertico-repeat
- :after vertico
- :config (add-hook 'minibuffer-setup-hook #'vertico-repeat-save)
- :bind (("M-R" . vertico-repeat)))
-
- (use-package vertico-buffer
- :after vertico
- :init
- (setq vertico-buffer-display-action
- '(display-buffer-at-bottom (window-height . ,(+ 3 vertico-count))))
- (vertico-buffer-mode -1))
-
- (use-package vertico
- :ensure t
- :init
- (setq vertico-count 10
- vertico-cycle t
- vertico-resize t
- org-refile-use-outline-path t
- resize-mini-windows t)
-
- :config
-
- (defun jao-vertico--display-candidates (lines)
- (move-overlay vertico--candidates-ov (point-min) (point-min))
- (overlay-put vertico--candidates-ov 'after-string (apply #'concat lines))
- (vertico--resize-window (length lines)))
-
- (advice-add 'vertico--display-candidates
- :override #'jao-vertico--display-candidates))
-
- (use-package vertico-directory
- :after vertico
- :bind (:map vertico-map (("RET" . vertico-directory-enter)
- ("M-<backspace>" . vertico-directory-delete-word)
- ("<backspace>" . vertico-directory-delete-char))))
-
- ;; (vertico-mode)
-
- #+end_src
-* orderless
- #+begin_src emacs-lisp
- (defun orderless--strict-*-initialism (component &optional anchored)
- (orderless--separated-by
- '(seq (zero-or-more alpha) word-end (zero-or-more (not alpha)))
- (cl-loop for char across component collect `(seq word-start ,char))
- (when anchored '(seq (group buffer-start) (zero-or-more (not alpha))))
- (when (eq anchored 'both)
- '(seq (zero-or-more alpha) word-end (zero-or-more (not alpha)) eol))))
-
- (defun orderless-strict-initialism (component)
- (orderless--strict-*-initialism component))
-
- (defun orderless-strict-leading-initialism (component)
- (orderless--strict-*-initialism component 'start))
-
- (defun orderless-strict-full-initialism (component)
- (orderless--strict-*-initialism component 'both))
-
- (defun jao-orderless--dispatch (pattern index _total)
- (cond ((and (zerop index) (string-prefix-p "-" pattern))
- `(orderless-strict-full-initialism . ,(substring pattern 1)))
- ((string-suffix-p "%" pattern)
- `(orderless-regexp . ,(substring pattern 0 -1)))
- ((string-equal "!" pattern)
- '(orderless-literal . ""))
- ((string-prefix-p "!" pattern)
- `(orderless-without-literal . ,(substring pattern 1)))))
- (setq orderless-style-dispatchers '(jao-orderless--dispatch))
-
- #+end_src
-* embark
-*** prompt format
- #+begin_src emacs-lisp
- (defvar jao-embark--brx
- "^\\(\\([^ ] \\)+\\|RET\\|TAB\\|SPC\\)\\( *\\)\\([^ ]+ +\\)\\(.*\\)$")
-
- (defun jao-embark--cmp (x y)
- (let* ((lxk (get-text-property 0 'kbd x))
- (lyk (get-text-property 0 'kbd y)))
- (if (= lxk lyk) (string< x y) (< lxk lyk))))
-
- (defun jao-embark--cmd-doc (cmd)
- (propertize (car (split-string (or (embark--function-doc cmd) "") "\n"))
- 'face 'embark-verbose-indicator-documentation))
-
- (defun jao--max-len (strs)
- (seq-reduce (lambda (m x) (max m (length x))) strs 0))
-
- (cl-defun jao-embark--other (&key shadowed-targets &allow-other-keys)
- (propertize (format "%s" (or shadowed-targets ""))
- 'face 'embark-verbose-indicator-shadowed))
-
- (cl-defun jao-embark--bindings (&key bindings &allow-other-keys)
- (let* ((cmds (mapcar #'caddr bindings))
- (docs (mapcar #'jao-embark--cmd-doc cmds))
- (keys (mapcar (lambda (b)
- (propertize (car (last b))
- 'face 'embark-keybinding))
- bindings))
- (cmds (mapcar (lambda (b)
- (propertize (cadr b) 'face 'embark-command))
- bindings))
- (fmt (format "%%-%ds %%-%ds %%s\n"
- (jao--max-len cmds) (jao--max-len keys)))
- (res (seq-mapn (lambda (c k d)
- (let ((n (if (string-prefix-p "embark-" c)
- 10
- (length k))))
- (propertize (format fmt c k d) 'kbd n)))
- cmds keys docs)))
- (apply #'concat (seq-sort #'jao-embark--cmp res))))
-
- (setq embark-verbose-indicator-buffer-sections
- '(jao-embark--bindings "\n" target " " jao-embark--other))
- #+end_src
-* window config persistence
- #+begin_src emacs-lisp
- (use-package bookmark-view
- :ensure t
- :bind (("C-c v" . bookmark-view)
- ("C-c B" . bookmark-set)))
-
- #+end_src
-* notmuch
- #+begin_src emacs-lisp
- (defun jao-notmuch--show-hidden-html ()
- (when (save-excursion
- (goto-char (point-min))
- (re-search-forward "^\\[ text/html (hidden) \\]" nil t))
- (jao-notmuch--toggle-mime)))
-
- (defun jao-notmuch-show-prefer-html ()
- (add-hook 'notmuch-show-hook #'jao-notmuch--show-hidden-html))
-
- #+end_src
-* link-hint for w3m
- #+begin_src emacs-lisp
- (defun jao-link-hint--notmuch-next-url (&optional bound)
- (link-hint--next-property 'w3m-href-anchor bound))
-
- (defun jao-link-hint--notmuch-url-at-point ()
- (get-text-property (point) 'w3m-href-anchor))
-
- (link-hint-define-type 'notmuch-w3m-url
- :next #'jao-link-hint--notmuch-next-url
- :at-point-p #'jao-link-hint--notmuch-url-at-point
- :vars '(notmuch-show-mode)
- :open #'browse-url
- :open-multiple t
- :copy #'kill-new)
-
- (push 'link-hint-notmuch-w3m-url link-hint-types)
-
- #+end_src
-* spotify
- Access to spotify uses packages tangled from [[./lib/media/espotify.org][espotify.org]], which
- offers functionality tailored to the completion engines at hand:
- #+begin_src emacs-lisp
- (jao-load-path "espotify")
-
- (use-package espotify
- :demand t
- :init (setq espotify-service-name "mopidy"))
- (use-package consult-spotify :demand t)
- (defalias 'jao-streaming-album #'consult-spotify-album)
- (defalias 'jao-streaming-track #'consult-spotify-track)
- (defalias 'jao-streaming-artist #'consult-spotify-artist)
- (defalias 'jao-streaming-playlist #'consult-spotify-playlist)
-
- (jao-def-exec-in-term "ncmpcpp" "ncmpcpp" (jao-afio--goto-scratch))
-
- (use-package jao-spt
- :demand t
- :config
- (defun jao-spt-setup-aliases ()
- (setq espotify-play-uri-function #'jao-spt-play-uri)
- (defalias 'jao-streaming-list #'jao-term-spt)
- (defalias 'jao-streaming-lyrics #'jao-spt-show-lyrics)
- (defalias 'jao-streaming-toggle #'jao-spt-toggle)
- (defalias 'jao-streaming-next #'jao-spt-next)
- (defalias 'jao-streaming-prev #'jao-spt-previous)
- (defalias 'jao-streaming-current #'jao-spt-echo-current)
- (defalias 'jao-streaming-seek #'jao-spt-seek)
- (defalias 'jao-streaming-seek-back #'jao-spt-seek-back)
- (defalias 'jao-streaming-volume #'jao-spt-vol)
- (defalias 'jao-streaming-volume-down #'jao-spt-vol-down)
- (defalias 'jao-streaming-like #'jao-spt-like)
- (defalias 'jao-streaming-dislike #'jao-spt-dislike)))
-
- (defvar jao-spt-on nil)
- (defun jao-spt-on-p () jao-spt-on)
- ;; (jao-spt-setup-aliases)
-
- (jao-def-exec-in-term "spt" "spt" (jao-afio--goto-scratch-1))
-
- (defun jao-streaming-toggle-player ()
- (interactive)
- (if jao-spt-on
- (let ((player (completing-read "Player: "
- '( "chromium" "mopidy" "firefox"
- "spotify")
- nil nil nil nil jao-mpris-player)))
- (setq jao-mpris-player player)
- (jao-mpris-setup-aliases))
- (jao-spt-setup-aliases))
- (message "%s activated "
- (if (setq jao-spt-on (not jao-spt-on)) "spt" "mpris")))
-
- (transient-define-prefix jao-transient-streaming ()
- [:description
- (lambda () (format "Streaming using %s"
- (if jao-spt-on "spt" "MPRIS")
- (if jao-spt-on "" jao-mpris-player)))
- ["Search"
- ("a" "album" jao-streaming-album)
- ("A" "artist" jao-streaming-artist)
- ("t" "track" jao-streaming-track)
- ("P" "playlist" jao-streaming-playlist)]
- ["Play"
- ("s" "toggle" jao-streaming-toggle)
- ("n" "next" jao-streaming-next)
- ("p" "previous" jao-streaming-prev)]
- ["Seek & shout"
- ("f" "seek fwd" jao-streaming-seek :transient t)
- ("F" "seek bwd" jao-streaming-seek-back :transient t)
- ("u" "up" jao-streaming-volume :transient t)
- ("d" "down" jao-streaming-volume-down :transient t)]
- ["Browse"
- ("l" "playing list" jao-streaming-list)
- ("L" "lyrics" jao-streaming-lyrics)
- ("w" "currently playing" jao-streaming-current)
- ("T" "toggle player" jao-streaming-toggle-player)]
- ["Act"
- ("k" "like" jao-streaming-like)
- ("K" "dislike" jao-streaming-dislike)
- ("S" "toggle shuffling" jao-spt-toggle-shuffle :if jao-spt-on-p)]])
- #+end_src
-* gnus
-*** gnus maildirs
- #+begin_src emacs-lisp
- (defvar jao-gnus-use-maildirs nil)
-
- (when jao-gnus-use-maildirs
- (defun jao-gnus--maildir (dir)
- (let ((root (concat "/tmp/mboxes/" dir "/"))
- (config (concat "~/.notmuch-config-" dir)))
- (add-to-list
- 'gnus-secondary-select-methods
- `(nnmaildir ,dir (directory ,root)
- (gnus-search-engine gnus-search-notmuch
- (remove-prefix ,root)
- (config-file ,config))))))
- (jao-gnus--maildir "jao")
- (jao-gnus--maildir "feeds")
- (jao-gnus--maildir "bigml"))
-
- #+end_src
-*** gnus spam
- #+begin_src emacs-lisp :tangle no
- (setq jao-gnus-ham-groups ".*\\(bigml\\|jao\\|feeds\\)\\..*"
- gnus-spam-process-destinations `((,jao-gnus-ham-groups "nnml:spam"))
- gnus-spam-newsgroup-contents
- `((".*spam.*" gnus-group-spam-classification-spam)
- (,jao-gnus-ham-groups gnus-group-spam-classification-ham))
- gnus-ham-process-destinations
- '((".*\\(jao\\|feeds\\)\\..*" "jao.inbox")
- (".*bigml\\..*" "bigml.inbox"))
- gnus-spam-process-newsgroups
- `((,jao-gnus-ham-groups ((spam spam-use-bogofilter)
- (ham spam-use-bogofilter)
- (spam spam-use-spamassassin)
- (ham spam-use-spamassassin)
- (spam spam-use-blacklist)))
- ("nnml:spam" ((ham spam-use-blacklist)
- (spam spam-use-bogofilter)
- (ham spam-use-bogofilter))))
- spam-use-blacklist t
- spam-use-BBDB nil
- spam-use-bogofilter t
- spam-use-spamassassin nil
- spam-spamassassin-program "spamc"
- spam-split-group "spam")
-
- ;; (spam-initialize)
- #+end_src
-* snippets
- #+begin_src emacs-lisp
- (defun jao-minibuffer--text-with-padding (text)
- "Return TEXT with padding on the left."
- (let* ((len (+ (string-pixel-width text)
- (string-pixel-width jao-minibuffer-right-margin)
- 10))
- (padding (propertize
- "-" 'display
- `(space :align-to (- (+ right right-margin) (,len))))))
- (concat padding text jao-minibuffer-right-margin)))
- #+end_src
-
- #+begin_src emacs-lisp
- ;; this is an ugly hack: when jao-minibuffer is active,
- ;; somehow docview scrolling is not triggering a refresh,
- ;; specially for scroll down movements, so we advice the
- ;; scrolling functions to force a redisplay by going to
- ;; another window.
- (defun jao--refresh (&rest _rest)
- (let ((jao-minibuffer-mode nil))
- (other-window 1) (other-window -1)))
-
- (dolist (f '(image-forward-hscroll
- image-backward-hscroll
- image-scroll-down
- image-scroll-up
- image-eol
- image-bol))
- (advice-add f :after #'jao--refresh))
-
- ;; (dolist (f '(doc-view-scroll-up-or-next-page
- ;; doc-view-scroll-down-or-previous-page
- ;; doc-view-previous-line-or-previous-page
- ;; doc-view-next-line-or-next-page
- ;; image-forward-hscroll
- ;; image-backward-hscroll
- ;; image-scroll-down
- ;; image-scroll-up
- ;; image-eol
- ;; image-bol))
- ;; (advice-add f :after #'jao--refresh))
-
- ;; (dolist (f '(pdf-view-scroll-up-or-next-page
- ;; pdf-view-scroll-down-or-previous-page
- ;; pdf-view-previous-line-or-previous-page
- ;; pdf-view-next-line-or-next-page))
- ;; (advice-add f :after #'jao--refresh))
- #+end_src
diff --git a/attic/w3m.org b/attic/net/w3m.org
index 3689c8e..3689c8e 100644
--- a/attic/w3m.org
+++ b/attic/net/w3m.org