nix/modules/home-manager/default.nix
Daniel Flanagan afaa34df91
All checks were successful
/ check (push) Successful in 5m27s
feat: use hypridle and hyprlock
2024-12-21 17:10:45 -06:00

1987 lines
50 KiB
Nix

{
style,
lib,
flakeInputs,
homeManagerModules,
home-manager,
home-manager-unstable,
helix,
nixosModules,
pubkey,
overlays,
}: {
bat = {
programs.bat = {
enable = true;
config = {
theme = "ansi";
};
/*
themes = {
"Catppuccin-mocha" = builtins.readFile (pkgs.fetchFromGitHub
{
owner = "catppuccin";
repo = "bat";
rev = "477622171ec0529505b0ca3cada68fc9433648c6";
sha256 = "6WVKQErGdaqb++oaXnY3i6/GuH2FhTgK0v4TN4Y0Wbw=";
}
+ "/Catppuccin-mocha.tmTheme");
};
*/
};
home.shellAliases = {
cat = "bat";
};
};
eww = {
programs.eww = {
enable = true;
# NOTE: might be better as a mk out of store symlink or w/e
configDir = ./eww;
};
};
mako = {
config,
pkgs,
...
}: {
services.mako = {
enable = true;
extraConfig = with style.colors.withHashPrefix; ''
border-size=2
border-radius=5
padding=10,15
max-visible=5
default-timeout=15000
font=Symbols Nerd Font ${toString style.font.size},${style.font.name} ${toString style.font.size}
anchor=top-right
on-notify=exec ${pkgs.mpv}/bin/mpv --volume=50 ~/.notify.wav
actions=1
icons=1
width=400
height=150
background-color=${bg}DD
text-color=${text}
border-color=${primary}
progress-color=${primary}
[urgency=high]
border-color=${urgent}
[urgency=high]
background-color=${urgent}EE
border-color=${urgent}
text-color=${bg}
'';
};
};
tofi = {
config,
pkgs,
...
}: {
programs.tofi = {
enable = true;
settings = {
font = "${pkgs.iosevkaLyteTerm}/share/fonts/truetype/IosevkaLyteTerm-regular.ttf";
font-size = 12;
text-color = "#f8f8f8";
prompt-color = "#f38ba8";
selection-color = "#66d9ef";
background-color = "#1e1e2e";
outline-width = 0;
border-width = 1;
border-color = "#66d9ef";
width = 640;
height = 400;
fuzzy-match = "true";
};
};
};
broot = {};
emacs = {pkgs, ...}: {
programs.emacs = {
enable = false;
/*
extraConfig = ''
'';
*/
extraPackages = epkgs: (with epkgs; [
magit
]);
};
programs.fish = {
shellAliases = {
e = "emacs";
};
};
};
cargo = {config, ...}: {
home.file."${config.home.homeDirectory}/.cargo/config.toml" = {
enable = true;
text = ''
[build]
rustdocflags = ["--default-theme=ayu"]
'';
};
/*
home.sessionVariables = {
RUSTDOCFLAGS = "--default-theme=ayu";
};
*/
};
common = {
pkgs,
lib,
config,
...
}: {
imports = with homeManagerModules; [
# nix-colors.homeManagerModules.default
fish
bat
homeManagerModules.helix
git
jujutsu
zellij
htop
/*
broot
nnn
tmux
*/
];
programs.home-manager.enable = true;
# services.ssh-agent.enable = true;
home = {
username = lib.mkDefault "lytedev";
homeDirectory = lib.mkDefault "/home/lytedev";
stateVersion = lib.mkDefault "24.05";
sessionVariables = {
EDITOR = "hx";
VISUAL = "hx";
PAGER = "less";
MANPAGER = "less";
};
packages = with pkgs; [
# tools I use when editing nix code
# kanidm
nil
alejandra
gnupg
(pkgs.buildEnv {
name = "my-common-scripts";
paths = [./scripts/common];
})
];
};
programs.direnv = {
enable = true;
nix-direnv.enable = true;
};
programs.skim = {
# https://github.com/lotabout/skim/issues/494
enable = false;
enableFishIntegration = true;
defaultOptions = ["--no-clear-start" "--color=16" "--height=20"];
};
programs.atuin = {
enable = true;
enableBashIntegration = config.programs.bash.enable;
enableFishIntegration = config.programs.fish.enable;
enableZshIntegration = config.programs.zsh.enable;
enableNushellIntegration = config.programs.nushell.enable;
flags = [
"--disable-up-arrow"
];
settings = {
auto_sync = true;
sync_frequency = "1m";
sync_address = "https://atuin.h.lyte.dev";
keymap_mode = "vim-insert";
inline_height = 20;
show_preview = true;
sync = {
records = true;
};
dotfiles = {
enabled = true;
};
};
};
programs.fzf = {
# using good ol' fzf until skim sucks less out of the box I guess
enable = true;
/*
enableFishIntegration = true;
defaultCommand = "fd --type f";
defaultOptions = ["--height 40%"];
fileWidgetOptions = ["--preview 'head {}'"];
*/
};
# TODO: regular cron or something?
programs.nix-index = {
enable = true;
enableBashIntegration = config.programs.bash.enable;
enableFishIntegration = config.programs.fish.enable;
enableZshIntegration = config.programs.zsh.enable;
};
};
desktop = {
imports = with homeManagerModules; [
wezterm
];
};
# ewwbar = {};
firefox = {pkgs, ...}: {
programs.firefox = {
/*
TODO: this should be able to work on macos, no?
TODO: enable color scheme/theme by default
*/
enable = true;
# TODO: uses nixpkgs.pass so pass otp doesn't work
package = pkgs.firefox.override {
nativeMessagingHosts = [
pkgs.passff-host
pkgs.plasma-browser-integration
];
};
/*
extensions = with pkgs.nur.repos.rycee.firefox-addons; [
ublock-origin
]; # TODO: would be nice to have _all_ my firefox stuff managed here instead of Firefox Sync maybe?
*/
profiles = {
daniel = {
id = 0;
settings = {
"general.smoothScroll" = true;
"browser.zoom.siteSpecific" = true;
};
extraConfig = ''
user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
// user_pref("full-screen-api.ignore-widgets", true);
user_pref("media.ffmpeg.vaapi.enabled", true);
user_pref("media.rdd-vpx.enabled", true);
'';
userChrome = ''
#webrtcIndicator {
display: none;
}
'';
/*
userContent = ''
'';
*/
};
};
};
};
firefox-no-tabs = {
programs.firefox = {
profiles = {
daniel = {
settings = {
"alerts.useSystemBackend" = true;
};
userChrome = ''
#TabsToolbar {
visibility: collapse;
}
#main-window[tabsintitlebar="true"]:not([extradragspace="true"]) #TabsToolbar>.toolbar-items {
opacity: 0;
pointer-events: none;
}
#main-window:not([tabsintitlebar="true"]) #TabsToolbar {
visibility: collapse !important;
}
'';
};
};
};
};
fish = {pkgs, ...}: {
home = {
packages = [
pkgs.gawk # used in prompt
];
};
programs.eza = {
enable = true;
};
programs.fish = {
enable = true;
# I load long scripts from files for a better editing experience
shellInit = builtins.readFile ./fish/shellInit.fish;
interactiveShellInit = builtins.readFile ./fish/interactiveShellInit.fish;
loginShellInit = "";
functions = {
# TODO: I think these should be loaded from fish files too for better editor experience?
d = ''
# --wraps=cd --description "Quickly jump to NICE_HOME (or given relative or absolute path) and list files."
if count $argv > /dev/null
cd $argv
else
cd $NICE_HOME
end
la
'';
c = ''
if count $argv > /dev/null
cd $NICE_HOME && d $argv
else
d $NICE_HOME
end
'';
ltl = ''
set d $argv[1] .
set -l l ""
for f in $d[1]/*
if test -z $l; set l $f; continue; end
if command test $f -nt $l; and test ! -d $f
set l $f
end
end
echo $l
'';
has_command = "command --quiet --search $argv[1]";
};
shellAbbrs = {};
shellAliases = {
# TODO: an alias that wraps `rm` such that if we run it without git committing first (when in a git repo)
ls = "eza --group-directories-first --classify";
l = "ls";
ll = "ls --long --group";
la = "ll --all";
lA = "la --all"; # --all twice to show . and ..
tree = "ls --tree --level=3";
lt = "ll --sort=modified";
lat = "la --sort=modified";
lc = "lt --sort=accessed";
lT = "lt --reverse";
lC = "lc --reverse";
lD = "la --only-dirs";
"cd.." = "d ..";
"cdc" = "d $XDG_CONFIG_HOME";
"cdn" = "d $NOTES_PATH";
"cdl" = "d $XDG_DOWNLOAD_DIR";
"cdg" = "d $XDG_GAMES_DIR";
".." = "d ..";
"..." = "d ../..";
"...." = "d ../../..";
"....." = "d ../../../..";
"......" = "d ../../../../..";
"......." = "d ../../../../../..";
"........" = "d ../../../../../../..";
"........." = "d ../../../../../../../..";
p = "ping";
dc = "docker compose";
pc = "podman-compose";
k = "kubectl";
kg = "kubectl get";
v = "$EDITOR";
sv = "sudo $EDITOR";
kssh = "kitty +kitten ssh";
};
};
};
jujutsu = {...}: {
programs.jujutsu = {
enable = true;
settings = {
user = {
email = "daniel@lyte.dev";
name = "Daniel Flanagan";
};
};
};
};
git = {lib, ...}: let
email = lib.mkDefault "daniel@lyte.dev";
in {
programs.git = {
enable = true;
userName = lib.mkDefault "Daniel Flanagan";
userEmail = email;
delta = {
enable = true;
options = {};
};
lfs = {
enable = true;
};
/*
signing = {
signByDefault = false;
key = ~/.ssh/personal-ed25519;
};
*/
aliases = {
a = "add -A";
ac = "commit -a";
acm = "commit -a -m";
c = "commit";
cm = "commit -m";
co = "checkout";
b = "rev-parse --symbolic-full-name HEAD";
cnv = "commit --no-verify";
cns = "commit --no-gpg-sign";
cnvs = "commit --no-verify --no-gpg-sign";
cnsv = "commit --no-verify --no-gpg-sign";
d = "diff";
ds = "diff --staged";
dt = "difftool";
f = "fetch";
fa = "fetch --all";
l = "log --graph --abbrev-commit --decorate --oneline --all";
plainlog = " log --pretty=format:'%h %ad%x09%an%x09%s' --date=short --decorate";
ls = "ls-files";
mm = "merge master";
p = "push";
pf = "push --force-with-lease";
pl = "pull";
rim = "rebase -i master";
s = "status";
};
# TODO: https://blog.scottlowe.org/2023/12/15/conditional-git-configuration/
extraConfig = {
commit = {
verbose = true;
# gpgSign = true;
};
tag = {
# gpgSign = true;
sort = "version:refname";
};
# include.path = local.gitconfig
gpg.format = "ssh";
log.date = "local";
init.defaultBranch = "main";
merge.conflictstyle = "zdiff3";
push.autoSetupRemote = true;
pull.ff = "only";
branch.autoSetupMerge = true;
sendemail = {
smtpserver = "smtp.mailgun.org";
smtpuser = email;
smtrpencryption = "tls";
smtpserverport = 587;
};
url = {
# TODO: how to have per-machine not-in-git configuration?
"git@git.hq.bill.com:" = {
insteadOf = "https://git.hq.bill.com";
};
};
};
};
programs.fish.functions = {
g = {
wraps = "git";
body = ''
if test (count $argv) -gt 0
git $argv
else
git status
end
'';
};
lag = {
wraps = "g";
body = ''
lA
g $argv
'';
};
};
};
# gnome = {};
helix = {
config,
pkgs,
...
}: let
inherit (pkgs) system;
in {
# helix rust debugger stuff
# https://github.com/helix-editor/helix/wiki/Debugger-Configurations
home.file."${config.xdg.configHome}/lldb_vscode_rustc_primer.py" = {
text = ''
import subprocess
import pathlib
import lldb
# Determine the sysroot for the active Rust interpreter
rustlib_etc = pathlib.Path(subprocess.getoutput('rustc --print sysroot')) / 'lib' / 'rustlib' / 'etc'
if not rustlib_etc.exists():
raise RuntimeError('Unable to determine rustc sysroot')
# Load lldb_lookup.py and execute lldb_commands with the correct path
lldb.debugger.HandleCommand(f"""command script import "{rustlib_etc / 'lldb_lookup.py'}" """)
lldb.debugger.HandleCommand(f"""command source -s 0 "{rustlib_etc / 'lldb_commands'}" """)
'';
};
/*
NOTE: Currently, helix crashes when editing markdown in certain scenarios,
presumably due to an old markdown treesitter grammar
https://github.com/helix-editor/helix/issues/9011
https://github.com/helix-editor/helix/issues/8821
https://github.com/tree-sitter-grammars/tree-sitter-markdown/issues/114
*/
programs.helix = {
enable = true;
package = lib.mkForce helix.packages.${system}.helix;
languages = {
language-server = {
lexical = {
command = "lexical";
args = ["start"];
};
/*
next-ls = {
command = "next-ls";
args = ["--stdout"];
};
deno = {
command = "deno";
args = ["lsp"];
config = {
enable = true;
lint = true;
unstable = true;
};
};
*/
};
language = [
/*
{
name = "heex";
scope = "source.heex";
injection-regex = "heex";
language-servers = ["lexical"]; # "lexical" "next-ls" ?
auto-format = true;
file-types = ["heex"];
roots = ["mix.exs" "mix.lock"];
indent = {
tab-width = 2;
unit = " ";
};
}
{
name = "elixir";
language-servers = ["lexical"]; # "lexical" "next-ls" ?
auto-format = true;
}
*/
{
name = "rust";
debugger = {
name = "lldb-vscode";
transport = "stdio";
command = "lldb-vscode";
templates = [
{
name = "binary";
request = "launch";
completion = [
{
name = "binary";
completion = "filename";
}
];
args = {
program = "{0}";
initCommands = ["command script import ${config.xdg.configHome}/lldb_vscode_rustc_primer.py"];
};
}
];
};
}
{
name = "html";
file-types = ["html"];
scope = "source.html";
auto-format = false;
}
{
name = "nix";
file-types = ["nix"];
scope = "source.nix";
auto-format = true;
formatter = {
command = "alejandra";
args = ["-"];
};
}
{
name = "fish";
file-types = ["fish"];
scope = "source.fish";
auto-format = true;
indent = {
tab-width = 2;
unit = "\t";
};
}
{
name = "toml";
file-types = ["toml"];
scope = "source.toml";
auto-format = true;
}
/*
{
name = "javascript";
language-id = "javascript";
grammar = "javascript";
scope = "source.js";
injection-regex = "^(js|javascript)$";
file-types = ["js" "mjs"];
shebangs = ["deno"];
language-servers = ["deno"];
roots = ["deno.jsonc" "deno.json"];
formatter = {
command = "deno";
args = ["fmt"];
};
auto-format = true;
comment-token = "//";
indent = {
tab-width = 2;
unit = "\t";
};
}
{
name = "typescript";
language-id = "typescript";
grammar = "typescript";
scope = "source.ts";
injection-regex = "^(ts|typescript)$";
file-types = ["ts"];
shebangs = ["deno"];
language-servers = ["deno"];
roots = ["deno.jsonc" "deno.json"];
formatter = {
command = "deno";
args = ["fmt"];
};
auto-format = true;
comment-token = "//";
indent = {
tab-width = 2;
unit = "\t";
};
}
{
name = "jsonc";
language-id = "json";
grammar = "jsonc";
scope = "source.jsonc";
injection-regex = "^(jsonc)$";
roots = ["deno.jsonc" "deno.json"];
file-types = ["jsonc"];
language-servers = ["deno"];
indent = {
tab-width = 2;
unit = " ";
};
auto-format = true;
}
*/
];
};
settings = {
theme = "custom";
editor = {
soft-wrap.enable = true;
auto-pairs = false;
bufferline = "multiple";
rulers = [81 121];
cursorline = true;
/*
auto-save = false;
completion-trigger-len = 1;
color-modes = false;
scrolloff = 8;
*/
inline-diagnostics = {
cursor-line = "hint";
other-lines = "error";
};
cursor-shape = {
normal = "block";
insert = "bar";
select = "underline";
};
file-picker.hidden = false;
indent-guides = {
render = true;
character = "";
};
lsp = {
display-messages = true;
# display-inlay-hints = true;
};
statusline = {
separator = " ";
mode = {
"normal" = "N";
"insert" = "I";
"select" = "S";
};
left = [
"file-name"
"mode"
/*
"selections"
"primary-selection-length"
"position"
"position-percentage"
*/
"spinner"
"diagnostics"
"workspace-diagnostics"
];
/*
center = ["file-name"];
right = ["version-control" "total-line-numbers" "file-encoding"];
*/
};
};
keys = {
insert = {
j = {
k = "normal_mode";
j = "normal_mode";
K = "normal_mode";
J = "normal_mode";
};
};
normal = {
"C-k" = "jump_view_up";
"C-j" = "jump_view_down";
"C-h" = "jump_view_left";
"C-l" = "jump_view_right";
"C-q" = ":quit-all!";
# "L" = "repeat_last_motion";
space = {
q = ":reflow 80";
Q = ":reflow 120";
C = ":bc!";
h = ":toggle lsp.display-inlay-hints";
# O = ["select_textobject_inner WORD", ":pipe-to xargs xdg-open"];
};
};
select = {
space = {
q = ":reflow 80";
Q = ":reflow 120";
};
# "L" = "repeat_last_motion";
};
};
};
themes = with style.colors.withHashPrefix; {
custom = {
"type" = orange;
"constructor" = blue;
"constant" = orange;
"constant.builtin" = orange;
"constant.character" = yellow;
"constant.character.escape" = orange;
"string" = green;
"string.regexp" = orange;
"string.special" = blue;
"comment" = {
fg = fgdim;
modifiers = ["italic"];
};
"variable" = text;
"variable.parameter" = {
fg = red;
modifiers = ["italic"];
};
"variable.builtin" = red;
"variable.other.member" = text;
"label" = blue;
"punctuation" = fgdim;
"punctuation.special" = blue;
"keyword" = purple;
"keyword.storage.modifier.ref" = yellow;
"keyword.control.conditional" = {
fg = purple;
modifiers = ["italic"];
};
"operator" = blue;
"function" = blue;
"function.macro" = purple;
"tag" = purple;
"attribute" = blue;
"namespace" = {
fg = blue;
modifiers = ["italic"];
};
"special" = blue;
"markup.heading.marker" = {
fg = orange;
modifiers = ["bold"];
};
"markup.heading.1" = blue;
"markup.heading.2" = yellow;
"markup.heading.3" = green;
"markup.heading.4" = orange;
"markup.heading.5" = red;
"markup.heading.6" = fg3;
"markup.list" = purple;
"markup.bold" = {modifiers = ["bold"];};
"markup.italic" = {modifiers = ["italic"];};
"markup.strikethrough" = {modifiers = ["crossed_out"];};
"markup.link.url" = {
fg = red;
modifiers = ["underlined"];
};
"markup.link.text" = blue;
"markup.raw" = red;
"diff.plus" = green;
"diff.minus" = red;
"diff.delta" = blue;
"ui.linenr" = {fg = fgdim;};
"ui.linenr.selected" = {fg = fg2;};
"ui.statusline" = {
fg = fgdim;
bg = bg;
};
"ui.statusline.inactive" = {
fg = fg3;
bg = bg2;
};
"ui.statusline.normal" = {
fg = bg;
bg = purple;
modifiers = ["bold"];
};
"ui.statusline.insert" = {
fg = bg;
bg = green;
modifiers = ["bold"];
};
"ui.statusline.select" = {
fg = bg;
bg = red;
modifiers = ["bold"];
};
"ui.popup" = {
fg = text;
bg = bg2;
};
"ui.window" = {fg = fgdim;};
"ui.help" = {
fg = fg2;
bg = bg2;
};
"ui.bufferline" = {
fg = fgdim;
bg = bg2;
};
"ui.bufferline.background" = {bg = bg2;};
"ui.text" = text;
"ui.text.focus" = {
fg = text;
bg = bg3;
modifiers = ["bold"];
};
"ui.text.inactive" = {fg = fg2;};
"ui.virtual" = fg2;
"ui.virtual.ruler" = {bg = bg3;};
"ui.virtual.indent-guide" = bg3;
"ui.virtual.inlay-hint" = {
fg = bg3;
bg = bg;
};
"ui.selection" = {bg = bg5;};
"ui.cursor" = {
fg = bg;
bg = text;
};
"ui.cursor.primary" = {
fg = bg;
bg = red;
};
"ui.cursor.match" = {
fg = orange;
modifiers = ["bold"];
};
"ui.cursor.primary.normal" = {
fg = bg;
bg = text;
};
"ui.cursor.primary.insert" = {
fg = bg;
bg = text;
};
"ui.cursor.primary.select" = {
fg = bg;
bg = text;
};
"ui.cursor.normal" = {
fg = bg;
bg = fg;
};
"ui.cursor.insert" = {
fg = bg;
bg = fg;
};
"ui.cursor.select" = {
fg = bg;
bg = fg;
};
"ui.cursorline.primary" = {bg = bg3;};
"ui.highlight" = {
bg = bg3;
fg = bg;
modifiers = ["bold"];
};
"ui.menu" = {
fg = fg3;
bg = bg2;
};
"ui.menu.selected" = {
fg = text;
bg = bg3;
modifiers = ["bold"];
};
"diagnostic.error" = {
underline = {
color = red;
style = "curl";
};
};
"diagnostic.warning" = {
underline = {
color = orange;
style = "curl";
};
};
"diagnostic.info" = {
underline = {
color = blue;
style = "curl";
};
};
"diagnostic.hint" = {
underline = {
color = blue;
style = "curl";
};
};
error = red;
warning = orange;
info = blue;
hint = yellow;
"ui.background" = {
bg = bg;
fg = fgdim;
};
/*
"ui.cursorline.primary" = { bg = "default" }
"ui.cursorline.secondary" = { bg = "default" }
*/
"ui.cursorcolumn.primary" = {bg = bg3;};
"ui.cursorcolumn.secondary" = {bg = bg3;};
"ui.bufferline.active" = {
fg = primary;
bg = bg3;
underline = {
color = primary;
style = "";
};
};
};
};
};
};
htop = {
programs.htop = {
enable = true;
settings = {
/*
hide_kernel_threads = 1;
hide_userland_threads = 1;
show_program_path = 0;
header_margin = 0;
show_cpu_frequency = 1;
highlight_base_name = 1;
tree_view = 0;
htop_version = "3.2.2";
config_reader_min_version = 3;
*/
fields = "0 48 17 18 38 39 40 2 46 47 49 1";
hide_kernel_threads = 1;
hide_userland_threads = 1;
show_program_path = 0;
header_margin = 0;
show_cpu_frequency = 1;
highlight_base_name = 1;
tree_view = 0;
hide_running_in_container = 0;
shadow_other_users = 0;
show_thread_names = 0;
highlight_deleted_exe = 1;
shadow_distribution_path_prefix = 0;
highlight_megabytes = 1;
highlight_threads = 1;
highlight_changes = 0;
highlight_changes_delay_secs = 5;
find_comm_in_cmdline = 1;
strip_exe_from_cmdline = 1;
show_merged_command = 0;
screen_tabs = 1;
detailed_cpu_time = 0;
cpu_count_from_one = 0;
show_cpu_usage = 1;
show_cpu_temperature = 0;
degree_fahrenheit = 0;
update_process_names = 0;
account_guest_in_cpu_meter = 0;
enable_mouse = 1;
delay = 15;
hide_function_bar = 0;
header_layout = "two_50_50";
column_meters_0 = "LeftCPUs Memory Swap";
column_meter_modes_0 = "1 1 1";
column_meters_1 = "RightCPUs Tasks LoadAverage Uptime";
column_meter_modes_1 = "1 2 2 2";
sort_key = 47;
tree_sort_key = 0;
sort_direction = -1;
tree_sort_direction = 1;
tree_view_always_by_pid = 0;
all_branches_collapsed = 0;
/*
screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command
.sort_key=PERCENT_MEM
.tree_sort_key=PID
.tree_view=0
.tree_view_always_by_pid=0
.sort_direction=-1
.tree_sort_direction=1
.all_branches_collapsed=0
screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE Command
.sort_key=IO_RATE
.tree_sort_key=PID
.tree_view=0
.tree_view_always_by_pid=0
.sort_direction=-1
.tree_sort_direction=1
.all_branches_collapsed=0
*/
};
};
};
hyprland = {
imports = with homeManagerModules; [
tofi
mako
eww
(import ./hyprland.nix)
];
};
iex = {
home.file.".iex.exs" = {
enable = true;
text = ''
Application.put_env(:elixir, :ansi_enabled, true)
# PROTIP: to break, `#iex:break`
IEx.configure(
colors: [enabled: true],
inspect: [
pretty: true,
printable_limit: :infinity,
limit: :infinity,
charlists: :as_lists
],
default_prompt: [
# ANSI CHA, move cursor to column 1
# "\e[G",
:magenta,
# IEx prompt variable
"%prefix",
"#",
# IEx prompt variable
"%counter",
# plain string
">",
:reset
]
|> IO.ANSI.format()
|> IO.chardata_to_string()
)
'';
};
};
# kitty = {};
linux = {pkgs, ...}: {
home = {
sessionVariables = {
MOZ_ENABLE_WAYLAND = "1";
};
};
programs.fish = {
shellAliases = {
disks = "df -h && lsblk";
sctl = "sudo systemctl";
bt = "bluetoothctl";
pa = "pulsemixer";
sctlu = "systemctl --user";
};
functions = {
pp = ''
if test (count $argv) -gt 0
while true; ping -O -i 1 -w 5 -c 10000000 $argv; sleep 1; end
else
while true; ping -O -i 1 -w 5 -c 10000000 1.1.1.1; sleep 1; end
end
'';
};
};
home.packages = [
(pkgs.buildEnv {
name = "my-linux-scripts";
paths = [./scripts/linux];
})
];
};
linux-desktop-environment-config = {
pkgs,
# font,
...
}: {
imports = with homeManagerModules; [
linux
desktop
firefox
];
gtk.theme = {
name = "catppuccin-mocha-blue-compact+default";
package =
(pkgs.catppuccin-gtk.overrideAttrs {
src = pkgs.fetchFromGitHub {
owner = "catppuccin";
repo = "gtk";
rev = "v1.0.3";
fetchSubmodules = true;
hash = "sha256-q5/VcFsm3vNEw55zq/vcM11eo456SYE5TQA3g2VQjGc=";
};
postUnpack = "";
})
.override
{
accents = ["sapphire"];
variant = "mocha";
size = "compact";
};
};
home.pointerCursor = {
name = "Bibata-Modern-Classic";
package = pkgs.bibata-cursors;
size = 40; # TODO: this doesn't seem to work -- at least in Sway
# some icons are also missing (hand2?)
};
};
macos = {
imports = with homeManagerModules; [
desktop
# password-manager
];
};
# mako = {};
# nnn = {};
password-manager = {pkgs, ...}: {
imports = with homeManagerModules; [
pass
];
home.packages = with pkgs; [
passage
rage
age-plugin-yubikey
bitwarden-cli
oath-toolkit
# bitwarden-desktop
];
};
pass = {pkgs, ...}: {
programs.password-store = {
enable = true;
package = pkgs.pass.withExtensions (exts: [exts.pass-otp]);
};
};
senpai = {config, ...}: {
programs.senpai = {
enable = true;
config = {
address = "irc+insecure://beefcake.hare-cod.ts.net:6667";
nickname = "lytedev";
password-cmd = ["pass" "soju"];
};
};
home.file."${config.xdg.configHome}/senpai/senpai.scfg" = {
enable = true;
text = ''
address irc+insecure://beefcake:6667
nickname lytedev
password-cmd pass soju
'';
};
};
sway = {
imports = [
{
_module.args = {
inherit style;
};
}
./waybar.nix
./swaylock.nix
./sway.nix
];
};
/*
sway-laptop = {};
swaylock = {};
tmux = {};
wallpaper-manager = {};
waybar = {};
*/
wezterm = {
pkgs,
# font,
...
}: {
# docs: https://wezfurlong.org/wezterm/config/appearance.html#defining-your-own-colors
programs.wezterm = with style.colors.withHashPrefix; {
enable = true;
# package = pkgs.wezterm;
extraConfig = builtins.readFile ./wezterm/config.lua;
colorSchemes = {
catppuccin-mocha-sapphire = {
ansi = map (x: style.colors.withHashPrefix.${toString x}) (pkgs.lib.lists.range 0 7);
brights = map (x: style.colors.withHashPrefix.${toString (x + 8)}) (pkgs.lib.lists.range 0 7);
foreground = fg;
background = bg;
cursor_fg = bg;
cursor_bg = text;
cursor_border = text;
selection_fg = bg;
selection_bg = yellow;
scrollbar_thumb = bg2;
split = bg5;
# indexed = { [136] = '#af8700' },
tab_bar = {
background = bg3;
active_tab = {
bg_color = primary;
fg_color = bg;
italic = false;
};
inactive_tab = {
bg_color = bg2;
fg_color = fgdim;
italic = false;
};
inactive_tab_hover = {
bg_color = bg3;
fg_color = primary;
italic = false;
};
new_tab = {
bg_color = bg2;
fg_color = fgdim;
italic = false;
};
new_tab_hover = {
bg_color = bg3;
fg_color = primary;
italic = false;
};
};
compose_cursor = orange;
/*
copy_mode_active_highlight_bg = { Color = '#000000' },
copy_mode_active_highlight_fg = { AnsiColor = 'Black' },
copy_mode_inactive_highlight_bg = { Color = '#52ad70' },
copy_mode_inactive_highlight_fg = { AnsiColor = 'White' },
quick_select_label_bg = { Color = 'peru' },
quick_select_label_fg = { Color = '#ffffff' },
quick_select_match_bg = { AnsiColor = 'Navy' },
quick_select_match_fg = { Color = '#ffffff' },
*/
};
};
};
};
zellij = {lib, ...}: {
# zellij does not support modern terminal keyboard input:
# https://github.com/zellij-org/zellij/issues/735
programs.zellij = {
# uses home manager's toKDL generator
enable = true;
# This causes fish to start zellij immediately
# enableFishIntegration = true;
settings = {
pane_frames = false;
simplified_ui = true;
default_mode = "locked";
mouse_mode = true;
copy_clipboard = "primary";
copy_on_select = true;
mirror_session = false;
# keybinds = with builtins; let
# binder = bind: let
# keys = elemAt bind 0;
# action = elemAt bind 1;
# argKeys = map (k: "\"${k}\"") (lib.lists.flatten [keys]);
# in {
# name = "bind ${concatStringsSep " " argKeys}";
# value = action;
# };
# layer = binds: (listToAttrs (map binder binds));
# in {
# # _props = {clear-defaults = true;};
# normal = {};
# locked = layer [
# [["Ctrl g"] {SwitchToMode = "Normal";}]
# [["Ctrl L"] {NewPane = "Right";}]
# [["Ctrl Z"] {NewPane = "Right";}]
# [["Ctrl J"] {NewPane = "Down";}]
# [["Ctrl h"] {MoveFocus = "Left";}]
# [["Ctrl l"] {MoveFocus = "Right";}]
# [["Ctrl j"] {MoveFocus = "Down";}]
# [["Ctrl k"] {MoveFocus = "Up";}]
# ];
# resize = layer [
# [["Ctrl n"] {SwitchToMode = "Normal";}]
# [["h" "Left"] {Resize = "Increase Left";}]
# [["j" "Down"] {Resize = "Increase Down";}]
# [["k" "Up"] {Resize = "Increase Up";}]
# [["l" "Right"] {Resize = "Increase Right";}]
# [["H"] {Resize = "Decrease Left";}]
# [["J"] {Resize = "Decrease Down";}]
# [["K"] {Resize = "Decrease Up";}]
# [["L"] {Resize = "Decrease Right";}]
# [["=" "+"] {Resize = "Increase";}]
# [["-"] {Resize = "Decrease";}]
# ];
# pane = layer [
# [["Ctrl p"] {SwitchToMode = "Normal";}]
# [["h" "Left"] {MoveFocus = "Left";}]
# [["l" "Right"] {MoveFocus = "Right";}]
# [["j" "Down"] {MoveFocus = "Down";}]
# [["k" "Up"] {MoveFocus = "Up";}]
# [["p"] {SwitchFocus = [];}]
# [
# ["n"]
# {
# NewPane = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["d"]
# {
# NewPane = "Down";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["r"]
# {
# NewPane = "Right";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["x"]
# {
# CloseFocus = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["f"]
# {
# ToggleFocusFullscreen = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["z"]
# {
# TogglePaneFrames = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["w"]
# {
# ToggleFloatingPanes = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["e"]
# {
# TogglePaneEmbedOrFloating = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["c"]
# {
# SwitchToMode = "RenamePane";
# PaneNameInput = 0;
# }
# ]
# ];
# move = layer [
# [["Ctrl h"] {SwitchToMode = "Normal";}]
# [["n" "Tab"] {MovePane = [];}]
# [["p"] {MovePaneBackwards = [];}]
# [["h" "Left"] {MovePane = "Left";}]
# [["j" "Down"] {MovePane = "Down";}]
# [["k" "Up"] {MovePane = "Up";}]
# [["l" "Right"] {MovePane = "Right";}]
# ];
# tab = layer [
# [["Ctrl t"] {SwitchToMode = "Normal";}]
# [
# ["r"]
# {
# SwitchToMode = "RenameTab";
# TabNameInput = 0;
# }
# ]
# [["h" "Left" "Up" "k"] {GoToPreviousTab = [];}]
# [["l" "Right" "Down" "j"] {GoToNextTab = [];}]
# [
# ["n"]
# {
# NewTab = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["x"]
# {
# CloseTab = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["s"]
# {
# ToggleActiveSyncTab = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["1"]
# {
# GoToTab = 1;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["2"]
# {
# GoToTab = 2;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["3"]
# {
# GoToTab = 3;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["4"]
# {
# GoToTab = 4;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["5"]
# {
# GoToTab = 5;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["6"]
# {
# GoToTab = 6;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["7"]
# {
# GoToTab = 7;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["8"]
# {
# GoToTab = 8;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["9"]
# {
# GoToTab = 9;
# SwitchToMode = "Normal";
# }
# ]
# [["Tab"] {ToggleTab = [];}]
# ];
# scroll = layer [
# [["Ctrl s"] {SwitchToMode = "Normal";}]
# [
# ["e"]
# {
# EditScrollback = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["s"]
# {
# SwitchToMode = "EnterSearch";
# SearchInput = 0;
# }
# ]
# [
# ["Ctrl c"]
# {
# ScrollToBottom = [];
# SwitchToMode = "Normal";
# }
# ]
# [["j" "Down"] {ScrollDown = [];}]
# [["k" "Up"] {ScrollUp = [];}]
# [["Ctrl f" "PageDown" "Right" "l"] {PageScrollDown = [];}]
# [["Ctrl b" "PageUp" "Left" "h"] {PageScrollUp = [];}]
# [["d"] {HalfPageScrollDown = [];}]
# [["u"] {HalfPageScrollUp = [];}]
# # uncomment this and adjust key if using copy_on_select=false
# # bind "Alt c" { Copy; }
# ];
# search = layer [
# [["Ctrl s"] {SwitchToMode = "Normal";}]
# [
# ["Ctrl c"]
# {
# ScrollToBottom = [];
# SwitchToMode = "Normal";
# }
# ]
# [["j" "Down"] {ScrollDown = [];}]
# [["k" "Up"] {ScrollUp = [];}]
# [["Ctrl f" "PageDown" "Right" "l"] {PageScrollDown = [];}]
# [["Ctrl b" "PageUp" "Left" "h"] {PageScrollUp = [];}]
# [["d"] {HalfPageScrollDown = [];}]
# [["u"] {HalfPageScrollUp = [];}]
# [["n"] {Search = "down";}]
# [["p"] {Search = "up";}]
# [["c"] {SearchToggleOption = "CaseSensitivity";}]
# [["w"] {SearchToggleOption = "Wrap";}]
# [["o"] {SearchToggleOption = "WholeWord";}]
# ];
# entersearch = layer [
# [["Ctrl c" "Esc"] {SwitchToMode = "Scroll";}]
# [["Enter"] {SwitchToMode = "Search";}]
# ];
# renametab = layer [
# [["Ctrl c"] {SwitchToMode = "Normal";}]
# [
# ["Esc"]
# {
# UndoRenameTab = [];
# SwitchToMode = "Tab";
# }
# ]
# ];
# renamepane = layer [
# [["Ctrl c"] {SwitchToMode = "Normal";}]
# [
# ["Esc"]
# {
# UndoRenamePane = [];
# SwitchToMode = "Pane";
# }
# ]
# ];
# session = layer [
# [["Ctrl o"] {SwitchToMode = "Normal";}]
# [["Ctrl s"] {SwitchToMode = "Scroll";}]
# [["d"] {Detach = [];}]
# ];
# tmux = layer [
# [["["] {SwitchToMode = "Scroll";}]
# [
# ["Ctrl b"]
# {
# Write = 2;
# SwitchToMode = "Normal";
# }
# ]
# [
# ["\\\""]
# {
# NewPane = "Down";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["%"]
# {
# NewPane = "Right";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["z"]
# {
# ToggleFocusFullscreen = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["c"]
# {
# NewTab = [];
# SwitchToMode = "Normal";
# }
# ]
# [[","] {SwitchToMode = "RenameTab";}]
# [
# ["p"]
# {
# GoToPreviousTab = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["n"]
# {
# GoToNextTab = [];
# SwitchToMode = "Normal";
# }
# ]
# [
# ["Left"]
# {
# MoveFocus = "Left";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["Right"]
# {
# MoveFocus = "Right";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["Down"]
# {
# MoveFocus = "Down";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["Up"]
# {
# MoveFocus = "Up";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["h"]
# {
# MoveFocus = "Left";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["l"]
# {
# MoveFocus = "Right";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["j"]
# {
# MoveFocus = "Down";
# SwitchToMode = "Normal";
# }
# ]
# [
# ["k"]
# {
# MoveFocus = "Up";
# SwitchToMode = "Normal";
# }
# ]
# [["o"] {FocusNextPane = [];}]
# [["d"] {Detach = [];}]
# [["Space"] {NextSwapLayout = [];}]
# [
# ["x"]
# {
# CloseFocus = [];
# SwitchToMode = "Normal";
# }
# ]
# ];
# "shared_except \"locked\"" = layer [
# [["Ctrl g"] {SwitchToMode = "Locked";}]
# [["Ctrl q"] {Quit = [];}]
# [["Alt n"] {NewPane = [];}]
# [["Alt h" "Alt Left"] {MoveFocusOrTab = "Left";}]
# [["Alt l" "Alt Right"] {MoveFocusOrTab = "Right";}]
# [["Alt j" "Alt Down"] {MoveFocus = "Down";}]
# [["Alt k" "Alt Up"] {MoveFocus = "Up";}]
# [["Alt ]" "Alt +"] {Resize = "Increase";}]
# [["Alt -"] {Resize = "Decrease";}]
# [["Alt ["] {PreviousSwapLayout = [];}]
# [["Alt ]"] {NextSwapLayout = [];}]
# ];
# "shared_except \"normal\" \"locked\"" = layer [
# [["Enter" "Esc"] {SwitchToMode = "Normal";}]
# ];
# "shared_except \"pane\" \"locked\"" = layer [
# [["Ctrl p"] {SwitchToMode = "Pane";}]
# ];
# "shared_except \"resize\" \"locked\"" = layer [
# [["Ctrl n"] {SwitchToMode = "Resize";}]
# ];
# "shared_except \"scroll\" \"locked\"" = layer [
# [["Ctrl s"] {SwitchToMode = "Scroll";}]
# ];
# "shared_except \"session\" \"locked\"" = layer [
# [["Ctrl o"] {SwitchToMode = "Session";}]
# ];
# "shared_except \"tab\" \"locked\"" = layer [
# [["Ctrl t"] {SwitchToMode = "Tab";}]
# ];
# "shared_except \"move\" \"locked\"" = layer [
# [["Ctrl h"] {SwitchToMode = "Move";}]
# ];
# "shared_except \"tmux\" \"locked\"" = layer [
# [["Ctrl b"] {SwitchToMode = "Tmux";}]
# ];
# };
# default_layout = "compact";
theme = "match";
themes = {
match = with style.colors.withHashPrefix; {
fg = fg;
bg = bg;
black = bg;
white = fg;
red = red;
green = green;
yellow = yellow;
blue = blue;
magenta = purple;
cyan = blue;
orange = orange;
};
};
# TODO: port config
ui = {
pane_frames = {
rounded_corners = true;
hide_session_name = true;
};
};
};
};
home.shellAliases = {
z = "zellij";
};
};
}