15 KiB
Executable File
Guix-rebound 2
- Inbox
- Conventions
- Hosts
- Users
sydnix-cli- Tasks
- Emacs from scratch
- Daemon
- Encryption
- Mutable config
- KILL Packages via Nixpkgs
- Org-mode
- Default fonts
- project.el
- Workspaces
- Prose minor mode
- Sexp editing
- Lookup handlers
- Repl-handling
- Comint
- Eshell
- Snippets
- File templates
- Project templates
- Magit
- Prettier Vertico
- Dired/Dirvish
- SPC i
- SPC o
- SPC t
- Vertico repeat
- so-long-mode
- Consult icons
- Language support
- Tune GC w/
gcmh - IDEA Email?
- IDEA
map!macro - IDEA Module system?
- Emacs config
- One-off environment changes without direnv
- minibuffer
- dired
- set up JuliaMono for use with ipa: links
- text-mode
- 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
- set up JuliaMono for use with IPA glyphs
- KILL literate config
- evil-cp fixes
- automatically close compilation buffer
- fix
[e/]e - unmap
TABin normal mode - eshell trail à la M-x calc
- Securely store credentials for glab/gh CLIs
- Dotfiles
- disko
- IDEA refactor disko configs to be more reusable
- IDEA replace uses of gpg with age
- password store 4 firefox
- password store w/ age
- Automatically sync password store
- secrets
- git config
- niri
- qtile
- Convenient way to wrap programs
- tf2.nix
- mpd
- syncthing
- HOLD impermanence
sydnix.defaultsmodule- Split up
flake.nixinto a file per output - default package sets
- Set envvars
- System maintenance scripts
- Emacs from scratch
- References
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…
- home-manager's modules.
- Wrappers, with config files optionally living somewhere under
/persist/dots. home.fileand similar.- Mutable symlinks using
home.fileandmkOutOfStoreSymlink.
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 ];
# ...
};
}
modules/
modules
├── home
│ └── «Various home-manager modules»…
└── nixos
├── defaults
│ └── «NixOS modules that are *enabled by default*»…
├── deertopia
│ └── «NixOS modules that are *specific to Deertopia*»…
└── «Various NixOS modules»…
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-rootsolder 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.
Deferring Emacs packages
Nearly all configuration of Emacs packages happens under the use-package macro. use-package has various keywords with special syntax for common tasks, such as instrumenting hooks, setting keybindings, and customising variables. You may be surprised to learn that these are not just syntactic sugar }:) (I was).
As an example, this
(use-package which-key
:hook (on-first-input . which-key-mode)
:custom
(which-key-allow-evil-operators t)
(which-key-show-operator-state-maps t)
is not the same as this
(use-package which-key
:config
(add-hook 'on-first-input #'which-key-mode)
(setq which-key-allow-evil-operators t)
(setq which-key-show-operator-state-maps t)
The difference connects to another silly obsession of the Emacs hacker: startup time. use-package's special keywords will defer the loading of the package ([cite:@systemcrafters2021how]) . E.g., instead of loading which-key on startup, it will be loaded when the on-first-input hook is first called.
on-first-input is one of many useful hooks provided by the package on.el specialised for fine-grained control of package loading.
Naming conventions in my Emacs config
As with the rest of the config, these are largely adapted from Doom's ([cite:@lissner2022contributing]). }:3
-
syd-[-]«NAME» - Typical 'namespaced' Elisp convention ([cite:@gnu2020conventions]).
-
syd/«NAME» - Commands intended for interactive use.
-
+syd-[-]«NAME»(f) - Indicates a strategy function.
-
+syd-[-]«NAME»(v) - Indicates a variable holding various stategies available to a specific strategy function.
-
syd-«NAME»-initialise, wheremodules/«NAME» ∈ modules/*.el - Instead of using top-level side-effects, (bar e.g.
use-packageinvocations) should be wrapped in this kind of initialisation procedure. -
«NAME»-h - Procedure defined specifically to be added to a hook.
Hosts
nixos-testbed
Configuration for the VM I'm currently using as a testbed, before moving to my real desktop.
deertopia
My home server.
Users
crumb
Me }:). My primary user for programming and playing TF2.
lain
A bit on the nose for a transfemme into computers, but my chosen name is also Madeleine.
Used as a server admin account with little configuration.
sydnix-cli
sydnix-cli is a command-line utility written in Clojure wrapping various sydnix-related scripts.
Tasks
Emacs from scratch
DONE Daemon
CLOSED: [2025-01-03 Fri 20:00]
DONE Encryption
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.
KILL Packages via Nixpkgs
CLOSED: [2025-01-03 Fri 20:40]
TODO Org-mode
TODO Roam
TODO Dailies
TODO Tags: project, readinglist
Disassemble project-ideas.org and reading-list.org into a individual roam nodes.
TODO Capture templates
IDEA Export to GitLab issue?
TODO Config TODO list / pain-point list
TODO Default fonts
- fixed-pitch: Victor Mono NF
- variable-pitch: Overpass
- backup: Julia Mono
DONE project.el
CLOSED: [2025-01-16 Thu 18:19]
TODO Workspaces
TODO Prose minor mode
TODO Grammar-checking
TODO Spell-checking
TODO Sexp editing
TODO Lookup handlers
DONE Repl-handling
CLOSED: [2025-01-31 Fri]
TODO Comint
TODO Eshell
TODO Prompt
TODO Greeting
TODO Aliases
TODO Evil
TODO Project integration
TODO Syntax highlighting
TODO
C-d
TODO Snippets
TODO File templates
TODO Project templates
TODO Magit
TODO Forges
TODO Prettier Vertico
Doom has some nice output when viewing files in Vertico. I'm not sure how this is achieved.
TODO Dired/Dirvish
TODO SPC i
TODO SPC o
TODO SPC t
TODO Vertico repeat
TODO so-long-mode
TODO Consult icons
TODO compile-multi-all-the-icons
Language support
TODO Clojure
TODO Haskell
TODO Nix
TODO Elisp
TODO
Tune GC w/ gcmh
IDEA Email?
IDEA map! macro
IDEA 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
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
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
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
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.
TODO Securely store credentials for glab/gh CLIs
TODO Dotfiles
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]
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 = trueto installneovimandgit;defaultPackages.development = trueforjjand Emacs.defaultPackages.desktop = trueforcantata,obs,vlc,vesktop,soulseek;
Naturally, one would expect some way to say "all these, except this and that."
TODO Set envvars
$EDITOR
See choose-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, thenvi.-
If neither are available, use
nix run nixpkgs#nvim- If this fails, try
nano.
- If this fails, try
-
- If Emacs: run
- …then run
- 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.
Confirm by printing diff.
TODO
lets-temp [NAME]
Create a new tempdir called [NAME], and cd into it.
TODO
doctor / status
Run various checks on the system.
- Sizes of caches. perhaps those listed by
sydnix.impermanence.cache.{files,directories}? Offer to clean them if they're getting old or large. - Check for available upgrades. Flake inputs, overlays, emacs packages, etc.
TODO
persist status
List persistent files per user, and show their mount strategy.
References
Following is a subset of the many places I've learnt from.
- My darling dearest Faye's
wishsys}:D - rasendubi/dotfiles
- mangoiv/dotfiles
- hlissner/dotfiles
- Shawn8901/nix-configuration
- [cite:@christensen2020erase]
- [cite:@ayats2024dropping]
- [cite:@zaynetdinov2024you]
- [cite:@schafer2017advanced]
- Emacs Prelude
- Doom Emacs
- Ryan Rix's Complete Computing Environment
- [cite:@wünsch2024setting]
- neeasade/emacs.d — Has an interesting 'module' system.
- oantolin/emacs-config — Has some internal packages.