Creating multiple general leader keys per mode, doesn't work. Instead, I need to re-use the _local leader_ but add the keymap during the definition.
		
			
				
	
	
		
			177 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Org Mode
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Org Mode
		
	
	
	
	
	
| #+TITLE:  Auxillary and Optional Applications
 | ||
| #+AUTHOR: Howard X. Abrams
 | ||
| #+DATE:   2021-11-18
 | ||
| 
 | ||
| A literate programming file for helper apps in Emacs.
 | ||
| 
 | ||
| #+begin_src emacs-lisp :exports none
 | ||
|   ;;; ha-aux-apps --- Configuring helper apps in Emacs. -*- lexical-binding: t; -*-
 | ||
|   ;;
 | ||
|   ;; © 2021-2023 Howard X. Abrams
 | ||
|   ;;   Licensed under a Creative Commons Attribution 4.0 International License.
 | ||
|   ;;   See http://creativecommons.org/licenses/by/4.0/
 | ||
|   ;;
 | ||
|   ;; Author: Howard X. Abrams <http://gitlab.com/howardabrams>
 | ||
|   ;; Maintainer: Howard X. Abrams
 | ||
|   ;; Created: November 18, 2021
 | ||
|   ;;
 | ||
|   ;; This file is not part of GNU Emacs.
 | ||
|   ;;
 | ||
|   ;; *NB:* Do not edit this file. Instead, edit the original literate file at:
 | ||
|   ;;            ~/other/hamacs/ha-aux-apps.org
 | ||
|   ;;       And tangle the file to recreate this one.
 | ||
|   ;;
 | ||
|   ;;; Code:
 | ||
|   #+end_src
 | ||
| * Introduction
 | ||
| The following applications are not needed. I alternate between trying to /stay in Emacs/ taking advantage of the consistent interface, and using a stand-alone app on my Workday computer.
 | ||
| * Twitter
 | ||
| The venerable [[https://github.com/hayamiz/twittering-mode/tree/master][twittering-mode]] allows me to follow all the twits.
 | ||
| 
 | ||
| #+begin_src emacs-lisp
 | ||
|   (use-package twittering-mode
 | ||
|     :init
 | ||
|     (setq twittering-use-master-password t
 | ||
|           epa-pinentry-mode 'loopback)
 | ||
|     :config
 | ||
|     (defalias 'epa--decode-coding-string 'decode-coding-string)
 | ||
|     (ha-leader "a t" '("twitter" . twit)))
 | ||
| #+end_src
 | ||
| * Mastodon
 | ||
| Glad to see the 2FA feature is working on the [[https://codeberg.org/martianh/mastodon.el][mastodon.el]] project, and even more glad to see the great birdland diaspora arrive in the land of the toots.
 | ||
| #+begin_src emacs-lisp
 | ||
|   (use-package mastodon
 | ||
|     :straight (:host codeberg :repo "martianh/mastodon.el")
 | ||
|     :init
 | ||
|     (setq mastodon-instance-url "https://emacs.ch"
 | ||
|           mastodon-active-user "howard"))
 | ||
| #+end_src
 | ||
| 
 | ||
| I would like a dedicate perspective to Mastodon, and I would like a leader key sequence that /expands/ will all options, once Mastodon is running in its own perspective:
 | ||
| #+begin_src emacs-lisp
 | ||
|   (use-package mastodon
 | ||
|     :config
 | ||
|     (defun mastodon-perspective ()
 | ||
|       (interactive)
 | ||
|       (let ((already-tooted? (seq-contains-p
 | ||
|                               (persp-names) "mastodon" 'equal)))
 | ||
|         (persp-switch "mastodon")
 | ||
|         (unless already-tooted?
 | ||
|           (ha-local-leader :keymaps 'mastodon-mode-map
 | ||
|             ;; "," '("thread" . mastodon-tl--thread)
 | ||
|             "t" '("toot" . mastodon-toot)
 | ||
|             "u" '("update" . mastodon-tl--update)
 | ||
|             "f" '("favorite" . mastodon-toot--toggle-favourite)
 | ||
|             "b" '("boost" . mastodon-toot--toggle-boost)
 | ||
|             "r" '("reply" . mastodon-toot--reply)
 | ||
|             "s" '("share" . mastodon-toot--copy-toot-url)
 | ||
|             "y" '("copy text" . mastodon-toot--copy-toot-text)
 | ||
|             "d" '("discover" . mastodon-discover))
 | ||
|           (my-mastodon-start))))
 | ||
| 
 | ||
|     (ha-leader
 | ||
|       "a m" '("mastodon" . mastodon-perspective)))
 | ||
| #+end_src
 | ||
| 
 | ||
| Starting the =mastodon= perspective, I set some initial windows:
 | ||
| #+begin_src emacs-lisp
 | ||
|   (defun my-mastodon-start ()
 | ||
|     "Configure the window placement for a Mastodon Instance."
 | ||
|     (let ((default-directory (getenv "HOME")))
 | ||
|       (mastodon)
 | ||
|       (switch-to-buffer "*mastodon-home*")
 | ||
|       (split-window-right)
 | ||
|       (mastodon-tl--get-local-timeline)
 | ||
|       (switch-to-buffer "*mastodon-local*")))
 | ||
| #+end_src
 | ||
| * Telega
 | ||
| I'm thinking the [[https://zevlg.github.io/telega.el/][Telega package]] would be better than Bitlbee for Telegram communication.
 | ||
| #+begin_src emacs-lisp
 | ||
|   (use-package telega
 | ||
|       :commands (telega)
 | ||
|       :init
 | ||
|       (setq telega-use-images nil)
 | ||
|       :config
 | ||
|       (ha-leader "a T" 'telega))
 | ||
| #+end_src
 | ||
| For some reason, you need [[https://github.com/Fanael/rainbow-identifiers][rainbow-identifiers]] to work, oh, I guess the docs state this.
 | ||
| * Matrix/Element
 | ||
| Yet another encrypted chat/VoIP client-server, but unlike Signal and Telegram, [[matrix.org][Matrix]] is act ually open source. In other words, a project for nerds. We’ll be using Alphapapa’s latest [[https://github.c om/alphapapa/ement.el][ement]] project.
 | ||
| #+begin_src emacs-lisp
 | ||
|   (use-package ement
 | ||
|     :straight (:host github :repo "alphapapa/ement.el")
 | ||
|     :config
 | ||
|     (defun ha-ement-connect ()
 | ||
|       (interactive)
 | ||
|       (let* ((auth-results (auth-source-search :host "howardism-matrix"))
 | ||
|              (auth-first   (first auth-results))
 | ||
|              (username     (plist-get auth-first :user))
 | ||
|              (password     (funcall (plist-get auth-first :secret))))
 | ||
|         (ement-connect :user-id username
 | ||
|                        :password password
 | ||
|                        :uri-prefix "https://howardism.org"))
 | ||
| 
 | ||
|       (ha-leader
 | ||
|           "a x S" '("send" . ement-send-direct-message)
 | ||
|           "a x s" '("send" . ement-room-send-message)
 | ||
|           "a x c" '("compose" . ement-room-compose-message)
 | ||
|           "a x r" '("room" . ement-view-room)
 | ||
|           "a x d" '("discover" . mastodon-discover)))
 | ||
| 
 | ||
|     (ha-leader
 | ||
|       "a x"   '(:ignore t :which-key "matrix")
 | ||
|       "a x x" '("connect" . ha-ement-connect)
 | ||
|       "a x s" '("send" . ement-send-direct-message)))
 | ||
| #+end_src
 | ||
| 
 | ||
| Perhaps we can make it more attractive:
 | ||
| #+begin_src emacs-lisp
 | ||
|   (use-package ement
 | ||
|     :hook (ement-room-mode . ha-textual-litagures)
 | ||
|     :init
 | ||
|     (setq ement-save-sessions t
 | ||
|           ement-room-send-message-filter 'ement-room-send-org-filter))
 | ||
| #+end_src
 | ||
| * RPG DM
 | ||
| Been working on my [[https://gitlab.com/howardabrams/emacs-rpgdm][RPG DM project]] for getting Emacs helping as a /Dungeon Master's Assistant/. The idea is to be able to roll dice and whatnot. What I find most useful is the [[https://gitlab.com/howardabrams/emacs-rpgdm/-/blob/main/rpgdm-tables.el][random tables]].
 | ||
| #+begin_src emacs-lisp
 | ||
|   (when (f-directory? "~/other/rpgdm")
 | ||
|     (use-package rpgdm
 | ||
|       :straight (:local-repo "~/other/rpgdm")
 | ||
|       :commands (rpgdm-mode rpgdm-tables-load)
 | ||
|       :init (setq rpgdm-base (expand-file-name "~/other/rpgdm"))
 | ||
|       :config (ha-leader "t D" '("rpg dm" . rpgdm-mode))))
 | ||
| #+end_src
 | ||
| 
 | ||
| And my [[https://gitlab.com/howardabrams/emacs-ironsworn][new Ironsworn project]] expands on it, giving me both the Oracles and the Moves. With an Org file, I can easily play Solo:
 | ||
| #+begin_src emacs-lisp
 | ||
|   (when (f-directory? "~/other/emacs-ironsworn")
 | ||
|     (use-package rpgdm-ironsworn
 | ||
|       :after rpgdm
 | ||
|       :straight (:local-repo "~/other/emacs-ironsworn")
 | ||
|       :init
 | ||
|       (setq rpgdm-ironsworn-project (expand-file-name "~/other/emacs-ironsworn")
 | ||
|             ;; Ignore org links that call my RPG functions:
 | ||
|             org-link-elisp-skip-confirm-regexp (rx string-start (optional "(") "rpgdm-"
 | ||
|                                                    (or "tables-" "ironsworn-")
 | ||
|                                                    (one-or-more any)))))
 | ||
| #+end_src
 | ||
| The project is interesting, and I should record a tutorial how to use it.
 | ||
| * Technical Artifacts                                :noexport:
 | ||
| Let's =provide= a name so we can =require= this file:
 | ||
| 
 | ||
| #+begin_src emacs-lisp :exports none
 | ||
|   (provide 'ha-aux-apps)
 | ||
|   ;;; ha-aux-apps.el ends here
 | ||
|   #+end_src
 | ||
| 
 | ||
| #+DESCRIPTION: A literate programming file for helper apps in Emacs.
 | ||
| 
 | ||
| #+PROPERTY:    header-args:sh :tangle no
 | ||
| #+PROPERTY:    header-args:emacs-lisp  :tangle yes
 | ||
| #+PROPERTY:    header-args    :results none :eval no-export :comments no mkdirp yes
 | ||
| 
 | ||
| #+OPTIONS:     num:nil toc:nil todo:nil tasks:nil tags:nil date:nil
 | ||
| #+OPTIONS:     skip:nil author:nil email:nil creator:nil timestamp:nil
 | ||
| #+INFOJS_OPT:  view:nil toc:nil ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js
 |