Files
sydnix/README.org
Madeleine Sydney 1aee1366c2 wip: feat: Just use straight.el...
Every Nixy solution I could find or conceive had too many points spread across
these various facets:
  - Flimsy (emacsWithPackagesFromUsePackage)
  - Inelegant (builtins.exec, manual listings)
  - Inflexible (emacsWithPackagesFromUsePackage)
  - Otherwise unergonomic (everything }:D)

Straight.el is sufficiently declarative, flexible, and Nix-friendly without
blindly bowing down to the imperialist NixOS user.  Now, Convenience and
ergonomics shan't be forsaken for the dogma that is total Nixation.
2025-01-17 16:28:45 -07:00

9.9 KiB
Executable File
Raw Blame History

Guix-rebound 2

Current name of guix-rebound ought to be changed. This is a rewrite from scratch. }:3

A second try at NixOS, now that I have a better idea of what I'm doing. The effort is largely inspired by my darling Faye's glorious wishsys.

Inbox

Conventions

User configuration

In order of descending preference, user programs should be configured by…

  1. Wrappers, with config files optionally living somewhere under /persist/dots.
  2. home-manager's modules.
  3. home.file and similar.
  4. Mutable symlinks using home.file and mkOutOfStoreSymlink.

Repo structure

hosts/

Each directory hosts/«HOST» is expected to configure a single specific device, where «HOST» is the device's exact hostname. Said directory «HOST» should have at least the following structure:

hosts
└── «HOST»
    ├── configuration.nix
    └── system.nix

Where configuration.nix is the main entry point imported by the top-level flake, and system.nix evaluates to a string corresponding to the system option to be used.

users/

Similarly to the hosts directory, each subdirectory users/«USER» is assumed to have some structure, and that «USER» is the precise username desired.

users
└── «USER»
    └── default.nix

Where default.nix returns an attrset of form

{
  # The NixOS option `users.users.«USER»` will be set to result of
  # `systemConfiguration`.
  systemConfiguration = { config, pkgs, lib, ... }: {
    # isNormalUser = true;
    # extraGroups = [ "wheel" ];
    # ...
  };

  # Home-manager configuration
  homeConfiguration = { config, pkgs, lib, ... }: {
    # home.packages = [ pkgs.hello ];
    # ...
  };
}

Impermanence and persistence

I use impermanence to wipe most of my filesystem on boot.

Boot process

What follows is an overview of modules/nixos/impermanence/rollback.nix.

On boot, …

  • The existing subvolume root filesystem will be moved to a 'death row' directory, where it will live for about three days before deletion. Precisely, «btrfs-filesystem»/«root-subvolume» is moved to «btrfs-filesystem»/old-roots/«timestamp». The brief grace period allows for easy recovery in the (very common) case where files are unintentionally deleted due to the user's silly human negligence.
  • A new, blank subvolume is created in place of the previous. Precisely, the subvolume «btrfs-filesystem»/«root-subvolume» is created.
  • Any subvolumes under «btrfs-filesystem»/old-roots older than three days are deleted.

The /persist directory

/persist/root
Persistent files to be linked into the real root, /. These are managed by Impermanence.
/persist/home/«user»
Persistent files to be linked into the analogous location under the real home, /home/«user». These are managed by Impermanence.
/persist/vault/«user»
Persistent files belonging to specific users. This differs from the persistent home directories in that files are not necessarily linked anywhere.

sydnix-cli

sydnix-cli is a command-line utility written in Clojure wrapping various sydnix-related scripts.

Tasks

Begin setting up doomless Emacs

DONE Daemon

CLOSED: [2025-01-03 Fri 20:00]

DONE Mutable config

CLOSED: [2025-01-03 Fri 20:01]

Path is currently hardcoded to /persist/dots/users/crumb/programs/emacs. An immutable file (created by home-manager's programs.emacs.extraConfig) loads init.el from the hardcoded path.

DONE Packages via Nixpkgs

CLOSED: [2025-01-03 Fri 20:40]

TODO map! macro

TODO Module system?

Emacs config

[A] One-off environment changes without direnv

I would like the ability to ergonomically e.g. add HLS to my current environment without setting up an entire project. Perhaps something like "create new workspace under a nix-shell invocation" could work?

minibuffer

DONE jk to escape

CLOSED: [2024-11-20 Wed 12:11]

DONE history navigation in insert mode w/ C-j / C-k

CLOSED: [2024-11-20 Wed 12:11]

RET to send whilst in normal mode

dired

DONE use / to live narrow

CLOSED: [2024-11-14 Thu 04:46]

set up JuliaMono for use with ipa: links

text-mode

grammar
spellcheck and dictionaries
org-mode
init.org for beorg
IPA links
capture templates
journal entry
todo
fancy headline stars
DONE better colour for inline code

CLOSED: [2024-11-21 Thu 09:04]

DONE variable pitch

CLOSED: [2024-11-30 Sat 19:06]

form and element text objects à la vim-sexp

customise the eshell prompt

jump to prev/next hole in haskell

make a bind for inserting hrules

KILL set up emms

CLOSED: [2024-12-11 Wed 13:46]

it kinda sucks. }:\

set up JuliaMono for use with IPA glyphs

KILL literate config

CLOSED: [2024-12-27 Fri 19:35]

Just kind of a pain in the ass. }:)

evil-cp fixes

( / )

When ) is hit whilst the cursor is at ↓1, it should move to the matching bracket, ↓2, not the right bracket of the save-excursion call.

(save-excursion
;;  ↓1                ↓2
    (re-search-forward))
element text objects

automatically close compilation buffer

fix [e / ]e

unmap TAB in normal mode

eshell trail à la M-x calc

I really like how you re-examined shells and terminals. I hadn't thought of how they're kinda unrelated. What I then don't understand is why eshell stuck to the paradigm of interleaving input and output. It's a relic left over from terminals. ie: >>> input [tonnes of output] >>> input [tonnes of output] to me it seems the input should be entered in the minibuffer (or some separate frame/window) and the outputs should be in a separate window/frame with separate read-only buffers.

source

TODO Securely store credentials for glab/gh CLIs

TODO Dotfiles

TODO Emacs

TODO Bash

TODO shopt -s histverify

Dont execute expanded result immediately.

DONE (neo)vim

CLOSED: [2024-12-29 Sun 17:53]

TODO readline

DONE disko

CLOSED: [2024-12-28 Sat 18:13]

IDEA refactor disko configs to be more reusable

IDEA replace uses of gpg with age

I don't know anything about either.

TODO password store 4 firefox

DONE password store w/ age

CLOSED: [2024-12-29 Sun 02:34]

https://github.com/FiloSottile/passage

TODO Automatically sync password store

DONE secrets

CLOSED: [2024-12-29 Sun 01:41]

DONE git config

CLOSED: [2024-12-30 Mon 17:01]

TODO niri

Or Qtile

TODO qtile

Or Niri

TODO Convenient way to wrap programs

wrapper-manager looks like it will be really annoying to integrate into my config without a NixOS/HM module.

TODO tf2.nix

  • declaratively configure tf2
  • tf2Packages?
  • mastercomfig integration?
  • define aliases / bindings from nix?

TODO mpd

TODO mpdscribble

TODO syncthing

HOLD impermanence

DONE sydnix.defaults module

CLOSED: [2024-12-31 Tue 01:05]

DONE Split up flake.nix into a file per output

CLOSED: [2024-12-31 Tue 01:04]

TODO default package sets

Some examples of what I mean:

  • defaultPackages.essential = true to install neovim and git;
  • defaultPackages.development = true for jj and Emacs.
  • defaultPackages.desktop = true for cantata, obs, vlc, vesktop, soulseek;

Naturally, one would expect some way to say "all these, except this and that."

TODO Set envvars

$EDITOR

System maintenance scripts

It might be a good idea to namespace these as subcommands of a single binary.

TODO nix-clean

Collect garbage, clean up boot entries, delete old generations…

https://discourse.nixos.org/t/what-to-do-with-a-full-boot-partition/2049

TODO choose-editor

  • If the Emacs daemon is running…

    • …then run emacsclient.
    • …otherwise, prompt the user to choose between Emacs and Vim

      • If Emacs: run emacs.
      • If Vim: In order, try nvim, vim, then vi.

        • If neither are available, use nix run nixpkgs#nvim

          • If this fails, try nano.
  • Support --pager

TODO rage-edit

TODO forget-host HOST

Remove a given host from ~/.ssh/known_hosts. Something like sed -i -e '/192.168.122.54/d' .ssh/known_hosts.

TODO lets-temp [NAME]

Create a new tempdir called [NAME], and cd into it.

References

Following is a subset of the many places I've learnt from.