diff --git a/modules/common/neovim/config/misc.nix b/modules/common/neovim/config/misc.nix index 2319c00..906016b 100644 --- a/modules/common/neovim/config/misc.nix +++ b/modules/common/neovim/config/misc.nix @@ -10,6 +10,7 @@ pkgs.vimPlugins.which-key-nvim # Keybind helper ]; + # Initialize some plugins setup.Comment = { }; setup.colorizer = { }; setup.glow = { }; diff --git a/modules/common/neovim/config/telescope.nix b/modules/common/neovim/config/telescope.nix index 1bd5b5c..01c29a4 100644 --- a/modules/common/neovim/config/telescope.nix +++ b/modules/common/neovim/config/telescope.nix @@ -1,5 +1,7 @@ { pkgs, dsl, ... }: { + # Telescope is a fuzzy finder that can work with different sub-plugins + plugins = [ pkgs.vimPlugins.telescope-nvim pkgs.vimPlugins.project-nvim diff --git a/modules/common/neovim/config/toggleterm.lua b/modules/common/neovim/config/toggleterm.lua index 7499132..2e9c6cb 100644 --- a/modules/common/neovim/config/toggleterm.lua +++ b/modules/common/neovim/config/toggleterm.lua @@ -12,6 +12,8 @@ vim.api.nvim_create_autocmd("TermOpen", { end, }) +-- These are all the different types of terminals we can trigger + local terminal = require("toggleterm.terminal").Terminal local basicterminal = terminal:new() diff --git a/modules/common/neovim/config/toggleterm.nix b/modules/common/neovim/config/toggleterm.nix index ee67302..8dac46f 100644 --- a/modules/common/neovim/config/toggleterm.nix +++ b/modules/common/neovim/config/toggleterm.nix @@ -1,5 +1,7 @@ { pkgs, dsl, ... }: { + # Toggleterm provides a floating terminal inside the editor for quick access + plugins = [ pkgs.vimPlugins.toggleterm-nvim ]; use.toggleterm.setup = dsl.callWith { diff --git a/modules/common/neovim/config/tree.nix b/modules/common/neovim/config/tree.nix index 60825c6..4a625d1 100644 --- a/modules/common/neovim/config/tree.nix +++ b/modules/common/neovim/config/tree.nix @@ -1,5 +1,7 @@ { pkgs, dsl, ... }: { + # This plugin creates a side drawer for navigating the current project + plugins = [ pkgs.vimPlugins.nvim-tree-lua pkgs.vimPlugins.nvim-web-devicons ]; # Disable netrw eagerly @@ -10,16 +12,16 @@ }; setup.nvim-tree = { - disable_netrw = true; - hijack_netrw = true; - sync_root_with_cwd = true; - respect_buf_cwd = true; - update_focused_file = { + disable_netrw = true; # Disable the built-in file manager + hijack_netrw = true; # Works as the file manager + sync_root_with_cwd = true; # Change project whenever currend dir changes + respect_buf_cwd = true; # Change to exact location of focused buffer + update_focused_file = { # Change project based on the focused buffer enable = true; update_root = true; ignore_list = { }; }; - diagnostics = { + diagnostics = { # Enable LSP and linter integration enable = true; icons = { hint = ""; @@ -28,7 +30,7 @@ error = ""; }; }; - renderer = { + renderer = { # Show files with changes vs. current commit icons = { glyphs = { git = { @@ -43,6 +45,7 @@ }; }; }; + # Set keybinds and initialize program on_attach = dsl.rawLua '' function (bufnr) local api = require('nvim-tree.api') @@ -58,7 +61,7 @@ vim.keymap.set('n', 'v', api.node.open.vertical, opts('Open: Vertical Split')) end ''; - view = { + view = { # Set look and feel width = 30; hide_root_folder = false; side = "left"; @@ -67,6 +70,7 @@ }; }; + # Toggle the sidebar lua = '' vim.keymap.set("n", "e", ":NvimTreeFindFileToggle", { silent = true }) ''; diff --git a/modules/common/neovim/default.nix b/modules/common/neovim/default.nix index 8a7a9f7..8051c04 100644 --- a/modules/common/neovim/default.nix +++ b/modules/common/neovim/default.nix @@ -18,11 +18,16 @@ in { home.packages = [ neovim ]; + # Use Neovim as the editor for git commit messages programs.git.extraConfig.core.editor = "nvim"; + + # Set Neovim as the default app for text editing and manual pages home.sessionVariables = { EDITOR = "nvim"; MANPAGER = "nvim +Man!"; }; + + # Create quick aliases for launching Neovim programs.fish = { shellAliases = { vim = "nvim"; }; shellAbbrs = { @@ -31,12 +36,20 @@ in { vll = "nvim -c 'Telescope oldfiles'"; }; }; + + # Set Neovim as the kitty terminal "scrollback" (vi mode) option. + # Requires removing some of the ANSI escape codes that are sent to the + # scrollback using sed and baleia, as well as removing several + # unnecessary features. programs.kitty.settings.scrollback_pager = '' $SHELL -c 'sed -r "s/[[:cntrl:]]\]133;[AC]..//g" | ${neovim}/bin/nvim -c "setlocal nonumber norelativenumber nolist laststatus=0" -c "lua baleia = require(\"baleia\").setup({}); baleia.once(0)" -c "map q :qa!" -c "autocmd VimEnter * normal G"' ''; + # Create a desktop option for launching Neovim from a file manager + # (Requires launching the terminal and then executing Neovim) xdg.desktopEntries.nvim = lib.mkIf pkgs.stdenv.isLinux { name = "Neovim wrapper"; exec = "kitty nvim %F"; + mimeType = [ "text/plain" "text/markdown" ]; }; xdg.mimeApps.defaultApplications = lib.mkIf pkgs.stdenv.isLinux { "text/plain" = [ "nvim.desktop" ]; @@ -45,9 +58,6 @@ in { }; - # # Used for icons in Vim - # fonts.fonts = with pkgs; [ nerdfonts ]; - }; } diff --git a/modules/common/repositories/dotfiles.nix b/modules/common/repositories/dotfiles.nix index fda2dc1..eabb1e5 100644 --- a/modules/common/repositories/dotfiles.nix +++ b/modules/common/repositories/dotfiles.nix @@ -1,5 +1,7 @@ { config, pkgs, lib, ... }: { + # Allows me to make sure I can work on my dotfiles locally + options.dotfiles.enable = lib.mkEnableOption "Clone dotfiles."; config = lib.mkIf config.dotfiles.enable { diff --git a/modules/common/repositories/notes.nix b/modules/common/repositories/notes.nix index 47e521b..7439258 100644 --- a/modules/common/repositories/notes.nix +++ b/modules/common/repositories/notes.nix @@ -1,5 +1,8 @@ { config, ... }: { + # This is just a placeholder as I expect to interact with my notes in a + # certain location + home-manager.users.${config.user} = { home.sessionVariables = { diff --git a/modules/common/shell/charm.nix b/modules/common/shell/charm.nix index b2972cf..4ea98aa 100644 --- a/modules/common/shell/charm.nix +++ b/modules/common/shell/charm.nix @@ -1,5 +1,7 @@ { config, pkgs, lib, ... }: { + # Convenience utilities from charm.sh + options.charm.enable = lib.mkEnableOption "Charm utilities."; config.home-manager.users.${config.user} = lib.mkIf config.charm.enable { diff --git a/modules/common/shell/direnv.nix b/modules/common/shell/direnv.nix index b5f5165..daddb31 100644 --- a/modules/common/shell/direnv.nix +++ b/modules/common/shell/direnv.nix @@ -1,5 +1,6 @@ { config, ... }: { + # Enables quickly entering Nix shells when changing directories home-manager.users.${config.user}.programs.direnv = { enable = true; nix-direnv.enable = true; diff --git a/modules/common/shell/fzf.nix b/modules/common/shell/fzf.nix index 1f9819b..a36b0bb 100644 --- a/modules/common/shell/fzf.nix +++ b/modules/common/shell/fzf.nix @@ -1,5 +1,7 @@ { config, ... }: { + # FZF is a fuzzy-finder for the terminal + home-manager.users.${config.user} = { programs.fzf.enable = true; diff --git a/modules/nixos/applications/calibre.nix b/modules/nixos/applications/calibre.nix index 1a65f0f..4a95223 100644 --- a/modules/nixos/applications/calibre.nix +++ b/modules/nixos/applications/calibre.nix @@ -14,6 +14,8 @@ 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"; }; }; } diff --git a/modules/nixos/applications/nautilus.nix b/modules/nixos/applications/nautilus.nix index cea607e..46223ee 100644 --- a/modules/nixos/applications/nautilus.nix +++ b/modules/nixos/applications/nautilus.nix @@ -18,12 +18,14 @@ 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.gnome.nautilus}/bin/nautilus"; }; + # Generates a QR code and previews it with sushi programs.fish.functions = { qr = { body = @@ -31,7 +33,7 @@ }; }; - # Set default for opening directories + # Set Nautilus as default for opening directories xdg.mimeApps = { associations.added."inode/directory" = [ "org.gnome.Nautilus.desktop" ]; # associations.removed = { diff --git a/modules/nixos/system/auto-upgrade.nix b/modules/nixos/system/auto-upgrade.nix new file mode 100644 index 0000000..0612042 --- /dev/null +++ b/modules/nixos/system/auto-upgrade.nix @@ -0,0 +1,47 @@ +{ config, pkgs, lib, ... }: { + + # This setting only applies to NixOS, different on Darwin + nix.gc.dates = "03:03"; # Run every morning (but before upgrade) + + # Update the system daily by pointing it at the flake repository + system.autoUpgrade = { + enable = config.server; # Only auto upgrade servers + dates = "03:33"; + flake = "git+${config.dotfilesRepo}"; + randomizedDelaySec = "25min"; + operation = "switch"; + allowReboot = true; + rebootWindow = { + lower = "00:01"; + upper = "06: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" ]; + +} diff --git a/modules/nixos/system/default.nix b/modules/nixos/system/default.nix index 8a6e27f..64757f0 100644 --- a/modules/nixos/system/default.nix +++ b/modules/nixos/system/default.nix @@ -1,6 +1,7 @@ { config, pkgs, lib, ... }: { - imports = [ ./doas.nix ./journald.nix ./user.nix ./timezone.nix ]; + imports = + [ ./auto-upgrade.nix ./doas.nix ./journald.nix ./user.nix ./timezone.nix ]; config = lib.mkIf pkgs.stdenv.isLinux { @@ -8,54 +9,6 @@ system.stateVersion = config.home-manager.users.${config.user}.home.stateVersion; - # This setting only applies to NixOS, different on Darwin - nix.gc.dates = "weekly"; - - systemd.timers.nix-gc.timerConfig = { WakeSystem = true; }; - systemd.services.nix-gc.postStop = - lib.mkIf (!config.server) "systemctl suspend"; - - # Update the system daily - system.autoUpgrade = { - enable = config.server; # Only auto upgrade servers - dates = "03:33"; - flake = "git+${config.dotfilesRepo}"; - randomizedDelaySec = "45min"; - operation = "switch"; - allowReboot = config.server; # Reboot servers - rebootWindow = { - lower = "00:01"; - upper = "06: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" ]; - }; } diff --git a/modules/nixos/system/doas.nix b/modules/nixos/system/doas.nix index f2cff94..ff61572 100644 --- a/modules/nixos/system/doas.nix +++ b/modules/nixos/system/doas.nix @@ -13,11 +13,11 @@ doas = { enable = true; - # No password required + # No password required for trusted users wheelNeedsPassword = false; # Pass environment variables from user to root - # Also requires removing password here + # Also requires specifying that we are removing password here extraRules = [{ groups = [ "wheel" ]; noPass = true; @@ -26,6 +26,7 @@ }; }; + # Alias sudo to doas for convenience home-manager.users.${config.user}.programs.fish.shellAliases = { sudo = "doas"; }; diff --git a/modules/nixos/system/journald.nix b/modules/nixos/system/journald.nix index fe94a19..2b8582f 100644 --- a/modules/nixos/system/journald.nix +++ b/modules/nixos/system/journald.nix @@ -1,6 +1,7 @@ { ... }: { # How long to keep journalctl entries + # This helps to make sure log disk usage doesn't grow too unwieldy services.journald.extraConfig = '' SystemMaxUse=100M MaxFileSec=1month diff --git a/modules/nixos/system/user.nix b/modules/nixos/system/user.nix index 3d2f09e..f86c685 100644 --- a/modules/nixos/system/user.nix +++ b/modules/nixos/system/user.nix @@ -1,4 +1,4 @@ -{ config, pkgs, lib, ... }: { +{ config, lib, ... }: { options = { @@ -11,7 +11,7 @@ }; - config = lib.mkIf (pkgs.stdenv.isLinux) { + config = { # Allows us to declaritively set password users.mutableUsers = false;