2024-03-12 14:15:17 +01:00
|
|
|
{ config, lib, pkgs, ... }:
|
2023-02-14 22:16:43 +01:00
|
|
|
|
2024-01-07 17:41:54 +01:00
|
|
|
let
|
2024-01-08 13:14:08 +01:00
|
|
|
runPrivileged = if config.security.doas.enable then
|
|
|
|
"${config.security.wrapperDir}/${config.security.wrappers.doas.program}"
|
|
|
|
else
|
|
|
|
"${pkgs.sudo}/bin/sudo";
|
2024-02-26 16:09:40 +01:00
|
|
|
username = import ./components/username.nix;
|
2024-01-07 16:55:24 +01:00
|
|
|
in {
|
2023-08-12 22:03:37 +02:00
|
|
|
environment = {
|
2023-10-08 12:51:40 +02:00
|
|
|
sessionVariables = { # home decluttering
|
2023-10-27 10:30:36 +02:00
|
|
|
ANDROID_HOME = "\${XDG_DATA_HOME}/android";
|
2023-10-27 10:48:53 +02:00
|
|
|
ANDROID_USER_HOME = "\${XDG_DATA_HOME}/android";
|
2023-10-27 10:30:36 +02:00
|
|
|
CUDA_CACHE_PATH = "\${XDG_CACHE_HOME}/nv";
|
2023-08-13 17:45:19 +02:00
|
|
|
GNUPGHOME = "\${XDG_DATA_HOME}/gnupg";
|
2023-11-30 23:37:47 +01:00
|
|
|
GRADLE_USER_HOME = "\${XDG_DATA_HOME}/gradle";
|
2023-08-13 17:45:19 +02:00
|
|
|
GTK2_RC_FILES = "\${XDG_CONFIG_HOME}/gtk-3.0/gtkrc";
|
|
|
|
HISTFILE = "\${XDG_STATE_HOME}/bash/history";
|
2023-10-27 11:21:55 +02:00
|
|
|
IONIC_CONFIG_DIRECTORY = "\${XDG_CONFIG_HOME}/ionic";
|
2023-08-13 17:45:19 +02:00
|
|
|
_JAVA_OPTIONS = "-Djava.util.prefs.userRoot=\${XDG_CONFIG_HOME}/java";
|
|
|
|
MYSQL_HISTFILE = "\${XDG_DATA_HOME}/mysql_history";
|
2023-11-30 23:37:47 +01:00
|
|
|
NODE_REPL_HISTORY = "\${XDG_DATA_HOME}/node_repl_history";
|
2023-10-27 10:30:36 +02:00
|
|
|
PSQL_HISTORY = "\${XDG_DATA_HOME}/psql_history";
|
2023-08-13 17:45:19 +02:00
|
|
|
XCOMPOSECACHE = "\${XDG_CACHE_HOME}/X11/xcompose";
|
2023-10-27 17:01:09 +02:00
|
|
|
XDG_CACHE_HOME = "$HOME/.cache";
|
|
|
|
XDG_CONFIG_HOME = "$HOME/.config";
|
|
|
|
XDG_DATA_HOME = "$HOME/.local/share";
|
|
|
|
XDG_STATE_HOME = "$HOME/.local/state";
|
2024-01-04 12:57:47 +01:00
|
|
|
} // { # other
|
|
|
|
HISTCONTROL = "ignorespace";
|
2023-08-13 17:45:19 +02:00
|
|
|
};
|
2023-11-30 23:37:47 +01:00
|
|
|
systemPackages = with pkgs;
|
|
|
|
[ # development
|
|
|
|
gnumake
|
2024-02-18 17:38:40 +01:00
|
|
|
postgresql
|
2023-11-30 23:37:47 +01:00
|
|
|
strace
|
|
|
|
valgrind
|
|
|
|
] ++ [ # utilities
|
2024-01-06 11:49:11 +01:00
|
|
|
acpi
|
2024-01-16 14:35:59 +01:00
|
|
|
cloak
|
|
|
|
man-pages
|
2023-11-30 23:37:47 +01:00
|
|
|
mdcat
|
|
|
|
unzip
|
|
|
|
wget
|
|
|
|
] ++ [ # applications
|
|
|
|
pulsemixer
|
|
|
|
R
|
|
|
|
] ++ [ # other
|
|
|
|
cifs-utils
|
|
|
|
ffmpeg
|
|
|
|
libcxx
|
|
|
|
libinput
|
|
|
|
ntfs3g
|
|
|
|
openal
|
|
|
|
];
|
2023-08-12 22:03:37 +02:00
|
|
|
};
|
2023-11-23 11:48:22 +01:00
|
|
|
home-manager = {
|
|
|
|
useGlobalPkgs = true;
|
2024-03-12 14:15:17 +01:00
|
|
|
users.${username} = {
|
2024-03-11 21:40:49 +01:00
|
|
|
home.file.".ghci".text = ''
|
|
|
|
:set prompt "λ "
|
|
|
|
'';
|
2023-11-23 11:48:22 +01:00
|
|
|
programs = {
|
2024-01-22 18:05:09 +01:00
|
|
|
bash = {
|
|
|
|
enable = true;
|
2024-01-29 17:19:33 +01:00
|
|
|
initExtra = let
|
|
|
|
cut = "${pkgs.coreutils}/bin/cut";
|
|
|
|
git = "${pkgs.git}/bin/git";
|
|
|
|
rg = "${pkgs.ripgrep}/bin/rg";
|
|
|
|
task = "${pkgs.taskwarrior}/bin/task";
|
|
|
|
tr = "${pkgs.coreutils}/bin/tr";
|
|
|
|
wc = "${pkgs.coreutils}/bin/wc";
|
|
|
|
in ''
|
|
|
|
task () {
|
|
|
|
if [[ "$1" == "sync" ]]
|
|
|
|
then
|
|
|
|
location="$(${task} diagnostics | ${rg} "Data:" | ${tr} -s " " | ${cut} -d " " -f 3)"
|
|
|
|
pushd "$location" >/dev/null
|
|
|
|
|
|
|
|
${git} pull >/dev/null
|
|
|
|
|
|
|
|
if ! [ "$(${git} status --porcelain | ${wc} -l)" -eq 0 ]
|
|
|
|
then
|
|
|
|
${git} add . >/dev/null
|
|
|
|
${git} commit -m "chore: Sync on $(date)" >/dev/null
|
|
|
|
${git} push origin main >/dev/null
|
|
|
|
fi
|
|
|
|
popd >/dev/null
|
|
|
|
else
|
|
|
|
command ${task} $@
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
'';
|
2024-01-22 20:52:32 +01:00
|
|
|
sessionVariables = {
|
2024-01-22 22:56:40 +01:00
|
|
|
BOOKMARKS_FILE = "\${HOME}/Documents/bookmarks";
|
2024-01-22 20:52:32 +01:00
|
|
|
PROJECT_MANAGER_PATH = "\${HOME}/Documents/projects";
|
|
|
|
NVIM_UNDODIR = "\${HOME}/Documents/.undo/";
|
|
|
|
};
|
2024-01-22 18:05:09 +01:00
|
|
|
};
|
2024-01-23 15:13:30 +01:00
|
|
|
git = {
|
|
|
|
enable = true;
|
|
|
|
userEmail = "toolbox.0-kindred@icloud.com";
|
|
|
|
userName = "lwad";
|
|
|
|
};
|
2023-11-23 11:48:22 +01:00
|
|
|
};
|
2023-10-17 23:43:22 +02:00
|
|
|
};
|
2023-02-14 22:16:43 +01:00
|
|
|
};
|
2024-02-16 00:20:44 +01:00
|
|
|
imports = [
|
2024-03-11 21:40:49 +01:00
|
|
|
./components/bootloader.nix
|
|
|
|
./components/core.nix
|
2024-02-26 15:01:38 +01:00
|
|
|
./components/programs/neovim.nix
|
2024-02-27 15:25:10 +01:00
|
|
|
./components/services/tailscale.nix
|
2024-03-12 00:02:59 +01:00
|
|
|
./lwad
|
2024-02-16 00:20:44 +01:00
|
|
|
];
|
2024-03-12 00:02:59 +01:00
|
|
|
lwad = {
|
2024-03-13 23:23:09 +01:00
|
|
|
applications = {
|
|
|
|
btop.enable = true;
|
|
|
|
git.enable = true;
|
|
|
|
task.enable = true;
|
2024-03-12 00:02:59 +01:00
|
|
|
};
|
|
|
|
development.languages = {
|
|
|
|
bash.enable = true;
|
|
|
|
c.enable = true;
|
|
|
|
erlang.enable = true;
|
|
|
|
java.enable = true;
|
|
|
|
python.enable = true;
|
|
|
|
rust.enable = true;
|
|
|
|
typescript.enable = true;
|
|
|
|
};
|
2024-03-13 23:23:09 +01:00
|
|
|
utilities = {
|
|
|
|
qol.enable = true;
|
|
|
|
remote.enable = true;
|
|
|
|
terminal.enable = true;
|
|
|
|
};
|
2024-03-12 00:02:59 +01:00
|
|
|
};
|
2023-02-14 22:16:43 +01:00
|
|
|
programs = {
|
|
|
|
dconf.enable = true;
|
2024-01-04 12:28:23 +01:00
|
|
|
bash = {
|
2024-02-07 18:09:01 +01:00
|
|
|
interactiveShellInit = let
|
|
|
|
cut = "${pkgs.coreutils}/bin/cut";
|
|
|
|
echo = "${pkgs.coreutils}/bin/echo";
|
2024-02-08 16:35:00 +01:00
|
|
|
fzf = "${pkgs.fzf}/bin/fzf";
|
|
|
|
git = "${pkgs.git}/bin/git";
|
2024-02-09 12:07:00 +01:00
|
|
|
head = "${pkgs.coreutils}/bin/head";
|
2024-02-08 16:35:00 +01:00
|
|
|
sort = "${pkgs.coreutils}/bin/sort";
|
|
|
|
task = "${pkgs.taskwarrior}/bin/task";
|
|
|
|
tmux = "${pkgs.tmux}/bin/tmux";
|
2024-02-07 18:09:01 +01:00
|
|
|
in ''
|
2024-01-04 12:28:23 +01:00
|
|
|
git() {
|
2024-02-08 16:35:00 +01:00
|
|
|
if [[ "$1" == "commit" ]] && [ -f "$(${git} rev-parse --show-toplevel)/.precommit" ]; then
|
|
|
|
$(${git} rev-parse --show-toplevel)/.precommit
|
2024-01-04 12:28:23 +01:00
|
|
|
fi
|
2024-02-08 16:35:00 +01:00
|
|
|
${git} "$@"
|
2024-01-04 12:28:23 +01:00
|
|
|
}
|
|
|
|
|
2024-01-17 21:01:58 +01:00
|
|
|
listen() {
|
|
|
|
${pkgs.yt-dlp}/bin/yt-dlp \
|
|
|
|
--force-ipv4 \
|
|
|
|
--concurrent-fragments 4 \
|
|
|
|
--paths "/tmp" \
|
|
|
|
--output "%(album)s/%(playlist_index)s-%(title)s.%(ext)s" \
|
|
|
|
--restrict-filenames \
|
|
|
|
--embed-metadata \
|
|
|
|
--embed-thumbnail \
|
|
|
|
--yes-playlist \
|
|
|
|
--extract-audio \
|
|
|
|
--audio-format mp3 \
|
|
|
|
"$1"
|
|
|
|
}
|
|
|
|
|
2024-01-18 12:38:36 +01:00
|
|
|
play() {
|
|
|
|
if [[ "$1" == "" ]]; then
|
2024-01-18 12:34:45 +01:00
|
|
|
target="."
|
|
|
|
else
|
|
|
|
target="$1"
|
|
|
|
fi
|
|
|
|
${pkgs.mpv}/bin/mpv --video=no --display-tags-clr "$target"
|
|
|
|
}
|
|
|
|
|
2024-02-01 13:23:08 +01:00
|
|
|
${lib.concatStringsSep "\n" (map (category: ''
|
|
|
|
${category}() {
|
|
|
|
if [[ $1 == "add" ]]; then
|
|
|
|
shift
|
2024-02-08 16:35:00 +01:00
|
|
|
${task} add project:${category} $@
|
2024-02-01 13:23:08 +01:00
|
|
|
else
|
2024-02-08 16:35:00 +01:00
|
|
|
${task} project:${category} $@
|
2024-02-01 13:23:08 +01:00
|
|
|
fi
|
|
|
|
}
|
2024-02-01 14:19:05 +01:00
|
|
|
'') [ "learn" "uni" "life" ])}
|
2024-02-01 13:23:08 +01:00
|
|
|
|
2024-02-07 18:09:01 +01:00
|
|
|
|
|
|
|
where() {
|
|
|
|
_get_pane() {
|
|
|
|
for pid in $(${pkgs.lsof}/bin/lsof -Fp "$1"); do
|
|
|
|
pid=''${pid#p}
|
|
|
|
pts="/dev/$(${pkgs.procps}/bin/ps -o tty= -p $pid)"
|
2024-02-08 16:35:00 +01:00
|
|
|
for pane in $(${tmux} list-panes -a -F "#{pane_tty}~#{session_name}~#{pane_id}"); do
|
2024-02-07 18:09:01 +01:00
|
|
|
if [[ "$(${cut} -d "~" -f 1 <<< $pane)" == "$pts" ]]; then
|
|
|
|
${echo} $pane
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2024-02-08 16:35:00 +01:00
|
|
|
panes=$(_get_pane "$1" | ${sort} -u)
|
2024-02-07 18:19:31 +01:00
|
|
|
if [ -n "$panes" ]; then
|
|
|
|
for pane in $panes; do
|
|
|
|
${echo} "The file is open in: $(${cut} -d "~" -f 1 --complement <<< "$pane" | ${pkgs.gnused}/bin/sed -e "s/~/ => /")."
|
|
|
|
done
|
2024-02-07 18:09:01 +01:00
|
|
|
else
|
|
|
|
${echo} "No process could be found. Delete the swap file." >&2
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2024-02-08 16:35:00 +01:00
|
|
|
spy() {
|
2024-02-09 12:07:00 +01:00
|
|
|
current_session="$(${tmux} list-clients -t "$TMUX_PANE" -F "#S" | ${head} -n 1)"
|
|
|
|
|
|
|
|
if [ -n "$1" ]; then
|
2024-02-11 18:10:02 +01:00
|
|
|
query="-1 -q $1"
|
2024-02-09 12:07:00 +01:00
|
|
|
else
|
|
|
|
query=""
|
|
|
|
fi
|
|
|
|
|
2024-02-09 13:31:07 +01:00
|
|
|
session="$(${tmux} list-clients -F "#S" | sort -u | sed -e "/$current_session/d" | ${fzf} -0 $query --prompt "current> " || ${tmux} list-sessions -F "#S" | sort -u | sed -e "/$current_session/d" | ${fzf} -0 $query --prompt "old> ")" && \
|
2024-02-08 21:56:18 +01:00
|
|
|
TMUX="" ${tmux} attach-session -r -t "$session"
|
2024-02-08 16:35:00 +01:00
|
|
|
}
|
|
|
|
|
2024-02-16 12:11:11 +01:00
|
|
|
,() {
|
|
|
|
if [ -x "./.run" ]
|
|
|
|
then
|
|
|
|
./run $@
|
|
|
|
fi
|
|
|
|
if basedir="$(git rev-parse --show-toplevel 2>/dev/null)" && [ -x "$basedir/.run" ]
|
|
|
|
then
|
|
|
|
"$basedir/.run" $@
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2024-01-04 12:53:08 +01:00
|
|
|
complete -F _command doas
|
2024-01-04 12:28:23 +01:00
|
|
|
'';
|
|
|
|
shellAliases = {
|
2024-03-01 15:06:18 +01:00
|
|
|
base = ''cd "$(tmux list-panes -F "#{pane_start_path}" | head -n 1)"'';
|
2024-01-04 12:28:23 +01:00
|
|
|
calculator = "(cd && R --save --quiet)";
|
2024-01-07 17:41:54 +01:00
|
|
|
chvt = "${runPrivileged} ${pkgs.kbd}/bin/chvt";
|
2024-01-21 17:39:53 +01:00
|
|
|
connected = ''
|
2024-01-24 17:46:38 +01:00
|
|
|
ssh scc230@shinobu 'users="" && for tmux_client in $(tmux list-clients | cut -d ":" -f 1 | cut -d "/" --complement -f 1,2); do if [ -n "$users" ]; then users+="@"; fi && users+="$(tailscale whois --json "$(last | rg "still logged in" | rg "$tmux_client" | tr -s " " | cut -d " " -f 3)" | jq -r ".UserProfile.DisplayName")"; done && echo "$users"' | tr "@" "\n" | sort -u
|
2024-01-21 17:39:53 +01:00
|
|
|
'';
|
2024-01-04 12:28:23 +01:00
|
|
|
drivediff = ''
|
2024-02-26 16:09:40 +01:00
|
|
|
rsync -nilrc --delete /mnt/external/Documents/ /home/${username}/Documents/ | sed -e "/.undo/d" -e "/.git/d"'';
|
2024-01-04 12:28:23 +01:00
|
|
|
here = "pwd >/tmp/herethere";
|
|
|
|
open = "xdg-open";
|
|
|
|
otp = ''
|
|
|
|
${pkgs.cloak}/bin/cloak view lancs | ${pkgs.coreutils}/bin/tr -d "\n" | ${pkgs.xclip}/bin/xclip -i -selection clipboard'';
|
2024-02-08 16:35:00 +01:00
|
|
|
pk = "tmux kill-session -t PROJECTS";
|
2024-02-18 20:23:10 +01:00
|
|
|
psql = "psql -d scc230 -U scc230 -p 5432 -h shinobu";
|
2024-02-26 20:02:43 +01:00
|
|
|
repo = ''
|
2024-03-12 00:02:59 +01:00
|
|
|
directory="$((cd /home/${username} && ${pkgs.fd}/bin/fd -H "^\.git$" Documents -x dirname {}) | sort -h | ${pkgs.fzf}/bin/fzf)" && (pushd "/home/${username}/$directory" >/dev/null; bash -i; popd >/dev/null)'';
|
2024-03-01 17:27:00 +01:00
|
|
|
serverfs = ''
|
|
|
|
base=$(git rev-parse --show-toplevel 2>/dev/null) && sshfs -o uid=$(id -u),gid=$(id -g) scc230@shinobu:/home/scc230/per-user/luke/server "$base/server"'';
|
2024-01-04 12:28:23 +01:00
|
|
|
there = ''cd "$(head -n 1 /tmp/herethere)"'';
|
|
|
|
wget = ''wget --hsts-file="$XDG_DATA_HOME/wget-hsts"'';
|
|
|
|
xclip = "xclip -selection clipboard";
|
|
|
|
};
|
2023-02-14 22:16:43 +01:00
|
|
|
};
|
|
|
|
};
|
2024-03-11 21:40:49 +01:00
|
|
|
services.pipewire = {
|
|
|
|
audio.enable = true;
|
|
|
|
enable = true;
|
|
|
|
pulse.enable = true;
|
|
|
|
socketActivation = true;
|
2023-05-25 15:23:31 +02:00
|
|
|
};
|
2023-04-29 22:42:15 +02:00
|
|
|
users = {
|
|
|
|
defaultUserShell = pkgs.bash;
|
2024-03-11 21:44:56 +01:00
|
|
|
users.${username}.extraGroups = [ "video" ];
|
2023-04-29 22:42:15 +02:00
|
|
|
};
|
2023-02-14 22:16:43 +01:00
|
|
|
}
|