Compare commits

..

1 commit

Author SHA1 Message Date
Howard Abrams
6ea9cc0134 Convert from straight to built-in package-vc
While I now have a dependency on Emacs 30, the new feature to be able
to install code from either *ELPA or a Git repository, is really nice.
2026-10-20 15:35:23 -07:00
28 changed files with 138 additions and 286 deletions

View file

@ -134,16 +134,11 @@ After Emacs is /kinda/ working, make sure you install *all* the fonts, that is:
M-x nerd-icons-install-fonts
#+end_example
Everything golden?
Everything golden? Great. Want to upgrade all the packages?
#+begin_example
M-x elpaca-write-lock-file
M-x package-upgrade-all
#+end_example
Before we can build a Telegram server for [[file:ha-aux-apps.org::*Telega][Telega]], we need to install the /latest/ version:
#+begin_src sh
brew unlink tdlib # optional
brew install tdlib --HEAD
#+end_src
* Supporting Packages
Now install all the extras:
#+begin_src sh

View file

@ -8,7 +8,9 @@ I’ve crafted my Emacs configuration, I cheekily call /hamacs/, in a literate p
The advantage to rolling yer own is I tend to /use/ what I add, leading to less bloat. In reality, this is more fun.
Using [[https://howardism.org/Technical/Emacs/literate-devops.html][literate programming]] for my Emacs configuration gives me an easy way to /share/ my code. Feel free to steal whatever you find interesting, as sharing makes our community great. Notice that functions and features I have written begin with =ha-=, but everything else is either /stock Emacs/ or a /package/ I download using [[https://github.com/progfolio/elpaca][Elpaca]] (see [[file:bootstrap.org][bootstrap]] for the details) and configure with [[https://github.com/jwiegley/use-package][use-package]] (see either [[https://ianyepan.github.io/posts/setting-up-use-package/][this introduction]] or [[https://www.emacswiki.org/emacs/UsePackage][this wiki page]] for those details)… meaning most blocks of code should work on its own.
Using [[https://howardism.org/Technical/Emacs/literate-devops.html][literate programming]] for my Emacs configuration gives me an easy way to /share/ my code. Feel free to steal whatever you find interesting, as sharing makes our community great. Notice that functions and features I have written begin with =ha-=, but everything else is either /stock Emacs/ or a /package/ I download (see [[file:bootstrap.org][bootstrap]] for the details) and configure with the [[https://github.com/jwiegley/use-package][use-package]] macro (see either [[https://ianyepan.github.io/posts/setting-up-use-package/][this introduction]] or [[https://www.emacswiki.org/emacs/UsePackage][this wiki page]] for those details)… meaning most blocks of code should work on its own.
*Note:* I now require Emacs version 30, for a few packages can’t be automatically downloaded from an Emacs Package Archive (like ELPA or MELPA), and I take advantage of the new =:vc= feature of =use-package= to download those packages directly from their Git repository.
I’ve separated my configuration into /chapters/ around particular subjects, applications and programming languages. This feature allows you, dear reader, to jump our to items of interest, but allows me to /selectively load/ individual chapters. For instance, if I’m not doing much with Ruby at work, I can remove that chapter from the list in my [[file:bootstrap.org::*Load the Rest][bootstrap]]. I also don’t load my [[file:ha-display.org][UI configuration]] when I am using the Terminal (doesn’t happen much, actually).
@ -26,7 +28,7 @@ To create [[file:~/.emacs.d/init.el][~/.emacs.d/init.el]] which starts the proce
[[file:screenshots/dashboard-small.png]]
** Core Configuration
- [[file:bootstrap.org][Bootstrap]] :: explains how I use =elpaca= and loads basic libraries the rest of the code depends on. It then loads the following files in order.
- [[file:bootstrap.org][Bootstrap]] :: loads basic libraries the rest of the code depends on. It then loads the following files in order.
- [[file:ha-config.org][Configuration]] :: contains /most/ of my configuration, setting up my sequence key menus, evil, etc.
- [[file:ha-evil.org][Evilness]] :: configuration for using VI, er, ~vim~ keybindings in Emacs.
- [[file:ha-general.org][Leader]] :: using the ~SPC~ to kick off a hierarchical order of functions.

View file

@ -35,17 +35,6 @@ A literate programming file for bootstraping my Emacs Configuration.
#+end_src
* Introduction
This file contains all the variable definitions and library loading for the other files in my project.
I'm installing everything using [[https://github.com/progfolio/elpaca][Elpaca]] for package installation and management. This is initialization code configured in [[file:initialize][initialize]], and calls to =use-package= now accept an =:elpaca= parameter:
- =:elpaca nil= for packages that ship with Emacs (or live in my =elisp= directory)
- =:elpaca (:host github :repo "user/repo")= to retrieve special versions of some packages
- =:elpaca (:wait t)= to block until the package is installed and configured, necessary when later code needs one of its macros or =use-package= keywords
Without the keyword, =use-package= installs the package from the standard Elpaca menus (see =use-package-defaults= in [[file:initialize][initialize]]).
Elpaca installs packages /asynchronously/ and processes its queue /after/ Emacs reads the init file. This means a =use-package= body isn't evaluated until its package is installed, but top-level code (outside a =use-package= form) runs immediately. To keep my files loading in order, =ha-hamacs-load= calls =elpaca-wait= after each file.
* Initial Settings
** Garbage Collection Settings
GC has always been a contentious subject in Emacs. Lot less of an issue now, but let’s not slow the startup (any more than I already do by checking all the packages to see if anything new needs to be downloaded).
@ -113,7 +102,7 @@ Getting tired off all the packages that I load spewing a bunch of warnings that
The following packages come with Emacs, but seems like they still need loading:
#+begin_src emacs-lisp
(use-package cl-lib
:elpaca nil
:ensure nil
:init (defun first (elt) (car elt))
:commands (first))
@ -137,11 +126,6 @@ Manipulate file paths with the [[https://github.com/rejeep/f.el][f.el]] project:
(use-package f)
#+end_src
Since the rest of this file (and the files it loads) call these libraries, block until Elpaca has installed them:
#+begin_src emacs-lisp
(elpaca-wait)
#+end_src
The [[help:shell-command][shell-command]] function is useful, but having it split the output into a list is a helpful abstraction:
#+begin_src emacs-lisp
(defun shell-command-to-list (command)
@ -271,14 +255,11 @@ With this function, we can test/debug/reload any individual file, via:
(message ">>> %s" full-file)
(if (called-interactively-p)
(org-babel-load-file full-file)
(ignore-errors (org-babel-load-file full-file)))
(elpaca-wait))))
(ignore-errors (org-babel-load-file full-file))))))
#+end_src
Notice that when we call this function /non-interactively/ (e.g. from the Lisp function, =ha-hamacs-reload-all=), we suppress any errors. Obviously, I want to see the errors when calling interactively.
The call to =elpaca-wait= blocks until Elpaca has installed any packages the file requested, and evaluated the =use-package= bodies. Without it, the next file would load before this one’s packages (and the macros they define) were available.
** Tangling the Hamacs
And this similar function, will /tangle/ one of my files. Notice that in order to increase the speed of the tangling process (and not wanting to pollute a project perspective), I use a /temporary buffer/ instead of =find-file=.

View file

@ -32,14 +32,11 @@ Ethic issues aside, I’m [[https://technobabble.bearblog.dev/fine-ill-try-ai/][
Installing Xenodium’s [[https://github.com/xenodium/agent-shell][agent-shell]], requires his [[https://github.com/xenodium/acp.el][ACP package]] for accessing the installed [[https://agentclientprotocol.com/][ACP libraries]], and his [[https://github.com/xenodium/shell-maker][shell-maker]] package.
#+BEGIN_SRC emacs-lisp
(use-package acp
:elpaca (:host github :repo "xenodium/acp.el"))
(use-package acp)
(use-package shell-maker
:elpaca (:host github :repo "xenodium/shell-maker"))
(use-package shell-maker)
(use-package agent-shell
:elpaca (:host github :repo "xenodium/agent-shell")
:after acp
:custom
@ -69,7 +66,7 @@ I would like the /intern/ to notify me when it needs attention, so I noticed the
#+BEGIN_SRC emacs-lisp
(use-package knockknock
:elpaca (knockknock :host github :repo "konrad1977/knockknock")
:vc (:url "https://github.com/konrad1977/knockknock" :rev :newest)
:init
(setq knockknock-border-color "brown")
(setq knockknock-border-width 2)
@ -90,9 +87,8 @@ The configuration for [[https://github.com/zackattackz/agent-shell-notifications
#+BEGIN_SRC emacs-lisp
(use-package agent-shell-notifications
:elpaca (agent-shell-notifications
:host github
:repo "zackattackz/agent-shell-notifications")
:vc (:url "https://github.com/zackattackz/agent-shell-notifications" :rev :newest)
:after knockknock
:hook
;; Enable notifications in each agent-shell buffer
(agent-shell-mode . agent-shell-notifications-mode)
@ -133,7 +129,7 @@ Using the [[https://github.com/cmacrae/agent-shell-sidebar][agent-shell-sidebar]
#+BEGIN_SRC emacs-lisp
(use-package agent-shell-sidebar
:after agent-shell
:elpaca (:host github :repo "cmacrae/agent-shell-sidebar")
:vc (:url "https://github.com/cmacrae/agent-shell-sidebar" :rev :newest)
:bind (("s-i" . agent-shell-sidebar-toggle-focus)
("s-I" . agent-shell-sidebar-toggle)))
#+END_SRC
@ -223,8 +219,6 @@ And let’s make that the default now:
* Git and Magit
Can not live without [[https://magit.vc/][Magit]], a Git porcelain for Emacs. I stole the bulk of this work from Doom Emacs.
#+begin_src emacs-lisp
(use-package transient)
(use-package magit
;; See https://github.com/magit/magit/wiki/Emacsclient for why we need to set:
:custom (with-editor-emacsclient-executable "emacsclient")
@ -325,7 +319,6 @@ This project (and others) can use repeat mode, but
The [[https://scripter.co/using-git-delta-with-magit][magit-delta]] project uses [[https://github.com/dandavison/delta][git-delta]] for colorized diffs.
#+begin_src emacs-lisp
(use-package magit-delta
:ensure t
:hook (magit-mode . magit-delta-mode))
#+end_src
@ -409,8 +402,7 @@ The crucial parts of this helper function are that we "wash" the result using =a
The functions below depend on [[help:magit-thing-at-point][magit-thing-at-point]], and this depends on the [[https://sr.ht/~pkal/compat/][compat]] library, so let’s grab that stuff:
#+begin_src emacs-lisp :tangle no
(use-package compat
:elpaca (:host github :repo "emacs-straight/compat"))
(use-package compat)
(use-package magit-section
:commands magit-thing-at-point)
@ -505,8 +497,7 @@ Using the [[https://github.com/emacsmirror/gist][gist package]] to write code sn
The gist project depends on the [[https://github.com/sigma/gh.el][gh library]]. There seems to be a problem with it.
#+begin_src emacs-lisp :tangle no
(use-package gh
:elpaca (:host github :repo "sigma/gh.el"))
(use-package gh)
#+end_src
** Forge
@ -578,8 +569,7 @@ With the =gh= CLI working, we can install and use this project:
#+BEGIN_SRC emacs-lisp
(use-package magit-gh
:after magit
:elpaca (:host github :repo "jonathanchu/magit-gh"))
:after magit)
#+END_SRC
@ -641,7 +631,6 @@ Web pages look pretty good with EWW, but I'm having difficulty getting it to ren
#+begin_src emacs-lisp
(use-package eww
:elpaca nil
:init
(setq browse-url-browser-function 'eww-browse-url
browse-url-secondary-browser-function 'browse-url-default-browser
@ -713,7 +702,6 @@ Web pages look pretty good with EWW, but I'm having difficulty getting it to ren
This function allows Imenu to offer HTML headings in EWW buffers, helpful for navigating long, technical documents.
#+begin_src emacs-lisp :tangle no
(use-package eww
:elpaca nil
:config
(defun unpackaged/imenu-eww-headings ()
"Return alist of HTML headings in current EWW buffer for Imenu.
@ -741,7 +729,6 @@ Make my EWW browsers /look/ like an Org file with the [[https://github.com/cheny
#+begin_src emacs-lisp
(use-package shrface
:elpaca (:host github :repo "chenyanming/shrface")
:config
(shrface-basic)
;; (shrface-trial)
@ -759,7 +746,6 @@ The following connection to EWW throws errors now. Hrm.
#+begin_src emacs-lisp :tangle no
(use-package eww
:elpaca nil
:after shrface
:hook (eww-after-render #'shrface-mode))
#+end_src
@ -877,18 +863,18 @@ Instead I use Emacs' built-in directory lister (which accepts the standard, =dir
#+begin_src emacs-lisp
(use-package ls-lisp
:elpaca nil
:ensure nil
:config
(setq ls-lisp-use-insert-directory-program nil
dired-listing-switches
"-l --almost-all --human-readable --group-directories-first --no-group"))
#+end_src
And [[https://www.masteringemacs.org/article/dired-shell-commands-find-xargs-replacement][this article by Mickey Petersen]] convinced me to turn on the built-in =dired-x= (just have to tell [[file:bootstrap.org::*Introduction][Elpaca]] that knowledge):
And [[https://www.masteringemacs.org/article/dired-shell-commands-find-xargs-replacement][this article by Mickey Petersen]] convinced me to turn on the built-in =dired-x=:
#+begin_src emacs-lisp
(use-package dired-x
:elpaca nil)
:ensure nil)
#+end_src
The advantage of =dired-x= is the ability to have [[https://www.emacswiki.org/emacs/DiredExtra#Dired_X][shell command guessing]] when selecting one or more files, and running a shell command on them with ~!~ or ~&~.
@ -902,7 +888,6 @@ The [[https://github.com/alexluigit/dirvish][dirvish]] project aims to make a pr
I’m beginning with dirvish to use the [[https://github.com/alexluigit/dirvish/blob/main/docs/CUSTOMIZING.org][sample configuration]] and change it:
#+begin_src emacs-lisp :tangle no
(use-package dirvish
:elpaca (:host github :repo "alexluigit/dirvish")
:init (dirvish-override-dired-mode)
:custom

View file

@ -31,7 +31,6 @@ The following applications are not needed. I alternate between trying to /stay i
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
:elpaca (:host codeberg :repo "martianh/mastodon.el")
:init
(setq mastodon-instance-url "https://pdx.social"
mastodon-active-user "howard"))
@ -95,7 +94,6 @@ Let’s turn on non-fixed-width fonts to make everything easier to read:
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.com/alphapapa/ement.el][ement]] project.
#+begin_src emacs-lisp
(use-package ement
:elpaca (:host github :repo "alphapapa/ement.el")
:after major-mode-hydra
:config
(major-mode-hydra-define ement-room-mode (:quit-key "q")
@ -176,7 +174,7 @@ Been working on my [[https://gitlab.com/howardabrams/emacs-rpgdm][RPG DM project
#+begin_src emacs-lisp :tangle no
(when (f-directory? "~/src/emacs-rpgdm")
(use-package rpgdm
:elpaca nil
:ensure nil
:load-path "~/src/emacs-rpgdm"
:commands (rpgdm-mode rpgdm-tables-load)
:init (setq rpgdm-base (expand-file-name "~/src/emacs-rpgdm"))
@ -187,7 +185,7 @@ Working on my new replacement of my DM code:
#+begin_src emacs-lisp
(when (f-directory? "~/src/emacs-rpgtk")
(use-package rpgtk
:elpaca nil
:ensure nil
:load-path "~/src/emacs-rpgtk"
:after hydra
;; :commands (rpgtk-mode rpgtk-tables-load rpgtk-dice rpgtk-message)
@ -206,7 +204,7 @@ And my [[https://gitlab.com/howardabrams/emacs-ironsworn][new Ironsworn project]
(when (f-directory? "~/src/emacs-ironsworn")
(use-package rpgdm-ironsworn
:after rpgdm
:elpaca nil
:ensure nil
:load-path "~/src/emacs-ironsworn"
:init
(setq rpgdm-ironsworn-project (expand-file-name "~/src/emacs-ironsworn")
@ -241,7 +239,6 @@ And then the configuration:
#+BEGIN_SRC emacs-lisp
(use-package ready-player
:elpaca (:host github :repo "xenodium/ready-player")
:config
(when (eq system-type 'darwin)
(set-fontset-font t nil "SF Pro Display" nil 'append)

View file

@ -233,7 +233,6 @@ And for even quicker work, we can have special scripts tied to special keybindin
The [[https://gitlab.com/aimebertrand/org-mac-link][org-mac-link]] project makes it easy to tell Emacs to retrieve information from other apps, e.g. the URL of the opened tab in Firefox.
#+begin_src emacs-lisp
(use-package org-mac-link
:elpaca (:host gitlab :repo "aimebertrand/org-mac-link")
:config
(ha-leader "i" '("insert app info" . org-mac-link-get-link)))
#+end_src

View file

@ -144,9 +144,8 @@ And my copy of his code:
** Emacs Everywhere
After reading [[https://irreal.org/blog/?p=12139][Jon Sander’s essay]] as well as [[https://mbork.pl/2024-04-27_Emacs_everywhere][Marcin Borkowski's essay]], I decided to try out Tecosaur’s [[https://github.com/tecosaur/emacs-everywhere][Emacs Everywhere]] approach:
#+begin_src emacs-lisp :tangle no
(use-package emacs-everywhere
:elpaca (:host github :repo "tecosaur/emacs-everywhere"))
#+begin_src emacs-lisp
(use-package emacs-everywhere)
#+end_src
This package /called outside of Emacs/, so I bound a keybinding to iCanHazShortcut:
@ -229,7 +228,7 @@ When I push changes to my files to Gerrit and other code review, I don’t want
The [[https://www.emacswiki.org/emacs/RecentFiles][recentf]] feature has been in Emacs for a long time, but it has a problem with Tramp, as we need to turn off the cleanup feature that attempts to =stat= all the files and remove them from the =recent= accessed list if they are readable. The requires recentf to open up a remote files which blocks Emacs at the most inopportune times… like when trying to reboot the machine.
#+begin_src emacs-lisp
(use-package recentf
:elpaca nil
:ensure nil
:config
(setq recentf-auto-cleanup 'never) ;; disable before we start recentf!
(recentf-mode 1))
@ -338,14 +337,12 @@ This means (and I use this fairly often), that the /key/ is shows as a choice, t
The [[https://github.com/minad/vertico][vertico]] package puts the completing read in a vertical format, and like [[https://github.com/raxod502/selectrum#vertico][Selectrum]], it extends Emacs’ built-in functionality, instead of adding a new process. This means all these projects work together.
#+begin_src emacs-lisp
(use-package vertico
:elpaca (:files (:defaults "extensions/vertico-*.el"))
:config (vertico-mode))
#+end_src
My issue with Vertico is when calling =find-file=, the Return key opens =dired=, instead of inserting the directory at point. This extension ships with Vertico (see the =:files= recipe above), so we don’t install it separately:
My issue with Vertico is when calling =find-file=, the Return key opens =dired=, instead of inserting the directory at point. This package addresses this:
#+begin_src emacs-lisp
(use-package vertico-directory
:elpaca nil
:after vertico
:ensure nil
;; More convenient directory navigation commands
:bind (:map vertico-map
("RET" . vertico-directory-enter)
@ -386,7 +383,6 @@ How does it compare? Once upon a time, I enjoyed typing ~plp~ for =package-list-
#+begin_src emacs-lisp
(use-package fussy
;; :elpaca (:host github :repo "jojojames/fussy")
:config
(push 'fussy completion-styles)
(setq completion-category-defaults nil
@ -398,7 +394,6 @@ How does it compare? Once upon a time, I enjoyed typing ~plp~ for =package-list-
Persist history over Emacs restarts using the built-in [[https://www.emacswiki.org/emacs/SaveHist][savehist]] project. Since both Vertico and Selectrum sorts by history position, this should make the choice /smarter/ with time.
#+begin_src emacs-lisp
(use-package savehist
:elpaca nil
:init
(savehist-mode))
#+end_src
@ -453,7 +448,6 @@ Since I seldom remember keybindings, or even function names, for major-modes, I
#+begin_src emacs-lisp
(use-package major-mode-hydra
:elpaca (:wait t)
:bind ("s-," . major-mode-hydra)
:init
(defun major-mode-hydra-title (&optional mode)
@ -579,7 +573,6 @@ The [[https://github.com/minad/cape][Cape project]] deliver particular [[help:co
#+BEGIN_SRC emacs-lisp :tangle no
(use-package cape
:elpaca (:host github :repo "minad/cape")
:init
(setq completion-at-point-functions (list #'cape-emoji)))
#+END_SRC
@ -660,7 +653,6 @@ The [[https://www.emacswiki.org/emacs/AutoInsertMode][auto-insert]] feature is a
#+begin_src emacs-lisp
(use-package autoinsert
:elpaca nil
:init
(setq auto-insert-directory (expand-file-name "templates" user-emacs-directory))
;; Don't prompt before insertion:
@ -713,7 +705,7 @@ As I've mentioned [[http://www.howardism.org/Technical/Emacs/beep-for-emacs.html
'libnotify)))
(use-package beep
:elpaca nil ; Located in my "elisp" directory
:ensure nil
:hook (after-init . ha-random-startup-message)
:commands (beep-when-finished beep-when-run-too-long)
:config
@ -983,7 +975,6 @@ Since I wasn’t using all the features that [[https://github.com/bbatsov/projec
#+begin_src emacs-lisp
(use-package emacs
:elpaca nil
:config
(ha-leader
"p" '(:ignore t :which-key "projects")
@ -1100,7 +1091,6 @@ And some shortcut keys from the =general= project:
#+BEGIN_SRC emacs-lisp
(use-package emacs
:elpaca nil
:config
(general-nmap :prefix "SPC"
"<tab>" '(:ignore t :which-key "workspaces")
@ -1265,7 +1255,7 @@ Also, as [[https://www.bytedude.com/gpg-in-emacs/][bytedude]] mentions, I need t
#+begin_src emacs-lisp
(use-package epa-file
:elpaca nil
:ensure nil
:custom
(epg-debug t)
(auth-source-debug t)

View file

@ -44,9 +44,8 @@ Once I made demonstrations /within/ Emacs with my [[https://github.com/howardabr
#+begin_src emacs-lisp :tangle no
(use-package demo-it
:elpaca nil
:ensure nil
:load-path "~/src/demo-it"
;; :elpaca (:host github :repo "howardabrams/demo-it")
:commands (demo-it-create demo-it-start demo-it-hide-mode-line
demo-it--presentation-display-set)
:custom (demo-it--insert-test-speed :faster))
@ -195,7 +194,6 @@ With some a startup bug that I haven’t been able to resolve, I’m not using i
#+begin_src emacs-lisp :tangle no
(use-package dslide
:elpaca (dslide :host github :repo "positron-solutions/dslide")
:commands (dslide-deck-start dslide-deck-stop)
:custom
(dslide-start-from 'point)
@ -228,7 +226,7 @@ With some a startup bug that I haven’t been able to resolve, I’m not using i
(dslide-stop . ha-slide-teardown)))
#+end_src
Let’s try it out by loading this example.[[file:~/.emacs.d/elpaca/sources/dslide/test/demo.org][ demo.org]]
Let’s try it out by loading this example.[[file:~/.emacs.d/straight/repos/dslide/test/demo.org][ demo.org]]
What features do I like and want to take advantage of?
- Inline Children show: =:DSLIDE_SLIDE_ACTION: dslide-slide-action-inline=
@ -245,7 +243,6 @@ Call the =ha-slide-notes-update= function automatically after updating a slide.
#+BEGIN_SRC emacs-lisp :tangle no
(use-package dslide
:elpaca (dslide :host github :repo "positron-solutions/dslide")
:commands (dslide-narrow-hook)
:hook (dslide-narrow . 'ha-slide-notes-update))
#+END_SRC
@ -256,9 +253,7 @@ The [[https://github.com/positron-solutions/moc][Master of Ceremonies]] package
#+BEGIN_SRC emacs-lisp :tangle no
(use-package default-text-scale)
(use-package moc
:elpaca (:host github
:repo "positron-solutions/moc"))
(use-package moc)
#+END_SRC
Select text, and call =moc-focus= (call =moc-focus-quit= to stop). Highlight more text, and call =moc-focus-highlight= to brighten it, or =moc-focus-obscure= to hide it.
@ -272,8 +267,7 @@ An interesting approach for making presentations, that I’m not sure I will nee
The [[https://github.com/trevorpogue/topspace][topspace]] project can pad the top of a buffer, to make the first line in the center of the window. Helpful for presentations:
#+BEGIN_SRC emacs-lisp
(use-package topspace
:elpaca (:host github :repo "trevorpogue/topspace"))
(use-package topspace)
#+END_SRC
*** Showing Something associated with a Headline
@ -308,7 +302,6 @@ To do this, add =:DSLIDE_ACTIONS: dslide-action-highlight-paragraphs= to the pro
#+begin_src elisp emacs-lisp :tangle no
(use-package dslide
:elpaca (:host github :repo "positron-solutions/dslide")
:config
(defclass dslide-action-highlight-paragraphs (dslide-action)
((overlays :initform nil))

View file

@ -85,7 +85,6 @@ The [[https://github.com/jdtsmith/ultra-scroll][ultra-scroll]] project allows sm
#+BEGIN_SRC emacs-lisp
(use-package ultra-scroll
:elpaca (:host github :repo "jdtsmith/ultra-scroll")
:config
(setq scroll-conservatively 101 ; important!
pixel-scroll-precision-interpolate-page t
@ -123,7 +122,6 @@ I found that the prolific [[https://protesilaos.com/][Protesilaos Stavrou]] [[ht
#+begin_src emacs-lisp
(use-package pulsar
:elpaca (:host github :repo "protesilaos/pulsar")
:after winum ace-window
:custom
(pulsar-face 'pulsar-generic)
@ -188,7 +186,6 @@ Am I ever really ever satisfied with any font? I regularly change my font based
#+begin_src emacs-lisp
(use-package mixed-pitch
;; :elpaca (:host github :repo "jabranham/mixed-pitch")
:config
(add-to-list 'mixed-pitch-fixed-pitch-faces 'org-property-value)
(add-to-list 'mixed-pitch-fixed-pitch-faces 'org-special-keyword)
@ -418,8 +415,6 @@ This project replaces [[https://github.com/domtronn/all-the-icons.el][all-the-ic
#+BEGIN_SRC emacs-lisp
(use-package nerd-icons
:elpaca (nerd-icons :host github :repo "rainstormstudio/nerd-icons.el"
:files (:defaults "data"))
:custom
;; The Nerd Font you want to use in GUI defaults to fixed-font:
(nerd-icons-font-family ha-fixed-font))
@ -674,7 +669,6 @@ In code, if you drop a specific /text/ labels, we can highlight them with [[http
#+begin_src emacs-lisp
(use-package hl-todo
:elpaca (:host github :repo "tarsius/hl-todo")
:config
(setq hl-todo-keyword-faces
`(("TODO" . ,(face-foreground 'warning))
@ -690,7 +684,6 @@ Suggests to bind some keys to =hl-todo-next= in order to jump from tag to tag, b
#+begin_src emacs-lisp
(use-package consult-todo
:elpaca (:host github :repo "liuyinz/consult-todo")
:init
(defconst consult-todo--narrow
'((?t . "TODO")

View file

@ -741,7 +741,7 @@ The idea of linking org documents to email could be nice, however, the =ol-notmu
#+begin_src emacs-lisp :tangle no
(use-package ol-notmuch
:after org
:elpaca nil
:ensure nil
:config (add-to-list 'org-modules 'ol-notmuch))
#+end_src
To use, read a message and save a link to it with ~SPC o l~. Next, in an org document, create a link with ~, l~. Now, you can return to the message from that document with ~, o~. Regardless, I may need to store a local copy when I upgrade Org.

View file

@ -27,10 +27,9 @@ A literate programming file for configuring the Emacs Shell.
While I like [[https://github.com/akermu/emacs-libvterm][vterm]] for logging into [[file:ha-remoting.org][remote systems]], I find Emacs’ shell, =eshell=, an interesting alternative.
If you find the documentation lacking, I [[http://www.howardism.org/Technical/Emacs/eshell-fun.html][documented most features]], and you might find the following helpful.
Tell Elpaca to use the built-in =eshell=:
#+begin_src emacs-lisp
(use-package eshell
:elpaca nil
:ensure nil
:hook (eshell-mode . ha-eshell-setup))
#+end_src
@ -87,7 +86,6 @@ Need to hook this when we change the directory.
#+BEGIN_SRC emacs-lisp
(use-package eshell
:elpaca nil
:hook (eshell-directory-change . ha-eshell-header-line))
#+END_SRC
@ -977,7 +975,6 @@ The problem with this trick is that =rx= outputs an Emacs-compatible regular exp
The [[https://github.com/joddie/pcre2el][pcre2el]] project can convert from a Lisp regular expression to a [[http://www.pcre.org/][PCRE]] (Perl Compatible Regular Expression), acceptable by [[https://github.com/BurntSushi/ripgrep][ripgrep]].
#+begin_src emacs-lisp
(use-package pcre2el
:elpaca (:host github :repo "joddie/pcre2el")
:config
(defmacro prx (&rest expressions)
"Convert the rx-compatible regular EXPRESSIONS to PCRE.
@ -1379,7 +1376,6 @@ The [[https://codeberg.org/akib/emacs-eat][Emulate a Terminal]] project provides
#+begin_src emacs-lisp :tangle no
(use-package eat
:after eshell
:elpaca (:repo "https://codeberg.org/akib/emacs-eat")
:hook (eshell-load . eat-eshell-visual-command-mode))
#+end_src
@ -1788,7 +1784,7 @@ Sometimes you need to change something about the current file you are editing...
Here is where we associate all the functions and their hooks with =eshell=, through the magic of =use-package=.
#+begin_src emacs-lisp
(use-package eshell
:elpaca nil
:ensure nil
:custom (eshell-banner-message '(ha-eshell-banner))
:init
(setq eshell-error-if-no-glob t
@ -1817,7 +1813,6 @@ Note that the default list to [[elisp:(describe-variable 'eshell-visual-commands
#+begin_src emacs-lisp :tangle no
(use-package eshell
:elpaca nil
:config
(add-to-list 'eshell-visual-commands "ssh"))
#+end_src

View file

@ -45,7 +45,6 @@ TODO: Rebind the ~z~ keys
I split the configuration of Evil mode into sections. First, global settings:
#+begin_src emacs-lisp
(use-package evil
:elpaca (:wait t)
:init
(setq evil-undo-system 'undo-fu
evil-auto-indent t
@ -361,7 +360,6 @@ Why not use ~f~? I’m reserving the ~f~ for a tree-sitter version that is not a
#+BEGIN_SRC emacs-lisp
(use-package anzu
:ensure t
:config
(global-anzu-mode +1))
#+END_SRC
@ -428,7 +426,7 @@ Where I like to align, is on variable assignments, e.g.
If you press ~RETURN~ for the /character/ to align, =evil-lion= package simply calls the built-in [[help:align][align]] function. This function chooses a regular expression based on a list of /rules/, and aligning Lisp variables requires a complicated regular expression. Extend [[elisp:(describe-variable 'align-rules-list)][align-rules-list]]:
#+begin_src emacs-lisp
(use-package align
:elpaca nil
:ensure nil
:config
(add-to-list 'align-rules-list
`("lisp-assignments"

View file

@ -32,8 +32,6 @@ I'm not trying an experiment where specially-placed function keys on my fancy er
#+begin_src emacs-lisp
(use-package general
:elpaca (:wait t)
:demand t
:config
(setq general-use-package-emit-autoloads t)
@ -909,7 +907,7 @@ Remember these keys in the *Help* buffer:
Let's make Info behave a little more VI-like:
#+begin_src emacs-lisp
(use-package info
:elpaca nil
:ensure nil
:general
(:states 'normal :keymaps 'Info-mode-map
"B" 'Info-bookmark-jump

View file

@ -30,8 +30,7 @@ While the Emacs community have a plethora of options for generating a static web
The RSS needs UUIDs:
#+BEGIN_SRC emacs-lisp results silent
(use-package uuidgen
:elpaca (:host github :repo "emacsmirror/uuidgen"))
(use-package uuidgen)
(defun org-icalendar-create-uid (&rest ignored)
"Returns a UUID."
@ -41,8 +40,7 @@ The RSS needs UUIDs:
While the following packages come with Emacs, they aren't necessarily loaded:
#+begin_src emacs-lisp :results silent
(use-package ox-rss
:elpaca (:host github :repo "emacsmirror/ox-rss"))
(use-package ox-rss)
(use-package org
:config
@ -64,7 +62,6 @@ Render my code with my font colors:
Also, we need Jack, and his HTML prowess:
#+begin_src emacs-lisp
(use-package jack
:elpaca (:host github :repo "tonyaldon/jack")
:commands (jack-html))
#+end_src

View file

@ -109,7 +109,6 @@ The variable, =org-hide-emphasis-markers=, is key to pretending that Emacs can b
#+begin_src emacs-lisp
(use-package org-appear
:elpaca (:host github :repo "awth13/org-appear")
:init (setq org-appear-trigger 'manual)
:hook
((org-mode . (lambda ()
@ -330,7 +329,6 @@ The [[https://github.com/minad/org-modern][org-modern]] project attempts to do a
#+begin_src emacs-lisp
(use-package org-modern
:elpaca (:host github :repo "minad/org-modern")
:after org
:hook ((org-mode . org-modern-mode)
(org-agenda-finalize . org-modern-agenda))
@ -367,7 +365,7 @@ According to an idea by [[https://jft.home.blog/2019/07/17/use-unicode-symbol-to
The [[https://github.com/TonCherAmi/org-padding][org-padding]] project looks places extra space before and after headers and blocks (essentially leading), to create a more word-processor-y experience. Great idea, however, I have spent a lot of extra time entering blank lines before and after my headers and blocks:
#+begin_src emacs-lisp
(use-package org-padding
:elpaca (:host github :repo "TonCherAmi/org-padding")
:vc (:url "https://github.com/TonCherAmi/org-padding" :rev :newest)
:hook (org-mode . org-padding-mode)
:config
(setq org-padding-block-begin-line-padding '(0.5 . 0.3)

View file

@ -3,7 +3,7 @@
#+date: 2020-09-18
#+tags: emacs org
#+startup: inlineimages
#+lastmod: [2026-10-09 Fri]
#+lastmod: [2026-10-20 Tue]
A literate programming file for configuring org-mode and those files.
@ -32,7 +32,6 @@ Org is a /large/ complex beast with a gazillion settings, so I discuss these lat
#+begin_src emacs-lisp :noweb yes
(use-package org
;; TODO: Using the latest org-mode
;; :elpaca nil
:mode (("\\.org" . org-mode))
:init
<<variables>>
@ -281,7 +280,7 @@ Came up with a great way to search a project for Org-specific files, and wrote [
#+begin_src emacs-lisp
(use-package org-find-file
:elpaca nil
:ensure nil
:config
(ha-leader "f o" '("load org" . org-find-file)))
#+end_src
@ -495,7 +494,6 @@ Need to install and configure Emacs to work with [[https://plantuml.com/][PlantU
After installing the [[https://github.com/skuro/plantuml-mode][plantuml-mode]], we need to reference the location:
#+begin_src emacs-lisp
(use-package plantuml-mode
:elpaca (:host github :repo "skuro/plantuml-mode")
:init
(setq org-plantuml-jar-path (expand-file-name "~/bin/plantuml.jar")))
#+end_src
@ -548,9 +546,8 @@ Of course, since we are dealing with Emacs, where we assimilate any good idea. J
#+begin_src emacs-lisp
(use-package pikchr-mode
:elpaca nil
:ensure nil
:load-path "~/src/pikchr-mode"
;; :elpaca (:host github :repo "kljohann/pikchr-mode")
:custom
(pikchr-executable "~/bin/pikchr"))
#+end_src
@ -738,7 +735,7 @@ I have a special version of tweaked [[file:elisp/ox-confluence.el][Confluence ex
#+begin_src emacs-lisp
(use-package ox-confluence
:after org
:elpaca nil ; Located in my "elisp" directory
:ensure nil ; Located in my "elisp" directory
:config
(ha-leader :keymaps 'org-mode-map
"o E" '("to confluence" . ox-export-to-confluence)))
@ -749,7 +746,6 @@ I have a special version of tweaked [[file:elisp/ox-confluence.el][Confluence ex
I’m not afraid of HTML, but I like the idea of doing my HTML work in a Lisp-like way using the [[https://github.com/tonyaldon/jack][jack-html project]]:
#+begin_src emacs-lisp
(use-package jack
:elpaca (:host github :repo "tonyaldon/jack")
:commands (jack-html))
#+end_src
@ -803,7 +799,7 @@ I've been working on my own [[http://www.howardism.org/Technical/Emacs/focused-w
(use-package async)
(use-package ha-focus
:elpaca nil
:ensure nil
:config
(ha-leader
"o f" '("begin focus" . ha-focus-begin)
@ -895,9 +891,9 @@ And the Emacs interface to that:
#+begin_src emacs-lisp
(use-package jinx
:elpaca (:host github :repo "minad/jinx" :files (:defaults "jinx-mod.c" "emacs-module.h"))
:hook (emacs-startup . global-jinx-mode)
:bind (("C-;" . jinx-correct-nearest)
:bind (("C-:" . jinx-correct-nearest)
("s-:" . jinx-correct-nearest)
("s-;" . jinx-correct-nearest)
([remap ispell-word] . #'jinx-correct))
:config
@ -1440,7 +1436,6 @@ The [[https://github.com/rnkn/olivetti][olivetti project]] sets wide margins and
Trying out [[https://protesilaos.com/][Protesilaos Stavrou]]’s [[https://protesilaos.com/emacs/logos][logos project]] as a replacement for [[https://github.com/joostkremers/writeroom-mode][Writeroom-mode]]:
#+begin_src emacs-lisp
(use-package logos
:elpaca (:host gitlab :repo "protesilaos/logos")
:init
(setq logos-outlines-are-pages t
logos-outline-regexp-alist

View file

@ -35,7 +35,6 @@ The obvious keybindings are ~M-h/j/k/l~ … but that is used … well, somewhat.
#+begin_src emacs-lisp :tangle no
(use-package spatial-navigate
:elpaca (:repo "https://codeberg.org/ideasman42/emacs-spatial-navigate")
:config
(pretty-hydra-define spatial-navigate (:color amaranth :quit-key "q")
("Box"
@ -62,7 +61,6 @@ The [[https://github.com/antonj/Highlight-Indentation-for-Emacs][Highlight-Inden
#+begin_src emacs-lisp
(use-package highlight-indentation
:elpaca (:host github :repo "antonj/Highlight-Indentation-for-Emacs")
:hook ((yaml-mode . highlight-indentation-mode)
(python-mode . highlight-indentation-mode)))
#+end_src
@ -119,7 +117,6 @@ Allow this mode in Org blocks:
And we hook
#+begin_src emacs-lisp
(use-package yaml-pro
:elpaca (:host github :repo "zkry/yaml-pro")
:after yaml-mode
:hook ((yaml-mode . yaml-pro-mode)))
#+end_src
@ -224,7 +221,6 @@ Do I consider all YAML files an Ansible file needing [[https://github.com/k1LoW/
#+begin_src emacs-lisp
(use-package ansible
:elpaca (:host gitlab :repo "emacs-ansible/emacs-ansible")
;; :mode ((rx (or "playbooks" "roles") (one-or-more any) ".y" (optional "a") "ml") . ansible-mode)
:config
(setq ansible-vault-password-file "~/.ansible-vault-passfile")
@ -242,7 +238,6 @@ Since most Ansible files are a combination of YAML and Jinja, the [[https://gith
#+BEGIN_SRC emacs-lisp
(use-package poly-ansible
:elpaca (:host github :repo "emacsmirror/poly-ansible")
:after ansible)
#+END_SRC

View file

@ -247,7 +247,7 @@ The /real problem/ is trying to remember all the [[https://github.com/clojure-em
And of course, we want to put this with org blocks:
#+begin_src emacs-lisp
(use-package ob-clojure
:elpaca nil
:ensure nil
:custom
(org-babel-clojure-backend 'cider)
:config

View file

@ -126,35 +126,38 @@ I like the idea of [[https://github.com/abo-abo/lispy][lispy]] for making a Lisp
My primary use-case is for its refactoring and other unique features. For instance, I love [[help:lispy-ace-paren][lispy-ace-paren]] that puts an /ace label/ on every parenthesis, allowing me to quickly jump to any s-expression.
#+begin_src emacs-lisp
(use-package lispy
:config
(when (fboundp 'evil-define-key)
(evil-define-key '(normal visual) lispyville-mode-map
;; Jump to interesting places:
"gf" '("ace paren" . lispy-ace-paren)
"gF" '("ace symbol" . lispy-ace-symbol)
(kbd "M-v") '("mark s-exp" . lispy-mark))) ; Mark entire s-expression
(use-package zoutline)
(pretty-hydra-define lispy-debug nil
("Debug"
(("d" lispy-edebug "Start")
("j" lispy-debug-step-in "Jump in")
("r" lispy-eval-and-replace "Eval/Replace"))
"Instrument"
(("f" (eval-defun t) "Function"))
))
(use-package lispy
:after zoutline
:config
(when (fboundp 'evil-define-key)
(evil-define-key '(normal visual) lispyville-mode-map
;; Jump to interesting places:
"gf" '("ace paren" . lispy-ace-paren)
"gF" '("ace symbol" . lispy-ace-symbol)
(kbd "M-v") '("mark s-exp" . lispy-mark))) ; Mark entire s-expression
(pretty-hydra-define lisp-refactor nil
("To"
(("i" lispy-to-ifs "cond→if")
("c" lispy-to-cond "if→cond")
("t" lispy-toggle-thread-last "to thread")
("d" lispy-to-defun "λ→𝑓")
("l" lispy-to-lambda "𝑓→λ"))
"Convert"
(("F" lispy-flatten "flatten")
("b" lispy-bind-variable "bind var")
("B" lispy-unbind-variable "unbind var")))))
(pretty-hydra-define lispy-debug nil
("Debug"
(("d" lispy-edebug "Start")
("j" lispy-debug-step-in "Jump in")
("r" lispy-eval-and-replace "Eval/Replace"))
"Instrument"
(("f" (eval-defun t) "Function"))
))
(pretty-hydra-define lisp-refactor nil
("To"
(("i" lispy-to-ifs "cond→if")
("c" lispy-to-cond "if→cond")
("t" lispy-toggle-thread-last "to thread")
("d" lispy-to-defun "λ→𝑓")
("l" lispy-to-lambda "𝑓→λ"))
"Convert"
(("F" lispy-flatten "flatten")
("b" lispy-bind-variable "bind var")
("B" lispy-unbind-variable "unbind var")))))
#+end_src
** Lispyville
I want an Evil version of [[Lispy]]. The [[https://github.com/noctuid/lispyville][lispyville project]] builds on it to make it Evil. From the README:
@ -280,7 +283,6 @@ These are all good, but the primary keys I need to figure out, are the s-express
Wilfred’s [[https://github.com/Wilfred/emacs-refactor/tree/master#elisp][emacs-refactor]] package can be helpful if you turn on =context-menu-mode= and …
#+begin_src emacs-lisp
(use-package emr
;; :elpaca (:host github :repo "Wilfred/emacs-refactor")
:config
(pretty-hydra-define+ lisp-refactor nil
("To 𝛌"

View file

@ -60,7 +60,7 @@ The [[https://github.com/mihaimaruseac/hindent][hindent package]] looks interest
* Haskell and Org
#+begin_src emacs-lisp
(use-package ob-haskell
:elpaca nil
:ensure nil
:config
(add-to-list 'org-babel-load-languages '(haskell . t)))
#+end_src

View file

@ -29,10 +29,9 @@ A literate programming file for configuring Python.
* Introduction
The critical part of Python integration with Emacs is running LSP in Python using [[file:ha-programming.org::*direnv][direnv]]. And the question to ask is if the Python we run it in Docker or in a virtual environment.
Emacs supplies a Python editing environment. Since =ob-python= loads the built-in version before Elpaca activates anything, we use =:elpaca nil= instead of grabbing a newer one:
While Emacs supplies a Python editing environment, we’ll still use =use-package= to grab the latest:
#+begin_src emacs-lisp
(use-package python
:elpaca nil
:after flycheck
:mode (((rx ".flake8" eol) . conf-mode)
((rx "Pipfile" eol) . conf-mode)
@ -356,7 +355,7 @@ The built-in Eglot package natively supports [[https://github.com/Microsoft/pyri
#+begin_src emacs-lisp
(use-package eglot
:elpaca nil
:ensure nil
:after python
:defer t
:hook (python-mode . eglot-ensure)
@ -371,7 +370,7 @@ Keybindings for the eglot-based LSP sub-menu, wired into the existing =python-mo
(defvar ha-python-lsp-title (font-icons 'faicon "python" :title "Python LSP"))
(use-package eglot
:elpaca nil
:ensure nil
:after major-mode-hydra
:config
(pretty-hydra-define python-lsp (:color blue :quit-key "q"

View file

@ -268,7 +268,7 @@ The built-in Eglot package natively supports [[https://github.com/castwide/solar
#+begin_src emacs-lisp
(use-package eglot
:elpaca nil
:ensure nil
:after ruby-mode
:defer t
:hook (ruby-mode . eglot-ensure))
@ -278,7 +278,7 @@ Keybindings for the eglot-based LSP sub-menu, wired into the =ruby-mode= local l
#+begin_src emacs-lisp
(use-package eglot
:elpaca nil
:ensure nil
:after ruby-mode
:config
(ha-local-leader 'ruby-mode-map

View file

@ -57,7 +57,7 @@ The [[https://www.nongnu.org/geiser/][geiser project]] attempts to be the interf
Do we need a Scheme work for Org Babel? According to [[https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-scheme.html][this document]], we just need to make sure we add the =:session= variable to start the REPL.
#+begin_src emacs-lisp
(use-package ob-scheme
:elpaca nil
:ensure nil
:config
(add-to-list 'org-babel-load-languages '(scheme . t)))
@ -103,9 +103,9 @@ Let’s get the book available as an Info page:
Still having difficulty getting the Scheme REPL to output the results back into this document. Let’s try Racket...
Normally, I would just [[info:SICP][read the book]], however, if we want to read the [[file:~/.emacs.d/elpaca/builds/sicp/sicp.info][sicp.info]] file, we need this, at least, temporarily:
Normally, I would just [[info:SICP][read the book]], however, if we want to read the [[file:~/.emacs.d/straight/build/sicp/sicp.info][sicp.info]] file, we need this, at least, temporarily:
#+begin_src emacs-lisp
(add-to-list 'auto-mode-alist '("\\.info\\'" . Info-mode))
(add-to-list 'auto-mode-alist '("\\.info\\'" . Info-mode))
#+end_src
* Racket
Actually, let’s do this with [[https://racket-lang.org/][Racket]]:
@ -122,7 +122,7 @@ While Racket, as a Scheme, should work with Geiser (below), let’s also get [[h
Can we get Racket working with Org?
#+begin_src emacs-lisp
(use-package ob-racket
:elpaca (:host github :repo "DEADB17/ob-racket")
:vc (:url "https://github.com/DEADB17/ob-racket" :rev :newest)
:after org
:config
(add-to-list 'org-babel-load-languages '(racket . t)))

View file

@ -33,7 +33,6 @@ The [[https://github.com/eki3z/mise.el][mise.el]] project overcomes the [[https:
#+BEGIN_SRC emacs-lisp
(use-package mise
:elpaca (:host github :repo "eki3z/mise.el")
:hook (after-init . global-mise-mode))
#+END_SRC
@ -73,7 +72,6 @@ For all programming languages, I would like to now default to absolute line numb
#+begin_src emacs-lisp
(use-package emacs
:elpaca nil
:config
(defun ha-prog-mode-config ()
"Configure the `prog-mode'"
@ -85,7 +83,7 @@ For all programming languages, I would like to now default to absolute line numb
While Emacs has options for viewing and moving around code, sometimes, we could /collapse/ all functions, and then start to expand them one at a time. For this, we could enable the built-in [[https://www.emacswiki.org/emacs/HideShow][hide-show feature]]:
#+begin_src emacs-lisp :tangle no
(use-package hide-show
:elpaca nil
:ensure nil
:init
(setq hs-hide-comments t
hs-hide-initial-comment-block t
@ -232,7 +230,6 @@ The [[https://www.emacswiki.org/emacs/FlySpell#h5o-2][flyspell-prog-mode]] check
#+begin_src emacs-lisp
(use-package flyspell
:elpaca nil
:hook (prog-mode . flyspell-prog-mode))
#+end_src
** Linting with Flycheck
@ -240,7 +237,6 @@ Why use [[https://www.flycheck.org/][flycheck]] over the built-in =flymake=? Spe
#+begin_src emacs-lisp
(use-package flycheck
:elpaca (:host github :repo "flycheck/flycheck")
:init
(setq next-error-message-highlight t)
:bind (:map flycheck-error-list-mode-map
@ -428,15 +424,15 @@ Note that Emacs already has the ability to download and install grammars, so fol
#+begin_src emacs-lisp
(when (treesit-available-p)
(use-package treesit
:elpaca nil
:ensure nil
:preface
(setq treesit-language-source-alist
'((bash "https://github.com/tree-sitter/tree-sitter-bash")
;; (c "https://github.com/tree-sitter/tree-sitter-c/" "master" "src")
(clojure "https://github.com/sogaiu/tree-sitter-clojure" "master" "src")
;; (clojure "https://github.com/sogaiu/tree-sitter-clojure" "master" "src")
;; (cpp "https://github.com/tree-sitter/tree-sitter-cpp/" "master" "src")
;; (cmake "https://github.com/uyha/tree-sitter-cmake")
(css "https://github.com/tree-sitter/tree-sitter-css")
;; (css "https://github.com/tree-sitter/tree-sitter-css")
(dockerfile "https://github.com/camdencheek/tree-sitter-dockerfile" "main" "src")
;; From my private cloned repository:
;; (dockerfile "file:///opt/src/github/tree-sitter-dockerfile" "main" "src")
@ -444,8 +440,8 @@ Note that Emacs already has the ability to download and install grammars, so fol
;; (elisp "https://github.com/Wilfred/tree-sitter-elisp")
;; (elixir "https://github.com/elixir-lang/tree-sitter-elixir" "main" "src")
;; (erlang "https://github.com/WhatsApp/tree-sitter-erlang" "main" "src")
(go "https://github.com/tree-sitter/tree-sitter-go")
(templ "https://github.com/vrischmann/tree-sitter-templ")
;; (go "https://github.com/tree-sitter/tree-sitter-go")
;; (templ "https://github.com/vrischmann/tree-sitter-templ")
;; (haskell "https://github.com/tree-sitter/tree-sitter-haskell" "master" "src")
(html "https://github.com/tree-sitter/tree-sitter-html")
;; (java "https://github.com/tree-sitter/tree-sitter-java" "master" "src")
@ -454,11 +450,11 @@ Note that Emacs already has the ability to download and install grammars, so fol
;; (julia "https://github.com/tree-sitter/tree-sitter-julia" "master" "src")
;; (lua "https://github.com/MunifTanjim/tree-sitter-lua" "main" "src")
(make "https://github.com/alemuller/tree-sitter-make")
(markdown "https://github.com/ikatyang/tree-sitter-markdown")
;; (markdown "https://github.com/ikatyang/tree-sitter-markdown")
;; (meson "https://github.com/Decodetalkers/tree-sitter-meson" "master" "src")
(python "https://github.com/tree-sitter/tree-sitter-python")
(ruby "https://github.com/tree-sitter/tree-sitter-ruby" "master" "src")
(rust "https://github.com/tree-sitter/tree-sitter-rust" "master" "src")
;; (python "https://github.com/tree-sitter/tree-sitter-python")
;; (ruby "https://github.com/tree-sitter/tree-sitter-ruby" "master" "src")
;; (rust "https://github.com/tree-sitter/tree-sitter-rust" "master" "src")
(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")
@ -505,10 +501,10 @@ And enable the languages:
#+end_src
*** Combobulate
I like [[file:ha-programming-elisp.org::*Clever Parenthesis][Clever Parenthesis]], but can we extend that to other languages generally? After reading Mickey Petersen’s essay, [[https://www.masteringemacs.org/article/combobulate-structured-movement-editing-treesitter][Combobulate project]], I decided to try out his [[https://github.com/mickeynp/combobulate][combobulate package]]. Of course, this can only work with the underlying tooling supplied by the [[https://emacs-tree-sitter.github.io/][Tree Sitter]] →
#+begin_src emacs-lisp
#+begin_src emacs-lisp :tangle no
(when (treesit-available-p)
(use-package combobulate
:elpaca (:host github :repo "mickeynp/combobulate")
:vc (:url "https://github.com/mickeynp/combobulate" :rev :newest)
:after treesit
:hook ((yaml-ts-mode . combobulate-mode)
;; (css-ts-mode . combobulate-mode)
@ -519,7 +515,7 @@ I like [[file:ha-programming-elisp.org::*Clever Parenthesis][Clever Parenthesis]
#+end_src
Now, I can create an /interface/ of keystrokes to jump around like a boss:
#+begin_src emacs-lisp
#+begin_src emacs-lisp :tangle no
(when (treesit-available-p)
(use-package combobulate
:general
@ -567,7 +563,7 @@ Now, I can create an /interface/ of keystrokes to jump around like a boss:
Mickey’s interface is the [[help:combobulate][combobulate]] function (or ~C-c o o~), but mine is more /evil/.
I can create a /helper function/ to allow me to jump to various types of—well, /types/:
#+begin_src emacs-lisp
#+begin_src emacs-lisp :tangle no
(when (treesit-available-p)
(use-package combobulate
:config
@ -657,7 +653,6 @@ While I’m at it, let’s connect various ~g~ sequence keys to =xref-= interfac
#+begin_src emacs-lisp
(use-package emacs
:elpaca nil
:general
(:states 'normal
"g ." '("find def" . xref-find-definitions)
@ -689,7 +684,7 @@ Emacs has two LSP projects, and while I have used [[LSP Mode]], but since I don
#+begin_src emacs-lisp
(use-package eglot
:elpaca nil
:ensure nil
:commands eglot-ensure
:config
(setq eglot-autoshutdown t))
@ -1009,7 +1004,6 @@ Simple to configure languages go here. More advanced languages go into their own
So many configuration files to track:
#+begin_src emacs-lisp
(use-package conf-mode
:elpaca nil
:mode (("\\.conf\\'" . conf-space-mode)
("\\.repo\\'" . conf-unix-mode)
("\\.setup.*\\'" . conf-space-mode)))
@ -1419,7 +1413,7 @@ Using [[https://polymode.github.io/][polymode]], let’s add syntax coloring to
#+end_src
** ReStructured Text
Support for [[https://docutils.sourceforge.io/rst.html][reStructuredText]] is [[https://www.emacswiki.org/emacs/reStructuredText][well supported]] in Emacs.
#+begin_src emacs-lisp :tangle no
#+begin_src emacs-lisp
(use-package rst
:config
(when (and (display-graphic-p) (boundp 'ha-fixed-font))
@ -1469,7 +1463,7 @@ While I don't like writing them, I can't get away from them. Check out the goodi
While filename extensions work fine most of the time, I don't like to pre-pend =.sh= to the shell scripts I write, and instead, would like to associate =shell-mode= with all files in a =bin= directory:
#+begin_src emacs-lisp
(use-package sh-mode
:elpaca nil
:ensure nil
:mode (rx (or (seq ".sh" eol)
"/bin/"))
:init

View file

@ -28,7 +28,7 @@ A literate configuration for accessing remote systems.
[[https://www.emacswiki.org/emacs/TrampMode][Tramp]] allows almost all Emacs features to execute on a remote system.
#+begin_src emacs-lisp
(use-package tramp
:elpaca nil
:ensure nil
:config
;; Use remote PATH on tramp (handy for eshell).
@ -42,7 +42,7 @@ A literate configuration for accessing remote systems.
Will Schenk has [[https://willschenk.com/articles/2020/tramp_tricks/][a simple extension]] to allow editing of files /inside/ a Docker container:
#+begin_src emacs-lisp
(use-package tramp
:elpaca nil
:ensure nil
:config
(push '("docker" . ((tramp-login-program "docker")
(tramp-login-args (("exec" "-it") ("%h") ("/bin/sh")))
@ -75,7 +75,7 @@ Which means, I need to put it as a link in an org file.
#+begin_src emacs-lisp
(use-package tramp-sh
:after tramp
:elpaca nil
:ensure nil
:custom (tramp-use-ssh-controlmaster-options nil))
#+end_src
* Remote Terminals
@ -124,7 +124,7 @@ I'm not giving up on Eshell, but I am playing around with [[https://github.com/a
VTerm has an issue (at least for me) with ~M-Backspace~ not deleting the previous word, and yeah, I want to make sure that both keystrokes do the same thing.
#+begin_src emacs-lisp :tangle no
#+begin_src emacs-lisp
(use-package vterm
:config
(setq vterm-shell "zsh"
@ -162,7 +162,7 @@ An odd use case I have: working in a Terminal session in one buffer window, and
Now, I can type: ~s-G~ (with the shift), select the line with Avy, and type ~N~ to have it copy/paste into the buffer:
#+BEGIN_SRC emacs-lisp :tangle no
#+BEGIN_SRC emacs-lisp
(use-package vterm
:config
(defun ha-vterm-avy-paste-line ()
@ -180,15 +180,9 @@ Now, I can type: ~s-G~ (with the shift), select the line with Avy, and type ~N~
** Eat
While not as fast as [[https://github.com/akermu/emacs-libvterm][vterm]], the [[https://codeberg.org/akib/emacs-eat][Emulate a Terminal]] project (eat) is fast enough, and doesn’t require a dedicate library that requires re-compilation. While offering [[https://elpa.nongnu.org/nongnu-devel/doc/eat.html][online documentation]], I’m glad for an [[info:eat#Top][Info version]].
#+BEGIN_SRC emacs-lisp
#+BEGIN_SRC emacs-lisp :tangle no
(use-package eat
:elpaca (:host codeberg :repo "akib/emacs-eat"
:files ("*.el" ("term" "term/*.el") "*.texi"
"*.ti" ("terminfo/e" "terminfo/efo/e/*")
("terminfo/65" "terminfo/65/*")
("integration" "integration/*")
(:exclude ".dir-locals.el" "*-tests.el")))
:commands (eat eat-make eat-project)
;; :commands (eat eat-make eat-project)
:bind (:map eat-semi-char-mode-map
("C-c C-t" . ha-eat-narrow-to-shell-prompt-dwim))
:config
@ -505,8 +499,7 @@ Instead of making sure I have a list of remote systems already in the favorite h
We'll give =openstack= CLI a =--format json= option to make it easier for parsing:
#+begin_src emacs-lisp
(use-package json
:elpaca nil)
(use-package json)
#+end_src
#+begin_src emacs-lisp

View file

@ -17,6 +17,9 @@ do
ln -s "$HAMACS_DIR/$LINK" "$HAMACS_DEST"
done
echo Download the public keys:
gpg --homedir ~/.emacs.d/elpa/gnupg --receive-keys 066DAFCB81E42C40
cat > "$HAMACS_DEST/early-init.el" <<EOF
;;; early-init.el --- Hamacs Early Init -*- lexical-binding: t; -*-
;;
@ -32,15 +35,15 @@ cat > "$HAMACS_DEST/early-init.el" <<EOF
;;; Commentary:
;;
;; This is my early Emacs configuration file. See init.el for the real
;; boot process. Since we are using elpaca, we just need to stop the
;; normal package process.
;; boot process. Since init.el calls package-initialize itself, we just
;; need to stop the normal package process.
;;
;;; Code:
;; Need the package system near the front:
;; (require 'package)
(require 'package)
;; We'll be using elpaca. So, we don't want duplicated package loading:
;; init.el activates the packages, so we don't want duplicated package loading:
(setq package-enable-at-startup nil)
;; While I would rather program my configurations, sometimes the Emacs
@ -96,80 +99,30 @@ cat > "$HAMACS_DEST/init.el" <<EOF
;; Bug fixes for ORG (there always seems to be something):
(defvar native-comp-deferred-compilation-deny-list nil)
;; Elpaca doesn't use package.el, so no package archives are needed.
;; Install and configure Elpaca, see the installer at:
;; https://github.com/progfolio/elpaca#installer
;; Allow the installation of unsigned packages, but verify the
;; signature if possible:
(defvar elpaca-installer-version 0.12)
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-sources-directory (expand-file-name "sources/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
:ref nil :depth 1 :inherit ignore
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
:build (:not elpaca-activate)))
(let* ((repo (expand-file-name "elpaca/" elpaca-sources-directory))
(build (expand-file-name "elpaca/" elpaca-builds-directory))
(order (cdr elpaca-order))
(default-directory repo))
(add-to-list 'load-path (if (file-exists-p build) build repo))
(unless (file-exists-p repo)
(make-directory repo t)
(when (<= emacs-major-version 28) (require 'subr-x))
(condition-case-unless-debug err
(if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
((zerop (apply #'call-process \`("git" nil ,buffer t "clone"
,@(when-let* ((depth (plist-get order :depth)))
(list (format "--depth=%d" depth) "--no-single-branch"))
,(plist-get order :repo) ,repo))))
((zerop (call-process "git" nil buffer t "checkout"
(or (plist-get order :ref) "--"))))
(emacs (concat invocation-directory invocation-name))
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
"--eval" "(byte-recompile-directory \".\" 0 'force)")))
((require 'elpaca))
((elpaca-generate-autoloads "elpaca" repo)))
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
(error "%s" (with-current-buffer buffer (buffer-string))))
((error) (warn "%s" err) (delete-directory repo 'recursive))))
(unless (require 'elpaca-autoloads nil t)
(require 'elpaca)
(elpaca-generate-autoloads "elpaca" repo)
(let ((load-source-file-function nil)) (load "./elpaca-autoloads"))))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca \`(,@elpaca-order))
(setq package-check-signature 'allow-unsigned)
;; Enable the :elpaca keyword for use-package, and wait for it, since
;; everything else in my configuration depends on it:
;; Packages come from Melpa and the GNU and NonGNU ELPAs (the latter
;; two are Emacs defaults). The rest are installed straight from their
;; repositories with the :vc keyword of use-package (Emacs 30+).
(require 'package)
(require 'use-package)
(elpaca elpaca-use-package
(elpaca-use-package-mode))
(elpaca-wait)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/"))
;; Replace straight's \`straight-use-package-by-default'. Every
;; use-package declaration installs its package, unless it says
;; otherwise, e.g. ':elpaca nil' for built-in features. Note that
;; \`use-package-always-ensure' won't work, as it only considers the
;; :ensure keyword.
(setq package-enable-at-startup nil)
(package-initialize)
(add-to-list 'use-package-defaults
'(:elpaca (list t)
(lambda (name args)
(not (or (plist-member args :ensure)
(plist-member args :load-path)
(elpaca-get name))))) t)
;; Install any missing package by default, so we don't need :ensure t.
;; Use :ensure nil for libraries that ship with Emacs (or my own).
;; Eglot and its dependencies (project, flymake, xref, jsonrpc, etc.)
;; ship with Emacs. Elpaca already ignores built-in packages when
;; resolving dependencies, see \`elpaca-ignored-dependencies'.
;; Install the latest org-mode, and wait, since we need it to load
;; the rest of the configuration:
(setq use-package-always-ensure t)
(use-package org)
(elpaca-wait)
;; Let's rock:
(org-babel-load-file "$HAMACS_DIR/bootstrap.org")

View file

@ -40,7 +40,7 @@ Use your favorite way to install Emacs’ packages, for instance, with Emacs 30,
#+BEGIN_SRC emacs-lisp :tangle no :eval no
(use-package pud
:vc (:url "https://howardabrams.com/git/howard/pud")
:vc (:url "https://howardabrams.com/git/howard/pud" :rev :newest)
:custom
(pud-worlds
'(["Remote Moss-n-Puddles" 'ssh "howardabrams.com" 4000 "george"]

View file

@ -4,6 +4,6 @@
# --
#+BEGIN_SRC emacs-lisp
(use-package ${1:package}
:elpaca (${2::host ${3:github}} :repo "${4:repo}")
:straight (:type git ${2::host ${3:github}} :repo "${4:repo}")
$0)
#+END_SRC