aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorArpit Chakladar <54011232+arpitchakladar@users.noreply.github.com>2024-09-24 23:13:51 +0530
committerArpit Chakladar <54011232+arpitchakladar@users.noreply.github.com>2024-09-24 23:13:51 +0530
commitc0c5087218c27e31c3e6f66f3937bff22fa0f647 (patch)
treedede2292db1423cef901932a7898ec951c9d2345 /modules
parent21265ba643f1c12ad40e5195de8a3a97682adbde (diff)
downloadhome-manager-config-c0c5087218c27e31c3e6f66f3937bff22fa0f647.tar.gz
home-manager-config-c0c5087218c27e31c3e6f66f3937bff22fa0f647.zip
Using nix flake modules to manage the configurations.
Diffstat (limited to 'modules')
-rw-r--r--modules/default.nix9
-rw-r--r--modules/desktop/default.nix11
-rw-r--r--modules/desktop/popup-manager/default.nix7
-rw-r--r--modules/desktop/popup-manager/rofi/default.nix13
-rw-r--r--modules/desktop/popup-manager/rofi/theme/default.nix21
-rw-r--r--modules/desktop/popup-manager/rofi/theme/theme.rasi76
-rw-r--r--modules/desktop/status-bar/default.nix7
-rw-r--r--modules/desktop/status-bar/polybar/bars/main.nix28
-rw-r--r--modules/desktop/status-bar/polybar/default.nix24
-rw-r--r--modules/desktop/status-bar/polybar/modules/battery.nix36
-rw-r--r--modules/desktop/status-bar/polybar/modules/bspwm.nix22
-rw-r--r--modules/desktop/status-bar/polybar/modules/cpu.nix9
-rw-r--r--modules/desktop/status-bar/polybar/modules/date.nix10
-rw-r--r--modules/desktop/status-bar/polybar/modules/kernel-version.nix10
-rw-r--r--modules/desktop/status-bar/polybar/modules/memory.nix9
-rw-r--r--modules/desktop/status-bar/polybar/modules/time.nix10
-rw-r--r--modules/desktop/status-bar/polybar/modules/xwindow.nix7
-rw-r--r--modules/desktop/terminal/alacritty/default.nix78
-rw-r--r--modules/desktop/terminal/default.nix7
-rw-r--r--modules/desktop/window-manager/bspwm/bspwmrc3
-rw-r--r--modules/desktop/window-manager/bspwm/default.nix38
-rw-r--r--modules/desktop/window-manager/default.nix8
-rw-r--r--modules/desktop/window-manager/sxhkd/default.nix79
-rw-r--r--modules/desktop/window-manager/sxhkd/scripts/show-keybindings.sh13
-rw-r--r--modules/desktop/xresources/default.nix7
-rw-r--r--modules/desktop/xresources/xinit/default.nix14
-rw-r--r--modules/desktop/xresources/xinit/xinitrc4
-rw-r--r--modules/shell/bash/default.nix13
-rw-r--r--modules/shell/default.nix8
-rw-r--r--modules/shell/zsh/default.nix15
-rw-r--r--modules/shell/zsh/zshrc19
-rw-r--r--modules/tools/default.nix11
-rw-r--r--modules/tools/editor/default.nix7
-rw-r--r--modules/tools/editor/neovim/default.nix43
-rw-r--r--modules/tools/editor/neovim/keybindings.lua8
-rw-r--r--modules/tools/editor/neovim/options.lua21
-rw-r--r--modules/tools/editor/neovim/plugins/base16.lua6
-rw-r--r--modules/tools/editor/neovim/plugins/comment.lua1
-rw-r--r--modules/tools/editor/neovim/plugins/lualine.lua5
-rw-r--r--modules/tools/editor/neovim/plugins/nvim-tree.lua13
-rw-r--r--modules/tools/editor/neovim/plugins/treesitter.nix13
-rw-r--r--modules/tools/file-manager/default.nix8
-rw-r--r--modules/tools/file-manager/lf/default.nix21
-rw-r--r--modules/tools/file-manager/lf/icons334
-rw-r--r--modules/tools/file-manager/lf/scripts/previewer.sh3
-rw-r--r--modules/tools/file-manager/lsd/default.nix17
-rw-r--r--modules/tools/git/default.nix20
-rw-r--r--modules/tools/system-monitor/default.nix7
-rw-r--r--modules/tools/system-monitor/htop/default.nix12
-rw-r--r--modules/tools/viewer/bat/default.nix14
-rw-r--r--modules/tools/viewer/bat/theme.nix124
-rw-r--r--modules/tools/viewer/default.nix7
52 files changed, 1310 insertions, 0 deletions
diff --git a/modules/default.nix b/modules/default.nix
new file mode 100644
index 0000000..7845368
--- /dev/null
+++ b/modules/default.nix
@@ -0,0 +1,9 @@
+{ ... }:
+
+{
+ imports = [
+ ./desktop
+ ./shell
+ ./tools
+ ];
+}
diff --git a/modules/desktop/default.nix b/modules/desktop/default.nix
new file mode 100644
index 0000000..e15cd53
--- /dev/null
+++ b/modules/desktop/default.nix
@@ -0,0 +1,11 @@
+{ lib, config, ... }:
+
+{
+ imports = [
+ ./popup-manager
+ ./status-bar
+ ./terminal
+ ./window-manager
+ ./xresources
+ ];
+}
diff --git a/modules/desktop/popup-manager/default.nix b/modules/desktop/popup-manager/default.nix
new file mode 100644
index 0000000..8c82ea7
--- /dev/null
+++ b/modules/desktop/popup-manager/default.nix
@@ -0,0 +1,7 @@
+{ lib, ... }:
+
+{
+ imports = [
+ ./rofi
+ ];
+}
diff --git a/modules/desktop/popup-manager/rofi/default.nix b/modules/desktop/popup-manager/rofi/default.nix
new file mode 100644
index 0000000..fdf7d3e
--- /dev/null
+++ b/modules/desktop/popup-manager/rofi/default.nix
@@ -0,0 +1,13 @@
+{ config, lib, ... }:
+
+{
+ options = {
+ rofi.enable = lib.mkEnableOption "Enables rofi.";
+ };
+
+ config = lib.mkIf config.rofi.enable {
+ programs.rofi.enable = true;
+ programs.rofi.font = "FiraCode Nerd Font 16";
+ programs.rofi.theme = import ./theme/default.nix config;
+ };
+}
diff --git a/modules/desktop/popup-manager/rofi/theme/default.nix b/modules/desktop/popup-manager/rofi/theme/default.nix
new file mode 100644
index 0000000..b0b8173
--- /dev/null
+++ b/modules/desktop/popup-manager/rofi/theme/default.nix
@@ -0,0 +1,21 @@
+config:
+
+with config.scheme.withHashtag;
+builtins.toFile "theme.rasi"
+''
+${builtins.readFile ./theme.rasi}
+configuration {
+ font: "${config.programs.rofi.font}";
+}
+
+* {
+ bg: ${base00};
+ bg-alt: ${base01};
+ fg: ${base07};
+ fg-alt: ${base03};
+}
+
+window {
+ border-color: ${base03};
+}
+''
diff --git a/modules/desktop/popup-manager/rofi/theme/theme.rasi b/modules/desktop/popup-manager/rofi/theme/theme.rasi
new file mode 100644
index 0000000..9d808b9
--- /dev/null
+++ b/modules/desktop/popup-manager/rofi/theme/theme.rasi
@@ -0,0 +1,76 @@
+configuration {
+ drun {
+ display-name: " ";
+ }
+
+ run {
+ display-name: " ";
+ }
+
+ window {
+ display-name: " ";
+ }
+
+ ssh {
+ display-name: " ";
+ }
+
+ timeout {
+ delay: 10;
+ action: "kb-cancel";
+ }
+}
+
+* {
+ border: 1;
+ margin: 0;
+ padding: 0;
+ spacing: 0;
+
+ background-color: @bg;
+ text-color: @fg;
+}
+
+window {
+ transparency: "real";
+}
+
+mainbox {
+ children: [inputbar, listview];
+}
+
+inputbar {
+ background-color: @bg-alt;
+ children: [prompt, entry];
+}
+
+entry {
+ background-color: inherit;
+ padding: 12px 3px;
+}
+
+prompt {
+ background-color: inherit;
+ padding: 12px;
+}
+
+listview {
+ lines: 8;
+}
+
+element {
+ children: [element-text];
+}
+
+element-icon {
+ padding: 10px 10px;
+}
+
+element-text {
+ padding: 10px 10px;
+ text-color: @fg-alt;
+}
+
+element-text selected {
+ text-color: @fg;
+}
diff --git a/modules/desktop/status-bar/default.nix b/modules/desktop/status-bar/default.nix
new file mode 100644
index 0000000..124c830
--- /dev/null
+++ b/modules/desktop/status-bar/default.nix
@@ -0,0 +1,7 @@
+{ lib, ... }:
+
+{
+ imports = [
+ ./polybar
+ ];
+}
diff --git a/modules/desktop/status-bar/polybar/bars/main.nix b/modules/desktop/status-bar/polybar/bars/main.nix
new file mode 100644
index 0000000..630664d
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/bars/main.nix
@@ -0,0 +1,28 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ width = "100%";
+ height = 30;
+ radius = 3;
+ fixed-center = false;
+
+ background = "${base00}";
+ foreground = "${base05}";
+
+ line-size = 3;
+ line-color = "${base08}";
+
+ border-size = 4;
+ padding-left = 2;
+ padding-right = 2;
+
+ module-margin-left = 2;
+ module-margin-right = 2;
+
+ font-0 = "FiraCode Nerd Font:pixelsize=16;3";
+
+ modules-left = "bspwm";
+ modules-center = "xwindow";
+ modules-right = "memory cpu battery time date kernel-version";
+}
diff --git a/modules/desktop/status-bar/polybar/default.nix b/modules/desktop/status-bar/polybar/default.nix
new file mode 100644
index 0000000..11f4f1a
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/default.nix
@@ -0,0 +1,24 @@
+{ config, lib, ... }:
+
+{
+ options = {
+ polybar.enable = lib.mkEnableOption "Enables polybar.";
+ };
+
+ config = lib.mkIf config.polybar.enable {
+ services.polybar.enable = true;
+ services.polybar.script = "polybar main &";
+
+ services.polybar.config = {
+ "bar/main" = import ./bars/main.nix config;
+ "module/xwindow" = import ./modules/xwindow.nix config;
+ "module/bspwm" = import ./modules/bspwm.nix config;
+ "module/cpu" = import ./modules/cpu.nix config;
+ "module/memory" = import ./modules/memory.nix config;
+ "module/date" = import ./modules/date.nix config;
+ "module/time" = import ./modules/time.nix config;
+ "module/battery" = import ./modules/battery.nix config;
+ "module/kernel-version" = import ./modules/kernel-version.nix config;
+ };
+ };
+}
diff --git a/modules/desktop/status-bar/polybar/modules/battery.nix b/modules/desktop/status-bar/polybar/modules/battery.nix
new file mode 100644
index 0000000..9860c3c
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/modules/battery.nix
@@ -0,0 +1,36 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ type = "internal/battery";
+ battery = "BAT0";
+ adapter = "ADP1";
+
+ format-charging = "<animation-charging> <label-charging>";
+ format-discharging = "<ramp-capacity> <label-discharging>";
+ format-full-prefix = "%{F${base0B}}󰁹%{F-}";
+
+ ramp-capacity-0 = "%{F${base0C}}󰁺%{F-}";
+ ramp-capacity-1 = "%{F${base0C}}󰁻%{F-}";
+ ramp-capacity-2 = "%{F${base0C}}󰁼%{F-}";
+ ramp-capacity-3 = "%{F${base0C}}󰁽%{F-}";
+ ramp-capacity-4 = "%{F${base0C}}󰁾%{F-}";
+ ramp-capacity-5 = "%{F${base0C}}󰁿%{F-}";
+ ramp-capacity-6 = "%{F${base0C}}󰂀%{F-}";
+ ramp-capacity-7 = "%{F${base0C}}󰂁%{F-}";
+ ramp-capacity-8 = "%{F${base0C}}󰂂%{F-}";
+ ramp-capacity-9 = "%{F${base0C}}󰁹%{F-}";
+
+ animation-charging-0 = "%{F${base0C}}󰁺%{F-}";
+ animation-charging-1 = "%{F${base0C}}󰁻%{F-}";
+ animation-charging-2 = "%{F${base0C}}󰁼%{F-}";
+ animation-charging-3 = "%{F${base0C}}󰁽%{F-}";
+ animation-charging-4 = "%{F${base0C}}󰁾%{F-}";
+ animation-charging-5 = "%{F${base0C}}󰁿%{F-}";
+ animation-charging-6 = "%{F${base0C}}󰂀%{F-}";
+ animation-charging-7 = "%{F${base0C}}󰂁%{F-}";
+ animation-charging-8 = "%{F${base0C}}󰂂%{F-}";
+ animation-charging-9 = "%{F${base0C}}󰁹%{F-}";
+
+ animation-charging-framerate = 750;
+}
diff --git a/modules/desktop/status-bar/polybar/modules/bspwm.nix b/modules/desktop/status-bar/polybar/modules/bspwm.nix
new file mode 100644
index 0000000..7ec5c6d
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/modules/bspwm.nix
@@ -0,0 +1,22 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ type = "internal/bspwm";
+
+ label-focused = "%index%";
+ label-focused-background = "${base01}";
+ label-focused-underline = "${base0D}";
+ label-focused-padding = 2;
+
+ label-occupied = "%index%";
+ label-occupied-padding = 2;
+
+ label-urgent = "%index%!";
+ label-urgent-background = "${base08}";
+ label-urgent-padding = 2;
+
+ label-empty = "%index%";
+ label-empty-foreground = "${base03}";
+ label-empty-padding = 2;
+}
diff --git a/modules/desktop/status-bar/polybar/modules/cpu.nix b/modules/desktop/status-bar/polybar/modules/cpu.nix
new file mode 100644
index 0000000..f118990
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/modules/cpu.nix
@@ -0,0 +1,9 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ type = "internal/cpu";
+ interval = 2;
+ format-prefix = "%{F${base09}} %{F-}";
+ label = "%percentage%%";
+}
diff --git a/modules/desktop/status-bar/polybar/modules/date.nix b/modules/desktop/status-bar/polybar/modules/date.nix
new file mode 100644
index 0000000..11a5934
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/modules/date.nix
@@ -0,0 +1,10 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ type = "internal/date";
+ interval = 60;
+ date = "%d/%m/%Y";
+ label = "%date%";
+ format-prefix = "%{F${base0B}} %{F-}";
+}
diff --git a/modules/desktop/status-bar/polybar/modules/kernel-version.nix b/modules/desktop/status-bar/polybar/modules/kernel-version.nix
new file mode 100644
index 0000000..a900264
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/modules/kernel-version.nix
@@ -0,0 +1,10 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ type = "custom/script";
+ exec = "uname -r";
+ interval = 1024;
+ format-prefix = "%{F${base03}} %{F-}";
+ label = "%output%";
+}
diff --git a/modules/desktop/status-bar/polybar/modules/memory.nix b/modules/desktop/status-bar/polybar/modules/memory.nix
new file mode 100644
index 0000000..1aff8a3
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/modules/memory.nix
@@ -0,0 +1,9 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ type = "internal/memory";
+ interval = 2;
+ format-prefix = "%{F${base0A}} %{F-}";
+ label = "%percentage_used%%";
+}
diff --git a/modules/desktop/status-bar/polybar/modules/time.nix b/modules/desktop/status-bar/polybar/modules/time.nix
new file mode 100644
index 0000000..e4c7cbe
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/modules/time.nix
@@ -0,0 +1,10 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ type = "internal/date";
+ interval = 30;
+ time = "%H:%M";
+ label = "%time%";
+ format-prefix = "%{F${base0C}} %{F-}";
+}
diff --git a/modules/desktop/status-bar/polybar/modules/xwindow.nix b/modules/desktop/status-bar/polybar/modules/xwindow.nix
new file mode 100644
index 0000000..23245ba
--- /dev/null
+++ b/modules/desktop/status-bar/polybar/modules/xwindow.nix
@@ -0,0 +1,7 @@
+config:
+
+with config.scheme.withHashtag;
+{
+ type = "internal/xwindow";
+ label = "%title:0:30:...%";
+}
diff --git a/modules/desktop/terminal/alacritty/default.nix b/modules/desktop/terminal/alacritty/default.nix
new file mode 100644
index 0000000..0fe56e0
--- /dev/null
+++ b/modules/desktop/terminal/alacritty/default.nix
@@ -0,0 +1,78 @@
+{ pkgs, config, lib, ... }:
+
+{
+ options = {
+ alacritty.enable = lib.mkEnableOption "Enables alacritty.";
+ };
+
+ config = lib.mkIf config.alacritty.enable {
+ programs.alacritty.enable = true;
+
+ programs.alacritty.settings = {
+ window = {
+ opacity = 1.0;
+ padding = {
+ x = 4;
+ y = 0;
+ };
+ decorations = "full";
+ };
+
+ font = {
+ normal = {
+ family = "Fira Code Nerd Font";
+ style = "Retina";
+ };
+ bold = {
+ family = "Fira Code Nerd Font";
+ style = "Bold";
+ };
+ italic = {
+ family = "Fira Code Nerd Font";
+ };
+ size = 16.0;
+ };
+
+ colors = with config.scheme; {
+ primary = {
+ background = "0x${base00}";
+ foreground = "0x${base05}";
+ };
+ normal = {
+ black = "0x${base00}";
+ red = "0x${base08}";
+ green = "0x${base0B}";
+ yellow = "0x${base0A}";
+ blue = "0x${base0D}";
+ magenta = "0x${base0E}";
+ cyan = "0x${base0C}";
+ white = "0x${base05}";
+ };
+ bright = {
+ black = "0x${base03}";
+ red = "0x${base08}";
+ green = "0x${base0B}";
+ yellow = "0x${base0A}";
+ blue = "0x${base0D}";
+ magenta = "0x${base0E}";
+ cyan = "0x${base0C}";
+ white = "0x${base07}";
+ };
+ dim = {
+ black = "0x${base01}";
+ red = "0x${base08}";
+ green = "0x${base0B}";
+ yellow = "0x${base0A}";
+ blue = "0x${base0D}";
+ magenta = "0x${base0E}";
+ cyan = "0x${base0C}";
+ white = "0x${base04}";
+ };
+ };
+
+ shell = {
+ program = "${pkgs.zsh}/bin/zsh";
+ };
+ };
+ };
+}
diff --git a/modules/desktop/terminal/default.nix b/modules/desktop/terminal/default.nix
new file mode 100644
index 0000000..6a0cfc8
--- /dev/null
+++ b/modules/desktop/terminal/default.nix
@@ -0,0 +1,7 @@
+{ lib, ... }:
+
+{
+ imports = [
+ ./alacritty
+ ];
+}
diff --git a/modules/desktop/window-manager/bspwm/bspwmrc b/modules/desktop/window-manager/bspwm/bspwmrc
new file mode 100644
index 0000000..8a3a35a
--- /dev/null
+++ b/modules/desktop/window-manager/bspwm/bspwmrc
@@ -0,0 +1,3 @@
+for monitor in $(xrandr -q | grep -w 'connected' | cut -d' ' -f1); do
+ bspc monitor "$monitor" -d '1' '2' '3' '4' '5' '6'
+done
diff --git a/modules/desktop/window-manager/bspwm/default.nix b/modules/desktop/window-manager/bspwm/default.nix
new file mode 100644
index 0000000..643d78b
--- /dev/null
+++ b/modules/desktop/window-manager/bspwm/default.nix
@@ -0,0 +1,38 @@
+{ config, lib, ... }:
+
+{
+ options = {
+ bspwm.enable = lib.mkEnableOption "Enables bspwm.";
+ };
+
+ config = lib.mkIf config.bspwm.enable {
+ xsession.windowManager.bspwm.enable = true;
+
+ xsession.windowManager.bspwm.settings = with config.scheme.withHashtag; {
+ window_gap = 5;
+ split_ratio = 0.5;
+ single_monocle = true;
+ borderless_monocle = false;
+ gapless_monocle = false;
+ focus_follows_pointer = true;
+ pointer_follows_focus = false;
+ pointer_motion_interval = 40;
+ pointer_modifier = "mod1"; # alt key
+ pointer_action1 = "resize_side";
+ pointer_action2 = "move";
+ pointer_action3 = "resize_corner";
+ normal_border_color = base02;
+ active_border_color = base02;
+ focused_border_color = base03;
+ };
+
+ xsession.windowManager.bspwm.rules = {
+ "popup" = {
+ state = "floating";
+ sticky = true;
+ };
+ };
+
+ xsession.windowManager.bspwm.extraConfig = builtins.readFile ./bspwmrc;
+ };
+}
diff --git a/modules/desktop/window-manager/default.nix b/modules/desktop/window-manager/default.nix
new file mode 100644
index 0000000..6e9b9f8
--- /dev/null
+++ b/modules/desktop/window-manager/default.nix
@@ -0,0 +1,8 @@
+{ lib, ... }:
+
+{
+ imports = [
+ ./bspwm
+ ./sxhkd
+ ];
+}
diff --git a/modules/desktop/window-manager/sxhkd/default.nix b/modules/desktop/window-manager/sxhkd/default.nix
new file mode 100644
index 0000000..29261b9
--- /dev/null
+++ b/modules/desktop/window-manager/sxhkd/default.nix
@@ -0,0 +1,79 @@
+{ pkgs, config, lib, ... }:
+
+{
+ options = {
+ sxhkd.enable = lib.mkEnableOption "Enables sxhkd.";
+ };
+
+ config = lib.mkIf config.sxhkd.enable {
+ services.sxhkd.enable = true;
+
+ services.sxhkd.keybindings =
+ let
+ modKey = "alt";
+ createKeybinding = keybinding: description: "# ${description}\n${modKey} + ${keybinding}";
+ in {
+ ${(createKeybinding
+ "s"
+ "Show keybindings.")}
+ = pkgs.writeShellScript
+ "show-keybindings.sh"
+ (builtins.readFile ./scripts/show-keybindings.sh);
+
+ ${(createKeybinding
+ "r"
+ "Launch rofi.")}
+ = "rofi -show run";
+
+ ${(createKeybinding
+ "t"
+ "Launch terminal.")}
+ = "alacritty";
+
+ ${(createKeybinding
+ "f"
+ "Launch File Explorer.")}
+ = "alacritty -t 'File Explorer' --class 'popup' -e lf";
+
+ ${(createKeybinding
+ "q"
+ "Kill current window.")}
+ = "bspc node -c";
+
+ ${(createKeybinding
+ "{1-9,0}"
+ "Switch workspace.")}
+ = "bspc desktop -f {1-9,10}";
+
+ ${(createKeybinding
+ "shift + {1-9,0}"
+ "Move window to workspace.")}
+ = "bspc node -d {1-9,10} --follow";
+
+ ${(createKeybinding
+ "{n,d,m}"
+ "Set current window mode (tiled, floating, fullscreen).")}
+ = "bspc node focused -t {tiled,floating,fullscreen}";
+
+ ${(createKeybinding
+ "{_,shift + }{h,j,k,l}"
+ "Navigate between windows.")}
+ = "bspc node --{focus,swap} {west,south,north,east}";
+
+ # the indentation for each line is required to work with the help prompt
+ ${(createKeybinding
+ "ctrl + {h,j,k,l}"
+ "Resize current window.")}
+ = ''
+ {bspc node @parent/second -z left -20 0; \
+ bspc node @parent/first -z right -20 0, \
+ bspc node @parent/second -z top 0 +20; \
+ bspc node @parent/first -z bottom 0 +20, \
+ bspc node @parent/first -z bottom 0 -20; \
+ bspc node @parent/second -z top 0 -20, \
+ bspc node @parent/first -z right +20 0; \
+ bspc node @parent/second -z left +20 0}
+ '';
+ };
+ };
+}
diff --git a/modules/desktop/window-manager/sxhkd/scripts/show-keybindings.sh b/modules/desktop/window-manager/sxhkd/scripts/show-keybindings.sh
new file mode 100644
index 0000000..db7863d
--- /dev/null
+++ b/modules/desktop/window-manager/sxhkd/scripts/show-keybindings.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+SXHKD_CONFIG="$HOME/.config/sxhkd/sxhkdrc"
+
+awk '
+ /^#/ {
+ desc = substr($0, 3)
+ }
+ /^[[:alnum:]]/ {
+ cmd = $0
+ getline
+ print cmd " : " desc
+ }
+' "$SXHKD_CONFIG" | rofi -dmenu -i -p "Keybindings"
diff --git a/modules/desktop/xresources/default.nix b/modules/desktop/xresources/default.nix
new file mode 100644
index 0000000..65eb812
--- /dev/null
+++ b/modules/desktop/xresources/default.nix
@@ -0,0 +1,7 @@
+{ lib, ... }:
+
+{
+ imports = [
+ ./xinit
+ ];
+}
diff --git a/modules/desktop/xresources/xinit/default.nix b/modules/desktop/xresources/xinit/default.nix
new file mode 100644
index 0000000..f5069fa
--- /dev/null
+++ b/modules/desktop/xresources/xinit/default.nix
@@ -0,0 +1,14 @@
+{ lib, config, ... }:
+
+{
+ options = {
+ xinit.enable = lib.mkEnableOption "Enables xinit.";
+ };
+
+ config = lib.mkIf config.xinit.enable {
+ home.file.".xinitrc" = {
+ source = ./xinitrc;
+ executable = true;
+ };
+ };
+}
diff --git a/modules/desktop/xresources/xinit/xinitrc b/modules/desktop/xresources/xinit/xinitrc
new file mode 100644
index 0000000..2ac4486
--- /dev/null
+++ b/modules/desktop/xresources/xinit/xinitrc
@@ -0,0 +1,4 @@
+#!/bin/sh
+polybar main &
+sxhkd &
+exec bspwm
diff --git a/modules/shell/bash/default.nix b/modules/shell/bash/default.nix
new file mode 100644
index 0000000..f26e3d8
--- /dev/null
+++ b/modules/shell/bash/default.nix
@@ -0,0 +1,13 @@
+{ config, lib, ... }:
+
+{
+ options = {
+ bash.enable = lib.mkEnableOption "Enables bash.";
+ };
+
+ config = lib.mkIf config.bash.enable {
+ programs.bash.enable = true;
+ programs.bash.historyFile = "${config.xdg.cacheHome}/bash/history";
+ home.file."${config.xdg.cacheHome}/bash/histroy".text = ""; # Create the cache directory and histroy file
+ };
+}
diff --git a/modules/shell/default.nix b/modules/shell/default.nix
new file mode 100644
index 0000000..e4c3964
--- /dev/null
+++ b/modules/shell/default.nix
@@ -0,0 +1,8 @@
+{ lib, config, ... }:
+
+{
+ imports = [
+ ./bash
+ ./zsh
+ ];
+}
diff --git a/modules/shell/zsh/default.nix b/modules/shell/zsh/default.nix
new file mode 100644
index 0000000..b4ea77a
--- /dev/null
+++ b/modules/shell/zsh/default.nix
@@ -0,0 +1,15 @@
+{ config, lib, ... }:
+
+{
+ options = {
+ zsh.enable = lib.mkEnableOption "Enables zsh.";
+ };
+
+ config = lib.mkIf config.zsh.enable {
+ programs.zsh.enable = true;
+ programs.zsh.dotDir = ".config/zsh";
+ programs.zsh.history.path = "${config.xdg.cacheHome}/zsh/history";
+ programs.zsh.initExtra = builtins.readFile ./zshrc;
+ programs.zsh.shellAliases = config.programs.bash.shellAliases;
+ };
+}
diff --git a/modules/shell/zsh/zshrc b/modules/shell/zsh/zshrc
new file mode 100644
index 0000000..528bf68
--- /dev/null
+++ b/modules/shell/zsh/zshrc
@@ -0,0 +1,19 @@
+setopt PROMPT_SUBST
+
+autoload -U colors && colors
+
+autoload -Uz vcs_info
+precmd() { vcs_info }
+
+zstyle ':vcs_info:git:*' formats ' %F{yellow}[%F{cyan}%b %c%F{blue}%a%F{yellow}]'
+zstyle ':vcs_info:git:*' actionformats ' %F{yellow}[%F{cyan}%b %c%F{blue}%a%F{yellow}]'
+
+zstyle ':vcs_info:*+set-message:*' hooks git-untracked git-dirty
+
+zstyle ':vcs_info:git:*' check-for-changes true
+zstyle ':vcs_info:git:*' stagedstr '%F{green}✓%f'
+zstyle ':vcs_info:git:*' unstagedstr '%F{red}✗%f'
+zstyle ':vcs_info:git:*' aheadstr '%F{blue}⬆%f'
+zstyle ':vcs_info:git:*' behindstr '%F{yellow}⬇%f'
+PROMPT='%F{red}╭──[%F{green}%m%F{red}@%F{blue}%n%F{red}] %F{magenta}%~%f${vcs_info_msg_0_}%F{red}
+╰─>%f '
diff --git a/modules/tools/default.nix b/modules/tools/default.nix
new file mode 100644
index 0000000..bf96557
--- /dev/null
+++ b/modules/tools/default.nix
@@ -0,0 +1,11 @@
+{ lib, config, ... }:
+
+{
+ imports = [
+ ./editor
+ ./file-manager
+ ./git
+ ./system-monitor
+ ./viewer
+ ];
+}
diff --git a/modules/tools/editor/default.nix b/modules/tools/editor/default.nix
new file mode 100644
index 0000000..1a146bf
--- /dev/null
+++ b/modules/tools/editor/default.nix
@@ -0,0 +1,7 @@
+{ lib, config, ... }:
+
+{
+ imports = [
+ ./neovim
+ ];
+}
diff --git a/modules/tools/editor/neovim/default.nix b/modules/tools/editor/neovim/default.nix
new file mode 100644
index 0000000..e06ec88
--- /dev/null
+++ b/modules/tools/editor/neovim/default.nix
@@ -0,0 +1,43 @@
+{ pkgs, config, lib, ... }:
+
+{
+ options = {
+ neovim.enable = lib.mkEnableOption "Enables neovim.";
+ };
+
+ config = lib.mkIf config.neovim.enable {
+ programs.neovim.enable = true;
+ programs.neovim.viAlias = true;
+ programs.neovim.vimAlias = true;
+ programs.neovim.vimdiffAlias = true;
+ programs.neovim.defaultEditor = true;
+
+ programs.neovim.extraPackages = with pkgs; [
+ gcc # Required for treesitter
+ ];
+
+ programs.neovim.extraLuaConfig =
+ ''
+ ${builtins.readFile ./options.lua}
+ ${builtins.readFile ./keybindings.lua}
+
+ -- Plugins configuration
+ ${builtins.readFile ./plugins/comment.lua}
+ ${builtins.readFile ./plugins/lualine.lua}
+ ${import ./plugins/treesitter.nix config}
+ ${builtins.readFile ./plugins/base16.lua}
+ ${builtins.readFile ./plugins/nvim-tree.lua}
+ '';
+
+ programs.neovim.plugins = with pkgs.vimPlugins; [
+ comment-nvim
+ lualine-nvim
+ nvim-treesitter
+ nvim-web-devicons
+ nvim-tree-lua
+ (base16-vim.overrideAttrs (old: {
+ patchPhase = "ln -s ${config.scheme base16-vim} colors/base16-scheme.vim";
+ }))
+ ];
+ };
+}
diff --git a/modules/tools/editor/neovim/keybindings.lua b/modules/tools/editor/neovim/keybindings.lua
new file mode 100644
index 0000000..3e8e0fa
--- /dev/null
+++ b/modules/tools/editor/neovim/keybindings.lua
@@ -0,0 +1,8 @@
+-- Navigate splits
+vim.keymap.set("n", "<C-h>", ":wincmd h<CR>", { silent = true });
+vim.keymap.set("n", "<C-j>", ":wincmd j<CR>", { silent = true });
+vim.keymap.set("n", "<C-k>", ":wincmd k<CR>", { silent = true });
+vim.keymap.set("n", "<C-l>", ":wincmd l<CR>", { silent = true });
+
+-- NvimTree
+vim.keymap.set("n", "<C-n>", ":NvimTreeToggle<CR>", { silent = true });
diff --git a/modules/tools/editor/neovim/options.lua b/modules/tools/editor/neovim/options.lua
new file mode 100644
index 0000000..b1fe9cb
--- /dev/null
+++ b/modules/tools/editor/neovim/options.lua
@@ -0,0 +1,21 @@
+vim.g.mapleader = " ";
+vim.g.maplocalleader = " ";
+
+vim.o.clipboard = "unnamedplus";
+
+vim.o.number = true;
+vim.o.list = true;
+vim.o.listchars = "tab:| ,trail:_,lead:_";
+
+vim.o.laststatus = 3;
+
+vim.o.signcolumn = "auto";
+vim.opt.fillchars = { eob = " " };
+
+vim.o.tabstop = 2;
+vim.o.shiftwidth = 2;
+vim.o.expandtab = false;
+
+vim.o.updatetime = 300;
+
+vim.o.mouse = "a";
diff --git a/modules/tools/editor/neovim/plugins/base16.lua b/modules/tools/editor/neovim/plugins/base16.lua
new file mode 100644
index 0000000..9843b76
--- /dev/null
+++ b/modules/tools/editor/neovim/plugins/base16.lua
@@ -0,0 +1,6 @@
+vim.o.termguicolors = true;
+vim.opt.termguicolors = true;
+vim.o.background = "dark";
+vim.g.base16colorspace = 256
+vim.cmd.colorscheme("base16-scheme");
+vim.api.nvim_set_hl(0, "LineNr", { link = "Normal" }); -- disable the background of line numbers
diff --git a/modules/tools/editor/neovim/plugins/comment.lua b/modules/tools/editor/neovim/plugins/comment.lua
new file mode 100644
index 0000000..9086261
--- /dev/null
+++ b/modules/tools/editor/neovim/plugins/comment.lua
@@ -0,0 +1 @@
+require("Comment").setup();
diff --git a/modules/tools/editor/neovim/plugins/lualine.lua b/modules/tools/editor/neovim/plugins/lualine.lua
new file mode 100644
index 0000000..ba2eda6
--- /dev/null
+++ b/modules/tools/editor/neovim/plugins/lualine.lua
@@ -0,0 +1,5 @@
+require("lualine").setup {
+ options = {
+ globalstatus = true,
+ },
+};
diff --git a/modules/tools/editor/neovim/plugins/nvim-tree.lua b/modules/tools/editor/neovim/plugins/nvim-tree.lua
new file mode 100644
index 0000000..c6c4102
--- /dev/null
+++ b/modules/tools/editor/neovim/plugins/nvim-tree.lua
@@ -0,0 +1,13 @@
+require("nvim-tree").setup {
+ filters = {
+ enable = false
+ },
+ renderer = {
+ indent_markers = {
+ enable = true
+ },
+ root_folder_label = function(path)
+ return vim.fn.fnamemodify(path, ":t")
+ end,
+ },
+};
diff --git a/modules/tools/editor/neovim/plugins/treesitter.nix b/modules/tools/editor/neovim/plugins/treesitter.nix
new file mode 100644
index 0000000..05f1f2a
--- /dev/null
+++ b/modules/tools/editor/neovim/plugins/treesitter.nix
@@ -0,0 +1,13 @@
+config:
+
+''
+require("nvim-treesitter.configs").setup {
+ auto_install = true,
+ highlight = {
+ enable = true,
+ },
+ parser_install_dir = "${config.xdg.dataHome}/nvim",
+};
+
+vim.opt.runtimepath:append("${config.xdg.dataHome}/nvim");
+''
diff --git a/modules/tools/file-manager/default.nix b/modules/tools/file-manager/default.nix
new file mode 100644
index 0000000..d127a66
--- /dev/null
+++ b/modules/tools/file-manager/default.nix
@@ -0,0 +1,8 @@
+{ lib, config, ... }:
+
+{
+ imports = [
+ ./lf
+ ./lsd
+ ];
+}
diff --git a/modules/tools/file-manager/lf/default.nix b/modules/tools/file-manager/lf/default.nix
new file mode 100644
index 0000000..00784cf
--- /dev/null
+++ b/modules/tools/file-manager/lf/default.nix
@@ -0,0 +1,21 @@
+{ config, pkgs, lib, ... }:
+
+{
+ options = {
+ lf.enable = lib.mkEnableOption "Enables lf.";
+ };
+
+ config = lib.mkIf config.lf.enable {
+ programs.lf.enable = true;
+ programs.lf.settings = {
+ hidden = true;
+ };
+ programs.lf.previewer.source = pkgs.writeShellScript
+ "previewer.sh"
+ (builtins.readFile ./scripts/previewer.sh);
+
+ programs.lf.extraConfig = "set icons";
+
+ xdg.configFile."lf/icons".source = ./icons;
+ };
+}
diff --git a/modules/tools/file-manager/lf/icons b/modules/tools/file-manager/lf/icons
new file mode 100644
index 0000000..2e9d8a2
--- /dev/null
+++ b/modules/tools/file-manager/lf/icons
@@ -0,0 +1,334 @@
+# vim:ft=conf
+
+# These examples require Nerd Fonts or a compatible font to be used.
+# See https://www.nerdfonts.com for more information.
+
+# 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 (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/tools/file-manager/lf/scripts/previewer.sh b/modules/tools/file-manager/lf/scripts/previewer.sh
new file mode 100644
index 0000000..407e0a0
--- /dev/null
+++ b/modules/tools/file-manager/lf/scripts/previewer.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+unset COLORTERM
+bat -pp --line-range=:500 --color=always "$1"
diff --git a/modules/tools/file-manager/lsd/default.nix b/modules/tools/file-manager/lsd/default.nix
new file mode 100644
index 0000000..0f57e6b
--- /dev/null
+++ b/modules/tools/file-manager/lsd/default.nix
@@ -0,0 +1,17 @@
+{ pkgs, lib, config, ... }:
+
+{
+ options = {
+ lsd.enable = lib.mkEnableOption "Enables lsd.";
+ };
+
+ config = lib.mkIf config.lsd.enable {
+ programs.lsd.enable = true;
+ programs.lsd.enableAliases = true;
+ programs.bash.shellAliases."tree" = "${pkgs.lsd}/bin/lsd -a --tree";
+
+ programs.lsd.settings = {
+ icons.separator = " ";
+ };
+ };
+}
diff --git a/modules/tools/git/default.nix b/modules/tools/git/default.nix
new file mode 100644
index 0000000..7396cb8
--- /dev/null
+++ b/modules/tools/git/default.nix
@@ -0,0 +1,20 @@
+{ lib, config, ... }:
+
+{
+ options = {
+ git.enable = lib.mkEnableOption "Enables git.";
+ };
+
+ config = lib.mkIf config.git.enable {
+ programs.git.enable = true;
+ programs.git.userEmail = "54011232+arpitchakladar@users.noreply.github.com";
+ programs.git.userName = "Arpit Chakladar";
+ programs.git.extraConfig = {
+ 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/tools/system-monitor/default.nix b/modules/tools/system-monitor/default.nix
new file mode 100644
index 0000000..a5b569c
--- /dev/null
+++ b/modules/tools/system-monitor/default.nix
@@ -0,0 +1,7 @@
+{ ... }:
+
+{
+ imports = [
+ ./htop
+ ];
+}
diff --git a/modules/tools/system-monitor/htop/default.nix b/modules/tools/system-monitor/htop/default.nix
new file mode 100644
index 0000000..f27174a
--- /dev/null
+++ b/modules/tools/system-monitor/htop/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, lib, config, ... }:
+
+{
+ options = {
+ htop.enable = lib.mkEnableOption "Enables htop.";
+ };
+
+ config = lib.mkIf config.htop.enable {
+ programs.htop.enable = true;
+ programs.htop.package = pkgs.htop-vim;
+ };
+}
diff --git a/modules/tools/viewer/bat/default.nix b/modules/tools/viewer/bat/default.nix
new file mode 100644
index 0000000..cc01f82
--- /dev/null
+++ b/modules/tools/viewer/bat/default.nix
@@ -0,0 +1,14 @@
+{ config, lib, ... }:
+
+{
+ options = {
+ bat.enable = lib.mkEnableOption "Enables bat.";
+ };
+
+ config = lib.mkIf config.bat.enable {
+ programs.bat.enable = true;
+ programs.bat.config.theme = "customTheme";
+ xdg.configFile."bat/themes/customTheme.tmTheme".text
+ = import ./theme.nix config;
+ };
+}
diff --git a/modules/tools/viewer/bat/theme.nix b/modules/tools/viewer/bat/theme.nix
new file mode 100644
index 0000000..e345ee4
--- /dev/null
+++ b/modules/tools/viewer/bat/theme.nix
@@ -0,0 +1,124 @@
+config:
+
+with config.scheme.withHashtag;
+''
+<?xml version="1.0" encoding="UTF-8"?>
+<plist version="1.0">
+<dict>
+ <key>name</key>
+ <string>customTheme</string>
+ <key>settings</key>
+ <array>
+ <!-- General Colors -->
+ <dict>
+ <key>settings</key>
+ <dict>
+ <key>background</key>
+ <string>#0F1419</string> <!-- Background (base00) -->
+ <key>foreground</key>
+ <string>#E6E1CF</string> <!-- Foreground (base05) -->
+ <key>caret</key>
+ <string>#F3F4F5</string> <!-- Caret (base07) -->
+ <key>invisibles</key>
+ <string>#3E4B59</string> <!-- Invisibles (base03) -->
+ <key>lineHighlight</key>
+ <string>#272D38</string> <!-- Line highlight (base02) -->
+ <key>selection</key>
+ <string>#3E4B59</string> <!-- Selection (base03) -->
+ </dict>
+ </dict>
+
+ <!-- Syntax-Specific Colors -->
+ <dict>
+ <key>scope</key>
+ <string>comment</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#BFBDB6</string> <!-- Comments (base04) -->
+ </dict>
+ </dict>
+
+ <dict>
+ <key>scope</key>
+ <string>string</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#FFB454</string> <!-- Strings (base0A) -->
+ </dict>
+ </dict>
+
+ <dict>
+ <key>scope</key>
+ <string>constant.numeric</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#FF8F40</string> <!-- Numbers (base09) -->
+ </dict>
+ </dict>
+
+ <dict>
+ <key>scope</key>
+ <string>variable</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#F07178</string> <!-- Variables (base08) -->
+ </dict>
+ </dict>
+
+ <dict>
+ <key>scope</key>
+ <string>keyword</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#59C2FF</string> <!-- Keywords (base0D) -->
+ </dict>
+ </dict>
+
+ <dict>
+ <key>scope</key>
+ <string>support.function</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#D2A6FF</string> <!-- Functions (base0E) -->
+ </dict>
+ </dict>
+
+ <dict>
+ <key>scope</key>
+ <string>constant.language</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#B8CC52</string> <!-- Constants (base0B) -->
+ </dict>
+ </dict>
+
+ <dict>
+ <key>scope</key>
+ <string>entity.name.tag</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#95E6CB</string> <!-- Tags (base0C) -->
+ </dict>
+ </dict>
+
+ <dict>
+ <key>scope</key>
+ <string>invalid</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#E6B673</string> <!-- Invalid (base0F) -->
+ </dict>
+ </dict>
+ </array>
+</dict>
+</plist>
+''
diff --git a/modules/tools/viewer/default.nix b/modules/tools/viewer/default.nix
new file mode 100644
index 0000000..dde782b
--- /dev/null
+++ b/modules/tools/viewer/default.nix
@@ -0,0 +1,7 @@
+{ lib, config, ... }:
+
+{
+ imports = [
+ ./bat
+ ];
+}