Create initial flake structure with london configuration
This commit is contained in:
parent
f65434f701
commit
81353cd437
13
.sops.yaml
Normal file
13
.sops.yaml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
keys:
|
||||||
|
- &london_system age1rr2u4kk5jc0zk5mmgcfzlddzz82u9ldqwnd2mkcspnps7pzegsms7fys7u
|
||||||
|
- &london_dala age19m7s6rl4l88nv0f7el70k9u9mv6fd0nq5nw5a3f6p3ffzch274lsksu3y7
|
||||||
|
|
||||||
|
creation_rules:
|
||||||
|
- path_regex: configurations/london/secrets/secrets.yaml$
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *london_system
|
||||||
|
- path_regex: configurations/london/secrets/users/dala.yaml$
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *london_dala
|
128
configurations/london/default.nix
Normal file
128
configurations/london/default.nix
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
{ pkgs, config, lib, extraInfo, ... }:
|
||||||
|
{
|
||||||
|
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" ];
|
||||||
|
boot.initrd.kernelModules = [ "dm-snapshot" ];
|
||||||
|
boot.kernelModules = [ "kvm-amd" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
|
||||||
|
/* Meta */
|
||||||
|
isProfessional = false;
|
||||||
|
|
||||||
|
/* Volumes */
|
||||||
|
luksDevices = [
|
||||||
|
{
|
||||||
|
name = "crypted-nixos";
|
||||||
|
deviceUUID = "5a1ac4ae-d74f-4599-bc5a-fc0a3501a196";
|
||||||
|
isPreLVM = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
filesystems = [
|
||||||
|
{
|
||||||
|
mountpoint = "/";
|
||||||
|
deviceUUID = "8dd700f8-7bf7-426c-8869-d31687e343df";
|
||||||
|
fsType = "ext4";
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
mountpoint = "/boot";
|
||||||
|
deviceUUID = "F2B6-C8CA";
|
||||||
|
fsType = "vfat";
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
mountpoint = "/nix";
|
||||||
|
deviceUUID = "b7a643f6-a78e-4e32-a1a3-22b321465bf6";
|
||||||
|
fsType = "ext4";
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
mountpoint = "/home";
|
||||||
|
deviceUUID = "e26f6727-3712-4830-b8e8-fdbce5e3584b";
|
||||||
|
fsType = "ext4";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
swapDeviceUUID = "5fe5e76b-df3d-43ce-abf9-d2b63078df09";
|
||||||
|
|
||||||
|
|
||||||
|
/* Linux kernel */
|
||||||
|
useLatestKernel = true;
|
||||||
|
|
||||||
|
|
||||||
|
/* Nix */
|
||||||
|
allowUnfreePackages = true;
|
||||||
|
|
||||||
|
/* Hardware acceleration */
|
||||||
|
hwAccelerationGPU = "nvidia";
|
||||||
|
|
||||||
|
/* System secrets */
|
||||||
|
sops = {
|
||||||
|
gnupg.sshKeyPaths = [ ];
|
||||||
|
age = {
|
||||||
|
sshKeyPaths = [ ];
|
||||||
|
keyFile = "/var/lib/sops-nix/key.txt";
|
||||||
|
};
|
||||||
|
defaultSopsFile = ./secrets/secrets.yaml;
|
||||||
|
secrets.wg0_private = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Wireguard */
|
||||||
|
networking.wg-quick.interfaces.wg0 = {
|
||||||
|
address = [ "10.100.0.4/24" ];
|
||||||
|
dns = [ "10.100.0.1" ];
|
||||||
|
|
||||||
|
listenPort = 51820;
|
||||||
|
privateKeyFile = config.sops.secrets.wg0_private.path;
|
||||||
|
|
||||||
|
peers = [
|
||||||
|
{
|
||||||
|
# Rock Pro 64
|
||||||
|
publicKey = "XVmG3/rNsCqc8KCmOx3+UUn9DJOnJ40Uxid5JGdChR4=";
|
||||||
|
endpoint = "${extraInfo.wireguard.rockProEndpoint}:51820";
|
||||||
|
allowedIPs = [ "10.100.0.1" ];
|
||||||
|
persistentKeepalive = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
# VPS
|
||||||
|
publicKey = "x45YsLDpMJw1pwKOvkyzdesen3lFcKpxCXACGz+xtDs=";
|
||||||
|
endpoint = "${extraInfo.wireguard.VPSEndpoint}:51820";
|
||||||
|
allowedIPs = [ "10.100.0.2" ];
|
||||||
|
persistentKeepalive = 25;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* User config */
|
||||||
|
machineUsers = {
|
||||||
|
dala = {
|
||||||
|
description = "Dala";
|
||||||
|
groups = [ "wheel" "video" "audio" "seat" "keys" "lp" "dialout" "network" ];
|
||||||
|
uid = 1000;
|
||||||
|
shell = pkgs.fish;
|
||||||
|
enableHomeManagerProfile = true;
|
||||||
|
homeManagerConfig = {
|
||||||
|
desktop.monitors = [
|
||||||
|
{
|
||||||
|
name = "Iiyama North America PL2470H 0x0000047B";
|
||||||
|
resolution = "1920x1080@165.003Hz";
|
||||||
|
position = "1920 0";
|
||||||
|
defaultWorkspace = 1;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Iiyama North America PL2530H 1154392601941";
|
||||||
|
resolution = "1920x1080@74.973Hz";
|
||||||
|
position = "0 0";
|
||||||
|
defaultWorkspace = 2;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
development.embedded.enableTools = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
21
configurations/london/secrets/secrets.yaml
Normal file
21
configurations/london/secrets/secrets.yaml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
wg0_private: ENC[AES256_GCM,data:z5G2EFh1vZk1yEwj0pFIU49u84bOjBZRzvKgqluWoQ6vqm+cMQt/dyGqXg4=,iv:XOiExUWxJczO+aJ+BogtlibqVshEkc6r8xeTPmdru4Y=,tag:+v/3JE1rqTm2x2MJUNltqw==,type:str]
|
||||||
|
sops:
|
||||||
|
kms: []
|
||||||
|
gcp_kms: []
|
||||||
|
azure_kv: []
|
||||||
|
hc_vault: []
|
||||||
|
age:
|
||||||
|
- recipient: age1rr2u4kk5jc0zk5mmgcfzlddzz82u9ldqwnd2mkcspnps7pzegsms7fys7u
|
||||||
|
enc: |
|
||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBNOVhvOFRQQ1ppenZQdEN6
|
||||||
|
S3FPYkNTTnZWUnBFUXMxNEFWcUQ4WVhzK1g4CitLWktOamUyU2dPOHBUaG40WWxN
|
||||||
|
Nkw5M2pCWFBtTWtQMjQ0azN3Rjh3ZDAKLS0tIFNyNGxiNE41RUdDVkZmNUxyVVR5
|
||||||
|
dXhiMUhVc1ZBb0F0bFArZU5OU1ZRK0EKdjtUBIRrw1AhNPczQJiDw6GywJL/jm2r
|
||||||
|
4o3XkFqMkP93YAoprHw7egH6t/6QVCFQTZPU4cAwJ0y1bLx9ju44uQ==
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
||||||
|
lastmodified: "2023-11-01T17:15:27Z"
|
||||||
|
mac: ENC[AES256_GCM,data:zL3UgmKuyzZzBTlBAyP7+nN1If7AMjq1qGkbbXKW2rlzl41x6orMdZQfOWG06eBdd7CGBoNgBNV7A9SE11RhXUvr1gdQGILie0ER2/UCEkEgXIV3tpto1C/tsEYDL7z8LSlcuPt3GJkca1Ym6yhIoe576ho7du3HclUCFBPIBQY=,iv:O3/aYlFPiueoByTyvefahrmFwGq5DAEdUaYvJXB1TFI=,tag:1Al7Lw18AZZ8spnITBuGMw==,type:str]
|
||||||
|
pgp: []
|
||||||
|
unencrypted_suffix: _unencrypted
|
||||||
|
version: 3.7.3
|
137
flake.lock
Normal file
137
flake.lock
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"home-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs-unstable"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1699368917,
|
||||||
|
"narHash": "sha256-nUtGIWf86BOkUbtksWtfglvCZ/otP0FTZlQH8Rzc7PA=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "6a8444467c83c961e2f5ff64fb4f422e303c98d3",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-stable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1699291058,
|
||||||
|
"narHash": "sha256-5ggduoaAMPHUy4riL+OrlAZE14Kh7JWX4oLEs22ZqfU=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "41de143fda10e33be0f47eab2bfe08a50f234267",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-23.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-stable_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1699110214,
|
||||||
|
"narHash": "sha256-L2TU4RgtiqF69W8Gacg2jEkEYJrW+Kp0Mp4plwQh5b8=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "78f3a4ae19f0e99d5323dd2e3853916b8ee4afee",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "release-23.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-unstable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1699099776,
|
||||||
|
"narHash": "sha256-X09iKJ27mGsGambGfkKzqvw5esP1L/Rf8H3u3fCqIiU=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "85f1ba3e51676fa8cc604a3d863d729026a6b8eb",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"home-manager": "home-manager",
|
||||||
|
"nixpkgs-stable": "nixpkgs-stable",
|
||||||
|
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||||
|
"sops-nix": "sops-nix"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sops-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs-unstable"
|
||||||
|
],
|
||||||
|
"nixpkgs-stable": "nixpkgs-stable_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1699311858,
|
||||||
|
"narHash": "sha256-W/sQrghPAn5J9d+9kMnHqi4NPVWVpy0V/qzQeZfS/dM=",
|
||||||
|
"owner": "Mic92",
|
||||||
|
"repo": "sops-nix",
|
||||||
|
"rev": "664187539871f63857bda2d498f452792457b998",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Mic92",
|
||||||
|
"repo": "sops-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
72
flake.nix
Normal file
72
flake.nix
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
description = "Dala's unified NixOS configuration";
|
||||||
|
inputs = {
|
||||||
|
# As we have machine using the unstable channel, and other machines using the stable one,
|
||||||
|
# we import both, and we will select for each machine which one to use.
|
||||||
|
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-23.05";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
|
||||||
|
# Home-manager isn't used for anything except my workstations, which all use the unstable channel.
|
||||||
|
home-manager = {
|
||||||
|
url = "github:nix-community/home-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
|
||||||
|
# For sops-nix, we keep the unstable nixpkgs, as it shouldn't break anything.
|
||||||
|
# This input is made to manage secrets on this repository.
|
||||||
|
sops-nix = {
|
||||||
|
url = "github:Mic92/sops-nix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs-unstable, nixpkgs-stable, home-manager, sops-nix, flake-utils }:
|
||||||
|
let
|
||||||
|
machines = import ./machines.nix;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
nixosConfigurations = builtins.mapAttrs
|
||||||
|
(name: value:
|
||||||
|
let
|
||||||
|
nixpkgs =
|
||||||
|
if value.nixpkgsUnstable
|
||||||
|
then nixpkgs-unstable
|
||||||
|
else nixpkgs-stable;
|
||||||
|
in
|
||||||
|
nixpkgs.lib.nixosSystem {
|
||||||
|
system = value.system;
|
||||||
|
|
||||||
|
specialArgs = {
|
||||||
|
machineInfos = {
|
||||||
|
hostname = name;
|
||||||
|
} // value;
|
||||||
|
|
||||||
|
sopsHmModule = sops-nix.homeManagerModules.sops;
|
||||||
|
};
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
./configurations/${name}
|
||||||
|
./modules/common
|
||||||
|
(if (value.machineType == "workstation")
|
||||||
|
then ./modules/workstation
|
||||||
|
else ./modules/server)
|
||||||
|
(if (value.machineType == "workstation" && value.enableHomeManager)
|
||||||
|
then home-manager.nixosModules.home-manager
|
||||||
|
else { })
|
||||||
|
sops-nix.nixosModules.sops
|
||||||
|
];
|
||||||
|
}
|
||||||
|
)
|
||||||
|
machines;
|
||||||
|
|
||||||
|
formatter = builtins.listToAttrs (map
|
||||||
|
(system:
|
||||||
|
{
|
||||||
|
name = system;
|
||||||
|
value = nixpkgs-unstable.legacyPackages.${system}.nixpkgs-fmt;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
flake-utils.lib.defaultSystems);
|
||||||
|
};
|
||||||
|
}
|
9
machines.nix
Normal file
9
machines.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
london = {
|
||||||
|
machineType = "workstation";
|
||||||
|
nixpkgsUnstable = true;
|
||||||
|
system = "x86_64-linux";
|
||||||
|
enableHomeManager = true;
|
||||||
|
stateVersion = "23.11";
|
||||||
|
};
|
||||||
|
}
|
62
modules/common/boot.nix
Normal file
62
modules/common/boot.nix
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
luksDevicesModule = types.submodule {
|
||||||
|
options.name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The partition name.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.deviceUUID = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The partition device UUID.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.isPreLVM = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = ''
|
||||||
|
Whether the decrypted partition will be a LVM device.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.enableDefaultSystemdBoot = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
description = ''
|
||||||
|
Whether or not enable the default SystemD boot system.
|
||||||
|
Can be useful for devices using u-boot.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.luksDevices = mkOption {
|
||||||
|
type = types.listOf luksDevicesModule;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
List of LUKS devices.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
boot.initrd.luks.devices = builtins.listToAttrs (map
|
||||||
|
(fs: {
|
||||||
|
name = fs.name;
|
||||||
|
value = {
|
||||||
|
device = "/dev/disk/by-uuid/${fs.deviceUUID}";
|
||||||
|
preLVM = fs.isPreLVM;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
config.luksDevices);
|
||||||
|
|
||||||
|
boot.loader.systemd-boot.enable = config.enableDefaultSystemdBoot;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
}
|
62
modules/common/default.nix
Normal file
62
modules/common/default.nix
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
{ lib, config, pkgs, machineInfos, modulesPath, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./filesystem.nix
|
||||||
|
./boot.nix
|
||||||
|
./linux.nix
|
||||||
|
./nix.nix
|
||||||
|
./network.nix
|
||||||
|
./hardware.nix
|
||||||
|
./users.nix
|
||||||
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
options.machineType = mkOption {
|
||||||
|
type = types.enum [ "workstation" "server" ];
|
||||||
|
default = "workstation";
|
||||||
|
example = "server";
|
||||||
|
description = ''
|
||||||
|
What is the type of this machine.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.isProfessional = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = ''
|
||||||
|
Whether or not this machine is used for professionnal purposes.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.enableDocker = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = ''
|
||||||
|
Whether or not to enable the docker stack.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
machineType = machineInfos.machineType;
|
||||||
|
system.stateVersion = machineInfos.stateVersion;
|
||||||
|
networking.hostName = machineInfos.hostname;
|
||||||
|
virtualisation.docker.enable = config.enableDocker;
|
||||||
|
|
||||||
|
# Only enable fish shell if there is at least one user using it.
|
||||||
|
programs.fish.enable = builtins.any (user: user.shell == pkgs.fish) (builtins.attrValues config.machineUsers);
|
||||||
|
|
||||||
|
# We always want to disable the X server as only workstation use windows manager
|
||||||
|
# and they always use wayland.
|
||||||
|
services.xserver.enable = false;
|
||||||
|
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = !(config.machineType == "server" && config.isProfessional);
|
||||||
|
message = "Only workstations can be professionnal hardware";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
67
modules/common/filesystem.nix
Normal file
67
modules/common/filesystem.nix
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
fsModule = types.submodule {
|
||||||
|
options = {
|
||||||
|
|
||||||
|
mountpoint = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The filesystem mountpoint.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
deviceUUID = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The volume UUID.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
fsType = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The volume filesystem.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.filesystems = mkOption {
|
||||||
|
type = types.listOf fsModule;
|
||||||
|
default = [ ];
|
||||||
|
example = [
|
||||||
|
{
|
||||||
|
mountpoint = "/";
|
||||||
|
deviceUUID = "XXXXX-YYYYYY-AJDKKSKSJ";
|
||||||
|
fsType = "ext4";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
description = ''
|
||||||
|
The machine filesystem tree description.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.swapDeviceUUID = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
fileSystems = builtins.listToAttrs (map
|
||||||
|
(fs: {
|
||||||
|
name = fs.mountpoint;
|
||||||
|
value = {
|
||||||
|
device = "/dev/disk/by-uuid/${fs.deviceUUID}";
|
||||||
|
fsType = fs.fsType;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
config.filesystems);
|
||||||
|
|
||||||
|
swapDevices = mkIf (config.swapDeviceUUID != null) [
|
||||||
|
{ device = "/dev/disk/by-uuid/${config.swapDeviceUUID}"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
26
modules/common/hardware.nix
Normal file
26
modules/common/hardware.nix
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{ lib, config, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.hwAccelerationGPU = mkOption {
|
||||||
|
type = types.nullOr (types.enum [ "nvidia" "intel" ]);
|
||||||
|
default = null;
|
||||||
|
example = "nvidia";
|
||||||
|
description = ''
|
||||||
|
The GPU type.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
hardware.opengl = {
|
||||||
|
enable = config.hwAccelerationGPU != null;
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
libvdpau-va-gl
|
||||||
|
vaapiVdpau
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.xserver.videoDrivers = [
|
||||||
|
(mkIf (config.hwAccelerationGPU == "nvidia") "nouveau")
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
53
modules/common/linux.nix
Normal file
53
modules/common/linux.nix
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
{ lib, config, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.useLatestKernel = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = ''
|
||||||
|
Whether or not to use the latest Linux kernel version.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.consoleFont = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "Lat2-Terminus16";
|
||||||
|
description = ''
|
||||||
|
The font to use in the Linux console.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.timeZone = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "Europe/Paris";
|
||||||
|
description = ''
|
||||||
|
The system time zone.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.locale = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "en_US.utf8";
|
||||||
|
description = ''
|
||||||
|
The system locale.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.keymap = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "fr";
|
||||||
|
example = "fr";
|
||||||
|
description = ''
|
||||||
|
The keyboard map used.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
boot.kernelPackages = mkIf config.useLatestKernel pkgs.linuxPackages_latest;
|
||||||
|
time.timeZone = config.timeZone;
|
||||||
|
console.font = config.consoleFont;
|
||||||
|
console.keyMap = config.keymap;
|
||||||
|
i18n.defaultLocale = config.locale;
|
||||||
|
};
|
||||||
|
}
|
38
modules/common/network.nix
Normal file
38
modules/common/network.nix
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.enableFirewall = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
description = ''
|
||||||
|
Whether or not to enable firewall.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.extraAllowedTCPPorts = mkOption {
|
||||||
|
type = types.listOf types.port;
|
||||||
|
default = [ ];
|
||||||
|
example = [ 53 ];
|
||||||
|
description = ''
|
||||||
|
List of custom TCP ports to open in the firewall.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.extraAllowedUDPPorts = mkOption {
|
||||||
|
type = types.listOf types.port;
|
||||||
|
default = [ ];
|
||||||
|
example = [ 53 ];
|
||||||
|
description = ''
|
||||||
|
List of custom UDP ports to open in the firewall.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
networking.useDHCP = mkDefault true;
|
||||||
|
networking.firewall.enable = true;
|
||||||
|
networking.firewall.allowedTCPPorts = config.extraAllowedTCPPorts;
|
||||||
|
networking.firewall.allowedUDPPorts = config.extraAllowedUDPPorts;
|
||||||
|
};
|
||||||
|
}
|
26
modules/common/nix.nix
Normal file
26
modules/common/nix.nix
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{ pkgs, lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.allowUnfreePackages = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = ''
|
||||||
|
Whether the system can use unfree derivations.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
nix = {
|
||||||
|
settings.sandbox = true;
|
||||||
|
|
||||||
|
package = pkgs.nixVersions.stable;
|
||||||
|
|
||||||
|
extraOptions = ''
|
||||||
|
experimental-features = nix-command flakes
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.config.allowUnfree = config.allowUnfreePackages;
|
||||||
|
};
|
||||||
|
}
|
50
modules/common/users.nix
Normal file
50
modules/common/users.nix
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
userModule = types.submodule {
|
||||||
|
options = {
|
||||||
|
description = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
|
||||||
|
groups = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
};
|
||||||
|
|
||||||
|
uid = mkOption {
|
||||||
|
type = types.nullOr types.int;
|
||||||
|
};
|
||||||
|
|
||||||
|
shell = mkOption {
|
||||||
|
type = types.package;
|
||||||
|
};
|
||||||
|
|
||||||
|
enableHomeManagerProfile = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
homeManagerConfig = mkOption {
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.machineUsers = mkOption {
|
||||||
|
type = types.attrsOf userModule;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
users.users = builtins.mapAttrs
|
||||||
|
(name: value: {
|
||||||
|
isNormalUser = true;
|
||||||
|
home = "/home/${name}";
|
||||||
|
description = value.description;
|
||||||
|
extraGroups = value.groups;
|
||||||
|
shell = value.shell;
|
||||||
|
uid = mkIf (value.uid != null) value.uid;
|
||||||
|
})
|
||||||
|
config.machineUsers;
|
||||||
|
};
|
||||||
|
}
|
3
modules/server/default.nix
Normal file
3
modules/server/default.nix
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
{ }
|
19
modules/workstation/bluetooth.nix
Normal file
19
modules/workstation/bluetooth.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.enableBluetooth = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
description = ''
|
||||||
|
Enable the bluetooth stack
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf config.enableBluetooth {
|
||||||
|
hardware.bluetooth = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
services.blueman.enable = true;
|
||||||
|
};
|
||||||
|
}
|
50
modules/workstation/default.nix
Normal file
50
modules/workstation/default.nix
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{ lib, config, pkgs, machineInfos, sopsHmModule, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
./sound.nix
|
||||||
|
./desktop.nix
|
||||||
|
./bluetooth.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.enableHomeManager = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
description = ''
|
||||||
|
Whether to install and use home-manager on this machine.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
enableHomeManager = machineInfos.enableHomeManager;
|
||||||
|
|
||||||
|
home-manager.useGlobalPkgs = mkIf config.enableHomeManager true;
|
||||||
|
home-manager.useUserPackages = mkIf config.enableHomeManager true;
|
||||||
|
home-manager.sharedModules = mkIf config.enableHomeManager [
|
||||||
|
./home-manager
|
||||||
|
sopsHmModule
|
||||||
|
];
|
||||||
|
home-manager.users = builtins.mapAttrs
|
||||||
|
(name: value:
|
||||||
|
mkIf value.enableHomeManagerProfile ({
|
||||||
|
home.username = name;
|
||||||
|
home.homeDirectory = "/home/${name}";
|
||||||
|
home.stateVersion = machineInfos.stateVersion;
|
||||||
|
programs.home-manager.enable = true;
|
||||||
|
enableFishShell = value.shell == pkgs.fish;
|
||||||
|
isProfessional = config.isProfessional;
|
||||||
|
} // value.homeManagerConfig)
|
||||||
|
)
|
||||||
|
config.machineUsers;
|
||||||
|
|
||||||
|
programs.dconf.enable = true;
|
||||||
|
security.polkit.enable = true;
|
||||||
|
services.dbus.enable = true;
|
||||||
|
|
||||||
|
fonts.fontconfig.enable = true;
|
||||||
|
|
||||||
|
services.gnome.gnome-keyring.enable = true;
|
||||||
|
};
|
||||||
|
}
|
17
modules/workstation/desktop.nix
Normal file
17
modules/workstation/desktop.nix
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
usersHasSway = builtins.any
|
||||||
|
(user:
|
||||||
|
config.home-manager.users.${user}.desktop.enableSwayStack
|
||||||
|
)
|
||||||
|
(builtins.attrNames config.machineUsers);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.sway.enable = usersHasSway;
|
||||||
|
xdg.portal = mkIf usersHasSway {
|
||||||
|
enable = true;
|
||||||
|
wlr.enable = true;
|
||||||
|
extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
|
||||||
|
};
|
||||||
|
}
|
38
modules/workstation/home-manager/communication.nix
Normal file
38
modules/workstation/home-manager/communication.nix
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
{ lib, pkgs, config, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
communication.discord.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = !config.isProfessional;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
communication.slack.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = config.isProfessional;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
communication.weechat.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
communication.matrix.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = !config.isProfessional;
|
||||||
|
example = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.home.packages = with pkgs; [
|
||||||
|
(mkIf config.communication.discord.enable (discord.override {
|
||||||
|
nss = nss_latest;
|
||||||
|
}))
|
||||||
|
(mkIf config.communication.slack.enable slack)
|
||||||
|
(mkIf config.communication.weechat.enable weechat)
|
||||||
|
(mkIf config.communication.matrix.enable element)
|
||||||
|
];
|
||||||
|
}
|
73
modules/workstation/home-manager/default.nix
Normal file
73
modules/workstation/home-manager/default.nix
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
{ pkgs, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
multimediaPackages = with pkgs; [
|
||||||
|
qpwgraph
|
||||||
|
feh
|
||||||
|
gimp
|
||||||
|
vlc
|
||||||
|
];
|
||||||
|
|
||||||
|
soundPackages = with pkgs; [
|
||||||
|
pulseaudio
|
||||||
|
pavucontrol
|
||||||
|
pamixer
|
||||||
|
];
|
||||||
|
|
||||||
|
yubikeyTools = with pkgs; [
|
||||||
|
yubikey-personalization
|
||||||
|
yubico-pam
|
||||||
|
yubikey-manager
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./desktop
|
||||||
|
./development
|
||||||
|
./neovim
|
||||||
|
./fish.nix
|
||||||
|
./termux.nix
|
||||||
|
./gpg.nix
|
||||||
|
./communication.nix
|
||||||
|
./mail.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.isProfessional = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
|
||||||
|
fonts.fontconfig.enable = true;
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
htop
|
||||||
|
firefox
|
||||||
|
autojump
|
||||||
|
nextcloud-client
|
||||||
|
keepassxc
|
||||||
|
ranger
|
||||||
|
libreoffice
|
||||||
|
tldr
|
||||||
|
zathura
|
||||||
|
lazygit
|
||||||
|
] ++ multimediaPackages
|
||||||
|
++ soundPackages
|
||||||
|
++ yubikeyTools;
|
||||||
|
|
||||||
|
# XDG-Mime configuration
|
||||||
|
xdg.mime.enable = true;
|
||||||
|
xdg.mimeApps.enable = true;
|
||||||
|
xdg.mimeApps.associations.added = {
|
||||||
|
"x-scheme-handler/https" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/http" = "firefox.desktop";
|
||||||
|
};
|
||||||
|
xdg.mimeApps.defaultApplications = {
|
||||||
|
"x-scheme-handler/https" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/http" = "firefox.desktop";
|
||||||
|
"text/html" = "firefox.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
88
modules/workstation/home-manager/desktop/alacritty.nix
Normal file
88
modules/workstation/home-manager/desktop/alacritty.nix
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
tmuxFix = {
|
||||||
|
env = {
|
||||||
|
TERM = "xterm-256color";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.alacritty = mkIf config.desktop.enableSwayStack {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
font = {
|
||||||
|
normal = {
|
||||||
|
family = "JetBrainsMono Nerd Font Mono";
|
||||||
|
style = "Regular";
|
||||||
|
};
|
||||||
|
size = 10.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
colors = {
|
||||||
|
primary = {
|
||||||
|
background = "#2e3440";
|
||||||
|
foreground = "#d8dee9";
|
||||||
|
dim_foreground = "#a5abb6";
|
||||||
|
};
|
||||||
|
cursor = {
|
||||||
|
text = "#2e3440";
|
||||||
|
cursor = "#d8dee9";
|
||||||
|
};
|
||||||
|
vi_mode_cursor = {
|
||||||
|
text = "#2e3440";
|
||||||
|
cursor = "#d8dee9";
|
||||||
|
};
|
||||||
|
selection = {
|
||||||
|
text = "CellForeground";
|
||||||
|
background = "#4c566a";
|
||||||
|
};
|
||||||
|
search = {
|
||||||
|
matches = {
|
||||||
|
foreground = "CellBackground";
|
||||||
|
background = "#88c0d0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
footer_bar = {
|
||||||
|
background = "#434c5e";
|
||||||
|
foreground = "#d8dee9";
|
||||||
|
};
|
||||||
|
normal = {
|
||||||
|
black = "#3b4252";
|
||||||
|
red = "#bf616a";
|
||||||
|
green = "#a3be8c";
|
||||||
|
yellow = "#ebcb8b";
|
||||||
|
blue = "#81a1c1";
|
||||||
|
magenta = "#b48ead";
|
||||||
|
cyan = "#88c0d0";
|
||||||
|
white = "#e5e9f0";
|
||||||
|
};
|
||||||
|
bright = {
|
||||||
|
black = "#4c566a";
|
||||||
|
red = "#bf616a";
|
||||||
|
green = "#a3be8c";
|
||||||
|
yellow = "#ebcb8b";
|
||||||
|
blue = "#81a1c1";
|
||||||
|
magenta = "#b48ead";
|
||||||
|
cyan = "#8fbcbb";
|
||||||
|
white = "#eceff4";
|
||||||
|
};
|
||||||
|
dim = {
|
||||||
|
black = "#373e4d";
|
||||||
|
red = "#94545d";
|
||||||
|
green = "#809575";
|
||||||
|
yellow = "#b29e75";
|
||||||
|
blue = "#68809a";
|
||||||
|
magenta = "#8c738c";
|
||||||
|
cyan = "#6d96a5";
|
||||||
|
white = "#aeb3bb";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
window = {
|
||||||
|
opacity = 1;
|
||||||
|
};
|
||||||
|
} // tmuxFix;
|
||||||
|
};
|
||||||
|
}
|
52
modules/workstation/home-manager/desktop/default.nix
Normal file
52
modules/workstation/home-manager/desktop/default.nix
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
{ lib, config, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
desktopPackages = with pkgs; [
|
||||||
|
xwayland
|
||||||
|
grim
|
||||||
|
slurp
|
||||||
|
wl-clipboard
|
||||||
|
clipman
|
||||||
|
wf-recorder
|
||||||
|
(nerdfonts.override { fonts = [ "JetBrainsMono" ]; })
|
||||||
|
qt5ct
|
||||||
|
libsForQt5.qtstyleplugin-kvantum
|
||||||
|
font-awesome
|
||||||
|
nordzy-cursor-theme
|
||||||
|
jetbrains-mono
|
||||||
|
xdg-utils
|
||||||
|
libnotify
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./sway.nix
|
||||||
|
./alacritty.nix
|
||||||
|
./swaylock.nix
|
||||||
|
./waybar.nix
|
||||||
|
./wofi.nix
|
||||||
|
./mako.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.desktop.enableSwayStack = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf config.desktop.enableSwayStack {
|
||||||
|
home.packages = desktopPackages;
|
||||||
|
|
||||||
|
# Theming GTK
|
||||||
|
gtk = {
|
||||||
|
enable = true;
|
||||||
|
theme = {
|
||||||
|
name = "Nordic-darker";
|
||||||
|
package = pkgs.nordic;
|
||||||
|
};
|
||||||
|
cursorTheme = {
|
||||||
|
name = "Nordzy-cursors";
|
||||||
|
package = pkgs.nordzy-cursor-theme;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
29
modules/workstation/home-manager/desktop/mako.nix
Normal file
29
modules/workstation/home-manager/desktop/mako.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
services.mako = mkIf config.desktop.enableSwayStack {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
layer = "overlay";
|
||||||
|
anchor = "top-right";
|
||||||
|
font = "JetBrainsMono Nerd Font 10";
|
||||||
|
backgroundColor = "#3b4252";
|
||||||
|
textColor = "#d8dee9";
|
||||||
|
width = 330;
|
||||||
|
height = 100;
|
||||||
|
borderRadius = 2;
|
||||||
|
defaultTimeout = 15000;
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
[urgency=low]
|
||||||
|
border-color=#434c5e
|
||||||
|
|
||||||
|
[urgency=normal]
|
||||||
|
border-color=#4c566a
|
||||||
|
|
||||||
|
[urgency=high]
|
||||||
|
default-timeout=0
|
||||||
|
border-color=#bf616a
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
245
modules/workstation/home-manager/desktop/sway.nix
Normal file
245
modules/workstation/home-manager/desktop/sway.nix
Normal file
|
@ -0,0 +1,245 @@
|
||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
gnomeSchema = "org.gnome.desktop.interface";
|
||||||
|
monitorModule = types.submodule {
|
||||||
|
options = {
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
resolution = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
position = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
defaultWorkspace = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
desktop.monitors = mkOption {
|
||||||
|
type = types.listOf monitorModule;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.wayland.windowManager.sway = mkIf config.desktop.enableSwayStack {
|
||||||
|
enable = true;
|
||||||
|
#systemd.enable = false;
|
||||||
|
|
||||||
|
config = rec {
|
||||||
|
modifier = "Mod4";
|
||||||
|
|
||||||
|
left = "left";
|
||||||
|
right = "right";
|
||||||
|
up = "up";
|
||||||
|
down = "down";
|
||||||
|
|
||||||
|
terminal = "${pkgs.alacritty}/bin/alacritty";
|
||||||
|
menu = "${pkgs.wofi}/bin/wofi --show drun,run";
|
||||||
|
|
||||||
|
fonts = {
|
||||||
|
names = [ "pango:JetBrainsMono Nerd Font Mono" ];
|
||||||
|
size = 11.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
input = {
|
||||||
|
"*" = {
|
||||||
|
xkb_layout = "fr";
|
||||||
|
# xkb_options = "compose:ralt";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
seat = {
|
||||||
|
"seat0" = {
|
||||||
|
"xcursor_theme" = "Nordzy-cursors";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
output = builtins.listToAttrs
|
||||||
|
(builtins.map
|
||||||
|
(monitor: {
|
||||||
|
name = monitor.name;
|
||||||
|
value = {
|
||||||
|
resolution = monitor.resolution;
|
||||||
|
position = monitor.position;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
config.desktop.monitors) // {
|
||||||
|
"*".bg = "/home/dala/Perso/wallpapers/tanuki.jpg fill";
|
||||||
|
};
|
||||||
|
workspaceOutputAssign = map
|
||||||
|
(monitor: {
|
||||||
|
output = monitor.name;
|
||||||
|
workspace = builtins.toString monitor.defaultWorkspace;
|
||||||
|
})
|
||||||
|
config.desktop.monitors;
|
||||||
|
startup = [
|
||||||
|
{
|
||||||
|
command = ''
|
||||||
|
${pkgs.swayidle}/bin/swayidle -w \
|
||||||
|
timeout 1200 '${pkgs.swaylock}/bin/swaylock -f' \
|
||||||
|
timeout 1800 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \
|
||||||
|
before-sleep '${pkgs.swaylock}/bin/swaylock -f'
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{ command = "${pkgs.nextcloud-client}/bin/nextcloud --background"; }
|
||||||
|
{ command = "${pkgs.keepassxc}/bin/keepassxc"; }
|
||||||
|
{
|
||||||
|
command = ''
|
||||||
|
${pkgs.wl-clipboard}/bin/wl-paste -t text --watch ${pkgs.clipman}/bin/clipman store --no-persist
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
command = "${pkgs.glib}/bin/gsettings set ${gnomeSchema} gtk-theme 'Nordic'";
|
||||||
|
always = true;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
command = "${pkgs.glib}/bin/gsettings set ${gnomeSchema} cursor-theme 'Nordzy-cursors'";
|
||||||
|
always = true;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
command = "${pkgs.glib}/bin/gsettings set ${gnomeSchema} font-name 'JetBrainsMono Nerd Font Mono'";
|
||||||
|
always = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
modes = {
|
||||||
|
resize = {
|
||||||
|
"Left" = "resize shrink width 10px";
|
||||||
|
"Down" = "resize grow height 10px";
|
||||||
|
"Up" = "resize shrink height 10px";
|
||||||
|
"Right" = "resize grow width 10px";
|
||||||
|
|
||||||
|
"Return" = "mode default";
|
||||||
|
"Escape" = "mode default";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gaps = {
|
||||||
|
inner = 5;
|
||||||
|
smartGaps = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
floating = {
|
||||||
|
modifier = "${modifier} normal";
|
||||||
|
};
|
||||||
|
|
||||||
|
bars = [{
|
||||||
|
command = "${pkgs.waybar}/bin/waybar";
|
||||||
|
}];
|
||||||
|
|
||||||
|
keybindings = {
|
||||||
|
"${modifier}+Return" = "exec ${terminal}";
|
||||||
|
"${modifier}+Shift+q" = "kill";
|
||||||
|
"${modifier}+d" = "exec ${menu}";
|
||||||
|
"${modifier}+Shift+r" = "reload";
|
||||||
|
"${modifier}+Shift+e" = "exec swaymsg exit";
|
||||||
|
"${modifier}+Shift+l" = "exec swaylock -f";
|
||||||
|
|
||||||
|
"${modifier}+Left" = "focus left";
|
||||||
|
"${modifier}+Down" = "focus down";
|
||||||
|
"${modifier}+Up" = "focus up";
|
||||||
|
"${modifier}+Right" = "focus right";
|
||||||
|
|
||||||
|
"${modifier}+Shift+Left" = "move left";
|
||||||
|
"${modifier}+Shift+Down" = "move down";
|
||||||
|
"${modifier}+Shift+Up" = "move up";
|
||||||
|
"${modifier}+Shift+Right" = "move right";
|
||||||
|
|
||||||
|
"${modifier}+1" = "workspace 1";
|
||||||
|
"${modifier}+2" = "workspace 2";
|
||||||
|
"${modifier}+3" = "workspace 3";
|
||||||
|
"${modifier}+4" = "workspace 4";
|
||||||
|
"${modifier}+5" = "workspace 5";
|
||||||
|
"${modifier}+6" = "workspace 6";
|
||||||
|
"${modifier}+7" = "workspace 7";
|
||||||
|
"${modifier}+8" = "workspace 8";
|
||||||
|
"${modifier}+9" = "workspace 9";
|
||||||
|
"${modifier}+0" = "workspace 10";
|
||||||
|
|
||||||
|
"${modifier}+ampersand" = "workspace 1";
|
||||||
|
"${modifier}+eacute" = "workspace 2";
|
||||||
|
"${modifier}+quotedbl" = "workspace 3";
|
||||||
|
"${modifier}+apostrophe" = "workspace 4";
|
||||||
|
"${modifier}+parenleft" = "workspace 5";
|
||||||
|
"${modifier}+minus" = "workspace 6";
|
||||||
|
"${modifier}+egrave" = "workspace 7";
|
||||||
|
"${modifier}+underscore" = "workspace 8";
|
||||||
|
"${modifier}+ccedilla" = "workspace 9";
|
||||||
|
"${modifier}+agrave" = "workspace 10";
|
||||||
|
|
||||||
|
"${modifier}+Shift+1" = "move container to workspace 1";
|
||||||
|
"${modifier}+Shift+2" = "move container to workspace 2";
|
||||||
|
"${modifier}+Shift+3" = "move container to workspace 3";
|
||||||
|
"${modifier}+Shift+4" = "move container to workspace 4";
|
||||||
|
"${modifier}+Shift+5" = "move container to workspace 5";
|
||||||
|
"${modifier}+Shift+6" = "move container to workspace 6";
|
||||||
|
"${modifier}+Shift+7" = "move container to workspace 7";
|
||||||
|
"${modifier}+Shift+8" = "move container to workspace 8";
|
||||||
|
"${modifier}+Shift+9" = "move container to workspace 9";
|
||||||
|
"${modifier}+Shift+0" = "move container to workspace 10";
|
||||||
|
|
||||||
|
"${modifier}+Shift+ampersand" = "move container to workspace 1";
|
||||||
|
"${modifier}+Shift+eacute" = "move container to workspace 2";
|
||||||
|
"${modifier}+Shift+quotedbl" = "move container to workspace 3";
|
||||||
|
"${modifier}+Shift+apostrophe" = "move container to workspace 4";
|
||||||
|
"${modifier}+Shift+parenleft" = "move container to workspace 5";
|
||||||
|
"${modifier}+Shift+minus" = "move container to workspace 6";
|
||||||
|
"${modifier}+Shift+egrave" = "move container to workspace 7";
|
||||||
|
"${modifier}+Shift+underscore" = "move container to workspace 8";
|
||||||
|
"${modifier}+Shift+ccedilla" = "move container to workspace 9";
|
||||||
|
"${modifier}+Shift+agrave" = "move container to workspace 10";
|
||||||
|
|
||||||
|
"${modifier}+h" = "splith";
|
||||||
|
"${modifier}+v" = "splitv";
|
||||||
|
|
||||||
|
"${modifier}+s" = "layout stacking";
|
||||||
|
"${modifier}+w" = "layout tabbed";
|
||||||
|
"${modifier}+e" = "layout toggle split";
|
||||||
|
|
||||||
|
"${modifier}+f" = "fullscreen";
|
||||||
|
"${modifier}+Shift+space" = "floating toggle";
|
||||||
|
"${modifier}+space" = "focus mode_toggle";
|
||||||
|
"${modifier}+a" = "focus parent";
|
||||||
|
|
||||||
|
"${modifier}+Shift+parenright" = "move scratchpad";
|
||||||
|
|
||||||
|
"${modifier}+parenright" = "scratchpad show";
|
||||||
|
|
||||||
|
"${modifier}+r" = "mode resize";
|
||||||
|
|
||||||
|
"XF86AudioRaiseVolume" = "exec --no-startup-id pactl set-sink-volume 0 +5%"; #increase sound volume
|
||||||
|
"XF86AudioLowerVolume" = "exec --no-startup-id pactl set-sink-volume 0 -5%"; #decrease sound volume
|
||||||
|
"XF86AudioMute" = "exec --no-startup-id pactl set-sink-mute 0 toggle"; # mute sound
|
||||||
|
|
||||||
|
"XF86MonBrightnessUp" = "exec --no-startup-id light -A 10";
|
||||||
|
"XF86MonBrightnessDown" = "exec --no-startup-id light -U 10";
|
||||||
|
|
||||||
|
"Control+XF86AudioMute" = "exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle";
|
||||||
|
|
||||||
|
"Print" = "exec grim -g \"$(${pkgs.slurp}/bin/slurp)\" -t png - | wl-copy --type image/png";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
default_border pixel
|
||||||
|
for_window [class=".*"] inhibit_idle fullscreen
|
||||||
|
for_window [app_id=".*"] inhibit_idle fullscreen
|
||||||
|
'';
|
||||||
|
|
||||||
|
extraSessionCommands = ''
|
||||||
|
export WLR_NO_HARDWARE_CURSORS=1
|
||||||
|
export XDG_CURRENT_DESKTOP=sway
|
||||||
|
export _JAVA_AWT_WM_NONREPARENTING=1
|
||||||
|
export NIXOS_OZONE_WL=1
|
||||||
|
export QT_QPA_PLATFORM=wayland
|
||||||
|
export QT_QPA_PLATFORMTHEME=qt5ct
|
||||||
|
export QT_WAYLAND_DISABLE_WINDOWDECORATION=1
|
||||||
|
export MOZ_ENABLE_WAYLAND=1
|
||||||
|
export SDL_VIDEODRIVER=wayland
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
52
modules/workstation/home-manager/desktop/swaylock.nix
Normal file
52
modules/workstation/home-manager/desktop/swaylock.nix
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
programs.swaylock = mkIf config.desktop.enableSwayStack {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
scaling = "fill";
|
||||||
|
font = "JetBrainsMono";
|
||||||
|
font-size = 20;
|
||||||
|
show-keyboard-layout = true;
|
||||||
|
disable-caps-lock-text = true;
|
||||||
|
indicator-caps-lock = true;
|
||||||
|
ignore-empty-password = true;
|
||||||
|
show-failed-attempts = true;
|
||||||
|
line-uses-inside = true;
|
||||||
|
|
||||||
|
indicator-radius = 70;
|
||||||
|
indicator-thickness = 15;
|
||||||
|
|
||||||
|
color = "#00000000";
|
||||||
|
inside-color = "#2e3440a0";
|
||||||
|
inside-ver-color = "#4c566aa0";
|
||||||
|
inside-wrong-color = "#bf616aa0";
|
||||||
|
inside-clear-color = "#434c5ea0";
|
||||||
|
inside-caps-lock-color = "#d08770a0";
|
||||||
|
|
||||||
|
text-color = "#d8dee9d0";
|
||||||
|
text-clear-color = "#d8dee9d0";
|
||||||
|
text-ver-color = "#d8dee9d0";
|
||||||
|
text-wrong-color = "#d8dee9d0";
|
||||||
|
layout-bg-color = "#00000000";
|
||||||
|
layout-text-color = "#d8dee9d0";
|
||||||
|
|
||||||
|
line-color = "#2e3440e0";
|
||||||
|
line-clear-color = "#2e3440e0";
|
||||||
|
line-caps-lock-color = "#2e3440e0";
|
||||||
|
line-ver-color = "#2e3440e0";
|
||||||
|
line-wrong-color = "#2e3440e0";
|
||||||
|
separator-color = "#2e3440e0";
|
||||||
|
|
||||||
|
ring-color = "#5e81acf0";
|
||||||
|
ring-clear-color = "#5e81aca0";
|
||||||
|
ring-caps-lock-color = "#bf616af0";
|
||||||
|
ring-ver-color = "#81a1c1f0";
|
||||||
|
ring-wrong-color = "#d08770f0";
|
||||||
|
|
||||||
|
bs-hl-color = "#d08770a0";
|
||||||
|
key-hl-color = "#81a1c1a0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
275
modules/workstation/home-manager/desktop/waybar.nix
Normal file
275
modules/workstation/home-manager/desktop/waybar.nix
Normal file
|
@ -0,0 +1,275 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
programs.waybar = mkIf config.desktop.enableSwayStack {
|
||||||
|
enable = true;
|
||||||
|
#systemd.enable = false;
|
||||||
|
|
||||||
|
settings = [{
|
||||||
|
layer = "top";
|
||||||
|
position = "top";
|
||||||
|
height = 30;
|
||||||
|
|
||||||
|
modules-left = [
|
||||||
|
"sway/workspaces"
|
||||||
|
"sway/mode"
|
||||||
|
];
|
||||||
|
|
||||||
|
modules-center = [
|
||||||
|
"sway/window"
|
||||||
|
];
|
||||||
|
|
||||||
|
modules-right = [
|
||||||
|
"memory"
|
||||||
|
"cpu"
|
||||||
|
"pulseaudio"
|
||||||
|
"network"
|
||||||
|
"battery"
|
||||||
|
"tray"
|
||||||
|
"sway/language"
|
||||||
|
"clock"
|
||||||
|
];
|
||||||
|
|
||||||
|
"sway/workspaces" = {
|
||||||
|
"disable-scroll" = true;
|
||||||
|
"all-outputs" = false;
|
||||||
|
"format" = "{icon}";
|
||||||
|
"format-icons" = {
|
||||||
|
"1:term" = "";
|
||||||
|
"2:web" = "";
|
||||||
|
"3:email" = "";
|
||||||
|
"4:im" = "";
|
||||||
|
"5:dev" = "";
|
||||||
|
"6:music" = "";
|
||||||
|
"7:graph" = "";
|
||||||
|
"8:any" = "";
|
||||||
|
"9:any" = "";
|
||||||
|
"10:aux" = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"tray" = {
|
||||||
|
"icon-size" = 18;
|
||||||
|
"spacing" = 12;
|
||||||
|
};
|
||||||
|
|
||||||
|
"memory" = {
|
||||||
|
"format" = "{percentage:3}% <big></big>";
|
||||||
|
"states" = {
|
||||||
|
"warning" = 70;
|
||||||
|
"critical" = 90;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"cpu" = {
|
||||||
|
"format" = "{usage:3}% <big></big>";
|
||||||
|
"states" = {
|
||||||
|
"warning" = 70;
|
||||||
|
"critical" = 90;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"pulseaudio" = {
|
||||||
|
"format" = "{volume:3}% <big>{icon}</big>";
|
||||||
|
"format-bluetooth" = "<big>{icon}</big>";
|
||||||
|
"format-muted" = "<big><\big>";
|
||||||
|
"format-icons" = {
|
||||||
|
"headphone" = "";
|
||||||
|
"hands-free" = "";
|
||||||
|
"headset" = "";
|
||||||
|
"phone" = "";
|
||||||
|
"portable" = "";
|
||||||
|
"car" = "";
|
||||||
|
"default" = [ "" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"on-click" = "pavucontrol";
|
||||||
|
"on-scroll-up" = "pamixer -ui 2 && pamixer --get-volume > $SWAYSOCK.wob";
|
||||||
|
"on-scroll-down" = "pamixer -ud 2 && pamixer --get-volume > $SWAYSOCK.wob";
|
||||||
|
};
|
||||||
|
|
||||||
|
"network" = {
|
||||||
|
"format-wifi" = "{essid} <big></big>";
|
||||||
|
"format-ethernet" = "<big></big>";
|
||||||
|
"format-disconnected" = "<big></big>";
|
||||||
|
"format-linked" = "<big>ﯳ</big>";
|
||||||
|
"format-alt" = "{ifname}: {ipaddr}/{cidr}";
|
||||||
|
"tooltip-format-ethernet" = "<big></big> {bandwidthDownBits} <big></big> {bandwidthUpBits}";
|
||||||
|
"tooltip-format-wifi" = "<big></big>{bandwidthDownBits} <big></big> {bandwidthUpBits}";
|
||||||
|
};
|
||||||
|
|
||||||
|
"battery" = {
|
||||||
|
"states" = {
|
||||||
|
"5pct" = 5;
|
||||||
|
"10pct" = 10;
|
||||||
|
"20pct" = 20;
|
||||||
|
"30pct" = 30;
|
||||||
|
"40pct" = 40;
|
||||||
|
"50pct" = 50;
|
||||||
|
"60pct" = 60;
|
||||||
|
"70pct" = 70;
|
||||||
|
"80pct" = 80;
|
||||||
|
"90pct" = 90;
|
||||||
|
"full" = 100;
|
||||||
|
};
|
||||||
|
|
||||||
|
"format" = "{capacity:3}% <big>{icon}</big>";
|
||||||
|
"format-icons" = {
|
||||||
|
"5pct" = "";
|
||||||
|
"10pct" = "";
|
||||||
|
"20pct" = "";
|
||||||
|
"30pct" = "";
|
||||||
|
"40pct" = "";
|
||||||
|
"50pct" = "";
|
||||||
|
"60pct" = "";
|
||||||
|
"70pct" = "";
|
||||||
|
"80pct" = "";
|
||||||
|
"90pct" = "";
|
||||||
|
"full" = "";
|
||||||
|
};
|
||||||
|
"on-click" = "notify-send -u low -t 3000 'Battery Status' \"$(acpi)\"";
|
||||||
|
};
|
||||||
|
|
||||||
|
"clock" = {
|
||||||
|
"format-alt" = "{:%A, %B %d}";
|
||||||
|
"tooltip-format" = "<big>{:%Y %B}</big>\n<tt>{calendar}</tt>";
|
||||||
|
};
|
||||||
|
}];
|
||||||
|
|
||||||
|
style = ''
|
||||||
|
@keyframes blink-warning {
|
||||||
|
to {
|
||||||
|
background-color: #bf616a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes blink-critical {
|
||||||
|
to {
|
||||||
|
color: #2e3440;
|
||||||
|
background-color: #bf616a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
font-family: JetBrainsMono, JetBrainsMono Nerd Font Mono, monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
min-height: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
window#waybar {
|
||||||
|
background-color: #3b4252;
|
||||||
|
color: #e5e9f0;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
#window {
|
||||||
|
font-family: JetBrainsMono, JetBrainsMono Nerd Font Mono, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces {
|
||||||
|
background-color: #4c566a;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button {
|
||||||
|
padding: 3px 9px 0px 9px;
|
||||||
|
background: transparent;
|
||||||
|
color: #e5e9f0;
|
||||||
|
border-bottom: 3px solid transparent;
|
||||||
|
font-weight: 900;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.focused {
|
||||||
|
background-color: #434c5e;
|
||||||
|
color: #eceff4;
|
||||||
|
border-bottom: 3px solid #ebcb8b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button:hover {
|
||||||
|
background-color: #5e81ac;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mode {
|
||||||
|
padding: 0px 9px;
|
||||||
|
background-color: #a3be8c;
|
||||||
|
color: #3b4252;
|
||||||
|
font-family: JetBrains Mono, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#clock, #language, #pulseaudio, #tray, #memory, #cpu, #battery, #network {
|
||||||
|
padding: 0px 8px;
|
||||||
|
color: #d8dee9;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#clock {
|
||||||
|
background-color: #4c566a;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#language {
|
||||||
|
color: #d8dee9;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio {
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio.muted {
|
||||||
|
color: #d08770;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tray {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu {
|
||||||
|
padding-left: 0px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu.warning {
|
||||||
|
color: #ebcb8b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu.critical {
|
||||||
|
color: #d08770;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory {
|
||||||
|
padding-left: 0px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory.warning {
|
||||||
|
color: #ebcb8b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory.critical {
|
||||||
|
color: #d08770;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery {
|
||||||
|
font-size: 14px;
|
||||||
|
animation-timing-function: ease-in-out;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
animation-direction: alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.20pct.discharging {
|
||||||
|
animation-name: blink-warning;
|
||||||
|
animation-duration: 3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.10pct.discharging {
|
||||||
|
animation-name: blink-critical;
|
||||||
|
animation-duration: 2s;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
74
modules/workstation/home-manager/desktop/wofi.nix
Normal file
74
modules/workstation/home-manager/desktop/wofi.nix
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
programs.wofi = mkIf config.desktop.enableSwayStack {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
allow_images = true;
|
||||||
|
allow_markup = true;
|
||||||
|
insensitive = true;
|
||||||
|
hide_scroll = true;
|
||||||
|
no_actions = false;
|
||||||
|
term = "${pkgs.alacritty}/bin/alacritty";
|
||||||
|
width = "35%";
|
||||||
|
lines = 8;
|
||||||
|
always_parse_args = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
style = ''
|
||||||
|
#window {
|
||||||
|
background-color: transparent;
|
||||||
|
border-radius: 15px;
|
||||||
|
font-family: sans-serif;
|
||||||
|
animation: fadeIn;
|
||||||
|
animation-duration: 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from { opacity: 0; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#outer-box {
|
||||||
|
margin: 15px;
|
||||||
|
border-radius: 15px;
|
||||||
|
background-color: #3b4252;
|
||||||
|
box-shadow: 0px 0px 5px 0 #0F0F0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
#inner-box {
|
||||||
|
color: #d8dee9;
|
||||||
|
padding: 10px;
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#input {
|
||||||
|
color: #e5e9f0;
|
||||||
|
border: 2px solid #5e81ac;
|
||||||
|
background-color: #4c566a;
|
||||||
|
padding: 6px;
|
||||||
|
margin: 15px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
font-size: 16px;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry {
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 7px;
|
||||||
|
margin: 0px 5px 0px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#text {
|
||||||
|
font-size: 16px;
|
||||||
|
padding: 7px;
|
||||||
|
color: #d8dee9;
|
||||||
|
}
|
||||||
|
|
||||||
|
#img {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
35
modules/workstation/home-manager/development/default.nix
Normal file
35
modules/workstation/home-manager/development/default.nix
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./embedded.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.development.enableGit = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
description = ''
|
||||||
|
Enable git and its configuration.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config.programs.git = mkIf config.development.enableGit {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.gitAndTools.gitFull;
|
||||||
|
userName = "Victor Mignot";
|
||||||
|
userEmail = "dala@dalaran.fr";
|
||||||
|
signing = mkIf config.enableGPGKeyring {
|
||||||
|
key = "BEAFED3D";
|
||||||
|
signByDefault = true;
|
||||||
|
};
|
||||||
|
extraConfig = {
|
||||||
|
init = {
|
||||||
|
defaultBranch = "main";
|
||||||
|
};
|
||||||
|
core = {
|
||||||
|
editor = "${pkgs.neovim}/bin/nvim";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
22
modules/workstation/home-manager/development/embedded.nix
Normal file
22
modules/workstation/home-manager/development/embedded.nix
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{ lib, config, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.development.embedded.enableTools = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = ''
|
||||||
|
Enable embedded tools.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
options.development.embedded.toolsList = mkOption {
|
||||||
|
type = types.listOf types.package;
|
||||||
|
default = with pkgs; [
|
||||||
|
qemu
|
||||||
|
minicom
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
config.home.packages = lib.mkIf config.development.embedded.enableTools config.development.embedded.toolsList;
|
||||||
|
}
|
31
modules/workstation/home-manager/fish.nix
Normal file
31
modules/workstation/home-manager/fish.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{ lib, pkgs, config, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.enableFishShell = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
config.programs.fish = mkIf config.enableFishShell {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
plugins = [
|
||||||
|
{
|
||||||
|
name = "bobthefish";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "oh-my-fish";
|
||||||
|
repo = "theme-bobthefish";
|
||||||
|
rev = "c2c47dc964a257131b3df2a127c2631b4760f3ec";
|
||||||
|
sha256 = "sha256-LB4g+EA3C7OxTuHfcxfgl8IVBe5NufFc+5z9VcS0Bt0=";
|
||||||
|
fetchSubmodules = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
shellInit = ''
|
||||||
|
set -g theme_color_scheme nord
|
||||||
|
if [ -z $DISPLAY ] && [ "$(tty)" = /dev/tty1 ]
|
||||||
|
exec ${pkgs.sway}/bin/sway
|
||||||
|
end
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
24
modules/workstation/home-manager/gpg.nix
Normal file
24
modules/workstation/home-manager/gpg.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.enableGPGKeyring = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
description = ''
|
||||||
|
Add GPG keyring and GPG Agent configuration.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf config.enableGPGKeyring {
|
||||||
|
programs.gpg.enable = true;
|
||||||
|
|
||||||
|
services.gpg-agent = {
|
||||||
|
enable = true;
|
||||||
|
enableScDaemon = true;
|
||||||
|
enableSshSupport = true;
|
||||||
|
sshKeys = [ "40DE2FEE4D3C5E2C" ];
|
||||||
|
pinentryFlavor = "curses";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
125
modules/workstation/home-manager/mail.nix
Normal file
125
modules/workstation/home-manager/mail.nix
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
{ lib, pkgs, config, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
mailAccountModule = types.submodule {
|
||||||
|
isPrimary = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
mailAddress = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
|
||||||
|
mailPasswdEval = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
|
||||||
|
imapHost = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
|
||||||
|
smtpHost = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultExtraMailboxes = [
|
||||||
|
"Archive"
|
||||||
|
"Receipts"
|
||||||
|
"Junk"
|
||||||
|
"Drafts"
|
||||||
|
"Sent"
|
||||||
|
"Trash"
|
||||||
|
];
|
||||||
|
|
||||||
|
signature = {
|
||||||
|
text = ''
|
||||||
|
Victor Mignot
|
||||||
|
'';
|
||||||
|
showSignature = "append";
|
||||||
|
};
|
||||||
|
|
||||||
|
hasNoAddress = config.communication.mailAccounts == null;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.communication.mailAccounts = mkOption {
|
||||||
|
type = types.nullOr (types.attrsOf mailAccountModule);
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (!hasNoAddress) {
|
||||||
|
|
||||||
|
accounts.email.accounts = builtins.mapAttrs
|
||||||
|
(name: value: {
|
||||||
|
primary = value.isPrimary;
|
||||||
|
address = value.mailAddress;
|
||||||
|
userName = value.mailAddress;
|
||||||
|
realName = "Victor Mignot";
|
||||||
|
imap.host = value.imapHost;
|
||||||
|
smtpHost = value.smtpHost;
|
||||||
|
passwordCommand = value.mailPasswdEval;
|
||||||
|
inherit signature;
|
||||||
|
|
||||||
|
mbsync = {
|
||||||
|
enable = true;
|
||||||
|
create = "both";
|
||||||
|
expunge = "both";
|
||||||
|
patterns = [ "*" ];
|
||||||
|
subFolders = "Verbatim";
|
||||||
|
};
|
||||||
|
|
||||||
|
msmtp.enable = true;
|
||||||
|
|
||||||
|
neomutt = {
|
||||||
|
enable = true;
|
||||||
|
mailboxName = "${name}/Inbox";
|
||||||
|
extraMailboxes = map
|
||||||
|
(mb: {
|
||||||
|
mailbox = mb;
|
||||||
|
name = "${name}/${mb}";
|
||||||
|
})
|
||||||
|
defaultExtraMailboxes;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
config.communication.mailAccounts;
|
||||||
|
|
||||||
|
services.mbsync.enable = true;
|
||||||
|
programs.mbsync.enable = true;
|
||||||
|
|
||||||
|
accounts.email.maildirBasePath = "Mail";
|
||||||
|
programs.neomutt = {
|
||||||
|
enable = true;
|
||||||
|
sidebar.enable = true;
|
||||||
|
checkStatsInterval = 30;
|
||||||
|
sort = "reverse-date";
|
||||||
|
extraConfig = ''
|
||||||
|
set edit_headers = yes
|
||||||
|
set use_from = yes
|
||||||
|
set send_charset = "utf-8"
|
||||||
|
|
||||||
|
color body brightwhite default ^[[:space:]].*
|
||||||
|
color body yellow default ^(diff).*
|
||||||
|
color body brightwhite default ^(\s).*
|
||||||
|
color body cyan default ^(Signed-off-by).*
|
||||||
|
color body cyan default ^(Docker-DCO-1.1-Signed-off-by).*
|
||||||
|
color body brightwhite default ^(Cc)
|
||||||
|
color body yellow default "^diff \-.*"
|
||||||
|
color body brightwhite default "^index [a-f0-9].*"
|
||||||
|
color body brightblue default "^---$"
|
||||||
|
color body white default "^\-\-\- .*"
|
||||||
|
color body white default "^[\+]{3} .*"
|
||||||
|
color body green default "^[\+][^\+]+.*"
|
||||||
|
color body red default "^\-[^\-]+.*"
|
||||||
|
color body brightblue default "^@@ .*"
|
||||||
|
color body green default "LGTM"
|
||||||
|
color body brightmagenta default "-- Commit Summary --"
|
||||||
|
color body brightmagenta default "-- File Changes --"
|
||||||
|
color body brightmagenta default "-- Patch Links --"
|
||||||
|
color body green default "^Merged #.*"
|
||||||
|
color body red default "^Closed #.*"
|
||||||
|
color body brightblue default "^Reply to this email.*"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
165
modules/workstation/home-manager/neovim/default.nix
Normal file
165
modules/workstation/home-manager/neovim/default.nix
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
{ lib, config, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.desktop.enableNeovim = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
description = ''
|
||||||
|
Whether to use Neovim and its config.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config.home.sessionVariables."EDITOR" = mkIf config.desktop.enableNeovim "${pkgs.neovim}/bin/nvim";
|
||||||
|
|
||||||
|
config.programs.neovim = mkIf config.desktop.enableNeovim {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
viAlias = true;
|
||||||
|
vimAlias = true;
|
||||||
|
vimdiffAlias = true;
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
luafile ${./luaconfig/settings.lua}
|
||||||
|
luafile ${./luaconfig/keybindings.lua}
|
||||||
|
luafile ${./luaconfig/lspconfig.lua}
|
||||||
|
'';
|
||||||
|
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
nixfmt
|
||||||
|
rnix-lsp
|
||||||
|
nil
|
||||||
|
ripgrep
|
||||||
|
entr
|
||||||
|
];
|
||||||
|
|
||||||
|
plugins = with pkgs.vimPlugins; [
|
||||||
|
|
||||||
|
# Theming
|
||||||
|
{
|
||||||
|
plugin = onenord-nvim;
|
||||||
|
type = "lua";
|
||||||
|
config = ''
|
||||||
|
require('onenord').setup()
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
plugin = lualine-nvim;
|
||||||
|
type = "lua";
|
||||||
|
config = ''
|
||||||
|
require('lualine').setup()
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
vim-devicons
|
||||||
|
|
||||||
|
# Utility plugins
|
||||||
|
{
|
||||||
|
plugin = nerdtree;
|
||||||
|
type = "lua";
|
||||||
|
config = ''
|
||||||
|
vim.g.NERDTreeShowHidden = 1
|
||||||
|
|
||||||
|
vim.keymap.set('n', '<C-t>', ':NERDTreeToggle<CR>', { desc = 'Toogle NERDTree pane' })
|
||||||
|
vim.keymap.set('n', '<C-s>', ':NERDTreeFind<CR>', { desc = 'Search file in NERDTree' })
|
||||||
|
vim.keymap.set('n', '<C-f>', ':NERDTreeFocus<CR>', { desc = 'Focus on the NERDTreePane' })
|
||||||
|
|
||||||
|
-- Keep the same NERDTree pane on each window
|
||||||
|
vim.api.nvim_create_autocmd("BufWinEnter", { pattern = "*", command = "if getcmdwintype() == \'\' | silent NERDTreeMirror | endif" })
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
nerdtree-git-plugin
|
||||||
|
{
|
||||||
|
plugin = toggleterm-nvim;
|
||||||
|
type = "lua";
|
||||||
|
config = ''
|
||||||
|
require("toggleterm").setup{}
|
||||||
|
|
||||||
|
vim.keymap.set('n', 'tf', ':ToggleTerm direction=float<CR>', { desc = 'Open a new terminal in float buffer' })
|
||||||
|
vim.keymap.set('n', 'tt', ':ToggleTerm direction=tab<CR>', { desc = 'Open a new terminal in a new tab' })
|
||||||
|
vim.keymap.set('n', 'tv', ':ToggleTerm direction=vertical<CR>', { desc = 'Open in a vertical splitted buffer' })
|
||||||
|
vim.keymap.set('n', 'th', ':ToggleTerm<CR>', { desc = 'Open in a horizontal splitted buffer' })
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
plugin = neogit;
|
||||||
|
type = "lua";
|
||||||
|
config = ''
|
||||||
|
require('neogit').setup {}
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
plugin = gitsigns-nvim;
|
||||||
|
type = "lua";
|
||||||
|
config = ''
|
||||||
|
require('gitsigns').setup()
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
vim-multiple-cursors
|
||||||
|
vim-sleuth
|
||||||
|
vim-commentary
|
||||||
|
{
|
||||||
|
plugin = telescope-nvim;
|
||||||
|
type = "lua";
|
||||||
|
config = ''
|
||||||
|
local telescope = require('telescope.builtin')
|
||||||
|
|
||||||
|
vim.keymap.set('n', 'ff', telescope.find_files, { desc = 'Search file with Telescope' })
|
||||||
|
vim.keymap.set('n', 'fg', telescope.live_grep, { desc = 'Live grep with Telescope'})
|
||||||
|
vim.keymap.set('n', 'fb', telescope.buffers, { desc = 'Search amongst current buffers (opened files)'})
|
||||||
|
vim.keymap.set('n', 'fh', telescope.help_tags, { desc = 'Search within nvim manual'})
|
||||||
|
vim.keymap.set('n', 'fs', telescope.lsp_workspace_symbols, { desc = 'Search symbol' })
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
plenary-nvim
|
||||||
|
telescope-fzy-native-nvim
|
||||||
|
|
||||||
|
# Language support plugins
|
||||||
|
vim-nix
|
||||||
|
vim-nixhash
|
||||||
|
{
|
||||||
|
plugin = rust-vim;
|
||||||
|
type = "lua";
|
||||||
|
config = ''
|
||||||
|
vim.g.rustfmt_autosave = 1
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
vim-markdown
|
||||||
|
markdown-preview-nvim
|
||||||
|
|
||||||
|
{
|
||||||
|
plugin = vimtex;
|
||||||
|
type = "viml";
|
||||||
|
config = ''
|
||||||
|
let g:vimtex_view_method = 'zathura'
|
||||||
|
let g:vimtex_compiler_method = 'tectonic'
|
||||||
|
|
||||||
|
let g:vimtex_compiler_tectonic = {
|
||||||
|
\'out_dir' : ' ',
|
||||||
|
\'hooks' : [],
|
||||||
|
\'options' : [
|
||||||
|
\ '--keep-logs',
|
||||||
|
\ '--synctex',
|
||||||
|
\ '-Zshell-escape',
|
||||||
|
\ '-Zshell-escape-cwd=$PWD'
|
||||||
|
\],
|
||||||
|
\}
|
||||||
|
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocompletion and LSP server
|
||||||
|
nvim-lspconfig
|
||||||
|
nvim-cmp
|
||||||
|
cmp-path
|
||||||
|
cmp-cmdline
|
||||||
|
cmp-buffer
|
||||||
|
cmp-nvim-lsp
|
||||||
|
vim-vsnip
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
config.xdg.configFile.nvim = mkIf config.desktop.enableNeovim {
|
||||||
|
source = ./luaconfig;
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
-- Navigate around panes
|
||||||
|
vim.keymap.set('n', '<C-Left>', '<C-w>h', { desc = 'Navigate to left pane' })
|
||||||
|
vim.keymap.set('n', '<C-Right>', '<C-w>l', { desc = 'Navigate to right pane' })
|
||||||
|
vim.keymap.set('n', '<C-Up>', '<C-w>k', { desc = 'Navigate to upper pane' })
|
||||||
|
vim.keymap.set('n', '<C-Down>', '<C-w>j', { desc = 'Toogle lower pane' })
|
||||||
|
|
||||||
|
-- Move panes position
|
||||||
|
vim.keymap.set('n', '<C-S-Left>', '<C-W>H', { desc = 'Navigate to left pane' })
|
||||||
|
vim.keymap.set('n', '<C-S-Right>', '<C-W>L', { desc = 'Navigate to right pane' })
|
||||||
|
vim.keymap.set('n', '<C-S-Up>', '<C-W>K', { desc = 'Navigate to upper pane' })
|
||||||
|
vim.keymap.set('n', '<C-S-Down>', '<C-W>J', { desc = 'Toogle lower pane' })
|
|
@ -0,0 +1,94 @@
|
||||||
|
-- Nvim LSP Config
|
||||||
|
|
||||||
|
local map_opts = { noremap=true, silent=true }
|
||||||
|
|
||||||
|
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, map_opts)
|
||||||
|
vim.keymap.set('n', '<space>p', vim.diagnostic.goto_prev, map_opts)
|
||||||
|
vim.keymap.set('n', '<space>n', vim.diagnostic.goto_next, map_opts)
|
||||||
|
vim.keymap.set('n', '<space>l', vim.diagnostic.setloclist, map_opts)
|
||||||
|
|
||||||
|
|
||||||
|
-- Enable keybinds on LSP server attach
|
||||||
|
local on_attach = function(client, bufnr)
|
||||||
|
-- Enable completion triggered by <C-x><C-o>
|
||||||
|
vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
|
||||||
|
|
||||||
|
-- Mappings
|
||||||
|
local bufopts = { noremap=true, silent=true, buffer=bufnr }
|
||||||
|
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
|
||||||
|
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
|
||||||
|
vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
|
||||||
|
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
|
||||||
|
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
|
||||||
|
vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts)
|
||||||
|
vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
|
||||||
|
vim.keymap.set('n', '<space>wl', function()
|
||||||
|
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
|
||||||
|
end, bufopts)
|
||||||
|
vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts)
|
||||||
|
vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts)
|
||||||
|
vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, bufopts)
|
||||||
|
vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
|
||||||
|
vim.keymap.set('n', '<space>f', function() vim.lsp.buf.format { async = true } end, bufopts)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Set-up autocompletion
|
||||||
|
|
||||||
|
local cmp = require('cmp')
|
||||||
|
vim.opt.completeopt = {'menu', 'menuone', 'noselect'}
|
||||||
|
|
||||||
|
cmp.setup({
|
||||||
|
snippet = {
|
||||||
|
-- Necessary snippet engine
|
||||||
|
expand = function (args)
|
||||||
|
vim.fn["vsnip#anonymous"](args.body)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
window = {
|
||||||
|
-- completion = cmp.config.window.bordered(),
|
||||||
|
-- documentation = cmp.config.window.bordered,
|
||||||
|
},
|
||||||
|
|
||||||
|
mapping = cmp.mapping.preset.insert({
|
||||||
|
['<C-u>'] = cmp.mapping.scroll_docs(4),
|
||||||
|
['<C-d>'] = cmp.mapping.scroll_docs(-4),
|
||||||
|
['<C-Space>'] = cmp.mapping.complete(),
|
||||||
|
['<C-e>'] = cmp.mapping.abort(),
|
||||||
|
['<CR>'] = cmp.mapping.confirm({select = true}),
|
||||||
|
}),
|
||||||
|
|
||||||
|
sources = cmp.config.sources({
|
||||||
|
{ name = 'nvim_lsp' },
|
||||||
|
{ name = 'vsnip' },
|
||||||
|
}, { { name = 'buffer' } }),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
-- Language servers setup
|
||||||
|
local capabilities = require('cmp_nvim_lsp').default_capabilities()
|
||||||
|
|
||||||
|
require('lspconfig')['rust_analyzer'].setup {
|
||||||
|
on_attach = on_attach,
|
||||||
|
capabilities = capabilities,
|
||||||
|
}
|
||||||
|
|
||||||
|
require('lspconfig')['rnix'].setup {
|
||||||
|
on_attach = on_attach,
|
||||||
|
capabilities = capabilities
|
||||||
|
}
|
||||||
|
|
||||||
|
require('lspconfig')["nil_ls"].setup {
|
||||||
|
on_attach = on_attach,
|
||||||
|
capabilities = capabilities
|
||||||
|
}
|
||||||
|
|
||||||
|
require('lspconfig')['ltex'].setup {
|
||||||
|
on_attach = on_attach,
|
||||||
|
capabilities = capabilities
|
||||||
|
}
|
||||||
|
|
||||||
|
require('lspconfig')['texlab'].setup {
|
||||||
|
on_attach = on_attach,
|
||||||
|
capabilities = capabilities
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
-- Set line numbers
|
||||||
|
vim.opt.number = true
|
||||||
|
|
||||||
|
-- Replace tab with whitespaces
|
||||||
|
vim.opt.expandtab = true
|
||||||
|
|
||||||
|
-- Set tabs as 4 whitespaces
|
||||||
|
vim.opt.tabstop = 4
|
||||||
|
|
||||||
|
-- Set indentation adaptability
|
||||||
|
vim.opt.autoindent = true
|
||||||
|
|
||||||
|
-- Set default level of identation
|
||||||
|
vim.opt.shiftwidth = 4
|
||||||
|
|
||||||
|
-- Use the system clipboard
|
||||||
|
vim.opt.clipboard = 'unnamedplus'
|
46
modules/workstation/home-manager/termux.nix
Normal file
46
modules/workstation/home-manager/termux.nix
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
{ lib, config, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
tmuxExtraConfig = ''
|
||||||
|
set -ag terminal-overrides ",xterm-256color:RGB"
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.enableTermux = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
description = ''
|
||||||
|
Enable termux and the associated config.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config.programs.tmux = mkIf config.enableTermux {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# Make windows count start to 1
|
||||||
|
baseIndex = 1;
|
||||||
|
|
||||||
|
# Use 24h clock
|
||||||
|
clock24 = true;
|
||||||
|
|
||||||
|
shell = if config.enableFishShell then "${pkgs.fish}/bin/fish" else "${pkgs.bash}/bin/bash";
|
||||||
|
|
||||||
|
keyMode = "vi";
|
||||||
|
|
||||||
|
tmuxp.enable = true;
|
||||||
|
|
||||||
|
terminal = "tmux-256color";
|
||||||
|
|
||||||
|
plugins = with pkgs.tmuxPlugins; [
|
||||||
|
{
|
||||||
|
plugin = nord;
|
||||||
|
extraConfig = ''
|
||||||
|
set -g @plugin "arcticicestudio/nord-tmux"
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
extraConfig = tmuxExtraConfig;
|
||||||
|
};
|
||||||
|
}
|
11
modules/workstation/sound.nix
Normal file
11
modules/workstation/sound.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
services.pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
alsa.support32Bit = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.noisetorch.enable = true;
|
||||||
|
}
|
Loading…
Reference in a new issue