refactor: Move user config into modules/

This commit is contained in:
Madeleine Sydney
2025-03-13 11:14:32 -06:00
parent 257f011a99
commit fb3299d89c
85 changed files with 597 additions and 542 deletions

View File

@@ -1,24 +1,22 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
with lib;
let cfg = config.sydnix.sops; let cfg = config.sydnix.sops;
in { in {
options = { options = {
sydnix.sops = { sydnix.sops = {
enable = mkEnableOption "Sops"; enable = lib.mkEnableOption "Sops";
keyFile = mkOption { keyFile = lib.mkOption {
description = "Path to an Age key file."; description = "Path to an Age key file.";
type = types.path; type = lib.types.path;
default = config.home.homeDirectory + "/key.txt"; default = config.home.homeDirectory + "/key.txt";
}; };
secrets = mkOption { secrets = lib.mkOption {
description = "Secrets passed directly to sops-nix."; description = "Secrets passed directly to sops-nix.";
}; };
}; };
}; };
config = mkIf cfg.enable { config = lib.mkIf cfg.enable {
home.packages = [ home.packages = [
pkgs.sops pkgs.sops
]; ];

19
modules/home/users.nix Normal file
View File

@@ -0,0 +1,19 @@
{ config, lib, pkgs, ... }:
let
# TODO: Move to a fucking utility library already!
listNixFilesInDirectory = dir:
builtins.attrNames
(lib.filterAttrs
(k: _v: lib.hasSuffix ".nix" k)
(builtins.readDir dir));
in {
imports =
(builtins.concatMap
(user:
builtins.map
(module:
./users/${user}/${module})
(listNixFilesInDirectory ./users/${user}))
(builtins.attrNames (builtins.readDir ./users)));
}

View File

@@ -0,0 +1,25 @@
{ config, lib, pkgs, ... }:
let
mutableSymlink = config.lib.file.mkOutOfStoreSymlink;
cfg = config.sydnix.users.crumb.age;
in
{
options.sydnix.users.crumb.age.enable = lib.mkEnableOption "Age, à la crumb";
config = lib.mkIf cfg.enable {
home.packages = [
# Rage supports pinentry while Age does not.
pkgs.rage
];
# We use a mutable symlink to avoid placing the key inside the
# world-readable store.
home.file."private-keys/age/${config.home.username}.age".source =
mutableSymlink "/persist/private-keys/age/${config.home.username}.age";
home.file."public-keys/age/${config.home.username}.pub".source =
../../../../public-keys/age/${config.home.username}.pub;
};
}

View File

@@ -0,0 +1,13 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.users.crumb.bash;
in {
options.sydnix.users.crumb.bash.enable = lib.mkEnableOption "Bash, à la crumb";
config = lib.mkIf cfg.enable {
programs.bash = {
enable = true;
};
};
}

View File

@@ -0,0 +1,15 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.users.crumb.direnv;
in {
options.sydnix.users.crumb.direnv.enable =
lib.mkEnableOption "direnv, à la crumb";
config = lib.mkIf cfg.enable {
programs.direnv = {
enable = true;
nix-direnv.enable = true;
};
};
}

View File

@@ -0,0 +1,132 @@
{ config, lib, pkgs, inputs, ... }@args:
let cfg = config.sydnix.users.crumb.emacs;
in {
options.sydnix.users.crumb.emacs.enable =
lib.mkEnableOption ''Emacs, à la crumb'';
config = lib.mkIf cfg.enable
(let
emacsBasePackage = pkgs'.emacs-unstable-pgtk;
# Hard-coded path. }:\
emacsConfigDir =
"/persist/dots/modules/home/users/${config.home.username}/emacs";
# Create a new instance of nixpkgs with emacs-overlay applied. This is a
# little unorthodox, but we do it
# 1. for the sake of organisation — For pure aesthetics and a clean
# codebase, I want everything Emacs to stay in this file;
# 2. and, there's simply no need to leak emacs-overlay's packages into the
# global nixpkgs instance when nothing else is using it!
pkgs' = import inputs.nixpkgs {
system = args.system;
overlays = [ inputs.emacs-overlay.overlays.emacs ];
};
emacsDataDir = "${config.xdg.dataHome}/emacs";
emacsCacheDir = "${emacsDataDir}/cache";
straightBaseDir = "${emacsDataDir}/straight";
fontPackages = [
pkgs.julia-mono
pkgs.nerd-fonts.victor-mono
pkgs.ibm-plex
];
my-aspell = pkgs.aspellWithDicts
(dicts: with dicts; [
en en-computers en-science
]);
my-emacs =
let ewp = (pkgs.emacsPackagesFor emacsBasePackage).emacsWithPackages
(epkgs: with epkgs; [
jinx
pdf-tools
treesit-grammars.with-all-grammars
]);
in pkgs.symlinkJoin {
name = "sydmacs";
paths = [ ewp ];
nativeBuildInputs = [ pkgs.makeWrapper ];
buildInputs = [
pkgs.git # Dependency of Straight.el.
my-aspell
pkgs.direnv
];
postBuild = ''
find "$out/bin" -name emacs -or -name "emacs-*" \
| while IFS= read -r emacs; do
echo "emacs: $emacs"
wrapProgram "$emacs" \
--add-flags "--init-directory \"${emacsConfigDir}\"" \
--set EMACS_STRAIGHT_BASE_DIR "${straightBaseDir}" \
--set EMACS_CACHE_DIR "${emacsCacheDir}" \
--set EMACS_DATA_DIR "${emacsDataDir}" \
--prefix PATH : "${pkgs.git}/bin" \
--prefix PATH : "${my-aspell}/bin" \
--prefix PATH : "${pkgs.direnv}/bin" \
--prefix PATH : "${pkgs.texliveFull}/bin" \
--set ASPELL_CONF "dict-dir ${my-aspell}/lib/aspell"
done
'';
meta = emacsBasePackage.meta;
version = emacsBasePackage.version;
};
emacsclient-or-emacs = pkgs.writeShellScriptBin "emacsclient-or-emacs" ''
emacsclient --alternate-editor=${config.programs.emacs.finalPackage}/bin/emacs "$@"
'';
in {
programs.emacs = {
enable = true;
package = my-emacs;
};
sydnix.impermanence.cache.directories =
# Impermanence expects the path to be relative to ~.
map (lib.removePrefix config.home.homeDirectory) [
straightBaseDir
emacsCacheDir
emacsDataDir
];
# Set emacsclient as the default editor for the time being.
home.sessionVariables =
let e = "${emacsclient-or-emacs}/bin/emacsclient-or-emacs";
in {
"EDITOR" = e;
"VISUAL" = e;
};
home.file =
let default =
lib.removePrefix "${config.home.homeDirectory}/"
"${straightBaseDir}/straight/versions/default.el";
in {
${default}.source =
config.lib.file.mkOutOfStoreSymlink
"${emacsConfigDir}/straight-lockfile.el";
};
home.packages = [
emacsclient-or-emacs
] ++ fontPackages;
# There's probably a better place to put this, but the current setup demands
# Fontconfig for Emacs to find my fonts.
fonts.fontconfig.enable = true;
# TODO: Make sure this is using the right package for Emacs...
services.emacs = {
enable = true;
# Generate a desktop entry for emacsclient.
client.enable = true;
};
home.shellAliases = {
e = "emacsclient-or-emacs";
ec = "emacsclient";
em = "emacs";
};
});
}

View File

@@ -4,6 +4,22 @@
(interactive) (interactive)
(dired default-directory)) (dired default-directory))
(defun syd-dired-goto-file (file)
"Like `dired-goto-file', but will act as `find-file' if FILE is inside another
directory."
(interactive
(prog1 (let ((dir (dired-current-directory)))
(list (directory-file-name
(file-relative-name
(read-file-name "Goto file: " dir)
dir))))
;; let push-mark display its message
(push-mark))
dired-mode)
(if (file-name-directory file)
(find-file file)
(dired-goto-file (expand-file-name file))))
(use-package dired (use-package dired
;; Built-in to Emacs. ;; Built-in to Emacs.
:straight nil :straight nil
@@ -15,6 +31,8 @@
(:keymaps 'dired-mode-map (:keymaps 'dired-mode-map
:states '(normal motion) :states '(normal motion)
"g r" #'revert-buffer) "g r" #'revert-buffer)
(:keymaps 'dired-mode-map
[remap dired-goto-file] #'syd-dired-goto-file)
:commands dired-jump :commands dired-jump
:custom (;; When there are other Dired windows open, suggest them as targets :custom (;; When there are other Dired windows open, suggest them as targets
;; for renaming/copying. ;; for renaming/copying.

View File

@@ -0,0 +1,142 @@
{ config, lib, pkgs, inputs, ... }@args:
let
cfg = config.sydnix.users.crumb.firefox;
in {
options.sydnix.users.crumb.firefox.enable =
lib.mkEnableOption "Firefox, à la crumb";
config = lib.mkIf cfg.enable {
programs.firefox = {
enable = true;
# Available language codes can be found on the releases page:
# https://releases.mozilla.org/pub/firefox/releases/134.0.2/linux-x86_64/xpi/.
# The string `134.0.2` may be substituted for any other Firefox release
# number.
languagePacks = [
"en-US"
"en-GB"
];
# Available options can be found at
# https://mozilla.github.io/policy-templates/.
policies = {
DisableTelemetry = true;
DisableFirefoxStudies = false;
EnableTrackingProtection = {
Value = true;
Locked = true;
Cryptomining = true;
Fingerprinting = true;
};
FirefoxHome = {
Search = true;
TopSites = true;
SponsoredTopSites = false;
Highlights = false;
Pocket = false;
SponsoredPocket = false;
Snippets = false;
Locked = false;
};
# Weird advertiser shit.
FirefoxSuggest = {
WebSuggestions = false;
SponsoredSuggestions = false;
ImproveSuggest = false;
Locked = false;
};
# Weird advertiser shit.
DisablePocket = true;
DisableFirefoxAccounts = true;
DisableAccounts = true;
# Firefox has an in-built screenshot tool that I do not need.
DisableFirefoxScreenshots = true;
# Disable pop-up windows that appear after installation and updates.
OverrideFirstRunPage = "";
OverridePostUpdatePage = "";
# You think you're so important, don't you, Firefox?
DontCheckDefaultBrowser = true;
# Only tabs not yet visiting a page. Alternatives: `always`, `never`,
# `newtab`.
DisplayBookmarksToolbar = "newtab";
# Alternatives: `always`, `never`, `default-on`, `default-on`.
DisplayMenuBar = "default-off";
# Alternative: `unified`, `separate`.
SearchBar = "unified";
};
profiles."msyds" = {
bookmarks = [];
# Check about:support for extension/add-on ID strings.
extensions = {
# Override non-declared settings.
force = true;
packages =
let pkgs' = import inputs.nixpkgs {
system = args.system;
overlays = [ inputs.nur.overlays.default ];
};
in
with pkgs'.nur.repos.rycee.firefox-addons; [
ublock-origin
darkreader
privacy-badger
vimium
kagi-search
duckduckgo-privacy-essentials
edit-with-emacs
copy-as-org-mode
clearurls
];
};
search = {
# Override non-declared settings.
force = true;
# Precedence of search engines.
order = [ "Kagi" "DuckDuckGo" ];
default = "Kagi";
privateDefault = "DuckDuckGo";
engines = {
"Nixpkgs" = {
urls = [{
template = "https://search.nixos.org/packages";
params = [
{ name = "type"; value = "packages"; }
{ name = "query"; value = "{searchTerms}"; }
];
}];
icon =
"${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
definedAliases = [ "!np" ];
};
};
};
# See `about:config` in Firefox for available settings.
settings = {
# Disable suggestions.
"browser.search.suggest.enabled" = false;
# Enable dark theme for non-website UI; the URL bar and such.
"extensions.activeThemeID" = "firefox-compact-dark@mozilla.org";
"browser.theme.content-theme" = 0;
"browser.theme.toolbar-theme" = 0;
"browser.in-content.dark-mode" = true;
"ui.systemUsesDarkTheme" = 1;
# Disable sponsored suggestions.
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
"browser.newtabpage.activity-stream.system.showSponsored" = false;
"browser.newtabpage.activity-stream.showSponsored" = false;
"browser.urlbar.sponsoredTopSites" = false;
"services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsored"
= false;
"services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsoredTopSites"
= false;
};
};
};
};
}

View File

@@ -0,0 +1,83 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.users.crumb.git;
options.sydnix.users.crumb.git.enable =
lib.mkEnableOption "Git, à la crumb";
# TODO: Move somewhere else.
my-email = "lomiskiam@gmail.com";
my-name = "Madeleine Sydney";
in {
options.sydnix.users.crumb.git.enable =
lib.mkEnableOption "Git, à la crumb";
config = lib.mkIf cfg.enable (
lib.mkMerge [
{
### Git
programs.git = {
enable = true;
userEmail = my-email;
userName = my-name;
};
home.shellAliases = {
ga = "git add";
gb = "git branch";
gc = "git commit";
gcl = "git clone";
gco = "git checkout";
gd = "git diff";
gl = "git log";
glo = "git log --pretty=oneline";
glol = "git log --graph --oneline --decorate";
gp = "git push";
gr = "git remote";
grs = "git remote show";
gs = "git status";
gtd = "git tag --delete";
};
}
{
### Jujutsu
programs.jujutsu = {
enable = true;
settings.user = {
email = my-email;
name = my-name;
};
};
home.shellAliases = {
jb = "jj bookmark";
jdi = "jj diff";
jd = "jj describe";
je = "jj edit";
jgcl = "jj git clone";
jgp = "jj git push";
jgr = "jj git remote";
jl = "jj log";
jn = "jj new";
js = "jj status";
jsp = "jj split";
};
}
{
### Github CLI
programs.gh = {
enable = true;
settings = {
git_protocol = "ssh";
};
};
sydnix.sops.secrets.github-oauth = {};
}
{
### Gitlab CLI
programs.glab.enable = true;
}
]);
}

View File

@@ -0,0 +1,57 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.users.crumb.haskell;
in {
options.sydnix.users.crumb.haskell.enable =
lib.mkEnableOption "Haskell, à la crumb";
config = lib.mkIf cfg.enable {
# Convenient shorthand for quickly opening Haskell REPLs.
programs.bash.profileExtra = ''
# Start a GHCi REPL with the given packages made available.
ghci-with-packages () {
nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [ $@ ])" \
--run ghci
}
# Run GHC with the given packages made available.
ghc-with-packages () {
getopt -o "p" -- "$@"
while true; do
case "$1" in
-p)
packages="$1"
shift 2
;;
--)
shift
break
;;
esac
done
if [ $? -ne 0 ]; then
echo "Invalid options provided"
exit 1
fi
eval set -- "$options"
nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [ $packages ])" \
--run "ghc $@"
}
'';
sydnix.impermanence.cache.directories =
let xdg-cache-dir =
config.home.cacheHome
or "${config.home.homeDirectory}/.cache";
in [
# We don't want to rebuild Hackage simply due to a reboot, do we? }:)
(lib.removePrefix "${config.home.homeDirectory}/"
"${xdg-cache-dir}/cabal")
];
};
}

View File

@@ -0,0 +1,36 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.users.crumb.mpd;
in {
options.sydnix.users.crumb.mpd.enable =
lib.mkEnableOption "MPD, à la crumb";
config = lib.mkIf cfg.enable {
sydnix.sops.secrets = {
lastfm-password = {};
librefm-password = {};
};
sydnix.mpd = {
enable = true;
scrobbling.endpoints = {
"last.fm" = {
passwordFile =
"/home/crumb/.config/sops-nix/secrets/lastfm-password";
username = "crumb1";
};
"libre.fm" = {
passwordFile =
"/home/crumb/.config/sops-nix/secrets/librefm-password";
username = "crumbtoo";
};
};
};
# mpdscribble uses our password files, so it is imperative that the service
# runs only after said password files are brought into existence. }:)
systemd.user.services.mpdscribble.Unit.After = [ "sops-nix.service" ];
};
}

View File

@@ -0,0 +1,39 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.users.crumb.nvim;
in {
options.sydnix.users.crumb.nvim.enable =
lib.mkEnableOption "Neovim, à la crumb";
config = lib.mkIf cfg.enable (
let
my-vimrc =
pkgs.writeTextFile {
name = "vimrc";
text = ''
imap jk <ESC>
xmap JK <ESC>
set number
set relativenumber
'';
};
my-neovim =
pkgs.symlinkJoin {
name = "neovim";
paths = [ pkgs.neovim ];
buildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/nvim \
--add-flags "-u ${my-vimrc}"
# Symlink {v,vi,vim} to nvim.
for i in {v,vi,vim}; do
ln -s $out/bin/nvim $out/bin/$i
done
'';
};
in {
home.packages = [ my-neovim ];
});
}

View File

@@ -14,7 +14,7 @@
homeConfiguration = { config, lib, pkgs, ... }: { homeConfiguration = { config, lib, pkgs, ... }: {
imports = [ imports = [
./programs.nix # ./programs.nix
./files.nix ./files.nix
]; ];
@@ -31,6 +31,18 @@
enable = true; enable = true;
keyFile = "/persist/private-keys/age/${config.home.username}"; keyFile = "/persist/private-keys/age/${config.home.username}";
}; };
# Personal configurations.
users.crumb = {
age.enable = true;
bash.enable = true;
direnv.enable = true;
firefox.enable = true;
git.enable = true;
haskell.enable = true;
mpd.enable = true;
nvim.enable = true;
emacs.enable = true;
};
}; };
# Don't touch! # Don't touch!

View File

@@ -1,7 +0,0 @@
{ config, lib, pkgs, utils, ... }:
{
imports =
map (x: ./programs/${x})
(utils.listNixFilesInDirectory ./programs);
}

View File

@@ -1,18 +0,0 @@
{ config, lib, pkgs, ... }:
let mutableSymlink = config.lib.file.mkOutOfStoreSymlink;
in {
home.packages = [
# Rage supports pinentry while Age does not.
pkgs.rage
];
# Private keys must be mutable symlinks since we don't want the key inside the
# world-readable store.
home.file."private-keys/age/crumb.age".source =
mutableSymlink "/persist/private-keys/age/${config.home.username}.age";
home.file."public-keys/age/crumb.pub".source =
../../../public-keys/age/${config.home.username}.pub;
}

View File

@@ -1,7 +0,0 @@
{ config, lib, pkgs, ... }:
{
programs.bash = {
enable = true;
};
}

View File

@@ -1,15 +0,0 @@
{ config, lib, pkgs, ... }:
{
# High-speed Nix support. Note that Lorri has a years-old open issue
# preventing it from starting on boot/login correctly.
#
# Currently unused in favour of nix-direnv.
# services.lorri.enable = true;
programs.direnv = {
enable = true;
nix-direnv.enable = true;
};
}

View File

@@ -1,125 +0,0 @@
{ config, lib, pkgs, inputs, ... }@args:
let
emacsBasePackage = pkgs'.emacs-unstable-pgtk;
emacsConfigDir = "/persist/dots/users/crumb/programs/emacs";
# emacs-overlay =
# import (builtins.fetchTarball {
# url =
# "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz";
# sha256 = "sha256:02aln37ch9isz8h7dlm9v6jkl60g923z0dij0rjsxq7xi61fas2j";
# });
# Create a new instance of nixpkgs with emacs-overlay applied. This is a
# little unorthodox, but we do it
# 1. for the sake of organisation — For pure aesthetics and a clean
# codebase, I want everything Emacs to stay in this file;
# 2. and, there's simply no need to leak emacs-overlay's packages into the
# global nixpkgs instance when nothing else is using it!
pkgs' = import inputs.nixpkgs {
system = args.system;
overlays = [ inputs.emacs-overlay.overlays.emacs ];
};
emacsDataDir = "${config.xdg.dataHome}/emacs";
emacsCacheDir = "${emacsDataDir}/cache";
straightBaseDir = "${emacsDataDir}/straight";
fontPackages = [
pkgs.julia-mono
pkgs.nerd-fonts.victor-mono
pkgs.ibm-plex
];
my-aspell = pkgs.aspellWithDicts
(dicts: with dicts; [
en en-computers en-science
]);
my-emacs =
let ewp = (pkgs.emacsPackagesFor emacsBasePackage).emacsWithPackages
(epkgs: with epkgs; [
jinx
pdf-tools
treesit-grammars.with-all-grammars
]);
in pkgs.symlinkJoin {
name = "sydmacs";
paths = [ ewp ];
nativeBuildInputs = [ pkgs.makeWrapper ];
buildInputs = [
pkgs.git # Dependency of Straight.el.
my-aspell
pkgs.direnv
];
postBuild = ''
find "$out/bin" -name emacs -or -name "emacs-*" \
| while IFS= read -r emacs; do
echo "emacs: $emacs"
wrapProgram "$emacs" \
--add-flags "--init-directory \"${emacsConfigDir}\"" \
--set EMACS_STRAIGHT_BASE_DIR "${straightBaseDir}" \
--set EMACS_CACHE_DIR "${emacsCacheDir}" \
--set EMACS_DATA_DIR "${emacsDataDir}" \
--prefix PATH : "${pkgs.git}/bin" \
--prefix PATH : "${my-aspell}/bin" \
--prefix PATH : "${pkgs.direnv}/bin" \
--prefix PATH : "${pkgs.texliveFull}/bin" \
--set ASPELL_CONF "dict-dir ${my-aspell}/lib/aspell"
done
'';
meta = emacsBasePackage.meta;
version = emacsBasePackage.version;
};
emacsclient-or-emacs = pkgs.writeShellScriptBin "emacsclient-or-emacs" ''
emacsclient --alternate-editor=${config.programs.emacs.finalPackage}/bin/emacs "$@"
'';
in {
programs.emacs = {
enable = true;
package = my-emacs;
};
sydnix.impermanence.cache.directories =
# Impermanence expects the path to be relative to ~.
map (lib.removePrefix config.home.homeDirectory) [
straightBaseDir
emacsCacheDir
emacsDataDir
];
# Set emacsclient as the default editor for the time being.
home.sessionVariables =
let e = "${emacsclient-or-emacs}/bin/emacsclient-or-emacs";
in {
"EDITOR" = e;
"VISUAL" = e;
};
home.file =
let default =
lib.removePrefix "${config.home.homeDirectory}/"
"${straightBaseDir}/straight/versions/default.el";
in {
${default}.source =
config.lib.file.mkOutOfStoreSymlink
"/persist/dots/users/crumb/programs/emacs/straight-lockfile.el";
};
home.packages = [
emacsclient-or-emacs
] ++ fontPackages;
# There's probably a better place to put this, but the current setup demands
# Fontconfig for Emacs to find my fonts.
fonts.fontconfig.enable = true;
# TODO: Make sure this is using the right package for Emacs...
services.emacs = {
enable = true;
# Generate a desktop entry for emacsclient.
client.enable = true;
};
}

View File

@@ -1,134 +0,0 @@
{ config, lib, pkgs, inputs, ... }@args:
let
pkgs' = import inputs.nixpkgs {
system = args.system;
overlays = [ inputs.nur.overlays.default ];
};
in {
programs.firefox = {
enable = true;
# Available language codes can be found on the releases page:
# https://releases.mozilla.org/pub/firefox/releases/134.0.2/linux-x86_64/xpi/.
# The string `134.0.2` may be substituted for any other Firefox release
# number.
languagePacks = [
"en-US"
"en-GB"
];
# Available options can be found at https://mozilla.github.io/policy-templates/.
policies = {
DisableTelemetry = true;
DisableFirefoxStudies = false;
EnableTrackingProtection = {
Value = true;
Locked = true;
Cryptomining = true;
Fingerprinting = true;
};
FirefoxHome = {
Search = true;
TopSites = true;
SponsoredTopSites = false;
Highlights = false;
Pocket = false;
SponsoredPocket = false;
Snippets = false;
Locked = false;
};
# Weird advertiser shit.
FirefoxSuggest = {
WebSuggestions = false;
SponsoredSuggestions = false;
ImproveSuggest = false;
Locked = false;
};
# Weird advertiser shit.
DisablePocket = true;
DisableFirefoxAccounts = true;
DisableAccounts = true;
# Firefox has an in-built screenshot tool that I do not need.
DisableFirefoxScreenshots = true;
# Disable pop-up windows that appear after installation and updates.
OverrideFirstRunPage = "";
OverridePostUpdatePage = "";
# You think you're so important, don't you, Firefox?
DontCheckDefaultBrowser = true;
# Only tabs not yet visiting a page. Alternatives: `always`, `never`,
# `newtab`.
DisplayBookmarksToolbar = "newtab";
# Alternatives: `always`, `never`, `default-on`, `default-on`.
DisplayMenuBar = "default-off";
# Alternative: `unified`, `separate`.
SearchBar = "unified";
};
profiles."msyds" = {
bookmarks = [];
# Check about:support for extension/add-on ID strings.
extensions = {
# Override non-declared settings.
force = true;
packages = with pkgs'.nur.repos.rycee.firefox-addons; [
ublock-origin
darkreader
privacy-badger
vimium
kagi-search
duckduckgo-privacy-essentials
edit-with-emacs
copy-as-org-mode
clearurls
];
};
search = {
# Override non-declared settings.
force = true;
# Precedence of search engines.
order = [ "Kagi" "DuckDuckGo" ];
default = "Kagi";
privateDefault = "DuckDuckGo";
engines = {
"Nixpkgs" = {
urls = [{
template = "https://search.nixos.org/packages";
params = [
{ name = "type"; value = "packages"; }
{ name = "query"; value = "{searchTerms}"; }
];
}];
icon =
"${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
definedAliases = [ "!np" ];
};
};
};
# See `about:config` in Firefox for available settings.
settings = {
# Disable suggestions.
"browser.search.suggest.enabled" = false;
# Enable dark theme for non-website UI; the URL bar and such.
"extensions.activeThemeID" = "firefox-compact-dark@mozilla.org";
"browser.theme.content-theme" = 0;
"browser.theme.toolbar-theme" = 0;
"browser.in-content.dark-mode" = true;
"ui.systemUsesDarkTheme" = 1;
# Disable sponsored suggestions.
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
"browser.newtabpage.activity-stream.system.showSponsored" = false;
"browser.newtabpage.activity-stream.showSponsored" = false;
"browser.urlbar.sponsoredTopSites" = false;
"services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsored"
= false;
"services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsoredTopSites"
= false;
};
};
};
}

View File

@@ -1,75 +0,0 @@
{ config, lib, pkgs, ... }:
let
# TODO: Move somewhere else.
my-email = "lomiskiam@gmail.com";
my-name = "Madeleine Sydney";
in lib.mkMerge [
{
### Git
programs.git = {
enable = true;
userEmail = my-email;
userName = my-name;
};
home.shellAliases = {
ga = "git add";
gb = "git branch";
gc = "git commit";
gcl = "git clone";
gco = "git checkout";
gd = "git diff";
gl = "git log";
glo = "git log --pretty=oneline";
glol = "git log --graph --oneline --decorate";
gp = "git push";
gr = "git remote";
grs = "git remote show";
gs = "git status";
gtd = "git tag --delete";
};
}
{
### Jujutsu
programs.jujutsu = {
enable = true;
settings.user = {
email = my-email;
name = my-name;
};
};
home.shellAliases = {
jb = "jj bookmark";
jdi = "jj diff";
jd = "jj describe";
je = "jj edit";
jgcl = "jj git clone";
jgp = "jj git push";
jgr = "jj git remote";
jl = "jj log";
jn = "jj new";
js = "jj status";
jsp = "jj split";
};
}
{
### Github CLI
programs.gh = {
enable = true;
settings = {
git_protocol = "ssh";
};
};
sydnix.sops.secrets.github-oauth = {};
}
{
### Gitlab CLI
programs.glab.enable = true;
}
]

View File

@@ -1,61 +0,0 @@
{ config, lib, pkgs, ... }:
{
# Convenient shorthand for quickly opening Haskell REPLs.
programs.bash.profileExtra = ''
# Start a GHCi REPL with the given packages made available.
ghci-with-packages () {
nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [ $@ ])" \
--run ghci
}
# Run GHC with the given packages made available.
ghc-with-packages () {
getopt -o "p" -- "$@"
while true; do
case "$1" in
-p)
packages="$1"
shift 2
;;
--)
shift
break
;;
esac
done
if [ $? -ne 0 ]; then
echo "Invalid options provided"
exit 1
fi
eval set -- "$options"
nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [ $packages ])" \
--run "ghc $@"
}
'';
sydnix.impermanence.cache.directories =
let xdg-cache-dir =
config.home.cacheHome
or "${config.home.homeDirectory}/.cache";
in [
# We don't want to rebuild Hackage simply due to a reboot, do we? }:)
(lib.removePrefix "${config.home.homeDirectory}/"
"${xdg-cache-dir}/cabal")
];
# # Some global Cabal configuration.
# xdg.configFile."cabal/config".text = ''
# repository hackage.haskell.org
# url: http://hackage.haskell.org/
# nix: True
# remote-repo-cache: /home/crumb/.cache/cabal/packages
# build-summary: /home/crumb/.cache/cabal/logs/build.log
# jobs: $ncpus
# remote-build-reporting: none
# '';
}

View File

@@ -1,28 +0,0 @@
{ config, lib, pkgs, ... }:
{
sydnix.sops.secrets = {
lastfm-password = {};
librefm-password = {};
};
sydnix.mpd = {
enable = true;
scrobbling.endpoints = {
"last.fm" = {
passwordFile =
"/home/crumb/.config/sops-nix/secrets/lastfm-password";
username = "crumb1";
};
"libre.fm" = {
passwordFile =
"/home/crumb/.config/sops-nix/secrets/librefm-password";
username = "crumbtoo";
};
};
};
# mpdscribble uses our password files, so it is imperative that the service
# runs only after said password files are brought into existence. }:)
systemd.user.services.mpdscribble.Unit.After = [ "sops-nix.service" ];
}

View File

@@ -1,31 +0,0 @@
{ config, lib, pkgs, ... }:
let
my-vimrc =
pkgs.writeTextFile {
name = "vimrc";
text = ''
imap jk <ESC>
xmap JK <ESC>
set number
set relativenumber
'';
};
my-neovim =
pkgs.symlinkJoin {
name = "neovim";
paths = [ pkgs.neovim ];
buildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/nvim \
--add-flags "-u ${my-vimrc}"
# Symlink {v,vi,vim} to nvim.
for i in {v,vi,vim}; do
ln -s $out/bin/nvim $out/bin/$i
done
'';
};
in {
home.packages = [ my-neovim ];
}

View File

@@ -1,33 +0,0 @@
{ config, lib, pkgs, ... }:
let mutableSymlink = config.lib.file.mkOutOfStoreSymlink;
in {
home.packages = [ pkgs.passage ];
home.file.".passage/identities".source =
mutableSymlink config.sydnix.sops.keyFile;
sydnix.impermanence.directories = [
".passage/store"
];
home.shellAliases."pass" = "${pkgs.passage}/bin/passage";
# TODO:
# systemd.user.services.sync-password-store = {
# Unit = {
# Description = "Pull and push user password store.";
# };
# Service = {
# Environment = "PATH=/run/current-system/sw/bin";
# ExecStart =
# let script = ''
# set -xe -o pipefail
# '';
# in pkgs.writeShellScript "sync-password-store" script;
# };
# Install = {
# WantedBy = ["default.target"];
# };
# };
}