aboutsummaryrefslogtreecommitdiffstats
path: root/modules/programs
diff options
context:
space:
mode:
authorArpit Chakladar <arpitchakladar@proton.me>2026-04-24 01:48:30 +0530
committerArpit Chakladar <arpitchakladar@proton.me>2026-04-24 01:48:30 +0530
commit3e232a2bc7f5c8ea33804be1ea071a91c5f98055 (patch)
treef772b5d7d393cacf708d845acb75b55c12d3e625 /modules/programs
parent606716e0a4b8cbeb9076fb88b6b92664a5a24081 (diff)
downloadhome-manager-config-3e232a2bc7f5c8ea33804be1ea071a91c5f98055.tar.gz
home-manager-config-3e232a2bc7f5c8ea33804be1ea071a91c5f98055.zip
replacing tools with programs to be more consistent with config options
Diffstat (limited to 'modules/programs')
-rw-r--r--modules/programs/bat/base16.mustache.tmTheme534
-rw-r--r--modules/programs/bat/default.nix26
-rw-r--r--modules/programs/bluetui/default.nix19
-rw-r--r--modules/programs/bottom/default.nix5
-rw-r--r--modules/programs/brightnessctl/default.nix19
-rw-r--r--modules/programs/bruno/default.nix19
-rw-r--r--modules/programs/default.nix43
-rw-r--r--modules/programs/devenv/alias.sh28
-rw-r--r--modules/programs/devenv/default.nix26
-rw-r--r--modules/programs/feh/default.nix5
-rw-r--r--modules/programs/ffmpeg/default.nix19
-rw-r--r--modules/programs/fzf/default.nix49
-rw-r--r--modules/programs/git/default.nix33
-rw-r--r--modules/programs/htop/default.nix15
-rw-r--r--modules/programs/impala/default.nix19
-rw-r--r--modules/programs/kitty/default.nix52
-rw-r--r--modules/programs/lf/default.nix48
-rw-r--r--modules/programs/lf/icons342
-rw-r--r--modules/programs/lf/lfrc279
-rw-r--r--modules/programs/librewolf/default.nix59
-rw-r--r--modules/programs/lsd/default.nix10
-rw-r--r--modules/programs/maim/default.nix19
-rw-r--r--modules/programs/nixvim/colorscheme.nix26
-rw-r--r--modules/programs/nixvim/default.nix83
-rw-r--r--modules/programs/nixvim/keymaps.nix41
-rw-r--r--modules/programs/nixvim/plugins/cmp.nix37
-rw-r--r--modules/programs/nixvim/plugins/comment.nix23
-rw-r--r--modules/programs/nixvim/plugins/default.nix20
-rw-r--r--modules/programs/nixvim/plugins/gitsigns.nix8
-rw-r--r--modules/programs/nixvim/plugins/indent-blankline.nix14
-rw-r--r--modules/programs/nixvim/plugins/lsp.nix91
-rw-r--r--modules/programs/nixvim/plugins/lualine.nix90
-rw-r--r--modules/programs/nixvim/plugins/luasnip.nix8
-rw-r--r--modules/programs/nixvim/plugins/noice.nix19
-rw-r--r--modules/programs/nixvim/plugins/nvim-tree.nix44
-rw-r--r--modules/programs/nixvim/plugins/telescope.nix85
-rw-r--r--modules/programs/nixvim/plugins/treesitter.nix19
-rw-r--r--modules/programs/nixvim/plugins/web-devicons.nix8
-rw-r--r--modules/programs/nixvim/plugins/which-key.nix21
-rw-r--r--modules/programs/nvtop/default.nix19
-rw-r--r--modules/programs/opencode/default.nix5
-rw-r--r--modules/programs/openvpn/default.nix19
-rw-r--r--modules/programs/ouch/default.nix19
-rw-r--r--modules/programs/pamixer/default.nix19
-rw-r--r--modules/programs/playerctl/default.nix19
-rw-r--r--modules/programs/qemu/default.nix23
-rw-r--r--modules/programs/slop/default.nix19
-rw-r--r--modules/programs/ssh/default.nix31
-rw-r--r--modules/programs/starship/default.nix63
-rw-r--r--modules/programs/systemctl-tui/default.nix19
-rw-r--r--modules/programs/tmux/default.nix4
-rw-r--r--modules/programs/tor/default.nix26
-rw-r--r--modules/programs/umu-launcher/default.nix20
-rw-r--r--modules/programs/vlc/default.nix19
-rw-r--r--modules/programs/vscode/default.nix15
-rw-r--r--modules/programs/zathura/default.nix4
-rw-r--r--modules/programs/zsh/default.nix35
-rw-r--r--modules/programs/zsh/nix-aliases.sh27
58 files changed, 2710 insertions, 0 deletions
diff --git a/modules/programs/bat/base16.mustache.tmTheme b/modules/programs/bat/base16.mustache.tmTheme
new file mode 100644
index 0000000..6b2cd5b
--- /dev/null
+++ b/modules/programs/bat/base16.mustache.tmTheme
@@ -0,0 +1,534 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>name</key>
+ <string>OneDark Dark</string>
+ <key>author</key>
+ <string>olimorris (https://github.com/olimorris)</string>
+ <key>settings</key>
+ <array>
+
+ <!-- Global settings -->
+ <dict>
+ <key>settings</key>
+ <dict>
+ <key>background</key>
+ <string>#{{base00}}</string>
+ <key>foreground</key>
+ <string>#{{base05}}</string>
+ <key>caret</key>
+ <string>#{{base05}}</string>
+ <key>invisibles</key>
+ <string>#{{base03}}</string>
+ <key>lineHighlight</key>
+ <string>#{{base01}}</string>
+ <key>selection</key>
+ <string>#{{base02}}</string>
+ <key>selectionBorder</key>
+ <string>#{{base03}}</string>
+ <key>findHighlight</key>
+ <string>#{{base0A}}</string>
+ <key>findHighlightForeground</key>
+ <string>#{{base00}}</string>
+ <key>activeGuide</key>
+ <string>#{{base03}}</string>
+ <key>bracketsForeground</key>
+ <string>#{{base05}}</string>
+ <key>bracketsOptions</key>
+ <string>underline</string>
+ <key>bracketContentsForeground</key>
+ <string>#{{base05}}</string>
+ <key>bracketContentsOptions</key>
+ <string>underline</string>
+ <key>tagsOptions</key>
+ <string>stippled_underline</string>
+ <key>gutterForeground</key>
+ <string>#{{base03}}</string>
+ <key>gutter</key>
+ <string>#{{base01}}</string>
+ </dict>
+ </dict>
+
+ <!-- Comments -->
+ <dict>
+ <key>name</key>
+ <string>Comment</string>
+ <key>scope</key>
+ <string>comment, punctuation.definition.comment</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base03}}</string>
+ <key>fontStyle</key>
+ <string>italic</string>
+ </dict>
+ </dict>
+
+ <!-- Variables -->
+ <dict>
+ <key>name</key>
+ <string>Variable</string>
+ <key>scope</key>
+ <string>variable, variable.other</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base05}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Variable - Language</string>
+ <key>scope</key>
+ <string>variable.language</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0E}}</string>
+ <key>fontStyle</key>
+ <string>italic</string>
+ </dict>
+ </dict>
+
+ <!-- Keywords -->
+ <dict>
+ <key>name</key>
+ <string>Keyword</string>
+ <key>scope</key>
+ <string>keyword, keyword.control</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0E}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Keyword - Operator</string>
+ <key>scope</key>
+ <string>keyword.operator</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0C}}</string>
+ </dict>
+ </dict>
+
+ <!-- Storage -->
+ <dict>
+ <key>name</key>
+ <string>Storage</string>
+ <key>scope</key>
+ <string>storage, storage.type, storage.modifier</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0E}}</string>
+ </dict>
+ </dict>
+
+ <!-- Constants -->
+ <dict>
+ <key>name</key>
+ <string>Constant</string>
+ <key>scope</key>
+ <string>constant, constant.other</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base09}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Constant - Numeric</string>
+ <key>scope</key>
+ <string>constant.numeric</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base09}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Constant - Language</string>
+ <key>scope</key>
+ <string>constant.language</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base09}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Constant - Character Escape</string>
+ <key>scope</key>
+ <string>constant.character.escape</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0C}}</string>
+ </dict>
+ </dict>
+
+ <!-- Strings -->
+ <dict>
+ <key>name</key>
+ <string>String</string>
+ <key>scope</key>
+ <string>string</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0B}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>String - Punctuation</string>
+ <key>scope</key>
+ <string>punctuation.definition.string</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0B}}</string>
+ </dict>
+ </dict>
+
+ <!-- Support -->
+ <dict>
+ <key>name</key>
+ <string>Support - Function</string>
+ <key>scope</key>
+ <string>support.function</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0D}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Support - Class</string>
+ <key>scope</key>
+ <string>support.class</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0A}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Support - Type</string>
+ <key>scope</key>
+ <string>support.type</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0C}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Support - Constant</string>
+ <key>scope</key>
+ <string>support.constant</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base09}}</string>
+ </dict>
+ </dict>
+
+ <!-- Entity -->
+ <dict>
+ <key>name</key>
+ <string>Entity - Name - Function</string>
+ <key>scope</key>
+ <string>entity.name.function</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0D}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Entity - Name - Class / Type</string>
+ <key>scope</key>
+ <string>entity.name.class, entity.name.type, entity.name.type.class</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0A}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Entity - Name - Tag</string>
+ <key>scope</key>
+ <string>entity.name.tag</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base08}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Entity - Other - Attribute Name</string>
+ <key>scope</key>
+ <string>entity.other.attribute-name</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base09}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Entity - Other - Inherited Class</string>
+ <key>scope</key>
+ <string>entity.other.inherited-class</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0A}}</string>
+ <key>fontStyle</key>
+ <string>italic</string>
+ </dict>
+ </dict>
+
+ <!-- Punctuation -->
+ <dict>
+ <key>name</key>
+ <string>Punctuation</string>
+ <key>scope</key>
+ <string>punctuation</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base05}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Punctuation - Section</string>
+ <key>scope</key>
+ <string>punctuation.section, meta.brace</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base05}}</string>
+ </dict>
+ </dict>
+
+ <!-- Invalid -->
+ <dict>
+ <key>name</key>
+ <string>Invalid</string>
+ <key>scope</key>
+ <string>invalid</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base07}}</string>
+ <key>background</key>
+ <string>#{{base08}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Invalid - Deprecated</string>
+ <key>scope</key>
+ <string>invalid.deprecated</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base07}}</string>
+ <key>background</key>
+ <string>#{{base0F}}</string>
+ </dict>
+ </dict>
+
+ <!-- Diff -->
+ <dict>
+ <key>name</key>
+ <string>Diff - Inserted</string>
+ <key>scope</key>
+ <string>markup.inserted</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0B}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Diff - Deleted</string>
+ <key>scope</key>
+ <string>markup.deleted</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base08}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Diff - Changed</string>
+ <key>scope</key>
+ <string>markup.changed</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0E}}</string>
+ </dict>
+ </dict>
+
+ <!-- Markup -->
+ <dict>
+ <key>name</key>
+ <string>Markup - Heading</string>
+ <key>scope</key>
+ <string>markup.heading, entity.name.section</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0D}}</string>
+ <key>fontStyle</key>
+ <string>bold</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Markup - Bold</string>
+ <key>scope</key>
+ <string>markup.bold</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base09}}</string>
+ <key>fontStyle</key>
+ <string>bold</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Markup - Italic</string>
+ <key>scope</key>
+ <string>markup.italic</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0E}}</string>
+ <key>fontStyle</key>
+ <string>italic</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Markup - Inline Code</string>
+ <key>scope</key>
+ <string>markup.inline.raw, markup.raw.inline</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0C}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Markup - Link</string>
+ <key>scope</key>
+ <string>markup.underline.link, string.other.link</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0D}}</string>
+ <key>fontStyle</key>
+ <string>underline</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Markup - Quote</string>
+ <key>scope</key>
+ <string>markup.quote</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0B}}</string>
+ <key>fontStyle</key>
+ <string>italic</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Markup - List</string>
+ <key>scope</key>
+ <string>markup.list, punctuation.definition.list</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base08}}</string>
+ </dict>
+ </dict>
+
+ <!-- Meta -->
+ <dict>
+ <key>name</key>
+ <string>Meta - Function Call</string>
+ <key>scope</key>
+ <string>meta.function-call</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base0D}}</string>
+ </dict>
+ </dict>
+
+ <dict>
+ <key>name</key>
+ <string>Meta - Preprocessor</string>
+ <key>scope</key>
+ <string>meta.preprocessor</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#{{base09}}</string>
+ </dict>
+ </dict>
+
+ </array>
+ <key>uuid</key>
+ <string>a6f0d8c2-3b1e-4f5a-9c7d-2e8b0f4a6d1c</string>
+</dict>
+</plist>
diff --git a/modules/programs/bat/default.nix b/modules/programs/bat/default.nix
new file mode 100644
index 0000000..3c962a3
--- /dev/null
+++ b/modules/programs/bat/default.nix
@@ -0,0 +1,26 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# bat - a cat clone with wings
+{
+ config = lib.mkIf config.programs.bat.enable {
+ programs.bat = {
+ config = {
+ theme = "base16";
+ };
+ themes = {
+ base16 = {
+ src = pkgs.runCommand "bat-base16-theme" { } ''
+ mkdir -p $out
+ cp ${config.scheme { template = ./base16.mustache.tmTheme; }} $out/base16.tmTheme
+ '';
+ file = "base16.tmTheme";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/programs/bluetui/default.nix b/modules/programs/bluetui/default.nix
new file mode 100644
index 0000000..d214d4b
--- /dev/null
+++ b/modules/programs/bluetui/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Bluetui - Terminal UI for Bluetooth management
+{
+ options.programs.bluetui = {
+ enable = lib.mkEnableOption "Enables bluetui.";
+ };
+
+ config = lib.mkIf config.programs.bluetui.enable {
+ home.packages = with pkgs; [
+ bluetui
+ ];
+ };
+}
diff --git a/modules/programs/bottom/default.nix b/modules/programs/bottom/default.nix
new file mode 100644
index 0000000..0fd2853
--- /dev/null
+++ b/modules/programs/bottom/default.nix
@@ -0,0 +1,5 @@
+{ ... }:
+
+# Bottom - Cross-platform graphical process/system monitor (Rust-based)
+{
+}
diff --git a/modules/programs/brightnessctl/default.nix b/modules/programs/brightnessctl/default.nix
new file mode 100644
index 0000000..5092ede
--- /dev/null
+++ b/modules/programs/brightnessctl/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# brightnessctl - Backlight brightness control tool
+{
+ options.programs.brightnessctl = {
+ enable = lib.mkEnableOption "Enables brightnessctl.";
+ };
+
+ config = lib.mkIf config.programs.brightnessctl.enable {
+ home.packages = with pkgs; [
+ brightnessctl
+ ];
+ };
+}
diff --git a/modules/programs/bruno/default.nix b/modules/programs/bruno/default.nix
new file mode 100644
index 0000000..72932db
--- /dev/null
+++ b/modules/programs/bruno/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Bruno - Open-source API client for testing HTTP endpoints
+{
+ options.programs.bruno = {
+ enable = lib.mkEnableOption "Enables bruno.";
+ };
+
+ config = lib.mkIf config.programs.bruno.enable {
+ home.packages = with pkgs; [
+ bruno
+ ];
+ };
+}
diff --git a/modules/programs/default.nix b/modules/programs/default.nix
new file mode 100644
index 0000000..76be19f
--- /dev/null
+++ b/modules/programs/default.nix
@@ -0,0 +1,43 @@
+{ ... }:
+
+# Tools - Collection of tool configurations (browsers, editors, utilities, etc.)
+{
+ imports = [
+ ./bat
+ ./bluetui
+ ./bottom
+ ./brightnessctl
+ ./bruno
+ ./devenv
+ ./feh
+ ./ffmpeg
+ ./fzf
+ ./git
+ ./htop
+ ./impala
+ ./kitty
+ ./lf
+ ./librewolf
+ ./lsd
+ ./maim
+ # ./nixvim
+ ./nvtop
+ ./opencode
+ ./ssh
+ ./openvpn
+ ./ouch
+ ./pamixer
+ ./playerctl
+ ./qemu
+ ./slop
+ ./starship
+ ./systemctl-tui
+ ./tmux
+ ./tor
+ ./umu-launcher
+ ./vlc
+ ./vscode
+ ./zathura
+ ./zsh
+ ];
+}
diff --git a/modules/programs/devenv/alias.sh b/modules/programs/devenv/alias.sh
new file mode 100644
index 0000000..e63dbd8
--- /dev/null
+++ b/modules/programs/devenv/alias.sh
@@ -0,0 +1,28 @@
+devenv() {
+ local has_reload=false
+ local is_shell=false
+
+ for arg in "$@"; do
+ if [[ "$arg" == "--reload" || "$arg" == "--no-reload" ]]; then
+ has_reload=true
+ fi
+ if [[ "$arg" == "shell" ]]; then
+ is_shell=true
+ fi
+ done
+
+ if [[ "$is_shell" == true ]]; then
+ if [[ "$has_reload" == true ]]; then
+ command devenv "$@" "$SHELL"
+ else
+ command devenv "$@" --no-reload "$SHELL"
+ fi
+ return
+ fi
+
+ if [[ "$has_reload" == true ]]; then
+ command devenv "$@"
+ else
+ command devenv "$@" --no-reload
+ fi
+}
diff --git a/modules/programs/devenv/default.nix b/modules/programs/devenv/default.nix
new file mode 100644
index 0000000..633fd0d
--- /dev/null
+++ b/modules/programs/devenv/default.nix
@@ -0,0 +1,26 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+# Devenv - Developer environment tooling (Nix-based dev environments)
+{
+ options.programs.devenv = {
+ enable = lib.mkEnableOption "Enables devenv.";
+ };
+
+ config =
+ let
+ shellIntegration = builtins.readFile ./alias.sh;
+ in
+ lib.mkIf config.programs.devenv.enable {
+ home.packages = with pkgs; [
+ devenv
+ ];
+
+ programs.zsh.initContent = lib.mkIf config.programs.zsh.enable (lib.mkAfter shellIntegration);
+ programs.bash.initExtra = lib.mkIf config.programs.bash.enable (lib.mkAfter shellIntegration);
+ };
+}
diff --git a/modules/programs/feh/default.nix b/modules/programs/feh/default.nix
new file mode 100644
index 0000000..050934e
--- /dev/null
+++ b/modules/programs/feh/default.nix
@@ -0,0 +1,5 @@
+{ ... }:
+
+# Feh - Lightweight image viewer and wallpaper setter
+{
+}
diff --git a/modules/programs/ffmpeg/default.nix b/modules/programs/ffmpeg/default.nix
new file mode 100644
index 0000000..88f7a00
--- /dev/null
+++ b/modules/programs/ffmpeg/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+# FFmpeg - Command-line audio/video converter and streaming tool
+{
+ options.programs.ffmpeg = {
+ enable = lib.mkEnableOption "Enables ffmpeg.";
+ };
+
+ config = lib.mkIf config.programs.ffmpeg.enable {
+ home.packages = with pkgs; [
+ ffmpeg-full
+ ];
+ };
+}
diff --git a/modules/programs/fzf/default.nix b/modules/programs/fzf/default.nix
new file mode 100644
index 0000000..8816ddd
--- /dev/null
+++ b/modules/programs/fzf/default.nix
@@ -0,0 +1,49 @@
+{ config, lib, ... }:
+
+# FZF - Fuzzy finder, CLI fuzzy search tool
+{
+ config =
+ let
+ shellIntegration = ''
+ ${if config.programs.zsh.enable then "eval \"$(fzf --zsh)\"" else "eval \"$(fzf --bash)\""}
+ '';
+ in
+ lib.mkIf config.programs.fzf.enable {
+ programs.fzf = {
+ defaultOptions = [
+ "--height 100%"
+ "--layout=reverse"
+ ''--pointer=\" \"''
+ ''--header=\" \"''
+ ''--prompt=\" \"''
+ ''--marker=\"✓ \"''
+ "--border=none"
+ "--cycle"
+ "--no-info"
+ "--margin=\"1,2\""
+ ];
+
+ colors = with config.scheme.withHashtag; {
+ fg = base05; # Foreground
+ bg = "-1"; # Background (-1 for transparent)
+ hl = base0D; # Highlight
+
+ "fg+" = base07; # Foreground for selected item
+ "bg+" = "-1"; # Background for selected item
+ "hl+" = base0D; # Highlight for selected item
+
+ gutter = "-1"; # Remove the white margin at the left
+
+ info = base0B; # Info text (usually count of items)
+ border = base03; # Border color
+ prompt = base0A; # Prompt text color
+ pointer = base0F; # Pointer color (e.g., > for selected)
+ marker = base0C; # Marker color (e.g., for multi-select)
+ spinner = base0C; # Spinner color (during search)
+ };
+ };
+
+ programs.zsh.initContent = lib.mkIf config.programs.zsh.enable (lib.mkAfter shellIntegration);
+ programs.bash.initExtra = lib.mkIf config.programs.bash.enable (lib.mkAfter shellIntegration);
+ };
+}
diff --git a/modules/programs/git/default.nix b/modules/programs/git/default.nix
new file mode 100644
index 0000000..24d63c7
--- /dev/null
+++ b/modules/programs/git/default.nix
@@ -0,0 +1,33 @@
+{ lib, config, ... }:
+
+# Git - Distributed version control system
+{
+ options.programs.git = {
+ username = lib.mkOption {
+ type = lib.types.str;
+ description = "Git username.";
+ };
+ email = lib.mkOption {
+ type = lib.types.str;
+ description = "Git email.";
+ };
+ };
+
+ config = lib.mkIf config.programs.git.enable {
+ programs.git = {
+ settings = {
+ user = {
+ name = config.programs.git.username;
+ email = config.programs.git.email;
+ };
+ credential.helper = "store --file ${config.xdg.cacheHome}/git/credential";
+ core.askPass = "";
+ };
+ };
+
+ # The base directory of the credential file must exist
+ home.activation.createGitCacheDirectory = lib.hm.dag.entryAfter [
+ "writeBoundary"
+ ] "mkdir -p ${config.xdg.cacheHome}/git";
+ };
+}
diff --git a/modules/programs/htop/default.nix b/modules/programs/htop/default.nix
new file mode 100644
index 0000000..7781464
--- /dev/null
+++ b/modules/programs/htop/default.nix
@@ -0,0 +1,15 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+
+# Htop - Interactive process viewer (using htop-vim version)
+{
+ config = lib.mkIf config.programs.htop.enable {
+ programs.htop = {
+ package = pkgs.htop-vim;
+ };
+ };
+}
diff --git a/modules/programs/impala/default.nix b/modules/programs/impala/default.nix
new file mode 100644
index 0000000..6802381
--- /dev/null
+++ b/modules/programs/impala/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Impala - Apache Impala: SQL query engine for Apache Hadoop
+{
+ options.programs.impala = {
+ enable = lib.mkEnableOption "Enables impala.";
+ };
+
+ config = lib.mkIf config.programs.impala.enable {
+ home.packages = with pkgs; [
+ impala
+ ];
+ };
+}
diff --git a/modules/programs/kitty/default.nix b/modules/programs/kitty/default.nix
new file mode 100644
index 0000000..2e81ebc
--- /dev/null
+++ b/modules/programs/kitty/default.nix
@@ -0,0 +1,52 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Kitty - GPU-accelerated terminal emulator
+{
+ config = lib.mkIf config.programs.kitty.enable {
+ programs.kitty = {
+ settings = with config.scheme.withHashtag; {
+ window_padding_width = 10;
+ font_size = config.fonts.size;
+ font_family = config.fonts.normal;
+ filter_notification = "all";
+ update_check_interval = 0;
+ scrollback_indicator_opacity = "0.5";
+
+ dynamic_background_opacity = false;
+ enable_audio_bell = false;
+
+ background = base00;
+ foreground = base05;
+
+ color0 = base00;
+ color1 = base08;
+ color2 = base0B;
+ color3 = base0A;
+ color4 = base0D;
+ color5 = base0E;
+ color6 = base0C;
+ color7 = base05;
+ color8 = base03;
+ color9 = base09;
+ color10 = base0B;
+ color11 = base0A;
+ color12 = base0D;
+ color13 = base0E;
+ color14 = base0F;
+ color15 = base07;
+
+ selection_background = base05;
+ selection_foreground = base00;
+
+ allow_remote_control = "yes";
+ listen_on = "unix:/tmp/kitty";
+ shell = lib.mkIf config.programs.zsh.enable "${lib.getExe pkgs.zsh}";
+ };
+ };
+ };
+}
diff --git a/modules/programs/lf/default.nix b/modules/programs/lf/default.nix
new file mode 100644
index 0000000..eb605f5
--- /dev/null
+++ b/modules/programs/lf/default.nix
@@ -0,0 +1,48 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+
+# lf - terminal file manager
+{
+ config = lib.mkIf config.programs.lf.enable {
+ home.packages = with pkgs; [
+ ctpv
+ ];
+
+ programs.lf = {
+ settings = {
+ number = true;
+ icons = true;
+ drawbox = true;
+ hidden = true;
+ preview = true;
+
+ shell = if config.programs.zsh.enable then lib.getExe pkgs.zsh else "bash";
+ shellopts = "'-eu'";
+ ifs = "\n";
+ scrolloff = "4";
+ period = "1";
+ incsearch = true;
+ smartcase = true;
+ info = "size";
+ sortby = "natural";
+ dirfirst = true;
+
+ cleaner = lib.getExe config.scripts.file-preview-clean.package;
+ };
+
+ previewer = {
+ source = lib.getExe config.scripts.file-preview.package;
+ };
+
+ extraConfig = ''
+ ${builtins.readFile ./lfrc}
+ '';
+ };
+
+ home.file.".config/lf/icons".source = ./icons;
+ };
+}
diff --git a/modules/programs/lf/icons b/modules/programs/lf/icons
new file mode 100644
index 0000000..8697cf2
--- /dev/null
+++ b/modules/programs/lf/icons
@@ -0,0 +1,342 @@
+# vim:ft=conf
+
+# file types (with matching order)
+ln  # LINK
+or  # ORPHAN
+tw t # STICKY_OTHER_WRITABLE
+ow  # OTHER_WRITABLE
+st t # STICKY
+di  # DIR
+pi p # FIFO
+so s # SOCK
+bd b # BLK
+cd c # CHR
+su u # SETUID
+sg g # SETGID
+ex  # EXEC
+fi  # FILE
+
+# file extensions (vim-devicons)
+*.styl 
+*.sass 
+*.scss 
+*.htm 
+*.html 
+*.slim 
+*.haml 
+*.ejs 
+*.css 
+*.less 
+*.md 
+*.mdx 
+*.markdown 
+*.rmd 
+*.json 
+*.webmanifest 
+*.js 
+*.mjs 
+*.jsx 
+*.rb 
+*.gemspec 
+*.rake 
+*.php 
+*.py 
+*.pyc 
+*.pyo 
+*.pyd 
+*.coffee 
+*.mustache 
+*.hbs 
+*.conf 
+*.ini 
+*.yml 
+*.yaml 
+*.toml 
+*.bat 
+*.mk 
+*.jpg 
+*.jpeg 
+*.bmp 
+*.png 
+*.webp 
+*.gif 
+*.ico 
+*.twig 
+*.cpp 
+*.c++ 
+*.cxx 
+*.cc 
+*.cp 
+*.c 
+*.cs 󰌛
+*.h 
+*.hh 
+*.hpp 
+*.hxx 
+*.hs 
+*.lhs 
+*.nix 
+*.lua 
+*.java 
+*.sh 
+*.fish 
+*.bash 
+*.zsh 
+*.ksh 
+*.csh 
+*.awk 
+*.ps1 
+*.ml λ
+*.mli λ
+*.diff 
+*.db 
+*.sql 
+*.dump 
+*.clj 
+*.cljc 
+*.cljs 
+*.edn 
+*.scala 
+*.go 
+*.dart 
+*.xul 
+*.sln 
+*.suo 
+*.pl 
+*.pm 
+*.t 
+*.rss 
+'*.f#' 
+*.fsscript 
+*.fsx 
+*.fs 
+*.fsi 
+*.rs 
+*.rlib 
+*.d 
+*.erl 
+*.hrl 
+*.ex 
+*.exs 
+*.eex 
+*.leex 
+*.heex 
+*.vim 
+*.ai 
+*.psd 
+*.psb 
+*.ts 
+*.tsx 
+*.jl 
+*.pp 
+*.vue 
+*.elm 
+*.swift 
+*.xcplayground 
+*.tex 󰙩
+*.r 󰟔
+*.rproj 󰗆
+*.sol 󰡪
+*.pem 
+
+# file names (vim-devicons) (case-insensitive not supported in lf)
+*gruntfile.coffee 
+*gruntfile.js 
+*gruntfile.ls 
+*gulpfile.coffee 
+*gulpfile.js 
+*gulpfile.ls 
+*mix.lock 
+*dropbox 
+*.ds_store 
+*.gitconfig 
+*.gitignore 
+*.gitattributes 
+*.gitlab-ci.yml 
+*.bashrc 
+*.zshrc 
+*.zshenv 
+*.zprofile 
+*.vimrc 
+*.gvimrc 
+*_vimrc 
+*_gvimrc 
+*.bashprofile 
+*favicon.ico 
+*license 
+*node_modules 
+*react.jsx 
+*procfile 
+*dockerfile 
+*docker-compose.yml 
+*docker-compose.yaml 
+*compose.yml 
+*compose.yaml 
+*rakefile 
+*config.ru 
+*gemfile 
+*makefile 
+*cmakelists.txt 
+*robots.txt 󰚩
+
+# file names (case-sensitive adaptations)
+*Gruntfile.coffee 
+*Gruntfile.js 
+*Gruntfile.ls 
+*Gulpfile.coffee 
+*Gulpfile.js 
+*Gulpfile.ls 
+*Dropbox 
+*.DS_Store 
+*LICENSE 
+*React.jsx 
+*Procfile 
+*Dockerfile 
+*Docker-compose.yml 
+*Docker-compose.yaml 
+*Rakefile 
+*Gemfile 
+*Makefile 
+*CMakeLists.txt 
+
+# file patterns (vim-devicons) (patterns not supported in lf)
+# .*jquery.*\.js$ 
+# .*angular.*\.js$ 
+# .*backbone.*\.js$ 
+# .*require.*\.js$ 
+# .*materialize.*\.js$ 
+# .*materialize.*\.css$ 
+# .*mootools.*\.js$ 
+# .*vimrc.* 
+# Vagrantfile$ 
+
+# file patterns (file name adaptations)
+*jquery.min.js 
+*angular.min.js 
+*backbone.min.js 
+*require.min.js 
+*materialize.min.js 
+*materialize.min.css 
+*mootools.min.js 
+*vimrc 
+Vagrantfile 
+
+# archives or compressed (extensions from dircolors defaults)
+*.tar 
+*.tgz 
+*.arc 
+*.arj 
+*.taz 
+*.lha 
+*.lz4 
+*.lzh 
+*.lzma 
+*.tlz 
+*.txz 
+*.tzo 
+*.t7z 
+*.zip 
+*.z 
+*.dz 
+*.gz 
+*.lrz 
+*.lz 
+*.lzo 
+*.xz 
+*.zst 
+*.tzst 
+*.bz2 
+*.bz 
+*.tbz 
+*.tbz2 
+*.tz 
+*.deb 
+*.rpm 
+*.jar 
+*.war 
+*.ear 
+*.sar 
+*.rar 
+*.alz 
+*.ace 
+*.zoo 
+*.cpio 
+*.7z 
+*.rz 
+*.cab 
+*.wim 
+*.swm 
+*.dwm 
+*.esd 
+
+# image formats (extensions from dircolors defaults)
+*.jpg 
+*.jpeg 
+*.mjpg 
+*.mjpeg 
+*.gif 
+*.bmp 
+*.pbm 
+*.pgm 
+*.ppm 
+*.tga 
+*.xbm 
+*.xpm 
+*.tif 
+*.tiff 
+*.png 
+*.svg 
+*.svgz 
+*.mng 
+*.pcx 
+*.mov 
+*.mpg 
+*.mpeg 
+*.m2v 
+*.mkv 
+*.webm 
+*.ogm 
+*.mp4 
+*.m4v 
+*.mp4v 
+*.vob 
+*.qt 
+*.nuv 
+*.wmv 
+*.asf 
+*.rm 
+*.rmvb 
+*.flc 
+*.avi 
+*.fli 
+*.flv 
+*.gl 
+*.dl 
+*.xcf 
+*.xwd 
+*.yuv 
+*.cgm 
+*.emf 
+*.ogv 
+*.ogx 
+
+# audio formats (extensions from dircolors defaults)
+*.aac 
+*.au 
+*.flac 
+*.m4a 
+*.mid 
+*.midi 
+*.mka 
+*.mp3 
+*.mpc 
+*.ogg 
+*.ra 
+*.wav 
+*.oga 
+*.opus 
+*.spx 
+*.xspf 
+
+# other formats
+*.pdf 
diff --git a/modules/programs/lf/lfrc b/modules/programs/lf/lfrc
new file mode 100644
index 0000000..11a9959
--- /dev/null
+++ b/modules/programs/lf/lfrc
@@ -0,0 +1,279 @@
+# ─── lf config — nvim-tree style keybindings ───────────────────────────────
+
+# ─── Colors (optional — remove if you use a color scheme plugin) ──────────────
+# set color256 true
+
+# ─── Custom commands ──────────────────────────────────────────────────────────
+
+# Create a new file (like nvim-tree 'a' with no trailing /)
+cmd touch %{{
+ printf "New file name: "
+ read -r name
+ touch "$name"
+ lf -remote "send $id select '$name'"
+}}
+
+# Create a new directory (like nvim-tree 'a' with trailing /)
+cmd mkdir %{{
+ printf "New directory name: "
+ read -r name
+ mkdir -p "$name"
+ lf -remote "send $id select '$name'"
+}}
+
+# Rename — full name (like nvim-tree 'r')
+cmd rename ${{
+ printf "Rename '%s' to: " "$f"
+ read -r newname
+ mv -- "$f" "$(dirname "$f")/$newname"
+ lf -remote "send $id select '$newname'"
+}}
+
+# Rename — only basename without extension (like nvim-tree 'e' in some configs)
+cmd rename_stem ${{
+ stem="${f##*/}"
+ stem="${stem%.*}"
+ printf "Rename stem to: "
+ read -r newname
+ ext="${f##*.}"
+ if [ "${f##*/}" = "$stem" ]; then
+ mv -- "$f" "$(dirname "$f")/$newname"
+ else
+ mv -- "$f" "$(dirname "$f")/$newname.$ext"
+ fi
+}}
+
+# Delete — trash (safe) using trash-cli if available, else rm
+cmd trash %{{
+ set -f
+ files=$(printf '%s\n' $fx | wc -l)
+ printf "Trash $files item(s)? [y/N] "
+ read -r ans
+ [ "$ans" = "y" ] || [ "$ans" = "Y" ] || exit 0
+ if command -v trash-put >/dev/null 2>&1; then
+ printf '%s\n' $fx | xargs trash-put --
+ else
+ printf '%s\n' $fx | xargs rm -rf --
+ fi
+}}
+
+# Delete — permanent, no confirmation prompt (use carefully)
+cmd delete ${{
+ set -f
+ printf "Permanently delete? [y/N] "
+ read -r ans
+ [ "$ans" = "y" ] || [ "$ans" = "Y" ] || exit 0
+ rm -rf -- $fx
+}}
+
+# Paste (move or copy depending on operation)
+cmd paste &{{
+ set -f
+ load=$(lf -remote 'load')
+ mode=$(echo "$load" | sed -n '1p')
+ list=$(echo "$load" | sed -n '2,$p')
+ if [ "$mode" = "copy" ]; then
+ cp -rn -- $list .
+ elif [ "$mode" = "move" ]; then
+ mv -n -- $list .
+ lf -remote 'send clear'
+ fi
+ lf -remote 'send reload'
+ lf -remote 'send clear'
+}}
+
+# Paste with overwrite
+cmd paste_overwrite &{{
+ set -f
+ load=$(lf -remote 'load')
+ mode=$(echo "$load" | sed -n '1p')
+ list=$(echo "$load" | sed -n '2,$p')
+ if [ "$mode" = "copy" ]; then
+ cp -r -- $list .
+ elif [ "$mode" = "move" ]; then
+ mv -- $list .
+ lf -remote 'send clear'
+ fi
+ lf -remote 'send reload'
+ lf -remote 'send clear'
+}}
+
+# Open in nvim
+cmd edit $nvim "$f"
+
+# Open with xdg-open (GUI apps)
+cmd open_gui &xdg-open "$f"
+
+# Toggle hidden files (like nvim-tree 'H')
+cmd toggle_hidden :{{
+ set hidden!
+ set info
+}}
+
+# Bulk rename with $EDITOR (like vimv / nvim-tree mass rename)
+cmd bulk_rename ${{
+ index=$(mktemp /tmp/lf-bulk-index.XXXXXX)
+ names=$(mktemp /tmp/lf-bulk-names.XXXXXX)
+ printf '%s\n' $fx > "$index"
+ sed 's|.*/||' "$index" > "$names"
+ $EDITOR "$names"
+ paste "$index" "$names" | while IFS=$'\t' read -r old new; do
+ if [ "$old" != "$(dirname "$old")/$new" ]; then
+ mv -- "$old" "$(dirname "$old")/$new"
+ fi
+ done
+ rm -- "$index" "$names"
+ lf -remote 'send reload'
+}}
+
+# Create symlink (relative)
+cmd symlink %{{
+ printf "Symlink target name: "
+ read -r name
+ ln -s "$f" "$name"
+}}
+
+# Copy path to clipboard (needs xclip / xsel / wl-copy)
+cmd copy_path &{{
+ printf '%s' "$f" | xclip -selection clipboard 2>/dev/null \
+ || printf '%s' "$f" | xsel --clipboard --input 2>/dev/null \
+ || printf '%s' "$f" | wl-copy 2>/dev/null
+}}
+
+# Show file info (like nvim-tree 'i')
+cmd info %{{
+ stat -- "$f"
+ printf '\nPress ENTER...'
+ read -r _
+}}
+
+# Jump to bookmarks (requires fzf)
+cmd bookmark_jump ${{
+ bm="$HOME/.config/lf/bookmarks"
+ [ -f "$bm" ] || touch "$bm"
+ dest=$(cat "$bm" | fzf --prompt "Jump to: ")
+ [ -n "$dest" ] && lf -remote "send $id cd '$dest'"
+}}
+
+# Add bookmark
+cmd bookmark_add %{{
+ bm="$HOME/.config/lf/bookmarks"
+ printf '%s\n' "$PWD" >> "$bm"
+ sort -u "$bm" -o "$bm"
+ echo "Bookmarked: $PWD"
+}}
+
+# fzf-based fuzzy find & cd/select
+cmd fzf_cd ${{
+ dest=$(find . -type d 2>/dev/null | fzf --prompt "cd: ")
+ [ -n "$dest" ] && lf -remote "send $id cd '$dest'"
+}}
+
+cmd fzf_file ${{
+ file=$(find . -type f 2>/dev/null | fzf --prompt "open: ")
+ [ -n "$dest" ] && lf -remote "send $id select '$file'"
+}}
+
+# ─── Keybindings — clear defaults and remap ───────────────────────────────────
+
+# Unmap keys we'll remap
+map d
+map y
+map p
+map c
+map r
+map a
+map e
+map f
+map g
+map G
+map i
+map o
+map H
+map m
+
+# ── Navigation ────────────────────────────────────────────────────────────────
+map h updir # go up one dir
+map l open # open file/dir (maps to $EDITOR for files)
+map j down
+map k up
+map J half-down
+map K half-up
+map gg top
+map G bottom
+map gd cd ~/Downloads
+map gh cd ~
+map gc cd ~/.config
+map gp cd ~/projects
+
+# Page navigation (nvim-style)
+map <c-d> half-down
+map <c-u> half-up
+map <c-f> page-down
+map <c-b> page-up
+
+# ── Opening / editing ─────────────────────────────────────────────────────────
+map <enter> open # open with default
+map o open_gui # open with GUI app
+map e edit # open in nvim explicitly
+
+# ── File / dir creation ───────────────────────────────────────────────────────
+map af touch # a → file (like nvim-tree 'a' without /)
+map ad mkdir # a → dir (like nvim-tree 'a' with /)
+
+# ── Rename ────────────────────────────────────────────────────────────────────
+map r rename # full rename (like nvim-tree 'r')
+map R bulk_rename # bulk rename in $EDITOR
+map cw rename # alias: cw like vim's 'change word'
+map I rename # alias: go to start (lf positions cursor)
+map A rename # alias: go to end
+
+# ── Delete ────────────────────────────────────────────────────────────────────
+map dd trash # move to trash (safe delete — like nvim-tree 'd')
+map dD delete # permanent delete (no trash)
+
+# ── Yank / Copy / Cut / Paste ─────────────────────────────────────────────────
+map yy copy # yank/copy selection (like nvim-tree 'c')
+map yn copy_path # yank path to clipboard
+map dd cut # cut selection (like nvim-tree 'x') — overrides trash above;
+ # uncomment the trash line below if you prefer separate keys
+# map dt trash # use 'dt' for trash if 'dd' is used for cut
+map pp paste # paste (like nvim-tree 'p')
+map po paste_overwrite # paste with overwrite
+map P paste # alias
+
+# ── Marking / selection ───────────────────────────────────────────────────────
+map <space> toggle # toggle mark on current item (like nvim-tree space)
+map v invert # invert selection
+map V invert # alias
+map u unselect # clear all marks
+map * glob-select '*' # select all via glob
+
+# ── Search ────────────────────────────────────────────────────────────────────
+map / search # incremental search forward
+map n search-next
+map N search-prev
+map f fzf_file # fuzzy find file (requires fzf)
+map F fzf_cd # fuzzy cd into dir (requires fzf)
+
+# ── View toggles ──────────────────────────────────────────────────────────────
+map H toggle_hidden # toggle hidden files (like nvim-tree 'H')
+map zi set icons!
+map zr set reverse!
+map zh set hidden!
+map zn set sortby natural
+map zs set sortby size
+map zm set sortby modified
+map ze set sortby ext
+
+# ── Info / misc ───────────────────────────────────────────────────────────────
+map i info # show stat info (like nvim-tree 'i')
+map <c-r> reload # reload directory
+map <esc> clear # clear selection
+map q quit
+map Q quit
+map m bookmark_add # add bookmark
+map ' bookmark_jump # jump to bookmark (requires fzf)
+
+# Symlink
+map S symlink
diff --git a/modules/programs/librewolf/default.nix b/modules/programs/librewolf/default.nix
new file mode 100644
index 0000000..0c457a5
--- /dev/null
+++ b/modules/programs/librewolf/default.nix
@@ -0,0 +1,59 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Librewolf - A privacy-focused fork of Mozilla Firefox
+{
+ config = lib.mkIf config.programs.librewolf.enable {
+ programs.librewolf = {
+ package = pkgs.librewolf;
+ profiles."arpit" = {
+ isDefault = true;
+ settings = {
+ "extensions.autoDisableScopes" = 0;
+ # Use default dark theme until Black gets installed
+ "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org";
+ "sidebar.verticalTabs" = true;
+ "sidebar.visibility" = "always-show";
+ "sidebar.verticalTabs.dragToPinPromo.dismissed" = true;
+ "layout.css.devPixelsPerPx" = 1.1;
+ # Dark
+ "layout.css.prefers-color-scheme.content-override" = 0;
+ "browser.toolbars.bookmarks.visibility" = "newtab";
+ "browser.startup.page" = 2;
+ "sidebar.expandOnHover" = false;
+ "sidebar.animation.enabled" = false;
+ "privacy.clearOnShutdown_v2.cookiesAndStorage" = false;
+ "privacy.resistFingerprinting" = false;
+ "privacy.fingerprintingProtection" = true;
+ "dom.webnotifications.enabled" = false;
+ };
+ };
+ policies = {
+ ExtensionSettings = {
+ "uBlock0@raymondhill.net" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
+ installation_mode = "force_installed";
+ private_browsing = true;
+ };
+ "{9b84b6b4-07c4-4b4b-ba21-394d86f6e9ee}" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/black21/latest.xpi";
+ installation_mode = "force_installed";
+ };
+ "{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
+ default_area = "menupanel";
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
+ installation_mode = "force_installed";
+ };
+ "addon@darkreader.org" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/darkreader/latest.xpi";
+ installation_mode = "force_installed";
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/programs/lsd/default.nix b/modules/programs/lsd/default.nix
new file mode 100644
index 0000000..99fe1bd
--- /dev/null
+++ b/modules/programs/lsd/default.nix
@@ -0,0 +1,10 @@
+{ config, lib, ... }:
+
+# LSD - Ls alternative with icons and colors (Rust-based)
+{
+ config = lib.mkIf config.programs.lsd.enable {
+ programs.lsd = {
+ settings.icons.separator = " ";
+ };
+ };
+}
diff --git a/modules/programs/maim/default.nix b/modules/programs/maim/default.nix
new file mode 100644
index 0000000..76ef80d
--- /dev/null
+++ b/modules/programs/maim/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Maim - Screenshot utility (slop-based region selection)
+{
+ options.programs.maim = {
+ enable = lib.mkEnableOption "Enables maim.";
+ };
+
+ config = lib.mkIf config.programs.maim.enable {
+ home.packages = with pkgs; [
+ maim
+ ];
+ };
+}
diff --git a/modules/programs/nixvim/colorscheme.nix b/modules/programs/nixvim/colorscheme.nix
new file mode 100644
index 0000000..ba81634
--- /dev/null
+++ b/modules/programs/nixvim/colorscheme.nix
@@ -0,0 +1,26 @@
+{ config, lib, ... }:
+
+# Colorscheme - Base16 theme configuration for nixvim
+{
+ config.programs.nixvim.colorschemes.base16 = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ colorscheme = with config.scheme.withHashtag; {
+ base00 = base00;
+ base01 = base01;
+ base02 = base02;
+ base03 = base03;
+ base04 = base04;
+ base05 = base05;
+ base06 = base06;
+ base07 = base07;
+ base08 = base08;
+ base09 = base09;
+ base0A = base0A;
+ base0B = base0B;
+ base0C = base0C;
+ base0D = base0D;
+ base0E = base0E;
+ base0F = base0F;
+ };
+ };
+}
diff --git a/modules/programs/nixvim/default.nix b/modules/programs/nixvim/default.nix
new file mode 100644
index 0000000..1a66b47
--- /dev/null
+++ b/modules/programs/nixvim/default.nix
@@ -0,0 +1,83 @@
+{ config, lib, ... }:
+
+# Nixvim - Neovim configured through Nix (home-manager integration)
+{
+ imports = [
+ ./colorscheme.nix
+ ./keymaps.nix
+ ./plugins
+ ];
+
+ options.programs.nixvim = {
+ enable = lib.mkEnableOption "Enables nixvim.";
+ };
+
+ config = lib.mkIf config.programs.nixvim.enable {
+ programs.nixvim = {
+ defaultEditor = true;
+ opts = {
+ number = true;
+ relativenumber = true;
+ shiftwidth = 2;
+ tabstop = 2;
+ softtabstop = 2;
+ expandtab = true;
+ list = true;
+ laststatus = 3;
+ foldlevel = 99;
+ clipboard = "unnamedplus";
+ };
+ clipboard.providers.xclip.enable = true;
+ extraConfigLuaPre = with config.scheme.withHashtag; ''
+ vim.opt.fillchars:append({ eob = " " })
+ vim.opt.listchars = { tab = " ", trail = "_", lead = " " }
+ vim.api.nvim_set_hl(0, "WinSeparator", {
+ fg = "${base01}",
+ bg = "${base00}",
+ })
+ vim.api.nvim_set_hl(0, 'NotifyERRORBorder', { fg = '${base08}' })
+ vim.api.nvim_set_hl(0, 'NotifyWARNBorder', { fg = '${base09}' })
+ vim.api.nvim_set_hl(0, 'NotifyINFOBorder', { fg = '${base0B}' })
+ vim.api.nvim_set_hl(0, 'NotifyDEBUGBorder', { fg = '${base03}' })
+ vim.api.nvim_set_hl(0, 'NotifyTRACEBorder', { fg = '${base0E}' })
+
+ vim.api.nvim_set_hl(0, 'NotifyERRORIcon', { fg = '${base08}' })
+ vim.api.nvim_set_hl(0, 'NotifyWARNIcon', { fg = '${base09}' })
+ vim.api.nvim_set_hl(0, 'NotifyINFOIcon', { fg = '${base0B}' })
+ vim.api.nvim_set_hl(0, 'NotifyDEBUGIcon', { fg = '${base03}' })
+ vim.api.nvim_set_hl(0, 'NotifyTRACEIcon', { fg = '${base0E}' })
+
+ vim.api.nvim_set_hl(0, 'NotifyERRORTitle', { fg = '${base08}' })
+ vim.api.nvim_set_hl(0, 'NotifyWARNTitle', { fg = '${base09}' })
+ vim.api.nvim_set_hl(0, 'NotifyINFOTitle', { fg = '${base0B}' })
+ vim.api.nvim_set_hl(0, 'NotifyDEBUGTitle', { fg = '${base03}' })
+ vim.api.nvim_set_hl(0, 'NotifyTRACETitle', { fg = '${base0E}' })
+
+ vim.api.nvim_set_hl(0, 'NotifyERRORBody', { link = 'Normal' })
+ vim.api.nvim_set_hl(0, 'NotifyWARNBody', { link = 'Normal' })
+ vim.api.nvim_set_hl(0, 'NotifyINFOBody', { link = 'Normal' })
+ vim.api.nvim_set_hl(0, 'NotifyDEBUGBody', { link = 'Normal' })
+ vim.api.nvim_set_hl(0, 'NotifyTRACEBody', { link = 'Normal' })
+
+ vim.api.nvim_create_autocmd({ "FileType" }, {
+ pattern = { "yaml", "yml" },
+ callback = function()
+ vim.opt_local.expandtab = true
+ vim.opt_local.shiftwidth = 2
+ vim.opt_local.softtabstop = 2
+ vim.opt_local.tabstop = 2
+ end,
+ })
+ '';
+ performance = {
+ byteCompileLua.enable = true;
+ combinePlugins.enable = true;
+ };
+ };
+
+ home.sessionVariables = {
+ EDITOR = lib.mkForce (lib.getExe config.programs.nixvim.package);
+ MANPAGER = "${lib.getExe config.programs.nixvim.package} +Man!";
+ };
+ };
+}
diff --git a/modules/programs/nixvim/keymaps.nix b/modules/programs/nixvim/keymaps.nix
new file mode 100644
index 0000000..4e4b35a
--- /dev/null
+++ b/modules/programs/nixvim/keymaps.nix
@@ -0,0 +1,41 @@
+{ config, lib, ... }:
+
+# Keymaps - Keyboard shortcut configuration for nixvim
+{
+ config.programs.nixvim.keymaps = lib.mkIf config.programs.nixvim.enable [
+ {
+ key = "<c-h>";
+ action = "<c-w>h";
+ options.desc = "Move to left window";
+ }
+ {
+ key = "<c-w>";
+ action = "<c-w>j";
+ options.desc = "Move to bottom window";
+ }
+ {
+ key = "<c-k>";
+ action = "<c-w>k";
+ options.desc = "Move to top window";
+ }
+ {
+ key = "<c-l>";
+ action = "<c-w>l";
+ options.desc = "Move to right window";
+ }
+ {
+ key = "<c-n>";
+ action = "<cmd>NvimTreeToggle<cr>";
+ mode = [
+ "n"
+ "i"
+ ];
+ options.desc = "Toggle file explorer";
+ }
+ {
+ key = "<c-c>";
+ action = "<cmd>NotificationsClear<cr>";
+ options.desc = "Clear notifications";
+ }
+ ];
+}
diff --git a/modules/programs/nixvim/plugins/cmp.nix b/modules/programs/nixvim/plugins/cmp.nix
new file mode 100644
index 0000000..683e0d3
--- /dev/null
+++ b/modules/programs/nixvim/plugins/cmp.nix
@@ -0,0 +1,37 @@
+{ config, lib, ... }:
+
+# Cmp - Completion plugin (nvim-cmp) for auto-completion
+{
+ config.programs.nixvim.plugins.cmp = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ autoEnableSources = true;
+ settings = {
+ snippet.expand = "function(args) require('luasnip').lsp_expand(args.body) end";
+ mapping = {
+ "<C-Space>" = "cmp.mapping.complete()";
+ "<CR>" = "cmp.mapping.confirm({ select = true })";
+ "<Tab>" = "cmp.mapping.select_next_item()";
+ "<S-Tab>" = "cmp.mapping.select_prev_item()";
+ "<Down>" = "cmp.mapping.select_next_item()";
+ "<Up>" = "cmp.mapping.select_prev_item()";
+ "<C-u>" = "cmp.mapping.scroll_docs(-4)"; # scroll docs up
+ "<C-d>" = "cmp.mapping.scroll_docs(4)"; # scroll docs down
+
+ "<Escape>" = ''
+ cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.abort()
+ else
+ fallback()
+ end
+ end, { "i" })
+ '';
+ };
+ sources = [
+ { name = "nvim_lsp"; }
+ { name = "path"; }
+ { name = "buffer"; }
+ ];
+ };
+ };
+}
diff --git a/modules/programs/nixvim/plugins/comment.nix b/modules/programs/nixvim/plugins/comment.nix
new file mode 100644
index 0000000..cc1b9cb
--- /dev/null
+++ b/modules/programs/nixvim/plugins/comment.nix
@@ -0,0 +1,23 @@
+{ config, lib, ... }:
+
+# Comment - Comment toggling plugin (comment.nvim)
+{
+ config.programs.nixvim.plugins.comment = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ settings = {
+ toggler = {
+ line = "gcc"; # toggle line comment
+ block = "gbc"; # toggle block comment
+ };
+ opleader = {
+ line = "gc"; # line comment operator (gc + motion)
+ block = "gb"; # block comment operator (gb + motion)
+ };
+ extra = {
+ above = "gcO"; # add comment line above
+ below = "gco"; # add comment line below
+ eol = "gcA"; # add comment at end of line
+ };
+ };
+ };
+}
diff --git a/modules/programs/nixvim/plugins/default.nix b/modules/programs/nixvim/plugins/default.nix
new file mode 100644
index 0000000..a263c51
--- /dev/null
+++ b/modules/programs/nixvim/plugins/default.nix
@@ -0,0 +1,20 @@
+{ ... }:
+
+# Plugins - Collection of nixvim plugin configurations
+{
+ imports = [
+ ./cmp.nix
+ ./comment.nix
+ ./gitsigns.nix
+ ./indent-blankline.nix
+ ./lsp.nix
+ ./lualine.nix
+ ./luasnip.nix
+ ./noice.nix
+ ./nvim-tree.nix
+ ./telescope.nix
+ ./treesitter.nix
+ ./web-devicons.nix
+ ./which-key.nix
+ ];
+}
diff --git a/modules/programs/nixvim/plugins/gitsigns.nix b/modules/programs/nixvim/plugins/gitsigns.nix
new file mode 100644
index 0000000..ea99eba
--- /dev/null
+++ b/modules/programs/nixvim/plugins/gitsigns.nix
@@ -0,0 +1,8 @@
+{ config, lib, ... }:
+
+# Gitsigns - Git status in the sign column (gitsigns.nvim)
+{
+ config.programs.nixvim.plugins.gitsigns = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ };
+}
diff --git a/modules/programs/nixvim/plugins/indent-blankline.nix b/modules/programs/nixvim/plugins/indent-blankline.nix
new file mode 100644
index 0000000..eb2674a
--- /dev/null
+++ b/modules/programs/nixvim/plugins/indent-blankline.nix
@@ -0,0 +1,14 @@
+{ config, lib, ... }:
+
+# Indent-blankline - Visual indentation guides (indent-blankline.nvim)
+{
+ config.programs.nixvim.plugins.indent-blankline = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ settings = {
+ indent = {
+ char = "┊";
+ tab_char = "│";
+ };
+ };
+ };
+}
diff --git a/modules/programs/nixvim/plugins/lsp.nix b/modules/programs/nixvim/plugins/lsp.nix
new file mode 100644
index 0000000..dbe66a8
--- /dev/null
+++ b/modules/programs/nixvim/plugins/lsp.nix
@@ -0,0 +1,91 @@
+{ config, lib, ... }:
+
+# LSP - Language Server Protocol configuration (nvim-lspconfig)
+{
+ config.programs.nixvim = lib.mkIf config.programs.nixvim.enable {
+ plugins.lsp = {
+ enable = true;
+ inlayHints = true;
+ autoLoad = true;
+ keymaps.lspBuf = {
+ K = "hover";
+ gD = "references";
+ gd = "definition";
+ gi = "implementation";
+ gt = "type_definition";
+ };
+ servers = {
+ nil_ls = {
+ enable = true;
+ };
+ lua_ls = {
+ enable = true;
+ package = null;
+ };
+ nixd = {
+ enable = true;
+ package = null;
+ };
+ pyright = {
+ enable = true;
+ package = null;
+ };
+ ts_ls = {
+ enable = true;
+ package = null;
+ };
+ clangd = {
+ enable = true;
+ package = null;
+ };
+ jsonls = {
+ enable = true;
+ package = null;
+ };
+ yamlls = {
+ enable = true;
+ package = null;
+ };
+ bash-language-server = {
+ enable = true;
+ package = null;
+ };
+ gopls = {
+ enable = true;
+ package = null;
+ };
+ };
+ };
+
+ diagnostic = {
+ settings = {
+ virtual_text = false;
+ signs = true;
+ underline = true;
+ update_in_insert = false;
+ float = {
+ border = "rounded";
+ source = true; # Show which LSP the diagnostic is from
+ header = "";
+ prefix = "";
+ };
+ };
+ };
+
+ # Show diagnostics float on cursor hold
+ autoCmd = [
+ {
+ event = [ "CursorHold" ];
+ pattern = "*";
+ callback.__raw = ''
+ function()
+ vim.diagnostic.open_float(nil, { focus = false })
+ end
+ '';
+ }
+ ];
+
+ # How long before CursorHold fires (in ms)
+ opts.updatetime = 500;
+ };
+}
diff --git a/modules/programs/nixvim/plugins/lualine.nix b/modules/programs/nixvim/plugins/lualine.nix
new file mode 100644
index 0000000..72f34be
--- /dev/null
+++ b/modules/programs/nixvim/plugins/lualine.nix
@@ -0,0 +1,90 @@
+{ config, lib, ... }:
+
+# Lualine - Statusline configuration (lualine.nvim)
+{
+ config.programs.nixvim.plugins.lualine = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ settings = {
+ options = {
+ theme = with config.scheme.withHashtag; {
+ normal = {
+ a = {
+ fg = base00;
+ bg = base0D;
+ gui = "bold";
+ };
+ b = {
+ fg = base05;
+ bg = base01;
+ };
+ c = {
+ fg = base05;
+ bg = base00;
+ };
+ };
+ insert = {
+ a = {
+ fg = base00;
+ bg = base0B;
+ gui = "bold";
+ };
+ b = {
+ fg = base05;
+ bg = base01;
+ };
+ c = {
+ fg = base05;
+ bg = base00;
+ };
+ };
+ visual = {
+ a = {
+ fg = base00;
+ bg = base0A;
+ gui = "bold";
+ };
+ b = {
+ fg = base05;
+ bg = base01;
+ };
+ c = {
+ fg = base05;
+ bg = base00;
+ };
+ };
+ replace = {
+ a = {
+ fg = base00;
+ bg = base08;
+ gui = "bold";
+ };
+ b = {
+ fg = base05;
+ bg = base01;
+ };
+ c = {
+ fg = base05;
+ bg = base00;
+ };
+ };
+ inactive = {
+ a = {
+ fg = base04;
+ bg = base00;
+ gui = "bold";
+ };
+ b = {
+ fg = base04;
+ bg = base00;
+ };
+ c = {
+ fg = base04;
+ bg = base00;
+ };
+ };
+ };
+ icons_enabled = true;
+ };
+ };
+ };
+}
diff --git a/modules/programs/nixvim/plugins/luasnip.nix b/modules/programs/nixvim/plugins/luasnip.nix
new file mode 100644
index 0000000..60571e9
--- /dev/null
+++ b/modules/programs/nixvim/plugins/luasnip.nix
@@ -0,0 +1,8 @@
+{ config, lib, ... }:
+
+# Luasnip - Snippet engine for Neovim (Lua-based)
+{
+ config.programs.nixvim.plugins.luasnip = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ };
+}
diff --git a/modules/programs/nixvim/plugins/noice.nix b/modules/programs/nixvim/plugins/noice.nix
new file mode 100644
index 0000000..61acf2a
--- /dev/null
+++ b/modules/programs/nixvim/plugins/noice.nix
@@ -0,0 +1,19 @@
+{ config, lib, ... }:
+
+# Noice - Modern UI for Neovim (cmdline, popupmenu, messages)
+{
+ config.programs.nixvim.plugins.noice = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ cmdline = {
+ enabled = true;
+ view = "cmdline_popup";
+ };
+ popupmenu = {
+ enabled = true;
+ backend = "cmp";
+ };
+ presets = {
+ command_palette = true;
+ };
+ };
+}
diff --git a/modules/programs/nixvim/plugins/nvim-tree.nix b/modules/programs/nixvim/plugins/nvim-tree.nix
new file mode 100644
index 0000000..2ad6570
--- /dev/null
+++ b/modules/programs/nixvim/plugins/nvim-tree.nix
@@ -0,0 +1,44 @@
+{ config, lib, ... }:
+
+# Nvim-tree - File explorer sidebar (nvim-tree.lua)
+{
+ config.programs.nixvim.plugins.nvim-tree = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ settings = {
+ filters = {
+ dotfiles = false;
+ git_clean = false;
+ no_buffer = false;
+ custom = { };
+ };
+ git = {
+ enable = true;
+ ignore = false;
+ };
+ view = {
+ width = 30;
+ };
+ renderer = {
+ indent_markers = {
+ enable = true;
+ inline_arrows = false;
+ icons = {
+ corner = "└";
+ edge = "│";
+ item = "├";
+ bottom = "─";
+ none = " ";
+ };
+ };
+ icons = {
+ show = {
+ folder = true;
+ folder_arrow = false;
+ file = true;
+ git = true;
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/programs/nixvim/plugins/telescope.nix b/modules/programs/nixvim/plugins/telescope.nix
new file mode 100644
index 0000000..b9678fc
--- /dev/null
+++ b/modules/programs/nixvim/plugins/telescope.nix
@@ -0,0 +1,85 @@
+{ config, lib, ... }:
+
+# Telescope - Fuzzy finder
+{
+ config.programs.nixvim.plugins.telescope = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ extensions = {
+ fzf-native.enable = true; # faster fuzzy sorting
+ ui-select.enable = true; # use telescope for vim.ui.select (code actions etc.)
+ };
+ settings = {
+ defaults = {
+ layout_strategy = "horizontal";
+ layout_config = {
+ horizontal = {
+ preview_width = 0.55;
+ results_width = 0.45;
+ };
+ width = 0.87;
+ height = 0.80;
+ };
+ mappings = {
+ i = {
+ "<C-k>".__raw = "require('telescope.actions').move_selection_previous";
+ "<C-j>".__raw = "require('telescope.actions').move_selection_next";
+ "<Escape>".__raw = "require('telescope.actions').close";
+ };
+ };
+ };
+ };
+ keymaps = {
+ # Files
+ "<leader>ff" = {
+ action = "find_files";
+ options.desc = "Find files";
+ };
+ "<leader>fg" = {
+ action = "live_grep";
+ options.desc = "Live grep";
+ };
+ "<leader>fb" = {
+ action = "buffers";
+ options.desc = "Find buffers";
+ };
+ "<leader>fr" = {
+ action = "oldfiles";
+ options.desc = "Recent files";
+ };
+
+ # LSP
+ "<leader>fd" = {
+ action = "diagnostics";
+ options.desc = "Diagnostics";
+ };
+ "<leader>fs" = {
+ action = "lsp_document_symbols";
+ options.desc = "Document symbols";
+ };
+
+ # Git
+ "<leader>gc" = {
+ action = "git_commits";
+ options.desc = "Git commits";
+ };
+ "<leader>gb" = {
+ action = "git_branches";
+ options.desc = "Git branches";
+ };
+
+ # Misc
+ "<leader>fh" = {
+ action = "help_tags";
+ options.desc = "Help tags";
+ };
+ "<leader>fc" = {
+ action = "commands";
+ options.desc = "Commands";
+ };
+ "<leader>fk" = {
+ action = "keymaps";
+ options.desc = "Find keymaps";
+ };
+ };
+ };
+}
diff --git a/modules/programs/nixvim/plugins/treesitter.nix b/modules/programs/nixvim/plugins/treesitter.nix
new file mode 100644
index 0000000..035ac7a
--- /dev/null
+++ b/modules/programs/nixvim/plugins/treesitter.nix
@@ -0,0 +1,19 @@
+{ config, lib, ... }:
+
+# Treesitter - Syntax highlighting and parsing (nvim-treesitter)
+{
+ config.programs.nixvim.plugins.treesitter = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ folding = {
+ enable = true;
+ };
+ settings = {
+ highlight = {
+ enable = true;
+ };
+ indent = {
+ enable = true;
+ };
+ };
+ };
+}
diff --git a/modules/programs/nixvim/plugins/web-devicons.nix b/modules/programs/nixvim/plugins/web-devicons.nix
new file mode 100644
index 0000000..3c6ad86
--- /dev/null
+++ b/modules/programs/nixvim/plugins/web-devicons.nix
@@ -0,0 +1,8 @@
+{ config, lib, ... }:
+
+# Web-devicons - File icons for various file types (nvim-web-devicons)
+{
+ config.programs.nixvim.plugins.web-devicons = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ };
+}
diff --git a/modules/programs/nixvim/plugins/which-key.nix b/modules/programs/nixvim/plugins/which-key.nix
new file mode 100644
index 0000000..18018e7
--- /dev/null
+++ b/modules/programs/nixvim/plugins/which-key.nix
@@ -0,0 +1,21 @@
+{ config, lib, ... }:
+
+# Which-key - Popup for keybindings (which-key.nvim)
+{
+ config.programs.nixvim.plugins.which-key = lib.mkIf config.programs.nixvim.enable {
+ enable = true;
+ settings = {
+ plugins = {
+ marks = true;
+ registers = true;
+ spelling = {
+ enabled = true;
+ suggestions = 20;
+ };
+ };
+ win = {
+ border = "single";
+ };
+ };
+ };
+}
diff --git a/modules/programs/nvtop/default.nix b/modules/programs/nvtop/default.nix
new file mode 100644
index 0000000..ef35c21
--- /dev/null
+++ b/modules/programs/nvtop/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+# Nvtop - GPU process monitor (NVIDIA/AMD/Intel GPUs)
+{
+ options.programs.nvtop = {
+ enable = lib.mkEnableOption "Enables nvtop.";
+ };
+
+ config = lib.mkIf config.programs.nvtop.enable {
+ home.packages = with pkgs; [
+ nvtopPackages.full
+ ];
+ };
+}
diff --git a/modules/programs/opencode/default.nix b/modules/programs/opencode/default.nix
new file mode 100644
index 0000000..0941db0
--- /dev/null
+++ b/modules/programs/opencode/default.nix
@@ -0,0 +1,5 @@
+{ ... }:
+
+# Opencode - AI-powered coding assistant (opencode.ai)
+{
+}
diff --git a/modules/programs/openvpn/default.nix b/modules/programs/openvpn/default.nix
new file mode 100644
index 0000000..c70192a
--- /dev/null
+++ b/modules/programs/openvpn/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# OpenVPN - Open-source VPN client for secure remote access
+{
+ options.programs.openvpn = {
+ enable = lib.mkEnableOption "Enables openvpn.";
+ };
+
+ config = lib.mkIf config.programs.openvpn.enable {
+ home.packages = with pkgs; [
+ openvpn
+ ];
+ };
+}
diff --git a/modules/programs/ouch/default.nix b/modules/programs/ouch/default.nix
new file mode 100644
index 0000000..69c8ae5
--- /dev/null
+++ b/modules/programs/ouch/default.nix
@@ -0,0 +1,19 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+
+# Ouch! - CLI tool for compressing and decompressing various formats.
+{
+ options.programs.ouch = {
+ enable = lib.mkEnableOption "Enables ouch.";
+ };
+
+ config = lib.mkIf config.programs.ouch.enable {
+ home.packages = with pkgs; [
+ ouch
+ ];
+ };
+}
diff --git a/modules/programs/pamixer/default.nix b/modules/programs/pamixer/default.nix
new file mode 100644
index 0000000..8262770
--- /dev/null
+++ b/modules/programs/pamixer/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Pamixer - PulseAudio command-line mixer (volume control)
+{
+ options.programs.pamixer = {
+ enable = lib.mkEnableOption "Enables pamixer.";
+ };
+
+ config = lib.mkIf config.programs.pamixer.enable {
+ home.packages = with pkgs; [
+ pamixer
+ ];
+ };
+}
diff --git a/modules/programs/playerctl/default.nix b/modules/programs/playerctl/default.nix
new file mode 100644
index 0000000..f2b5e67
--- /dev/null
+++ b/modules/programs/playerctl/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Playerctl - CLI for controlling media players (Spotify, MPRIS, etc.)
+{
+ options.programs.playerctl = {
+ enable = lib.mkEnableOption "Enables playerctl.";
+ };
+
+ config = lib.mkIf config.programs.playerctl.enable {
+ home.packages = with pkgs; [
+ playerctl
+ ];
+ };
+}
diff --git a/modules/programs/qemu/default.nix b/modules/programs/qemu/default.nix
new file mode 100644
index 0000000..f883636
--- /dev/null
+++ b/modules/programs/qemu/default.nix
@@ -0,0 +1,23 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# QEMU - generic and open source machine & userspace emulator and virtualizer.
+{
+ options.programs.qemu = {
+ enable = lib.mkEnableOption "Enables qemu.";
+ };
+
+ config = lib.mkIf config.programs.qemu.enable {
+ home.packages = with pkgs; [
+ qemu
+ libvirt
+ virtiofsd
+
+ virt-manager
+ ];
+ };
+}
diff --git a/modules/programs/slop/default.nix b/modules/programs/slop/default.nix
new file mode 100644
index 0000000..115523e
--- /dev/null
+++ b/modules/programs/slop/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Slop - Region selector for screenshots (used by maim/flameshot)
+{
+ options.programs.slop = {
+ enable = lib.mkEnableOption "Enables slop.";
+ };
+
+ config = lib.mkIf config.programs.slop.enable {
+ home.packages = with pkgs; [
+ slop
+ ];
+ };
+}
diff --git a/modules/programs/ssh/default.nix b/modules/programs/ssh/default.nix
new file mode 100644
index 0000000..dc1bf0e
--- /dev/null
+++ b/modules/programs/ssh/default.nix
@@ -0,0 +1,31 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# OpenSSH - Secure shell (SSH) client for encrypted remote connections
+{
+ config = lib.mkIf config.programs.ssh.enable {
+ programs.ssh = {
+ package = pkgs.openssh;
+ enableDefaultConfig = false;
+ extraOptionOverrides = {
+ AddKeysToAgent = "yes";
+ ForwardAgent = "yes";
+ ServerAliveInterval = "60";
+ ServerAliveCountMax = "3";
+ VisualHostKey = "yes";
+ HashKnownHosts = "yes";
+ };
+ matchBlocks = {
+ "github.com" = {
+ hostname = "github.com";
+ user = "git";
+ identityFile = "${config.home.homeDirectory}/.ssh/github";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/programs/starship/default.nix b/modules/programs/starship/default.nix
new file mode 100644
index 0000000..ae5e082
--- /dev/null
+++ b/modules/programs/starship/default.nix
@@ -0,0 +1,63 @@
+{ config, lib, ... }:
+
+# Starship - Minimal, blazing-fast shell prompt
+{
+ config = lib.mkIf config.programs.starship.enable {
+ programs.starship = {
+ enableZshIntegration = config.programs.zsh.enable;
+ settings =
+ let
+ mkSegment = content: ''[┄\[](red)[${content}]($style)[\]](red)'';
+ in
+ {
+ add_newline = true;
+
+ format = ''''\n[╭─\[](red)$username[@](red)$hostname[\]](red)$directory$git_branch$git_status$nix_shell''\n[╰─](red)$status$character ''\n'';
+
+ character.format = "[](red)";
+
+ username = {
+ style_user = "blue";
+ style_root = "red bold";
+ format = "[$user]($style)";
+ show_always = true;
+ };
+
+ hostname = {
+ ssh_only = false;
+ style = "green";
+ format = "[$hostname]($style)";
+ };
+
+ directory = {
+ style = "purple";
+ truncate_to_repo = false;
+ format = mkSegment "$path";
+ };
+
+ git_branch = {
+ style = "bold yellow";
+ format = ''[┄\[](red)[$symbol$branch(:$remote_branch)]($style)'';
+ };
+
+ git_status = {
+ style = "cyan";
+ format = ''( [$all_status$ahead_behind]($style))[\]](red)'';
+ };
+
+ nix_shell = {
+ format = mkSegment "$symbol $state( \($name\))";
+ symbol = "󱄅";
+ impure_msg = "󰻌";
+ pure_msg = "󰕥";
+ };
+
+ status = {
+ disabled = false;
+ format = "${mkSegment "$symbol $status"}[┄─](red)";
+ style = "white";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/programs/systemctl-tui/default.nix b/modules/programs/systemctl-tui/default.nix
new file mode 100644
index 0000000..8958d26
--- /dev/null
+++ b/modules/programs/systemctl-tui/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+# systemctl-tui - TUI for systemctl (systemd service management)
+{
+ options.programs.systemctl-tui = {
+ enable = lib.mkEnableOption "Enables systemctl-tui.";
+ };
+
+ config = lib.mkIf config.programs.systemctl-tui.enable {
+ home.packages = with pkgs; [
+ systemctl-tui
+ ];
+ };
+}
diff --git a/modules/programs/tmux/default.nix b/modules/programs/tmux/default.nix
new file mode 100644
index 0000000..92d9a94
--- /dev/null
+++ b/modules/programs/tmux/default.nix
@@ -0,0 +1,4 @@
+{ ... }:
+
+# Tmux - Terminal multiplexer (window/pane management)
+{ }
diff --git a/modules/programs/tor/default.nix b/modules/programs/tor/default.nix
new file mode 100644
index 0000000..0b35030
--- /dev/null
+++ b/modules/programs/tor/default.nix
@@ -0,0 +1,26 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+
+# Tor - Local proxy server for connecting to the tor network
+{
+ options.programs.tor = {
+ enable = lib.mkEnableOption "Enables tor.";
+ };
+
+ config = lib.mkIf config.programs.tor.enable {
+ home.packages = with pkgs; [
+ tor
+ ];
+
+ home.file.".config/tor/torrc".text = ''
+ SocksPort 127.0.0.1:9050
+ CookieAuthentication 1
+ # Prevents Tor from writing to disk too much
+ AvoidDiskWrites 1
+ '';
+ };
+}
diff --git a/modules/programs/umu-launcher/default.nix b/modules/programs/umu-launcher/default.nix
new file mode 100644
index 0000000..8b46cbd
--- /dev/null
+++ b/modules/programs/umu-launcher/default.nix
@@ -0,0 +1,20 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+# umu-launcher - This is a unified launcher for Windows games on Linux
+{
+ options.programs.umu-launcher = {
+ enable = lib.mkEnableOption "Enables umu-launcher.";
+ };
+
+ config = lib.mkIf config.programs.umu-launcher.enable {
+ home.packages = with pkgs; [
+ umu-launcher
+ winetricks
+ ];
+ };
+}
diff --git a/modules/programs/vlc/default.nix b/modules/programs/vlc/default.nix
new file mode 100644
index 0000000..3b07ea7
--- /dev/null
+++ b/modules/programs/vlc/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# VLC - Versatile multimedia player for audio/video playback
+{
+ options.programs.vlc = {
+ enable = lib.mkEnableOption "Enables vlc.";
+ };
+
+ config = lib.mkIf config.programs.vlc.enable {
+ home.packages = with pkgs; [
+ vlc
+ ];
+ };
+}
diff --git a/modules/programs/vscode/default.nix b/modules/programs/vscode/default.nix
new file mode 100644
index 0000000..3c57567
--- /dev/null
+++ b/modules/programs/vscode/default.nix
@@ -0,0 +1,15 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# VSCode - Visual Studio Code (using VSCodium open-source build)
+{
+ config = lib.mkIf config.programs.vscode.enable {
+ programs.vscode = {
+ package = pkgs.vscodium;
+ };
+ };
+}
diff --git a/modules/programs/zathura/default.nix b/modules/programs/zathura/default.nix
new file mode 100644
index 0000000..c10ecd2
--- /dev/null
+++ b/modules/programs/zathura/default.nix
@@ -0,0 +1,4 @@
+{ ... }:
+
+# Zathura - Minimalistic document viewer (PDF, DJVU, etc.)
+{ }
diff --git a/modules/programs/zsh/default.nix b/modules/programs/zsh/default.nix
new file mode 100644
index 0000000..482c201
--- /dev/null
+++ b/modules/programs/zsh/default.nix
@@ -0,0 +1,35 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+# Zsh - Z shell, extended bash with additional features and plugins
+{
+ config =
+ let
+ nixCommandWrappers = builtins.readFile ./nix-aliases.sh;
+ in
+ lib.mkIf config.programs.zsh.enable {
+ programs.zsh = {
+ package = pkgs.zsh;
+ dotDir = "${config.xdg.configHome}/zsh";
+ history.path = "${config.xdg.cacheHome}/zsh/history";
+ enableCompletion = true;
+ initContent = ''
+ setopt PROMPT_SUBST
+
+ autoload -U colors && colors
+
+ bindkey "^[[3~" delete-char
+ bindkey "^?" backward-delete-char
+ ${nixCommandWrappers}
+ '';
+ };
+
+ programs.bash.initExtra = lib.mkIf config.programs.bash.enable (lib.mkAfter nixCommandWrappers);
+
+ home.sessionVariables.SHELL = "${lib.getExe config.programs.zsh.package}";
+ };
+}
diff --git a/modules/programs/zsh/nix-aliases.sh b/modules/programs/zsh/nix-aliases.sh
new file mode 100644
index 0000000..0a2f453
--- /dev/null
+++ b/modules/programs/zsh/nix-aliases.sh
@@ -0,0 +1,27 @@
+nix-shell() {
+ for arg in "$@"; do
+ if [[ "$arg" == "--run" || "$arg" == "--command" ]]; then
+ command nix-shell "$@"
+ return
+ fi
+ done
+
+ command nix-shell "$@" --run "$SHELL"
+}
+
+nix() {
+ if [[ "$1" == "develop" ]]; then
+ local args=("${@:2}")
+
+ for arg in "${args[@]}"; do
+ if [[ "$arg" == "-c" || "$arg" == "--command" ]]; then
+ command nix "$@"
+ return
+ fi
+ done
+
+ command nix develop "${args[@]}" -c "$SHELL"
+ else
+ command nix "$@"
+ fi
+}