Archived
Watch
1
0
Fork
You've already forked nixos
0

unliterated my config

This commit is contained in:
asnev 2026-09-07 03:21:32 +07:00
commit 1f978da586
Signed by: asnev
SSH key fingerprint: SHA256:8hagYq9hDUuS5clQ78FKhIoQDvg5crdkYMHX+3g7wB4
16 changed files with 566 additions and 2495 deletions

2
.gitignore vendored
View file

@ -1,4 +1,4 @@
.directory
*.swp
result
result/
result-*

View file

@ -1,4 +1,3 @@
# LICENSE
MIT License
Copyright (c) 2026 asnev
@ -20,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

6
flake.lock generated
View file

@ -23,11 +23,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1788405554,
"narHash": "sha256-r2f1oUwixlgq9zOdYLqJLfS/lWBT60/IITjhTKI59JU=",
"lastModified": 1788584326,
"narHash": "sha256-Fd3OB8J9JhgliQwOKcqx4M672CInxi1I5VnwsaXeSQo=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "a5cc6f2c37bf518436dc8d1c288ccd0c43c2f4c4",
"rev": "6713828a351efa628b025a1adf7f43cbf8597513",
"type": "github"
},
"original": {

440
flake.nix
View file

@ -1,4 +1,3 @@
# flake.nix
{
description = "asnev's NixOS configuration";
@ -22,446 +21,13 @@
home-manager,
...
}: {
# flake-modules
nixosConfigurations.phostron = nixpkgs.lib.nixosSystem {
specialArgs = {inherit inputs;};
modules = [
# phostron-configuration
# nixos-configuration
({ config, lib, pkgs, inputs, ... }: {
# nixos-configuration-contents
nix.settings.experimental-features = ["nix-command" "flakes"];
nix.settings.auto-optimise-store = true;
nix.package = pkgs.lixPackageSets.stable.lix;
nixpkgs.config.allowUnfree = true;
nixpkgs.overlays = [
(final: prev: {
unstable = import inputs.nixpkgs-unstable {
system = prev.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
})
(final: prev: {
inherit (prev.lixPackageSets.stable)
nixpkgs-review
nix-eval-jobs
nix-fast-build
colmena;
})
];
boot = {
loader.systemd-boot.enable = true;
loader.systemd-boot.configurationLimit = 10;
loader.efi.canTouchEfiVariables = true;
loader.timeout = 2;
kernelParams = ["quiet" "rd.udev.log_level=3" "rd.systemd.show_status=auto"];
initrd.verbose = false;
consoleLogLevel = 3;
kernelPackages = pkgs.linuxPackages;
};
time.timeZone = "Asia/Jakarta";
i18n.defaultLocale = "en_GB.UTF-8";
services = {
fwupd.enable = true;
xserver.xkb.layout = "us";
locate.enable = true;
printing.enable = true;
openssh.enable = false;
pulseaudio.enable = false;
pipewire.enable = true;
pipewire.alsa.enable = true;
pipewire.alsa.support32Bit = true;
pipewire.pulse.enable = true;
};
security.rtkit.enable = true;
security.sudo.enable = false;
security.doas.enable = true;
security.doas.extraRules = [{
groups = ["wheel"];
keepEnv = true;
persist = true;
}];
environment.systemPackages = with pkgs; [
nh alejandra literate git
# system utils
firmware-updater mtr gnupg ddate testdisk tree wget btop plocate traceroute
rlwrap entr unzip ffmpeg imagemagick gnome-disk-utility
# extra (oxidised) utils
fd bat xh tlrc dysk dust hyperfine ripgrep fzf eza
];
environment.shellAliases = {
sudo = "doas";
l = "eza --grid --all";
ll = "eza --long --all";
ls = "eza --long";
".." = "cd ..";
"..." = "cd ../..";
cat = "bat"; # this line is really funny to me
};
environment.sessionVariables.XDG_DATA_DIRS = [
"${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}"
"${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}"
];
programs = {
# nixos-configuration-programs-contents
fish.enable = true;
atuin.enable = true;
atuin.settings.sync_address = "https://api.atuin.sh";
atuin.settings.enter_accept = true;
starship.enable = true;
starship.transientPrompt.enable = true;
starship.transientPrompt.left = "starship module character";
starship.settings = {
"$schema" = "https://starship.rs/config-schema.json";
git_status = {
ahead = ">";
behind = "<";
diverged = "<>";
renamed = "r";
deleted = "d";
};
character.success_symbol = "[λ](bold green)";
character.error_symbol = "[λ](bold red)";
};
git.enable = true;
git.config = {
init.defaultBranch = "main";
advice.defaultBranchName = false;
gpg.format = "ssh";
commit.gpgSign = true;
url."https://github.com/".insteadOf = ["github:"];
};
steam.enable = true;
obs-studio.enableVirtualCamera = true;
ssh.startAgent = true;
nix-ld.enable = true;
nix-ld.libraries = with pkgs; [fuse e2fsprogs];
};
fonts.packages = with pkgs; [
# GUI fonts
inter corefonts vista-fonts roboto cantarell-fonts
# fonts for i18n
noto-fonts noto-fonts-cjk-sans noto-fonts-cjk-serif noto-fonts-color-emoji
noto-fonts-monochrome-emoji unifont unifont_upper unifont-csur
# terminal fonts
nerd-fonts.iosevka
];
fonts.fontconfig.antialias = true;
fonts.fontconfig.subpixel.rgba = "rgb";
xdg.portal.enable = true;
xdg.portal.config.common.default = ["gtk"];
xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-wlr];
})
# kde-plasma-configuration
({pkgs, ...}: {
services.displayManager.sddm.enable = true;
services.desktopManager.plasma6.enable = true;
environment.systemPackages = with pkgs.kdePackages; [
kate elisa bluez-qt kalk filelight kamoso konversation kmail ktorrent
kclock
];
environment.plasma6.excludePackages = [pkgs.kdePackages.discover];
})
({ config, lib, pkgs, modulesPath, ... }: {
# phostron-hardware-configuration-contents
imports = [(modulesPath + "/installer/scan/not-detected.nix")];
boot.initrd.availableKernelModules = ["nvme" "ehci_pci" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"];
boot.initrd.kernelModules = [];
boot.kernelModules = ["kvm-amd"];
boot.extraModulePackages = [];
fileSystems."/" = {
device = "/dev/disk/by-uuid/24fb172c-c29f-40c3-ae4d-ff652358563a";
fsType = "ext4";
};
fileSystems."/boot" = {
device = "/dev/disk/by-uuid/DFC9-994A";
fsType = "vfat";
options = ["fmask=0077" "dmask=0077"];
};
swapDevices = [{device = "/dev/disk/by-uuid/91d96247-85c3-4e0a-93a2-5632b96179b6";}];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
# phostron-configuration-contents
system.stateVersion = "26.05"; # I didn't read the comment. :)
networking.hostName = "phostron";
networking.networkmanager.enable = true;
networking.firewall.enable = true;
services.printing.enable = true;
services.printing.drivers = [pkgs.epson-escpr];
hardware.bluetooth.enable = true;
hardware.sane.enable = true;
hardware.sane.extraBackends = [pkgs.epsonscan2];
services.displayManager.sddm.settings.Theme.Font = "Inter";
services.displayManager.sddm.settings.Theme.CursorSize = 18;
})
# coyote-configuration
({ pkgs, config, ... }: let
# coyote-configuration-variables
USER_ID = 1000;
KEY_FILE = "id_ed25519";
in {
# coyote-configuration-contents
users.users.coyote = {
isNormalUser = true;
description = "coyote";
extraGroups = ["wheel" "networkmanager" "lp" "scanner"];
uid = USER_ID;
};
users.defaultUserShell = pkgs.unstable.fish;
environment.sessionVariables.SSH_AUTH_SOCK = "/run/user/${builtins.toString USER_ID}/ssh-agent";
systemd.user.services.ssh-add-key = {
wantedBy = ["default.target"];
after = ["ssh-agent.service"];
serviceConfig = {
Type = "oneshot";
ExecStartPre = "${pkgs.coreutils-full}/bin/sleep 1";
ExecStart = [
"${pkgs.openssh}/bin/ssh-add ${config.users.users.coyote.home}/.ssh/${KEY_FILE}"
];
Restart = "on-failure";
RestartSec = 1;
};
};
})
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = {inherit inputs;};
home-manager.users.coyote.imports = [
({ pkgs, config, lib, inputs, ... }: {
# coyote-home-manager-configuration
# coyote-home-manager-configuration-contents
home.stateVersion = "26.05"; # Nope, didn't read the comment either.
home.username = "coyote";
home.homeDirectory = "/home/coyote";
home.shell.enableShellIntegration = true;
home.packages = with pkgs; [
# TUI
tdf neocities
# productivity
libreoffice-fresh karp keepassxc pdfarranger thunderbird
# multimedia
furnace corrscope vlc haruna subtitlecomposer kid3 kdePackages.kdenlive
unstable.audacity lmms-full calf vital
# Internet
ungoogled-chromium
# games
osu-lazer-bin pcsx2 flycast hail
# emulation
(unstable.bottles.override {removeWarningPopup = true;})
# devel
unstable.racket unstable.lazygit mitscheme
];
home.file = let
mkVimAfterFtplugin = content: langs:
builtins.listToAttrs (map (lang: {
name = ".vim/after/ftplugin/${lang}.vim";
value = {text = content;};
})
langs);
tab2Vim = ''
setlocal expandtab
setlocal tabstop=2
setlocal shiftwidth=2
setlocal softtabstop=2
'';
tab4Vim = ''
setlocal expandtab
setlocal tabstop=4
setlocal shiftwidth=4
setlocal softtabstop=4
'';
tabsVim = ''
setlocal noexpandtab
setlocal tabstop=4
setlocal shiftwidth=4
setlocal softtabstop=0
'';
lispVim = ''
setlocal expandtab
setlocal tabstop=2
setlocal shiftwidth=2
setlocal softtabstop=2
setlocal lisp
setlocal autoindent
setlocal showmatch
setlocal lispwords+=defun,defmacro,defvar,defparameter,defmethod,define-syntax,lambda,let,let*,letre,flet,labels,progn,when,unless,if,cond
'';
in
lib.mkMerge [
(mkVimAfterFtplugin tab2Vim ["javascript" "typescript" "html" "css" "json" "nix" "vim"])
(mkVimAfterFtplugin tab4Vim ["python" "rust" "java" "lua" "c" "cpp" "h" "hpp"])
(mkVimAfterFtplugin tabsVim ["go" "make"])
(mkVimAfterFtplugin lispVim ["lisp" "scheme" "clojure" "racket"])
];
programs = {
# coyote-home-manager-programs
# coyote-home-manager-programs-general
tmux = {
enable = true;
clock24 = true;
baseIndex = 1;
shortcut = "a";
keyMode = "vi";
terminal = "screen-256color";
escapeTime = 0;
extraConfig = ''
set -g pane-base-index 1
set-window-option -g pane-base-index 1
set-option -g renumber-windows on
set-option -g status-right "\"#W\""
set -ga terminal-overrides ",*:RGB"
set -g mouse on
set -g set-clipboard on
'';
};
librewolf.enable = true;
librewolf.languagePacks = ["en-GB"];
librewolf.settings = {
"privacy.resistFingerprinting" = false;
"librewolf.webgl.prompt" = false;
"identity.fxaccounts.enabled" = true;
"middlemouse.paste" = false;
"general.autoScroll" = true;
"browser.discovery.containers.enabled" = false;
};
yt-dlp.enable = true;
yt-dlp.package = pkgs.unstable.yt-dlp;
starship.package = pkgs.unstable.starship;
obs-studio.enable = true;
obs-studio.plugins = with pkgs.obs-studio-plugins; [
input-overlay droidcam-obs wlrobs
];
# coyote-home-manager-programs-vim
vim.enable = true;
vim.packageConfigurable = pkgs.unstable.vim-full;
vim.defaultEditor = true;
vim.plugins = let
literate-vim = pkgs.vimUtils.buildVimPlugin {
name = "literate.vim";
src = pkgs.fetchFromGitHub {
owner = "zyedidia";
repo = "literate.vim";
rev = "4ffd45cb1657b67f4ed0eb639478a69209ec1f94";
sha256 = "sha256-X5iJyjeLBkKh4tUoDG8VDO6DwYVOI9DpRqpic8NinwA=";
};
};
in
with pkgs.unstable.vimPlugins; [
gruvbox rainbow literate-vim undotree
];
vim.extraConfig = ''
set nocompatible
set encoding=utf-8
set backspace=indent,eol,start
set clipboard=unnamedplus
set mouse=a
set history=1000
set updatetime=300
syntax on
set ruler
set showcmd
set showmode
set laststatus=1
set wildmenu
set wildmode=longest,list,full
set ttyfast
set lazyredraw
filetype plugin indent on
set autoindent
set smartindent
set expandtab
set smarttab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set hlsearch
set incsearch
set ignorecase
set smartcase
inoremap <C-l> λ
set termguicolors
set background=dark
colorscheme gruvbox
let g:terminal_ansi_colors = ['#282828', '#cc241d', '#98971a', '#d79921', '#458588', '#b16286', '#689d6a', '#a89984', '#928374', '#fb4934', '#b8bb26', '#fabd2f', '#83a598', '#d3869b', '#8ec07c', '#ebdbb2']
let g:rainbow_active = 1
'';
# coyote-home-manager-programs-fastfetch
fastfetch.enable = true;
fastfetch.settings = {
"$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json";
logo.type = "small";
logo.padding.top = 4;
logo.padding.left = 3;
logo.padding.right = 4;
display.separator = " ";
modules = [
{key = "╭─────────╮"; type = "custom";}
{key = "│ {#31}user {#keys}│"; type = "title"; format = "{user-name}";}
{key = "│ {#32}host {#keys}│"; type = "title"; format = "{host-name}";}
{key = "│ {#33}uptime {#keys}│"; type = "uptime";}
{key = "│ {#34}distro {#keys}│"; type = "os";}
{key = "│ {#35}kernel {#keys}│"; type = "kernel";}
{key = "│ {#36}desktop {#keys}│"; type = "de";}
{key = "│ {#31}term {#keys}│"; type = "terminal";}
{key = "│ {#32}shell {#keys}│"; type = "shell";}
{key = "│ {#33}cpu {#keys}│"; type = "cpu"; showPeCoreCount = true;}
{key = "│ {#34}disk {#keys}│"; type = "disk"; folders = "/";}
{key = "│ {#35}memory {#keys}│"; type = "memory";}
{key = "│ {#36}network {#keys}│"; type = "localip"; format = "{ipv4} ({ifname})";}
{key = "├─────────┤"; type = "custom";}
{key = "│ {#39}colors {#keys}│"; type = "colors"; symbol = "circle";}
{key = "╰─────────╯"; type = "custom";}
];
};
};
})
];
}
./hosts/phostron
./modules/users/coyote
./modules/users/coyote/home-manager-module.nix
];
};
};
}

176
home/coyote/default.nix Normal file
View file

@ -0,0 +1,176 @@
{
pkgs,
config,
lib,
inputs,
...
}: {
imports = [
./vim.nix
];
home.stateVersion = "26.05"; # Nope, didn't read the comment either.
home.username = "coyote";
home.homeDirectory = "/home/coyote";
home.shell.enableShellIntegration = true;
home.packages = with pkgs; [
# TUI
tdf
neocities
# productivity
libreoffice-fresh
karp
keepassxc
pdfarranger
thunderbird
# multimedia
furnace
corrscope
vlc
haruna
subtitlecomposer
kid3
kdePackages.kdenlive
unstable.audacity
lmms-full
calf
vital
# Internet
ungoogled-chromium
# games
osu-lazer-bin
pcsx2
# emulation
(unstable.bottles.override {removeWarningPopup = true;})
# devel
unstable.racket
unstable.lazygit
];
programs = {
tmux = {
enable = true;
clock24 = true;
baseIndex = 1;
shortcut = "a";
keyMode = "vi";
terminal = "screen-256color";
escapeTime = 0;
extraConfig = ''
set -g pane-base-index 1
set-window-option -g pane-base-index 1
set-option -g renumber-windows on
set-option -g status-right "\"#W\""
set -ga terminal-overrides ",*:RGB"
set -g mouse on
set -g set-clipboard on
'';
};
librewolf.enable = true;
librewolf.languagePacks = ["en-GB"];
librewolf.settings = {
"privacy.resistFingerprinting" = false;
"librewolf.webgl.prompt" = false;
"identity.fxaccounts.enabled" = true;
"middlemouse.paste" = false;
"general.autoScroll" = true;
"browser.discovery.containers.enabled" = false;
};
yt-dlp.enable = true;
yt-dlp.package = pkgs.unstable.yt-dlp;
starship.package = pkgs.unstable.starship;
obs-studio.enable = true;
obs-studio.plugins = with pkgs.obs-studio-plugins; [
input-overlay
droidcam-obs
wlrobs
];
fastfetch.enable = true;
fastfetch.settings = {
"$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json";
logo.type = "small";
logo.padding.top = 4;
logo.padding.left = 3;
logo.padding.right = 4;
display.separator = " ";
modules = [
{
key = "╭─────────╮";
type = "custom";
}
{
key = "│ {#31}user {#keys}│";
type = "title";
format = "{user-name}";
}
{
key = "│ {#32}host {#keys}│";
type = "title";
format = "{host-name}";
}
{
key = "│ {#33}uptime {#keys}│";
type = "uptime";
}
{
key = "│ {#34}distro {#keys}│";
type = "os";
}
{
key = "│ {#35}kernel {#keys}│";
type = "kernel";
}
{
key = "│ {#36}desktop {#keys}│";
type = "de";
}
{
key = "│ {#31}term {#keys}│";
type = "terminal";
}
{
key = "│ {#32}shell {#keys}│";
type = "shell";
}
{
key = "│ {#33}cpu {#keys}│";
type = "cpu";
showPeCoreCount = true;
}
{
key = "│ {#34}disk {#keys}│";
type = "disk";
folders = "/";
}
{
key = "│ {#35}memory {#keys}│";
type = "memory";
}
{
key = "│ {#36}network {#keys}│";
type = "localip";
format = "{ipv4} ({ifname})";
}
{
key = "├─────────┤";
type = "custom";
}
{
key = "│ {#39}colors {#keys}│";
type = "colors";
symbol = "circle";
}
{
key = "╰─────────╯";
type = "custom";
}
];
};
};
}

70
home/coyote/vim.nix Normal file
View file

@ -0,0 +1,70 @@
{pkgs, ...}: {
programs.vim = {
enable = true;
packageConfigurable = pkgs.unstable.vim-full;
defaultEditor = true;
plugins = with pkgs.unstable.vimPlugins; [
gruvbox
rainbow
undotree
];
extraConfig = ''
set nocompatible
set encoding=utf-8
set backspace=indent,eol,start
set clipboard=unnamedplus
set mouse=a
set history=1000
set updatetime=300
syntax on
set ruler
set showcmd
set showmode
set laststatus=1
set wildmenu
set wildmode=longest,list,full
set ttyfast
set lazyredraw
filetype plugin indent on
set autoindent
set smartindent
set expandtab
set smarttab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set hlsearch
set incsearch
set ignorecase
set smartcase
inoremap <C-l> λ
set termguicolors
set background=dark
colorscheme gruvbox
let g:terminal_ansi_colors = ['#282828', '#cc241d', '#98971a', '#d79921', '#458588', '#b16286', '#689d6a', '#a89984', '#928374', '#fb4934', '#b8bb26', '#fabd2f', '#83a598', '#d3869b', '#8ec07c', '#ebdbb2']
let g:rainbow_active = 1
augroup coyote_filetype_settings
autocmd!
autocmd FileType javascript,typescript,html,css,json,nix,vim
\ setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2
autocmd FileType python,rust,java,lua,c,cpp,h,hpp
\ setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4
autocmd FileType go,make
\ setlocal noexpandtab tabstop=4 shiftwidth=4 softtabstop=0
autocmd FileType lisp,scheme,clojure,racket
\ setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2
\ lisp autoindent showmatch
\ lispwords+=defun,defmacro,defvar,defparameter,defmethod,define-syntax,lambda,let,let*,letre,flet,labels,progn,when,unless,if,cond
augroup END
'';
};
}

View file

@ -0,0 +1,23 @@
{
config,
lib,
pkgs,
...
}: {
system.stateVersion = "26.05"; # I didn't read the comment.
networking.hostName = "phostron";
networking.networkmanager.enable = true;
networking.firewall.enable = true;
services.printing.enable = true;
services.printing.drivers = [pkgs.epson-escpr];
hardware.bluetooth.enable = true;
hardware.sane.enable = true;
hardware.sane.extraBackends = [pkgs.epsonscan2];
# SDDM look, specific to this machine
services.displayManager.sddm.settings.Theme.Font = "Inter";
services.displayManager.sddm.settings.Theme.CursorSize = 18;
}

View file

@ -0,0 +1,8 @@
{...}: {
imports = [
../../modules/common.nix
../../modules/desktop/kde-plasma.nix
./hardware-configuration.nix
./configuration.nix
];
}

View file

@ -0,0 +1,30 @@
{
config,
lib,
pkgs,
modulesPath,
...
}: {
imports = [(modulesPath + "/installer/scan/not-detected.nix")];
boot.initrd.availableKernelModules = ["nvme" "ehci_pci" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"];
boot.initrd.kernelModules = [];
boot.kernelModules = ["kvm-amd"];
boot.extraModulePackages = [];
fileSystems."/" = {
device = "/dev/disk/by-uuid/24fb172c-c29f-40c3-ae4d-ff652358563a";
fsType = "ext4";
};
fileSystems."/boot" = {
device = "/dev/disk/by-uuid/DFC9-994A";
fsType = "vfat";
options = ["fmask=0077" "dmask=0077"];
};
swapDevices = [{device = "/dev/disk/by-uuid/91d96247-85c3-4e0a-93a2-5632b96179b6";}];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

193
modules/common.nix Normal file
View file

@ -0,0 +1,193 @@
{
config,
lib,
pkgs,
inputs,
...
}: {
# use flakes and Lix instead of the default Nix implementation
nix.settings.experimental-features = ["nix-command" "flakes"];
nix.settings.auto-optimise-store = true;
nix.package = pkgs.lixPackageSets.stable.lix;
# global nixpkgs-unstable overlay, so unstable packages are available to
# Home Manager userspaces too, plus a couple of Lix-related package pins
nixpkgs.config.allowUnfree = true;
nixpkgs.overlays = [
(final: prev: {
unstable = import inputs.nixpkgs-unstable {
system = prev.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
})
(final: prev: {
inherit
(prev.lixPackageSets.stable)
nixpkgs-review
nix-eval-jobs
nix-fast-build
colmena
;
})
];
boot = {
loader.systemd-boot.enable = true;
loader.systemd-boot.configurationLimit = 10;
loader.efi.canTouchEfiVariables = true;
loader.timeout = 2;
kernelParams = ["quiet" "rd.udev.log_level=3" "rd.systemd.show_status=auto"];
initrd.verbose = false;
consoleLogLevel = 3;
kernelPackages = pkgs.linuxPackages;
};
time.timeZone = "Asia/Jakarta";
i18n.defaultLocale = "en_GB.UTF-8";
services = {
fwupd.enable = true;
xserver.xkb.layout = "us";
locate.enable = true;
printing.enable = true;
openssh.enable = false;
pulseaudio.enable = false;
pipewire.enable = true;
pipewire.alsa.enable = true;
pipewire.alsa.support32Bit = true;
pipewire.pulse.enable = true;
};
security.rtkit.enable = true;
security.sudo.enable = false;
security.doas.enable = true;
security.doas.extraRules = [
{
groups = ["wheel"];
keepEnv = true;
persist = true;
}
];
environment.systemPackages = with pkgs; [
nh
alejandra
git
# system utils
firmware-updater
mtr
gnupg
ddate
testdisk
tree
wget
btop
plocate
traceroute
rlwrap
entr
unzip
ffmpeg
imagemagick
gnome-disk-utility
# extra (oxidised) utils
fd
bat
xh
tlrc
dysk
dust
hyperfine
ripgrep
fzf
eza
];
environment.shellAliases = {
sudo = "doas";
l = "eza --grid --all";
ll = "eza --long --all";
ls = "eza --long";
".." = "cd ..";
"..." = "cd ../..";
cat = "bat";
};
# fixes Librewolf not rendering text in its UI (as of 2026-07-30)
environment.sessionVariables.XDG_DATA_DIRS = [
"${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}"
"${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}"
];
programs = {
fish.enable = true;
atuin.enable = true;
atuin.settings.sync_address = "https://api.atuin.sh";
atuin.settings.enter_accept = true;
starship.enable = true;
starship.transientPrompt.enable = true;
starship.transientPrompt.left = "starship module character";
starship.settings = {
"$schema" = "https://starship.rs/config-schema.json";
git_status = {
ahead = ">";
behind = "<";
diverged = "<>";
renamed = "r";
deleted = "d";
};
character.success_symbol = "[λ](bold green)";
character.error_symbol = "[λ](bold red)";
};
git.enable = true;
git.config = {
init.defaultBranch = "main";
advice.defaultBranchName = false;
gpg.format = "ssh";
commit.gpgSign = true;
url."https://github.com/".insteadOf = ["github:"];
};
steam.enable = true;
# one-off options that would live in the Home Manager section if the
# relevant modules existed there
obs-studio.enableVirtualCamera = true;
ssh.startAgent = true;
nix-ld.enable = true;
nix-ld.libraries = with pkgs; [fuse e2fsprogs];
};
fonts.packages = with pkgs; [
# GUI fonts
inter
corefonts
vista-fonts
roboto
cantarell-fonts
# fonts for i18n
noto-fonts
noto-fonts-cjk-sans
noto-fonts-cjk-serif
noto-fonts-color-emoji
noto-fonts-monochrome-emoji
unifont
unifont_upper
unifont-csur
# terminal fonts
nerd-fonts.iosevka
];
fonts.fontconfig.antialias = true;
fonts.fontconfig.subpixel.rgba = "rgb";
xdg.portal.enable = true;
xdg.portal.config.common.default = ["gtk"];
xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-wlr];
}

View file

@ -0,0 +1,18 @@
{pkgs, ...}: {
services.displayManager.sddm.enable = true;
services.desktopManager.plasma6.enable = true;
environment.systemPackages = with pkgs.kdePackages; [
kate
elisa
bluez-qt
kalk
filelight
kamoso
konversation
kmail
ktorrent
kclock
];
environment.plasma6.excludePackages = [pkgs.kdePackages.discover];
}

View file

@ -0,0 +1,33 @@
{
pkgs,
config,
...
}: let
USER_ID = 1000;
KEY_FILE = "id_ed25519";
in {
users.users.coyote = {
isNormalUser = true;
description = "coyote";
extraGroups = ["wheel" "networkmanager" "lp" "scanner"];
uid = USER_ID;
};
users.defaultUserShell = pkgs.unstable.fish;
# daemon blurb to get SSH for Git working
environment.sessionVariables.SSH_AUTH_SOCK = "/run/user/${builtins.toString USER_ID}/ssh-agent";
systemd.user.services.ssh-add-key = {
wantedBy = ["default.target"];
after = ["ssh-agent.service"];
serviceConfig = {
Type = "oneshot";
ExecStartPre = "${pkgs.coreutils-full}/bin/sleep 1";
ExecStart = [
"${pkgs.openssh}/bin/ssh-add ${config.users.users.coyote.home}/.ssh/${KEY_FILE}"
];
Restart = "on-failure";
RestartSec = 1;
};
};
}

View file

@ -0,0 +1,8 @@
{inputs, ...}: {
imports = [inputs.home-manager.nixosModules.home-manager];
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = {inherit inputs;};
home-manager.users.coyote.imports = [../../../home/coyote];
}

1193
nixos.html

File diff suppressed because it is too large Load diff

858
nixos.lit
View file

@ -1,858 +0,0 @@
@code_type nix .nix
@comment_type # %s
@overwrite_css style.css
@title asnev's NixOS configuration
@s introduction
welcome! this page is the literate configuration for my NixOS setup. here,
declarations are set to configure my (currently) only host system, `phostron`,
a ThinkPad L14 Gen 1, to use flakes, Home Manager, a global nixpkgs-unstable
overlay, alongside general NixOS configurations tailored to my hardware and
user environment preferences.<br><br>
being a literate configuration file, this means that both the HTML page you're
reading right now, and the Nix flake file that get parsed when building the
system, are compiled from the *same* exact source file. that's literate
programming in a nutshell--programming with a documentation-first paradigm.
though of course, the details don't stop there. the rabbit hole can get really,
*really* deep; just ask your favourite search engine for all the
*breathtakingly comprehensive* NixOS configs (literate or otherwise) that are
out there!<br><br>
you can get the source code at my repo [here](https://git.gay/asnev/nixos).
> the latest version of this document is [hosted on my
> Neocities](https://asnev.neocities.org/nixos.html).
<br><hr>
@s limitations
this is a simple configuration. i don't have immediate plans in declaratively
configuring absolutely *everything* there is on my system. as someone who still
has many things to learn about Nix(OS), my current rationale is to configure
everything that's comfortably sensible. additional options and/or verbosity can
be added later as my configuration grows in the future (or not). following the
'simple' nature of my configuration, Home Manager is notably installed as a
NixOS module instead of being standalone. while doing so does make rebuilding
the user environment a bit annoying, personally, i don't mind it that
much.<br><br>
this is also a simple configuration, in the way of the literate programming
tools used, which is [Literate](https://github.com/zyedidia/Literate). while it
does offer a very approachable format based on Markdown, it's a bit lacking in
that it can't provide syntax highlighting in multiple different languages
(you'll see the mixed-up colours later, sorry), and it can't export source code
files into files which live within subdirectories. i've resorted to let
*everything* reside within one `flake.nix` file which, while it does make users
who wish to navigate through the unwoven (without comments) configuration
expressions quite... annoying, at least everything is organised when viewed
through the literate source code.<br><br>
eventually, when i can build up the courage... i'd like to begin my 'journey'
with Emacs and utilise Org-mode and Org-babel, a much, *much* more flexible
literate programming environment.<br>
<sub>emphasis on 'eventually'...</sub><br><br>
i don't expect anyone reading this to be wishing to use *my* specific
configuration for their setup, so i'll skip over instructions for installing
the operating system and let the following configurations assume that a fresh,
flake-enabled NixOS system is present and ready to go.
<br><hr>
@s flake structure
we'll outline a basic flake for the system(s)...
--- flake.nix
{
description = "asnev's NixOS configuration";
inputs = {
nixpkgs = {
url = "github:nixos/nixpkgs/nixos-26.05";
};
nixpkgs-unstable = {
url = "github:nixos/nixpkgs/nixos-unstable";
};
home-manager = {
url = "github:nix-community/home-manager/release-26.05";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = inputs @ {
self,
nixpkgs,
nixpkgs-unstable,
home-manager,
...
}: {
@{flake-modules}
};
}
---
...and configure the modules. declared below are separate modules for the host,
user, and user environment managed by Home Manager. everything lives within the
one NixOS module, so it is structured thusly:
--- flake-modules
nixosConfigurations.phostron = nixpkgs.lib.nixosSystem {
specialArgs = {inherit inputs;};
modules = [
@{phostron-configuration}
@{coyote-configuration}
];
};
---
TODO: consider adding a shell environment module?
<br><hr>
@s global NixOS options
before getting into the host-specific configurations, here we set options that
get applied to *all* NixOS systems, regardless of machine. we'll start by
declaring the initial attribute set arguments, which will soon be a familiar
pattern here...
--- nixos-configuration
({ config, lib, pkgs, inputs, ... }: {
@{nixos-configuration-contents}
})
---
...then we set Nix-related declarations since we'd like to declare the system
to use flakes, and, to utilise [Lix](https://lix.systems),
--- nixos-configuration-contents
nix.settings.experimental-features = ["nix-command" "flakes"];
nix.settings.auto-optimise-store = true;
nix.package = pkgs.lixPackageSets.stable.lix;
---
but also have an overlay of `nixpkgs-unstable` to be available globally. this
is so that i can have unstable packages installed in userspaces managed via
Home Manager. plus, some additional tweaks for Lix.
--- nixos-configuration-contents +=
nixpkgs.config.allowUnfree = true;
nixpkgs.overlays = [
(final: prev: {
unstable = import inputs.nixpkgs-unstable {
system = prev.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
})
(final: prev: {
inherit (prev.lixPackageSets.stable)
nixpkgs-review
nix-eval-jobs
nix-fast-build
colmena;
})
];
---
getting into the rest of the options, let's configure the way the system should
boot. i like to have absolutely nothing being displayed as my computer turns
on.
--- nixos-configuration-contents +=
boot = {
loader.systemd-boot.enable = true;
loader.systemd-boot.configurationLimit = 10;
loader.efi.canTouchEfiVariables = true;
loader.timeout = 2;
kernelParams = ["quiet" "rd.udev.log_level=3" "rd.systemd.show_status=auto"];
initrd.verbose = false;
consoleLogLevel = 3;
kernelPackages = pkgs.linuxPackages;
};
---
next, some basic locale settings.
--- nixos-configuration-contents +=
time.timeZone = "Asia/Jakarta";
i18n.defaultLocale = "en_GB.UTF-8";
---
service options. note the options for PipeWire here.
--- nixos-configuration-contents +=
services = {
fwupd.enable = true;
xserver.xkb.layout = "us";
locate.enable = true;
printing.enable = true;
openssh.enable = false;
pulseaudio.enable = false;
pipewire.enable = true;
pipewire.alsa.enable = true;
pipewire.alsa.support32Bit = true;
pipewire.pulse.enable = true;
};
---
basic security options and `doas` configuration.
--- nixos-configuration-contents +=
security.rtkit.enable = true;
security.sudo.enable = false;
security.doas.enable = true;
security.doas.extraRules = [{
groups = ["wheel"];
keepEnv = true;
persist = true;
}];
---
and now we get into the fun (translation: less boring) stuff with system
packages!
--- nixos-configuration-contents +=
environment.systemPackages = with pkgs; [
nh alejandra literate git
# system utils
firmware-updater mtr gnupg ddate testdisk tree wget btop plocate traceroute
rlwrap entr unzip ffmpeg imagemagick gnome-disk-utility
# extra (oxidised) utils
fd bat xh tlrc dysk dust hyperfine ripgrep fzf eza
];
---
if the list seems a bit sparse for desktop applications, that's intentional. i
prefer to keep those within userspace via Home Manager, which will be
explored later below.<br><br>
let's set a few useful shell aliases, notably substituting `ls` for `eza` for a
prettier directory output. (TODO: consider figuring how to switch to `uutils`
globally maybe?)
--- nixos-configuration-contents +=
environment.shellAliases = {
sudo = "doas";
l = "eza --grid --all";
ll = "eza --long --all";
ls = "eza --long";
".." = "cd ..";
"..." = "cd ../..";
cat = "bat"; # this line is really funny to me
};
---
quick fix for Librewolf not rendering text in its UI (as of 2026-07-30).
--- nixos-configuration-contents +=
environment.sessionVariables.XDG_DATA_DIRS = [
"${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}"
"${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}"
];
---
here's the start of options for programmes...
--- nixos-configuration-contents +=
programs = {
@{nixos-configuration-programs-contents}
};
---
nothing much here, starting with a few options to prettify the terminal a bit.
> "zsh is bash with plugins; fish is zsh with plugins"
> --[0atman](https://youtu.be/rWMQ-g2QDsI?t=117)
yes, the lambda (λ) as a terminal prompt character absolutely counts towards
style points.
--- nixos-configuration-programs-contents
fish.enable = true;
atuin.enable = true;
atuin.settings.sync_address = "https://api.atuin.sh";
atuin.settings.enter_accept = true;
starship.enable = true;
starship.transientPrompt.enable = true;
starship.transientPrompt.left = "starship module character";
starship.settings = {
"$schema" = "https://starship.rs/config-schema.json";
git_status = {
ahead = ">";
behind = "<";
diverged = "<>";
renamed = "r";
deleted = "d";
};
character.success_symbol = "[λ](bold green)";
character.error_symbol = "[λ](bold red)";
};
git.enable = true;
git.config = {
init.defaultBranch = "main";
advice.defaultBranchName = false;
gpg.format = "ssh";
commit.gpgSign = true;
url."https://github.com/".insteadOf = ["github:"];
};
steam.enable = true;
---
a few one-off options here. these settings would be in the Home Manager section
if they existed there, but they don't, so, oh well.
--- nixos-configuration-programs-contents +=
obs-studio.enableVirtualCamera = true;
ssh.startAgent = true;
---
`nix-ld` is important for running generic binaries and AppImages. ironically,
i have yet felt the need to utilise software outside of the `nixpkgs`
repository, hence the sparse `libraries` pkgs list, lol.
--- nixos-configuration-programs-contents +=
nix-ld.enable = true;
nix-ld.libraries = with pkgs; [fuse e2fsprogs];
---
fonts! because typography (and internationalisation) matters.
--- nixos-configuration-contents +=
fonts.packages = with pkgs; [
# GUI fonts
inter corefonts vista-fonts roboto cantarell-fonts
# fonts for i18n
noto-fonts noto-fonts-cjk-sans noto-fonts-cjk-serif noto-fonts-color-emoji
noto-fonts-monochrome-emoji unifont unifont_upper unifont-csur
# terminal fonts
nerd-fonts.iosevka
];
---
some font settings.
--- nixos-configuration-contents +=
fonts.fontconfig.antialias = true;
fonts.fontconfig.subpixel.rgba = "rgb";
---
finally, XDG portal settings... which i'll admit i don't quite understand but
they're here so here they are.
--- nixos-configuration-contents +=
xdg.portal.enable = true;
xdg.portal.config.common.default = ["gtk"];
xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-wlr];
---
we're finished with the global config, let's move into the per-machine options.
<br><hr>
@s host configuration: phostron
we make sure that we load in the global options we've set, alongside a choice
of one's preferred graphical interface.
--- phostron-configuration
@{nixos-configuration}
@{kde-plasma-configuration}
---
then we may start with configuring the machine specifically. with the NixOS
installer's automatically generated `hardware-configuration.nix` file, our job
is basically half done here.
--- phostron-configuration +=
({ config, lib, pkgs, modulesPath, ... }: {
@{phostron-hardware-configuration-contents}
@{phostron-configuration-contents}
})
---
i'll copy over said file verbatim (excluding the pre-generated comment blurb at
the beginning of the file).
--- phostron-hardware-configuration-contents
imports = [(modulesPath + "/installer/scan/not-detected.nix")];
boot.initrd.availableKernelModules = ["nvme" "ehci_pci" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"];
boot.initrd.kernelModules = [];
boot.kernelModules = ["kvm-amd"];
boot.extraModulePackages = [];
fileSystems."/" = {
device = "/dev/disk/by-uuid/24fb172c-c29f-40c3-ae4d-ff652358563a";
fsType = "ext4";
};
fileSystems."/boot" = {
device = "/dev/disk/by-uuid/DFC9-994A";
fsType = "vfat";
options = ["fmask=0077" "dmask=0077"];
};
swapDevices = [{device = "/dev/disk/by-uuid/91d96247-85c3-4e0a-93a2-5632b96179b6";}];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
---
with that done, we can move on to the less scary stuff.
--- phostron-configuration-contents
system.stateVersion = "26.05"; # I didn't read the comment. :)
networking.hostName = "phostron";
networking.networkmanager.enable = true;
networking.firewall.enable = true;
services.printing.enable = true;
services.printing.drivers = [pkgs.epson-escpr];
hardware.bluetooth.enable = true;
hardware.sane.enable = true;
hardware.sane.extraBackends = [pkgs.epsonscan2];
---
<br><hr>
@s desktop configuration: KDE Plasma
let's bring ourselves to the 90s with a proper graphical user interface! and
have some additional apps to boot.
--- kde-plasma-configuration
({pkgs, ...}: {
services.displayManager.sddm.enable = true;
services.desktopManager.plasma6.enable = true;
environment.systemPackages = with pkgs.kdePackages; [
kate elisa bluez-qt kalk filelight kamoso konversation kmail ktorrent
kclock
];
---
> "Discover? Where we're going... we don't need Discover."
--- kde-plasma-configuration +=
environment.plasma6.excludePackages = [pkgs.kdePackages.discover];
})
---
i've set some additional options in how i'd like SDDM to look for `phostron`
specifically.
--- phostron-configuration-contents +=
services.displayManager.sddm.settings.Theme.Font = "Inter";
services.displayManager.sddm.settings.Theme.CursorSize = 18;
---
(TODO: consider adding the `plasma-manager` flake module in the future?)
<br><hr>
@s user configuration: coyote
that's me. `:3c`<br><br>
not just NixOS options, but also any other modules loaded into the system via
the flake, like Home Manager, as seen later.
--- coyote-configuration
({ pkgs, config, ... }: let
@{coyote-configuration-variables}
in {
@{coyote-configuration-contents}
})
---
let's get the user-specific NixOS options out of the way. basic user management
stuff and setting the default shell of choice.
--- coyote-configuration-variables
USER_ID = 1000;
---
--- coyote-configuration-contents
users.users.coyote = {
isNormalUser = true;
description = "coyote";
extraGroups = ["wheel" "networkmanager" "lp" "scanner"];
uid = USER_ID;
};
users.defaultUserShell = pkgs.unstable.fish;
---
for me, i have a little daemon blurb to get SSH for Git working... properly? i
can't remember--i think i stole this from GitHub somewhere...<br><br>
there's another variable we need to set before getting there though.
--- coyote-configuration-variables +=
KEY_FILE = "id_ed25519";
---
--- coyote-configuration-contents +=
environment.sessionVariables.SSH_AUTH_SOCK = "/run/user/${builtins.toString USER_ID}/ssh-agent";
systemd.user.services.ssh-add-key = {
wantedBy = ["default.target"];
after = ["ssh-agent.service"];
serviceConfig = {
Type = "oneshot";
ExecStartPre = "${pkgs.coreutils-full}/bin/sleep 1";
ExecStart = [
"${pkgs.openssh}/bin/ssh-add ${config.users.users.coyote.home}/.ssh/${KEY_FILE}"
];
Restart = "on-failure";
RestartSec = 1;
};
};
---
<br><hr>
@s Home Manager configuration: coyote
let's get into the *fun* fun stuff, [yaeh](https://youtu.be/SacogDL_4JU).<br><br>
not forgetting to set the flake module for it first though. as mentioned in the
beginning, my preference is to have it loaded as a NixOS module.
--- coyote-configuration +=
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = {inherit inputs;};
home-manager.users.coyote.imports = [
({ pkgs, config, lib, inputs, ... }: {
@{coyote-home-manager-configuration}
})
];
}
---
the basic contents structure is as follows. a separate section for programmes
should make it easier for including more software configurations in the future.
--- coyote-home-manager-configuration
@{coyote-home-manager-configuration-contents}
programs = {
@{coyote-home-manager-programs}
};
---
standard configuration stuff.
--- coyote-home-manager-configuration-contents
home.stateVersion = "26.05"; # Nope, didn't read the comment either.
home.username = "coyote";
home.homeDirectory = "/home/coyote";
home.shell.enableShellIntegration = true;
---
now we get to configure the user packages! there's... not a lot of them.
--- coyote-home-manager-configuration-contents +=
home.packages = with pkgs; [
# TUI
tdf neocities
# productivity
libreoffice-fresh karp keepassxc pdfarranger thunderbird
# multimedia
furnace corrscope vlc haruna subtitlecomposer kid3 kdePackages.kdenlive
unstable.audacity lmms-full calf vital
# Internet
ungoogled-chromium
# games
osu-lazer-bin pcsx2 flycast hail
# emulation
(unstable.bottles.override {removeWarningPopup = true;})
# devel
unstable.racket unstable.lazygit mitscheme
];
---
next is (arguably) the more fun way to install and configure programmes, via
programme options. not every programme will get a dedicated section. for the
ones that are too short to consider notable, i'll have them clumped with a
bunch of others.
--- coyote-home-manager-programs
@{coyote-home-manager-programs-general}
@{coyote-home-manager-programs-vim}
@{coyote-home-manager-programs-fastfetch}
---
these don't need much explanation. (TODO: could try declaratively setting
LibreWolf profiles.)
--- coyote-home-manager-programs-general
tmux = {
enable = true;
clock24 = true;
baseIndex = 1;
shortcut = "a";
keyMode = "vi";
terminal = "screen-256color";
escapeTime = 0;
extraConfig = ''
set -g pane-base-index 1
set-window-option -g pane-base-index 1
set-option -g renumber-windows on
set-option -g status-right "\"#W\""
set -ga terminal-overrides ",*:RGB"
set -g mouse on
set -g set-clipboard on
'';
};
librewolf.enable = true;
librewolf.languagePacks = ["en-GB"];
librewolf.settings = {
"privacy.resistFingerprinting" = false;
"librewolf.webgl.prompt" = false;
"identity.fxaccounts.enabled" = true;
"middlemouse.paste" = false;
"general.autoScroll" = true;
"browser.discovery.containers.enabled" = false;
};
yt-dlp.enable = true;
yt-dlp.package = pkgs.unstable.yt-dlp;
starship.package = pkgs.unstable.starship;
obs-studio.enable = true;
obs-studio.plugins = with pkgs.obs-studio-plugins; [
input-overlay droidcam-obs wlrobs
];
---
and here... lies my dreaded Vim configuration...
--- coyote-home-manager-programs-vim
vim.enable = true;
vim.packageConfigurable = pkgs.unstable.vim-full;
vim.defaultEditor = true;
vim.plugins = let
literate-vim = pkgs.vimUtils.buildVimPlugin {
name = "literate.vim";
src = pkgs.fetchFromGitHub {
owner = "zyedidia";
repo = "literate.vim";
rev = "4ffd45cb1657b67f4ed0eb639478a69209ec1f94";
sha256 = "sha256-X5iJyjeLBkKh4tUoDG8VDO6DwYVOI9DpRqpic8NinwA=";
};
};
in
with pkgs.unstable.vimPlugins; [
gruvbox rainbow literate-vim undotree
];
---
`.vimrc` moment...<br><br>
there's really not much, starting with bog-standard Vimscript for sensible
options,
--- coyote-home-manager-programs-vim +=
vim.extraConfig = ''
set nocompatible
set encoding=utf-8
set backspace=indent,eol,start
set clipboard=unnamedplus
set mouse=a
set history=1000
set updatetime=300
syntax on
set ruler
set showcmd
set showmode
set laststatus=1
set wildmenu
set wildmode=longest,list,full
set ttyfast
set lazyredraw
filetype plugin indent on
set autoindent
set smartindent
set expandtab
set smarttab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set hlsearch
set incsearch
set ignorecase
set smartcase
---
and you gotta map a keybind to output lambda to live out that Lisp/Scheme vibe
😎 (i barely can even code in them)
--- coyote-home-manager-programs-vim +=
inoremap <C-l> λ
---
i love Gruvbox... <sub>(hi Vimjoyer)</sub>
--- coyote-home-manager-programs-vim +=
set termguicolors
set background=dark
colorscheme gruvbox
let g:terminal_ansi_colors = ['#282828', '#cc241d', '#98971a', '#d79921', '#458588', '#b16286', '#689d6a', '#a89984', '#928374', '#fb4934', '#b8bb26', '#fabd2f', '#83a598', '#d3869b', '#8ec07c', '#ebdbb2']
---
finally, plugin configs! there's only one...
--- coyote-home-manager-programs-vim +=
let g:rainbow_active = 1
'';
---
this part is kinda... bodgy, but, it's the only way i've found to consistently
configure per-language settings in Vim, thru Home Manager's `home.file.<...>`
dotfiles generation into `~/.vim/after/ftplugin/`.<br><br>
TODO: find a more efficient way of doing this, for sure.<br><br>
we'll set a little function to automate that for us.
--- coyote-home-manager-configuration-contents +=
home.file = let
mkVimAfterFtplugin = content: langs:
builtins.listToAttrs (map (lang: {
name = ".vim/after/ftplugin/${lang}.vim";
value = {text = content;};
})
langs);
---
next are the actual per-language configurations for Vim.
--- coyote-home-manager-configuration-contents +=
tab2Vim = ''
setlocal expandtab
setlocal tabstop=2
setlocal shiftwidth=2
setlocal softtabstop=2
'';
tab4Vim = ''
setlocal expandtab
setlocal tabstop=4
setlocal shiftwidth=4
setlocal softtabstop=4
'';
tabsVim = ''
setlocal noexpandtab
setlocal tabstop=4
setlocal shiftwidth=4
setlocal softtabstop=0
'';
lispVim = ''
setlocal expandtab
setlocal tabstop=2
setlocal shiftwidth=2
setlocal softtabstop=2
setlocal lisp
setlocal autoindent
setlocal showmatch
setlocal lispwords+=defun,defmacro,defvar,defparameter,defmethod,define-syntax,lambda,let,let*,letre,flet,labels,progn,when,unless,if,cond
'';
---
now all we have to do is set the languages to their designated configs and all
the `.vim` files get generated automatically!
--- coyote-home-manager-configuration-contents +=
in
lib.mkMerge [
(mkVimAfterFtplugin tab2Vim ["javascript" "typescript" "html" "css" "json" "nix" "vim"])
(mkVimAfterFtplugin tab4Vim ["python" "rust" "java" "lua" "c" "cpp" "h" "hpp"])
(mkVimAfterFtplugin tabsVim ["go" "make"])
(mkVimAfterFtplugin lispVim ["lisp" "scheme" "clojure" "racket"])
];
---
moving to a little Fastfetch configuring just for pretty. mine is taken from
one of the preset settings but with a minified distro logo.
--- coyote-home-manager-programs-fastfetch
fastfetch.enable = true;
fastfetch.settings = {
"$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json";
logo.type = "small";
logo.padding.top = 4;
logo.padding.left = 3;
logo.padding.right = 4;
display.separator = " ";
modules = [
{key = "╭─────────╮"; type = "custom";}
{key = "│ {#31}user {#keys}│"; type = "title"; format = "{user-name}";}
{key = "│ {#32}host {#keys}│"; type = "title"; format = "{host-name}";}
{key = "│ {#33}uptime {#keys}│"; type = "uptime";}
{key = "│ {#34}distro {#keys}│"; type = "os";}
{key = "│ {#35}kernel {#keys}│"; type = "kernel";}
{key = "│ {#36}desktop {#keys}│"; type = "de";}
{key = "│ {#31}term {#keys}│"; type = "terminal";}
{key = "│ {#32}shell {#keys}│"; type = "shell";}
{key = "│ {#33}cpu {#keys}│"; type = "cpu"; showPeCoreCount = true;}
{key = "│ {#34}disk {#keys}│"; type = "disk"; folders = "/";}
{key = "│ {#35}memory {#keys}│"; type = "memory";}
{key = "│ {#36}network {#keys}│"; type = "localip"; format = "{ipv4} ({ifname})";}
{key = "├─────────┤"; type = "custom";}
{key = "│ {#39}colors {#keys}│"; type = "colors"; symbol = "circle";}
{key = "╰─────────╯"; type = "custom";}
];
};
---
<br><hr>
@s licence
this configuration is provided under the MIT licence, a copy of which can be
read below.
--- "LICENSE"
MIT License
Copyright (c) 2026 asnev
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---

View file

@ -1 +0,0 @@
body{min-width:200px;max-width:780px;margin:0 auto;padding:30px;font-family:Inter,Arial,sans-serif;font-size:1em}pre,code,.codeblock_name{font-family:Iosevka,Consolas,monospace}pre{-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre.prettyprint{color:#ab9bab;font-size:10pt;line-height:1.5;padding:10px;border-radius:10px;white-space:pre-wrap}.prettyprint{background:#1d1f21!important;font-family:Iosevka,Consolas,monospace!important;border:0!important}pre code{padding:0!important;background:transparent!important;border:0!important}.pln{color:#c5c8c6}.str{color:#918b3b}.kwd{color:#7b59c0}.com{color:#9e8f9e}.typ,.fun{color:#516aec}.lit,.atn,.dec{color:#a65926}.clo,.opn,.pun{color:#1b181b}.tag,.var{color:#ca402b}.atv{color:#159393}ol.linenums{margin:0;color:#969896}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{padding-left:1em;background-color:#1d1f21;list-style-type:decimal}.math{font-size:10pt;text-indent:0}.chapter-nav{font-size:10pt}.codeblock{page-break-inside:avoid;padding-bottom:15px}.codeblock_name{margin-top:1.25em;display:block}.codeblock_name,.seealso{font-size:8pt!important}h4{padding-right:1.25em}h4.noheading{margin-bottom:0}p:not(.notp){margin:0;text-indent:0!important}code{font-size:1em;padding:2px 4px;background:#f7f3f7;border:1px solid #d8cad8;border-radius:4px}blockquote{font-style:italic;border-left:4px solid #969896;background:#f7f3f7;padding:10px 20px;margin:15px 0}.two-col{list-style-type:none}.two-col li:before{content:collapse;content:'-';padding:5px;margin-right:5px;color:orange;background-color:#fff;display:inline-block}a:link,a:visited{color:#00f}a:link{text-decoration:none}a:link:not(.lit):hover{color:#00f;text-decoration:underline}a:link:active{color:red}p:not(.seealso) a::after{content:" (" attr(href) ")";font-size:0.7em}@media screen{.str{color:#b5bd68}.kwd{color:#b294bb}.com{color:#969896}.typ,.fun{color:#81a2be}.lit,.atn,.dec{color:#de935f}.pun,.opn,.clo{color:#c5c8c6}.tag,.var{color:#c66}.atv{color:#8abeb7}}@media print{body{font-size:10pt}pre.prettyprint{font-size:8pt}.seealso{font-size:9pt}.codeblock_name,.math{font-size:8pt}}