neovim lspconfig

This commit is contained in:
Tristan 2023-12-23 15:43:26 +00:00
parent fb5c04a84a
commit 34aaaf63d2
29 changed files with 1705 additions and 1399 deletions

View file

@ -1,29 +1,32 @@
{ user
, name
, work ? false
, displays ? [ ]
, userName
, ...
}:
{ config, pkgs, ... }:
{
user,
name,
work ? false,
displays ? [],
userName,
...
}: {
config,
pkgs,
...
}: {
imports = [
(import ./modules/terminal.nix { inherit user; })
(import ./modules/scripts.nix { inherit user; })
(import ./modules/editor.nix { inherit user; })
(import ./modules/keyboard.nix { inherit user; })
(import ./modules/display.nix { inherit user; })
(import ./modules/work.nix { inherit user; })
(import ./modules/menu.nix { inherit user; })
(import ./modules/email.nix { inherit user userName; })
(import ./modules/mpd.nix { inherit user; })
(import ./modules/git.nix { inherit user userName; })
(import ./modules/laptop.nix { inherit user; })
(import ./modules/dev.nix { inherit user; })
(import ./modules/personal.nix { inherit user; })
(import ./modules/gamer.nix { inherit user; })
(import ./modules/wayland.nix { inherit user; })
(import ../hardware/${name}.nix { inherit user; })
(import ./modules/terminal.nix {inherit user;})
(import ./modules/scripts.nix {inherit user;})
(import ./modules/editor.nix {inherit user;})
(import ./modules/keyboard.nix {inherit user;})
(import ./modules/display.nix {inherit user;})
(import ./modules/work.nix {inherit user;})
(import ./modules/menu.nix {inherit user;})
(import ./modules/email.nix {inherit user userName;})
(import ./modules/mpd.nix {inherit user;})
(import ./modules/git.nix {inherit user userName;})
(import ./modules/laptop.nix {inherit user;})
(import ./modules/dev.nix {inherit user;})
(import ./modules/personal.nix {inherit user;})
(import ./modules/gamer.nix {inherit user;})
(import ./modules/wayland.nix {inherit user;})
(import ../hardware/${name}.nix {inherit user;})
./scripts.nix
(import ../global/system.nix user)
];
@ -35,5 +38,4 @@
roles.personal.enable = !work;
roles.mpd.enable = true;
programs.editor.neovim = true;
}

View file

@ -1,5 +1,10 @@
name: { pkgs, app-id, browser, desktopName, ... }:
name: {
pkgs,
app-id,
browser,
desktopName,
...
}:
pkgs.makeDesktopItem {
name = "${name}";
desktopName = "${desktopName}";

View file

@ -1,23 +1,25 @@
name:
{ nixpkgs
, inputs
, home-manager
, system
, user
, laptop ? false
, work ? false
, userName
, ...
name: {
nixpkgs,
inputs,
home-manager,
system,
user,
laptop ? false,
work ? false,
userName,
...
}:
nixpkgs.lib.nixosSystem rec {
specialArgs = { inherit inputs; };
specialArgs = {inherit inputs;};
inherit system;
modules = [
({ inputs, pkgs, ... }: {
({
inputs,
pkgs,
...
}: {
programs.hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.system}.hyprland;
@ -25,12 +27,12 @@ nixpkgs.lib.nixosSystem rec {
})
{
nix.settings = {
substituters = [ "https://hyprland.cachix.org" ];
trusted-public-keys = [ "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" ];
substituters = ["https://hyprland.cachix.org"];
trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
};
}
inputs.stylix.nixosModules.stylix
({ pkgs, ... }: {
({pkgs, ...}: {
stylix.image = ../images/demonslayer.png;
stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml";
})
@ -39,6 +41,6 @@ nixpkgs.lib.nixosSystem rec {
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
}
(import ./home.nix { inherit inputs user userName name laptop work; })
(import ./home.nix {inherit inputs user userName name laptop work;})
];
}

View file

@ -1,9 +1,12 @@
{ user, ... }: { lib, pkgs, config, ... }:
with lib;
let
{user, ...}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.roles.dev;
in
{
in {
options.roles = {
dev = {
enable = mkEnableOption "editor";
@ -14,14 +17,16 @@ in
programs.editor.enable = true;
roles.git.enable = true;
programs.terminal.enable = true;
home-manager.users.${user}.imports = [{
home.packages = (with pkgs; [
insomnia
dbeaver
ansible
tig
fx
]);
}];
home-manager.users.${user}.imports = [
{
home.packages = with pkgs; [
insomnia
dbeaver
ansible
tig
fx
];
}
];
};
}

View file

@ -1,77 +1,101 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
let
{user}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.displays;
renderDisplaysForHyprland = displays: (map displayHyprlandSetting displays);
displayHyprlandSetting = display: specificDisplay display +
", " + resToString display.resolution +
", " + positionToHyprlandString display.position +
", " + toString display.scaling +
", " + "transform," + toString display.rotation;
displayHyprlandSetting = display:
specificDisplay display
+ ", "
+ resToString display.resolution
+ ", "
+ positionToHyprlandString display.position
+ ", "
+ toString display.scaling
+ ", "
+ "transform,"
+ toString display.rotation;
swaybgJob = displays:
{
Unit = {
Description = "SwayBG";
};
Service = {
ExecStart = "${pkgs.swaybg}/bin/swaybg " +
concatStringsSep " " (map swaybgCmd displays);
};
Install = {
WantedBy = [ "graphical-session.target" ];
};
swaybgJob = displays: {
Unit = {
Description = "SwayBG";
};
Service = {
ExecStart =
"${pkgs.swaybg}/bin/swaybg "
+ concatStringsSep " " (map swaybgCmd displays);
};
Install = {
WantedBy = ["graphical-session.target"];
};
};
swaybgCmd = display:
if (display.wallpaper != "") then "-o ${display.name} -i ${display.wallpaper} -m fill" else "";
if (display.wallpaper != "")
then "-o ${display.name} -i ${display.wallpaper} -m fill"
else "";
specificDisplay = display:
if display.description == ""
then display.name
else "desc:" + display.description;
positionToHyprlandString = { x, y }:
if (x == -1 || y == -1) then "auto" else toString x + "x" + toString y;
positionToHyprlandString = {
x,
y,
}:
if (x == -1 || y == -1)
then "auto"
else toString x + "x" + toString y;
renderDisplaysForSway = displays:
listToAttrs (map displaySwaySetting displays);
displaySwaySetting = display: {
name = display.name;
value = let res = display.resolution; in
{
mode = mkIf (!resUnset res)
"${toString res.x}x${toString res.y}@${toString res.freq}Hz";
bg = display.wallpaper + " fill";
scale = toString display.scaling;
};
value = let
res = display.resolution;
in {
mode =
mkIf (!resUnset res)
"${toString res.x}x${toString res.y}@${toString res.freq}Hz";
bg = display.wallpaper + " fill";
scale = toString display.scaling;
};
};
resolutionType = types.submodule ({ x, y, freq, ... }:
{
options = {
x = mkOption {
description = "x";
type = types.int;
default = 0;
};
y = mkOption {
description = "y";
type = types.int;
default = 0;
};
freq = mkOption {
description = "frequency";
type = types.int;
default = 0;
};
resolutionType = types.submodule ({
x,
y,
freq,
...
}: {
options = {
x = mkOption {
description = "x";
type = types.int;
default = 0;
};
});
displayType = types.submodule
({ ... }: {
y = mkOption {
description = "y";
type = types.int;
default = 0;
};
freq = mkOption {
description = "frequency";
type = types.int;
default = 0;
};
};
});
displayType =
types.submodule
({...}: {
options = {
name = mkOption {
description = "name of the display";
@ -91,7 +115,7 @@ let
resolution = mkOption {
description = "res";
type = resolutionType;
default = { };
default = {};
};
position.x = mkOption {
default = -1;
@ -108,36 +132,33 @@ let
};
});
resUnset = res:
(res.x == 0 || res.y == 0 || res.freq == 0);
resUnset = res: (res.x == 0 || res.y == 0 || res.freq == 0);
resToString = res:
if resUnset res
then "preferred"
else "${toString res.x}x${toString res.y}@${toString res.freq}";
in
{
options.displays =
{
enable = mkEnableOption "manage displays";
displays = mkOption {
type = types.listOf displayType;
default = [ ];
};
in {
options.displays = {
enable = mkEnableOption "manage displays";
displays = mkOption {
type = types.listOf displayType;
default = [];
};
};
config = mkIf cfg.enable {
home-manager.users.${user}.imports = [
{
wayland.windowManager.hyprland.settings.monitor = mkIf (cfg.displays != [ ])
wayland.windowManager.hyprland.settings.monitor =
mkIf (cfg.displays != [])
(renderDisplaysForHyprland cfg.displays);
systemd.user.services.swaybg = swaybgJob cfg.displays;
wayland.windowManager.sway.config.output = mkIf (cfg.displays != [ ])
wayland.windowManager.sway.config.output =
mkIf (cfg.displays != [])
(renderDisplaysForSway cfg.displays);
}
];
};
}

View file

@ -1,13 +1,16 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
let
{user}: {
lib,
pkgs,
config,
...
}:
with lib; let
editor = config.programs.editor;
pkg = editor.package;
terminal = config.programs.terminal.package;
termcmd = "${terminal}/bin/${terminal.pname}";
menu = config.programs.menu.package + config.programs.menu.dmenuCommand;
in
{
in {
options.programs = {
editor = {
enable = mkEnableOption "editor";
@ -19,92 +22,93 @@ in
};
config = mkIf editor.enable {
home-manager.users.${user}.imports = [{
programs.vscode = {
enable = true;
package = editor.package;
extensions =
if editor.neovim then with pkgs; [
vscode-extensions.asvetliakov.vscode-neovim
] else [ ];
userSettings = {
"keyboard.dispatch" = "keyCode";
"terminal.integrated.sendKeybindingsToShell" = true;
"aws.telemetry" = false;
"gitlens.telemetry.enabled" = false;
"redhat.telemetry.enabled" = false;
"cSpell.language" = "en,en-GB";
} // (if editor.neovim then {
"vscode-neovim.neovimExecutablePaths.linux" = "${pkgs.neovim}/bin/nvim";
"extensions.experimental.affinity" = {
"asvetliakov.vscode-neovim" = 1;
};
} else { });
};
programs.neovim = mkIf editor.neovim {
enable = true;
defaultEditor = true;
coc = {
home-manager.users.${user}.imports = [
{
programs.vscode = {
enable = true;
settings = {
languageserver = {
go = {
command = "${pkgs.gopls}/bin/gopls";
filetypes = [ "go" ];
};
nix = {
command = "${pkgs.rnix-lsp}/bin/rnix-lsp";
filetypes = [ "nix" ];
};
typescript = {
command = "${pkgs.nodePackages.typescript-language-server}/bin/typescript-language-server";
filetypes = [ "ts" "tsx" ];
};
};
};
package = editor.package;
extensions =
if editor.neovim
then
with pkgs; [
vscode-extensions.asvetliakov.vscode-neovim
]
else [];
userSettings =
{
"keyboard.dispatch" = "keyCode";
"terminal.integrated.sendKeybindingsToShell" = true;
"aws.telemetry" = false;
"gitlens.telemetry.enabled" = false;
"redhat.telemetry.enabled" = false;
"cSpell.language" = "en,en-GB";
}
// (
if editor.neovim
then {
"vscode-neovim.neovimExecutablePaths.linux" = "${pkgs.neovim}/bin/nvim";
"extensions.experimental.affinity" = {
"asvetliakov.vscode-neovim" = 1;
};
}
else {}
);
};
extraConfig = ''
vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR>
vnoremap <C-R> "ry:%s/<C-R>=escape(@r,'/\')<CR>
vnoremap A :norm A
noremap <C-S-I> :CocCommand editor.action.formatDocument<CR>
set number
set rnu
set ignorecase
set smartcase
set mouse=a
set path=.,**
let g:netrw_banner=0
let g:netrw_liststyle=3
set undofile
set undodir=~/.local/share/nvim/undo
programs.neovim = mkIf editor.neovim {
enable = true;
defaultEditor = true;
extraLuaConfig = ''
${builtins.readFile ./neovim/config.lua}
'';
extraPackages = with pkgs; [
nodePackages_latest.typescript-language-server
vscode-langservers-extracted
gopls
nil
];
plugins = with pkgs.vimPlugins; [
vim-surround
vim-commentary
{
plugin = telescope-nvim;
type = "lua";
config = ''
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
vim.keymap.set('n', '<leader>fg', builtin.live_grep, {})
vim.keymap.set('n', '<leader>fb', builtin.buffers, {})
vim.keymap.set('n', '<leader>fh', builtin.help_tags, {})
'';
}
{
plugin = nvim-lspconfig;
type = "lua";
config = builtins.readFile ./neovim/lspconfig.lua;
}
firenvim
];
};
}
];
programs.scripts = [
{
name = "open-code";
text = ''
code_dir=~/Documents/code
cd $code_dir
repo=$({ ls && echo clone-repo; } | ${menu})
case $repo in
clone-repo)
url=$(wl-paste)
${termcmd} -e -- git clone "$url" ;;
*) [ -e "$repo" ] && ${pkg}/bin/${pkg.executableName} $repo ;;
esac
'';
plugins = with pkgs.vimPlugins; [
vim-surround
vim-commentary
firenvim
];
};
}];
programs.scripts = [{
name = "open-code";
text = ''
code_dir=~/Documents/code
cd $code_dir
repo=$({ ls && echo clone-repo; } | ${menu})
case $repo in
clone-repo)
url=$(wl-paste)
${termcmd} -e -- git clone "$url" ;;
*) [ -e "$repo" ] && ${pkg}/bin/${pkg.executableName} $repo ;;
esac
'';
install = false;
hotkeys = [{ key = "C"; }];
}];
install = false;
hotkeys = [{key = "C";}];
}
];
};
}

View file

@ -1,11 +1,17 @@
{ user, userName }: { lib, pkgs, config, ... }:
with lib;
let
{
user,
userName,
}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.roles.email;
terminal = config.programs.terminal.package;
termcmd = "${terminal}/bin/${terminal.pname}";
in
{
in {
options.roles = {
email = {
enable = mkEnableOption "email settings";
@ -20,7 +26,6 @@ in
};
config = mkIf cfg.enable {
programs.scripts = [
{
name = "email";
@ -32,199 +37,200 @@ in
}
];
home-manager.users.${user}.imports = [{
programs.git = {
userName = userName;
userEmail = cfg.email;
};
accounts.email.accounts.${cfg.email} = mkIf cfg.terminal {
notmuch.enable = true;
neomutt.enable = true;
aerc.enable = true;
mbsync.enable = true;
mbsync.create = "both";
userName = cfg.email;
realName = userName;
address = cfg.email;
primary = true;
passwordCommand = "${pkgs.rbw}/bin/rbw get privateemail";
smtp = {
host = "mail.privateemail.com";
port = 465;
tls.enable = true;
home-manager.users.${user}.imports = [
{
programs.git = {
userName = userName;
userEmail = cfg.email;
};
imap = {
host = "mail.privateemail.com";
port = 993;
tls.enable = true;
};
};
programs.notmuch.enable = cfg.terminal;
programs.neomutt = {
enable = cfg.terminal;
vimKeys = true;
sort = "reverse-date";
sidebar.enable = true;
};
programs.mbsync.enable = cfg.terminal;
services.mbsync.enable = cfg.terminal;
programs.aerc = {
enable = cfg.terminal;
extraBinds = ''
# Binds are of the form <key sequence> = <command to run>
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
<C-t> = :term<Enter>
[messages]
Q = :quit<Enter>
T = :toggle-threads<Enter>
j = :next<Enter>
<Down> = :next<Enter>
<C-d> = :next 50%<Enter>
<C-f> = :next 100%<Enter>
<PgDn> = :next -s 100%<Enter>
k = :prev<Enter>
<Up> = :prev<Enter>
<C-u> = :prev 50%<Enter>
<C-b> = :prev<Enter>
<PgUp> = :prev -s 100%<Enter>
gg = :select 0<Enter>
G = :select -1<Enter>
J = :next-folder<Enter>
K = :prev-folder<Enter>
v = :mark -t<Enter>
V = :mark -v<Enter>
f = :flag<Enter>
F = :unflag<Enter>
t = :toggle-threads<Enter>
<Enter> = :view<Enter>
D = :mv Trash<Enter>
C = :compose<enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
rt = :unflag<Enter>:reply -a -Tthanks<Enter>
Rt = :unflag<Enter>:reply -qa -Tquoted_thanks<Enter>
a = :mv Archive<Enter>
c = :cf<space>
$ = :term<space>
! = :term<space>
| = :pipe<space>
ga = :flag<Enter>:pipe -mb git am -3<Enter>
gp = :term git push<Enter>
gl = :term git log<Enter>
/ = :search<space>
\ = :filter<space>
n = :next-result<Enter>
N = :prev-result<Enter>
o = :term mbsync -a<Enter>
q = :quit<Enter>
[view]
/ = :toggle-key-passthrough<Enter>/
q = :close<Enter>
| = :pipe -m<space>
S = :save<space>
H = :toggle-headers<Enter>
D = :mv Trash<Enter>
<C-k> = :prev-part<Enter>
<C-j> = :next-part<Enter>
J = :next<Enter>
K = :prev<Enter>
f = :forward<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
rt = :reply -Tthanks<Enter>
ga = :pipe -b git am -3<Enter>
gp = :term git push<Enter>
gl = :term git log<Enter>
[view::passthrough]
$noinherit = true
$ex = <C-x>
<Esc> = :toggle-key-passthrough<Enter>
[compose]
$ex = <C-x>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<tab> = :next-field<Enter>
[compose::editor]
# Keybindings used when the embedded terminal is selected in the compose view
$noinherit = true
$ex = <C-x>
<C-t> = :term<Enter>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
[compose::review]
# Keybindings used when reviewing a message to be sent
y = :send<Enter>
n = :abort<Enter>
e = :edit<Enter>
a = :attach<space>
c = :encrypt<Enter>
s = :sign<Enter>
V = :header -f X-Sourcehut-Patchset-Update NEEDS_REVISION<Enter>
A = :header -f X-Sourcehut-Patchset-Update APPLIED<Enter>
R = :header -f X-Sourcehut-Patchset-Update REJECTED<Enter>
[terminal]
$noinherit = true
$ex = <C-x>
<C-t> = :term<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
'';
extraConfig = {
general = {
pgp-provider = "gpg";
unsafe-accounts-conf = true;
accounts.email.accounts.${cfg.email} = mkIf cfg.terminal {
notmuch.enable = true;
neomutt.enable = true;
aerc.enable = true;
mbsync.enable = true;
mbsync.create = "both";
userName = cfg.email;
realName = userName;
address = cfg.email;
primary = true;
passwordCommand = "${pkgs.rbw}/bin/rbw get privateemail";
smtp = {
host = "mail.privateemail.com";
port = 465;
tls.enable = true;
};
ui = { };
viewer = { };
filters = {
"text/plain" = "colorize";
"text/calendar" = "calendar";
"message/delivery-status" = "colorize";
"message/rfc822" = "colorize";
"image/*" = "img2sixel";
"text/html" = "html | colorize";
imap = {
host = "mail.privateemail.com";
port = 993;
tls.enable = true;
};
};
};
}];
programs.notmuch.enable = cfg.terminal;
programs.neomutt = {
enable = cfg.terminal;
vimKeys = true;
sort = "reverse-date";
sidebar.enable = true;
};
programs.mbsync.enable = cfg.terminal;
services.mbsync.enable = cfg.terminal;
programs.aerc = {
enable = cfg.terminal;
extraBinds = ''
# Binds are of the form <key sequence> = <command to run>
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
<C-t> = :term<Enter>
[messages]
Q = :quit<Enter>
T = :toggle-threads<Enter>
j = :next<Enter>
<Down> = :next<Enter>
<C-d> = :next 50%<Enter>
<C-f> = :next 100%<Enter>
<PgDn> = :next -s 100%<Enter>
k = :prev<Enter>
<Up> = :prev<Enter>
<C-u> = :prev 50%<Enter>
<C-b> = :prev<Enter>
<PgUp> = :prev -s 100%<Enter>
gg = :select 0<Enter>
G = :select -1<Enter>
J = :next-folder<Enter>
K = :prev-folder<Enter>
v = :mark -t<Enter>
V = :mark -v<Enter>
f = :flag<Enter>
F = :unflag<Enter>
t = :toggle-threads<Enter>
<Enter> = :view<Enter>
D = :mv Trash<Enter>
C = :compose<enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
rt = :unflag<Enter>:reply -a -Tthanks<Enter>
Rt = :unflag<Enter>:reply -qa -Tquoted_thanks<Enter>
a = :mv Archive<Enter>
c = :cf<space>
$ = :term<space>
! = :term<space>
| = :pipe<space>
ga = :flag<Enter>:pipe -mb git am -3<Enter>
gp = :term git push<Enter>
gl = :term git log<Enter>
/ = :search<space>
\ = :filter<space>
n = :next-result<Enter>
N = :prev-result<Enter>
o = :term mbsync -a<Enter>
q = :quit<Enter>
[view]
/ = :toggle-key-passthrough<Enter>/
q = :close<Enter>
| = :pipe -m<space>
S = :save<space>
H = :toggle-headers<Enter>
D = :mv Trash<Enter>
<C-k> = :prev-part<Enter>
<C-j> = :next-part<Enter>
J = :next<Enter>
K = :prev<Enter>
f = :forward<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
rt = :reply -Tthanks<Enter>
ga = :pipe -b git am -3<Enter>
gp = :term git push<Enter>
gl = :term git log<Enter>
[view::passthrough]
$noinherit = true
$ex = <C-x>
<Esc> = :toggle-key-passthrough<Enter>
[compose]
$ex = <C-x>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<tab> = :next-field<Enter>
[compose::editor]
# Keybindings used when the embedded terminal is selected in the compose view
$noinherit = true
$ex = <C-x>
<C-t> = :term<Enter>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
[compose::review]
# Keybindings used when reviewing a message to be sent
y = :send<Enter>
n = :abort<Enter>
e = :edit<Enter>
a = :attach<space>
c = :encrypt<Enter>
s = :sign<Enter>
V = :header -f X-Sourcehut-Patchset-Update NEEDS_REVISION<Enter>
A = :header -f X-Sourcehut-Patchset-Update APPLIED<Enter>
R = :header -f X-Sourcehut-Patchset-Update REJECTED<Enter>
[terminal]
$noinherit = true
$ex = <C-x>
<C-t> = :term<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
'';
extraConfig = {
general = {
pgp-provider = "gpg";
unsafe-accounts-conf = true;
};
ui = {};
viewer = {};
filters = {
"text/plain" = "colorize";
"text/calendar" = "calendar";
"message/delivery-status" = "colorize";
"message/rfc822" = "colorize";
"image/*" = "img2sixel";
"text/html" = "html | colorize";
};
};
};
}
];
};
}

View file

@ -1,17 +1,22 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
{
{user}: {
lib,
pkgs,
config,
...
}:
with lib; {
options.roles.gamer = {
enable = mkEnableOption "gamer packages";
};
config = mkIf config.roles.gamer.enable {
# required for heroic launcher
nixpkgs.config.permittedInsecurePackages = [
"electron-25.9.0"
];
# required for heroic launcher
nixpkgs.config.permittedInsecurePackages = [
"electron-25.9.0"
];
home-manager.users.${user}.imports = [{
home-manager.users.${user}.imports = [
{
home.packages = with pkgs; [
airshipper
minetest
@ -23,11 +28,11 @@ with lib;
protontricks
protonup-qt
gamemode
gamescope
gamescope
monado
openxr-loader
opencomposite
monado
openxr-loader
opencomposite
(makeDesktopItem {
name = "x11steam";
@ -36,37 +41,38 @@ with lib;
})
oversteer
];
}];
}
];
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
nixpkgs.config.allowUnfreePredicate = pkg:
builtins.elem (lib.getName pkg) [
"steam"
"steam-run"
"steam-original"
"osu-lazer"
];
programs.steam = {
enable = true;
remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true;
};
hardware.steam-hardware.enable = true;
environment.etc.logitechG920 = {
target = "usb_modeswitch.d/046d:c261";
text = ''
DefaultVendor=046d
DefaultProduct=c261
MessageEndpoint=01
ResponseEndpoint=01
TargetClass=0x03
MessageContent="0f00010142"
'';
};
services.udev.extraRules = ''
ATTR{idVendor}=="046d", ATTR{idProduct}=="c261", RUN+="${pkgs.usb-modeswitch}/bin/usb_modeswitch -c '/etc/usb_modeswitch.d/046d:c261'"
'';
hardware.new-lg4ff.enable = true;
programs.steam = {
enable = true;
remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true;
};
hardware.steam-hardware.enable = true;
environment.etc.logitechG920 = {
target = "usb_modeswitch.d/046d:c261";
text = ''
DefaultVendor=046d
DefaultProduct=c261
MessageEndpoint=01
ResponseEndpoint=01
TargetClass=0x03
MessageContent="0f00010142"
'';
};
services.udev.extraRules = ''
ATTR{idVendor}=="046d", ATTR{idProduct}=="c261", RUN+="${pkgs.usb-modeswitch}/bin/usb_modeswitch -c '/etc/usb_modeswitch.d/046d:c261'"
'';
hardware.new-lg4ff.enable = true;
};
}

View file

@ -1,9 +1,15 @@
{ user, userName }: { lib, pkgs, config, ... }:
with lib;
let
cfg = config.roles.git;
in
{
user,
userName,
}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.roles.git;
in {
options.roles = {
git = {
enable = mkEnableOption "email settings";
@ -11,21 +17,22 @@ in
};
config = mkIf cfg.enable {
home-manager.users.${user}.imports = [{
programs.git = {
enable = true;
aliases = {
graph = "log --oneline --all --graph";
amend = "commit --amend --no-edit";
};
delta = {
home-manager.users.${user}.imports = [
{
programs.git = {
enable = true;
aliases = {
graph = "log --oneline --all --graph";
amend = "commit --amend --no-edit";
};
delta = {
enable = true;
};
extraConfig = {
pull.rebase = true;
};
};
extraConfig = {
pull.rebase = true;
};
};
}];
}
];
};
}

View file

@ -1,6 +1,10 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
{
{user}: {
lib,
pkgs,
config,
...
}:
with lib; {
options.keyboard = {
dvorak = {
enable = mkEnableOption "use a good keyboard layout on a qwerty keyboard";
@ -26,7 +30,9 @@ with lib;
};
}
];
services.xserver.xkbVariant = if config.keyboard.dvorak.enable then "dvorak" else "";
services.xserver.xkbVariant =
if config.keyboard.dvorak.enable
then "dvorak"
else "";
};
}

View file

@ -1,9 +1,12 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
let
{user}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.roles.laptop;
in
{
in {
options.roles = {
laptop = {
enable = mkEnableOption "is a laptop";
@ -14,30 +17,34 @@ in
config = mkIf cfg.enable {
displays = mkIf cfg.displays {
enable = true;
displays = [{
name = "eDP-1";
scaling = 1.2;
}];
displays = [
{
name = "eDP-1";
scaling = 1.2;
}
];
};
keyboard.dvorak.enable = true;
home-manager.users.${user}.imports = [{
wayland.windowManager.hyprland = {
settings = {
general = {
gaps_out = 10;
border_size = 3;
};
bind = [
"SUPER_SHIFT, Q, killactive,"
];
"device:at-translated-set-2-keyboard" = {
kb_variant = "dvorak,";
kb_layout = "gb,gb";
kb_options = "grp:alt_shift_toggle,caps:escape";
home-manager.users.${user}.imports = [
{
wayland.windowManager.hyprland = {
settings = {
general = {
gaps_out = 10;
border_size = 3;
};
bind = [
"SUPER_SHIFT, Q, killactive,"
];
"device:at-translated-set-2-keyboard" = {
kb_variant = "dvorak,";
kb_layout = "gb,gb";
kb_options = "grp:alt_shift_toggle,caps:escape";
};
};
};
};
}];
}
];
};
}

View file

@ -1,11 +1,14 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
let
{user}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.programs.menu;
terminal = config.programs.terminal.package;
termcmd = "${terminal}/bin/${terminal.pname}";
in
{
in {
options.programs = {
menu = {
enable = mkEnableOption "menu";
@ -18,16 +21,18 @@ in
};
};
};
config = mkIf cfg.enable {
home-manager.users.${user}.imports = [{
programs.wofi = mkIf (cfg.package == pkgs.wofi) {
enable = true;
settings = {
term = termcmd;
insensitive = true;
home-manager.users.${user}.imports = [
{
programs.wofi = mkIf (cfg.package == pkgs.wofi) {
enable = true;
settings = {
term = termcmd;
insensitive = true;
};
};
};
}];
}
];
};
}

View file

@ -1,47 +1,69 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
let
{user}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.roles.mpd;
in
{
in {
options.roles.mpd = {
enable = mkEnableOption "setup mpd client";
host = mkOption { default = "192.168.1.2"; };
host = mkOption {default = "192.168.1.2";};
};
config = mkIf cfg.enable {
home-manager.users.${user}.imports = [{
programs.ncmpcpp = {
enable = true;
settings.mpd_host = cfg.host;
bindings = [
{ key = "j"; command = "scroll_down"; }
{ key = "k"; command = "scroll_up"; }
{ key = "l"; command = "next_column"; }
{ key = "h"; command = "previous_column"; }
{ key = "J"; command = [ "select_item" "scroll_down" ]; }
{ key = "K"; command = [ "select_item" "scroll_up" ]; }
];
};
services.mpd-mpris = {
enable = true;
mpd.host = cfg.host;
};
programs.waybar.settings.mainBar.mpd.server = cfg.host;
systemd.user.services = {
snapclient = {
Unit = {
Description = "Snapclient";
};
Service = {
ExecStart = "${pkgs.snapcast}/bin/snapclient -h ${cfg.host}";
};
Install = {
WantedBy = [ "graphical-session.target" ];
home-manager.users.${user}.imports = [
{
programs.ncmpcpp = {
enable = true;
settings.mpd_host = cfg.host;
bindings = [
{
key = "j";
command = "scroll_down";
}
{
key = "k";
command = "scroll_up";
}
{
key = "l";
command = "next_column";
}
{
key = "h";
command = "previous_column";
}
{
key = "J";
command = ["select_item" "scroll_down"];
}
{
key = "K";
command = ["select_item" "scroll_up"];
}
];
};
services.mpd-mpris = {
enable = true;
mpd.host = cfg.host;
};
programs.waybar.settings.mainBar.mpd.server = cfg.host;
systemd.user.services = {
snapclient = {
Unit = {
Description = "Snapclient";
};
Service = {
ExecStart = "${pkgs.snapcast}/bin/snapclient -h ${cfg.host}";
};
Install = {
WantedBy = ["graphical-session.target"];
};
};
};
};
}];
}
];
};
}

View file

@ -0,0 +1,19 @@
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
vim.o.relativenumber = true
vim.o.signcolumn = 'yes'
vim.o.tabstop = 2
vim.o.shiftwidth = 2
vim.o.expandtab = true
vim.o.smartindent = true
vim.o.hlsearch = false
vim.o.scrolloff = 6
vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv")
vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv")
vim.keymap.set("x", "p", "\"_dP")
vim.keymap.set("n", "<leader>y", "\"+y")
vim.keymap.set("v", "<leader>y", "\"+y")

View file

@ -0,0 +1,55 @@
-- Setup language servers.
local lspconfig = require('lspconfig')
lspconfig.tsserver.setup {
on_attach = function(client)
client.server_capabilities.documentFormattingProvider = false
end
}
lspconfig.eslint.setup {
on_attach = function(client)
client.server_capabilities.documentFormattingProvider = true
end
}
lspconfig.gopls.setup {}
lspconfig.nil_ls.setup {}
-- Global mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist)
-- Use LspAttach autocommand to only map the following keys
-- after the language server attaches to the current buffer
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('UserLspConfig', {}),
callback = function(ev)
-- Enable completion triggered by <c-x><c-o>
vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc'
-- Buffer local mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local opts = { buffer = ev.buf }
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts)
vim.keymap.set('n', '<leader>wa', vim.lsp.buf.add_workspace_folder, opts)
vim.keymap.set('n', '<leader>wr', vim.lsp.buf.remove_workspace_folder, opts)
vim.keymap.set('n', '<leader>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, opts)
vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, opts)
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, opts)
vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
vim.keymap.set('n', '<leader>f', function()
vim.lsp.buf.format { async = true }
end, opts)
end,
})

View file

@ -1,12 +1,15 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
{
{user}: {
lib,
pkgs,
config,
...
}:
with lib; {
options.roles.personal = {
enable = mkEnableOption "personal packages";
};
config = mkIf config.roles.personal.enable {
roles.email = {
enable = true;
email = "tristan@tristans.cloud";
@ -22,32 +25,33 @@ with lib;
"en_US.UTF-8/UTF-8"
];
home-manager.users.${user}.imports = [{
services.nextcloud-client.enable = true;
services.gnome-keyring.enable = true;
home-manager.users.${user}.imports = [
{
services.nextcloud-client.enable = true;
services.gnome-keyring.enable = true;
home.language = {
base = "eo.UTF-8";
};
home.language = {
base = "eo.UTF-8";
};
home.packages = with pkgs; [
godot_4
ardour
blender
musescore
jellyfin-media-player
monero-gui
electrum
xmrig
transmission-remote-gtk
krita
organicmaps
anki
hugo
libsForQt5.neochat
bookworm
];
}];
home.packages = with pkgs; [
godot_4
ardour
blender
musescore
jellyfin-media-player
monero-gui
electrum
xmrig
transmission-remote-gtk
krita
organicmaps
anki
hugo
libsForQt5.neochat
bookworm
];
}
];
};
}

View file

@ -1,9 +1,13 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
let
{user}: {
lib,
pkgs,
config,
...
}:
with lib; let
scripts = config.programs.scripts;
hotkeyType = types.submodule ({ ... }: {
hotkeyType = types.submodule ({...}: {
options = {
key = mkOption {
description = "the key";
@ -19,7 +23,7 @@ let
};
});
scriptType = types.submodule ({ ... }: {
scriptType = types.submodule ({...}: {
options = {
name = mkOption {
description = "name of the executable";
@ -30,7 +34,7 @@ let
hotkeys = mkOption {
type = types.listOf hotkeyType;
description = "keys that run this script";
default = [ ];
default = [];
};
install = mkOption {
type = types.bool;
@ -42,33 +46,35 @@ let
scriptToPackage = script:
pkgs.writeShellScriptBin script.name script.text;
scriptExec = { script, hotkey }:
"${scriptToPackage script}/bin/${script.name} ${hotkey.args}";
scriptExec = {
script,
hotkey,
}: "${scriptToPackage script}/bin/${script.name} ${hotkey.args}";
installScripts = scripts:
(map scriptToPackage (filter (s: s.install) scripts));
installScripts = scripts: (map scriptToPackage (filter (s: s.install) scripts));
bindScript = script: concatStrings (
map
(hotkey:
"${hotkey.modifier}, ${hotkey.key}, exec, ${scriptExec {inherit script hotkey;}}"
bindScript = script:
concatStrings (
map
(
hotkey: "${hotkey.modifier}, ${hotkey.key}, exec, ${scriptExec {inherit script hotkey;}}"
)
script.hotkeys);
in
{
script.hotkeys
);
in {
options.programs = {
scripts = mkOption {
type = types.listOf scriptType;
default = [ ];
default = [];
};
};
config = {
home-manager.users.${user}.imports = [{
home.packages = installScripts scripts;
wayland.windowManager.hyprland.settings.bind = (map bindScript scripts);
}];
home-manager.users.${user}.imports = [
{
home.packages = installScripts scripts;
wayland.windowManager.hyprland.settings.bind = map bindScript scripts;
}
];
};
}

View file

@ -1,9 +1,12 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
let
{user}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.programs.terminal;
in
{
in {
options.programs = {
terminal = {
enable = mkEnableOption "editor";
@ -12,15 +15,17 @@ in
};
};
};
config = mkIf cfg.enable {
home-manager.users.${user}.imports = [{
programs.foot = mkIf ( cfg.package == pkgs.foot ) {
enable = true;
server.enable = true;
};
home.packages = [ cfg.package ];
}];
config = mkIf cfg.enable {
home-manager.users.${user}.imports = [
{
programs.foot = mkIf (cfg.package == pkgs.foot) {
enable = true;
server.enable = true;
};
home.packages = [cfg.package];
}
];
};
}

View file

@ -1,9 +1,12 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
let
{user}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.windowManager;
in
{
in {
options.windowManager = {
hyprland = mkEnableOption "hyprland";
sway = mkEnableOption "sway";
@ -21,269 +24,279 @@ in
command = "sway";
user = user;
};
default_session = if cfg.sway then sway_session else hypr_session;
default_session =
if cfg.sway
then sway_session
else hypr_session;
};
};
home-manager.users.${user}.imports = [{
wayland.windowManager.hyprland = mkIf cfg.hyprland {
enable = true;
systemd.enable = true;
settings = {
input = {
touchpad = {
natural_scroll = true;
scroll_factor = 0.5;
};
};
gestures = {
workspace_swipe = true;
workspace_swipe_numbered = true;
};
decoration = {
rounding = 5;
drop_shadow = false;
};
bezier = [
"overshot, 0.05, 0.9, 0.1, 1.1"
"linear, 0.0, 0.0, 1.0, 1.0"
];
animations = {
enabled = true;
animation = [
"windows, 1, 1, default, popin"
"border, 1, 1, default"
"fade, 1, 1, default"
"workspaces, 1, 3, overshot"
"borderangle,1, 50, linear, loop"
];
};
bind = [
"SUPER, h, movefocus,l"
"SUPER, l, movefocus,r"
"SUPER, j, layoutmsg,cyclenext"
"SUPER, k, layoutmsg,cycleprev"
"SUPER, space, layoutmsg,swapwithmaster master"
"SUPER, F, fullscreen,"
"SUPER, V, togglefloating,"
"SUPER, W, layoutmsg, orientationprev"
"SUPER_SHIFT, W, layoutmsg, orientationnext"
"SUPER_SHIFT, V, togglegroup,"
"SUPER_SHIFT, h, changegroupactive,b"
"SUPER_SHIFT, h, moveintogroup,l"
"SUPER_SHIFT, l, moveintogroup,r"
"SUPER_SHIFT, l, changegroupactive,f"
"SUPER, Y, togglespecialworkspace"
"SUPER_SHIFT, Y, movetoworkspace, special"
"SUPER, R, submap, resize"
"SUPER,1,workspace,1"
"SUPER,2,workspace,2"
"SUPER,3,workspace,3"
"SUPER,4,workspace,4"
"SUPER,5,workspace,5"
"SUPER,6,workspace,6"
"SUPER,7,workspace,7"
"SUPER,8,workspace,8"
"SUPER,9,workspace,9"
"SUPER,0,workspace,10"
"SUPER,left,workspace,r-1"
"SUPER,right,workspace,r+1"
"SUPER_SHIFT,1,movetoworkspace,1"
"SUPER_SHIFT,2,movetoworkspace,2"
"SUPER_SHIFT,3,movetoworkspace,3"
"SUPER_SHIFT,4,movetoworkspace,4"
"SUPER_SHIFT,5,movetoworkspace,5"
"SUPER_SHIFT,6,movetoworkspace,6"
"SUPER_SHIFT,7,movetoworkspace,7"
"SUPER_SHIFT,8,movetoworkspace,8"
"SUPER_SHIFT,9,movetoworkspace,9"
"SUPER_SHIFT,0,movetoworkspace,10"
];
bindm = [
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
env = [
"GDK_BACKEND,wayland,x11"
"QT_QPA_PLATFORM,wayland;xcb"
"SDL_VIDEODRIVER,wayland"
"CLUTTER_BACKEND,wayland"
"XDG_CURRENT_DESKTOP,Hyprland"
"XDG_SESSION_TYPE,wayland"
"XDG_SESSION_DESKTOP,Hyprland"
"QT_AUTO_SCREEN_SCALE_FACTOR,1"
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
"NIXOS_OZONE_WL,1"
];
windowrule = [
"float, title:wlogout"
"idleinhibit always, vrmonitor"
"idleinhibit focus, steam_app"
];
workspace = [
"11, default:true"
];
general = {
gaps_out = 10;
resize_on_border = true;
layout = "master";
# "col.active_border" = "rgb(FFFF00) rgb(00FFFF) rgb(FF00FF)";
border_size = lib.mkDefault 5;
};
master = {
mfact = 0.7;
new_on_top = true;
};
misc = {
vrr = 2;
focus_on_activate = true;
};
};
# https://wiki.hyprland.org/Configuring/Variables/
extraConfig = ''
submap = resize
binde = ,right,resizeactive,10 0
binde = ,left,resizeactive,-10 0
binde = ,up,resizeactive,0 -10
binde = ,down,resizeactive,0 10
binde = ,k,resizeactive,0 -10
binde = ,j,resizeactive,0 10
binde = ,l,splitratio,0.05
binde = ,h,splitratio,-0.05
binde = SHIFT,l,splitratio,0.3
binde = SHIFT,h,splitratio,-0.3
bind = , escape, submap,reset
bind = , enter, submap,reset
bind = SUPER, R, submap,reset
bind = CONTROL, C, submap,reset
submap = reset
'';
};
wayland.windowManager.sway = mkIf cfg.sway {
enable = true;
};
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
settings = {
clock = true;
screenshots = true;
effect-scale = 0.5;
effect-blur = "10x10";
grace = 5;
};
};
services.swayidle = {
enable = true;
systemdTarget = "graphical-session.target";
events = [
{ event = "before-sleep"; command = "${pkgs.swaylock-effects}/bin/swaylock"; }
{ event = "lock"; command = "${pkgs.swaylock-effects}/bin/swaylock"; }
];
timeouts = [
{
timeout = 300;
command = "${pkgs.swaylock-effects}/bin/swaylock -f";
}
{
timeout = 600;
command = "systemctl suspend";
}
];
};
services.mako = {
enable = true;
};
programs.waybar = {
enable = true;
settings = {
mainBar = {
layer = "top";
position = "top";
height = 36;
modules-left = [ "hyprland/workspaces" "hyprland/window" ];
modules-right = [ "mpris" "pulseaudio" "clock" "tray" "battery" ];
clock = {
format = "📅 {:%a %b-%d %I:%M %p}";
};
pulseaudio = {
format-muted = "🔇 {volume}";
format = "{icon} {volume}";
format-icons.default = [ "🔈" "🔉" "🔊" ];
on-click = "${pkgs.pavucontrol}/bin/pavucontrol";
};
mpris = {
format = "{player_icon} {artist} - {title}";
format-paused = "{status_icon} {player_icon} {artist} - {title}";
player-icons = {
default = "";
mpd = "🎵";
kdeconnect = "";
};
status-icons = {
paused = "";
};
};
battery = {
format = "{icon} {capacity}%";
format-icons = [ "🤏" "🪫" "🔋" "🔋" ];
format-charging = "🔌 {capacity}%";
states = {
warning = 30;
critical = 15;
};
};
};
};
systemd = {
home-manager.users.${user}.imports = [
{
wayland.windowManager.hyprland = mkIf cfg.hyprland {
enable = true;
target = "graphical-session.target";
systemd.enable = true;
settings = {
input = {
touchpad = {
natural_scroll = true;
scroll_factor = 0.5;
};
};
gestures = {
workspace_swipe = true;
workspace_swipe_numbered = true;
};
decoration = {
rounding = 5;
drop_shadow = false;
};
bezier = [
"overshot, 0.05, 0.9, 0.1, 1.1"
"linear, 0.0, 0.0, 1.0, 1.0"
];
animations = {
enabled = true;
animation = [
"windows, 1, 1, default, popin"
"border, 1, 1, default"
"fade, 1, 1, default"
"workspaces, 1, 3, overshot"
"borderangle,1, 50, linear, loop"
];
};
bind = [
"SUPER, h, movefocus,l"
"SUPER, l, movefocus,r"
"SUPER, j, layoutmsg,cyclenext"
"SUPER, k, layoutmsg,cycleprev"
"SUPER, space, layoutmsg,swapwithmaster master"
"SUPER, F, fullscreen,"
"SUPER, V, togglefloating,"
"SUPER, W, layoutmsg, orientationprev"
"SUPER_SHIFT, W, layoutmsg, orientationnext"
"SUPER_SHIFT, V, togglegroup,"
"SUPER_SHIFT, h, changegroupactive,b"
"SUPER_SHIFT, h, moveintogroup,l"
"SUPER_SHIFT, l, moveintogroup,r"
"SUPER_SHIFT, l, changegroupactive,f"
"SUPER, Y, togglespecialworkspace"
"SUPER_SHIFT, Y, movetoworkspace, special"
"SUPER, R, submap, resize"
"SUPER,1,workspace,1"
"SUPER,2,workspace,2"
"SUPER,3,workspace,3"
"SUPER,4,workspace,4"
"SUPER,5,workspace,5"
"SUPER,6,workspace,6"
"SUPER,7,workspace,7"
"SUPER,8,workspace,8"
"SUPER,9,workspace,9"
"SUPER,0,workspace,10"
"SUPER,left,workspace,r-1"
"SUPER,right,workspace,r+1"
"SUPER_SHIFT,1,movetoworkspace,1"
"SUPER_SHIFT,2,movetoworkspace,2"
"SUPER_SHIFT,3,movetoworkspace,3"
"SUPER_SHIFT,4,movetoworkspace,4"
"SUPER_SHIFT,5,movetoworkspace,5"
"SUPER_SHIFT,6,movetoworkspace,6"
"SUPER_SHIFT,7,movetoworkspace,7"
"SUPER_SHIFT,8,movetoworkspace,8"
"SUPER_SHIFT,9,movetoworkspace,9"
"SUPER_SHIFT,0,movetoworkspace,10"
];
bindm = [
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
env = [
"GDK_BACKEND,wayland,x11"
"QT_QPA_PLATFORM,wayland;xcb"
"SDL_VIDEODRIVER,wayland"
"CLUTTER_BACKEND,wayland"
"XDG_CURRENT_DESKTOP,Hyprland"
"XDG_SESSION_TYPE,wayland"
"XDG_SESSION_DESKTOP,Hyprland"
"QT_AUTO_SCREEN_SCALE_FACTOR,1"
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
"NIXOS_OZONE_WL,1"
"WLR_NO_HARDWARE_CURSORS,1"
];
windowrule = [
"float, title:wlogout"
"idleinhibit always, vrmonitor"
"idleinhibit focus, steam_app"
];
workspace = [
"11, default:true"
];
general = {
gaps_out = 10;
resize_on_border = true;
layout = "master";
# "col.active_border" = "rgb(FFFF00) rgb(00FFFF) rgb(FF00FF)";
border_size = lib.mkDefault 5;
};
master = {
mfact = 0.7;
new_on_top = true;
};
misc = {
vrr = 2;
focus_on_activate = true;
};
};
# https://wiki.hyprland.org/Configuring/Variables/
extraConfig = ''
submap = resize
binde = ,right,resizeactive,10 0
binde = ,left,resizeactive,-10 0
binde = ,up,resizeactive,0 -10
binde = ,down,resizeactive,0 10
binde = ,k,resizeactive,0 -10
binde = ,j,resizeactive,0 10
binde = ,l,splitratio,0.05
binde = ,h,splitratio,-0.05
binde = SHIFT,l,splitratio,0.3
binde = SHIFT,h,splitratio,-0.3
bind = , escape, submap,reset
bind = , enter, submap,reset
bind = SUPER, R, submap,reset
bind = CONTROL, C, submap,reset
submap = reset
'';
};
style = ''
* {
min-height: 0;
}
window#waybar {
font-size: small;
background: rgba(0,0,0,0.8);
}
#workspaces button {
border-radius: 1rem;
padding: 0px .5rem;
margin: 0px .5rem 0px 0px;
}
wayland.windowManager.sway = mkIf cfg.sway {
enable = true;
};
#workspaces button.active {
background: rgba(255,255,255,0.8);
padding: 0px 1rem;
color: black;
}
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
settings = {
clock = true;
screenshots = true;
effect-scale = 0.5;
effect-blur = "10x10";
grace = 5;
};
};
#workspaces button.inactive:hover {
background: rgba(255,255,255,0.4);
color: black;
}
services.swayidle = {
enable = true;
systemdTarget = "graphical-session.target";
events = [
{
event = "before-sleep";
command = "${pkgs.swaylock-effects}/bin/swaylock";
}
{
event = "lock";
command = "${pkgs.swaylock-effects}/bin/swaylock";
}
];
timeouts = [
{
timeout = 300;
command = "${pkgs.swaylock-effects}/bin/swaylock -f";
}
{
timeout = 600;
command = "systemctl suspend";
}
];
};
.modules-right widget label {
padding: 0 1rem;
margin: 0 .5rem;
}
#tray {
min-width: 5rem;
}
'';
};
services.mako = {
enable = true;
};
programs.waybar = {
enable = true;
settings = {
mainBar = {
layer = "top";
position = "top";
height = 36;
modules-left = ["hyprland/workspaces" "hyprland/window"];
modules-right = ["mpris" "pulseaudio" "clock" "tray" "battery"];
clock = {
format = "📅 {:%a %b-%d %I:%M %p}";
};
pulseaudio = {
format-muted = "🔇 {volume}";
format = "{icon} {volume}";
format-icons.default = ["🔈" "🔉" "🔊"];
on-click = "${pkgs.pavucontrol}/bin/pavucontrol";
};
mpris = {
format = "{player_icon} {artist} - {title}";
format-paused = "{status_icon} {player_icon} {artist} - {title}";
player-icons = {
default = "";
mpd = "🎵";
kdeconnect = "";
};
status-icons = {
paused = "";
};
};
battery = {
format = "{icon} {capacity}%";
format-icons = ["🤏" "🪫" "🔋" "🔋"];
format-charging = "🔌 {capacity}%";
states = {
warning = 30;
critical = 15;
};
};
};
};
systemd = {
enable = true;
target = "graphical-session.target";
};
style = ''
* {
min-height: 0;
}
}];
window#waybar {
font-size: small;
background: rgba(0,0,0,0.8);
}
#workspaces button {
border-radius: 1rem;
padding: 0px .5rem;
margin: 0px .5rem 0px 0px;
}
#workspaces button.active {
background: rgba(255,255,255,0.8);
padding: 0px 1rem;
color: black;
}
#workspaces button.inactive:hover {
background: rgba(255,255,255,0.4);
color: black;
}
.modules-right widget label {
padding: 0 1rem;
margin: 0 .5rem;
}
#tray {
min-width: 5rem;
}
'';
};
}
];
};
}

View file

@ -1,12 +1,15 @@
{ user }: { lib, pkgs, config, ... }:
with lib;
{
{user}: {
lib,
pkgs,
config,
...
}:
with lib; {
options.roles.work = {
enable = mkEnableOption "work packages";
};
config = mkIf config.roles.work.enable {
roles.email = {
enable = true;
email = "tristan.beedell@cryoserver.com";
@ -20,68 +23,69 @@ with lib;
package = pkgs.vscode;
};
home-manager.users.${user}.imports = [{
home.packages = with pkgs; [
onedrive
kubectl
awscli2
docker-compose
minikube
kubernetes-helm
thunderbird
(import ../mkapp.nix "slack" {
inherit pkgs;
desktopName = "Slack";
app-id = "mpagibdhafmlkgpemeicgogjnhclenoc";
browser = "${brave}/opt/brave.com/brave/brave-browser";
})
(import ../mkapp.nix "teams" {
inherit pkgs;
browser = "${brave}/opt/brave.com/brave/brave-browser";
app-id = "cifhbcnohmdccbgoicgdjpfamggdegmo";
desktopName = "Microsoft Teams";
})
(pkgs.writeShellScriptBin "codex11" ''
NIXOS_OZONE_WL= ${pkgs.vscode}/bin/code $@
'')
remmina
];
gtk.gtk3.bookmarks = [
"file:///home/tristan/OneDrive/Documents/ OneDrive"
];
programs.vscode = {
extensions = with pkgs; [
vscode-extensions.ms-azuretools.vscode-docker
home-manager.users.${user}.imports = [
{
home.packages = with pkgs; [
onedrive
kubectl
awscli2
docker-compose
minikube
kubernetes-helm
thunderbird
(import ../mkapp.nix "slack" {
inherit pkgs;
desktopName = "Slack";
app-id = "mpagibdhafmlkgpemeicgogjnhclenoc";
browser = "${brave}/opt/brave.com/brave/brave-browser";
})
(import ../mkapp.nix "teams" {
inherit pkgs;
browser = "${brave}/opt/brave.com/brave/brave-browser";
app-id = "cifhbcnohmdccbgoicgdjpfamggdegmo";
desktopName = "Microsoft Teams";
})
(pkgs.writeShellScriptBin "codex11" ''
NIXOS_OZONE_WL= ${pkgs.vscode}/bin/code $@
'')
remmina
];
userSettings = {
"aws.telemetry" = false;
"gitlens.telemetry.enabled" = false;
"redhat.telemetry.enabled" = false;
gtk.gtk3.bookmarks = [
"file:///home/tristan/OneDrive/Documents/ OneDrive"
];
programs.vscode = {
extensions = with pkgs; [
vscode-extensions.ms-azuretools.vscode-docker
];
userSettings = {
"aws.telemetry" = false;
"gitlens.telemetry.enabled" = false;
"redhat.telemetry.enabled" = false;
};
};
};
wayland.windowManager.hyprland = {
extraConfig = ''
# === WORK MODULE ===
bind = SUPER, E, focuswindow, thunderbird
bind = SUPER, t, focuswindow, brave-cifhbcnohmdccbgoicgdjpfamggdegmo-Profile_2
'';
};
}];
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
# nonfree vscode required for dev containers
"vscode"
"steam-run"
wayland.windowManager.hyprland = {
extraConfig = ''
# === WORK MODULE ===
bind = SUPER, E, focuswindow, thunderbird
bind = SUPER, t, focuswindow, brave-cifhbcnohmdccbgoicgdjpfamggdegmo-Profile_2
'';
};
}
];
nixpkgs.config.allowUnfreePredicate = pkg:
builtins.elem (lib.getName pkg) [
# nonfree vscode required for dev containers
"vscode"
"steam-run"
];
networking = {
networkmanager = {
plugins = [ pkgs.networkmanager-openvpn ];
plugins = [pkgs.networkmanager-openvpn];
};
};
@ -93,10 +97,9 @@ with lib;
enable = false;
setSocketVariable = true;
daemon.settings = {
"userns-remap"= "default";
"userns-remap" = "default";
};
};
};
};
}

View file

@ -1,5 +1,9 @@
{ config, pkgs, lib, ... }:
let
{
config,
pkgs,
lib,
...
}: let
my-deps = {
notify-send = "${pkgs.libnotify}/bin/notify-send";
playerctl = "${pkgs.playerctl}/bin/playerctl";
@ -21,8 +25,7 @@ let
hyprpicker = "${pkgs.hyprpicker}/bin/hyprpicker";
sed = "${pkgs.gnused}/bin/sed";
};
in
{
in {
programs.scripts = [
{
name = "play-pause";
@ -38,25 +41,33 @@ in
fi
'';
hotkeys = [
{ modifier = ""; key = "XF86AudioPlay"; }
{
modifier = "";
key = "XF86AudioPlay";
}
];
}
{
name = "bwmenu";
text = ''
items="$(rbw list)"
echo "$items" | ${ my-deps.menu } | xargs -I_ rbw get _ | wl-copy
echo "$items" | ${my-deps.menu} | xargs -I_ rbw get _ | wl-copy
'';
hotkeys = [{ key = "P"; }];
hotkeys = [{key = "P";}];
install = false;
}
{
name = "bwotpmenu";
text = ''
items="$(rbw list)"
echo "$items" | ${ my-deps.menu } | xargs -I_ rbw code _ | wl-copy
echo "$items" | ${my-deps.menu} | xargs -I_ rbw code _ | wl-copy
'';
hotkeys = [{ modifier = "SUPER_SHIFT"; key = "P"; }];
hotkeys = [
{
modifier = "SUPER_SHIFT";
key = "P";
}
];
install = false;
}
{
@ -72,7 +83,10 @@ in
cat "$FILE" | wl-copy -t image/png
'';
hotkeys = [
{ modifier = "SUPER_SHIFT"; key = "S"; }
{
modifier = "SUPER_SHIFT";
key = "S";
}
];
}
{
@ -82,8 +96,16 @@ in
${my-deps.notify-send} "Brightness" -h int:value:$(light) -a brightness-down -t 1000
'';
hotkeys = [
{ modifier = ""; key = "XF86MonBrightnessDown"; args = "10"; }
{ modifier = "SHIFT"; key = "XF86MonBrightnessDown"; args = "1"; }
{
modifier = "";
key = "XF86MonBrightnessDown";
args = "10";
}
{
modifier = "SHIFT";
key = "XF86MonBrightnessDown";
args = "1";
}
];
install = false;
}
@ -94,8 +116,16 @@ in
${my-deps.notify-send} "Brightness" -h int:value:$(light) -a brightness-up -t 1000
'';
hotkeys = [
{ modifier = ""; key = "XF86MonBrightnessUp"; args = "10"; }
{ modifier = "SHIFT"; key = "XF86MonBrightnessUp"; args = "1"; }
{
modifier = "";
key = "XF86MonBrightnessUp";
args = "10";
}
{
modifier = "SHIFT";
key = "XF86MonBrightnessUp";
args = "1";
}
];
install = false;
}
@ -110,7 +140,7 @@ in
${my-deps.xargs} -I_ ${my-deps.hyprctl} dispatch focuswindow title:"_"
'';
hotkeys = [
{ key = "TAB"; }
{key = "TAB";}
];
}
{
@ -118,18 +148,22 @@ in
text = ''
${my-deps.hyprpicker} | wl-copy && notify-send "Copied Colour" "$(wl-paste)"
'';
hotkeys = [{
key = "G";
}];
hotkeys = [
{
key = "G";
}
];
}
(lib.mkIf config.roles.mpd.enable {
name = "ncmpcpp";
text = ''
${my-deps.terminal} -e ncmpcpp
'';
hotkeys = [{
key = "M";
}];
hotkeys = [
{
key = "M";
}
];
install = false;
})
{
@ -137,9 +171,11 @@ in
text = ''
${my-deps.runmenu}
'';
hotkeys = [{
key = "D";
}];
hotkeys = [
{
key = "D";
}
];
install = false;
}
{
@ -147,10 +183,12 @@ in
text = ''
hyprctl keyword misc:cursor_zoom_factor 2
'';
hotkeys = [{
modifier = "SUPER";
key = "EQUAL";
}];
hotkeys = [
{
modifier = "SUPER";
key = "EQUAL";
}
];
install = false;
}
{
@ -158,10 +196,12 @@ in
text = ''
hyprctl keyword misc:cursor_zoom_factor 1
'';
hotkeys = [{
modifier = "SUPER";
key = "MINUS";
}];
hotkeys = [
{
modifier = "SUPER";
key = "MINUS";
}
];
install = false;
}
{
@ -170,19 +210,25 @@ in
${my-deps.amixer} sset Master 5%+ && ${my-deps.amixer} sset Master unmute
'';
hotkeys = [
{ key = "bracketright"; }
{ modifier = ""; key = "XF86AudioRaiseVolume"; }
{key = "bracketright";}
{
modifier = "";
key = "XF86AudioRaiseVolume";
}
];
install = false;
}
{
name = "lower-volume";
text = ''
${ my-deps.amixer } sset Master 5%-
${my-deps.amixer} sset Master 5%-
'';
hotkeys = [
{ key = "bracketleft"; }
{ modifier = ""; key = "XF86AudioLowerVolume"; }
{key = "bracketleft";}
{
modifier = "";
key = "XF86AudioLowerVolume";
}
];
install = false;
}
@ -192,8 +238,14 @@ in
${my-deps.playerctl} next
'';
hotkeys = [
{ modifier = "SUPER_SHIFT"; key = "period"; }
{ modifier = ""; key = "XF86AudioNext"; }
{
modifier = "SUPER_SHIFT";
key = "period";
}
{
modifier = "";
key = "XF86AudioNext";
}
];
install = false;
}
@ -203,8 +255,14 @@ in
${my-deps.playerctl} previous
'';
hotkeys = [
{ modifier = "SUPER_SHIFT"; key = "comma"; }
{ modifier = ""; key = "XF86AudioPrev"; }
{
modifier = "SUPER_SHIFT";
key = "comma";
}
{
modifier = "";
key = "XF86AudioPrev";
}
];
install = false;
}
@ -212,7 +270,7 @@ in
name = "terminal";
text = my-deps.terminal;
hotkeys = [
{ key = "RETURN"; }
{key = "RETURN";}
];
install = false;
}
@ -220,7 +278,7 @@ in
name = "fileman";
text = my-deps.fileman;
hotkeys = [
{ key = "O"; }
{key = "O";}
];
install = false;
}
@ -237,7 +295,7 @@ in
esac
'';
hotkeys = [
{ key = "Z"; }
{key = "Z";}
];
install = false;
}