Implement Linux-style Ctrl shortcuts (Ctrl+C/V/X/Z for clipboard, Ctrl+N/T/W for navigation, etc.) while preserving terminal behavior where Ctrl+C sends SIGINT. Uses per-app NSUserKeyEquivalents to remap Ghostty back to Cmd for clipboard operations. Also consolidate aerospace configuration by moving spans-displays preference from system-level module to home-manager role, allowing full aerospace configuration to live in home-manager for better modularity.
124 lines
3.8 KiB
Nix
124 lines
3.8 KiB
Nix
{ config, lib, pkgs, globalInputs, system, ... }:
|
|
|
|
{
|
|
# Home Manager configuration for Darwin work laptop
|
|
# Corporate-friendly setup with essential development tools
|
|
|
|
home.username = lib.mkForce "johno";
|
|
home.homeDirectory = lib.mkForce "/Users/johno";
|
|
home.stateVersion = "24.05";
|
|
|
|
# System packages
|
|
home.packages = with pkgs; [
|
|
google-cloud-sdk
|
|
];
|
|
|
|
# Note: ghostty installed via Homebrew (managed outside of nix)
|
|
|
|
# Override Darwin-incompatible settings from base role
|
|
programs.rbw.settings.pinentry = lib.mkForce pkgs.pinentry_mac;
|
|
|
|
# Disable Home Manager from managing shell RC files
|
|
# topsoil/compost will manage these files instead
|
|
programs.bash.enable = lib.mkForce false;
|
|
programs.zsh.enable = lib.mkForce false;
|
|
|
|
# Create a local nix integration file that topsoil-managed configs can source
|
|
home.file.".nix-integration.sh" = {
|
|
text = ''
|
|
# Source Home Manager session variables (nix paths, environment, etc.)
|
|
if [ -e /etc/profiles/per-user/johno/etc/profile.d/hm-session-vars.sh ]; then
|
|
. /etc/profiles/per-user/johno/etc/profile.d/hm-session-vars.sh
|
|
fi
|
|
|
|
# Setup bash completions from nix profiles
|
|
if [[ ! -v BASH_COMPLETION_VERSINFO ]] && [ -n "$NIX_PROFILES" ]; then
|
|
for profile in $NIX_PROFILES; do
|
|
if [ -f "$profile/etc/profile.d/bash_completion.sh" ]; then
|
|
. "$profile/etc/profile.d/bash_completion.sh"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# command-not-found handler
|
|
command_not_found_handle() {
|
|
local p=/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite
|
|
if [ -n "$NIX_PROFILES" ]; then
|
|
for profile in $NIX_PROFILES; do
|
|
if [ -x "$profile/bin/command-not-found" ] && [ -f "$p" ]; then
|
|
"$profile/bin/command-not-found" "$@"
|
|
return $?
|
|
fi
|
|
done
|
|
fi
|
|
echo "$1: command not found" >&2
|
|
return 127
|
|
}
|
|
'';
|
|
};
|
|
|
|
home.file.".nix-integration.zsh" = {
|
|
text = ''
|
|
# Source Home Manager session variables (nix paths, environment, etc.)
|
|
if [ -e /etc/profiles/per-user/johno/etc/profile.d/hm-session-vars.sh ]; then
|
|
. /etc/profiles/per-user/johno/etc/profile.d/hm-session-vars.sh
|
|
fi
|
|
|
|
# Setup zsh completions from nix profiles
|
|
typeset -U path cdpath fpath manpath
|
|
for profile in ''${(z)NIX_PROFILES}; do
|
|
fpath+=($profile/share/zsh/site-functions $profile/share/zsh/$ZSH_VERSION/functions $profile/share/zsh/vendor-completions)
|
|
done
|
|
autoload -U compinit && compinit
|
|
|
|
# command-not-found handler
|
|
command_not_found_handler() {
|
|
local p=/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite
|
|
if [ -n "$NIX_PROFILES" ]; then
|
|
for profile in ''${(z)NIX_PROFILES}; do
|
|
if [ -x "$profile/bin/command-not-found" ] && [ -f "$p" ]; then
|
|
"$profile/bin/command-not-found" "$@"
|
|
return $?
|
|
fi
|
|
done
|
|
fi
|
|
echo "$1: command not found" >&2
|
|
return 127
|
|
}
|
|
'';
|
|
};
|
|
|
|
# Keep SSH and Git disabled to avoid conflicts with work environment
|
|
programs.ssh.enable = lib.mkForce false;
|
|
programs.git.enable = lib.mkForce false;
|
|
programs.rbw.enable = lib.mkForce false;
|
|
|
|
home.shell.enableShellIntegration = true;
|
|
|
|
home.roles = {
|
|
base.enable = true;
|
|
development = {
|
|
enable = true;
|
|
allowArbitraryClaudeCodeModelSelection = true;
|
|
};
|
|
tmux.enable = true;
|
|
emacs.enable = true;
|
|
aerospace = {
|
|
enable = true;
|
|
leader = "cmd";
|
|
ctrlShortcuts.enable = true;
|
|
sketchybar.enable = true;
|
|
# Optional: Add per-machine userSettings overrides
|
|
# userSettings = {
|
|
# mode.main.binding."${leader}-custom" = "custom-command";
|
|
# };
|
|
};
|
|
};
|
|
|
|
imports = [
|
|
./roles
|
|
./roles/base-darwin
|
|
];
|
|
}
|