aboutsummaryrefslogtreecommitdiffstats
path: root/modules/terminal
diff options
context:
space:
mode:
authorArpit Chakladar <arpitchakladar+git@gmail.com>2026-07-15 20:02:29 +0530
committerArpit Chakladar <arpitchakladar+git@gmail.com>2026-07-15 20:03:04 +0530
commit01aaa7ad39c1fe8af6ffbca31abbab27dbfefc95 (patch)
tree88560b79fa71e3b83d9d9aca6d1bb40673a1a170 /modules/terminal
parent2c573bb0c437b83fe629a9a5b818c976d2dfd796 (diff)
downloadhome-manager-config-01aaa7ad39c1fe8af6ffbca31abbab27dbfefc95.tar.gz
home-manager-config-01aaa7ad39c1fe8af6ffbca31abbab27dbfefc95.zip
refactor: organized the modules into better categories
Instead of lumping everything in modules/programs we are separating them into separate directories in modules/
Diffstat (limited to 'modules/terminal')
-rw-r--r--modules/terminal/bat/base16.mustache.tmTheme534
-rw-r--r--modules/terminal/bat/default.nix26
-rw-r--r--modules/terminal/default.nix13
-rw-r--r--modules/terminal/fzf/assertions.nix13
-rw-r--r--modules/terminal/fzf/default.nix51
-rw-r--r--modules/terminal/kitty/default.nix55
-rw-r--r--modules/terminal/less/default.nix15
-rw-r--r--modules/terminal/starship/default.nix63
-rw-r--r--modules/terminal/tmux/default.nix15
-rw-r--r--modules/terminal/zsh/default.nix38
-rw-r--r--modules/terminal/zsh/nix-aliases.sh27
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
+}