diff options
Diffstat (limited to 'modules/terminal')
| -rw-r--r-- | modules/terminal/bat/base16.mustache.tmTheme | 534 | ||||
| -rw-r--r-- | modules/terminal/bat/default.nix | 26 | ||||
| -rw-r--r-- | modules/terminal/default.nix | 13 | ||||
| -rw-r--r-- | modules/terminal/fzf/assertions.nix | 13 | ||||
| -rw-r--r-- | modules/terminal/fzf/default.nix | 51 | ||||
| -rw-r--r-- | modules/terminal/kitty/default.nix | 55 | ||||
| -rw-r--r-- | modules/terminal/less/default.nix | 15 | ||||
| -rw-r--r-- | modules/terminal/starship/default.nix | 63 | ||||
| -rw-r--r-- | modules/terminal/tmux/default.nix | 15 | ||||
| -rw-r--r-- | modules/terminal/zsh/default.nix | 38 | ||||
| -rw-r--r-- | modules/terminal/zsh/nix-aliases.sh | 27 |
11 files changed, 850 insertions, 0 deletions
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 @@ +<?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/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 +} |
