Emacs, the build tool
Emacs, the build tool
Emacs, the build tool
2022-12-20
⭔ tagged:

In this post: I talk about how delighted I am to build my project and test it in a single key command in emacs.

This week I continue with bits of emacs puttering during spare bits of time. Each day, I progressively add a bit more to my personal config, picking and choosing pieces of what I want from Doom-Emacs. I haven't gotten to a point where I'm really making my own customizations — but today I had a small realization that delighted me.

As I putter away on my static site generator for this Obsidian vault, I have to do the same commands over and over to test as I develop. And while there is no Rust-Repl, developing has become pretty quick. Since I'm still developing in Doom emacs while I build my other config, here's what I currently do:

  1. Make a change in the Rust codebase
  2. Recompile the program by pressing SPC m b to run cargo build
  3. Open my terminal and run rm -rf ~/Sync/notes/_esker/ to remove the previous site that I generated
  4. Run target/debug/esker new -d ~/Sync/notes/ to create a new site
  5. Run **target/debug/esker build -d ~/Sync/notes/ to build the site
  6. Inspect how things are looking in a simple http-server for the files.

I try not to introduce any automation into a project until I see I'm doing the same commands again and again. So, after a few separate sessions of working on the program I realized it was time to automate that (and while the current process was pretty fast, it was still getting a bit annoying).

First, I set about creating a makefile that would do each of the individual pieces; then I remembered you can send strings to the shell, and wouldn't it be great to bind a single key command to do steps 1-5?.

So here's my simple solution: I have a make command [1] that runs steps 1-5, and then I add this to my project directory (and add it to .gitignore):

;;; .bindings.el
(general-define-key
 :states '(normal visual) :prefix "SPC"
 ;; top level
 "J" '(:ignore :which-key "Project specific bindings")
 "J j" #'(lambda () (interactive) (shell-command "make wt"))
 

Now, when I'm developing the project, I evaluate the buffer [2] above and can then press SPC J j to do... everything for me!

And while this isn't anything particularly interesting, it is a small quality-of-life improvement that delights me! Things like this also make working with a compiled language so much faster.

Footnotes


  1. I also realize that I could just run all the commands directly from emacs, and don't even need a make file.

  2. I'm pretty sure I can use a .dir-locals file, although I couldn't quite find a straight answer on how to set up keybindings using it. So, I opted for the simple solution of just evaluating the buffer when I have the project open.