dotfiles/guix-profile.org

8.5 KiB

I don't know where to put this file. It's meant to pull everything together by making sure that the right software is installed on my system. It's not really a configuration file like the others, and yet it also kind-of is.

First off I must import some modules to that the right functions are available to me to define my profile.

  (use-modules
   (guix transformations)
   (guix packages))

These imports provide me the functions package->manifest, options->transformations, etc.

First I define a function to allow me to specify that I want to use the git master version of a package, not the latest stable release. Usually I don't want this, but with some programs I like to live on the edge, and others might do a lot of work before they release anything. BTW I run Guix on Arch, I like being on the bleeding edge.

  (define (with-master-branch package)
    "Apply a transformation to PACKAGE so that it uses the master branch."
    ((options->transformation
      `((with-branch . ,(string-append (package-name package) "=master"))))
     package))

This function will take any package definition (from specification->package) and returns a new package definition that specifies to use the “master” branch. It's like calling guix install --with-branch=master PKG.

I define packages through this file as I need them, so here is just the setup to collect them all and create a manifest from them.

  (packages->manifest
   (list
    <<guix-packages>>))

This just expects a flat list of package definitions and it will turn them into manifest. This needs to be the last part of the file so that it returns that package manifest and guix package --manifest FILE understands what the contents of the manifest are. The <<guix-packages>> reference there is a Noweb marker, it lets me specify other code blocks with a :noweb-ref guix-packages header argument that will make them get added here when they're tangled. This code block itself also needs a header argument for this to work: :noweb yes. This is all cool Org Mode magic.

Always the first thing I install is Emacs. As long as I have that anything else is bearable. On my main machine I like using the very latest from git. For one I want the latest features, and for another I want the challenge of finding out what is wrong when something breaks, in the hopes of finding and fixing bugs. Alas so far it's generally been pretty stable and I've had no reason to get involved with anything.

  (with-master-branch (specification->package "emacs-next"))

I use these two fonts generally in my configurations.

  (specification->package "font-fantasque-sans")
  (specification->package "font-comic-neue")
  (specification->package "font-awesome")

To make my system actually able to render them properly Fontconfig needs to be explicitly installed. It doesn't matter if it's installed in Arch as well.

  (specification->package "fontconfig")

One of the reasons I wanted to go back to using Guix on Arch was that I really liked the setup I had in my full Guix distro with Shepherd. And the fact that all of a sudden, for an unknown reason, systemd removed some of my enabled services. This is a service manager configured in scheme. It lets me set up user-level services such as my Emacs daemon, mbsync, mcron, etc.

  (specification->package "shepherd")

There's a few settings that I set through the X Server Resource Database, like my preferred mouse cursor.

  (specification->package "xrdb")

I've tried to keep my X resources configurations modular so that I can easily include and exclude them based on what I use at the time and also what machine I'm configuring. By default the xrdb program uses the C pre-processor to allow you to define some macros and such, but that wasn't quite adequate for what I needed. So I'm using the m4 macro pre-processor instead, which will let me do more things.

  (specification->package "m4")

I use Herbstluftwm as my window manager. So far even Stumpwm can't seem to beat it for me. It's very configurable through anything that can run shell scripts, and it has a nice mix of automatic and manual tiling that I just really enjoy.

  (specification->package "herbstluftwm")

With herbstluftwm I use polybar as the status bar for my desktop.

  (specification->package "polybar")

I like configurable software. And I'm not quite used to it yet, I still use Firefox a lot, but I'm trying to learn and use Nyxt more. After Conkeror it's the most interesting browser I've come across so far.

  (specification->package "nyxt")

Whenever I use Guix on a foreign distribution (meaning not on a 100% Guix distribution) I end up with a number of applications being unable to find the hicolor theme. I don't quite know the details yet, but I'm installing it now.

  (specification->package "hicolor-icon-theme")

The problem might actually not be missing the hicolor icon theme but the fact that Arch keeps the XDG_DATA_DIRS environment variable empty on my machine. This means that certain programs that search through the directories in there will stop searching through /usr/share once Guix sets the variable, because Guix will not automatically add /usr/local/share/:/usr/share/ when the variable is empty (since that wouldn't make sense on a Guix distribution).

Mcron is a cron daemon configured in scheme. I run it as a user so I can easily run tasks periodically while using scheme!

  (specification->package "mcron")

I've been using the dunst notification daemon for a long time now. It's nice and configurable even if it isn't written in Lisp.

  (specification->package "dunst")

I've used various terminal emulators, and I try to use vterm in Emacs when I can, but I've settled on using Kitty for a while now when I use the terminal outside of Emacs.

  (specification->package "kitty")

Oneko is a completely useless program, that is also kind-of fun. A cat runs after your cursor or the window you've selected.

  (specification->package "oneko")

Even though it's a dead project, seemingly, there is something so special about scsh that I just can't stop using it more and more. Writing shell scripts in Scheme is just too good to give up.

  (specification->package "scsh")

I use xbindkeys to define my keybindings because it lets me configure them in Scheme.

  (specification->package "xbindkeys")

Syncthing is an easy way to set up automatic file sharing between different devices.

  (specification->package "syncthing")

I need openconnect and freerdp for work.

  (specification->package "openconnect")
  (specification->package "freerdp")

Shellcheck is great to help make sure I don't make dumb mistakes in my shell scripts.

  (specification->package "shellcheck")

Flameshot is a great application for making screenshots.

  (specification->package "flameshot")

Kde Connect is an awesome application to connect devices together for functions other than file sharing (such as notification sharing).

  (specification->package "kdeconnect")

Notmuch is an email indexing service, somewhat like mu. I'm trying it out. The default interface for it is Emacs.

  (specification->package "notmuch")
  (specification->package "emacs-notmuch")