1 Commits
Author SHA1 Message Date
Olaf Kolkman 697a62bc89 Platform IO still doesn't run 2025-06-03 07:26:20 +02:00
43 changed files with 5632 additions and 1014 deletions
+7 -4
View File
@@ -1,9 +1,12 @@
# A macOS nix-darwin config # A NIX Config To Rule Them all
_now mostly focused on my Mac Machines_
This repository now focuses on macOS systems managed with nix-darwin. Started with a configuration generated from [this nixos config template](https://github.com/dustinlyons/nixos-config/)
Installed nix with `--nix-build-group-id 30000`
Started with a configuration generated from [this nixos config template](https://github.com/dustinlyons/nixos-config/)Installed nix with `--nix-build-group-id 30000`
Initialy created 'with secrets' but stripped out the git/agenix in favor of sops Initialy created 'with secrets' but stripped out the git/agenix in favor of sops
Refactored the configuration to remove nixos but keep the shared modules and Darwin host setup, with no NixOS trees or Linux app targets. ```
mkdir -p nixos-config && cd nixos-config && nix flake --extra-experimental-features 'nix-command flakes' init -t github:dustinlyons/nixos-config#starter-with-secrets
```
+31 -2
View File
@@ -35,11 +35,27 @@ _prompt() {
read -r $variable read -r $variable
} }
ask_for_star() {
_print "${YELLOW}Would you like to support my work by starring my GitHub repo? yes/no [yes]: ${NC}"
local response
read -r response
response=${response:-yes} # Set default response to 'yes' if input is empty
if [[ "$response" =~ ^[Yy](es)?$ ]] || [[ -z "$response" ]]; then
if [[ "$OS" == "Darwin" ]]; then
open "https://github.com/dustinlyons/nixos-config"
else
xdg-open "https://github.com/dustinlyons/nixos-config"
fi
fi
}
ask_for_star
# Fetch username from the system # Fetch username from the system
export USERNAME=$(whoami) export USERNAME=$(whoami)
# If the username is 'root', ask the user for their username # If the username is 'nixos' or 'root', ask the user for their username
if [[ "$USERNAME" == "root" ]]; then if [[ "$USERNAME" == "nixos" ]] || [[ "$USERNAME" == "root" ]]; then
_prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME _prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME
fi fi
@@ -85,11 +101,24 @@ select_boot_disk() {
fi fi
} }
# Set hostname and find primary disk if this is NixOS
if [[ "$OS" != "Darwin" ]]; then
_prompt "${YELLOW}Please enter a hostname for the system: ${NC}" HOST_NAME
export HOST_NAME
select_boot_disk
fi
confirm_details() { confirm_details() {
_print "${GREEN}Username: $USERNAME" _print "${GREEN}Username: $USERNAME"
_print "Email: $GIT_EMAIL" _print "Email: $GIT_EMAIL"
_print "Name: $GIT_NAME${NC}" _print "Name: $GIT_NAME${NC}"
if([[ "$OS" != "Darwin" ]]); then
_print "${GREEN}Primary interface: $PRIMARY_IFACE"
_print "Boot disk: $BOOT_DISK"
_print "Hostname: $HOST_NAME${NC}"
fi
_prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice _prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice
case "$choice" in case "$choice" in
+1
View File
@@ -0,0 +1 @@
x86_64-linux
+31 -2
View File
@@ -35,11 +35,27 @@ _prompt() {
read -r $variable read -r $variable
} }
ask_for_star() {
_print "${YELLOW}Would you like to support my work by starring my GitHub repo? yes/no [yes]: ${NC}"
local response
read -r response
response=${response:-yes} # Set default response to 'yes' if input is empty
if [[ "$response" =~ ^[Yy](es)?$ ]] || [[ -z "$response" ]]; then
if [[ "$OS" == "Darwin" ]]; then
open "https://github.com/dustinlyons/nixos-config"
else
xdg-open "https://github.com/dustinlyons/nixos-config"
fi
fi
}
ask_for_star
# Fetch username from the system # Fetch username from the system
export USERNAME=$(whoami) export USERNAME=$(whoami)
# If the username is 'root', ask the user for their username # If the username is 'nixos' or 'root', ask the user for their username
if [[ "$USERNAME" == "root" ]]; then if [[ "$USERNAME" == "nixos" ]] || [[ "$USERNAME" == "root" ]]; then
_prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME _prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME
fi fi
@@ -85,11 +101,24 @@ select_boot_disk() {
fi fi
} }
# Set hostname and find primary disk if this is NixOS
if [[ "$OS" != "Darwin" ]]; then
_prompt "${YELLOW}Please enter a hostname for the system: ${NC}" HOST_NAME
export HOST_NAME
select_boot_disk
fi
confirm_details() { confirm_details() {
_print "${GREEN}Username: $USERNAME" _print "${GREEN}Username: $USERNAME"
_print "Email: $GIT_EMAIL" _print "Email: $GIT_EMAIL"
_print "Name: $GIT_NAME${NC}" _print "Name: $GIT_NAME${NC}"
if([[ "$OS" != "Darwin" ]]); then
_print "${GREEN}Primary interface: $PRIMARY_IFACE"
_print "Boot disk: $BOOT_DISK"
_print "Hostname: $HOST_NAME${NC}"
fi
_prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice _prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice
case "$choice" in case "$choice" in
+169
View File
@@ -0,0 +1,169 @@
#!/usr/bin/env bash
VERSION=1.0
# Color codes
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Determine the operating system
export OS=$(uname)
# Primary network interface
if [[ "$OS" != "Darwin" ]]; then
export PRIMARY_IFACE=$(ip -o -4 route show to default | awk '{print $5}')
echo -e "${GREEN}Found primary network interface $PRIMARY_IFACE${NC}"
fi
# Custom print function
_print() {
if [[ "$OS" == "Darwin" ]]; then
echo -e "$1"
else
echo "$1"
fi
}
# Custom prompt function
_prompt() {
local message="$1"
local variable="$2"
_print "$message"
read -r $variable
}
ask_for_star() {
_print "${YELLOW}Would you like to support my work by starring my GitHub repo? yes/no [yes]: ${NC}"
local response
read -r response
response=${response:-yes} # Set default response to 'yes' if input is empty
if [[ "$response" =~ ^[Yy](es)?$ ]] || [[ -z "$response" ]]; then
if [[ "$OS" == "Darwin" ]]; then
open "https://github.com/dustinlyons/nixos-config"
else
xdg-open "https://github.com/dustinlyons/nixos-config"
fi
fi
}
ask_for_star
# Fetch username from the system
export USERNAME=$(whoami)
# If the username is 'nixos' or 'root', ask the user for their username
if [[ "$USERNAME" == "nixos" ]] || [[ "$USERNAME" == "root" ]]; then
_prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME
fi
# Check if git is available
if command -v git >/dev/null 2>&1; then
# Fetch email and name from git config
export GIT_EMAIL=$(git config --get user.email)
export GIT_NAME=$(git config --get user.name)
else
_print "${RED}Git is not available on this system.${NC}"
fi
# If git email is not found or git is not available, ask the user
if [[ -z "$GIT_EMAIL" ]]; then
_prompt "${YELLOW}Please enter your email: ${NC}" GIT_EMAIL
fi
# If git name is not found or git is not available, ask the user
if [[ -z "$GIT_NAME" ]]; then
_prompt "${YELLOW}Please enter your name: ${NC}" GIT_NAME
fi
select_boot_disk() {
local disks
local _boot_disk
_print "${YELLOW}Available disks:${NC}"
disks=$(lsblk -nd --output NAME,SIZE | grep -v loop)
echo "$disks"
# Warning message for data deletion
_print "${RED}WARNING: All data on the chosen disk will be erased during the installation!${NC}"
_prompt "${YELLOW}Please enter the name of your boot disk (e.g., sda, nvme0n1). Do not include the full path ("/dev/"): ${NC}" _boot_disk
# Confirmation for disk selection to prevent accidental data loss
_print "${YELLOW}You have selected $_boot_disk as the boot disk. This will delete everything on this disk. Are you sure? (Y/N): ${NC}"
read -r confirmation
if [[ "$confirmation" =~ ^[Yy]$ ]]; then
export BOOT_DISK=$_boot_disk
else
_print "${RED}Disk selection cancelled by the user. Please run the script again to select the correct disk.${NC}"
exit 1
fi
}
# Set hostname and find primary disk if this is NixOS
if [[ "$OS" != "Darwin" ]]; then
_prompt "${YELLOW}Please enter a hostname for the system: ${NC}" HOST_NAME
export HOST_NAME
select_boot_disk
fi
# Confirmation step
confirm_details() {
_print "${GREEN}Username: $USERNAME"
_print "Email: $GIT_EMAIL"
_print "Name: $GIT_NAME${NC}"
if([[ "$OS" != "Darwin" ]]); then
_print "${GREEN}Primary interface: $PRIMARY_IFACE"
_print "Boot disk: $BOOT_DISK"
_print "Hostname: $HOST_NAME${NC}"
fi
_prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice
case "$choice" in
[Nn] | [Nn][Oo] )
_print "${RED}Exiting script.${NC}"
exit 1
;;
[Yy] | [Yy][Ee][Ss] )
_print "${GREEN}Continuing...${NC}"
;;
* )
_print "${RED}Invalid option. Exiting script.${NC}"
exit 1
;;
esac
}
# Call the confirmation function
confirm_details
# Function to replace tokens in each file
replace_tokens() {
local file="$1"
if [[ $(basename $1) != "apply" ]]; then
if [[ "$OS" == "Darwin" ]]; then
# macOS
LC_ALL=C LANG=C sed -i '' -e "s/%USER%/$USERNAME/g" "$file"
LC_ALL=C LANG=C sed -i '' -e "s/%EMAIL%/$GIT_EMAIL/g" "$file"
LC_ALL=C LANG=C sed -i '' -e "s/%NAME%/$GIT_NAME/g" "$file"
else
# Linux or other
sed -i -e "s/%USER%/$USERNAME/g" "$file"
sed -i -e "s/%EMAIL%/$GIT_EMAIL/g" "$file"
sed -i -e "s/%NAME%/$GIT_NAME/g" "$file"
sed -i -e "s/%INTERFACE%/$PRIMARY_IFACE/g" "$file"
sed -i -e "s/%DISK%/$BOOT_DISK/g" "$file"
sed -i -e "s/%HOST%/$HOST_NAME/g" "$file"
fi
fi
}
# Traverse directories and call replace_tokens on each Nix file
export -f replace_tokens
find . -type f -exec bash -c 'replace_tokens "$0"' {} \;
echo "$USERNAME" > /tmp/username.txt
_print "${GREEN}User $USERNAME information applied.${NC}"
+30
View File
@@ -0,0 +1,30 @@
#!/bin/sh -e
VERSION=1.0
GREEN='\033[1;32m'
RED='\033[1;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
SYSTEM=$(uname -m)
case "$SYSTEM" in
x86_64)
FLAKE_TARGET="x86_64-linux"
;;
aarch64)
FLAKE_TARGET="aarch64-linux"
;;
*)
echo -e "${RED}Unsupported architecture: $SYSTEM${NC}"
exit 1
;;
esac
echo -e "${YELLOW}Starting...${NC}"
# We pass SSH from user to root so root can download secrets from our private Github
sudo SSH_AUTH_SOCK=$SSH_AUTH_SOCK /run/current-system/sw/bin/nixos-rebuild switch --flake .#$FLAKE_TARGET $@
echo -e "${GREEN}Switch to new generation complete!${NC}"
+57 -33
View File
@@ -1,9 +1,8 @@
{ {
description = "Starter configuration for macOS with nix-darwin"; description = "Starter Configuration with secrets (removed) for MacOS and NixOS";
inputs = { inputs = {
nixpkgs = { nixpkgs = {
url = "github:nixos/nixpkgs//nixpkgs-26.05-darwin"; url = "github:nixos/nixpkgs//nixpkgs-25.05-darwin";
# url = "github:nixos/nixpkgs/nixpkgs-unstable";
}; };
home-manager = { home-manager = {
url = "github:nix-community/home-manager"; url = "github:nix-community/home-manager";
@@ -12,19 +11,16 @@
url = "github:nix-community/nixd"; url = "github:nix-community/nixd";
}; };
darwin = { darwin = {
# url = "github:nix-darwin/nix-darwin"; url = "github:nix-darwin/nix-darwin/nix-darwin-25.05";
url = "github:nix-darwin/nix-darwin/nix-darwin-26.05";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
brew-src = {
url = "github:Homebrew/brew/master";
flake = false;
};
nix-homebrew = { nix-homebrew = {
url = "github:zhaofengli-wip/nix-homebrew"; url = "github:zhaofengli-wip/nix-homebrew";
inputs.brew-src.follows = "brew-src";
}; };
homebrew-bundle = {
url = "github:homebrew/homebrew-bundle";
flake = false;
};
homebrew-core = { homebrew-core = {
url = "github:homebrew/homebrew-core"; url = "github:homebrew/homebrew-core";
flake = false; flake = false;
@@ -33,6 +29,10 @@
url = "github:homebrew/homebrew-cask"; url = "github:homebrew/homebrew-cask";
flake = false; flake = false;
}; };
disko = {
url = "github:nix-community/disko";
inputs.nixpkgs.follows = "nixpkgs";
};
sops-nix = { sops-nix = {
url = "github:Mic92/sops-nix"; url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
@@ -40,41 +40,35 @@
nix-vscode-extensions = { nix-vscode-extensions = {
url = "github:nix-community/nix-vscode-extensions"; url = "github:nix-community/nix-vscode-extensions";
}; };
catppuccin = {
url = "github:catppuccin/nix";
};
llm-agents = {
url = "github:numtide/llm-agents.nix";
};
# mac-app-util doesn't work with OCLP installed on X86
# mac-app-util = {
# url = "github:hraban/mac-app-util";
# };
}; };
outputs = outputs =
{ {
self, self,
darwin, darwin,
nix-homebrew, nix-homebrew,
homebrew-bundle,
homebrew-core, homebrew-core,
homebrew-cask, homebrew-cask,
home-manager, home-manager,
nixpkgs, nixpkgs,
disko,
nixd, nixd,
sops-nix, sops-nix,
nix-vscode-extensions, nix-vscode-extensions,
catppuccin,
llm-agents,
...
}@inputs: }@inputs:
let let
user = "olaf"; user = "olaf";
linuxSystems = [
"x86_64-linux"
"aarch64-linux"
];
darwinSystems = [ darwinSystems = [
"aarch64-darwin" "aarch64-darwin"
"x86_64-darwin" "x86_64-darwin"
]; ];
forAllSystems = f: nixpkgs.lib.genAttrs darwinSystems f; forAllSystems = f: nixpkgs.lib.genAttrs (linuxSystems ++ darwinSystems) f;
devShell = devShell =
system: system:
let let
@@ -108,16 +102,29 @@
'') '')
}/bin/${scriptName}"; }/bin/${scriptName}";
}; };
mkLinuxApps = system: {
"apply" = mkApp "apply" system;
"build-switch" = mkApp "build-switch" system;
"copy-keys" = mkApp "copy-keys" system;
"create-keys" = mkApp "create-keys" system;
"check-keys" = mkApp "check-keys" system;
"install" = mkApp "install" system;
};
mkDarwinApps = system: { mkDarwinApps = system: {
"apply" = mkApp "apply" system; "apply" = mkApp "apply" system;
"build" = mkApp "build" system; "build" = mkApp "build" system;
"build-switch" = mkApp "build-switch" system; "build-switch" = mkApp "build-switch" system;
"copy-keys" = mkApp "copy-keys" system;
"create-keys" = mkApp "create-keys" system;
"check-keys" = mkApp "check-keys" system;
"rollback" = mkApp "rollback" system; "rollback" = mkApp "rollback" system;
}; };
in in
{ {
devShells = forAllSystems devShell; devShells = forAllSystems devShell;
apps = nixpkgs.lib.genAttrs darwinSystems mkDarwinApps; apps =
nixpkgs.lib.genAttrs linuxSystems mkLinuxApps
// nixpkgs.lib.genAttrs darwinSystems mkDarwinApps;
darwinConfigurations = nixpkgs.lib.genAttrs darwinSystems ( darwinConfigurations = nixpkgs.lib.genAttrs darwinSystems (
system: system:
@@ -125,9 +132,9 @@
inherit system; inherit system;
specialArgs = inputs; specialArgs = inputs;
modules = [ modules = [
# sops-nix.nixosModules.sops
home-manager.darwinModules.home-manager home-manager.darwinModules.home-manager
nix-homebrew.darwinModules.nix-homebrew nix-homebrew.darwinModules.nix-homebrew
# mac-app-util.darwinModules.default
{ {
nix-homebrew = { nix-homebrew = {
inherit user; inherit user;
@@ -135,19 +142,36 @@
taps = { taps = {
"homebrew/homebrew-core" = homebrew-core; "homebrew/homebrew-core" = homebrew-core;
"homebrew/homebrew-cask" = homebrew-cask; "homebrew/homebrew-cask" = homebrew-cask;
"homebrew/homebrew-bundle" = homebrew-bundle;
}; };
mutableTaps = false; mutableTaps = false;
# autoMigrate = true; autoMigrate = true;
}; };
home-manager.sharedModules = [
# mac-app-util.homeManagerModules.default
catppuccin.homeModules.catppuccin
];
} }
./hosts/darwin ./hosts/darwin
]; ];
} }
); );
nixosConfigurations = nixpkgs.lib.genAttrs linuxSystems (
system:
nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = inputs;
modules = [
sops-nix.nixosModules.sops
disko.nixosModules.disko
home-manager.nixosModules.home-manager
{
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.${user} = import ./modules/nixos/home-manager.nix;
};
}
./hosts/nixos
];
}
);
}; };
} }
-56
View File
@@ -1,56 +0,0 @@
(eval-when-compile
(require 'use-package))
;; load some packages
(use-package company
:bind ("<C-tab>" . company-complete)
:diminish company-mode
:commands (company-mode global-company-mode)
:defer 1
:config
(global-company-mode))
(use-package counsel
:commands (counsel-descbinds)
:bind (([remap execute-extended-command] . counsel-M-x)
("C-x C-f" . counsel-find-file)
("C-c g" . counsel-git)
("C-c j" . counsel-git-grep)
("C-c k" . counsel-ag)
("C-x l" . counsel-locate)
("M-y" . counsel-yank-pop)))
(use-package flycheck
:defer 2
:config (global-flycheck-mode))
(use-package ivy
:defer 1
:bind (("C-c C-r" . ivy-resume)
("C-x C-b" . ivy-switch-buffer)
:map ivy-minibuffer-map
("C-j" . ivy-call))
:diminish ivy-mode
:commands ivy-mode
:config
(ivy-mode 1))
(use-package magit
:defer
:if (executable-find "git")
:bind (("C-x g" . magit-status)
("C-x G" . magit-dispatch-popup))
:init
(setq magit-completing-read-function 'ivy-completing-read))
(use-package projectile
:commands projectile-mode
:bind-keymap ("C-c p" . projectile-command-map)
:defer 5
:config
(projectile-global-mode))
(global-set-key (kbd "C-.") 'set-mark-command)
+5 -55
View File
@@ -1,7 +1,6 @@
{ {
config, config,
pkgs, pkgs,
llm-agents,
... ...
}: }:
@@ -22,9 +21,9 @@ in
}; };
imports = [ imports = [
../../modules/darwin/default.nix
../../modules/darwin/home-manager.nix ../../modules/darwin/home-manager.nix
# ../../modules/darwin/ai.nix ../../modules/shared
]; ];
# Setup user, packages, programs # Setup user, packages, programs
@@ -40,10 +39,7 @@ in
"https://nix-community.cachix.org" "https://nix-community.cachix.org"
"https://cache.nixos.org" "https://cache.nixos.org"
]; ];
trusted-public-keys = [ trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
}; };
gc = { gc = {
@@ -61,62 +57,16 @@ in
''; '';
}; };
users.groups = {
gidevelopert = {
description = "Git Common Rights";
gid = 500;
name = "gitdeveloper";
members = [ "olaf" ];
};
};
users.knownGroups = [ "gitdeveloper" ];
# Turn off NIX_PATH warnings now that we're using flakes # Turn off NIX_PATH warnings now that we're using flakes
system.checks.verifyNixPath = false; system.checks.verifyNixPath = false;
fonts = {
packages = with pkgs; [
dejavu_fonts
emacs-all-the-icons-fonts
# feather-font # from overlayj
jetbrains-mono
google-fonts
font-awesome
noto-fonts
noto-fonts-color-emoji
# jetbrains-mono
hack-font
meslo-lgs-nf
nerd-fonts.fira-code
nerd-fonts.droid-sans-mono
noto-fonts-cjk-sans
noto-fonts
]
# this adds all nerd-fonts Gigabytes of them, too much.
# ++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts)
;
};
# Load configuration that is shared across systems # Load configuration that is shared across systems
environment.systemPackages = environment.systemPackages =
with pkgs; with pkgs;
[ [
# Emacs with automatic package management from overlay emacs-unstable
(emacsWithPackagesFromUsePackage {
config = ../config/emacs/emacs.el;
defaultInitFile = true;
package = emacs-git;
alwaysEnsure = true;
extraEmacsPackages =
epkgs: with epkgs; [
magit
company
nix-mode
use-package
];
})
] ]
++ (import ../../modules/darwin/packages.nix { inherit pkgs llm-agents; }) ++ (import ../../modules/shared/packages.nix { inherit pkgs; })
; ;
+342
View File
@@ -0,0 +1,342 @@
{
config,
inputs,
pkgs,
...
}:
let
user = "olaf";
keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOk8iAnIaa1deoc7jw8YACPNVka1ZFJxhnU4G74TmS+p" ];
in
{
imports = [
../../modules/nixos/disk-config.nix
../../modules/shared
];
# Use the systemd-boot EFI boot loader.
boot = {
loader = {
systemd-boot = {
enable = true;
configurationLimit = 42;
};
efi.canTouchEfiVariables = true;
};
initrd.availableKernelModules = [
"xhci_pci"
"ahci"
"nvme"
"usbhid"
"usb_storage"
"sd_mod"
];
# Uncomment for AMD GPU
# initrd.kernelModules = [ "amdgpu" ];
kernelPackages = pkgs.linuxPackages_latest;
kernelModules = [ "uinput" ];
};
# Set your time zone.
time.timeZone = "America/New_York";
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
# Per-interface useDHCP will be mandatory in the future, so this generated config
# replicates the default behaviour.
networking = {
hostName = "%HOST%"; # Define your hostname.
useDHCP = false;
interfaces."%INTERFACE%".useDHCP = true;
};
nix = {
nixPath = [ "nixos-config=/home/${user}/.local/share/src/nixos-config:/etc/nixos" ];
settings = {
allowed-users = [ "${user}" ];
trusted-users = [
"@admin"
"${user}"
];
substituters = [
"https://nix-community.cachix.org"
"https://cache.nixos.org"
];
trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
};
package = pkgs.nix;
extraOptions = ''
experimental-features = nix-command flakes
'';
};
# Manages keys and such
programs = {
gnupg.agent.enable = true;
# Needed for anything GTK related
dconf.enable = true;
# My shell
zsh.enable = true;
};
services = {
displayManager.defaultSession = "none+bspwm";
xserver = {
enable = true;
# Uncomment these for AMD or Nvidia GPU
# videoDrivers = [ "amdgpu" ];
# videoDrivers = [ "nvidia" ];
# Uncomment this for Nvidia GPU
# This helps fix tearing of windows for Nvidia cards
# services.xserver.screenSection = ''
# Option "metamodes" "nvidia-auto-select +0+0 {ForceFullCompositionPipeline=On}"
# Option "AllowIndirectGLXProtocol" "off"
# Option "TripleBuffer" "on"
# '';
# LightDM Display Manager
displayManager.lightdm = {
enable = true;
greeters.slick.enable = true;
background = ../../modules/nixos/config/login-wallpaper.png;
};
# Tiling window manager
windowManager.bspwm = {
enable = true;
};
xkb = {
# Turn Caps Lock into Ctrl
layout = "us";
options = "ctrl:nocaps";
};
};
# Better support for general peripherals
libinput.enable = true;
# Let's be able to SSH into this machine
openssh.enable = true;
# Sync state between machines
# Sync state between machines
syncthing = {
enable = true;
openDefaultPorts = true;
dataDir = "/home/${user}/.local/share/syncthing";
configDir = "/home/${user}/.config/syncthing";
user = "${user}";
group = "users";
guiAddress = "127.0.0.1:8384";
overrideFolders = true;
overrideDevices = true;
settings = {
devices = { };
options.globalAnnounceEnabled = false; # Only sync on LAN
};
};
# Picom, my window compositor with fancy effects
#
# Notes on writing exclude rules:
#
# class_g looks up index 1 in WM_CLASS value for an application
# class_i looks up index 0
#
# To find the value for a specific application, use `xprop` at the
# terminal and then click on a window of the application in question
#
picom = {
enable = true;
settings = {
animations = true;
animation-stiffness = 300.0;
animation-dampening = 35.0;
animation-clamping = false;
animation-mass = 1;
animation-for-workspace-switch-in = "auto";
animation-for-workspace-switch-out = "auto";
animation-for-open-window = "slide-down";
animation-for-menu-window = "none";
animation-for-transient-window = "slide-down";
corner-radius = 12;
rounded-corners-exclude = [
"class_i = 'polybar'"
"class_g = 'i3lock'"
];
round-borders = 3;
round-borders-exclude = [ ];
round-borders-rule = [ ];
shadow = true;
shadow-radius = 8;
shadow-opacity = 0.4;
shadow-offset-x = -8;
shadow-offset-y = -8;
fading = false;
inactive-opacity = 0.8;
frame-opacity = 0.7;
inactive-opacity-override = false;
active-opacity = 1.0;
focus-exclude = [
];
opacity-rule = [
"100:class_g = 'i3lock'"
"60:class_g = 'Dunst'"
"100:class_g = 'Alacritty' && focused"
"90:class_g = 'Alacritty' && !focused"
];
blur-kern = "3x3box";
blur = {
method = "kernel";
strength = 8;
background = false;
background-frame = false;
background-fixed = false;
kern = "3x3box";
};
shadow-exclude = [
"class_g = 'Dunst'"
];
blur-background-exclude = [
"class_g = 'Dunst'"
];
backend = "glx";
vsync = false;
mark-wmwin-focused = true;
mark-ovredir-focused = true;
detect-rounded-corners = true;
detect-client-opacity = false;
detect-transient = true;
detect-client-leader = true;
use-damage = true;
log-level = "info";
wintypes = {
normal = {
fade = true;
shadow = false;
};
tooltip = {
fade = true;
shadow = false;
opacity = 0.75;
focus = true;
full-shadow = false;
};
dock = {
shadow = false;
};
dnd = {
shadow = false;
};
popup_menu = {
opacity = 1.0;
};
dropdown_menu = {
opacity = 1.0;
};
};
};
};
gvfs.enable = true; # Mount, trash, and other functionalities
tumbler.enable = true; # Thumbnail support for images
# Emacs runs as a daemon
emacs = {
enable = true;
package = pkgs.emacs-unstable;
};
};
# When emacs builds from no cache, it exceeds the 90s timeout default
systemd.user.services.emacs = {
serviceConfig.TimeoutStartSec = "7min";
};
# Enable CUPS to print documents
# services.printing.enable = true;
# services.printing.drivers = [ pkgs.brlaser ]; # Brother printer driver
# Enable sound
# sound.enable = true;
# hardware.pulseaudio.enable = true;
# Video support
hardware = {
graphics.enable = true;
# nvidia.modesetting.enable = true;
# Enable Xbox support
# xone.enable = true;
# Crypto wallet support
ledger.enable = true;
};
# Add docker daemon
virtualisation.docker.enable = true;
virtualisation.docker.logDriver = "json-file";
# It's me, it's you, it's everyone
users.users = {
${user} = {
isNormalUser = true;
extraGroups = [
"wheel" # Enable sudo for the user.
"docker"
];
shell = pkgs.zsh;
openssh.authorizedKeys.keys = keys;
};
root = {
openssh.authorizedKeys.keys = keys;
};
};
# Don't require password for users in `wheel` group for these commands
security.sudo = {
enable = true;
extraRules = [
{
commands = [
{
command = "${pkgs.systemd}/bin/reboot";
options = [ "NOPASSWD" ];
}
];
groups = [ "wheel" ];
}
];
};
fonts.packages = with pkgs; [
dejavu_fonts
emacs-all-the-icons-fonts
feather-font # from overlay
jetbrains-mono
font-awesome
noto-fonts
noto-fonts-emoji
];
environment.systemPackages = with pkgs; [
gitAndTools.gitFull
inetutils
];
system.stateVersion = "21.05"; # Don't change this
}
-25
View File
@@ -1,25 +0,0 @@
{ pkgs, llm-agents, ... }:
{
environment.systemPackages = [
ollama
# CLI coding agent from llm-agents.nix input
llm-agents.packages.${pkgs.stdenv.hostPlatform.system}.hermes-agent
# Hermes desktop GUI
llm-agents.packages.${pkgs.stdenv.hostPlatform.system}.hermes-desktop
];
launchd.user.agents.ollama = {
command = "${pkgs.ollama}/bin/ollama serve";
serviceConfig = {
KeepAlive = true;
RunAtLoad = true;
StandardOutPath = "/tmp/ollama.out.log";
StandardErrorPath = "/tmp/ollama.err.log";
};
};
}
-139
View File
@@ -1,139 +0,0 @@
{ pkgs, ... }:
{
homebrew = {
enable = true;
global = {
brewfile = true;
};
brews = [ ];
onActivation = {
cleanup = "none";
autoUpdate = true;
upgrade = true;
};
masApps = {
# These app IDs are from using the mas CLI app
# mas = mac app store
# https://github.com/mas-cli/mas
#
# $ nix shell nixpkgs#mas
# $ mas search <app name>
#
# If you have previously added these apps to your Mac App Store profile (but not installed them on this system),
# you may receive an error message "Redownload Unavailable with This Apple ID".
# This message is safe to ignore.
"1Password for Safari" = 1569813296; # (8.10.82)
"Affinity Designer 2" = 1616831348;
"Affinity Photo 2: Image Editor" = 1616822987;
"Affinity Publisher 2" = 1606941598;
# "DaisyDisk" = 409907375; # (4.32) # Don't use this, we need the official version that is not sandboxed
"Fantastical - Calendar" = 975937182;
"Fedistar" = 6445863996; # (1.13.1)
"Home Assistant" = 1099568401; # (2025.7.1)
"Ice Cubes for Mastodon" = 6444915884; # (1.11.3)
"LibreOffice" = 1630474372;
"Monal - XMPP Chatting " = 1637078500;
"Microsoft Copilot" = 6738511300; # (25.7.440804001)
"Microsoft Outlook" = 985367838; # (16.111.3)
"Microsoft Excel" = 462058435; # (16.111.3)
"Microsoft Word" = 462054704; # (16.111.3)
"Microsoft PowerPoint" = 462062816; # (16.111.3)
"OneDrive" = 823766827; # (26.134.0713)
"MQTT Explorer" = 1455214828; # (0.3.5)
"Night Sky" = 475772902; # 475772902
"Native SQLite Manager" = 1416282836; # (1.31.0)
"Remarkable Desktop" = 1276493162; # (3.19.0)
"Slack for Desktop" = 803453959; # (4.45.60)
"WhatsApp Messenger" = 310633997; # (26.30.77)
"WiFi Explorer: Scanner" = 494803304; # (3.5.6)
"Windows App Installer" = 1295203466; # (1.0.16)
"Wireguard" = 1451685025; # (1.0.16)
### "1Password: Password Manager" = 1511601750; # (8.11.0) Does not seem to insta
};
casks = [
# Development Tools
"arduino-ide"
"docker-desktop"
"iterm2"
"oracle-jdk"
"visual-studio-code"
# Creative tools
"blender"
"gimp"
"inkscape"
"vcv-rack"
#"affinity-designer"
#"affinity-photo"
#"affinity-publisher"
# Communication Tools
"adium"
"discord"
"signal"
"webex"
"zoom"
# Utility Tools
"blackhole-16ch"
"blackhole-2ch"
"box-drive"
"box-tools"
"daisydisk"
"karabiner-elements"
"keybase"
"moonlight"
"spamsieve"
"syncthing-app"
"synology-drive"
"tigervnc"
#LLM
"ollama-app"
"hermes-desktop"
"jan"
# Entertainment Tools
"qobuz"
"steam"
"handbrake-app"
"jellyfin-media-player"
"mediaelch"
"obs"
"vimediamanager"
"vlc"
# Productivity Tools
"1Password"
"bitwarden"
"calibre"
"dbeaver-community"
"element"
"gpg-suite"
"macdown-3000"
"mailmate@beta"
"orcaslicer"
# "remanager"
"qmk-toolbox"
"smartsheet"
# "sqlitestudio" # Doesn't work without Rosetta
# "virtualbox" # build error?
# Browsers
"brave-browser"
"firefox"
"google-chrome"
# x11
"xquartz"
];
};
}
+73
View File
@@ -0,0 +1,73 @@
_:
[
# Development Tools
"homebrew/cask/docker"
"iterm2"
"oracle-jdk"
"arduino-ide"
# "visual-studio-code"
# Creatative tools
"spotify"
"blender"
"gimp"
"inkscape"
"vcv-rack"
"affinity-designer"
"affinity-photo"
"affinity-publisher"
# Communication Tools
"discord"
"slack"
"signal"
"whatsapp"
"zoom"
"webex"
# Utility Tools
"syncthing"
"blackhole-16ch"
"blackhole-2ch"
"box-drive"
"box-tools"
"synology-drive"
"spamsieve"
"keybase"
"karabiner-elements"
# Entertainment Tools
"vlc"
"jellyfin-media-player"
"vimediamanager"
"mediaelch"
"handbrake"
"obs"
# Productivity Tools
"1Password"
"zotero"
"gpg-suite"
"home-assistant"
"Fantastical"
"Remarkable"
"mailmate"
"spamsieve"
"libreoffice"
"macdown"
"calibre"
"superslicer"
"element"
"mqtt-explorer"
"virtualbox"
"autodesk-fusion"
"qmk-toolbox"
"dbeaver-community"
"sqlitestudio"
"wireshark"
# Browsers
"google-chrome"
"firefox"
]
-2
View File
@@ -12,8 +12,6 @@ let
in in
{ {
# Shared file definitions moved into the Darwin module set.
# Raycast script so that "Run Emacs" is available and uses Emacs daemon # Raycast script so that "Run Emacs" is available and uses Emacs daemon
"${xdg_dataHome}/bin/emacsclient" = { "${xdg_dataHome}/bin/emacsclient" = {
executable = true; executable = true;
+32 -460
View File
@@ -3,7 +3,6 @@
pkgs, pkgs,
lib, lib,
home-manager, home-manager,
llm-agents,
... ...
}: }:
@@ -14,13 +13,12 @@ let
#!/bin/sh #!/bin/sh
emacs & emacs &
''; '';
sharedFiles = import ../shared/files.nix { inherit config pkgs; };
additionalFiles = import ./files.nix { inherit user config pkgs; }; additionalFiles = import ./files.nix { inherit user config pkgs; };
in in
{ {
imports = [ imports = [
./dock ./dock
./brewery.nix
]; ];
# It me # It me
@@ -29,18 +27,28 @@ in
home = "/Users/${user}"; home = "/Users/${user}";
isHidden = false; isHidden = false;
shell = pkgs.zsh; shell = pkgs.zsh;
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILCEBZrQ9F3nLhEM9uqdPijut11vhYkdmLtj7gT/zgV3 Key Nov 2024"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA9vrzEHmWEX5sCVsp6J4tVrxEzzqMSRkijHEfVg2WrC cardno:36_431_811"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG5BytZleG7m1926MSNwVXyPJ0QD5Z919cFCp22BN5hV cardno:35_775_013"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAl/jn18uVPJ9Uyv8gqk80gVQaMHrcd1b+B/SB/6RsX8 cardno:36_431_751"
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAILVdAx+U1xhcJmh1hRaF0CVB0ivIF/U0oIbAWYPwko4iAAAABHNzaDo= Yubikey 35775013"
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIIjnJyJUDnia6ZWPRa5iSBKCb+DMGmFtiFa+9gkeiTwQAAAABHNzaDo= Yubikey 36431751"
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIFhuPQUHUHchx8wHVCciMi6etzZStkpECbG/r/1imy+kAAAABHNzaDo= Yubikey 36431881"
];
}; };
homebrew = {
enable = true;
casks = pkgs.callPackage ./casks.nix { };
# onActivation.cleanup = "uninstall";
# These app IDs are from using the mas CLI app
# mas = mac app store
# https://github.com/mas-cli/mas
#
# $ nix shell nixpkgs#mas
# $ mas search <app name>
#
# If you have previously added these apps to your Mac App Store profile (but not installed them on this system),
# you may receive an error message "Redownload Unavailable with This Apple ID".
# This message is safe to ignore. (https://github.com/dustinlyons/nixos-config/issues/83)
masApps = {
"wireguard" = 1451685025;
};
};
# Enable home-manager # Enable home-manager
home-manager = { home-manager = {
@@ -53,442 +61,18 @@ in
... ...
}: }:
{ {
home = { home = {
enableNixpkgsReleaseCheck = false; enableNixpkgsReleaseCheck = false;
packages = pkgs.callPackage ./packages.nix { inherit llm-agents; }; packages = pkgs.callPackage ./packages.nix { };
file = additionalFiles // { file = lib.mkMerge [
"emacs-launcher.command".source = myEmacsLauncher; sharedFiles
}; additionalFiles
{ "emacs-launcher.command".source = myEmacsLauncher; }
];
stateVersion = "23.11"; stateVersion = "23.11";
}; };
programs = { } // import ../shared/home-manager.nix { inherit config pkgs lib; };
home.activation.ensureNpmCliTools = import ./npm.nix { inherit lib pkgs; };
catppuccin = {
autoEnable = true;
enable = true;
flavor = "mocha";
};
programs = {
alacritty = {
enable = true;
settings = {
cursor = {
style = "Block";
};
window = {
opacity = 1.0;
padding = {
x = 24;
y = 24;
};
};
font = {
normal = {
family = "MesloLGS NF";
style = "Regular";
};
size = lib.mkMerge [
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux 10)
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin 14)
];
};
dynamic_padding = true;
decorations = "full";
title = "Terminal";
class = {
instance = "Alacritty";
general = "Alacritty";
};
colors = {
primary = {
background = "0x1f2528";
foreground = "0xc0c5ce";
};
normal = {
black = "0x1f2528";
red = "0xec5f67";
green = "0x99c794";
yellow = "0xfac863";
blue = "0x6699cc";
magenta = "0xc594c5";
cyan = "0x5fb3b3";
white = "0xc0c5ce";
};
bright = {
black = "0x65737e";
red = "0xec5f67";
green = "0x99c794";
yellow = "0xfac863";
blue = "0x6699cc";
magenta = "0xc594c5";
cyan = "0x5fb3b3";
white = "0xd8dee9";
};
};
};
};
ssh = {
enable = true;
enableDefaultConfig = false;
settings = {
"*" = {
forwardAgent = false;
addKeysToAgent = "no";
compression = false;
serverAliveInterval = 0;
serverAliveCountMax = 3;
hashKnownHosts = false;
userKnownHostsFile = "~/.ssh/known_hosts";
controlMaster = "no";
controlPath = "~/.ssh/master-%r@%n:%p";
controlPersist = "no";
};
"moonunit.kolkman.org" = {
hostname = "moonunit.kolkman.org";
user = "root";
port = 2222;
};
};
includes = [
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux "/home/${user}/.ssh/config_external")
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin "/Users/${user}/.ssh/config_external")
];
};
gpg = {
enable = true;
settings = {
default-key = "01B157D574FEDBB2";
no-emit-version = true;
auto-key-retrieve = true;
personal-digest-preferences = "SHA512 SHA384 SHA256 SHA224";
};
};
zsh = {
enable = true;
autocd = false;
cdpath = [ "~/.local/share/src" ];
oh-my-zsh = {
enable = true;
plugins = [ ];
theme = "mrtazz";
};
initContent =
let
zshConfigEarlyInit = lib.mkOrder 500 ''
ulimit -n 524288
if [[ -f /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh ]]; then
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
. /nix/var/nix/profiles/default/etc/profile.d/nix.sh
fi
if [[ "$TERM" == "alacritty" ]]; then
export TERMINFO_DIRS="$HOME/.nix-profile/share/terminfo:/run/current-system/sw/share/terminfo:/nix/var/nix/profiles/default/share/terminfo:/usr/share/terminfo"
if ! infocmp alacritty >/dev/null 2>&1; then
export TERM="xterm-256color"
fi
fi
# GPGAgent for SSH
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
# Define variables for directories
export PATH=$HOME/.local/bin:$PATH
export PATH=$HOME/.pnpm-packages/bin:$HOME/.pnpm-packages:$PATH
export PATH=$HOME/.npm-packages/bin:$HOME/bin:$PATH
export PATH=$HOME/.local/share/bin:$PATH
export PATH=$HOME/.cargo/bin:$PATH
# Remove history data we don't want to see
export HISTIGNORE="pwd:ls:cd"
# Ripgrep alias
alias search=rg -p --glob '!node_modules/*' $@
# Emacs is my editor
export ALTERNATE_EDITOR="vim"
export EDITOR="emacs -nw"
export VISUAL="emacs"
# RMAPI remarkable
RMAPI_CONFIG=/Users/olaf/.config/rmapi
e() {
emacs -nw "$@"
}
# nix shortcuts
shell() {
nix-shell '<nixpkgs>' -A "$1"
}
# pnpm is a javascript package manager
alias pn=pnpm
alias px=pnpx
'';
zshConfigLastInit = lib.mkOrder 1500 ''
# Always color ls and group directories
alias ls='ls --color=auto'
'';
in
lib.mkMerge [
zshConfigEarlyInit
zshConfigLastInit
];
};
git = {
enable = true;
ignores = [ "*.swp" ];
lfs = {
enable = true;
};
settings = {
init.defaultBranch = "main";
core = {
editor = "vim";
autocrlf = "input";
};
commit.gpgsign = false;
pull.rebase = true;
rebase.autoStash = true;
user = {
name = "olaf";
email = "olaf@xolx.nl";
};
};
signing = {
format = "openpgp";
key = null;
signByDefault = true;
};
};
vim = {
enable = true;
plugins = with pkgs.vimPlugins; [
vim-airline
vim-airline-themes
vim-startify
vim-tmux-navigator
];
settings = {
ignorecase = true;
};
extraConfig = ''
"" General
set number
set history=1000
set nocompatible
set modelines=0
set encoding=utf-8
set scrolloff=3
set showmode
set showcmd
set hidden
set wildmenu
set wildmode=list:longest
set cursorline
set ttyfast
set nowrap
set ruler
set backspace=indent,eol,start
set laststatus=2
set clipboard=autoselect
" Dir stuff
set nobackup
set nowritebackup
set noswapfile
set backupdir=~/.config/vim/backups
set directory=~/.config/vim/swap
" Relative line numbers for easy movement
set relativenumber
set rnu
"" Whitespace rules
set tabstop=8
set shiftwidth=2
set softtabstop=2
set expandtab
"" Searching
set incsearch
set gdefault
"" Statusbar
set nocompatible " Disable vi-compatibility
set laststatus=2 " Always show the statusline
let g:airline_theme='bubblegum'
let g:airline_powerline_fonts = 1
"" Local keys and such
let mapleader=","
let maplocalleader=" "
"" Change cursor on mode
:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul
"" File-type highlighting and configuration
syntax on
filetype on
filetype plugin on
filetype indent on
"" Paste from clipboard
nnoremap <Leader>, "+gP
"" Copy from clipboard
xnoremap <Leader>. "+y
"" Move cursor by display lines when wrapping
nnoremap j gj
nnoremap k gk
"" Map leader-q to quit out of window
nnoremap <leader>q :q<cr>
"" Move around split
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
"" Easier to yank entire line
nnoremap Y y$
"" Move buffers
nnoremap <tab> :bnext<cr>
nnoremap <S-tab> :bprev<cr>
"" Like a boss, sudo AFTER opening the file to write
cmap w!! w !sudo tee % >/dev/null
let g:startify_lists = [
\ { 'type': 'dir', 'header': [' Current Directory '. getcwd()] },
\ { 'type': 'sessions', 'header': [' Sessions'] },
\ { 'type': 'bookmarks', 'header': [' Bookmarks'] }
\ ]
let g:startify_bookmarks = [
\ '~/.local/share/src',
\ ]
let g:airline_theme='bubblegum'
let g:airline_powerline_fonts = 1
'';
};
tmux = {
enable = true;
plugins = with pkgs.tmuxPlugins; [
vim-tmux-navigator
sensible
yank
prefix-highlight
{
plugin = power-theme;
extraConfig = ''
set -g @tmux_power_theme 'gold'
'';
}
{
plugin = resurrect; # Used by tmux-continuum
# Use XDG data directory
# https://github.com/tmux-plugins/tmux-resurrect/issues/348
extraConfig = ''
set -g @resurrect-dir '$HOME/.cache/tmux/resurrect'
set -g @resurrect-capture-pane-contents 'on'
set -g @resurrect-pane-contents-area 'visible'
'';
}
{
plugin = continuum;
extraConfig = ''
set -g @continuum-restore 'on'
set -g @continuum-save-interval '5' # minutes
'';
}
];
terminal = "screen-256color";
prefix = "C-x";
escapeTime = 10;
historyLimit = 50000;
extraConfig = ''
# Remove Vim mode delays
set -g focus-events on
# Enable full mouse support
set -g mouse on
# -----------------------------------------------------------------------------
# Key bindings
# -----------------------------------------------------------------------------
# Unbind default keys
unbind C-b
unbind '"'
unbind %
# Split panes, vertical or horizontal
bind-key x split-window -v
bind-key v split-window -h
# Move around panes with vim-like bindings (h,j,k,l)
bind-key -n M-k select-pane -U
bind-key -n M-h select-pane -L
bind-key -n M-j select-pane -D
bind-key -n M-l select-pane -R
# Smart pane switching with awareness of Vim splits.
# This is copy paste from https://github.com/christoomey/vim-tmux-navigator
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
bind-key -T copy-mode-vi 'C-h' select-pane -L
bind-key -T copy-mode-vi 'C-j' select-pane -D
bind-key -T copy-mode-vi 'C-k' select-pane -U
bind-key -T copy-mode-vi 'C-l' select-pane -R
bind-key -T copy-mode-vi 'C-\' select-pane -l
'';
};
};
services = {
gpg-agent = {
enable = true;
enableSshSupport = true;
extraConfig = ''
default-cache-ttl 600
max-cache-ttl 7200
pinentry-program /Users/olaf/.nix-profile/bin/pinentry-mac
'';
};
};
# Marked broken Oct 20, 2022 check later to remove this # Marked broken Oct 20, 2022 check later to remove this
# https://github.com/nix-community/home-manager/issues/3344 # https://github.com/nix-community/home-manager/issues/3344
@@ -505,49 +89,37 @@ in
{ path = "/System/Applications/Mail.app/"; } { path = "/System/Applications/Mail.app/"; }
{ path = "/Applications/MailMate.app/"; } { path = "/Applications/MailMate.app/"; }
{ path = "/Applications/1Password.app/"; } { path = "/Applications/1Password.app/"; }
{ path = "/Applications/Bitwarden.app"; }
{ path = "/Applications/Calendar.app/"; }
{ path = "/Applications/Notes.app/"; }
{ path = "/Applications/Firefox.app/"; } { path = "/Applications/Firefox.app/"; }
{ path = "/Applications/Slack.app/"; } { path = "/Applications/Slack.app/"; }
{ {
path = "/Applications/zoom.us.app/"; path = "/Applications/zoom.us.app/";
options = " -l Zoom"; options = " -l Zooom";
} }
{ path = "/System/Applications/Messages.app/"; } { path = "/System/Applications/Messages.app/"; }
{ path = "/Applications/iTerm.app/"; } { path = "/Applications/iTerm.app/"; }
{ path = "/Applications/Fantastical.app/"; } { path = "/Applications/Fantastical.app/"; }
{ path = "${pkgs.alacritty}/Applications/Alacritty.app/"; } # { path = "${pkgs.alacritty}/Applications/Alacritty.app/"; }
# { path = "/Applications/Spotify.app/"; } { path = "/Applications/Spotify.app/"; }
{ path = "/Applications/Qobuz.app/"; }
{ path = "/System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app/"; } { path = "/System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app/"; }
{
path = "/Applications/Brave Browser.app/";
options = "-l Brave";
}
{ path = "/System/Applications/Photos.app/"; } { path = "/System/Applications/Photos.app/"; }
{ path = "/System/Applications/System Settings.app/"; } { path = "/System/Applications/System Settings.app/"; }
{ path = "/Applications/Signal.app/"; } { path = "/Applications/Signal.app/"; }
{ path = "/Applications/WhatsApp.app/"; } { path = "/Applications/WhatsApp.app/"; }
{ path = "/Applications/Ice\ Cubes.app/"; }
{ {
path = "/Applications/Jellyfin Media Player.app/"; path = "/Applications/Jellyfin Media Player.app/";
options = "-l Jellyfin"; options = "-l Jellyfin";
} }
{ path = "/Applications/Visual Studio Code.app/"; } { path = "/run/current-system/Applications/Visual Studio Code.app/"; }
{ path = "/Applications/Home Assistant.app/"; } { path = "/Applications/Home Assistant.app/"; }
{ path = "/Applications/reMarkable.app/"; } { path = "/Applications/reMarkable.app/"; }
{ path = "/Applications/LibreOffice.app/"; } { path = "/Applications/LibreOffice.app/"; }
{ path = "/Applications/Microsoft Word.app/"; } { path = "/Applications/Microsoft Word.app/"; }
{ path = "/Applications/Microsoft PowerPoint.app/"; } { path = "/Applications/Microsoft PowerPoint.app/"; }
{ path = "/Applications/Microsoft Teams.app/"; } { path = "/Applications/Microsoft Teams.app/"; }
{ path = "/Applications/Monal.app/"; }
{ path = "/System/Applications/Utilities/Screen Sharing.app/"; } { path = "/System/Applications/Utilities/Screen Sharing.app/"; }
{ path = "/run/current-system/Applications/Emacs.app/"; } { path = "/run/current-system/Applications/Emacs.app/"; }
{ path = "/run/current-system/Applications/Zotero.app"; }
{ {
path = "/Applications/"; path = "/Applications/";
section = "others"; section = "others";
-30
View File
@@ -1,30 +0,0 @@
{ lib, pkgs }:
let
npmPackages = [
"@enact/cli"
"@webos-tools/cli"
"@anthropic-ai/claude-code"
"patch-package"
];
in
lib.hm.dag.entryAfter [ "writeBoundary" ] ''
# Ensure required npm CLI tools are installed in the user prefix.
NPM_BIN="${pkgs.nodejs}/bin/npm"
export NPM_CONFIG_PREFIX="$HOME/.npm-packages"
export PATH="${pkgs.nodejs}/bin:$NPM_CONFIG_PREFIX/bin:$PATH"
if [[ ! -x "$NPM_BIN" ]]; then
echo "npm not found; skipping npm CLI installation step"
exit 0
fi
for pkg in ${lib.concatStringsSep " " (map lib.escapeShellArg npmPackages)}; do
if "$NPM_BIN" list -g --depth=0 "$pkg" >/dev/null 2>&1; then
echo "npm package already installed: $pkg"
else
echo "installing npm package: $pkg"
"$NPM_BIN" install -g "$pkg"
fi
done
''
+7 -197
View File
@@ -1,202 +1,12 @@
{ pkgs, llm-agents }: { pkgs }:
with pkgs; with pkgs;
[ let
# Nix shared-packages = import ../shared/packages.nix { inherit pkgs; };
nixd in
shared-packages
++ [
dockutil
mas mas
# X11
libx11
libxt
libxext
libxrender
libxrandr
xterm
# security and some such
# bitwarden-desktop #Does not compile properly
# bitwarden-cli # Fails on i386
yubikey-manager # provides ykman
pinentry_mac
# General packages for development and system management
alacritty
ansible
aspell
aspellDicts.en
bash-completion
bat
btop
coreutils
difftastic
freerdp
htop
killall
minicom
mtr
ncdu
nodejs
fastfetch
nixfmt
openssh
postgresql
sqlite
unrar
wget
zip
# Development
act
autoconf
autoconf-archive
automake
ccache
clang-tools
cmake
dfu-util
go
jd-diff-patch # json diff patch
jq # json tool
llvm
nasm
ninja
pkg-config
# Encryption and security tools
age
gnupg
just
libfido2
sops
# Cloud-related tools and SDKs
docker
docker-compose
# Media-related packages
fd
ffmpeg
imagemagick
# Text and terminal utilities
hunspell
iftop
inetutils # includes Telnet
ripgrep
tmux
tree
unzip
# Python packages
virtualenv
uv
(python3.withPackages (
python-pkgs: with python-pkgs; [
bidict
blinker
certifi
charset-normalizer
click
flask
flask-socketio
h11
idna
importlib-metadata
itsdangerous
jinja2
markupsafe
mercantile
mlx-lm
numpy
pandas
pillow
python-engineio
python-socketio
requests
shapely
simple-websocket
tkinter
tqdm
urllib3
werkzeug
wsproto
zipp
]
))
# Social
pidgin
# Rust Related
rustc
cargo
platformio-core
# XML, Tex and LaTex
mdbook
pandoc
rubyPackages_3_4.kramdown-rfc2629
tex-fmt
xml2rfc
zotero
(texlive.combine {
inherit (texlive)
apa6
apa7
apacite
biber
biblatex
biblatex-apa6
bibunits
catchfile
cjk
comment
courier
csquotes
draftwatermark
endfloat
enumitem
fancyhdr
fontawesome5
footmisc
footnotehyper
geometry
ifmtarg
latexmk
lipsum
lualatex-math
makecell
microtype
multirow
nowidow
parskip
ragged2e
scalerel
scheme-small
selnolig
sourcesanspro
svg
tcolorbox
texcount
threeparttable
tikzfill
titlesec
titling
tocloft
transparent
upquote
url
xecjk
xifthen
xurl
;
})
dockutil
] ]
+10
View File
@@ -0,0 +1,10 @@
## Layout
```
.
├── config # Config files not written in Nix
├── default.nix # Defines module, system-level config,
├── disk-config.nix # Disks, partitions, and filesystems
├── files.nix # Non-Nix, static configuration files (now immutable!)
├── home-manager.nix # Defines user programs
├── packages.nix # List of packages to install for NixOS
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 692 KiB

+498
View File
@@ -0,0 +1,498 @@
;; ┌────────────────────────────────────────────────────┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▀▄░█▀█░█▀▄░█▀▀│
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█▀▄░█▀█░█▀▄░▀▀█│
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀░░▀░▀░▀░▀░▀▀▀│
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░│
;; └────────────────────────────────────────────────────┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[bar]
fill =
empty =
indicator =
; Nerd font :   ,  ,  樂 籠 錄 , 雷 絛
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/volume]
type = internal/alsa
; Soundcard to be used
; Usually in the format hw:# where # is the card number
; You can find the different card numbers in `/proc/asound/cards`
master-soundcard = default
speaker-soundcard = default
headphone-soundcard = default
; Name of the master, speaker and headphone mixers
; Use the following command to list available mixer controls:
; $ amixer scontrols | sed -nr "s/.*'([[:alnum:]]+)'.*/\1/p"
; If master, speaker or headphone-soundcard isn't the default,
; use `amixer -c # scontrols` instead where # is the number
; of the master, speaker or headphone soundcard respectively
;
; Default: Master
master-mixer = Master
; Optionally define speaker and headphone mixers
; Default: none
;;speaker-mixer = Speaker
; Default: none
;;headphone-mixer = Headphone
; NOTE: This is required if headphone_mixer is defined
; Use the following command to list available device controls
; $ amixer controls | sed -r "/CARD/\!d; s/.*=([0-9]+).*name='([^']+)'.*/printf '%3.0f: %s\n' '\1' '\2'/e" | sort
; You may also need to use `amixer -c # controls` as above for the mixer names
; Default: none
;;headphone-id = 9
; Use volume mapping (similar to amixer -M and alsamixer), where the increase in volume is linear to the ear
; Default: false
;;mapped = true
; Interval for volume increase/decrease (in percent points)
; Default: 5
interval = 5
; Available tags:
; <label-volume> (default)
; <ramp-volume>
; <bar-volume>
format-volume = <ramp-volume> <bar-volume>
; Available tags:
; <label-muted> (default)
; <ramp-volume>
; <bar-volume>
format-muted = <label-muted>
format-muted-prefix =
; Available tokens:
; %percentage% (default)
label-volume = %percentage%%
; Available tokens:
; %percentage% (default
label-muted = " Muted"
label-muted-foreground = ${color.foreground-alt}
; Only applies if <ramp-volume> is used
ramp-volume-0 =
ramp-volume-1 =
ramp-volume-2 =
; Only applies if <bar-volume> is used
bar-volume-width = 10
bar-volume-gradient = false
bar-volume-indicator = ${bar.indicator}
bar-volume-indicator-foreground = ${color.foreground}
bar-volume-fill = ${bar.fill}
bar-volume-foreground-0 = ${color.foreground}
bar-volume-foreground-1 = ${color.foreground}
bar-volume-foreground-2 = ${color.foreground}
bar-volume-empty = ${bar.empty}
bar-volume-empty-foreground = ${color.foreground}
; If defined, it will replace <ramp-volume> when
; headphones are plugged in to `headphone_control_numid`
; If undefined, <ramp-volume> will be used for both
; Only applies if <ramp-volume> is used
ramp-headphones-0 =
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/brightness]
;type = internal/xbacklight
type = internal/backlight
; Use the following command to list available cards:
; $ ls -1 /sys/class/backlight/
;card = intel_backlight
card = amdgpu_bl0
; Available tags:
; <label> (default)
; <ramp>
; <bar>
format = <ramp> <bar>
; Available tokens:
; %percentage% (default)
label = %percentage%%
; Only applies if <ramp> is used
ramp-0 =
ramp-1 =
ramp-2 =
ramp-3 =
ramp-4 =
; Only applies if <bar> is used
bar-width = 10
bar-gradient = false
bar-indicator = ${bar.indicator}
bar-indicator-foreground = ${color.foreground}
bar-fill = ${bar.fill}
bar-foreground-0 = ${color.foreground}
bar-foreground-1 = ${color.foreground}
bar-foreground-2 = ${color.foreground}
bar-empty = ${bar.empty}
bar-empty-foreground = ${color.foreground}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/battery_bar]
type = internal/battery
; This is useful in case the battery never reports 100% charge
full-at = 99
; Use the following command to list batteries and adapters:
; $ ls -1 /sys/class/power_supply/
battery = BAT1
adapter = ACAD
; If an inotify event haven't been reported in this many
; seconds, manually poll for new values.
;
; Needed as a fallback for systems that don't report events
; on sysfs/procfs.
;
; Disable polling by setting the interval to 0.
;
; Default: 5
poll-interval = 2
; see "man date" for details on how to format the time string
; NOTE: if you want to use syntax tags here you need to use %%{...}
; Default: %H:%M:%S
time-format = %H:%M
; Available tags:
; <label-charging> (default)
; <bar-capacity>
; <ramp-capacity>
; <animation-charging>
format-charging = <bar-capacity>
format-charging-prefix = " "
; Available tags:
; <label-discharging> (default)
; <bar-capacity>
; <ramp-capacity>
; <animation-discharging>
format-discharging = <bar-capacity>
format-discharging-prefix = " "
; Available tags:
; <label-full> (default)
; <bar-capacity>
; <ramp-capacity>
format-full = <label-full>
format-full-prefix = " "
; Available tokens:
; %percentage% (default)
; %time%
; %consumption% (shows current charge rate in watts)
label-charging = %percentage%%
; Available tokens:
; %percentage% (default)
; %time%
; %consumption% (shows current discharge rate in watts)
label-discharging = %percentage%%
; Available tokens:
; %percentage% (default)
label-full = " Full"
; Only applies if <bar-capacity> is used
bar-capacity-width = 10
bar-capacity-gradient = false
bar-capacity-indicator = ${bar.indicator}
bar-capacity-indicator-foreground = ${color.foreground}
bar-capacity-fill = ${bar.fill}
bar-capacity-foreground-0 = ${color.foreground}
bar-capacity-foreground-1 = ${color.foreground}
bar-capacity-foreground-2 = ${color.foreground}
bar-capacity-empty = ${bar.empty}
bar-capacity-empty-foreground = ${color.foreground}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/cpu_bar]
type = internal/cpu
; Seconds to sleep between updates
; Default: 1
interval = 0.5
; Available tags:
; <label> (default)
; <bar-load>
; <ramp-load>
; <ramp-coreload>
;;format = <label> <ramp-coreload>
format = <bar-load> <label>
format-prefix = " "
; Available tokens:
; %percentage% (default) - total cpu load averaged over all cores
; %percentage-sum% - Cumulative load on all cores
; %percentage-cores% - load percentage for each core
; %percentage-core[1-9]% - load percentage for specific core
label = "%percentage%%"
; Only applies if <bar-load> is used
bar-load-width = 10
bar-load-gradient = false
bar-load-indicator = ${bar.indicator}
bar-load-indicator-foreground = ${color.foreground}
bar-load-fill = ${bar.fill}
bar-load-foreground-0 = ${color.foreground}
bar-load-foreground-1 = ${color.foreground}
bar-load-foreground-2 = ${color.foreground}
bar-load-empty = ${bar.empty}
bar-load-empty-foreground = ${color.foreground}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/filesystem_bar]
type = internal/fs
; Mountpoints to display
mount-0 = /
;;mount-1 = /home
;;mount-2 = /var
; Seconds to sleep between updates
; Default: 30
interval = 30
; Display fixed precision values
; Default: false
fixed-values = false
; Spacing between entries
; Default: 2
;;spacing = 4
; Available tags:
; <label-mounted> (default)
; <bar-free>
; <bar-used>
; <ramp-capacity>
format-mounted = <bar-used> <label-mounted>
format-mounted-prefix = " "
; Available tags:
; <label-unmounted> (default)
format-unmounted = <label-unmounted>
format-unmounted-prefix = " "
; Available tokens:
; %mountpoint%
; %type%
; %fsname%
; %percentage_free%
; %percentage_used%
; %total%
; %free%
; %used%
; Default: %mountpoint% %percentage_free%%
label-mounted = %used%/%total%
; Available tokens:
; %mountpoint%
; Default: %mountpoint% is not mounted
label-unmounted = "%mountpoint%: not mounted"
; Only applies if <bar-used> is used
bar-used-width = 10
bar-used-gradient = false
bar-used-indicator = ${bar.indicator}
bar-used-indicator-foreground = ${color.foreground}
bar-used-fill = ${bar.fill}
bar-used-foreground-0 = ${color.foreground}
bar-used-foreground-1 = ${color.foreground}
bar-used-foreground-2 = ${color.foreground}
bar-used-empty = ${bar.empty}
bar-used-empty-foreground = ${color.foreground}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/memory_bar]
type = internal/memory
; Seconds to sleep between updates
; Default: 1
interval = 2
; Available tags:
; <label> (default)
; <bar-used>
; <bar-free>
; <ramp-used>
; <ramp-free>
; <bar-swap-used>
; <bar-swap-free>
; <ramp-swap-used>
; <ramp-swap-free>
format = <bar-used> <label>
format-prefix = " "
; Available tokens:
; %percentage_used% (default)
; %percentage_free%
; %gb_used%
; %gb_free%
; %gb_total%
; %mb_used%
; %mb_free%
; %mb_total%
; %percentage_swap_used%
; %percentage_swap_free%
; %mb_swap_total%
; %mb_swap_free%
; %mb_swap_used%
; %gb_swap_total%
; %gb_swap_free%
; %gb_swap_used%
label = "%mb_used%"
; Only applies if <bar-used> is used
bar-used-width = 10
bar-used-gradient = false
bar-used-indicator = ${bar.indicator}
bar-used-indicator-foreground = ${color.foreground}
bar-used-fill = ${bar.fill}
bar-used-foreground-0 = ${color.foreground}
bar-used-foreground-1 = ${color.foreground}
bar-used-foreground-2 = ${color.foreground}
bar-used-empty = ${bar.empty}
bar-used-empty-foreground = ${color.foreground}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/mpd_bar]
type = internal/mpd
; Host where mpd is running (either ip or domain name)
; Can also be the full path to a unix socket where mpd is running.
;;host = 127.0.0.1
;;port = 6600
;;password = mysecretpassword
; Seconds to sleep between progressbar/song timer sync
; Default: 1
interval = 1
; Available tags:
; <label-song> (default)
; <label-time>
; <bar-progress>
; <toggle> - gets replaced with <icon-(pause|play)>
; <toggle-stop> - gets replaced with <icon-(stop|play)>
; <icon-random>
; <icon-repeat>
; <icon-repeatone> (deprecated)
; <icon-single> - Toggle playing only a single song. Replaces <icon-repeatone>
; <icon-consume>
; <icon-prev>
; <icon-stop>
; <icon-play>
; <icon-pause>
; <icon-next>
; <icon-seekb>
; <icon-seekf>
format-online = <label-song> <bar-progress> <label-time>
format-online-prefix =
;format-playing = ${self.format-online}
;format-paused = ${self.format-online}
;format-stopped = ${self.format-online}
; Available tags:
; <label-offline>
format-offline = <label-offline>
format-offline-prefix =
; Available tokens:
; %artist%
; %album-artist%
; %album%
; %date%
; %title%
; Default: %artist% - %title%
label-song = " %artist% - %title%"
label-song-maxlen = 25
label-song-ellipsis = true
; Available tokens:
; %elapsed%
; %total%
; Default: %elapsed% / %total%
label-time = %elapsed% / %total%
; Available tokens:
; None
label-offline = " Offline"
; Only applies if <icon-X> is used
icon-play =
icon-pause =
icon-stop =
icon-next =
icon-prev =
icon-seekf =
icon-seekb =
icon-random =
icon-repeat =
icon-repeatone =
icon-single =
icon-consume =
; Used to display the state of random/repeat/repeatone/single
; Only applies if <icon-[random|repeat|repeatone|single]> is used
toggle-on-foreground = ${color.primary}
toggle-off-foreground = ${color.secondary}
; Only applies if <bar-progress> is used
bar-progress-width = 10
bar-progress-gradient = false
bar-progress-indicator = ${bar.indicator}
bar-progress-indicator-foreground = ${color.foreground}
bar-progress-fill = ${bar.fill}
bar-progress-foreground-0 = ${color.foreground}
bar-progress-foreground-1 = ${color.foreground}
bar-progress-foreground-2 = ${color.foreground}
bar-progress-empty = ${bar.empty}
bar-progress-empty-foreground = ${color.foreground}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+9
View File
@@ -0,0 +1,9 @@
[color]
background = #1F1F1F
foreground = #FFFFFF
foreground-alt = #8F8F8F
module-fg = #FFFFFF
primary = #546e7a
secondary = #E53935
alternate = #7cb342
+215
View File
@@ -0,0 +1,215 @@
[global/wm]
; Adjust the _NET_WM_STRUT_PARTIAL top value
; Used for top aligned bars
margin-bottom = 0
; Adjust the _NET_WM_STRUT_PARTIAL bottom value
; Used for bottom aligned bars
margin-top = 0
;; Bar Settings
[bar/main]
; Use either of the following command to list available outputs:
; If unspecified, the application will pick the first one it finds.
; $ polybar -m | cut -d ':' -f 1
; $ xrandr -q | grep " connected" | cut -d ' ' -f1
monitor =
; Use the specified monitor as a fallback if the main one is not found.
monitor-fallback =
; Require the monitor to be in connected state
; XRandR sometimes reports my monitor as being disconnected (when in use)
monitor-strict = false
; Tell the Window Manager not to configure the window.
; Use this to detach the bar if your WM is locking its size/position.
override-redirect = false
; Put the bar at the bottom of the screen
bottom = false
; Prefer fixed center position for the `modules-center` block
; When false, the center position will be based on the size of the other blocks.
fixed-center = true
; Dimension defined as pixel value (e.g. 35) or percentage (e.g. 50%),
; the percentage can optionally be extended with a pixel offset like so:
; 50%:-10, this will result in a width or height of 50% minus 10 pixels
width = 98%
height = 40
; Offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
; the percentage can optionally be extended with a pixel offset like so:
; 50%:-10, this will result in an offset in the x or y direction
; of 50% minus 10 pixels
offset-x = 1%
offset-y = 2%:-12
; Background ARGB color (e.g. #f00, #ff992a, #ddff1023)
background = ${color.background}
; Foreground ARGB color (e.g. #f00, #ff992a, #ddff1023)
foreground = ${color.foreground}
; Value used for drawing rounded corners
; Individual top/bottom values can be defined using:
; radius-{top,bottom}
radius-top = 2.0
radius-bottom = 2.0
; Under-/overline pixel size and argb color
; Individual values can be defined using:
; {overline,underline}-size
; {overline,underline}-color
line-size = 2
line-color = ${color.primary}
; Values applied to all borders
; Individual side values can be defined using:
; border-{left,top,right,bottom}-size
; border-{left,top,right,bottom}-color
border-bottom-size = 0
border-bottom-color = ${color.primary}
; Number of spaces to add at the beginning/end of the bar
; Individual side values can be defined using:
; padding-{left,right}
padding = 0
; Number of spaces to add before/after each module
; Individual side values can be defined using:
; module-margin-{left,right}
module-margin-left = 2
module-margin-right = 2
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
; Fonts
font-0 = "@font0@"
font-1 = "@font1@"
; Modules
modules-left = launcher workspaces
modules-center = date popup-calendar
modules-right = pulseaudio memory cpu updates sysmenu
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
; The separator will be inserted between the output of each module
separator =
; Opacity value between 0.0 and 1.0 used on fade in/out
dim-value = 1.0
; Value to be used to set the WM_NAME atom
; If the value is empty or undefined, the atom value
; will be created from the following template: polybar-[BAR]_[MONITOR]
wm-name = bspwm
; Locale used to localize various module data (e.g. date)
; Expects a valid libc locale, for example: sv_SE.UTF-8
locale =
; Position of the system tray window
; If empty or undefined, tray support will be disabled
; NOTE: A center aligned tray will cover center aligned modules
;
; Available positions:
; left
; center
; right
; none
tray-position = none
; If true, the bar will not shift its
; contents when the tray changes
tray-detached = false
; Tray icon max size
tray-maxsize = 16
; Background color for the tray container
; ARGB color (e.g. #f00, #ff992a, #ddff1023)
; By default the tray container will use the bar
; background color.
tray-background = ${color.background}
; Tray offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
tray-offset-x = 0
tray-offset-y = 0
; Pad the sides of each tray icon
tray-padding = 0
; Scale factor for tray clients
tray-scale = 1.0
; Restack the bar window and put it above the
; selected window manager's root
;
; Fixes the issue where the bar is being drawn
; on top of fullscreen window's
;
; Available options:
; bspwm
; i3 (requires: `override-redirect = true`)
wm-restack = bspwm
; Set a DPI values used when rendering text
; This only affects scalable fonts
; dpi =
; Enable support for inter-process messaging
; See the Messaging wiki page for more details.
enable-ipc = true
; Fallback click handlers that will be called if
; there's no matching module handler found.
click-left =
click-middle = bspc desktop -l next
click-right =
double-click-left =
double-click-middle =
double-click-right =
; Requires polybar to be built with xcursor support (xcb-util-cursor)
; Possible values are:
; - default : The default pointer as before, can also be an empty string (default)
; - pointer : Typically in the form of a hand
; - ns-resize : Up and down arrows, can be used to indicate scrolling
cursor-click =
cursor-scroll =
; bspwm
scroll-up = bspc desktop -f prev.local
scroll-down = bspc desktop -f next.local
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; Application Settings
[settings]
; The throttle settings lets the eventloop swallow up til X events
; if they happen within Y millisecond after first event was received.
throttle-output = 5
throttle-output-for = 10
; Time in milliseconds that the input handler will wait between processing events
;throttle-input-for = 30
; Reload upon receiving XCB_RANDR_SCREEN_CHANGE_NOTIFY events
screenchange-reload = false
; Compositing operators
; @see: https://www.cairographics.org/manual/cairo-cairo-t.html#cairo-operator-t
compositing-background = source
compositing-foreground = over
compositing-overline = over
compositing-underline = over
compositing-border = over
; Enables pseudo-transparency for the bar
; If set to true the bar can be transparent without a compositor.
pseudo-transparency = false
+674
View File
@@ -0,0 +1,674 @@
;; ┌────────────────────────────────────────────────────────────────┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▄█░█▀█░█▀▄░█░█░█░░░█▀▀░█▀▀│
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█░█░█░█░█░█░█░█░█░░░█▀▀░▀▀█│
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀░▀░▀▀▀░▀▀░░▀▀▀░▀▀▀░▀▀▀░▀▀▀│
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
;; └────────────────────────────────────────────────────────────────┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/alsa]
type = internal/alsa
; Soundcard to be used
; Usually in the format hw:# where # is the card number
; You can find the different card numbers in `/proc/asound/cards`
master-soundcard = default
speaker-soundcard = default
headphone-soundcard = default
; Name of the master, speaker and headphone mixers
; Use the following command to list available mixer controls:
; $ amixer scontrols | sed -nr "s/.*'([[:alnum:]]+)'.*/\1/p"
; If master, speaker or headphone-soundcard isn't the default,
; use `amixer -c # scontrols` instead where # is the number
; of the master, speaker or headphone soundcard respectively
;
; Default: Master
master-mixer = Master
; Optionally define speaker and headphone mixers
; Default: none
;;speaker-mixer = Speaker
; Default: none
;;headphone-mixer = Headphone
; NOTE: This is required if headphone_mixer is defined
; Use the following command to list available device controls
; $ amixer controls | sed -r "/CARD/\!d; s/.*=([0-9]+).*name='([^']+)'.*/printf '%3.0f: %s\n' '\1' '\2'/e" | sort
; You may also need to use `amixer -c # controls` as above for the mixer names
; Default: none
;;headphone-id = 9
; Use volume mapping (similar to amixer -M and alsamixer), where the increase in volume is linear to the ear
; Default: false
;;mapped = true
; Interval for volume increase/decrease (in percent points)
; Default: 5
interval = 5
; Available tags:
; <label-volume> (default)
; <ramp-volume>
; <bar-volume>
format-volume = <ramp-volume> <label-volume>
; Available tags:
; <label-muted> (default)
; <ramp-volume>
; <bar-volume>
format-muted = <label-muted>
format-muted-prefix =
; Available tokens:
; %percentage% (default)
label-volume = %percentage%%
; Available tokens:
; %percentage% (default
label-muted = " Muted"
label-muted-foreground = ${color.foreground-alt}
; Only applies if <ramp-volume> is used
ramp-volume-0 =
ramp-volume-1 =
ramp-volume-2 =
; If defined, it will replace <ramp-volume> when
; headphones are plugged in to `headphone_control_numid`
; If undefined, <ramp-volume> will be used for both
; Only applies if <ramp-volume> is used
ramp-headphones-0 =
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/cpu]
type = internal/cpu
; Seconds to sleep between updates
; Default: 1
interval = 1
; Available tags:
; <label> (default)
; <bar-load>
; <ramp-load>
; <ramp-coreload>
;;format = <label> <ramp-coreload>
format = <label>
format-prefix =
; Available tokens:
; %percentage% (default) - total cpu load averaged over all cores
; %percentage-sum% - Cumulative load on all cores
; %percentage-cores% - load percentage for each core
; %percentage-core[1-9]% - load percentage for specific core
label = " %percentage%%"
; Spacing between individual per-core ramps
;;ramp-coreload-spacing = 1
;;ramp-coreload-0 = ${cpu.load0}
;;ramp-coreload-1 = ${cpu.load1}
;;ramp-load-0 = ${cpu.load0}
;;ramp-load-1 = ${cpu.load1}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/date]
type = internal/date
; Seconds to sleep between updates
interval = 1.0
; See "http://en.cppreference.com/w/cpp/io/manip/put_time" for details on how to format the date string
; NOTE: if you want to use syntax tags here you need to use %%{...}
;;date = %Y-%m-%d%
; Optional time format
time = " %I:%M %p"
; if `date-alt` or `time-alt` is defined, clicking
; the module will toggle between formats
;;date-alt = %A, %d %B %Y
#time-alt = " %a, %d %b %Y"
; Available tags:
; <label> (default)
format = <label>
; Available tokens:
; %date%
; %time%
; Default: %date%
label = %time%
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/filesystem]
type = internal/fs
; Mountpoints to display
mount-0 = /
;;mount-1 = /home
;;mount-2 = /var
; Seconds to sleep between updates
; Default: 30
interval = 30
; Display fixed precision values
; Default: false
fixed-values = true
; Spacing between entries
; Default: 2
;;spacing = 4
; Available tags:
; <label-mounted> (default)
; <bar-free>
; <bar-used>
; <ramp-capacity>
format-mounted = <label-mounted>
format-mounted-prefix =
; Available tags:
; <label-unmounted> (default)
format-unmounted = <label-unmounted>
format-unmounted-prefix =
; Available tokens:
; %mountpoint%
; %type%
; %fsname%
; %percentage_free%
; %percentage_used%
; %total%
; %free%
; %used%
; Default: %mountpoint% %percentage_free%%
label-mounted = " %free%"
; Available tokens:
; %mountpoint%
; Default: %mountpoint% is not mounted
label-unmounted = " %mountpoint%: not mounted"
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/memory]
type = internal/memory
; Seconds to sleep between updates
; Default: 1
interval = 1
; Available tags:
; <label> (default)
; <bar-used>
; <bar-free>
; <ramp-used>
; <ramp-free>
; <bar-swap-used>
; <bar-swap-free>
; <ramp-swap-used>
; <ramp-swap-free>
format = <label>
format-prefix =
; Available tokens:
; %percentage_used% (default)
; %percentage_free%
; %gb_used%
; %gb_free%
; %gb_total%
; %mb_used%
; %mb_free%
; %mb_total%
; %percentage_swap_used%
; %percentage_swap_free%
; %mb_swap_total%
; %mb_swap_free%
; %mb_swap_used%
; %gb_swap_total%
; %gb_swap_free%
; %gb_swap_used%
label = " %mb_used%"
; Only applies if <ramp-used> is used
;;ramp-used-0 = ${memory.used0}
;;ramp-used-1 = ${memory.used1}
;;ramp-used-2 = ${memory.used2}
; Only applies if <ramp-free> is used
;;ramp-free-0 = ${memory.free0}
;;ramp-free-1 = ${memory.free1}
;;ramp-free-2 = ${memory.free2}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/mpd]
type = internal/mpd
; Host where mpd is running (either ip or domain name)
; Can also be the full path to a unix socket where mpd is running.
;;host = 127.0.0.1
;;port = 6600
;;password = mysecretpassword
; Seconds to sleep between progressbar/song timer sync
; Default: 1
interval = 1
; Available tags:
; <label-song> (default)
; <label-time>
; <bar-progress>
; <toggle> - gets replaced with <icon-(pause|play)>
; <toggle-stop> - gets replaced with <icon-(stop|play)>
; <icon-random>
; <icon-repeat>
; <icon-repeatone> (deprecated)
; <icon-single> - Toggle playing only a single song. Replaces <icon-repeatone>
; <icon-consume>
; <icon-prev>
; <icon-stop>
; <icon-play>
; <icon-pause>
; <icon-next>
; <icon-seekb>
; <icon-seekf>
format-online = <label-song> <icon-prev> <toggle> <icon-next>
format-online-prefix =
;format-playing = ${self.format-online}
;format-paused = ${self.format-online}
;format-stopped = ${self.format-online}
; Available tags:
; <label-offline>
format-offline = <label-offline>
format-offline-prefix =
; Available tokens:
; %artist%
; %album-artist%
; %album%
; %date%
; %title%
; Default: %artist% - %title%
label-song = " %artist% - %title%"
label-song-maxlen = 25
label-song-ellipsis = true
; Available tokens:
; %elapsed%
; %total%
; Default: %elapsed% / %total%
label-time = %elapsed% / %total%
; Available tokens:
; None
label-offline = " Offline"
; Only applies if <icon-X> is used
icon-play =
icon-pause =
icon-stop =
icon-next =
icon-prev =
icon-seekf =
icon-seekb =
icon-random =
icon-repeat =
icon-repeatone =
icon-single =
icon-consume =
; Used to display the state of random/repeat/repeatone/single
; Only applies if <icon-[random|repeat|repeatone|single]> is used
toggle-on-foreground = ${color.primary}
toggle-off-foreground = ${color.secondary}
; Only applies if <bar-progress> is used
;;bar-progress-width = 45
;;bar-progress-indicator = |
;;bar-progress-fill = ─
;;bar-progress-empty = ─
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
; If you use both a wired and a wireless network, just add 2 module definitions. For example
[module/wired-network]
type = internal/network
interface = eth0
; Seconds to sleep between updates
; Default: 1
interval = 1.0
; Test connectivity every Nth update
; A value of 0 disables the feature
; NOTE: Experimental (needs more testing)
; Default: 0
;ping-interval = 3
; @deprecated: Define min width using token specifiers (%downspeed:min% and %upspeed:min%)
; Minimum output width of upload/download rate
; Default: 3
;;udspeed-minwidth = 5
; Accumulate values from all interfaces
; when querying for up/downspeed rate
; Default: false
accumulate-stats = true
; Consider an `UNKNOWN` interface state as up.
; Some devices have an unknown state, even when they're running
; Default: false
unknown-as-up = true
; Available tags:
; <label-connected> (default)
; <ramp-signal>
format-connected = <label-connected>
format-connected-prefix =
; Available tags:
; <label-disconnected> (default)
format-disconnected = <label-disconnected>
format-disconnected-prefix =
; Available tags:
; <label-connected> (default)
; <label-packetloss>
; <animation-packetloss>
;;format-packetloss = <animation-packetloss> <label-connected>
; Available tokens:
; %ifname% [wireless+wired]
; %local_ip% [wireless+wired]
; %local_ip6% [wireless+wired]
; %essid% [wireless]
; %signal% [wireless]
; %upspeed% [wireless+wired]
; %downspeed% [wireless+wired]
; %linkspeed% [wired]
; Default: %ifname% %local_ip%
label-connected = "%{A1:networkmanager_dmenu &:} %essid%%{A}"
; Available tokens:
; %ifname% [wireless+wired]
; Default: (none)
label-disconnected = "%{A1:networkmanager_dmenu &:} Offline%{A}"
;;label-disconnected-foreground = #66ffffff
; Available tokens:
; %ifname% [wireless+wired]
; %local_ip% [wireless+wired]
; %local_ip6% [wireless+wired]
; %essid% [wireless]
; %signal% [wireless]
; %upspeed% [wireless+wired]
; %downspeed% [wireless+wired]
; %linkspeed% [wired]
; Default: (none)
;label-packetloss = %essid%
;label-packetloss-foreground = #eefafafa
; Only applies if <ramp-signal> is used
ramp-signal-0 =
ramp-signal-1 =
ramp-signal-2 =
; Only applies if <animation-packetloss> is used
;;animation-packetloss-0 = ⚠
;;animation-packetloss-0-foreground = #ffa64c
;;animation-packetloss-1 = ⚠
;;animation-packetloss-1-foreground = #000000
; Framerate in milliseconds
;;animation-packetloss-framerate = 500
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/pulseaudio]
type = internal/pulseaudio
; Sink to be used, if it exists (find using `pacmd list-sinks`, name field)
; If not, uses default sink
; sink = @pulseaudiosink@
; Use PA_VOLUME_UI_MAX (~153%) if true, or PA_VOLUME_NORM (100%) if false
; Default: true
use-ui-max = false
; Interval for volume increase/decrease (in percent points)
; Default: 5
interval = 5
; Available tags:
; <label-volume> (default)
; <ramp-volume>
; <bar-volume>
format-volume = <ramp-volume> <label-volume>
; Available tags:
; <label-muted> (default)
; <ramp-volume>
; <bar-volume>
format-muted = <label-muted>
format-muted-prefix =
; Available tokens:
; %percentage% (default)
label-volume = %percentage%%
; Available tokens:
; %percentage% (default
label-muted = " Muted"
label-muted-foreground = ${color.foreground-alt}
; Only applies if <ramp-volume> is used
ramp-volume-0 =
ramp-volume-1 =
ramp-volume-2 =
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/temperature]
type = internal/temperature
; Seconds to sleep between updates
; Default: 1
interval = 0.5
; Thermal zone to use
; To list all the zone types, run
; $ for i in /sys/class/thermal/thermal_zone*; do echo "$i: $(<$i/type)"; done
; Default: 0
thermal-zone = 0
; Full path of temperature sysfs path
; Use `sensors` to find preferred temperature source, then run
; $ for i in /sys/class/hwmon/hwmon*/temp*_input; do echo "$(<$(dirname $i)/name): $(cat ${i%_*}_label 2>/dev/null || echo $(basename ${i%_*})) $(readlink -f $i)"; done
; to find path to desired file
; Default reverts to thermal zone setting
;;hwmon-path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_input
hwmon-path = /sys/devices/pci0000:00/0000:00:01.3/0000:01:00.0/hwmon/hwmon0/temp1_input
; Threshold temperature to display warning label (in degrees celsius)
; Default: 80
warn-temperature = 65
; Whether or not to show units next to the temperature tokens (°C, °F)
; Default: true
units = true
; Available tags:
; <label> (default)
; <ramp>
format = <ramp> <label>
; Available tags:
; <label-warn> (default)
; <ramp>
format-warn = <ramp> <label-warn>
; Available tokens:
; %temperature% (deprecated)
; %temperature-c% (default, temperature in °C)
; %temperature-f% (temperature in °F)
label = %temperature-c%
; Available tokens:
; %temperature% (deprecated)
; %temperature-c% (default, temperature in °C)
; %temperature-f% (temperature in °F)
label-warn = "%temperature-c%"
label-warn-foreground = ${color.secondary}
; Requires the <ramp> tag
; The icon selection will range from 0 to `warn-temperature`
; with the current temperature as index.
ramp-0 =
ramp-1 =
ramp-2 =
ramp-3 =
ramp-4 =
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/keyboard]
type = internal/xkeyboard
; List of indicators to ignore
blacklist-0 = num lock
blacklist-1 = scroll lock
; Available tags:
; <label-layout> (default)
; <label-indicator> (default)
format = <label-layout> <label-indicator>
format-prefix =
; Available tokens:
; %layout%
; %name%
; %number%
; Default: %layout%
label-layout = " %layout%"
; Available tokens:
; %name%
; Default: %name%
label-indicator-on = %name%
label-indicator-on-foreground = ${color.primary}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/title]
type = internal/xwindow
; Available tags:
; <label> (default)
format = <label>
format-prefix =
; Available tokens:
; %title%
; Default: %title%
label = " %title%"
label-maxlen = 30
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/workspaces]
type = internal/xworkspaces
; Only show workspaces defined on the same output as the bar
;
; Useful if you want to show monitor specific workspaces
; on different bars
;
; Default: false
pin-workspaces = true
; Create click handler used to focus desktop
; Default: true
enable-click = true
; Create scroll handlers used to cycle desktops
; Default: true
enable-scroll = true
; icon-[0-9]+ = <desktop-name>;<icon>
; NOTE: The desktop name needs to match the name configured by the WM
; You can get a list of the defined desktops using:
; $ xprop -root _NET_DESKTOP_NAMES
; Emacs, Calendar, News (General)
icon-0 = 1;
; Terminal, Emacs (IDE)
icon-1 = 2;
; Slack, Dev Tools Browser
icon-2 = 3;
; Chat, News (Financial)
icon-3 = 4;
; Apple Music, Media
icon-4 = 5;
; Monitoring, Emacs (Journal)
icon-5 = 6;
icon-default =
; Available tags:
; <label-monitor>
; <label-state> - gets replaced with <label-(active|urgent|occupied|empty)>
; Default: <label-state>
format = <label-state>
format-padding = 0
; Available tokens:
; %name%
; Default: %name%
label-monitor = %name%
; Available tokens:
; %name%
; %icon%
; %index%
; Default: %icon% %name%
label-active = %icon%
label-active-foreground = ${color.primary}
label-active-overline = ${color.primary}
; Available tokens:
; %name%
; %icon%
; %index%
; Default: %icon% %name%
label-occupied = %icon%
label-occupied-foreground = ${color.alternate}
; Available tokens:
; %name%
; %icon%
; %index%
; Default: %icon% %name%
label-urgent = %icon%
label-urgent-foreground = ${color.secondary}
; Available tokens:
; %name%
; %icon%
; %index%
; Default: %icon% %name%
label-empty = %icon%
label-active-padding = 2
label-urgent-padding = 2
label-occupied-padding = 2
label-empty-padding = 2
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
@@ -0,0 +1,74 @@
;; ┌──────────────────────────────────────────────────────────────────────────────-----┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█░█░█▀▀░█▀▀░█▀▄░░░█▄█░█▀█░█▀▄░█░█░█░░░█▀▀░█▀▀ │
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█░█░▀▀█░█▀▀░█▀▄░░░█░█░█░█░█░█░█░█░█░░░█▀▀░▀▀█ │
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀▀░▀▀▀░▀▀▀░▀░▀░░░▀░▀░▀▀▀░▀▀░░▀▀▀░▀▀▀░▀▀▀░▀▀▀ │
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
;; └──────────────────────────────────────────────────────────────────────────────-----┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/updates]
type = custom/script
; Available tokens:
; %counter%
; Command to be executed (using "/usr/bin/env sh -c [command]")
exec = @packages@
; Conditional command that, if defined, needs to exit successfully
; before the main exec command is invoked.
; Default: ""
;;exec-if = ""
; Will the script output continous content?
; Default: false
tail = true
; Seconds to sleep between updates
; Default: 2 (0 if `tail = true`)
interval = 0
; Available tags:
; <output> - deprecated
; <label> (default)
format = <label>
format-prefix =
; Available tokens:
; %output%
; Default: %output%
label = %output%
; Available tokens:
; %counter%
; %pid%
;
click-left = @searchpkgs@
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/launcher]
type = custom/text
content =
content-background = ${color.primary}
content-foreground = ${color.module-fg}
content-padding = 2
click-left = @launcher@
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/popup-calendar]
type = custom/script
exec = @calendar@
interval = 5
click-left = @calendar@ --popup &
[module/sysmenu]
type = custom/text
content =
content-background = ${color.primary}
content-foreground = ${color.module-fg}
content-padding = 2
click-left = @powermenu@ &
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+10
View File
@@ -0,0 +1,10 @@
/* colors */
* {
al: #00000000;
bg: #1F1F1FFF;
bga: #546e7a33;
bar: #FFFFFFFF;
fg: #FFFFFFFF;
ac: #546e7aFF;
}
+24
View File
@@ -0,0 +1,24 @@
/* Confirm Dialog */
@import "colors.rasi"
* {
background-color: @bg;
text-color: @fg;
font: "Iosevka Nerd Font 10";
}
window {
width: 225px;
padding: 25px;
border: 0px 0px 2px 0px;
border-radius: 0px;
border-color: @ac;
location: center;
y-offset: -2em;
}
entry {
expand: true;
text-color: @ac;
}
+119
View File
@@ -0,0 +1,119 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Iosevka Nerd Font 10";
show-icons: true;
icon-theme: "Papirus";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
@import "colors.rasi"
window {
transparency: "real";
background-color: @bg;
text-color: @fg;
border: 0px 0px 2px 0px;
border-color: @ac;
border-radius: 0px;
width: 350px;
location: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 0px;
background-color: @al;
text-color: @bar;
font: "feather 12";
}
entry {
background-color: @al;
text-color: @bar;
placeholder-color: @bar;
expand: true;
horizontal-align: 0;
placeholder: "Search...";
padding: 0px 0px 0px 10px;
blink: true;
}
inputbar {
children: [ prompt, entry ];
background-color: @ac;
text-color: @bar;
expand: false;
border: 0px;
border-radius: 0px;
border-color: @ac;
margin: 0px;
padding: 12px;
}
listview {
background-color: @al;
padding: 0px;
columns: 1;
lines: 5;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @al;
border: 0px;
border-radius: 0px;
border-color: @ac;
children: [ inputbar, listview ];
spacing: 0px;
padding: 0px;
}
element {
background-color: @al;
text-color: @fg;
orientation: horizontal;
border-radius: 0px;
padding: 10px;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
border: 0px;
}
element-text {
background-color: transparent;
text-color: inherit;
expand: true;
horizontal-align: 0;
vertical-align: 0.5;
margin: 0px 2.5px 0px 2.5px;
}
element selected {
background-color: @bga;
text-color: @fg;
border: 0px 0px 0px 0px;
border-radius: 0px;
border-color: @ac;
}
+24
View File
@@ -0,0 +1,24 @@
/* Confirm Dialog */
@import "colors.rasi"
* {
background-color: @bg;
text-color: @fg;
font: "Iosevka Nerd Font 10";
}
window {
width: 320px;
padding: 25px;
border: 0px 0px 2px 0px;
border-radius: 0px;
border-color: @ac;
location: center;
y-offset: -2em;
}
entry {
expand: true;
text-color: @ac;
}
+126
View File
@@ -0,0 +1,126 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Iosevka Nerd Font 10";
show-icons: true;
icon-theme: "Papirus";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
@import "colors.rasi"
window {
transparency: "real";
background-color: @bg;
text-color: @fg;
border: 0px 0px 2px 0px;
border-color: @ac;
border-radius: 0px;
width: 400px;
location: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 0px 0px 0px 5px;
background-color: @al;
text-color: @bar;
}
textbox-prompt-colon {
background-color: @al;
text-color: @bar;
expand: false;
str: "";
font: "feather 12";
}
entry {
background-color: @al;
text-color: @bar;
placeholder-color: @bar;
expand: true;
horizontal-align: 0;
placeholder: "Search...";
padding: 0px 0px 0px 10px;
blink: true;
}
inputbar {
children: [ textbox-prompt-colon, prompt ];
background-color: @ac;
text-color: @bar;
expand: false;
border: 0px;
border-radius: 0px;
border-color: @ac;
margin: 0px;
padding: 12px;
}
listview {
background-color: @al;
padding: 0px;
columns: 1;
lines: 8;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @al;
border: 0px;
border-radius: 0px;
border-color: @ac;
children: [ inputbar, listview ];
spacing: 0px;
padding: 0px;
}
element {
background-color: @al;
text-color: @fg;
orientation: horizontal;
border-radius: 0px;
padding: 10px 10px 10px -17px;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
border: 0px;
}
element-text {
background-color: transparent;
text-color: inherit;
expand: true;
horizontal-align: 0;
vertical-align: 0.5;
margin: 0px 2.5px 0px 2.5px;
}
element selected {
background-color: @bga;
text-color: @fg;
border: 0px 0px 0px 0px;
border-radius: 0px;
border-color: @ac;
}
+126
View File
@@ -0,0 +1,126 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Iosevka Nerd Font 10";
show-icons: true;
icon-theme: "Papirus";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
@import "colors.rasi"
window {
transparency: "real";
background-color: @bg;
text-color: @fg;
border: 0px 0px 2px 0px;
border-color: @ac;
border-radius: 0px;
width: 350px;
location: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 0px 0px 0px 5px;
background-color: @al;
text-color: @bar;
}
textbox-prompt-colon {
background-color: @al;
text-color: @bar;
expand: false;
str: "";
font: "feather 12";
}
entry {
background-color: @al;
text-color: @bar;
placeholder-color: @bar;
expand: true;
horizontal-align: 0;
placeholder: "Search...";
padding: 0px 0px 0px 10px;
blink: true;
}
inputbar {
children: [ textbox-prompt-colon, prompt ];
background-color: @ac;
text-color: @bar;
expand: false;
border: 0px;
border-radius: 0px;
border-color: @ac;
margin: 0px;
padding: 12px;
}
listview {
background-color: @al;
padding: 0px;
columns: 1;
lines: 5;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @al;
border: 0px;
border-radius: 0px;
border-color: @ac;
children: [ inputbar, listview ];
spacing: 0px;
padding: 0px;
}
element {
background-color: @al;
text-color: @fg;
orientation: horizontal;
border-radius: 0px;
padding: 10px 10px 10px -17px;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
border: 0px;
}
element-text {
background-color: transparent;
text-color: inherit;
expand: true;
horizontal-align: 0;
vertical-align: 0.5;
margin: 0px 2.5px 0px 2.5px;
}
element selected {
background-color: @bga;
text-color: @fg;
border: 0px 0px 0px 0px;
border-radius: 0px;
border-color: @ac;
}
+126
View File
@@ -0,0 +1,126 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Iosevka Nerd Font 10";
show-icons: true;
icon-theme: "Papirus";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
@import "colors.rasi"
window {
transparency: "real";
background-color: @bg;
text-color: @fg;
border: 0px 0px 2px 0px;
border-color: @ac;
border-radius: 0px;
width: 350px;
location: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 0px 0px 0px 5px;
background-color: @al;
text-color: @bar;
}
textbox-prompt-colon {
background-color: @al;
text-color: @bar;
expand: false;
str: "";
font: "feather 12";
}
entry {
background-color: @al;
text-color: @bar;
placeholder-color: @bar;
expand: true;
horizontal-align: 0;
placeholder: "Search...";
padding: 0px 0px 0px 5px;
blink: true;
}
inputbar {
children: [ textbox-prompt-colon, entry ];
background-color: @ac;
text-color: @bar;
expand: false;
border: 0px;
border-radius: 0px;
border-color: @ac;
margin: 0px;
padding: 12px;
}
listview {
background-color: @al;
padding: 0px;
columns: 1;
lines: 5;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @al;
border: 0px;
border-radius: 0px;
border-color: @ac;
children: [ inputbar, listview ];
spacing: 0px;
padding: 0px;
}
element {
background-color: @al;
text-color: @fg;
orientation: horizontal;
border-radius: 0px;
padding: 10px 10px 10px -17px;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
border: 0px;
}
element-text {
background-color: transparent;
text-color: inherit;
expand: true;
horizontal-align: 0;
vertical-align: 0.5;
margin: 0px 2.5px 0px 2.5px;
}
element selected {
background-color: @bga;
text-color: @fg;
border: 0px 0px 0px 0px;
border-radius: 0px;
border-color: @ac;
}
+34
View File
@@ -0,0 +1,34 @@
_: {
# This formats the disk with the ext4 filesystem
# Other examples found here: https://github.com/nix-community/disko/tree/master/example
disko.devices = {
disk = {
vdb = {
device = "/dev/%DISK%";
type = "disk";
content = {
type = "gpt";
partitions = {
ESP = {
type = "EF00";
size = "100M";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
};
root = {
size = "100%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
};
};
};
};
};
}
+368
View File
@@ -0,0 +1,368 @@
{ user, ... }:
let
home = builtins.getEnv "HOME";
xdg_configHome = "${home}/.config";
xdg_dataHome = "${home}/.local/share";
xdg_stateHome = "${home}/.local/state"; in
{
"${xdg_configHome}/bspwm/bspwmrc" = {
executable = true;
text = ''
#! /bin/sh
#
# Set the number of workspaces
bspc monitor -d 1 2 3 4 5 6
# Launch keybindings daemon
pgrep -x sxhkd > /dev/null || sxhkd &
# Window configurations
bspc config border_width 0
bspc config window_gap 16
bspc config split_ratio 0.52
bspc config borderless_monocle true
bspc config gapless_monocle true
# Padding outside of the window
bspc config top_padding 60
bspc config bottom_padding 60
bspc config left_padding 60
bspc config right_padding 60
# Move floating windows
bspc config pointer_action1 move
# Resize floating windows
bspc config pointer_action2 resize_side
bspc config pointer_action2 resize_corner
# Set background and top bar
systemctl --user start polybar
sleep .25
# Wait for the network to be up
notify-send 'Waiting for network...'
while ! systemctl is-active --quiet network-online.target; do sleep 1; done
notify-send 'Network found.'
# Wait for the Emacs daemon
notify-send 'Starting Emacs...'
/run/current-system/sw/bin/emacsclient -a "" -e '(progn)' &
# Wait for Emacs daemon to be ready
while ! /run/current-system/sw/bin/emacsclient -e '(progn)' &>/dev/null; do
sleep 1
done
notify-send 'Emacs daemon started.'
'';
};
"${xdg_configHome}/sxhkd/sxhkdrc" = {
text = ''
# Close window
alt + F4
bspc node --close
# Make split ratios equal
super + equal
bspc node @/ --equalize
# Make split ratios balanced
super + minus
bspc node @/ --balance
# Toogle tiling of window
super + d
bspc query --nodes -n focused.tiled && state=floating || state=tiled; \
bspc node --state \~$state
# Toggle fullscreen of window
super + f
bspc node --state \~fullscreen
# Swap the current node and the biggest window
super + g
bspc node -s biggest.window
# Swap the current node and the smallest window
super + shift + g
bspc node -s biggest.window
# Alternate between the tiled and monocle layout
super + m
bspc desktop -l next
# Move between windows in monocle layout
super + {_, alt + }m
bspc node -f {next, prev}.local.!hidden.window
# Focus the node in the given direction
super + {_,shift + }{h,j,k,l}
bspc node -{f,s} {west,south,north,east}
# Focus left/right occupied desktop
super + {Left,Right}
bspc desktop --focus {prev,next}.occupied
# Focus left/right occupied desktop
super + {Up,Down}
bspc desktop --focus {prev,next}.occupied
# Focus left/right desktop
ctrl + alt + {Left,Right}
bspc desktop --focus {prev,next}
# Focus left/right desktop
ctrl + alt + {Up, Down}
bspc desktop --focus {prev,next}
# Focus the older or newer node in the focus history
super + {o,i}
bspc wm -h off; \
bspc node {older,newer} -f; \
bspc wm -h on
# Focus or send to the given desktop
super + {_,shift + }{1-9,0}
bspc {desktop -f,node -d} '^{1-9,10}'
# Preselect the direction
super + alt + {h,j,k,l}
bspc node -p {west,south,north,east}
# Cancel the preselect
# For context on syntax: https://github.com/baskerville/bspwm/issues/344
super + alt + {_,shift + }Escape
bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel
# Preselect the direction
super + ctrl + {h,j,k,l}
bspc node -p {west,south,north,east}
# Cancel the preselect
# For context on syntax: https://github.com/baskerville/bspwm/issues/344
super + ctrl + {_,shift + }Escape
bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel
# Set the node flags
super + ctrl + {m,x,s,p}
bspc node -g {marked,locked,sticky,private}
# Send the newest marked node to the newest preselected node
super + y
bspc node newest.marked.local -n newest.!automatic.local
# Program launcher
super + @space
rofi -config -no-lazy-grab -show drun -modi drun -theme /home/${user}/.config/rofi/launcher.rasi
# Terminal emulator
super + Return
bspc rule -a Alacritty -o state=floating rectangle=1024x768x0x0 center=true && /etc/profiles/per-user/${user}/bin/alacritty
# Terminal emulator
super + ctrl + Return
/etc/profiles/per-user/${user}/bin/alacritty
# Jump to workspaces
super + t
bspc desktop --focus ^2
super + b
bspc desktop --focus ^1
super + w
bspc desktop --focus ^4
super + Tab
bspc {node,desktop} -f last
# Keepass XC
super + shift + x
/etc/profiles/per-user/${user}/bin/keepassxc
# Emacs
# -c flag is --create-frame
# -a flag is fallback to plain emacs if daemon fails
super + alt + Return
emacsclient -c -a emacs
super + alt + e
systemctl --user restart emacs.service && \
emacsclient -c -a emacs
# Web browser
ctrl + alt + Return
google-chrome-stable
# File browser at home dir
super + shift + @space
pcmanfm
# Take a screenshot with PrintSc
Print
flameshot gui -c -p $HOME/.local/share/img/screenshots
# Lock the screen
ctrl + alt + BackSpace
i3lock
# Audio controls for + volume
XF86AudioRaiseVolume
pactl set-sink-volume @DEFAULT_SINK@ +5%
# Audio controls for - volume
XF86AudioLowerVolume
pactl set-sink-volume @DEFAULT_SINK@ -5%
# Audio controls for mute
XF86AudioMute
pactl set-sink-mute @DEFAULT_SINK@ toggle
'';
};
"${xdg_configHome}/polybar/bin/popup-calendar.sh" = {
executable = true;
text = ''
#!/bin/sh
DATE="$(/run/current-system/sw/bin/date +"%B %d, %Y")"
SCREEN_WIDTH=$(/run/current-system/sw/bin/xrandr | /run/current-system/sw/bin/grep '*' | /run/current-system/sw/bin/awk '{print $1}' | /run/current-system/sw/bin/cut -d 'x' -f1)
POSX=$(( (SCREEN_WIDTH / 2) - ((SCREEN_WIDTH / 2 * 625) / 10000) ))
case "$1" in
--popup)
/etc/profiles/per-user/${user}/bin/yad --calendar --fixed \
--posx=$POSX --posy=80 --no-buttons --borders=0 --title="yad-calendar" \
--close-on-unfocus
;;
*)
echo "$DATE"
;;
esac
'';
};
"${xdg_configHome}/polybar/bin/check-nixos-updates.sh" = {
executable = true;
text = ''
#!/bin/sh
/run/current-system/sw/bin/git -C ~/.local/share/src/nixpkgs fetch upstream master
UPDATES=$(/run/current-system/sw/bin/git -C ~/.local/share/src/nixpkgs rev-list origin/master..upstream/master --count 2>/dev/null);
/run/current-system/sw/bin/echo " $UPDATES"; # Extra space for presentation with icon
/run/current-system/sw/bin/sleep 1800;
'';
};
"${xdg_configHome}/polybar/bin/search-nixos-updates.sh" = {
executable = true;
text = ''
#!/bin/sh
/etc/profiles/per-user/${user}/bin/google-chrome-stable --new-window "https://search.nixos.org/packages"
'';
};
"${xdg_configHome}/rofi/colors.rasi".text = builtins.readFile ./config/rofi/colors.rasi;
"${xdg_configHome}/rofi/confirm.rasi".text = builtins.readFile ./config/rofi/confirm.rasi;
"${xdg_configHome}/rofi/launcher.rasi".text = builtins.readFile ./config/rofi/launcher.rasi;
"${xdg_configHome}/rofi/message.rasi".text = builtins.readFile ./config/rofi/message.rasi;
"${xdg_configHome}/rofi/networkmenu.rasi".text = builtins.readFile ./config/rofi/networkmenu.rasi;
"${xdg_configHome}/rofi/powermenu.rasi".text = builtins.readFile ./config/rofi/powermenu.rasi;
"${xdg_configHome}/rofi/styles.rasi".text = builtins.readFile ./config/rofi/styles.rasi;
"${xdg_configHome}/rofi/bin/launcher.sh" = {
executable = true;
text = ''
#!/bin/sh
rofi -no-config -no-lazy-grab -show drun -modi drun -theme ${xdg_configHome}/rofi/launcher.rasi
'';
};
# @todo: Don't use hardcoded src paths
"${xdg_configHome}/rofi/bin/powermenu.sh" = {
executable = true;
text = ''
#!/bin/sh
configDir="${xdg_configHome}/rofi"
uptime=$(uptime -p | sed -e 's/up //g')
rofi_command="rofi -no-config -theme $configDir/powermenu.rasi"
# Options
shutdown=" Shutdown"
reboot=" Restart"
lock=" Lock"
suspend=" Sleep"
logout=" Logout"
# Confirmation
confirm_exit() {
rofi -dmenu\
-no-config\
-i\
-no-fixed-num-lines\
-p "Are You Sure? : "\
-theme $configDir/confirm.rasi
}
# Message
msg() {
rofi -no-config -theme "$configDir/message.rasi" -e "Available Options - yes / y / no / n"
}
# Variable passed to rofi
options="$lock\n$suspend\n$logout\n$reboot\n$shutdown"
chosen="$(echo -e "$options" | $rofi_command -p "Uptime: $uptime" -dmenu -selected-row 0)"
case $chosen in
$shutdown)
ans=$(confirm_exit &)
if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
systemctl poweroff
elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
exit 0
else
msg
fi
;;
$reboot)
ans=$(confirm_exit &)
if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
systemctl reboot
elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
exit 0
else
msg
fi
;;
$lock)
betterlockscreen -l
;;
$suspend)
ans=$(confirm_exit &)
if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
mpc -q pause
amixer set Master mute
systemctl suspend
elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
exit 0
else
msg
fi
;;
$logout)
ans=$(confirm_exit &)
if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
bspc quit
elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
exit 0
else
msg
fi
;;
esac
'';
};
}
+128
View File
@@ -0,0 +1,128 @@
{
config,
pkgs,
lib,
...
}:
let
user = "olaf";
xdg_configHome = "/home/${user}/.config";
shared-programs = import ../shared/home-manager.nix { inherit config pkgs lib; };
shared-files = import ../shared/files.nix { inherit config pkgs; };
polybar-user_modules = builtins.readFile (
pkgs.replaceVars {
src = ./config/polybar/user_modules.ini;
packages = "${xdg_configHome}/polybar/bin/check-nixos-updates.sh";
searchpkgs = "${xdg_configHome}/polybar/bin/search-nixos-updates.sh";
launcher = "${xdg_configHome}/polybar/bin/launcher.sh";
powermenu = "${xdg_configHome}/rofi/bin/powermenu.sh";
calendar = "${xdg_configHome}/polybar/bin/popup-calendar.sh";
}
);
polybar-config = pkgs.replaceVars {
src = ./config/polybar/config.ini;
font0 = "DejaVu Sans:size=12;3";
font1 = "feather:size=12;3"; # from overlay
};
polybar-modules = builtins.readFile ./config/polybar/modules.ini;
polybar-bars = builtins.readFile ./config/polybar/bars.ini;
polybar-colors = builtins.readFile ./config/polybar/colors.ini;
in
{
home = {
enableNixpkgsReleaseCheck = false;
username = "${user}";
homeDirectory = "/home/${user}";
packages = pkgs.callPackage ./packages.nix { };
file = shared-files // import ./files.nix { inherit user; };
stateVersion = "21.05";
};
# Use a dark theme
gtk = {
enable = true;
iconTheme = {
name = "Adwaita-dark";
package = pkgs.adwaita-icon-theme;
};
theme = {
name = "Adwaita-dark";
package = pkgs.adwaita-icon-theme;
};
};
# Screen lock
services = {
screen-locker = {
enable = true;
inactiveInterval = 10;
lockCmd = "${pkgs.i3lock-fancy-rapid}/bin/i3lock-fancy-rapid 10 15";
};
# Auto mount devices
udiskie.enable = true;
polybar = {
enable = true;
config = polybar-config;
extraConfig = polybar-bars + polybar-colors + polybar-modules + polybar-user_modules;
package = pkgs.polybarFull;
script = "polybar main &";
};
dunst = {
enable = true;
package = pkgs.dunst;
settings = {
global = {
monitor = 0;
follow = "mouse";
border = 0;
height = 400;
width = 320;
offset = "33x65";
indicate_hidden = "yes";
shrink = "no";
separator_height = 0;
padding = 32;
horizontal_padding = 32;
frame_width = 0;
sort = "no";
idle_threshold = 120;
font = "Noto Sans";
line_height = 4;
markup = "full";
format = "<b>%s</b>\n%b";
alignment = "left";
transparency = 10;
show_age_threshold = 60;
word_wrap = "yes";
ignore_newline = "no";
stack_duplicates = false;
hide_duplicate_count = "yes";
show_indicators = "no";
icon_position = "left";
icon_theme = "Adwaita-dark";
sticky_history = "yes";
history_length = 20;
history = "ctrl+grave";
browser = "google-chrome-stable";
always_run_script = true;
title = "Dunst";
class = "Dunst";
max_icon_size = 64;
};
};
};
};
programs = shared-programs // {
gpg.enable = true;
};
}
+67
View File
@@ -0,0 +1,67 @@
{ pkgs }:
with pkgs;
let shared-packages = import ../shared/packages.nix { inherit pkgs; }; in
shared-packages ++ [
# Security and authentication
yubikey-agent
keepassxc
# App and package management
appimage-run
gnumake
cmake
home-manager
# Media and design tools
vlc
fontconfig
font-manager
# Productivity tools
bc # old school calculator
galculator
# Audio tools
pavucontrol # Pulse audio controls
# Testing and development tools
direnv
rofi
rofi-calc
postgresql
libtool # for Emacs vterm
# Screenshot and recording tools
flameshot
# Text and terminal utilities
feh # Manage wallpapers
screenkey
tree
unixtools.ifconfig
unixtools.netstat
xclip # For the org-download package in Emacs
xorg.xwininfo # Provides a cursor to click and learn about windows
xorg.xrandr
# File and system utilities
inotify-tools # inotifywait, inotifywatch - For file system events
i3lock-fancy-rapid
libnotify
pcmanfm # File browser
sqlite
xdg-utils
# Other utilities
yad # yad-calendar is used with polybar
xdotool
google-chrome
# PDF viewer
zathura
# Music and entertainment
spotify
]
+16
View File
@@ -0,0 +1,16 @@
## Shared
Much of the code running on MacOS or NixOS is actually found here.
This configuration gets imported by both modules. Some configuration examples include `git`, `zsh`, `vim`, and `tmux`.
## Layout
```
.
├── config # Config files not written in Nix
├── cachix # Defines cachix, a global cache for builds
├── default.nix # Defines how we import overlays
├── files.nix # Non-Nix, static configuration files (now immutable!)
├── home-manager.nix # The goods; most all shared config lives here
├── packages.nix # List of packages to share
```
File diff suppressed because it is too large Load Diff
+142
View File
@@ -0,0 +1,142 @@
;; -------------------------
;; Variable Declarations
;; -------------------------
(defvar org-config-file "~/.local/share/src/nixos-config/modules/shared/config/emacs/config.org")
(defvar default-config-file "~/.emacs.d/default-config.org")
(defvar default-config-url "https://git.kolkman.org/olaf/nixos-config_to_rule_them_all/raw/branch/main/modules/shared/config/emacs/config.org")
;; -------------------------
;; Package Manager Setup
;; -------------------------
(require 'package)
(setq package-archives '(("melpa" . "https://melpa.org/packages/")
("gnu" . "http://elpa.gnu.org/packages/")))
(unless (assoc-default "melpa" package-archives)
(message "Warning: MELPA source not found. Adding MELPA to package-archives.")
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t))
(unless (assoc-default "org" package-archives)
(message "Warning: Org source not found. Adding Org to package-archives.")
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t))
(setq package-enable-at-startup nil)
;; -------------------------
;; Use-Package Setup
;; -------------------------
(unless (package-installed-p 'use-package)
(package-initialize)
(if (package-install 'use-package)
(message "use-package installed successfully.")
(error "Error: Failed to install use-package."))
(setq use-package-verbose t)
(setq use-package-always-ensure t)
(require 'use-package))
;; -------------------------
;; Environment Variables Setup
;; -------------------------
(use-package exec-path-from-shell
:if (memq window-system '(mac ns x))
:config
(setq exec-path-from-shell-variables '("PATH" "GOPATH" "PNPM_HOME"))
(if (exec-path-from-shell-initialize)
(message "Environment variables initialized successfully.")
(error "Error: Failed to initialize environment variables.")))
(when (daemonp)
(exec-path-from-shell-initialize))
;; -------------------------
;; Straight.el Setup
;; -------------------------
(setq straight-repository-branch "develop")
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
(bootstrap-version 6))
(unless (file-exists-p bootstrap-file)
(with-current-buffer
(url-retrieve-synchronously
"https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
'silent 'inhibit-cookies)
(goto-char (point-max))
(eval-print-last-sexp)))
(if (load bootstrap-file nil 'nomessage)
(message "Straight.el loaded successfully.")
(error "Error: Failed to load Straight.el.")))
(setq straight-use-package-by-default t)
(package-initialize)
;; -------------------------
;; Window and UI Setup
;; -------------------------
(defun dl/window-setup ()
(condition-case nil
(progn
(column-number-mode)
(scroll-bar-mode 0)
(menu-bar-mode -1)
(tool-bar-mode 0)
(winner-mode 1)
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist '(ns-appearance . dark))
(setq ns-use-proxy-icon nil)
(setq frame-title-format nil)
(message "Window and UI setup completed successfully."))
(error (message "Error occurred in Window and UI setup."))))
(dl/window-setup)
;; -------------------------
;; Org Mode Setup
;; -------------------------
(defun dl/org-mode-setup ()
(condition-case nil
(progn
(org-indent-mode)
(variable-pitch-mode 1)
(auto-fill-mode 0)
(visual-line-mode 1)
(setq evil-auto-indent nil)
(message "Org mode setup completed successfully."))
(error (message "Error occurred in Org mode setup."))))
(use-package org
:defer t
:hook (org-mode . dl/org-mode-setup)
:config
(setq org-edit-src-content-indentation 2
org-ellipsis ""
org-hide-emphasis-markers t
org-hide-block-startup nil)
:bind (("C-c a" . org-agenda)))
;; -------------------------
;; Default Config Download
;; -------------------------
(defun dl/download-default-config ()
(condition-case nil
(progn
(unless (file-exists-p default-config-file)
(url-retrieve default-config-url
(lambda (_status)
;; delete-region removes the HTTP headers from the downloaded content.
(delete-region (point-min) (1+ url-http-end-of-headers))
;; save the contents of the buffer to the file.
(write-file default-config-file)))
(message "Default configuration downloaded successfully.")))
(error (message "Error occurred while downloading the default configuration."))))
;; -------------------------
;; Load Org Config or Default
;; -------------------------
(condition-case nil
(progn
(unless (file-exists-p org-config-file)
(dl/download-default-config))
(if (file-exists-p org-config-file)
(org-babel-load-file org-config-file)
(org-babel-load-file default-config-file))
(message "Configuration loaded successfully."))
(error (message "Error occurred while loading the configuration.")))
@@ -1,7 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
let let
emacsOverlaySha256 = "07i9zb4rw9zwip9a49fv0q60ak025vn92r48vk7ns61was1mzn9s"; emacsOverlaySha256 = "06413w510jmld20i4lik9b36cfafm501864yq8k4vxl5r4hn0j0h";
in in
{ {
home-manager.backupFileExtension = "nix-backup"; home-manager.backupFileExtension = "nix-backup";
@@ -11,12 +11,10 @@ in
allowBroken = true; allowBroken = true;
allowInsecure = false; allowInsecure = false;
allowUnsupportedSystem = true; allowUnsupportedSystem = true;
permittedInsecurePackages = [
"electron-39.8.10"
];
}; };
overlays = overlays =
# Apply each overlay found in the /overlays directory
let path = ../../overlays; in with builtins; let path = ../../overlays; in with builtins;
map (n: import (path + ("/" + n))) map (n: import (path + ("/" + n)))
(filter (n: match ".*\\.nix" n != null || (filter (n: match ".*\\.nix" n != null ||
@@ -24,9 +22,8 @@ in
(attrNames (readDir path))) (attrNames (readDir path)))
++ [(import (builtins.fetchTarball { ++ [(import (builtins.fetchTarball {
url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz"; url = "https://github.com/dustinlyons/emacs-overlay/archive/refs/heads/master.tar.gz";
sha256 = emacsOverlaySha256; sha256 = emacsOverlaySha256;
})) }))];
];
}; };
} }
+16
View File
@@ -0,0 +1,16 @@
{ pkgs, config, ... }:
# let
# githubPublicKey = "ssh-ed25519 AAAA...";
# in
{
# ".ssh/id_github.pub" = {
# text = githubPublicKey;
# };
# Initializes Emacs with org-mode so we can tangle the main config
".emacs.d/init.el" = {
text = builtins.readFile ../shared/config/emacs/init.el;
};
}
+398
View File
@@ -0,0 +1,398 @@
{
config,
pkgs,
lib,
...
}:
let
name = "olaf";
user = "olaf";
email = "olaf@xolx.nl";
in
{
# Shared shell configuration
zsh = {
enable = true;
autocd = false;
cdpath = [ "~/.local/share/src" ];
oh-my-zsh = {
enable = true;
plugins = [ ];
# theme = "fishy";
# theme = "ys";
theme = "mrtazz";
};
# plugins = [ ];
initContent =
let
zshConfigEarlyInit = lib.mkOrder 500 ''
if [[ -f /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh ]]; then
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
. /nix/var/nix/profiles/default/etc/profile.d/nix.sh
fi
# Define variables for directories
export PATH=$HOME/.pnpm-packages/bin:$HOME/.pnpm-packages:$PATH
export PATH=$HOME/.npm-packages/bin:$HOME/bin:$PATH
export PATH=$HOME/.local/share/bin:$PATH
export PATH=$HOME/.cargo/bin:$PATH
# Remove history data we don't want to see
export HISTIGNORE="pwd:ls:cd"
# Ripgrep alias
alias search=rg -p --glob '!node_modules/*' $@
# Emacs is my editor
export ALTERNATE_EDITOR="vim"
export EDITOR="emacs -nw"
export VISUAL="emacs"
# RMAPI remarkable
RMAPI_CONFIG=/Users/olaf/.config/rmapi
e() {
emacs -nw "$@"
}
# nix shortcuts
shell() {
nix-shell '<nixpkgs>' -A "$1"
}
# pnpm is a javascript package manager
alias pn=pnpm
alias px=pnpx
# Use difftastic, syntax-aware diffing
# alias diff=difft
'';
zshConfigLastInit = lib.mkOrder 1500 ''
# Always color ls and group directories
alias ls='ls --color=auto'
'';
in
lib.mkMerge [
zshConfigEarlyInit
zshConfigLastInit
];
};
git = {
enable = true;
ignores = [ "*.swp" ];
userName = name;
userEmail = email;
lfs = {
enable = true;
};
extraConfig = {
init.defaultBranch = "main";
core = {
editor = "vim";
autocrlf = "input";
};
commit.gpgsign = false;
pull.rebase = true;
rebase.autoStash = true;
};
};
vim = {
enable = true;
plugins = with pkgs.vimPlugins; [
vim-airline
vim-airline-themes
vim-startify
vim-tmux-navigator
];
settings = {
ignorecase = true;
};
extraConfig = ''
"" General
set number
set history=1000
set nocompatible
set modelines=0
set encoding=utf-8
set scrolloff=3
set showmode
set showcmd
set hidden
set wildmenu
set wildmode=list:longest
set cursorline
set ttyfast
set nowrap
set ruler
set backspace=indent,eol,start
set laststatus=2
set clipboard=autoselect
" Dir stuff
set nobackup
set nowritebackup
set noswapfile
set backupdir=~/.config/vim/backups
set directory=~/.config/vim/swap
" Relative line numbers for easy movement
set relativenumber
set rnu
"" Whitespace rules
set tabstop=8
set shiftwidth=2
set softtabstop=2
set expandtab
"" Searching
set incsearch
set gdefault
"" Statusbar
set nocompatible " Disable vi-compatibility
set laststatus=2 " Always show the statusline
let g:airline_theme='bubblegum'
let g:airline_powerline_fonts = 1
"" Local keys and such
let mapleader=","
let maplocalleader=" "
"" Change cursor on mode
:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul
"" File-type highlighting and configuration
syntax on
filetype on
filetype plugin on
filetype indent on
"" Paste from clipboard
nnoremap <Leader>, "+gP
"" Copy from clipboard
xnoremap <Leader>. "+y
"" Move cursor by display lines when wrapping
nnoremap j gj
nnoremap k gk
"" Map leader-q to quit out of window
nnoremap <leader>q :q<cr>
"" Move around split
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
"" Easier to yank entire line
nnoremap Y y$
"" Move buffers
nnoremap <tab> :bnext<cr>
nnoremap <S-tab> :bprev<cr>
"" Like a boss, sudo AFTER opening the file to write
cmap w!! w !sudo tee % >/dev/null
let g:startify_lists = [
\ { 'type': 'dir', 'header': [' Current Directory '. getcwd()] },
\ { 'type': 'sessions', 'header': [' Sessions'] },
\ { 'type': 'bookmarks', 'header': [' Bookmarks'] }
\ ]
let g:startify_bookmarks = [
\ '~/.local/share/src',
\ ]
let g:airline_theme='bubblegum'
let g:airline_powerline_fonts = 1
'';
};
alacritty = {
enable = true;
settings = {
cursor = {
style = "Block";
};
window = {
opacity = 1.0;
padding = {
x = 24;
y = 24;
};
};
font = {
normal = {
family = "MesloLGS NF";
style = "Regular";
};
size = lib.mkMerge [
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux 10)
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin 14)
];
};
dynamic_padding = true;
decorations = "full";
title = "Terminal";
class = {
instance = "Alacritty";
general = "Alacritty";
};
colors = {
primary = {
background = "0x1f2528";
foreground = "0xc0c5ce";
};
normal = {
black = "0x1f2528";
red = "0xec5f67";
green = "0x99c794";
yellow = "0xfac863";
blue = "0x6699cc";
magenta = "0xc594c5";
cyan = "0x5fb3b3";
white = "0xc0c5ce";
};
bright = {
black = "0x65737e";
red = "0xec5f67";
green = "0x99c794";
yellow = "0xfac863";
blue = "0x6699cc";
magenta = "0xc594c5";
cyan = "0x5fb3b3";
white = "0xd8dee9";
};
};
};
};
ssh = {
enable = true;
includes = [
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux "/home/${user}/.ssh/config_external")
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin "/Users/${user}/.ssh/config_external")
];
matchBlocks = {
"Host *" = {
identityAgent = "\"~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock\"";
};
"github.com" = {
identitiesOnly = true;
identityFile = [
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux "/home/${user}/.ssh/id_github")
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin "/Users/${user}/.ssh/id_github")
];
};
"moonunit.kolkman.org" = {
hostname = "moonunit.kolkman.org";
user = "root";
port = 2222;
};
};
};
tmux = {
enable = true;
plugins = with pkgs.tmuxPlugins; [
vim-tmux-navigator
sensible
yank
prefix-highlight
{
plugin = power-theme;
extraConfig = ''
set -g @tmux_power_theme 'gold'
'';
}
{
plugin = resurrect; # Used by tmux-continuum
# Use XDG data directory
# https://github.com/tmux-plugins/tmux-resurrect/issues/348
extraConfig = ''
set -g @resurrect-dir '$HOME/.cache/tmux/resurrect'
set -g @resurrect-capture-pane-contents 'on'
set -g @resurrect-pane-contents-area 'visible'
'';
}
{
plugin = continuum;
extraConfig = ''
set -g @continuum-restore 'on'
set -g @continuum-save-interval '5' # minutes
'';
}
];
terminal = "screen-256color";
prefix = "C-x";
escapeTime = 10;
historyLimit = 50000;
extraConfig = ''
# Remove Vim mode delays
set -g focus-events on
# Enable full mouse support
set -g mouse on
# -----------------------------------------------------------------------------
# Key bindings
# -----------------------------------------------------------------------------
# Unbind default keys
unbind C-b
unbind '"'
unbind %
# Split panes, vertical or horizontal
bind-key x split-window -v
bind-key v split-window -h
# Move around panes with vim-like bindings (h,j,k,l)
bind-key -n M-k select-pane -U
bind-key -n M-h select-pane -L
bind-key -n M-j select-pane -D
bind-key -n M-l select-pane -R
# Smart pane switching with awareness of Vim splits.
# This is copy paste from https://github.com/christoomey/vim-tmux-navigator
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
bind-key -T copy-mode-vi 'C-h' select-pane -L
bind-key -T copy-mode-vi 'C-j' select-pane -D
bind-key -T copy-mode-vi 'C-k' select-pane -U
bind-key -T copy-mode-vi 'C-l' select-pane -R
bind-key -T copy-mode-vi 'C-\' select-pane -l
'';
};
}
+160
View File
@@ -0,0 +1,160 @@
{ pkgs }:
with pkgs;
[
# Nix
nixd
# General packages for development and system management
#alacritty
aspell
aspellDicts.en
bash-completion
bat
btop
coreutils
killall
neofetch
openssh
sqlite
wget
zip
htop
ncdu
mtr
nixfmt-rfc-style
difftastic
# Development
autoconf
autoconf-archive
automake
ccache
cmake
nasm
ninja
pkg-config
llvm
clang-tools
dfu-util
# Encryption and security tools
age
sops
gnupg
libfido2
# Cloud-related tools and SDKs
docker
docker-compose
# Media-related packages
emacs-all-the-icons-fonts
dejavu_fonts
ffmpeg
fd
font-awesome
hack-font
noto-fonts
noto-fonts-emoji
meslo-lgs-nf
# Node.js development tools
nodePackages.npm # globally install npm
nodePackages.prettier
nodejs
# Text and terminal utilities
htop
hunspell
iftop
jetbrains-mono
jq
ripgrep
tree
tmux
unrar
unzip
rmapi
# zsh-powerlevel10k
# Python packages
python3
virtualenv
# Rust Related
rustc
cargo
platformio-core
(vscode-with-extensions.override {
vscodeExtensions =
with vscode-extensions;
[
#bbenoist.nix
jnoortheen.nix-ide
ms-python.python
ms-azuretools.vscode-docker
# ms-vscode-remote.remote-ssh
eamodio.gitlens
james-yu.latex-workshop
ms-vscode.cmake-tools
shd101wyy.markdown-preview-enhanced
]
++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [
# {
# name = "remote-ssh-edit";
# publisher = "ms-vscode-remote";
# version = "0.47.2";
# sha256 = "1hp6gjh4xp2m1xlm1jsdzxw9d8frkiidhph6nvl24d0h8z34w49g";
# }
{
name = "cpptools";
publisher = "ms-vscode";
version = "1.26.1";
sha256 = "sha256-uVE7sEO8XN3ArFpElUw25/BKyCOzF1EmZ5nHBkdoL/0=";
}
{
name = "minifyall";
publisher = "josee9988";
version = "2.10.0";
sha256 = "sha256-cH5x8fUN0n+hO1b3lNzau2MnyeYmsD0ZXAYGxCQjT0Y=";
}
{
name = "platformio-ide";
publisher = "platformio";
version = "3.3.4";
sha256 = "sha256-qfNz4IYjCmCMFLtAkbGTW5xnsVT8iDnFWjrgkmr2Slk=";
}
];
})
# Tex and LaTex
pandoc
mdbook
(texlive.combine {
inherit (texlive)
apa6
bibunits
draftwatermark
enumitem
fontawesome5
footnotehyper
ifmtarg
lualatex-math
makecell
microtype
parskip
scheme-small
selnolig
sourcesanspro
tcolorbox
threeparttable
tikzfill
titling
upquote
xifthen
xurl
;
})
]