Refactor back to a more modular configuration

This commit is contained in:
Oliver Davies 2025-04-23 14:19:05 +01:00
parent 19ea08a716
commit 2bedd41d83
178 changed files with 2245 additions and 1847 deletions

View file

@ -1,57 +0,0 @@
# Based on https://github.com/MatthewCroughan/nixcfg/blob/afab322e6da20cc038d8577dd4a365673702d183/modules/default.nix.
# Autoloads files within modules/ and makes them available by their module
# type and name, e.g. `mixins-zsh`, `editor-nvim` and `users-opdavies` when
# imported with `inputs.self.nixosModules`.
{ lib }:
let
inherit (builtins)
attrNames
filter
listToAttrs
map
readDir
toString
;
inherit (lib)
filterAttrs
foldAttrs
hasSuffix
mapAttrsToList
nameValuePair
removeSuffix
zipListsWith
;
inherit (lib.filesystem) listFilesRecursive;
generateModules =
folder: prefix:
let
findSuffix = suffix: dir: (filter (x: (hasSuffix suffix (toString x))) (listFilesRecursive dir));
allNixFiles = findSuffix ".nix" folder;
allModuleNames = map (removeSuffix ".nix") (map baseNameOf allNixFiles);
zippedList = (
zipListsWith (x: y: nameValuePair (prefix + "-" + x) (import y)) allModuleNames allNixFiles
);
in
listToAttrs zippedList;
generateModulesAuto =
root:
let
moduleFolderNames = attrNames (filterAttrs (n: v: v == "directory") (readDir (toString root)));
moduleFolderPaths = map (x: (toString root) + "/" + x) moduleFolderNames;
zippedList = listToAttrs (
zipListsWith (x: y: nameValuePair x y) moduleFolderNames moduleFolderPaths
);
in
foldAttrs (item: acc: item) { } (mapAttrsToList (n: v: generateModules v n) zippedList);
in
generateModulesAuto ./.

View file

@ -1,185 +0,0 @@
{
home-manager.users.opdavies =
{ pkgs, ... }:
{
programs.neovim =
let
php = pkgs.php82;
phpPackages = pkgs.php82Packages;
in
{
enable = true;
plugins = with pkgs.vimPlugins; [
comment-nvim
conf-vim
edit-alternate-vim
gitsigns-nvim
harpoon2
mini-nvim
nvim-web-devicons
phpactor
refactoring-nvim
standard-vim
undotree
vim-caser
vim-nix
vim-pasta
vim-repeat
vim-sleuth
vim-textobj-indent
vim-textobj-user
vim-textobj-xmlattr
vim-unimpaired
# Testing
vim-test
vimux
# Git
vim-fugitive
# Debugging
nvim-dap
nvim-dap-ui
nvim-dap-virtual-text
# Treesitter
(pkgs.vimPlugins.nvim-treesitter.withPlugins (
plugins: with plugins; [
bash
comment
css
csv
dockerfile
gitattributes
gitignore
go
html
javascript
json
kdl
lua
luadoc
make
markdown
markdown_inline
nix
php
phpdoc
query
rst
scss
sql
terraform
twig
typescript
vim
vimdoc
vue
xml
yaml
]
))
nvim-treesitter-textobjects
# LSP, linting and formatting
conform-nvim
lsp-status-nvim
nvim-lint
nvim-lspconfig
# Completion
cmp-buffer
cmp-calc
cmp-cmdline
cmp-nvim-lsp
cmp-path
cmp-treesitter
cmp_luasnip
lspkind-nvim
nvim-cmp
# Snippets
friendly-snippets
luasnip
# Telescope
plenary-nvim
popup-nvim
telescope-frecency-nvim
telescope-fzf-native-nvim
telescope-live-grep-args-nvim
telescope-nvim
telescope-ui-select-nvim
# Databases
vim-dadbod
vim-dadbod-ui
vim-dadbod-completion
# Themes
catppuccin-nvim
];
extraPackages = with pkgs; [
# Languages
nodePackages.typescript
nodejs-slim
php
# Language servers
bash-language-server
dockerfile-language-server-nodejs
emmet-language-server
gopls
lua-language-server
lua54Packages.luacheck
marksman
nixd
phpactor
tailwindcss-language-server
terraform-ls
typescript-language-server
vscode-langservers-extracted
vue-language-server
yaml-language-server
# Formatters
black
eslint_d
nixfmt-rfc-style
nodePackages.prettier
stylua
yamlfmt
# Tools
hadolint
html-tidy
mariadb
nodePackages.jsonlint
nodePackages.markdownlint-cli
phpPackages.php-codesniffer
phpPackages.phpstan
proselint
ripgrep
shellcheck
yamllint
];
};
xdg.configFile.nvim = {
source = ./config;
recursive = true;
};
home.file.".markdownlint.yaml".text = ''
default: true
line-length: false
no-duplicate-heading:
siblings_only: true
'';
};
}

View file

@ -1,15 +1,23 @@
{ pkgs, ... }:
{
hardware.bluetooth.enable = true;
config,
lib,
pkgs,
...
}:
services.blueman.enable = true;
with lib;
environment.systemPackages = with pkgs; [
bluetuith
];
let
cfg = config.homeManagerModules.cli.bluetuith;
in
{
options.homeManagerModules.cli.bluetuith.enable = mkEnableOption "Enable bluetuith";
config = mkIf cfg.enable {
home.packages = with pkgs; [
bluetuith
];
home-manager.users.opdavies = {
xdg.configFile."bluetuith/bluetuith.conf" = {
text = ''
{

View file

@ -0,0 +1,16 @@
{
imports = [
./bluetuith.nix
./direnv.nix
./fzf.nix
./git.nix
./node.nix
./notes.nix
./ranger.nix
./scripts
./starship.nix
./tmux.nix
./tmux-sessionizer.nix
./zsh
];
}

View file

@ -0,0 +1,21 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.direnv;
in
{
options.homeManagerModules.cli.direnv.enable = mkEnableOption "Enable direnv";
config = mkIf cfg.enable {
programs.direnv = {
enable = true;
enableZshIntegration = true;
nix-direnv.enable = true;
silent = true;
};
};
}

View file

@ -0,0 +1,21 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.fzf;
in
{
options.homeManagerModules.cli.fzf.enable = mkEnableOption "Enable fzf";
config = mkIf cfg.enable {
programs.fzf = {
enable = true;
enableZshIntegration = true;
};
home.sessionVariables = {
FZF_DEFAULT_OPTS = "--reverse";
};
};
}

View file

@ -0,0 +1,178 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.git;
in
{
options.homeManagerModules.cli.git = {
enable = mkEnableOption "Enable git";
user = mkOption {
type = types.submodule {
options = {
emailAddress = mkOption {
description = "User email address.";
type = types.str;
apply =
x:
assert builtins.match "^[^@]+@[^@]+\\.[^@]+$" x != null;
x;
};
};
};
};
};
config = mkIf cfg.enable {
home.file."${config.xdg.configHome}/git/message".text = ''
# Description
#
# - Why is this change necessary?
# - How does it address the issue?
# - What side effects does this change have?
#
# For breaking changes, uncomment the following line and describe the change:
#
# BREAKING CHANGE:
#
#
# Add any issue IDs or commit SHAs that this commit references:
#
# Refs:
'';
programs = {
git = {
enable = true;
userName = "Oliver Davies";
userEmail = cfg.user.emailAddress;
aliases = {
aa = "add --all";
assume = "update-index --assume-unchanged";
assumed = "!git ls-files -v | grep '^[hsmrck?]' | cut -c 3-";
b = "branch";
blame = "blame -w -C -C -C";
browse = "!gh repo view --web";
ca = "commit --amend --verbose";
car = "commit --amend --no-edit";
cl = "!hub clone";
co = "checkout";
compare = "!hub compare";
current-branch = "rev-parse --abbrev-ref HEAD";
dc = "diff --color --word-diff --cached";
df = "diff --color --word-diff";
dup = "!git checkout develop && git fetch origin && echo && git sl develop..origin/develop && echo && git pull --quiet && git checkout -";
fixup = "commit --fixup";
issues = "!gh issue list --web";
mup = "!git master-to-main-wrapper checkout %BRANCH% && git fetch origin && echo && git sl %BRANCH%..origin/%BRANCH% && echo && git pull --quiet && git checkout -";
no-ff = "merge --no-ff";
pl = "pull";
prune = "remote prune origin";
ps = "push";
pulls = "!gh pr list --web";
rbc = "rebase --continue";
rdup = "!git dup && git rebase develop";
remotes = "remote -v";
repush = "!git pull --rebase && git push";
ri = "rebase --interactive";
rid = "!git rebase -i $(git merge-base develop HEAD)";
rim = "!git rebase -i $(git master-to-main-wrapper merge-base %BRANCH% HEAD)";
rip = "!git rebase -i $(git merge-base production HEAD)";
ris = "!git rebase -i $(git merge-base staging HEAD)";
riu = "!git rebase -i $(git rev-parse --abbrev-ref --symbolic-full-name @{u})";
rmup = "!git mup && git master-to-main-wrapper rebase %BRANCH%";
sl = "log --oneline --decorate -20";
sla = "log --oneline --decorate --graph --all -20";
slap = "log --oneline --decorate --graph --all";
slp = "log --oneline --decorate";
stash = "stash --included-untracked";
unassume = "update-index --no-assume-unchanged";
uncommit = "reset --soft HEAD^";
unstage = "reset";
update = "!git fetch --all --jobs=4 --prune --progress && git rebase --autostash --stat";
upstream = "rev-parse --abbrev-ref --symbolic-full-name @{u}";
ureset = "!git reset --hard $(git upstream)";
worktrees = "worktree list";
};
ignores = [
"/.ddev/providers/"
"/.direnv/"
"/.ignored/"
"/.issue-id"
"/.phpactor.json"
"/notes"
"/todo"
];
extraConfig = {
branch = {
autosetupmerge = true;
autosetuprebase = "always";
sort = "-committerdate";
};
checkout.defaultRemote = "origin";
color.ui = true;
column.ui = "auto";
commit.template = "${config.xdg.configHome}/git/message";
core = {
editor = "nvim";
excludesFile = "~/.config/git/ignore";
};
diff.tool = "vimdiff";
fetch.prune = true;
gpg.format = "ssh";
grep.lineNumber = true;
help.autocorrect = "1";
init.defaultBranch = "main";
maintenance = {
auto = false;
strategy = "incremental";
};
merge.ff = "only";
push = {
autoSetupRemote = true;
default = "upstream";
};
pull = {
ff = "only";
rebase = true;
};
rebase = {
autosquash = true;
autostash = true;
};
user.signingkey = "~/.ssh/id_rsa.pub";
};
};
};
home = {
packages = with pkgs; [ nixpkgs-2411.git-instafix ];
sessionVariables = {
GIT_INSTAFIX_UPSTREAM = "origin/main";
};
};
};
}

View file

@ -0,0 +1,25 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.node;
inherit (config.xdg) configHome dataHome stateHome;
in
{
options.homeManagerModules.cli.node.enable = mkEnableOption "Enable node";
config = mkIf cfg.enable {
xdg.configFile."${config.home.sessionVariables.NPM_CONFIG_USERCONFIG}".text = ''
cache=${configHome}/npm
init-module=${configHome}/npm/config/npm-init.js
logs-dir=${stateHome}/npm/logs
prefix=${dataHome}/npm
'';
home.sessionVariables = {
NPM_CONFIG_USERCONFIG = "${configHome}/npm/npmrc";
};
};
}

View file

@ -0,0 +1,30 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.notes;
in
{
options.homeManagerModules.cli.notes.enable = mkEnableOption "Enable notes";
config = mkIf cfg.enable {
xdg = {
enable = true;
userDirs.enable = true;
};
home = {
packages = with pkgs; [ notes ];
sessionVariables = {
NOTES_DIRECTORY = "${config.xdg.userDirs.documents}/wiki/notes";
};
};
};
}

View file

@ -0,0 +1,14 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.ranger;
in
{
options.homeManagerModules.cli.ranger.enable = mkEnableOption "Enable ranger";
config = mkIf cfg.enable {
programs.ranger.enable = true;
};
}

View file

@ -1,5 +1,5 @@
{
home-manager.users.opdavies.home = {
home = {
sessionPath = [ "$HOME/.local/bin" ];
file.".local/bin" = {

View file

@ -0,0 +1,187 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.starship;
in
{
options.homeManagerModules.cli.starship.enable = mkEnableOption "Enable starship";
config = mkIf cfg.enable {
programs.starship =
let
inherit (builtins) concatStringsSep;
in
{
enable = true;
enableZshIntegration = true;
settings = {
add_newline = false;
# https://starship.rs/config/#prompt
format = concatStringsSep "" [
"\n"
"$username"
"$hostname"
"$directory"
"$vcsh"
"$git_branch"
"$git_status"
"$git_metrics"
"$docker_context"
"$nodejs"
"$php"
"$terraform"
"$nix_shell"
"$direnv"
"\${custom.mob}"
"$memory_usage"
"$cmd_duration"
"$lua"
"$status"
"$character"
];
cmd_duration.disabled = true;
direnv.disabled = false;
directory.format = "[$path]($style) ";
git_status.disabled = true;
nix_shell.disabled = true;
nodejs.disabled = true;
php.disabled = true;
username.disabled = true;
custom = {
mob = {
command = "echo $MOB_TIMER_ROOM";
format = "[($output)]($style) ";
when = "[[ -v MOB_TIMER_ROOM ]]";
};
};
# https://starship.rs/presets/plain-text
aws.symbol = "aws ";
azure.symbol = "az ";
bun.symbol = "bun ";
c.symbol = "C ";
character = {
success_symbol = "[>](bold green)";
error_symbol = "[x](bold red)";
vimcmd_symbol = "[<](bold green)";
};
cobol.symbol = "cobol ";
conda.symbol = "conda ";
crystal.symbol = "cr ";
cmake.symbol = "cmake ";
daml.symbol = "daml ";
dart.symbol = "dart ";
deno.symbol = "deno ";
dotnet.symbol = ".NET ";
directory.read_only = " ro";
docker_context.symbol = "docker ";
elixir.symbol = "exs ";
elm.symbol = "elm ";
fennel.symbol = "fnl ";
fossil_branch.symbol = "fossil ";
gcloud.symbol = "gcp ";
git_branch.symbol = "git ";
git_commit.tag_symbol = " tag ";
git_status = {
ahead = ">";
behind = "<";
diverged = "<>";
renamed = "r";
deleted = "x";
};
gleam.symbol = "gleam ";
golang.symbol = "go ";
gradle.symbol = "gradle ";
guix_shell.symbol = "guix ";
hg_branch.symbol = "hg ";
java.symbol = "java ";
julia.symbol = "jl ";
kotlin.symbol = "kt ";
lua.symbol = "lua ";
nodejs.symbol = "nodejs ";
memory_usage.symbol = "memory ";
meson.symbol = "meson ";
nats.symbol = "nats ";
nim.symbol = "nim ";
nix_shell.symbol = "nix ";
ocaml.symbol = "ml ";
opa.symbol = "opa ";
os.symbols = {
AIX = "aix ";
Alpaquita = "alq ";
AlmaLinux = "alma ";
Alpine = "alp ";
Amazon = "amz ";
Android = "andr ";
Arch = "rch ";
Artix = "atx ";
CentOS = "cent ";
Debian = "deb ";
DragonFly = "dfbsd ";
Emscripten = "emsc ";
EndeavourOS = "ndev ";
Fedora = "fed ";
FreeBSD = "fbsd ";
Garuda = "garu ";
Gentoo = "gent ";
HardenedBSD = "hbsd ";
Illumos = "lum ";
Kali = "kali ";
Linux = "lnx ";
Mabox = "mbox ";
Macos = "mac ";
Manjaro = "mjo ";
Mariner = "mrn ";
MidnightBSD = "mid ";
Mint = "mint ";
NetBSD = "nbsd ";
NixOS = "nix ";
OpenBSD = "obsd ";
OpenCloudOS = "ocos ";
openEuler = "oeul ";
openSUSE = "osuse ";
OracleLinux = "orac ";
Pop = "pop ";
Raspbian = "rasp ";
Redhat = "rhl ";
RedHatEnterprise = "rhel ";
RockyLinux = "rky ";
Redox = "redox ";
Solus = "sol ";
SUSE = "suse ";
Ubuntu = "ubnt ";
Ultramarine = "ultm ";
Unknown = "unk ";
Void = "void ";
Windows = "win ";
};
package.symbol = "pkg ";
perl.symbol = "pl ";
php.symbol = "php ";
pijul_channel.symbol = "pijul ";
pulumi.symbol = "pulumi ";
purescript.symbol = "purs ";
python.symbol = "py ";
quarto.symbol = "quarto ";
raku.symbol = "raku ";
ruby.symbol = "rb ";
rust.symbol = "rs ";
scala.symbol = "scala ";
spack.symbol = "spack ";
solidity.symbol = "solidity ";
status.symbol = "[x](bold red) ";
sudo.symbol = "sudo ";
swift.symbol = "swift ";
typst.symbol = "typst ";
terraform.symbol = "terraform ";
zig.symbol = "zig ";
};
};
};
}

View file

@ -0,0 +1,46 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.tmux-sessionizer;
in
{
options.homeManagerModules.cli.tmux-sessionizer.enable = mkEnableOption "Enable tmux-sessionizer";
config = mkIf cfg.enable {
home.packages = with pkgs; [
tmux-sessionizer
];
xdg.configFile."tmux-sessionizer/default".source = "${
pkgs.writeShellApplication {
name = ".tmux-sessionizer";
runtimeInputs = with pkgs; [
tmux
];
text = ''
set +o errexit
set +o nounset
if [[ "$PWD" == "${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/os" || "$PWD" == "${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/personal" ]]; then
clear
return
fi
tmux new-window -d -n scratch
nvim .
clear
'';
}
}/bin/.tmux-sessionizer";
};
}

View file

@ -0,0 +1,97 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.tmux;
in
{
options.homeManagerModules.cli.tmux.enable = mkEnableOption "Enable tmux";
config = mkIf cfg.enable {
programs.tmux = {
enable = true;
terminal = "tmux-256color";
extraConfig = ''
set-option -g status-keys "vi"
set-option -sa terminal-features "''${TERM}:RGB"
bind -n S-Left resize-pane -L 2
bind -n S-Right resize-pane -R 2
bind -n S-Down resize-pane -D 1
bind -n S-Up resize-pane -U 1
bind -n C-Left resize-pane -L 10
bind -n C-Right resize-pane -R 10
bind -n C-Down resize-pane -D 5
bind -n C-Up resize-pane -U 5
# Status line customisation
set-option -g status-left ""
set-option -g status-right " #{session_name}"
set-option -g status-right-length 100
set-option -g status-style "fg=#7C7D83 bg=default"
set-option -g window-status-activity-style none
set-option -g window-status-current-style "fg=#E9E9EA"
bind c new-window -c "#{pane_current_path}"
set -g base-index 1
set -g pane-base-index 1
set -g renumber-windows on
# Break a pane into a new window.
bind-key b break-pane -d
bind-key J command-prompt -p "join pane from: " "join-pane -h -s '%%'"
bind-key C-j choose-tree
set-window-option -g mode-keys vi
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
bind C-j split-window -v "tmux list-sessions | sed -E 's/:.*$//' | grep -v \"^$(tmux display-message -p '#S')\$\" | fzf --reverse | xargs tmux switch-client -t"
bind-key K run-shell 'tmux switch-client -n \; kill-session -t "$(tmux display-message -p "#S")" || tmux kill-session'
# Allow clearing screen with ctrl-l by using <prefix> C-l
bind C-l send-keys "C-l"
bind C-k send-keys "C-k"
# Enable mouse support.
setw -g mouse on
# Remove delay when switching Vim modes.
set -sg escape-time 0
set-option -g pane-active-border-style "fg=#1f2335"
set-option -g pane-border-style "fg=#1f2335"
# Vim-like pane navigation.
bind ^ last-window
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind-key -r f run-shell "tmux new-window tmux-sessionizer"
bind-key -r D new-window -c "#{pane_current_path}" "[[ -e TODO.md ]] && nvim TODO.md || nvim ~/Documents/wiki/todo.txt"
bind-key -r N new-window "notes"
bind-key -r W split-window -h -c ~/Documents/wiki "nvim '+Telescope find_files'"
'';
plugins = with pkgs.tmuxPlugins; [
vim-tmux-navigator
yank
];
};
};
}

View file

@ -0,0 +1,115 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.zsh;
in
{
options.homeManagerModules.cli.zsh.enable = mkEnableOption "Enable zsh";
config = mkIf cfg.enable {
programs.zsh = {
enable = true;
enableCompletion = true;
syntaxHighlighting.enable = true;
zsh-abbr = {
enable = true;
abbreviations = import ./abbreviations.nix;
globalAbbreviations = import ./global-abbreviations.nix;
};
dotDir = ".config/zsh";
shellAliases = (import ./aliases.nix { inherit config; });
localVariables = {
ABBR_SET_EXPANSION_CURSOR = 1;
};
profileExtra = ''
if [[ -z "$DISPLAY" ]] && [[ "$(tty)" == "/dev/tty1" ]]; then
exec startx &>/dev/null
fi
'';
initExtra = ''
background() {
for ((i=2;i<=$#;i++)); do
''${@[1]} ''${@[$i]} &> /dev/null &
done
}
# suffix
alias -s gz="tar -tf"
alias -s {html,HTML}="background zsh"
alias -s {jpg,JPG,png,PNG}="background okular"
alias -s {pdf,PDF}="background okular"
alias -s {zip,ZIP}="unzip -l"
git() {
case "$1" in
clone)
shift
local repo_url="$1"
local repo_path="''${2:-}"
if [ -n "$TARGET_DIR" ]; then
command git clone "$repo_url" "$repo_path"
else
command git clone "$repo_url"
repo_path=$(basename "$repo_url" .git)
fi
${pkgs.tmux-sessionizer}/bin/tmux-sessionizer "$repo_path"
;;
root)
shift
local ROOT="$(${pkgs.git}/bin/git rev-parse --show-toplevel 2> /dev/null || echo -n .)"
if [[ $# == 0 ]]; then
cd "''${ROOT}"
else
(cd "''${ROOT}" && eval "''${@}")
fi
;;
*)
${pkgs.git}/bin/git "''${@}"
;;
esac
}
mbsync() {
${pkgs.isync}/bin/mbsync --config "${config.xdg.configHome}/isync/mbsyncrc" "''${@}"
}
ttyper() {
command ${pkgs.ttyper}/bin/ttyper --language english1000 --words 50 "''${@}"
}
yt-dlp() {
command yt-dlp --paths ~/Videos "$@"
}
bindkey -s ^f "tmux-sessionizer\n"
bindkey -s ^v "nvim\n"
setopt auto_cd
setopt auto_pushd
setopt pushd_ignore_dups
setopt pushdminus
'';
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./neovim
./phpactor
];
}

View file

@ -0,0 +1,197 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.coding.neovim;
in
{
options.homeManagerModules.coding.neovim.enable = mkEnableOption "Enable neovim";
config = mkIf cfg.enable {
programs.neovim =
let
php = pkgs.php82;
phpPackages = pkgs.php82Packages;
in
{
enable = true;
plugins = with pkgs.vimPlugins; [
comment-nvim
conf-vim
edit-alternate-vim
gitsigns-nvim
harpoon2
mini-nvim
nvim-web-devicons
phpactor
refactoring-nvim
standard-vim
undotree
vim-caser
vim-nix
vim-pasta
vim-repeat
vim-sleuth
vim-textobj-indent
vim-textobj-user
vim-textobj-xmlattr
vim-unimpaired
# Testing
vim-test
vimux
# Git
vim-fugitive
# Debugging
nvim-dap
nvim-dap-ui
nvim-dap-virtual-text
# Treesitter
(pkgs.vimPlugins.nvim-treesitter.withPlugins (
plugins: with plugins; [
bash
comment
css
csv
dockerfile
gitattributes
gitignore
go
html
javascript
json
kdl
lua
luadoc
make
markdown
markdown_inline
nix
php
phpdoc
query
rst
scss
sql
terraform
twig
typescript
vim
vimdoc
vue
xml
yaml
]
))
nvim-treesitter-textobjects
# LSP, linting and formatting
conform-nvim
lsp-status-nvim
nvim-lint
nvim-lspconfig
# Completion
cmp-buffer
cmp-calc
cmp-cmdline
cmp-nvim-lsp
cmp-path
cmp-treesitter
cmp_luasnip
lspkind-nvim
nvim-cmp
# Snippets
friendly-snippets
luasnip
# Telescope
plenary-nvim
popup-nvim
telescope-frecency-nvim
telescope-fzf-native-nvim
telescope-live-grep-args-nvim
telescope-nvim
telescope-ui-select-nvim
# Databases
vim-dadbod
vim-dadbod-ui
vim-dadbod-completion
# Themes
catppuccin-nvim
];
extraPackages = with pkgs; [
# Languages
nodePackages.typescript
nodejs-slim
php
# Language servers
bash-language-server
dockerfile-language-server-nodejs
emmet-language-server
gopls
lua-language-server
lua54Packages.luacheck
marksman
nixd
phpactor
tailwindcss-language-server
terraform-ls
typescript-language-server
vscode-langservers-extracted
vue-language-server
yaml-language-server
# Formatters
black
eslint_d
nixfmt-rfc-style
nodePackages.prettier
stylua
yamlfmt
# Tools
hadolint
html-tidy
mariadb
nodePackages.jsonlint
nodePackages.markdownlint-cli
phpPackages.php-codesniffer
phpPackages.phpstan
proselint
ripgrep
shellcheck
yamllint
];
};
xdg.configFile.nvim = {
source = ./config;
recursive = true;
};
home.file.".markdownlint.yaml".text = ''
default: true
line-length: false
no-duplicate-heading:
siblings_only: true
'';
};
}

View file

@ -0,0 +1,24 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.homeManagerModules.coding.phpactor;
in
{
options.homeManagerModules.coding.phpactor.enable = lib.mkEnableOption "Enable phpactor";
config = lib.mkIf cfg.enable {
home.packages = with pkgs; [
phpactor
];
xdg.configFile.phpactor = {
source = ./config;
recursive = true;
};
};
}

View file

@ -0,0 +1,5 @@
{
imports = [
./gnupg.nix
];
}

View file

@ -0,0 +1,8 @@
{
home.file.".gnupg/gpg-agent.conf".text = ''
allow-preset-passphrase
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
'';
}

View file

@ -0,0 +1,8 @@
{
imports = [
./cli
./coding
./core
./desktop
];
}

View file

@ -0,0 +1,10 @@
{
imports = [
./firefox.nix
./flameshot.nix
./gtk.nix
./qutebrowser.nix
./mpv.nix
./screenkey.nix
];
}

View file

@ -0,0 +1,124 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.desktop.firefox;
in
{
options.homeManagerModules.desktop.firefox.enable = mkEnableOption "Enable firefox";
config = mkIf cfg.enable {
programs.firefox.enable = false;
programs.librewolf = {
enable = true;
languagePacks = [ "en-GB" ];
policies = {
CaptivePortal = false;
DisableFirefoxAccounts = true;
DisableFirefoxStudies = true;
DisablePocket = true;
DisableTelemetry = true;
EnableTrackingProtection = {
Cryptomining = true;
Fingerprinting = true;
Value = true;
};
ExtensionSettings = {
"jid1-ZAdIEUB7XOzOJw@jetpack" = {
install_url = "https://addons.mozilla.org/firefox/downloads/latest/duckduckgo-for-firefox/latest.xpi";
installation_mode = "force_installed";
};
"uBlock0@raymondhill.net" = {
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
installation_mode = "force_installed";
};
};
FirefoxHome = {
Highlights = false;
Pocket = false;
Search = true;
Snippets = false;
SponsoredPocket = false;
SponsoredTopSites = false;
TopSites = true;
};
FirefoxSuggest = {
ImproveSuggest = false;
SponsoredSuggestions = false;
WebSuggestions = false;
};
NoDefaultBookmarks = true;
OfferToSaveLogins = false;
OfferToSaveLoginsDefault = false;
PasswordManagerEnabled = false;
Preferences = {
"cookiebanners.service.mode" = 2; # Block cookie banners
"cookiebanners.service.mode.privateBrowsing" = 2; # Block cookie banners in private browsing
"privacy.donottrackheader.enabled" = true;
"privacy.fingerprintingProtection" = true;
"privacy.resistFingerprinting" = true;
"privacy.trackingprotection.emailtracking.enabled" = true;
"privacy.trackingprotection.enabled" = true;
"privacy.trackingprotection.fingerprinting.enabled" = true;
"privacy.trackingprotection.socialtracking.enabled" = true;
};
HardwareAcceleration = true;
TranslateEnabled = true;
UserMessaging = {
ExtensionRecommendations = false;
UrlbarInterventions = false;
SkipOnboarding = true;
};
};
profiles = {
default = {
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
awesome-rss
bitwarden
darkreader
onetab
tree-style-tab
ublock-origin
videospeed
vimium
web-developer
];
search = {
default = "ddg";
force = true;
privateDefault = "ddg";
};
settings = {
"browser.search.isUS" = false;
"browser.search.region" = "GB";
"distribution.searchplugins.defaultLocale" = "en-GB";
"general.useragent.locale" = "en-GB";
"intl.accept_languages" = "en-GB, en";
"intl.regional_prefs.use_os_locales" = true;
};
};
};
};
};
}

View file

@ -0,0 +1,26 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.desktop.flameshot;
in
{
options.homeManagerModules.desktop.flameshot.enable = mkEnableOption "Enable flameshot";
config = mkIf cfg.enable {
services.flameshot = {
enable = true;
settings = {
General = {
disabledTrayIcon = false;
saveAfterCopy = true;
savePath = "${config.xdg.userDirs.pictures}/Screenshots";
showHelp = false;
uiColor = "#60a5fa";
};
};
};
};
}

View file

@ -0,0 +1,34 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.desktop.gtk;
in
{
options.homeManagerModules.desktop.gtk.enable = mkEnableOption "Enable gtk";
config = mkIf cfg.enable {
gtk = with pkgs; {
enable = true;
theme = {
name = "Arc-Dark";
package = arc-theme;
};
iconTheme = {
name = "Arc";
package = arc-icon-theme;
};
gtk3.extraConfig.gtk-enable-animations = false;
gtk4.extraConfig.gtk-enable-animations = false;
};
};
}

View file

@ -0,0 +1,22 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.desktop.mpv;
in
{
options.homeManagerModules.desktop.mpv.enable = mkEnableOption "Enable mpv";
config = mkIf cfg.enable {
programs.mpv = {
enable = true;
# https://github.com/mpv-player/mpv/blob/master/etc/input.conf
bindings = {
"DOWN" = "add volume -5";
"UP" = "add volume 5";
};
};
};
}

Some files were not shown because too many files have changed in this diff Show more