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