mirror of
https://github.com/nmasur/dotfiles
synced 2025-01-30 23:22:02 +00:00
initial refactoring
This commit is contained in:
parent
a4b5e05f8f
commit
604aacbbd7
@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
_1password = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable 1Password.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config._1password.enable) {
|
|
||||||
unfreePackages = [
|
|
||||||
"1password"
|
|
||||||
"_1password-gui"
|
|
||||||
"1password-cli"
|
|
||||||
];
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
home.packages = [
|
|
||||||
pkgs._1password-cli
|
|
||||||
] ++ (if pkgs.stdenv.isLinux then [ pkgs._1password-gui ] else [ ]);
|
|
||||||
};
|
|
||||||
|
|
||||||
# https://1password.community/discussion/135462/firefox-extension-does-not-connect-to-linux-app
|
|
||||||
# On Mac, does not apply: https://1password.community/discussion/142794/app-and-browser-integration
|
|
||||||
# However, the button doesn't work either:
|
|
||||||
# https://1password.community/discussion/140735/extending-support-for-trusted-web-browsers
|
|
||||||
environment.etc."1password/custom_allowed_browsers".text = ''
|
|
||||||
${
|
|
||||||
config.home-manager.users.${config.user}.programs.firefox.package
|
|
||||||
}/Applications/Firefox.app/Contents/MacOS/firefox
|
|
||||||
firefox
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
alacritty = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable Alacritty.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.alacritty.enable) {
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
xsession.windowManager.i3.config.terminal = "alacritty";
|
|
||||||
programs.rofi.terminal = "${pkgs.alacritty}/bin/alacritty";
|
|
||||||
programs.alacritty = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
window = {
|
|
||||||
dimensions = {
|
|
||||||
columns = 85;
|
|
||||||
lines = 30;
|
|
||||||
};
|
|
||||||
padding = {
|
|
||||||
x = 20;
|
|
||||||
y = 20;
|
|
||||||
};
|
|
||||||
opacity = 1.0;
|
|
||||||
};
|
|
||||||
scrolling.history = 10000;
|
|
||||||
font = {
|
|
||||||
size = 14.0;
|
|
||||||
};
|
|
||||||
key_bindings = [
|
|
||||||
# Used for word completion in fish_user_key_bindings
|
|
||||||
{
|
|
||||||
key = "Return";
|
|
||||||
mods = "Shift";
|
|
||||||
chars = "\\x1F";
|
|
||||||
}
|
|
||||||
# Used for searching nixpkgs in fish_user_key_bindings
|
|
||||||
{
|
|
||||||
key = "N";
|
|
||||||
mods = "Control|Shift";
|
|
||||||
chars = "\\x11F";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
key = "H";
|
|
||||||
mods = "Control|Shift";
|
|
||||||
mode = "~Vi";
|
|
||||||
action = "ToggleViMode";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
key = "Return";
|
|
||||||
mode = "Vi";
|
|
||||||
action = "ToggleViMode";
|
|
||||||
}
|
|
||||||
# Used to enable $ keybind in Vi mode
|
|
||||||
{
|
|
||||||
key = 5; # Scancode for key4
|
|
||||||
mods = "Shift";
|
|
||||||
mode = "Vi|~Search";
|
|
||||||
action = "Last";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
colors = {
|
|
||||||
primary = {
|
|
||||||
background = config.theme.colors.base00;
|
|
||||||
foreground = config.theme.colors.base05;
|
|
||||||
};
|
|
||||||
cursor = {
|
|
||||||
text = "#1d2021";
|
|
||||||
cursor = config.theme.colors.base05;
|
|
||||||
};
|
|
||||||
normal = {
|
|
||||||
black = "#1d2021";
|
|
||||||
red = config.theme.colors.base08;
|
|
||||||
green = config.theme.colors.base0B;
|
|
||||||
yellow = config.theme.colors.base0A;
|
|
||||||
blue = config.theme.colors.base0D;
|
|
||||||
magenta = config.theme.colors.base0E;
|
|
||||||
cyan = config.theme.colors.base0C;
|
|
||||||
white = config.theme.colors.base05;
|
|
||||||
};
|
|
||||||
bright = {
|
|
||||||
black = config.theme.colors.base03;
|
|
||||||
red = config.theme.colors.base09;
|
|
||||||
green = config.theme.colors.base01;
|
|
||||||
yellow = config.theme.colors.base02;
|
|
||||||
blue = config.theme.colors.base04;
|
|
||||||
magenta = config.theme.colors.base06;
|
|
||||||
cyan = config.theme.colors.base0F;
|
|
||||||
white = config.theme.colors.base07;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
draw_bold_text_with_bright_colors = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
discord = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable Discord.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.discord.enable) {
|
|
||||||
unfreePackages = [ "discord" ];
|
|
||||||
environment.systemPackages = [ pkgs.discord ];
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
xdg.configFile."discord/settings.json".text = ''
|
|
||||||
{
|
|
||||||
"BACKGROUND_COLOR": "#202225",
|
|
||||||
"IS_MAXIMIZED": false,
|
|
||||||
"IS_MINIMIZED": false,
|
|
||||||
"OPEN_ON_STARTUP": false,
|
|
||||||
"MINIMIZE_TO_TRAY": false,
|
|
||||||
"SKIP_HOST_UPDATE": true
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,203 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
firefox = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable Firefox.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.firefox.enable) {
|
|
||||||
|
|
||||||
unfreePackages = [
|
|
||||||
(lib.mkIf config._1password.enable "onepassword-password-manager")
|
|
||||||
"okta-browser-plugin"
|
|
||||||
];
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
programs.firefox = {
|
|
||||||
enable = true;
|
|
||||||
package = if pkgs.stdenv.isDarwin then pkgs.firefox-bin else pkgs.firefox;
|
|
||||||
profiles.default = {
|
|
||||||
id = 0;
|
|
||||||
name = "default";
|
|
||||||
isDefault = true;
|
|
||||||
# https://nur.nix-community.org/repos/rycee/
|
|
||||||
extensions = with pkgs.nur.repos.rycee.firefox-addons; [
|
|
||||||
(lib.mkIf config._1password.enable onepassword-password-manager)
|
|
||||||
darkreader
|
|
||||||
don-t-fuck-with-paste
|
|
||||||
facebook-container
|
|
||||||
markdownload
|
|
||||||
multi-account-containers
|
|
||||||
okta-browser-plugin
|
|
||||||
reddit-enhancement-suite
|
|
||||||
return-youtube-dislikes
|
|
||||||
sponsorblock
|
|
||||||
ublock-origin
|
|
||||||
ublacklist
|
|
||||||
vimium
|
|
||||||
];
|
|
||||||
settings = {
|
|
||||||
"app.update.auto" = false;
|
|
||||||
"browser.aboutConfig.showWarning" = false;
|
|
||||||
"browser.warnOnQuit" = false;
|
|
||||||
"browser.quitShortcut.disabled" = if pkgs.stdenv.isLinux then true else false;
|
|
||||||
"browser.theme.dark-private-windows" = true;
|
|
||||||
"browser.toolbars.bookmarks.visibility" = false;
|
|
||||||
"browser.startup.page" = 3; # Restore previous session
|
|
||||||
"browser.newtabpage.enabled" = false; # Make new tabs blank
|
|
||||||
"trailhead.firstrun.didSeeAboutWelcome" = true; # Disable welcome splash
|
|
||||||
"dom.forms.autocomplete.formautofill" = false; # Disable autofill
|
|
||||||
"extensions.formautofill.creditCards.enabled" = false; # Disable credit cards
|
|
||||||
"dom.payments.defaults.saveAddress" = false; # Disable address save
|
|
||||||
"general.autoScroll" = true; # Drag middle-mouse to scroll
|
|
||||||
"services.sync.prefs.sync.general.autoScroll" = false; # Prevent disabling autoscroll
|
|
||||||
"extensions.pocket.enabled" = false;
|
|
||||||
"toolkit.legacyUserProfileCustomizations.stylesheets" = true; # Allow userChrome.css
|
|
||||||
"layout.css.color-mix.enabled" = true;
|
|
||||||
"ui.systemUsesDarkTheme" = if config.theme.dark == true then 1 else 0;
|
|
||||||
"media.ffmpeg.vaapi.enabled" = true; # Enable hardware video acceleration
|
|
||||||
"cookiebanners.ui.desktop.enabled" = true; # Reject cookie popups
|
|
||||||
"devtools.command-button-screenshot.enabled" = true; # Scrolling screenshot of entire page
|
|
||||||
"svg.context-properties.content.enabled" = true; # Sidebery styling
|
|
||||||
"browser.tabs.hoverPreview.enabled" = false; # Disable tab previews
|
|
||||||
"browser.tabs.hoverPreview.showThumbnails" = false; # Disable tab previews
|
|
||||||
};
|
|
||||||
userChrome = ''
|
|
||||||
:root {
|
|
||||||
--focus-outline-color: ${config.theme.colors.base04} !important;
|
|
||||||
--toolbar-color: ${config.theme.colors.base07} !important;
|
|
||||||
--tab-min-height: 30px !important;
|
|
||||||
}
|
|
||||||
/* Background of tab bar */
|
|
||||||
.toolbar-items {
|
|
||||||
background-color: ${config.theme.colors.base00} !important;
|
|
||||||
}
|
|
||||||
/* Extra tab bar sides on macOS */
|
|
||||||
.titlebar-spacer {
|
|
||||||
background-color: ${config.theme.colors.base00} !important;
|
|
||||||
}
|
|
||||||
.titlebar-buttonbox-container {
|
|
||||||
background-color: ${config.theme.colors.base00} !important;
|
|
||||||
}
|
|
||||||
#tabbrowser-tabs {
|
|
||||||
border-inline-start: 0 !important;
|
|
||||||
}
|
|
||||||
/* Private Browsing indicator on macOS */
|
|
||||||
#private-browsing-indicator-with-label {
|
|
||||||
background-color: ${config.theme.colors.base00} !important;
|
|
||||||
margin-inline: 0 !important;
|
|
||||||
padding-inline: 7px;
|
|
||||||
}
|
|
||||||
/* Tabs themselves */
|
|
||||||
.tabbrowser-tab .tab-stack {
|
|
||||||
border-radius: 5px 5px 0 0;
|
|
||||||
overflow: hidden;
|
|
||||||
background-color: ${config.theme.colors.base00};
|
|
||||||
color: ${config.theme.colors.base06} !important;
|
|
||||||
}
|
|
||||||
.tab-content {
|
|
||||||
border-bottom: 2px solid color-mix(in srgb, var(--identity-tab-color) 40%, transparent);
|
|
||||||
border-radius: 5px 5px 0 0;
|
|
||||||
background-color: ${config.theme.colors.base00};
|
|
||||||
color: ${config.theme.colors.base06} !important;
|
|
||||||
}
|
|
||||||
.tab-content[selected] {
|
|
||||||
border-bottom: 2px solid color-mix(in srgb, var(--identity-tab-color) 25%, transparent);
|
|
||||||
background-color: ${config.theme.colors.base01} !important;
|
|
||||||
color: ${config.theme.colors.base07} !important;
|
|
||||||
}
|
|
||||||
/* Below tab bar */
|
|
||||||
#nav-bar {
|
|
||||||
background: ${config.theme.colors.base01} !important;
|
|
||||||
}
|
|
||||||
/* URL bar in nav bar */
|
|
||||||
#urlbar[focused=true] {
|
|
||||||
color: ${config.theme.colors.base07} !important;
|
|
||||||
background: ${config.theme.colors.base02} !important;
|
|
||||||
caret-color: ${config.theme.colors.base05} !important;
|
|
||||||
}
|
|
||||||
#urlbar:not([focused=true]) {
|
|
||||||
color: ${config.theme.colors.base04} !important;
|
|
||||||
background: ${config.theme.colors.base02} !important;
|
|
||||||
}
|
|
||||||
#urlbar ::-moz-selection {
|
|
||||||
color: ${config.theme.colors.base07} !important;
|
|
||||||
background: ${config.theme.colors.base02} !important;
|
|
||||||
}
|
|
||||||
#urlbar-input-container {
|
|
||||||
border: 1px solid ${config.theme.colors.base01} !important;
|
|
||||||
}
|
|
||||||
#urlbar-background {
|
|
||||||
background: ${config.theme.colors.base01} !important;
|
|
||||||
}
|
|
||||||
/* Text in URL bar */
|
|
||||||
#urlbar-input, #urlbar-scheme, .searchbar-textbox {
|
|
||||||
color: ${config.theme.colors.base07} !important;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
userContent = ''
|
|
||||||
@-moz-document url-prefix(about:blank) {
|
|
||||||
* {
|
|
||||||
background-color:${config.theme.colors.base01} !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
|
|
||||||
extraConfig = "";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Mimic nixpkgs package environment for read-only profiles.ini management
|
|
||||||
# From: https://github.com/booxter/home-manager/commit/dd1602e306fec366280f5953c5e1b553e3d9672a
|
|
||||||
home.sessionVariables = {
|
|
||||||
MOZ_LEGACY_PROFILES = 1;
|
|
||||||
MOZ_ALLOW_DOWNGRADE = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
# launchd.user.envVariables = config.home-manager.users.${config.user}.home.sessionVariables;
|
|
||||||
|
|
||||||
xdg.mimeApps = {
|
|
||||||
associations.added = {
|
|
||||||
"text/html" = [ "firefox.desktop" ];
|
|
||||||
};
|
|
||||||
defaultApplications = {
|
|
||||||
"text/html" = [ "firefox.desktop" ];
|
|
||||||
};
|
|
||||||
associations.removed = {
|
|
||||||
"text/html" = [ "wine-extension-htm.desktop" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
|
|
||||||
"${
|
|
||||||
config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
|
|
||||||
}+Shift+b" = "exec ${
|
|
||||||
# Don't name the script `firefox` or it will affect grep
|
|
||||||
builtins.toString (
|
|
||||||
pkgs.writeShellScript "focus-ff.sh" ''
|
|
||||||
count=$(ps aux | grep -c firefox)
|
|
||||||
if [ "$count" -eq 1 ]; then
|
|
||||||
i3-msg "exec --no-startup-id firefox"
|
|
||||||
sleep 0.5
|
|
||||||
fi
|
|
||||||
i3-msg "[class=firefox] focus"
|
|
||||||
''
|
|
||||||
)
|
|
||||||
}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,118 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
kitty = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable Kitty.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.kitty.enable) {
|
|
||||||
|
|
||||||
# Set the Rofi-Systemd terminal for viewing logs
|
|
||||||
# Using optionalAttrs because only available in NixOS
|
|
||||||
environment =
|
|
||||||
{ }
|
|
||||||
// lib.attrsets.optionalAttrs (builtins.hasAttr "sessionVariables" config.environment) {
|
|
||||||
sessionVariables.ROFI_SYSTEMD_TERM = lib.mkDefault "${pkgs.kitty}/bin/kitty";
|
|
||||||
};
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
# Set the i3 terminal
|
|
||||||
xsession.windowManager.i3.config.terminal = lib.mkIf pkgs.stdenv.isLinux "kitty";
|
|
||||||
|
|
||||||
# Set the Rofi terminal for running programs
|
|
||||||
programs.rofi.terminal = lib.mkIf pkgs.stdenv.isLinux (lib.mkDefault "${pkgs.kitty}/bin/kitty");
|
|
||||||
|
|
||||||
# Display images in the terminal
|
|
||||||
programs.fish.interactiveShellInit = # fish
|
|
||||||
''
|
|
||||||
if test "$TERM" = "xterm-kitty"
|
|
||||||
alias icat="kitty +kitten icat"
|
|
||||||
alias ssh="kitty +kitten ssh"
|
|
||||||
end
|
|
||||||
'';
|
|
||||||
|
|
||||||
programs.kitty = {
|
|
||||||
enable = true;
|
|
||||||
environment = { };
|
|
||||||
extraConfig = "";
|
|
||||||
font.size = 14;
|
|
||||||
keybindings = {
|
|
||||||
# Use shift+enter to complete text suggestions in fish
|
|
||||||
"shift+enter" = "send_text all \\x1F";
|
|
||||||
|
|
||||||
# Easy fullscreen toggle (for macOS)
|
|
||||||
"super+f" = "toggle_fullscreen";
|
|
||||||
};
|
|
||||||
settings = {
|
|
||||||
|
|
||||||
# Colors (adapted from: https://github.com/kdrag0n/base16-kitty/blob/master/templates/default-256.mustache)
|
|
||||||
background = config.theme.colors.base00;
|
|
||||||
foreground = config.theme.colors.base05;
|
|
||||||
selection_background = config.theme.colors.base05;
|
|
||||||
selection_foreground = config.theme.colors.base00;
|
|
||||||
url_color = config.theme.colors.base04;
|
|
||||||
cursor = config.theme.colors.base05;
|
|
||||||
active_border_color = config.theme.colors.base03;
|
|
||||||
inactive_border_color = config.theme.colors.base01;
|
|
||||||
active_tab_background = config.theme.colors.base00;
|
|
||||||
active_tab_foreground = config.theme.colors.base05;
|
|
||||||
inactive_tab_background = config.theme.colors.base01;
|
|
||||||
inactive_tab_foreground = config.theme.colors.base04;
|
|
||||||
tab_bar_background = config.theme.colors.base01;
|
|
||||||
|
|
||||||
# normal
|
|
||||||
color0 = config.theme.colors.base00;
|
|
||||||
color1 = config.theme.colors.base08;
|
|
||||||
color2 = config.theme.colors.base0B;
|
|
||||||
color3 = config.theme.colors.base0A;
|
|
||||||
color4 = config.theme.colors.base0D;
|
|
||||||
color5 = config.theme.colors.base0E;
|
|
||||||
color6 = config.theme.colors.base0C;
|
|
||||||
color7 = config.theme.colors.base05;
|
|
||||||
|
|
||||||
# bright
|
|
||||||
color8 = config.theme.colors.base03;
|
|
||||||
color9 = config.theme.colors.base08;
|
|
||||||
color10 = config.theme.colors.base0B;
|
|
||||||
color11 = config.theme.colors.base0A;
|
|
||||||
color12 = config.theme.colors.base0D;
|
|
||||||
color13 = config.theme.colors.base0E;
|
|
||||||
color14 = config.theme.colors.base0C;
|
|
||||||
color15 = config.theme.colors.base07;
|
|
||||||
|
|
||||||
# extended base16 colors
|
|
||||||
color16 = config.theme.colors.base09;
|
|
||||||
color17 = config.theme.colors.base0F;
|
|
||||||
color18 = config.theme.colors.base01;
|
|
||||||
color19 = config.theme.colors.base02;
|
|
||||||
color20 = config.theme.colors.base04;
|
|
||||||
color21 = config.theme.colors.base06;
|
|
||||||
|
|
||||||
# Scrollback
|
|
||||||
scrollback_lines = 10000;
|
|
||||||
scrollback_pager_history_size = 300; # MB
|
|
||||||
|
|
||||||
# Window
|
|
||||||
window_padding_width = 6;
|
|
||||||
|
|
||||||
tab_bar_edge = "top";
|
|
||||||
tab_bar_style = "slant";
|
|
||||||
|
|
||||||
# Disable audio
|
|
||||||
enable_audio_bell = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
media = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable media programs.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.media.enable) {
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
nsxiv # Image viewer
|
|
||||||
mupdf # PDF viewer
|
|
||||||
zathura # PDF viewer
|
|
||||||
];
|
|
||||||
|
|
||||||
# Video player
|
|
||||||
programs.mpv = {
|
|
||||||
enable = true;
|
|
||||||
bindings = { };
|
|
||||||
config = {
|
|
||||||
image-display-duration = 2; # For cycling through images
|
|
||||||
hwdec = "auto-safe"; # Attempt to use GPU decoding for video
|
|
||||||
};
|
|
||||||
scripts = [
|
|
||||||
|
|
||||||
# Automatically load playlist entries before and after current file
|
|
||||||
pkgs.mpvScripts.autoload
|
|
||||||
|
|
||||||
# Delete current file after quitting
|
|
||||||
pkgs.mpvScripts.mpv-delete-file
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Set default programs for opening PDFs and other media
|
|
||||||
xdg.mimeApps = {
|
|
||||||
associations.added = {
|
|
||||||
"application/pdf" = [ "pwmt.zathura-cb.desktop" ];
|
|
||||||
"image/jpeg" = [ "nsxiv.desktop" ];
|
|
||||||
"image/png" = [ "nsxiv.desktop" ];
|
|
||||||
"image/*" = [ "nsxiv.desktop" ];
|
|
||||||
};
|
|
||||||
associations.removed = {
|
|
||||||
"application/pdf" = [
|
|
||||||
"mupdf.desktop"
|
|
||||||
"wine-extension-pdf.desktop"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
defaultApplications = {
|
|
||||||
"application/pdf" = [ "pwmt.zathura-cb.desktop" ];
|
|
||||||
"image/jpeg" = [ "nsxiv.desktop" ];
|
|
||||||
"image/png" = [ "nsxiv.desktop" ];
|
|
||||||
"image/*" = [ "nsxiv.desktop" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
obsidian = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable Obsidian.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.obsidian.enable) {
|
|
||||||
unfreePackages = [ "obsidian" ];
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
home.packages = with pkgs; [ obsidian ];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Broken on 2023-12-11
|
|
||||||
# https://forum.obsidian.md/t/electron-25-is-now-eol-please-upgrade-to-a-newer-version/72878/8
|
|
||||||
insecurePackages = [ "electron-25.9.0" ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
qbittorrent = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable qBittorrent.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.qbittorrent.enable) {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
home.packages = with pkgs; [ qbittorrent ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
slack = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable Slack.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.slack.enable) {
|
|
||||||
unfreePackages = [ "slack" ];
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
home.packages = with pkgs; [ slack ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Theme string: #1D2122,#665C54,#8EC07C,#BDAE93
|
|
||||||
}
|
|
@ -1,286 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
wezterm = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable WezTerm terminal.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config =
|
|
||||||
let
|
|
||||||
font = config.home-manager.users.${config.user}.programs.kitty.font.name;
|
|
||||||
in
|
|
||||||
lib.mkIf (config.gui.enable && config.wezterm.enable) {
|
|
||||||
|
|
||||||
# Set the Rofi-Systemd terminal for viewing logs
|
|
||||||
# Using optionalAttrs because only available in NixOS
|
|
||||||
environment =
|
|
||||||
{ }
|
|
||||||
// lib.attrsets.optionalAttrs (builtins.hasAttr "sessionVariables" config.environment) {
|
|
||||||
sessionVariables.ROFI_SYSTEMD_TERM = "${pkgs.wezterm}/bin/wezterm";
|
|
||||||
};
|
|
||||||
|
|
||||||
terminal = "${pkgs.wezterm}/bin/wezterm";
|
|
||||||
terminalLaunchCommand = "${config.terminal} start --";
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
# Set the i3 terminal
|
|
||||||
xsession.windowManager.i3.config.terminal = lib.mkIf pkgs.stdenv.isLinux "wezterm";
|
|
||||||
|
|
||||||
# Display images in the terminal
|
|
||||||
programs.fish.shellAliases = {
|
|
||||||
icat = lib.mkForce "wezterm imgcat";
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.wezterm = {
|
|
||||||
enable = true;
|
|
||||||
colorSchemes = {
|
|
||||||
myTheme = {
|
|
||||||
background = config.theme.colors.base00;
|
|
||||||
foreground = config.theme.colors.base05;
|
|
||||||
cursor_bg = config.theme.colors.base05;
|
|
||||||
cursor_fg = config.theme.colors.base00;
|
|
||||||
cursor_border = config.theme.colors.base05;
|
|
||||||
selection_bg = config.theme.colors.base05;
|
|
||||||
selection_fg = config.theme.colors.base00;
|
|
||||||
scrollbar_thumb = config.theme.colors.base03;
|
|
||||||
ansi = [
|
|
||||||
config.theme.colors.base01 # black
|
|
||||||
config.theme.colors.base0F # maroon
|
|
||||||
config.theme.colors.base0B # green
|
|
||||||
config.theme.colors.base0A # olive
|
|
||||||
config.theme.colors.base0D # navy
|
|
||||||
config.theme.colors.base0E # purple
|
|
||||||
config.theme.colors.base0C # teal
|
|
||||||
config.theme.colors.base06 # silver
|
|
||||||
];
|
|
||||||
brights = [
|
|
||||||
config.theme.colors.base03 # grey
|
|
||||||
config.theme.colors.base08 # red
|
|
||||||
config.theme.colors.base0B # lime
|
|
||||||
config.theme.colors.base0A # yellow
|
|
||||||
config.theme.colors.base0D # blue
|
|
||||||
config.theme.colors.base0E # fuchsia
|
|
||||||
config.theme.colors.base0C # aqua
|
|
||||||
config.theme.colors.base07 # white
|
|
||||||
];
|
|
||||||
compose_cursor = config.theme.colors.base09; # orange
|
|
||||||
copy_mode_active_highlight_bg = {
|
|
||||||
Color = config.theme.colors.base03;
|
|
||||||
};
|
|
||||||
copy_mode_active_highlight_fg = {
|
|
||||||
Color = config.theme.colors.base07;
|
|
||||||
};
|
|
||||||
copy_mode_inactive_highlight_bg = {
|
|
||||||
Color = config.theme.colors.base02;
|
|
||||||
};
|
|
||||||
copy_mode_inactive_highlight_fg = {
|
|
||||||
Color = config.theme.colors.base06;
|
|
||||||
};
|
|
||||||
quick_select_label_bg = {
|
|
||||||
Color = config.theme.colors.base02;
|
|
||||||
};
|
|
||||||
quick_select_label_fg = {
|
|
||||||
Color = config.theme.colors.base06;
|
|
||||||
};
|
|
||||||
quick_select_match_bg = {
|
|
||||||
Color = config.theme.colors.base03;
|
|
||||||
};
|
|
||||||
quick_select_match_fg = {
|
|
||||||
Color = config.theme.colors.base07;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
extraConfig = ''
|
|
||||||
local wezterm = require("wezterm")
|
|
||||||
local config = wezterm.config_builder()
|
|
||||||
config.check_for_updates = false
|
|
||||||
config.color_scheme = "myTheme"
|
|
||||||
|
|
||||||
-- Scrollback
|
|
||||||
config.scrollback_lines = 10000
|
|
||||||
|
|
||||||
-- Window
|
|
||||||
config.window_padding = {
|
|
||||||
left = 10,
|
|
||||||
right = 10,
|
|
||||||
top = 10,
|
|
||||||
bottom = 12,
|
|
||||||
}
|
|
||||||
|
|
||||||
config.font = wezterm.font('${font}', { weight = 'Bold'})
|
|
||||||
config.font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"}
|
|
||||||
|
|
||||||
-- Fix color blocks instead of text
|
|
||||||
config.front_end = "WebGpu"
|
|
||||||
|
|
||||||
-- Tab Bar
|
|
||||||
config.hide_tab_bar_if_only_one_tab = true
|
|
||||||
config.window_frame = {
|
|
||||||
font = wezterm.font('${font}', { weight = 'Bold'}),
|
|
||||||
font_size = ${if pkgs.stdenv.isLinux then "12.0" else "16.0"},
|
|
||||||
}
|
|
||||||
|
|
||||||
config.colors = {
|
|
||||||
tab_bar = {
|
|
||||||
active_tab = {
|
|
||||||
bg_color = '${config.theme.colors.base00}',
|
|
||||||
fg_color = '${config.theme.colors.base04}',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Disable audio
|
|
||||||
config.audible_bell = "Disabled"
|
|
||||||
|
|
||||||
config.initial_rows = 80
|
|
||||||
config.initial_cols = 200
|
|
||||||
|
|
||||||
config.unix_domains = {
|
|
||||||
{
|
|
||||||
name = 'unix',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- This causes `wezterm` to act as though it was started as
|
|
||||||
-- `wezterm connect unix` by default, connecting to the unix
|
|
||||||
-- domain on startup.
|
|
||||||
-- If you prefer to connect manually, leave out this line.
|
|
||||||
config.default_gui_startup_args = { 'connect', 'unix' }
|
|
||||||
|
|
||||||
config.leader = {
|
|
||||||
key = 'a',
|
|
||||||
mods = 'CTRL',
|
|
||||||
timeout_milliseconds = 2000,
|
|
||||||
}
|
|
||||||
|
|
||||||
config.keys = {
|
|
||||||
-- Attach to muxer
|
|
||||||
{
|
|
||||||
key = 'a',
|
|
||||||
mods = 'LEADER',
|
|
||||||
action = wezterm.action.AttachDomain 'unix',
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Detach from muxer
|
|
||||||
{
|
|
||||||
key = 'd',
|
|
||||||
mods = 'LEADER',
|
|
||||||
action = wezterm.action.DetachDomain { DomainName = 'unix' },
|
|
||||||
},
|
|
||||||
-- sends completion string for fish autosuggestions
|
|
||||||
{
|
|
||||||
key = 'Enter',
|
|
||||||
mods = 'SHIFT',
|
|
||||||
action = wezterm.action.SendString '\x1F'
|
|
||||||
},
|
|
||||||
-- ctrl-shift-h was "hide"
|
|
||||||
{
|
|
||||||
key = 'H',
|
|
||||||
mods = 'SHIFT|CTRL',
|
|
||||||
action = wezterm.action.DisableDefaultAssignment
|
|
||||||
},
|
|
||||||
-- alt-enter was "fullscreen"
|
|
||||||
{
|
|
||||||
key = 'Enter',
|
|
||||||
mods = 'ALT',
|
|
||||||
action = wezterm.action.DisableDefaultAssignment
|
|
||||||
},
|
|
||||||
-- make super-f "fullscreen"
|
|
||||||
{
|
|
||||||
key = 'f',
|
|
||||||
mods = 'SUPER',
|
|
||||||
action = wezterm.action.ToggleFullScreen
|
|
||||||
},
|
|
||||||
-- super-t open new tab in new dir
|
|
||||||
{
|
|
||||||
key = 't',
|
|
||||||
mods = ${if pkgs.stdenv.isDarwin then "'SUPER'" else "'ALT'"},
|
|
||||||
action = wezterm.action.SpawnCommandInNewTab {
|
|
||||||
cwd = wezterm.home_dir,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
-- shift-super-t open new tab in same dir
|
|
||||||
{
|
|
||||||
key = 't',
|
|
||||||
mods = 'SUPER|SHIFT',
|
|
||||||
action = wezterm.action.SpawnTab 'CurrentPaneDomain'
|
|
||||||
},
|
|
||||||
-- project switcher
|
|
||||||
{
|
|
||||||
key = 'P',
|
|
||||||
mods = 'SUPER',
|
|
||||||
action = wezterm.action_callback(function(window, pane)
|
|
||||||
local choices = {}
|
|
||||||
|
|
||||||
wezterm.log_info "working?"
|
|
||||||
|
|
||||||
function scandir(directory)
|
|
||||||
local i, t, popen = 0, {}, io.popen
|
|
||||||
local pfile = popen('${pkgs.fd}/bin/fd --search-path "'..directory..'" --type directory --exact-depth 2 | ${pkgs.proximity-sort}/bin/proximity-sort "'..os.getenv("HOME").."/dev/work"..'"')
|
|
||||||
for filename in pfile:lines() do
|
|
||||||
i = i + 1
|
|
||||||
t[i] = filename
|
|
||||||
end
|
|
||||||
pfile:close()
|
|
||||||
return t
|
|
||||||
end
|
|
||||||
|
|
||||||
for _, v in pairs(scandir(os.getenv("HOME").."/dev")) do
|
|
||||||
table.insert(choices, { label = v })
|
|
||||||
end
|
|
||||||
|
|
||||||
window:perform_action(
|
|
||||||
wezterm.action.InputSelector {
|
|
||||||
action = wezterm.action_callback(function(window, pane, id, label)
|
|
||||||
if not id and not label then
|
|
||||||
wezterm.log_info "cancelled"
|
|
||||||
else
|
|
||||||
window:perform_action(
|
|
||||||
wezterm.action.SpawnCommandInNewTab {
|
|
||||||
cwd = label,
|
|
||||||
},
|
|
||||||
pane
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end),
|
|
||||||
fuzzy = true,
|
|
||||||
title = "Select Project",
|
|
||||||
choices = choices,
|
|
||||||
},
|
|
||||||
pane
|
|
||||||
)
|
|
||||||
end),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- print the workspace name at the upper right
|
|
||||||
wezterm.on("update-right-status", function(window, pane)
|
|
||||||
window:set_right_status(window:active_workspace())
|
|
||||||
end)
|
|
||||||
-- load plugin
|
|
||||||
local workspace_switcher = wezterm.plugin.require("https://github.com/MLFlexer/smart_workspace_switcher.wezterm")
|
|
||||||
-- set path to zoxide
|
|
||||||
workspace_switcher.zoxide_path = "${pkgs.zoxide}/bin/zoxide"
|
|
||||||
-- keymaps
|
|
||||||
table.insert(config.keys, { key = "s", mods = "CTRL|SHIFT", action = workspace_switcher.switch_workspace() })
|
|
||||||
-- table.insert(config.keys, { key = "t", mods = "CTRL|SHIFT", action = wezterm.action.ShowLauncherArgs({ flags = "FUZZY|WORKSPACES" }) })
|
|
||||||
table.insert(config.keys, { key = "[", mods = "CTRL|SHIFT", action = wezterm.action.SwitchWorkspaceRelative(1) })
|
|
||||||
table.insert(config.keys, { key = "]", mods = "CTRL|SHIFT", action = wezterm.action.SwitchWorkspaceRelative(-1) })
|
|
||||||
|
|
||||||
return config
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
yt-dlp = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable YouTube downloader.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.yt-dlp.enable) {
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
programs.yt-dlp = {
|
|
||||||
enable = true;
|
|
||||||
extraConfig = "";
|
|
||||||
settings = {
|
|
||||||
no-continue = true; # Always re-download each fragment
|
|
||||||
no-overwrites = true; # Don't overwrite existing files
|
|
||||||
download-archive = "archive.log"; # Log of archives
|
|
||||||
embed-metadata = true;
|
|
||||||
embed-thumbnail = true;
|
|
||||||
embed-subs = true;
|
|
||||||
sub-langs = "en.*";
|
|
||||||
concurrent-fragments = 4; # Parallel download chunks
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.fish.shellAbbrs.yt = "yt-dlp";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,220 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options.mail.aerc.enable = lib.mkEnableOption "Aerc email.";
|
|
||||||
|
|
||||||
config = lib.mkIf config.mail.aerc.enable {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
w3m # Render HTML
|
|
||||||
dante # Socksify for rendering HTML
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.aerc = {
|
|
||||||
enable = true;
|
|
||||||
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
|
|
||||||
global = {
|
|
||||||
"<C-p>" = ":prev-tab<Enter>";
|
|
||||||
"<C-n>" = ":next-tab <Enter>";
|
|
||||||
"<C-t>" = ":term<Enter>";
|
|
||||||
"?" = ":help keys<Enter>";
|
|
||||||
};
|
|
||||||
|
|
||||||
messages = {
|
|
||||||
q = ":quit<Enter>";
|
|
||||||
|
|
||||||
j = ":next <Enter>";
|
|
||||||
"<Down>" = ":next<Enter>";
|
|
||||||
"<C-d>" = ":next 50%<Enter>";
|
|
||||||
"<C-f>" = ":next 100%<Enter>";
|
|
||||||
"<PgDn>" = ":next 100%<Enter>";
|
|
||||||
|
|
||||||
k = ":prev <Enter>";
|
|
||||||
"<Up>" = ":prev<Enter>";
|
|
||||||
"<C-u>" = ":prev 50%<Enter>";
|
|
||||||
"<C-b>" = ":prev 100%<Enter>";
|
|
||||||
"<PgUp>" = ":prev 100%<Enter>";
|
|
||||||
g = ":select 0 <Enter>";
|
|
||||||
G = ":select -1<Enter>";
|
|
||||||
|
|
||||||
J = ":next-folder <Enter>";
|
|
||||||
K = ":prev-folder<Enter>";
|
|
||||||
H = ":collapse-folder<Enter>";
|
|
||||||
L = ":expand-folder<Enter>";
|
|
||||||
|
|
||||||
v = ":mark -t<Enter>";
|
|
||||||
V = ":mark -v<Enter>";
|
|
||||||
|
|
||||||
T = ":toggle-threads<Enter>";
|
|
||||||
|
|
||||||
"<Enter>" = ":view<Enter>";
|
|
||||||
d = ":prompt 'Really delete this message?' 'delete-message'<Enter>";
|
|
||||||
D = ":move Trash<Enter>";
|
|
||||||
A = ":archive flat<Enter>";
|
|
||||||
|
|
||||||
C = ":compose<Enter>";
|
|
||||||
|
|
||||||
rr = ":reply -a<Enter>";
|
|
||||||
rq = ":reply -aq<Enter>";
|
|
||||||
Rr = ":reply<Enter>";
|
|
||||||
Rq = ":reply -q<Enter>";
|
|
||||||
|
|
||||||
c = ":cf<space>";
|
|
||||||
"$" = ":term<space>";
|
|
||||||
"!" = ":term<space>";
|
|
||||||
"|" = ":pipe<space>";
|
|
||||||
|
|
||||||
"/" = ":search<space>-a<space>";
|
|
||||||
"\\" = ":filter <space>";
|
|
||||||
n = ":next-result<Enter>";
|
|
||||||
N = ":prev-result<Enter>";
|
|
||||||
"<Esc>" = ":clear<Enter>";
|
|
||||||
};
|
|
||||||
|
|
||||||
"messages:folder=Drafts" = {
|
|
||||||
"<Enter>" = ":recall<Enter>";
|
|
||||||
};
|
|
||||||
|
|
||||||
view = {
|
|
||||||
"/" = ":toggle-key-passthrough <Enter> /";
|
|
||||||
q = ":close<Enter>";
|
|
||||||
O = ":open<Enter>";
|
|
||||||
S = ":save<space>";
|
|
||||||
"|" = ":pipe<space>";
|
|
||||||
D = ":move Trash<Enter>";
|
|
||||||
A = ":archive flat<Enter>";
|
|
||||||
|
|
||||||
"<C-l>" = ":open-link <space>";
|
|
||||||
|
|
||||||
f = ":forward <Enter>";
|
|
||||||
rr = ":reply -a<Enter>";
|
|
||||||
rq = ":reply -aq<Enter>";
|
|
||||||
Rr = ":reply<Enter>";
|
|
||||||
Rq = ":reply -q<Enter>";
|
|
||||||
|
|
||||||
H = ":toggle-headers<Enter>";
|
|
||||||
"<C-k>" = ":prev-part<Enter>";
|
|
||||||
"<C-j>" = ":next-part<Enter>";
|
|
||||||
J = ":next <Enter>";
|
|
||||||
K = ":prev<Enter>";
|
|
||||||
};
|
|
||||||
|
|
||||||
"view::passthrough" = {
|
|
||||||
"$noinherit" = "true";
|
|
||||||
"$ex" = "<C-x>";
|
|
||||||
"<Esc>" = ":toggle-key-passthrough<Enter>";
|
|
||||||
};
|
|
||||||
|
|
||||||
compose = {
|
|
||||||
# Keybindings used when the embedded terminal is not selected in the compose
|
|
||||||
# view
|
|
||||||
"$noinherit" = "true";
|
|
||||||
"$ex" = "<C-x>";
|
|
||||||
"<C-k>" = ":prev-field<Enter>";
|
|
||||||
"<C-j>" = ":next-field<Enter>";
|
|
||||||
"<A-p>" = ":switch-account -p<Enter>";
|
|
||||||
"<A-n>" = ":switch-account -n<Enter>";
|
|
||||||
"<tab>" = ":next-field<Enter>";
|
|
||||||
"<C-p>" = ":prev-tab<Enter>";
|
|
||||||
"<C-n>" = ":next-tab<Enter>";
|
|
||||||
};
|
|
||||||
|
|
||||||
"compose::editor" = {
|
|
||||||
# Keybindings used when the embedded terminal is selected in the compose view
|
|
||||||
"$noinherit" = "true";
|
|
||||||
"$ex" = "<C-x>";
|
|
||||||
"<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>";
|
|
||||||
p = ":postpone<Enter>";
|
|
||||||
q = ":choose -o d discard abort -o p postpone postpone<Enter>";
|
|
||||||
e = ":edit<Enter>";
|
|
||||||
a = ":attach<space>";
|
|
||||||
d = ":detach<space>";
|
|
||||||
};
|
|
||||||
|
|
||||||
terminal = {
|
|
||||||
"$noinherit" = "true";
|
|
||||||
"$ex" = "<C-x>";
|
|
||||||
"<C-p>" = ":prev-tab<Enter>";
|
|
||||||
"<C-n>" = ":next-tab<Enter>";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
extraConfig = {
|
|
||||||
general = {
|
|
||||||
unsafe-accounts-conf = true;
|
|
||||||
# log-file = "~/.cache/aerc.log";
|
|
||||||
# log-level = "debug";
|
|
||||||
};
|
|
||||||
viewer = {
|
|
||||||
pager = "${pkgs.less}/bin/less -R";
|
|
||||||
};
|
|
||||||
filters = {
|
|
||||||
"text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
|
||||||
"text/calendar" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/libexec/aerc/filters/calendar";
|
|
||||||
"text/html" =
|
|
||||||
"${pkgs.aerc}/libexec/aerc/filters/html | ${pkgs.aerc}/libexec/aerc/filters/colorize"; # Requires w3m, dante
|
|
||||||
# "text/*" =
|
|
||||||
# ''${pkgs.bat}/bin/bat -fP --file-name="$AERC_FILENAME "'';
|
|
||||||
"message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
|
||||||
"message/rfc822" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
|
||||||
"application/x-sh" = "${pkgs.bat}/bin/bat -fP -l sh";
|
|
||||||
"application/pdf" = "${pkgs.zathura}/bin/zathura -";
|
|
||||||
"audio/*" = "${pkgs.mpv}/bin/mpv -";
|
|
||||||
"image/*" = "${pkgs.feh}/bin/feh -";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
accounts.email.accounts.home.aerc = {
|
|
||||||
enable = true;
|
|
||||||
extraAccounts = {
|
|
||||||
check-mail = "5m";
|
|
||||||
check-mail-cmd = "${pkgs.isync}/bin/mbsync -a";
|
|
||||||
check-mail-timeout = "15s";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
xdg.desktopEntries.aerc = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
|
|
||||||
name = "aerc";
|
|
||||||
exec = "${config.terminalLaunchCommand} aerc %u";
|
|
||||||
};
|
|
||||||
xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
|
|
||||||
"${config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier}+Shift+e" =
|
|
||||||
"exec ${
|
|
||||||
# Don't name the script `aerc` or it will affect grep
|
|
||||||
builtins.toString (
|
|
||||||
pkgs.writeShellScript "focus-mail.sh" ''
|
|
||||||
count=$(ps aux | grep -c aerc)
|
|
||||||
if [ "$count" -eq 1 ]; then
|
|
||||||
i3-msg "exec --no-startup-id ${config.terminal} start --class aerc -- aerc"
|
|
||||||
sleep 0.25
|
|
||||||
fi
|
|
||||||
i3-msg "[class=aerc] focus"
|
|
||||||
''
|
|
||||||
)
|
|
||||||
}";
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.fish.shellAbbrs = {
|
|
||||||
ae = "aerc";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,139 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
imports = [
|
|
||||||
./himalaya.nix
|
|
||||||
./aerc.nix
|
|
||||||
./system.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
options = {
|
|
||||||
mail.enable = lib.mkEnableOption "Mail service.";
|
|
||||||
mail.user = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = "User name for the email address.";
|
|
||||||
default = config.user;
|
|
||||||
};
|
|
||||||
mail.server = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
description = "Server name for the email address.";
|
|
||||||
};
|
|
||||||
mail.imapHost = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
description = "Server host for IMAP (reading mail).";
|
|
||||||
};
|
|
||||||
mail.smtpHost = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
description = "Server host for SMTP (sending mail).";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf config.mail.enable {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
programs.mbsync = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Automatically check for mail and keep files synced locally
|
|
||||||
services.mbsync = lib.mkIf pkgs.stdenv.isLinux {
|
|
||||||
enable = true;
|
|
||||||
frequency = "*:0/5";
|
|
||||||
postExec = "${pkgs.notmuch}/bin/notmuch new";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Used to watch for new mail and trigger sync
|
|
||||||
services.imapnotify.enable = pkgs.stdenv.isLinux;
|
|
||||||
|
|
||||||
# Allows sending email from CLI/sendmail
|
|
||||||
programs.msmtp.enable = true;
|
|
||||||
|
|
||||||
# Better local mail search
|
|
||||||
programs.notmuch = {
|
|
||||||
enable = true;
|
|
||||||
new.ignore = [
|
|
||||||
".mbsyncstate.lock"
|
|
||||||
".mbsyncstate.journal"
|
|
||||||
".mbsyncstate.new"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
accounts.email = {
|
|
||||||
|
|
||||||
# Where email files are stored
|
|
||||||
maildirBasePath = "${config.homePath}/mail";
|
|
||||||
|
|
||||||
accounts = {
|
|
||||||
home =
|
|
||||||
let
|
|
||||||
address = "${config.mail.user}@${config.mail.server}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
userName = address;
|
|
||||||
realName = config.fullName;
|
|
||||||
primary = true;
|
|
||||||
inherit address;
|
|
||||||
aliases = map (user: "${user}@${config.mail.server}") [
|
|
||||||
"me"
|
|
||||||
"hey"
|
|
||||||
"admin"
|
|
||||||
];
|
|
||||||
|
|
||||||
# Options for contact completion
|
|
||||||
alot = { };
|
|
||||||
|
|
||||||
imap = {
|
|
||||||
host = config.mail.imapHost;
|
|
||||||
port = 993;
|
|
||||||
tls.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Watch for mail and run notifications or sync
|
|
||||||
imapnotify = {
|
|
||||||
enable = true;
|
|
||||||
boxes = [ "Inbox" ];
|
|
||||||
onNotify = "${pkgs.isync}/bin/mbsync -a";
|
|
||||||
onNotifyPost =
|
|
||||||
lib.mkIf config.home-manager.users.${config.user}.services.dunst.enable
|
|
||||||
"${pkgs.libnotify}/bin/notify-send 'New mail arrived'";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Name of the directory in maildir for this account
|
|
||||||
maildir = {
|
|
||||||
path = "main";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Bi-directional syncing options for local files
|
|
||||||
mbsync = {
|
|
||||||
enable = true;
|
|
||||||
create = "both";
|
|
||||||
expunge = "both";
|
|
||||||
remove = "both";
|
|
||||||
patterns = [ "*" ];
|
|
||||||
extraConfig.channel = {
|
|
||||||
CopyArrivalDate = "yes"; # Sync time of original message
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Enable indexing
|
|
||||||
notmuch.enable = true;
|
|
||||||
|
|
||||||
# Used to login and send and receive emails
|
|
||||||
passwordCommand = "${pkgs.age}/bin/age --decrypt --identity ~/.ssh/id_ed25519 ${pkgs.writeText "mailpass.age" (builtins.readFile ../../../private/mailpass.age)}";
|
|
||||||
|
|
||||||
smtp = {
|
|
||||||
host = config.mail.smtpHost;
|
|
||||||
port = 465;
|
|
||||||
tls.enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
{ config, lib, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
options.mail.himalaya.enable = lib.mkEnableOption "Himalaya email.";
|
|
||||||
|
|
||||||
config = lib.mkIf config.mail.himalaya.enable {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
programs.himalaya = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
accounts.email.accounts.home.himalaya = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
downloads-dir = config.userDirs.download;
|
|
||||||
smtp-insecure = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.fish.shellAbbrs = {
|
|
||||||
hi = "himalaya";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf (config.mail.enable || config.server) {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
programs.msmtp.enable = true;
|
|
||||||
|
|
||||||
# The system user for sending automatic notifications
|
|
||||||
accounts.email.accounts.system =
|
|
||||||
let
|
|
||||||
address = "system@${config.mail.server}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
userName = address;
|
|
||||||
realName = "NixOS System";
|
|
||||||
primary = !config.mail.enable; # Only primary if mail not enabled
|
|
||||||
inherit address;
|
|
||||||
passwordCommand = "${pkgs.age}/bin/age --decrypt --identity ${config.identityFile} ${pkgs.writeText "mailpass-system.age" (builtins.readFile ../../../private/mailpass-system.age)}";
|
|
||||||
msmtp.enable = true;
|
|
||||||
smtp = {
|
|
||||||
host = config.mail.smtpHost;
|
|
||||||
port = 465;
|
|
||||||
tls.enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
{ config, lib, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
# Shell history sync
|
|
||||||
|
|
||||||
options.atuin.enable = lib.mkEnableOption "Atuin";
|
|
||||||
|
|
||||||
config = {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = lib.mkIf config.atuin.enable {
|
|
||||||
|
|
||||||
programs.atuin = {
|
|
||||||
enable = true;
|
|
||||||
flags = [
|
|
||||||
"--disable-up-arrow"
|
|
||||||
"--disable-ctrl-r"
|
|
||||||
];
|
|
||||||
settings = {
|
|
||||||
auto_sync = true;
|
|
||||||
update_check = false;
|
|
||||||
sync_address = "https://api.atuin.sh";
|
|
||||||
search_mode = "fuzzy";
|
|
||||||
filter_mode = "host"; # global, host, session, directory
|
|
||||||
search_mode_shell_up_key_binding = "fuzzy";
|
|
||||||
filter_mode_shell_up_key_binding = "session";
|
|
||||||
style = "compact"; # or auto,full
|
|
||||||
show_help = true;
|
|
||||||
history_filter = [ ];
|
|
||||||
secrets_filter = true;
|
|
||||||
enter_accept = false;
|
|
||||||
keymap_mode = "vim-normal";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Give root user the same setup
|
|
||||||
home-manager.users.root.programs.atuin = config.home-manager.users.${config.user}.programs.atuin;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
# Enables quickly entering Nix shells when changing directories
|
|
||||||
home-manager.users.${config.user}.programs.direnv = {
|
|
||||||
enable = true;
|
|
||||||
nix-direnv.enable = true;
|
|
||||||
config = {
|
|
||||||
whitelist = {
|
|
||||||
prefix = [ config.dotfilesPath ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# programs.direnv.direnvrcExtra = ''
|
|
||||||
# layout_postgres() {
|
|
||||||
# export PGDATA="$(direnv_layout_dir)/postgres"
|
|
||||||
# export PGHOST="$PGDATA"
|
|
||||||
#
|
|
||||||
# if [[ ! -d "PGDATA" ]]; then
|
|
||||||
# initdb
|
|
||||||
# cat >> "$PGDATA/postgres.conf" <<- EOF
|
|
||||||
# listen_addresses = '''
|
|
||||||
# unix_socket_directories = '$PGHOST'
|
|
||||||
# EOF
|
|
||||||
# echo "CREATE DATABASE $USER;" | postgres --single -E postgres
|
|
||||||
# fi
|
|
||||||
# }
|
|
||||||
# '';
|
|
||||||
|
|
||||||
# Prevent garbage collection
|
|
||||||
nix.extraOptions = ''
|
|
||||||
keep-outputs = true
|
|
||||||
keep-derivations = true
|
|
||||||
'';
|
|
||||||
}
|
|
@ -1,195 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
home-packages = config.home-manager.users.${config.user}.home.packages;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
gitName = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = "Name to use for git commits";
|
|
||||||
};
|
|
||||||
gitEmail = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = "Email to use for git commits";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
|
||||||
|
|
||||||
home-manager.users.root.programs.git = {
|
|
||||||
enable = true;
|
|
||||||
extraConfig.safe.directory = config.dotfilesPath;
|
|
||||||
};
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
programs.git = {
|
|
||||||
enable = true;
|
|
||||||
userName = config.gitName;
|
|
||||||
userEmail = config.gitEmail;
|
|
||||||
extraConfig = {
|
|
||||||
core.pager = "${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight | less -F";
|
|
||||||
interactive.difffilter = "${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight";
|
|
||||||
pager = {
|
|
||||||
branch = "false";
|
|
||||||
};
|
|
||||||
safe = {
|
|
||||||
directory = config.dotfilesPath;
|
|
||||||
};
|
|
||||||
pull = {
|
|
||||||
ff = "only";
|
|
||||||
};
|
|
||||||
push = {
|
|
||||||
autoSetupRemote = "true";
|
|
||||||
};
|
|
||||||
init = {
|
|
||||||
defaultBranch = "master";
|
|
||||||
};
|
|
||||||
rebase = {
|
|
||||||
autosquash = "true";
|
|
||||||
};
|
|
||||||
gpg = {
|
|
||||||
format = "ssh";
|
|
||||||
ssh.allowedSignersFile = "~/.config/git/allowed-signers";
|
|
||||||
};
|
|
||||||
# commit.gpgsign = true;
|
|
||||||
# tag.gpgsign = true;
|
|
||||||
};
|
|
||||||
ignores = [
|
|
||||||
".direnv/**"
|
|
||||||
"result"
|
|
||||||
];
|
|
||||||
includes = [
|
|
||||||
{
|
|
||||||
path = "~/.config/git/personal";
|
|
||||||
condition = "gitdir:~/dev/personal/";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Personal git config
|
|
||||||
# TODO: fix with variables
|
|
||||||
xdg.configFile."git/personal".text = ''
|
|
||||||
[user]
|
|
||||||
name = "${config.fullName}"
|
|
||||||
email = "7386960+nmasur@users.noreply.github.com"
|
|
||||||
signingkey = ~/.ssh/id_ed25519
|
|
||||||
[commit]
|
|
||||||
gpgsign = true
|
|
||||||
[tag]
|
|
||||||
gpgsign = true
|
|
||||||
'';
|
|
||||||
|
|
||||||
xdg.configFile."git/allowed-signers".text = ''
|
|
||||||
7386960+nmasur@users.noreply.github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s
|
|
||||||
'';
|
|
||||||
|
|
||||||
programs.fish.shellAbbrs = {
|
|
||||||
g = "git";
|
|
||||||
gs = "git status";
|
|
||||||
gd = "git diff";
|
|
||||||
gds = "git diff --staged";
|
|
||||||
gdp = "git diff HEAD^";
|
|
||||||
ga = "git add";
|
|
||||||
gaa = "git add -A";
|
|
||||||
gac = "git commit -am";
|
|
||||||
gc = "git commit -m";
|
|
||||||
gca = "git commit --amend --no-edit";
|
|
||||||
gcae = "git commit --amend";
|
|
||||||
gu = "git pull";
|
|
||||||
gp = "git push";
|
|
||||||
gl = "git log --graph --decorate --oneline -20";
|
|
||||||
gll = "git log --graph --decorate --oneline";
|
|
||||||
gco = "git checkout";
|
|
||||||
gcom = ''git switch (git symbolic-ref refs/remotes/origin/HEAD | cut -d"/" -f4)'';
|
|
||||||
gcob = "git switch -c";
|
|
||||||
gb = "git branch";
|
|
||||||
gpd = "git push origin -d";
|
|
||||||
gbd = "git branch -d";
|
|
||||||
gbD = "git branch -D";
|
|
||||||
gdd = {
|
|
||||||
position = "anywhere";
|
|
||||||
setCursor = true;
|
|
||||||
expansion = "BRANCH=% git push origin -d $BRANCH and git branch -d $BRANCH";
|
|
||||||
};
|
|
||||||
gr = "git reset";
|
|
||||||
grh = "git reset --hard";
|
|
||||||
gm = "git merge";
|
|
||||||
gcp = "git cherry-pick";
|
|
||||||
cdg = "cd (git rev-parse --show-toplevel)";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Required for fish commands
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
fish
|
|
||||||
fzf
|
|
||||||
bat
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.fish.functions =
|
|
||||||
lib.mkIf (builtins.elem pkgs.fzf home-packages && builtins.elem pkgs.bat home-packages)
|
|
||||||
{
|
|
||||||
git = {
|
|
||||||
body = builtins.readFile ./fish/functions/git.fish;
|
|
||||||
};
|
|
||||||
git-add-fuzzy = {
|
|
||||||
body = builtins.readFile ./fish/functions/git-add-fuzzy.fish;
|
|
||||||
};
|
|
||||||
git-fuzzy-branch = {
|
|
||||||
argumentNames = "header";
|
|
||||||
body = builtins.readFile ./fish/functions/git-fuzzy-branch.fish;
|
|
||||||
};
|
|
||||||
git-checkout-fuzzy = {
|
|
||||||
body = ''
|
|
||||||
set branch (git-fuzzy-branch "checkout branch...")
|
|
||||||
and git checkout $branch
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
git-delete-fuzzy = {
|
|
||||||
body = ''
|
|
||||||
set branch (git-fuzzy-branch "delete branch...")
|
|
||||||
and git branch -d $branch
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
git-force-delete-fuzzy = {
|
|
||||||
body = ''
|
|
||||||
set branch (git-fuzzy-branch "force delete branch...")
|
|
||||||
and git branch -D $branch
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
git-delete-both = {
|
|
||||||
argumentNames = "branch";
|
|
||||||
body = ''
|
|
||||||
git push origin -d $branch
|
|
||||||
git branch -d $branch
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
git-merge-fuzzy = {
|
|
||||||
body = ''
|
|
||||||
set branch (git-fuzzy-branch "merge from...")
|
|
||||||
and git merge $branch
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
git-show-fuzzy = {
|
|
||||||
body = builtins.readFile ./fish/functions/git-show-fuzzy.fish;
|
|
||||||
};
|
|
||||||
git-commits = {
|
|
||||||
body = builtins.readFile ./fish/functions/git-commits.fish;
|
|
||||||
};
|
|
||||||
git-history = {
|
|
||||||
body = builtins.readFile ./fish/functions/git-history.fish;
|
|
||||||
};
|
|
||||||
uncommitted = {
|
|
||||||
description = "Find uncommitted git repos";
|
|
||||||
body = builtins.readFile ./fish/functions/uncommitted.fish;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = {
|
|
||||||
|
|
||||||
home-manager.users.${config.user}.programs.jujutsu = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
# https://github.com/martinvonz/jj/blob/main/docs/config.md
|
|
||||||
settings = {
|
|
||||||
user = {
|
|
||||||
name = config.home-manager.users.${config.user}.programs.git.userName;
|
|
||||||
email = config.home-manager.users.${config.user}.programs.git.userEmail;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{ pkgs, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = {
|
|
||||||
|
|
||||||
# MacOS-specific settings for Fish
|
|
||||||
programs.fish.useBabelfish = true;
|
|
||||||
programs.fish.babelfishPackage = pkgs.babelfish;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
# Hammerspoon - MacOS custom automation scripting
|
|
||||||
|
|
||||||
config = lib.mkIf pkgs.stdenv.isDarwin {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
xdg.configFile."hammerspoon/init.lua".source = ./hammerspoon/init.lua;
|
|
||||||
xdg.configFile."hammerspoon/Spoons/ControlEscape.spoon".source = ./hammerspoon/Spoons/ControlEscape.spoon;
|
|
||||||
xdg.configFile."hammerspoon/Spoons/DismissAlerts.spoon".source = ./hammerspoon/Spoons/DismissAlerts.spoon;
|
|
||||||
xdg.configFile."hammerspoon/Spoons/Launcher.spoon/init.lua".source = pkgs.substituteAll {
|
|
||||||
src = ./hammerspoon/Spoons/Launcher.spoon/init.lua;
|
|
||||||
firefox = "${pkgs.firefox-bin}/Applications/Firefox.app";
|
|
||||||
discord = "${pkgs.discord}/Applications/Discord.app";
|
|
||||||
wezterm = "${pkgs.wezterm}/Applications/WezTerm.app";
|
|
||||||
obsidian = "${pkgs.obsidian}/Applications/Obsidian.app";
|
|
||||||
slack = "${pkgs.slack}/Applications/Slack.app";
|
|
||||||
};
|
|
||||||
xdg.configFile."hammerspoon/Spoons/MoveWindow.spoon".source = ./hammerspoon/Spoons/MoveWindow.spoon;
|
|
||||||
|
|
||||||
home.activation.reloadHammerspoon =
|
|
||||||
config.home-manager.users.${config.user}.lib.dag.entryAfter [ "writeBoundary" ]
|
|
||||||
''
|
|
||||||
$DRY_RUN_CMD /Applications/Hammerspoon.app/Contents/Frameworks/hs/hs -c "hs.reload()"
|
|
||||||
$DRY_RUN_CMD sleep 1
|
|
||||||
$DRY_RUN_CMD /Applications/Hammerspoon.app/Contents/Frameworks/hs/hs -c "hs.console.clearConsole()"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
homebrew.casks = [ "hammerspoon" ];
|
|
||||||
|
|
||||||
system.activationScripts.postUserActivation.text = ''
|
|
||||||
defaults write org.hammerspoon.Hammerspoon MJConfigFile "${config.homePath}/.config/hammerspoon/init.lua"
|
|
||||||
sudo killall Dock
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
# config = lib.mkIf pkgs.stdenv.isDarwin {
|
|
||||||
# networking = {
|
|
||||||
# computerName = config.networking.hostName;
|
|
||||||
# # Adjust if necessary
|
|
||||||
# # hostName = "";
|
|
||||||
# };
|
|
||||||
# };
|
|
||||||
# }
|
|
||||||
}
|
|
@ -1,222 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
terminal = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
description = "Path to executable for terminal emulator program.";
|
|
||||||
default = null;
|
|
||||||
};
|
|
||||||
terminalLaunchCommand = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
description = "Command for using the terminal to launch a new window with a program.";
|
|
||||||
default = null;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf pkgs.stdenv.isDarwin {
|
|
||||||
|
|
||||||
services.nix-daemon.enable = true;
|
|
||||||
|
|
||||||
# This setting only applies to Darwin, different on NixOS
|
|
||||||
nix.gc.interval = {
|
|
||||||
Hour = 12;
|
|
||||||
Minute = 15;
|
|
||||||
Day = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.shells = [ pkgs.fish ];
|
|
||||||
|
|
||||||
security.pam.enableSudoTouchIdAuth = true;
|
|
||||||
|
|
||||||
system = {
|
|
||||||
|
|
||||||
stateVersion = 5;
|
|
||||||
|
|
||||||
keyboard = {
|
|
||||||
remapCapsLockToControl = true;
|
|
||||||
enableKeyMapping = true; # Allows for skhd
|
|
||||||
};
|
|
||||||
|
|
||||||
defaults = {
|
|
||||||
NSGlobalDomain = {
|
|
||||||
|
|
||||||
# Set to dark mode
|
|
||||||
AppleInterfaceStyle = "Dark";
|
|
||||||
|
|
||||||
# Don't change from dark to light automatically
|
|
||||||
# AppleInterfaceSwitchesAutomatically = false;
|
|
||||||
|
|
||||||
# Enable full keyboard access for all controls (e.g. enable Tab in modal dialogs)
|
|
||||||
AppleKeyboardUIMode = 3;
|
|
||||||
|
|
||||||
# Only hide menu bar in fullscreen
|
|
||||||
_HIHideMenuBar = false;
|
|
||||||
|
|
||||||
# Expand save panel by default
|
|
||||||
NSNavPanelExpandedStateForSaveMode = true;
|
|
||||||
|
|
||||||
# Expand print panel by default
|
|
||||||
PMPrintingExpandedStateForPrint = true;
|
|
||||||
|
|
||||||
# Replace press-and-hold with key repeat
|
|
||||||
ApplePressAndHoldEnabled = false;
|
|
||||||
|
|
||||||
# Set a fast key repeat rate
|
|
||||||
KeyRepeat = 2;
|
|
||||||
|
|
||||||
# Shorten delay before key repeat begins
|
|
||||||
InitialKeyRepeat = 12;
|
|
||||||
|
|
||||||
# Save to local disk by default, not iCloud
|
|
||||||
NSDocumentSaveNewDocumentsToCloud = false;
|
|
||||||
|
|
||||||
# Disable autocorrect capitalization
|
|
||||||
NSAutomaticCapitalizationEnabled = false;
|
|
||||||
|
|
||||||
# Disable autocorrect smart dashes
|
|
||||||
NSAutomaticDashSubstitutionEnabled = false;
|
|
||||||
|
|
||||||
# Disable autocorrect adding periods
|
|
||||||
NSAutomaticPeriodSubstitutionEnabled = false;
|
|
||||||
|
|
||||||
# Disable autocorrect smart quotation marks
|
|
||||||
NSAutomaticQuoteSubstitutionEnabled = false;
|
|
||||||
|
|
||||||
# Disable autocorrect spellcheck
|
|
||||||
NSAutomaticSpellingCorrectionEnabled = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
dock = {
|
|
||||||
# Automatically show and hide the dock
|
|
||||||
autohide = true;
|
|
||||||
|
|
||||||
# Add translucency in dock for hidden applications
|
|
||||||
showhidden = true;
|
|
||||||
|
|
||||||
# Enable spring loading on all dock items
|
|
||||||
enable-spring-load-actions-on-all-items = true;
|
|
||||||
|
|
||||||
# Highlight hover effect in dock stack grid view
|
|
||||||
mouse-over-hilite-stack = true;
|
|
||||||
|
|
||||||
mineffect = "genie";
|
|
||||||
orientation = "bottom";
|
|
||||||
show-recents = false;
|
|
||||||
tilesize = 44;
|
|
||||||
|
|
||||||
persistent-apps = [
|
|
||||||
"/Applications/1Password.app"
|
|
||||||
"${pkgs.slack}/Applications/Slack.app"
|
|
||||||
"/System/Applications/Calendar.app"
|
|
||||||
"${pkgs.firefox-bin}/Applications/Firefox.app"
|
|
||||||
"/System/Applications/Messages.app"
|
|
||||||
"/System/Applications/Mail.app"
|
|
||||||
"/Applications/zoom.us.app"
|
|
||||||
"${pkgs.discord}/Applications/Discord.app"
|
|
||||||
"${pkgs.obsidian}/Applications/Obsidian.app"
|
|
||||||
"${pkgs.wezterm}/Applications/WezTerm.app"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
finder = {
|
|
||||||
|
|
||||||
# Default Finder window set to column view
|
|
||||||
FXPreferredViewStyle = "clmv";
|
|
||||||
|
|
||||||
# Finder search in current folder by default
|
|
||||||
FXDefaultSearchScope = "SCcf";
|
|
||||||
|
|
||||||
# Disable warning when changing file extension
|
|
||||||
FXEnableExtensionChangeWarning = false;
|
|
||||||
|
|
||||||
# Allow quitting of Finder application
|
|
||||||
QuitMenuItem = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Disable "Are you sure you want to open" dialog
|
|
||||||
LaunchServices.LSQuarantine = false;
|
|
||||||
|
|
||||||
# Disable trackpad tap to click
|
|
||||||
trackpad.Clicking = false;
|
|
||||||
|
|
||||||
# Where to save screenshots
|
|
||||||
screencapture.location = "~/Downloads";
|
|
||||||
|
|
||||||
# Show seconds on the clock
|
|
||||||
menuExtraClock.ShowSeconds = true;
|
|
||||||
|
|
||||||
CustomUserPreferences = {
|
|
||||||
# Disable disk image verification
|
|
||||||
"com.apple.frameworks.diskimages" = {
|
|
||||||
skip-verify = true;
|
|
||||||
skip-verify-locked = true;
|
|
||||||
skip-verify-remote = true;
|
|
||||||
};
|
|
||||||
# Avoid creating .DS_Store files on network or USB volumes
|
|
||||||
"com.apple.desktopservices" = {
|
|
||||||
DSDontWriteNetworkStores = true;
|
|
||||||
DSDontWriteUSBStores = true;
|
|
||||||
};
|
|
||||||
"com.apple.dock" = {
|
|
||||||
magnification = true;
|
|
||||||
largesize = 48;
|
|
||||||
};
|
|
||||||
# Require password immediately after screen saver begins
|
|
||||||
"com.apple.screensaver" = {
|
|
||||||
askForPassword = 1;
|
|
||||||
askForPasswordDelay = 0;
|
|
||||||
};
|
|
||||||
"com.apple.finder" = {
|
|
||||||
# Disable the warning before emptying the Trash
|
|
||||||
WarnOnEmptyTrash = false;
|
|
||||||
|
|
||||||
# Finder search in current folder by default
|
|
||||||
FXDefaultSearchScope = "SCcf";
|
|
||||||
|
|
||||||
# Default Finder window set to column view
|
|
||||||
FXPreferredViewStyle = "clmv";
|
|
||||||
};
|
|
||||||
"leits.MeetingBar" = {
|
|
||||||
eventTimeFormat = ''"show"'';
|
|
||||||
eventTitleFormat = ''"none"'';
|
|
||||||
eventTitleIconFormat = ''"iconCalendar"'';
|
|
||||||
slackBrowser = ''{"deletable":true,"arguments":"","name":"Slack","path":""}'';
|
|
||||||
zoomBrowser = ''{"deletable":true,"arguments":"","name":"Zoom","path":""}'';
|
|
||||||
teamsBrowser = ''{"deletable":true,"arguments":"","name":"Teams","path":""}'';
|
|
||||||
KeyboardShortcuts_joinEventShortcut = ''{"carbonModifiers":6400,"carbonKeyCode":38}'';
|
|
||||||
timeFormat = ''"12-hour"'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
CustomSystemPreferences = {
|
|
||||||
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Settings that don't have an option in nix-darwin
|
|
||||||
activationScripts.postActivation.text = ''
|
|
||||||
echo "Allow apps from anywhere"
|
|
||||||
SPCTL=$(spctl --status)
|
|
||||||
if ! [ "$SPCTL" = "assessments disabled" ]; then
|
|
||||||
sudo spctl --master-disable
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
# User-level settings
|
|
||||||
activationScripts.postUserActivation.text = ''
|
|
||||||
echo "Show the ~/Library folder"
|
|
||||||
chflags nohidden ~/Library
|
|
||||||
|
|
||||||
echo "Reduce Menu Bar padding"
|
|
||||||
defaults write -globalDomain NSStatusItemSelectionPadding -int 6
|
|
||||||
defaults write -globalDomain NSStatusItemSpacing -int 6
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -60,13 +60,5 @@
|
|||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
programs.fish.shellAbbrs = {
|
|
||||||
# Add noti for ghpr in Darwin
|
|
||||||
ghpr = lib.mkForce "gh pr create && sleep 3 && noti gh run watch";
|
|
||||||
grw = lib.mkForce "noti gh run watch";
|
|
||||||
|
|
||||||
# Shortcut to edit hosts file
|
|
||||||
hosts = "sudo nvim /etc/hosts";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
calendar = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable calendar.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.calendar.enable) {
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
accounts.calendar.accounts.default = {
|
|
||||||
basePath = "other/calendars"; # Where to save calendars in ~ directory
|
|
||||||
name = "personal";
|
|
||||||
local.type = "filesystem";
|
|
||||||
primary = true;
|
|
||||||
remote = {
|
|
||||||
passwordCommand = [ "" ];
|
|
||||||
type = "caldav";
|
|
||||||
url = "https://${config.hostnames.content}/remote.php/dav/principals/users/${config.user}";
|
|
||||||
userName = config.user;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
home.packages = with pkgs; [ gnome-calendar ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
calibre = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable Calibre.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gui.enable && config.calibre.enable) {
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
home.packages = with pkgs; [ calibre ];
|
|
||||||
# home.sessionVariables = { CALIBRE_USE_DARK_PALETTE = 1; };
|
|
||||||
};
|
|
||||||
|
|
||||||
# Forces Calibre to use dark mode
|
|
||||||
environment.sessionVariables = {
|
|
||||||
CALIBRE_USE_DARK_PALETTE = "1";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
{ ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
imports = [
|
|
||||||
./calendar.nix
|
|
||||||
./calibre.nix
|
|
||||||
./nautilus.nix
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
nautilus = {
|
|
||||||
enable = lib.mkEnableOption {
|
|
||||||
description = "Enable Nautilus file manager.";
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Install Nautilus file manager
|
|
||||||
config = lib.mkIf (config.gui.enable && config.nautilus.enable) {
|
|
||||||
|
|
||||||
# Quick preview with spacebar
|
|
||||||
services.gnome.sushi.enable = true;
|
|
||||||
environment.systemPackages = [ pkgs.nautilus ];
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
# Quick button for launching nautilus
|
|
||||||
xsession.windowManager.i3.config.keybindings = {
|
|
||||||
"${
|
|
||||||
config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
|
|
||||||
}+n" = "exec --no-startup-id ${pkgs.nautilus}/bin/nautilus";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Generates a QR code and previews it with sushi
|
|
||||||
programs.fish.functions = {
|
|
||||||
qr = {
|
|
||||||
body = "${pkgs.qrencode}/bin/qrencode $argv[1] -o /tmp/qr.png | ${pkgs.sushi}/bin/sushi /tmp/qr.png";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Set Nautilus as default for opening directories
|
|
||||||
xdg.mimeApps = {
|
|
||||||
associations.added."inode/directory" = [ "org.gnome.Nautilus.desktop" ];
|
|
||||||
defaultApplications."inode/directory" = lib.mkBefore [ "org.gnome.Nautilus.desktop" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Delete Trash files older than 1 week
|
|
||||||
systemd.user.services.empty-trash = {
|
|
||||||
description = "Empty Trash on a regular basis";
|
|
||||||
wantedBy = [ "default.target" ];
|
|
||||||
script = "${pkgs.trash-cli}/bin/trash-empty 7";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options.gaming.chiaki.enable = lib.mkEnableOption "Chiaki PlayStation remote play client.";
|
|
||||||
|
|
||||||
config = lib.mkIf config.gaming.chiaki.enable {
|
|
||||||
environment.systemPackages = with pkgs; [ chiaki ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
imports = [
|
|
||||||
./chiaki.nix
|
|
||||||
./dwarf-fortress.nix
|
|
||||||
./legendary.nix
|
|
||||||
./lutris.nix
|
|
||||||
./minecraft-server.nix
|
|
||||||
./moonlight.nix
|
|
||||||
./ryujinx.nix
|
|
||||||
./steam.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
options.gaming.enable = lib.mkEnableOption "Enable gaming features.";
|
|
||||||
|
|
||||||
config = lib.mkIf (config.gaming.enable && pkgs.stdenv.isLinux) {
|
|
||||||
hardware.graphics = {
|
|
||||||
enable = true;
|
|
||||||
enable32Bit = true;
|
|
||||||
};
|
|
||||||
programs.gamemode.enable = true;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options.gaming.moonlight.enable = lib.mkEnableOption "Enable Moonlight game streaming client.";
|
|
||||||
|
|
||||||
config = lib.mkIf config.gaming.moonlight.enable {
|
|
||||||
environment.systemPackages = with pkgs; [ moonlight-qt ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
options.gui.dmenu.enable = lib.mkEnableOption "dmenu launcher.";
|
|
||||||
|
|
||||||
config = lib.mkIf (config.services.xserver.enable && config.dmenu.enable) {
|
|
||||||
|
|
||||||
home-manager.users.${config.user}.home.packages = [ pkgs.dmenu ];
|
|
||||||
gui.launcherCommand = "${pkgs.dmenu}/bin/dmenu_run";
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
config = {
|
|
||||||
|
|
||||||
home-manager.users.${config.user}.services.dunst = {
|
|
||||||
enable = false;
|
|
||||||
settings = {
|
|
||||||
global = {
|
|
||||||
width = 300;
|
|
||||||
height = 200;
|
|
||||||
offset = "30x50";
|
|
||||||
origin = "top-right";
|
|
||||||
transparency = 0;
|
|
||||||
padding = 20;
|
|
||||||
horizontal_padding = 20;
|
|
||||||
frame_color = config.theme.colors.base03;
|
|
||||||
};
|
|
||||||
|
|
||||||
urgency_normal = {
|
|
||||||
background = config.theme.colors.base00;
|
|
||||||
foreground = config.theme.colors.base05;
|
|
||||||
timeout = 10;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
gtk.theme = {
|
|
||||||
name = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = "Theme name for GTK applications";
|
|
||||||
};
|
|
||||||
package = lib.mkOption {
|
|
||||||
type = lib.types.package;
|
|
||||||
description = "Theme package for GTK applications";
|
|
||||||
default = pkgs.gnome-themes-extra;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf config.gui.enable {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
gtk =
|
|
||||||
let
|
|
||||||
gtkExtraConfig = {
|
|
||||||
gtk-application-prefer-dark-theme = config.theme.dark;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
enable = true;
|
|
||||||
theme = {
|
|
||||||
name = config.gtk.theme.name;
|
|
||||||
package = config.gtk.theme.package;
|
|
||||||
};
|
|
||||||
gtk3.extraConfig = gtkExtraConfig;
|
|
||||||
gtk4.extraConfig = gtkExtraConfig;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Required for setting GTK theme (for preferred-color-scheme in browser)
|
|
||||||
services.dbus.packages = [ pkgs.dconf ];
|
|
||||||
programs.dconf.enable = true;
|
|
||||||
|
|
||||||
# Make the login screen dark
|
|
||||||
services.xserver.displayManager.lightdm.greeters.gtk.theme = {
|
|
||||||
name = config.gtk.theme.name;
|
|
||||||
package = config.gtk.theme.package;
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.sessionVariables = {
|
|
||||||
GTK_THEME = config.gtk.theme.name;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,300 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
|
|
||||||
lockCmd = "${pkgs.betterlockscreen}/bin/betterlockscreen --lock --display 1 --blur 0.5 --span";
|
|
||||||
lockUpdate = "${pkgs.betterlockscreen}/bin/betterlockscreen --update ${config.wallpaper} --display 1 --span";
|
|
||||||
terminal = "wezterm";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf pkgs.stdenv.isLinux {
|
|
||||||
|
|
||||||
services.xserver.windowManager = {
|
|
||||||
i3 = {
|
|
||||||
enable = config.services.xserver.enable;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
feh # Wallpaper
|
|
||||||
playerctl # Media control
|
|
||||||
];
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
xsession.windowManager.i3 = {
|
|
||||||
enable = config.services.xserver.enable;
|
|
||||||
config =
|
|
||||||
let
|
|
||||||
modifier = "Mod4"; # Super key
|
|
||||||
ws1 = "1:I";
|
|
||||||
ws2 = "2:II";
|
|
||||||
ws3 = "3:III";
|
|
||||||
ws4 = "4:IV";
|
|
||||||
ws5 = "5:V";
|
|
||||||
ws6 = "6:VI";
|
|
||||||
ws7 = "7:VII";
|
|
||||||
ws8 = "8:VIII";
|
|
||||||
ws9 = "9:IX";
|
|
||||||
ws10 = "10:X";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
modifier = modifier;
|
|
||||||
assigns = {
|
|
||||||
"${ws1}" = [ { class = "Firefox"; } ];
|
|
||||||
"${ws2}" = [
|
|
||||||
{ class = "aerc"; }
|
|
||||||
{ class = "kitty"; }
|
|
||||||
{ class = "obsidian"; }
|
|
||||||
{ class = "wezterm"; }
|
|
||||||
];
|
|
||||||
"${ws3}" = [ { class = "discord"; } ];
|
|
||||||
"${ws4}" = [
|
|
||||||
{ class = "steam"; }
|
|
||||||
{ class = "Steam"; }
|
|
||||||
];
|
|
||||||
};
|
|
||||||
bars = [ { command = "echo"; } ]; # Disable i3bar
|
|
||||||
colors =
|
|
||||||
let
|
|
||||||
background = config.theme.colors.base00;
|
|
||||||
inactiveBackground = config.theme.colors.base01;
|
|
||||||
border = config.theme.colors.base01;
|
|
||||||
inactiveBorder = config.theme.colors.base01;
|
|
||||||
text = config.theme.colors.base07;
|
|
||||||
inactiveText = config.theme.colors.base04;
|
|
||||||
urgentBackground = config.theme.colors.base08;
|
|
||||||
indicator = "#00000000";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
background = config.theme.colors.base00;
|
|
||||||
focused = {
|
|
||||||
inherit
|
|
||||||
background
|
|
||||||
indicator
|
|
||||||
text
|
|
||||||
border
|
|
||||||
;
|
|
||||||
childBorder = background;
|
|
||||||
};
|
|
||||||
focusedInactive = {
|
|
||||||
inherit indicator;
|
|
||||||
background = inactiveBackground;
|
|
||||||
border = inactiveBorder;
|
|
||||||
childBorder = inactiveBackground;
|
|
||||||
text = inactiveText;
|
|
||||||
};
|
|
||||||
# placeholder = { };
|
|
||||||
unfocused = {
|
|
||||||
inherit indicator;
|
|
||||||
background = inactiveBackground;
|
|
||||||
border = inactiveBorder;
|
|
||||||
childBorder = inactiveBackground;
|
|
||||||
text = inactiveText;
|
|
||||||
};
|
|
||||||
urgent = {
|
|
||||||
inherit text indicator;
|
|
||||||
background = urgentBackground;
|
|
||||||
border = urgentBackground;
|
|
||||||
childBorder = urgentBackground;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
floating.modifier = modifier;
|
|
||||||
focus = {
|
|
||||||
mouseWarping = true;
|
|
||||||
newWindow = "urgent";
|
|
||||||
followMouse = false;
|
|
||||||
};
|
|
||||||
keybindings = {
|
|
||||||
|
|
||||||
# Adjust screen brightness
|
|
||||||
"Shift+F12" =
|
|
||||||
# Disable dynamic sleep
|
|
||||||
# https://github.com/rockowitz/ddcutil/issues/323
|
|
||||||
"exec ${pkgs.ddcutil}/bin/ddcutil --display 1 setvcp 10 + 30 && sleep 1; exec ${pkgs.ddcutil}/bin/ddcutil --disable-dynamic-sleep --display 2 setvcp 10 + 30";
|
|
||||||
"Shift+F11" = "exec ${pkgs.ddcutil}/bin/ddcutil --display 1 setvcp 10 - 30 && sleep 1; exec ${pkgs.ddcutil}/bin/ddcutil --disable-dynamic-sleep --display 2 setvcp 10 - 30";
|
|
||||||
"XF86MonBrightnessUp" = "exec ${pkgs.ddcutil}/bin/ddcutil --display 1 setvcp 10 + 30 && sleep 1; exec ${pkgs.ddcutil}/bin/ddcutil --disable-dynamic-sleep --display 2 setvcp 10 + 30";
|
|
||||||
"XF86MonBrightnessDown" = "exec ${pkgs.ddcutil}/bin/ddcutil --display 1 setvcp 10 - 30 && sleep 1; exec ${pkgs.ddcutil}/bin/ddcutil --disable-dynamic-sleep --display 2 setvcp 10 - 30";
|
|
||||||
|
|
||||||
# Media player controls
|
|
||||||
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
|
|
||||||
"XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl stop";
|
|
||||||
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
|
|
||||||
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
|
|
||||||
|
|
||||||
# Launchers
|
|
||||||
"${modifier}+Return" = "exec --no-startup-id ${
|
|
||||||
config.home-manager.users.${config.user}.programs.rofi.terminal
|
|
||||||
}; workspace ${ws2}; layout tabbed";
|
|
||||||
"${modifier}+space" = "exec --no-startup-id ${config.launcherCommand}";
|
|
||||||
"${modifier}+Shift+s" = "exec --no-startup-id ${config.systemdSearch}";
|
|
||||||
"${modifier}+Shift+a" = "exec --no-startup-id ${config.audioSwitchCommand}";
|
|
||||||
"Mod1+Tab" = "exec --no-startup-id ${config.altTabCommand}";
|
|
||||||
"${modifier}+Shift+period" = "exec --no-startup-id ${config.powerCommand}";
|
|
||||||
"${modifier}+Shift+m" = "exec --no-startup-id ${config.brightnessCommand}";
|
|
||||||
"${modifier}+c" = "exec --no-startup-id ${config.calculatorCommand}";
|
|
||||||
"${modifier}+Shift+c" = "reload";
|
|
||||||
"${modifier}+Shift+r" = "restart";
|
|
||||||
"${modifier}+Shift+q" = ''exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"'';
|
|
||||||
"${modifier}+Shift+x" = "exec ${lockCmd}";
|
|
||||||
"${modifier}+Mod1+h" = "exec --no-startup-id ${
|
|
||||||
config.home-manager.users.${config.user}.programs.rofi.terminal
|
|
||||||
} -e sh -c '${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#${config.networking.hostName} || read'";
|
|
||||||
"${modifier}+Mod1+r" = "exec --no-startup-id ${
|
|
||||||
config.home-manager.users.${config.user}.programs.rofi.terminal
|
|
||||||
} -e sh -c 'doas nixos-rebuild switch --flake ${config.dotfilesPath}#${config.networking.hostName} || read'";
|
|
||||||
|
|
||||||
# Window options
|
|
||||||
"${modifier}+q" = "kill";
|
|
||||||
"${modifier}+b" = "exec ${config.toggleBarCommand}";
|
|
||||||
"${modifier}+f" = "fullscreen toggle";
|
|
||||||
"${modifier}+h" = "focus left";
|
|
||||||
"${modifier}+j" = "focus down";
|
|
||||||
"${modifier}+k" = "focus up";
|
|
||||||
"${modifier}+l" = "focus right";
|
|
||||||
"${modifier}+Left" = "focus left";
|
|
||||||
"${modifier}+Down" = "focus down";
|
|
||||||
"${modifier}+Up" = "focus up";
|
|
||||||
"${modifier}+Right" = "focus right";
|
|
||||||
"${modifier}+Shift+h" = "move left";
|
|
||||||
"${modifier}+Shift+j" = "move down";
|
|
||||||
"${modifier}+Shift+k" = "move up";
|
|
||||||
"${modifier}+Shift+l" = "move right";
|
|
||||||
"${modifier}+Shift+Left" = "move left";
|
|
||||||
"${modifier}+Shift+Down" = "move down";
|
|
||||||
"${modifier}+Shift+Up" = "move up";
|
|
||||||
"${modifier}+Shift+Right" = "move right";
|
|
||||||
|
|
||||||
# Tiling
|
|
||||||
"${modifier}+i" = "split h";
|
|
||||||
"${modifier}+v" = "split v";
|
|
||||||
"${modifier}+s" = "layout stacking";
|
|
||||||
"${modifier}+t" = "layout tabbed";
|
|
||||||
"${modifier}+e" = "layout toggle split";
|
|
||||||
"${modifier}+Shift+space" = "floating toggle";
|
|
||||||
"${modifier}+Control+space" = "focus mode_toggle";
|
|
||||||
"${modifier}+a" = "focus parent";
|
|
||||||
|
|
||||||
# Workspaces
|
|
||||||
"${modifier}+1" = "workspace ${ws1}";
|
|
||||||
"${modifier}+2" = "workspace ${ws2}";
|
|
||||||
"${modifier}+3" = "workspace ${ws3}";
|
|
||||||
"${modifier}+4" = "workspace ${ws4}";
|
|
||||||
"${modifier}+5" = "workspace ${ws5}";
|
|
||||||
"${modifier}+6" = "workspace ${ws6}";
|
|
||||||
"${modifier}+7" = "workspace ${ws7}";
|
|
||||||
"${modifier}+8" = "workspace ${ws8}";
|
|
||||||
"${modifier}+9" = "workspace ${ws9}";
|
|
||||||
"${modifier}+0" = "workspace ${ws10}";
|
|
||||||
|
|
||||||
# Move windows
|
|
||||||
"${modifier}+Shift+1" = "move container to workspace ${ws1}; workspace ${ws1}";
|
|
||||||
"${modifier}+Shift+2" = "move container to workspace ${ws2}; workspace ${ws2}";
|
|
||||||
"${modifier}+Shift+3" = "move container to workspace ${ws3}; workspace ${ws3}";
|
|
||||||
"${modifier}+Shift+4" = "move container to workspace ${ws4}; workspace ${ws4}";
|
|
||||||
"${modifier}+Shift+5" = "move container to workspace ${ws5}; workspace ${ws5}";
|
|
||||||
"${modifier}+Shift+6" = "move container to workspace ${ws6}; workspace ${ws6}";
|
|
||||||
"${modifier}+Shift+7" = "move container to workspace ${ws7}; workspace ${ws7}";
|
|
||||||
"${modifier}+Shift+8" = "move container to workspace ${ws8}; workspace ${ws8}";
|
|
||||||
"${modifier}+Shift+9" = "move container to workspace ${ws9}; workspace ${ws9}";
|
|
||||||
"${modifier}+Shift+0" = "move container to workspace ${ws10}; workspace ${ws10}";
|
|
||||||
|
|
||||||
# Move screens
|
|
||||||
"${modifier}+Control+l" = "move workspace to output right";
|
|
||||||
"${modifier}+Control+h" = "move workspace to output left";
|
|
||||||
|
|
||||||
# Resizing
|
|
||||||
"${modifier}+r" = ''mode "resize"'';
|
|
||||||
"${modifier}+Control+Shift+h" = "resize shrink width 10 px or 10 ppt";
|
|
||||||
"${modifier}+Control+Shift+j" = "resize grow height 10 px or 10 ppt";
|
|
||||||
"${modifier}+Control+Shift+k" = "resize shrink height 10 px or 10 ppt";
|
|
||||||
"${modifier}+Control+Shift+l" = "resize grow width 10 px or 10 ppt";
|
|
||||||
};
|
|
||||||
modes = { };
|
|
||||||
startup = [
|
|
||||||
{
|
|
||||||
command = "feh --bg-fill ${config.wallpaper}";
|
|
||||||
always = true;
|
|
||||||
notification = false;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
command = "i3-msg workspace ${ws2}, move workspace to output right";
|
|
||||||
notification = false;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
command = "i3-msg workspace ${ws1}, move workspace to output left";
|
|
||||||
notification = false;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
window = {
|
|
||||||
border = 0;
|
|
||||||
hideEdgeBorders = "smart";
|
|
||||||
titlebar = false;
|
|
||||||
};
|
|
||||||
workspaceAutoBackAndForth = false;
|
|
||||||
workspaceOutputAssign = [ ];
|
|
||||||
# gaps = {
|
|
||||||
# bottom = 8;
|
|
||||||
# top = 8;
|
|
||||||
# left = 8;
|
|
||||||
# right = 8;
|
|
||||||
# horizontal = 15;
|
|
||||||
# vertical = 15;
|
|
||||||
# inner = 15;
|
|
||||||
# outer = 0;
|
|
||||||
# smartBorders = "off";
|
|
||||||
# smartGaps = false;
|
|
||||||
# };
|
|
||||||
};
|
|
||||||
extraConfig = "";
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.fish.functions = {
|
|
||||||
update-lock-screen = lib.mkIf config.services.xserver.enable {
|
|
||||||
description = "Update lockscreen with wallpaper";
|
|
||||||
body = lockUpdate;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Update lock screen cache only if cache is empty
|
|
||||||
home.activation.updateLockScreenCache =
|
|
||||||
let
|
|
||||||
cacheDir = "${config.homePath}/.cache/betterlockscreen/current";
|
|
||||||
in
|
|
||||||
lib.mkIf config.services.xserver.enable (
|
|
||||||
config.home-manager.users.${config.user}.lib.dag.entryAfter [ "writeBoundary" ] ''
|
|
||||||
if [ ! -d ${cacheDir} ] || [ -z "$(ls ${cacheDir})" ]; then
|
|
||||||
$DRY_RUN_CMD ${lockUpdate}
|
|
||||||
fi
|
|
||||||
''
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
# Ref: https://github.com/betterlockscreen/betterlockscreen/blob/next/system/betterlockscreen%40.service
|
|
||||||
systemd.services.lock = {
|
|
||||||
enable = config.services.xserver.enable;
|
|
||||||
description = "Lock the screen on resume from suspend";
|
|
||||||
before = [
|
|
||||||
"sleep.target"
|
|
||||||
"suspend.target"
|
|
||||||
];
|
|
||||||
serviceConfig = {
|
|
||||||
User = config.user;
|
|
||||||
Type = "simple";
|
|
||||||
Environment = "DISPLAY=:0";
|
|
||||||
TimeoutSec = "infinity";
|
|
||||||
ExecStart = lockCmd;
|
|
||||||
ExecStartPost = "${pkgs.coreutils-full}/bin/sleep 1";
|
|
||||||
};
|
|
||||||
wantedBy = [
|
|
||||||
"sleep.target"
|
|
||||||
"suspend.target"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf (pkgs.stdenv.isLinux && config.services.xserver.enable) {
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
services.picom = {
|
|
||||||
enable = true;
|
|
||||||
backend = "glx";
|
|
||||||
settings = {
|
|
||||||
blur = false;
|
|
||||||
blurExclude = [ ];
|
|
||||||
inactiveDim = "0.05";
|
|
||||||
noDNDShadow = false;
|
|
||||||
noDockShadow = false;
|
|
||||||
# shadow-radius = 20
|
|
||||||
# '';
|
|
||||||
# shadow-radius = 20
|
|
||||||
# corner-radius = 10
|
|
||||||
# blur-size = 20
|
|
||||||
# rounded-corners-exclude = [
|
|
||||||
# "window_type = 'dock'",
|
|
||||||
# "class_g = 'i3-frame'"
|
|
||||||
# ]
|
|
||||||
# '';
|
|
||||||
};
|
|
||||||
fade = false;
|
|
||||||
inactiveOpacity = 1.0;
|
|
||||||
menuOpacity = 1.0;
|
|
||||||
opacityRules = [
|
|
||||||
"0:_NET_WM_STATE@[0]:32a = '_NET_WM_STATE_HIDDEN'" # Hide tabbed windows
|
|
||||||
];
|
|
||||||
shadow = false;
|
|
||||||
shadowExclude = [ ];
|
|
||||||
shadowOffsets = [
|
|
||||||
(-10)
|
|
||||||
(-10)
|
|
||||||
];
|
|
||||||
shadowOpacity = 0.5;
|
|
||||||
vSync = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
xsession.windowManager.i3.config.startup = [
|
|
||||||
{
|
|
||||||
command = "systemctl --user restart picom";
|
|
||||||
always = true;
|
|
||||||
notification = false;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,235 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf (pkgs.stdenv.isLinux && config.services.xserver.enable) {
|
|
||||||
|
|
||||||
toggleBarCommand = "polybar-msg cmd toggle";
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
services.polybar = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.polybar.override {
|
|
||||||
pulseSupport = true;
|
|
||||||
githubSupport = true;
|
|
||||||
i3Support = true;
|
|
||||||
};
|
|
||||||
script = "polybar &";
|
|
||||||
config = {
|
|
||||||
"bar/main" = {
|
|
||||||
bottom = false;
|
|
||||||
width = "100%";
|
|
||||||
height = "22pt";
|
|
||||||
radius = 0;
|
|
||||||
# offset-y = -5;
|
|
||||||
# offset-y = "5%";
|
|
||||||
# dpi = 96;
|
|
||||||
background = config.theme.colors.base01;
|
|
||||||
foreground = config.theme.colors.base05;
|
|
||||||
line-size = "3pt";
|
|
||||||
border-top-size = 0;
|
|
||||||
border-right-size = 0;
|
|
||||||
border-left-size = 0;
|
|
||||||
border-bottom-size = "4pt";
|
|
||||||
border-color = config.theme.colors.base00;
|
|
||||||
padding-left = 2;
|
|
||||||
padding-right = 2;
|
|
||||||
module-margin = 1;
|
|
||||||
modules-left = "i3";
|
|
||||||
modules-center = "xwindow";
|
|
||||||
modules-right = "mailcount network pulseaudio date power";
|
|
||||||
cursor-click = "pointer";
|
|
||||||
cursor-scroll = "ns-resize";
|
|
||||||
enable-ipc = true;
|
|
||||||
tray-position = "right";
|
|
||||||
# wm-restack = "generic";
|
|
||||||
# wm-restack = "bspwm";
|
|
||||||
# wm-restack = "i3";
|
|
||||||
# override-redirect = true;
|
|
||||||
};
|
|
||||||
"module/i3" =
|
|
||||||
let
|
|
||||||
padding = 2;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
type = "internal/i3";
|
|
||||||
pin-workspaces = false;
|
|
||||||
show-urgent = true;
|
|
||||||
strip-wsnumbers = true;
|
|
||||||
index-sort = true;
|
|
||||||
enable-click = true;
|
|
||||||
wrapping-scroll = true;
|
|
||||||
fuzzy-match = true;
|
|
||||||
format = "<label-state> <label-mode>";
|
|
||||||
label-focused = "%name%";
|
|
||||||
label-focused-foreground = config.theme.colors.base01;
|
|
||||||
label-focused-background = config.theme.colors.base05;
|
|
||||||
label-focused-underline = config.theme.colors.base03;
|
|
||||||
label-focused-padding = padding;
|
|
||||||
label-unfocused = "%name%";
|
|
||||||
label-unfocused-padding = padding;
|
|
||||||
label-visible = "%name%";
|
|
||||||
label-visible-underline = config.theme.colors.base01;
|
|
||||||
label-visible-padding = padding;
|
|
||||||
label-urgent = "%name%";
|
|
||||||
label-urgent-foreground = config.theme.colors.base00;
|
|
||||||
label-urgent-background = config.theme.colors.base08;
|
|
||||||
label-urgent-underline = config.theme.colors.base0F;
|
|
||||||
label-urgent-padding = padding;
|
|
||||||
};
|
|
||||||
"module/xworkspaces" = {
|
|
||||||
type = "internal/xworkspaces";
|
|
||||||
label-active = "%name%";
|
|
||||||
label-active-background = config.theme.colors.base05;
|
|
||||||
label-active-foreground = config.theme.colors.base01;
|
|
||||||
label-active-underline = config.theme.colors.base03;
|
|
||||||
label-active-padding = 1;
|
|
||||||
label-occupied = "%name%";
|
|
||||||
label-occupied-padding = 1;
|
|
||||||
label-urgent = "%name%";
|
|
||||||
label-urgent-background = config.theme.colors.base08;
|
|
||||||
label-urgent-padding = 1;
|
|
||||||
label-empty = "%name%";
|
|
||||||
label-empty-foreground = config.theme.colors.base06;
|
|
||||||
label-empty-padding = 1;
|
|
||||||
};
|
|
||||||
"module/xwindow" = {
|
|
||||||
type = "internal/xwindow";
|
|
||||||
label = "%title:0:60:...%";
|
|
||||||
};
|
|
||||||
# "module/filesystem" = {
|
|
||||||
# type = "internal/fs";
|
|
||||||
# interval = 25;
|
|
||||||
# mount-0 = "/";
|
|
||||||
# label-mounted = "%{F#F0C674}%mountpoint%%{F-} %percentage_used%%";
|
|
||||||
# label-unmounted = "%mountpoint% not mounted";
|
|
||||||
# label-unmounted-foreground = colors.disabled;
|
|
||||||
# };
|
|
||||||
"module/mailcount" = {
|
|
||||||
type = "custom/script";
|
|
||||||
interval = 10;
|
|
||||||
format = "<label>";
|
|
||||||
exec = builtins.toString (
|
|
||||||
pkgs.writeShellScript "mailcount.sh" ''
|
|
||||||
${pkgs.notmuch}/bin/notmuch new --quiet 2>&1>/dev/null
|
|
||||||
UNREAD=$(
|
|
||||||
${pkgs.notmuch}/bin/notmuch count \
|
|
||||||
is:inbox and \
|
|
||||||
is:unread and \
|
|
||||||
folder:main/Inbox \
|
|
||||||
2>/dev/null
|
|
||||||
)
|
|
||||||
if [ $UNREAD = "0" ]; then
|
|
||||||
echo ""
|
|
||||||
else
|
|
||||||
echo "%{T2}%{T-} $UNREAD "
|
|
||||||
fi
|
|
||||||
''
|
|
||||||
);
|
|
||||||
click-left = "i3-msg 'exec --no-startup-id kitty --class aerc aerc'; sleep 0.15; i3-msg '[class=aerc] focus'";
|
|
||||||
};
|
|
||||||
"module/network" = {
|
|
||||||
type = "internal/network";
|
|
||||||
interface-type = "wired";
|
|
||||||
interval = 3;
|
|
||||||
accumulate-stats = true;
|
|
||||||
format-connected = "<label-connected>";
|
|
||||||
format-disconnected = "<label-disconnected>";
|
|
||||||
label-connected = "";
|
|
||||||
label-disconnected = "";
|
|
||||||
};
|
|
||||||
"module/pulseaudio" = {
|
|
||||||
type = "internal/pulseaudio";
|
|
||||||
# format-volume-prefix = "VOL ";
|
|
||||||
# format-volume-prefix-foreground = colors.primary;
|
|
||||||
format-volume = "<ramp-volume> <label-volume>";
|
|
||||||
# format-volume-background = colors.background;
|
|
||||||
# label-volume-background = colors.background;
|
|
||||||
format-volume-foreground = config.theme.colors.base04;
|
|
||||||
label-volume = "%percentage%%";
|
|
||||||
label-muted = " ---";
|
|
||||||
label-muted-foreground = config.theme.colors.base03;
|
|
||||||
ramp-volume-0 = "";
|
|
||||||
ramp-volume-1 = "";
|
|
||||||
ramp-volume-2 = "";
|
|
||||||
click-right = config.audioSwitchCommand;
|
|
||||||
};
|
|
||||||
# "module/xkeyboard" = {
|
|
||||||
# type = "internal/xkeyboard";
|
|
||||||
# blacklist-0 = "num lock";
|
|
||||||
# label-layout = "%layout%";
|
|
||||||
# label-layout-foreground = colors.primary;
|
|
||||||
# label-indicator-padding = 2;
|
|
||||||
# label-indicator-margin = 1;
|
|
||||||
# label-indicator-foreground = colors.background;
|
|
||||||
# label-indicator-background = colors.secondary;
|
|
||||||
# };
|
|
||||||
# "module/memory" = {
|
|
||||||
# type = "internal/memory";
|
|
||||||
# interval = 2;
|
|
||||||
# format-prefix = "RAM ";
|
|
||||||
# format-prefix-foreground = colors.primary;
|
|
||||||
# label = "%percentage_used:2%%";
|
|
||||||
# };
|
|
||||||
# "module/cpu" = {
|
|
||||||
# type = "internal/cpu";
|
|
||||||
# interval = 2;
|
|
||||||
# format-prefix = "CPU ";
|
|
||||||
# format-prefix-foreground = colors.primary;
|
|
||||||
# label = "%percentage:2%%";
|
|
||||||
# };
|
|
||||||
# "network-base" = {
|
|
||||||
# type = "internal/network";
|
|
||||||
# interval = 5;
|
|
||||||
# format-connected = "<label-connected>";
|
|
||||||
# format-disconnected = "<label-disconnected>";
|
|
||||||
# label-disconnected = "%{F#F0C674}%ifname%%{F#707880} disconnected";
|
|
||||||
# };
|
|
||||||
# "module/wlan" = {
|
|
||||||
# "inherit" = "network-base";
|
|
||||||
# interface-type = "wireless";
|
|
||||||
# label-connected = "%{F#F0C674}%ifname%%{F-} %essid% %local_ip%";
|
|
||||||
# };
|
|
||||||
# "module/eth" = {
|
|
||||||
# "inherit" = "network-base";
|
|
||||||
# interface-type = "wired";
|
|
||||||
# label-connected = "%{F#F0C674}%ifname%%{F-} %local_ip%";
|
|
||||||
# };
|
|
||||||
"module/date" = {
|
|
||||||
type = "internal/date";
|
|
||||||
interval = 1;
|
|
||||||
date = "%d %b %l:%M %p";
|
|
||||||
date-alt = "%Y-%m-%d %H:%M:%S";
|
|
||||||
label = "%date%";
|
|
||||||
label-foreground = config.theme.colors.base06;
|
|
||||||
# format-background = colors.background;
|
|
||||||
};
|
|
||||||
"module/power" = {
|
|
||||||
type = "custom/text";
|
|
||||||
content = " ";
|
|
||||||
click-left = config.powerCommand;
|
|
||||||
click-right = "polybar-msg cmd restart";
|
|
||||||
content-foreground = config.theme.colors.base04;
|
|
||||||
};
|
|
||||||
"settings" = {
|
|
||||||
screenchange-reload = true;
|
|
||||||
pseudo-transparency = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
xsession.windowManager.i3.config.startup = [
|
|
||||||
{
|
|
||||||
command = "pkill polybar; polybar -r main";
|
|
||||||
always = true;
|
|
||||||
notification = false;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -18,165 +18,6 @@ in
|
|||||||
|
|
||||||
config = lib.mkIf (pkgs.stdenv.isLinux && config.services.xserver.enable) {
|
config = lib.mkIf (pkgs.stdenv.isLinux && config.services.xserver.enable) {
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
jq # Required for rofi-systemd
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.rofi = {
|
|
||||||
enable = true;
|
|
||||||
cycle = true;
|
|
||||||
location = "center";
|
|
||||||
pass = { };
|
|
||||||
terminal = lib.mkIf pkgs.stdenv.isLinux config.terminal;
|
|
||||||
plugins = [
|
|
||||||
pkgs.rofi-calc
|
|
||||||
pkgs.rofi-emoji
|
|
||||||
pkgs.rofi-systemd
|
|
||||||
];
|
|
||||||
theme =
|
|
||||||
let
|
|
||||||
inherit (config.home-manager.users.${config.user}.lib.formats.rasi) mkLiteral;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
|
|
||||||
# Inspired by https://github.com/sherubthakur/dotfiles/blob/master/users/modules/desktop-environment/rofi/launcher.rasi
|
|
||||||
|
|
||||||
"*" = {
|
|
||||||
background-color = mkLiteral config.theme.colors.base00;
|
|
||||||
foreground-color = mkLiteral config.theme.colors.base07;
|
|
||||||
text-color = mkLiteral config.theme.colors.base07;
|
|
||||||
border-color = mkLiteral config.theme.colors.base04;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Holds the entire window
|
|
||||||
"#window" = {
|
|
||||||
transparency = "real";
|
|
||||||
background-color = mkLiteral config.theme.colors.base00;
|
|
||||||
text-color = mkLiteral config.theme.colors.base07;
|
|
||||||
border = mkLiteral "4px";
|
|
||||||
border-color = mkLiteral config.theme.colors.base04;
|
|
||||||
border-radius = mkLiteral "4px";
|
|
||||||
width = mkLiteral "850px";
|
|
||||||
padding = mkLiteral "15px";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Wrapper around bar and results
|
|
||||||
"#mainbox" = {
|
|
||||||
background-color = mkLiteral config.theme.colors.base00;
|
|
||||||
border = mkLiteral "0px";
|
|
||||||
border-radius = mkLiteral "0px";
|
|
||||||
border-color = mkLiteral config.theme.colors.base04;
|
|
||||||
children = map mkLiteral [
|
|
||||||
"inputbar"
|
|
||||||
"message"
|
|
||||||
"listview"
|
|
||||||
];
|
|
||||||
spacing = mkLiteral "10px";
|
|
||||||
padding = mkLiteral "10px";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Unknown
|
|
||||||
"#textbox-prompt-colon" = {
|
|
||||||
expand = false;
|
|
||||||
str = ":";
|
|
||||||
margin = mkLiteral "0px 0.3em 0em 0em";
|
|
||||||
text-color = mkLiteral config.theme.colors.base07;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Command prompt left of the input
|
|
||||||
"#prompt" = {
|
|
||||||
enabled = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Actual text box
|
|
||||||
"#entry" = {
|
|
||||||
placeholder-color = mkLiteral config.theme.colors.base03;
|
|
||||||
expand = true;
|
|
||||||
horizontal-align = "0";
|
|
||||||
placeholder = "";
|
|
||||||
padding = mkLiteral "0px 0px 0px 5px";
|
|
||||||
blink = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Top bar
|
|
||||||
"#inputbar" = {
|
|
||||||
children = map mkLiteral [
|
|
||||||
"prompt"
|
|
||||||
"entry"
|
|
||||||
];
|
|
||||||
border = mkLiteral "1px";
|
|
||||||
border-radius = mkLiteral "4px";
|
|
||||||
padding = mkLiteral "6px";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Results
|
|
||||||
"#listview" = {
|
|
||||||
background-color = mkLiteral config.theme.colors.base00;
|
|
||||||
padding = mkLiteral "0px";
|
|
||||||
columns = 1;
|
|
||||||
lines = 12;
|
|
||||||
spacing = "5px";
|
|
||||||
cycle = true;
|
|
||||||
dynamic = true;
|
|
||||||
layout = "vertical";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Each result
|
|
||||||
"#element" = {
|
|
||||||
orientation = "vertical";
|
|
||||||
border-radius = mkLiteral "0px";
|
|
||||||
padding = mkLiteral "5px 0px 5px 5px";
|
|
||||||
};
|
|
||||||
"#element.selected" = {
|
|
||||||
border = mkLiteral "1px";
|
|
||||||
border-radius = mkLiteral "4px";
|
|
||||||
border-color = mkLiteral config.theme.colors.base07;
|
|
||||||
background-color = mkLiteral config.theme.colors.base04;
|
|
||||||
text-color = mkLiteral config.theme.colors.base00;
|
|
||||||
};
|
|
||||||
|
|
||||||
"#element-text" = {
|
|
||||||
expand = true;
|
|
||||||
# horizontal-align = mkLiteral "0.5";
|
|
||||||
vertical-align = mkLiteral "0.5";
|
|
||||||
margin = mkLiteral "0px 2.5px 0px 2.5px";
|
|
||||||
};
|
|
||||||
"#element-text.selected" = {
|
|
||||||
background-color = mkLiteral config.theme.colors.base04;
|
|
||||||
text-color = mkLiteral config.theme.colors.base00;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Not sure how to get icons
|
|
||||||
"#element-icon" = {
|
|
||||||
size = mkLiteral "18px";
|
|
||||||
border = mkLiteral "0px";
|
|
||||||
padding = mkLiteral "2px 5px 2px 2px";
|
|
||||||
background-color = mkLiteral config.theme.colors.base00;
|
|
||||||
};
|
|
||||||
"#element-icon.selected" = {
|
|
||||||
background-color = mkLiteral config.theme.colors.base04;
|
|
||||||
text-color = mkLiteral config.theme.colors.base00;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
xoffset = 0;
|
|
||||||
yoffset = -20;
|
|
||||||
extraConfig = {
|
|
||||||
show-icons = true;
|
|
||||||
kb-cancel = "Escape,Super+space";
|
|
||||||
modi = "window,run,ssh,emoji,calc,systemd";
|
|
||||||
sort = true;
|
|
||||||
# levenshtein-sort = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
home.file.".local/share/rofi/themes" = {
|
|
||||||
recursive = true;
|
|
||||||
source = ./rofi/themes;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
launcherCommand = ''${rofi}/bin/rofi -modes drun -show drun -theme-str '@import "launcher.rasi"' '';
|
launcherCommand = ''${rofi}/bin/rofi -modes drun -show drun -theme-str '@import "launcher.rasi"' '';
|
||||||
systemdSearch = "${pkgs.rofi-systemd}/bin/rofi-systemd";
|
systemdSearch = "${pkgs.rofi-systemd}/bin/rofi-systemd";
|
||||||
altTabCommand = "${rofi}/bin/rofi -show window -modi window";
|
altTabCommand = "${rofi}/bin/rofi -show window -modi window";
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf config.gui.enable {
|
|
||||||
|
|
||||||
# Enable touchpad support
|
|
||||||
services.libinput.enable = true;
|
|
||||||
|
|
||||||
# Enable the X11 windowing system.
|
|
||||||
services.xserver = {
|
|
||||||
enable = config.gui.enable;
|
|
||||||
|
|
||||||
# Login screen
|
|
||||||
displayManager = {
|
|
||||||
lightdm = {
|
|
||||||
enable = config.services.xserver.enable;
|
|
||||||
background = config.wallpaper;
|
|
||||||
|
|
||||||
# Show default user
|
|
||||||
# Also make sure /var/lib/AccountsService/users/<user> has SystemAccount=false
|
|
||||||
extraSeatDefaults = ''
|
|
||||||
greeter-hide-users = false
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
xclip # Clipboard
|
|
||||||
];
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
programs.fish.shellAliases = {
|
|
||||||
pbcopy = "xclip -selection clipboard -in";
|
|
||||||
pbpaste = "xclip -selection clipboard -out";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,82 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
|
|
||||||
# These micro-scripts change the volume while also triggering the volume
|
|
||||||
# notification widget
|
|
||||||
|
|
||||||
increaseVolume = pkgs.writeShellScriptBin "increaseVolume" ''
|
|
||||||
${pkgs.pamixer}/bin/pamixer -i 2
|
|
||||||
volume=$(${pkgs.pamixer}/bin/pamixer --get-volume)
|
|
||||||
${pkgs.volnoti}/bin/volnoti-show $volume
|
|
||||||
'';
|
|
||||||
|
|
||||||
decreaseVolume = pkgs.writeShellScriptBin "decreaseVolume" ''
|
|
||||||
${pkgs.pamixer}/bin/pamixer -d 2
|
|
||||||
volume=$(${pkgs.pamixer}/bin/pamixer --get-volume)
|
|
||||||
${pkgs.volnoti}/bin/volnoti-show $volume
|
|
||||||
'';
|
|
||||||
|
|
||||||
toggleMute = pkgs.writeShellScriptBin "toggleMute" ''
|
|
||||||
${pkgs.pamixer}/bin/pamixer --toggle-mute
|
|
||||||
mute=$(${pkgs.pamixer}/bin/pamixer --get-mute)
|
|
||||||
if [ "$mute" == "true" ]; then
|
|
||||||
${pkgs.volnoti}/bin/volnoti-show --mute
|
|
||||||
else
|
|
||||||
volume=$(${pkgs.pamixer}/bin/pamixer --get-volume)
|
|
||||||
${pkgs.volnoti}/bin/volnoti-show $volume
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
|
|
||||||
# Enable PipeWire
|
|
||||||
services.pipewire = {
|
|
||||||
enable = true;
|
|
||||||
pulse.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Provides audio source with background noise filtered
|
|
||||||
programs.noisetorch.enable = true;
|
|
||||||
|
|
||||||
# These aren't necessary, but helpful for the user
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
pamixer # Audio control
|
|
||||||
volnoti # Volume notifications
|
|
||||||
];
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
|
||||||
# Graphical volume notifications
|
|
||||||
services.volnoti.enable = true;
|
|
||||||
|
|
||||||
xsession.windowManager.i3.config = {
|
|
||||||
|
|
||||||
# Make sure that Volnoti actually starts (home-manager doesn't start
|
|
||||||
# user daemon's automatically)
|
|
||||||
startup = [
|
|
||||||
{
|
|
||||||
command = "systemctl --user restart volnoti --alpha 0.15 --radius 40 --timeout 0.2";
|
|
||||||
always = true;
|
|
||||||
notification = false;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
# i3 keybinds for changing the volume
|
|
||||||
keybindings = {
|
|
||||||
"XF86AudioRaiseVolume" = "exec --no-startup-id ${increaseVolume}/bin/increaseVolume";
|
|
||||||
"XF86AudioLowerVolume" = "exec --no-startup-id ${decreaseVolume}/bin/decreaseVolume";
|
|
||||||
"XF86AudioMute" = "exec --no-startup-id ${toggleMute}/bin/toggleMute";
|
|
||||||
# We can mute the mic by adding "--default-source"
|
|
||||||
"XF86AudioMicMute" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer --default-source --toggle-mute";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
boot.loader = lib.mkIf (config.physical && !config.server) {
|
|
||||||
grub = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
# Not sure what this does, but it involves the UEFI/BIOS
|
|
||||||
efiSupport = true;
|
|
||||||
|
|
||||||
# Check for other OSes and make them available
|
|
||||||
useOSProber = true;
|
|
||||||
|
|
||||||
# Attempt to display GRUB on widescreen monitor
|
|
||||||
gfxmodeEfi = "1920x1080";
|
|
||||||
|
|
||||||
# Limit the total number of configurations to rollback
|
|
||||||
configurationLimit = 25;
|
|
||||||
|
|
||||||
# Install GRUB onto the boot disk
|
|
||||||
# device = config.fileSystems."/boot".device;
|
|
||||||
|
|
||||||
# Don't install GRUB, required for UEFI?
|
|
||||||
device = "nodev";
|
|
||||||
|
|
||||||
# Display menu indefinitely if holding shift key
|
|
||||||
extraConfig = ''
|
|
||||||
if keystatus --shift ; then
|
|
||||||
set timeout=-1
|
|
||||||
else
|
|
||||||
set timeout=3
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Always display menu indefinitely; default is 5 seconds
|
|
||||||
# timeout = null;
|
|
||||||
|
|
||||||
# Allows GRUB to interact with the UEFI/BIOS I guess
|
|
||||||
efi.canTouchEfiVariables = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Allow reading from Windows drives
|
|
||||||
boot.supportedFilesystems = lib.mkIf config.physical [ "ntfs" ];
|
|
||||||
|
|
||||||
# Use latest released Linux kernel by default
|
|
||||||
boot.kernelPackages = lib.mkDefault pkgs.linuxPackages_latest;
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
{ lib, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
imports = [
|
|
||||||
./audio.nix
|
|
||||||
./boot.nix
|
|
||||||
./disk.nix
|
|
||||||
./keyboard.nix
|
|
||||||
./monitors.nix
|
|
||||||
./mouse.nix
|
|
||||||
./networking.nix
|
|
||||||
./server.nix
|
|
||||||
./sleep.nix
|
|
||||||
./wifi.nix
|
|
||||||
./zfs.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
options = {
|
|
||||||
physical = lib.mkEnableOption "Whether this machine is a physical device.";
|
|
||||||
server = lib.mkEnableOption "Whether this machine is a server.";
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
{ config, lib, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
# Enable fstrim, which tracks free space on SSDs for garbage collection
|
|
||||||
# More info: https://www.reddit.com/r/NixOS/comments/rbzhb1/if_you_have_a_ssd_dont_forget_to_enable_fstrim/
|
|
||||||
services.fstrim.enable = lib.mkIf config.physical true;
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
modulesPath,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
# options.iso.enable = lib.mkEnableOption "Enable creating as an ISO.";
|
|
||||||
#
|
|
||||||
# imports = [ "${toString modulesPath}/installer/cd-dvd/iso-image.nix" ];
|
|
||||||
|
|
||||||
# config = lib.mkIf config.iso.enable {
|
|
||||||
#
|
|
||||||
# # EFI booting
|
|
||||||
# isoImage.makeEfiBootable = true;
|
|
||||||
#
|
|
||||||
# # USB booting
|
|
||||||
# isoImage.makeUsbBootable = true;
|
|
||||||
#
|
|
||||||
# };
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf config.gui.enable {
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
ddcutil # Monitor brightness control
|
|
||||||
];
|
|
||||||
|
|
||||||
# Reduce blue light at night
|
|
||||||
services.redshift = {
|
|
||||||
enable = true;
|
|
||||||
brightness = {
|
|
||||||
day = "1.0";
|
|
||||||
night = "1.0";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Detect monitors (brightness) for ddcutil
|
|
||||||
hardware.i2c.enable = true;
|
|
||||||
|
|
||||||
# Grant main user access to external monitors
|
|
||||||
users.users.${config.user}.extraGroups = [ "i2c" ];
|
|
||||||
|
|
||||||
services.xserver.displayManager = {
|
|
||||||
|
|
||||||
# Put the login screen on the left monitor
|
|
||||||
lightdm.greeters.gtk.extraConfig = ''
|
|
||||||
active-monitor=0
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Set up screen position and rotation
|
|
||||||
setupCommands = ''
|
|
||||||
${pkgs.xorg.xrandr}/bin/xrandr --output DisplayPort-1 \
|
|
||||||
--primary \
|
|
||||||
--rotate normal \
|
|
||||||
--mode 2560x1440 \
|
|
||||||
--rate 165 \
|
|
||||||
--output DisplayPort-2 \
|
|
||||||
--right-of DisplayPort-1 \
|
|
||||||
--rotate left \
|
|
||||||
--output DVI-0 --off \
|
|
||||||
--output DVI-1 --off \
|
|
||||||
|| echo "xrandr failed"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf config.gui.enable {
|
|
||||||
|
|
||||||
# Mouse customization
|
|
||||||
services.ratbagd.enable = true;
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
libratbag # Mouse adjustments
|
|
||||||
piper # Mouse adjustments GUI
|
|
||||||
];
|
|
||||||
|
|
||||||
services.libinput.mouse = {
|
|
||||||
# Disable mouse acceleration
|
|
||||||
accelProfile = "flat";
|
|
||||||
accelSpeed = "1.15";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Cursor
|
|
||||||
home-manager.users.${config.user}.home.pointerCursor = {
|
|
||||||
name = "Adwaita";
|
|
||||||
package = pkgs.adwaita-icon-theme;
|
|
||||||
size = 24;
|
|
||||||
gtk.enable = true;
|
|
||||||
x11.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{ config, lib, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf config.server {
|
|
||||||
|
|
||||||
# Servers need a bootloader or they won't start
|
|
||||||
boot.loader.systemd-boot.enable = true;
|
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf (config.physical && pkgs.stdenv.isLinux) {
|
|
||||||
|
|
||||||
# Enables wireless support via wpa_supplicant.
|
|
||||||
networking.wireless.enable = !config.networking.networkmanager.enable;
|
|
||||||
|
|
||||||
# Allows the user to control the WiFi settings.
|
|
||||||
networking.wireless.userControlled.enable = true;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
{ config, lib, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf config.services.audiobookshelf.enable {
|
|
||||||
|
|
||||||
services.audiobookshelf = {
|
|
||||||
group = "shared";
|
|
||||||
dataDir = "audiobookshelf";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Allow web traffic to Caddy
|
|
||||||
caddy.routes = [
|
|
||||||
{
|
|
||||||
match = [ { host = [ config.hostnames.audiobooks ]; } ];
|
|
||||||
handle = [
|
|
||||||
{
|
|
||||||
handler = "reverse_proxy";
|
|
||||||
upstreams = [ { dial = "localhost:${builtins.toString config.services.audiobookshelf.port}"; } ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
# Configure Cloudflare DNS to point to this machine
|
|
||||||
services.cloudflare-dyndns.domains = [ config.hostnames.audiobooks ];
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -153,39 +153,5 @@ in
|
|||||||
requires = [ "cloudflare-api-secret.service" ];
|
requires = [ "cloudflare-api-secret.service" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
# Run a second copy of dyn-dns for non-proxied domains
|
|
||||||
# Adapted from: https://github.com/NixOS/nixpkgs/blob/nixos-unstable/nixos/modules/services/networking/cloudflare-dyndns.nix
|
|
||||||
systemd.services.cloudflare-dyndns-noproxy =
|
|
||||||
lib.mkIf ((builtins.length config.cloudflare.noProxyDomains) > 0)
|
|
||||||
{
|
|
||||||
description = "CloudFlare Dynamic DNS Client (no proxy)";
|
|
||||||
after = [
|
|
||||||
"network.target"
|
|
||||||
"cloudflare-api-secret.service"
|
|
||||||
];
|
|
||||||
requires = [ "cloudflare-api-secret.service" ];
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
|
||||||
startAt = "*:0/5";
|
|
||||||
|
|
||||||
environment = {
|
|
||||||
CLOUDFLARE_DOMAINS = toString config.cloudflare.noProxyDomains;
|
|
||||||
};
|
|
||||||
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "simple";
|
|
||||||
DynamicUser = true;
|
|
||||||
StateDirectory = "cloudflare-dyndns-noproxy";
|
|
||||||
EnvironmentFile = config.services.cloudflare-dyndns.apiTokenFile;
|
|
||||||
ExecStart =
|
|
||||||
let
|
|
||||||
args =
|
|
||||||
[ "--cache-file /var/lib/cloudflare-dyndns-noproxy/ip.cache" ]
|
|
||||||
++ (if config.services.cloudflare-dyndns.ipv4 then [ "-4" ] else [ "-no-4" ])
|
|
||||||
++ (if config.services.cloudflare-dyndns.ipv6 then [ "-6" ] else [ "-no-6" ])
|
|
||||||
++ lib.optional config.services.cloudflare-dyndns.deleteMissing "--delete-missing";
|
|
||||||
in
|
|
||||||
"${pkgs.cloudflare-dyndns}/bin/cloudflare-dyndns ${toString args}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
# Wait for secret to be placed on the machine
|
|
||||||
systemd.services.wait-for-identity = {
|
|
||||||
description = "Wait until identity file exists on the machine";
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "oneshot";
|
|
||||||
RemainAfterExit = true;
|
|
||||||
};
|
|
||||||
script = ''
|
|
||||||
for i in $(seq 1 10); do
|
|
||||||
if [ -f ${config.identityFile} ]; then
|
|
||||||
echo "Identity file found."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
sleep 6
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
# Keybase is an encrypted communications tool with a synchronized encrypted
|
|
||||||
# filestore that can be mounted onto a machine's filesystem.
|
|
||||||
|
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options.keybase.enable = lib.mkEnableOption "Keybase.";
|
|
||||||
|
|
||||||
config = lib.mkIf config.keybase.enable {
|
|
||||||
|
|
||||||
home-manager.users.${config.user} = lib.mkIf config.keybase.enable {
|
|
||||||
|
|
||||||
services.keybase.enable = true;
|
|
||||||
services.kbfs = {
|
|
||||||
enable = true;
|
|
||||||
mountPoint = "keybase";
|
|
||||||
};
|
|
||||||
|
|
||||||
# https://github.com/nix-community/home-manager/issues/4722
|
|
||||||
systemd.user.services.kbfs.Service.PrivateTmp = lib.mkForce false;
|
|
||||||
|
|
||||||
home.packages = [ (lib.mkIf config.gui.enable pkgs.keybase-gui) ];
|
|
||||||
home.file =
|
|
||||||
let
|
|
||||||
ignorePatterns = ''
|
|
||||||
keybase/
|
|
||||||
kbfs/'';
|
|
||||||
in
|
|
||||||
{
|
|
||||||
".rgignore".text = ignorePatterns;
|
|
||||||
".fdignore".text = ignorePatterns;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
# Mullvad is a VPN service. This isn't currently in use for me at the moment.
|
|
||||||
|
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options.mullvad.enable = lib.mkEnableOption "Mullvad VPN.";
|
|
||||||
|
|
||||||
config = lib.mkIf config.mullvad.enable {
|
|
||||||
|
|
||||||
services.mullvad-vpn.enable = true;
|
|
||||||
environment.systemPackages = [ pkgs.mullvad-vpn ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
# Netdata is an out-of-the-box monitoring tool that exposes many different
|
|
||||||
# metrics. Not currently in use, in favor of VictoriaMetrics and Grafana.
|
|
||||||
|
|
||||||
{ config, lib, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
options.netdata.enable = lib.mkEnableOption "Netdata metrics.";
|
|
||||||
|
|
||||||
config = lib.mkIf config.netdata.enable {
|
|
||||||
|
|
||||||
services.netdata = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
# Disable local dashboard (unsecured)
|
|
||||||
config = {
|
|
||||||
web.mode = "none";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,119 +0,0 @@
|
|||||||
# Prometheus is a timeseries database that exposes system and service metrics
|
|
||||||
# for use in visualizing, monitoring, and alerting (with Grafana).
|
|
||||||
|
|
||||||
# Instead of running traditional Prometheus, I generally run VictoriaMetrics as
|
|
||||||
# a more efficient drop-in replacement.
|
|
||||||
|
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options.prometheus = {
|
|
||||||
exporters.enable = lib.mkEnableOption "Enable Prometheus exporters";
|
|
||||||
scrapeTargets = lib.mkOption {
|
|
||||||
type = lib.types.listOf lib.types.str;
|
|
||||||
description = "Prometheus scrape targets";
|
|
||||||
default = [ ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config =
|
|
||||||
let
|
|
||||||
|
|
||||||
# If hosting Grafana, host local Prometheus and listen for inbound jobs. If
|
|
||||||
# not hosting Grafana, send remote Prometheus writes to primary host.
|
|
||||||
isServer = config.services.grafana.enable;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
|
|
||||||
# Turn on exporters if any Prometheus scraper is running
|
|
||||||
prometheus.exporters.enable = builtins.any (x: x) [
|
|
||||||
config.services.prometheus.enable
|
|
||||||
config.services.victoriametrics.enable
|
|
||||||
config.services.vmagent.enable
|
|
||||||
];
|
|
||||||
|
|
||||||
prometheus.scrapeTargets = [
|
|
||||||
"127.0.0.1:${builtins.toString config.services.prometheus.exporters.node.port}"
|
|
||||||
"127.0.0.1:${builtins.toString config.services.prometheus.exporters.systemd.port}"
|
|
||||||
"127.0.0.1:${builtins.toString config.services.prometheus.exporters.process.port}"
|
|
||||||
];
|
|
||||||
|
|
||||||
services.prometheus = {
|
|
||||||
exporters.node.enable = config.prometheus.exporters.enable;
|
|
||||||
exporters.node.enabledCollectors = [ ];
|
|
||||||
exporters.node.disabledCollectors = [ "cpufreq" ];
|
|
||||||
exporters.systemd.enable = config.prometheus.exporters.enable;
|
|
||||||
exporters.process.enable = config.prometheus.exporters.enable;
|
|
||||||
exporters.process.settings.process_names = [
|
|
||||||
# Remove nix store path from process name
|
|
||||||
{
|
|
||||||
name = "{{.Matches.Wrapped}} {{ .Matches.Args }}";
|
|
||||||
cmdline = [ "^/nix/store[^ ]*/(?P<Wrapped>[^ /]*) (?P<Args>.*)" ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
extraFlags = lib.mkIf isServer [ "--web.enable-remote-write-receiver" ];
|
|
||||||
scrapeConfigs = [
|
|
||||||
{
|
|
||||||
job_name = config.networking.hostName;
|
|
||||||
static_configs = [ { targets = config.scrapeTargets; } ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
webExternalUrl = lib.mkIf isServer "https://${config.hostnames.prometheus}";
|
|
||||||
# Web config file: https://prometheus.io/docs/prometheus/latest/configuration/https/
|
|
||||||
webConfigFile = lib.mkIf isServer (
|
|
||||||
(pkgs.formats.yaml { }).generate "webconfig.yml" {
|
|
||||||
basic_auth_users = {
|
|
||||||
# Generate password: htpasswd -nBC 10 "" | tr -d ':\n'
|
|
||||||
# Encrypt and place in private/prometheus.age
|
|
||||||
"prometheus" = "$2y$10$r7FWHLHTGPAY312PdhkPEuvb05aGn9Nk1IO7qtUUUjmaDl35l6sLa";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
remoteWrite = lib.mkIf (!isServer) [
|
|
||||||
{
|
|
||||||
name = config.networking.hostName;
|
|
||||||
url = "https://${config.hostnames.prometheus}/api/v1/write";
|
|
||||||
basic_auth = {
|
|
||||||
# Uses password hashed with bcrypt above
|
|
||||||
username = "prometheus";
|
|
||||||
password_file = config.secrets.prometheus.dest;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Create credentials file for remote Prometheus push
|
|
||||||
secrets.prometheus = lib.mkIf (config.services.prometheus.enable && !isServer) {
|
|
||||||
source = ../../../private/prometheus.age;
|
|
||||||
dest = "${config.secretsDirectory}/prometheus";
|
|
||||||
owner = "prometheus";
|
|
||||||
group = "prometheus";
|
|
||||||
permissions = "0440";
|
|
||||||
};
|
|
||||||
systemd.services.prometheus-secret = lib.mkIf (config.services.prometheus.enable && !isServer) {
|
|
||||||
requiredBy = [ "prometheus.service" ];
|
|
||||||
before = [ "prometheus.service" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
caddy.routes = lib.mkIf (config.services.prometheus.enable && isServer) [
|
|
||||||
{
|
|
||||||
match = [ { host = [ config.hostnames.prometheus ]; } ];
|
|
||||||
handle = [
|
|
||||||
{
|
|
||||||
handler = "reverse_proxy";
|
|
||||||
upstreams = [ { dial = "localhost:${config.services.prometheus.port}"; } ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
# Configure Cloudflare DNS to point to this machine
|
|
||||||
services.cloudflare-dyndns.domains =
|
|
||||||
if (config.services.prometheus.enable && isServer) then [ config.hostnames.prometheus ] else [ ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
# Samba is a Windows-compatible file-sharing service.
|
|
||||||
|
|
||||||
{ config, lib, ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = {
|
|
||||||
|
|
||||||
services.samba = lib.mkIf config.services.samba.enable {
|
|
||||||
openFirewall = true;
|
|
||||||
settings.data = {
|
|
||||||
path = "/data";
|
|
||||||
browseable = "yes";
|
|
||||||
"read only" = "no";
|
|
||||||
"guest ok" = "no";
|
|
||||||
comment = "NAS";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Allows Windows clients to discover server
|
|
||||||
services.samba-wsdd.enable = true;
|
|
||||||
networking.firewall.allowedTCPPorts = [ 5357 ];
|
|
||||||
networking.firewall.allowedUDPPorts = [ 3702 ];
|
|
||||||
|
|
||||||
# Allow client browsing Samba and virtual filesystem shares
|
|
||||||
services.gvfs = lib.mkIf (config.gui.enable && config.nautilus.enable) { enable = true; };
|
|
||||||
|
|
||||||
# # Permissions required to mount Samba with GVFS, if not using desktop environment
|
|
||||||
# environment.systemPackages = lib.mkIf (config.gui.enable
|
|
||||||
# && config.nautilus.enable
|
|
||||||
# && config.services.xserver.windowManager.i3.enable)
|
|
||||||
# [ pkgs.lxqt.lxqt-policykit ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
# SSHD service for allowing SSH access to my machines.
|
|
||||||
|
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
publicKeys = lib.mkOption {
|
|
||||||
type = lib.types.nullOr (lib.types.listOf lib.types.str);
|
|
||||||
description = "Public SSH key authorized for this system.";
|
|
||||||
default = null;
|
|
||||||
};
|
|
||||||
permitRootLogin = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = "Root login settings.";
|
|
||||||
default = "no";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf config.services.openssh.enable {
|
|
||||||
services.openssh = {
|
|
||||||
ports = [ 22 ];
|
|
||||||
allowSFTP = true;
|
|
||||||
settings = {
|
|
||||||
GatewayPorts = "no";
|
|
||||||
X11Forwarding = false;
|
|
||||||
PasswordAuthentication = false;
|
|
||||||
PermitRootLogin = lib.mkDefault config.permitRootLogin;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
users.users.${config.user}.openssh.authorizedKeys.keys = lib.mkIf (
|
|
||||||
config.publicKeys != null
|
|
||||||
) config.publicKeys;
|
|
||||||
|
|
||||||
# Implement a simple fail2ban service for sshd
|
|
||||||
services.sshguard.enable = true;
|
|
||||||
|
|
||||||
# Add terminfo for SSH from popular terminal emulators
|
|
||||||
# Fix: terminfo now installs contour, which is broken on ARM
|
|
||||||
# - https://github.com/NixOS/nixpkgs/pull/253334
|
|
||||||
# - Will disable until fixed
|
|
||||||
environment.enableAllTerminfo = pkgs.stdenv.isLinux && pkgs.stdenv.isx86_64;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
# This setting only applies to NixOS, different on Darwin
|
|
||||||
nix.gc.dates = "09:03"; # Run every morning (but before upgrade)
|
|
||||||
|
|
||||||
# Update the system daily by pointing it at the flake repository
|
|
||||||
system.autoUpgrade = {
|
|
||||||
enable = lib.mkDefault false; # Don't enable by default
|
|
||||||
dates = "09:33";
|
|
||||||
flake = "git+${config.dotfilesRepo}";
|
|
||||||
randomizedDelaySec = "25min";
|
|
||||||
operation = "switch";
|
|
||||||
allowReboot = true;
|
|
||||||
rebootWindow = {
|
|
||||||
lower = "09:01";
|
|
||||||
upper = "11:00";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Create an email notification service for failed jobs
|
|
||||||
systemd.services."notify-email@" =
|
|
||||||
let
|
|
||||||
address = "system@${config.mail.server}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
enable = config.mail.enable;
|
|
||||||
environment.SERVICE_ID = "%i";
|
|
||||||
script = ''
|
|
||||||
TEMPFILE=$(mktemp)
|
|
||||||
echo "From: ${address}" > $TEMPFILE
|
|
||||||
echo "To: ${address}" >> $TEMPFILE
|
|
||||||
echo "Subject: Failure in $SERVICE_ID" >> $TEMPFILE
|
|
||||||
echo -e "\nGot an error with $SERVICE_ID\n\n" >> $TEMPFILE
|
|
||||||
set +e
|
|
||||||
systemctl status $SERVICE_ID >> $TEMPFILE
|
|
||||||
set -e
|
|
||||||
${pkgs.msmtp}/bin/msmtp \
|
|
||||||
--file=${config.homePath}/.config/msmtp/config \
|
|
||||||
--account=system \
|
|
||||||
${address} < $TEMPFILE
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Send an email whenever auto upgrade fails
|
|
||||||
systemd.services.nixos-upgrade.onFailure = lib.mkIf config.systemd.services."notify-email@".enable [
|
|
||||||
"notify-email@%i.service"
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
imports = [
|
|
||||||
./auto-upgrade.nix
|
|
||||||
./doas.nix
|
|
||||||
./journald.nix
|
|
||||||
./shared.nix
|
|
||||||
./user.nix
|
|
||||||
./timezone.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
config = lib.mkIf pkgs.stdenv.isLinux {
|
|
||||||
|
|
||||||
# Pin a state version to prevent warnings
|
|
||||||
system.stateVersion = config.home-manager.users.${config.user}.home.stateVersion;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
{ ... }:
|
|
||||||
{
|
|
||||||
|
|
||||||
# How long to keep journalctl entries
|
|
||||||
# This helps to make sure log disk usage doesn't grow too unwieldy
|
|
||||||
services.journald.extraConfig = ''
|
|
||||||
SystemMaxUse=4G
|
|
||||||
SystemKeepFree=10G
|
|
||||||
SystemMaxFileSize=128M
|
|
||||||
SystemMaxFiles=500
|
|
||||||
MaxFileSec=1month
|
|
||||||
MaxRetentionSec=2month
|
|
||||||
'';
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
config = lib.mkIf pkgs.stdenv.isLinux {
|
|
||||||
|
|
||||||
services.tzupdate.enable = true;
|
|
||||||
|
|
||||||
# Service to determine location for time zone
|
|
||||||
# This is required for redshift which depends on the location provider
|
|
||||||
services.geoclue2.enable = true;
|
|
||||||
services.geoclue2.enableWifi = false; # Breaks when it can't connect
|
|
||||||
location = {
|
|
||||||
provider = "geoclue2";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
|
|
||||||
passwordHash = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
description = "Password created with mkpasswd -m sha-512";
|
|
||||||
default = null;
|
|
||||||
# Test it by running: mkpasswd -m sha-512 --salt "PZYiMGmJIIHAepTM"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
|
||||||
|
|
||||||
# Allows us to declaritively set password
|
|
||||||
users.mutableUsers = false;
|
|
||||||
|
|
||||||
# Define a user account. Don't forget to set a password with ‘passwd’.
|
|
||||||
users.users.${config.user} = {
|
|
||||||
|
|
||||||
# Create a home directory for human user
|
|
||||||
isNormalUser = true;
|
|
||||||
|
|
||||||
# Automatically create a password to start
|
|
||||||
hashedPassword = config.passwordHash;
|
|
||||||
|
|
||||||
extraGroups = [
|
|
||||||
"wheel" # Sudo privileges
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Allow writing custom scripts outside of Nix
|
|
||||||
# Probably shouldn't make this a habit
|
|
||||||
environment.localBinInPath = true;
|
|
||||||
|
|
||||||
home-manager.users.${config.user}.xdg = {
|
|
||||||
|
|
||||||
# Allow Nix to manage the default applications list
|
|
||||||
mimeApps.enable = true;
|
|
||||||
|
|
||||||
# Create a desktop option for Burp
|
|
||||||
desktopEntries.burp = lib.mkIf pkgs.stdenv.isLinux {
|
|
||||||
name = "Burp";
|
|
||||||
exec = "${config.homePath}/.local/bin/burp.sh";
|
|
||||||
categories = [ "Application" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Set directories for application defaults
|
|
||||||
userDirs = {
|
|
||||||
enable = true;
|
|
||||||
createDirectories = true;
|
|
||||||
documents = "$HOME/documents";
|
|
||||||
download = config.userDirs.download;
|
|
||||||
music = "$HOME/media/music";
|
|
||||||
pictures = "$HOME/media/images";
|
|
||||||
videos = "$HOME/media/videos";
|
|
||||||
desktop = "$HOME/other/desktop";
|
|
||||||
publicShare = "$HOME/other/public";
|
|
||||||
templates = "$HOME/other/templates";
|
|
||||||
extraConfig = {
|
|
||||||
XDG_DEV_DIR = "$HOME/dev";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs."1password";
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs."1password".enable =
|
||||||
|
lib.mkEnableOption "1Password password manager";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
unfreePackages = [
|
||||||
|
"1password"
|
||||||
|
"_1password-gui"
|
||||||
|
"1password-cli"
|
||||||
|
"onepassword-password-manager" # Firefox extension
|
||||||
|
];
|
||||||
|
home.packages = [
|
||||||
|
pkgs._1password-cli
|
||||||
|
] ++ (if pkgs.stdenv.isLinux then [ pkgs._1password-gui ] else [ ]);
|
||||||
|
|
||||||
|
# Firefox extension
|
||||||
|
programs.firefox.profiles.default.extensions =
|
||||||
|
pkgs.nur.repos.rycee.firefox-addons.onepassword-password-manager;
|
||||||
|
};
|
||||||
|
|
||||||
|
# # https://1password.community/discussion/135462/firefox-extension-does-not-connect-to-linux-app
|
||||||
|
# # On Mac, does not apply: https://1password.community/discussion/142794/app-and-browser-integration
|
||||||
|
# # However, the button doesn't work either:
|
||||||
|
# # https://1password.community/discussion/140735/extending-support-for-trusted-web-browsers
|
||||||
|
# environment.etc."1password/custom_allowed_browsers".text = ''
|
||||||
|
# ${
|
||||||
|
# config.home-manager.users.${config.user}.programs.firefox.package
|
||||||
|
# }/Applications/Firefox.app/Contents/MacOS/firefox
|
||||||
|
# firefox
|
||||||
|
# '';
|
||||||
|
}
|
223
platforms/home-manager/modules/nmasur/presets/programs/aerc.nix
Normal file
223
platforms/home-manager/modules/nmasur/presets/programs/aerc.nix
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.aerc;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.aerc.enable = lib.mkEnableOption "Aerc email TUI";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
w3m # Render HTML
|
||||||
|
dante # Socksify for rendering HTML
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.aerc = {
|
||||||
|
enable = true;
|
||||||
|
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
|
||||||
|
global = {
|
||||||
|
"<C-p>" = ":prev-tab<Enter>";
|
||||||
|
"<C-n>" = ":next-tab <Enter>";
|
||||||
|
"<C-t>" = ":term<Enter>";
|
||||||
|
"?" = ":help keys<Enter>";
|
||||||
|
};
|
||||||
|
|
||||||
|
messages = {
|
||||||
|
q = ":quit<Enter>";
|
||||||
|
|
||||||
|
j = ":next <Enter>";
|
||||||
|
"<Down>" = ":next<Enter>";
|
||||||
|
"<C-d>" = ":next 50%<Enter>";
|
||||||
|
"<C-f>" = ":next 100%<Enter>";
|
||||||
|
"<PgDn>" = ":next 100%<Enter>";
|
||||||
|
|
||||||
|
k = ":prev <Enter>";
|
||||||
|
"<Up>" = ":prev<Enter>";
|
||||||
|
"<C-u>" = ":prev 50%<Enter>";
|
||||||
|
"<C-b>" = ":prev 100%<Enter>";
|
||||||
|
"<PgUp>" = ":prev 100%<Enter>";
|
||||||
|
g = ":select 0 <Enter>";
|
||||||
|
G = ":select -1<Enter>";
|
||||||
|
|
||||||
|
J = ":next-folder <Enter>";
|
||||||
|
K = ":prev-folder<Enter>";
|
||||||
|
H = ":collapse-folder<Enter>";
|
||||||
|
L = ":expand-folder<Enter>";
|
||||||
|
|
||||||
|
v = ":mark -t<Enter>";
|
||||||
|
V = ":mark -v<Enter>";
|
||||||
|
|
||||||
|
T = ":toggle-threads<Enter>";
|
||||||
|
|
||||||
|
"<Enter>" = ":view<Enter>";
|
||||||
|
d = ":prompt 'Really delete this message?' 'delete-message'<Enter>";
|
||||||
|
D = ":move Trash<Enter>";
|
||||||
|
A = ":archive flat<Enter>";
|
||||||
|
|
||||||
|
C = ":compose<Enter>";
|
||||||
|
|
||||||
|
rr = ":reply -a<Enter>";
|
||||||
|
rq = ":reply -aq<Enter>";
|
||||||
|
Rr = ":reply<Enter>";
|
||||||
|
Rq = ":reply -q<Enter>";
|
||||||
|
|
||||||
|
c = ":cf<space>";
|
||||||
|
"$" = ":term<space>";
|
||||||
|
"!" = ":term<space>";
|
||||||
|
"|" = ":pipe<space>";
|
||||||
|
|
||||||
|
"/" = ":search<space>-a<space>";
|
||||||
|
"\\" = ":filter <space>";
|
||||||
|
n = ":next-result<Enter>";
|
||||||
|
N = ":prev-result<Enter>";
|
||||||
|
"<Esc>" = ":clear<Enter>";
|
||||||
|
};
|
||||||
|
|
||||||
|
"messages:folder=Drafts" = {
|
||||||
|
"<Enter>" = ":recall<Enter>";
|
||||||
|
};
|
||||||
|
|
||||||
|
view = {
|
||||||
|
"/" = ":toggle-key-passthrough <Enter> /";
|
||||||
|
q = ":close<Enter>";
|
||||||
|
O = ":open<Enter>";
|
||||||
|
S = ":save<space>";
|
||||||
|
"|" = ":pipe<space>";
|
||||||
|
D = ":move Trash<Enter>";
|
||||||
|
A = ":archive flat<Enter>";
|
||||||
|
|
||||||
|
"<C-l>" = ":open-link <space>";
|
||||||
|
|
||||||
|
f = ":forward <Enter>";
|
||||||
|
rr = ":reply -a<Enter>";
|
||||||
|
rq = ":reply -aq<Enter>";
|
||||||
|
Rr = ":reply<Enter>";
|
||||||
|
Rq = ":reply -q<Enter>";
|
||||||
|
|
||||||
|
H = ":toggle-headers<Enter>";
|
||||||
|
"<C-k>" = ":prev-part<Enter>";
|
||||||
|
"<C-j>" = ":next-part<Enter>";
|
||||||
|
J = ":next <Enter>";
|
||||||
|
K = ":prev<Enter>";
|
||||||
|
};
|
||||||
|
|
||||||
|
"view::passthrough" = {
|
||||||
|
"$noinherit" = "true";
|
||||||
|
"$ex" = "<C-x>";
|
||||||
|
"<Esc>" = ":toggle-key-passthrough<Enter>";
|
||||||
|
};
|
||||||
|
|
||||||
|
compose = {
|
||||||
|
# Keybindings used when the embedded terminal is not selected in the compose
|
||||||
|
# view
|
||||||
|
"$noinherit" = "true";
|
||||||
|
"$ex" = "<C-x>";
|
||||||
|
"<C-k>" = ":prev-field<Enter>";
|
||||||
|
"<C-j>" = ":next-field<Enter>";
|
||||||
|
"<A-p>" = ":switch-account -p<Enter>";
|
||||||
|
"<A-n>" = ":switch-account -n<Enter>";
|
||||||
|
"<tab>" = ":next-field<Enter>";
|
||||||
|
"<C-p>" = ":prev-tab<Enter>";
|
||||||
|
"<C-n>" = ":next-tab<Enter>";
|
||||||
|
};
|
||||||
|
|
||||||
|
"compose::editor" = {
|
||||||
|
# Keybindings used when the embedded terminal is selected in the compose view
|
||||||
|
"$noinherit" = "true";
|
||||||
|
"$ex" = "<C-x>";
|
||||||
|
"<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>";
|
||||||
|
p = ":postpone<Enter>";
|
||||||
|
q = ":choose -o d discard abort -o p postpone postpone<Enter>";
|
||||||
|
e = ":edit<Enter>";
|
||||||
|
a = ":attach<space>";
|
||||||
|
d = ":detach<space>";
|
||||||
|
};
|
||||||
|
|
||||||
|
terminal = {
|
||||||
|
"$noinherit" = "true";
|
||||||
|
"$ex" = "<C-x>";
|
||||||
|
"<C-p>" = ":prev-tab<Enter>";
|
||||||
|
"<C-n>" = ":next-tab<Enter>";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extraConfig = {
|
||||||
|
general = {
|
||||||
|
unsafe-accounts-conf = true;
|
||||||
|
# log-file = "~/.cache/aerc.log";
|
||||||
|
# log-level = "debug";
|
||||||
|
};
|
||||||
|
viewer = {
|
||||||
|
pager = "${pkgs.less}/bin/less -R";
|
||||||
|
};
|
||||||
|
filters = {
|
||||||
|
"text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
||||||
|
"text/calendar" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/libexec/aerc/filters/calendar";
|
||||||
|
"text/html" =
|
||||||
|
"${pkgs.aerc}/libexec/aerc/filters/html | ${pkgs.aerc}/libexec/aerc/filters/colorize"; # Requires w3m, dante
|
||||||
|
# "text/*" =
|
||||||
|
# ''${pkgs.bat}/bin/bat -fP --file-name="$AERC_FILENAME "'';
|
||||||
|
"message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
||||||
|
"message/rfc822" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
||||||
|
"application/x-sh" = "${pkgs.bat}/bin/bat -fP -l sh";
|
||||||
|
"application/pdf" = "${pkgs.zathura}/bin/zathura -";
|
||||||
|
"audio/*" = "${pkgs.mpv}/bin/mpv -";
|
||||||
|
"image/*" = "${pkgs.feh}/bin/feh -";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
accounts.email.accounts.home.aerc = {
|
||||||
|
enable = true;
|
||||||
|
extraAccounts = {
|
||||||
|
check-mail = "5m";
|
||||||
|
check-mail-cmd = "${pkgs.isync}/bin/mbsync -a";
|
||||||
|
check-mail-timeout = "15s";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.desktopEntries.aerc = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
|
||||||
|
name = "aerc";
|
||||||
|
exec = "${config.terminalLaunchCommand} aerc %u";
|
||||||
|
};
|
||||||
|
xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
|
||||||
|
"${config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier}+Shift+e" =
|
||||||
|
"exec ${
|
||||||
|
# Don't name the script `aerc` or it will affect grep
|
||||||
|
builtins.toString (
|
||||||
|
pkgs.writeShellScript "focus-mail.sh" ''
|
||||||
|
count=$(ps aux | grep -c aerc)
|
||||||
|
if [ "$count" -eq 1 ]; then
|
||||||
|
i3-msg "exec --no-startup-id ${config.terminal} start --class aerc -- aerc"
|
||||||
|
sleep 0.25
|
||||||
|
fi
|
||||||
|
i3-msg "[class=aerc] focus"
|
||||||
|
''
|
||||||
|
)
|
||||||
|
}";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fish.shellAbbrs = {
|
||||||
|
ae = "aerc";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.alacritty;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.alacritty.enable = lib.mkEnableOption "Alacritty terminal";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.alacritty = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
window = {
|
||||||
|
dimensions = {
|
||||||
|
columns = 85;
|
||||||
|
lines = 30;
|
||||||
|
};
|
||||||
|
padding = {
|
||||||
|
x = 20;
|
||||||
|
y = 20;
|
||||||
|
};
|
||||||
|
opacity = 1.0;
|
||||||
|
};
|
||||||
|
scrolling.history = 10000;
|
||||||
|
font = {
|
||||||
|
size = 14.0;
|
||||||
|
};
|
||||||
|
key_bindings = [
|
||||||
|
# Used for word completion in fish_user_key_bindings
|
||||||
|
{
|
||||||
|
key = "Return";
|
||||||
|
mods = "Shift";
|
||||||
|
chars = "\\x1F";
|
||||||
|
}
|
||||||
|
# Used for searching nixpkgs in fish_user_key_bindings
|
||||||
|
{
|
||||||
|
key = "N";
|
||||||
|
mods = "Control|Shift";
|
||||||
|
chars = "\\x11F";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
key = "H";
|
||||||
|
mods = "Control|Shift";
|
||||||
|
mode = "~Vi";
|
||||||
|
action = "ToggleViMode";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
key = "Return";
|
||||||
|
mode = "Vi";
|
||||||
|
action = "ToggleViMode";
|
||||||
|
}
|
||||||
|
# Used to enable $ keybind in Vi mode
|
||||||
|
{
|
||||||
|
key = 5; # Scancode for key4
|
||||||
|
mods = "Shift";
|
||||||
|
mode = "Vi|~Search";
|
||||||
|
action = "Last";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
colors = {
|
||||||
|
primary = {
|
||||||
|
background = config.theme.colors.base00;
|
||||||
|
foreground = config.theme.colors.base05;
|
||||||
|
};
|
||||||
|
cursor = {
|
||||||
|
text = "#1d2021";
|
||||||
|
cursor = config.theme.colors.base05;
|
||||||
|
};
|
||||||
|
normal = {
|
||||||
|
black = "#1d2021";
|
||||||
|
red = config.theme.colors.base08;
|
||||||
|
green = config.theme.colors.base0B;
|
||||||
|
yellow = config.theme.colors.base0A;
|
||||||
|
blue = config.theme.colors.base0D;
|
||||||
|
magenta = config.theme.colors.base0E;
|
||||||
|
cyan = config.theme.colors.base0C;
|
||||||
|
white = config.theme.colors.base05;
|
||||||
|
};
|
||||||
|
bright = {
|
||||||
|
black = config.theme.colors.base03;
|
||||||
|
red = config.theme.colors.base09;
|
||||||
|
green = config.theme.colors.base01;
|
||||||
|
yellow = config.theme.colors.base02;
|
||||||
|
blue = config.theme.colors.base04;
|
||||||
|
magenta = config.theme.colors.base06;
|
||||||
|
cyan = config.theme.colors.base0F;
|
||||||
|
white = config.theme.colors.base07;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
draw_bold_text_with_bright_colors = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.atuin;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.atuin.enable = lib.mkEnableOption "Atuin shell history sync";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.atuin = {
|
||||||
|
enable = true;
|
||||||
|
flags = [
|
||||||
|
"--disable-up-arrow"
|
||||||
|
"--disable-ctrl-r"
|
||||||
|
];
|
||||||
|
settings = {
|
||||||
|
auto_sync = true;
|
||||||
|
update_check = false;
|
||||||
|
sync_address = "https://api.atuin.sh";
|
||||||
|
search_mode = "fuzzy";
|
||||||
|
filter_mode = "host"; # global, host, session, directory
|
||||||
|
search_mode_shell_up_key_binding = "fuzzy";
|
||||||
|
filter_mode_shell_up_key_binding = "session";
|
||||||
|
style = "compact"; # or auto,full
|
||||||
|
show_help = true;
|
||||||
|
history_filter = [ ];
|
||||||
|
secrets_filter = true;
|
||||||
|
enter_accept = false;
|
||||||
|
keymap_mode = "vim-normal";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.bash;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.bash.enable = lib.mkEnableOption "Bash shell";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.bash = {
|
||||||
|
enable = true;
|
||||||
|
shellAliases = config.programs.fish.shellAliases;
|
||||||
|
initExtra = "";
|
||||||
|
profileExtra = "";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.starship.enableBashIntegration = false;
|
||||||
|
programs.zoxide.enableBashIntegration = true;
|
||||||
|
programs.fzf.enableBashIntegration = true;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.bat;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.bat.enable = lib.mkEnableOption "Bat text pager";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.bat = {
|
||||||
|
enable = true; # cat replacement
|
||||||
|
config = {
|
||||||
|
theme = config.theme.colors.batTheme;
|
||||||
|
pager = "less -R"; # Don't auto-exit if one screen
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.calibre;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.calibre.enable = lib.mkEnableOption "Calibre e-book manager";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = [ pkgs.calibre ];
|
||||||
|
home.sessionVariables = {
|
||||||
|
CALIBRE_USE_DARK_PALETTE = 1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -8,10 +8,9 @@
|
|||||||
./firefox.nix
|
./firefox.nix
|
||||||
./kitty.nix
|
./kitty.nix
|
||||||
./media.nix
|
./media.nix
|
||||||
./obsidian.nix
|
./nsxiv.nix
|
||||||
./qbittorrent.nix
|
|
||||||
./slack.nix
|
|
||||||
./wezterm.nix
|
./wezterm.nix
|
||||||
./yt-dlp.nix
|
./yt-dlp.nix
|
||||||
|
./zathura.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.direnv;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.direnv.enable = lib.mkEnableOption "Direnv project-level shells";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# Enables quickly entering Nix shells when changing directories
|
||||||
|
programs.direnv = {
|
||||||
|
enable = true;
|
||||||
|
nix-direnv.enable = true;
|
||||||
|
config = {
|
||||||
|
whitelist = {
|
||||||
|
prefix = [ config.nmasur.dotfilesPath ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.discord;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.discord.enable = lib.mkEnableOption "Discord chat";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
unfreePackages = [ "discord" ];
|
||||||
|
home.packages = [ pkgs.discord ];
|
||||||
|
xdg.configFile."discord/settings.json".text = pkgs.formats.json {
|
||||||
|
BACKGROUND_COLOR = "#202225";
|
||||||
|
IS_MAXIMIZED = false;
|
||||||
|
IS_MINIMIZED = false;
|
||||||
|
OPEN_ON_STARTUP = false;
|
||||||
|
MINIMIZE_TO_TRAY = false;
|
||||||
|
SKIP_HOST_UPDATE = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.fd;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.fd.enable = lib.mkEnableOption "fd file search tool";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = [ pkgs.fd ];
|
||||||
|
xdg.configFile."fd/ignore".text = config.nmasur.presets.programs.ripgrep.ignorePatterns;
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,202 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.firefox;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.firefox = {
|
||||||
|
enable = lib.mkEnableOption "Firefox web browser";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
unfreePackages = [
|
||||||
|
"okta-browser-plugin"
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.firefox = {
|
||||||
|
enable = true;
|
||||||
|
package = if pkgs.stdenv.isDarwin then pkgs.firefox-bin else pkgs.firefox;
|
||||||
|
profiles.default = {
|
||||||
|
id = 0;
|
||||||
|
name = "default";
|
||||||
|
isDefault = true;
|
||||||
|
# https://nur.nix-community.org/repos/rycee/
|
||||||
|
extensions = with pkgs.nur.repos.rycee.firefox-addons; [
|
||||||
|
bypass-paywalls-clean
|
||||||
|
darkreader
|
||||||
|
don-t-fuck-with-paste
|
||||||
|
export-cookies-txt
|
||||||
|
facebook-container
|
||||||
|
markdownload
|
||||||
|
multi-account-containers
|
||||||
|
# obsidian-web-clipper TODO
|
||||||
|
okta-browser-plugin # TODO: only for work profile
|
||||||
|
reddit-enhancement-suite
|
||||||
|
return-youtube-dislikes
|
||||||
|
sponsorblock
|
||||||
|
ublock-origin
|
||||||
|
ublacklist
|
||||||
|
vimium
|
||||||
|
wappalyzer # TODO: only for work profile
|
||||||
|
# saml-tracer
|
||||||
|
# text-fragment
|
||||||
|
];
|
||||||
|
settings = {
|
||||||
|
"app.update.auto" = false;
|
||||||
|
"browser.aboutConfig.showWarning" = false;
|
||||||
|
"browser.warnOnQuit" = false;
|
||||||
|
"browser.quitShortcut.disabled" = if pkgs.stdenv.isLinux then true else false;
|
||||||
|
"browser.theme.dark-private-windows" = true;
|
||||||
|
"browser.toolbars.bookmarks.visibility" = false;
|
||||||
|
"browser.startup.page" = 3; # Restore previous session
|
||||||
|
"browser.newtabpage.enabled" = false; # Make new tabs blank
|
||||||
|
"trailhead.firstrun.didSeeAboutWelcome" = true; # Disable welcome splash
|
||||||
|
"dom.forms.autocomplete.formautofill" = false; # Disable autofill
|
||||||
|
"extensions.formautofill.creditCards.enabled" = false; # Disable credit cards
|
||||||
|
"dom.payments.defaults.saveAddress" = false; # Disable address save
|
||||||
|
"general.autoScroll" = true; # Drag middle-mouse to scroll
|
||||||
|
"services.sync.prefs.sync.general.autoScroll" = false; # Prevent disabling autoscroll
|
||||||
|
"extensions.pocket.enabled" = false;
|
||||||
|
"toolkit.legacyUserProfileCustomizations.stylesheets" = true; # Allow userChrome.css
|
||||||
|
"layout.css.color-mix.enabled" = true;
|
||||||
|
"ui.systemUsesDarkTheme" = if config.theme.dark == true then 1 else 0;
|
||||||
|
"media.ffmpeg.vaapi.enabled" = true; # Enable hardware video acceleration
|
||||||
|
"cookiebanners.ui.desktop.enabled" = true; # Reject cookie popups
|
||||||
|
"devtools.command-button-screenshot.enabled" = true; # Scrolling screenshot of entire page
|
||||||
|
"svg.context-properties.content.enabled" = true; # Sidebery styling
|
||||||
|
"browser.tabs.hoverPreview.enabled" = false; # Disable tab previews
|
||||||
|
"browser.tabs.hoverPreview.showThumbnails" = false; # Disable tab previews
|
||||||
|
};
|
||||||
|
userChrome = ''
|
||||||
|
:root {
|
||||||
|
--focus-outline-color: ${config.theme.colors.base04} !important;
|
||||||
|
--toolbar-color: ${config.theme.colors.base07} !important;
|
||||||
|
--tab-min-height: 30px !important;
|
||||||
|
}
|
||||||
|
/* Background of tab bar */
|
||||||
|
.toolbar-items {
|
||||||
|
background-color: ${config.theme.colors.base00} !important;
|
||||||
|
}
|
||||||
|
/* Extra tab bar sides on macOS */
|
||||||
|
.titlebar-spacer {
|
||||||
|
background-color: ${config.theme.colors.base00} !important;
|
||||||
|
}
|
||||||
|
.titlebar-buttonbox-container {
|
||||||
|
background-color: ${config.theme.colors.base00} !important;
|
||||||
|
}
|
||||||
|
#tabbrowser-tabs {
|
||||||
|
border-inline-start: 0 !important;
|
||||||
|
}
|
||||||
|
/* Private Browsing indicator on macOS */
|
||||||
|
#private-browsing-indicator-with-label {
|
||||||
|
background-color: ${config.theme.colors.base00} !important;
|
||||||
|
margin-inline: 0 !important;
|
||||||
|
padding-inline: 7px;
|
||||||
|
}
|
||||||
|
/* Tabs themselves */
|
||||||
|
.tabbrowser-tab .tab-stack {
|
||||||
|
border-radius: 5px 5px 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: ${config.theme.colors.base00};
|
||||||
|
color: ${config.theme.colors.base06} !important;
|
||||||
|
}
|
||||||
|
.tab-content {
|
||||||
|
border-bottom: 2px solid color-mix(in srgb, var(--identity-tab-color) 40%, transparent);
|
||||||
|
border-radius: 5px 5px 0 0;
|
||||||
|
background-color: ${config.theme.colors.base00};
|
||||||
|
color: ${config.theme.colors.base06} !important;
|
||||||
|
}
|
||||||
|
.tab-content[selected] {
|
||||||
|
border-bottom: 2px solid color-mix(in srgb, var(--identity-tab-color) 25%, transparent);
|
||||||
|
background-color: ${config.theme.colors.base01} !important;
|
||||||
|
color: ${config.theme.colors.base07} !important;
|
||||||
|
}
|
||||||
|
/* Below tab bar */
|
||||||
|
#nav-bar {
|
||||||
|
background: ${config.theme.colors.base01} !important;
|
||||||
|
}
|
||||||
|
/* URL bar in nav bar */
|
||||||
|
#urlbar[focused=true] {
|
||||||
|
color: ${config.theme.colors.base07} !important;
|
||||||
|
background: ${config.theme.colors.base02} !important;
|
||||||
|
caret-color: ${config.theme.colors.base05} !important;
|
||||||
|
}
|
||||||
|
#urlbar:not([focused=true]) {
|
||||||
|
color: ${config.theme.colors.base04} !important;
|
||||||
|
background: ${config.theme.colors.base02} !important;
|
||||||
|
}
|
||||||
|
#urlbar ::-moz-selection {
|
||||||
|
color: ${config.theme.colors.base07} !important;
|
||||||
|
background: ${config.theme.colors.base02} !important;
|
||||||
|
}
|
||||||
|
#urlbar-input-container {
|
||||||
|
border: 1px solid ${config.theme.colors.base01} !important;
|
||||||
|
}
|
||||||
|
#urlbar-background {
|
||||||
|
background: ${config.theme.colors.base01} !important;
|
||||||
|
}
|
||||||
|
/* Text in URL bar */
|
||||||
|
#urlbar-input, #urlbar-scheme, .searchbar-textbox {
|
||||||
|
color: ${config.theme.colors.base07} !important;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
userContent = ''
|
||||||
|
@-moz-document url-prefix(about:blank) {
|
||||||
|
* {
|
||||||
|
background-color:${config.theme.colors.base01} !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
extraConfig = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# # Mimic nixpkgs package environment for read-only profiles.ini management
|
||||||
|
# # From: https://github.com/booxter/home-manager/commit/dd1602e306fec366280f5953c5e1b553e3d9672a
|
||||||
|
# home.sessionVariables = {
|
||||||
|
# MOZ_LEGACY_PROFILES = 1;
|
||||||
|
# MOZ_ALLOW_DOWNGRADE = 1;
|
||||||
|
# };
|
||||||
|
|
||||||
|
# launchd.user.envVariables = config.home-manager.users.${config.user}.home.sessionVariables;
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
associations.added = {
|
||||||
|
"text/html" = [ "firefox.desktop" ];
|
||||||
|
};
|
||||||
|
defaultApplications = {
|
||||||
|
"text/html" = [ "firefox.desktop" ];
|
||||||
|
};
|
||||||
|
associations.removed = {
|
||||||
|
"text/html" = [ "wine-extension-htm.desktop" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
|
||||||
|
"${config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier}+Shift+b" =
|
||||||
|
"exec ${
|
||||||
|
# Don't name the script `firefox` or it will affect grep
|
||||||
|
builtins.toString (
|
||||||
|
pkgs.writeShellScript "focus-ff.sh" ''
|
||||||
|
count=$(ps aux | grep -c firefox)
|
||||||
|
if [ "$count" -eq 1 ]; then
|
||||||
|
i3-msg "exec --no-startup-id firefox"
|
||||||
|
sleep 0.5
|
||||||
|
fi
|
||||||
|
i3-msg "[class=firefox] focus"
|
||||||
|
''
|
||||||
|
)
|
||||||
|
}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.fish-darwin;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.fish-darwin.enable = lib.mkEnableOption {
|
||||||
|
description = "Fish macOS options";
|
||||||
|
default = config.nmasur.presets.programs.fish && pkgs.stdenv.isDarwin;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.fish.shellAbbrs = {
|
||||||
|
# Shortcut to edit hosts file
|
||||||
|
hosts = "sudo nvim /etc/hosts";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
152
platforms/home-manager/modules/nmasur/presets/programs/fish.nix
Normal file
152
platforms/home-manager/modules/nmasur/presets/programs/fish.nix
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.fish;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.fish.enable = lib.mkEnableOption "Fish shell";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
programs.fish = {
|
||||||
|
enable = true;
|
||||||
|
shellAliases = {
|
||||||
|
|
||||||
|
# Version of bash which works much better on the terminal
|
||||||
|
bash = "${pkgs.bashInteractive}/bin/bash";
|
||||||
|
|
||||||
|
# Use eza (exa) instead of ls for fancier output
|
||||||
|
ls = "${pkgs.eza}/bin/eza --group";
|
||||||
|
|
||||||
|
# Move files to XDG trash on the commandline
|
||||||
|
trash = lib.mkIf pkgs.stdenv.isLinux "${pkgs.trash-cli}/bin/trash-put";
|
||||||
|
};
|
||||||
|
functions = {
|
||||||
|
commandline-git-commits = {
|
||||||
|
description = "Insert commit into commandline";
|
||||||
|
body = builtins.readFile ./functions/commandline-git-commits.fish;
|
||||||
|
};
|
||||||
|
copy = {
|
||||||
|
description = "Copy file contents into clipboard";
|
||||||
|
body = "cat $argv | pbcopy"; # Need to fix for non-macOS
|
||||||
|
};
|
||||||
|
edit = {
|
||||||
|
description = "Open a file in Vim";
|
||||||
|
body = builtins.readFile ./functions/edit.fish;
|
||||||
|
};
|
||||||
|
envs = {
|
||||||
|
description = "Evaluate a bash-like environment variables file";
|
||||||
|
body = ''set -gx (cat $argv | tr "=" " " | string split ' ')'';
|
||||||
|
};
|
||||||
|
fcd = {
|
||||||
|
description = "Jump to directory";
|
||||||
|
argumentNames = "directory";
|
||||||
|
body = builtins.readFile ./functions/fcd.fish;
|
||||||
|
};
|
||||||
|
fish_user_key_bindings = {
|
||||||
|
body = builtins.readFile ./functions/fish_user_key_bindings.fish;
|
||||||
|
};
|
||||||
|
ip = {
|
||||||
|
body = builtins.readFile ./functions/ip.fish;
|
||||||
|
};
|
||||||
|
json = {
|
||||||
|
description = "Tidy up JSON using jq";
|
||||||
|
body = "pbpaste | jq '.' | pbcopy"; # Need to fix for non-macOS
|
||||||
|
};
|
||||||
|
note = {
|
||||||
|
description = "Edit or create a note";
|
||||||
|
argumentNames = "filename";
|
||||||
|
body = builtins.readFile ./functions/note.fish;
|
||||||
|
};
|
||||||
|
recent = {
|
||||||
|
description = "Open a recent file in Vim";
|
||||||
|
body = builtins.readFile ./functions/recent.fish;
|
||||||
|
};
|
||||||
|
search-and-edit = {
|
||||||
|
description = "Search and open the relevant file in Vim";
|
||||||
|
body = builtins.readFile ./functions/search-and-edit.fish;
|
||||||
|
};
|
||||||
|
syncnotes = {
|
||||||
|
description = "Full git commit on notes";
|
||||||
|
body = builtins.readFile ./functions/syncnotes.fish;
|
||||||
|
};
|
||||||
|
_which = {
|
||||||
|
description = "Identify the path to a program in the shell";
|
||||||
|
body = "command --search (string sub --start=2 $argv)";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
interactiveShellInit = ''
|
||||||
|
fish_vi_key_bindings
|
||||||
|
bind yy fish_clipboard_copy
|
||||||
|
bind Y fish_clipboard_copy
|
||||||
|
bind -M visual y fish_clipboard_copy
|
||||||
|
bind -M default p fish_clipboard_paste
|
||||||
|
set -g fish_vi_force_cursor
|
||||||
|
set -g fish_cursor_default block
|
||||||
|
set -g fish_cursor_insert line
|
||||||
|
set -g fish_cursor_visual block
|
||||||
|
set -g fish_cursor_replace_one underscore
|
||||||
|
'';
|
||||||
|
loginShellInit = "";
|
||||||
|
shellAbbrs = {
|
||||||
|
|
||||||
|
# Directory aliases
|
||||||
|
l = "ls -lh";
|
||||||
|
lh = "ls -lh";
|
||||||
|
ll = "ls -alhF";
|
||||||
|
la = "ls -a";
|
||||||
|
c = "cd";
|
||||||
|
"-" = "cd -";
|
||||||
|
mkd = "mkdir -pv";
|
||||||
|
|
||||||
|
# Convert a program into its full path
|
||||||
|
"=" = {
|
||||||
|
position = "anywhere";
|
||||||
|
regex = "=\\w+";
|
||||||
|
function = "_which";
|
||||||
|
};
|
||||||
|
|
||||||
|
# System
|
||||||
|
s = "sudo";
|
||||||
|
sc = "systemctl";
|
||||||
|
scs = "systemctl status";
|
||||||
|
sca = "systemctl cat";
|
||||||
|
m = "make";
|
||||||
|
t = "trash";
|
||||||
|
|
||||||
|
# Vim (overwritten by Neovim)
|
||||||
|
v = "vim";
|
||||||
|
vl = "vim -c 'normal! `0'";
|
||||||
|
|
||||||
|
# Notes
|
||||||
|
sn = "syncnotes";
|
||||||
|
|
||||||
|
# Cheat Sheets
|
||||||
|
ssl = "openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr";
|
||||||
|
fingerprint = "ssh-keyscan myhost.com | ssh-keygen -lf -";
|
||||||
|
publickey = "ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub";
|
||||||
|
forloop = "for i in (seq 1 100)";
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
dc = "$DOTS/bin/docker_cleanup";
|
||||||
|
dr = "docker run --rm -it";
|
||||||
|
db = "docker build . -t";
|
||||||
|
};
|
||||||
|
shellInit = "";
|
||||||
|
};
|
||||||
|
|
||||||
|
home.sessionVariables.fish_greeting = "";
|
||||||
|
|
||||||
|
programs.starship.enableFishIntegration = true;
|
||||||
|
programs.zoxide.enableFishIntegration = true;
|
||||||
|
programs.fzf.enableFishIntegration = true;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -1,9 +1,19 @@
|
|||||||
{ config, pkgs, ... }:
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.fzf;
|
||||||
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
# FZF is a fuzzy-finder for the terminal
|
options.nmasur.presets.programs.fzf.enable = lib.mkEnableOption "Fzf fuzzy finder";
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
programs.fzf.enable = true;
|
programs.fzf.enable = true;
|
||||||
|
|
||||||
@ -52,5 +62,6 @@
|
|||||||
text = builtins.readFile ./bash/scripts/jqr.sh;
|
text = builtins.readFile ./bash/scripts/jqr.sh;
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
188
platforms/home-manager/modules/nmasur/presets/programs/git.nix
Normal file
188
platforms/home-manager/modules/nmasur/presets/programs/git.nix
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.git;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.git = {
|
||||||
|
enable = lib.mkEnableOption "";
|
||||||
|
gitName = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = "Name to use for git commits";
|
||||||
|
};
|
||||||
|
gitEmail = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = "Email to use for git commits";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
userName = config.gitName;
|
||||||
|
userEmail = config.gitEmail;
|
||||||
|
extraConfig = {
|
||||||
|
core.pager = "${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight | less -F";
|
||||||
|
interactive.difffilter = "${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight";
|
||||||
|
pager = {
|
||||||
|
branch = "false";
|
||||||
|
};
|
||||||
|
safe = {
|
||||||
|
directory = config.dotfilesPath;
|
||||||
|
};
|
||||||
|
pull = {
|
||||||
|
ff = "only";
|
||||||
|
};
|
||||||
|
push = {
|
||||||
|
autoSetupRemote = "true";
|
||||||
|
};
|
||||||
|
init = {
|
||||||
|
defaultBranch = "master";
|
||||||
|
};
|
||||||
|
rebase = {
|
||||||
|
autosquash = "true";
|
||||||
|
};
|
||||||
|
gpg = {
|
||||||
|
format = "ssh";
|
||||||
|
ssh.allowedSignersFile = "~/.config/git/allowed-signers";
|
||||||
|
};
|
||||||
|
# commit.gpgsign = true;
|
||||||
|
# tag.gpgsign = true;
|
||||||
|
};
|
||||||
|
ignores = [
|
||||||
|
".direnv/**"
|
||||||
|
"result"
|
||||||
|
];
|
||||||
|
includes = [
|
||||||
|
{
|
||||||
|
path = "~/.config/git/personal";
|
||||||
|
condition = "gitdir:~/dev/personal/";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Personal git config
|
||||||
|
# TODO: fix with variables
|
||||||
|
xdg.configFile."git/personal".text = ''
|
||||||
|
[user]
|
||||||
|
name = "${config.fullName}"
|
||||||
|
email = "7386960+nmasur@users.noreply.github.com"
|
||||||
|
signingkey = ~/.ssh/id_ed25519
|
||||||
|
[commit]
|
||||||
|
gpgsign = true
|
||||||
|
[tag]
|
||||||
|
gpgsign = true
|
||||||
|
'';
|
||||||
|
|
||||||
|
xdg.configFile."git/allowed-signers".text = ''
|
||||||
|
7386960+nmasur@users.noreply.github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s
|
||||||
|
'';
|
||||||
|
|
||||||
|
programs.fish.shellAbbrs = {
|
||||||
|
g = "git";
|
||||||
|
gs = "git status";
|
||||||
|
gd = "git diff";
|
||||||
|
gds = "git diff --staged";
|
||||||
|
gdp = "git diff HEAD^";
|
||||||
|
ga = "git add";
|
||||||
|
gaa = "git add -A";
|
||||||
|
gac = "git commit -am";
|
||||||
|
gc = "git commit -m";
|
||||||
|
gca = "git commit --amend --no-edit";
|
||||||
|
gcae = "git commit --amend";
|
||||||
|
gu = "git pull";
|
||||||
|
gp = "git push";
|
||||||
|
gl = "git log --graph --decorate --oneline -20";
|
||||||
|
gll = "git log --graph --decorate --oneline";
|
||||||
|
gco = "git checkout";
|
||||||
|
gcom = ''git switch (git symbolic-ref refs/remotes/origin/HEAD | cut -d"/" -f4)'';
|
||||||
|
gcob = "git switch -c";
|
||||||
|
gb = "git branch";
|
||||||
|
gpd = "git push origin -d";
|
||||||
|
gbd = "git branch -d";
|
||||||
|
gbD = "git branch -D";
|
||||||
|
gdd = {
|
||||||
|
position = "anywhere";
|
||||||
|
setCursor = true;
|
||||||
|
expansion = "BRANCH=% git push origin -d $BRANCH and git branch -d $BRANCH";
|
||||||
|
};
|
||||||
|
gr = "git reset";
|
||||||
|
grh = "git reset --hard";
|
||||||
|
gm = "git merge";
|
||||||
|
gcp = "git cherry-pick";
|
||||||
|
cdg = "cd (git rev-parse --show-toplevel)";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Required for fish commands
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
fish
|
||||||
|
fzf
|
||||||
|
bat
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.fish.functions = {
|
||||||
|
git = {
|
||||||
|
body = builtins.readFile ./fish/functions/git.fish;
|
||||||
|
};
|
||||||
|
git-add-fuzzy = {
|
||||||
|
body = builtins.readFile ./fish/functions/git-add-fuzzy.fish;
|
||||||
|
};
|
||||||
|
git-fuzzy-branch = {
|
||||||
|
argumentNames = "header";
|
||||||
|
body = builtins.readFile ./fish/functions/git-fuzzy-branch.fish;
|
||||||
|
};
|
||||||
|
git-checkout-fuzzy = {
|
||||||
|
body = ''
|
||||||
|
set branch (git-fuzzy-branch "checkout branch...")
|
||||||
|
and git checkout $branch
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
git-delete-fuzzy = {
|
||||||
|
body = ''
|
||||||
|
set branch (git-fuzzy-branch "delete branch...")
|
||||||
|
and git branch -d $branch
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
git-force-delete-fuzzy = {
|
||||||
|
body = ''
|
||||||
|
set branch (git-fuzzy-branch "force delete branch...")
|
||||||
|
and git branch -D $branch
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
git-delete-both = {
|
||||||
|
argumentNames = "branch";
|
||||||
|
body = ''
|
||||||
|
git push origin -d $branch
|
||||||
|
git branch -d $branch
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
git-merge-fuzzy = {
|
||||||
|
body = ''
|
||||||
|
set branch (git-fuzzy-branch "merge from...")
|
||||||
|
and git merge $branch
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
git-show-fuzzy = {
|
||||||
|
body = builtins.readFile ./fish/functions/git-show-fuzzy.fish;
|
||||||
|
};
|
||||||
|
git-commits = {
|
||||||
|
body = builtins.readFile ./fish/functions/git-commits.fish;
|
||||||
|
};
|
||||||
|
git-history = {
|
||||||
|
body = builtins.readFile ./fish/functions/git-history.fish;
|
||||||
|
};
|
||||||
|
uncommitted = {
|
||||||
|
description = "Find uncommitted git repos";
|
||||||
|
body = builtins.readFile ./fish/functions/uncommitted.fish;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -4,13 +4,18 @@
|
|||||||
lib,
|
lib,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.github;
|
||||||
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
unfreePackages = [ "gh-copilot" ];
|
options.nmasur.presets.programs.github.enable = lib.mkEnableOption "GitHub features";
|
||||||
|
|
||||||
home-manager.users.${config.user} = {
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
programs.gh = lib.mkIf config.home-manager.users.${config.user}.programs.git.enable {
|
programs.gh = {
|
||||||
enable = true;
|
enable = true;
|
||||||
gitCredentialHelper.enable = true;
|
gitCredentialHelper.enable = true;
|
||||||
settings.git_protocol = "https";
|
settings.git_protocol = "https";
|
||||||
@ -21,7 +26,7 @@
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.fish = lib.mkIf config.home-manager.users.${config.user}.programs.gh.enable {
|
programs.fish = {
|
||||||
shellAbbrs = {
|
shellAbbrs = {
|
||||||
ghr = "gh repo view -w";
|
ghr = "gh repo view -w";
|
||||||
gha = "gh run list | head -1 | awk '{ print \\$\\(NF-2\\) }' | xargs gh run view";
|
gha = "gh run list | head -1 | awk '{ print \\$\\(NF-2\\) }' | xargs gh run view";
|
||||||
@ -51,8 +56,6 @@
|
|||||||
t2) organization="take-two" ;;
|
t2) organization="take-two" ;;
|
||||||
d2c) organization="take-two-t2gp" ;;
|
d2c) organization="take-two-t2gp" ;;
|
||||||
t2gp) organization="take-two-t2gp" ;;
|
t2gp) organization="take-two-t2gp" ;;
|
||||||
pd) organization="private-division" ;;
|
|
||||||
dots) organization="playdots" ;;
|
|
||||||
*) organization="nmasur" ;;
|
*) organization="nmasur" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@ -85,5 +88,6 @@
|
|||||||
}
|
}
|
||||||
'')
|
'')
|
||||||
];
|
];
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.himalaya;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.himalaya.enable = lib.mkEnableOption "Himalaya email CLI";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
programs.himalaya = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
accounts.email.accounts.home.himalaya = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
downloads-dir = config.userDirs.download;
|
||||||
|
smtp-insecure = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fish.shellAbbrs = {
|
||||||
|
hi = "himalaya";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.jujutsu;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.jujutsu.enable = lib.mkEnableOption "Jujutsu version control";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# https://github.com/martinvonz/jj/blob/main/docs/config.md
|
||||||
|
settings = {
|
||||||
|
user = {
|
||||||
|
name = config.programs.git.userName;
|
||||||
|
email = config.programs.git.userEmail;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
155
platforms/home-manager/modules/nmasur/presets/programs/k9s.nix
Normal file
155
platforms/home-manager/modules/nmasur/presets/programs/k9s.nix
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.k9s;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.k9s.enable = lib.mkEnableOption "K9S Kubernetes TUI";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
programs.fish.shellAbbrs = {
|
||||||
|
ks = "k9s";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Terminal Kubernetes UI
|
||||||
|
programs.k9s = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
k9s = {
|
||||||
|
ui = {
|
||||||
|
enableMouse = true;
|
||||||
|
headless = true;
|
||||||
|
logoless = true;
|
||||||
|
crumbsless = false;
|
||||||
|
skin = "main";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
skins = {
|
||||||
|
main = {
|
||||||
|
k9s = {
|
||||||
|
body = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = "default";
|
||||||
|
logoColor = config.theme.colors.base02; # *blue ?
|
||||||
|
};
|
||||||
|
# Search bar
|
||||||
|
prompt = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = "default";
|
||||||
|
suggestColor = config.theme.colors.base03;
|
||||||
|
};
|
||||||
|
# Header left side
|
||||||
|
info = {
|
||||||
|
fgColor = config.theme.colors.base04;
|
||||||
|
sectionColor = config.theme.colors.base05;
|
||||||
|
};
|
||||||
|
dialog = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = "default";
|
||||||
|
buttonFgColor = config.theme.colors.base06;
|
||||||
|
buttonBgColor = config.theme.colors.base0E;
|
||||||
|
buttonFocusFgColor = config.theme.colors.base07;
|
||||||
|
buttonFocusBgColor = config.theme.colors.base02; # *cyan
|
||||||
|
labelFgColor = config.theme.colors.base09;
|
||||||
|
fieldFgColor = config.theme.colors.base06;
|
||||||
|
};
|
||||||
|
frame = {
|
||||||
|
border = {
|
||||||
|
fgColor = config.theme.colors.base01;
|
||||||
|
focusColor = config.theme.colors.base06;
|
||||||
|
};
|
||||||
|
menu = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
keyColor = config.theme.colors.base0E; # *magenta
|
||||||
|
numKeyColor = config.theme.colors.base0E; # *magenta
|
||||||
|
};
|
||||||
|
crumbs = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = config.theme.colors.base01;
|
||||||
|
activeColor = config.theme.colors.base03;
|
||||||
|
};
|
||||||
|
status = {
|
||||||
|
newColor = config.theme.colors.base04; # *cyan
|
||||||
|
modifyColor = config.theme.colors.base0D; # *blue
|
||||||
|
addColor = config.theme.colors.base0B; # *green
|
||||||
|
errorColor = config.theme.colors.base08; # *red
|
||||||
|
highlightColor = config.theme.colors.base09; # *orange
|
||||||
|
killColor = config.theme.colors.base03; # *comment
|
||||||
|
completedColor = config.theme.colors.base03; # *comment
|
||||||
|
};
|
||||||
|
title = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = "default";
|
||||||
|
highlightColor = config.theme.colors.base09; # *orange
|
||||||
|
counterColor = config.theme.colors.base0D; # *blue
|
||||||
|
filterColor = config.theme.colors.base0E; # *magenta
|
||||||
|
};
|
||||||
|
};
|
||||||
|
views = {
|
||||||
|
charts = {
|
||||||
|
bgColor = "default";
|
||||||
|
defaultDialColors = [
|
||||||
|
config.theme.colors.base0D
|
||||||
|
config.theme.colors.base08
|
||||||
|
];
|
||||||
|
# - *blue
|
||||||
|
# - *red
|
||||||
|
defaultChartColors = [
|
||||||
|
config.theme.colors.base0D
|
||||||
|
config.theme.colors.base08
|
||||||
|
];
|
||||||
|
# - *blue
|
||||||
|
# - *red
|
||||||
|
};
|
||||||
|
table = {
|
||||||
|
# List of resources
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = "default";
|
||||||
|
|
||||||
|
# Row selection
|
||||||
|
cursorFgColor = config.theme.colors.base07;
|
||||||
|
cursorBgColor = config.theme.colors.base01;
|
||||||
|
|
||||||
|
# Header row
|
||||||
|
header = {
|
||||||
|
fgColor = config.theme.colors.base0D;
|
||||||
|
bgColor = "default";
|
||||||
|
sorterColor = config.theme.colors.base0A; # *selection
|
||||||
|
};
|
||||||
|
};
|
||||||
|
xray = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = "default";
|
||||||
|
cursorColor = config.theme.colors.base06;
|
||||||
|
graphicColor = config.theme.colors.base0D;
|
||||||
|
showIcons = false;
|
||||||
|
};
|
||||||
|
yaml = {
|
||||||
|
keyColor = config.theme.colors.base0D;
|
||||||
|
colonColor = config.theme.colors.base04;
|
||||||
|
fgColor = config.theme.colors.base03;
|
||||||
|
};
|
||||||
|
logs = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = "default";
|
||||||
|
indicator = {
|
||||||
|
fgColor = config.theme.colors.base06;
|
||||||
|
bgColor = "default";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
104
platforms/home-manager/modules/nmasur/presets/programs/kitty.nix
Normal file
104
platforms/home-manager/modules/nmasur/presets/programs/kitty.nix
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.kitty;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.kitty.enable = lib.mkEnableOption "Kitty terminal";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
# Set the i3 terminal
|
||||||
|
xsession.windowManager.i3.config.terminal = lib.mkIf pkgs.stdenv.isLinux "kitty";
|
||||||
|
|
||||||
|
# Set the Rofi terminal for running programs
|
||||||
|
programs.rofi.terminal = lib.mkIf pkgs.stdenv.isLinux (lib.mkDefault "${pkgs.kitty}/bin/kitty");
|
||||||
|
|
||||||
|
# Display images in the terminal
|
||||||
|
programs.fish.interactiveShellInit = # fish
|
||||||
|
''
|
||||||
|
if test "$TERM" = "xterm-kitty"
|
||||||
|
alias icat="kitty +kitten icat"
|
||||||
|
alias ssh="kitty +kitten ssh"
|
||||||
|
end
|
||||||
|
'';
|
||||||
|
|
||||||
|
programs.kitty = {
|
||||||
|
enable = true;
|
||||||
|
environment = { };
|
||||||
|
extraConfig = "";
|
||||||
|
font.size = 14;
|
||||||
|
keybindings = {
|
||||||
|
# Use shift+enter to complete text suggestions in fish
|
||||||
|
"shift+enter" = "send_text all \\x1F";
|
||||||
|
|
||||||
|
# Easy fullscreen toggle (for macOS)
|
||||||
|
"super+f" = "toggle_fullscreen";
|
||||||
|
};
|
||||||
|
settings = {
|
||||||
|
|
||||||
|
# Colors (adapted from: https://github.com/kdrag0n/base16-kitty/blob/master/templates/default-256.mustache)
|
||||||
|
background = config.theme.colors.base00;
|
||||||
|
foreground = config.theme.colors.base05;
|
||||||
|
selection_background = config.theme.colors.base05;
|
||||||
|
selection_foreground = config.theme.colors.base00;
|
||||||
|
url_color = config.theme.colors.base04;
|
||||||
|
cursor = config.theme.colors.base05;
|
||||||
|
active_border_color = config.theme.colors.base03;
|
||||||
|
inactive_border_color = config.theme.colors.base01;
|
||||||
|
active_tab_background = config.theme.colors.base00;
|
||||||
|
active_tab_foreground = config.theme.colors.base05;
|
||||||
|
inactive_tab_background = config.theme.colors.base01;
|
||||||
|
inactive_tab_foreground = config.theme.colors.base04;
|
||||||
|
tab_bar_background = config.theme.colors.base01;
|
||||||
|
|
||||||
|
# normal
|
||||||
|
color0 = config.theme.colors.base00;
|
||||||
|
color1 = config.theme.colors.base08;
|
||||||
|
color2 = config.theme.colors.base0B;
|
||||||
|
color3 = config.theme.colors.base0A;
|
||||||
|
color4 = config.theme.colors.base0D;
|
||||||
|
color5 = config.theme.colors.base0E;
|
||||||
|
color6 = config.theme.colors.base0C;
|
||||||
|
color7 = config.theme.colors.base05;
|
||||||
|
|
||||||
|
# bright
|
||||||
|
color8 = config.theme.colors.base03;
|
||||||
|
color9 = config.theme.colors.base08;
|
||||||
|
color10 = config.theme.colors.base0B;
|
||||||
|
color11 = config.theme.colors.base0A;
|
||||||
|
color12 = config.theme.colors.base0D;
|
||||||
|
color13 = config.theme.colors.base0E;
|
||||||
|
color14 = config.theme.colors.base0C;
|
||||||
|
color15 = config.theme.colors.base07;
|
||||||
|
|
||||||
|
# extended base16 colors
|
||||||
|
color16 = config.theme.colors.base09;
|
||||||
|
color17 = config.theme.colors.base0F;
|
||||||
|
color18 = config.theme.colors.base01;
|
||||||
|
color19 = config.theme.colors.base02;
|
||||||
|
color20 = config.theme.colors.base04;
|
||||||
|
color21 = config.theme.colors.base06;
|
||||||
|
|
||||||
|
# Scrollback
|
||||||
|
scrollback_lines = 10000;
|
||||||
|
scrollback_pager_history_size = 300; # MB
|
||||||
|
|
||||||
|
# Window
|
||||||
|
window_padding_width = 6;
|
||||||
|
|
||||||
|
tab_bar_edge = "top";
|
||||||
|
tab_bar_style = "slant";
|
||||||
|
|
||||||
|
# Disable audio
|
||||||
|
enable_audio_bell = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.kubectl;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.kubectl.enable = lib.mkEnableOption "Kubernetes CLI tools";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
kubectl # Basic Kubernetes queries
|
||||||
|
kubernetes-helm # Helm CLI
|
||||||
|
fluxcd # Bootstrap clusters with Flux
|
||||||
|
kustomize # Kustomize CLI (for Flux)
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.fish.shellAbbrs = {
|
||||||
|
k = "kubectl";
|
||||||
|
pods = "kubectl get pods -A";
|
||||||
|
nodes = "kubectl get nodes";
|
||||||
|
deploys = "kubectl get deployments -A";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.alacritty;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.alacritty.enable = lib.mkEnableOption "Alacritty terminal";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# Video player
|
||||||
|
programs.mpv = {
|
||||||
|
enable = true;
|
||||||
|
bindings = { };
|
||||||
|
config = {
|
||||||
|
image-display-duration = 2; # For cycling through images
|
||||||
|
hwdec = "auto-safe"; # Attempt to use GPU decoding for video
|
||||||
|
};
|
||||||
|
scripts = [
|
||||||
|
|
||||||
|
# Automatically load playlist entries before and after current file
|
||||||
|
pkgs.mpvScripts.autoload
|
||||||
|
|
||||||
|
# Delete current file after quitting
|
||||||
|
pkgs.mpvScripts.mpv-delete-file
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.msmtp;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.msmtp.enable = lib.mkEnableOption "System outgoing mail";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.msmtp.enable = true;
|
||||||
|
|
||||||
|
# The system user for sending automatic notifications
|
||||||
|
accounts.email.accounts.system =
|
||||||
|
let
|
||||||
|
address = "system@${config.mail.server}";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
userName = address;
|
||||||
|
realName = "NixOS System";
|
||||||
|
primary = !config.mail.enable; # Only primary if mail not enabled
|
||||||
|
inherit address;
|
||||||
|
passwordCommand = "${pkgs.age}/bin/age --decrypt --identity ${config.identityFile} ${pkgs.writeText "mailpass-system.age" (builtins.readFile ../../../private/mailpass-system.age)}";
|
||||||
|
msmtp.enable = true;
|
||||||
|
smtp = {
|
||||||
|
host = config.mail.smtpHost;
|
||||||
|
port = 465;
|
||||||
|
tls.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.nautilus;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.nautilus.enable =
|
||||||
|
lib.mkEnableOption "Nautilus file manager for Linux";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
# Quick button for launching nautilus
|
||||||
|
xsession.windowManager.i3.config.keybindings = {
|
||||||
|
"${config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier}+n" =
|
||||||
|
"exec --no-startup-id ${pkgs.nautilus}/bin/nautilus";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Generates a QR code and previews it with sushi
|
||||||
|
programs.fish.functions = {
|
||||||
|
qr = {
|
||||||
|
body = "${pkgs.qrencode}/bin/qrencode $argv[1] -o /tmp/qr.png | ${pkgs.sushi}/bin/sushi /tmp/qr.png";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Set Nautilus as default for opening directories
|
||||||
|
xdg.mimeApps = {
|
||||||
|
associations.added."inode/directory" = [ "org.gnome.Nautilus.desktop" ];
|
||||||
|
defaultApplications."inode/directory" = lib.mkBefore [ "org.gnome.Nautilus.desktop" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -4,9 +4,19 @@
|
|||||||
lib,
|
lib,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.nixpkgs-darwin;
|
||||||
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
|
options.nmasur.presets.programs.nixpkgs-darwin.enable = lib.mkEnableOption {
|
||||||
|
description = "Nixpkgs tools for macOS";
|
||||||
|
default = config.nmasur.presets.programs.nixpkgs && pkgs.stdenv.isDarwin;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf (cfg.enable) {
|
||||||
|
|
||||||
programs.fish = {
|
programs.fish = {
|
||||||
shellAbbrs = {
|
shellAbbrs = {
|
||||||
@ -38,5 +48,6 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -4,8 +4,16 @@
|
|||||||
lib,
|
lib,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.nixpkgs;
|
||||||
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
home-manager.users.${config.user} = {
|
|
||||||
|
options.nmasur.presets.programs.nixpkgs.enable = lib.mkEnableOption "Nixpkgs presets";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
programs.fish = {
|
programs.fish = {
|
||||||
shellAbbrs = {
|
shellAbbrs = {
|
||||||
@ -78,8 +86,8 @@
|
|||||||
let
|
let
|
||||||
cacheDir = "${config.homePath}/.cache/nix-index";
|
cacheDir = "${config.homePath}/.cache/nix-index";
|
||||||
in
|
in
|
||||||
lib.mkIf config.home-manager.users.${config.user}.programs.nix-index.enable (
|
lib.mkIf config.programs.nix-index.enable (
|
||||||
config.home-manager.users.${config.user}.lib.dag.entryAfter [ "writeBoundary" ] ''
|
config.lib.dag.entryAfter [ "writeBoundary" ] ''
|
||||||
if [ ! -d ${cacheDir} ]; then
|
if [ ! -d ${cacheDir} ]; then
|
||||||
$DRY_RUN_CMD ${pkgs.nix-index}/bin/nix-index -f ${pkgs.path}
|
$DRY_RUN_CMD ${pkgs.nix-index}/bin/nix-index -f ${pkgs.path}
|
||||||
fi
|
fi
|
||||||
@ -100,8 +108,8 @@
|
|||||||
|
|
||||||
# For security, only allow specific users
|
# For security, only allow specific users
|
||||||
settings.allowed-users = [
|
settings.allowed-users = [
|
||||||
"@wheel"
|
"@wheel" # Anyone in the wheel group
|
||||||
config.user
|
config.user # The current user
|
||||||
];
|
];
|
||||||
|
|
||||||
# Enable features in Nix commands
|
# Enable features in Nix commands
|
||||||
@ -129,5 +137,6 @@
|
|||||||
# Not working with macOS: https://github.com/NixOS/nix/issues/7273
|
# Not working with macOS: https://github.com/NixOS/nix/issues/7273
|
||||||
auto-optimise-store = lib.mkIf (!pkgs.stdenv.isDarwin) true;
|
auto-optimise-store = lib.mkIf (!pkgs.stdenv.isDarwin) true;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.noti;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.noti.enable = lib.mkEnableOption "Noti CLI notifications";
|
||||||
|
|
||||||
|
config = lib.mkIf (cfg.enable && (pkgs.stdenv.isDarwin || config.services.dunst.enable)) {
|
||||||
|
home.packages = [ pkgs.noti ];
|
||||||
|
programs.fish.shellAbbrs = {
|
||||||
|
# Add noti for ghpr in Darwin
|
||||||
|
ghpr = lib.mkForce "gh pr create && sleep 3 && noti gh run watch";
|
||||||
|
grw = lib.mkForce "noti gh run watch";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.nsxiv;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.nsxiv.enable = lib.mkEnableOption "Neo Simple X Image Viewer";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
nsxiv # Image viewer
|
||||||
|
];
|
||||||
|
|
||||||
|
# Set default program for opening images
|
||||||
|
xdg.mimeApps = {
|
||||||
|
associations.added = {
|
||||||
|
"image/jpeg" = [ "nsxiv.desktop" ];
|
||||||
|
"image/png" = [ "nsxiv.desktop" ];
|
||||||
|
"image/*" = [ "nsxiv.desktop" ];
|
||||||
|
};
|
||||||
|
defaultApplications = {
|
||||||
|
"image/jpeg" = [ "nsxiv.desktop" ];
|
||||||
|
"image/png" = [ "nsxiv.desktop" ];
|
||||||
|
"image/*" = [ "nsxiv.desktop" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.prettyping;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.prettyping.enable =
|
||||||
|
lib.mkEnableOption "Prettyping server ping tool";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.fish.functions = {
|
||||||
|
ping = {
|
||||||
|
description = "Improved ping";
|
||||||
|
argumentNames = "target";
|
||||||
|
body = "${pkgs.prettyping}/bin/prettyping --nolegend $target";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.ripgrep;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.ripgrep = {
|
||||||
|
enable = lib.mkEnableOption "Ripgrep search tool";
|
||||||
|
ignorePatterns = ''
|
||||||
|
!.env*
|
||||||
|
!.github/
|
||||||
|
!.gitignore
|
||||||
|
!*.tfvars
|
||||||
|
.terraform/
|
||||||
|
.target/
|
||||||
|
/Library/'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = [ pkgs.ripgrep ];
|
||||||
|
|
||||||
|
home.file = {
|
||||||
|
".rgignore".text = cfg.ignorePatterns;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
175
platforms/home-manager/modules/nmasur/presets/programs/rofi.nix
Normal file
175
platforms/home-manager/modules/nmasur/presets/programs/rofi.nix
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.rofi;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.rofi.enable = lib.mkEnableOption "Rofi quick launcher";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
jq # Required for rofi-systemd
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.rofi = {
|
||||||
|
enable = true;
|
||||||
|
cycle = true;
|
||||||
|
location = "center";
|
||||||
|
pass = { };
|
||||||
|
terminal = lib.mkIf pkgs.stdenv.isLinux config.terminal;
|
||||||
|
plugins = [
|
||||||
|
pkgs.rofi-calc
|
||||||
|
pkgs.rofi-emoji
|
||||||
|
pkgs.rofi-systemd
|
||||||
|
];
|
||||||
|
theme =
|
||||||
|
let
|
||||||
|
inherit (config.lib.formats.rasi) mkLiteral;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
# Inspired by https://github.com/sherubthakur/dotfiles/blob/master/users/modules/desktop-environment/rofi/launcher.rasi
|
||||||
|
|
||||||
|
"*" = {
|
||||||
|
background-color = mkLiteral config.theme.colors.base00;
|
||||||
|
foreground-color = mkLiteral config.theme.colors.base07;
|
||||||
|
text-color = mkLiteral config.theme.colors.base07;
|
||||||
|
border-color = mkLiteral config.theme.colors.base04;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Holds the entire window
|
||||||
|
"#window" = {
|
||||||
|
transparency = "real";
|
||||||
|
background-color = mkLiteral config.theme.colors.base00;
|
||||||
|
text-color = mkLiteral config.theme.colors.base07;
|
||||||
|
border = mkLiteral "4px";
|
||||||
|
border-color = mkLiteral config.theme.colors.base04;
|
||||||
|
border-radius = mkLiteral "4px";
|
||||||
|
width = mkLiteral "850px";
|
||||||
|
padding = mkLiteral "15px";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Wrapper around bar and results
|
||||||
|
"#mainbox" = {
|
||||||
|
background-color = mkLiteral config.theme.colors.base00;
|
||||||
|
border = mkLiteral "0px";
|
||||||
|
border-radius = mkLiteral "0px";
|
||||||
|
border-color = mkLiteral config.theme.colors.base04;
|
||||||
|
children = map mkLiteral [
|
||||||
|
"inputbar"
|
||||||
|
"message"
|
||||||
|
"listview"
|
||||||
|
];
|
||||||
|
spacing = mkLiteral "10px";
|
||||||
|
padding = mkLiteral "10px";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Unknown
|
||||||
|
"#textbox-prompt-colon" = {
|
||||||
|
expand = false;
|
||||||
|
str = ":";
|
||||||
|
margin = mkLiteral "0px 0.3em 0em 0em";
|
||||||
|
text-color = mkLiteral config.theme.colors.base07;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Command prompt left of the input
|
||||||
|
"#prompt" = {
|
||||||
|
enabled = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Actual text box
|
||||||
|
"#entry" = {
|
||||||
|
placeholder-color = mkLiteral config.theme.colors.base03;
|
||||||
|
expand = true;
|
||||||
|
horizontal-align = "0";
|
||||||
|
placeholder = "";
|
||||||
|
padding = mkLiteral "0px 0px 0px 5px";
|
||||||
|
blink = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Top bar
|
||||||
|
"#inputbar" = {
|
||||||
|
children = map mkLiteral [
|
||||||
|
"prompt"
|
||||||
|
"entry"
|
||||||
|
];
|
||||||
|
border = mkLiteral "1px";
|
||||||
|
border-radius = mkLiteral "4px";
|
||||||
|
padding = mkLiteral "6px";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Results
|
||||||
|
"#listview" = {
|
||||||
|
background-color = mkLiteral config.theme.colors.base00;
|
||||||
|
padding = mkLiteral "0px";
|
||||||
|
columns = 1;
|
||||||
|
lines = 12;
|
||||||
|
spacing = "5px";
|
||||||
|
cycle = true;
|
||||||
|
dynamic = true;
|
||||||
|
layout = "vertical";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Each result
|
||||||
|
"#element" = {
|
||||||
|
orientation = "vertical";
|
||||||
|
border-radius = mkLiteral "0px";
|
||||||
|
padding = mkLiteral "5px 0px 5px 5px";
|
||||||
|
};
|
||||||
|
"#element.selected" = {
|
||||||
|
border = mkLiteral "1px";
|
||||||
|
border-radius = mkLiteral "4px";
|
||||||
|
border-color = mkLiteral config.theme.colors.base07;
|
||||||
|
background-color = mkLiteral config.theme.colors.base04;
|
||||||
|
text-color = mkLiteral config.theme.colors.base00;
|
||||||
|
};
|
||||||
|
|
||||||
|
"#element-text" = {
|
||||||
|
expand = true;
|
||||||
|
# horizontal-align = mkLiteral "0.5";
|
||||||
|
vertical-align = mkLiteral "0.5";
|
||||||
|
margin = mkLiteral "0px 2.5px 0px 2.5px";
|
||||||
|
};
|
||||||
|
"#element-text.selected" = {
|
||||||
|
background-color = mkLiteral config.theme.colors.base04;
|
||||||
|
text-color = mkLiteral config.theme.colors.base00;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Not sure how to get icons
|
||||||
|
"#element-icon" = {
|
||||||
|
size = mkLiteral "18px";
|
||||||
|
border = mkLiteral "0px";
|
||||||
|
padding = mkLiteral "2px 5px 2px 2px";
|
||||||
|
background-color = mkLiteral config.theme.colors.base00;
|
||||||
|
};
|
||||||
|
"#element-icon.selected" = {
|
||||||
|
background-color = mkLiteral config.theme.colors.base04;
|
||||||
|
text-color = mkLiteral config.theme.colors.base00;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
xoffset = 0;
|
||||||
|
yoffset = -20;
|
||||||
|
extraConfig = {
|
||||||
|
show-icons = true;
|
||||||
|
kb-cancel = "Escape,Super+space";
|
||||||
|
modi = "window,run,ssh,emoji,calc,systemd";
|
||||||
|
sort = true;
|
||||||
|
# levenshtein-sort = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file.".local/share/rofi/themes" = {
|
||||||
|
recursive = true;
|
||||||
|
source = ./rofi/themes;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -4,9 +4,16 @@
|
|||||||
lib,
|
lib,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.starship;
|
||||||
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
home-manager.users.${config.user}.programs.starship = {
|
options.nmasur.presets.programs.starship.enable = lib.mkEnableOption "Starship shell prompt";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
add_newline = false; # Don't print new line at the start of the prompt
|
add_newline = false; # Don't print new line at the start of the prompt
|
||||||
@ -68,5 +75,6 @@
|
|||||||
format = "[\${version}\\(\${virtualenv}\\)]($style)";
|
format = "[\${version}\\(\${virtualenv}\\)]($style)";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.weather;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.weather.enable = lib.mkEnableOption "Weather CLI tools";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# Used in abbreviations and aliases
|
||||||
|
home.packages = [ pkgs.curl ];
|
||||||
|
programs.fish.shellAbbrs = {
|
||||||
|
|
||||||
|
weather = "curl wttr.in/$WEATHER_CITY";
|
||||||
|
moon = "curl wttr.in/Moon";
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,267 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.wezterm;
|
||||||
|
font = config.programs.kitty.font.name;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.wezterm.enable = lib.mkEnableOption "WezTerm terminal";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# Set the i3 terminal
|
||||||
|
xsession.windowManager.i3.config.terminal = lib.mkIf pkgs.stdenv.isLinux "wezterm";
|
||||||
|
|
||||||
|
# Display images in the terminal
|
||||||
|
programs.fish.shellAliases = {
|
||||||
|
icat = lib.mkForce "wezterm imgcat";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.wezterm = {
|
||||||
|
enable = true;
|
||||||
|
colorSchemes = {
|
||||||
|
myTheme = {
|
||||||
|
background = config.theme.colors.base00;
|
||||||
|
foreground = config.theme.colors.base05;
|
||||||
|
cursor_bg = config.theme.colors.base05;
|
||||||
|
cursor_fg = config.theme.colors.base00;
|
||||||
|
cursor_border = config.theme.colors.base05;
|
||||||
|
selection_bg = config.theme.colors.base05;
|
||||||
|
selection_fg = config.theme.colors.base00;
|
||||||
|
scrollbar_thumb = config.theme.colors.base03;
|
||||||
|
ansi = [
|
||||||
|
config.theme.colors.base01 # black
|
||||||
|
config.theme.colors.base0F # maroon
|
||||||
|
config.theme.colors.base0B # green
|
||||||
|
config.theme.colors.base0A # olive
|
||||||
|
config.theme.colors.base0D # navy
|
||||||
|
config.theme.colors.base0E # purple
|
||||||
|
config.theme.colors.base0C # teal
|
||||||
|
config.theme.colors.base06 # silver
|
||||||
|
];
|
||||||
|
brights = [
|
||||||
|
config.theme.colors.base03 # grey
|
||||||
|
config.theme.colors.base08 # red
|
||||||
|
config.theme.colors.base0B # lime
|
||||||
|
config.theme.colors.base0A # yellow
|
||||||
|
config.theme.colors.base0D # blue
|
||||||
|
config.theme.colors.base0E # fuchsia
|
||||||
|
config.theme.colors.base0C # aqua
|
||||||
|
config.theme.colors.base07 # white
|
||||||
|
];
|
||||||
|
compose_cursor = config.theme.colors.base09; # orange
|
||||||
|
copy_mode_active_highlight_bg = {
|
||||||
|
Color = config.theme.colors.base03;
|
||||||
|
};
|
||||||
|
copy_mode_active_highlight_fg = {
|
||||||
|
Color = config.theme.colors.base07;
|
||||||
|
};
|
||||||
|
copy_mode_inactive_highlight_bg = {
|
||||||
|
Color = config.theme.colors.base02;
|
||||||
|
};
|
||||||
|
copy_mode_inactive_highlight_fg = {
|
||||||
|
Color = config.theme.colors.base06;
|
||||||
|
};
|
||||||
|
quick_select_label_bg = {
|
||||||
|
Color = config.theme.colors.base02;
|
||||||
|
};
|
||||||
|
quick_select_label_fg = {
|
||||||
|
Color = config.theme.colors.base06;
|
||||||
|
};
|
||||||
|
quick_select_match_bg = {
|
||||||
|
Color = config.theme.colors.base03;
|
||||||
|
};
|
||||||
|
quick_select_match_fg = {
|
||||||
|
Color = config.theme.colors.base07;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
local wezterm = require("wezterm")
|
||||||
|
local config = wezterm.config_builder()
|
||||||
|
config.check_for_updates = false
|
||||||
|
config.color_scheme = "myTheme"
|
||||||
|
|
||||||
|
-- Scrollback
|
||||||
|
config.scrollback_lines = 10000
|
||||||
|
|
||||||
|
-- Window
|
||||||
|
config.window_padding = {
|
||||||
|
left = 10,
|
||||||
|
right = 10,
|
||||||
|
top = 10,
|
||||||
|
bottom = 12,
|
||||||
|
}
|
||||||
|
|
||||||
|
config.font = wezterm.font('${font}', { weight = 'Bold'})
|
||||||
|
config.font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"}
|
||||||
|
|
||||||
|
-- Fix color blocks instead of text
|
||||||
|
config.front_end = "WebGpu"
|
||||||
|
|
||||||
|
-- Tab Bar
|
||||||
|
config.hide_tab_bar_if_only_one_tab = true
|
||||||
|
config.window_frame = {
|
||||||
|
font = wezterm.font('${font}', { weight = 'Bold'}),
|
||||||
|
font_size = ${if pkgs.stdenv.isLinux then "12.0" else "16.0"},
|
||||||
|
}
|
||||||
|
|
||||||
|
config.colors = {
|
||||||
|
tab_bar = {
|
||||||
|
active_tab = {
|
||||||
|
bg_color = '${config.theme.colors.base00}',
|
||||||
|
fg_color = '${config.theme.colors.base04}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Disable audio
|
||||||
|
config.audible_bell = "Disabled"
|
||||||
|
|
||||||
|
config.initial_rows = 80
|
||||||
|
config.initial_cols = 200
|
||||||
|
|
||||||
|
config.unix_domains = {
|
||||||
|
{
|
||||||
|
name = 'unix',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- This causes `wezterm` to act as though it was started as
|
||||||
|
-- `wezterm connect unix` by default, connecting to the unix
|
||||||
|
-- domain on startup.
|
||||||
|
-- If you prefer to connect manually, leave out this line.
|
||||||
|
config.default_gui_startup_args = { 'connect', 'unix' }
|
||||||
|
|
||||||
|
config.leader = {
|
||||||
|
key = 'a',
|
||||||
|
mods = 'CTRL',
|
||||||
|
timeout_milliseconds = 2000,
|
||||||
|
}
|
||||||
|
|
||||||
|
config.keys = {
|
||||||
|
-- Attach to muxer
|
||||||
|
{
|
||||||
|
key = 'a',
|
||||||
|
mods = 'LEADER',
|
||||||
|
action = wezterm.action.AttachDomain 'unix',
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Detach from muxer
|
||||||
|
{
|
||||||
|
key = 'd',
|
||||||
|
mods = 'LEADER',
|
||||||
|
action = wezterm.action.DetachDomain { DomainName = 'unix' },
|
||||||
|
},
|
||||||
|
-- sends completion string for fish autosuggestions
|
||||||
|
{
|
||||||
|
key = 'Enter',
|
||||||
|
mods = 'SHIFT',
|
||||||
|
action = wezterm.action.SendString '\x1F'
|
||||||
|
},
|
||||||
|
-- ctrl-shift-h was "hide"
|
||||||
|
{
|
||||||
|
key = 'H',
|
||||||
|
mods = 'SHIFT|CTRL',
|
||||||
|
action = wezterm.action.DisableDefaultAssignment
|
||||||
|
},
|
||||||
|
-- alt-enter was "fullscreen"
|
||||||
|
{
|
||||||
|
key = 'Enter',
|
||||||
|
mods = 'ALT',
|
||||||
|
action = wezterm.action.DisableDefaultAssignment
|
||||||
|
},
|
||||||
|
-- make super-f "fullscreen"
|
||||||
|
{
|
||||||
|
key = 'f',
|
||||||
|
mods = 'SUPER',
|
||||||
|
action = wezterm.action.ToggleFullScreen
|
||||||
|
},
|
||||||
|
-- super-t open new tab in new dir
|
||||||
|
{
|
||||||
|
key = 't',
|
||||||
|
mods = ${if pkgs.stdenv.isDarwin then "'SUPER'" else "'ALT'"},
|
||||||
|
action = wezterm.action.SpawnCommandInNewTab {
|
||||||
|
cwd = wezterm.home_dir,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- shift-super-t open new tab in same dir
|
||||||
|
{
|
||||||
|
key = 't',
|
||||||
|
mods = 'SUPER|SHIFT',
|
||||||
|
action = wezterm.action.SpawnTab 'CurrentPaneDomain'
|
||||||
|
},
|
||||||
|
-- project switcher
|
||||||
|
{
|
||||||
|
key = 'P',
|
||||||
|
mods = 'SUPER',
|
||||||
|
action = wezterm.action_callback(function(window, pane)
|
||||||
|
local choices = {}
|
||||||
|
|
||||||
|
wezterm.log_info "working?"
|
||||||
|
|
||||||
|
function scandir(directory)
|
||||||
|
local i, t, popen = 0, {}, io.popen
|
||||||
|
local pfile = popen('${pkgs.fd}/bin/fd --search-path "'..directory..'" --type directory --exact-depth 2 | ${pkgs.proximity-sort}/bin/proximity-sort "'..os.getenv("HOME").."/dev/work"..'"')
|
||||||
|
for filename in pfile:lines() do
|
||||||
|
i = i + 1
|
||||||
|
t[i] = filename
|
||||||
|
end
|
||||||
|
pfile:close()
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, v in pairs(scandir(os.getenv("HOME").."/dev")) do
|
||||||
|
table.insert(choices, { label = v })
|
||||||
|
end
|
||||||
|
|
||||||
|
window:perform_action(
|
||||||
|
wezterm.action.InputSelector {
|
||||||
|
action = wezterm.action_callback(function(window, pane, id, label)
|
||||||
|
if not id and not label then
|
||||||
|
wezterm.log_info "cancelled"
|
||||||
|
else
|
||||||
|
window:perform_action(
|
||||||
|
wezterm.action.SpawnCommandInNewTab {
|
||||||
|
cwd = label,
|
||||||
|
},
|
||||||
|
pane
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end),
|
||||||
|
fuzzy = true,
|
||||||
|
title = "Select Project",
|
||||||
|
choices = choices,
|
||||||
|
},
|
||||||
|
pane
|
||||||
|
)
|
||||||
|
end),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- print the workspace name at the upper right
|
||||||
|
wezterm.on("update-right-status", function(window, pane)
|
||||||
|
window:set_right_status(window:active_workspace())
|
||||||
|
end)
|
||||||
|
-- load plugin
|
||||||
|
local workspace_switcher = wezterm.plugin.require("https://github.com/MLFlexer/smart_workspace_switcher.wezterm")
|
||||||
|
-- set path to zoxide
|
||||||
|
workspace_switcher.zoxide_path = "${pkgs.zoxide}/bin/zoxide"
|
||||||
|
-- keymaps
|
||||||
|
table.insert(config.keys, { key = "s", mods = "CTRL|SHIFT", action = workspace_switcher.switch_workspace() })
|
||||||
|
-- table.insert(config.keys, { key = "t", mods = "CTRL|SHIFT", action = wezterm.action.ShowLauncherArgs({ flags = "FUZZY|WORKSPACES" }) })
|
||||||
|
table.insert(config.keys, { key = "[", mods = "CTRL|SHIFT", action = wezterm.action.SwitchWorkspaceRelative(1) })
|
||||||
|
table.insert(config.keys, { key = "]", mods = "CTRL|SHIFT", action = wezterm.action.SwitchWorkspaceRelative(-1) })
|
||||||
|
|
||||||
|
return config
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.xclip;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.xclip.enable = lib.mkEnableOption "xclip keyboard";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
home.packages = [ pkgs.xclip ];
|
||||||
|
|
||||||
|
programs.fish.shellAliases = {
|
||||||
|
pbcopy = "xclip -selection clipboard -in";
|
||||||
|
pbpaste = "xclip -selection clipboard -out";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.yt-dlp;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.yt-dlp.enable = lib.mkEnableOption "yt-dlp media downloader";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.yt-dlp = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = "";
|
||||||
|
settings = {
|
||||||
|
no-continue = true; # Always re-download each fragment
|
||||||
|
no-overwrites = true; # Don't overwrite existing files
|
||||||
|
download-archive = "archive.log"; # Log of archives
|
||||||
|
embed-metadata = true;
|
||||||
|
embed-thumbnail = true;
|
||||||
|
embed-subs = true;
|
||||||
|
sub-langs = "en.*";
|
||||||
|
concurrent-fragments = 4; # Parallel download chunks
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fish.shellAbbrs.yt = "yt-dlp";
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nmasur.presets.programs.zathura;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
options.nmasur.presets.programs.zathura.enable = lib.mkEnableOption "Zathura PDF viewer";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
zathura # PDF viewer
|
||||||
|
];
|
||||||
|
# Set default program for opening PDFs
|
||||||
|
xdg.mimeApps = {
|
||||||
|
associations.added = {
|
||||||
|
"application/pdf" = [ "pwmt.zathura-cb.desktop" ];
|
||||||
|
};
|
||||||
|
associations.removed = {
|
||||||
|
"application/pdf" = [
|
||||||
|
"mupdf.desktop"
|
||||||
|
"wine-extension-pdf.desktop"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
defaultApplications = {
|
||||||
|
"application/pdf" = [ "pwmt.zathura-cb.desktop" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user