Oni Machine Interface

My Literate Machine Configuration

This is my latest attempt at a literate configuration.

This is in the very early stages of an attempt to do this. And usually I get frustrated and give up quite early on. I'll try and get small bits and pieces in here one at a time.

Here is the command that converts this file into my home configuration. This calls Guix shell with just the emacs-next package installed and runs Emacs to tangle this file. When tangling is done it runs guix home to configure my environment.

For the moment this doesn't do guix home reconfigure but guix home build instead. I'm still getting this up to the point where I can actually use it.

guix shell --pure emacs-next -- emacs \
     -quick -batch \
     -load ob-tangle \
     -visit rincewind.org \
     -funcall org-babel-tangle
guix home build rincewind.scm


This is a random assortment of environment variables that I like to have defined for various reasons.

The LESS environment variable specifies the default command-line arguments to pass in to less whenever it is run. I've gotten quite used to these:

Causes less to exit right away when there is less than one screen of text to display.
Prevents the screen from being cleared away when less exits (it does more, but this is why I use it)
Displays ANSI color escape sequences to be rendered as normal, instead of as readable characters. In other words it lets less display colored text instead of displaying escape sequences.
Truncates long lines instead of wrapping them. Makes it easier for me to read.
This causes any searches using / to become case-insensitive so that the search term “done” will match “done”, “Done”, “DONE”, and any other combination of upper- and lowercase letters.
("LESS" . "FXRSi")

I use the MY_GUIX_CONFIGURED just as an indication that Guix home actually configured my user profile. It's not actually necessary for anything.


This opts out of sending any telemetry to Microsoft whenever I play around with any .Net things.


Turn on dark-mode for Calibre. I prefer dark mode everywhere.


Because I use Guix on top of another distribution, this variable needs to be set in order for locales to work properly for both package installed through Guix and ones installed by the host distribution.

("GUIX_LOCPATH" . "$HOME/.guix-home/profile/lib/locale")

Again because I use Guix on top of another distribution this variable ensures that the things I have stored away in my usual data directory get included, not just the ones Guix defines.

 . "${XDG_DATA_DIRS}${XDG_DATA_DIRS:+:}/usr/local/share:/usr/share")

I was working with git recently, splitting some utilities out into their own repository from a bigger repository using filter-branch. Apparently filter-branch has been deprecated because it's easy to make mistakes and there's better alternatives now. But filter-branch is what I know and my needs are simple, so I disable that warning.


Putting it all together to define the service for my home configuration.

(define oni-environment-service
     ("LESS" . "FXRSi")
     ("MY_GUIX_CONFIGURED" . "1")
     ("GUIX_LOCPATH" . "$HOME/.guix-home/profile/lib/locale")
      . "${XDG_DATA_DIRS}${XDG_DATA_DIRS:+:}/usr/local/share:/usr/share")


I have a very simple GTK configuration. All I configure is that the applications should prefer a dark theme over a light one.



This brings it all together. The <<services>> is where all the services defined throughout this document are placed, and the last few lines return my home environment.

 (gnu services)
 (gnu home services))




[2022-11-16 Wed]
Added a code block that tries to tangle this file and then build the result. And made the output an actual home environment.

Find me on Mastodon

Date: 2023-05-23 Tue 23:51

Emacs 28.2 (Org mode 9.6.7)