Refactor back to a more modular configuration

This commit is contained in:
Oliver Davies 2025-04-23 14:19:05 +01:00
parent 19ea08a716
commit 2bedd41d83
178 changed files with 2245 additions and 1847 deletions

View file

@ -0,0 +1,41 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.bluetuith;
in
{
options.homeManagerModules.cli.bluetuith.enable = mkEnableOption "Enable bluetuith";
config = mkIf cfg.enable {
home.packages = with pkgs; [
bluetuith
];
xdg.configFile."bluetuith/bluetuith.conf" = {
text = ''
{
adapter: ""
adapter-states: ""
connect-bdaddr: ""
gsm-apn: ""
gsm-number: ""
keybindings: {
NavigateDown: j
NavigateUp: k
}
receive-dir: ""
theme: {}
}
'';
};
};
}

View file

@ -0,0 +1,16 @@
{
imports = [
./bluetuith.nix
./direnv.nix
./fzf.nix
./git.nix
./node.nix
./notes.nix
./ranger.nix
./scripts
./starship.nix
./tmux.nix
./tmux-sessionizer.nix
./zsh
];
}

View file

@ -0,0 +1,21 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.direnv;
in
{
options.homeManagerModules.cli.direnv.enable = mkEnableOption "Enable direnv";
config = mkIf cfg.enable {
programs.direnv = {
enable = true;
enableZshIntegration = true;
nix-direnv.enable = true;
silent = true;
};
};
}

View file

@ -0,0 +1,21 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.fzf;
in
{
options.homeManagerModules.cli.fzf.enable = mkEnableOption "Enable fzf";
config = mkIf cfg.enable {
programs.fzf = {
enable = true;
enableZshIntegration = true;
};
home.sessionVariables = {
FZF_DEFAULT_OPTS = "--reverse";
};
};
}

View file

@ -0,0 +1,178 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.git;
in
{
options.homeManagerModules.cli.git = {
enable = mkEnableOption "Enable git";
user = mkOption {
type = types.submodule {
options = {
emailAddress = mkOption {
description = "User email address.";
type = types.str;
apply =
x:
assert builtins.match "^[^@]+@[^@]+\\.[^@]+$" x != null;
x;
};
};
};
};
};
config = mkIf cfg.enable {
home.file."${config.xdg.configHome}/git/message".text = ''
# Description
#
# - Why is this change necessary?
# - How does it address the issue?
# - What side effects does this change have?
#
# For breaking changes, uncomment the following line and describe the change:
#
# BREAKING CHANGE:
#
#
# Add any issue IDs or commit SHAs that this commit references:
#
# Refs:
'';
programs = {
git = {
enable = true;
userName = "Oliver Davies";
userEmail = cfg.user.emailAddress;
aliases = {
aa = "add --all";
assume = "update-index --assume-unchanged";
assumed = "!git ls-files -v | grep '^[hsmrck?]' | cut -c 3-";
b = "branch";
blame = "blame -w -C -C -C";
browse = "!gh repo view --web";
ca = "commit --amend --verbose";
car = "commit --amend --no-edit";
cl = "!hub clone";
co = "checkout";
compare = "!hub compare";
current-branch = "rev-parse --abbrev-ref HEAD";
dc = "diff --color --word-diff --cached";
df = "diff --color --word-diff";
dup = "!git checkout develop && git fetch origin && echo && git sl develop..origin/develop && echo && git pull --quiet && git checkout -";
fixup = "commit --fixup";
issues = "!gh issue list --web";
mup = "!git master-to-main-wrapper checkout %BRANCH% && git fetch origin && echo && git sl %BRANCH%..origin/%BRANCH% && echo && git pull --quiet && git checkout -";
no-ff = "merge --no-ff";
pl = "pull";
prune = "remote prune origin";
ps = "push";
pulls = "!gh pr list --web";
rbc = "rebase --continue";
rdup = "!git dup && git rebase develop";
remotes = "remote -v";
repush = "!git pull --rebase && git push";
ri = "rebase --interactive";
rid = "!git rebase -i $(git merge-base develop HEAD)";
rim = "!git rebase -i $(git master-to-main-wrapper merge-base %BRANCH% HEAD)";
rip = "!git rebase -i $(git merge-base production HEAD)";
ris = "!git rebase -i $(git merge-base staging HEAD)";
riu = "!git rebase -i $(git rev-parse --abbrev-ref --symbolic-full-name @{u})";
rmup = "!git mup && git master-to-main-wrapper rebase %BRANCH%";
sl = "log --oneline --decorate -20";
sla = "log --oneline --decorate --graph --all -20";
slap = "log --oneline --decorate --graph --all";
slp = "log --oneline --decorate";
stash = "stash --included-untracked";
unassume = "update-index --no-assume-unchanged";
uncommit = "reset --soft HEAD^";
unstage = "reset";
update = "!git fetch --all --jobs=4 --prune --progress && git rebase --autostash --stat";
upstream = "rev-parse --abbrev-ref --symbolic-full-name @{u}";
ureset = "!git reset --hard $(git upstream)";
worktrees = "worktree list";
};
ignores = [
"/.ddev/providers/"
"/.direnv/"
"/.ignored/"
"/.issue-id"
"/.phpactor.json"
"/notes"
"/todo"
];
extraConfig = {
branch = {
autosetupmerge = true;
autosetuprebase = "always";
sort = "-committerdate";
};
checkout.defaultRemote = "origin";
color.ui = true;
column.ui = "auto";
commit.template = "${config.xdg.configHome}/git/message";
core = {
editor = "nvim";
excludesFile = "~/.config/git/ignore";
};
diff.tool = "vimdiff";
fetch.prune = true;
gpg.format = "ssh";
grep.lineNumber = true;
help.autocorrect = "1";
init.defaultBranch = "main";
maintenance = {
auto = false;
strategy = "incremental";
};
merge.ff = "only";
push = {
autoSetupRemote = true;
default = "upstream";
};
pull = {
ff = "only";
rebase = true;
};
rebase = {
autosquash = true;
autostash = true;
};
user.signingkey = "~/.ssh/id_rsa.pub";
};
};
};
home = {
packages = with pkgs; [ nixpkgs-2411.git-instafix ];
sessionVariables = {
GIT_INSTAFIX_UPSTREAM = "origin/main";
};
};
};
}

View file

@ -0,0 +1,25 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.node;
inherit (config.xdg) configHome dataHome stateHome;
in
{
options.homeManagerModules.cli.node.enable = mkEnableOption "Enable node";
config = mkIf cfg.enable {
xdg.configFile."${config.home.sessionVariables.NPM_CONFIG_USERCONFIG}".text = ''
cache=${configHome}/npm
init-module=${configHome}/npm/config/npm-init.js
logs-dir=${stateHome}/npm/logs
prefix=${dataHome}/npm
'';
home.sessionVariables = {
NPM_CONFIG_USERCONFIG = "${configHome}/npm/npmrc";
};
};
}

View file

@ -0,0 +1,30 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.notes;
in
{
options.homeManagerModules.cli.notes.enable = mkEnableOption "Enable notes";
config = mkIf cfg.enable {
xdg = {
enable = true;
userDirs.enable = true;
};
home = {
packages = with pkgs; [ notes ];
sessionVariables = {
NOTES_DIRECTORY = "${config.xdg.userDirs.documents}/wiki/notes";
};
};
};
}

View file

@ -0,0 +1,14 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.ranger;
in
{
options.homeManagerModules.cli.ranger.enable = mkEnableOption "Enable ranger";
config = mkIf cfg.enable {
programs.ranger.enable = true;
};
}

View file

@ -0,0 +1,10 @@
{
home = {
sessionPath = [ "$HOME/.local/bin" ];
file.".local/bin" = {
source = ./scripts;
recursive = true;
};
};
}

View file

@ -0,0 +1,21 @@
#!/usr/bin/env bash
if [[ "$1" == "" ]]; then
echo "Usage: ${0##*/} <script-name>"; exit 2
fi
set -o errexit
set -o nounset
set -o pipefail
cat > "${1}" << EOF
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
echo "${1}"
EOF
chmod +x "${1}"

View file

@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Abort a rebase, merge, `am`, a cherry-pick or a revert, depending on the situation.
if [[ -e .git/CHERRY_PICK_HEAD ]] ; then
exec git cherry-pick --abort "$@"
elif [[ -e .git/REVERT_HEAD ]] ; then
exec git revert --abort "$@"
elif [[ -e .git/rebase-apply/applying ]] ; then
exec git am --abort "$@"
elif [[ -e .git/rebase-apply ]] ; then
exec git rebase --abort "$@"
elif [[ -e .git/rebase-merge ]] ; then
exec git rebase --abort "$@"
elif [[ -e .git/MERGE_MODE ]] ; then
exec git merge --abort "$@"
else
echo git-abort: unknown state
exit 1
fi

View file

@ -0,0 +1,34 @@
#!/usr/bin/env bash
# Creates a new bare clone of a repository with the bare files within a `.bare`
# directory. It also sets the origin URL so push and pull work as expected.
if [[ "$1" == "" ]]; then
echo "Usage: ${0##*/} <repository> [<directory>]"
exit 2
fi
set -euo pipefail
repository_url="${1}"
directory="${2:-}"
location=".bare"
# If no destination directory is specified, get it from the repository URL - the same as "git clone".
if [ -z "${directory}" ]; then
directory="$(basename -s .git "${repository_url}")"
fi
# Create the parent directory if needed.
mkdir -pv "${directory}"
cd "${directory}"
git clone --bare "${repository_url}" "${location}"
# Adjust origin fetch locations.
cd "${location}"
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
# Set .git file contents.
cd ..
echo "gitdir: ./${location}" > .git

View file

@ -0,0 +1,16 @@
#!/usr/bin/env bash
# Continue a rebase or cherry-pick in the event of conflicts.
if [[ -e .git/CHERRY_PICK_HEAD ]] ; then
exec git cherry-pick --continue "$@"
elif [[ -e .git/rebase-apply/applying ]] ; then
exec git rebase --continue "$@"
elif [[ -e .git/rebase-apply ]] ; then
exec git rebase --continue "$@"
elif [[ -e .git/rebase-merge ]] ; then
exec git rebase --continue "$@"
else
echo git-abort: unknown state
exit 1
fi

View file

@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -euo pipefail
git fetch --all
git stash
git pull --rebase
git stash pop

View file

@ -0,0 +1,21 @@
#!/usr/bin/env bash
# Usage: git up {branch} {remote}
set -e
if [[ $# < 1 ]]; then
echo "You must specify a branch name to update"
exit 1
fi
BRANCH=$1
REMOTE=${2:-origin}
git checkout ${BRANCH} && \
git fetch ${REMOTE} && \
echo && \
git sl ${BRANCH}..${REMOTE}/${BRANCH} && \
echo && \
git pull --quiet && \
git checkout -

View file

@ -0,0 +1,17 @@
#!/usr/bin/env bash
if [[ "$1" == "" ]]; then
echo "Usage: ${0##*/} <filename>"; exit 2
fi
set -euo pipefail
filename="${1}"
shift 1
pv "${filename}" \
| zcat \
| docker compose exec -T "${SERVICE_NAME:-database}" mysql \
-p"${DB_PASSWORD:-app}" \
-u"${DB_USER:-app}" \
"${DB_NAME:-app}"

View file

@ -0,0 +1,10 @@
#!/bin/zsh
# Check if we should use the `main` or `master` branch for this repo.
# Prefer `main` to `master`.
if git show-ref --quiet origin/main || git rev-parse main &>/dev/null; then
echo main
else
echo master
fi

View file

@ -0,0 +1,36 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
lsblk_output="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,mountpoints,fstype" | grep "part" | grep -Ev "/(boot|nix/store)")"
partition_names="$(echo "$lsblk_output" | awk '{ printf "%s (%s)\n", $2, $4 }' )";
selected=$(echo "$partition_names" | dmenu -p "Select drive:" | awk '{ print $1 }')
test -n "$selected"
mount_device="$selected"
if sudo cryptsetup isLuks "$selected"; then
luks_name="usb"
${TERMINAL:-st} -n floatterm -g 60x1 -e sudo cryptsetup open "$selected" "$luks_name"
mount_device="/dev/mapper/$luks_name"
test -b "/dev/mapper/$luks_name"
fi
mount_point=$(echo -e "/mnt\n/media\n/run/media/$USER" | dmenu -p "Select mount point:")
test -n "$mount_point"
sudo mkdir -p "$mount_point"
if sudo mount "$mount_device" "$mount_point"; then
notify-send "Device mounted" "Mounted $selected at $mount_point."
else
notify-send "Mount failed" "Failed to mount $selected."
exit 1
fi

View file

@ -0,0 +1,11 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
original_directory="${HOME}/Downloads"
new_directory="${HOME}/Pictures/Screenshots"
find "${original_directory}" -mindepth 1 -maxdepth 1 -type f -name "Screenshot *" \
-exec mv {} "${new_directory}" \;

View file

@ -0,0 +1,19 @@
#!/usr/bin/env bash
if [[ "$1" == "" || "$2" == "" ]]; then
echo "Usage: ${0##*/} <machine-name> <module-name>"; exit 2
fi
set -euo pipefail
machine_name=$1
module_name=$2
git clone https://github.com/opdavies/drupal-module-template \
--depth=1 \
"${machine_name}"
pushd "${machine_name}"
just rename "${module_name}"
rm -fr .git .github justfile phpcs.xml.dist
popd

View file

@ -0,0 +1,3 @@
#!/usr/bin/env bash
xwallpaper --zoom ~/${XDG_REPOS_DIR}/nixos-config/wallpaper/wallpaper.jpg

View file

@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
cd "${XDG_REPOS_DIR}/traefik-development"
docker compose up --detach
docker container ps

View file

@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Stops all running Docker containers except for the global Traefik proxy.
set -euo pipefail
# Show the running containers.
docker container ps
echo ""
# Stop the running containers and show any that are still running.
docker container ls |
tail -n +2 |
grep -v traefik-development-reverse-proxy-1 |
awk '{print $1}' |
xargs docker container stop
echo ""
docker container ps

View file

@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
docker container stop traefik-development-reverse-proxy-1
docker container ps

View file

@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -euo pipefail
commit_sha="${1:-HEAD}"
tag="$(date '+%Y-%m-%d-%H.%M.%S')"
echo "Tagging commit $(git rev-parse "${commit_sha}") as ${tag}."
echo ""
# Tag the appropriate commit and push to the remote.
git tag "${tag}" "${commit_sha}"
git push origin "refs/tags/${tag}" --no-verify

View file

@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
lsblk_output="$(lsblk -nrpo "name,type,size,mountpoint")"
mounted_drives="$(echo "$lsblk_output" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}')"
all_unmountable="$(echo "$mounted_drives" | sed "/^$/d;s/ *$//")"
test -n "$all_unmountable"
selected="$(echo "$all_unmountable" | dmenu -i -p "Unmount which drive?")"
selected="${selected%% *}"
test -n "$selected"
sudo -A umount -l "/${selected#*/}"
notify-send "Device unmounted" "$selected has been unmounted."
# Close the selected drive if decrypted.
cryptid="$(echo "$lsblk_output" | grep "/${selected#*/}$")"
cryptid="${cryptid%% *}"
test -b /dev/mapper/"${cryptid##*/}"
sudo -A cryptsetup close "$cryptid"
notify-send "Device dencryption closed" "Drive is now securely locked again."

View file

@ -0,0 +1,25 @@
#!/usr/bin/env bash
# Update all top-level Git repository clones within my Code directories to their
# latest version.
set -o errexit
set -o nounset
dirs=$(find "$XDG_REPOS_DIR" -mindepth 1 -maxdepth 2 -type d -name .git -not -path '*/*.old/*')
for dir in $dirs; do
repo_path="${dir%/.git}"
cd "${repo_path}"
# If the repo is a bare clone, the commands need to be run within the
# worktree directory.
[[ -f .bare/worktrees/main/gitdir && -d main && -f main/.git ]] && cd main
echo "Updating $(pwd)"
# Update the repository.
git fetch --all --jobs=4 --progress --prune || true
git pull --rebase || true
done

View file

@ -0,0 +1,187 @@
{ config, lib, ... }:
with lib;
let
cfg = config.homeManagerModules.cli.starship;
in
{
options.homeManagerModules.cli.starship.enable = mkEnableOption "Enable starship";
config = mkIf cfg.enable {
programs.starship =
let
inherit (builtins) concatStringsSep;
in
{
enable = true;
enableZshIntegration = true;
settings = {
add_newline = false;
# https://starship.rs/config/#prompt
format = concatStringsSep "" [
"\n"
"$username"
"$hostname"
"$directory"
"$vcsh"
"$git_branch"
"$git_status"
"$git_metrics"
"$docker_context"
"$nodejs"
"$php"
"$terraform"
"$nix_shell"
"$direnv"
"\${custom.mob}"
"$memory_usage"
"$cmd_duration"
"$lua"
"$status"
"$character"
];
cmd_duration.disabled = true;
direnv.disabled = false;
directory.format = "[$path]($style) ";
git_status.disabled = true;
nix_shell.disabled = true;
nodejs.disabled = true;
php.disabled = true;
username.disabled = true;
custom = {
mob = {
command = "echo $MOB_TIMER_ROOM";
format = "[($output)]($style) ";
when = "[[ -v MOB_TIMER_ROOM ]]";
};
};
# https://starship.rs/presets/plain-text
aws.symbol = "aws ";
azure.symbol = "az ";
bun.symbol = "bun ";
c.symbol = "C ";
character = {
success_symbol = "[>](bold green)";
error_symbol = "[x](bold red)";
vimcmd_symbol = "[<](bold green)";
};
cobol.symbol = "cobol ";
conda.symbol = "conda ";
crystal.symbol = "cr ";
cmake.symbol = "cmake ";
daml.symbol = "daml ";
dart.symbol = "dart ";
deno.symbol = "deno ";
dotnet.symbol = ".NET ";
directory.read_only = " ro";
docker_context.symbol = "docker ";
elixir.symbol = "exs ";
elm.symbol = "elm ";
fennel.symbol = "fnl ";
fossil_branch.symbol = "fossil ";
gcloud.symbol = "gcp ";
git_branch.symbol = "git ";
git_commit.tag_symbol = " tag ";
git_status = {
ahead = ">";
behind = "<";
diverged = "<>";
renamed = "r";
deleted = "x";
};
gleam.symbol = "gleam ";
golang.symbol = "go ";
gradle.symbol = "gradle ";
guix_shell.symbol = "guix ";
hg_branch.symbol = "hg ";
java.symbol = "java ";
julia.symbol = "jl ";
kotlin.symbol = "kt ";
lua.symbol = "lua ";
nodejs.symbol = "nodejs ";
memory_usage.symbol = "memory ";
meson.symbol = "meson ";
nats.symbol = "nats ";
nim.symbol = "nim ";
nix_shell.symbol = "nix ";
ocaml.symbol = "ml ";
opa.symbol = "opa ";
os.symbols = {
AIX = "aix ";
Alpaquita = "alq ";
AlmaLinux = "alma ";
Alpine = "alp ";
Amazon = "amz ";
Android = "andr ";
Arch = "rch ";
Artix = "atx ";
CentOS = "cent ";
Debian = "deb ";
DragonFly = "dfbsd ";
Emscripten = "emsc ";
EndeavourOS = "ndev ";
Fedora = "fed ";
FreeBSD = "fbsd ";
Garuda = "garu ";
Gentoo = "gent ";
HardenedBSD = "hbsd ";
Illumos = "lum ";
Kali = "kali ";
Linux = "lnx ";
Mabox = "mbox ";
Macos = "mac ";
Manjaro = "mjo ";
Mariner = "mrn ";
MidnightBSD = "mid ";
Mint = "mint ";
NetBSD = "nbsd ";
NixOS = "nix ";
OpenBSD = "obsd ";
OpenCloudOS = "ocos ";
openEuler = "oeul ";
openSUSE = "osuse ";
OracleLinux = "orac ";
Pop = "pop ";
Raspbian = "rasp ";
Redhat = "rhl ";
RedHatEnterprise = "rhel ";
RockyLinux = "rky ";
Redox = "redox ";
Solus = "sol ";
SUSE = "suse ";
Ubuntu = "ubnt ";
Ultramarine = "ultm ";
Unknown = "unk ";
Void = "void ";
Windows = "win ";
};
package.symbol = "pkg ";
perl.symbol = "pl ";
php.symbol = "php ";
pijul_channel.symbol = "pijul ";
pulumi.symbol = "pulumi ";
purescript.symbol = "purs ";
python.symbol = "py ";
quarto.symbol = "quarto ";
raku.symbol = "raku ";
ruby.symbol = "rb ";
rust.symbol = "rs ";
scala.symbol = "scala ";
spack.symbol = "spack ";
solidity.symbol = "solidity ";
status.symbol = "[x](bold red) ";
sudo.symbol = "sudo ";
swift.symbol = "swift ";
typst.symbol = "typst ";
terraform.symbol = "terraform ";
zig.symbol = "zig ";
};
};
};
}

View file

@ -0,0 +1,46 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.tmux-sessionizer;
in
{
options.homeManagerModules.cli.tmux-sessionizer.enable = mkEnableOption "Enable tmux-sessionizer";
config = mkIf cfg.enable {
home.packages = with pkgs; [
tmux-sessionizer
];
xdg.configFile."tmux-sessionizer/default".source = "${
pkgs.writeShellApplication {
name = ".tmux-sessionizer";
runtimeInputs = with pkgs; [
tmux
];
text = ''
set +o errexit
set +o nounset
if [[ "$PWD" == "${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/os" || "$PWD" == "${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/personal" ]]; then
clear
return
fi
tmux new-window -d -n scratch
nvim .
clear
'';
}
}/bin/.tmux-sessionizer";
};
}

View file

@ -0,0 +1,97 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.tmux;
in
{
options.homeManagerModules.cli.tmux.enable = mkEnableOption "Enable tmux";
config = mkIf cfg.enable {
programs.tmux = {
enable = true;
terminal = "tmux-256color";
extraConfig = ''
set-option -g status-keys "vi"
set-option -sa terminal-features "''${TERM}:RGB"
bind -n S-Left resize-pane -L 2
bind -n S-Right resize-pane -R 2
bind -n S-Down resize-pane -D 1
bind -n S-Up resize-pane -U 1
bind -n C-Left resize-pane -L 10
bind -n C-Right resize-pane -R 10
bind -n C-Down resize-pane -D 5
bind -n C-Up resize-pane -U 5
# Status line customisation
set-option -g status-left ""
set-option -g status-right " #{session_name}"
set-option -g status-right-length 100
set-option -g status-style "fg=#7C7D83 bg=default"
set-option -g window-status-activity-style none
set-option -g window-status-current-style "fg=#E9E9EA"
bind c new-window -c "#{pane_current_path}"
set -g base-index 1
set -g pane-base-index 1
set -g renumber-windows on
# Break a pane into a new window.
bind-key b break-pane -d
bind-key J command-prompt -p "join pane from: " "join-pane -h -s '%%'"
bind-key C-j choose-tree
set-window-option -g mode-keys vi
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
bind C-j split-window -v "tmux list-sessions | sed -E 's/:.*$//' | grep -v \"^$(tmux display-message -p '#S')\$\" | fzf --reverse | xargs tmux switch-client -t"
bind-key K run-shell 'tmux switch-client -n \; kill-session -t "$(tmux display-message -p "#S")" || tmux kill-session'
# Allow clearing screen with ctrl-l by using <prefix> C-l
bind C-l send-keys "C-l"
bind C-k send-keys "C-k"
# Enable mouse support.
setw -g mouse on
# Remove delay when switching Vim modes.
set -sg escape-time 0
set-option -g pane-active-border-style "fg=#1f2335"
set-option -g pane-border-style "fg=#1f2335"
# Vim-like pane navigation.
bind ^ last-window
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind-key -r f run-shell "tmux new-window tmux-sessionizer"
bind-key -r D new-window -c "#{pane_current_path}" "[[ -e TODO.md ]] && nvim TODO.md || nvim ~/Documents/wiki/todo.txt"
bind-key -r N new-window "notes"
bind-key -r W split-window -h -c ~/Documents/wiki "nvim '+Telescope find_files'"
'';
plugins = with pkgs.tmuxPlugins; [
vim-tmux-navigator
yank
];
};
};
}

View file

@ -0,0 +1,140 @@
{
cl = "clear";
cs = "create-script";
daily = "run create-daily next";
rst = "rst2pdf";
st = "source .tmux";
sz = "source ~/.config/zsh/.zshrc";
ti = "timer";
uagr = "update-all-git-repos";
v = "nvim";
yt = "yt-dlp";
evl = "export-video-list";
vv = "cat ~/Documents/videos.json";
g = "git";
ga = "git add";
gan = "git add -N";
gap = "git add -p";
gb = "git branch";
gbl = "git blame";
gc = "git commit";
gca = "git commit --amend";
gcan = "git commit --amend --no-edit";
gcl = "git clone";
gcm = "git commit -m";
gco = "git checkout";
gcob = "git checkout -b";
gd = "git diff";
gds = "git diff --staged";
gf = "git fetch";
gfa = "git fetch --all";
gl = "git log";
glo = "git log --oneline";
gls = "git log --stat";
gm = "git merge";
gmf = "git merge --ff";
gmnf = "git merge --no-ff";
gp = "git push";
gpa = "git push acquia";
gpam = "git push acquia main";
gpap = "git push acquia HEAD:production";
gpl = "git pull";
gplr = "git pull --rebase";
gpo = "git push origin";
gpom = "git push origin main";
gr = "git rebase";
gra = "git rebase --abort";
grc = "git rebase --continue";
gri = "git rebase -i";
gs = "git status";
gsh = "git show";
gst = "git stash";
gstp = "git stash pop";
gt = "git tag";
# tmux
ta = "tmux attach";
tl = "tmux list-sessions";
tk = "tmux kill-session";
# Docker and Docker Compose.
dk = "docker";
dkp = "docker ps";
dkpa = "docker ps -a";
dkpaq = "docker ps -a -q";
dkb = "docker build -t";
dks = "docker start";
dkt = "docker stop";
dkrm = "docker rm";
dkri = "docker rmi";
dke = "docker exec -ti";
dkl = "docker logs -f";
dki = "docker images";
dkpu = "docker pull";
dkph = "docker push";
dkbnc = "docker build --no-cache -t";
dkr = "docker run --rm";
dkrti = "docker run --rm -ti";
dkc = "docker compose";
dkcb = "docker compose build";
dkcu = "docker compose up";
dkclean = "docker ps -q -a -f status=exited | xargs -r docker rm && docker images -q -f dangling=true | xargs -r docker rmi";
# Nix and direnv.
dea = "direnv allow";
dee = "direnv edit";
nxf = "nix flake";
nxfc = "nix flake check";
nxfs = "nix flake show";
nxfu = "nix flake update";
nxr = "nix run nixpkgs#%";
nxs = "nix shell nixpkgs#%";
# run scripts.
r = "run";
rc = "run composer";
rcda = "run composer dump-autoload";
rci = "run composer install";
rcr = "run composer require";
rcu = "run composer update";
rd = "run drush";
rdce = "run drush config:export -y";
rdci = "run drush config:import -y";
rdcr = "run drush cache:rebuild";
rdscr = "run drush php:script";
rduli = "run drush uli";
rdup = "run drush updatedb -y";
rpub = "run publish";
rt = "run test";
nah = "git reset --hard; git clean -fd";
wip = "git commit -m wip";
dv = "devenv";
dvi = "devenv info";
dvp = "devenv processes";
dvs = "devenv shell";
dvt = "devenv tasks";
dvu = "devenv up";
c = "composer";
ci = "composer install";
cr = "composer require";
crd = "composer require drupal/%";
cu = "composer update";
cul = "composer update --lock";
cw = "composer why";
cwn = "composer why-not";
d = "drush";
dce = "drush config:export -y";
dci = "drush config:import -y";
dcr = "drush cache:rebuild";
den = "drush pm:enable -y";
deu = "drush pm:uninstall";
dscr = "drush php:script";
duli = "drush uli";
dup = "drush updatedb -y";
}

View file

@ -0,0 +1,14 @@
{ config, ... }:
{
"$" = "";
"-" = "cd -";
".." = "cd ..";
"..." = "cd ../..";
"...." = "cd ../../..";
"....." = "cd ../../../..";
run = "./run";
tag = "tag-release";
vss = "LC_ALL=C sort --unique ${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/nixos-config/modules/home-manager/cli/neovim/config/spell/en.utf-8.adddotfiles/nvim/spell/en.utf-8.add --output ${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/nixos-config/modules/home-manager/cli/neovim/config/spell/en.utf-8.add";
wt = "git worktree";
}

View file

@ -0,0 +1,115 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.homeManagerModules.cli.zsh;
in
{
options.homeManagerModules.cli.zsh.enable = mkEnableOption "Enable zsh";
config = mkIf cfg.enable {
programs.zsh = {
enable = true;
enableCompletion = true;
syntaxHighlighting.enable = true;
zsh-abbr = {
enable = true;
abbreviations = import ./abbreviations.nix;
globalAbbreviations = import ./global-abbreviations.nix;
};
dotDir = ".config/zsh";
shellAliases = (import ./aliases.nix { inherit config; });
localVariables = {
ABBR_SET_EXPANSION_CURSOR = 1;
};
profileExtra = ''
if [[ -z "$DISPLAY" ]] && [[ "$(tty)" == "/dev/tty1" ]]; then
exec startx &>/dev/null
fi
'';
initExtra = ''
background() {
for ((i=2;i<=$#;i++)); do
''${@[1]} ''${@[$i]} &> /dev/null &
done
}
# suffix
alias -s gz="tar -tf"
alias -s {html,HTML}="background zsh"
alias -s {jpg,JPG,png,PNG}="background okular"
alias -s {pdf,PDF}="background okular"
alias -s {zip,ZIP}="unzip -l"
git() {
case "$1" in
clone)
shift
local repo_url="$1"
local repo_path="''${2:-}"
if [ -n "$TARGET_DIR" ]; then
command git clone "$repo_url" "$repo_path"
else
command git clone "$repo_url"
repo_path=$(basename "$repo_url" .git)
fi
${pkgs.tmux-sessionizer}/bin/tmux-sessionizer "$repo_path"
;;
root)
shift
local ROOT="$(${pkgs.git}/bin/git rev-parse --show-toplevel 2> /dev/null || echo -n .)"
if [[ $# == 0 ]]; then
cd "''${ROOT}"
else
(cd "''${ROOT}" && eval "''${@}")
fi
;;
*)
${pkgs.git}/bin/git "''${@}"
;;
esac
}
mbsync() {
${pkgs.isync}/bin/mbsync --config "${config.xdg.configHome}/isync/mbsyncrc" "''${@}"
}
ttyper() {
command ${pkgs.ttyper}/bin/ttyper --language english1000 --words 50 "''${@}"
}
yt-dlp() {
command yt-dlp --paths ~/Videos "$@"
}
bindkey -s ^f "tmux-sessionizer\n"
bindkey -s ^v "nvim\n"
setopt auto_cd
setopt auto_pushd
setopt pushd_ignore_dups
setopt pushdminus
'';
};
};
}

View file

@ -0,0 +1,14 @@
{
A1 = "| awk '{print $1}'";
C = "| xclip -sel clip";
Fj = "| jq .";
Fy = "| yq .";
G = "| grep";
GH = "| grep HTTP";
Gi = "| grep -i";
H2 = "| head -n 20";
H = "| head";
L = "| less";
V = "| nvim -";
X = "| xargs -I1";
}