From 01aaa7ad39c1fe8af6ffbca31abbab27dbfefc95 Mon Sep 17 00:00:00 2001 From: Arpit Chakladar Date: Wed, 15 Jul 2026 20:02:29 +0530 Subject: refactor: organized the modules into better categories Instead of lumping everything in modules/programs we are separating them into separate directories in modules/ --- modules/communication/default.nix | 8 + modules/communication/email/default.nix | 24 + modules/communication/neomutt/assertions.nix | 34 ++ modules/communication/neomutt/default.nix | 427 ++++++++++++++++ modules/communication/neomutt/theme.nix | 130 +++++ modules/default.nix | 16 +- modules/development/bruno/default.nix | 22 + modules/development/default.nix | 14 + modules/development/delta/default.nix | 32 ++ modules/development/git/assertions.nix | 13 + modules/development/git/default.nix | 112 +++++ modules/development/lazygit/default.nix | 33 ++ modules/development/nixvim/colorscheme.nix | 26 + modules/development/nixvim/default.nix | 103 ++++ modules/development/nixvim/keymaps.nix | 41 ++ modules/development/nixvim/plugins/cmp.nix | 37 ++ modules/development/nixvim/plugins/comment.nix | 23 + modules/development/nixvim/plugins/default.nix | 20 + modules/development/nixvim/plugins/gitsigns.nix | 8 + .../nixvim/plugins/indent-blankline.nix | 14 + modules/development/nixvim/plugins/lsp.nix | 234 +++++++++ modules/development/nixvim/plugins/lualine.nix | 90 ++++ modules/development/nixvim/plugins/luasnip.nix | 8 + modules/development/nixvim/plugins/noice.nix | 8 + modules/development/nixvim/plugins/nvim-tree.nix | 44 ++ modules/development/nixvim/plugins/telescope.nix | 85 ++++ modules/development/nixvim/plugins/treesitter.nix | 19 + .../development/nixvim/plugins/web-devicons.nix | 8 + modules/development/nixvim/plugins/which-key.nix | 21 + modules/development/opencode/default.nix | 19 + modules/development/qemu/default.nix | 30 ++ modules/development/vscodium/default.nix | 20 + modules/file-management/default.nix | 9 + modules/file-management/lf/default.nix | 56 +++ modules/file-management/lf/icons | 342 +++++++++++++ modules/file-management/lf/lfrc | 168 +++++++ modules/file-management/lsd/default.nix | 10 + modules/file-management/ouch/default.nix | 18 + modules/media/default.nix | 14 + modules/media/feh/default.nix | 27 ++ modules/media/ffmpeg/default.nix | 18 + modules/media/impala/default.nix | 26 + modules/media/maim/default.nix | 18 + modules/media/pamixer/default.nix | 18 + modules/media/playerctl/default.nix | 18 + modules/media/slop/default.nix | 18 + modules/media/vlc/default.nix | 37 ++ modules/office/default.nix | 7 + modules/office/zathura/default.nix | 25 + modules/programs/aria2/default.nix | 18 - modules/programs/bat/base16.mustache.tmTheme | 534 --------------------- modules/programs/bat/default.nix | 26 - modules/programs/bluetui/default.nix | 18 - modules/programs/bottom/default.nix | 15 - modules/programs/brave/default.nix | 86 ---- modules/programs/brightnessctl/default.nix | 18 - modules/programs/bruno/default.nix | 22 - modules/programs/default.nix | 56 --- modules/programs/delta/default.nix | 32 -- modules/programs/email/default.nix | 24 - modules/programs/enteauth/default.nix | 61 --- modules/programs/feh/default.nix | 27 -- modules/programs/ffmpeg/default.nix | 18 - modules/programs/fzf/assertions.nix | 13 - modules/programs/fzf/default.nix | 51 -- modules/programs/git/assertions.nix | 13 - modules/programs/git/default.nix | 112 ----- modules/programs/gopass/default.nix | 30 -- modules/programs/gpg/default.nix | 20 - modules/programs/htop/default.nix | 15 - modules/programs/impala/default.nix | 26 - modules/programs/kitty/default.nix | 55 --- modules/programs/lazygit/default.nix | 33 -- modules/programs/less/default.nix | 15 - modules/programs/lf/default.nix | 56 --- modules/programs/lf/icons | 342 ------------- modules/programs/lf/lfrc | 168 ------- modules/programs/lsd/default.nix | 10 - modules/programs/maim/default.nix | 18 - modules/programs/neomutt/assertions.nix | 34 -- modules/programs/neomutt/default.nix | 427 ---------------- modules/programs/neomutt/theme.nix | 130 ----- modules/programs/nixvim/colorscheme.nix | 26 - modules/programs/nixvim/default.nix | 103 ---- modules/programs/nixvim/keymaps.nix | 41 -- modules/programs/nixvim/plugins/cmp.nix | 37 -- modules/programs/nixvim/plugins/comment.nix | 23 - modules/programs/nixvim/plugins/default.nix | 20 - modules/programs/nixvim/plugins/gitsigns.nix | 8 - .../programs/nixvim/plugins/indent-blankline.nix | 14 - modules/programs/nixvim/plugins/lsp.nix | 234 --------- modules/programs/nixvim/plugins/lualine.nix | 90 ---- modules/programs/nixvim/plugins/luasnip.nix | 8 - modules/programs/nixvim/plugins/noice.nix | 8 - modules/programs/nixvim/plugins/nvim-tree.nix | 44 -- modules/programs/nixvim/plugins/telescope.nix | 85 ---- modules/programs/nixvim/plugins/treesitter.nix | 19 - modules/programs/nixvim/plugins/web-devicons.nix | 8 - modules/programs/nixvim/plugins/which-key.nix | 21 - modules/programs/nvtop/default.nix | 23 - modules/programs/opencode/default.nix | 19 - modules/programs/openvpn/default.nix | 18 - modules/programs/ouch/default.nix | 18 - modules/programs/pamixer/default.nix | 18 - modules/programs/playerctl/default.nix | 18 - modules/programs/qemu/default.nix | 30 -- modules/programs/slop/default.nix | 18 - modules/programs/ssh/default.nix | 26 - modules/programs/ssh/git.nix | 49 -- modules/programs/starship/default.nix | 63 --- modules/programs/systemctl-tui/default.nix | 18 - modules/programs/tmux/default.nix | 15 - modules/programs/tor/default.nix | 25 - modules/programs/vlc/default.nix | 37 -- modules/programs/vscodium/default.nix | 20 - modules/programs/zathura/default.nix | 25 - modules/programs/zsh/default.nix | 38 -- modules/programs/zsh/nix-aliases.sh | 27 -- modules/security/default.nix | 11 + modules/security/enteauth/default.nix | 61 +++ modules/security/gopass/default.nix | 30 ++ modules/security/gpg/default.nix | 20 + modules/security/openvpn/default.nix | 18 + modules/security/ssh/default.nix | 26 + modules/security/ssh/git.nix | 49 ++ modules/system/bluetui/default.nix | 18 + modules/system/bottom/default.nix | 15 + modules/system/brightnessctl/default.nix | 18 + modules/system/default.nix | 12 + modules/system/htop/default.nix | 15 + modules/system/nvtop/default.nix | 23 + modules/system/systemctl-tui/default.nix | 18 + modules/terminal/bat/base16.mustache.tmTheme | 534 +++++++++++++++++++++ modules/terminal/bat/default.nix | 26 + modules/terminal/default.nix | 13 + modules/terminal/fzf/assertions.nix | 13 + modules/terminal/fzf/default.nix | 51 ++ modules/terminal/kitty/default.nix | 55 +++ modules/terminal/less/default.nix | 15 + modules/terminal/starship/default.nix | 63 +++ modules/terminal/tmux/default.nix | 15 + modules/terminal/zsh/default.nix | 38 ++ modules/terminal/zsh/nix-aliases.sh | 27 ++ modules/web/aria2/default.nix | 18 + modules/web/brave/default.nix | 86 ++++ modules/web/default.nix | 8 + 146 files changed, 3847 insertions(+), 3818 deletions(-) create mode 100644 modules/communication/default.nix create mode 100644 modules/communication/email/default.nix create mode 100644 modules/communication/neomutt/assertions.nix create mode 100644 modules/communication/neomutt/default.nix create mode 100644 modules/communication/neomutt/theme.nix create mode 100644 modules/development/bruno/default.nix create mode 100644 modules/development/default.nix create mode 100644 modules/development/delta/default.nix create mode 100644 modules/development/git/assertions.nix create mode 100644 modules/development/git/default.nix create mode 100644 modules/development/lazygit/default.nix create mode 100644 modules/development/nixvim/colorscheme.nix create mode 100644 modules/development/nixvim/default.nix create mode 100644 modules/development/nixvim/keymaps.nix create mode 100644 modules/development/nixvim/plugins/cmp.nix create mode 100644 modules/development/nixvim/plugins/comment.nix create mode 100644 modules/development/nixvim/plugins/default.nix create mode 100644 modules/development/nixvim/plugins/gitsigns.nix create mode 100644 modules/development/nixvim/plugins/indent-blankline.nix create mode 100644 modules/development/nixvim/plugins/lsp.nix create mode 100644 modules/development/nixvim/plugins/lualine.nix create mode 100644 modules/development/nixvim/plugins/luasnip.nix create mode 100644 modules/development/nixvim/plugins/noice.nix create mode 100644 modules/development/nixvim/plugins/nvim-tree.nix create mode 100644 modules/development/nixvim/plugins/telescope.nix create mode 100644 modules/development/nixvim/plugins/treesitter.nix create mode 100644 modules/development/nixvim/plugins/web-devicons.nix create mode 100644 modules/development/nixvim/plugins/which-key.nix create mode 100644 modules/development/opencode/default.nix create mode 100644 modules/development/qemu/default.nix create mode 100644 modules/development/vscodium/default.nix create mode 100644 modules/file-management/default.nix create mode 100644 modules/file-management/lf/default.nix create mode 100644 modules/file-management/lf/icons create mode 100644 modules/file-management/lf/lfrc create mode 100644 modules/file-management/lsd/default.nix create mode 100644 modules/file-management/ouch/default.nix create mode 100644 modules/media/default.nix create mode 100644 modules/media/feh/default.nix create mode 100644 modules/media/ffmpeg/default.nix create mode 100644 modules/media/impala/default.nix create mode 100644 modules/media/maim/default.nix create mode 100644 modules/media/pamixer/default.nix create mode 100644 modules/media/playerctl/default.nix create mode 100644 modules/media/slop/default.nix create mode 100644 modules/media/vlc/default.nix create mode 100644 modules/office/default.nix create mode 100644 modules/office/zathura/default.nix delete mode 100644 modules/programs/aria2/default.nix delete mode 100644 modules/programs/bat/base16.mustache.tmTheme delete mode 100644 modules/programs/bat/default.nix delete mode 100644 modules/programs/bluetui/default.nix delete mode 100644 modules/programs/bottom/default.nix delete mode 100644 modules/programs/brave/default.nix delete mode 100644 modules/programs/brightnessctl/default.nix delete mode 100644 modules/programs/bruno/default.nix delete mode 100644 modules/programs/default.nix delete mode 100644 modules/programs/delta/default.nix delete mode 100644 modules/programs/email/default.nix delete mode 100644 modules/programs/enteauth/default.nix delete mode 100644 modules/programs/feh/default.nix delete mode 100644 modules/programs/ffmpeg/default.nix delete mode 100644 modules/programs/fzf/assertions.nix delete mode 100644 modules/programs/fzf/default.nix delete mode 100644 modules/programs/git/assertions.nix delete mode 100644 modules/programs/git/default.nix delete mode 100644 modules/programs/gopass/default.nix delete mode 100644 modules/programs/gpg/default.nix delete mode 100644 modules/programs/htop/default.nix delete mode 100644 modules/programs/impala/default.nix delete mode 100644 modules/programs/kitty/default.nix delete mode 100644 modules/programs/lazygit/default.nix delete mode 100644 modules/programs/less/default.nix delete mode 100644 modules/programs/lf/default.nix delete mode 100644 modules/programs/lf/icons delete mode 100644 modules/programs/lf/lfrc delete mode 100644 modules/programs/lsd/default.nix delete mode 100644 modules/programs/maim/default.nix delete mode 100644 modules/programs/neomutt/assertions.nix delete mode 100644 modules/programs/neomutt/default.nix delete mode 100644 modules/programs/neomutt/theme.nix delete mode 100644 modules/programs/nixvim/colorscheme.nix delete mode 100644 modules/programs/nixvim/default.nix delete mode 100644 modules/programs/nixvim/keymaps.nix delete mode 100644 modules/programs/nixvim/plugins/cmp.nix delete mode 100644 modules/programs/nixvim/plugins/comment.nix delete mode 100644 modules/programs/nixvim/plugins/default.nix delete mode 100644 modules/programs/nixvim/plugins/gitsigns.nix delete mode 100644 modules/programs/nixvim/plugins/indent-blankline.nix delete mode 100644 modules/programs/nixvim/plugins/lsp.nix delete mode 100644 modules/programs/nixvim/plugins/lualine.nix delete mode 100644 modules/programs/nixvim/plugins/luasnip.nix delete mode 100644 modules/programs/nixvim/plugins/noice.nix delete mode 100644 modules/programs/nixvim/plugins/nvim-tree.nix delete mode 100644 modules/programs/nixvim/plugins/telescope.nix delete mode 100644 modules/programs/nixvim/plugins/treesitter.nix delete mode 100644 modules/programs/nixvim/plugins/web-devicons.nix delete mode 100644 modules/programs/nixvim/plugins/which-key.nix delete mode 100644 modules/programs/nvtop/default.nix delete mode 100644 modules/programs/opencode/default.nix delete mode 100644 modules/programs/openvpn/default.nix delete mode 100644 modules/programs/ouch/default.nix delete mode 100644 modules/programs/pamixer/default.nix delete mode 100644 modules/programs/playerctl/default.nix delete mode 100644 modules/programs/qemu/default.nix delete mode 100644 modules/programs/slop/default.nix delete mode 100644 modules/programs/ssh/default.nix delete mode 100644 modules/programs/ssh/git.nix delete mode 100644 modules/programs/starship/default.nix delete mode 100644 modules/programs/systemctl-tui/default.nix delete mode 100644 modules/programs/tmux/default.nix delete mode 100644 modules/programs/tor/default.nix delete mode 100644 modules/programs/vlc/default.nix delete mode 100644 modules/programs/vscodium/default.nix delete mode 100644 modules/programs/zathura/default.nix delete mode 100644 modules/programs/zsh/default.nix delete mode 100644 modules/programs/zsh/nix-aliases.sh create mode 100644 modules/security/default.nix create mode 100644 modules/security/enteauth/default.nix create mode 100644 modules/security/gopass/default.nix create mode 100644 modules/security/gpg/default.nix create mode 100644 modules/security/openvpn/default.nix create mode 100644 modules/security/ssh/default.nix create mode 100644 modules/security/ssh/git.nix create mode 100644 modules/system/bluetui/default.nix create mode 100644 modules/system/bottom/default.nix create mode 100644 modules/system/brightnessctl/default.nix create mode 100644 modules/system/default.nix create mode 100644 modules/system/htop/default.nix create mode 100644 modules/system/nvtop/default.nix create mode 100644 modules/system/systemctl-tui/default.nix create mode 100644 modules/terminal/bat/base16.mustache.tmTheme create mode 100644 modules/terminal/bat/default.nix create mode 100644 modules/terminal/default.nix create mode 100644 modules/terminal/fzf/assertions.nix create mode 100644 modules/terminal/fzf/default.nix create mode 100644 modules/terminal/kitty/default.nix create mode 100644 modules/terminal/less/default.nix create mode 100644 modules/terminal/starship/default.nix create mode 100644 modules/terminal/tmux/default.nix create mode 100644 modules/terminal/zsh/default.nix create mode 100644 modules/terminal/zsh/nix-aliases.sh create mode 100644 modules/web/aria2/default.nix create mode 100644 modules/web/brave/default.nix create mode 100644 modules/web/default.nix (limited to 'modules') diff --git a/modules/communication/default.nix b/modules/communication/default.nix new file mode 100644 index 0000000..ade90bb --- /dev/null +++ b/modules/communication/default.nix @@ -0,0 +1,8 @@ +{ ... }: + +{ + imports = [ + ./email + ./neomutt + ]; +} diff --git a/modules/communication/email/default.nix b/modules/communication/email/default.nix new file mode 100644 index 0000000..3a57cf0 --- /dev/null +++ b/modules/communication/email/default.nix @@ -0,0 +1,24 @@ +# email - Mbsync and notmuch mail synchronization +{ + config, + lib, + ... +}: + +let + mailDir = "${config.home.homeDirectory}/.local/share/mail"; +in +{ + options.programs.email = { + enable = lib.mkEnableOption "Email suite (mbsync + notmuch)"; + }; + + config = lib.mkIf config.programs.email.enable { + programs.mbsync.enable = true; + programs.notmuch.enable = true; + + accounts.email.maildirBasePath = mailDir; + + home.sessionVariables.MAILDIR = mailDir; + }; +} diff --git a/modules/communication/neomutt/assertions.nix b/modules/communication/neomutt/assertions.nix new file mode 100644 index 0000000..989d273 --- /dev/null +++ b/modules/communication/neomutt/assertions.nix @@ -0,0 +1,34 @@ +{ config, ... }: + +{ + assertions = [ + { + assertion = !config.programs.neomutt.enable || config.programs.less.enable; + message = '' + programs.neomutt is enabled but programs.less.enable is not. + neomutt requires less as its pager. Please enable programs.less. + ''; + } + { + assertion = !config.programs.neomutt.enable || config.programs.bat.enable; + message = '' + programs.neomutt is enabled but programs.bat.enable is not. + neomutt requires bat for text/html filtering. Please enable programs.bat. + ''; + } + { + assertion = !config.programs.neomutt.enable || config.programs.email.enable; + message = '' + programs.neomutt is enabled but programs.email.enable is not. + neomutt requires the email module (mbsync + notmuch) to be enabled. + ''; + } + { + assertion = !config.programs.neomutt.enable || config.programs.kitty.enable; + message = '' + programs.neomutt is enabled but programs.kitty.enable is not. + neomutt's desktop entry requires kitty as the terminal launcher. Please enable programs.kitty. + ''; + } + ]; +} diff --git a/modules/communication/neomutt/default.nix b/modules/communication/neomutt/default.nix new file mode 100644 index 0000000..3626341 --- /dev/null +++ b/modules/communication/neomutt/default.nix @@ -0,0 +1,427 @@ +# neomutt - Terminal email client +{ + config, + lib, + pkgs, + ... +}: +let + neomuttDesktopItem = pkgs.makeDesktopItem { + name = "neomutt"; + desktopName = "NeoMutt"; + exec = "${lib.getExe config.programs.kitty.package} -e ${lib.getExe config.programs.neomutt.package}"; + icon = "kitty"; + categories = [ + "Network" + "Email" + ]; + comment = "Terminal email client"; + terminal = false; + type = "Application"; + }; +in +{ + imports = [ + ./assertions.nix + ./theme.nix + ]; + config = lib.mkIf config.programs.neomutt.enable { + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/mailto" = "neomutt.desktop"; + }; + + home.packages = [ + pkgs.urlscan + pkgs.w3m + neomuttDesktopItem + ]; + + xdg.configFile."neomutt/mailcap".text = '' + text/html; w3m -dump -T text/html '%s'; copiousoutput; nametemplate=%s.html + text/html; $BROWSER '%s'; nametemplate=%s.html + image/*; xdg-open '%s' & + application/pdf; xdg-open '%s'; nametemplate=%s.pdf + video/*; xdg-open '%s' & + audio/*; xdg-open '%s' & + application/*; xdg-open '%s' & + ''; + + xdg.configFile."neomutt/flag_legend.txt".text = '' + NeoMutt Index Flags + =================== + + Message state ($flag_chars) -- unchanged defaults + N New - unread, arrived since you last checked + O Old - unread, but seen in a previous session + D Deleted - marked for deletion (pending expunge) + d Att-del - has attachments marked for deletion + ! Flagged - important (toggle with F) + * Tagged - selected for a bulk operation (toggle with t) + r Replied - you've replied to this message + (blank) - read, nothing else notable + + Cryptography ($crypt_chars) +  Verified - signed, and the signature checks out +  Encrypted - PGP/SMIME encrypted +  Signed - PGP/SMIME signed (unverified) +  PGP key - message contains a PGP public key + (blank) - no cryptography info + + Addressing ($to_chars) +  To you only - sent to you and only you +  To (with others) - you're in the To: list, among others +  Cc only - you're only in the Cc: list +  From you - sent by you +  Mailing list - sent to a list you're subscribed to + (blank) - not in To/Cc (e.g. Bcc, unlisted) + + Press q to close. + ''; + + programs.neomutt = { + sidebar.enable = true; + sort = "reverse-threads"; + vimKeys = true; + unmailboxes = true; + checkStatsInterval = 20; + + extraConfig = '' + set menu_scroll = yes + + # cancel any prompt/command-line entry with Esc, vim-style + set abort_key = "" + + # attachments: use our mailcap for dedicated openers, + # and auto-render html/images inline where sensible + set mailcap_path = "~/.config/neomutt/mailcap" + auto_view text/html image/png image/jpeg image/gif application/pdf + ''; + + binds = [ + # --- sidebar navigation (vim: k=up, j=down) --- + { + map = [ + "index" + "pager" + ]; + key = "\\CK"; + action = "sidebar-prev"; + } + { + map = [ + "index" + "pager" + ]; + key = "\\CJ"; + action = "sidebar-next"; + } + { + # select the highlighted mailbox directly, no Ctrl+O needed + map = [ + "index" + "pager" + ]; + key = "o"; + action = "sidebar-open"; + } + + # --- open / go deeper (vim: l = right/forward) --- + { + map = [ "index" ]; + key = ""; + action = "display-message"; + } + { + map = [ "index" ]; + key = "l"; + action = "display-message"; + } + { + map = [ "browser" ]; + key = ""; + action = "select-entry"; + } + { + map = [ "browser" ]; + key = "l"; + action = "select-entry"; + } + { + map = [ "attach" ]; + key = ""; + action = "view-attach"; + } + { + map = [ "attach" ]; + key = "l"; + action = "view-attach"; + } + { + map = [ + "alias" + "query" + ]; + key = ""; + action = "select-entry"; + } + + # --- back / exit (vim: h = left/back) --- + { + map = [ "pager" ]; + key = "h"; + action = "exit"; + } + { + map = [ "browser" ]; + key = "h"; + action = "exit"; + } + { + map = [ "attach" ]; + key = "h"; + action = "exit"; + } + { + map = [ "index" ]; + key = "h"; + action = "collapse-thread"; + } + + # --- pager line scrolling (vim: j/k move by line) --- + { + map = [ "pager" ]; + key = "j"; + action = "next-line"; + } + { + map = [ "pager" ]; + key = "k"; + action = "previous-line"; + } + { + # kept from before: jump straight to the next unread message, + # extends the h/l "back/forward" metaphor already in use + map = [ "pager" ]; + key = "l"; + action = "next-unread"; + } + + # --- top/bottom of buffer (vim: gg/G -- NOT 0/$, which mean + # start/end of *line* in vim and would be a false friend here) --- + { + map = [ "index" ]; + key = "gg"; + action = "first-entry"; + } + { + map = [ "index" ]; + key = "G"; + action = "last-entry"; + } + { + map = [ "pager" ]; + key = "gg"; + action = "top"; + } + { + map = [ "pager" ]; + key = "G"; + action = "bottom"; + } + { + map = [ "browser" ]; + key = "gg"; + action = "first-entry"; + } + { + map = [ "browser" ]; + key = "G"; + action = "last-entry"; + } + + # --- page scrolling (vim: Ctrl-f/b full page, Ctrl-d/u half page) --- + { + map = [ "pager" ]; + key = "\\Cf"; + action = "next-page"; + } + { + map = [ "pager" ]; + key = "\\Cb"; + action = "previous-page"; + } + { + map = [ "pager" ]; + key = "\\Cd"; + action = "half-down"; + } + { + map = [ "pager" ]; + key = "\\Cu"; + action = "half-up"; + } + { + # index has no half-page concept, so Ctrl-d/u fall back to + # the same full-page scroll as Ctrl-f/b + map = [ "index" ]; + key = "\\Cf"; + action = "next-page"; + } + { + map = [ "index" ]; + key = "\\Cb"; + action = "previous-page"; + } + { + map = [ "index" ]; + key = "\\Cd"; + action = "half-down"; + } + { + map = [ "index" ]; + key = "\\Cu"; + action = "half-up"; + } + + # --- search (vim: / forward, ? backward, n/N repeat) --- + { + map = [ + "index" + "pager" + ]; + key = "/"; + action = "search"; + } + { + map = [ + "index" + "pager" + ]; + key = "?"; + action = "search-reverse"; + } + { + map = [ + "index" + "pager" + ]; + key = "n"; + action = "search-next"; + } + { + map = [ + "index" + "pager" + ]; + key = "N"; + action = "search-opposite"; + } + + { + map = [ + "index" + "pager" + ]; + key = "u"; + action = "undelete-message"; + } + + # --- copy (vim: yy yank -- non-destructive, unlike save-message + # which moves/deletes the original) --- + { + map = [ "index" ]; + key = "y"; + action = "noop"; + } + { + map = [ "index" ]; + key = "yy"; + action = "copy-message"; + } + + # --- tagging (vim: v/V visual select single/whole block) --- + # NOTE: this overrides neomutt's default "v" (view-attachments). + # Attachments are still reachable from the pager/index via the + # mailcap auto-view or the attach menu, but if you want plain + # "v" back for view-attachments, just delete these two binds. + { + map = [ "index" ]; + key = "v"; + action = "tag-entry"; + } + { + map = [ "index" ]; + key = "V"; + action = "tag-thread"; + } + + # --- mailbox switching (vim: gt = next tab) --- + { + map = [ "index" ]; + key = "gt"; + action = "next-unread-mailbox"; + } + + # --- filter/limit (vim: gf to 'find' or 'filter') --- + { + map = [ "index" ]; + key = "gf"; + action = "limit"; + } + + # --- filter/limit (vim: gf to 'find' or 'filter') --- + { + map = [ "index" ]; + key = "gF"; + action = "limit"; + } + + # --- help message to show functions and keybindings --- + { + map = [ + "index" + "pager" + "browser" + "attach" + ]; + key = "g?"; + action = "help"; + } + ]; + + macros = [ + { + map = [ + "index" + "pager" + ]; + key = "O"; + action = "mbsync -a"; + } + { + # gx: extract links from the current message and open one, vim-netrw style + map = [ + "index" + "pager" + ]; + key = "gx"; + action = "urlscan"; + } + { + map = [ + "index" + "pager" + ]; + key = "gl"; + action = "less ~/.config/neomutt/flag_legend.txt"; + } + { + # ZZ: save and quit, vim-style (sync mailbox, then quit) + map = [ "index" ]; + key = "ZZ"; + action = ""; + } + ]; + }; + }; +} diff --git a/modules/communication/neomutt/theme.nix b/modules/communication/neomutt/theme.nix new file mode 100644 index 0000000..52845ee --- /dev/null +++ b/modules/communication/neomutt/theme.nix @@ -0,0 +1,130 @@ +{ config, lib, ... }: + +# Colorscheme - True base16 OneDark colors for neomutt +# Leverages Kitty's precise mapping to base16 (color0-15) +{ + config.programs.neomutt.extraConfig = lib.mkIf config.programs.neomutt.enable '' + # vim: filetype=muttrc + # + # Base16 OneDark Dark terminal colors for neomutt + # Each column in the index receives a distinct color to keep the UI organized. + + # Nerd Font icon-based flag/attachment/crypto indicators + # order: new, old, deleted, flagged, replied, old(unused), tagged, encrypt, ... + set flag_chars = "󰓹󰀼󰆴󰁟󰇰󰇮󰍩󰍨󰇱󰗚" + set to_chars = " " + set crypt_chars = " " + set attach_format = "%u%D%I %t%4n %T%.40d %> [%m/%M, %e%?C?, %C?, %s] " + + set index_format = " %5C │ %Z │ %{%d/%m/%y %H:%M} │ %-25.25a │ %s%* " + + # Hide the keybindings help bar at the top to save vertical space + set help = no + + # Status bar with Nerd Font icons per field + set status_format = "  Unread: %5u │ 󰛏 New: %5n │  Tagged: %5t │  Search: %f │  Filter: %v │  Sorted By: %s │" + + # --- Basic UI Colors -------------------------------------------------- + # target foreground background + color normal white default # base05 (Standard text) + color error red default # base08 (Red) + color tilde brightblack default # base03 (Dark Grey) + color message cyan default # base0C (Cyan) + color markers red default # base08 (Red) + color attachment magenta default # base0E (Magenta) + color search magenta default # base0E (Magenta) + color prompt cyan default # base0C (Questions/prompts) + color progress black yellow # 󰦖 base0A bg (Progress bar) + + # Selected row and status bar + color status white brightblack # base05 on base03 + color indicator default brightblack # default on base03 (Selected email) + color tree magenta default # base03 (Thread arrows) + + # Whole-line fallback for the index (base for anything not caught below) + color index white default # base05 + + # --- Index Columns (The Multi-Color Table) ---------------------------- + # Applies distinct colors to specific columns for ALL messages (~A) + color index_number cyan default "~A" # base05 (Fixed: was brightblack) + color index_date green default "~A" # base0B (Green) + color index_flags red default "~A" # base08 (Red) + color index_size cyan default "~A" # 󰈔 base0C (Cyan) + color index_author yellow default "~A" # base0A (Yellow) + color index_subject white default "~A" # base05 (Standard text for Read messages) + color index_collapsed yellow default # base0A (Collapsed thread count, %M) + color index_label magenta default # 󰓹 base0E (Message label, %y %Y) + color index_tag cyan default # base0C (Message tags, %G) + color index_tags cyan default # 󰓼 base0C (Transformed tags, %g %J) + + # --- Index Message States --------------------------------------------- + # By targeting *only* `index_subject`, we preserve your multi-color + # columns while still easily identifying unread or flagged emails. + color index_subject blue default "~U" # Unread: Blue (base0D) + color index_subject blue default "~N" # 󰄯 New: Blue (base0D) + color index_subject red default "~F" # Flagged: Red (base08) + color index_subject magenta default "~Q" # 󰛃 Replied: Magenta (base0E) + color index_subject black red "~D" # Deleted + + # This rule now colors the "email (name)" column as it is considered the 'author' + color index_author yellow default "~A" + color index_subject white default "~A" # %s + + # We removed the ~R (Read) override so it stays white. + # For Deleted (~D), if brightblack is still too dark to see, we can use a red background instead: + color index_subject black red "~D" # Deleted: Black on Red background + + # Thread collapsing states + color index_subject yellow default "~v" # Collapsed thread + color index_subject blue default "~v~(~N)" # 󰝜 Collapsed with unread inside + color index_subject red default "~v~(~F)" # 󰈺 Collapsed with flagged inside + + # Subtle zebra striping between adjacent index rows (barely-there contrast) + color stripe_odd default default + color stripe_even default default + + # --- Message Headers -------------------------------------------------- + color hdrdefault cyan default # base0C + color header yellow default "^(From|To|Cc|Bcc)" # base0A + color header blue default "^(Subject)" # base0D + color header green default "^(Date)" # base03 + + # Attachment header lines (shown above each MIME part in the pager) + color attach_headers cyan default # + + # --- Message Body ----------------------------------------------------- + color quoted blue default # base0D + color quoted1 cyan default # base0C + color quoted2 yellow default # base0A + color quoted3 red default # base08 + color quoted4 magenta default # base0E + color quoted5 blue default # base0D (cycle repeats) + color quoted6 cyan default # base0C + color quoted7 yellow default # base0A + color quoted8 red default # base08 + color quoted9 magenta default # base0E + + color signature green default # 󰛿 base0B + color bold white default # base05 + color underline white default # base05 + + # URLs + color body blue default "([a-z][a-z0-9+-]*://[^ ]+)" + + # PGP + color body green default "(Good signature)" # verified + color body red default "(BAD signature)" # bad + color body brightblack default "^gpg: " # + + # --- Sidebar (was completely unset despite sidebar.enable = true) ----- + set sidebar_format = " %D%* %?N? %N?%?F? %F? " + color sidebar_background default default # transparent, blends with terminal bg + color sidebar_divider white default # base03 (matches old tree color) + color sidebar_ordinary white default # base05 (normal mailbox entries) + color sidebar_new green default # 󰇮 base0B (mailboxes with new mail) + color sidebar_flagged red default # base08 (mailboxes with flagged mail) + color sidebar_spool_file yellow default # 󰇰 base0A (your inbox/spool) + color sidebar_highlight white brightblack # base05 on base03 (cursor position) + color sidebar_indicator default brightblack # default on base03 (currently open mailbox) + ''; +} diff --git a/modules/default.nix b/modules/default.nix index 4cb90af..3a601ee 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -2,10 +2,24 @@ { imports = [ + ./communication ./desktop + ./development + ./file-management ./fonts ./gaming + ./media + ./office ./scripts - ./programs + ./security + ./system + ./terminal + ./web ]; + + config = { + xdg.mimeApps = { + enable = true; + }; + }; } diff --git a/modules/development/bruno/default.nix b/modules/development/bruno/default.nix new file mode 100644 index 0000000..7205f31 --- /dev/null +++ b/modules/development/bruno/default.nix @@ -0,0 +1,22 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Bruno - Open-source API client for testing HTTP endpoints +{ + options.programs.bruno = { + enable = lib.mkEnableOption "Enables bruno."; + package = lib.mkPackageOption pkgs "bruno" { }; + }; + + config = lib.mkIf config.programs.bruno.enable { + home.packages = [ config.programs.bruno.package ]; + + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/bruno" = "bruno.desktop"; + }; + }; +} diff --git a/modules/development/default.nix b/modules/development/default.nix new file mode 100644 index 0000000..1e79868 --- /dev/null +++ b/modules/development/default.nix @@ -0,0 +1,14 @@ +{ ... }: + +{ + imports = [ + ./bruno + ./delta + ./git + ./lazygit + ./nixvim + ./opencode + ./qemu + ./vscodium + ]; +} diff --git a/modules/development/delta/default.nix b/modules/development/delta/default.nix new file mode 100644 index 0000000..90e35d4 --- /dev/null +++ b/modules/development/delta/default.nix @@ -0,0 +1,32 @@ +{ + config, + lib, + ... +}: +# Delta - A syntax-highlighting pager for git, diff, and grep output +{ + config = lib.mkIf config.programs.delta.enable { + programs.delta.options = { + line-numbers = true; + hunk-header-style = "omit"; + hunk-header-decoration-style = "omit"; + line-numbers-left-format = "{nm}│ "; + line-numbers-right-format = "{np}│ "; + }; + + programs.git.settings = lib.mkIf config.programs.git.enable { + core.pager = "delta"; + interactive.diffFilter = "delta --color-only"; + delta.navigate = true; + }; + + programs.lazygit.settings = lib.mkIf config.programs.lazygit.enable { + git.pagers = [ + { + colorArg = "always"; + pager = "delta --paging=never {{diffArgs}}"; + } + ]; + }; + }; +} diff --git a/modules/development/git/assertions.nix b/modules/development/git/assertions.nix new file mode 100644 index 0000000..fbe5d3c --- /dev/null +++ b/modules/development/git/assertions.nix @@ -0,0 +1,13 @@ +{ config, ... }: +{ + assertions = [ + { + assertion = + !config.programs.git.useSSH || (config.programs.git.enable && config.programs.ssh.enable); + message = '' + programs.git.useSSH is enabled but programs.ssh.enable is not. + SSH must be enabled (programs.ssh.enable = true) to use SSH for git. + ''; + } + ]; +} diff --git a/modules/development/git/default.nix b/modules/development/git/default.nix new file mode 100644 index 0000000..c1aade5 --- /dev/null +++ b/modules/development/git/default.nix @@ -0,0 +1,112 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Git - Distributed version control system +{ + imports = [ + ./assertions.nix + ] + ++ lib.optional (builtins.pathExists ../../private/git.nix) ../../private/git.nix; + + options.programs.git = { + username = lib.mkOption { + type = lib.types.str; + description = "Git username."; + }; + + email = lib.mkOption { + type = lib.types.str; + description = "Git email."; + }; + + useSSH = lib.mkEnableOption "Use SSH instead of HTTPS for common git platforms."; + }; + + config = lib.mkIf config.programs.git.enable { + home.packages = with pkgs; [ + git-graph + ]; + + xdg.configFile."git-graph/models/custom.toml".text = '' + persistence = [ + '^(master|main|trunk)$', + '^(develop|dev)$', + '^feature.*$', + '^release.*$', + '^hotfix.*$', + '^bugfix.*$', + ] + + order = [ + '^(master|main|trunk)$', + '^(hotfix|release).*$', + '^(develop|dev)$', + ] + + [terminal_colors] + matches = [ + ['^(master|main|trunk)$', ['bright_blue']], + ['^(develop|dev)$', ['bright_yellow']], + ['^(feature|fork/).*$', ['bright_magenta', 'bright_cyan']], + ['^release.*$', ['bright_green']], + ['^(bugfix|hotfix).*$', ['bright_red']], + ['^tags/.*$', ['bright_green']], + ] + # Everything else (e.g. custom/service branches) cycles through these instead of all being white + unknown = ['bright_white', 'bright_red', 'bright_green', 'bright_yellow', 'bright_blue', 'bright_magenta', 'bright_cyan'] + + [svg_colors] + matches = [ + ['^(master|main|trunk)$', ['blue']], + ['^(develop|dev)$', ['orange']], + ['^(feature|fork/).*$', ['magenta', 'cyan']], + ['^release.*$', ['green']], + ['^(bugfix|hotfix).*$', ['red']], + ['^tags/.*$', ['green']], + ] + unknown = ['gray', 'purple', 'teal', 'brown'] + ''; + + programs.git = { + settings = + lib.recursiveUpdate + { + user = { + name = config.programs.git.username; + email = config.programs.git.email; + }; + core.askPass = ""; + alias = { + # The exclamation mark (!) tells Git to execute this as an external shell command. + # This overrides standard git-graph behavior with your custom format string. + log-graph = '' + !f() { + fmt=$(printf '\033[1;34mCommit:\033[0m \033[33m%%h\033[0m \033[91m%%d\033[0m%%n\033[1;34mParents:\033[0m \033[35m%%p\033[0m%%n\033[1;34mAuthor:\033[0m \033[32m%%an\033[0m <\033[96m%%ae\033[0m>%%n\033[1;34mDate:\033[0m \033[36m%%ad (%%ar)\033[0m%%n%%n%%B%%n\033[90m--------------------------------------------------------\033[0m') + git-graph --model custom --color always --sparse --style round --format="$fmt" + }; f | less -R + ''; + # Same formatting, but no pager — meant for embedding (lazygit, etc.) + log-graph-embed = '' + !f() { + fmt=$(printf '\033[1;34mCommit:\033[0m \033[33m%%h\033[0m \033[91m%%d\033[0m%%n\033[1;34mParents:\033[0m \033[35m%%p\033[0m%%n\033[1;34mAuthor:\033[0m \033[32m%%an\033[0m <\033[96m%%ae\033[0m>%%n\033[1;34mDate:\033[0m \033[36m%%ad (%%ar)\033[0m%%n%%n%%B%%n\033[90m--------------------------------------------------------\033[0m') + git-graph --model custom --color always --sparse --style round --no-pager --format="$fmt" + }; f + ''; + }; + } + ( + lib.optionalAttrs config.programs.git.useSSH { + url."git@github.com:".insteadOf = "https://github.com/"; + url."git@gitlab.com:".insteadOf = "https://gitlab.com/"; + url."git@bitbucket.org:".insteadOf = "https://bitbucket.org/"; + url."git@codeberg.org:".insteadOf = "https://codeberg.org/"; + url."git@git.sr.ht:".insteadOf = "https://git.sr.ht/"; + } + ); + }; + }; +} diff --git a/modules/development/lazygit/default.nix b/modules/development/lazygit/default.nix new file mode 100644 index 0000000..cf46e9a --- /dev/null +++ b/modules/development/lazygit/default.nix @@ -0,0 +1,33 @@ +{ config, lib, ... }: + +# Lazygit - A simple terminal UI for git commands +{ + config = lib.mkIf config.programs.lazygit.enable { + programs.lazygit = { + enableBashIntegration = config.programs.bash.enable; + enableFishIntegration = config.programs.fish.enable; + enableNushellIntegration = config.programs.nushell.enable; + enableZshIntegration = config.programs.zsh.enable; + + settings = { + gui = { + theme = { + lightTheme = false; + }; + showIcons = true; + scrollHeight = 2; + nerdFontsVersion = "3"; + scrollPastBottom = true; + mouseEvents = true; + border = "single"; + }; + git = { + log.showWholeGraph = true; + branchLogCmd = "git log-graph-embed"; + overrideGpg = true; + }; + update.method = "never"; + }; + }; + }; +} diff --git a/modules/development/nixvim/colorscheme.nix b/modules/development/nixvim/colorscheme.nix new file mode 100644 index 0000000..ba81634 --- /dev/null +++ b/modules/development/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/development/nixvim/default.nix b/modules/development/nixvim/default.nix new file mode 100644 index 0000000..c7978d4 --- /dev/null +++ b/modules/development/nixvim/default.nix @@ -0,0 +1,103 @@ +{ config, lib, ... }: + +# Nixvim - Neovim configured through Nix (home-manager integration) +{ + imports = [ + ./colorscheme.nix + ./keymaps.nix + ./plugins + ]; + + config = { + 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"; + updatetime = 500; + }; + 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; + }; + + 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 + ''; + } + ]; + }; + }; +} diff --git a/modules/development/nixvim/keymaps.nix b/modules/development/nixvim/keymaps.nix new file mode 100644 index 0000000..4e4b35a --- /dev/null +++ b/modules/development/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 = ""; + action = "h"; + options.desc = "Move to left window"; + } + { + key = ""; + action = "j"; + options.desc = "Move to bottom window"; + } + { + key = ""; + action = "k"; + options.desc = "Move to top window"; + } + { + key = ""; + action = "l"; + options.desc = "Move to right window"; + } + { + key = ""; + action = "NvimTreeToggle"; + mode = [ + "n" + "i" + ]; + options.desc = "Toggle file explorer"; + } + { + key = ""; + action = "NotificationsClear"; + options.desc = "Clear notifications"; + } + ]; +} diff --git a/modules/development/nixvim/plugins/cmp.nix b/modules/development/nixvim/plugins/cmp.nix new file mode 100644 index 0000000..683e0d3 --- /dev/null +++ b/modules/development/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 = { + "" = "cmp.mapping.complete()"; + "" = "cmp.mapping.confirm({ select = true })"; + "" = "cmp.mapping.select_next_item()"; + "" = "cmp.mapping.select_prev_item()"; + "" = "cmp.mapping.select_next_item()"; + "" = "cmp.mapping.select_prev_item()"; + "" = "cmp.mapping.scroll_docs(-4)"; # scroll docs up + "" = "cmp.mapping.scroll_docs(4)"; # scroll docs down + + "" = '' + 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/development/nixvim/plugins/comment.nix b/modules/development/nixvim/plugins/comment.nix new file mode 100644 index 0000000..cc1b9cb --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/default.nix b/modules/development/nixvim/plugins/default.nix new file mode 100644 index 0000000..a263c51 --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/gitsigns.nix b/modules/development/nixvim/plugins/gitsigns.nix new file mode 100644 index 0000000..ea99eba --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/indent-blankline.nix b/modules/development/nixvim/plugins/indent-blankline.nix new file mode 100644 index 0000000..eb2674a --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/lsp.nix b/modules/development/nixvim/plugins/lsp.nix new file mode 100644 index 0000000..7fc3ddd --- /dev/null +++ b/modules/development/nixvim/plugins/lsp.nix @@ -0,0 +1,234 @@ +{ config, lib, ... }: + +# LSP - Language Server Protocol configuration (nvim-lspconfig) +{ + config.programs.nixvim.plugins.lsp = lib.mkIf config.programs.nixvim.enable { + enable = true; + inlayHints = true; + autoLoad = true; + + keymaps.lspBuf = { + K = "hover"; + gD = "references"; + gd = "definition"; + gi = "implementation"; + gt = "type_definition"; + }; + + servers = { + # -- System & Configuration -- + nixd = { + enable = true; + package = null; + }; # Nix + bashls = { + enable = true; + package = null; + }; # Bash/Shell + taplo = { + enable = true; + package = null; + }; # TOML + yamlls = { + enable = true; + package = null; + }; # YAML + jsonls = { + enable = true; + package = null; + }; # JSON + marksman = { + enable = true; + package = null; + }; # Markdown + + # -- Web Development (HTML/CSS/JS/TS) -- + html = { + enable = true; + package = null; + }; # HTML + cssls = { + enable = true; + package = null; + }; # CSS/SCSS/LESS + tailwindcss = { + enable = true; + package = null; + }; # Tailwind CSS + vtsls = { + # JS/TS (Modern fast wrapper for tsserver) + enable = true; + package = null; + settings = { + # Optional but recommended: stops huge generic types from taking over your screen + vtsls.experimental.maxInlayHintLength = 30; + + # TypeScript type inferences + typescript.inlayHints = { + parameterNames.enabled = "all"; + parameterTypes.enabled = true; + variableTypes.enabled = true; + propertyDeclarationTypes.enabled = true; + functionLikeReturnTypes.enabled = true; + enumMemberValues.enabled = true; + }; + + # JavaScript type inferences (via JSDoc) + javascript.inlayHints = { + parameterNames.enabled = "all"; + parameterTypes.enabled = true; + variableTypes.enabled = true; + propertyDeclarationTypes.enabled = true; + functionLikeReturnTypes.enabled = true; + enumMemberValues.enabled = true; + }; + }; + }; + eslint = { + enable = true; + package = null; + }; # ESLint diagnostics/formatting + + # -- Web Frameworks -- + volar = { + # Vue + enable = true; + package = null; + tslsIntegration = false; + }; + svelte = { + enable = true; + package = null; + }; # Svelte + astro = { + enable = true; + package = null; + }; # Astro + + # -- Scripting & High-Level Languages -- + basedpyright = { + # Python (Modern, faster fork of Pyright) + enable = true; + package = null; + settings.basedpyright.analysis.inlayHints = { + variableTypes = true; + callArgumentNames = true; + functionReturnTypes = true; + genericTypes = false; # can get noisy, opt-in + }; + }; + ruff = { + enable = true; + package = null; + }; # Python (Ultra-fast linter/formatter) + ruby_lsp = { + enable = true; + package = null; + }; # Ruby (Shopify's modern standard) + lua_ls = { + # Lua + enable = true; + package = null; + settings.Lua.hint = { + enable = true; + arrayIndex = "Auto"; + setType = true; + paramName = "All"; + paramType = true; + }; + }; + intelephense = { + enable = true; + package = null; + }; # PHP + elixirls = { + enable = true; + package = null; + }; # Elixir + + # -- Systems, Compiled, & Enterprise -- + clangd = { + enable = true; + package = null; + }; # C/C++ (inlay hints on by default) + rust_analyzer = { + # Rust (inlay hints on by default) + enable = true; + package = null; + installCargo = false; + installRustc = false; + }; + gopls = { + # Go + enable = true; + package = null; + settings.gopls.hints = { + assignVariableTypes = true; + compositeLiteralFields = true; + compositeLiteralTypes = true; + constantValues = true; + functionTypeParameters = true; + parameterNames = true; + rangeVariableTypes = true; + }; + }; + zls = { + enable = true; + package = null; + }; # Zig (inlay hints on by default) + jdtls = { + # Java + enable = true; + package = null; + settings.java.inlayHints.parameterNames.enabled = "all"; + }; + kotlin_language_server = { + enable = true; + package = null; + }; # Kotlin + csharp_ls = { + enable = true; + package = null; + }; # C# (.NET) — no inlay hint support + hls = { + # Haskell + enable = true; + package = null; + installGhc = false; + settings.haskell.plugin."inlay-hints".globalOn = true; + }; + ocamllsp = { + enable = true; + package = null; + }; # OCaml + + # -- Infrastructure & DevOps -- + dockerls = { + enable = true; + package = null; + }; # Dockerfile + docker_compose_language_service = { + enable = true; + package = null; + }; # Docker Compose + terraformls = { + enable = true; + package = null; + }; # Terraform/HCL + + # -- Data & APIs -- + sqlls = { + enable = true; + package = null; + }; # SQL + graphql = { + enable = true; + package = null; + }; # GraphQL + prismals = { + enable = true; + package = null; + }; # Prisma ORM + }; + }; +} diff --git a/modules/development/nixvim/plugins/lualine.nix b/modules/development/nixvim/plugins/lualine.nix new file mode 100644 index 0000000..72f34be --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/luasnip.nix b/modules/development/nixvim/plugins/luasnip.nix new file mode 100644 index 0000000..60571e9 --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/noice.nix b/modules/development/nixvim/plugins/noice.nix new file mode 100644 index 0000000..d466506 --- /dev/null +++ b/modules/development/nixvim/plugins/noice.nix @@ -0,0 +1,8 @@ +{ config, lib, ... }: + +# Noice - Modern UI for Neovim (cmdline, popupmenu, messages) +{ + config.programs.nixvim.plugins.noice = lib.mkIf config.programs.nixvim.enable { + enable = true; + }; +} diff --git a/modules/development/nixvim/plugins/nvim-tree.nix b/modules/development/nixvim/plugins/nvim-tree.nix new file mode 100644 index 0000000..2ad6570 --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/telescope.nix b/modules/development/nixvim/plugins/telescope.nix new file mode 100644 index 0000000..b9678fc --- /dev/null +++ b/modules/development/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 = { + "".__raw = "require('telescope.actions').move_selection_previous"; + "".__raw = "require('telescope.actions').move_selection_next"; + "".__raw = "require('telescope.actions').close"; + }; + }; + }; + }; + keymaps = { + # Files + "ff" = { + action = "find_files"; + options.desc = "Find files"; + }; + "fg" = { + action = "live_grep"; + options.desc = "Live grep"; + }; + "fb" = { + action = "buffers"; + options.desc = "Find buffers"; + }; + "fr" = { + action = "oldfiles"; + options.desc = "Recent files"; + }; + + # LSP + "fd" = { + action = "diagnostics"; + options.desc = "Diagnostics"; + }; + "fs" = { + action = "lsp_document_symbols"; + options.desc = "Document symbols"; + }; + + # Git + "gc" = { + action = "git_commits"; + options.desc = "Git commits"; + }; + "gb" = { + action = "git_branches"; + options.desc = "Git branches"; + }; + + # Misc + "fh" = { + action = "help_tags"; + options.desc = "Help tags"; + }; + "fc" = { + action = "commands"; + options.desc = "Commands"; + }; + "fk" = { + action = "keymaps"; + options.desc = "Find keymaps"; + }; + }; + }; +} diff --git a/modules/development/nixvim/plugins/treesitter.nix b/modules/development/nixvim/plugins/treesitter.nix new file mode 100644 index 0000000..035ac7a --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/web-devicons.nix b/modules/development/nixvim/plugins/web-devicons.nix new file mode 100644 index 0000000..3c6ad86 --- /dev/null +++ b/modules/development/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/development/nixvim/plugins/which-key.nix b/modules/development/nixvim/plugins/which-key.nix new file mode 100644 index 0000000..18018e7 --- /dev/null +++ b/modules/development/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/development/opencode/default.nix b/modules/development/opencode/default.nix new file mode 100644 index 0000000..0b3f0b6 --- /dev/null +++ b/modules/development/opencode/default.nix @@ -0,0 +1,19 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Opencode - AI-powered coding assistant (opencode.ai) +{ + config = lib.mkIf config.programs.opencode.enable { + programs.opencode = { + package = pkgs.opencode; + }; + + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/opencode" = "opencode.desktop"; + }; + }; +} diff --git a/modules/development/qemu/default.nix b/modules/development/qemu/default.nix new file mode 100644 index 0000000..b34264c --- /dev/null +++ b/modules/development/qemu/default.nix @@ -0,0 +1,30 @@ +{ + config, + lib, + pkgs, + ... +}: + +# QEMU - generic and open source machine & userspace emulator and virtualizer. +{ + options.programs.qemu = { + enable = lib.mkEnableOption "Enables qemu."; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.symlinkJoin { + name = "qemu-bundle"; + paths = with pkgs; [ + qemu + libvirt + virtiofsd + virt-manager + ]; + }; + description = "Bundle of QEMU-related packages."; + }; + }; + + config = lib.mkIf config.programs.qemu.enable { + home.packages = [ config.programs.qemu.package ]; + }; +} diff --git a/modules/development/vscodium/default.nix b/modules/development/vscodium/default.nix new file mode 100644 index 0000000..a8cbd37 --- /dev/null +++ b/modules/development/vscodium/default.nix @@ -0,0 +1,20 @@ +{ + config, + lib, + pkgs, + ... +}: + +# VSCodium - Visual Studio Code fork +{ + config = lib.mkIf config.programs.vscodium.enable { + programs.vscodium = { + package = pkgs.vscodium; + }; + + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/vscodium" = "vscodium.desktop"; + "text/plain" = "vscodium.desktop"; + }; + }; +} diff --git a/modules/file-management/default.nix b/modules/file-management/default.nix new file mode 100644 index 0000000..7d75b35 --- /dev/null +++ b/modules/file-management/default.nix @@ -0,0 +1,9 @@ +{ ... }: + +{ + imports = [ + ./lf + ./lsd + ./ouch + ]; +} diff --git a/modules/file-management/lf/default.nix b/modules/file-management/lf/default.nix new file mode 100644 index 0000000..47a950f --- /dev/null +++ b/modules/file-management/lf/default.nix @@ -0,0 +1,56 @@ +{ + pkgs, + lib, + config, + ... +}: + +# lf - terminal file manager +{ + config = lib.mkIf config.programs.lf.enable { + xdg.mimeApps.defaultApplications = { + "inode/directory" = "lf.desktop"; + }; + + home.packages = with pkgs; [ + busybox + ]; + + programs.lf = { + package = pkgs.lf.overrideAttrs (old: { + dontWrapQtApps = true; + dontPatchShebangs = true; + }); + + settings = { + number = true; + icons = true; + drawbox = true; + hidden = true; + preview = true; + + shell = "sh"; + 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/file-management/lf/icons b/modules/file-management/lf/icons new file mode 100644 index 0000000..8697cf2 --- /dev/null +++ b/modules/file-management/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/file-management/lf/lfrc b/modules/file-management/lf/lfrc new file mode 100644 index 0000000..7ae847c --- /dev/null +++ b/modules/file-management/lf/lfrc @@ -0,0 +1,168 @@ +# ========================= +# BASIC MOVEMENT (nvim-like) +# ========================= + +map j down +map k up +map h updir +map l open + +map gg top +map G bottom + +map half-up +map half-down + +map page-up +map page-down + +# ========================= +# SELECTION +# ========================= + +map toggle +map v invert +map V select + +# ========================= +# OPENING +# ========================= + +map o open +map open +map L open + +# ========================= +# DIRECTORY NAVIGATION +# ========================= + +map H cd .. +map gh cd ~ +map ge cd / + +# ========================= +# FILE OPERATIONS +# ========================= + +map y copy +map x cut +map p paste + +map d delete + +map a :push %mkdir +map A :push %touch + +map r rename + +# ========================= +# SEARCH +# ========================= + +map / search +map n search-next +map N search-prev + +map f find +map F find-back + +# ========================= +# FILTER +# ========================= + +map zf filter +map zc clear + +# ========================= +# MARKS (vim-style) +# ========================= + +map m mark-save +map ' mark-load + +# ========================= +# HISTORY +# ========================= + +map history-prev +map history-next + +# ========================= +# RELOAD +# ========================= + +map R reload + +# ========================= +# SHELL / COMMANDS +# ========================= + +map ! shell +map : read + +map & shell-async + +# ========================= +# VISUAL MODES / TAGGING +# ========================= + +map t tag +map T tag-toggle + +# ========================= +# SORTING +# ========================= + +map sn set sortby name +map ss set sortby size +map st set sortby time +map se set sortby ext + +# ========================= +# TOGGLES +# ========================= + +map zh set hidden! +map zr set reverse! + +# ========================= +# VIEW +# ========================= + +map zi set info +map zs set preview + +# ========================= +# JUMPS +# ========================= + +map [ jump-prev +map ] jump-next + +# ========================= +# CLIPBOARD-LIKE +# ========================= + +map c clear +map u unselect + +# ========================= +# MULTI-SELECTION NAV +# ========================= + +map J down-select +map K up-select + +# ========================= +# COMMAND MODE SHORTCUTS +# ========================= + +map w :write +map q quit +map Q quit! + +# ========================= +# FILE INFO +# ========================= + +map i info diff --git a/modules/file-management/lsd/default.nix b/modules/file-management/lsd/default.nix new file mode 100644 index 0000000..99fe1bd --- /dev/null +++ b/modules/file-management/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/file-management/ouch/default.nix b/modules/file-management/ouch/default.nix new file mode 100644 index 0000000..2b4411e --- /dev/null +++ b/modules/file-management/ouch/default.nix @@ -0,0 +1,18 @@ +{ + pkgs, + lib, + config, + ... +}: + +# Ouch! - CLI tool for compressing and decompressing various formats. +{ + options.programs.ouch = { + enable = lib.mkEnableOption "Enables ouch."; + package = lib.mkPackageOption pkgs "ouch" { }; + }; + + config = lib.mkIf config.programs.ouch.enable { + home.packages = [ config.programs.ouch.package ]; + }; +} diff --git a/modules/media/default.nix b/modules/media/default.nix new file mode 100644 index 0000000..a26aa08 --- /dev/null +++ b/modules/media/default.nix @@ -0,0 +1,14 @@ +{ ... }: + +{ + imports = [ + ./feh + ./ffmpeg + ./impala + ./maim + ./pamixer + ./playerctl + ./slop + ./vlc + ]; +} diff --git a/modules/media/feh/default.nix b/modules/media/feh/default.nix new file mode 100644 index 0000000..401a68a --- /dev/null +++ b/modules/media/feh/default.nix @@ -0,0 +1,27 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Feh - Lightweight image viewer and wallpaper setter +{ + config = lib.mkIf config.programs.feh.enable { + programs.feh = { + package = pkgs.feh; + }; + + xdg.mimeApps.defaultApplications = { + "image/bmp" = "feh.desktop"; + "image/gif" = "feh.desktop"; + "image/jpeg" = "feh.desktop"; + "image/png" = "feh.desktop"; + "image/tiff" = "feh.desktop"; + "image/webp" = "feh.desktop"; + "image/x-bmp" = "feh.desktop"; + "image/x-png" = "feh.desktop"; + "image/x-tga" = "feh.desktop"; + }; + }; +} diff --git a/modules/media/ffmpeg/default.nix b/modules/media/ffmpeg/default.nix new file mode 100644 index 0000000..d86b5a6 --- /dev/null +++ b/modules/media/ffmpeg/default.nix @@ -0,0 +1,18 @@ +{ + config, + pkgs, + lib, + ... +}: + +# FFmpeg - Command-line audio/video converter and streaming tool +{ + options.programs.ffmpeg = { + enable = lib.mkEnableOption "Enables ffmpeg."; + package = lib.mkPackageOption pkgs "ffmpeg-full" { }; + }; + + config = lib.mkIf config.programs.ffmpeg.enable { + home.packages = [ config.programs.ffmpeg.package ]; + }; +} diff --git a/modules/media/impala/default.nix b/modules/media/impala/default.nix new file mode 100644 index 0000000..9c4d1f4 --- /dev/null +++ b/modules/media/impala/default.nix @@ -0,0 +1,26 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Impala - Apache Impala: SQL query engine for Apache Hadoop +{ + options.programs.impala = { + enable = lib.mkEnableOption "Enables impala."; + package = lib.mkPackageOption pkgs "impala" { }; + }; + + config = lib.mkIf config.programs.impala.enable { + home.packages = [ config.programs.impala.package ]; + + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/impala" = "impala.desktop"; + "audio/mpeg" = "impala.desktop"; + "audio/ogg" = "impala.desktop"; + "audio/flac" = "impala.desktop"; + "audio/x-flac" = "impala.desktop"; + }; + }; +} diff --git a/modules/media/maim/default.nix b/modules/media/maim/default.nix new file mode 100644 index 0000000..3e30c88 --- /dev/null +++ b/modules/media/maim/default.nix @@ -0,0 +1,18 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Maim - Screenshot utility (slop-based region selection) +{ + options.programs.maim = { + enable = lib.mkEnableOption "Enables maim."; + package = lib.mkPackageOption pkgs "maim" { }; + }; + + config = lib.mkIf config.programs.maim.enable { + home.packages = [ config.programs.maim.package ]; + }; +} diff --git a/modules/media/pamixer/default.nix b/modules/media/pamixer/default.nix new file mode 100644 index 0000000..b84e9cf --- /dev/null +++ b/modules/media/pamixer/default.nix @@ -0,0 +1,18 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Pamixer - PulseAudio command-line mixer (volume control) +{ + options.programs.pamixer = { + enable = lib.mkEnableOption "Enables pamixer."; + package = lib.mkPackageOption pkgs "pamixer" { }; + }; + + config = lib.mkIf config.programs.pamixer.enable { + home.packages = [ config.programs.pamixer.package ]; + }; +} diff --git a/modules/media/playerctl/default.nix b/modules/media/playerctl/default.nix new file mode 100644 index 0000000..d501abd --- /dev/null +++ b/modules/media/playerctl/default.nix @@ -0,0 +1,18 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Playerctl - CLI for controlling media players (Spotify, MPRIS, etc.) +{ + options.programs.playerctl = { + enable = lib.mkEnableOption "Enables playerctl."; + package = lib.mkPackageOption pkgs "playerctl" { }; + }; + + config = lib.mkIf config.programs.playerctl.enable { + home.packages = [ config.programs.playerctl.package ]; + }; +} diff --git a/modules/media/slop/default.nix b/modules/media/slop/default.nix new file mode 100644 index 0000000..c86181b --- /dev/null +++ b/modules/media/slop/default.nix @@ -0,0 +1,18 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Slop - Region selector for screenshots (used by maim/flameshot) +{ + options.programs.slop = { + enable = lib.mkEnableOption "Enables slop."; + package = lib.mkPackageOption pkgs "slop" { }; + }; + + config = lib.mkIf config.programs.slop.enable { + home.packages = [ config.programs.slop.package ]; + }; +} diff --git a/modules/media/vlc/default.nix b/modules/media/vlc/default.nix new file mode 100644 index 0000000..8069f3e --- /dev/null +++ b/modules/media/vlc/default.nix @@ -0,0 +1,37 @@ +{ + config, + lib, + pkgs, + ... +}: + +# VLC - Versatile multimedia player for audio/video playback +{ + options.programs.vlc = { + enable = lib.mkEnableOption "Enables vlc."; + package = lib.mkPackageOption pkgs "vlc" { }; + }; + + config = lib.mkIf config.programs.vlc.enable { + home.packages = [ config.programs.vlc.package ]; + + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/vlc" = "vlc.desktop"; + "video/mp4" = "vlc.desktop"; + "video/mpeg" = "vlc.desktop"; + "video/x-matroska" = "vlc.desktop"; + "video/x-msvideo" = "vlc.desktop"; + "video/quicktime" = "vlc.desktop"; + "video/webm" = "vlc.desktop"; + "video/x-ms-wmv" = "vlc.desktop"; + "video/x-flv" = "vlc.desktop"; + "video/ogg" = "vlc.desktop"; + "audio/mpeg" = "vlc.desktop"; + "audio/ogg" = "vlc.desktop"; + "audio/x-wav" = "vlc.desktop"; + "audio/x-flac" = "vlc.desktop"; + "audio/mp4" = "vlc.desktop"; + "audio/x-matroska" = "vlc.desktop"; + }; + }; +} diff --git a/modules/office/default.nix b/modules/office/default.nix new file mode 100644 index 0000000..73f837b --- /dev/null +++ b/modules/office/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + imports = [ + ./zathura + ]; +} diff --git a/modules/office/zathura/default.nix b/modules/office/zathura/default.nix new file mode 100644 index 0000000..167b04f --- /dev/null +++ b/modules/office/zathura/default.nix @@ -0,0 +1,25 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Zathura - Minimalistic document viewer (PDF, DJVU, etc.) +{ + config = lib.mkIf config.programs.zathura.enable { + programs.zathura = { + package = pkgs.zathura; + }; + + xdg.mimeApps.defaultApplications = { + "application/pdf" = "zathura.desktop"; + "application/x-pdf" = "zathura.desktop"; + "image/vnd.djvu" = "zathura.desktop"; + "application/epub+zip" = "zathura.desktop"; + "application/postscript" = "zathura.desktop"; + "application/vnd.comicbook+zip" = "zathura.desktop"; + "application/vnd.comicbook-rar" = "zathura.desktop"; + }; + }; +} diff --git a/modules/programs/aria2/default.nix b/modules/programs/aria2/default.nix deleted file mode 100644 index 79c6f8e..0000000 --- a/modules/programs/aria2/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - pkgs, - lib, - config, - ... -}: - -# Aria2 - command line download manager -{ - config = lib.mkIf config.programs.aria2.enable { - programs.aria2 = { - package = pkgs.aria2; - settings = { - dir = "${config.home.homeDirectory}/Downloads"; - }; - }; - }; -} diff --git a/modules/programs/bat/base16.mustache.tmTheme b/modules/programs/bat/base16.mustache.tmTheme deleted file mode 100644 index 6b2cd5b..0000000 --- a/modules/programs/bat/base16.mustache.tmTheme +++ /dev/null @@ -1,534 +0,0 @@ - - - - - name - OneDark Dark - author - olimorris (https://github.com/olimorris) - settings - - - - - settings - - background - #{{base00}} - foreground - #{{base05}} - caret - #{{base05}} - invisibles - #{{base03}} - lineHighlight - #{{base01}} - selection - #{{base02}} - selectionBorder - #{{base03}} - findHighlight - #{{base0A}} - findHighlightForeground - #{{base00}} - activeGuide - #{{base03}} - bracketsForeground - #{{base05}} - bracketsOptions - underline - bracketContentsForeground - #{{base05}} - bracketContentsOptions - underline - tagsOptions - stippled_underline - gutterForeground - #{{base03}} - gutter - #{{base01}} - - - - - - name - Comment - scope - comment, punctuation.definition.comment - settings - - foreground - #{{base03}} - fontStyle - italic - - - - - - name - Variable - scope - variable, variable.other - settings - - foreground - #{{base05}} - - - - - name - Variable - Language - scope - variable.language - settings - - foreground - #{{base0E}} - fontStyle - italic - - - - - - name - Keyword - scope - keyword, keyword.control - settings - - foreground - #{{base0E}} - - - - - name - Keyword - Operator - scope - keyword.operator - settings - - foreground - #{{base0C}} - - - - - - name - Storage - scope - storage, storage.type, storage.modifier - settings - - foreground - #{{base0E}} - - - - - - name - Constant - scope - constant, constant.other - settings - - foreground - #{{base09}} - - - - - name - Constant - Numeric - scope - constant.numeric - settings - - foreground - #{{base09}} - - - - - name - Constant - Language - scope - constant.language - settings - - foreground - #{{base09}} - - - - - name - Constant - Character Escape - scope - constant.character.escape - settings - - foreground - #{{base0C}} - - - - - - name - String - scope - string - settings - - foreground - #{{base0B}} - - - - - name - String - Punctuation - scope - punctuation.definition.string - settings - - foreground - #{{base0B}} - - - - - - name - Support - Function - scope - support.function - settings - - foreground - #{{base0D}} - - - - - name - Support - Class - scope - support.class - settings - - foreground - #{{base0A}} - - - - - name - Support - Type - scope - support.type - settings - - foreground - #{{base0C}} - - - - - name - Support - Constant - scope - support.constant - settings - - foreground - #{{base09}} - - - - - - name - Entity - Name - Function - scope - entity.name.function - settings - - foreground - #{{base0D}} - - - - - name - Entity - Name - Class / Type - scope - entity.name.class, entity.name.type, entity.name.type.class - settings - - foreground - #{{base0A}} - - - - - name - Entity - Name - Tag - scope - entity.name.tag - settings - - foreground - #{{base08}} - - - - - name - Entity - Other - Attribute Name - scope - entity.other.attribute-name - settings - - foreground - #{{base09}} - - - - - name - Entity - Other - Inherited Class - scope - entity.other.inherited-class - settings - - foreground - #{{base0A}} - fontStyle - italic - - - - - - name - Punctuation - scope - punctuation - settings - - foreground - #{{base05}} - - - - - name - Punctuation - Section - scope - punctuation.section, meta.brace - settings - - foreground - #{{base05}} - - - - - - name - Invalid - scope - invalid - settings - - foreground - #{{base07}} - background - #{{base08}} - - - - - name - Invalid - Deprecated - scope - invalid.deprecated - settings - - foreground - #{{base07}} - background - #{{base0F}} - - - - - - name - Diff - Inserted - scope - markup.inserted - settings - - foreground - #{{base0B}} - - - - - name - Diff - Deleted - scope - markup.deleted - settings - - foreground - #{{base08}} - - - - - name - Diff - Changed - scope - markup.changed - settings - - foreground - #{{base0E}} - - - - - - name - Markup - Heading - scope - markup.heading, entity.name.section - settings - - foreground - #{{base0D}} - fontStyle - bold - - - - - name - Markup - Bold - scope - markup.bold - settings - - foreground - #{{base09}} - fontStyle - bold - - - - - name - Markup - Italic - scope - markup.italic - settings - - foreground - #{{base0E}} - fontStyle - italic - - - - - name - Markup - Inline Code - scope - markup.inline.raw, markup.raw.inline - settings - - foreground - #{{base0C}} - - - - - name - Markup - Link - scope - markup.underline.link, string.other.link - settings - - foreground - #{{base0D}} - fontStyle - underline - - - - - name - Markup - Quote - scope - markup.quote - settings - - foreground - #{{base0B}} - fontStyle - italic - - - - - name - Markup - List - scope - markup.list, punctuation.definition.list - settings - - foreground - #{{base08}} - - - - - - name - Meta - Function Call - scope - meta.function-call - settings - - foreground - #{{base0D}} - - - - - name - Meta - Preprocessor - scope - meta.preprocessor - settings - - foreground - #{{base09}} - - - - - uuid - a6f0d8c2-3b1e-4f5a-9c7d-2e8b0f4a6d1c - - diff --git a/modules/programs/bat/default.nix b/modules/programs/bat/default.nix deleted file mode 100644 index 3c962a3..0000000 --- a/modules/programs/bat/default.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ - 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 deleted file mode 100644 index a2a97ec..0000000 --- a/modules/programs/bluetui/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Bluetui - Terminal UI for Bluetooth management -{ - options.programs.bluetui = { - enable = lib.mkEnableOption "Enables bluetui."; - package = lib.mkPackageOption pkgs "bluetui" { }; - }; - - config = lib.mkIf config.programs.bluetui.enable { - home.packages = [ config.programs.bluetui.package ]; - }; -} diff --git a/modules/programs/bottom/default.nix b/modules/programs/bottom/default.nix deleted file mode 100644 index 3ecda86..0000000 --- a/modules/programs/bottom/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Bottom - Cross-platform graphical process/system monitor (Rust-based) -{ - config = lib.mkIf config.programs.bottom.enable { - programs.bottom = { - package = pkgs.bottom; - }; - }; -} diff --git a/modules/programs/brave/default.nix b/modules/programs/brave/default.nix deleted file mode 100644 index 936da6a..0000000 --- a/modules/programs/brave/default.nix +++ /dev/null @@ -1,86 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -{ - config = lib.mkIf config.programs.brave.enable { - programs.brave = { - package = pkgs.brave; - - commandLineArgs = [ - "--enable-features=BraveUltraDarkTheme" - "--force-device-scale-factor=1.15" - ]; - - extensions = [ - { id = "nngceckbapebfimnlniiiahkandclblb"; } # Bitwarden - { id = "mpkodccbngfoacfalldjimigbofkhgjn"; } # Aria2 Explorer - { id = "eimadpbcbfnmbkopoojfekhnkhdbieeh"; } # Dark Reader - { id = "hpejmncgbammabkkodflfeekpcicfjnk"; } # Quite Black - ]; - }; - - xdg.configFile."BraveSoftware/Brave-Browser/policies/managed/policy.json" = { - text = builtins.toJSON { - RestoreOnStartup = 1; - DefaultNotificationsSetting = 2; - ForceDarkMode = true; - DefaultCookiesSetting = 1; - PasswordManagerEnabled = false; - }; - }; - - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/http" = "brave-browser.desktop"; - "x-scheme-handler/https" = "brave-browser.desktop"; - "x-scheme-handler/chrome" = "brave-browser.desktop"; - "text/html" = "brave-browser.desktop"; - "application/xhtml+xml" = "brave-browser.desktop"; - }; - - xdg.configFile."BraveSoftware/Brave-Browser/Default/Preferences" = { - force = true; - text = builtins.toJSON { - brave = { - darker_mode = false; - enable_window_closing_confirm = false; - tabs = { - vertical_tabs_enabled = true; - vertical_tabs_collapsed = true; - vertical_tabs_floating_enabled = false; - always_hide_tab_close_button = true; - }; - show_side_panel_button = false; - ai_chat = { - show_toolbar_button = false; - }; - wallet = { - show_wallet_icon_on_toolbar = false; - }; - }; - browser = { - show_full_urls = true; - }; - credentials_enable_service = false; - credentials_enable_autosignin = false; - extensions = { - pinned_extensions = [ - "nngceckbapebfimnlniiiahkandclblb" - "eimadpbcbfnmbkopoojfekhnkhdbieeh" - ]; - ui = { - developer_mode = true; - }; - }; - profile = { - default_content_setting_values = { - notifications = 2; - }; - }; - }; - }; - }; -} diff --git a/modules/programs/brightnessctl/default.nix b/modules/programs/brightnessctl/default.nix deleted file mode 100644 index cea3517..0000000 --- a/modules/programs/brightnessctl/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# brightnessctl - Backlight brightness control tool -{ - options.programs.brightnessctl = { - enable = lib.mkEnableOption "Enables brightnessctl."; - package = lib.mkPackageOption pkgs "brightnessctl" { }; - }; - - config = lib.mkIf config.programs.brightnessctl.enable { - home.packages = [ config.programs.brightnessctl.package ]; - }; -} diff --git a/modules/programs/bruno/default.nix b/modules/programs/bruno/default.nix deleted file mode 100644 index 7205f31..0000000 --- a/modules/programs/bruno/default.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Bruno - Open-source API client for testing HTTP endpoints -{ - options.programs.bruno = { - enable = lib.mkEnableOption "Enables bruno."; - package = lib.mkPackageOption pkgs "bruno" { }; - }; - - config = lib.mkIf config.programs.bruno.enable { - home.packages = [ config.programs.bruno.package ]; - - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/bruno" = "bruno.desktop"; - }; - }; -} diff --git a/modules/programs/default.nix b/modules/programs/default.nix deleted file mode 100644 index 4039f0b..0000000 --- a/modules/programs/default.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ ... }: - -# Tools - Collection of tool configurations (browsers, editors, utilities, etc.) -{ - imports = [ - ./aria2 - ./bat - ./bluetui - ./bottom - ./brave - ./brightnessctl - ./bruno - ./delta - ./enteauth - ./feh - ./ffmpeg - ./fzf - ./git - ./gpg - ./htop - ./impala - ./kitty - ./lazygit - ./less - ./lf - ./lsd - ./maim - ./neomutt - ./nixvim - ./nvtop - ./opencode - ./ssh - ./openvpn - ./ouch - ./pamixer - ./gopass - ./email - ./playerctl - ./qemu - ./slop - ./starship - ./systemctl-tui - ./tmux - ./tor - ./vlc - ./vscodium - ./zathura - ./zsh - ]; - - config = { - xdg.mimeApps = { - enable = true; - }; - }; -} diff --git a/modules/programs/delta/default.nix b/modules/programs/delta/default.nix deleted file mode 100644 index 90e35d4..0000000 --- a/modules/programs/delta/default.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ - config, - lib, - ... -}: -# Delta - A syntax-highlighting pager for git, diff, and grep output -{ - config = lib.mkIf config.programs.delta.enable { - programs.delta.options = { - line-numbers = true; - hunk-header-style = "omit"; - hunk-header-decoration-style = "omit"; - line-numbers-left-format = "{nm}│ "; - line-numbers-right-format = "{np}│ "; - }; - - programs.git.settings = lib.mkIf config.programs.git.enable { - core.pager = "delta"; - interactive.diffFilter = "delta --color-only"; - delta.navigate = true; - }; - - programs.lazygit.settings = lib.mkIf config.programs.lazygit.enable { - git.pagers = [ - { - colorArg = "always"; - pager = "delta --paging=never {{diffArgs}}"; - } - ]; - }; - }; -} diff --git a/modules/programs/email/default.nix b/modules/programs/email/default.nix deleted file mode 100644 index 3a57cf0..0000000 --- a/modules/programs/email/default.nix +++ /dev/null @@ -1,24 +0,0 @@ -# email - Mbsync and notmuch mail synchronization -{ - config, - lib, - ... -}: - -let - mailDir = "${config.home.homeDirectory}/.local/share/mail"; -in -{ - options.programs.email = { - enable = lib.mkEnableOption "Email suite (mbsync + notmuch)"; - }; - - config = lib.mkIf config.programs.email.enable { - programs.mbsync.enable = true; - programs.notmuch.enable = true; - - accounts.email.maildirBasePath = mailDir; - - home.sessionVariables.MAILDIR = mailDir; - }; -} diff --git a/modules/programs/enteauth/default.nix b/modules/programs/enteauth/default.nix deleted file mode 100644 index a332bf3..0000000 --- a/modules/programs/enteauth/default.nix +++ /dev/null @@ -1,61 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Ente Auth - end-to-end encrypted authentication (2FA) -let - enteAuthWithKeyring = pkgs.symlinkJoin { - name = "ente-auth-wrapped"; - paths = [ pkgs.ente-auth ]; - buildInputs = [ pkgs.makeWrapper ]; - postBuild = '' - wrapProgram $out/bin/enteauth \ - --prefix PATH : ${ - lib.makeBinPath [ - pkgs.gnome-keyring - pkgs.dbus - ] - } \ - --run "echo 'password' | ${pkgs.gnome-keyring}/bin/gnome-keyring-daemon --unlock --components=secrets" - - rm -rf $out/share/applications/* - - ln -s ${customDesktopItem}/share/applications/* $out/share/applications/ - ''; - }; - - customDesktopItem = pkgs.makeDesktopItem { - name = "enteauth"; - exec = "enteauth"; - icon = "io.ente.auth"; - comment = "End-to-end encrypted 2FA authenticator"; - desktopName = "Ente Auth"; - genericName = "2FA Authenticator"; - categories = [ - "Utility" - "Security" - ]; - terminal = false; - }; -in -{ - options.programs.enteauth = { - enable = lib.mkEnableOption "Enables wrapped ente-auth with automated keyring unlocks and a desktop entry."; - package = lib.mkOption { - type = lib.types.package; - default = enteAuthWithKeyring; - description = "The customized version of ente-auth with a self-unlocking daemon backend."; - }; - }; - - config = lib.mkIf config.programs.enteauth.enable { - home.packages = [ config.programs.enteauth.package ]; - - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/enteauth" = "enteauth.desktop"; - }; - }; -} diff --git a/modules/programs/feh/default.nix b/modules/programs/feh/default.nix deleted file mode 100644 index 401a68a..0000000 --- a/modules/programs/feh/default.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Feh - Lightweight image viewer and wallpaper setter -{ - config = lib.mkIf config.programs.feh.enable { - programs.feh = { - package = pkgs.feh; - }; - - xdg.mimeApps.defaultApplications = { - "image/bmp" = "feh.desktop"; - "image/gif" = "feh.desktop"; - "image/jpeg" = "feh.desktop"; - "image/png" = "feh.desktop"; - "image/tiff" = "feh.desktop"; - "image/webp" = "feh.desktop"; - "image/x-bmp" = "feh.desktop"; - "image/x-png" = "feh.desktop"; - "image/x-tga" = "feh.desktop"; - }; - }; -} diff --git a/modules/programs/ffmpeg/default.nix b/modules/programs/ffmpeg/default.nix deleted file mode 100644 index d86b5a6..0000000 --- a/modules/programs/ffmpeg/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: - -# FFmpeg - Command-line audio/video converter and streaming tool -{ - options.programs.ffmpeg = { - enable = lib.mkEnableOption "Enables ffmpeg."; - package = lib.mkPackageOption pkgs "ffmpeg-full" { }; - }; - - config = lib.mkIf config.programs.ffmpeg.enable { - home.packages = [ config.programs.ffmpeg.package ]; - }; -} diff --git a/modules/programs/fzf/assertions.nix b/modules/programs/fzf/assertions.nix deleted file mode 100644 index 7c2e79c..0000000 --- a/modules/programs/fzf/assertions.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ config, ... }: -{ - assertions = [ - { - assertion = - !config.programs.fzf.enable || config.programs.zsh.enable || config.programs.bash.enable; - message = '' - programs.fzf is enabled but neither programs.zsh.enable nor programs.bash.enable is set. - fzf shell integration requires zsh or bash. Please enable at least one. - ''; - } - ]; -} diff --git a/modules/programs/fzf/default.nix b/modules/programs/fzf/default.nix deleted file mode 100644 index 7671b3c..0000000 --- a/modules/programs/fzf/default.nix +++ /dev/null @@ -1,51 +0,0 @@ -{ config, lib, ... }: - -# FZF - Fuzzy finder, CLI fuzzy search tool -{ - imports = [ ./assertions.nix ]; - - 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/assertions.nix b/modules/programs/git/assertions.nix deleted file mode 100644 index fbe5d3c..0000000 --- a/modules/programs/git/assertions.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ config, ... }: -{ - assertions = [ - { - assertion = - !config.programs.git.useSSH || (config.programs.git.enable && config.programs.ssh.enable); - message = '' - programs.git.useSSH is enabled but programs.ssh.enable is not. - SSH must be enabled (programs.ssh.enable = true) to use SSH for git. - ''; - } - ]; -} diff --git a/modules/programs/git/default.nix b/modules/programs/git/default.nix deleted file mode 100644 index c1aade5..0000000 --- a/modules/programs/git/default.nix +++ /dev/null @@ -1,112 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Git - Distributed version control system -{ - imports = [ - ./assertions.nix - ] - ++ lib.optional (builtins.pathExists ../../private/git.nix) ../../private/git.nix; - - options.programs.git = { - username = lib.mkOption { - type = lib.types.str; - description = "Git username."; - }; - - email = lib.mkOption { - type = lib.types.str; - description = "Git email."; - }; - - useSSH = lib.mkEnableOption "Use SSH instead of HTTPS for common git platforms."; - }; - - config = lib.mkIf config.programs.git.enable { - home.packages = with pkgs; [ - git-graph - ]; - - xdg.configFile."git-graph/models/custom.toml".text = '' - persistence = [ - '^(master|main|trunk)$', - '^(develop|dev)$', - '^feature.*$', - '^release.*$', - '^hotfix.*$', - '^bugfix.*$', - ] - - order = [ - '^(master|main|trunk)$', - '^(hotfix|release).*$', - '^(develop|dev)$', - ] - - [terminal_colors] - matches = [ - ['^(master|main|trunk)$', ['bright_blue']], - ['^(develop|dev)$', ['bright_yellow']], - ['^(feature|fork/).*$', ['bright_magenta', 'bright_cyan']], - ['^release.*$', ['bright_green']], - ['^(bugfix|hotfix).*$', ['bright_red']], - ['^tags/.*$', ['bright_green']], - ] - # Everything else (e.g. custom/service branches) cycles through these instead of all being white - unknown = ['bright_white', 'bright_red', 'bright_green', 'bright_yellow', 'bright_blue', 'bright_magenta', 'bright_cyan'] - - [svg_colors] - matches = [ - ['^(master|main|trunk)$', ['blue']], - ['^(develop|dev)$', ['orange']], - ['^(feature|fork/).*$', ['magenta', 'cyan']], - ['^release.*$', ['green']], - ['^(bugfix|hotfix).*$', ['red']], - ['^tags/.*$', ['green']], - ] - unknown = ['gray', 'purple', 'teal', 'brown'] - ''; - - programs.git = { - settings = - lib.recursiveUpdate - { - user = { - name = config.programs.git.username; - email = config.programs.git.email; - }; - core.askPass = ""; - alias = { - # The exclamation mark (!) tells Git to execute this as an external shell command. - # This overrides standard git-graph behavior with your custom format string. - log-graph = '' - !f() { - fmt=$(printf '\033[1;34mCommit:\033[0m \033[33m%%h\033[0m \033[91m%%d\033[0m%%n\033[1;34mParents:\033[0m \033[35m%%p\033[0m%%n\033[1;34mAuthor:\033[0m \033[32m%%an\033[0m <\033[96m%%ae\033[0m>%%n\033[1;34mDate:\033[0m \033[36m%%ad (%%ar)\033[0m%%n%%n%%B%%n\033[90m--------------------------------------------------------\033[0m') - git-graph --model custom --color always --sparse --style round --format="$fmt" - }; f | less -R - ''; - # Same formatting, but no pager — meant for embedding (lazygit, etc.) - log-graph-embed = '' - !f() { - fmt=$(printf '\033[1;34mCommit:\033[0m \033[33m%%h\033[0m \033[91m%%d\033[0m%%n\033[1;34mParents:\033[0m \033[35m%%p\033[0m%%n\033[1;34mAuthor:\033[0m \033[32m%%an\033[0m <\033[96m%%ae\033[0m>%%n\033[1;34mDate:\033[0m \033[36m%%ad (%%ar)\033[0m%%n%%n%%B%%n\033[90m--------------------------------------------------------\033[0m') - git-graph --model custom --color always --sparse --style round --no-pager --format="$fmt" - }; f - ''; - }; - } - ( - lib.optionalAttrs config.programs.git.useSSH { - url."git@github.com:".insteadOf = "https://github.com/"; - url."git@gitlab.com:".insteadOf = "https://gitlab.com/"; - url."git@bitbucket.org:".insteadOf = "https://bitbucket.org/"; - url."git@codeberg.org:".insteadOf = "https://codeberg.org/"; - url."git@git.sr.ht:".insteadOf = "https://git.sr.ht/"; - } - ); - }; - }; -} diff --git a/modules/programs/gopass/default.nix b/modules/programs/gopass/default.nix deleted file mode 100644 index 3990f7f..0000000 --- a/modules/programs/gopass/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -# gopass - Standard Unix password manager (Go implementation) -{ - config, - lib, - pkgs, - ... -}: - -{ - options.programs.gopass = { - enable = lib.mkEnableOption "Enables gopass."; - - package = lib.mkOption { - type = lib.types.package; - default = pkgs.gopass.override { passAlias = true; }; - defaultText = lib.literalExpression "pkgs.gopass.override { passAlias = true; }"; - description = "The gopass package to use."; - }; - }; - - config = lib.mkIf config.programs.gopass.enable { - programs.password-store = { - enable = true; - package = config.programs.gopass.package; - settings = { - PASSWORD_STORE_DIR = "${config.home.homeDirectory}/.local/share/pass"; - }; - }; - }; -} diff --git a/modules/programs/gpg/default.nix b/modules/programs/gpg/default.nix deleted file mode 100644 index 858f79f..0000000 --- a/modules/programs/gpg/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# gpg - GNU Privacy Guard -{ - config = lib.mkIf config.programs.gpg.enable { - services.gpg-agent = { - enable = true; - enableZshIntegration = true; - defaultCacheTtl = 3600; - maxCacheTtl = 86400; - enableSshSupport = config.programs.ssh.enable; - pinentry.package = pkgs.pinentry-gtk2; - }; - }; -} diff --git a/modules/programs/htop/default.nix b/modules/programs/htop/default.nix deleted file mode 100644 index 7781464..0000000 --- a/modules/programs/htop/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ - 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 deleted file mode 100644 index 9c4d1f4..0000000 --- a/modules/programs/impala/default.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Impala - Apache Impala: SQL query engine for Apache Hadoop -{ - options.programs.impala = { - enable = lib.mkEnableOption "Enables impala."; - package = lib.mkPackageOption pkgs "impala" { }; - }; - - config = lib.mkIf config.programs.impala.enable { - home.packages = [ config.programs.impala.package ]; - - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/impala" = "impala.desktop"; - "audio/mpeg" = "impala.desktop"; - "audio/ogg" = "impala.desktop"; - "audio/flac" = "impala.desktop"; - "audio/x-flac" = "impala.desktop"; - }; - }; -} diff --git a/modules/programs/kitty/default.nix b/modules/programs/kitty/default.nix deleted file mode 100644 index 3701180..0000000 --- a/modules/programs/kitty/default.nix +++ /dev/null @@ -1,55 +0,0 @@ -{ - config, - lib, - ... -}: - -# Kitty - GPU-accelerated terminal emulator -{ - config = lib.mkIf config.programs.kitty.enable { - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/terminal" = "kitty.desktop"; - }; - - 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 config.programs.zsh.package); - }; - }; - }; -} diff --git a/modules/programs/lazygit/default.nix b/modules/programs/lazygit/default.nix deleted file mode 100644 index cf46e9a..0000000 --- a/modules/programs/lazygit/default.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ config, lib, ... }: - -# Lazygit - A simple terminal UI for git commands -{ - config = lib.mkIf config.programs.lazygit.enable { - programs.lazygit = { - enableBashIntegration = config.programs.bash.enable; - enableFishIntegration = config.programs.fish.enable; - enableNushellIntegration = config.programs.nushell.enable; - enableZshIntegration = config.programs.zsh.enable; - - settings = { - gui = { - theme = { - lightTheme = false; - }; - showIcons = true; - scrollHeight = 2; - nerdFontsVersion = "3"; - scrollPastBottom = true; - mouseEvents = true; - border = "single"; - }; - git = { - log.showWholeGraph = true; - branchLogCmd = "git log-graph-embed"; - overrideGpg = true; - }; - update.method = "never"; - }; - }; - }; -} diff --git a/modules/programs/less/default.nix b/modules/programs/less/default.nix deleted file mode 100644 index 516377d..0000000 --- a/modules/programs/less/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ config, lib, ... }: - -# less - terminal pager -{ - config = lib.mkIf config.programs.less.enable { - programs.less = { - options = [ - "--RAW-CONTROL-CHARS" - "--quit-if-one-screen" - "--no-init" - "--ignore-case" - ]; - }; - }; -} diff --git a/modules/programs/lf/default.nix b/modules/programs/lf/default.nix deleted file mode 100644 index 47a950f..0000000 --- a/modules/programs/lf/default.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ - pkgs, - lib, - config, - ... -}: - -# lf - terminal file manager -{ - config = lib.mkIf config.programs.lf.enable { - xdg.mimeApps.defaultApplications = { - "inode/directory" = "lf.desktop"; - }; - - home.packages = with pkgs; [ - busybox - ]; - - programs.lf = { - package = pkgs.lf.overrideAttrs (old: { - dontWrapQtApps = true; - dontPatchShebangs = true; - }); - - settings = { - number = true; - icons = true; - drawbox = true; - hidden = true; - preview = true; - - shell = "sh"; - 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 deleted file mode 100644 index 8697cf2..0000000 --- a/modules/programs/lf/icons +++ /dev/null @@ -1,342 +0,0 @@ -# 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 deleted file mode 100644 index 7ae847c..0000000 --- a/modules/programs/lf/lfrc +++ /dev/null @@ -1,168 +0,0 @@ -# ========================= -# BASIC MOVEMENT (nvim-like) -# ========================= - -map j down -map k up -map h updir -map l open - -map gg top -map G bottom - -map half-up -map half-down - -map page-up -map page-down - -# ========================= -# SELECTION -# ========================= - -map toggle -map v invert -map V select - -# ========================= -# OPENING -# ========================= - -map o open -map open -map L open - -# ========================= -# DIRECTORY NAVIGATION -# ========================= - -map H cd .. -map gh cd ~ -map ge cd / - -# ========================= -# FILE OPERATIONS -# ========================= - -map y copy -map x cut -map p paste - -map d delete - -map a :push %mkdir -map A :push %touch - -map r rename - -# ========================= -# SEARCH -# ========================= - -map / search -map n search-next -map N search-prev - -map f find -map F find-back - -# ========================= -# FILTER -# ========================= - -map zf filter -map zc clear - -# ========================= -# MARKS (vim-style) -# ========================= - -map m mark-save -map ' mark-load - -# ========================= -# HISTORY -# ========================= - -map history-prev -map history-next - -# ========================= -# RELOAD -# ========================= - -map R reload - -# ========================= -# SHELL / COMMANDS -# ========================= - -map ! shell -map : read - -map & shell-async - -# ========================= -# VISUAL MODES / TAGGING -# ========================= - -map t tag -map T tag-toggle - -# ========================= -# SORTING -# ========================= - -map sn set sortby name -map ss set sortby size -map st set sortby time -map se set sortby ext - -# ========================= -# TOGGLES -# ========================= - -map zh set hidden! -map zr set reverse! - -# ========================= -# VIEW -# ========================= - -map zi set info -map zs set preview - -# ========================= -# JUMPS -# ========================= - -map [ jump-prev -map ] jump-next - -# ========================= -# CLIPBOARD-LIKE -# ========================= - -map c clear -map u unselect - -# ========================= -# MULTI-SELECTION NAV -# ========================= - -map J down-select -map K up-select - -# ========================= -# COMMAND MODE SHORTCUTS -# ========================= - -map w :write -map q quit -map Q quit! - -# ========================= -# FILE INFO -# ========================= - -map i info diff --git a/modules/programs/lsd/default.nix b/modules/programs/lsd/default.nix deleted file mode 100644 index 99fe1bd..0000000 --- a/modules/programs/lsd/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ 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 deleted file mode 100644 index 3e30c88..0000000 --- a/modules/programs/maim/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Maim - Screenshot utility (slop-based region selection) -{ - options.programs.maim = { - enable = lib.mkEnableOption "Enables maim."; - package = lib.mkPackageOption pkgs "maim" { }; - }; - - config = lib.mkIf config.programs.maim.enable { - home.packages = [ config.programs.maim.package ]; - }; -} diff --git a/modules/programs/neomutt/assertions.nix b/modules/programs/neomutt/assertions.nix deleted file mode 100644 index 989d273..0000000 --- a/modules/programs/neomutt/assertions.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ config, ... }: - -{ - assertions = [ - { - assertion = !config.programs.neomutt.enable || config.programs.less.enable; - message = '' - programs.neomutt is enabled but programs.less.enable is not. - neomutt requires less as its pager. Please enable programs.less. - ''; - } - { - assertion = !config.programs.neomutt.enable || config.programs.bat.enable; - message = '' - programs.neomutt is enabled but programs.bat.enable is not. - neomutt requires bat for text/html filtering. Please enable programs.bat. - ''; - } - { - assertion = !config.programs.neomutt.enable || config.programs.email.enable; - message = '' - programs.neomutt is enabled but programs.email.enable is not. - neomutt requires the email module (mbsync + notmuch) to be enabled. - ''; - } - { - assertion = !config.programs.neomutt.enable || config.programs.kitty.enable; - message = '' - programs.neomutt is enabled but programs.kitty.enable is not. - neomutt's desktop entry requires kitty as the terminal launcher. Please enable programs.kitty. - ''; - } - ]; -} diff --git a/modules/programs/neomutt/default.nix b/modules/programs/neomutt/default.nix deleted file mode 100644 index 3626341..0000000 --- a/modules/programs/neomutt/default.nix +++ /dev/null @@ -1,427 +0,0 @@ -# neomutt - Terminal email client -{ - config, - lib, - pkgs, - ... -}: -let - neomuttDesktopItem = pkgs.makeDesktopItem { - name = "neomutt"; - desktopName = "NeoMutt"; - exec = "${lib.getExe config.programs.kitty.package} -e ${lib.getExe config.programs.neomutt.package}"; - icon = "kitty"; - categories = [ - "Network" - "Email" - ]; - comment = "Terminal email client"; - terminal = false; - type = "Application"; - }; -in -{ - imports = [ - ./assertions.nix - ./theme.nix - ]; - config = lib.mkIf config.programs.neomutt.enable { - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/mailto" = "neomutt.desktop"; - }; - - home.packages = [ - pkgs.urlscan - pkgs.w3m - neomuttDesktopItem - ]; - - xdg.configFile."neomutt/mailcap".text = '' - text/html; w3m -dump -T text/html '%s'; copiousoutput; nametemplate=%s.html - text/html; $BROWSER '%s'; nametemplate=%s.html - image/*; xdg-open '%s' & - application/pdf; xdg-open '%s'; nametemplate=%s.pdf - video/*; xdg-open '%s' & - audio/*; xdg-open '%s' & - application/*; xdg-open '%s' & - ''; - - xdg.configFile."neomutt/flag_legend.txt".text = '' - NeoMutt Index Flags - =================== - - Message state ($flag_chars) -- unchanged defaults - N New - unread, arrived since you last checked - O Old - unread, but seen in a previous session - D Deleted - marked for deletion (pending expunge) - d Att-del - has attachments marked for deletion - ! Flagged - important (toggle with F) - * Tagged - selected for a bulk operation (toggle with t) - r Replied - you've replied to this message - (blank) - read, nothing else notable - - Cryptography ($crypt_chars) -  Verified - signed, and the signature checks out -  Encrypted - PGP/SMIME encrypted -  Signed - PGP/SMIME signed (unverified) -  PGP key - message contains a PGP public key - (blank) - no cryptography info - - Addressing ($to_chars) -  To you only - sent to you and only you -  To (with others) - you're in the To: list, among others -  Cc only - you're only in the Cc: list -  From you - sent by you -  Mailing list - sent to a list you're subscribed to - (blank) - not in To/Cc (e.g. Bcc, unlisted) - - Press q to close. - ''; - - programs.neomutt = { - sidebar.enable = true; - sort = "reverse-threads"; - vimKeys = true; - unmailboxes = true; - checkStatsInterval = 20; - - extraConfig = '' - set menu_scroll = yes - - # cancel any prompt/command-line entry with Esc, vim-style - set abort_key = "" - - # attachments: use our mailcap for dedicated openers, - # and auto-render html/images inline where sensible - set mailcap_path = "~/.config/neomutt/mailcap" - auto_view text/html image/png image/jpeg image/gif application/pdf - ''; - - binds = [ - # --- sidebar navigation (vim: k=up, j=down) --- - { - map = [ - "index" - "pager" - ]; - key = "\\CK"; - action = "sidebar-prev"; - } - { - map = [ - "index" - "pager" - ]; - key = "\\CJ"; - action = "sidebar-next"; - } - { - # select the highlighted mailbox directly, no Ctrl+O needed - map = [ - "index" - "pager" - ]; - key = "o"; - action = "sidebar-open"; - } - - # --- open / go deeper (vim: l = right/forward) --- - { - map = [ "index" ]; - key = ""; - action = "display-message"; - } - { - map = [ "index" ]; - key = "l"; - action = "display-message"; - } - { - map = [ "browser" ]; - key = ""; - action = "select-entry"; - } - { - map = [ "browser" ]; - key = "l"; - action = "select-entry"; - } - { - map = [ "attach" ]; - key = ""; - action = "view-attach"; - } - { - map = [ "attach" ]; - key = "l"; - action = "view-attach"; - } - { - map = [ - "alias" - "query" - ]; - key = ""; - action = "select-entry"; - } - - # --- back / exit (vim: h = left/back) --- - { - map = [ "pager" ]; - key = "h"; - action = "exit"; - } - { - map = [ "browser" ]; - key = "h"; - action = "exit"; - } - { - map = [ "attach" ]; - key = "h"; - action = "exit"; - } - { - map = [ "index" ]; - key = "h"; - action = "collapse-thread"; - } - - # --- pager line scrolling (vim: j/k move by line) --- - { - map = [ "pager" ]; - key = "j"; - action = "next-line"; - } - { - map = [ "pager" ]; - key = "k"; - action = "previous-line"; - } - { - # kept from before: jump straight to the next unread message, - # extends the h/l "back/forward" metaphor already in use - map = [ "pager" ]; - key = "l"; - action = "next-unread"; - } - - # --- top/bottom of buffer (vim: gg/G -- NOT 0/$, which mean - # start/end of *line* in vim and would be a false friend here) --- - { - map = [ "index" ]; - key = "gg"; - action = "first-entry"; - } - { - map = [ "index" ]; - key = "G"; - action = "last-entry"; - } - { - map = [ "pager" ]; - key = "gg"; - action = "top"; - } - { - map = [ "pager" ]; - key = "G"; - action = "bottom"; - } - { - map = [ "browser" ]; - key = "gg"; - action = "first-entry"; - } - { - map = [ "browser" ]; - key = "G"; - action = "last-entry"; - } - - # --- page scrolling (vim: Ctrl-f/b full page, Ctrl-d/u half page) --- - { - map = [ "pager" ]; - key = "\\Cf"; - action = "next-page"; - } - { - map = [ "pager" ]; - key = "\\Cb"; - action = "previous-page"; - } - { - map = [ "pager" ]; - key = "\\Cd"; - action = "half-down"; - } - { - map = [ "pager" ]; - key = "\\Cu"; - action = "half-up"; - } - { - # index has no half-page concept, so Ctrl-d/u fall back to - # the same full-page scroll as Ctrl-f/b - map = [ "index" ]; - key = "\\Cf"; - action = "next-page"; - } - { - map = [ "index" ]; - key = "\\Cb"; - action = "previous-page"; - } - { - map = [ "index" ]; - key = "\\Cd"; - action = "half-down"; - } - { - map = [ "index" ]; - key = "\\Cu"; - action = "half-up"; - } - - # --- search (vim: / forward, ? backward, n/N repeat) --- - { - map = [ - "index" - "pager" - ]; - key = "/"; - action = "search"; - } - { - map = [ - "index" - "pager" - ]; - key = "?"; - action = "search-reverse"; - } - { - map = [ - "index" - "pager" - ]; - key = "n"; - action = "search-next"; - } - { - map = [ - "index" - "pager" - ]; - key = "N"; - action = "search-opposite"; - } - - { - map = [ - "index" - "pager" - ]; - key = "u"; - action = "undelete-message"; - } - - # --- copy (vim: yy yank -- non-destructive, unlike save-message - # which moves/deletes the original) --- - { - map = [ "index" ]; - key = "y"; - action = "noop"; - } - { - map = [ "index" ]; - key = "yy"; - action = "copy-message"; - } - - # --- tagging (vim: v/V visual select single/whole block) --- - # NOTE: this overrides neomutt's default "v" (view-attachments). - # Attachments are still reachable from the pager/index via the - # mailcap auto-view or the attach menu, but if you want plain - # "v" back for view-attachments, just delete these two binds. - { - map = [ "index" ]; - key = "v"; - action = "tag-entry"; - } - { - map = [ "index" ]; - key = "V"; - action = "tag-thread"; - } - - # --- mailbox switching (vim: gt = next tab) --- - { - map = [ "index" ]; - key = "gt"; - action = "next-unread-mailbox"; - } - - # --- filter/limit (vim: gf to 'find' or 'filter') --- - { - map = [ "index" ]; - key = "gf"; - action = "limit"; - } - - # --- filter/limit (vim: gf to 'find' or 'filter') --- - { - map = [ "index" ]; - key = "gF"; - action = "limit"; - } - - # --- help message to show functions and keybindings --- - { - map = [ - "index" - "pager" - "browser" - "attach" - ]; - key = "g?"; - action = "help"; - } - ]; - - macros = [ - { - map = [ - "index" - "pager" - ]; - key = "O"; - action = "mbsync -a"; - } - { - # gx: extract links from the current message and open one, vim-netrw style - map = [ - "index" - "pager" - ]; - key = "gx"; - action = "urlscan"; - } - { - map = [ - "index" - "pager" - ]; - key = "gl"; - action = "less ~/.config/neomutt/flag_legend.txt"; - } - { - # ZZ: save and quit, vim-style (sync mailbox, then quit) - map = [ "index" ]; - key = "ZZ"; - action = ""; - } - ]; - }; - }; -} diff --git a/modules/programs/neomutt/theme.nix b/modules/programs/neomutt/theme.nix deleted file mode 100644 index 52845ee..0000000 --- a/modules/programs/neomutt/theme.nix +++ /dev/null @@ -1,130 +0,0 @@ -{ config, lib, ... }: - -# Colorscheme - True base16 OneDark colors for neomutt -# Leverages Kitty's precise mapping to base16 (color0-15) -{ - config.programs.neomutt.extraConfig = lib.mkIf config.programs.neomutt.enable '' - # vim: filetype=muttrc - # - # Base16 OneDark Dark terminal colors for neomutt - # Each column in the index receives a distinct color to keep the UI organized. - - # Nerd Font icon-based flag/attachment/crypto indicators - # order: new, old, deleted, flagged, replied, old(unused), tagged, encrypt, ... - set flag_chars = "󰓹󰀼󰆴󰁟󰇰󰇮󰍩󰍨󰇱󰗚" - set to_chars = " " - set crypt_chars = " " - set attach_format = "%u%D%I %t%4n %T%.40d %> [%m/%M, %e%?C?, %C?, %s] " - - set index_format = " %5C │ %Z │ %{%d/%m/%y %H:%M} │ %-25.25a │ %s%* " - - # Hide the keybindings help bar at the top to save vertical space - set help = no - - # Status bar with Nerd Font icons per field - set status_format = "  Unread: %5u │ 󰛏 New: %5n │  Tagged: %5t │  Search: %f │  Filter: %v │  Sorted By: %s │" - - # --- Basic UI Colors -------------------------------------------------- - # target foreground background - color normal white default # base05 (Standard text) - color error red default # base08 (Red) - color tilde brightblack default # base03 (Dark Grey) - color message cyan default # base0C (Cyan) - color markers red default # base08 (Red) - color attachment magenta default # base0E (Magenta) - color search magenta default # base0E (Magenta) - color prompt cyan default # base0C (Questions/prompts) - color progress black yellow # 󰦖 base0A bg (Progress bar) - - # Selected row and status bar - color status white brightblack # base05 on base03 - color indicator default brightblack # default on base03 (Selected email) - color tree magenta default # base03 (Thread arrows) - - # Whole-line fallback for the index (base for anything not caught below) - color index white default # base05 - - # --- Index Columns (The Multi-Color Table) ---------------------------- - # Applies distinct colors to specific columns for ALL messages (~A) - color index_number cyan default "~A" # base05 (Fixed: was brightblack) - color index_date green default "~A" # base0B (Green) - color index_flags red default "~A" # base08 (Red) - color index_size cyan default "~A" # 󰈔 base0C (Cyan) - color index_author yellow default "~A" # base0A (Yellow) - color index_subject white default "~A" # base05 (Standard text for Read messages) - color index_collapsed yellow default # base0A (Collapsed thread count, %M) - color index_label magenta default # 󰓹 base0E (Message label, %y %Y) - color index_tag cyan default # base0C (Message tags, %G) - color index_tags cyan default # 󰓼 base0C (Transformed tags, %g %J) - - # --- Index Message States --------------------------------------------- - # By targeting *only* `index_subject`, we preserve your multi-color - # columns while still easily identifying unread or flagged emails. - color index_subject blue default "~U" # Unread: Blue (base0D) - color index_subject blue default "~N" # 󰄯 New: Blue (base0D) - color index_subject red default "~F" # Flagged: Red (base08) - color index_subject magenta default "~Q" # 󰛃 Replied: Magenta (base0E) - color index_subject black red "~D" # Deleted - - # This rule now colors the "email (name)" column as it is considered the 'author' - color index_author yellow default "~A" - color index_subject white default "~A" # %s - - # We removed the ~R (Read) override so it stays white. - # For Deleted (~D), if brightblack is still too dark to see, we can use a red background instead: - color index_subject black red "~D" # Deleted: Black on Red background - - # Thread collapsing states - color index_subject yellow default "~v" # Collapsed thread - color index_subject blue default "~v~(~N)" # 󰝜 Collapsed with unread inside - color index_subject red default "~v~(~F)" # 󰈺 Collapsed with flagged inside - - # Subtle zebra striping between adjacent index rows (barely-there contrast) - color stripe_odd default default - color stripe_even default default - - # --- Message Headers -------------------------------------------------- - color hdrdefault cyan default # base0C - color header yellow default "^(From|To|Cc|Bcc)" # base0A - color header blue default "^(Subject)" # base0D - color header green default "^(Date)" # base03 - - # Attachment header lines (shown above each MIME part in the pager) - color attach_headers cyan default # - - # --- Message Body ----------------------------------------------------- - color quoted blue default # base0D - color quoted1 cyan default # base0C - color quoted2 yellow default # base0A - color quoted3 red default # base08 - color quoted4 magenta default # base0E - color quoted5 blue default # base0D (cycle repeats) - color quoted6 cyan default # base0C - color quoted7 yellow default # base0A - color quoted8 red default # base08 - color quoted9 magenta default # base0E - - color signature green default # 󰛿 base0B - color bold white default # base05 - color underline white default # base05 - - # URLs - color body blue default "([a-z][a-z0-9+-]*://[^ ]+)" - - # PGP - color body green default "(Good signature)" # verified - color body red default "(BAD signature)" # bad - color body brightblack default "^gpg: " # - - # --- Sidebar (was completely unset despite sidebar.enable = true) ----- - set sidebar_format = " %D%* %?N? %N?%?F? %F? " - color sidebar_background default default # transparent, blends with terminal bg - color sidebar_divider white default # base03 (matches old tree color) - color sidebar_ordinary white default # base05 (normal mailbox entries) - color sidebar_new green default # 󰇮 base0B (mailboxes with new mail) - color sidebar_flagged red default # base08 (mailboxes with flagged mail) - color sidebar_spool_file yellow default # 󰇰 base0A (your inbox/spool) - color sidebar_highlight white brightblack # base05 on base03 (cursor position) - color sidebar_indicator default brightblack # default on base03 (currently open mailbox) - ''; -} diff --git a/modules/programs/nixvim/colorscheme.nix b/modules/programs/nixvim/colorscheme.nix deleted file mode 100644 index ba81634..0000000 --- a/modules/programs/nixvim/colorscheme.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ 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 deleted file mode 100644 index c7978d4..0000000 --- a/modules/programs/nixvim/default.nix +++ /dev/null @@ -1,103 +0,0 @@ -{ config, lib, ... }: - -# Nixvim - Neovim configured through Nix (home-manager integration) -{ - imports = [ - ./colorscheme.nix - ./keymaps.nix - ./plugins - ]; - - config = { - 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"; - updatetime = 500; - }; - 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; - }; - - 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 - ''; - } - ]; - }; - }; -} diff --git a/modules/programs/nixvim/keymaps.nix b/modules/programs/nixvim/keymaps.nix deleted file mode 100644 index 4e4b35a..0000000 --- a/modules/programs/nixvim/keymaps.nix +++ /dev/null @@ -1,41 +0,0 @@ -{ config, lib, ... }: - -# Keymaps - Keyboard shortcut configuration for nixvim -{ - config.programs.nixvim.keymaps = lib.mkIf config.programs.nixvim.enable [ - { - key = ""; - action = "h"; - options.desc = "Move to left window"; - } - { - key = ""; - action = "j"; - options.desc = "Move to bottom window"; - } - { - key = ""; - action = "k"; - options.desc = "Move to top window"; - } - { - key = ""; - action = "l"; - options.desc = "Move to right window"; - } - { - key = ""; - action = "NvimTreeToggle"; - mode = [ - "n" - "i" - ]; - options.desc = "Toggle file explorer"; - } - { - key = ""; - action = "NotificationsClear"; - options.desc = "Clear notifications"; - } - ]; -} diff --git a/modules/programs/nixvim/plugins/cmp.nix b/modules/programs/nixvim/plugins/cmp.nix deleted file mode 100644 index 683e0d3..0000000 --- a/modules/programs/nixvim/plugins/cmp.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ 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 = { - "" = "cmp.mapping.complete()"; - "" = "cmp.mapping.confirm({ select = true })"; - "" = "cmp.mapping.select_next_item()"; - "" = "cmp.mapping.select_prev_item()"; - "" = "cmp.mapping.select_next_item()"; - "" = "cmp.mapping.select_prev_item()"; - "" = "cmp.mapping.scroll_docs(-4)"; # scroll docs up - "" = "cmp.mapping.scroll_docs(4)"; # scroll docs down - - "" = '' - 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 deleted file mode 100644 index cc1b9cb..0000000 --- a/modules/programs/nixvim/plugins/comment.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ 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 deleted file mode 100644 index a263c51..0000000 --- a/modules/programs/nixvim/plugins/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ ... }: - -# 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 deleted file mode 100644 index ea99eba..0000000 --- a/modules/programs/nixvim/plugins/gitsigns.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ 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 deleted file mode 100644 index eb2674a..0000000 --- a/modules/programs/nixvim/plugins/indent-blankline.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ 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 deleted file mode 100644 index 7fc3ddd..0000000 --- a/modules/programs/nixvim/plugins/lsp.nix +++ /dev/null @@ -1,234 +0,0 @@ -{ config, lib, ... }: - -# LSP - Language Server Protocol configuration (nvim-lspconfig) -{ - config.programs.nixvim.plugins.lsp = lib.mkIf config.programs.nixvim.enable { - enable = true; - inlayHints = true; - autoLoad = true; - - keymaps.lspBuf = { - K = "hover"; - gD = "references"; - gd = "definition"; - gi = "implementation"; - gt = "type_definition"; - }; - - servers = { - # -- System & Configuration -- - nixd = { - enable = true; - package = null; - }; # Nix - bashls = { - enable = true; - package = null; - }; # Bash/Shell - taplo = { - enable = true; - package = null; - }; # TOML - yamlls = { - enable = true; - package = null; - }; # YAML - jsonls = { - enable = true; - package = null; - }; # JSON - marksman = { - enable = true; - package = null; - }; # Markdown - - # -- Web Development (HTML/CSS/JS/TS) -- - html = { - enable = true; - package = null; - }; # HTML - cssls = { - enable = true; - package = null; - }; # CSS/SCSS/LESS - tailwindcss = { - enable = true; - package = null; - }; # Tailwind CSS - vtsls = { - # JS/TS (Modern fast wrapper for tsserver) - enable = true; - package = null; - settings = { - # Optional but recommended: stops huge generic types from taking over your screen - vtsls.experimental.maxInlayHintLength = 30; - - # TypeScript type inferences - typescript.inlayHints = { - parameterNames.enabled = "all"; - parameterTypes.enabled = true; - variableTypes.enabled = true; - propertyDeclarationTypes.enabled = true; - functionLikeReturnTypes.enabled = true; - enumMemberValues.enabled = true; - }; - - # JavaScript type inferences (via JSDoc) - javascript.inlayHints = { - parameterNames.enabled = "all"; - parameterTypes.enabled = true; - variableTypes.enabled = true; - propertyDeclarationTypes.enabled = true; - functionLikeReturnTypes.enabled = true; - enumMemberValues.enabled = true; - }; - }; - }; - eslint = { - enable = true; - package = null; - }; # ESLint diagnostics/formatting - - # -- Web Frameworks -- - volar = { - # Vue - enable = true; - package = null; - tslsIntegration = false; - }; - svelte = { - enable = true; - package = null; - }; # Svelte - astro = { - enable = true; - package = null; - }; # Astro - - # -- Scripting & High-Level Languages -- - basedpyright = { - # Python (Modern, faster fork of Pyright) - enable = true; - package = null; - settings.basedpyright.analysis.inlayHints = { - variableTypes = true; - callArgumentNames = true; - functionReturnTypes = true; - genericTypes = false; # can get noisy, opt-in - }; - }; - ruff = { - enable = true; - package = null; - }; # Python (Ultra-fast linter/formatter) - ruby_lsp = { - enable = true; - package = null; - }; # Ruby (Shopify's modern standard) - lua_ls = { - # Lua - enable = true; - package = null; - settings.Lua.hint = { - enable = true; - arrayIndex = "Auto"; - setType = true; - paramName = "All"; - paramType = true; - }; - }; - intelephense = { - enable = true; - package = null; - }; # PHP - elixirls = { - enable = true; - package = null; - }; # Elixir - - # -- Systems, Compiled, & Enterprise -- - clangd = { - enable = true; - package = null; - }; # C/C++ (inlay hints on by default) - rust_analyzer = { - # Rust (inlay hints on by default) - enable = true; - package = null; - installCargo = false; - installRustc = false; - }; - gopls = { - # Go - enable = true; - package = null; - settings.gopls.hints = { - assignVariableTypes = true; - compositeLiteralFields = true; - compositeLiteralTypes = true; - constantValues = true; - functionTypeParameters = true; - parameterNames = true; - rangeVariableTypes = true; - }; - }; - zls = { - enable = true; - package = null; - }; # Zig (inlay hints on by default) - jdtls = { - # Java - enable = true; - package = null; - settings.java.inlayHints.parameterNames.enabled = "all"; - }; - kotlin_language_server = { - enable = true; - package = null; - }; # Kotlin - csharp_ls = { - enable = true; - package = null; - }; # C# (.NET) — no inlay hint support - hls = { - # Haskell - enable = true; - package = null; - installGhc = false; - settings.haskell.plugin."inlay-hints".globalOn = true; - }; - ocamllsp = { - enable = true; - package = null; - }; # OCaml - - # -- Infrastructure & DevOps -- - dockerls = { - enable = true; - package = null; - }; # Dockerfile - docker_compose_language_service = { - enable = true; - package = null; - }; # Docker Compose - terraformls = { - enable = true; - package = null; - }; # Terraform/HCL - - # -- Data & APIs -- - sqlls = { - enable = true; - package = null; - }; # SQL - graphql = { - enable = true; - package = null; - }; # GraphQL - prismals = { - enable = true; - package = null; - }; # Prisma ORM - }; - }; -} diff --git a/modules/programs/nixvim/plugins/lualine.nix b/modules/programs/nixvim/plugins/lualine.nix deleted file mode 100644 index 72f34be..0000000 --- a/modules/programs/nixvim/plugins/lualine.nix +++ /dev/null @@ -1,90 +0,0 @@ -{ 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 deleted file mode 100644 index 60571e9..0000000 --- a/modules/programs/nixvim/plugins/luasnip.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ 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 deleted file mode 100644 index d466506..0000000 --- a/modules/programs/nixvim/plugins/noice.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ config, lib, ... }: - -# Noice - Modern UI for Neovim (cmdline, popupmenu, messages) -{ - config.programs.nixvim.plugins.noice = lib.mkIf config.programs.nixvim.enable { - enable = true; - }; -} diff --git a/modules/programs/nixvim/plugins/nvim-tree.nix b/modules/programs/nixvim/plugins/nvim-tree.nix deleted file mode 100644 index 2ad6570..0000000 --- a/modules/programs/nixvim/plugins/nvim-tree.nix +++ /dev/null @@ -1,44 +0,0 @@ -{ 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 deleted file mode 100644 index b9678fc..0000000 --- a/modules/programs/nixvim/plugins/telescope.nix +++ /dev/null @@ -1,85 +0,0 @@ -{ 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 = { - "".__raw = "require('telescope.actions').move_selection_previous"; - "".__raw = "require('telescope.actions').move_selection_next"; - "".__raw = "require('telescope.actions').close"; - }; - }; - }; - }; - keymaps = { - # Files - "ff" = { - action = "find_files"; - options.desc = "Find files"; - }; - "fg" = { - action = "live_grep"; - options.desc = "Live grep"; - }; - "fb" = { - action = "buffers"; - options.desc = "Find buffers"; - }; - "fr" = { - action = "oldfiles"; - options.desc = "Recent files"; - }; - - # LSP - "fd" = { - action = "diagnostics"; - options.desc = "Diagnostics"; - }; - "fs" = { - action = "lsp_document_symbols"; - options.desc = "Document symbols"; - }; - - # Git - "gc" = { - action = "git_commits"; - options.desc = "Git commits"; - }; - "gb" = { - action = "git_branches"; - options.desc = "Git branches"; - }; - - # Misc - "fh" = { - action = "help_tags"; - options.desc = "Help tags"; - }; - "fc" = { - action = "commands"; - options.desc = "Commands"; - }; - "fk" = { - action = "keymaps"; - options.desc = "Find keymaps"; - }; - }; - }; -} diff --git a/modules/programs/nixvim/plugins/treesitter.nix b/modules/programs/nixvim/plugins/treesitter.nix deleted file mode 100644 index 035ac7a..0000000 --- a/modules/programs/nixvim/plugins/treesitter.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ 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 deleted file mode 100644 index 3c6ad86..0000000 --- a/modules/programs/nixvim/plugins/web-devicons.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ 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 deleted file mode 100644 index 18018e7..0000000 --- a/modules/programs/nixvim/plugins/which-key.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ 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 deleted file mode 100644 index 19dd61b..0000000 --- a/modules/programs/nvtop/default.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: - -# Nvtop - GPU process monitor (NVIDIA/AMD/Intel GPUs) -{ - options.programs.nvtop = { - enable = lib.mkEnableOption "Enables nvtop."; - package = lib.mkOption { - type = lib.types.package; - default = pkgs.nvtopPackages.full; - readOnly = true; - description = "The nvtop package to use."; - }; - }; - - config = lib.mkIf config.programs.nvtop.enable { - home.packages = [ config.programs.nvtop.package ]; - }; -} diff --git a/modules/programs/opencode/default.nix b/modules/programs/opencode/default.nix deleted file mode 100644 index 0b3f0b6..0000000 --- a/modules/programs/opencode/default.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Opencode - AI-powered coding assistant (opencode.ai) -{ - config = lib.mkIf config.programs.opencode.enable { - programs.opencode = { - package = pkgs.opencode; - }; - - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/opencode" = "opencode.desktop"; - }; - }; -} diff --git a/modules/programs/openvpn/default.nix b/modules/programs/openvpn/default.nix deleted file mode 100644 index d0edef3..0000000 --- a/modules/programs/openvpn/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# OpenVPN - Open-source VPN client for secure remote access -{ - options.programs.openvpn = { - enable = lib.mkEnableOption "Enables openvpn."; - package = lib.mkPackageOption pkgs "openvpn" { }; - }; - - config = lib.mkIf config.programs.openvpn.enable { - home.packages = [ config.programs.openvpn.package ]; - }; -} diff --git a/modules/programs/ouch/default.nix b/modules/programs/ouch/default.nix deleted file mode 100644 index 2b4411e..0000000 --- a/modules/programs/ouch/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - pkgs, - lib, - config, - ... -}: - -# Ouch! - CLI tool for compressing and decompressing various formats. -{ - options.programs.ouch = { - enable = lib.mkEnableOption "Enables ouch."; - package = lib.mkPackageOption pkgs "ouch" { }; - }; - - config = lib.mkIf config.programs.ouch.enable { - home.packages = [ config.programs.ouch.package ]; - }; -} diff --git a/modules/programs/pamixer/default.nix b/modules/programs/pamixer/default.nix deleted file mode 100644 index b84e9cf..0000000 --- a/modules/programs/pamixer/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Pamixer - PulseAudio command-line mixer (volume control) -{ - options.programs.pamixer = { - enable = lib.mkEnableOption "Enables pamixer."; - package = lib.mkPackageOption pkgs "pamixer" { }; - }; - - config = lib.mkIf config.programs.pamixer.enable { - home.packages = [ config.programs.pamixer.package ]; - }; -} diff --git a/modules/programs/playerctl/default.nix b/modules/programs/playerctl/default.nix deleted file mode 100644 index d501abd..0000000 --- a/modules/programs/playerctl/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Playerctl - CLI for controlling media players (Spotify, MPRIS, etc.) -{ - options.programs.playerctl = { - enable = lib.mkEnableOption "Enables playerctl."; - package = lib.mkPackageOption pkgs "playerctl" { }; - }; - - config = lib.mkIf config.programs.playerctl.enable { - home.packages = [ config.programs.playerctl.package ]; - }; -} diff --git a/modules/programs/qemu/default.nix b/modules/programs/qemu/default.nix deleted file mode 100644 index b34264c..0000000 --- a/modules/programs/qemu/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# QEMU - generic and open source machine & userspace emulator and virtualizer. -{ - options.programs.qemu = { - enable = lib.mkEnableOption "Enables qemu."; - package = lib.mkOption { - type = lib.types.package; - default = pkgs.symlinkJoin { - name = "qemu-bundle"; - paths = with pkgs; [ - qemu - libvirt - virtiofsd - virt-manager - ]; - }; - description = "Bundle of QEMU-related packages."; - }; - }; - - config = lib.mkIf config.programs.qemu.enable { - home.packages = [ config.programs.qemu.package ]; - }; -} diff --git a/modules/programs/slop/default.nix b/modules/programs/slop/default.nix deleted file mode 100644 index c86181b..0000000 --- a/modules/programs/slop/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Slop - Region selector for screenshots (used by maim/flameshot) -{ - options.programs.slop = { - enable = lib.mkEnableOption "Enables slop."; - package = lib.mkPackageOption pkgs "slop" { }; - }; - - config = lib.mkIf config.programs.slop.enable { - home.packages = [ config.programs.slop.package ]; - }; -} diff --git a/modules/programs/ssh/default.nix b/modules/programs/ssh/default.nix deleted file mode 100644 index 7e8752a..0000000 --- a/modules/programs/ssh/default.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# OpenSSH - Secure shell (SSH) client for encrypted remote connections -{ - imports = [ ./git.nix ]; - - 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"; - }; - }; - }; -} diff --git a/modules/programs/ssh/git.nix b/modules/programs/ssh/git.nix deleted file mode 100644 index 9683629..0000000 --- a/modules/programs/ssh/git.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ config, lib, ... }: - -let - hosts = [ - { - domain = "github.com"; - identityName = "github"; - } - { - domain = "gitlab.com"; - identityName = "gitlab"; - } - { - domain = "bitbucket.org"; - identityName = "bitbucket"; - } - { - domain = "codeberg.org"; - identityName = "codeberg"; - } - { - domain = "git.sr.ht"; - identityName = "sourcehut"; - } - ]; - - mkGitHost = - { domain, identityName }: - lib.nameValuePair domain { - hostname = domain; - user = "git"; - identityFile = "${config.home.homeDirectory}/.local/share/ssh/git/${identityName}"; - }; - - mkKeyFile = - { identityName, ... }: - lib.nameValuePair identityName { - enable = true; - text = ""; - force = false; - }; -in -{ - config = lib.mkIf (config.programs.ssh.enable && config.programs.git.useSSH) { - home.file = builtins.listToAttrs (map mkKeyFile hosts); - - programs.ssh.settings = builtins.listToAttrs (map mkGitHost hosts); - }; -} diff --git a/modules/programs/starship/default.nix b/modules/programs/starship/default.nix deleted file mode 100644 index ae5e082..0000000 --- a/modules/programs/starship/default.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ 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 deleted file mode 100644 index 77dca8c..0000000 --- a/modules/programs/systemctl-tui/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: - -# systemctl-tui - TUI for systemctl (systemd service management) -{ - options.programs.systemctl-tui = { - enable = lib.mkEnableOption "Enables systemctl-tui."; - package = lib.mkPackageOption pkgs "systemctl-tui" { }; - }; - - config = lib.mkIf config.programs.systemctl-tui.enable { - home.packages = [ config.programs.systemctl-tui.package ]; - }; -} diff --git a/modules/programs/tmux/default.nix b/modules/programs/tmux/default.nix deleted file mode 100644 index e2e76c9..0000000 --- a/modules/programs/tmux/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Tmux - Terminal multiplexer (window/pane management) -{ - config = lib.mkIf config.programs.tmux.enable { - programs.tmux = { - package = pkgs.tmux; - }; - }; -} diff --git a/modules/programs/tor/default.nix b/modules/programs/tor/default.nix deleted file mode 100644 index 3a19c8a..0000000 --- a/modules/programs/tor/default.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - pkgs, - lib, - config, - ... -}: - -# Tor - Local proxy server for connecting to the tor network -{ - options.programs.tor = { - enable = lib.mkEnableOption "Enables tor."; - package = lib.mkPackageOption pkgs "tor" { }; - }; - - config = lib.mkIf config.programs.tor.enable { - home.packages = [ config.programs.tor.package ]; - - 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/vlc/default.nix b/modules/programs/vlc/default.nix deleted file mode 100644 index 8069f3e..0000000 --- a/modules/programs/vlc/default.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# VLC - Versatile multimedia player for audio/video playback -{ - options.programs.vlc = { - enable = lib.mkEnableOption "Enables vlc."; - package = lib.mkPackageOption pkgs "vlc" { }; - }; - - config = lib.mkIf config.programs.vlc.enable { - home.packages = [ config.programs.vlc.package ]; - - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/vlc" = "vlc.desktop"; - "video/mp4" = "vlc.desktop"; - "video/mpeg" = "vlc.desktop"; - "video/x-matroska" = "vlc.desktop"; - "video/x-msvideo" = "vlc.desktop"; - "video/quicktime" = "vlc.desktop"; - "video/webm" = "vlc.desktop"; - "video/x-ms-wmv" = "vlc.desktop"; - "video/x-flv" = "vlc.desktop"; - "video/ogg" = "vlc.desktop"; - "audio/mpeg" = "vlc.desktop"; - "audio/ogg" = "vlc.desktop"; - "audio/x-wav" = "vlc.desktop"; - "audio/x-flac" = "vlc.desktop"; - "audio/mp4" = "vlc.desktop"; - "audio/x-matroska" = "vlc.desktop"; - }; - }; -} diff --git a/modules/programs/vscodium/default.nix b/modules/programs/vscodium/default.nix deleted file mode 100644 index a8cbd37..0000000 --- a/modules/programs/vscodium/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# VSCodium - Visual Studio Code fork -{ - config = lib.mkIf config.programs.vscodium.enable { - programs.vscodium = { - package = pkgs.vscodium; - }; - - xdg.mimeApps.defaultApplications = { - "x-scheme-handler/vscodium" = "vscodium.desktop"; - "text/plain" = "vscodium.desktop"; - }; - }; -} diff --git a/modules/programs/zathura/default.nix b/modules/programs/zathura/default.nix deleted file mode 100644 index 167b04f..0000000 --- a/modules/programs/zathura/default.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -# Zathura - Minimalistic document viewer (PDF, DJVU, etc.) -{ - config = lib.mkIf config.programs.zathura.enable { - programs.zathura = { - package = pkgs.zathura; - }; - - xdg.mimeApps.defaultApplications = { - "application/pdf" = "zathura.desktop"; - "application/x-pdf" = "zathura.desktop"; - "image/vnd.djvu" = "zathura.desktop"; - "application/epub+zip" = "zathura.desktop"; - "application/postscript" = "zathura.desktop"; - "application/vnd.comicbook+zip" = "zathura.desktop"; - "application/vnd.comicbook-rar" = "zathura.desktop"; - }; - }; -} diff --git a/modules/programs/zsh/default.nix b/modules/programs/zsh/default.nix deleted file mode 100644 index f3bdbb1..0000000 --- a/modules/programs/zsh/default.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ - 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 - - export GPG_TTY="$(tty)" - gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1 - - 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 deleted file mode 100644 index 0a2f453..0000000 --- a/modules/programs/zsh/nix-aliases.sh +++ /dev/null @@ -1,27 +0,0 @@ -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 -} diff --git a/modules/security/default.nix b/modules/security/default.nix new file mode 100644 index 0000000..e9d7208 --- /dev/null +++ b/modules/security/default.nix @@ -0,0 +1,11 @@ +{ ... }: + +{ + imports = [ + ./enteauth + ./gopass + ./gpg + ./openvpn + ./ssh + ]; +} diff --git a/modules/security/enteauth/default.nix b/modules/security/enteauth/default.nix new file mode 100644 index 0000000..a332bf3 --- /dev/null +++ b/modules/security/enteauth/default.nix @@ -0,0 +1,61 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Ente Auth - end-to-end encrypted authentication (2FA) +let + enteAuthWithKeyring = pkgs.symlinkJoin { + name = "ente-auth-wrapped"; + paths = [ pkgs.ente-auth ]; + buildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + wrapProgram $out/bin/enteauth \ + --prefix PATH : ${ + lib.makeBinPath [ + pkgs.gnome-keyring + pkgs.dbus + ] + } \ + --run "echo 'password' | ${pkgs.gnome-keyring}/bin/gnome-keyring-daemon --unlock --components=secrets" + + rm -rf $out/share/applications/* + + ln -s ${customDesktopItem}/share/applications/* $out/share/applications/ + ''; + }; + + customDesktopItem = pkgs.makeDesktopItem { + name = "enteauth"; + exec = "enteauth"; + icon = "io.ente.auth"; + comment = "End-to-end encrypted 2FA authenticator"; + desktopName = "Ente Auth"; + genericName = "2FA Authenticator"; + categories = [ + "Utility" + "Security" + ]; + terminal = false; + }; +in +{ + options.programs.enteauth = { + enable = lib.mkEnableOption "Enables wrapped ente-auth with automated keyring unlocks and a desktop entry."; + package = lib.mkOption { + type = lib.types.package; + default = enteAuthWithKeyring; + description = "The customized version of ente-auth with a self-unlocking daemon backend."; + }; + }; + + config = lib.mkIf config.programs.enteauth.enable { + home.packages = [ config.programs.enteauth.package ]; + + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/enteauth" = "enteauth.desktop"; + }; + }; +} diff --git a/modules/security/gopass/default.nix b/modules/security/gopass/default.nix new file mode 100644 index 0000000..3990f7f --- /dev/null +++ b/modules/security/gopass/default.nix @@ -0,0 +1,30 @@ +# gopass - Standard Unix password manager (Go implementation) +{ + config, + lib, + pkgs, + ... +}: + +{ + options.programs.gopass = { + enable = lib.mkEnableOption "Enables gopass."; + + package = lib.mkOption { + type = lib.types.package; + default = pkgs.gopass.override { passAlias = true; }; + defaultText = lib.literalExpression "pkgs.gopass.override { passAlias = true; }"; + description = "The gopass package to use."; + }; + }; + + config = lib.mkIf config.programs.gopass.enable { + programs.password-store = { + enable = true; + package = config.programs.gopass.package; + settings = { + PASSWORD_STORE_DIR = "${config.home.homeDirectory}/.local/share/pass"; + }; + }; + }; +} diff --git a/modules/security/gpg/default.nix b/modules/security/gpg/default.nix new file mode 100644 index 0000000..858f79f --- /dev/null +++ b/modules/security/gpg/default.nix @@ -0,0 +1,20 @@ +{ + config, + lib, + pkgs, + ... +}: + +# gpg - GNU Privacy Guard +{ + config = lib.mkIf config.programs.gpg.enable { + services.gpg-agent = { + enable = true; + enableZshIntegration = true; + defaultCacheTtl = 3600; + maxCacheTtl = 86400; + enableSshSupport = config.programs.ssh.enable; + pinentry.package = pkgs.pinentry-gtk2; + }; + }; +} diff --git a/modules/security/openvpn/default.nix b/modules/security/openvpn/default.nix new file mode 100644 index 0000000..d0edef3 --- /dev/null +++ b/modules/security/openvpn/default.nix @@ -0,0 +1,18 @@ +{ + config, + lib, + pkgs, + ... +}: + +# OpenVPN - Open-source VPN client for secure remote access +{ + options.programs.openvpn = { + enable = lib.mkEnableOption "Enables openvpn."; + package = lib.mkPackageOption pkgs "openvpn" { }; + }; + + config = lib.mkIf config.programs.openvpn.enable { + home.packages = [ config.programs.openvpn.package ]; + }; +} diff --git a/modules/security/ssh/default.nix b/modules/security/ssh/default.nix new file mode 100644 index 0000000..7e8752a --- /dev/null +++ b/modules/security/ssh/default.nix @@ -0,0 +1,26 @@ +{ + config, + lib, + pkgs, + ... +}: + +# OpenSSH - Secure shell (SSH) client for encrypted remote connections +{ + imports = [ ./git.nix ]; + + 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"; + }; + }; + }; +} diff --git a/modules/security/ssh/git.nix b/modules/security/ssh/git.nix new file mode 100644 index 0000000..9683629 --- /dev/null +++ b/modules/security/ssh/git.nix @@ -0,0 +1,49 @@ +{ config, lib, ... }: + +let + hosts = [ + { + domain = "github.com"; + identityName = "github"; + } + { + domain = "gitlab.com"; + identityName = "gitlab"; + } + { + domain = "bitbucket.org"; + identityName = "bitbucket"; + } + { + domain = "codeberg.org"; + identityName = "codeberg"; + } + { + domain = "git.sr.ht"; + identityName = "sourcehut"; + } + ]; + + mkGitHost = + { domain, identityName }: + lib.nameValuePair domain { + hostname = domain; + user = "git"; + identityFile = "${config.home.homeDirectory}/.local/share/ssh/git/${identityName}"; + }; + + mkKeyFile = + { identityName, ... }: + lib.nameValuePair identityName { + enable = true; + text = ""; + force = false; + }; +in +{ + config = lib.mkIf (config.programs.ssh.enable && config.programs.git.useSSH) { + home.file = builtins.listToAttrs (map mkKeyFile hosts); + + programs.ssh.settings = builtins.listToAttrs (map mkGitHost hosts); + }; +} diff --git a/modules/system/bluetui/default.nix b/modules/system/bluetui/default.nix new file mode 100644 index 0000000..a2a97ec --- /dev/null +++ b/modules/system/bluetui/default.nix @@ -0,0 +1,18 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Bluetui - Terminal UI for Bluetooth management +{ + options.programs.bluetui = { + enable = lib.mkEnableOption "Enables bluetui."; + package = lib.mkPackageOption pkgs "bluetui" { }; + }; + + config = lib.mkIf config.programs.bluetui.enable { + home.packages = [ config.programs.bluetui.package ]; + }; +} diff --git a/modules/system/bottom/default.nix b/modules/system/bottom/default.nix new file mode 100644 index 0000000..3ecda86 --- /dev/null +++ b/modules/system/bottom/default.nix @@ -0,0 +1,15 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Bottom - Cross-platform graphical process/system monitor (Rust-based) +{ + config = lib.mkIf config.programs.bottom.enable { + programs.bottom = { + package = pkgs.bottom; + }; + }; +} diff --git a/modules/system/brightnessctl/default.nix b/modules/system/brightnessctl/default.nix new file mode 100644 index 0000000..cea3517 --- /dev/null +++ b/modules/system/brightnessctl/default.nix @@ -0,0 +1,18 @@ +{ + config, + lib, + pkgs, + ... +}: + +# brightnessctl - Backlight brightness control tool +{ + options.programs.brightnessctl = { + enable = lib.mkEnableOption "Enables brightnessctl."; + package = lib.mkPackageOption pkgs "brightnessctl" { }; + }; + + config = lib.mkIf config.programs.brightnessctl.enable { + home.packages = [ config.programs.brightnessctl.package ]; + }; +} diff --git a/modules/system/default.nix b/modules/system/default.nix new file mode 100644 index 0000000..88e5087 --- /dev/null +++ b/modules/system/default.nix @@ -0,0 +1,12 @@ +{ ... }: + +{ + imports = [ + ./bluetui + ./bottom + ./brightnessctl + ./htop + ./nvtop + ./systemctl-tui + ]; +} diff --git a/modules/system/htop/default.nix b/modules/system/htop/default.nix new file mode 100644 index 0000000..7781464 --- /dev/null +++ b/modules/system/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/system/nvtop/default.nix b/modules/system/nvtop/default.nix new file mode 100644 index 0000000..19dd61b --- /dev/null +++ b/modules/system/nvtop/default.nix @@ -0,0 +1,23 @@ +{ + config, + pkgs, + lib, + ... +}: + +# Nvtop - GPU process monitor (NVIDIA/AMD/Intel GPUs) +{ + options.programs.nvtop = { + enable = lib.mkEnableOption "Enables nvtop."; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.nvtopPackages.full; + readOnly = true; + description = "The nvtop package to use."; + }; + }; + + config = lib.mkIf config.programs.nvtop.enable { + home.packages = [ config.programs.nvtop.package ]; + }; +} diff --git a/modules/system/systemctl-tui/default.nix b/modules/system/systemctl-tui/default.nix new file mode 100644 index 0000000..77dca8c --- /dev/null +++ b/modules/system/systemctl-tui/default.nix @@ -0,0 +1,18 @@ +{ + config, + pkgs, + lib, + ... +}: + +# systemctl-tui - TUI for systemctl (systemd service management) +{ + options.programs.systemctl-tui = { + enable = lib.mkEnableOption "Enables systemctl-tui."; + package = lib.mkPackageOption pkgs "systemctl-tui" { }; + }; + + config = lib.mkIf config.programs.systemctl-tui.enable { + home.packages = [ config.programs.systemctl-tui.package ]; + }; +} diff --git a/modules/terminal/bat/base16.mustache.tmTheme b/modules/terminal/bat/base16.mustache.tmTheme new file mode 100644 index 0000000..6b2cd5b --- /dev/null +++ b/modules/terminal/bat/base16.mustache.tmTheme @@ -0,0 +1,534 @@ + + + + + name + OneDark Dark + author + olimorris (https://github.com/olimorris) + settings + + + + + settings + + background + #{{base00}} + foreground + #{{base05}} + caret + #{{base05}} + invisibles + #{{base03}} + lineHighlight + #{{base01}} + selection + #{{base02}} + selectionBorder + #{{base03}} + findHighlight + #{{base0A}} + findHighlightForeground + #{{base00}} + activeGuide + #{{base03}} + bracketsForeground + #{{base05}} + bracketsOptions + underline + bracketContentsForeground + #{{base05}} + bracketContentsOptions + underline + tagsOptions + stippled_underline + gutterForeground + #{{base03}} + gutter + #{{base01}} + + + + + + name + Comment + scope + comment, punctuation.definition.comment + settings + + foreground + #{{base03}} + fontStyle + italic + + + + + + name + Variable + scope + variable, variable.other + settings + + foreground + #{{base05}} + + + + + name + Variable - Language + scope + variable.language + settings + + foreground + #{{base0E}} + fontStyle + italic + + + + + + name + Keyword + scope + keyword, keyword.control + settings + + foreground + #{{base0E}} + + + + + name + Keyword - Operator + scope + keyword.operator + settings + + foreground + #{{base0C}} + + + + + + name + Storage + scope + storage, storage.type, storage.modifier + settings + + foreground + #{{base0E}} + + + + + + name + Constant + scope + constant, constant.other + settings + + foreground + #{{base09}} + + + + + name + Constant - Numeric + scope + constant.numeric + settings + + foreground + #{{base09}} + + + + + name + Constant - Language + scope + constant.language + settings + + foreground + #{{base09}} + + + + + name + Constant - Character Escape + scope + constant.character.escape + settings + + foreground + #{{base0C}} + + + + + + name + String + scope + string + settings + + foreground + #{{base0B}} + + + + + name + String - Punctuation + scope + punctuation.definition.string + settings + + foreground + #{{base0B}} + + + + + + name + Support - Function + scope + support.function + settings + + foreground + #{{base0D}} + + + + + name + Support - Class + scope + support.class + settings + + foreground + #{{base0A}} + + + + + name + Support - Type + scope + support.type + settings + + foreground + #{{base0C}} + + + + + name + Support - Constant + scope + support.constant + settings + + foreground + #{{base09}} + + + + + + name + Entity - Name - Function + scope + entity.name.function + settings + + foreground + #{{base0D}} + + + + + name + Entity - Name - Class / Type + scope + entity.name.class, entity.name.type, entity.name.type.class + settings + + foreground + #{{base0A}} + + + + + name + Entity - Name - Tag + scope + entity.name.tag + settings + + foreground + #{{base08}} + + + + + name + Entity - Other - Attribute Name + scope + entity.other.attribute-name + settings + + foreground + #{{base09}} + + + + + name + Entity - Other - Inherited Class + scope + entity.other.inherited-class + settings + + foreground + #{{base0A}} + fontStyle + italic + + + + + + name + Punctuation + scope + punctuation + settings + + foreground + #{{base05}} + + + + + name + Punctuation - Section + scope + punctuation.section, meta.brace + settings + + foreground + #{{base05}} + + + + + + name + Invalid + scope + invalid + settings + + foreground + #{{base07}} + background + #{{base08}} + + + + + name + Invalid - Deprecated + scope + invalid.deprecated + settings + + foreground + #{{base07}} + background + #{{base0F}} + + + + + + name + Diff - Inserted + scope + markup.inserted + settings + + foreground + #{{base0B}} + + + + + name + Diff - Deleted + scope + markup.deleted + settings + + foreground + #{{base08}} + + + + + name + Diff - Changed + scope + markup.changed + settings + + foreground + #{{base0E}} + + + + + + name + Markup - Heading + scope + markup.heading, entity.name.section + settings + + foreground + #{{base0D}} + fontStyle + bold + + + + + name + Markup - Bold + scope + markup.bold + settings + + foreground + #{{base09}} + fontStyle + bold + + + + + name + Markup - Italic + scope + markup.italic + settings + + foreground + #{{base0E}} + fontStyle + italic + + + + + name + Markup - Inline Code + scope + markup.inline.raw, markup.raw.inline + settings + + foreground + #{{base0C}} + + + + + name + Markup - Link + scope + markup.underline.link, string.other.link + settings + + foreground + #{{base0D}} + fontStyle + underline + + + + + name + Markup - Quote + scope + markup.quote + settings + + foreground + #{{base0B}} + fontStyle + italic + + + + + name + Markup - List + scope + markup.list, punctuation.definition.list + settings + + foreground + #{{base08}} + + + + + + name + Meta - Function Call + scope + meta.function-call + settings + + foreground + #{{base0D}} + + + + + name + Meta - Preprocessor + scope + meta.preprocessor + settings + + foreground + #{{base09}} + + + + + uuid + a6f0d8c2-3b1e-4f5a-9c7d-2e8b0f4a6d1c + + diff --git a/modules/terminal/bat/default.nix b/modules/terminal/bat/default.nix new file mode 100644 index 0000000..3c962a3 --- /dev/null +++ b/modules/terminal/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/terminal/default.nix b/modules/terminal/default.nix new file mode 100644 index 0000000..7a3ffcc --- /dev/null +++ b/modules/terminal/default.nix @@ -0,0 +1,13 @@ +{ ... }: + +{ + imports = [ + ./bat + ./fzf + ./kitty + ./less + ./starship + ./tmux + ./zsh + ]; +} diff --git a/modules/terminal/fzf/assertions.nix b/modules/terminal/fzf/assertions.nix new file mode 100644 index 0000000..7c2e79c --- /dev/null +++ b/modules/terminal/fzf/assertions.nix @@ -0,0 +1,13 @@ +{ config, ... }: +{ + assertions = [ + { + assertion = + !config.programs.fzf.enable || config.programs.zsh.enable || config.programs.bash.enable; + message = '' + programs.fzf is enabled but neither programs.zsh.enable nor programs.bash.enable is set. + fzf shell integration requires zsh or bash. Please enable at least one. + ''; + } + ]; +} diff --git a/modules/terminal/fzf/default.nix b/modules/terminal/fzf/default.nix new file mode 100644 index 0000000..7671b3c --- /dev/null +++ b/modules/terminal/fzf/default.nix @@ -0,0 +1,51 @@ +{ config, lib, ... }: + +# FZF - Fuzzy finder, CLI fuzzy search tool +{ + imports = [ ./assertions.nix ]; + + 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/terminal/kitty/default.nix b/modules/terminal/kitty/default.nix new file mode 100644 index 0000000..3701180 --- /dev/null +++ b/modules/terminal/kitty/default.nix @@ -0,0 +1,55 @@ +{ + config, + lib, + ... +}: + +# Kitty - GPU-accelerated terminal emulator +{ + config = lib.mkIf config.programs.kitty.enable { + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/terminal" = "kitty.desktop"; + }; + + 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 config.programs.zsh.package); + }; + }; + }; +} diff --git a/modules/terminal/less/default.nix b/modules/terminal/less/default.nix new file mode 100644 index 0000000..516377d --- /dev/null +++ b/modules/terminal/less/default.nix @@ -0,0 +1,15 @@ +{ config, lib, ... }: + +# less - terminal pager +{ + config = lib.mkIf config.programs.less.enable { + programs.less = { + options = [ + "--RAW-CONTROL-CHARS" + "--quit-if-one-screen" + "--no-init" + "--ignore-case" + ]; + }; + }; +} diff --git a/modules/terminal/starship/default.nix b/modules/terminal/starship/default.nix new file mode 100644 index 0000000..ae5e082 --- /dev/null +++ b/modules/terminal/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/terminal/tmux/default.nix b/modules/terminal/tmux/default.nix new file mode 100644 index 0000000..e2e76c9 --- /dev/null +++ b/modules/terminal/tmux/default.nix @@ -0,0 +1,15 @@ +{ + config, + lib, + pkgs, + ... +}: + +# Tmux - Terminal multiplexer (window/pane management) +{ + config = lib.mkIf config.programs.tmux.enable { + programs.tmux = { + package = pkgs.tmux; + }; + }; +} diff --git a/modules/terminal/zsh/default.nix b/modules/terminal/zsh/default.nix new file mode 100644 index 0000000..f3bdbb1 --- /dev/null +++ b/modules/terminal/zsh/default.nix @@ -0,0 +1,38 @@ +{ + 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 + + export GPG_TTY="$(tty)" + gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1 + + 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/terminal/zsh/nix-aliases.sh b/modules/terminal/zsh/nix-aliases.sh new file mode 100644 index 0000000..0a2f453 --- /dev/null +++ b/modules/terminal/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 +} diff --git a/modules/web/aria2/default.nix b/modules/web/aria2/default.nix new file mode 100644 index 0000000..79c6f8e --- /dev/null +++ b/modules/web/aria2/default.nix @@ -0,0 +1,18 @@ +{ + pkgs, + lib, + config, + ... +}: + +# Aria2 - command line download manager +{ + config = lib.mkIf config.programs.aria2.enable { + programs.aria2 = { + package = pkgs.aria2; + settings = { + dir = "${config.home.homeDirectory}/Downloads"; + }; + }; + }; +} diff --git a/modules/web/brave/default.nix b/modules/web/brave/default.nix new file mode 100644 index 0000000..936da6a --- /dev/null +++ b/modules/web/brave/default.nix @@ -0,0 +1,86 @@ +{ + config, + lib, + pkgs, + ... +}: + +{ + config = lib.mkIf config.programs.brave.enable { + programs.brave = { + package = pkgs.brave; + + commandLineArgs = [ + "--enable-features=BraveUltraDarkTheme" + "--force-device-scale-factor=1.15" + ]; + + extensions = [ + { id = "nngceckbapebfimnlniiiahkandclblb"; } # Bitwarden + { id = "mpkodccbngfoacfalldjimigbofkhgjn"; } # Aria2 Explorer + { id = "eimadpbcbfnmbkopoojfekhnkhdbieeh"; } # Dark Reader + { id = "hpejmncgbammabkkodflfeekpcicfjnk"; } # Quite Black + ]; + }; + + xdg.configFile."BraveSoftware/Brave-Browser/policies/managed/policy.json" = { + text = builtins.toJSON { + RestoreOnStartup = 1; + DefaultNotificationsSetting = 2; + ForceDarkMode = true; + DefaultCookiesSetting = 1; + PasswordManagerEnabled = false; + }; + }; + + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/http" = "brave-browser.desktop"; + "x-scheme-handler/https" = "brave-browser.desktop"; + "x-scheme-handler/chrome" = "brave-browser.desktop"; + "text/html" = "brave-browser.desktop"; + "application/xhtml+xml" = "brave-browser.desktop"; + }; + + xdg.configFile."BraveSoftware/Brave-Browser/Default/Preferences" = { + force = true; + text = builtins.toJSON { + brave = { + darker_mode = false; + enable_window_closing_confirm = false; + tabs = { + vertical_tabs_enabled = true; + vertical_tabs_collapsed = true; + vertical_tabs_floating_enabled = false; + always_hide_tab_close_button = true; + }; + show_side_panel_button = false; + ai_chat = { + show_toolbar_button = false; + }; + wallet = { + show_wallet_icon_on_toolbar = false; + }; + }; + browser = { + show_full_urls = true; + }; + credentials_enable_service = false; + credentials_enable_autosignin = false; + extensions = { + pinned_extensions = [ + "nngceckbapebfimnlniiiahkandclblb" + "eimadpbcbfnmbkopoojfekhnkhdbieeh" + ]; + ui = { + developer_mode = true; + }; + }; + profile = { + default_content_setting_values = { + notifications = 2; + }; + }; + }; + }; + }; +} diff --git a/modules/web/default.nix b/modules/web/default.nix new file mode 100644 index 0000000..fa54cad --- /dev/null +++ b/modules/web/default.nix @@ -0,0 +1,8 @@ +{ ... }: + +{ + imports = [ + ./aria2 + ./brave + ]; +} -- cgit v1.2.3