This commit is contained in:
2026-02-18 21:23:56 +01:00
commit 11ce3ba32f
41 changed files with 2422 additions and 0 deletions

21
home/default.nix Normal file
View File

@@ -0,0 +1,21 @@
{ primaryUser, inputs, ... }:
{
imports = [
./packages.nix
./git.nix
./shell.nix
inputs.nixvim.homeModules.nixvim
./neovim
# ./python.nix
];
home = {
username = primaryUser;
stateVersion = "25.11";
sessionVariables = {
GROQ_API_KEY = "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";
};
};
}

171
home/fastfetch.jsonc Normal file
View File

@@ -0,0 +1,171 @@
{
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
"logo": {
"type": "kitty-icat",
"source": "nixos",
// "height": 15,
"width": 12,
"padding": {
"top": 0,
"left": 0
}
},
"modules": [
"break",
{
"type": "custom",
"format": "\u001b[90m┌──────────────────────Hardware──────────────────────┐"
},
{
"type": "host",
"key": " PC",
"keyColor": "green"
},
{
"type": "cpu",
"key": "│ ├",
"keyColor": "green"
},
{
"type": "gpu",
"key": "│ ├󰍛",
"keyColor": "green"
},
{
"type": "disk",
"key": "│ ├",
"keyColor": "green"
},
{
"type": "memory",
"key": "└ └󰍛",
"keyColor": "green"
},
{
"type": "custom",
"format": "\u001b[90m└────────────────────────────────────────────────────┘"
},
"break",
{
"type": "custom",
"format": "\u001b[90m┌──────────────────────Software──────────────────────┐"
},
{
"type": "os",
"key": " OS",
"keyColor": "yellow"
},
{
"type": "kernel",
"key": "│ ├",
"keyColor": "yellow"
},
{
"type": "bios",
"key": "│ ├",
"keyColor": "yellow"
},
{
"type": "packages",
"key": "│ ├󰏖",
"keyColor": "yellow"
},
{
"type": "shell",
"key": "└ └",
"keyColor": "yellow"
},
"break",
{
"type": "de",
"key": " DE",
"keyColor": "blue"
},
{
"type": "lm",
"key": "│ ├",
"keyColor": "blue"
},
{
"type": "wm",
"key": "│ ├",
"keyColor": "blue"
},
{
"type": "wmtheme",
"key": "│ ├󰉼",
"keyColor": "blue"
},
{
"type": "terminal",
"key": "└ └",
"keyColor": "blue"
},
{
"type": "custom",
"format": "\u001b[90m└────────────────────────────────────────────────────┘"
},
"break",
{
"type": "custom",
"format": "\u001b[90m┌─────────────────Uptime / Age / DT──────────────────┐"
},
{
"type": "command",
"key": " OS Age ",
"keyColor": "magenta",
"text": "birth_install=$(stat -c %W /); current=$(date +%s); time_progression=$((current - birth_install)); days_difference=$((time_progression / 86400)); echo $days_difference days"
},
{
"type": "uptime",
"key": " Uptime ",
"keyColor": "magenta"
},
{
"type": "datetime",
"key": " DateTime ",
"keyColor": "magenta"
},
{
"type": "custom",
"format": "\u001b[90m└────────────────────────────────────────────────────┘"
},
"break",
{
"type": "custom",
"format": "\u001b[90m┌─────────────────────Networking─────────────────────┐"
},
{
"type": "publicip",
"key": " Public ",
"keyColor": "magenta"
},
{
"type": "localip",
"key": " Local ",
"keyColor": "magenta"
},
{
"type": "dns",
"key": " DNS ",
"keyColor": "magenta"
},
{
"type": "netio",
"key": " Net I/O ",
"keyColor": "magenta"
},
{
"type": "custom",
"format": "\u001b[90m└────────────────────────────────────────────────────┘"
},
{
"type": "colors",
"paddingLeft": 2,
"symbol": "circle"
},
"break",
]
}

26
home/git.nix Normal file
View File

@@ -0,0 +1,26 @@
{ pkgs, primaryUser, ... }:
{
programs.git = {
enable = true;
settings = {
user = {
name = "DerGrumpf"; # TODO replace
email = "p.keier@beyerstedt-it.de"; # TODO replace
};
github = {
user = primaryUser;
};
init = {
defaultBranch = "main";
};
};
lfs.enable = true;
ignores = [ "**/.DS_STORE" ];
};
home.packages = with pkgs; [
gh
gitui
];
}

147
home/neovim/alpha.nix Normal file
View File

@@ -0,0 +1,147 @@
{ pkgs, ... }: {
# Alpha: Start screen/dashboard for Neovim
# Shows a custom ASCII art header and quick action buttons on startup.
programs.nixvim.plugins.alpha = {
enable = true;
settings.layout = [
{
type = "padding";
val = 2;
}
{
type = "text";
val = [
""
""
""
""
""
""
""
""
""
""
""
""
""
""
""
""
""
""
""
];
opts = {
position = "center";
hl = "Type";
};
}
{
type = "padding";
val = 2;
}
{
type = "group";
val = [
{
type = "button";
val = "[+] New file";
on_press.__raw =
"function() vim.cmd[[ene]] vim.cmd[[startinsert]] end";
opts = {
keymap = [ "n" "e" ":ene <BAR> startinsert <CR>" { } ];
shortcut = "e";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "Keyword";
};
}
{
type = "button";
val = "[?] Find file";
on_press.__raw = "function() vim.cmd[[Telescope find_files]] end";
opts = {
keymap = [ "n" "f" ":Telescope find_files <CR>" { } ];
shortcut = "f";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "Keyword";
};
}
{
type = "button";
val = "[~] Recent files";
on_press.__raw = "function() vim.cmd[[Telescope oldfiles]] end";
opts = {
keymap = [ "n" "r" ":Telescope oldfiles <CR>" { } ];
shortcut = "r";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "Keyword";
};
}
{
type = "button";
val = "[Y] Yazi";
on_press.__raw = "function() require('yazi').yazi() end";
opts = {
keymap = [ "n" "y" ":Yazi<CR>" { } ];
shortcut = "y";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "Keyword";
};
}
{
type = "button";
val = "[A] Open Prompt";
#on_press.__raw = "function() require('yazi').yazi() end";
opts = {
keymap = [ "n" "a" ":AvanteChatNew<CR>" { } ];
shortcut = "a";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "Keyword";
};
}
{
type = "button";
val = "[X] Quit";
on_press.__raw = "function() vim.cmd[[qa]] end";
opts = {
keymap = [ "n" "q" ":qa<CR>" { } ];
shortcut = "q";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "Keyword";
};
}
];
}
{
type = "padding";
val = 2;
}
{
type = "text";
val = "Circuits hum in anticipation of your will.";
opts = {
position = "center";
hl = "Comment";
};
}
];
};
}

106
home/neovim/avante.nix Normal file
View File

@@ -0,0 +1,106 @@
{ pkgs, ... }: {
# Avante: AI-powered coding assistant (Cursor-like experience in Neovim)
programs.nixvim = {
plugins = {
markdown-preview.enable = true;
render-markdown.enable = true;
#extraConfigLuaPre = ''
# vim.env.GROQ_API_KEY = os.getenv("GROQ_API_KEY")
#'';
# TODO: Integrate CoPilot https://github.com/settings/copilot/features
avante = {
enable = true;
autoLoad = true;
settings = {
provider = "groq";
providers.groq = {
__inherited_from = "openai";
api_key_name = "GROQ_API_KEY";
endpoint = "https://api.groq.com/openai/v1/";
model = "groq/compound-mini";
disable_tools = true;
extra_request_body = {
temperature = 1;
max_tokens = 8192;
tools = null;
tool_choice = "none";
};
};
# auto_suggestions_provider = "copilot";
render = { markdown = true; };
behaviour = {
auto_suggestions = false;
auto_set_highlight_group = true;
auto_set_keymaps = true;
auto_apply_diff_after_generation = false;
support_paste_from_clipboard = false;
};
mappings = {
ask = "<leader>aa";
edit = "<leader>ae";
refresh = "<leader>ar";
diff = {
ours = "co";
theirs = "ct";
all_theirs = "ca";
both = "cb";
cursor = "cc";
next = "]x";
prev = "[x";
};
suggestion = {
accept = "<M-l>";
next = "<M-]>";
prev = "<M-[>";
dismiss = "<C-]>";
};
jump = {
next = "]]";
prev = "[[";
};
submit = {
normal = "<CR>";
insert = "<C-s>";
};
sidebar = {
switch_windows = "<Tab>";
reverse_switch_windows = "<S-Tab>";
};
};
hints = { enabled = true; };
windows = {
position = "right";
wrap = true;
width = 30;
sidebar_header = {
align = "center";
rounded = true;
};
};
highlights = {
diff = {
current = "DiffText";
incoming = "DiffAdd";
};
};
diff = {
autojump = true;
list_opener = "copen";
};
};
};
extraPackages = with pkgs; [ curl ];
};
};
}

View File

@@ -0,0 +1,34 @@
{ pkgs, ... }:
{
# Catppuccin: Soothing pastel theme for Neovim
# Provides consistent theming across plugins with transparency support.
programs.nixvim = {
colorschemes.catppuccin = {
enable = true;
settings = {
flavour = "mocha";
transparent_background = true;
term_colors = true;
integrations = {
treesitter = true;
cmp = true;
gitsigns = true;
telescope = {
enabled = true;
};
notify = true;
mini = {
enabled = true;
};
};
};
};
# Custom highlight overrides
extraConfigLua = ''
local colors = require("catppuccin.palettes").get_palette("mocha")
vim.api.nvim_set_hl(0, "LineNr", { fg = colors.text, bg = "NONE" })
vim.api.nvim_set_hl(0, "CursorLineNr", { fg = colors.pink, bg = "NONE", bold = true })
'';
};
}

33
home/neovim/conform.nix Normal file
View File

@@ -0,0 +1,33 @@
{ pkgs, ... }: {
# Conform: Code formatter that runs external formatting tools
# Automatically formats code on save for consistent style.
programs.nixvim = {
plugins.conform-nvim = {
enable = true;
settings = {
formatters_by_ft = {
lua = [ "stylua" ];
nix = [ "nixfmt" ];
python = [ "black" ];
rust = [ "rustfmt" ];
rasi = [ "prettierd" ];
};
format_on_save = {
timeout_ms = 2000;
lsp_fallback = true;
};
};
};
# Install formatters
extraPackages = with pkgs; [
stylua
nixfmt
black
rustfmt
prettierd
];
};
}

95
home/neovim/default.nix Normal file
View File

@@ -0,0 +1,95 @@
{ ... }:
{
imports = [
./treesitter.nix
./lint.nix
./lsp.nix
./conform.nix
./lualine.nix
./yazi.nix
./toggleterm.nix
./telescope.nix
./catppuccin.nix
./alpha.nix
./avante.nix
./openscad.nix
# ./molten.nix
./which-key.nix
];
programs.nixvim = {
enable = true;
defaultEditor = true;
# Leader key
globals.mapleader = " ";
plugins.web-devicons.enable = true;
opts = {
number = true; # Show line numbers
cursorline = true; # Highlight current line
showmode = true; # already in statusline
hlsearch = true; # Highlight search result
incsearch = true; # Incremental Search
tabstop = 4;
termguicolors = true; # Enable 24-bit colormode
};
# Clipboard keymaps - yank to system clipboard
keymaps = [
# Yank operations
{
mode = "n";
key = "y";
action = ''"+y'';
options.desc = "Yank to clipboard";
}
{
mode = "v";
key = "y";
action = ''"+y'';
options.desc = "Yank to clipboard";
}
{
mode = "n";
key = "Y";
action = ''"+Y'';
options.desc = "Yank line to clipboard";
}
# Delete operations
{
mode = "n";
key = "d";
action = ''"+d'';
options.desc = "Delete to clipboard";
}
{
mode = "v";
key = "d";
action = ''"+d'';
options.desc = "Delete to clipboard";
}
{
mode = "n";
key = "D";
action = ''"+D'';
options.desc = "Delete line to clipboard";
}
# Paste operations
{
mode = "n";
key = "p";
action = ''"+p'';
options.desc = "Paste from clipboard";
}
{
mode = "v";
key = "p";
action = ''"+p'';
options.desc = "Paste from clipboard";
}
];
};
}

42
home/neovim/lint.nix Normal file
View File

@@ -0,0 +1,42 @@
{ pkgs, ... }:
{
# nvim-lint: Asynchronous linter that runs external linting tools
# to find errors and style issues without blocking the editor.
# Runs automatically after saving files.
programs.nixvim = {
plugins.lint = {
enable = true;
# Configure linters for each filetype
lintersByFt = {
lua = [ "luacheck" ];
nix = [ "statix" ]; # Nix static analyzer
python = [ "ruff" ];
javascript = [ "eslint" ];
rust = [ "clippy" ];
# rasi has no common linter
};
# Trigger linting after saving a file
autoCmd = {
event = [ "BufWritePost" ];
callback = {
__raw = ''
function()
require('lint').try_lint()
end
'';
};
};
};
# Install linter binaries
extraPackages = with pkgs; [
lua54Packages.luacheck
statix
ruff
nodePackages.eslint
clippy
];
};
}

View File

@@ -0,0 +1,20 @@
{ pkgs, ... }:
{
# Live Server: Auto-reload browser for web development
# Uses browser-sync for live reload functionality
programs.nixvim = {
keymaps = [
{
mode = "n";
key = "<leader>ls";
action = "<cmd>terminal browser-sync start --server --files '*.html, *.css, *.js' --no-notify<cr>";
options.desc = "Start live server (browser-sync)";
}
];
extraPackages = with pkgs; [
nodePackages.browser-sync
biome
];
};
}

91
home/neovim/lsp.nix Normal file
View File

@@ -0,0 +1,91 @@
{ pkgs, ... }:
{
# LSP configuration: Language Server Protocol provides IDE features
# like autocomplete, go-to-definition, diagnostics, and more.
programs.nixvim = {
plugins = {
# LSP configuration
lsp = {
enable = true;
# Language servers for each language
servers = {
lua_ls = {
enable = true;
settings = {
Lua = {
runtime.version = "LuaJIT";
diagnostics.globals = [ "vim" ];
workspace.library = [ ]; # Populated by nixvim
telemetry.enable = false;
};
};
};
nil_ls.enable = true; # Nix language server
rust_analyzer = {
enable = true; # Rust language server
installCargo = true;
installRustc = true;
};
pylsp.enable = true; # Python language server
};
# Keymaps for LSP actions
keymaps = {
diagnostic = {
"<leader>e" = "open_float";
"[d" = "goto_prev";
"]d" = "goto_next";
};
lspBuf = {
"gd" = "definition";
"K" = "hover";
"<leader>rn" = "rename";
"<leader>ca" = "code_action";
};
};
};
# Autocompletion
cmp = {
enable = true;
autoEnableSources = true;
settings = {
snippet.expand = ''
function(args)
require('luasnip').lsp_expand(args.body)
end
'';
mapping = {
"<C-b>" = "cmp.mapping.scroll_docs(-4)";
"<C-f>" = "cmp.mapping.scroll_docs(4)";
"<C-Space>" = "cmp.mapping.complete()";
"<C-e>" = "cmp.mapping.abort()";
"<CR>" = "cmp.mapping.confirm({ select = true })";
};
sources = [
{ name = "nvim_lsp"; }
{ name = "luasnip"; }
{ name = "buffer"; }
{ name = "path"; }
];
};
};
# Snippet engine (required for completion)
luasnip.enable = true;
};
# Install LSP servers
extraPackages = with pkgs; [
lua-language-server
nil
rust-analyzer
# python311Packages.python-lsp-server
];
};
}

22
home/neovim/lualine.nix Normal file
View File

@@ -0,0 +1,22 @@
{ pkgs, ... }:
{
# Lualine: Fast and customizable statusline for Neovim
# Displays file info, git status, diagnostics, and mode at the bottom of the editor.
programs.nixvim.plugins.lualine = {
enable = true;
settings = {
options = {
theme = "catppuccin";
component_separators = {
left = "|";
right = "|";
};
section_separators = {
left = "";
right = "";
};
};
};
};
}

43
home/neovim/molten.nix Normal file
View File

@@ -0,0 +1,43 @@
{ pkgs, ... }: {
programs.nixvim = {
plugins.molten = {
enable = true;
python3Dependencies = p:
with p; [
pynvim
jupyter-client
cairosvg
ipython
nbformat
ipykernel
pnglatex
plotly
kaleido
pyperclip
];
settings = {
kernel_name = "python3";
auto_open_output = true;
output_win_max_width = 80;
output_win_max_height = 20;
};
};
keymaps = [
{
mode = "n";
key = "<leader>ml";
action = "<cmd>MoltenEvaluateLine<CR>";
options.desc = "Molten: Evaluate line";
options.silent = true;
}
{
mode = "v";
key = "<leader>mv";
action = "<Cmd>MoltenEvaluateVisual<CR>";
options.desc = "Molten: Evaluate selection";
options.silent = true;
}
];
};
}

28
home/neovim/openscad.nix Normal file
View File

@@ -0,0 +1,28 @@
{ pkgs, ... }: {
# OpenSCAD: 3D modeling language support with syntax highlighting,
# cheatsheet, snippets, offline manual and fuzzy help
programs.nixvim = {
plugins.openscad = {
enable = true;
autoLoad = true;
settings = {
fuzzy_finder = "fzf";
auto_open = true;
cheatsheet_toggle_key = "<leader>os";
default_mappings = true;
exec_openscad_trig_key = "<leader>oo";
help_manual_trig_key = "<leader>om";
help_trig_key = "<leader>oh";
top_toggle = "<leader>oc";
};
};
# Install OpenSCAD binary for preview/compilation
extraPackages = with pkgs; [
openscad
zathura # PDF viewer for manual
fzf
];
};
}

27
home/neovim/telescope.nix Normal file
View File

@@ -0,0 +1,27 @@
{ pkgs, ... }:
{
# Telescope: Fuzzy finder for files, buffers, grep, and more
# Provides fast search and navigation throughout your project.
programs.nixvim.plugins.telescope = {
enable = true;
keymaps = {
"<leader>ff" = {
action = "find_files";
options.desc = "Telescope find files";
};
"<leader>fg" = {
action = "live_grep";
options.desc = "Telescope live grep";
};
"<leader>fb" = {
action = "buffers";
options.desc = "Telescope buffers";
};
"<leader>fh" = {
action = "help_tags";
options.desc = "Telescope help tags";
};
};
};
}

View File

@@ -0,0 +1,64 @@
{ pkgs, ... }:
{
# ToggleTerm: Terminal emulator inside Neovim
# Provides floating, horizontal, and vertical terminal windows.
programs.nixvim.plugins.toggleterm = {
enable = true;
settings = {
size = 20;
open_mapping = "[[<c-\\>]]";
direction = "float";
float_opts = {
border = "single";
width = 200;
height = 40;
};
};
};
programs.nixvim.keymaps = [
{
mode = "n";
key = "<leader>h";
action.__raw = ''
function()
require("toggleterm").toggle(1, 10, vim.loop.cwd(), "horizontal")
end
'';
options.desc = "Toggle terminal (horizontal)";
}
{
mode = "n";
key = "<leader>v";
action.__raw = ''
function()
require("toggleterm").toggle(2, 60, vim.loop.cwd(), "vertical")
end
'';
options.desc = "Toggle terminal (vertical)";
}
{
mode = "n";
key = "<leader>ft";
action.__raw = ''
function()
require("toggleterm").toggle(3, 20, vim.loop.cwd(), "float")
end
'';
options.desc = "Toggle terminal (float)";
}
{
mode = "t";
key = "<C-t>";
action = "<Cmd>ToggleTerm<CR>";
options.desc = "Toggle terminal";
}
{
mode = "t";
key = "<C-v>";
action = "<C-\\><C-n>v";
options.desc = "Exit terminal and enter visual mode";
}
];
}

View File

@@ -0,0 +1,24 @@
{ pkgs, ... }:
{
# Install language parsers declaratively
# Syntax Highlighting
programs.nixvim.plugins.treesitter = {
enable = true;
grammarPackages = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [
lua
nix
python
javascript
rust
rasi
];
settings = {
highlight = {
enable = true;
additional_vim_regex_highlighting = false;
};
};
};
}

94
home/neovim/which-key.nix Normal file
View File

@@ -0,0 +1,94 @@
{ pkgs, ... }: {
# Which-key: Display available keybindings in popup
# Shows all possible key combinations after pressing leader or other prefix keys
programs.nixvim.plugins.which-key = {
enable = true;
settings = {
delay = 500; # Time in ms before popup shows
icons = {
breadcrumb = "»";
separator = "";
group = "+";
};
# Organize keymaps into named groups
spec = [
# Leader key groups
{
__unkeyed-1 = "<leader>a";
group = "Avante AI";
icon = "🤖";
}
{
__unkeyed-1 = "<leader>f";
group = "Find/Files/Terminal";
icon = "🔍";
}
{
__unkeyed-1 = "<leader>m";
group = "Molten (Jupyter)";
icon = "📓";
}
{
__unkeyed-1 = "<leader>o";
group = "OpenSCAD";
icon = "🔧";
}
# Bracket navigation groups
{
__unkeyed-1 = "[";
group = "Previous";
icon = "";
}
{
__unkeyed-1 = "]";
group = "Next";
icon = "";
}
# g prefix groups
{
__unkeyed-1 = "g";
group = "Go/LSP";
icon = "🎯";
}
{
__unkeyed-1 = "gr";
group = "LSP References/Rename";
icon = "🔗";
}
{
__unkeyed-1 = "gc";
group = "Comments";
icon = "💬";
}
# l prefix
{
__unkeyed-1 = "<leader>l";
group = "Live Server";
icon = "🌐";
}
# z prefix
{
__unkeyed-1 = "z";
group = "Folds/Spell";
icon = "📋";
}
];
# Hide specific mappings to reduce clutter
disable = {
builtin_keys = {
# Hide these default vim keys from which-key
i = [ "<C-R>" "<C-W>" ];
n = [ "<C-W>" ];
};
};
};
};
}

41
home/neovim/yazi.nix Normal file
View File

@@ -0,0 +1,41 @@
{ pkgs, ... }: {
# Yazi: Terminal file manager integration for Neovim
# Provides a fast, visual way to browse and manage files.
programs.nixvim = {
# Use extraPlugins to manually load yazi.nvim
extraPlugins = with pkgs.vimPlugins; [ yazi-nvim ];
# Configure yazi after it's loaded
extraConfigLua = ''
require('yazi').setup({
open_for_directories = true,
})
'';
keymaps = [
{
mode = "n";
key = "<leader>fy";
action.__raw = ''
function()
require('yazi').yazi(nil, vim.loop.cwd())
end
'';
options.desc = "Open Yazi file manager";
}
{
mode = "n";
key = "<leader>fd";
action.__raw = ''
function()
require('yazi').yazi(nil, vim.fn.expand("%:p:h"))
end
'';
options.desc = "Open Yazi in current file directory";
}
];
# Install yazi terminal program
extraPackages = with pkgs; [ yazi ];
};
}

27
home/packages.nix Normal file
View File

@@ -0,0 +1,27 @@
{ pkgs, ... }:
{
home = {
packages = with pkgs; [
# dev tools
curl
wget
vim
htop
tree
ripgrep
unrar
# programming languages
#mise # node, deno, bun, rust, python, etc.
# PDF Tools
#pandoc
#texlive.combined.scheme-full
#wkhtmltopdf
# misc
yt-dlp
ffmpeg
];
};
}

26
home/python.nix Normal file
View File

@@ -0,0 +1,26 @@
{ pkgs, ... }: {
home.packages = with pkgs; [
# Python 3.13 (newest stable)
python313
python313Packages.pip
python313Packages.virtualenv
# Additional useful tools
python313Packages.pipx # Install Python apps in isolated environments
uv # Fast Python package installer (alternative to pip)
];
# Set up default Python version
home.sessionVariables = { PYTHON = "${pkgs.python313}/bin/python3"; };
# Shell aliases for convenience
programs.zsh.shellAliases = {
venv = "python3 -m venv";
activate = "source venv/bin/activate";
};
programs.fish.shellAliases = {
venv = "python3 -m venv";
activate = "source venv/bin/activate.fish";
};
}

209
home/shell.nix Normal file
View File

@@ -0,0 +1,209 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
eza # ls replacement
fzf # FuzzyFinder
tdf # terminal pdf viewer
jq # json parser
tree
fastfetch # system stats
tabiew # Table viewer
glow # MD Viewer
btop
zoxide # Move to fish
llm # LLM in the Terminal
# Fun stuff
lolcat
cmatrix
];
programs.kitty = {
enable = true;
themeFile = "Catppuccin-Mocha";
font = {
name = "Fira Code Nerd Font";
size = 12;
};
settings = {
confirm_os_window_close = 0;
dynamic_background_opacity = true; # ctrl+shift+a>m/l
enable_audio_bell = false;
mouse_hide_wait = 3.0;
window_padding_width = 10;
background_opacity = 0.8;
background_blur = 5;
tab_bar_min_tabs = 1;
tab_bar_edge = "bottom";
tab_bar_style = "custom"; # Should be changed to custom
tab_title_template = "{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}";
symbol_map =
let
mappings = [
"U+23FB-U+23FE"
"U+2B58"
"U+E200-U+E2A9"
"U+E0A0-U+E0A3"
"U+E0B0-U+E0BF"
"U+E0C0-U+E0C8"
"U+E0CC-U+E0CF"
"U+E0D0-U+E0D2"
"U+E0D4"
"U+E700-U+E7C5"
"U+F000-U+F2E0"
"U+2665"
"U+26A1"
"U+F400-U+F4A8"
"U+F67C"
"U+E000-U+E00A"
"U+F300-U+F313"
"U+E5FA-U+E62B"
];
in
(builtins.concatStringsSep "," mappings) + " Symbols Nerd Font Mono";
};
};
programs.yazi = {
enable = true;
enableBashIntegration = true;
enableZshIntegration = true;
enableFishIntegration = true;
settings = {
ration = [
1
3
4
];
};
};
programs.zsh = {
enable = true;
enableCompletion = true;
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
shellAliases = {
ls = "eza";
la = "eza -la";
f = "fzf";
i = "kitty +kitten icat";
"nix-switch" = "sudo nixos-rebuild switch --flake .#rpi-4";
};
initContent = ''
fastfetch
ai() {
llm -m groq/groq/compound "$@" | glow
}
'';
};
programs.fish = {
enable = true;
shellAliases = {
ls = "eza";
la = "eza -la";
f = "fzf";
i = "kitty +kitten icat";
"nix-switch" = "sudo nixos-rebuild switch --flake .#rpi-4";
};
interactiveShellInit = ''
starship init fish | source
fzf --fish | source
function fish_greeting
fastfetch
end
'';
functions.ai = {
body = ''
llm -m groq/groq/compound $argv | glow
'';
};
};
programs.starship = {
enable = true;
settings = {
add_newline = true;
command_timeout = 500;
format = ''
$username$hostname $directory $git_branch$git_status
$character '';
right_format = "$cmd_duration";
username = {
style_user = "bold #cba6f7";
style_root = "bold #f38ba8";
format = "[](bold #a6e3a1)[$user]($style)";
show_always = true;
};
hostname = {
style = "bold #74c7ec";
format = "[@](bold #fab387)[$hostname]($style)";
ssh_only = false;
};
directory = {
style = "bold #a6e3a1";
truncation_length = 0;
truncation_symbol = "";
format = "[ ](bold #f38ba8)[$path ]($style)";
};
git_branch = {
format = "[$branch]($style)";
style = "bold #f9e2af";
};
# Git status module settings
git_status = {
format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](red) ($ahead_behind$stashed)]($style)";
style = "bold #a6e3a1";
conflicted = "";
untracked = "";
modified = "";
staged = "";
renamed = "";
deleted = "";
};
# Command duration module
cmd_duration = {
format = "[$duration]($style)";
style = "bold #cdd6f4";
min_time = 5000; # Only show if command takes longer than 5 seconds
};
# Character module (prompt symbol)
character = {
success_symbol = "[ ](bold #a6e3a1)";
error_symbol = "[ ](bold #f38ba8)";
};
nix_shell = {
format = "[$symbol$state( ($name))]($style)";
symbol = "U+02744";
style = "bold #89dceb";
};
};
};
home.file = {
".config/fastfetch/config.jsonc".source = ./fastfetch.jsonc;
".config/tabiew/theme.toml".source = ./tabiew.toml;
".config/kitty/tab_bar.py".source = ./tab_bar.py;
};
}

34
home/tab_bar.py Normal file
View File

@@ -0,0 +1,34 @@
from datetime import datetime
from kitty.tab_bar import DrawData, ExtraData, TabBarData, as_rgb
from kitty.fast_data_types import Screen
def draw_tab(
draw_data: DrawData,
screen: Screen,
tab: TabBarData,
before: int,
max_title_length: int,
index: int,
is_last: bool,
extra_data: ExtraData,
) -> int:
# Left side: Current directory or command
screen.cursor.fg = as_rgb(int("a6e3a1", 16))
screen.cursor.bg = as_rgb(int("1e1e2e", 16))
# Get the foreground process (command) or use title
title = tab.active_fg or tab.title or "shell"
screen.draw(f" {title} ")
# Middle: Nix icon
screen.cursor.fg = as_rgb(int("89dceb", 16))
screen.draw("")
# Right: Current time
screen.cursor.fg = as_rgb(int("cdd6f4", 16))
current_time = datetime.now().strftime("%H:%M")
screen.draw(f"{current_time} ")
return screen.cursor.x

141
home/tabiew.toml Normal file
View File

@@ -0,0 +1,141 @@
# Catppuccin Mocha Theme for Tabiew
# Base colors from Catppuccin Mocha palette
[table_header]
fg = "#F5E0DC" # Rosewater
bg = "#181825" # Mantle
add_modifier = "BOLD"
sub_modifier = ""
[[table_headers]]
fg = "#F5C2E7" # Pink
bg = "#181825" # Mantle
add_modifier = "BOLD"
sub_modifier = ""
[[table_headers]]
fg = "#CBA6F7" # Mauve
bg = "#181825" # Mantle
add_modifier = "BOLD"
sub_modifier = ""
[[table_headers]]
fg = "#89DCEB" # Sky
bg = "#181825" # Mantle
add_modifier = "BOLD"
sub_modifier = ""
[[rows]]
fg = "#CDD6F4" # Text
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[rows]]
fg = "#CDD6F4" # Text
bg = "#181825" # Mantle
add_modifier = ""
sub_modifier = ""
[highlight]
fg = "#181825" # Mantle
bg = "#F9E2AF" # Yellow
add_modifier = "BOLD"
sub_modifier = ""
[[table_tags]]
fg = "#181825" # Mantle
bg = "#F38BA8" # Red
add_modifier = "BOLD"
sub_modifier = ""
[[table_tags]]
fg = "#181825" # Mantle
bg = "#A6E3A1" # Green
add_modifier = "BOLD"
sub_modifier = ""
[block]
fg = "#FAB387" # Peach
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[block_tag]
fg = "#181825" # Mantle
bg = "#FAB387" # Peach
add_modifier = "BOLD"
sub_modifier = ""
[text]
fg = "#CDD6F4" # Text
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[subtext]
fg = "#9399B2" # Overlay1
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[error]
fg = "#CDD6F4" # Text
bg = "#F38BA8" # Red
add_modifier = "BOLD"
sub_modifier = ""
[[chart]]
fg = "#F38BA8" # Red
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[chart]]
fg = "#FAB387" # Peach (Orange)
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[chart]]
fg = "#F9E2AF" # Yellow
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[chart]]
fg = "#A6E3A1" # Green
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[chart]]
fg = "#94E2D5" # Teal
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[chart]]
fg = "#89DCEB" # Sky (Cyan)
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[chart]]
fg = "#89B4FA" # Blue
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[chart]]
fg = "#CBA6F7" # Mauve (Purple)
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""
[[chart]]
fg = "#F5C2E7" # Pink
bg = "#313244" # Surface0
add_modifier = ""
sub_modifier = ""