summaryrefslogtreecommitdiff
path: root/users/seth/mixins
diff options
context:
space:
mode:
authorSeth Flynn <[email protected]>2025-02-14 01:18:47 -0500
committerSeth Flynn <[email protected]>2025-02-14 01:29:06 -0500
commit3e208d20934bedd8cd7769f23f35cfae9d8e7d0d (patch)
tree452399d770df6be2589be3c92771b1999dd1b93a /users/seth/mixins
parentc1bea770122a7cf2dea5113387265f59010d5a7f (diff)
seth: simplify module structure
Moving to mixins generally reduces the boilerplate in all configurations, and less custom "stuff" These are then enabled by the regular options in programs.nix for example Many of the other options (like desktops) also had little use in being abstracted as there's no situation where I'd *not* want them to be applied when said desktop is in use
Diffstat (limited to 'users/seth/mixins')
-rw-r--r--users/seth/mixins/bash.nix33
-rw-r--r--users/seth/mixins/budgie.nix22
-rw-r--r--users/seth/mixins/catppuccin.nix14
-rw-r--r--users/seth/mixins/chromium.nix20
-rw-r--r--users/seth/mixins/default.nix23
-rw-r--r--users/seth/mixins/firefox/arkenfox.nix69
-rw-r--r--users/seth/mixins/firefox/default.nix56
-rw-r--r--users/seth/mixins/fish.nix55
-rw-r--r--users/seth/mixins/gh.nix25
-rw-r--r--users/seth/mixins/ghostty.nix10
-rw-r--r--users/seth/mixins/git.nix37
-rw-r--r--users/seth/mixins/gnome.nix69
-rw-r--r--users/seth/mixins/gpg.nix22
-rw-r--r--users/seth/mixins/mangohud.nix14
-rw-r--r--users/seth/mixins/niri.nix56
-rw-r--r--users/seth/mixins/nu.nix45
-rw-r--r--users/seth/mixins/plasma.nix24
-rw-r--r--users/seth/mixins/spotifyd.nix12
-rw-r--r--users/seth/mixins/ssh.nix67
-rw-r--r--users/seth/mixins/vim.nix42
-rw-r--r--users/seth/mixins/zsh.nix100
21 files changed, 815 insertions, 0 deletions
diff --git a/users/seth/mixins/bash.nix b/users/seth/mixins/bash.nix
new file mode 100644
index 0000000..b278d05
--- /dev/null
+++ b/users/seth/mixins/bash.nix
@@ -0,0 +1,33 @@
+{ config, lib, ... }:
+
+{
+ config = lib.mkMerge [
+ {
+ programs.bash = {
+ historyFile = "${config.xdg.stateHome}/bash/history";
+ historyFileSize = 1000;
+ historySize = 100;
+
+ shellOptions = [
+ "cdspell"
+ "checkjobs"
+ "checkwinsize"
+ "dirspell"
+ "globstar"
+ "histappend"
+ "no_empty_cmd_completion"
+ ];
+ };
+ }
+
+ # TODO: find out if i need this anymore with standalone HM
+ (lib.mkIf config.seth.standalone.enable {
+ programs.bash = {
+ bashrcExtra = ''
+ nixfile=${config.home.homeDirectory}/.nix-profile/etc/profile.d/nix.sh
+ [ -e "$nixfile" ] && source "$nixfile"
+ '';
+ };
+ })
+ ];
+}
diff --git a/users/seth/mixins/budgie.nix b/users/seth/mixins/budgie.nix
new file mode 100644
index 0000000..c0b1709
--- /dev/null
+++ b/users/seth/mixins/budgie.nix
@@ -0,0 +1,22 @@
+{ lib, osConfig, ... }:
+
+let
+ enable = osConfig.services.xserver.desktopManager.budgie.enable or false;
+in
+
+{
+ config = lib.mkIf enable {
+ dconf = {
+ enable = true;
+ settings = {
+ "com.solus-project.budgie-panel:Budgie" = {
+ pinned-launchers = [
+ "firefox.desktop"
+ "nemo.desktop"
+ "discord-canary.desktop"
+ ];
+ };
+ };
+ };
+ };
+}
diff --git a/users/seth/mixins/catppuccin.nix b/users/seth/mixins/catppuccin.nix
new file mode 100644
index 0000000..b719c28
--- /dev/null
+++ b/users/seth/mixins/catppuccin.nix
@@ -0,0 +1,14 @@
+{ inputs, ... }:
+
+{
+ imports = [
+ inputs.catppuccin.homeManagerModules.catppuccin
+ ];
+
+ catppuccin = {
+ accent = "mauve";
+ flavor = "mocha";
+
+ chromium.enable = false;
+ };
+}
diff --git a/users/seth/mixins/chromium.nix b/users/seth/mixins/chromium.nix
new file mode 100644
index 0000000..e744eb3
--- /dev/null
+++ b/users/seth/mixins/chromium.nix
@@ -0,0 +1,20 @@
+{ pkgs, ... }:
+
+{
+ programs.chromium = {
+ dictionaries = [ pkgs.hunspellDictsChromium.en_US ];
+
+ extensions = [
+ # uBlock Origin Lite
+ { id = "ddkjiahejlhfcafbddmgiahcphecmpfh"; }
+ # Bitwarden
+ { id = "nngceckbapebfimnlniiiahkandclblb"; }
+ # Floccus Bookmark Sync
+ { id = "fnaicdffflnofjppbagibeoednhnbjhg"; }
+ # Tabby Cat
+ { id = "mefhakmgclhhfbdadeojlkbllmecialg"; }
+ # Startpage
+ { id = "fgmjlmbojbkmdpofahffgcpkhkngfpef"; }
+ ];
+ };
+}
diff --git a/users/seth/mixins/default.nix b/users/seth/mixins/default.nix
new file mode 100644
index 0000000..e898b0e
--- /dev/null
+++ b/users/seth/mixins/default.nix
@@ -0,0 +1,23 @@
+{
+ imports = [
+ ./bash.nix
+ ./budgie.nix
+ ./catppuccin.nix
+ ./chromium.nix
+ ./firefox
+ ./fish.nix
+ ./gh.nix
+ ./ghostty.nix
+ ./git.nix
+ ./gnome.nix
+ ./gpg.nix
+ ./mangohud.nix
+ ./niri.nix
+ ./nu.nix
+ ./plasma.nix
+ ./spotifyd.nix
+ ./ssh.nix
+ ./vim.nix
+ ./zsh.nix
+ ];
+}
diff --git a/users/seth/mixins/firefox/arkenfox.nix b/users/seth/mixins/firefox/arkenfox.nix
new file mode 100644
index 0000000..cfb2a0d
--- /dev/null
+++ b/users/seth/mixins/firefox/arkenfox.nix
@@ -0,0 +1,69 @@
+{
+ lib,
+ inputs,
+ ...
+}:
+
+{
+ imports = [ inputs.arkenfox.hmModules.arkenfox ];
+
+ programs.firefox = {
+ arkenfox = {
+ enable = true;
+ version = "128.0";
+ };
+
+ profiles.arkenfox.arkenfox =
+ let
+ enableSections =
+ sections:
+ lib.genAttrs sections (_: {
+ enable = true;
+ });
+ in
+ lib.recursiveUpdate
+ {
+ enable = true;
+
+ # enable safe browsing
+ "0400"."0403"."browser.safebrowsing.downloads.remote.enabled".value = true;
+
+ # fix hulu
+ "1200"."1201"."security.ssl.require_safe_negotiation".value = false;
+
+ "2600"."2651"."browser.download.useDownloadDir" = {
+ enable = true;
+ value = true;
+ };
+
+ # disable rfp letterboxing
+ "4500"."4504"."privacy.resistFingerprinting.letterboxing".value = false;
+
+ "5000" = {
+ "5003"."signon.rememberSignons".enable = true;
+ # enable search autocomplete
+ "5021"."keyword.enabled".value = true;
+ };
+ }
+ (enableSections [
+ "0100"
+ "0200"
+ "0300"
+ "0400"
+ "0600"
+ "0700"
+ "0800"
+ "0900"
+ "1000"
+ "1200"
+ "1600"
+ "1700"
+ "2000"
+ "2400"
+ "2600"
+ "2700"
+ "2800"
+ "4500"
+ ]);
+ };
+}
diff --git a/users/seth/mixins/firefox/default.nix b/users/seth/mixins/firefox/default.nix
new file mode 100644
index 0000000..7d5fb7e
--- /dev/null
+++ b/users/seth/mixins/firefox/default.nix
@@ -0,0 +1,56 @@
+{
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+
+let
+ inherit (pkgs.stdenv.hostPlatform) isLinux;
+in
+
+{
+ imports = [
+ inputs.getchpkgs.nixosModules.firefox-addons
+ # Requires `github:dwarfmaster/arkenfox-nixos`
+ # ./arkenfox.nix
+ ];
+
+ config = lib.mkMerge [
+ {
+ programs.firefox = {
+ addons = [
+ # uBlock Origin
+ # Bitwarden
+ "{446900e4-71c2-419f-a6a7-df9c091e268b}"
+ # Floccus
+ ];
+
+ profiles.arkenfox = {
+ isDefault = true;
+
+ settings = {
+ # disable firefox accounts & pocket
+ "extensions.pocket.enabled" = false;
+ "identity.fxaccounts.enabled" = false;
+
+ # hw accel
+ "media.ffmpeg.vaapi.enabled" = true;
+
+ # widevine drm
+ "media.gmp-widevinecdm.enabled" = true;
+ };
+ };
+ };
+ }
+
+ (lib.mkIf (config.programs.firefox.enable && isLinux) {
+ home.sessionVariables = {
+ MOZ_ENABLE_WAYLAND = "1";
+ };
+ })
+ ];
+}
diff --git a/users/seth/mixins/fish.nix b/users/seth/mixins/fish.nix
new file mode 100644
index 0000000..e02c736
--- /dev/null
+++ b/users/seth/mixins/fish.nix
@@ -0,0 +1,55 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+{
+ config = lib.mkMerge [
+ {
+ programs.fish = {
+ functions = {
+ last_history_item.body = "echo $history[1]";
+ };
+
+ interactiveShellInit = ''
+ set --global hydro_symbol_prompt ">"
+
+ set --global hydro_color_duration $fish_color_end
+ set --global hydro_color_error $fish_color_error
+ set --global hydro_color_git cba6f7
+ set --global hydro_color_prompt $fish_color_cwd
+ set --global hydro_color_pwd $fish_color_user
+ '';
+
+ plugins = [
+ {
+ name = "hydro";
+ inherit (pkgs.fishPlugins.hydro) src;
+ }
+ ];
+
+ shellAbbrs = {
+ nixgc = "sudo nix-collect-garbage -d && nix-collect-garbage -d";
+ "!!" = {
+ position = "anywhere";
+ function = "last_history_item";
+ };
+ };
+ };
+ }
+
+ # TODO: Do i still need this weird sourcing?
+ (lib.mkIf config.seth.standalone.enable {
+ programs.fish = {
+ interactiveShellInit = ''
+ set -l nixfile ${config.home.homeDirectory}/.nix-profile/etc/profile.d/nix.fish
+ if test -e $nixfile
+ source $nixfile
+ end
+ '';
+ };
+ })
+ ];
+}
diff --git a/users/seth/mixins/gh.nix b/users/seth/mixins/gh.nix
new file mode 100644
index 0000000..f0ee96b
--- /dev/null
+++ b/users/seth/mixins/gh.nix
@@ -0,0 +1,25 @@
+{
+ config,
+ lib,
+ ...
+}:
+
+{
+ programs.gh = {
+ enable = lib.mkDefault config.programs.git.enable;
+
+ settings = {
+ git_protocol = "https";
+ editor = "nvim";
+ prompt = "enabled";
+ };
+
+ gitCredentialHelper = {
+ enable = true;
+ hosts = [
+ "https://github.com"
+ "https://github.example.com"
+ ];
+ };
+ };
+}
diff --git a/users/seth/mixins/ghostty.nix b/users/seth/mixins/ghostty.nix
new file mode 100644
index 0000000..aa2a1b8
--- /dev/null
+++ b/users/seth/mixins/ghostty.nix
@@ -0,0 +1,10 @@
+{
+ programs.ghostty = {
+ enableBashIntegration = true;
+ enableFishIntegration = true;
+
+ settings = {
+ bold-is-bright = true;
+ };
+ };
+}
diff --git a/users/seth/mixins/git.nix b/users/seth/mixins/git.nix
new file mode 100644
index 0000000..9746425
--- /dev/null
+++ b/users/seth/mixins/git.nix
@@ -0,0 +1,37 @@
+{
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+
+{
+ imports = [ inputs.getchpkgs.homeModules.riff ];
+
+ config = lib.mkMerge [
+ {
+ programs.git = {
+ riff.enable = true;
+
+ extraConfig = {
+ init = {
+ defaultBranch = "main";
+ };
+ };
+
+ signing = {
+ key = "D31BD0D494BBEE86";
+ signByDefault = true;
+ };
+
+ userEmail = "[email protected]";
+ userName = "Seth Flynn";
+ };
+ }
+
+ (lib.mkIf config.programs.git.enable {
+ home.packages = [ pkgs.git-branchless ];
+ })
+ ];
+}
diff --git a/users/seth/mixins/gnome.nix b/users/seth/mixins/gnome.nix
new file mode 100644
index 0000000..2214718
--- /dev/null
+++ b/users/seth/mixins/gnome.nix
@@ -0,0 +1,69 @@
+{
+ lib,
+ pkgs,
+ osConfig,
+ ...
+}:
+
+let
+ enable = osConfig.services.xserver.desktopManager.gnome.enable or false;
+in
+
+{
+ config = lib.mkIf enable {
+ dconf = {
+ enable = true;
+ settings = {
+ "org/gnome/shell" = {
+ disable-user-extensions = false;
+
+ enabled-extensions = [ "[email protected]" ];
+
+ favorite-apps = [
+ "chromium-browser.desktop"
+ "org.gnome.Nautilus.desktop"
+ "discord-canary.desktop"
+ ];
+ };
+
+ "org/gnome/desktop/interface" = {
+ color-scheme = "prefer-dark";
+ document-font-name = "Noto Sans 11";
+ font-antialiasing = "rgba";
+ font-name = "Noto Sans 11";
+ monospace-font-name = "Hack Nerd Font 10";
+ };
+
+ "org/gnome/desktop/peripherals/mouse" = {
+ accel-profile = "flat";
+ };
+
+ "org/gnome/desktop/wm/preferences" = {
+ titlebar-font = "Noto Sans Bold 11";
+ };
+
+ "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = {
+ name = "ptyxis";
+ command = "ptyxis";
+ binding = "<Control><Alt>t";
+ };
+ };
+ };
+
+ home.packages = [
+ # Torrent client
+ pkgs.fragments
+
+ # Keep my screen awake
+ pkgs.gnomeExtensions.caffeine
+
+ # Terminal emulator
+ pkgs.ptyxis
+
+ # Mastodon client
+ pkgs.tuba
+ ];
+
+ seth.adw-gtk3.enable = true;
+ };
+}
diff --git a/users/seth/mixins/gpg.nix b/users/seth/mixins/gpg.nix
new file mode 100644
index 0000000..eb36cdc
--- /dev/null
+++ b/users/seth/mixins/gpg.nix
@@ -0,0 +1,22 @@
+{
+ config,
+ lib,
+ pkgs,
+ osConfig,
+ ...
+}:
+
+let
+ inherit (pkgs.stdenv.hostPlatform) isLinux;
+in
+
+{
+ config = lib.mkMerge [
+ (lib.mkIf isLinux {
+ services.gpg-agent = {
+ enable = lib.mkDefault config.programs.gpg.enable;
+ pinentryPackage = osConfig.programs.gnupg.agent.pinentryPackage or pkgs.pinentry-curses;
+ };
+ })
+ ];
+}
diff --git a/users/seth/mixins/mangohud.nix b/users/seth/mixins/mangohud.nix
new file mode 100644
index 0000000..2ad6c70
--- /dev/null
+++ b/users/seth/mixins/mangohud.nix
@@ -0,0 +1,14 @@
+{
+ programs.mangohud = {
+ settings = {
+ cpu_stats = true;
+ cpu_temp = true;
+ gpu_stats = true;
+ gpu_temp = true;
+ fps = true;
+ frametime = true;
+ media_player = true;
+ media_player_name = "spotify";
+ };
+ };
+}
diff --git a/users/seth/mixins/niri.nix b/users/seth/mixins/niri.nix
new file mode 100644
index 0000000..22411dd
--- /dev/null
+++ b/users/seth/mixins/niri.nix
@@ -0,0 +1,56 @@
+{
+ lib,
+ pkgs,
+ osConfig,
+ ...
+}:
+
+let
+ enable = osConfig.programs.niri.enable or false;
+in
+
+{
+ config = lib.mkIf enable {
+ # Set dark theme for Flatpak apps
+ # https://github.com/YaLTeR/niri/wiki/Important-Software#portals
+ dconf = {
+ enable = true;
+ settings = {
+ "org/gnome/desktop/interface" = {
+ color-scheme = "prefer-dark";
+ };
+ };
+ };
+
+ home.packages = [
+ # Torrent client
+ pkgs.fragments
+
+ # Mastodon client
+ pkgs.tuba
+
+ # the funni (I need it for native Wayland support)
+ pkgs.vesktop
+
+ # TODO: Figure out how to export $DISPLAY from this
+ # so I don't need the above
+ pkgs.xwayland-satellite
+ ];
+
+ # Enable some things from the NixOS module here to
+ # apply Catppuccin themes
+ programs = {
+ alacritty.enable = true;
+ fuzzel.enable = true;
+ mako.enable = true;
+ ncspot.enable = true; # Official Spotify has ugly CSD
+ swaylock.enable = true;
+ yazi.enable = true;
+ zellij.enable = true;
+ };
+
+ seth = {
+ adw-gtk3.enable = true;
+ };
+ };
+}
diff --git a/users/seth/mixins/nu.nix b/users/seth/mixins/nu.nix
new file mode 100644
index 0000000..ad25ce6
--- /dev/null
+++ b/users/seth/mixins/nu.nix
@@ -0,0 +1,45 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+let
+ theme = "catppuccin-${config.catppuccin.flavor}";
+in
+
+{
+ config = lib.mkMerge [
+ {
+ programs.nushell = {
+ configFile.text = ''
+ def "nixgc" [] {
+ sudo nix-collect-garbage -d; nix-collect-garbage -d
+ }
+ '';
+
+ envFile.text = ''
+ use ${pkgs.nu_scripts}/share/nu_scripts/themes/nu-themes/${theme}.nu
+ $env.config.color_config = (${theme})
+ '';
+
+ inherit (config.home) shellAliases;
+ };
+ }
+
+ (lib.mkIf config.programs.nushell.enable {
+ programs = {
+ # Wrap it with bash
+ bash.initExtra = lib.mkAfter ''
+ if [[ $(ps --no-header --pid=$PPID --format=comm) != "nu" && -z ''${BASH_EXECUTION_STRING} ]]; then
+ exec ${lib.getExe config.programs.nushell.package}
+ fi
+ '';
+
+ # builtin `ls` is good here!
+ eza.enable = lib.mkForce false;
+ };
+ })
+ ];
+}
diff --git a/users/seth/mixins/plasma.nix b/users/seth/mixins/plasma.nix
new file mode 100644
index 0000000..fe9d69f
--- /dev/null
+++ b/users/seth/mixins/plasma.nix
@@ -0,0 +1,24 @@
+{
+ lib,
+ pkgs,
+ osConfig,
+ ...
+}:
+
+let
+ enable = osConfig.services.desktopManager.plasma6.enable or false;
+in
+
+{
+ config = lib.mkIf enable {
+ home.packages = [
+ # Matrix client
+ # TODO: Use after it drops libolm
+ # pkgs.kdePackages.neochat
+ # Mastodon client
+ pkgs.kdePackages.tokodon
+ # Torrent client
+ pkgs.qbittorrent
+ ];
+ };
+}
diff --git a/users/seth/mixins/spotifyd.nix b/users/seth/mixins/spotifyd.nix
new file mode 100644
index 0000000..e2b0972
--- /dev/null
+++ b/users/seth/mixins/spotifyd.nix
@@ -0,0 +1,12 @@
+{
+ services.spotifyd = {
+ settings = {
+ # Implicitly use zeroconf
+ global = {
+ autoplay = true;
+ backend = "pulseaudio";
+ bitrate = 320;
+ };
+ };
+ };
+}
diff --git a/users/seth/mixins/ssh.nix b/users/seth/mixins/ssh.nix
new file mode 100644
index 0000000..3ae26b2
--- /dev/null
+++ b/users/seth/mixins/ssh.nix
@@ -0,0 +1,67 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+let
+ inherit (pkgs.stdenv.hostPlatform) isLinux;
+in
+
+{
+ config = lib.mkMerge [
+ {
+ programs.ssh = {
+ package = pkgs.openssh;
+
+ matchBlocks =
+ let
+ sshDir = "${config.home.homeDirectory}/.ssh";
+ in
+ {
+ # git forges
+ "codeberg.org" = {
+ identityFile = "${sshDir}/codeberg";
+ user = "git";
+ };
+
+ "github.com" = {
+ identityFile = "${sshDir}/github";
+ user = "git";
+ };
+
+ # linux packaging
+ "aur.archlinux.org" = {
+ identityFile = "${sshDir}/aur";
+ user = "aur";
+ };
+
+ "pagure.io" = {
+ identityFile = "${sshDir}/copr";
+ user = "git";
+ };
+
+ # macstadium m1
+ "mini.scrumplex.net" = {
+ identityFile = "${sshDir}/macstadium";
+ user = "bob-the-builder";
+ };
+
+ # router
+ "192.168.1.1" = {
+ identityFile = "${sshDir}/openwrt";
+ user = "root";
+ };
+
+ # servers
+ "atlas".user = "atlas";
+ };
+ };
+ }
+
+ (lib.mkIf config.programs.ssh.enable {
+ services.ssh-agent.enable = lib.mkDefault isLinux;
+ })
+ ];
+}
diff --git a/users/seth/mixins/vim.nix b/users/seth/mixins/vim.nix
new file mode 100644
index 0000000..e3269fc
--- /dev/null
+++ b/users/seth/mixins/vim.nix
@@ -0,0 +1,42 @@
+{
+ config,
+ pkgs,
+ ...
+}:
+
+let
+ inherit (config.xdg) configHome dataHome stateHome;
+in
+
+{
+ programs.vim = {
+ packageConfigurable = pkgs.vim;
+
+ settings = {
+ expandtab = false;
+ shiftwidth = 2;
+ tabstop = 2;
+ };
+
+ extraConfig = ''
+ " https://wiki.archlinux.org/title/XDG_Base_Directory
+ set runtimepath^=${configHome}/vim
+ set runtimepath+=${dataHome}/vim
+ set runtimepath+=${configHome}/vim/after
+
+ set packpath^=${dataHome}/vim,${configHome}/vim
+ set packpath+=${configHome}/vim/after,${dataHome}/vim/after
+ set packpath^=${dataHome}/vim,${configHome}/vim
+ set packpath+=${configHome}/vim/after,${dataHome}/vim/after
+
+ let g:netrw_home = "${dataHome}/vim"
+ call mkdir("${dataHome}/vim/spell", 'p')
+
+ set backupdir=${stateHome}/vim/backup | call mkdir(&backupdir, 'p')
+ set directory=${stateHome}/vim/swap | call mkdir(&directory, 'p')
+ set undodir=${stateHome}/vim/undo | call mkdir(&undodir, 'p')
+ set viewdir=${stateHome}/vim/view | call mkdir(&viewdir, 'p')
+ set viminfofile=${stateHome}/vim/viminfo
+ '';
+ };
+}
diff --git a/users/seth/mixins/zsh.nix b/users/seth/mixins/zsh.nix
new file mode 100644
index 0000000..87b04cb
--- /dev/null
+++ b/users/seth/mixins/zsh.nix
@@ -0,0 +1,100 @@
+{
+ config,
+ pkgs,
+ ...
+}:
+
+{
+ programs.zsh = {
+ defaultKeymap = "emacs";
+ dotDir = ".config/zsh";
+
+ history = {
+ expireDuplicatesFirst = true;
+ path = "${config.xdg.stateHome}/zsh/zsh_history";
+ save = 1000;
+ size = 100;
+ };
+
+ autosuggestion.enable = true;
+ syntaxHighlighting.enable = true;
+
+ plugins = [
+ {
+ name = "nix-zsh-completions";
+ src = pkgs.nix-zsh-completions;
+ file = "share/zsh/plugins/nix/nix-zsh-completions.plugin.zsh";
+ }
+
+ {
+ name = "powerlevel10k";
+ src = pkgs.zsh-powerlevel10k;
+ file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme";
+ }
+
+ {
+ name = "zsh-autopair";
+ src = pkgs.zsh-autopair;
+ file = "share/zsh/zsh-autopair/autopair.zsh";
+ }
+
+ {
+ name = "zsh-completions";
+ src = pkgs.zsh-completions;
+ file = "share/zsh-completions/zsh-completions.plugin.zsh";
+ }
+ ];
+
+ completionInit = ''
+ autoload -Uz bashcompinit compinit
+ local zdump="${config.xdg.cacheHome}/zsh/zdump"
+ bashcompinit
+ compinit -d "$zdump"
+ if [[ ! "$zdump.zwc" -nt "$zdump" ]]
+ then
+ zcompile "$zdump"
+ fi
+ unset zdump
+ '';
+
+ initExtra = ''
+ if [[ -r "$XDG_CACHE_HOME/p10k-instant-prompt-*.zsh" ]]; then
+ source "$XDG_CACHE_HOME/p10k-instant-prompt-*.zsh"
+ fi
+ autoload -Uz promptinit colors
+ promptinit
+ colors
+
+ zmodload zsh/zutil
+ zmodload zsh/complist
+ zstyle ":completion::*" group-name ""
+ zstyle ":completion:*" menu "select"
+ zstyle ":completion:*" squeeze-slashes "true"
+ zstyle ":completion::*" use-cache "true"
+ zstyle ":completion::*" cache-path "$zdump"
+
+ unsetopt beep
+ unsetopt hist_beep
+ unsetopt ignore_braces
+ unsetopt list_beep
+ setopt always_to_end
+ setopt prompt_subst
+ setopt share_history
+
+ # clear backbuffer with ctrl-l
+ function clear-screen-and-scrollback() {
+ echoti civis >"$TTY"
+ printf '%b' '\e[H\e[2J' >"$TTY"
+ zle .reset-prompt
+ zle -R
+ printf '%b' '\e[3J' >"$TTY"
+ echoti cnorm >"$TTY"
+ }
+
+ zle -N clear-screen-and-scrollback
+ bindkey '^L' clear-screen-and-scrollback
+
+ [[ ! -f ~/.config/zsh/.p10k.zsh ]] || source ~/.config/zsh/.p10k.zsh
+ '';
+ };
+}