Reformat all Nix files
This commit is contained in:
parent
9e0c1102a9
commit
355b63cf73
81 changed files with 2293 additions and 1153 deletions
|
@ -1,15 +1,25 @@
|
|||
{ pkgs, config, lib, ... }:
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
mkUserJs = with lib; prefs: extraPrefs: ''
|
||||
// Generated by Geoffrey's dotfiles.
|
||||
mkUserJs =
|
||||
with lib;
|
||||
prefs: extraPrefs: ''
|
||||
// Generated by Geoffrey's dotfiles.
|
||||
|
||||
${concatStrings (mapAttrsToList (name: value: ''
|
||||
user_pref("${name}", ${builtins.toJSON value});
|
||||
'') prefs)}
|
||||
${extraPrefs}
|
||||
'';
|
||||
${concatStrings (
|
||||
mapAttrsToList (name: value: ''
|
||||
user_pref("${name}", ${builtins.toJSON value});
|
||||
'') prefs
|
||||
)}
|
||||
${extraPrefs}
|
||||
'';
|
||||
|
||||
toThunderbirdCalendar = account:
|
||||
toThunderbirdCalendar =
|
||||
account:
|
||||
let
|
||||
id = builtins.hashString "sha256" account.name;
|
||||
thunderbird = config.frogeye.accounts.calendar.accounts.${account.name};
|
||||
|
@ -43,25 +53,29 @@ in
|
|||
profiles.hm = {
|
||||
isDefault = true;
|
||||
withExternalGnupg = true;
|
||||
extraConfig = mkUserJs
|
||||
(lib.attrsets.mergeAttrsList (
|
||||
# Add calendar config
|
||||
(lib.mapAttrsToList (name: account: (toThunderbirdCalendar account)) config.accounts.calendar.accounts) ++
|
||||
extraConfig = mkUserJs (lib.attrsets.mergeAttrsList (
|
||||
# Add calendar config
|
||||
(lib.mapAttrsToList (
|
||||
name: account: (toThunderbirdCalendar account)
|
||||
) config.accounts.calendar.accounts)
|
||||
++
|
||||
# Add config for every identity (kinda)
|
||||
(lib.mapAttrsToList
|
||||
(name: account: ({
|
||||
# UPST Make signature be used in Thunderbird
|
||||
"mail.identity.id_${builtins.hashString "sha256" account.address}.htmlSigText" = account.signature.text;
|
||||
"mail.identity.id_${builtins.hashString "sha256" account.address}.compose_html" = false;
|
||||
}))
|
||||
config.accounts.email.accounts) ++
|
||||
(lib.mapAttrsToList (name: account: ({
|
||||
# UPST Make signature be used in Thunderbird
|
||||
"mail.identity.id_${builtins.hashString "sha256" account.address}.htmlSigText" =
|
||||
account.signature.text;
|
||||
"mail.identity.id_${builtins.hashString "sha256" account.address}.compose_html" = false;
|
||||
})) config.accounts.email.accounts)
|
||||
++
|
||||
# General settings
|
||||
[{
|
||||
"mail.pane_config.dynamic" = 0;
|
||||
"intl.date_time.pattern_override.date_short" = "yyyy-MM-dd";
|
||||
}]
|
||||
[
|
||||
{
|
||||
"mail.pane_config.dynamic" = 0;
|
||||
"intl.date_time.pattern_override.date_short" = "yyyy-MM-dd";
|
||||
}
|
||||
]
|
||||
|
||||
)) "";
|
||||
)) "";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -69,40 +83,45 @@ in
|
|||
options = {
|
||||
frogeye.accounts.calendar.accounts = lib.mkOption {
|
||||
default = { };
|
||||
type = lib.types.attrsOf (lib.types.submodule ({ config, name, ... }: {
|
||||
# TODO Set defaults as Thunderbird sets it
|
||||
options = {
|
||||
color = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "#5277c3";
|
||||
};
|
||||
refreshInterval = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 0; # 0 = Manual
|
||||
};
|
||||
readOnly = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
};
|
||||
showReminders = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
offlineSupport = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
email = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
# TODO Nullable
|
||||
# TODO Ensure it actually matches an email identity
|
||||
};
|
||||
clientSideEmailScheduling = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
};
|
||||
};
|
||||
}));
|
||||
type = lib.types.attrsOf (
|
||||
lib.types.submodule (
|
||||
{ config, name, ... }:
|
||||
{
|
||||
# TODO Set defaults as Thunderbird sets it
|
||||
options = {
|
||||
color = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "#5277c3";
|
||||
};
|
||||
refreshInterval = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 0; # 0 = Manual
|
||||
};
|
||||
readOnly = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
};
|
||||
showReminders = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
offlineSupport = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
email = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
# TODO Nullable
|
||||
# TODO Ensure it actually matches an email identity
|
||||
};
|
||||
clientSideEmailScheduling = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
)
|
||||
);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,27 +1,46 @@
|
|||
# Light theme during the day, dark theme during the night (not automatic)
|
||||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
phases = [
|
||||
{ command = "jour"; specialisation = null; }
|
||||
{ command = "crepuscule"; specialisation = "dark"; }
|
||||
{ command = "nuit"; specialisation = "dark"; }
|
||||
{
|
||||
command = "jour";
|
||||
specialisation = null;
|
||||
}
|
||||
{
|
||||
command = "crepuscule";
|
||||
specialisation = "dark";
|
||||
}
|
||||
{
|
||||
command = "nuit";
|
||||
specialisation = "dark";
|
||||
}
|
||||
];
|
||||
mod = config.xsession.windowManager.i3.config.modifier;
|
||||
in
|
||||
{
|
||||
config = {
|
||||
home.packages = (map
|
||||
(phase: (pkgs.writeShellScriptBin phase.command ''
|
||||
switch="/nix/var/nix/profiles/system${lib.strings.optionalString (phase.specialisation != null) "/specialisation/${phase.specialisation}"}/bin/switch-to-configuration"
|
||||
if [ -x "$switch" ]
|
||||
then
|
||||
sudo "$switch" test &
|
||||
sudo "$switch" boot &
|
||||
fi
|
||||
${builtins.getAttr phase.command config.frogeye.desktop.phasesCommands}
|
||||
wait
|
||||
''))
|
||||
phases) ++ (with pkgs; [
|
||||
home.packages =
|
||||
(map (
|
||||
phase:
|
||||
(pkgs.writeShellScriptBin phase.command ''
|
||||
switch="/nix/var/nix/profiles/system${
|
||||
lib.strings.optionalString (phase.specialisation != null) "/specialisation/${phase.specialisation}"
|
||||
}/bin/switch-to-configuration"
|
||||
if [ -x "$switch" ]
|
||||
then
|
||||
sudo "$switch" test &
|
||||
sudo "$switch" boot &
|
||||
fi
|
||||
${builtins.getAttr phase.command config.frogeye.desktop.phasesCommands}
|
||||
wait
|
||||
'')
|
||||
) phases)
|
||||
++ (with pkgs; [
|
||||
brightnessctl
|
||||
]);
|
||||
xsession.windowManager.i3.config.keybindings = {
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
{ pkgs, config, lib, labellenixpkgs, ... }:
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
labellenixpkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
labellepkgs = import labellenixpkgs { inherit (pkgs) system; };
|
||||
in
|
||||
|
@ -41,7 +47,6 @@ in
|
|||
la = "lsd -la";
|
||||
s = "sudo -s -E";
|
||||
|
||||
|
||||
# Preference
|
||||
wol = "wakeonlan"; # TODO Really, isn't wol better? Also wtf Arch aliases to pass because neither is installed anyways x)
|
||||
mutt = "neomutt";
|
||||
|
@ -73,13 +78,48 @@ in
|
|||
};
|
||||
colors = {
|
||||
# Base16 only, so it reuses the current theme.
|
||||
date = { day-old = 4; hour-old = 6; older = 5; };
|
||||
git-status = { conflicted = 14; default = 13; deleted = 1; ignored = 13; modified = 3; new-in-index = 2; new-in-workdir = 2; renamed = 4; typechange = 3; unmodified = 13; };
|
||||
date = {
|
||||
day-old = 4;
|
||||
hour-old = 6;
|
||||
older = 5;
|
||||
};
|
||||
git-status = {
|
||||
conflicted = 14;
|
||||
default = 13;
|
||||
deleted = 1;
|
||||
ignored = 13;
|
||||
modified = 3;
|
||||
new-in-index = 2;
|
||||
new-in-workdir = 2;
|
||||
renamed = 4;
|
||||
typechange = 3;
|
||||
unmodified = 13;
|
||||
};
|
||||
group = 6;
|
||||
inode = { invalid = 245; valid = 13; };
|
||||
links = { invalid = 9; valid = 14; };
|
||||
permission = { acl = 6; context = 14; exec = 1; exec-sticky = 5; no-access = 245; octal = 6; read = 2; write = 3; };
|
||||
size = { large = 1; medium = 9; none = 11; small = 3; };
|
||||
inode = {
|
||||
invalid = 245;
|
||||
valid = 13;
|
||||
};
|
||||
links = {
|
||||
invalid = 9;
|
||||
valid = 14;
|
||||
};
|
||||
permission = {
|
||||
acl = 6;
|
||||
context = 14;
|
||||
exec = 1;
|
||||
exec-sticky = 5;
|
||||
no-access = 245;
|
||||
octal = 6;
|
||||
read = 2;
|
||||
write = 3;
|
||||
};
|
||||
size = {
|
||||
large = 1;
|
||||
medium = 9;
|
||||
none = 11;
|
||||
small = 3;
|
||||
};
|
||||
tree-edge = 13;
|
||||
user = 2;
|
||||
};
|
||||
|
@ -95,8 +135,13 @@ in
|
|||
fzf = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
defaultOptions = [ "--height 40%" "--layout=default" ];
|
||||
fileWidgetOptions = [ "--preview '[[ -d {} ]] && ${pkgs.coreutils}/bin/ls -l --color=always {} || [[ \$(${pkgs.file}/bin/file --mime {}) =~ binary ]] && ${pkgs.file}/bin/file --brief {} || (${pkgs.highlight}/bin/highlight -O ansi -l {} || coderay {} || rougify {} || ${pkgs.coreutils}/bin/cat {}) 2> /dev/null | head -500'" ];
|
||||
defaultOptions = [
|
||||
"--height 40%"
|
||||
"--layout=default"
|
||||
];
|
||||
fileWidgetOptions = [
|
||||
"--preview '[[ -d {} ]] && ${pkgs.coreutils}/bin/ls -l --color=always {} || [[ \$(${pkgs.file}/bin/file --mime {}) =~ binary ]] && ${pkgs.file}/bin/file --brief {} || (${pkgs.highlight}/bin/highlight -O ansi -l {} || coderay {} || rougify {} || ${pkgs.coreutils}/bin/cat {}) 2> /dev/null | head -500'"
|
||||
];
|
||||
# TODO Above not working... not really used either?
|
||||
# file and friends are not in PATH by default... so here we want aboslute paths, which means those won't get reloaded. Meh.
|
||||
};
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
pactl = "exec ${pkgs.pulseaudio}/bin/pactl"; # TODO Use NixOS package if using NixOS
|
||||
mod = config.xsession.windowManager.i3.config.modifier;
|
||||
|
@ -27,14 +32,13 @@ in
|
|||
text = ''cookie-file = .config/pulse/pulse-cookie'';
|
||||
};
|
||||
};
|
||||
xsession.windowManager.i3.config.keybindings =
|
||||
{
|
||||
"XF86AudioRaiseVolume" = "${pactl} set-sink-mute @DEFAULT_SINK@ false; ${pactl} set-sink-volume @DEFAULT_SINK@ +5%";
|
||||
"XF86AudioLowerVolume" = "${pactl} set-sink-mute @DEFAULT_SINK@ false; ${pactl} set-sink-volume @DEFAULT_SINK@ -5%";
|
||||
"XF86AudioMute" = "${pactl} set-sink-mute @DEFAULT_SINK@ true";
|
||||
"${mod}+F8" = "${pactl} suspend-sink @DEFAULT_SINK@ 1; ${pactl} suspend-sink @DEFAULT_SINK@ 0"; # Re-synchronize bluetooth headset
|
||||
"${mod}+F11" = "exec ${pkgs.pavucontrol}/bin/pwvucontrol";
|
||||
# TODO Find pacmixer?
|
||||
};
|
||||
xsession.windowManager.i3.config.keybindings = {
|
||||
"XF86AudioRaiseVolume" = "${pactl} set-sink-mute @DEFAULT_SINK@ false; ${pactl} set-sink-volume @DEFAULT_SINK@ +5%";
|
||||
"XF86AudioLowerVolume" = "${pactl} set-sink-mute @DEFAULT_SINK@ false; ${pactl} set-sink-volume @DEFAULT_SINK@ -5%";
|
||||
"XF86AudioMute" = "${pactl} set-sink-mute @DEFAULT_SINK@ true";
|
||||
"${mod}+F8" = "${pactl} suspend-sink @DEFAULT_SINK@ 1; ${pactl} suspend-sink @DEFAULT_SINK@ 0"; # Re-synchronize bluetooth headset
|
||||
"${mod}+F11" = "exec ${pkgs.pavucontrol}/bin/pwvucontrol";
|
||||
# TODO Find pacmixer?
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,10 +1,30 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
builtin_configs = [ "off" "common" "clone-largest" "horizontal" "vertical" "horizontal-reverse" "vertical-reverse" ];
|
||||
autorandrmenu = { title, option, builtin ? false }: pkgs.writeShellScript "autorandrmenu"
|
||||
''
|
||||
builtin_configs = [
|
||||
"off"
|
||||
"common"
|
||||
"clone-largest"
|
||||
"horizontal"
|
||||
"vertical"
|
||||
"horizontal-reverse"
|
||||
"vertical-reverse"
|
||||
];
|
||||
autorandrmenu =
|
||||
{
|
||||
title,
|
||||
option,
|
||||
builtin ? false,
|
||||
}:
|
||||
pkgs.writeShellScript "autorandrmenu" ''
|
||||
shopt -s nullglob globstar
|
||||
profiles="${if builtin then lib.strings.concatLines builtin_configs else ""}$(${pkgs.autorandr}/bin/autorandr | ${pkgs.gawk}/bin/awk '{ print $1 }')"
|
||||
profiles="${
|
||||
if builtin then lib.strings.concatLines builtin_configs else ""
|
||||
}$(${pkgs.autorandr}/bin/autorandr | ${pkgs.gawk}/bin/awk '{ print $1 }')"
|
||||
profile="$(echo "$profiles" | ${config.programs.rofi.package}/bin/rofi -dmenu -p "${title}")"
|
||||
[[ -n "$profile" ]] || exit
|
||||
${pkgs.autorandr}/bin/autorandr ${option} "$profile"
|
||||
|
@ -13,17 +33,38 @@ in
|
|||
{
|
||||
config = lib.mkIf config.frogeye.desktop.xorg {
|
||||
frogeye.desktop.i3.bindmodes = {
|
||||
"Screen setup [A] Auto [L] Load [S] Save [R] Remove [D] Default" =
|
||||
{
|
||||
bindings = {
|
||||
"a" = "exec ${pkgs.autorandr}/bin/autorandr --change --force, mode default";
|
||||
"l" = "exec ${autorandrmenu {title="Load profile"; option="--load"; builtin = true;}}, mode default";
|
||||
"s" = "exec ${autorandrmenu {title="Save profile"; option="--save";}}, mode default";
|
||||
"r" = "exec ${autorandrmenu {title="Remove profile"; option="--remove";}}, mode default";
|
||||
"d" = "exec ${autorandrmenu {title="Default profile"; option="--default"; builtin = true;}}, mode default";
|
||||
};
|
||||
mod_enter = "t";
|
||||
"Screen setup [A] Auto [L] Load [S] Save [R] Remove [D] Default" = {
|
||||
bindings = {
|
||||
"a" = "exec ${pkgs.autorandr}/bin/autorandr --change --force, mode default";
|
||||
"l" = "exec ${
|
||||
autorandrmenu {
|
||||
title = "Load profile";
|
||||
option = "--load";
|
||||
builtin = true;
|
||||
}
|
||||
}, mode default";
|
||||
"s" = "exec ${
|
||||
autorandrmenu {
|
||||
title = "Save profile";
|
||||
option = "--save";
|
||||
}
|
||||
}, mode default";
|
||||
"r" = "exec ${
|
||||
autorandrmenu {
|
||||
title = "Remove profile";
|
||||
option = "--remove";
|
||||
}
|
||||
}, mode default";
|
||||
"d" = "exec ${
|
||||
autorandrmenu {
|
||||
title = "Default profile";
|
||||
option = "--default";
|
||||
builtin = true;
|
||||
}
|
||||
}, mode default";
|
||||
};
|
||||
mod_enter = "t";
|
||||
};
|
||||
};
|
||||
programs.autorandr.enable = true;
|
||||
services.autorandr.enable = true;
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, config, lib, ... }:
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
# This correctly sets the background on some occasions, below does the rest
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
{ pkgs, lib, config, nur, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
nur,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.desktop.xorg {
|
||||
home.sessionVariables = {
|
||||
|
@ -14,27 +20,25 @@
|
|||
};
|
||||
|
||||
profiles.hm = {
|
||||
extensions = with config.nur.repos.rycee.firefox-addons;
|
||||
[
|
||||
(buildFirefoxXpiAddon {
|
||||
extensions = with config.nur.repos.rycee.firefox-addons; [
|
||||
(buildFirefoxXpiAddon {
|
||||
|
||||
pname = "onetab";
|
||||
version = "0.1.0";
|
||||
addonId = "onetab@nated";
|
||||
url = "https://addons.mozilla.org/firefox/downloads/file/4118712/one_tab_per_window-0.1.0.xpi";
|
||||
sha256 = "sha256-64DeL2xgXpqz32LJWDx4jhS2Fvbld8re3z8fdwnNTw0=";
|
||||
meta = with lib;
|
||||
{
|
||||
homepage = "https://git.sr.ht/~nated/onetab";
|
||||
description = "When a new tab is opened, redirects it to a new window instead.";
|
||||
license = licenses.unfree;
|
||||
mozPermissions = [ "tabs" ];
|
||||
platforms = platforms.all;
|
||||
};
|
||||
})
|
||||
tridactyl
|
||||
ublock-origin
|
||||
];
|
||||
pname = "onetab";
|
||||
version = "0.1.0";
|
||||
addonId = "onetab@nated";
|
||||
url = "https://addons.mozilla.org/firefox/downloads/file/4118712/one_tab_per_window-0.1.0.xpi";
|
||||
sha256 = "sha256-64DeL2xgXpqz32LJWDx4jhS2Fvbld8re3z8fdwnNTw0=";
|
||||
meta = with lib; {
|
||||
homepage = "https://git.sr.ht/~nated/onetab";
|
||||
description = "When a new tab is opened, redirects it to a new window instead.";
|
||||
license = licenses.unfree;
|
||||
mozPermissions = [ "tabs" ];
|
||||
platforms = platforms.all;
|
||||
};
|
||||
})
|
||||
tridactyl
|
||||
ublock-origin
|
||||
];
|
||||
search = {
|
||||
default = "DuckDuckGo";
|
||||
engines = {
|
||||
|
@ -44,8 +48,14 @@
|
|||
{
|
||||
template = "https://search.nixos.org/packages";
|
||||
params = [
|
||||
{ name = "type"; value = "packages"; }
|
||||
{ name = "query"; value = "{searchTerms}"; }
|
||||
{
|
||||
name = "type";
|
||||
value = "packages";
|
||||
}
|
||||
{
|
||||
name = "query";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
|
@ -53,7 +63,7 @@
|
|||
definedAliases = [ "@np" ];
|
||||
};
|
||||
"NixOS Wiki" = {
|
||||
urls = [{ template = "https://nixos.wiki/index.php?search={searchTerms}"; }];
|
||||
urls = [ { template = "https://nixos.wiki/index.php?search={searchTerms}"; } ];
|
||||
iconUpdateURL = "https://nixos.wiki/favicon.png";
|
||||
updateInterval = 24 * 60 * 60 * 1000; # every day
|
||||
definedAliases = [ "@nw" ];
|
||||
|
@ -151,7 +161,14 @@
|
|||
tls.certificate_errors = "ask-block-thirdparty";
|
||||
javascript.clipboard = "access"; # copy-paste is fine
|
||||
};
|
||||
editor.command = [ "${pkgs.neovide}/bin/neovide" "--" "-f" "{file}" "-c" "normal {line}G{column0}l" ];
|
||||
editor.command = [
|
||||
"${pkgs.neovide}/bin/neovide"
|
||||
"--"
|
||||
"-f"
|
||||
"{file}"
|
||||
"-c"
|
||||
"normal {line}G{column0}l"
|
||||
];
|
||||
# TODO Doesn't work on Arch. Does it even load the right profile on Nix?
|
||||
# TODO spellcheck.languages = ["fr-FR" "en-GB" "en-US"];
|
||||
};
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, config, lib, ... }:
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
./audio
|
||||
|
@ -52,7 +57,10 @@
|
|||
hwdec = "auto-safe";
|
||||
profile = "gpu-hq";
|
||||
};
|
||||
scripts = with pkgs.mpvScripts; [ thumbnail mpris ];
|
||||
scripts = with pkgs.mpvScripts; [
|
||||
thumbnail
|
||||
mpris
|
||||
];
|
||||
scriptOpts = {
|
||||
mpv_thumbnail_script = {
|
||||
autogenerate = false; # TODO It creates too many processes at once, crashing the system
|
||||
|
@ -66,68 +74,86 @@
|
|||
xdg = {
|
||||
userDirs =
|
||||
let
|
||||
wellKnownUserDirs = [ "desktop" "documents" "download" "music" "pictures" "publicShare" "templates" "videos" ];
|
||||
wellKnownUserDirsNulled = builtins.listToAttrs (builtins.map (name: { inherit name; value = null; }) wellKnownUserDirs);
|
||||
wellKnownUserDirs = [
|
||||
"desktop"
|
||||
"documents"
|
||||
"download"
|
||||
"music"
|
||||
"pictures"
|
||||
"publicShare"
|
||||
"templates"
|
||||
"videos"
|
||||
];
|
||||
wellKnownUserDirsNulled = builtins.listToAttrs (
|
||||
builtins.map (name: {
|
||||
inherit name;
|
||||
value = null;
|
||||
}) wellKnownUserDirs
|
||||
);
|
||||
allFolders = builtins.attrValues config.frogeye.folders;
|
||||
folders = builtins.filter (folder: folder.xdgUserDirVariable != null && folder.user == config.home.username) allFolders;
|
||||
folders = builtins.filter (
|
||||
folder: folder.xdgUserDirVariable != null && folder.user == config.home.username
|
||||
) allFolders;
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
createDirectories = true;
|
||||
extraConfig = builtins.listToAttrs (builtins.map
|
||||
(folder: {
|
||||
extraConfig = builtins.listToAttrs (
|
||||
builtins.map (folder: {
|
||||
name = folder.xdgUserDirVariable;
|
||||
value = "${config.home.homeDirectory}/${folder.path}";
|
||||
})
|
||||
folders);
|
||||
} // wellKnownUserDirsNulled; # Don't use defaults dirs
|
||||
}) folders
|
||||
);
|
||||
}
|
||||
// wellKnownUserDirsNulled; # Don't use defaults dirs
|
||||
};
|
||||
services = {
|
||||
blueman-applet.enable = true;
|
||||
unclutter.enable = true;
|
||||
dunst =
|
||||
{
|
||||
enable = true;
|
||||
settings =
|
||||
# TODO Change dmenu for rofi, so we can use context
|
||||
with config.lib.stylix.colors.withHashtag; {
|
||||
global = {
|
||||
separator_color = lib.mkForce base05;
|
||||
idle_threshold = 120;
|
||||
markup = "full";
|
||||
max_icon_size = 48;
|
||||
# TODO Those shortcuts don't seem to work, maybe try:
|
||||
# > define shortcuts inside your window manager and bind them to dunstctl(1) commands
|
||||
close_all = "ctrl+mod4+n";
|
||||
close = "mod4+n";
|
||||
context = "mod1+mod4+n";
|
||||
history = "shift+mod4+n";
|
||||
};
|
||||
|
||||
urgency_low = {
|
||||
background = lib.mkForce base01;
|
||||
foreground = lib.mkForce base03;
|
||||
frame_color = lib.mkForce base05;
|
||||
};
|
||||
urgency_normal = {
|
||||
background = lib.mkForce base02;
|
||||
foreground = lib.mkForce base05;
|
||||
frame_color = lib.mkForce base05;
|
||||
};
|
||||
urgency_critical = {
|
||||
background = lib.mkForce base08;
|
||||
foreground = lib.mkForce base06;
|
||||
frame_color = lib.mkForce base05;
|
||||
};
|
||||
dunst = {
|
||||
enable = true;
|
||||
settings =
|
||||
# TODO Change dmenu for rofi, so we can use context
|
||||
with config.lib.stylix.colors.withHashtag; {
|
||||
global = {
|
||||
separator_color = lib.mkForce base05;
|
||||
idle_threshold = 120;
|
||||
markup = "full";
|
||||
max_icon_size = 48;
|
||||
# TODO Those shortcuts don't seem to work, maybe try:
|
||||
# > define shortcuts inside your window manager and bind them to dunstctl(1) commands
|
||||
close_all = "ctrl+mod4+n";
|
||||
close = "mod4+n";
|
||||
context = "mod1+mod4+n";
|
||||
history = "shift+mod4+n";
|
||||
};
|
||||
};
|
||||
|
||||
urgency_low = {
|
||||
background = lib.mkForce base01;
|
||||
foreground = lib.mkForce base03;
|
||||
frame_color = lib.mkForce base05;
|
||||
};
|
||||
urgency_normal = {
|
||||
background = lib.mkForce base02;
|
||||
foreground = lib.mkForce base05;
|
||||
frame_color = lib.mkForce base05;
|
||||
};
|
||||
urgency_critical = {
|
||||
background = lib.mkForce base08;
|
||||
foreground = lib.mkForce base06;
|
||||
frame_color = lib.mkForce base05;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
home = {
|
||||
file = {
|
||||
".face" = {
|
||||
# TODO Only works on pindakaas? See https://wiki.archlinux.org/title/LightDM#Changing_your_avatar
|
||||
source = pkgs.runCommand "face.png" { } "${pkgs.inkscape}/bin/inkscape ${./face.svg} -w 1024 -o $out";
|
||||
source =
|
||||
pkgs.runCommand "face.png" { }
|
||||
"${pkgs.inkscape}/bin/inkscape ${./face.svg} -w 1024 -o $out";
|
||||
};
|
||||
};
|
||||
packages = with pkgs; [
|
||||
|
|
|
@ -1,17 +1,25 @@
|
|||
{ pkgs ? import <nixpkgs> { config = { }; overlays = [ ]; }, ... }:
|
||||
{
|
||||
pkgs ? import <nixpkgs> {
|
||||
config = { };
|
||||
overlays = [ ];
|
||||
},
|
||||
...
|
||||
}:
|
||||
let
|
||||
lemonbar = (pkgs.lemonbar-xft.overrideAttrs (old: {
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "drscream";
|
||||
repo = "lemonbar-xft";
|
||||
rev = "a64a2a6a6d643f4d92f9d7600722710eebce7bdb";
|
||||
sha256 = "sha256-T5FhEPIiDt/9paJwL9Sj84CBtA0YFi1hZz0+87Hd6jU=";
|
||||
# https://github.com/drscream/lemonbar-xft/pull/2
|
||||
};
|
||||
}));
|
||||
lemonbar = (
|
||||
pkgs.lemonbar-xft.overrideAttrs (old: {
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "drscream";
|
||||
repo = "lemonbar-xft";
|
||||
rev = "a64a2a6a6d643f4d92f9d7600722710eebce7bdb";
|
||||
sha256 = "sha256-T5FhEPIiDt/9paJwL9Sj84CBtA0YFi1hZz0+87Hd6jU=";
|
||||
# https://github.com/drscream/lemonbar-xft/pull/2
|
||||
};
|
||||
})
|
||||
);
|
||||
in
|
||||
# Tried using pyproject.nix but mpd2 dependency wouldn't resolve,
|
||||
# is called pyton-mpd2 on PyPi but mpd2 in nixpkgs.
|
||||
# is called pyton-mpd2 on PyPi but mpd2 in nixpkgs.
|
||||
pkgs.python3Packages.buildPythonApplication rec {
|
||||
pname = "frobar";
|
||||
version = "2.0";
|
||||
|
@ -25,7 +33,12 @@ pkgs.python3Packages.buildPythonApplication rec {
|
|||
pulsectl
|
||||
pyinotify
|
||||
];
|
||||
nativeBuildInputs = [ lemonbar ] ++ (with pkgs; [ wirelesstools playerctl ]);
|
||||
nativeBuildInputs =
|
||||
[ lemonbar ]
|
||||
++ (with pkgs; [
|
||||
wirelesstools
|
||||
playerctl
|
||||
]);
|
||||
makeWrapperArgs = [ "--prefix PATH : ${pkgs.lib.makeBinPath nativeBuildInputs}" ];
|
||||
|
||||
src = ./.;
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.desktop.xorg {
|
||||
xsession.windowManager.i3.config.bars = [ ];
|
||||
|
@ -15,10 +20,12 @@
|
|||
Service = {
|
||||
# Wait for i3 to start. Can't use ExecStartPre because otherwise it blocks graphical-session.target, and there's nothing i3/systemd
|
||||
# TODO Do that better
|
||||
ExecStart = ''${pkgs.bash}/bin/bash -c "while ! ${pkgs.i3}/bin/i3-msg; do ${pkgs.coreutils}/bin/sleep 1; done; ${pkgs.callPackage ./. {}}/bin/frobar"'';
|
||||
ExecStart = ''${pkgs.bash}/bin/bash -c "while ! ${pkgs.i3}/bin/i3-msg; do ${pkgs.coreutils}/bin/sleep 1; done; ${pkgs.callPackage ./. { }}/bin/frobar"'';
|
||||
};
|
||||
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,33 +1,59 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
# FOCUS
|
||||
focus = "exec ${ pkgs.writeShellScript "i3-focus-window" ''
|
||||
focus = "exec ${pkgs.writeShellScript "i3-focus-window" ''
|
||||
WINDOW=`${pkgs.xdotool}/bin/xdotool getwindowfocus`
|
||||
eval `${pkgs.xdotool}/bin/xdotool getwindowgeometry --shell $WINDOW` # this brings in variables WIDTH and HEIGHT
|
||||
TX=`${pkgs.coreutils}/bin/expr $WIDTH / 2`
|
||||
TY=`${pkgs.coreutils}/bin/expr $HEIGHT / 2`
|
||||
${pkgs.xdotool}/bin/xdotool mousemove -window $WINDOW $TX $TY
|
||||
''
|
||||
}";
|
||||
''}";
|
||||
|
||||
# CARDINALS
|
||||
cardinals = [
|
||||
{ vi = "h"; arrow = "Left"; container = "left"; workspace = "prev_on_output"; output = "left"; }
|
||||
{ vi = "l"; arrow = "Right"; container = "right"; workspace = "next_on_output"; output = "right"; }
|
||||
{ vi = "j"; arrow = "Down"; container = "down"; workspace = "prev"; output = "below"; }
|
||||
{ vi = "k"; arrow = "Up"; container = "up"; workspace = "next"; output = "above"; }
|
||||
{
|
||||
vi = "h";
|
||||
arrow = "Left";
|
||||
container = "left";
|
||||
workspace = "prev_on_output";
|
||||
output = "left";
|
||||
}
|
||||
{
|
||||
vi = "l";
|
||||
arrow = "Right";
|
||||
container = "right";
|
||||
workspace = "next_on_output";
|
||||
output = "right";
|
||||
}
|
||||
{
|
||||
vi = "j";
|
||||
arrow = "Down";
|
||||
container = "down";
|
||||
workspace = "prev";
|
||||
output = "below";
|
||||
}
|
||||
{
|
||||
vi = "k";
|
||||
arrow = "Up";
|
||||
container = "up";
|
||||
workspace = "next";
|
||||
output = "above";
|
||||
}
|
||||
];
|
||||
forEachCardinal = f: map (c: f c) cardinals;
|
||||
|
||||
# WORKSPACES
|
||||
workspaces_keys = lib.strings.stringToCharacters "1234567890";
|
||||
workspaces = map
|
||||
(i: {
|
||||
id = i;
|
||||
name = builtins.toString (i + 1);
|
||||
key = builtins.elemAt workspaces_keys i;
|
||||
})
|
||||
(lib.lists.range 0 ((builtins.length workspaces_keys) - 1));
|
||||
workspaces = map (i: {
|
||||
id = i;
|
||||
name = builtins.toString (i + 1);
|
||||
key = builtins.elemAt workspaces_keys i;
|
||||
}) (lib.lists.range 0 ((builtins.length workspaces_keys) - 1));
|
||||
forEachWorkspace = f: map (w: f w) workspaces;
|
||||
|
||||
# MISC
|
||||
|
@ -54,13 +80,47 @@ in
|
|||
names = [ config.stylix.fonts.sansSerif.name ];
|
||||
};
|
||||
terminal = "alacritty";
|
||||
colors = let ignore = "#ff00ff"; in
|
||||
with config.lib.stylix.colors.withHashtag; lib.mkForce {
|
||||
focused = { border = base0B; background = base0B; text = base00; indicator = base00; childBorder = base0B; };
|
||||
focusedInactive = { border = base02; background = base02; text = base05; indicator = base02; childBorder = base02; };
|
||||
unfocused = { border = base05; background = base04; text = base00; indicator = base04; childBorder = base00; };
|
||||
urgent = { border = base0F; background = base08; text = base00; indicator = base08; childBorder = base0F; };
|
||||
placeholder = { border = ignore; background = base00; text = base05; indicator = ignore; childBorder = base00; };
|
||||
colors =
|
||||
let
|
||||
ignore = "#ff00ff";
|
||||
in
|
||||
with config.lib.stylix.colors.withHashtag;
|
||||
lib.mkForce {
|
||||
focused = {
|
||||
border = base0B;
|
||||
background = base0B;
|
||||
text = base00;
|
||||
indicator = base00;
|
||||
childBorder = base0B;
|
||||
};
|
||||
focusedInactive = {
|
||||
border = base02;
|
||||
background = base02;
|
||||
text = base05;
|
||||
indicator = base02;
|
||||
childBorder = base02;
|
||||
};
|
||||
unfocused = {
|
||||
border = base05;
|
||||
background = base04;
|
||||
text = base00;
|
||||
indicator = base04;
|
||||
childBorder = base00;
|
||||
};
|
||||
urgent = {
|
||||
border = base0F;
|
||||
background = base08;
|
||||
text = base00;
|
||||
indicator = base08;
|
||||
childBorder = base0F;
|
||||
};
|
||||
placeholder = {
|
||||
border = ignore;
|
||||
background = base00;
|
||||
text = base05;
|
||||
indicator = ignore;
|
||||
childBorder = base00;
|
||||
};
|
||||
background = base07;
|
||||
# I set the color of the active tab as the the background color of the terminal so they merge together.
|
||||
};
|
||||
|
@ -82,12 +142,10 @@ in
|
|||
# Start Applications
|
||||
"${mod}+p" = "exec ${pkgs.xfce.thunar}/bin/thunar";
|
||||
# Misc
|
||||
"${mod}+F10" = "exec ${ pkgs.writeShellScript "show-keyboard-layout"
|
||||
''
|
||||
layout=`${pkgs.xorg.setxkbmap}/bin/setxkbmap -query | ${pkgs.gnugrep}/bin/grep ^layout: | ${pkgs.gawk}/bin/awk '{ print $2 }'`
|
||||
${pkgs.libgnomekbd}/bin/gkbd-keyboard-display -l $layout
|
||||
''
|
||||
}";
|
||||
"${mod}+F10" = "exec ${pkgs.writeShellScript "show-keyboard-layout" ''
|
||||
layout=`${pkgs.xorg.setxkbmap}/bin/setxkbmap -query | ${pkgs.gnugrep}/bin/grep ^layout: | ${pkgs.gawk}/bin/awk '{ print $2 }'`
|
||||
${pkgs.libgnomekbd}/bin/gkbd-keyboard-display -l $layout
|
||||
''}";
|
||||
# workspace back and forth (with/without active container)
|
||||
"${mod}+b" = "workspace back_and_forth; ${focus}";
|
||||
"${mod}+Shift+b" = "move container to workspace back_and_forth; workspace back_and_forth; ${focus}";
|
||||
|
@ -107,38 +165,55 @@ in
|
|||
"${mod}+Shift+c" = "reload";
|
||||
"${mod}+Shift+r" = "restart";
|
||||
"${mod}+Shift+e" = "exit";
|
||||
} // lib.mapAttrs' (k: v: lib.nameValuePair v.enter "mode ${v.name}") (lib.filterAttrs (k: v: v.enter != null) modes)
|
||||
// lib.attrsets.mergeAttrsList (forEachCardinal (c: {
|
||||
# change focus
|
||||
"${mod}+${c.vi}" = "focus ${c.container}; ${focus}";
|
||||
# move focused window
|
||||
"${mod}+Shift+${c.vi}" = "move ${c.container}; ${focus}";
|
||||
#navigate workspaces next / previous
|
||||
"${mod}+Ctrl+${c.vi}" = "workspace ${c.workspace}; ${focus}";
|
||||
# Move to workspace next / previous with focused container
|
||||
"${mod}+Ctrl+Shift+${c.vi}" = "move container to workspace ${c.workspace}; workspace ${c.workspace}; ${focus}";
|
||||
# move workspaces to screen (arrow keys)
|
||||
"${mod}+Ctrl+Shift+${c.arrow}" = "move workspace to output ${c.output}; ${focus}";
|
||||
})) // lib.attrsets.mergeAttrsList (forEachWorkspace (w: {
|
||||
# Switch to workspace
|
||||
"${mod}+${w.key}" = "workspace ${w.name}; ${focus}";
|
||||
# move focused container to workspace
|
||||
"${mod}+ctrl+${w.key}" = "move container to workspace ${w.name}; ${focus}";
|
||||
# move to workspace with focused container
|
||||
"${mod}+shift+${w.key}" = "move container to workspace ${w.name}; workspace ${w.name}; ${focus}";
|
||||
}));
|
||||
modes = lib.mapAttrs'
|
||||
(k: v: lib.nameValuePair v.name (v.bindings // lib.optionalAttrs v.return_bindings {
|
||||
"Return" = "mode default";
|
||||
"Escape" = "mode default";
|
||||
}))
|
||||
modes;
|
||||
}
|
||||
// lib.mapAttrs' (k: v: lib.nameValuePair v.enter "mode ${v.name}") (
|
||||
lib.filterAttrs (k: v: v.enter != null) modes
|
||||
)
|
||||
// lib.attrsets.mergeAttrsList (
|
||||
forEachCardinal (c: {
|
||||
# change focus
|
||||
"${mod}+${c.vi}" = "focus ${c.container}; ${focus}";
|
||||
# move focused window
|
||||
"${mod}+Shift+${c.vi}" = "move ${c.container}; ${focus}";
|
||||
#navigate workspaces next / previous
|
||||
"${mod}+Ctrl+${c.vi}" = "workspace ${c.workspace}; ${focus}";
|
||||
# Move to workspace next / previous with focused container
|
||||
"${mod}+Ctrl+Shift+${c.vi}" = "move container to workspace ${c.workspace}; workspace ${c.workspace}; ${focus}";
|
||||
# move workspaces to screen (arrow keys)
|
||||
"${mod}+Ctrl+Shift+${c.arrow}" = "move workspace to output ${c.output}; ${focus}";
|
||||
})
|
||||
)
|
||||
// lib.attrsets.mergeAttrsList (
|
||||
forEachWorkspace (w: {
|
||||
# Switch to workspace
|
||||
"${mod}+${w.key}" = "workspace ${w.name}; ${focus}";
|
||||
# move focused container to workspace
|
||||
"${mod}+ctrl+${w.key}" = "move container to workspace ${w.name}; ${focus}";
|
||||
# move to workspace with focused container
|
||||
"${mod}+shift+${w.key}" = "move container to workspace ${w.name}; workspace ${w.name}; ${focus}";
|
||||
})
|
||||
);
|
||||
modes = lib.mapAttrs' (
|
||||
k: v:
|
||||
lib.nameValuePair v.name (
|
||||
v.bindings
|
||||
// lib.optionalAttrs v.return_bindings {
|
||||
"Return" = "mode default";
|
||||
"Escape" = "mode default";
|
||||
}
|
||||
)
|
||||
) modes;
|
||||
window = {
|
||||
hideEdgeBorders = "both";
|
||||
titlebar = false; # So that single-container screens are basically almost fullscreen
|
||||
commands = [
|
||||
# switch to workspace with urgent window automatically
|
||||
{ criteria = { urgent = "latest"; }; command = "focus"; }
|
||||
{
|
||||
criteria = {
|
||||
urgent = "latest";
|
||||
};
|
||||
command = "focus";
|
||||
}
|
||||
];
|
||||
};
|
||||
floating = {
|
||||
|
@ -150,19 +225,26 @@ in
|
|||
startup = [
|
||||
{
|
||||
notification = false;
|
||||
command = "${pkgs.writeShellApplication {
|
||||
name = "batteryNotify";
|
||||
runtimeInputs = with pkgs; [coreutils libnotify];
|
||||
text = builtins.readFile ./batteryNotify.sh;
|
||||
# TODO Use batsignal instead?
|
||||
# TODO Only on computers with battery
|
||||
}}/bin/batteryNotify";
|
||||
command = "${
|
||||
pkgs.writeShellApplication {
|
||||
name = "batteryNotify";
|
||||
runtimeInputs = with pkgs; [
|
||||
coreutils
|
||||
libnotify
|
||||
];
|
||||
text = builtins.readFile ./batteryNotify.sh;
|
||||
# TODO Use batsignal instead?
|
||||
# TODO Only on computers with battery
|
||||
}
|
||||
}/bin/batteryNotify";
|
||||
}
|
||||
];
|
||||
workspaceLayout = "tabbed";
|
||||
focus.mouseWarping = true; # i3 only supports warping to workspace, hence ${focus}
|
||||
workspaceOutputAssign =
|
||||
forEachWorkspace (w: { output = builtins.elemAt x11_screens (lib.mod w.id (builtins.length x11_screens)); workspace = w.name; });
|
||||
workspaceOutputAssign = forEachWorkspace (w: {
|
||||
output = builtins.elemAt x11_screens (lib.mod w.id (builtins.length x11_screens));
|
||||
workspace = w.name;
|
||||
});
|
||||
};
|
||||
frogeye.desktop.i3.bindmodes = {
|
||||
"Resize" = {
|
||||
|
@ -190,29 +272,34 @@ in
|
|||
options = {
|
||||
frogeye.desktop.i3.bindmodes = lib.mkOption {
|
||||
default = { };
|
||||
type = lib.types.attrsOf (lib.types.submodule ({ config, name, ... }: {
|
||||
options = {
|
||||
name = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = name;
|
||||
};
|
||||
bindings = lib.mkOption {
|
||||
type = lib.types.attrsOf lib.types.str;
|
||||
default = { };
|
||||
};
|
||||
enter = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = "${mod}+${config.mod_enter}";
|
||||
};
|
||||
mod_enter = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
};
|
||||
return_bindings = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
};
|
||||
}));
|
||||
type = lib.types.attrsOf (
|
||||
lib.types.submodule (
|
||||
{ config, name, ... }:
|
||||
{
|
||||
options = {
|
||||
name = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = name;
|
||||
};
|
||||
bindings = lib.mkOption {
|
||||
type = lib.types.attrsOf lib.types.str;
|
||||
default = { };
|
||||
};
|
||||
enter = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = "${mod}+${config.mod_enter}";
|
||||
};
|
||||
mod_enter = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
};
|
||||
return_bindings = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
)
|
||||
);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,8 +1,17 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
# lockColors = with config.lib.stylix.colors.withHashtag; { a = base00; b = base01; d = base00; }; # Black or White, depending on current theme
|
||||
# lockColors = with config.lib.stylix.colors.withHashtag; { a = base0A; b = base0B; d = base00; }; # Green + Yellow
|
||||
lockColors = { a = "#82a401"; b = "#466c01"; d = "#648901"; }; # Old
|
||||
lockColors = {
|
||||
a = "#82a401";
|
||||
b = "#466c01";
|
||||
d = "#648901";
|
||||
}; # Old
|
||||
lockSvg = pkgs.writeText "lock.svg" ''
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" height="50" width="50">
|
||||
<path fill="${lockColors.a}" d="M0 50h50V0H0z"/>
|
||||
|
@ -34,7 +43,9 @@ in
|
|||
}
|
||||
trap revert SIGHUP SIGINT SIGTERM
|
||||
${pkgs.xorg.xset}/bin/xset dpms 5 5 5
|
||||
${pkgs.i3lock}/bin/i3lock --nofork --color ${builtins.substring 1 6 lockColors.d} --image="$pattern" --tiling --ignore-empty-password
|
||||
${pkgs.i3lock}/bin/i3lock --nofork --color ${
|
||||
builtins.substring 1 6 lockColors.d
|
||||
} --image="$pattern" --tiling --ignore-empty-password
|
||||
revert
|
||||
fi
|
||||
'';
|
||||
|
@ -61,10 +72,13 @@ in
|
|||
};
|
||||
startup = [
|
||||
# Stop screen after 10 minutes, 1 minutes after lock it
|
||||
{ notification = false; command = "${pkgs.writeShellScript "xautolock-start" ''
|
||||
{
|
||||
notification = false;
|
||||
command = "${pkgs.writeShellScript "xautolock-start" ''
|
||||
echo enabled > ${xautolockState}
|
||||
${pkgs.xautolock}/bin/xautolock -time 10 -locker '${pkgs.xorg.xset}/bin/xset dpms force standby' -killtime 1 -killer xlock
|
||||
''}"; }
|
||||
''}";
|
||||
}
|
||||
# services.screen-locker.xautolock is hardcoded to use systemd for -locker (doesn't even work...)
|
||||
];
|
||||
};
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.desktop.xorg {
|
||||
home = {
|
||||
|
@ -53,11 +58,10 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
xsession.windowManager.i3.config.keybindings =
|
||||
{
|
||||
"XF86AudioPrev" = "exec ${lib.getExe pkgs.playerctl} previous";
|
||||
"XF86AudioPlay" = "exec ${lib.getExe pkgs.playerctl} play-pause";
|
||||
"XF86AudioNext" = "exec ${lib.getExe pkgs.playerctl} next";
|
||||
};
|
||||
xsession.windowManager.i3.config.keybindings = {
|
||||
"XF86AudioPrev" = "exec ${lib.getExe pkgs.playerctl} previous";
|
||||
"XF86AudioPlay" = "exec ${lib.getExe pkgs.playerctl} play-pause";
|
||||
"XF86AudioNext" = "exec ${lib.getExe pkgs.playerctl} next";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -2,7 +2,12 @@
|
|||
# Not tested since Nix.
|
||||
# Config mentions pdfpc, although the last thing I used was Impressive, even made patches to it.
|
||||
# UPST Add Impressive to nixpkgs
|
||||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
mode_pres_main = "Presentation (main display)";
|
||||
mode_pres_sec = "Presentation (secondary display)";
|
||||
|
@ -31,8 +36,20 @@ in
|
|||
};
|
||||
xsession.windowManager.i3.config.window.commands = [
|
||||
# Open specific applications in floating mode
|
||||
{ criteria = { title = "^pdfpc.*"; window_role = "presenter"; }; command = "move to output left, fullscreen"; }
|
||||
{ criteria = { title = "^pdfpc.*"; window_role = "presentation"; }; command = "move to output right, fullscreen"; }
|
||||
{
|
||||
criteria = {
|
||||
title = "^pdfpc.*";
|
||||
window_role = "presenter";
|
||||
};
|
||||
command = "move to output left, fullscreen";
|
||||
}
|
||||
{
|
||||
criteria = {
|
||||
title = "^pdfpc.*";
|
||||
window_role = "presentation";
|
||||
};
|
||||
command = "move to output right, fullscreen";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
# UPST
|
||||
sct = pkgs.sct.overrideAttrs
|
||||
(old: {
|
||||
patches = (old.patches or [ ]) ++ [
|
||||
./sct_aarch64.patch
|
||||
];
|
||||
});
|
||||
sct = pkgs.sct.overrideAttrs (old: {
|
||||
patches = (old.patches or [ ]) ++ [
|
||||
./sct_aarch64.patch
|
||||
];
|
||||
});
|
||||
in
|
||||
{
|
||||
config = lib.mkIf config.frogeye.desktop.xorg {
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
dir = config.xdg.userDirs.extraConfig.XDG_SCREENSHOTS_DIR;
|
||||
scrot = "${pkgs.scrot}/bin/scrot --exec '${pkgs.coreutils}/bin/mv $f ${dir}/ && ${pkgs.optipng}/bin/optipng ${dir}/$f'";
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
mod = config.xsession.windowManager.i3.config.modifier;
|
||||
in
|
||||
|
@ -23,10 +28,28 @@ in
|
|||
bell = {
|
||||
animation = "EaseOutExpo";
|
||||
color = "#000000";
|
||||
command = { program = "${pkgs.sox}/bin/play"; args = [ "-n" "synth" "sine" "C5" "sine" "E4" "remix" "1-2" "fade" "0.1" "0.2" "0.1" ]; };
|
||||
command = {
|
||||
program = "${pkgs.sox}/bin/play";
|
||||
args = [
|
||||
"-n"
|
||||
"synth"
|
||||
"sine"
|
||||
"C5"
|
||||
"sine"
|
||||
"E4"
|
||||
"remix"
|
||||
"1-2"
|
||||
"fade"
|
||||
"0.1"
|
||||
"0.2"
|
||||
"0.1"
|
||||
];
|
||||
};
|
||||
duration = 100;
|
||||
};
|
||||
cursor = { vi_mode_style = "Underline"; };
|
||||
cursor = {
|
||||
vi_mode_style = "Underline";
|
||||
};
|
||||
env = {
|
||||
WINIT_X11_SCALE_FACTOR = "1";
|
||||
# Prevents Alacritty from resizing from one monitor to another.
|
||||
|
@ -35,23 +58,68 @@ in
|
|||
hints = {
|
||||
enabled = [
|
||||
{
|
||||
binding = { mods = "Control|Alt"; key = "F"; };
|
||||
binding = {
|
||||
mods = "Control|Alt";
|
||||
key = "F";
|
||||
};
|
||||
command = "${pkgs.xdg-utils}/bin/xdg-open";
|
||||
mouse = { enabled = true; mods = "Control"; };
|
||||
mouse = {
|
||||
enabled = true;
|
||||
mods = "Control";
|
||||
};
|
||||
post_processing = true;
|
||||
regex = "(mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)[^\\u0000-\\u001F\\u007F-\\u009F<>\"\\\\s{-}\\\\^⟨⟩`]+";
|
||||
}
|
||||
];
|
||||
};
|
||||
keyboard.bindings = [
|
||||
{ mode = "~Search"; mods = "Alt|Control"; key = "Space"; action = "ToggleViMode"; }
|
||||
{ mode = "Vi|~Search"; mods = "Control"; key = "K"; action = "ScrollHalfPageUp"; }
|
||||
{ mode = "Vi|~Search"; mods = "Control"; key = "J"; action = "ScrollHalfPageDown"; }
|
||||
{ mode = "~Vi"; mods = "Control|Alt"; key = "V"; action = "Paste"; }
|
||||
{ mods = "Control|Alt"; key = "C"; action = "Copy"; }
|
||||
{ mode = "~Search"; mods = "Control|Alt"; key = "F"; action = "SearchForward"; }
|
||||
{ mode = "~Search"; mods = "Control|Alt"; key = "B"; action = "SearchBackward"; }
|
||||
{ mode = "Vi|~Search"; mods = "Control|Alt"; key = "C"; action = "ClearSelection"; }
|
||||
{
|
||||
mode = "~Search";
|
||||
mods = "Alt|Control";
|
||||
key = "Space";
|
||||
action = "ToggleViMode";
|
||||
}
|
||||
{
|
||||
mode = "Vi|~Search";
|
||||
mods = "Control";
|
||||
key = "K";
|
||||
action = "ScrollHalfPageUp";
|
||||
}
|
||||
{
|
||||
mode = "Vi|~Search";
|
||||
mods = "Control";
|
||||
key = "J";
|
||||
action = "ScrollHalfPageDown";
|
||||
}
|
||||
{
|
||||
mode = "~Vi";
|
||||
mods = "Control|Alt";
|
||||
key = "V";
|
||||
action = "Paste";
|
||||
}
|
||||
{
|
||||
mods = "Control|Alt";
|
||||
key = "C";
|
||||
action = "Copy";
|
||||
}
|
||||
{
|
||||
mode = "~Search";
|
||||
mods = "Control|Alt";
|
||||
key = "F";
|
||||
action = "SearchForward";
|
||||
}
|
||||
{
|
||||
mode = "~Search";
|
||||
mods = "Control|Alt";
|
||||
key = "B";
|
||||
action = "SearchBackward";
|
||||
}
|
||||
{
|
||||
mode = "Vi|~Search";
|
||||
mods = "Control|Alt";
|
||||
key = "C";
|
||||
action = "ClearSelection";
|
||||
}
|
||||
];
|
||||
window = {
|
||||
dynamic_padding = false;
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.dev.c {
|
||||
frogeye = {
|
||||
|
|
|
@ -1,64 +1,74 @@
|
|||
{ pkgs, config, ... }: {
|
||||
{ pkgs, config, ... }:
|
||||
{
|
||||
# TODO Maybe should be per-directory dotenv
|
||||
# Or not, for neovim
|
||||
config = {
|
||||
# Always on
|
||||
home.packages = with pkgs; [
|
||||
# Common
|
||||
perf-tools
|
||||
jq
|
||||
yq
|
||||
universal-ctags
|
||||
cloc
|
||||
home.packages =
|
||||
with pkgs;
|
||||
[
|
||||
# Common
|
||||
perf-tools
|
||||
jq
|
||||
yq
|
||||
universal-ctags
|
||||
cloc
|
||||
|
||||
# Network
|
||||
socat
|
||||
dig
|
||||
whois
|
||||
nmap
|
||||
tcpdump
|
||||
mtr
|
||||
traceroute
|
||||
# Network
|
||||
socat
|
||||
dig
|
||||
whois
|
||||
nmap
|
||||
tcpdump
|
||||
mtr
|
||||
traceroute
|
||||
|
||||
# nix
|
||||
lix
|
||||
nixfmt-rfc-style
|
||||
# nix
|
||||
lix
|
||||
nixfmt-rfc-style
|
||||
|
||||
# Always on (graphical)
|
||||
] ++ lib.optionals config.frogeye.desktop.xorg [
|
||||
# Common
|
||||
# zeal-qt6 # Offline documentation
|
||||
sqlitebrowser
|
||||
# Always on (graphical)
|
||||
]
|
||||
++ lib.optionals config.frogeye.desktop.xorg [
|
||||
# Common
|
||||
# zeal-qt6 # Offline documentation
|
||||
sqlitebrowser
|
||||
|
||||
# Network
|
||||
wireshark-qt
|
||||
# Network
|
||||
wireshark-qt
|
||||
|
||||
# Ansible
|
||||
] ++ lib.optionals config.frogeye.dev.ansible [
|
||||
ansible
|
||||
ansible-lint
|
||||
# Ansible
|
||||
]
|
||||
++ lib.optionals config.frogeye.dev.ansible [
|
||||
ansible
|
||||
ansible-lint
|
||||
|
||||
# Docker
|
||||
] ++ lib.optionals config.frogeye.dev.docker [
|
||||
docker
|
||||
docker-compose
|
||||
# Docker
|
||||
]
|
||||
++ lib.optionals config.frogeye.dev.docker [
|
||||
docker
|
||||
docker-compose
|
||||
|
||||
# FPGA
|
||||
] ++ lib.optionals config.frogeye.dev.fpga [
|
||||
verilog
|
||||
# FPGA
|
||||
]
|
||||
++ lib.optionals config.frogeye.dev.fpga [
|
||||
verilog
|
||||
|
||||
] ++ lib.optionals (config.frogeye.dev.fpga && pkgs.stdenv.isx86_64) [
|
||||
ghdl
|
||||
]
|
||||
++ lib.optionals (config.frogeye.dev.fpga && pkgs.stdenv.isx86_64) [
|
||||
ghdl
|
||||
|
||||
# FPGA (graphical)
|
||||
] ++ lib.optionals (config.frogeye.desktop.xorg && config.frogeye.dev.fpga) [
|
||||
yosys
|
||||
gtkwave
|
||||
# FPGA (graphical)
|
||||
]
|
||||
++ lib.optionals (config.frogeye.desktop.xorg && config.frogeye.dev.fpga) [
|
||||
yosys
|
||||
gtkwave
|
||||
|
||||
# VM (graphical)
|
||||
] ++ lib.optionals (config.frogeye.desktop.xorg && config.frogeye.dev.vm) [
|
||||
virt-manager
|
||||
];
|
||||
# VM (graphical)
|
||||
]
|
||||
++ lib.optionals (config.frogeye.desktop.xorg && config.frogeye.dev.vm) [
|
||||
virt-manager
|
||||
];
|
||||
|
||||
programs.nixvim.plugins.lsp.servers = {
|
||||
ansiblels.enable = config.frogeye.dev.ansible; # Ansible
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
{ pkgs, config, ... }: {
|
||||
{ pkgs, config, ... }:
|
||||
{
|
||||
imports = [
|
||||
./c.nix
|
||||
./common.nix
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
# Untested post-nix
|
||||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.dev.go {
|
||||
frogeye = {
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
# Untested post-nix
|
||||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.dev.node {
|
||||
frogeye = {
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
# Prose is a programming language, fight me
|
||||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.dev.prose {
|
||||
home = {
|
||||
|
@ -15,12 +20,18 @@
|
|||
programs.nixvim = {
|
||||
autoCmd = [
|
||||
# vim-easy-align: Align Markdown tables with |
|
||||
{ event = "FileType"; pattern = "markdown"; command = "vmap <Bar> :EasyAlign*<Bar><Enter>"; }
|
||||
];
|
||||
extraPlugins = with pkgs.vimPlugins; lib.optionals config.programs.pandoc.enable [
|
||||
vim-pandoc # Pandoc-specific stuff because there's no LSP for it
|
||||
vim-pandoc-syntax
|
||||
{
|
||||
event = "FileType";
|
||||
pattern = "markdown";
|
||||
command = "vmap <Bar> :EasyAlign*<Bar><Enter>";
|
||||
}
|
||||
];
|
||||
extraPlugins =
|
||||
with pkgs.vimPlugins;
|
||||
lib.optionals config.programs.pandoc.enable [
|
||||
vim-pandoc # Pandoc-specific stuff because there's no LSP for it
|
||||
vim-pandoc-syntax
|
||||
];
|
||||
extraConfigVim = lib.optionalString config.programs.pandoc.enable ''
|
||||
let g:pandoc#modules#disabled = ["folding"]
|
||||
let g:pandoc#spell#enabled = 0
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.dev.python {
|
||||
home = {
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
{ pkgs, lib, config, onixpkgs, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
onixpkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
opkgs = import onixpkgs { inherit (pkgs) system; };
|
||||
in
|
||||
|
@ -18,54 +24,61 @@ in
|
|||
};
|
||||
};
|
||||
};
|
||||
home.packages = with pkgs; ([
|
||||
# android tools
|
||||
android-tools
|
||||
home.packages =
|
||||
with pkgs;
|
||||
(
|
||||
[
|
||||
# android tools
|
||||
android-tools
|
||||
|
||||
# Communication
|
||||
signal-desktop
|
||||
(opkgs.callPackage ./whisperx.nix { }) # Transcribe voice messages
|
||||
# Communication
|
||||
signal-desktop
|
||||
(opkgs.callPackage ./whisperx.nix { }) # Transcribe voice messages
|
||||
|
||||
# downloading
|
||||
# transmission TODO Collision if both transmissions are active?
|
||||
# downloading
|
||||
# transmission TODO Collision if both transmissions are active?
|
||||
|
||||
# Multimedia toolbox
|
||||
ffmpeg
|
||||
# Multimedia toolbox
|
||||
ffmpeg
|
||||
|
||||
# documents
|
||||
visidata
|
||||
# texlive.combined.scheme-full
|
||||
# TODO Convert existing LaTeX documents into using Nix build system
|
||||
# texlive is big and not that much used, sooo
|
||||
pdftk
|
||||
pdfgrep
|
||||
# documents
|
||||
visidata
|
||||
# texlive.combined.scheme-full
|
||||
# TODO Convert existing LaTeX documents into using Nix build system
|
||||
# texlive is big and not that much used, sooo
|
||||
pdftk
|
||||
pdfgrep
|
||||
|
||||
# Misc
|
||||
haskellPackages.dice
|
||||
rustdesk-flutter
|
||||
# Misc
|
||||
haskellPackages.dice
|
||||
rustdesk-flutter
|
||||
|
||||
] ++ lib.optionals config.frogeye.desktop.xorg [
|
||||
]
|
||||
++ lib.optionals config.frogeye.desktop.xorg [
|
||||
|
||||
# multimedia editors
|
||||
darktable
|
||||
puddletag
|
||||
audacity
|
||||
xournalpp
|
||||
krita
|
||||
# multimedia editors
|
||||
darktable
|
||||
puddletag
|
||||
audacity
|
||||
xournalpp
|
||||
krita
|
||||
|
||||
# downloading
|
||||
transmission_4-qt
|
||||
# wine only makes sense on x86_64
|
||||
] ++ lib.optionals pkgs.stdenv.isx86_64 [
|
||||
wine
|
||||
# TODO wine-gecko wine-mono lib32-libpulse (?)
|
||||
# downloading
|
||||
transmission_4-qt
|
||||
# wine only makes sense on x86_64
|
||||
]
|
||||
++ lib.optionals pkgs.stdenv.isx86_64 [
|
||||
wine
|
||||
# TODO wine-gecko wine-mono lib32-libpulse (?)
|
||||
|
||||
] ++ lib.optionals (!stdenv.isAarch64) [
|
||||
# Musescore is broken on aarch64
|
||||
musescore
|
||||
# Blender 4.0.1 can't compile on aarch64
|
||||
# https://hydra.nixos.org/job/nixos/release-23.11/nixpkgs.blender.aarch64-linux
|
||||
blender
|
||||
]);
|
||||
]
|
||||
++ lib.optionals (!stdenv.isAarch64) [
|
||||
# Musescore is broken on aarch64
|
||||
musescore
|
||||
# Blender 4.0.1 can't compile on aarch64
|
||||
# https://hydra.nixos.org/job/nixos/release-23.11/nixpkgs.blender.aarch64-linux
|
||||
blender
|
||||
]
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
{
|
||||
pkgs ? import <nixpkgs> { },
|
||||
}:
|
||||
pkgs.python3Packages.buildPythonPackage {
|
||||
pname = "whisperx";
|
||||
version = "2024-08-19";
|
||||
|
@ -34,4 +36,3 @@ pkgs.python3Packages.buildPythonPackage {
|
|||
"whisperx"
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.frogeye.gaming {
|
||||
# Using config.nixpkgs.<something> creates an infinite recursion,
|
||||
|
|
|
@ -1,16 +1,21 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.programs.git;
|
||||
in
|
||||
{
|
||||
config = lib.mkIf cfg.enable {
|
||||
home.packages = [
|
||||
(pkgs.callPackage ./jjui.nix {})
|
||||
(pkgs.callPackage ./jjui.nix { })
|
||||
(pkgs.writeShellApplication {
|
||||
name = "git-sync";
|
||||
text = (lib.strings.concatLines
|
||||
(map
|
||||
(r: ''
|
||||
text = (
|
||||
lib.strings.concatLines (
|
||||
map (r: ''
|
||||
echo "===== ${r.path}"
|
||||
if [ ! -d "${r.path}" ]
|
||||
then
|
||||
|
@ -32,8 +37,7 @@ in
|
|||
fi
|
||||
)
|
||||
fi
|
||||
'')
|
||||
(lib.attrsets.attrValues config.services.git-sync.repositories)
|
||||
'') (lib.attrsets.attrValues config.services.git-sync.repositories)
|
||||
)
|
||||
);
|
||||
})
|
||||
|
@ -63,22 +67,24 @@ in
|
|||
lfs.enable = true;
|
||||
userEmail = lib.mkDefault "geoffrey@frogeye.fr";
|
||||
userName = lib.mkDefault "Geoffrey Frogeye";
|
||||
extraConfig = {
|
||||
core = {
|
||||
editor = "nvim";
|
||||
extraConfig =
|
||||
{
|
||||
core = {
|
||||
editor = "nvim";
|
||||
};
|
||||
push = {
|
||||
default = "matching";
|
||||
};
|
||||
pull = {
|
||||
ff = "only";
|
||||
};
|
||||
}
|
||||
// lib.optionalAttrs config.frogeye.desktop.xorg {
|
||||
diff.tool = "meld";
|
||||
difftool.prompt = false;
|
||||
"difftool \"meld\"".cmd = "${pkgs.meld}/bin/meld \"$LOCAL\" \"$REMOTE\"";
|
||||
# This escapes quotes, which isn't the case in the original, hoping this isn't an issue.
|
||||
};
|
||||
push = {
|
||||
default = "matching";
|
||||
};
|
||||
pull = {
|
||||
ff = "only";
|
||||
};
|
||||
} // lib.optionalAttrs config.frogeye.desktop.xorg {
|
||||
diff.tool = "meld";
|
||||
difftool.prompt = false;
|
||||
"difftool \"meld\"".cmd = "${pkgs.meld}/bin/meld \"$LOCAL\" \"$REMOTE\"";
|
||||
# This escapes quotes, which isn't the case in the original, hoping this isn't an issue.
|
||||
};
|
||||
};
|
||||
jujutsu = {
|
||||
enable = true;
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.programs.gpg.enable {
|
||||
frogeye.hooks.lock = ''
|
||||
|
@ -26,13 +31,15 @@
|
|||
default-preference-list = "SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed";
|
||||
personal-cipher-preferences = "TWOFISH CAMELLIA256 AES 3DES";
|
||||
};
|
||||
publicKeys = [{
|
||||
source = builtins.fetchurl {
|
||||
url = "https://keys.openpgp.org/vks/v1/by-fingerprint/4FBA930D314A03215E2CDB0A8312C8CAC1BAC289";
|
||||
sha256 = "sha256:10y9xqcy1vyk2p8baay14p3vwdnlwynk0fvfbika65hz2z8yw2cm";
|
||||
};
|
||||
trust = "ultimate";
|
||||
}];
|
||||
publicKeys = [
|
||||
{
|
||||
source = builtins.fetchurl {
|
||||
url = "https://keys.openpgp.org/vks/v1/by-fingerprint/4FBA930D314A03215E2CDB0A8312C8CAC1BAC289";
|
||||
sha256 = "sha256:10y9xqcy1vyk2p8baay14p3vwdnlwynk0fvfbika65hz2z8yw2cm";
|
||||
};
|
||||
trust = "ultimate";
|
||||
}
|
||||
];
|
||||
};
|
||||
services.gpg-agent = rec {
|
||||
enableBashIntegration = true;
|
||||
|
@ -43,7 +50,7 @@
|
|||
# It will fall back to ncurses when running in non-graphics mode.
|
||||
defaultCacheTtl = 3600;
|
||||
defaultCacheTtlSsh = defaultCacheTtl;
|
||||
maxCacheTtl = 3*3600;
|
||||
maxCacheTtl = 3 * 3600;
|
||||
maxCacheTtlSsh = maxCacheTtl;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -25,14 +25,19 @@
|
|||
];
|
||||
};
|
||||
home = {
|
||||
activation.createDirenvFolders = lib.hm.dag.entryAfter [ "writeBoundary" ]
|
||||
(lib.strings.concatLines (map (d: "mkdir -p ${d}") (
|
||||
(builtins.attrValues config.frogeye.direnv) ++ [ "${config.xdg.cacheHome}/junkhome" ]
|
||||
)));
|
||||
activation.createDirenvFolders = lib.hm.dag.entryAfter [ "writeBoundary" ] (
|
||||
lib.strings.concatLines (
|
||||
map (d: "mkdir -p ${d}") (
|
||||
(builtins.attrValues config.frogeye.direnv) ++ [ "${config.xdg.cacheHome}/junkhome" ]
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
sessionVariables = config.frogeye.direnv;
|
||||
};
|
||||
programs.bash.shellAliases = lib.attrsets.mergeAttrsList (map (p: { "${p}" = "HOME=${config.xdg.cacheHome}/junkhome ${p}"; }) config.frogeye.junkhome);
|
||||
programs.bash.shellAliases = lib.attrsets.mergeAttrsList (
|
||||
map (p: { "${p}" = "HOME=${config.xdg.cacheHome}/junkhome ${p}"; }) config.frogeye.junkhome
|
||||
);
|
||||
};
|
||||
options.frogeye = {
|
||||
direnv = lib.mkOption {
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
home.packages = with pkgs; [
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
home.packages = with pkgs; [
|
||||
|
@ -16,7 +21,10 @@
|
|||
nix = {
|
||||
package = lib.mkDefault pkgs.lix;
|
||||
settings = {
|
||||
experimental-features = [ "nix-command" "flakes" ];
|
||||
experimental-features = [
|
||||
"nix-command"
|
||||
"flakes"
|
||||
];
|
||||
warn-dirty = false;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
mod = config.xsession.windowManager.i3.config.modifier;
|
||||
in
|
||||
|
@ -8,32 +13,51 @@ in
|
|||
pwgen
|
||||
(pkgs.writeShellApplication {
|
||||
name = "install-passwords";
|
||||
runtimeInputs = [ yq gawk moreutils ];
|
||||
text = (lib.strings.concatLines (map
|
||||
(file: ''
|
||||
(
|
||||
echo "===== Preparing to write ${file.path}"
|
||||
temp="$(mktemp --tmpdir="${builtins.dirOf file.path}")"
|
||||
cat "${file.template}" > "$temp"
|
||||
'' + (lib.strings.concatLines (map
|
||||
(password: (if password.selector == null then ''
|
||||
echo "Reading ${password.path} for substituting ${password.variable}"
|
||||
value="$(pass "${password.path}" | head -n1)"
|
||||
'' else ''
|
||||
echo "Reading ${password.path} -> ${password.selector} for substituting ${password.variable}"
|
||||
value="$(pass "${password.path}" | tail -n +2 | yq -r '.${password.selector}')"
|
||||
'') + ''
|
||||
key="${password.variable}"
|
||||
K="$key" V="$value" awk '{ gsub (ENVIRON["K"], ENVIRON["V"]); print }' "$temp" | sponge "$temp"
|
||||
'')
|
||||
(lib.attrsets.attrValues file.passwords))) + ''
|
||||
echo "Moving the file in place"
|
||||
chown "${file.owner}" "$temp"
|
||||
chmod u=r "$temp"
|
||||
mv -f "$temp" "${file.path}"
|
||||
)
|
||||
'')
|
||||
config.frogeye.passwordFiles)
|
||||
runtimeInputs = [
|
||||
yq
|
||||
gawk
|
||||
moreutils
|
||||
];
|
||||
text = (
|
||||
lib.strings.concatLines (
|
||||
map (
|
||||
file:
|
||||
''
|
||||
(
|
||||
echo "===== Preparing to write ${file.path}"
|
||||
temp="$(mktemp --tmpdir="${builtins.dirOf file.path}")"
|
||||
cat "${file.template}" > "$temp"
|
||||
''
|
||||
+ (lib.strings.concatLines (
|
||||
map (
|
||||
password:
|
||||
(
|
||||
if password.selector == null then
|
||||
''
|
||||
echo "Reading ${password.path} for substituting ${password.variable}"
|
||||
value="$(pass "${password.path}" | head -n1)"
|
||||
''
|
||||
else
|
||||
''
|
||||
echo "Reading ${password.path} -> ${password.selector} for substituting ${password.variable}"
|
||||
value="$(pass "${password.path}" | tail -n +2 | yq -r '.${password.selector}')"
|
||||
''
|
||||
)
|
||||
+ ''
|
||||
key="${password.variable}"
|
||||
K="$key" V="$value" awk '{ gsub (ENVIRON["K"], ENVIRON["V"]); print }' "$temp" | sponge "$temp"
|
||||
''
|
||||
) (lib.attrsets.attrValues file.passwords)
|
||||
))
|
||||
+ ''
|
||||
echo "Moving the file in place"
|
||||
chown "${file.owner}" "$temp"
|
||||
chmod u=r "$temp"
|
||||
mv -f "$temp" "${file.path}"
|
||||
)
|
||||
''
|
||||
) config.frogeye.passwordFiles
|
||||
)
|
||||
);
|
||||
})
|
||||
];
|
||||
|
@ -50,63 +74,70 @@ in
|
|||
frogeye.passwordFiles =
|
||||
let
|
||||
defaultvar = "@PASSWORD@";
|
||||
pwtype = { name, ... }: {
|
||||
options = {
|
||||
variable = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = name;
|
||||
description = "String in the template that will be substituted by the actual password";
|
||||
};
|
||||
path = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Path to the password store entry";
|
||||
};
|
||||
selector = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
description = "If set, will parse the password metadata as YML and use selector (yq) instead of the password.";
|
||||
pwtype =
|
||||
{ name, ... }:
|
||||
{
|
||||
options = {
|
||||
variable = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = name;
|
||||
description = "String in the template that will be substituted by the actual password";
|
||||
};
|
||||
path = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Path to the password store entry";
|
||||
};
|
||||
selector = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
description = "If set, will parse the password metadata as YML and use selector (yq) instead of the password.";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
mainConfig = config;
|
||||
in
|
||||
lib.mkOption {
|
||||
default = [ ];
|
||||
type = lib.types.listOf (lib.types.submodule ({ config, ... }: {
|
||||
options = {
|
||||
path = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Where to place the file.";
|
||||
};
|
||||
owner = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = mainConfig.home.username;
|
||||
description = "Who will own the file.";
|
||||
};
|
||||
template = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
default = pkgs.writeTextFile {
|
||||
name = "pwfile-template";
|
||||
text = config.text;
|
||||
type = lib.types.listOf (
|
||||
lib.types.submodule (
|
||||
{ config, ... }:
|
||||
{
|
||||
options = {
|
||||
path = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Where to place the file.";
|
||||
};
|
||||
owner = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = mainConfig.home.username;
|
||||
description = "Who will own the file.";
|
||||
};
|
||||
template = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
default = pkgs.writeTextFile {
|
||||
name = "pwfile-template";
|
||||
text = config.text;
|
||||
};
|
||||
description = "Path to the template used to make the file. Exclusive with `text`.";
|
||||
};
|
||||
text = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = defaultvar;
|
||||
description = "Content of the template used to make the file. Exclusive with `template`.";
|
||||
};
|
||||
passwords = lib.mkOption {
|
||||
default = lib.optionalAttrs (config.password != null) { ${defaultvar} = config.password; };
|
||||
type = lib.types.attrsOf (lib.types.submodule pwtype);
|
||||
description = "Paths to passwords that will substitute the variables in the template. Exclusive with `password`";
|
||||
};
|
||||
password = lib.mkOption {
|
||||
type = lib.types.submodule ({ ... }@args: pwtype (args // { name = defaultvar; }));
|
||||
description = "Path to password that will substitute '@PASSWORD@' in the template. Exclusive with `passwords`.";
|
||||
};
|
||||
};
|
||||
description = "Path to the template used to make the file. Exclusive with `text`.";
|
||||
};
|
||||
text = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = defaultvar;
|
||||
description = "Content of the template used to make the file. Exclusive with `template`.";
|
||||
};
|
||||
passwords = lib.mkOption {
|
||||
default = lib.optionalAttrs (config.password != null) { ${defaultvar} = config.password; };
|
||||
type = lib.types.attrsOf (lib.types.submodule pwtype);
|
||||
description = "Paths to passwords that will substitute the variables in the template. Exclusive with `password`";
|
||||
};
|
||||
password = lib.mkOption {
|
||||
type = lib.types.submodule ({ ... }@args: pwtype (args // { name = defaultvar; }));
|
||||
description = "Path to password that will substitute '@PASSWORD@' in the template. Exclusive with `passwords`.";
|
||||
};
|
||||
};
|
||||
}));
|
||||
}
|
||||
)
|
||||
);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,10 +1,27 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = lib.mkIf config.programs.less.enable {
|
||||
programs.powerline-go = {
|
||||
enable = true;
|
||||
modules = [ "user" "host" "venv" "cwd" "perms" "nix-shell" "git" ];
|
||||
modulesRight = [ "jobs" "exit" "duration" ];
|
||||
modules = [
|
||||
"user"
|
||||
"host"
|
||||
"venv"
|
||||
"cwd"
|
||||
"perms"
|
||||
"nix-shell"
|
||||
"git"
|
||||
];
|
||||
modulesRight = [
|
||||
"jobs"
|
||||
"exit"
|
||||
"duration"
|
||||
];
|
||||
settings = {
|
||||
colorize-hostname = true;
|
||||
hostname-only-if-ssh = true;
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
programs.atuin = {
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.programs.bash;
|
||||
in
|
||||
|
@ -14,7 +19,11 @@ in
|
|||
historySize = 100000;
|
||||
historyFile = "${config.xdg.stateHome}/shell_history";
|
||||
historyFileSize = 100000;
|
||||
historyControl = [ "erasedups" "ignoredups" "ignorespace" ];
|
||||
historyControl = [
|
||||
"erasedups"
|
||||
"ignoredups"
|
||||
"ignorespace"
|
||||
];
|
||||
};
|
||||
zsh = {
|
||||
enable = true;
|
||||
|
@ -36,5 +45,5 @@ in
|
|||
};
|
||||
imports = [
|
||||
./atuin.nix
|
||||
];
|
||||
];
|
||||
}
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
frogeye.hooks.lock = ''
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
{ pkgs, config, lib, stylix, ... }:
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
stylix,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
stylix = {
|
||||
|
|
|
@ -1,17 +1,21 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
themepack = pkgs.tmuxPlugins.mkTmuxPlugin
|
||||
rec {
|
||||
pluginName = "tmux-themepack";
|
||||
version = "1.1.0";
|
||||
rtpFilePath = "themepack.tmux";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "jimeh";
|
||||
repo = "tmux-themepack";
|
||||
rev = "${version}";
|
||||
sha256 = "f6y92kYsKDFanNx5ATx4BkaB/E7UrmyIHU/5Z01otQE=";
|
||||
};
|
||||
themepack = pkgs.tmuxPlugins.mkTmuxPlugin rec {
|
||||
pluginName = "tmux-themepack";
|
||||
version = "1.1.0";
|
||||
rtpFilePath = "themepack.tmux";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "jimeh";
|
||||
repo = "tmux-themepack";
|
||||
rev = "${version}";
|
||||
sha256 = "f6y92kYsKDFanNx5ATx4BkaB/E7UrmyIHU/5Z01otQE=";
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
config = lib.mkIf config.programs.tmux.enable {
|
||||
|
@ -26,7 +30,9 @@ in
|
|||
plugins = with pkgs.tmuxPlugins; [
|
||||
sensible
|
||||
];
|
||||
extraConfig = builtins.readFile ./tmux.conf + "source-file ${themepack}/share/tmux-plugins/tmux-themepack/powerline/default/green.tmuxtheme\n";
|
||||
extraConfig =
|
||||
builtins.readFile ./tmux.conf
|
||||
+ "source-file ${themepack}/share/tmux-plugins/tmux-themepack/powerline/default/green.tmuxtheme\n";
|
||||
};
|
||||
stylix.targets.tmux.enable = false;
|
||||
xdg.configFile.screenrc.text = (builtins.readFile ./screenrc);
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
# UPST
|
||||
vim-shot-f = pkgs.vimUtils.buildVimPlugin {
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
# Completion
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
{ pkgs, lib, config, nixvimLib, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
nixvimLib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
nv = nixvimLib.nixvim;
|
||||
in
|
||||
|
@ -6,37 +12,86 @@ in
|
|||
config = {
|
||||
programs = {
|
||||
# https://www.reddit.com/r/neovim/comments/mbj8m5/how_to_setup_ctrlshiftkey_mappings_in_neovim_and/
|
||||
alacritty.settings.keyboard.bindings = [
|
||||
{ key = "H"; mods = "Control|Shift"; chars = "\\u001b[72;5u"; }
|
||||
{ key = "L"; mods = "Control|Shift"; chars = "\\u001b[76;5u"; }
|
||||
] ++ (map
|
||||
(n: { key = "Key${builtins.toString n}"; mods = "Control"; chars = "\\u001b[${builtins.toString (48+n)};5u"; })
|
||||
(lib.lists.range 0 9));
|
||||
alacritty.settings.keyboard.bindings =
|
||||
[
|
||||
{
|
||||
key = "H";
|
||||
mods = "Control|Shift";
|
||||
chars = "\\u001b[72;5u";
|
||||
}
|
||||
{
|
||||
key = "L";
|
||||
mods = "Control|Shift";
|
||||
chars = "\\u001b[76;5u";
|
||||
}
|
||||
]
|
||||
++ (map (n: {
|
||||
key = "Key${builtins.toString n}";
|
||||
mods = "Control";
|
||||
chars = "\\u001b[${builtins.toString (48 + n)};5u";
|
||||
}) (lib.lists.range 0 9));
|
||||
# Ctrl+<number> doesn't get interpreted, but Ctrl+Shift+<number> does, so let's use that
|
||||
nixvim = {
|
||||
autoCmd = [
|
||||
# Turn off relativenumber only for insert mode
|
||||
{ event = "InsertEnter"; pattern = "*"; command = "set norelativenumber"; }
|
||||
{ event = "InsertLeave"; pattern = "*"; command = "set relativenumber"; }
|
||||
{
|
||||
event = "InsertEnter";
|
||||
pattern = "*";
|
||||
command = "set norelativenumber";
|
||||
}
|
||||
{
|
||||
event = "InsertLeave";
|
||||
pattern = "*";
|
||||
command = "set relativenumber";
|
||||
}
|
||||
];
|
||||
extraPlugins = with pkgs.vimPlugins; [
|
||||
nvim-scrollview # Scroll bar
|
||||
];
|
||||
keymaps =
|
||||
let
|
||||
options = { silent = true; };
|
||||
options = {
|
||||
silent = true;
|
||||
};
|
||||
in
|
||||
[
|
||||
# barbar
|
||||
{ key = "gb"; action = "<Cmd>BufferPick<CR>"; inherit options; }
|
||||
{ key = "<C-H>"; action = "<Cmd>BufferPrevious<CR>"; inherit options; }
|
||||
{ key = "<C-L>"; action = "<Cmd>BufferNext<CR>"; inherit options; }
|
||||
{ key = "<C-S-H>"; action = "<Cmd>BufferMovePrevious<CR>"; inherit options; }
|
||||
{ key = "<C-S-L>"; action = "<Cmd>BufferMoveNext<CR>"; inherit options; }
|
||||
{ key = "<C-0>"; action = "<Cmd>BufferLast<CR>"; inherit options; }
|
||||
] ++ (map
|
||||
(n: { key = "<C-${builtins.toString n}>"; action = "<Cmd>BufferGoto ${builtins.toString n}<CR>"; inherit options; })
|
||||
(lib.lists.range 1 9));
|
||||
{
|
||||
key = "gb";
|
||||
action = "<Cmd>BufferPick<CR>";
|
||||
inherit options;
|
||||
}
|
||||
{
|
||||
key = "<C-H>";
|
||||
action = "<Cmd>BufferPrevious<CR>";
|
||||
inherit options;
|
||||
}
|
||||
{
|
||||
key = "<C-L>";
|
||||
action = "<Cmd>BufferNext<CR>";
|
||||
inherit options;
|
||||
}
|
||||
{
|
||||
key = "<C-S-H>";
|
||||
action = "<Cmd>BufferMovePrevious<CR>";
|
||||
inherit options;
|
||||
}
|
||||
{
|
||||
key = "<C-S-L>";
|
||||
action = "<Cmd>BufferMoveNext<CR>";
|
||||
inherit options;
|
||||
}
|
||||
{
|
||||
key = "<C-0>";
|
||||
action = "<Cmd>BufferLast<CR>";
|
||||
inherit options;
|
||||
}
|
||||
]
|
||||
++ (map (n: {
|
||||
key = "<C-${builtins.toString n}>";
|
||||
action = "<Cmd>BufferGoto ${builtins.toString n}<CR>";
|
||||
inherit options;
|
||||
}) (lib.lists.range 1 9));
|
||||
opts = {
|
||||
showmode = false;
|
||||
number = true;
|
||||
|
@ -48,103 +103,154 @@ in
|
|||
barbar.enable = true;
|
||||
# TODO Reload make it use the preset colorscheme
|
||||
# Status line
|
||||
lualine = with config.lib.stylix.colors.withHashtag; let
|
||||
normal = { fg = base05; bg = base01; };
|
||||
inverted = { fg = base00; bg = base03; };
|
||||
normal_ina = { fg = base02; bg = base01; };
|
||||
inverted_ina = { fg = base00; bg = base02; };
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
settings = rec {
|
||||
inactive_sections = sections;
|
||||
sections = {
|
||||
lualine_a = [
|
||||
(nv.listToUnkeyedAttrs [ "string.format('%d', vim.fn.line('$'))" ])
|
||||
];
|
||||
lualine_b = [ "mode" ];
|
||||
lualine_c = [
|
||||
((nv.listToUnkeyedAttrs [ "filename" ]) // {
|
||||
color = nv.mkRaw ''
|
||||
function(section)
|
||||
return { fg = vim.bo.modified and '${base08}' or '${normal.fg}' }
|
||||
end
|
||||
'';
|
||||
path = 1; # Relative path
|
||||
symbols = {
|
||||
modified = "●";
|
||||
newfile = "";
|
||||
readonly = "";
|
||||
unnamed = "";
|
||||
};
|
||||
})
|
||||
"location"
|
||||
];
|
||||
lualine_x = [
|
||||
((nv.listToUnkeyedAttrs [ ''(next(vim.lsp.buf_get_clients()) == nil) and " " or ""'' ]) // {
|
||||
separator = { left = ""; right = ""; };
|
||||
})
|
||||
] ++ (lib.mapAttrsToList
|
||||
(diag_name: diag_color: ((nv.listToUnkeyedAttrs [ "diagnostics" ]) // {
|
||||
color.bg = diag_color;
|
||||
colored = false;
|
||||
separator = { left = ""; right = ""; };
|
||||
sections = [ diag_name ];
|
||||
}))
|
||||
{
|
||||
error = base08;
|
||||
warn = base0A;
|
||||
hint = base0C;
|
||||
info = base0B;
|
||||
});
|
||||
lualine_y = [
|
||||
((nv.listToUnkeyedAttrs [ "diff" ]) // {
|
||||
diff_color = {
|
||||
added.fg = base0B;
|
||||
modified.fg = base0A;
|
||||
removed.fg = base08;
|
||||
};
|
||||
symbols = {
|
||||
added = " ";
|
||||
modified = " ";
|
||||
removed = " ";
|
||||
};
|
||||
})
|
||||
"branch"
|
||||
];
|
||||
lualine_z = [
|
||||
"filetype"
|
||||
"fileformat"
|
||||
"encoding"
|
||||
];
|
||||
lualine =
|
||||
with config.lib.stylix.colors.withHashtag;
|
||||
let
|
||||
normal = {
|
||||
fg = base05;
|
||||
bg = base01;
|
||||
};
|
||||
options.theme = (lib.mapAttrs
|
||||
(mode_name: mode_color: {
|
||||
a = inverted;
|
||||
b = inverted // { bg = mode_color; gui = "bold"; };
|
||||
c = normal;
|
||||
x = inverted;
|
||||
y = normal;
|
||||
z = inverted // { bg = mode_color; };
|
||||
})
|
||||
{
|
||||
normal = base0D;
|
||||
insert = base0B;
|
||||
visual = base0F;
|
||||
replace = base08;
|
||||
command = base0E;
|
||||
}) // {
|
||||
inactive = {
|
||||
a = inverted_ina;
|
||||
b = normal_ina // { bg = base00; gui = "bold"; };
|
||||
c = normal_ina;
|
||||
x = inverted_ina;
|
||||
y = normal_ina;
|
||||
z = normal_ina // { bg = base00; };
|
||||
inverted = {
|
||||
fg = base00;
|
||||
bg = base03;
|
||||
};
|
||||
normal_ina = {
|
||||
fg = base02;
|
||||
bg = base01;
|
||||
};
|
||||
inverted_ina = {
|
||||
fg = base00;
|
||||
bg = base02;
|
||||
};
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
settings = rec {
|
||||
inactive_sections = sections;
|
||||
sections = {
|
||||
lualine_a = [
|
||||
(nv.listToUnkeyedAttrs [ "string.format('%d', vim.fn.line('$'))" ])
|
||||
];
|
||||
lualine_b = [ "mode" ];
|
||||
lualine_c = [
|
||||
(
|
||||
(nv.listToUnkeyedAttrs [ "filename" ])
|
||||
// {
|
||||
color = nv.mkRaw ''
|
||||
function(section)
|
||||
return { fg = vim.bo.modified and '${base08}' or '${normal.fg}' }
|
||||
end
|
||||
'';
|
||||
path = 1; # Relative path
|
||||
symbols = {
|
||||
modified = "●";
|
||||
newfile = "";
|
||||
readonly = "";
|
||||
unnamed = "";
|
||||
};
|
||||
}
|
||||
)
|
||||
"location"
|
||||
];
|
||||
lualine_x =
|
||||
[
|
||||
(
|
||||
(nv.listToUnkeyedAttrs [ ''(next(vim.lsp.buf_get_clients()) == nil) and " " or ""'' ])
|
||||
// {
|
||||
separator = {
|
||||
left = "";
|
||||
right = "";
|
||||
};
|
||||
}
|
||||
)
|
||||
]
|
||||
++ (lib.mapAttrsToList
|
||||
(
|
||||
diag_name: diag_color:
|
||||
(
|
||||
(nv.listToUnkeyedAttrs [ "diagnostics" ])
|
||||
// {
|
||||
color.bg = diag_color;
|
||||
colored = false;
|
||||
separator = {
|
||||
left = "";
|
||||
right = "";
|
||||
};
|
||||
sections = [ diag_name ];
|
||||
}
|
||||
)
|
||||
)
|
||||
{
|
||||
error = base08;
|
||||
warn = base0A;
|
||||
hint = base0C;
|
||||
info = base0B;
|
||||
}
|
||||
);
|
||||
lualine_y = [
|
||||
(
|
||||
(nv.listToUnkeyedAttrs [ "diff" ])
|
||||
// {
|
||||
diff_color = {
|
||||
added.fg = base0B;
|
||||
modified.fg = base0A;
|
||||
removed.fg = base08;
|
||||
};
|
||||
symbols = {
|
||||
added = " ";
|
||||
modified = " ";
|
||||
removed = " ";
|
||||
};
|
||||
}
|
||||
)
|
||||
"branch"
|
||||
];
|
||||
lualine_z = [
|
||||
"filetype"
|
||||
"fileformat"
|
||||
"encoding"
|
||||
];
|
||||
};
|
||||
options.theme =
|
||||
(lib.mapAttrs
|
||||
(mode_name: mode_color: {
|
||||
a = inverted;
|
||||
b = inverted // {
|
||||
bg = mode_color;
|
||||
gui = "bold";
|
||||
};
|
||||
c = normal;
|
||||
x = inverted;
|
||||
y = normal;
|
||||
z = inverted // {
|
||||
bg = mode_color;
|
||||
};
|
||||
})
|
||||
{
|
||||
normal = base0D;
|
||||
insert = base0B;
|
||||
visual = base0F;
|
||||
replace = base08;
|
||||
command = base0E;
|
||||
}
|
||||
)
|
||||
// {
|
||||
inactive = {
|
||||
a = inverted_ina;
|
||||
b = normal_ina // {
|
||||
bg = base00;
|
||||
gui = "bold";
|
||||
};
|
||||
c = normal_ina;
|
||||
x = inverted_ina;
|
||||
y = normal_ina;
|
||||
z = normal_ina // {
|
||||
bg = base00;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
# Show context on top if scrolled out
|
||||
treesitter-context = {
|
||||
enable = true;
|
||||
|
|
|
@ -1,12 +1,20 @@
|
|||
{ pkgs, lib, config, nixvim, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
nixvim,
|
||||
...
|
||||
}:
|
||||
{
|
||||
# config = lib.mkIf config.programs.nixvim.enable { # Somehow this is infinite recursion?
|
||||
config = {
|
||||
home.sessionVariables = {
|
||||
EDITOR = "nvim";
|
||||
} // lib.optionalAttrs config.frogeye.desktop.xorg {
|
||||
VISUAL = "nvim";
|
||||
};
|
||||
home.sessionVariables =
|
||||
{
|
||||
EDITOR = "nvim";
|
||||
}
|
||||
// lib.optionalAttrs config.frogeye.desktop.xorg {
|
||||
VISUAL = "nvim";
|
||||
};
|
||||
programs.bash.shellAliases = {
|
||||
vi = "nvim";
|
||||
vim = "nvim";
|
||||
|
@ -84,20 +92,23 @@
|
|||
undotree.enable = true; # Navigate edition history
|
||||
|
||||
};
|
||||
extraPlugins = with pkgs.vimPlugins; [
|
||||
# Search/replace
|
||||
vim-abolish # Regex for words, with case in mind
|
||||
vim-easy-align # Aligning lines around a certain character
|
||||
extraPlugins =
|
||||
with pkgs.vimPlugins;
|
||||
[
|
||||
# Search/replace
|
||||
vim-abolish # Regex for words, with case in mind
|
||||
vim-easy-align # Aligning lines around a certain character
|
||||
|
||||
# Surrounding pairs
|
||||
targets-vim # Better interaction with surrounding pairs
|
||||
# Surrounding pairs
|
||||
targets-vim # Better interaction with surrounding pairs
|
||||
|
||||
# Language-specific
|
||||
tcomment_vim # Language-aware (un)commenting
|
||||
] ++ lib.optionals config.frogeye.dev.ansible [
|
||||
ansible-vim
|
||||
# Doesn't generate snippets, but those are for UltiSnip anyways
|
||||
];
|
||||
# Language-specific
|
||||
tcomment_vim # Language-aware (un)commenting
|
||||
]
|
||||
++ lib.optionals config.frogeye.dev.ansible [
|
||||
ansible-vim
|
||||
# Doesn't generate snippets, but those are for UltiSnip anyways
|
||||
];
|
||||
extraConfigLuaPre = lib.mkBefore ''
|
||||
-- If terminal is detected to be light, background will be changed after base16 theme is applied.
|
||||
-- Setting manually early to prevent hightlights having weird colors.
|
||||
|
@ -110,7 +121,9 @@
|
|||
'';
|
||||
|
||||
userCommands = {
|
||||
Reload = { command = "source ${config.xdg.configHome}/nvim/init.lua"; };
|
||||
Reload = {
|
||||
command = "source ${config.xdg.configHome}/nvim/init.lua";
|
||||
};
|
||||
};
|
||||
|
||||
keymaps = [
|
||||
|
@ -118,24 +131,54 @@
|
|||
|
||||
# Allow saving of files as sudo when I forgot to start vim using sudo.
|
||||
# From https://stackoverflow.com/a/7078429
|
||||
{ mode = "c"; key = "w!!"; action = "w !sudo tee > /dev/null %"; }
|
||||
{
|
||||
mode = "c";
|
||||
key = "w!!";
|
||||
action = "w !sudo tee > /dev/null %";
|
||||
}
|
||||
|
||||
{ mode = "i"; key = "jk"; action = "<Esc>"; }
|
||||
{ mode = "v"; key = "<Enter>"; action = "<Esc>"; }
|
||||
{ key = "<Enter>"; action = "o<Esc>"; }
|
||||
{
|
||||
mode = "i";
|
||||
key = "jk";
|
||||
action = "<Esc>";
|
||||
}
|
||||
{
|
||||
mode = "v";
|
||||
key = "<Enter>";
|
||||
action = "<Esc>";
|
||||
}
|
||||
{
|
||||
key = "<Enter>";
|
||||
action = "o<Esc>";
|
||||
}
|
||||
|
||||
# { key = "<C-H>"; action = ":bp<CR>"; }
|
||||
# { key = "<C-L>"; action = ":bn<CR>"; }
|
||||
{ key = "<C-K>"; action = "kkkkkkkkkkkkkkkkkkkkk"; }
|
||||
{ key = "<C-J>"; action = "jjjjjjjjjjjjjjjjjjjjj"; }
|
||||
{
|
||||
key = "<C-K>";
|
||||
action = "kkkkkkkkkkkkkkkkkkkkk";
|
||||
}
|
||||
{
|
||||
key = "<C-J>";
|
||||
action = "jjjjjjjjjjjjjjjjjjjjj";
|
||||
}
|
||||
|
||||
# \s to replace globally the word under the cursor
|
||||
{ key = "<Leader>s"; action = ":%s/\\<<C-r><C-w>\\>/"; }
|
||||
{
|
||||
key = "<Leader>s";
|
||||
action = ":%s/\\<<C-r><C-w>\\>/";
|
||||
}
|
||||
|
||||
# PLUGINS
|
||||
|
||||
# undotree
|
||||
{ key = "<Space>u"; action = "<Cmd>UndotreeToggle<CR>"; options = { silent = true; }; }
|
||||
{
|
||||
key = "<Space>u";
|
||||
action = "<Cmd>UndotreeToggle<CR>";
|
||||
options = {
|
||||
silent = true;
|
||||
};
|
||||
}
|
||||
|
||||
];
|
||||
};
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
programs.nixvim = {
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
config = {
|
||||
programs.nixvim = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue