From c52c7f314ccadcc2fcd91e28c8fd1b88f6d5ce0c Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Fri, 18 Oct 2024 17:07:46 +0200 Subject: refactor(modules): Move all system modules to `by-name` From now on all modules should be added to the new `by-name` directory. This should help remove the (superficial and utterly useless) distinction between `home-manager` and `NixOS` modules. --- flake/nixosConfigurations/default.nix | 3 +- flake/packages/default.nix | 4 +- modules/by-name-overlay.nix | 48 + modules/by-name/ad/adb/module.nix | 22 + modules/by-name/ba/backup/module.nix | 51 + modules/by-name/bl/bluetooth/module.nix | 20 + modules/by-name/bo/boot/boot_pictures/gnu.png | Bin 0 -> 327518 bytes .../by-name/bo/boot/boot_pictures/gnulin_emb_1.png | Bin 0 -> 207444 bytes .../by-name/bo/boot/boot_pictures/gnulin_emb_2.png | Bin 0 -> 208347 bytes modules/by-name/bo/boot/iso_entry/archlive_iso.nix | 77 + modules/by-name/bo/boot/iso_entry/signing_key.nix | 18 + modules/by-name/bo/boot/module.nix | 130 ++ modules/by-name/cl/cleanup/module.nix | 19 + modules/by-name/dc/dconf/module.nix | 8 + modules/by-name/di/disks/fstrim.nix | 42 + modules/by-name/di/disks/hibernate.nix | 45 + modules/by-name/di/disks/module.nix | 133 ++ modules/by-name/do/documentation/module.nix | 25 + modules/by-name/fo/fonts/emoji_font.xml | 22 + modules/by-name/fo/fonts/module.nix | 55 + modules/by-name/fw/fwupd/module.nix | 14 + modules/by-name/ha/hardware/module.nix | 80 + modules/by-name/ho/home-manager/module.nix | 56 + modules/by-name/im/impermanence/module.nix | 57 + modules/by-name/is/issue_file/module.nix | 52 + modules/by-name/la/laptop/module.nix | 17 + modules/by-name/li/libvirtd/module.nix | 27 + .../by-name/lo/locale/keymaps/dvorak_modified.xkb | 15 + modules/by-name/lo/locale/keymaps/us_modified.xkb | 9 + modules/by-name/lo/locale/module.nix | 57 + modules/by-name/ne/networking/module.nix | 88 + modules/by-name/ni/nix/module.nix | 61 + modules/by-name/ni/nixpkgs/config.nix | 28 + modules/by-name/ni/nixpkgs/module.nix | 17 + modules/by-name/op/openssh/module.nix | 15 + modules/by-name/pi/printing/module.nix | 45 + modules/by-name/po/polkit/module.nix | 14 + modules/by-name/po/postgresql/module.nix | 17 + modules/by-name/po/power/module.nix | 33 + modules/by-name/sc/scanning/module.nix | 25 + modules/by-name/se/secrets/lf/cd_paths.age | 2357 ++++++++++++++++++++ modules/by-name/se/secrets/module.nix | 73 + modules/by-name/se/secrets/secrets.nix | 16 + modules/by-name/se/secrets/serverphone/ca.key | 19 + modules/by-name/se/secrets/serverphone/server.key | 19 + modules/by-name/se/secrets/taskserver/ca.cert | 92 + modules/by-name/se/secrets/taskserver/credentials | 15 + modules/by-name/se/secrets/taskserver/private.key | 450 ++++ modules/by-name/se/secrets/taskserver/public.cert | 83 + modules/by-name/se/secrets/update_secrets.sh | 37 + modules/by-name/se/serverphone/certificates/ca.crt | 10 + .../by-name/se/serverphone/certificates/server.crt | 10 + modules/by-name/se/serverphone/keys/key_1 | 1 + modules/by-name/se/serverphone/keys/key_2 | 1 + .../se/serverphone/module.currently_ignored.nix | 49 + modules/by-name/sn/snapper/module.nix | 53 + modules/by-name/so/sound/module.nix | 37 + modules/by-name/st/steam/module.nix | 23 + modules/by-name/sw/swaylock/module.nix | 4 + modules/by-name/sy/system_diff/module.nix | 26 + modules/by-name/te/tempfiles/module.nix | 20 + modules/by-name/us/users/module.nix | 50 + modules/by-name/ve/version/module.nix | 19 + modules/by-name/wa/waydroid/module.nix | 5 + modules/by-name/xd/xdg/module.nix | 58 + modules/by-name/xd/xdg/scripts/lf_wrapper.sh | 79 + modules/by-name/xd/xdg/scripts/ranger_wrapper.sh | 68 + modules/default.nix | 10 + modules/home.legacy/conf/alacritty/default.nix | 30 + modules/home.legacy/conf/alacritty/toml/base.toml | 16 + modules/home.legacy/conf/alacritty/toml/bell.toml | 7 + .../conf/alacritty/toml/colorscheme.toml | 79 + .../home.legacy/conf/alacritty/toml/cursor.toml | 11 + modules/home.legacy/conf/alacritty/toml/env.toml | 3 + modules/home.legacy/conf/alacritty/toml/font.toml | 15 + modules/home.legacy/conf/alacritty/toml/hints.toml | 25 + .../conf/alacritty/toml/keyboard_bindings.toml | 297 +++ modules/home.legacy/conf/alacritty/toml/mouse.toml | 2 + .../conf/alacritty/toml/mouse_bindings.toml | 3 + .../home.legacy/conf/alacritty/toml/scrolling.toml | 3 + .../home.legacy/conf/alacritty/toml/selection.toml | 3 + .../home.legacy/conf/alacritty/toml/window.toml | 18 + modules/home.legacy/conf/alacritty/yaml/base.yml | 17 + modules/home.legacy/conf/alacritty/yaml/bell.yml | 42 + modules/home.legacy/conf/alacritty/yaml/colors.yml | 147 ++ .../conf/alacritty/yaml/colorscheme.yml | 31 + modules/home.legacy/conf/alacritty/yaml/cursor.yml | 43 + modules/home.legacy/conf/alacritty/yaml/debug.yml | 29 + modules/home.legacy/conf/alacritty/yaml/env.yml | 11 + modules/home.legacy/conf/alacritty/yaml/font.yml | 73 + modules/home.legacy/conf/alacritty/yaml/hints.yml | 77 + .../conf/alacritty/yaml/key_bindings.yml | 382 ++++ modules/home.legacy/conf/alacritty/yaml/mouse.yml | 11 + .../conf/alacritty/yaml/mouse_bindings.yml | 32 + .../home.legacy/conf/alacritty/yaml/scrolling.yml | 7 + .../home.legacy/conf/alacritty/yaml/selection.yml | 7 + modules/home.legacy/conf/alacritty/yaml/shell.yml | 13 + modules/home.legacy/conf/alacritty/yaml/window.yml | 89 + modules/home.legacy/conf/beets/default.nix | 103 + modules/home.legacy/conf/beets/plugins.nix | 67 + .../conf/beets/plugins/badfiles/default.nix | 13 + modules/home.legacy/conf/beets/plugins/default.nix | 16 + .../conf/beets/plugins/duplicates/default.nix | 5 + .../conf/beets/plugins/fuzzy/default.nix | 6 + .../conf/beets/plugins/ihate/default.nix | 8 + .../conf/beets/plugins/inline/default.nix | 42 + .../conf/beets/plugins/lastgenre/default.nix | 7 + .../conf/beets/plugins/lyrics/default.nix | 6 + .../conf/beets/plugins/mbsubmit/default.nix | 9 + .../conf/beets/plugins/play/default.nix | 14 + .../conf/beets/plugins/replaygain/default.nix | 24 + .../conf/beets/plugins/smartplaylist/default.nix | 33 + .../conf/beets/plugins/xtractor/default.nix | 95 + .../home.legacy/conf/beets/replace_override.yaml | 10 + modules/home.legacy/conf/btop/default.nix | 5 + modules/home.legacy/conf/dconf/default.nix | 9 + modules/home.legacy/conf/default.nix | 48 + modules/home.legacy/conf/direnv/default.nix | 6 + .../conf/firefox/config/bookmarks/default.nix | 31 + .../conf/firefox/config/bookmarks/lib.nix | 49 + .../conf/firefox/config/chrome/userChrome.css | 41 + .../conf/firefox/config/extensions/extensions.json | 50 + .../extensions/native_messaging_hosts/default.nix | 15 + .../conf/firefox/config/policies/default.nix | 146 ++ .../conf/firefox/config/prefs/default.nix | 21 + .../conf/firefox/config/prefs/override.js | 202 ++ .../conf/firefox/config/search/engines/default.nix | 84 + .../config/search/engines/logos/arch_linux.svg | 1 + .../firefox/config/search/engines/logos/brave.svg | 25 + .../config/search/engines/logos/google_scholar.ico | Bin 0 -> 3871 bytes .../config/search/engines/logos/rust_std.svg | 47 + .../config/search/engines/logos/rust_tokio.png | Bin 0 -> 3551 bytes .../config/search/engines/logos/wikipedia.svg | 1 + modules/home.legacy/conf/firefox/default.nix | 134 ++ modules/home.legacy/conf/firefox/package.nix | 30 + .../home.legacy/conf/firefox/scripts/default.nix | 29 + .../conf/firefox/scripts/extract_cookies.sh | 77 + .../conf/firefox/scripts/unzip_mozlz4.py | 44 + .../conf/firefox/scripts/update_extensions.sh | 18 + modules/home.legacy/conf/gammastep/default.nix | 29 + modules/home.legacy/conf/git/aliases.nix | 82 + modules/home.legacy/conf/git/default.nix | 96 + modules/home.legacy/conf/git/git_ignore.git | 4 + modules/home.legacy/conf/git/git_template.git | 66 + modules/home.legacy/conf/gpg/default.nix | 67 + modules/home.legacy/conf/gpg/keys/key_1.asc | 26 + modules/home.legacy/conf/gpg/keys/key_2.asc | 794 +++++++ modules/home.legacy/conf/gtk/default.nix | 58 + modules/home.legacy/conf/himalaya/default.nix | 8 + modules/home.legacy/conf/hyfetch/default.nix | 20 + modules/home.legacy/conf/iamb/config.json | 9 + modules/home.legacy/conf/iamb/default.nix | 3 + modules/home.legacy/conf/keepassxc/default.nix | 7 + modules/home.legacy/conf/keepassxc/keepassxc.ini | 58 + modules/home.legacy/conf/latexindent/default.nix | 8 + .../home.legacy/conf/latexindent/indentconfig.yaml | 2 + .../home.legacy/conf/latexindent/mysettings.yaml | 672 ++++++ modules/home.legacy/conf/less/command.less | 127 ++ modules/home.legacy/conf/less/default.nix | 18 + modules/home.legacy/conf/less/env.less | 2 + modules/home.legacy/conf/less/line-edit.less | 29 + modules/home.legacy/conf/lf/colors | 184 ++ modules/home.legacy/conf/lf/commands/default.nix | 227 ++ .../conf/lf/commands/scripts/archive.sh | 77 + .../conf/lf/commands/scripts/broot_jump.sh | 25 + .../home.legacy/conf/lf/commands/scripts/chmod.sh | 24 + .../conf/lf/commands/scripts/clear_trash.sh | 8 + .../home.legacy/conf/lf/commands/scripts/cow_cp.sh | 105 + .../conf/lf/commands/scripts/dl_file.sh | 43 + .../home.legacy/conf/lf/commands/scripts/dragon.sh | 20 + .../conf/lf/commands/scripts/dragon_individual.sh | 20 + .../conf/lf/commands/scripts/dragon_stay.sh | 20 + .../conf/lf/commands/scripts/execute.sh | 19 + .../conf/lf/commands/scripts/follow_link.sh | 19 + .../conf/lf/commands/scripts/fzf_jump.sh | 24 + .../conf/lf/commands/scripts/go_project_root.sh | 22 + .../home.legacy/conf/lf/commands/scripts/mk_dir.sh | 32 + .../conf/lf/commands/scripts/mk_file.sh | 32 + .../conf/lf/commands/scripts/mk_file_and_edit.sh | 33 + .../home.legacy/conf/lf/commands/scripts/mk_ln.sh | 45 + .../conf/lf/commands/scripts/mk_scr_default.sh | 38 + .../conf/lf/commands/scripts/mk_scr_temp.sh | 38 + .../conf/lf/commands/scripts/restore_trash.sh | 16 + .../conf/lf/commands/scripts/set_wall_paper.sh | 19 + .../conf/lf/commands/scripts/stripspace.sh | 40 + .../home.legacy/conf/lf/commands/scripts/trash.sh | 37 + .../conf/lf/commands/scripts/unarchive.sh | 36 + .../conf/lf/commands/scripts/view_file.sh | 26 + modules/home.legacy/conf/lf/default.nix | 59 + modules/home.legacy/conf/lf/icons | 360 +++ .../home.legacy/conf/lf/keybindings/default.nix | 94 + .../home.legacy/conf/mail/accounts/benedikt.nix | 48 + modules/home.legacy/conf/mail/accounts/soispha.nix | 49 + modules/home.legacy/conf/mail/default.nix | 15 + modules/home.legacy/conf/mako/default.nix | 44 + modules/home.legacy/conf/mbsync/default.nix | 17 + modules/home.legacy/conf/mpd/default.nix | 50 + modules/home.legacy/conf/mpd/mpdconf.example | 418 ++++ modules/home.legacy/conf/mpv/default.nix | 10 + modules/home.legacy/conf/mumble/Mumble.conf | 67 + modules/home.legacy/conf/mumble/default.nix | 3 + modules/home.legacy/conf/neomutt/default.nix | 168 ++ modules/home.legacy/conf/nix-index/default.nix | 14 + modules/home.legacy/conf/npm/.npmrc | 6 + modules/home.legacy/conf/npm/default.nix | 7 + modules/home.legacy/conf/nvim/autocmds/default.nix | 124 + .../home.legacy/conf/nvim/clipboard/default.nix | 7 + modules/home.legacy/conf/nvim/default.nix | 55 + modules/home.legacy/conf/nvim/files/default.nix | 9 + .../home.legacy/conf/nvim/files/ftplugin/tex.lua | 57 + modules/home.legacy/conf/nvim/mappings/default.nix | 282 +++ modules/home.legacy/conf/nvim/options/default.nix | 105 + .../conf/nvim/plgs/colorscheme/default.nix | 17 + .../plgs/colorscheme/lua/mk_todos_readable.lua | 16 + .../conf/nvim/plgs/colorscheme/lua/nightfox.lua | 44 + .../conf/nvim/plgs/comment-nvim/default.nix | 41 + .../conf/nvim/plgs/debugprint/default.nix | 70 + .../conf/nvim/plgs/debugprint/lua/debugprint.lua | 3 + modules/home.legacy/conf/nvim/plgs/default.nix | 33 + .../home.legacy/conf/nvim/plgs/femaco/default.nix | 23 + .../conf/nvim/plgs/femaco/lua/femaco.lua | 50 + .../conf/nvim/plgs/flatten-nvim/default.nix | 20 + .../nvim/plgs/flatten-nvim/lua/flatten-nvim.lua | 106 + .../conf/nvim/plgs/goto-preview/default.nix | 47 + .../nvim/plgs/goto-preview/lua/goto-preview.lua | 21 + .../home.legacy/conf/nvim/plgs/harpoon/default.nix | 94 + .../home.legacy/conf/nvim/plgs/leap/default.nix | 59 + .../home.legacy/conf/nvim/plgs/lf-nvim/default.nix | 18 + .../conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua | 43 + .../conf/nvim/plgs/lsp-progress-nvim/default.nix | 50 + .../lsp-progress-nvim/lua/lsp-progress-nvim.lua | 150 ++ modules/home.legacy/conf/nvim/plgs/lsp/default.nix | 29 + .../conf/nvim/plgs/lsp/keymaps/default.nix | 70 + .../conf/nvim/plgs/lsp/servers/default.nix | 15 + .../conf/nvim/plgs/lsp/servers/servers/bashls.nix | 5 + .../conf/nvim/plgs/lsp/servers/servers/ccls.nix | 5 + .../conf/nvim/plgs/lsp/servers/servers/ltex.nix | 39 + .../conf/nvim/plgs/lsp/servers/servers/lua-ls.nix | 8 + .../conf/nvim/plgs/lsp/servers/servers/nil-ls.nix | 10 + .../nvim/plgs/lsp/servers/servers/openscad.nix | 17 + .../conf/nvim/plgs/lsp/servers/servers/pylyzer.nix | 12 + .../plgs/lsp/servers/servers/quick-lint-js.nix | 15 + .../nvim/plgs/lsp/servers/servers/ruff-lsp.nix | 10 + .../plgs/lsp/servers/servers/rust-analyzer.nix | 17 + .../conf/nvim/plgs/lsp/servers/servers/texlab.nix | 7 + .../home.legacy/conf/nvim/plgs/lspkind/default.nix | 6 + .../conf/nvim/plgs/ltex_extra/default.nix | 9 + .../conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua | 16 + .../home.legacy/conf/nvim/plgs/lualine/default.nix | 121 + .../home.legacy/conf/nvim/plgs/luasnip/default.nix | 20 + .../conf/nvim/plgs/luasnip/lua/luasnip.lua | 7 + .../conf/nvim/plgs/luasnip/lua/snippets/all.lua | 182 ++ .../nvim/plgs/luasnip/lua/snippets/html/html.lua | 108 + .../plgs/luasnip/lua/snippets/tex/delimiter.lua | 34 + .../nvim/plgs/luasnip/lua/snippets/tex/greek.lua | 37 + .../home.legacy/conf/nvim/plgs/neorg/default.nix | 57 + .../conf/nvim/plgs/nvim-cmp/default.nix | 54 + .../conf/nvim/plgs/nvim-lint/default.nix | 15 + .../conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua | 20 + .../conf/nvim/plgs/raw_plugins/default.nix | 11 + .../conf/nvim/plgs/telescope/default.nix | 17 + .../conf/nvim/plgs/telescope/defaults/default.nix | 30 + .../plgs/telescope/extensions/bibtex/default.nix | 17 + .../nvim/plgs/telescope/extensions/default.nix | 9 + .../plgs/telescope/extensions/frecency/default.nix | 22 + .../telescope/extensions/fzy-native/default.nix | 5 + .../plgs/telescope/extensions/rooter/default.nix | 7 + .../telescope/extensions/rooter/lua/rooter.lua | 84 + .../plgs/telescope/extensions/symbols/default.nix | 52 + .../conf/nvim/plgs/telescope/keymaps/default.nix | 10 + .../conf/nvim/plgs/todo-comments/default.nix | 51 + .../conf/nvim/plgs/treesitter/default.nix | 59 + .../home.legacy/conf/nvim/plgs/vim-tex/default.nix | 69 + .../conf/nvim/plgs/which-key/default.nix | 5 + modules/home.legacy/conf/prusa_slicer/default.nix | 3 + .../home.legacy/conf/prusa_slicer/prusa_slicer.ini | 65 + modules/home.legacy/conf/python/default.nix | 6 + modules/home.legacy/conf/python/pythonrc.py | 33 + modules/home.legacy/conf/rclone/default.nix | 7 + modules/home.legacy/conf/rclone/rclone.conf | 10 + modules/home.legacy/conf/rofi/default.nix | 10 + modules/home.legacy/conf/rofi/nord-twoLines.rasi | 101 + modules/home.legacy/conf/ssh/default.nix | 16 + modules/home.legacy/conf/starship/default.nix | 119 + modules/home.legacy/conf/swayidle/config | 5 + modules/home.legacy/conf/swayidle/default.nix | 29 + modules/home.legacy/conf/swaylock/GTDcanonical.png | Bin 0 -> 34659 bytes modules/home.legacy/conf/swaylock/commands.jpg | Bin 0 -> 629695 bytes modules/home.legacy/conf/swaylock/default.nix | 10 + modules/home.legacy/conf/swaylock/gnu.png | Bin 0 -> 327518 bytes modules/home.legacy/conf/taskwarrior/default.nix | 125 ++ .../conf/taskwarrior/firefox/default.nix | 32 + .../home.legacy/conf/taskwarrior/hooks/default.nix | 114 + .../hooks/scripts/on-add_enforce-policies.sh | 41 + .../hooks/scripts/on-add_sync-git-repo.sh | 42 + .../hooks/scripts/on-modify_sync-git-repo.sh | 43 + .../hooks/scripts/on-modify_track-timewarrior.py | 94 + .../scripts/on-modify_track-total-active-time.py | 148 ++ modules/home.legacy/conf/taskwarrior/nord.theme | 100 + .../conf/taskwarrior/projects/default.nix | 119 + modules/home.legacy/conf/timewarrior/default.nix | 22 + modules/home.legacy/conf/timewarrior/nord.theme | 25 + modules/home.legacy/conf/tridactyl/config.vim | 47 + modules/home.legacy/conf/tridactyl/default.nix | 3 + modules/home.legacy/conf/unison/default.nix | 187 ++ modules/home.legacy/conf/xdg/default.nix | 63 + modules/home.legacy/conf/xdg/url_handler.sh | 18 + modules/home.legacy/conf/xdg/xdg_vars.nix | 26 + modules/home.legacy/conf/yambar/config/config.yml | 243 ++ modules/home.legacy/conf/yambar/config/laptop.yml | 243 ++ modules/home.legacy/conf/yambar/default.nix | 50 + modules/home.legacy/conf/yambar/scripts/disk.sh | 21 + .../conf/yambar/scripts/mpd_song_name.sh | 21 + modules/home.legacy/conf/yambar/scripts/network.sh | 47 + .../conf/yambar/scripts/sound-volume.sh | 20 + modules/home.legacy/conf/yt/config.toml | 2 + modules/home.legacy/conf/yt/default.nix | 5 + modules/home.legacy/conf/yt/input.conf | 9 + modules/home.legacy/conf/yt/mpv.conf | 2 + modules/home.legacy/conf/ytcc/default.nix | 11 + modules/home.legacy/conf/ytcc/ytcc.conf | 37 + .../conf/zsh/config/command_not_found.sh | 64 + .../conf/zsh/config/command_not_found_insult.sh | 298 +++ .../home.legacy/conf/zsh/config/custom_cursor.zsh | 42 + modules/home.legacy/conf/zsh/config/zsh-init.zsh | 42 + modules/home.legacy/conf/zsh/default.nix | 103 + modules/home.legacy/default.nix | 60 + modules/home.legacy/files/default.nix | 6 + .../home.legacy/files/manifest_json/default.nix | 16 + .../files/manifest_json/profile/manifest.json | 4 + .../home.legacy/files/wallpaper/abstract-nord.png | Bin 0 -> 140219 bytes modules/home.legacy/files/wallpaper/default.nix | 14 + modules/home.legacy/impermanence/default.nix | 29 + modules/home.legacy/pkgs/default.nix | 240 ++ modules/home.legacy/wms/default.nix | 7 + modules/home.legacy/wms/plasma/default.nix | 5 + modules/home.legacy/wms/river/default.nix | 76 + modules/home.legacy/wms/river/init.sh | 80 + modules/home.legacy/wms/river/res/keys.ron | 58 + modules/home.legacy/wms/river/res/moonlander.ron | 64 + modules/home.legacy/wms/sway/default.nix | 16 + modules/home/conf/alacritty/default.nix | 30 - modules/home/conf/alacritty/toml/base.toml | 16 - modules/home/conf/alacritty/toml/bell.toml | 7 - modules/home/conf/alacritty/toml/colorscheme.toml | 79 - modules/home/conf/alacritty/toml/cursor.toml | 11 - modules/home/conf/alacritty/toml/env.toml | 3 - modules/home/conf/alacritty/toml/font.toml | 15 - modules/home/conf/alacritty/toml/hints.toml | 25 - .../conf/alacritty/toml/keyboard_bindings.toml | 297 --- modules/home/conf/alacritty/toml/mouse.toml | 2 - .../home/conf/alacritty/toml/mouse_bindings.toml | 3 - modules/home/conf/alacritty/toml/scrolling.toml | 3 - modules/home/conf/alacritty/toml/selection.toml | 3 - modules/home/conf/alacritty/toml/window.toml | 18 - modules/home/conf/alacritty/yaml/base.yml | 17 - modules/home/conf/alacritty/yaml/bell.yml | 42 - modules/home/conf/alacritty/yaml/colors.yml | 147 -- modules/home/conf/alacritty/yaml/colorscheme.yml | 31 - modules/home/conf/alacritty/yaml/cursor.yml | 43 - modules/home/conf/alacritty/yaml/debug.yml | 29 - modules/home/conf/alacritty/yaml/env.yml | 11 - modules/home/conf/alacritty/yaml/font.yml | 73 - modules/home/conf/alacritty/yaml/hints.yml | 77 - modules/home/conf/alacritty/yaml/key_bindings.yml | 382 ---- modules/home/conf/alacritty/yaml/mouse.yml | 11 - .../home/conf/alacritty/yaml/mouse_bindings.yml | 32 - modules/home/conf/alacritty/yaml/scrolling.yml | 7 - modules/home/conf/alacritty/yaml/selection.yml | 7 - modules/home/conf/alacritty/yaml/shell.yml | 13 - modules/home/conf/alacritty/yaml/window.yml | 89 - modules/home/conf/beets/default.nix | 103 - modules/home/conf/beets/plugins.nix | 67 - .../home/conf/beets/plugins/badfiles/default.nix | 13 - modules/home/conf/beets/plugins/default.nix | 16 - .../home/conf/beets/plugins/duplicates/default.nix | 5 - modules/home/conf/beets/plugins/fuzzy/default.nix | 6 - modules/home/conf/beets/plugins/ihate/default.nix | 8 - modules/home/conf/beets/plugins/inline/default.nix | 42 - .../home/conf/beets/plugins/lastgenre/default.nix | 7 - modules/home/conf/beets/plugins/lyrics/default.nix | 6 - .../home/conf/beets/plugins/mbsubmit/default.nix | 9 - modules/home/conf/beets/plugins/play/default.nix | 14 - .../home/conf/beets/plugins/replaygain/default.nix | 24 - .../conf/beets/plugins/smartplaylist/default.nix | 33 - .../home/conf/beets/plugins/xtractor/default.nix | 95 - modules/home/conf/beets/replace_override.yaml | 10 - modules/home/conf/btop/default.nix | 5 - modules/home/conf/dconf/default.nix | 9 - modules/home/conf/default.nix | 48 - modules/home/conf/direnv/default.nix | 6 - .../home/conf/firefox/config/bookmarks/default.nix | 31 - modules/home/conf/firefox/config/bookmarks/lib.nix | 49 - .../home/conf/firefox/config/chrome/userChrome.css | 41 - .../conf/firefox/config/extensions/extensions.json | 50 - .../extensions/native_messaging_hosts/default.nix | 15 - .../home/conf/firefox/config/policies/default.nix | 146 -- modules/home/conf/firefox/config/prefs/default.nix | 21 - modules/home/conf/firefox/config/prefs/override.js | 202 -- .../conf/firefox/config/search/engines/default.nix | 84 - .../config/search/engines/logos/arch_linux.svg | 1 - .../firefox/config/search/engines/logos/brave.svg | 25 - .../config/search/engines/logos/google_scholar.ico | Bin 3871 -> 0 bytes .../config/search/engines/logos/rust_std.svg | 47 - .../config/search/engines/logos/rust_tokio.png | Bin 3551 -> 0 bytes .../config/search/engines/logos/wikipedia.svg | 1 - modules/home/conf/firefox/default.nix | 134 -- modules/home/conf/firefox/package.nix | 30 - modules/home/conf/firefox/scripts/default.nix | 29 - .../home/conf/firefox/scripts/extract_cookies.sh | 77 - modules/home/conf/firefox/scripts/unzip_mozlz4.py | 44 - .../home/conf/firefox/scripts/update_extensions.sh | 18 - modules/home/conf/gammastep/default.nix | 29 - modules/home/conf/git/aliases.nix | 82 - modules/home/conf/git/default.nix | 96 - modules/home/conf/git/git_ignore.git | 4 - modules/home/conf/git/git_template.git | 66 - modules/home/conf/gpg/default.nix | 67 - modules/home/conf/gpg/keys/key_1.asc | 26 - modules/home/conf/gpg/keys/key_2.asc | 794 ------- modules/home/conf/gtk/default.nix | 58 - modules/home/conf/himalaya/default.nix | 8 - modules/home/conf/hyfetch/default.nix | 20 - modules/home/conf/iamb/config.json | 9 - modules/home/conf/iamb/default.nix | 3 - modules/home/conf/keepassxc/default.nix | 7 - modules/home/conf/keepassxc/keepassxc.ini | 58 - modules/home/conf/latexindent/default.nix | 8 - modules/home/conf/latexindent/indentconfig.yaml | 2 - modules/home/conf/latexindent/mysettings.yaml | 672 ------ modules/home/conf/less/command.less | 127 -- modules/home/conf/less/default.nix | 18 - modules/home/conf/less/env.less | 2 - modules/home/conf/less/line-edit.less | 29 - modules/home/conf/lf/colors | 184 -- modules/home/conf/lf/commands/default.nix | 227 -- modules/home/conf/lf/commands/scripts/archive.sh | 77 - .../home/conf/lf/commands/scripts/broot_jump.sh | 25 - modules/home/conf/lf/commands/scripts/chmod.sh | 24 - .../home/conf/lf/commands/scripts/clear_trash.sh | 8 - modules/home/conf/lf/commands/scripts/cow_cp.sh | 105 - modules/home/conf/lf/commands/scripts/dl_file.sh | 43 - modules/home/conf/lf/commands/scripts/dragon.sh | 20 - .../conf/lf/commands/scripts/dragon_individual.sh | 20 - .../home/conf/lf/commands/scripts/dragon_stay.sh | 20 - modules/home/conf/lf/commands/scripts/execute.sh | 19 - .../home/conf/lf/commands/scripts/follow_link.sh | 19 - modules/home/conf/lf/commands/scripts/fzf_jump.sh | 24 - .../conf/lf/commands/scripts/go_project_root.sh | 22 - modules/home/conf/lf/commands/scripts/mk_dir.sh | 32 - modules/home/conf/lf/commands/scripts/mk_file.sh | 32 - .../conf/lf/commands/scripts/mk_file_and_edit.sh | 33 - modules/home/conf/lf/commands/scripts/mk_ln.sh | 45 - .../conf/lf/commands/scripts/mk_scr_default.sh | 38 - .../home/conf/lf/commands/scripts/mk_scr_temp.sh | 38 - .../home/conf/lf/commands/scripts/restore_trash.sh | 16 - .../conf/lf/commands/scripts/set_wall_paper.sh | 19 - .../home/conf/lf/commands/scripts/stripspace.sh | 40 - modules/home/conf/lf/commands/scripts/trash.sh | 37 - modules/home/conf/lf/commands/scripts/unarchive.sh | 36 - modules/home/conf/lf/commands/scripts/view_file.sh | 26 - modules/home/conf/lf/default.nix | 59 - modules/home/conf/lf/icons | 360 --- modules/home/conf/lf/keybindings/default.nix | 94 - modules/home/conf/mail/accounts/benedikt.nix | 48 - modules/home/conf/mail/accounts/soispha.nix | 49 - modules/home/conf/mail/default.nix | 15 - modules/home/conf/mako/default.nix | 44 - modules/home/conf/mbsync/default.nix | 17 - modules/home/conf/mpd/default.nix | 50 - modules/home/conf/mpd/mpdconf.example | 418 ---- modules/home/conf/mpv/default.nix | 10 - modules/home/conf/mumble/Mumble.conf | 67 - modules/home/conf/mumble/default.nix | 3 - modules/home/conf/neomutt/default.nix | 168 -- modules/home/conf/nix-index/default.nix | 14 - modules/home/conf/npm/.npmrc | 6 - modules/home/conf/npm/default.nix | 7 - modules/home/conf/nvim/autocmds/default.nix | 124 - modules/home/conf/nvim/clipboard/default.nix | 7 - modules/home/conf/nvim/default.nix | 55 - modules/home/conf/nvim/files/default.nix | 9 - modules/home/conf/nvim/files/ftplugin/tex.lua | 57 - modules/home/conf/nvim/mappings/default.nix | 282 --- modules/home/conf/nvim/options/default.nix | 105 - .../home/conf/nvim/plgs/colorscheme/default.nix | 17 - .../plgs/colorscheme/lua/mk_todos_readable.lua | 16 - .../conf/nvim/plgs/colorscheme/lua/nightfox.lua | 44 - .../home/conf/nvim/plgs/comment-nvim/default.nix | 41 - modules/home/conf/nvim/plgs/debugprint/default.nix | 70 - .../conf/nvim/plgs/debugprint/lua/debugprint.lua | 3 - modules/home/conf/nvim/plgs/default.nix | 33 - modules/home/conf/nvim/plgs/femaco/default.nix | 23 - modules/home/conf/nvim/plgs/femaco/lua/femaco.lua | 50 - .../home/conf/nvim/plgs/flatten-nvim/default.nix | 20 - .../nvim/plgs/flatten-nvim/lua/flatten-nvim.lua | 106 - .../home/conf/nvim/plgs/goto-preview/default.nix | 47 - .../nvim/plgs/goto-preview/lua/goto-preview.lua | 21 - modules/home/conf/nvim/plgs/harpoon/default.nix | 94 - modules/home/conf/nvim/plgs/leap/default.nix | 59 - modules/home/conf/nvim/plgs/lf-nvim/default.nix | 18 - .../home/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua | 43 - .../conf/nvim/plgs/lsp-progress-nvim/default.nix | 50 - .../lsp-progress-nvim/lua/lsp-progress-nvim.lua | 150 -- modules/home/conf/nvim/plgs/lsp/default.nix | 29 - .../home/conf/nvim/plgs/lsp/keymaps/default.nix | 70 - .../home/conf/nvim/plgs/lsp/servers/default.nix | 15 - .../conf/nvim/plgs/lsp/servers/servers/bashls.nix | 5 - .../conf/nvim/plgs/lsp/servers/servers/ccls.nix | 5 - .../conf/nvim/plgs/lsp/servers/servers/ltex.nix | 39 - .../conf/nvim/plgs/lsp/servers/servers/lua-ls.nix | 8 - .../conf/nvim/plgs/lsp/servers/servers/nil-ls.nix | 10 - .../nvim/plgs/lsp/servers/servers/openscad.nix | 17 - .../conf/nvim/plgs/lsp/servers/servers/pylyzer.nix | 12 - .../plgs/lsp/servers/servers/quick-lint-js.nix | 15 - .../nvim/plgs/lsp/servers/servers/ruff-lsp.nix | 10 - .../plgs/lsp/servers/servers/rust-analyzer.nix | 17 - .../conf/nvim/plgs/lsp/servers/servers/texlab.nix | 7 - modules/home/conf/nvim/plgs/lspkind/default.nix | 6 - modules/home/conf/nvim/plgs/ltex_extra/default.nix | 9 - .../conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua | 16 - modules/home/conf/nvim/plgs/lualine/default.nix | 121 - modules/home/conf/nvim/plgs/luasnip/default.nix | 20 - .../home/conf/nvim/plgs/luasnip/lua/luasnip.lua | 7 - .../conf/nvim/plgs/luasnip/lua/snippets/all.lua | 182 -- .../nvim/plgs/luasnip/lua/snippets/html/html.lua | 108 - .../plgs/luasnip/lua/snippets/tex/delimiter.lua | 34 - .../nvim/plgs/luasnip/lua/snippets/tex/greek.lua | 37 - modules/home/conf/nvim/plgs/neorg/default.nix | 57 - modules/home/conf/nvim/plgs/nvim-cmp/default.nix | 54 - modules/home/conf/nvim/plgs/nvim-lint/default.nix | 15 - .../conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua | 20 - .../home/conf/nvim/plgs/raw_plugins/default.nix | 11 - modules/home/conf/nvim/plgs/telescope/default.nix | 17 - .../conf/nvim/plgs/telescope/defaults/default.nix | 30 - .../plgs/telescope/extensions/bibtex/default.nix | 17 - .../nvim/plgs/telescope/extensions/default.nix | 9 - .../plgs/telescope/extensions/frecency/default.nix | 22 - .../telescope/extensions/fzy-native/default.nix | 5 - .../plgs/telescope/extensions/rooter/default.nix | 7 - .../telescope/extensions/rooter/lua/rooter.lua | 84 - .../plgs/telescope/extensions/symbols/default.nix | 52 - .../conf/nvim/plgs/telescope/keymaps/default.nix | 10 - .../home/conf/nvim/plgs/todo-comments/default.nix | 51 - modules/home/conf/nvim/plgs/treesitter/default.nix | 59 - modules/home/conf/nvim/plgs/vim-tex/default.nix | 69 - modules/home/conf/nvim/plgs/which-key/default.nix | 5 - modules/home/conf/prusa_slicer/default.nix | 3 - modules/home/conf/prusa_slicer/prusa_slicer.ini | 65 - modules/home/conf/python/default.nix | 6 - modules/home/conf/python/pythonrc.py | 33 - modules/home/conf/rclone/default.nix | 7 - modules/home/conf/rclone/rclone.conf | 10 - modules/home/conf/rofi/default.nix | 10 - modules/home/conf/rofi/nord-twoLines.rasi | 101 - modules/home/conf/ssh/default.nix | 16 - modules/home/conf/starship/default.nix | 119 - modules/home/conf/swayidle/config | 5 - modules/home/conf/swayidle/default.nix | 29 - modules/home/conf/swaylock/GTDcanonical.png | Bin 34659 -> 0 bytes modules/home/conf/swaylock/commands.jpg | Bin 629695 -> 0 bytes modules/home/conf/swaylock/default.nix | 10 - modules/home/conf/swaylock/gnu.png | Bin 327518 -> 0 bytes modules/home/conf/taskwarrior/default.nix | 125 -- modules/home/conf/taskwarrior/firefox/default.nix | 32 - modules/home/conf/taskwarrior/hooks/default.nix | 114 - .../hooks/scripts/on-add_enforce-policies.sh | 41 - .../hooks/scripts/on-add_sync-git-repo.sh | 42 - .../hooks/scripts/on-modify_sync-git-repo.sh | 43 - .../hooks/scripts/on-modify_track-timewarrior.py | 94 - .../scripts/on-modify_track-total-active-time.py | 148 -- modules/home/conf/taskwarrior/nord.theme | 100 - modules/home/conf/taskwarrior/projects/default.nix | 119 - modules/home/conf/timewarrior/default.nix | 22 - modules/home/conf/timewarrior/nord.theme | 25 - modules/home/conf/tridactyl/config.vim | 47 - modules/home/conf/tridactyl/default.nix | 3 - modules/home/conf/unison/default.nix | 187 -- modules/home/conf/xdg/default.nix | 63 - modules/home/conf/xdg/url_handler.sh | 18 - modules/home/conf/xdg/xdg_vars.nix | 26 - modules/home/conf/yambar/config/config.yml | 243 -- modules/home/conf/yambar/config/laptop.yml | 243 -- modules/home/conf/yambar/default.nix | 50 - modules/home/conf/yambar/scripts/disk.sh | 21 - modules/home/conf/yambar/scripts/mpd_song_name.sh | 21 - modules/home/conf/yambar/scripts/network.sh | 47 - modules/home/conf/yambar/scripts/sound-volume.sh | 20 - modules/home/conf/yt/config.toml | 2 - modules/home/conf/yt/default.nix | 5 - modules/home/conf/yt/input.conf | 9 - modules/home/conf/yt/mpv.conf | 2 - modules/home/conf/ytcc/default.nix | 11 - modules/home/conf/ytcc/ytcc.conf | 37 - modules/home/conf/zsh/config/command_not_found.sh | 64 - .../conf/zsh/config/command_not_found_insult.sh | 298 --- modules/home/conf/zsh/config/custom_cursor.zsh | 42 - modules/home/conf/zsh/config/zsh-init.zsh | 42 - modules/home/conf/zsh/default.nix | 103 - modules/home/default.nix | 60 - modules/home/files/default.nix | 6 - modules/home/files/manifest_json/default.nix | 16 - .../home/files/manifest_json/profile/manifest.json | 4 - modules/home/files/wallpaper/abstract-nord.png | Bin 140219 -> 0 bytes modules/home/files/wallpaper/default.nix | 14 - modules/home/impermanence/default.nix | 29 - modules/home/pkgs/default.nix | 240 -- modules/home/wms/default.nix | 7 - modules/home/wms/plasma/default.nix | 5 - modules/home/wms/river/default.nix | 76 - modules/home/wms/river/init.sh | 80 - modules/home/wms/river/res/keys.ron | 58 - modules/home/wms/river/res/moonlander.ron | 64 - modules/home/wms/sway/default.nix | 16 - modules/system/bluetooth/default.nix | 20 - modules/system/boot/boot_pictures/gnu.png | Bin 327518 -> 0 bytes modules/system/boot/boot_pictures/gnulin_emb_1.png | Bin 207444 -> 0 bytes modules/system/boot/boot_pictures/gnulin_emb_2.png | Bin 208347 -> 0 bytes modules/system/boot/default.nix | 130 -- modules/system/boot/iso_entry/archlive_iso.nix | 77 - modules/system/boot/iso_entry/signing_key.nix | 18 - modules/system/cleanup/default.nix | 19 - modules/system/default.nix | 30 - modules/system/disks/default.nix | 133 -- modules/system/disks/fstrim.nix | 42 - modules/system/disks/hibernate.nix | 45 - modules/system/documentation/default.nix | 25 - modules/system/fonts/default.nix | 55 - modules/system/fonts/emoji_font.xml | 22 - modules/system/hardware/default.nix | 80 - modules/system/home-manager/default.nix | 56 - modules/system/impermanence/default.nix | 57 - modules/system/laptop/default.nix | 17 - modules/system/libvirtd/default.nix | 27 - modules/system/locale/default.nix | 57 - modules/system/locale/keymaps/dvorak_modified.xkb | 15 - modules/system/locale/keymaps/us_modified.xkb | 9 - modules/system/networking/default.nix | 88 - modules/system/nixpkgs/config.nix | 28 - modules/system/nixpkgs/default.nix | 17 - modules/system/polkit/default.nix | 14 - modules/system/power/default.nix | 33 - modules/system/secrets/default.nix | 73 - modules/system/secrets/lf/cd_paths.age | 2357 -------------------- modules/system/secrets/secrets.nix | 16 - modules/system/secrets/serverphone/ca.key | 19 - modules/system/secrets/serverphone/server.key | 19 - modules/system/secrets/taskserver/ca.cert | 92 - modules/system/secrets/taskserver/credentials | 15 - modules/system/secrets/taskserver/private.key | 450 ---- modules/system/secrets/taskserver/public.cert | 83 - modules/system/secrets/update_secrets.sh | 37 - modules/system/services/adb/default.nix | 22 - modules/system/services/backup/default.nix | 51 - modules/system/services/dconf/default.nix | 8 - modules/system/services/default.nix | 20 - modules/system/services/fwupd/default.nix | 14 - modules/system/services/issue_file/default.nix | 52 - modules/system/services/nix/default.nix | 61 - modules/system/services/openssh/default.nix | 15 - modules/system/services/postgresql/default.nix | 17 - modules/system/services/printing/default.nix | 45 - modules/system/services/scanning/default.nix | 25 - .../services/serverphone/certificates/ca.crt | 10 - .../services/serverphone/certificates/server.crt | 10 - modules/system/services/serverphone/default.nix | 49 - modules/system/services/serverphone/keys/key_1 | 1 - modules/system/services/serverphone/keys/key_2 | 1 - modules/system/services/snapper/default.nix | 53 - modules/system/services/steam/default.nix | 23 - modules/system/services/swaylock/default.nix | 4 - modules/system/services/system_diff/default.nix | 26 - modules/system/services/xdg/default.nix | 58 - modules/system/services/xdg/scripts/lf_wrapper.sh | 79 - .../system/services/xdg/scripts/ranger_wrapper.sh | 68 - modules/system/sound/default.nix | 37 - modules/system/tempfiles/default.nix | 20 - modules/system/users/default.nix | 50 - modules/system/version/default.nix | 19 - modules/system/waydroid/default.nix | 5 - 680 files changed, 19601 insertions(+), 19594 deletions(-) create mode 100644 modules/by-name-overlay.nix create mode 100644 modules/by-name/ad/adb/module.nix create mode 100644 modules/by-name/ba/backup/module.nix create mode 100644 modules/by-name/bl/bluetooth/module.nix create mode 100755 modules/by-name/bo/boot/boot_pictures/gnu.png create mode 100755 modules/by-name/bo/boot/boot_pictures/gnulin_emb_1.png create mode 100755 modules/by-name/bo/boot/boot_pictures/gnulin_emb_2.png create mode 100644 modules/by-name/bo/boot/iso_entry/archlive_iso.nix create mode 100644 modules/by-name/bo/boot/iso_entry/signing_key.nix create mode 100644 modules/by-name/bo/boot/module.nix create mode 100644 modules/by-name/cl/cleanup/module.nix create mode 100644 modules/by-name/dc/dconf/module.nix create mode 100644 modules/by-name/di/disks/fstrim.nix create mode 100644 modules/by-name/di/disks/hibernate.nix create mode 100644 modules/by-name/di/disks/module.nix create mode 100644 modules/by-name/do/documentation/module.nix create mode 100644 modules/by-name/fo/fonts/emoji_font.xml create mode 100644 modules/by-name/fo/fonts/module.nix create mode 100644 modules/by-name/fw/fwupd/module.nix create mode 100644 modules/by-name/ha/hardware/module.nix create mode 100644 modules/by-name/ho/home-manager/module.nix create mode 100644 modules/by-name/im/impermanence/module.nix create mode 100644 modules/by-name/is/issue_file/module.nix create mode 100644 modules/by-name/la/laptop/module.nix create mode 100644 modules/by-name/li/libvirtd/module.nix create mode 100644 modules/by-name/lo/locale/keymaps/dvorak_modified.xkb create mode 100644 modules/by-name/lo/locale/keymaps/us_modified.xkb create mode 100644 modules/by-name/lo/locale/module.nix create mode 100644 modules/by-name/ne/networking/module.nix create mode 100644 modules/by-name/ni/nix/module.nix create mode 100644 modules/by-name/ni/nixpkgs/config.nix create mode 100644 modules/by-name/ni/nixpkgs/module.nix create mode 100644 modules/by-name/op/openssh/module.nix create mode 100644 modules/by-name/pi/printing/module.nix create mode 100644 modules/by-name/po/polkit/module.nix create mode 100644 modules/by-name/po/postgresql/module.nix create mode 100644 modules/by-name/po/power/module.nix create mode 100644 modules/by-name/sc/scanning/module.nix create mode 100644 modules/by-name/se/secrets/lf/cd_paths.age create mode 100644 modules/by-name/se/secrets/module.nix create mode 100644 modules/by-name/se/secrets/secrets.nix create mode 100644 modules/by-name/se/secrets/serverphone/ca.key create mode 100644 modules/by-name/se/secrets/serverphone/server.key create mode 100644 modules/by-name/se/secrets/taskserver/ca.cert create mode 100644 modules/by-name/se/secrets/taskserver/credentials create mode 100644 modules/by-name/se/secrets/taskserver/private.key create mode 100644 modules/by-name/se/secrets/taskserver/public.cert create mode 100755 modules/by-name/se/secrets/update_secrets.sh create mode 100644 modules/by-name/se/serverphone/certificates/ca.crt create mode 100644 modules/by-name/se/serverphone/certificates/server.crt create mode 120000 modules/by-name/se/serverphone/keys/key_1 create mode 120000 modules/by-name/se/serverphone/keys/key_2 create mode 100644 modules/by-name/se/serverphone/module.currently_ignored.nix create mode 100644 modules/by-name/sn/snapper/module.nix create mode 100644 modules/by-name/so/sound/module.nix create mode 100644 modules/by-name/st/steam/module.nix create mode 100644 modules/by-name/sw/swaylock/module.nix create mode 100644 modules/by-name/sy/system_diff/module.nix create mode 100644 modules/by-name/te/tempfiles/module.nix create mode 100644 modules/by-name/us/users/module.nix create mode 100644 modules/by-name/ve/version/module.nix create mode 100644 modules/by-name/wa/waydroid/module.nix create mode 100644 modules/by-name/xd/xdg/module.nix create mode 100755 modules/by-name/xd/xdg/scripts/lf_wrapper.sh create mode 100755 modules/by-name/xd/xdg/scripts/ranger_wrapper.sh create mode 100644 modules/default.nix create mode 100644 modules/home.legacy/conf/alacritty/default.nix create mode 100644 modules/home.legacy/conf/alacritty/toml/base.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/bell.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/colorscheme.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/cursor.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/env.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/font.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/hints.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/mouse.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/scrolling.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/selection.toml create mode 100644 modules/home.legacy/conf/alacritty/toml/window.toml create mode 100644 modules/home.legacy/conf/alacritty/yaml/base.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/bell.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/colors.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/colorscheme.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/cursor.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/debug.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/env.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/font.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/hints.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/key_bindings.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/mouse.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/scrolling.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/selection.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/shell.yml create mode 100644 modules/home.legacy/conf/alacritty/yaml/window.yml create mode 100644 modules/home.legacy/conf/beets/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins.nix create mode 100644 modules/home.legacy/conf/beets/plugins/badfiles/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/duplicates/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/fuzzy/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/ihate/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/inline/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/lastgenre/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/lyrics/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/play/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/replaygain/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix create mode 100644 modules/home.legacy/conf/beets/plugins/xtractor/default.nix create mode 100644 modules/home.legacy/conf/beets/replace_override.yaml create mode 100644 modules/home.legacy/conf/btop/default.nix create mode 100644 modules/home.legacy/conf/dconf/default.nix create mode 100644 modules/home.legacy/conf/default.nix create mode 100644 modules/home.legacy/conf/direnv/default.nix create mode 100644 modules/home.legacy/conf/firefox/config/bookmarks/default.nix create mode 100644 modules/home.legacy/conf/firefox/config/bookmarks/lib.nix create mode 100644 modules/home.legacy/conf/firefox/config/chrome/userChrome.css create mode 100644 modules/home.legacy/conf/firefox/config/extensions/extensions.json create mode 100644 modules/home.legacy/conf/firefox/config/extensions/native_messaging_hosts/default.nix create mode 100644 modules/home.legacy/conf/firefox/config/policies/default.nix create mode 100644 modules/home.legacy/conf/firefox/config/prefs/default.nix create mode 100644 modules/home.legacy/conf/firefox/config/prefs/override.js create mode 100644 modules/home.legacy/conf/firefox/config/search/engines/default.nix create mode 100644 modules/home.legacy/conf/firefox/config/search/engines/logos/arch_linux.svg create mode 100644 modules/home.legacy/conf/firefox/config/search/engines/logos/brave.svg create mode 100644 modules/home.legacy/conf/firefox/config/search/engines/logos/google_scholar.ico create mode 100644 modules/home.legacy/conf/firefox/config/search/engines/logos/rust_std.svg create mode 100644 modules/home.legacy/conf/firefox/config/search/engines/logos/rust_tokio.png create mode 100644 modules/home.legacy/conf/firefox/config/search/engines/logos/wikipedia.svg create mode 100644 modules/home.legacy/conf/firefox/default.nix create mode 100644 modules/home.legacy/conf/firefox/package.nix create mode 100644 modules/home.legacy/conf/firefox/scripts/default.nix create mode 100755 modules/home.legacy/conf/firefox/scripts/extract_cookies.sh create mode 100755 modules/home.legacy/conf/firefox/scripts/unzip_mozlz4.py create mode 100755 modules/home.legacy/conf/firefox/scripts/update_extensions.sh create mode 100644 modules/home.legacy/conf/gammastep/default.nix create mode 100644 modules/home.legacy/conf/git/aliases.nix create mode 100644 modules/home.legacy/conf/git/default.nix create mode 100644 modules/home.legacy/conf/git/git_ignore.git create mode 100644 modules/home.legacy/conf/git/git_template.git create mode 100644 modules/home.legacy/conf/gpg/default.nix create mode 100644 modules/home.legacy/conf/gpg/keys/key_1.asc create mode 100644 modules/home.legacy/conf/gpg/keys/key_2.asc create mode 100644 modules/home.legacy/conf/gtk/default.nix create mode 100644 modules/home.legacy/conf/himalaya/default.nix create mode 100644 modules/home.legacy/conf/hyfetch/default.nix create mode 100644 modules/home.legacy/conf/iamb/config.json create mode 100644 modules/home.legacy/conf/iamb/default.nix create mode 100644 modules/home.legacy/conf/keepassxc/default.nix create mode 100644 modules/home.legacy/conf/keepassxc/keepassxc.ini create mode 100644 modules/home.legacy/conf/latexindent/default.nix create mode 100644 modules/home.legacy/conf/latexindent/indentconfig.yaml create mode 100644 modules/home.legacy/conf/latexindent/mysettings.yaml create mode 100644 modules/home.legacy/conf/less/command.less create mode 100644 modules/home.legacy/conf/less/default.nix create mode 100644 modules/home.legacy/conf/less/env.less create mode 100644 modules/home.legacy/conf/less/line-edit.less create mode 100644 modules/home.legacy/conf/lf/colors create mode 100644 modules/home.legacy/conf/lf/commands/default.nix create mode 100755 modules/home.legacy/conf/lf/commands/scripts/archive.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/broot_jump.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/chmod.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/clear_trash.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/cow_cp.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/dl_file.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/dragon.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/dragon_individual.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/dragon_stay.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/execute.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/follow_link.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/fzf_jump.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/go_project_root.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/mk_dir.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/mk_file.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/mk_file_and_edit.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/mk_ln.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/mk_scr_default.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/mk_scr_temp.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/restore_trash.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/set_wall_paper.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/stripspace.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/trash.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/unarchive.sh create mode 100755 modules/home.legacy/conf/lf/commands/scripts/view_file.sh create mode 100644 modules/home.legacy/conf/lf/default.nix create mode 100644 modules/home.legacy/conf/lf/icons create mode 100644 modules/home.legacy/conf/lf/keybindings/default.nix create mode 100644 modules/home.legacy/conf/mail/accounts/benedikt.nix create mode 100644 modules/home.legacy/conf/mail/accounts/soispha.nix create mode 100644 modules/home.legacy/conf/mail/default.nix create mode 100644 modules/home.legacy/conf/mako/default.nix create mode 100644 modules/home.legacy/conf/mbsync/default.nix create mode 100644 modules/home.legacy/conf/mpd/default.nix create mode 100644 modules/home.legacy/conf/mpd/mpdconf.example create mode 100644 modules/home.legacy/conf/mpv/default.nix create mode 100644 modules/home.legacy/conf/mumble/Mumble.conf create mode 100644 modules/home.legacy/conf/mumble/default.nix create mode 100644 modules/home.legacy/conf/neomutt/default.nix create mode 100644 modules/home.legacy/conf/nix-index/default.nix create mode 100644 modules/home.legacy/conf/npm/.npmrc create mode 100644 modules/home.legacy/conf/npm/default.nix create mode 100644 modules/home.legacy/conf/nvim/autocmds/default.nix create mode 100644 modules/home.legacy/conf/nvim/clipboard/default.nix create mode 100644 modules/home.legacy/conf/nvim/default.nix create mode 100644 modules/home.legacy/conf/nvim/files/default.nix create mode 100644 modules/home.legacy/conf/nvim/files/ftplugin/tex.lua create mode 100644 modules/home.legacy/conf/nvim/mappings/default.nix create mode 100644 modules/home.legacy/conf/nvim/options/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/colorscheme/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/colorscheme/lua/mk_todos_readable.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/colorscheme/lua/nightfox.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/comment-nvim/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/debugprint/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/debugprint/lua/debugprint.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/femaco/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/femaco/lua/femaco.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/flatten-nvim/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/goto-preview/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/goto-preview/lua/goto-preview.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/harpoon/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/leap/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lf-nvim/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp-progress-nvim/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/keymaps/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/bashls.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ccls.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ltex.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/lua-ls.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/nil-ls.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/openscad.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/pylyzer.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/quick-lint-js.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ruff-lsp.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/rust-analyzer.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/texlab.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/lspkind/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/ltex_extra/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/lualine/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/luasnip/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/luasnip/lua/luasnip.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/all.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/html/html.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/tex/greek.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/neorg/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/nvim-cmp/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/nvim-lint/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/raw_plugins/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/defaults/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/extensions/bibtex/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/extensions/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/extensions/frecency/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/extensions/fzy-native/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/extensions/rooter/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/extensions/symbols/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/telescope/keymaps/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/todo-comments/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/treesitter/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/vim-tex/default.nix create mode 100644 modules/home.legacy/conf/nvim/plgs/which-key/default.nix create mode 100644 modules/home.legacy/conf/prusa_slicer/default.nix create mode 100644 modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini create mode 100644 modules/home.legacy/conf/python/default.nix create mode 100644 modules/home.legacy/conf/python/pythonrc.py create mode 100644 modules/home.legacy/conf/rclone/default.nix create mode 100644 modules/home.legacy/conf/rclone/rclone.conf create mode 100644 modules/home.legacy/conf/rofi/default.nix create mode 100644 modules/home.legacy/conf/rofi/nord-twoLines.rasi create mode 100644 modules/home.legacy/conf/ssh/default.nix create mode 100644 modules/home.legacy/conf/starship/default.nix create mode 100644 modules/home.legacy/conf/swayidle/config create mode 100644 modules/home.legacy/conf/swayidle/default.nix create mode 100644 modules/home.legacy/conf/swaylock/GTDcanonical.png create mode 100644 modules/home.legacy/conf/swaylock/commands.jpg create mode 100644 modules/home.legacy/conf/swaylock/default.nix create mode 100644 modules/home.legacy/conf/swaylock/gnu.png create mode 100644 modules/home.legacy/conf/taskwarrior/default.nix create mode 100644 modules/home.legacy/conf/taskwarrior/firefox/default.nix create mode 100644 modules/home.legacy/conf/taskwarrior/hooks/default.nix create mode 100755 modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh create mode 100755 modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh create mode 100755 modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh create mode 100755 modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py create mode 100755 modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py create mode 100644 modules/home.legacy/conf/taskwarrior/nord.theme create mode 100644 modules/home.legacy/conf/taskwarrior/projects/default.nix create mode 100644 modules/home.legacy/conf/timewarrior/default.nix create mode 100644 modules/home.legacy/conf/timewarrior/nord.theme create mode 100644 modules/home.legacy/conf/tridactyl/config.vim create mode 100644 modules/home.legacy/conf/tridactyl/default.nix create mode 100644 modules/home.legacy/conf/unison/default.nix create mode 100644 modules/home.legacy/conf/xdg/default.nix create mode 100755 modules/home.legacy/conf/xdg/url_handler.sh create mode 100644 modules/home.legacy/conf/xdg/xdg_vars.nix create mode 100644 modules/home.legacy/conf/yambar/config/config.yml create mode 100644 modules/home.legacy/conf/yambar/config/laptop.yml create mode 100644 modules/home.legacy/conf/yambar/default.nix create mode 100755 modules/home.legacy/conf/yambar/scripts/disk.sh create mode 100755 modules/home.legacy/conf/yambar/scripts/mpd_song_name.sh create mode 100755 modules/home.legacy/conf/yambar/scripts/network.sh create mode 100755 modules/home.legacy/conf/yambar/scripts/sound-volume.sh create mode 100644 modules/home.legacy/conf/yt/config.toml create mode 100644 modules/home.legacy/conf/yt/default.nix create mode 100644 modules/home.legacy/conf/yt/input.conf create mode 100644 modules/home.legacy/conf/yt/mpv.conf create mode 100644 modules/home.legacy/conf/ytcc/default.nix create mode 100644 modules/home.legacy/conf/ytcc/ytcc.conf create mode 100644 modules/home.legacy/conf/zsh/config/command_not_found.sh create mode 100644 modules/home.legacy/conf/zsh/config/command_not_found_insult.sh create mode 100644 modules/home.legacy/conf/zsh/config/custom_cursor.zsh create mode 100644 modules/home.legacy/conf/zsh/config/zsh-init.zsh create mode 100644 modules/home.legacy/conf/zsh/default.nix create mode 100644 modules/home.legacy/default.nix create mode 100644 modules/home.legacy/files/default.nix create mode 100644 modules/home.legacy/files/manifest_json/default.nix create mode 100644 modules/home.legacy/files/manifest_json/profile/manifest.json create mode 100644 modules/home.legacy/files/wallpaper/abstract-nord.png create mode 100644 modules/home.legacy/files/wallpaper/default.nix create mode 100644 modules/home.legacy/impermanence/default.nix create mode 100644 modules/home.legacy/pkgs/default.nix create mode 100644 modules/home.legacy/wms/default.nix create mode 100644 modules/home.legacy/wms/plasma/default.nix create mode 100644 modules/home.legacy/wms/river/default.nix create mode 100755 modules/home.legacy/wms/river/init.sh create mode 100644 modules/home.legacy/wms/river/res/keys.ron create mode 100644 modules/home.legacy/wms/river/res/moonlander.ron create mode 100644 modules/home.legacy/wms/sway/default.nix delete mode 100644 modules/home/conf/alacritty/default.nix delete mode 100644 modules/home/conf/alacritty/toml/base.toml delete mode 100644 modules/home/conf/alacritty/toml/bell.toml delete mode 100644 modules/home/conf/alacritty/toml/colorscheme.toml delete mode 100644 modules/home/conf/alacritty/toml/cursor.toml delete mode 100644 modules/home/conf/alacritty/toml/env.toml delete mode 100644 modules/home/conf/alacritty/toml/font.toml delete mode 100644 modules/home/conf/alacritty/toml/hints.toml delete mode 100644 modules/home/conf/alacritty/toml/keyboard_bindings.toml delete mode 100644 modules/home/conf/alacritty/toml/mouse.toml delete mode 100644 modules/home/conf/alacritty/toml/mouse_bindings.toml delete mode 100644 modules/home/conf/alacritty/toml/scrolling.toml delete mode 100644 modules/home/conf/alacritty/toml/selection.toml delete mode 100644 modules/home/conf/alacritty/toml/window.toml delete mode 100644 modules/home/conf/alacritty/yaml/base.yml delete mode 100644 modules/home/conf/alacritty/yaml/bell.yml delete mode 100644 modules/home/conf/alacritty/yaml/colors.yml delete mode 100644 modules/home/conf/alacritty/yaml/colorscheme.yml delete mode 100644 modules/home/conf/alacritty/yaml/cursor.yml delete mode 100644 modules/home/conf/alacritty/yaml/debug.yml delete mode 100644 modules/home/conf/alacritty/yaml/env.yml delete mode 100644 modules/home/conf/alacritty/yaml/font.yml delete mode 100644 modules/home/conf/alacritty/yaml/hints.yml delete mode 100644 modules/home/conf/alacritty/yaml/key_bindings.yml delete mode 100644 modules/home/conf/alacritty/yaml/mouse.yml delete mode 100644 modules/home/conf/alacritty/yaml/mouse_bindings.yml delete mode 100644 modules/home/conf/alacritty/yaml/scrolling.yml delete mode 100644 modules/home/conf/alacritty/yaml/selection.yml delete mode 100644 modules/home/conf/alacritty/yaml/shell.yml delete mode 100644 modules/home/conf/alacritty/yaml/window.yml delete mode 100644 modules/home/conf/beets/default.nix delete mode 100644 modules/home/conf/beets/plugins.nix delete mode 100644 modules/home/conf/beets/plugins/badfiles/default.nix delete mode 100644 modules/home/conf/beets/plugins/default.nix delete mode 100644 modules/home/conf/beets/plugins/duplicates/default.nix delete mode 100644 modules/home/conf/beets/plugins/fuzzy/default.nix delete mode 100644 modules/home/conf/beets/plugins/ihate/default.nix delete mode 100644 modules/home/conf/beets/plugins/inline/default.nix delete mode 100644 modules/home/conf/beets/plugins/lastgenre/default.nix delete mode 100644 modules/home/conf/beets/plugins/lyrics/default.nix delete mode 100644 modules/home/conf/beets/plugins/mbsubmit/default.nix delete mode 100644 modules/home/conf/beets/plugins/play/default.nix delete mode 100644 modules/home/conf/beets/plugins/replaygain/default.nix delete mode 100644 modules/home/conf/beets/plugins/smartplaylist/default.nix delete mode 100644 modules/home/conf/beets/plugins/xtractor/default.nix delete mode 100644 modules/home/conf/beets/replace_override.yaml delete mode 100644 modules/home/conf/btop/default.nix delete mode 100644 modules/home/conf/dconf/default.nix delete mode 100644 modules/home/conf/default.nix delete mode 100644 modules/home/conf/direnv/default.nix delete mode 100644 modules/home/conf/firefox/config/bookmarks/default.nix delete mode 100644 modules/home/conf/firefox/config/bookmarks/lib.nix delete mode 100644 modules/home/conf/firefox/config/chrome/userChrome.css delete mode 100644 modules/home/conf/firefox/config/extensions/extensions.json delete mode 100644 modules/home/conf/firefox/config/extensions/native_messaging_hosts/default.nix delete mode 100644 modules/home/conf/firefox/config/policies/default.nix delete mode 100644 modules/home/conf/firefox/config/prefs/default.nix delete mode 100644 modules/home/conf/firefox/config/prefs/override.js delete mode 100644 modules/home/conf/firefox/config/search/engines/default.nix delete mode 100644 modules/home/conf/firefox/config/search/engines/logos/arch_linux.svg delete mode 100644 modules/home/conf/firefox/config/search/engines/logos/brave.svg delete mode 100644 modules/home/conf/firefox/config/search/engines/logos/google_scholar.ico delete mode 100644 modules/home/conf/firefox/config/search/engines/logos/rust_std.svg delete mode 100644 modules/home/conf/firefox/config/search/engines/logos/rust_tokio.png delete mode 100644 modules/home/conf/firefox/config/search/engines/logos/wikipedia.svg delete mode 100644 modules/home/conf/firefox/default.nix delete mode 100644 modules/home/conf/firefox/package.nix delete mode 100644 modules/home/conf/firefox/scripts/default.nix delete mode 100755 modules/home/conf/firefox/scripts/extract_cookies.sh delete mode 100755 modules/home/conf/firefox/scripts/unzip_mozlz4.py delete mode 100755 modules/home/conf/firefox/scripts/update_extensions.sh delete mode 100644 modules/home/conf/gammastep/default.nix delete mode 100644 modules/home/conf/git/aliases.nix delete mode 100644 modules/home/conf/git/default.nix delete mode 100644 modules/home/conf/git/git_ignore.git delete mode 100644 modules/home/conf/git/git_template.git delete mode 100644 modules/home/conf/gpg/default.nix delete mode 100644 modules/home/conf/gpg/keys/key_1.asc delete mode 100644 modules/home/conf/gpg/keys/key_2.asc delete mode 100644 modules/home/conf/gtk/default.nix delete mode 100644 modules/home/conf/himalaya/default.nix delete mode 100644 modules/home/conf/hyfetch/default.nix delete mode 100644 modules/home/conf/iamb/config.json delete mode 100644 modules/home/conf/iamb/default.nix delete mode 100644 modules/home/conf/keepassxc/default.nix delete mode 100644 modules/home/conf/keepassxc/keepassxc.ini delete mode 100644 modules/home/conf/latexindent/default.nix delete mode 100644 modules/home/conf/latexindent/indentconfig.yaml delete mode 100644 modules/home/conf/latexindent/mysettings.yaml delete mode 100644 modules/home/conf/less/command.less delete mode 100644 modules/home/conf/less/default.nix delete mode 100644 modules/home/conf/less/env.less delete mode 100644 modules/home/conf/less/line-edit.less delete mode 100644 modules/home/conf/lf/colors delete mode 100644 modules/home/conf/lf/commands/default.nix delete mode 100755 modules/home/conf/lf/commands/scripts/archive.sh delete mode 100755 modules/home/conf/lf/commands/scripts/broot_jump.sh delete mode 100755 modules/home/conf/lf/commands/scripts/chmod.sh delete mode 100755 modules/home/conf/lf/commands/scripts/clear_trash.sh delete mode 100755 modules/home/conf/lf/commands/scripts/cow_cp.sh delete mode 100755 modules/home/conf/lf/commands/scripts/dl_file.sh delete mode 100755 modules/home/conf/lf/commands/scripts/dragon.sh delete mode 100755 modules/home/conf/lf/commands/scripts/dragon_individual.sh delete mode 100755 modules/home/conf/lf/commands/scripts/dragon_stay.sh delete mode 100755 modules/home/conf/lf/commands/scripts/execute.sh delete mode 100755 modules/home/conf/lf/commands/scripts/follow_link.sh delete mode 100755 modules/home/conf/lf/commands/scripts/fzf_jump.sh delete mode 100755 modules/home/conf/lf/commands/scripts/go_project_root.sh delete mode 100755 modules/home/conf/lf/commands/scripts/mk_dir.sh delete mode 100755 modules/home/conf/lf/commands/scripts/mk_file.sh delete mode 100755 modules/home/conf/lf/commands/scripts/mk_file_and_edit.sh delete mode 100755 modules/home/conf/lf/commands/scripts/mk_ln.sh delete mode 100755 modules/home/conf/lf/commands/scripts/mk_scr_default.sh delete mode 100755 modules/home/conf/lf/commands/scripts/mk_scr_temp.sh delete mode 100755 modules/home/conf/lf/commands/scripts/restore_trash.sh delete mode 100755 modules/home/conf/lf/commands/scripts/set_wall_paper.sh delete mode 100755 modules/home/conf/lf/commands/scripts/stripspace.sh delete mode 100755 modules/home/conf/lf/commands/scripts/trash.sh delete mode 100755 modules/home/conf/lf/commands/scripts/unarchive.sh delete mode 100755 modules/home/conf/lf/commands/scripts/view_file.sh delete mode 100644 modules/home/conf/lf/default.nix delete mode 100644 modules/home/conf/lf/icons delete mode 100644 modules/home/conf/lf/keybindings/default.nix delete mode 100644 modules/home/conf/mail/accounts/benedikt.nix delete mode 100644 modules/home/conf/mail/accounts/soispha.nix delete mode 100644 modules/home/conf/mail/default.nix delete mode 100644 modules/home/conf/mako/default.nix delete mode 100644 modules/home/conf/mbsync/default.nix delete mode 100644 modules/home/conf/mpd/default.nix delete mode 100644 modules/home/conf/mpd/mpdconf.example delete mode 100644 modules/home/conf/mpv/default.nix delete mode 100644 modules/home/conf/mumble/Mumble.conf delete mode 100644 modules/home/conf/mumble/default.nix delete mode 100644 modules/home/conf/neomutt/default.nix delete mode 100644 modules/home/conf/nix-index/default.nix delete mode 100644 modules/home/conf/npm/.npmrc delete mode 100644 modules/home/conf/npm/default.nix delete mode 100644 modules/home/conf/nvim/autocmds/default.nix delete mode 100644 modules/home/conf/nvim/clipboard/default.nix delete mode 100644 modules/home/conf/nvim/default.nix delete mode 100644 modules/home/conf/nvim/files/default.nix delete mode 100644 modules/home/conf/nvim/files/ftplugin/tex.lua delete mode 100644 modules/home/conf/nvim/mappings/default.nix delete mode 100644 modules/home/conf/nvim/options/default.nix delete mode 100644 modules/home/conf/nvim/plgs/colorscheme/default.nix delete mode 100644 modules/home/conf/nvim/plgs/colorscheme/lua/mk_todos_readable.lua delete mode 100644 modules/home/conf/nvim/plgs/colorscheme/lua/nightfox.lua delete mode 100644 modules/home/conf/nvim/plgs/comment-nvim/default.nix delete mode 100644 modules/home/conf/nvim/plgs/debugprint/default.nix delete mode 100644 modules/home/conf/nvim/plgs/debugprint/lua/debugprint.lua delete mode 100644 modules/home/conf/nvim/plgs/default.nix delete mode 100644 modules/home/conf/nvim/plgs/femaco/default.nix delete mode 100644 modules/home/conf/nvim/plgs/femaco/lua/femaco.lua delete mode 100644 modules/home/conf/nvim/plgs/flatten-nvim/default.nix delete mode 100644 modules/home/conf/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua delete mode 100644 modules/home/conf/nvim/plgs/goto-preview/default.nix delete mode 100644 modules/home/conf/nvim/plgs/goto-preview/lua/goto-preview.lua delete mode 100644 modules/home/conf/nvim/plgs/harpoon/default.nix delete mode 100644 modules/home/conf/nvim/plgs/leap/default.nix delete mode 100644 modules/home/conf/nvim/plgs/lf-nvim/default.nix delete mode 100644 modules/home/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua delete mode 100644 modules/home/conf/nvim/plgs/lsp-progress-nvim/default.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua delete mode 100644 modules/home/conf/nvim/plgs/lsp/default.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/keymaps/default.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/default.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/bashls.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/ccls.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/ltex.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/lua-ls.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/nil-ls.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/openscad.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/pylyzer.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/quick-lint-js.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/ruff-lsp.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/rust-analyzer.nix delete mode 100644 modules/home/conf/nvim/plgs/lsp/servers/servers/texlab.nix delete mode 100644 modules/home/conf/nvim/plgs/lspkind/default.nix delete mode 100644 modules/home/conf/nvim/plgs/ltex_extra/default.nix delete mode 100644 modules/home/conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua delete mode 100644 modules/home/conf/nvim/plgs/lualine/default.nix delete mode 100644 modules/home/conf/nvim/plgs/luasnip/default.nix delete mode 100644 modules/home/conf/nvim/plgs/luasnip/lua/luasnip.lua delete mode 100644 modules/home/conf/nvim/plgs/luasnip/lua/snippets/all.lua delete mode 100644 modules/home/conf/nvim/plgs/luasnip/lua/snippets/html/html.lua delete mode 100644 modules/home/conf/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua delete mode 100644 modules/home/conf/nvim/plgs/luasnip/lua/snippets/tex/greek.lua delete mode 100644 modules/home/conf/nvim/plgs/neorg/default.nix delete mode 100644 modules/home/conf/nvim/plgs/nvim-cmp/default.nix delete mode 100644 modules/home/conf/nvim/plgs/nvim-lint/default.nix delete mode 100644 modules/home/conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua delete mode 100644 modules/home/conf/nvim/plgs/raw_plugins/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/defaults/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/extensions/bibtex/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/extensions/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/extensions/frecency/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/extensions/fzy-native/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/extensions/rooter/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua delete mode 100644 modules/home/conf/nvim/plgs/telescope/extensions/symbols/default.nix delete mode 100644 modules/home/conf/nvim/plgs/telescope/keymaps/default.nix delete mode 100644 modules/home/conf/nvim/plgs/todo-comments/default.nix delete mode 100644 modules/home/conf/nvim/plgs/treesitter/default.nix delete mode 100644 modules/home/conf/nvim/plgs/vim-tex/default.nix delete mode 100644 modules/home/conf/nvim/plgs/which-key/default.nix delete mode 100644 modules/home/conf/prusa_slicer/default.nix delete mode 100644 modules/home/conf/prusa_slicer/prusa_slicer.ini delete mode 100644 modules/home/conf/python/default.nix delete mode 100644 modules/home/conf/python/pythonrc.py delete mode 100644 modules/home/conf/rclone/default.nix delete mode 100644 modules/home/conf/rclone/rclone.conf delete mode 100644 modules/home/conf/rofi/default.nix delete mode 100644 modules/home/conf/rofi/nord-twoLines.rasi delete mode 100644 modules/home/conf/ssh/default.nix delete mode 100644 modules/home/conf/starship/default.nix delete mode 100644 modules/home/conf/swayidle/config delete mode 100644 modules/home/conf/swayidle/default.nix delete mode 100644 modules/home/conf/swaylock/GTDcanonical.png delete mode 100644 modules/home/conf/swaylock/commands.jpg delete mode 100644 modules/home/conf/swaylock/default.nix delete mode 100644 modules/home/conf/swaylock/gnu.png delete mode 100644 modules/home/conf/taskwarrior/default.nix delete mode 100644 modules/home/conf/taskwarrior/firefox/default.nix delete mode 100644 modules/home/conf/taskwarrior/hooks/default.nix delete mode 100755 modules/home/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh delete mode 100755 modules/home/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh delete mode 100755 modules/home/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh delete mode 100755 modules/home/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py delete mode 100755 modules/home/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py delete mode 100644 modules/home/conf/taskwarrior/nord.theme delete mode 100644 modules/home/conf/taskwarrior/projects/default.nix delete mode 100644 modules/home/conf/timewarrior/default.nix delete mode 100644 modules/home/conf/timewarrior/nord.theme delete mode 100644 modules/home/conf/tridactyl/config.vim delete mode 100644 modules/home/conf/tridactyl/default.nix delete mode 100644 modules/home/conf/unison/default.nix delete mode 100644 modules/home/conf/xdg/default.nix delete mode 100755 modules/home/conf/xdg/url_handler.sh delete mode 100644 modules/home/conf/xdg/xdg_vars.nix delete mode 100644 modules/home/conf/yambar/config/config.yml delete mode 100644 modules/home/conf/yambar/config/laptop.yml delete mode 100644 modules/home/conf/yambar/default.nix delete mode 100755 modules/home/conf/yambar/scripts/disk.sh delete mode 100755 modules/home/conf/yambar/scripts/mpd_song_name.sh delete mode 100755 modules/home/conf/yambar/scripts/network.sh delete mode 100755 modules/home/conf/yambar/scripts/sound-volume.sh delete mode 100644 modules/home/conf/yt/config.toml delete mode 100644 modules/home/conf/yt/default.nix delete mode 100644 modules/home/conf/yt/input.conf delete mode 100644 modules/home/conf/yt/mpv.conf delete mode 100644 modules/home/conf/ytcc/default.nix delete mode 100644 modules/home/conf/ytcc/ytcc.conf delete mode 100644 modules/home/conf/zsh/config/command_not_found.sh delete mode 100644 modules/home/conf/zsh/config/command_not_found_insult.sh delete mode 100644 modules/home/conf/zsh/config/custom_cursor.zsh delete mode 100644 modules/home/conf/zsh/config/zsh-init.zsh delete mode 100644 modules/home/conf/zsh/default.nix delete mode 100644 modules/home/default.nix delete mode 100644 modules/home/files/default.nix delete mode 100644 modules/home/files/manifest_json/default.nix delete mode 100644 modules/home/files/manifest_json/profile/manifest.json delete mode 100644 modules/home/files/wallpaper/abstract-nord.png delete mode 100644 modules/home/files/wallpaper/default.nix delete mode 100644 modules/home/impermanence/default.nix delete mode 100644 modules/home/pkgs/default.nix delete mode 100644 modules/home/wms/default.nix delete mode 100644 modules/home/wms/plasma/default.nix delete mode 100644 modules/home/wms/river/default.nix delete mode 100755 modules/home/wms/river/init.sh delete mode 100644 modules/home/wms/river/res/keys.ron delete mode 100644 modules/home/wms/river/res/moonlander.ron delete mode 100644 modules/home/wms/sway/default.nix delete mode 100644 modules/system/bluetooth/default.nix delete mode 100755 modules/system/boot/boot_pictures/gnu.png delete mode 100755 modules/system/boot/boot_pictures/gnulin_emb_1.png delete mode 100755 modules/system/boot/boot_pictures/gnulin_emb_2.png delete mode 100644 modules/system/boot/default.nix delete mode 100644 modules/system/boot/iso_entry/archlive_iso.nix delete mode 100644 modules/system/boot/iso_entry/signing_key.nix delete mode 100644 modules/system/cleanup/default.nix delete mode 100644 modules/system/default.nix delete mode 100644 modules/system/disks/default.nix delete mode 100644 modules/system/disks/fstrim.nix delete mode 100644 modules/system/disks/hibernate.nix delete mode 100644 modules/system/documentation/default.nix delete mode 100644 modules/system/fonts/default.nix delete mode 100644 modules/system/fonts/emoji_font.xml delete mode 100644 modules/system/hardware/default.nix delete mode 100644 modules/system/home-manager/default.nix delete mode 100644 modules/system/impermanence/default.nix delete mode 100644 modules/system/laptop/default.nix delete mode 100644 modules/system/libvirtd/default.nix delete mode 100644 modules/system/locale/default.nix delete mode 100644 modules/system/locale/keymaps/dvorak_modified.xkb delete mode 100644 modules/system/locale/keymaps/us_modified.xkb delete mode 100644 modules/system/networking/default.nix delete mode 100644 modules/system/nixpkgs/config.nix delete mode 100644 modules/system/nixpkgs/default.nix delete mode 100644 modules/system/polkit/default.nix delete mode 100644 modules/system/power/default.nix delete mode 100644 modules/system/secrets/default.nix delete mode 100644 modules/system/secrets/lf/cd_paths.age delete mode 100644 modules/system/secrets/secrets.nix delete mode 100644 modules/system/secrets/serverphone/ca.key delete mode 100644 modules/system/secrets/serverphone/server.key delete mode 100644 modules/system/secrets/taskserver/ca.cert delete mode 100644 modules/system/secrets/taskserver/credentials delete mode 100644 modules/system/secrets/taskserver/private.key delete mode 100644 modules/system/secrets/taskserver/public.cert delete mode 100755 modules/system/secrets/update_secrets.sh delete mode 100644 modules/system/services/adb/default.nix delete mode 100644 modules/system/services/backup/default.nix delete mode 100644 modules/system/services/dconf/default.nix delete mode 100644 modules/system/services/default.nix delete mode 100644 modules/system/services/fwupd/default.nix delete mode 100644 modules/system/services/issue_file/default.nix delete mode 100644 modules/system/services/nix/default.nix delete mode 100644 modules/system/services/openssh/default.nix delete mode 100644 modules/system/services/postgresql/default.nix delete mode 100644 modules/system/services/printing/default.nix delete mode 100644 modules/system/services/scanning/default.nix delete mode 100644 modules/system/services/serverphone/certificates/ca.crt delete mode 100644 modules/system/services/serverphone/certificates/server.crt delete mode 100644 modules/system/services/serverphone/default.nix delete mode 120000 modules/system/services/serverphone/keys/key_1 delete mode 120000 modules/system/services/serverphone/keys/key_2 delete mode 100644 modules/system/services/snapper/default.nix delete mode 100644 modules/system/services/steam/default.nix delete mode 100644 modules/system/services/swaylock/default.nix delete mode 100644 modules/system/services/system_diff/default.nix delete mode 100644 modules/system/services/xdg/default.nix delete mode 100755 modules/system/services/xdg/scripts/lf_wrapper.sh delete mode 100755 modules/system/services/xdg/scripts/ranger_wrapper.sh delete mode 100644 modules/system/sound/default.nix delete mode 100644 modules/system/tempfiles/default.nix delete mode 100644 modules/system/users/default.nix delete mode 100644 modules/system/version/default.nix delete mode 100644 modules/system/waydroid/default.nix diff --git a/flake/nixosConfigurations/default.nix b/flake/nixosConfigurations/default.nix index c15d7fdd..c4353d5f 100644 --- a/flake/nixosConfigurations/default.nix +++ b/flake/nixosConfigurations/default.nix @@ -35,8 +35,7 @@ lanzaboote.nixosModules.lanzaboote serverphone.nixosModules.default - # Deduplicate some code in the host files - ../../modules/system + ../../modules ]; specialArgs = { diff --git a/flake/packages/default.nix b/flake/packages/default.nix index cdc45c64..d4258bfa 100644 --- a/flake/packages/default.nix +++ b/flake/packages/default.nix @@ -18,7 +18,7 @@ builtins.mapAttrs ( name: value: let nvim_config = - import ../../modules/home/conf/nvim/default.nix + import ../../modules/home.legacy/conf/nvim/default.nix build_args; build_args = let inherit (value._module.args) pkgs; @@ -80,7 +80,7 @@ myPkgs ))); - firefox = (import ../../modules/home/conf/firefox/scripts) {inherit pkgs sysLib;}; + firefox = (import ../../modules/home.legacy/conf/firefox/scripts) {inherit pkgs sysLib;}; in { # install-iso = nixos-generators.nixosGenerate { diff --git a/modules/by-name-overlay.nix b/modules/by-name-overlay.nix new file mode 100644 index 00000000..b96c1d25 --- /dev/null +++ b/modules/by-name-overlay.nix @@ -0,0 +1,48 @@ +# Adapted from this: https://github.com/NixOS/nixpkgs/blob/1814b56453c91192f6d5a6276079948f9fe96c18/pkgs/top-level/by-name-overlay.nix +{baseDirectory}: let + # Taken straight out of the `nixpkgs/lib/lists.nix` file. + # We can't depended on `pkgs` (and thus on `lib`), because the `pkgs` module argument + # is only defined in modules we import. + flatten = x: + if builtins.isList x + then builtins.concatMap flatten x + else [x]; + # Same thing as flatten. + warn = + # Since Nix 2.23, https://github.com/NixOS/nix/pull/10592 + builtins.warn + or ( + # Do not eta reduce v, so that we have the same strictness as `builtins.warn`. + msg: v: + # `builtins.warn` requires a string message, so we enforce that in our implementation, so that callers aren't accidentally incompatible with newer Nix versions. + assert builtins.isString msg; + builtins.trace "[1;35mevaluation warning:[0m ${msg}" v + ); + # Same thing as flatten. + mapAttrsToList = f: attrs: + builtins.map (name: f name attrs.${name}) (builtins.attrNames attrs); + + # Module files for a single shard + # Type: String -> String -> ListOf Path + namesForShard = shard: type: + if type != "directory" + then warn "Ignored non-directory, whilst importing by-name modules: '${shard}'" [] + else let + mkPath = name: _type: let + path = baseDirectory + "/${shard}/${name}/module.nix"; + in + if builtins.pathExists path + then path + else warn "'${builtins.toString path}' does not exist. Skipped" null; + in + flatten + (builtins.filter (it: it != null) + (mapAttrsToList + mkPath + (builtins.readDir (baseDirectory + "/${shard}")))); + + # A list of all module paths. + # These can the be simply injected into `import` + moduleFiles = flatten (mapAttrsToList namesForShard (builtins.readDir baseDirectory)); +in + moduleFiles diff --git a/modules/by-name/ad/adb/module.nix b/modules/by-name/ad/adb/module.nix new file mode 100644 index 00000000..ec5d4be6 --- /dev/null +++ b/modules/by-name/ad/adb/module.nix @@ -0,0 +1,22 @@ +{ + lib, + config, + ... +}: let + cfg = config.soispha.services.adb; +in { + options.soispha.services.adb = { + enable = lib.mkEnableOption "Android adb bridge"; + user = lib.mkOption { + type = lib.types.str; + example = "soispha"; + default = "soispha"; + description = "Username to grant access to adb bridge"; + }; + }; + + config = lib.mkIf cfg.enable { + programs.adb.enable = true; + users.users."${cfg.user}".extraGroups = ["adbusers"]; + }; +} diff --git a/modules/by-name/ba/backup/module.nix b/modules/by-name/ba/backup/module.nix new file mode 100644 index 00000000..92700bf2 --- /dev/null +++ b/modules/by-name/ba/backup/module.nix @@ -0,0 +1,51 @@ +{ + lib, + pkgs, + config, + ... +}: let + backup-script = pkgs.writeShellScriptBin "backsnap" '' + set -xeu; + + ${pkgs.util-linux}/bin/mount --mkdir "/dev/disk/by-uuid/${cfg.backupDiskUuid}" "/run/media/${cfg.backupDiskUuid}"; + ${pkgs.snap-sync-forked}/bin/snap-sync-forked --UUID "${cfg.backupDiskUuid}" --noconfirm; + ${pkgs.util-linux}/bin/umount "/run/media/${cfg.backupDiskUuid}"; + ''; + + cfg = config.soispha.services.backup; +in { + options.soispha.services.backup = { + enable = lib.mkEnableOption "backups with my forked snap-sync"; + backupDiskUuid = lib.mkOption { + type = lib.types.str; + example = lib.literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89"; + description = "The UUID of the backup disk"; + }; + }; + + config = lib.mkIf cfg.enable { + systemd = { + services.backup = { + wantedBy = lib.mkForce []; + unitConfig = { + Description = "Backup the last snapshots of the persitent-storage subvolume."; + }; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${backup-script}/bin/backsnap"; + }; + }; + + timers.backup = { + wantedBy = ["timers.target"]; + unitConfig = { + Description = "Backup 15min after boot and every 8 hours"; + }; + timerConfig = { + OnBootSec = "15min"; + OnUnitActiveSec = "8h"; + }; + }; + }; + }; +} diff --git a/modules/by-name/bl/bluetooth/module.nix b/modules/by-name/bl/bluetooth/module.nix new file mode 100644 index 00000000..bf1c6a90 --- /dev/null +++ b/modules/by-name/bl/bluetooth/module.nix @@ -0,0 +1,20 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.bluetooth; +in { + options.soispha.bluetooth = { + enable = lib.mkEnableOption "an integrated bluetooth setup."; + }; + + config = lib.mkIf cfg.enable { + hardware = { + bluetooth = { + enable = true; + powerOnBoot = !config.soispha.laptop.enable; + }; + }; + }; +} diff --git a/modules/by-name/bo/boot/boot_pictures/gnu.png b/modules/by-name/bo/boot/boot_pictures/gnu.png new file mode 100755 index 00000000..d07dee3e Binary files /dev/null and b/modules/by-name/bo/boot/boot_pictures/gnu.png differ diff --git a/modules/by-name/bo/boot/boot_pictures/gnulin_emb_1.png b/modules/by-name/bo/boot/boot_pictures/gnulin_emb_1.png new file mode 100755 index 00000000..483f2681 Binary files /dev/null and b/modules/by-name/bo/boot/boot_pictures/gnulin_emb_1.png differ diff --git a/modules/by-name/bo/boot/boot_pictures/gnulin_emb_2.png b/modules/by-name/bo/boot/boot_pictures/gnulin_emb_2.png new file mode 100755 index 00000000..48cd6ad7 Binary files /dev/null and b/modules/by-name/bo/boot/boot_pictures/gnulin_emb_2.png differ diff --git a/modules/by-name/bo/boot/iso_entry/archlive_iso.nix b/modules/by-name/bo/boot/iso_entry/archlive_iso.nix new file mode 100644 index 00000000..d19a4a87 --- /dev/null +++ b/modules/by-name/bo/boot/iso_entry/archlive_iso.nix @@ -0,0 +1,77 @@ +{pkgs ? (builtins.getFlake "nixpkgs").legacyPackages."x86_64-linux"}: let + signing_key = import ./signing_key.nix {inherit pkgs;}; + + checked_iso = pkgs.stdenv.mkDerivation { + pname = "archlinux-iso"; + version = "2024.05.01"; + + srcs = [ + (pkgs.fetchurl { + url = "https://archlinux.org/iso/2024.05.01/archlinux-2024.05.01-x86_64.iso.sig"; + hash = "sha256-QOGYng6a7zA5EJKGotDccJ7fD2MmPPXQEdVr1kjJvi4="; + }) + (pkgs.fetchurl { + url = "https://mirror.informatik.tu-freiberg.de/arch/iso/latest/archlinux-2024.05.01-x86_64.iso"; + hash = "sha256-G0oE74pzUIUqEwcO5JhEKwh6YHoYhAtN19mYZ+tfakw="; + }) + (pkgs.fetchurl { + url = "https://archlinux.org/iso/2024.05.01/b2sums.txt"; + hash = "sha256-HSMS13hHXFKKQsCA8spa7XtirHCBTmePwhOsStVPbHw="; + }) + ]; + + dontUnpack = true; + + nativeBuildInputs = with pkgs; [ + sequoia-sq + ]; + + buildPhase = + /* + bash + */ + '' + cp -r "${signing_key}" ./release-key.pgp + for src in $srcs; do + cp -r "$src" "$(stripHash "$src")" + done + + sed '2d;3d;4d' b2sums.txt > b2sums_clean.txt + + # As per the directions from: https://archlinux.org/download/ + + # blake hash check + b2sum -c ./b2sums_clean.txt + + # pgp signature check + sq verify --signer-file release-key.pgp --detached archlinux-2024.05.01-x86_64.iso.sig archlinux-2024.05.01-x86_64.iso + ''; + + installPhase = '' + cp archlinux-2024.05.01-x86_64.iso "$out"; + ''; + }; +in + pkgs.stdenv.mkDerivation { + name = "live_iso_boot_entry"; + + src = checked_iso; + + dontUnpack = true; + + nativeBuildInputs = with pkgs; [ + libarchive # for bsdtar + ]; + + buildPhase = '' + mkdir iso + bsdtar -xf "$src" -C iso + ''; + + installPhase = '' + install -D ./iso/arch/boot/x86_64/initramfs-linux.img "$out/live/initramfs-linux.img" + install -D ./iso/arch/boot/x86_64/vmlinuz-linux "$out/live/vmlinuz-linux" + + install -D "$src" "$out/archlinux.iso" + ''; + } diff --git a/modules/by-name/bo/boot/iso_entry/signing_key.nix b/modules/by-name/bo/boot/iso_entry/signing_key.nix new file mode 100644 index 00000000..788447be --- /dev/null +++ b/modules/by-name/bo/boot/iso_entry/signing_key.nix @@ -0,0 +1,18 @@ +{pkgs ? (builtins.getFlake "nixpkgs").legacyPackages."x86_64-linux"}: +pkgs.stdenv.mkDerivation { + name = "archlinux_signing_keys"; + + outputHash = "sha256-evGWzkxMaZw3rlixKsyWCS/ZvNuZ+OfXQb6sgiHz9XY="; + outputHashAlgo = "sha256"; + NIX_SSL_CERT_FILE = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; + + nativeBuildInputs = with pkgs; [ + sequoia-sq + ]; + + dontUnpack = true; + + buildPhase = '' + sq --verbose --no-cert-store --no-key-store network wkd fetch pierre@archlinux.org --output "$out" + ''; +} diff --git a/modules/by-name/bo/boot/module.nix b/modules/by-name/bo/boot/module.nix new file mode 100644 index 00000000..711e9d23 --- /dev/null +++ b/modules/by-name/bo/boot/module.nix @@ -0,0 +1,130 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.soispha.boot; +in { + options.soispha.boot = { + enable = lib.mkEnableOption "Bootloader configuration"; + # TODO: Add this option <2024-05-16> + # enableIsoEntry = lib.mkEnableOption "an tails iso boot entry"; + }; + + config = lib.mkIf cfg.enable ( + # let + # cfg = config.boot.loader.systemd-boot; + # inherit (config.boot.loader) efi; + # + # esa = n: lib.strings.escapeShellArg n; + # + # bootMountPoint = + # if cfg.xbootldrMountPoint != null + # then cfg.xbootldrMountPoint + # else efi.efiSysMountPoint; + # + # nixosDir = "/EFI/nixos"; + # + # # FIXME: This system has two big problems: + # # 1. It does not updated files, which still have the same name + # # 2. It forgets about files, which were 'deleted' in this configuration (these just + # # stay on disk forever) <2024-05-11> + # copyExtraFiles = '' + # echo "[systemd-boot] copying files to ${bootMountPoint}" + # empty_file=$(mktemp) + # + # ${lib.concatStrings (lib.mapAttrsToList (n: v: + # /* + # bash + # */ + # '' + # if ! [ -e ${esa "${bootMountPoint}/${n}"} ]; then + # install -Dp "${v}" ${esa "${bootMountPoint}/${n}"} + # install -D "$empty_file" ${esa "${bootMountPoint}/${nixosDir}/.extra-files/${n}"} + # fi + # '') + # cfg.extraFiles)} + # + # ${lib.concatStrings (lib.mapAttrsToList (n: v: + # /* + # bash + # */ + # '' + # # if ! [ -e ${esa "${bootMountPoint}/loader/entries/${n}"} ]; then + # install -Dp "${pkgs.writeText n v}" ${esa "${bootMountPoint}/loader/entries/${n}"} + # install -D "$empty_file" ${esa "${bootMountPoint}/${nixosDir}/.extra-files/loader/entries/${n}"} + # # fi + # '') + # cfg.extraEntries)} + # ''; + # in + { + # FIXME: Reactviate this whole iso thing when a disko redeploy is done. + # (and switch to tails instead of arch) <2024-05-12> + # + # system.activationScripts = { + # copyExtraFilesForBoot = copyExtraFiles; + # }; + + boot = { + initrd = { + kernelModules = ["nvme" "btrfs"]; + }; + + kernelPackages = pkgs.linuxPackages_latest; + + lanzaboote = { + enable = true; + pkiBundle = "/etc/secureboot"; + + settings = { + # Disable editing the kernel command line (which could allow someone to become root) + editor = false; + default = "@saved"; + }; + }; + + loader = { + systemd-boot = { + # Lanzaboote currently replaces the systemd-boot module. + # This setting is usually set to true in configuration.nix + # generated at installation time. So we force it to false + # for now. + enable = false; + + # extraEntries = { + # "live.conf" = '' + # title Archlinux Live ISO + # linux /live/vmlinuz-linux + # initrd /live/initramfs-linux.img + # options img_dev=${config.soispha.disks.disk} img_loop=/archlinux.iso copytoram + # ''; + # }; + # + # extraFiles = let + # iso = import ./archlive_iso.nix {inherit pkgs;}; + # in { + # "archlinux.iso" = "${iso}/archlinux.iso"; + # "live/initramfs-linux.img" = "${iso}/live/initramfs-linux.img"; + # "live/vmlinuz-linux" = "${iso}/live/vmlinuz-linux"; + # }; + }; + + grub = { + enable = false; + # theme = pkgs.nixos-grub2-theme; + splashImage = ./boot_pictures/gnu.png; + efiSupport = true; + device = "nodev"; # only for efi + }; + + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot"; + }; + }; + }; + } + ); +} diff --git a/modules/by-name/cl/cleanup/module.nix b/modules/by-name/cl/cleanup/module.nix new file mode 100644 index 00000000..f8307b73 --- /dev/null +++ b/modules/by-name/cl/cleanup/module.nix @@ -0,0 +1,19 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.cleanup; +in { + # remove all the bloat, which NixOS installs by default + options.soispha.cleanup = { + enable = lib.mkEnableOption "avoiding of nixos' default installed packages"; + }; + + config = lib.mkIf cfg.enable { + programs.nano.enable = false; + environment = { + defaultPackages = lib.mkForce []; + }; + }; +} diff --git a/modules/by-name/dc/dconf/module.nix b/modules/by-name/dc/dconf/module.nix new file mode 100644 index 00000000..e4a1c7a9 --- /dev/null +++ b/modules/by-name/dc/dconf/module.nix @@ -0,0 +1,8 @@ +{...}: { + # needed to make home-manager play nice with some apps. See: + # https://nix-community.github.io/home-manager/index.xhtml#_why_do_i_get_an_error_message_about_literal_ca_desrt_dconf_literal_or_literal_dconf_service_literal + programs.dconf.enable = true; + # FIXME: This should also be parameterized. <2024-05-16> +} +# vim: nolinebreak nowrap textwidth=0 + diff --git a/modules/by-name/di/disks/fstrim.nix b/modules/by-name/di/disks/fstrim.nix new file mode 100644 index 00000000..6daeb65e --- /dev/null +++ b/modules/by-name/di/disks/fstrim.nix @@ -0,0 +1,42 @@ +{ + pkgs, + lib, + cfg, +}: { + timers.fstrim = lib.mkIf cfg.ssd { + wantedBy = ["timers.target"]; + wants = ["fstrim.service"]; + unitConfig = { + Description = "Discard unused blocks once a week"; + Documentation = "man:fstrim"; + ConditionVirtualization = "!container"; + ConditionPathExists = "!/etc/initrd-release"; + }; + timerConfig = { + OnCalendar = "weekly"; + AccuracySec = "1h"; + Persistent = "true"; + RandomizedDelaySec = "6000"; + }; + }; + services.fstrim = lib.mkIf cfg.ssd { + wantedBy = lib.mkForce []; + unitConfig = { + Description = "Discard unused blocks on filesystems from /etc/fstab"; + Documentation = "man:fstrim(8)"; + ConditionVirtualization = "!container"; + }; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${pkgs.util-linux}/bin/fstrim --listed-in /etc/fstab:/proc/self/mountinfo --verbose --quiet-unsupported"; + PrivateDevices = "no"; + PrivateNetwork = "yes"; + PrivateUsers = "no"; + ProtectKernelTunables = "yes"; + ProtectKernelModules = "yes"; + ProtectControlGroups = "yes"; + MemoryDenyWriteExecute = "yes"; + SystemCallFilter = "@default @file-system @basic-io @system-service"; + }; + }; +} diff --git a/modules/by-name/di/disks/hibernate.nix b/modules/by-name/di/disks/hibernate.nix new file mode 100644 index 00000000..a50e5b57 --- /dev/null +++ b/modules/by-name/di/disks/hibernate.nix @@ -0,0 +1,45 @@ +{pkgs}: { + services = { + hibernate-preparation = { + wantedBy = ["systemd-hibernate.service"]; + unitConfig = { + Description = "Enable swap file and disable zram before hibernate"; + Before = "systemd-hibernate.service"; + }; + serviceConfig = { + Type = "oneshot"; + User = "root"; + ExecStart = "${pkgs.bash}/bin/bash -c \"${pkgs.util-linux}/bin/swapon /swap/swapfile && ${pkgs.util-linux}/bin/swapoff /dev/zram0\""; + }; + }; + + hibernate-resume = { + wantedBy = ["systemd-hibernate.service"]; + unitConfig = { + Description = "Disable swap after resuming from hibernation"; + After = "hibernate.target"; + }; + serviceConfig = { + Type = "oneshot"; + User = "root"; + ExecStart = "${pkgs.util-linux}/bin/swapoff /swap/swapfile"; + }; + }; + # swapoff-start = { + # wantedBy = ["multi-user.target"]; + # unitConfig = { + # Description = "Disable hardware swap after booting"; + # }; + # serviceConfig = { + # Type = "oneshot"; + # User = "root"; + # ExecStart = "${pkgs.util-linux}/bin/swapoff /swap/swapfile"; + # }; + # }; + systemd-hibernate.serviceConfig.Environment = "SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1"; + systemd-logind.serviceConfig.Environment = "SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1"; + }; + sleep.extraConfig = '' + HibernateDelaySec=5m + ''; +} diff --git a/modules/by-name/di/disks/module.nix b/modules/by-name/di/disks/module.nix new file mode 100644 index 00000000..c0e5bcfd --- /dev/null +++ b/modules/by-name/di/disks/module.nix @@ -0,0 +1,133 @@ +{ + config, + lib, + pkgs, + ... +}: let + # FIXME: The iso redeploy requires a bigger efi partition <2024-05-12> + cfg = config.soispha.disks; + defaultMountOptions = [ + "compress-force=zstd:15" # This saves disk space, at a performance cost + "noatime" # should have some performance upsides, and I don't use it anyways + "lazytime" # make time changes in memory + ]; +in { + options.soispha.disks = { + enable = lib.mkEnableOption "disk setup with disko"; + + disk = lib.mkOption { + type = lib.types.path; + example = lib.literalExpression "/dev/disk/by-uuid/0442cb6d-f13a-4635-b487-fa76189774c5"; + description = "The disk used for installing the OS."; + }; + + ssd = lib.mkEnableOption "ssd specific improvements, like trim"; + + swap = { + uuid = lib.mkOption { + type = lib.types.str; + example = lib.literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89"; + description = "The uuid of the swapfile"; + }; + resumeOffset = lib.mkOption { + type = lib.types.str; + example = lib.literalExpression "134324224"; + description = "The resume offset of the swapfile"; + }; + }; + }; + + config = lib.mkIf cfg.enable { + systemd = lib.recursiveUpdate (import ./hibernate.nix {inherit pkgs;}) (import ./fstrim.nix {inherit pkgs lib cfg;}); + + disko.devices = { + disk = { + main = { + device = cfg.disk; + content = { + type = "gpt"; + partitions = { + root = { + size = "100%"; + name = "root"; + content = { + type = "luks"; + name = "nixos"; + extraOpenArgs = ["--allow-discards"]; + content = { + type = "btrfs"; + extraArgs = ["-f" "--label nixos"]; # Override existing partitions + subvolumes = { + "nix" = { + mountpoint = "/nix"; + mountOptions = defaultMountOptions; + }; + "persistent-storage" = { + mountpoint = "/srv"; + mountOptions = defaultMountOptions; + }; + "persistent-storage@snapshots" = { + mountpoint = "/srv/.snapshots"; + mountOptions = defaultMountOptions; + }; + "swap" = { + mountpoint = "/swap"; + mountOptions = defaultMountOptions; + }; + }; + }; + }; + }; + boot = { + type = "EF00"; + size = "512M"; + name = "boot"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + }; + }; + }; + }; + }; + nodev = { + "/" = { + fsType = "tmpfs"; + mountOptions = ["defaults" "size=4G" "mode=755"]; + }; + "/tmp" = { + fsType = "tmpfs"; + mountOptions = ["defaults" "size=16G" "mode=755"]; + }; + }; + }; + fileSystems = { + "/srv" = { + neededForBoot = true; + }; + "/swap" = { + neededForBoot = true; + }; + }; + swapDevices = [ + #{ + # device = "/swap/swapfile"; + # priority = 1; # lower than zramSwap, just in case + # # size = 2048; # TODO: can nixos create a btrfs swapfile correctly? + #} + ]; + zramSwap = { + enable = true; + priority = 10; # needs to be higher than hardware-swap + }; + boot = { + kernelParams = [ + "resume_offset=${cfg.swap.resumeOffset}" + "zswap.enabled=0" # zswap and zram are not really compatible + ]; + resumeDevice = "/dev/disk/by-uuid/${cfg.swap.uuid}"; + }; + }; +} diff --git a/modules/by-name/do/documentation/module.nix b/modules/by-name/do/documentation/module.nix new file mode 100644 index 00000000..4616a991 --- /dev/null +++ b/modules/by-name/do/documentation/module.nix @@ -0,0 +1,25 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.documentation; +in { + options.soispha.documentation = { + enable = lib.mkEnableOption "documentation"; + }; + config = lib.mkIf cfg.enable { + documentation = { + nixos = { + # FIXME: This results in a evaluation failure (with lanzaboote options) <2024-05-23> + includeAllModules = false; + + enable = true; + }; + dev = { + # Add man pages aimed at developers (I guess c library stuff, and the like) + enable = true; + }; + }; + }; +} diff --git a/modules/by-name/fo/fonts/emoji_font.xml b/modules/by-name/fo/fonts/emoji_font.xml new file mode 100644 index 00000000..f3f6bb3e --- /dev/null +++ b/modules/by-name/fo/fonts/emoji_font.xml @@ -0,0 +1,22 @@ + + + + + monospace + + emoji + + + + sans-serif + + emoji + + + + serif + + emoji + + + diff --git a/modules/by-name/fo/fonts/module.nix b/modules/by-name/fo/fonts/module.nix new file mode 100644 index 00000000..abd5664b --- /dev/null +++ b/modules/by-name/fo/fonts/module.nix @@ -0,0 +1,55 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.soispha.fonts; +in { + options.soispha.fonts = { + enable = lib.mkEnableOption "fonts"; + + fonts = lib.mkOption { + type = lib.types.listOf lib.types.str; + example = lib.literalExpression ''["SourceCodePro" "Overpass" "FiraCode"]''; + default = [ + "SourceCodePro" + "Overpass" + ]; + description = "The nerd-fonts to install"; + }; + + enableEmoji = lib.mkEnableOption "emoji font support"; + }; + + config = lib.mkIf cfg.enable { + fonts = { + packages = let + nerdFont = pkgs.nerdfonts.override { + inherit (cfg) fonts; + }; + in + [ + nerdFont + ] + ++ (with pkgs; [liberation_ttf]) + ++ lib.optional cfg.enableEmoji pkgs.noto-fonts-emoji; + + fontconfig = { + # NOTE: This is responsible for color emoji support <2023-08-28> + # WARNING: This could lead to broken font rendering, if the emoji font is used as + # a fallback for normal characters <2024-05-16> + localConf = lib.mkIf cfg.enableEmoji (builtins.readFile ./emoji_font.xml); + + defaultFonts = { + serif = lib.mkForce (["Liberation Serif"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); + sansSerif = lib.mkForce (["Overpass Nerd Font Propo"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); + monospace = lib.mkForce (["SauceCodePro Nerd Font Mono"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); + emoji = lib.mkIf cfg.enableEmoji (lib.mkForce ["Noto Color Emoji"]); + }; + allowType1 = false; + allowBitmaps = false; + }; + }; + }; +} diff --git a/modules/by-name/fw/fwupd/module.nix b/modules/by-name/fw/fwupd/module.nix new file mode 100644 index 00000000..5ad4f467 --- /dev/null +++ b/modules/by-name/fw/fwupd/module.nix @@ -0,0 +1,14 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.services.fwupd; +in { + options.soispha.services.fwupd = { + enable = lib.mkEnableOption "fwupd"; + }; + config = lib.mkIf cfg.enable { + services.fwupd.enable = true; + }; +} diff --git a/modules/by-name/ha/hardware/module.nix b/modules/by-name/ha/hardware/module.nix new file mode 100644 index 00000000..850416b7 --- /dev/null +++ b/modules/by-name/ha/hardware/module.nix @@ -0,0 +1,80 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.soispha.hardware; +in { + options.soispha.hardware = { + enable = lib.mkEnableOption "the various hardware dependend things (and graphics drivers)"; + moonlander = { + enableLiveTraining = lib.mkEnableOption "udev rules for live training"; + enableFlashing = lib.mkEnableOption "udev rules for firmware flashing"; + }; + + cpuType = lib.mkOption { + type = lib.types.enum ["amd" "intel"]; + description = '' + The manuafacturer of the used cpu. + + This is used to enable, for example, the correct microcode updates. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + hardware = { + cpu.amd.updateMicrocode = cfg.cpuType == "amd"; + cpu.intel.updateMicrocode = cfg.cpuType == "intel"; + + # This is enabled manually to support older firmware. + keyboard.zsa.enable = false; + + nitrokey.enable = true; + onlykey.enable = false; + + graphics = { + enable = true; + extraPackages = builtins.attrValues { + inherit + (pkgs) + vaapiVdpau + libvdpau-va-gl + ; + }; + }; + }; + + # TODO: Remove the support for the old keyboards <2024-05-16> + services.udev.extraRules = + lib.strings.optionalString cfg.moonlander.enableLiveTraining '' + # Rules for Oryx web flashing and live training + KERNEL=="hidraw*", ATTRS{idVendor}=="16c0", MODE="0664", GROUP="plugdev" + KERNEL=="hidraw*", ATTRS{idVendor}=="3297", MODE="0664", GROUP="plugdev" + + # Legacy rules for live training over webusb (Not needed for firmware v21+) + # Rule for all ZSA keyboards + SUBSYSTEM=="usb", ATTR{idVendor}=="3297", GROUP="plugdev" + # Rule for the Moonlander + SUBSYSTEM=="usb", ATTR{idVendor}=="3297", ATTR{idProduct}=="1969", GROUP="plugdev" + # Rule for the Ergodox EZ + SUBSYSTEM=="usb", ATTR{idVendor}=="feed", ATTR{idProduct}=="1307", GROUP="plugdev" + # Rule for the Planck EZ + SUBSYSTEM=="usb", ATTR{idVendor}=="feed", ATTR{idProduct}=="6060", GROUP="plugdev" + '' + + lib.strings.optionalString cfg.moonlander.enableFlashing + '' + # Wally Flashing rules for the Ergodox EZ + ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", ENV{ID_MM_DEVICE_IGNORE}="1" + ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789A]?", ENV{MTP_NO_PROBE}="1" + SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789ABCD]?", MODE:="0666" + KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", MODE:="0666" + + # Wally Flashing rules for the Moonlander and Planck EZ + SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", \ + MODE:="0666", \ + SYMLINK+="stm32_dfu" + ''; + }; +} diff --git a/modules/by-name/ho/home-manager/module.nix b/modules/by-name/ho/home-manager/module.nix new file mode 100644 index 00000000..d95bb6ac --- /dev/null +++ b/modules/by-name/ho/home-manager/module.nix @@ -0,0 +1,56 @@ +{ + config, + lib, + pkgsStable, + nixpkgs_open_prs, + sysLib, + # extra information + system, + # bins + # TODO: Integrate these <2024-05-22> + river_init_lesser, + shell_library, + # external deps + user_js, + # modules + impermanence, + nix-index-database, + nixVim, + ... +}: let + cfg = config.soispha.home-manager; +in { + options.soispha.home-manager = { + enable = lib.mkEnableOption "home-manager with custom config."; + }; + + config = lib.mkIf cfg.enable { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users.soispha = import ../../../home.legacy; + extraSpecialArgs = { + inherit + nixpkgs_open_prs + pkgsStable + sysLib + # extra information + + system + # bins + + river_init_lesser + shell_library + # external deps + + user_js + # modules + + impermanence + nixVim + nix-index-database + ; + }; + }; + }; +} diff --git a/modules/by-name/im/impermanence/module.nix b/modules/by-name/im/impermanence/module.nix new file mode 100644 index 00000000..9730dde6 --- /dev/null +++ b/modules/by-name/im/impermanence/module.nix @@ -0,0 +1,57 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.impermanence; +in { + options.soispha.impermanence = { + enable = lib.mkEnableOption "persisting directories and files with impermanence"; + + directories = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = + [ + "/etc/nixos" + "/var/log" + "/var/lib/systemd" + "/var/lib/nixos" + ] + ++ lib.optional config.networking.networkmanager.enable "/etc/NetworkManager" + ++ lib.optional config.boot.lanzaboote.enable "/etc/secureboot" + ++ lib.optional config.hardware.bluetooth.enable "/var/lib/bluetooth" + ++ lib.optional config.virtualisation.waydroid.enable "/var/lib/waydroid" + ++ lib.optional config.services.postgresql.enable "/var/lib/postgresql"; + + defaultText = lib.literalExpression '' + [ + "/etc/nixos" + "/var/log" + "/var/lib/systemd" + "/var/lib/nixos" + ] + ++ lib.optional config.networking.networkmanager.enable "/etc/NetworkManager" + ++ lib.optional config.boot.lanzaboote.enable "/etc/secureboot" + ++ lib.optional config.hardware.bluetooth.enable "/var/lib/bluetooth" + ++ lib.optional config.virtualisation.waydroid.enable "/var/lib/waydroid" + ++ lib.optional config.services.postgresql.enable "/var/lib/postgresql" + ''; + description = "The directories to persist"; + }; + }; + + config = lib.mkIf cfg.enable { + # needed for the hm impermanence config + programs.fuse.userAllowOther = true; + + environment.persistence = { + "/srv" = { + hideMounts = true; + inherit (cfg) directories; + files = [ + "/etc/machine-id" + ]; + }; + }; + }; +} diff --git a/modules/by-name/is/issue_file/module.nix b/modules/by-name/is/issue_file/module.nix new file mode 100644 index 00000000..d8b6faa8 --- /dev/null +++ b/modules/by-name/is/issue_file/module.nix @@ -0,0 +1,52 @@ +{ + config, + self, + pkgs, + lib, + ... +}: let + lastModifiedFile = pkgs.runCommandLocal "formatDate" {} '' + date --date='@${builtins.toString self.sourceInfo.lastModified}' +'%F %T' > $out + ''; + lastModified = lib.strings.replaceStrings ["\n"] [""] ( + builtins.readFile lastModifiedFile + ); +in { + environment.etc.issue = { + # Friendly greeting on the virtual consoles. + text = '' + [?25l[?7l  +  ▗▄▄▄ ▗▄▄▄▄ ▄▄▄▖  +  ▜███▙ ▜███▙ ▟███▛  +  ▜███▙ ▜███▙▟███▛  +  ▜███▙ ▜██████▛  +  ▟█████████████████▙ ▜████▛ ▟▙  +  ▟███████████████████▙ ▜███▙ ▟██▙  +  ▄▄▄▄▖ ▜███▙ ▟███▛  +  ▟███▛ ▜██▛ ▟███▛  +  ▟███▛ ▜▛ ▟███▛  + ▟███████████▛ ▟██████████▙ + ▜██████████▛ ▟███████████▛ +  ▟███▛ ▟▙ ▟███▛  +  ▟███▛ ▟██▙ ▟███▛  +  ▟███▛ ▜███▙ ▝▀▀▀▀  +  ▜██▛ ▜███▙ ▜██████████████████▛  +  ▜▛ ▟████▙ ▜████████████████▛  +  ▟██████▙ ▜███▙  +  ▟███▛▜███▙ ▜███▙  +  ▟███▛ ▜███▙ ▜███▙  +  ▝▀▀▀ ▀▀▀▀▘ ▀▀▀▘  +   +  NixOS ${config.system.nixos.label}  +  -------------- +  +   last update: ${lastModified} +   date: \d +   time: \t +   ipv4: \4 +   ipv6: \6 +   tty: \l +  + ''; + }; +} diff --git a/modules/by-name/la/laptop/module.nix b/modules/by-name/la/laptop/module.nix new file mode 100644 index 00000000..f70230ad --- /dev/null +++ b/modules/by-name/la/laptop/module.nix @@ -0,0 +1,17 @@ +{ + lib, + config, + ... +}: let + cfg = config.soispha.laptop; +in { + # TODO: Add an actual config to this module, instead of the implicit one in home manager. <2024-05-22> + options.soispha.laptop = { + enable = lib.mkEnableOption "Laptop improvements"; + backlight = lib.mkOption { + type = lib.types.str; + example = lib.mdDoc "intel_backlight"; + description = lib.mdDoc "Which backlight to query for the screen brightness"; + }; + }; +} diff --git a/modules/by-name/li/libvirtd/module.nix b/modules/by-name/li/libvirtd/module.nix new file mode 100644 index 00000000..5c519550 --- /dev/null +++ b/modules/by-name/li/libvirtd/module.nix @@ -0,0 +1,27 @@ +{pkgs, ...}: { + # virtualisation = { + # spiceUSBRedirection.enable = true; # TODO: this allows usb access to any user, which shouldn't be that bad + # cores = 8; + # diskSize = 25000; + # useEFIBoot = true; + # resolution = { + # x = 1920; + # y = 1080; + # }; + # memorySize = 8024; + # sharedDirectories = {}; # TODO: add some + # libvirtd = { + # enable = true; + # qemu = { + # package = pkgs.qemu_full; + # ovmf = { + # enable = true; + # packages = [pkgs.OVMFFull.fd]; + # }; + # }; + # }; + # }; + # users.users.soispha.extraGroups = [ + # "libvirtd" # to run libvirt stuff as this user + # ]; +} diff --git a/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb b/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb new file mode 100644 index 00000000..63f5d4fb --- /dev/null +++ b/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb @@ -0,0 +1,15 @@ +partial alphanumeric_keys +xkb_symbols "dvorak-modified" { + name[Group1]= "Dvorak English with additional keys"; + + key {[ o, O, odiaeresis, Odiaeresis]}; + key {[ u, U, udiaeresis, Udiaeresis]}; + key {type[Group1]="EIGHT_LEVEL", + [ a, A, adiaeresis, Adiaeresis, aring, Aring]}; + + + include "us(dvorak)" + include "level3(caps_switch)" + include "level5(ralt_switch)" +}; +// vim: ft=xkb diff --git a/modules/by-name/lo/locale/keymaps/us_modified.xkb b/modules/by-name/lo/locale/keymaps/us_modified.xkb new file mode 100644 index 00000000..6299a5e9 --- /dev/null +++ b/modules/by-name/lo/locale/keymaps/us_modified.xkb @@ -0,0 +1,9 @@ +partial alphanumeric_keys +xkb_symbols "us-modified" { + name[Group1]= "US English with caps lock key as compose key"; + + + include "us(basic)" + include "compose(caps)" +}; +// vim: ft=xkb diff --git a/modules/by-name/lo/locale/module.nix b/modules/by-name/lo/locale/module.nix new file mode 100644 index 00000000..10569216 --- /dev/null +++ b/modules/by-name/lo/locale/module.nix @@ -0,0 +1,57 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.locale; +in { + options.soispha.locale = { + enable = lib.mkEnableOption "locale setup"; + + keyMap = lib.mkOption { + type = lib.types.str; + example = "us"; + default = "dvorak"; + description = "The console key map language to use"; + }; + + timeZone = lib.mkOption { + type = lib.types.str; + default = "Europe/Berlin"; + description = "The time zone to use"; + }; + }; + + config = lib.mkIf cfg.enable { + time = { + inherit (cfg) timeZone; + }; + + i18n = { + defaultLocale = "en_CA.UTF-8"; + extraLocaleSettings = { + LANGUAGE = "en_CA:en_US:en"; + LC_TIME = "en_DK.UTF-8"; + LC_COLLATE = "C.UTF-8"; + }; + }; + + # Layout + console = { + inherit (cfg) keyMap; + }; + + services.xserver.xkb.extraLayouts = { + "us-modified" = { + description = "standard us with caps as compose key."; + languages = ["eng" "swe" "deu"]; + symbolsFile = ./keymaps/us_modified.xkb; + }; + "dvorak-modified" = { + description = "standard dvorak english with german and swedish extra chars."; + languages = ["eng" "swe" "deu"]; + symbolsFile = ./keymaps/dvorak_modified.xkb; + }; + }; + }; +} diff --git a/modules/by-name/ne/networking/module.nix b/modules/by-name/ne/networking/module.nix new file mode 100644 index 00000000..c5f0e491 --- /dev/null +++ b/modules/by-name/ne/networking/module.nix @@ -0,0 +1,88 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.networking; +in { + options.soispha.networking = { + enable = lib.mkEnableOption "networking"; + + mode = lib.mkOption { + type = lib.types.enum ["NetworkManager" "systemd-networkd"]; + example = "systemd-networkd"; + description = "The daemon used to setup networking."; + }; + + userName = lib.mkOption { + type = lib.types.str; + default = "soispha"; + description = '' + The name of the user to allow access to the configured network + ''; + }; + + hostName = lib.mkOption { + type = lib.types.str; + example = "apzu"; + description = "The name of the host"; + }; + }; + + config = { + networking.hostName = cfg.hostName; + + systemd.network = lib.mkIf (cfg.mode == "systemd-networkd") { + networks = { + "tap0" = { + name = "tap0"; + bridge = [ + "virbr0" + ]; + }; + "enp4s0" = { + name = "enp4s0"; + networkConfig = { + DHCP = "yes"; + DNSOverTLS = "yes"; + DNSSEC = "yes"; + }; + bridge = [ + "virbr0" + ]; + }; + }; + + netdevs = { + "tap0" = { + netdevConfig = { + Name = "tap0"; + Kind = "tap"; + }; + tapConfig = { + User = config.users.users."${cfg.userName}".uid; + Group = "libvirtd"; + }; + }; + "virbr0" = { + netdevConfig = { + Name = "br0"; + Kind = "bridge"; + }; + }; + }; + }; + + networking.networkmanager = lib.mkIf (cfg.mode == "NetworkManager") { + enable = true; + dns = "default"; + wifi = { + powersave = true; + }; + }; + + users.users."${cfg.userName}".extraGroups = lib.mkIf (cfg.mode == "NetworkManager") [ + "networkmanager" # allows to configure NetworkManager as this user + ]; + }; +} diff --git a/modules/by-name/ni/nix/module.nix b/modules/by-name/ni/nix/module.nix new file mode 100644 index 00000000..980bbd39 --- /dev/null +++ b/modules/by-name/ni/nix/module.nix @@ -0,0 +1,61 @@ +{ + pkgs, + # flakes + nixpkgs_as_input, + templates, + self, + system, + ... +}: { + nix = { + package = pkgs.nixVersions.latest; + + # Disable nix channels (this is a remnant of old days) + channel.enable = false; + + registry = { + nixpkgs.flake = nixpkgs_as_input; + n.flake = + nixpkgs_as_input + // { + # Otherwise nixpkgs's config and overlays are not available: + + # Both attrs exists, so we just override both and hope + outputs.legacyPackages."${system}" = pkgs; + legacyPackages."${system}" = pkgs; + }; + + t.flake = templates; + + my_flake.flake = self; + m.flake = self; + }; + + gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 7d"; + }; + + settings = { + auto-optimise-store = true; + experimental-features = [ + "nix-command" + "flakes" + #"ca-derivations" + ]; + + use-xdg-base-directories = true; + + #substituters = ["https://cache.ngi0.nixos.org/"]; + #trusted-public-keys = ["cache.ngi0.nixos.org-1:KqH5CBLNSyX184S9BKZJo1LxrxJ9ltnY2uAs5c/f1MA="]; + + fallback = true; # Build from source, if binary can't be substituted + + keep-failed = true; # keep failed tmp build dirs + pure-eval = true; # restrict file system and network access to hash + + sandbox-fallback = false; # Don't disable the sandbox, if the kernel doesn't support it + }; + }; +} diff --git a/modules/by-name/ni/nixpkgs/config.nix b/modules/by-name/ni/nixpkgs/config.nix new file mode 100644 index 00000000..1a24444d --- /dev/null +++ b/modules/by-name/ni/nixpkgs/config.nix @@ -0,0 +1,28 @@ +{ + cfg, + myPkgs, + lib, + ... +}: let + myPkgsOverlay = self: super: myPkgs; +in { + nixpkgs = { + hostPlatform = cfg.systemName; + + overlays = [ + myPkgsOverlay + ]; + + config = { + # TODO: this fails because of the root tempsize, which should be increased + # contentAddressedByDefault = true; + + hostSystem = cfg.systemName; + + allowUnfreePredicate = pkg: + builtins.elem (lib.getName pkg) [ + "pypemicro" # required by pynitrokey + ]; + }; + }; +} diff --git a/modules/by-name/ni/nixpkgs/module.nix b/modules/by-name/ni/nixpkgs/module.nix new file mode 100644 index 00000000..eda3ac89 --- /dev/null +++ b/modules/by-name/ni/nixpkgs/module.nix @@ -0,0 +1,17 @@ +{ + lib, + config, + ... +} @ args: let + cfg = config.soispha.nixpkgs; +in { + options.soispha.nixpkgs = { + enable = lib.mkEnableOption "Nixpkgs config"; + systemName = lib.mkOption { + description = "The name of the system."; + example = "x86_64-linux"; + type = lib.types.str; + }; + }; + config = lib.mkIf cfg.enable (import ./config.nix (args // {inherit cfg;})); +} diff --git a/modules/by-name/op/openssh/module.nix b/modules/by-name/op/openssh/module.nix new file mode 100644 index 00000000..b733dbe7 --- /dev/null +++ b/modules/by-name/op/openssh/module.nix @@ -0,0 +1,15 @@ +{...}: { + services.openssh = { + enable = true; + hostKeys = [ + { + path = "/srv/sshd/ssh_host_ed25519_key"; + rounds = 1000; + type = "ed25519"; + } + ]; + settings = { + PasswordAuthentication = false; + }; + }; +} diff --git a/modules/by-name/pi/printing/module.nix b/modules/by-name/pi/printing/module.nix new file mode 100644 index 00000000..85d15b16 --- /dev/null +++ b/modules/by-name/pi/printing/module.nix @@ -0,0 +1,45 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.services.printing; +in { + options.soispha.services.printing = { + enable = lib.mkEnableOption "default printing configuration"; + }; + + config = lib.mkIf cfg.enable { + services.avahi = { + enable = true; + nssmdns4 = true; + nssmdns6 = true; + openFirewall = true; + }; + + services.printing = { + enable = true; + startWhenNeeded = true; + webInterface = true; + + # deletes `/var/cache/cups`, `/var/lib/cups` and `/var/spool/cups` on cups startup + stateless = true; + + drivers = []; + }; + + hardware = { + printers = { + ensurePrinters = [ + { + name = "Brother"; + description = "Brother DCP-9022CDW"; + model = "everywhere"; + deviceUri = "dnssd://Brother%20DCP-9022CDW._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-30055c773bcf"; + } + ]; + ensureDefaultPrinter = "Brother"; + }; + }; + }; +} diff --git a/modules/by-name/po/polkit/module.nix b/modules/by-name/po/polkit/module.nix new file mode 100644 index 00000000..fb13505b --- /dev/null +++ b/modules/by-name/po/polkit/module.nix @@ -0,0 +1,14 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.polkit; +in { + options.soispha.polkit = { + enable = lib.mkEnableOption "polkit"; + }; + config = lib.mkIf cfg.enable { + security.polkit.enable = true; + }; +} diff --git a/modules/by-name/po/postgresql/module.nix b/modules/by-name/po/postgresql/module.nix new file mode 100644 index 00000000..c47a235c --- /dev/null +++ b/modules/by-name/po/postgresql/module.nix @@ -0,0 +1,17 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.services.postgresql; +in { + options.soispha.services.postgresql = { + enable = lib.mkEnableOption "postgresql"; + }; + + config = lib.mkIf cfg.enable { + services.postgresql = { + enable = true; + }; + }; +} diff --git a/modules/by-name/po/power/module.nix b/modules/by-name/po/power/module.nix new file mode 100644 index 00000000..13013879 --- /dev/null +++ b/modules/by-name/po/power/module.nix @@ -0,0 +1,33 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.power; +in { + options.soispha.power = { + enable = lib.mkEnableOption "power optimizations"; + }; + + config = lib.mkIf cfg.enable { + # see this for reference: https://github.com/NixOS/nixpkgs/issues/211345 + services = { + # conflicts with tlp + power-profiles-daemon.enable = false; + + thermald.enable = true; + + tlp = { + enable = true; + settings = { + CPU_BOOST_ON_AC = 1; + CPU_BOOST_ON_BAT = 0; + CPU_SCALING_GOVERNOR_ON_AC = "performance"; + CPU_SCALING_GOVERNOR_ON_BAT = "powersave"; + SATA_LINKPWR_ON_AC = "max_performance"; + SATA_LINKPWR_ON_BAT = "min_power"; + }; + }; + }; + }; +} diff --git a/modules/by-name/sc/scanning/module.nix b/modules/by-name/sc/scanning/module.nix new file mode 100644 index 00000000..dda507fa --- /dev/null +++ b/modules/by-name/sc/scanning/module.nix @@ -0,0 +1,25 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.soispha.services.scanning; +in { + options.soispha.services.scanning = { + enable = lib.mkEnableOption "default scanning configuration"; + }; + + config = lib.mkIf cfg.enable { + hardware = { + sane = { + enable = true; + extraBackends = [pkgs.sane-airscan]; + }; + }; + + users.users.soispha.extraGroups = [ + "scanner" # for permission to access the scanner. + ]; + }; +} diff --git a/modules/by-name/se/secrets/lf/cd_paths.age b/modules/by-name/se/secrets/lf/cd_paths.age new file mode 100644 index 00000000..3b018fb7 --- /dev/null +++ b/modules/by-name/se/secrets/lf/cd_paths.age @@ -0,0 +1,2357 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUaUtDc0NHYjY3cWZ0ZHlh +bFkrRXpuYWhveGpGcjVIM3ZUN0Y0Y0ZLdGtJCklucDhCdGkyUDl0dXBHd3BFUEMr +SmpkWHh4b0hSSDJ5N0pTcEJmS241WUUKLT4gc3NoLWVkMjU1MTkgelpFb25nIHB5 +YWZKSFd3eDNYUzJnSDFzUzMydjAvNGo3czM3cDVOYU1NdTEwZjZwUXMKQ2MyQlBO +VEtVY1BGWk9JWGJ6SVBMRy94c1hPUWpsTndBM1FRbldZdGhMRQotPiBzc2gtZWQy +NTUxOSA3SGZGVXcgZXJEMTRKenk2UGNNZjdZMmlVdkJYcFU3cjdXdGhRWXhZd1Z1 +VXlyRmhXUQpKZWZDeWhQcDB4eXhuMTZGM1lQMFhma1FkUmpMMy9DMzBLclF3cDdS +N1VVCi0tLSBaZGJLYmRpd3JRNVBLeU9DNCtJMWxhTU8vVGNtcjhJRHRERFdHSXVK +QVVJCsDf6LK4+HTF7SEzvqcR7MmWCfWEzivFmgZBzv60M8utLu45n92LkOSkPg77 +2L7il4KF3a3Ai1efvNqYCVtf5BXRGgI1jub4yoMaS2gXH8xwMehIpSBoDiId2AFw +YSzzZNmJXWQ+wzc+k/PlKO5UZu2S+QnxbUYNAGHQW134jA7j61lSXGiBHbF7an4/ +YX2ElCfe0N1774rgXMQHW1g4udvAQ8ZpaloSuiupJXB/bEuFhAhT3PAfPdF7vvgl +tVdeuMVITU3oYrn/5Ej1GJm2PILxEim5+Y/aDeVKva+Wn81buombADwpW8csOdOi +UfRZ4m0j0Fdp4T9EAGF5n95id+9FUnBqe4936yPT/hH1mwZbixiePDm6irEB+lsR +1zLmAoTUJsJW94JE7BgucM10YwrMI7clYS0lYLDx/HRuZPVlIcsgaEcaoLgR8M3h +H8S2QDscKnDO6sCp62Wiu30P65LXOTwZrDcD54ddx8+U9uU9muT+ZJtADL4KZUMX +AvgfrH9jKOirBrviwEgF74FcdugTlKHQIGBPfasPS3piFMQcPbCm+GCU2MBAWdoT +5iXDjObmpwNBzUiCeVLeEBYA0CuY8xxAiScvQZG+4gB2jpnnEqDOqGmG8h79JWx5 +AtsuBzIGq/ykgqQDbWAHV8YL3Zq+1f0OaaphuZ3/GsrHBtAvW2ScL3cpab/8kQXB +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 +4hAIo//cP8JShYtNJTxeVKySh77gKmDL +-----END AGE ENCRYPTED FILE----- diff --git a/modules/by-name/se/secrets/module.nix b/modules/by-name/se/secrets/module.nix new file mode 100644 index 00000000..8b3188b0 --- /dev/null +++ b/modules/by-name/se/secrets/module.nix @@ -0,0 +1,73 @@ +{ + config, + lib, + ... +}: let + # mkFakeSecret = secretName: { + # name = secretName; + # value = { + # path = "/dev/null"; + # }; + # }; + # fakeSecrets = + # builtins.listToAttrs (lib.debug.traceValSeqN 2 (builtins.map mkFakeSecret + # (lib.debug.traceValSeqN 2 (builtins.attrNames secrets)))); + cfg = config.soispha.secrets; +in { + options.soispha.secrets = { + enable = lib.mkEnableOption "secrets through agenix"; + }; + + config = lib.mkIf cfg.enable { + age = { + secrets = { + lf_cd_paths = { + file = ./lf/cd_paths.age; + mode = "700"; + owner = "soispha"; + group = "users"; + }; + + # FIXME: Reactive when serverphone is merged in tree again <2024-05-11> + # + # serverphoneCa = { + # file = ./serverphone/ca.key; + # mode = "700"; + # owner = "serverphone"; + # group = "serverphone"; + # }; + # serverphoneServer = { + # file = ./serverphone/server.key; + # mode = "700"; + # owner = "serverphone"; + # group = "serverphone"; + # }; + + taskserverPrivate = { + file = ./taskserver/private.key; + mode = "700"; + owner = "soispha"; + group = "users"; + }; + taskserverPublic = { + file = ./taskserver/public.cert; + mode = "700"; + owner = "soispha"; + group = "users"; + }; + taskserverCA = { + file = ./taskserver/ca.cert; + mode = "700"; + owner = "soispha"; + group = "users"; + }; + taskserverCredentials = { + file = ./taskserver/credentials; + mode = "700"; + owner = "soispha"; + group = "users"; + }; + }; + }; + }; +} diff --git a/modules/by-name/se/secrets/secrets.nix b/modules/by-name/se/secrets/secrets.nix new file mode 100644 index 00000000..ff97c0fd --- /dev/null +++ b/modules/by-name/se/secrets/secrets.nix @@ -0,0 +1,16 @@ +let + soispha = "age1mshh4ynzhhzhff25tqwkg4j054g3xwrfznh98ycchludj9wjj48qn2uffn"; + + tiamat = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMD87QQIUXdEv3TaNRrI9clD9VgpsuVLFg2CrNGa5lVB"; + apzu = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBivF5b6PyxsR/t+4Qg4IEDXHVXrjmZpslTUNXpvcVbO"; +in { + "lf/cd_paths.age".publicKeys = [soispha tiamat apzu]; + + "serverphone/ca.key".publicKeys = [soispha tiamat apzu]; + "serverphone/server.key".publicKeys = [soispha tiamat apzu]; + + "taskserver/private.key".publicKeys = [soispha tiamat apzu]; + "taskserver/public.cert".publicKeys = [soispha tiamat apzu]; + "taskserver/ca.cert".publicKeys = [soispha tiamat apzu]; + "taskserver/credentials".publicKeys = [soispha tiamat apzu]; +} diff --git a/modules/by-name/se/secrets/serverphone/ca.key b/modules/by-name/se/secrets/serverphone/ca.key new file mode 100644 index 00000000..d49c5395 --- /dev/null +++ b/modules/by-name/se/secrets/serverphone/ca.key @@ -0,0 +1,19 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyaGJNQkRRVy9MRXZ3b2tJ +Q2R1NUcrYUNGRE5uQkNyUDdkSm5rUWYxaXpjCjduMG1FSG1VamozdnJoVFFZUDYz +T2pyK1k3ekZ4RnFMaDFKdUZPWVNuR3MKLT4gc3NoLWVkMjU1MTkgelpFb25nIEpP +d0xwS3Nia3AwNmppRjZhODdzNXhEcnRsZW5rUzBQcTN6NWhWeTNiQ0EKTkpUZ1Jk +NHE3WVRzVEhpMnJGaVFpdkFBVW5QNThCSUdFSHVQR1RrQUJsZwotPiBzc2gtZWQy +NTUxOSA3SGZGVXcgdjJKUUtlRjE5UFEyR2tBOWhEbHNMVlNSOUMyZ1dkYkhYZWRW +by9QZ2UxTQpVSnhJcFFYay9LSStrSFFJcXJPWUxydXNGbUNXRVpLcHJibjM2TDlw +RnlVCi0+IGNHPjMiSyQtZ3JlYXNlIGcgdWZkbApmY0YzMmhDdzBWT0RKaWlUUmZP +bmRPOExuRVJ3Yk5mMFhYSnhlRENqWXJxK1VWdnBibUxzNWV1NHMyNVNXN054CmR0 +VFAzYUR0RHVaZUpOTlB3USt2TXVDcXdLOGtpZwotLS0gaTliQzBjbjdUYkVidURX +em9wcU04cDhNMHB6KzNBSVMyMmtSRERKS240SQryB70ZEgDQ4eJ/pjIWh6MBEUQr +iAx2i+J+XJu+74bC9DfB5rWpR4/HAdp8EF6wmi05TuEPUpG9brwm/mHi+FB/Drpu +00viGfM3dlCyALz1jB2W/MbruouK85o2L3RWDCgc+eT1gA+u2C7ZxO6iYA3aP4lu +ShDcSHlsKkh9lx4cRsNTua/8N+GQZLciSC7iMDroruxWj1HET9IxeeVN+VSuqcjW +ocX3LU2uU8vP9WT9zT1lbQB5Z0EM7W+ez61SjGpzrpXB2mpmi+SHOIWF3VdG1H8R +18BIyRjKIj5Op+8XD7qAe6nl9SSCnMURH+arc7yjNMgEbzFykfldfug2ibI2G/kW +OxeiEBoSFlC+V8ivS6I= +-----END AGE ENCRYPTED FILE----- diff --git a/modules/by-name/se/secrets/serverphone/server.key b/modules/by-name/se/secrets/serverphone/server.key new file mode 100644 index 00000000..a2720406 --- /dev/null +++ b/modules/by-name/se/secrets/serverphone/server.key @@ -0,0 +1,19 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJZnBXSzF4K0ljR3B1Rkk1 +M0lSSkVmVlA2Tjcrd0JCRmhHWDY4bzNoYnhjCmsvQjJmYU5vNVh1Umw0dzhCQjNF +WVRhVHpUTUIzRVBxaXhFWHpuenZHN0kKLT4gc3NoLWVkMjU1MTkgelpFb25nIHAz +aG02dkxiNVRreVNadXJjbnc0bXBtSFRSNDhrYjljanUrNldwVFlabXcKU2c2L25r +VlNjeDFENUdQeWllenRGWlRqRW53UU5VNEdCaUZsbHpaL1ZFTQotPiBzc2gtZWQy +NTUxOSA3SGZGVXcgZytvUUhZSXhwQ01mQmtkZmhzdHJUd2tlQS9yYkxCdTBYZ2pJ +UEd4WEF4SQp4WVh2UEJReDVES2tCWlpqQS9aanQzRGRsSTA4S0VXSWZxZ2hoKzZq +YllzCi0+IEc4eC1ncmVhc2UgaGQhIGFydERoaS4gLERUcQprczdDdHhaOXpmN1VU +MDlHNlYzVmMxY09Oa2xzTVN6M0ZyYnpRSzJEMS9nMmlqRVo4Wk1qN1lKZnp0N0RT +UStuCm51L01Rb3ZxNUhEa0c5Z3orYlp0YmlXMkhpeHVJMjNkRFZYWmR3QmV2Zwot +LS0gdWJDeHZvc0xOMU9uUjUyMlRGUnlGSW9PZzVKWWNoa3pWbVM1OE9LdFk2NAo+ +WS82jL1us5iVw+xWVI80luHMs31hxZfQgJDBuFbtpY0nKkM97U7rusl6t8P+s93c +R0IYBEUuz6n33GTeVOLipDqkZftlOOvSZkFneZ766+GpEO01dCjeSW9KViDC1jI/ +721IXq9TQNZw0Ou3Vf5E0nDypsfG0UhEoLCy6QZL9YCIyl5s//kyFFnpQjyaGT/P +pRHGhD0BxZa2ib07WDWzBpsTFtVemwcn9lqAx7DlYV2X3UwCT3qVOVjDuA/j6qUt +8bCDoXs4/dWleHNHzpwRhe+j2W4OWDKp7o0zYqxkUuPpEWXL7+A+B/+/08nAtZQk +ZvJyaZSL5wicIPAjLxrD00z2QcE/ZPyUrXsi0gOovuk= +-----END AGE ENCRYPTED FILE----- diff --git a/modules/by-name/se/secrets/taskserver/ca.cert b/modules/by-name/se/secrets/taskserver/ca.cert new file mode 100644 index 00000000..203d62a8 --- /dev/null +++ b/modules/by-name/se/secrets/taskserver/ca.cert @@ -0,0 +1,92 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5c0xqVmk5MzZrUmhqTkUv +YUdRamtpQTdvZ2N1QUM4MWNiWWlYbmwvWURvCnhLYzJuSGM5dkhGbmZGaWNpNVhn +L3hSTU9xb0cwc1FSZHJpYUFqTE1NZlUKLT4gc3NoLWVkMjU1MTkgelpFb25nIFhv +N2dOR2xleGVRUWU1cTd5Q1RnQjVtZElJOVdaS2EzTGtVbmswNXdiRWMKa0hubkRD +bFE0NXp6R2QvcHpCUTZjblk1RVpIMmJ1TFhyajM0N1lYRy80UQotPiBzc2gtZWQy +NTUxOSA3SGZGVXcgOFpvTm1tN21pemJFUXVYYzREcE1aZ3dnMU5TLzVxLzFjdWI2 +eENGWXR4QQpwcHFLMS9WNDRiNFZxSThRUk85RVZhS2hyQnptL2FHdHo5OCt3dHF0 +amZZCi0+IGctZ3JlYXNlIDttPFJBT3FfIDZeMT91Ois3IEx0CkFTbFYxZzloWlJZ +WndXZGx3WHI0aXh0U09la3BmblZmcDRIb3RRYjdhL3drQnhQRWNrNUZabzE4R0Q0 +bnpqZGcKVy8xbWV2TXV4blpRNFg3czZHWExOZllLR20yU3hrdlltZwotLS0gUjQv +QXQ1L2NselJ2OVJtUzc0YnIrWlpXK29WNFFVUXEzUTQ4ZG0xRm9zSQqJzYGOwU7Y +Jt/x8jJohpCDiaBjukoqL0WH7ocjgjt084M+on5vp3pBbT9eIgErCJvGc7oDmke0 +Isnb6RvWg6fY66WY4Bsm67VqGiNyV1yQmAXB+zp6gfKjAfvdZk7wUbgll6mUYU8M +IVwvPHS6C3ByIMVU6OaNPXvAMIakDoQUM+HSQpy7Cu3ZuLwZJs7kM9CWGM/GzyNU +fhBiO8L17J5ZtiC5qOZ0DqIUCefdvKINXGLFCV1a/PoZwpbM7Q36R/urEEz77tLm +qzlM1qwq+G4SWjiihYwQ+3rcA2BPzDtYF/F0O9skw2FYFyRZhENqnba3OOewMb6C +CLVtJcCw7doOjHrpxCwYg7bcP1k9V7sR5F7ez80krQ72qHWlGBL7G4v8Mx9o/GQq +cNv8000KWIORBnPl7qyUc+Y5fZBqm8ebkGh9xg5wRflqXXZvOU81av2ayT4hjfgZ +dmSZPtYmX8jaTQwp/WqzpcJq47a9xaLfo4J8UNiG9y9paoN7J5fwn6IALrWnxK9U +u1s20sRohwN8S5kexyZO2m27b59JsvTrnTJ4iV6/oxre7eXdrCLxsagPpZKTSao8 +5aaCO5lyXwbfoJPmH5HG4YcKW02AAlHQHug16lMMlt3jxUuDXqBXbu6r15DJC+vO +6432Iq4SjpZi2nR4tHtVLrnDAFTRMA6GhCGLPXrt2MbWglZGVG+KzUIsv7X+RsQs +quNab0Z+JIazI5MCR7rpgazVs5lY7wWh4ZwrniFVChkv2yM3dDmsg8OGieXtyhGf +2OiEQX7peeZopdo7OIqEN/h9rM82cKqH62COHvQITCrfys1eRFUr0RvUAanKdTS+ +N2BDYEqHdjpv4ED94mxaTlO75kbr+NEbFMEXLcnpNuV9M/SjKuNJxTi/CcPn0whi +YOJblyzTRf2iN5z38oxMTJzfHzXMCoB2KEHR5XgP1ZF3WE6ocz4JB1wpn1qwlZxx +bUKOPs+rRZKKFNrcrpifPLdm3bWIeQ46xn1eks/yqO2Y4On5IwMwhFdbn80EWFMX +DRQeIo8EkH4+a0iNWlMcY3mNtEgyqc0JgL6BFwlmWde9V0DBVIO43sI8oIjOoaSR +lQREW8oPl7NsE6ejmpurtKoizZ/l/4jGdUehMxg7Z5BvsrJMjYhm1s8RCf/r8RgD +jLQkbGRymVNHuLU7G63v0PA+26z6ZCTObNIkdI9skSlSc2gYFbS7p7BxYpkt1Rpw +Olz3Q6Vw29cigHEjpobAADq0ArT6SZJaa+4+2rzeqjiSektP8QcAZyf+9wGj28Q5 +epHuhr/sfzcyuLP3ikHxuF1VStCWZUShSzkaxIsLqVQUmVZyAEWJmZ9Ud/Aczvhp +F5O+Ln9UiIWZOhPvzhIPqjp9W7osJ26XmdnOLhxT6RZKcXbS0lR78rYfk0Ff97eu +xgtnzZ8UdyPNlYaLXukT2HgePktkfgBsR8ROwhHroPUb4+g1macEwI0/OjIjHMuF +cCPod+sdn7CIjc3iH5UTD70ThrBWorkBwzuzpliDHc6fs+ji2gULu5YsBavcbXPr +FU/389I3mmWJ7JBEOsUsgaRoV3ffK8kcNeTshe17Vo4rPvvQm6fR5B6l1EtUMozV +Jtft3GRgQQvV067Z9IYr9nreBNqoZgEapF/54YksZRJm4Rf2lmMXRi+Mo3vkvaUg +SliywNy9X0d/VsZ950g5NhsHh1wu3/sdJ0qV6S1H/2YxDr/NYphUoWxvLp926DCQ +meydAfPYSTZOR7I9oI6DiM580wt6MUGRWYCy/QTVmWvpeA9gapziqX78QzQbFB5c +9tUt+OvxWYTcYZHTlXrHEO9hDMSrmwfIpXoxz8ogCE7LuEgz/x6icrTmNs+1eDR4 +jVuR7E3CA/ZMxrtMJu1aCQkT9Wy1TBiHiSTa5o/Vx1aJq8Xj3TKz6u1SEaMvevfi +iTYK4EbPLlOvw51yLTaYlvZuXry33xy4UNiqwVuhas2DenIfE+qptYoP/zAUGZxq +Axojzzwf2BerpQbRGyo0PSpcU86ywPNIA4mZmlHXwdKKnQ5Dpd2+8w2Kek0r2r94 +UHjFhcz6dyL1+1naKEDQkSHgjWF1poFuLZJ/jfaXHYTAQZ/I7T2FMG7AWoNtyocR +c0IXABjm6scv8U6jlFH/OZNeTS7oCuhUXz0VTdr86rV+ozECzJ6dO2plSIsFIume +XVaT569nkx6Ndg2poFb8dHz0WZ6OU3GZQj4uIKsb4fBmrilapxhX2hpVDZtEirJk +FT4Pvvuj1SmlT+bz9ia0A1/ZncjmHIjHsAsYTpsNs6dvZsYGyZm9zUcdMV8daLBa +g3Nlt4I5lW1/kRTtmuVw4C3UuTuyCl7hIQ+KPq8EDlQbHYjoPbdr9haJhnypgDRw +sgW5hWIIdFOSt1wmU8qtcfRYXH/eLq8VrY7qJX+/vaSfHuSQb9fqRe4PErxrMGiV ++cKPH7uoto/DgyI4kvN1X9LLi3ySLWm2CweRg8SrBX76wMmeyP51/q2tz3DkAbf0 +auhwx8baCWLUhlxcfCWq94sJRobvI5OOF4fyDbjXnO/EzTzH0er13xVfJp09ttf5 +sBJ0ZxHvHM+hNb8O/1GajOhgkvy0R1eB27JYFJR9iVxsInlklbjKCL0HM/RjjMcT +ykYjf8S/wEtUWA8FGnkLJzhEMpv4NMQ4W2tgQs7RAbXQiQfff/avZGjK9sMne6FI +VQTqgQOtOzg19S86M31UrR8OUPqOwAKIUpC0Q9sixV4BkcUrfFonDZ8uRvzzMaUt +efss4HuCC52VojMM3NbkWD7a0e2DMCtVxcjW8XA7gsJDuD4GB8oqkgt8oeIrQ+ah +l0ue20APKGsLRxwwE2ZrIn8isArAEWmU2zfplB/7DXUqhw2epA1c7LLtqBdf5Zmh +eOA3wWZicsoCpnzPmcZXUXGttaazoGTZ0mh0YYBjfg2fbQCjuD51HWjmY+L6wZaY +UlXuHr/ojiOt1+SVaEv8fnmPaereLmsNCp0PmVUEy/G4osXE84KMDaFBKuUyJyoQ +9reyBSCaHjuzSaUDh4wHGso6vScDNIdbxYyRK52yI/4sfthIt5hgPiGb6sb54c8c +PXoNpEok44CxtLZUMrUG5IlTejS3IVosK50WuTPumBLcz/OhpD7Qe4o6vAm2ajLk +O3KF2R7wHMtZQVBVV0vqmh7zhZcDqMqFxAownzBua2IeUDLqmLwr+p9aAhVfUQrX +x1rOZynqha5U2wc6JugCDOPbJ2JdX+OY7ES6e6Otb853nhOAYfM9RfXkkeQa3l7d +OLdPwmyKs9Eoe/MxGk5Nw3RfyXd3wMtJ9OjQMg3PzhFsMT/dw9k9V/mZ7mP13EgE +X1TNAH7QrYeJwE9i5/+K65xTvv4hbQdW84W+sQObdQzfypjdb+M/VU5rbvCmmt0V +7deNfeeUw5q/Y9e4LuSINuF47JjjbZVsbwYB0Bw8ntQtDI1YP3SelbLXu/6AbHdz +eOezxm45FUWc80cLeFPz/x+RTkuotmqZmUrjFmqEM8UY/rEDpWjczBPyeJy449di +CYO4YvXhfs2U/CzSyAMOliB/QAKM13ZMGFYTgIIDxNrELU8lU1lNJFjTIthEwMZP +CKIiZd7iAY+Ey1ZVeqB+hZzr75zJAkfuZuMSVw7QMhAQqaexlgBhA4TNtOicrtHg +dpbQ9tZzyk/oY0MX5TN+f2BPgUkm6Ry08TV5JwWnocz586XQalA+MdQifBxerf/X +xwyZDlWTTNGVTt10IFwd53k3IpNCoczM/MoTu+pczeJnSksGrL5t9mzXYYIkPcRm +FwPbIJmRkravexVEiOR19meba5YRiOFz42+Lm+TNdN/BuBuzdB9RoWHVNXdQOQTW +a8MbfAwXSGf7/xHaMS8NSzdgGRrke3PUggZAl2jvl5yjYguHaR3uI9aT3rce6B0s +oZIqCgOEbAdU/oY8F1S+6+VCjMMkETsx2PdROqT0jWhMCzuNsSkUOCZnOVgBOCX2 +vEGWWY/dtKgeGAiKnH6qsaoRgARZsvMrXUShHgADSQYt4rE2ptkpxW7+iNEYr3lY +ZsmpYZL6gohXrb9nt5l9brRLREMQ8QJXDYycTuwT6sHig177wrfIp123W2UA1wHK +UQPgydPKNG8eoh+4qWMzCHbRyYhdZc1AhLRTWezDye1vRTul9zDPh0Sz+QwttgMz +RoWZTCXYYuVctbWQwe1nuVqg7a6xo8E0vpFCJjMIzs2iSIkF9OgNnoXlpnOvCJ+Z +IxxEge+/aVYYGp0UPwJVAGFTdtWFnj5KOSyINBBESB4hNvN8it6Rf5U/vNnQiNoG +/K6krt3bn6MMTYNd9fS0MDfazF8eapzAjODzhxyFgVTcOcQCeXhgtGwn1aAv3Ef4 +hEV0slVRXC94oaFgGnwxJx3N35y2TRZ/mhrG0lBEnd2aVoRXmm3Wq10uYfTa0/I4 +0y9tKf2GUq3sjNi68NscbiNuw7u+agMWiwmzTRv8EsFuyrQTMvDcMxpKZBOWVQyL +T3TkILYvmxgXyzY2txDqbJBZILsOR0YGzRquqW9XaOLqrrVp8myrR23zgWBs7gZH +sqx8mqy+CsoZZ+3E5RF6ieSZzBY/g9944H6Vu7Gp1O3I2QXWYHYGCbOOBDJq/Zxu +33eVgUDctngmIG59sfUd5u2fQhqxMWQ/FFzkvtgsioYxZhB7umTB/Z1BzOCjHavI +b8OwEof/zUpr9X+VgVFYkIADdNQW6MmKfGw/srZenqh3Wp5ZsY5YvTRLeguLUFEv +v+gqJ/BI5CP8f1FIgr7WdTSihh34qD8QQX0Yn4IAFQMsiKjq36xR5FVfm0uyFeQD +nDyv6vTS7qnV6djxEXUOqqZzzv7J9xQQDHqNTGOwatAysild1Jl+MzgnZqYE6Rqc +3jMRhL/NCWq1XwqvTkKdTI/ckBv1KQbgYkFjFh0EudRDSgWkbAQjFDCEvdADp4MQ +I49ukgPjsSj5hIBiQIoCJQ0lN1Rjd+YJEsDx7jeZnYhUeeCCFSCnDfWM+SwDkeGz +qDMJeG4PHJNp9tkqGfsvZcLo2eFazoFwXlNdr+V2fQn/ldlQ96oJdSmfkQUnOQ== +-----END AGE ENCRYPTED FILE----- diff --git a/modules/by-name/se/secrets/taskserver/credentials b/modules/by-name/se/secrets/taskserver/credentials new file mode 100644 index 00000000..f3aaf502 --- /dev/null +++ b/modules/by-name/se/secrets/taskserver/credentials @@ -0,0 +1,15 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqdGQ3a0pWb3lvZXFWbTFQ +UG1JbGREZW9SS3ZuWXJhbTdvTTBqZUdhN0Q0CjF1cnJFM1d2ZFNyRW44Rzlvamlz +VWQycXhmWnB4L1hiSE5qbFozWFlGMU0KLT4gc3NoLWVkMjU1MTkgelpFb25nIEFk +bVQ3U3BsU1FkeWxBY0sySTV2UkxocXJpVXMyd1FrMXA3YUR0NWtTR1kKeUtHODVy +aXE3aXh4WkFmYTJtdlZyZ1A1QlhYZGZuTUYxYVVlblRUV1BqOAotPiBzc2gtZWQy +NTUxOSA3SGZGVXcgdGR4cFMya3p6TEx5cnhYcWNXR2FlVEk3UTBEcHQ3Y3RmK0lY +YlpwRXJGcwpwZUVqODB3SUZUdTlQVW4yaWlZaTE0RE9OT1dLanZlSGV6cnlJRElQ +UjBBCi0+ICFALWdyZWFzZSB0MFU2IDZoIEJPWUZIP1sKN1l2dzdWN1JDbEhEeXBq +THV0cWJIV1RLalVsVVp3RCtwbk5NS2pnd3kxS1RhNTNaa3pqWXZFVm9FM2N2cFp5 +TQpYR2MKLS0tIEhLQWdwL0VoT1ZGNU5UUWs0SVVqK0ZQTndkTURPb0VtNEtJN3or +S0Q0K1UKRfhyrcVb0EbsKj9gL5kqaIpfrsWd2cizrVQ67y9ZOwWilWgk/gkoXadf +q7QeYjnWsHeIVtSZIaHSa8+9pvKAwiYW+B6DjRi7EXkCYz8zGeanMuoKA4by5Q9x +VMKJlWk7c0WIzSuviw== +-----END AGE ENCRYPTED FILE----- diff --git a/modules/by-name/se/secrets/taskserver/private.key b/modules/by-name/se/secrets/taskserver/private.key new file mode 100644 index 00000000..5afecdaf --- /dev/null +++ b/modules/by-name/se/secrets/taskserver/private.key @@ -0,0 +1,450 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtNkZidXVhQ1ExVjdEQWY4 +bUtLR1VCNUl0c2tQUUxCZXFRNE43aDQybFdJCk5qN3FGY2JOV0VjS0R2a1JTR0Fz +NTl1WlV3QVZYdTBvUCt5T2tzV1dWbXcKLT4gc3NoLWVkMjU1MTkgelpFb25nIDBm +MUl6ZDNEL1BVVHNnSlpiRWhDMStBMjYrUEZZZEVnWGh3NjFBYWh0dzQKZjhXbFY4 +NllvbHdwKzFSR2FJUEdHWHdBeVRBRzh2NWU1UUlabnlHQmxkOAotPiBzc2gtZWQy +NTUxOSA3SGZGVXcgd0MwWm1WY2R2NnhaS3dQYWZPcUtCY3BseEtkWUp1eURvKzRu +UXA2OStXMApXdjNEQ01JWlZSb1l3SmxYcDBMMUM4NEtPOVFvL2tHdlMzQ3hMN2t2 +N2w4Ci0+IFciK2Uicy1ncmVhc2UgKildWHNqZSA4QVIgNUE+T2EzdSYKODJIck9K +NzF0RW85RkJVNDBVaWNkTXlkbk03ZnBHNWFxSDN4K3A3THNVNEJLQXJ4MWxENWdq +d2oyL3lQUlVxcwp1VzJxTWpCMU9JRHc2NHZXM0ZvUm1MK1htaGFsTUVKaTZXbEtD +NTZzcy9hSFpGYmRzMzQKLS0tIFFjd25qSEdFT09LYlZCVzNNU04vVEY5RGdIdGs3 +ZkhodEM4SGZ4emlRUmMK3XxmNQwv5++wwwJ3CqpDfqKBLDcwyIfYM7VXqGlxaVR9 +TR9VjtFB6siP6Umo1oewRDt9Gc+MUI+rlc8aUN044ve5g+9im6uni2nQ6hubRZzD +Q3LQCLGGDiFL9+F7xHTLgFH8dIaLs4pnzeSzl+Od0Iybe05HOPGaZDhptqZvGWHr +uGHQz940sUU6k3kbnJ02qpj06AP3Uujl++s/4w5QKvVwx5m9Jio0ZOCaXv/6uUTn +Xq8l0uLMNBLtMhJsd4D5X5XRnvWSEWvUaQf2+nKFdCkxmDqxf8rv8qAE5ryx5SO0 +SnHVFZrSUhUDH4q2lVOPsGExwaExV/N/KB/24foJRoUafvpRb6GfNR8t2SmA82Qd +HVj2aqzuIcPBvefbq19T0WD2vJWHuF2p8NafL9x3KLdRIIm7urG+GLgZtB4am7BS +9B/bZrryjCVJybwy7POlIS1P+1OhuyNSdpv49tTL+v6o5PzGHeJFjykoEKyzTP5e +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 +7b+Hg4y4ZcH8mURkx3RCVDbH3g== +-----END AGE ENCRYPTED FILE----- diff --git a/modules/by-name/se/secrets/taskserver/public.cert b/modules/by-name/se/secrets/taskserver/public.cert new file mode 100644 index 00000000..1cf9b5f0 --- /dev/null +++ b/modules/by-name/se/secrets/taskserver/public.cert @@ -0,0 +1,83 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6RnRGSEZSNE0yWWhXODhk +N1FGNkFPSEVIaFJhWm52eEZ3Q3Bwb2I5c25nCkpCU1Zhd3ZhZ1YyOVFmTGxkVnZT +aDhxOHBrWGdhcE00THh2WnFSbUM1bHMKLT4gc3NoLWVkMjU1MTkgelpFb25nIFh2 +WmVLTTc0ZjUxaUFFNVFuNzVjNkhLRzR6VGdJOVRvZGtBT1BrTnJJQnMKOExOck0r +TW9mSVY0d0VTSk9IS0c3NHdscXVyMHhlUnkyNnFJWnFmekJJWQotPiBzc2gtZWQy +NTUxOSA3SGZGVXcgOXFTejhFNWd0TklHcytUMlJQdU1OaUlNVlBSbWZWdnhWbmVp +TlpNekwwcwoyQXpEd3JCVVcrdHR2cDN4LzdmSVhveGNiaThEOVE3TlJEUXdnejdY +R3NjCi0+IFdAQS1ncmVhc2UgWgpRei9tQTFCcjY1bGxEVlhxdWJFVnB1d3B5MWov +amVZbm1EaEovVmVnczA5RWpuSUx0eUFLc0J0aEZqVmpJMmIxCjUwWmJyYTNxT3g3 +Qjl5MGhuWEEKLS0tIHNaMnh1N1JhUkJIdFZ5TnRtR3hDM1kxRlNMU2pWL2VBdkkx +cUw1TWhWa28KwuibZXNGOy/Qqhs17FD2aTdWit9nvgRl/n+F/gKwJXoaEvRM7veM +uTEvmfIRJzLm5ox7ko48f8g+EWQDWvcXsa1KwCDI4DDoP3WxhMOUmNE6SYqDgGpP +ilQLOvX7kKrtY/oB6OQj6QFMEJe8dElNEq8rcapaqiWnRDQsqvDtFm7j0HcGNQ2U +Kg+/c6UQRf4lgZXLs2cGMCjUivEA6eojyLctIcXdswIxWI9TwxBOJ7NTKI7wF4hn +TKqZSlWhLg8xpW7s0ZRpAQaONMVo+Ve9TH3fPaPFsUZUu+x0jfk+NMUWBscYbYUN +JZT9xuMOmEcnXZ+/1DIgl0zw5kG2hQ30lX0QGRqrWaPoOv0KchORWuwsVgkFFMTk +eiYeqf5mkAfswR8iN6Ye1K6gH6WAI666yRbkMmdJTAO5iC2JhQVLgdJuKBWixTE7 +0Y6xdPIRUhDXn2fgeYFxnTwqR7oi7Aa9H6LVtxdFMVvhqJ2l0QKd8UqcwO3RrCRK +VLehYc3prKklzrkevKVr5k+62ateISjMF/NoEpZf4wTzh6wByyk32cNHT5OU1Qr7 +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 +m7vbEx2mecNNVw96F/k= +-----END AGE ENCRYPTED FILE----- diff --git a/modules/by-name/se/secrets/update_secrets.sh b/modules/by-name/se/secrets/update_secrets.sh new file mode 100755 index 00000000..f1c27d77 --- /dev/null +++ b/modules/by-name/se/secrets/update_secrets.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env nix +#! nix shell nixpkgs#age nixpkgs#jq nixpkgs#dash --command dash +# shellcheck shell=dash + +cleanup() { + [ "$key_file" ] && rm "$key_file" +} +trap cleanup EXIT + +update_lf_cd_paths() { + echo "Starting to update the lf/cd_paths.age file.." + + cd "$(git rev-parse --show-toplevel)/modules/system/secrets" || { + echo "A secrets dir does not exist! (This is most likely a bug)" + exit 1 + } + + key_file="$(mktemp)" + + nix eval -f ./secrets.nix --json | jq --raw-output '.["lf/cd_paths.age"].publicKeys | join("\n")' >"$key_file" + + # `lf-make-map` is provided by the dev shell + { + lf-make-map --quiet --depth 4 visualize ~/media ~/repos ~/school | sed 's|\(.*\)|# \1|' + lf-make-map --quiet --depth 4 generate ~/media ~/repos ~/school + } | age --recipients-file "$key_file" --encrypt --armor --output ./lf/cd_paths.age + + echo "Finished updating the lf/cd_paths.age file.." +} + +main() { + update_lf_cd_paths +} + +main + +# vim: ft=sh diff --git a/modules/by-name/se/serverphone/certificates/ca.crt b/modules/by-name/se/serverphone/certificates/ca.crt new file mode 100644 index 00000000..7a4ae6f9 --- /dev/null +++ b/modules/by-name/se/serverphone/certificates/ca.crt @@ -0,0 +1,10 @@ +-----BEGIN CERTIFICATE----- +MIIBXDCCAQOgAwIBAgIIRQ2wXiaD5pMwCgYIKoZIzj0EAwIwGTEXMBUGA1UEAwwO +U2VydmVycGhvbmUgQ0EwHhcNMjMwNjA2MTIzNzM3WhcNMzMwNjAzMTIzNzM3WjAZ +MRcwFQYDVQQDDA5TZXJ2ZXJwaG9uZSBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEH +A0IABDZMtz3liWniBedisStXDO2sxFCKBH239ezH7uADu8g5peGssmNu1rXEDrg1 +sFwVUjQeJAocYYNoUeHiVpODf1ejNTAzMB0GA1UdDgQWBBST5oMmXrANRbCLIQpN +W7e5uSCL3DASBgNVHRMBAf8ECDAGAQH/AgEBMAoGCCqGSM49BAMCA0cAMEQCIFig +xA3MvRNP4uXaUEWwdP1pYL/R8N46G4NZrPEfiNV4AiA+NJSTFRCOUqEsvSb7PTFx +YuMuJF4XxWnmStz3ym7xXA== +-----END CERTIFICATE----- diff --git a/modules/by-name/se/serverphone/certificates/server.crt b/modules/by-name/se/serverphone/certificates/server.crt new file mode 100644 index 00000000..f994cdc8 --- /dev/null +++ b/modules/by-name/se/serverphone/certificates/server.crt @@ -0,0 +1,10 @@ +-----BEGIN CERTIFICATE----- +MIIBTjCB9KADAgECAgkAhKrdjsoiOrkwCgYIKoZIzj0EAwIwGTEXMBUGA1UEAwwO +U2VydmVycGhvbmUgQ0EwHhcNMjMwNjA2MTIzOTIwWhcNMjQwNjA1MTIzOTIwWjAm +MSQwIgYDVQQDDBtDbGllbnQgcnVubmluZyBvbiBsb2NhbGhvc3QwWTATBgcqhkjO +PQIBBggqhkjOPQMBBwNCAAS1ILQo8ae8ydqFlt5RncUT7joQiozk6Omunb0vxVz5 +toJRDmVqc1s6KhpCTipUV5coTcaK1TBz0+fft+9VH7cwoxgwFjAUBgNVHREEDTAL +gglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSQAwRgIhAN7ohtsBLrjlgmSe9ngovxZM +z61n0+/7w2mtX/OrLMWIAiEAu+D2S2o0s7E9pp2Rkug8cT5T4GCWgFgEHk5x2L/E +RVI= +-----END CERTIFICATE----- diff --git a/modules/by-name/se/serverphone/keys/key_1 b/modules/by-name/se/serverphone/keys/key_1 new file mode 120000 index 00000000..67720882 --- /dev/null +++ b/modules/by-name/se/serverphone/keys/key_1 @@ -0,0 +1 @@ +../../../../home-manager/soispha/config/gpg/keys/key_1 \ No newline at end of file diff --git a/modules/by-name/se/serverphone/keys/key_2 b/modules/by-name/se/serverphone/keys/key_2 new file mode 120000 index 00000000..24df7207 --- /dev/null +++ b/modules/by-name/se/serverphone/keys/key_2 @@ -0,0 +1 @@ +../../../../home-manager/soispha/config/gpg/keys/key_2 \ No newline at end of file diff --git a/modules/by-name/se/serverphone/module.currently_ignored.nix b/modules/by-name/se/serverphone/module.currently_ignored.nix new file mode 100644 index 00000000..20125a75 --- /dev/null +++ b/modules/by-name/se/serverphone/module.currently_ignored.nix @@ -0,0 +1,49 @@ +{ + config, + serverphone, + system, + lib, + ... +}: { + config = lib.mkIf config.soispha.secrets.enable { + services.serverphone = { + package = "${serverphone.packages.${system}.default}"; + enable = true; + domain = "localhost"; + configureDoas = true; + acceptedSshKeys = [ + "AAAAC3NzaC1lZDI1NTE5AAAAIGBFuTNNn71Rhfnop2cdz3r/RhWWlCePnSBOhTBbu2ME" + ]; + authorized = { + acceptedGpgKeys = [ + { + source = ./keys/key_1; + trust = "ultimate"; + } + { + source = ./keys/key_2; + trust = "ultimate"; + } + ]; + }; + caCertificate = "${./certificates/ca.crt}"; + certificate = "${./certificates/server.crt}"; + privateKey = config.age.secrets.serverphoneServer.path; + certificateRequest = { + acceptedUsers = [ + "soispha $argon2id$v=19$m=19456,t=2,p=1$EvhPENIBqL5b1RO5waNMWA$pJ8vDrCNJKDlqwB5bVDLjHVPEXm9McQhtt9OXSD8Zkc" + ]; + caPrivateKey = config.age.secrets.serverphoneCa.path; + }; + }; + + users.users.serverphone = { + group = "serverphone"; + isSystemUser = true; + home = "/run/serverphone"; + }; + users.groups.serverphone = { + members = ["serverphone"]; + }; + }; +} diff --git a/modules/by-name/sn/snapper/module.nix b/modules/by-name/sn/snapper/module.nix new file mode 100644 index 00000000..bf8201a4 --- /dev/null +++ b/modules/by-name/sn/snapper/module.nix @@ -0,0 +1,53 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.services.snapper; +in { + options.soispha.services.snapper = { + enable = lib.mkEnableOption "snapper config"; + }; + + config = lib.mkIf cfg.enable { + services.snapper = { + configs = { + srv = { + SUBVOLUME = "/srv"; + FSTYPE = "btrfs"; + # users and groups allowed to work with config + ALLOW_GROUPS = ["wheel"]; + + # sync users and groups from ALLOW_USERS and ALLOW_GROUPS to .snapshots + # directory + SYNC_ACL = true; + + # run daily number cleanup + NUMBER_CLEANUP = false; + + # limit for number cleanup + NUMBER_MIN_AGE = 1800; + NUMBER_LIMIT = 50; + NUMBER_LIMIT_IMPORTANT = 10; + + # create hourly snapshots + TIMELINE_CREATE = true; + + # cleanup hourly snapshots after some time + TIMELINE_CLEANUP = true; + + # limits for timeline cleanup + TIMELINE_MIN_AGE = 1800; + TIMELINE_LIMIT_HOURLY = 7; + TIMELINE_LIMIT_DAILY = 3; + TIMELINE_LIMIT_WEEKLY = 2; + TIMELINE_LIMIT_MONTHLY = 0; + TIMELINE_LIMIT_YEARLY = 2; + + # cleanup empty pre-post-pairs + EMPTY_PRE_POST_CLEANUP = true; + }; + }; + }; + }; +} diff --git a/modules/by-name/so/sound/module.nix b/modules/by-name/so/sound/module.nix new file mode 100644 index 00000000..f3120a67 --- /dev/null +++ b/modules/by-name/so/sound/module.nix @@ -0,0 +1,37 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.sound; +in { + options.soispha.sound = { + enable = lib.mkEnableOption "sound based on pipewire"; + }; + + config = lib.mkIf cfg.enable { + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; + + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + jack.enable = true; + }; + + # TODO: Find a better way to set the default volume <2024-03-10> + # + # environment.etc.pipewire-pulse-config = { + # target = "pipewire/pipewire-pulse.conf.d/pipewire-pulse-config.conf"; + # text = '' + # # Extra scripts can be started here. Setup in default.pa can be moved in + # # a script or in pulse.cmd below + # context.exec = [ + # { path = "${pkgs.pulseaudio}/bin/pactl" args = "set-sink-volume 0 13%" } + # ] + # ''; + # }; + }; +} diff --git a/modules/by-name/st/steam/module.nix b/modules/by-name/st/steam/module.nix new file mode 100644 index 00000000..49149cd7 --- /dev/null +++ b/modules/by-name/st/steam/module.nix @@ -0,0 +1,23 @@ +{ + lib, + config, + pkgs, + ... +}: let + cfg = config.soispha.services.steam; +in { + options.soispha.services.steam = { + enable = lib.mkEnableOption "Steam"; + }; + + config = lib.mkIf cfg.enable { + programs.steam = { + enable = true; + }; + + environment.systemPackages = [ + # TODO: Why is this package needed? <2024-05-16> + pkgs.wineWowPackages.waylandFull + ]; + }; +} diff --git a/modules/by-name/sw/swaylock/module.nix b/modules/by-name/sw/swaylock/module.nix new file mode 100644 index 00000000..6cbcef28 --- /dev/null +++ b/modules/by-name/sw/swaylock/module.nix @@ -0,0 +1,4 @@ +{...}: { + # otherwise swaylock can't access the user password. + security.pam.services.swaylock = {}; +} diff --git a/modules/by-name/sy/system_diff/module.nix b/modules/by-name/sy/system_diff/module.nix new file mode 100644 index 00000000..052ffae2 --- /dev/null +++ b/modules/by-name/sy/system_diff/module.nix @@ -0,0 +1,26 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.soispha.services.systemDiff; +in { + options.soispha.services.systemDiff = { + enable = lib.mkEnableOption "nvd run at system activation"; + }; + + config = lib.mkIf cfg.enable { + system.activationScripts.diff = { + supportsDryActivation = true; + text = '' + PATH="${lib.makeBinPath [pkgs.nvd config.nix.package]}:$PATH" + + if [ -e /run/current-system ]; then + # ${lib.getExe config.nix.package} --extra-experimental-features nix-command store diff-closures /run/current-system "$systemConfig" + nvd diff $(ls -dv /nix/var/nix/profiles/system-*-link | tail -2) + fi + ''; + }; + }; +} diff --git a/modules/by-name/te/tempfiles/module.nix b/modules/by-name/te/tempfiles/module.nix new file mode 100644 index 00000000..f8bfd4dc --- /dev/null +++ b/modules/by-name/te/tempfiles/module.nix @@ -0,0 +1,20 @@ +{ + config, + lib, + ... +}: let + cfg = config.soispha.tempfiles; +in { + options.soispha.tempfiles = { + enable = lib.mkEnableOption "systemd tempfiles generation"; + }; + + config = lib.mkIf cfg.enable { + systemd.tmpfiles.rules = [ + # TODO: Find a way to move this file to the lf home manager config. + # + # This file is needed to trash stuff on the root ('/') temp file system. + "d /.Trash 1777 root root" + ]; + }; +} diff --git a/modules/by-name/us/users/module.nix b/modules/by-name/us/users/module.nix new file mode 100644 index 00000000..a44df7e8 --- /dev/null +++ b/modules/by-name/us/users/module.nix @@ -0,0 +1,50 @@ +{ + config, + pkgs, + lib, + ... +}: let + cfg = config.soispha.users; +in { + options.soispha.users = { + enable = lib.mkEnableOption "user set-up for soispha"; + hashedPassword = lib.mkOption { + type = lib.types.str; + example = lib.literalExpression "$y$jFT$ONrCqZIJKB7engmfA4orD/$0GO58/wV5wrYWj0cyONhyujZPjFmbT0XKtx2AvXLG0B"; + description = "The hashed password of the user"; + }; + groups = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = ["wheel"]; + description = "The groups the soispha user should be part of"; + }; + + # Although deprecated, this helps with old udev rules, that still use this group. + # TODO: Try to find a way to remove this option (i.e. set it always to false). + enableDeprecatedPlugdev = lib.mkEnableOption "the deprecated plugdev group for the user"; + }; + + config = lib.mkIf cfg.enable { + # Ensure that the default shell of the user is actually enabled. + programs.zsh.enable = true; + + users = { + mutableUsers = false; + + users.soispha = { + isNormalUser = true; + home = "/home/soispha"; + createHome = true; + shell = pkgs.zsh; + initialHashedPassword = cfg.hashedPassword; + extraGroups = cfg.groups ++ lib.optional cfg.enableDeprecatedPlugdev "plugdev"; + + uid = 1000; + openssh.authorizedKeys.keys = [ + # TODO: This should be parameterized. <2024-05-16> + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIME4ZVa+IoZf6T3U08JG93i6QIAJ4amm7mkBzO14JSkz" + ]; + }; + }; + }; +} diff --git a/modules/by-name/ve/version/module.nix b/modules/by-name/ve/version/module.nix new file mode 100644 index 00000000..77cada14 --- /dev/null +++ b/modules/by-name/ve/version/module.nix @@ -0,0 +1,19 @@ +{ + config, + lib, + self, + ... +}: let + cfg = config.soispha.version; +in { + options.soispha.version = { + enable = lib.mkEnableOption "storing the git revision in /etc/nixos_git_rev"; + }; + config = lib.mkIf cfg.enable { + environment.etc.nixos_git_rev = { + text = builtins.toString (self.longRev + or self.lastModified + or "unknown"); + }; + }; +} diff --git a/modules/by-name/wa/waydroid/module.nix b/modules/by-name/wa/waydroid/module.nix new file mode 100644 index 00000000..4680db63 --- /dev/null +++ b/modules/by-name/wa/waydroid/module.nix @@ -0,0 +1,5 @@ +{...}: { + # FIXME: Running `waydroid session start` causes all fuse mounts instances to coredump <2023-09-02> + # Thus this setting must be false. + virtualisation.waydroid.enable = false; +} diff --git a/modules/by-name/xd/xdg/module.nix b/modules/by-name/xd/xdg/module.nix new file mode 100644 index 00000000..5140a832 --- /dev/null +++ b/modules/by-name/xd/xdg/module.nix @@ -0,0 +1,58 @@ +{ + pkgs, + nixpkgs_open_prs, + sysLib, + system, + ... +}: let + pkgs_tfc = nixpkgs_open_prs.nixpkgs-tfc.legacyPackages."${system}"; +in { + services.dbus.enable = true; + xdg = { + portal = { + enable = true; + termfilechooser = { + enable = true; + logLevel = "TRACE"; + package = pkgs_tfc.xdg-desktop-portal-termfilechooser; + settings = { + filechooser = { + default_dir = "/tmp"; + cmd = "${sysLib.writeShellScript { + src = ./scripts/lf_wrapper.sh; + name = "lf_wrapper"; + keepPath = true; + dependencies = with pkgs; [ + lf + alacritty + bash + ]; + }}/bin/lf_wrapper"; + }; + }; + }; + wlr = { + enable = true; + }; + config = { + common = { + # NOTE: The next entry is supposedly needed for gtk based apps <2023-08-31> + default = ["wlr" "gtk"]; + "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"]; + }; + + # TODO: Also activate, when on another wlr-based compositor <2023-11-25> + river = { + default = ["wlr" "gtk"]; + "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"]; + }; + }; + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + pkgs.xdg-desktop-portal-wlr + pkgs_tfc.xdg-desktop-portal-termfilechooser + ]; + }; + }; + # TODO: mime = {}; +} diff --git a/modules/by-name/xd/xdg/scripts/lf_wrapper.sh b/modules/by-name/xd/xdg/scripts/lf_wrapper.sh new file mode 100755 index 00000000..16603fe4 --- /dev/null +++ b/modules/by-name/xd/xdg/scripts/lf_wrapper.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# This wrapper script is invoked by xdg-desktop-portal-termfilechooser. +# +# Inputs: +# 1. "1" if multiple files can be chosen, "0" otherwise. +# 2. "1" if a directory should be chosen, "0" otherwise. +# 3. "0" if opening files was requested, "1" if writing to a file was +# requested. For example, when uploading files in Firefox, this will be "0". +# When saving a web page in Firefox, this will be "1". +# 4. If writing to a file, this is recommended path provided by the caller. For +# example, when saving a web page in Firefox, this will be the recommended +# path Firefox provided, such as "~/Downloads/webpage_title.html". +# Note that if the path already exists, we keep appending "_" to it until we +# get a path that does not exist. +# 5. The output path, to which results should be written. +# +# Output: +# The script should print the selected paths to the output path (argument #5), +# one path per line. +# If nothing is printed, then the operation is assumed to have been canceled. + +multiple="$1" +directory="$2" +save="$3" +recommended_path="$4" +out="$5" + +# echo > /tmp/stdout +# echo > /tmp/stderr +# +# exec 1>> /tmp/stdout +# exec 2>> /tmp/stderr + +cmd="$(command -v lf)" +termcmd="${TERMINAL:-$(command -v alacritty)}" + +if [ "$save" = "1" ]; then + set -- -selection-path="$out" -command='set promptfmt "Select the file to write to %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$recommended_path" + cat <"$recommended_path" +xdg-desktop-portal-termfilechooser saving files tutorial + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!! === WARNING! === !!! +!!! The contents of *whatever* file you open last in !!! +!!! lf will be *overwritten*! !!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +Instructions: +1) Move this file wherever you want. +2) Rename the file if needed. +3) Confirm your selection by opening the file, for + example by pressing . + +Notes: +1) This file is provided for your convenience. You + could delete it and choose another file to overwrite + that, for example. +2) If you quit lf without opening a file, this file + will be removed and the save operation aborted. +EOF + +elif [ "$directory" = "1" ]; then + set -- -selection-path="$out" -command='set dironly' -command='set promptfmt "Select directory (quit in dir to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' +elif [ "$multiple" = "1" ]; then + set -- -selection-path="$out" -command='set promptfmt "Select file(s) (open file to select it; to select multiple) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' +else + set -- -selection-path="$out" -command='set promptfmt "Select file (open file to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' +fi + +"$termcmd" --title 'floating please' -e "$cmd" "$@" + +if [ "$save" = "1" ] && [ ! -s "$out" ]; then + rm "$recommended_path" +fi +# vim: ft=sh diff --git a/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh b/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh new file mode 100755 index 00000000..e148bf19 --- /dev/null +++ b/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH +# This wrapper script is invoked by xdg-desktop-portal-termfilechooser. +# +# Inputs: +# 1. "1" if multiple files can be chosen, "0" otherwise. +# 2. "1" if a directory should be chosen, "0" otherwise. +# 3. "0" if opening files was requested, "1" if writing to a file was +# requested. For example, when uploading files in Firefox, this will be "0". +# When saving a web page in Firefox, this will be "1". +# 4. If writing to a file, this is recommended path provided by the caller. For +# example, when saving a web page in Firefox, this will be the recommended +# path Firefox provided, such as "~/Downloads/webpage_title.html". +# Note that if the path already exists, we keep appending "_" to it until we +# get a path that does not exist. +# 5. The output path, to which results should be written. +# +# Output: +# The script should print the selected paths to the output path (argument #5), +# one path per line. +# If nothing is printed, then the operation is assumed to have been canceled. + +multiple="$1" +directory="$2" +save="$3" +path="$4" +out="$5" + +cmd="$(command -v ranger)" +termcmd="${TERMCMD:-$(command -v kitty)}" + +if [ "$save" = "1" ]; then + set -- --choosefile="$out" --cmd='echo Select save path (see tutorial in preview pane; try pressing zv or zp if no preview)' "$path" + printf '%s' 'xdg-desktop-portal-termfilechooser saving files tutorial + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!! === WARNING! === !!! +!!! The contents of *whatever* file you open last in !!! +!!! ranger will be *overwritten*! !!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +Instructions: +1) Move this file wherever you want. +2) Rename the file if needed. +3) Confirm your selection by opening the file, for + example by pressing . + +Notes: +1) This file is provided for your convenience. You + could delete it and choose another file to overwrite + that, for example. +2) If you quit ranger without opening a file, this file + will be removed and the save operation aborted. +' >"$path" +elif [ "$directory" = "1" ]; then + set -- --choosedir="$out" --show-only-dirs --cmd="echo Select directory (quit in dir to select it)" +elif [ "$multiple" = "1" ]; then + set -- --choosefiles="$out" --cmd="echo Select file(s) (open file to select it; to select multiple)" +else + set -- --choosefile="$out" --cmd="echo Select file (open file to select it)" +fi + +"$termcmd" -- "$cmd" "$@" +if [ "$save" = "1" ] && [ ! -s "$out" ]; then + rm "$path" +fi diff --git a/modules/default.nix b/modules/default.nix new file mode 100644 index 00000000..a3bc1735 --- /dev/null +++ b/modules/default.nix @@ -0,0 +1,10 @@ +# NOTE: This file **must** not depend on `pkgs`. This is because `pkgs` is defined in a +# module imported by it, and thus would require infinite recursion. <2024-10-18> +{...}: let + files = import ./by-name-overlay.nix { + baseDirectory = + ./by-name; + }; +in { + imports = files; +} diff --git a/modules/home.legacy/conf/alacritty/default.nix b/modules/home.legacy/conf/alacritty/default.nix new file mode 100644 index 00000000..c1cf5e44 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/default.nix @@ -0,0 +1,30 @@ +{lib, ...}: let + config_file = '' + ${lib.strings.fileContents ./toml/base.toml} + ${lib.strings.fileContents ./toml/bell.toml} + ${lib.strings.fileContents ./toml/colorscheme.toml} + ${lib.strings.fileContents ./toml/cursor.toml} + ${lib.strings.fileContents ./toml/env.toml} + ${lib.strings.fileContents ./toml/font.toml} + ${lib.strings.fileContents ./toml/hints.toml} + ${lib.strings.fileContents ./toml/keyboard_bindings.toml} + ${lib.strings.fileContents ./toml/mouse.toml} + ${lib.strings.fileContents ./toml/mouse_bindings.toml} + ${lib.strings.fileContents ./toml/scrolling.toml} + ${lib.strings.fileContents ./toml/selection.toml} + ${lib.strings.fileContents ./toml/window.toml} + ''; +in { + home.sessionVariables = { + # This is **not** the TERM variable but a special one to signify my favorite terminal. + TERMINAL = "alacritty"; + + # These two here should be set by alacritty at start-up + # TERM = "alacritty"; + # COLORTERM = "truecolor"; + }; + programs.alacritty = { + enable = true; + }; + xdg.configFile."alacritty/alacritty.toml".text = config_file; +} diff --git a/modules/home.legacy/conf/alacritty/toml/base.toml b/modules/home.legacy/conf/alacritty/toml/base.toml new file mode 100644 index 00000000..93c9942f --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/base.toml @@ -0,0 +1,16 @@ +# Configuration for Alacritty, the GPU enhanced terminal emulator. + +# If `true`, bold text is drawn using the bright color variants. +#draw_bold_text_with_bright_colors: true # TODO: + +# Live config reload (changes require restart) +live_config_reload = true + +# Startup directory +# +# Directory the shell is started in. If this is unset, or `None`, the working +# directory of the parent process will be used. +#working_directory: None + +# Offer IPC using `alacritty msg` (unix only) +ipc_socket = true diff --git a/modules/home.legacy/conf/alacritty/toml/bell.toml b/modules/home.legacy/conf/alacritty/toml/bell.toml new file mode 100644 index 00000000..912d08e3 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/bell.toml @@ -0,0 +1,7 @@ +# Bell +# +# The bell is rung every time the BEL control character is received. +[bell] +# Duration of the visual bell flash in milliseconds. A `duration` of `0` will +# disable the visual bell animation. +duration = 0 diff --git a/modules/home.legacy/conf/alacritty/toml/colorscheme.toml b/modules/home.legacy/conf/alacritty/toml/colorscheme.toml new file mode 100644 index 00000000..f98a5b91 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/colorscheme.toml @@ -0,0 +1,79 @@ +# Nightfox Alacritty Colors +## name: carbonfox +## upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/alacritty.toml + +[colors.primary] +background = "#161616" +foreground = "#f2f4f8" +dim_foreground = "#b6b8bb" +bright_foreground = "#f9fbff" + +[colors.cursor] +text = "#f2f4f8" +cursor = "#b6b8bb" + +[colors.vi_mode_cursor] +text = "#f2f4f8" +cursor = "#33b1ff" + +[colors.search.matches] +foreground = "#f2f4f8" +background = "#525253" + +[colors.search.focused_match] +foreground = "#f2f4f8" +background = "#3ddbd9" + +[colors.footer_bar] +foreground = "#f2f4f8" +background = "#353535" + +[colors.hints.start] +foreground = "#f2f4f8" +background = "#3ddbd9" + +[colors.hints.end] +foreground = "#f2f4f8" +background = "#353535" + +[colors.selection] +text = "#f2f4f8" +background = "#2a2a2a" + +[colors.normal] +black = "#282828" +red = "#ee5396" +green = "#25be6a" +yellow = "#08bdba" +blue = "#78a9ff" +magenta = "#be95ff" +cyan = "#33b1ff" +white = "#dfdfe0" + +[colors.bright] +black = "#484848" +red = "#f16da6" +green = "#46c880" +yellow = "#2dc7c4" +blue = "#8cb6ff" +magenta = "#c8a5ff" +cyan = "#52bdff" +white = "#e4e4e5" + +[colors.dim] +black = "#222222" +red = "#ca4780" +green = "#1fa25a" +yellow = "#07a19e" +blue = "#6690d9" +magenta = "#a27fd9" +cyan = "#2b96d9" +white = "#bebebe" + +[[colors.indexed_colors]] +index = 16 +color = "#3ddbd9" + +[[colors.indexed_colors]] +index = 17 +color = "#ff7eb6" diff --git a/modules/home.legacy/conf/alacritty/toml/cursor.toml b/modules/home.legacy/conf/alacritty/toml/cursor.toml new file mode 100644 index 00000000..d9cb93f4 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/cursor.toml @@ -0,0 +1,11 @@ +[cursor] +blink_interval = 750 +blink_timeout = 5 +thickness = 0.15 +unfocused_hollow = true +vi_mode_style = "None" + +# Cursor style +[cursor.style] +blinking = "On" +shape = "Beam" diff --git a/modules/home.legacy/conf/alacritty/toml/env.toml b/modules/home.legacy/conf/alacritty/toml/env.toml new file mode 100644 index 00000000..fdd4e5d1 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/env.toml @@ -0,0 +1,3 @@ +[env] +TERM = "alacritty" +COLORTERM = "truecolor" diff --git a/modules/home.legacy/conf/alacritty/toml/font.toml b/modules/home.legacy/conf/alacritty/toml/font.toml new file mode 100644 index 00000000..dd18a6fb --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/font.toml @@ -0,0 +1,15 @@ +[font] +builtin_box_drawing = true +size = 12.0 + +[font.glyph_offset] +x = -1 +y = -1 + +[font.normal] +family = "SauceCodePro Nerd Font Mono" +style = "Regular" + +[font.offset] +x = -1 +y = -1 diff --git a/modules/home.legacy/conf/alacritty/toml/hints.toml b/modules/home.legacy/conf/alacritty/toml/hints.toml new file mode 100644 index 00000000..31d91a37 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/hints.toml @@ -0,0 +1,25 @@ +[hints] +alphabet = "jfkdls;ahgurieowpq" + +[[hints.enabled]] +command = "xdg-open" # On Linux/BSD +hyperlinks = true +post_processing = true +persist = false +mouse.enabled = true +binding = { key = "U", mods = "Control|Shift" } +regex = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file:|git://|ssh:|ftp://)[^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+" + + +[[hints.enabled]] +action = "Paste" +post_processing = false +binding = { key = "T", mods = "Control|Shift" } +regex = '''([^ '"`=:\[\(]*/)([^/: '"`\)\]]*)''' + + +[[hints.enabled]] +action = "Paste" +post_processing = false +binding = { key = "H", mods = "Control|Shift" } +regex = '([a-z0-9]{7,40})\s' diff --git a/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml b/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml new file mode 100644 index 00000000..8e0b1e13 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml @@ -0,0 +1,297 @@ +[[keyboard.bindings]] +action = "Paste" +key = "P" +mods = "Control" + +[[keyboard.bindings]] +action = "Paste" +key = "Insert" +mods = "Shift" + +[[keyboard.bindings]] +chars = "gc" +key = "Slash" +mods = "Control" + +[[keyboard.bindings]] +action = "Copy" +key = "Y" +mods = "Control" + +[[keyboard.bindings]] +action = "ResetFontSize" +key = "Key0" +mods = "Control" + +[[keyboard.bindings]] +action = "IncreaseFontSize" +key = "Equals" +mods = "Control" + +[[keyboard.bindings]] +action = "IncreaseFontSize" +key = "Plus" +mods = "Control" + +[[keyboard.bindings]] +action = "DecreaseFontSize" +key = "Minus" +mods = "Control" + +[[keyboard.bindings]] +action = "ToggleViMode" +key = "Space" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollToBottom" +key = "Space" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollToBottom" +key = "I" +mode = "Vi" + +[[keyboard.bindings]] +action = "ToggleViMode" +key = "I" +mode = "Vi" + +[[keyboard.bindings]] +action = "ScrollToBottom" +key = "C" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ToggleViMode" +key = "C" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ClearSelection" +key = "Escape" +mode = "Vi" + +[[keyboard.bindings]] +action = "ScrollLineUp" +key = "Y" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollLineDown" +key = "E" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollToTop" +key = "G" +mode = "Vi" + +[[keyboard.bindings]] +action = "ScrollToBottom" +key = "G" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "ScrollPageUp" +key = "B" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollPageDown" +key = "F" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollHalfPageUp" +key = "U" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollHalfPageDown" +key = "D" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "Copy" +key = "Y" +mode = "Vi" + +[[keyboard.bindings]] +action = "ClearSelection" +key = "Y" +mode = "Vi" + +[[keyboard.bindings]] +action = "ToggleNormalSelection" +key = "V" +mode = "Vi" + +[[keyboard.bindings]] +action = "ToggleLineSelection" +key = "V" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "ToggleBlockSelection" +key = "V" +mode = "Vi" +mods = "Control" + +[[keyboard.bindings]] +action = "ToggleSemanticSelection" +key = "V" +mode = "Vi" +mods = "Alt" + +[[keyboard.bindings]] +action = "Open" +key = "Return" +mode = "Vi" + +[[keyboard.bindings]] +action = "Up" +key = "K" +mode = "Vi" + +[[keyboard.bindings]] +action = "Down" +key = "J" +mode = "Vi" + +[[keyboard.bindings]] +action = "Left" +key = "H" +mode = "Vi" + +[[keyboard.bindings]] +action = "Right" +key = "L" +mode = "Vi" + +[[keyboard.bindings]] +action = "Up" +key = "Up" +mode = "Vi" + +[[keyboard.bindings]] +action = "Down" +key = "Down" +mode = "Vi" + +[[keyboard.bindings]] +action = "Left" +key = "Left" +mode = "Vi" + +[[keyboard.bindings]] +action = "Right" +key = "Right" +mode = "Vi" + +[[keyboard.bindings]] +action = "First" +key = "Key0" +mode = "Vi" + +[[keyboard.bindings]] +action = "Last" +key = "Key4" +mode = "Vi" + +[[keyboard.bindings]] +action = "FirstOccupied" +key = "Key6" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "High" +key = "H" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "Middle" +key = "M" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "Low" +key = "L" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "SemanticLeft" +key = "B" +mode = "Vi" + +[[keyboard.bindings]] +action = "SemanticRight" +key = "W" +mode = "Vi" + +[[keyboard.bindings]] +action = "SemanticRightEnd" +key = "E" +mode = "Vi" + +[[keyboard.bindings]] +action = "WordLeft" +key = "B" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "WordRight" +key = "W" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "WordRightEnd" +key = "E" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "Bracket" +key = "Key5" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "SearchForward" +key = "Slash" +mode = "Vi" + +[[keyboard.bindings]] +action = "SearchBackward" +key = "Slash" +mode = "Vi" +mods = "Shift" + +[[keyboard.bindings]] +action = "SearchNext" +key = "N" +mode = "Vi" + +[[keyboard.bindings]] +action = "SearchPrevious" +key = "N" +mode = "Vi" +mods = "Shift" diff --git a/modules/home.legacy/conf/alacritty/toml/mouse.toml b/modules/home.legacy/conf/alacritty/toml/mouse.toml new file mode 100644 index 00000000..eba68edf --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/mouse.toml @@ -0,0 +1,2 @@ +[mouse] +hide_when_typing = false diff --git a/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml b/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml new file mode 100644 index 00000000..1b281748 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml @@ -0,0 +1,3 @@ +[[mouse.bindings]] +action = "Copy" +mouse = "Middle" diff --git a/modules/home.legacy/conf/alacritty/toml/scrolling.toml b/modules/home.legacy/conf/alacritty/toml/scrolling.toml new file mode 100644 index 00000000..ed7c22cf --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/scrolling.toml @@ -0,0 +1,3 @@ +[scrolling] +history = 10000 +multiplier = 3 diff --git a/modules/home.legacy/conf/alacritty/toml/selection.toml b/modules/home.legacy/conf/alacritty/toml/selection.toml new file mode 100644 index 00000000..60ea0495 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/selection.toml @@ -0,0 +1,3 @@ +[selection] +save_to_clipboard = false +semantic_escape_chars = ",│`|:\"' ()[]{}<>\t" diff --git a/modules/home.legacy/conf/alacritty/toml/window.toml b/modules/home.legacy/conf/alacritty/toml/window.toml new file mode 100644 index 00000000..123b5b7a --- /dev/null +++ b/modules/home.legacy/conf/alacritty/toml/window.toml @@ -0,0 +1,18 @@ +[window] +decorations = "none" +decorations_theme_variant = "None" +dynamic_title = true +opacity = 0.9 +startup_mode = "Windowed" +title = "Alacritty" +[window.class] +general = "Alacritty" +instance = "Alacritty" + +[window.dimensions] +columns = 0 +lines = 0 + +[window.padding] +x = 5 +y = 5 diff --git a/modules/home.legacy/conf/alacritty/yaml/base.yml b/modules/home.legacy/conf/alacritty/yaml/base.yml new file mode 100644 index 00000000..0791a60f --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/base.yml @@ -0,0 +1,17 @@ +--- +# Configuration for Alacritty, the GPU enhanced terminal emulator. + +# If `true`, bold text is drawn using the bright color variants. +#draw_bold_text_with_bright_colors: true # TODO: + +# Live config reload (changes require restart) +live_config_reload: true + +# Startup directory +# +# Directory the shell is started in. If this is unset, or `None`, the working +# directory of the parent process will be used. +#working_directory: None + +# Offer IPC using `alacritty msg` (unix only) +ipc_socket: true diff --git a/modules/home.legacy/conf/alacritty/yaml/bell.yml b/modules/home.legacy/conf/alacritty/yaml/bell.yml new file mode 100644 index 00000000..bd071aeb --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/bell.yml @@ -0,0 +1,42 @@ +# Bell +# +# The bell is rung every time the BEL control character is received. +bell: + # Visual Bell Animation + # + # Animation effect for flashing the screen when the visual bell is rung. + # + # Values for `animation`: + # - Ease + # - EaseOut + # - EaseOutSine + # - EaseOutQuad + # - EaseOutCubic + # - EaseOutQuart + # - EaseOutQuint + # - EaseOutExpo + # - EaseOutCirc + # - Linear + #animation: EaseOutExpo + + # Duration of the visual bell flash in milliseconds. A `duration` of `0` will + # disable the visual bell animation. + duration: 0 + + # Visual bell animation color. + #color: '#ffffff' + + # Bell Command + # + # This program is executed whenever the bell is rung. + # + # When set to `command: None`, no command will be executed. + # + # Example: + # command: + # program: notify-send + # args: ["Hello, World!"] + # + # command: + # program: notify-send + # args: ["The bell in alacritty was rung!"] diff --git a/modules/home.legacy/conf/alacritty/yaml/colors.yml b/modules/home.legacy/conf/alacritty/yaml/colors.yml new file mode 100644 index 00000000..899c660a --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/colors.yml @@ -0,0 +1,147 @@ +# Colors (Tomorrow Night) +colors: + # Default colors + primary: + background: '#191919' + foreground: '#d8dee9' + + # Bright and dim foreground colors + # + # The dimmed foreground color is calculated automatically if it is not + # present. If the bright foreground color is not set, or + # `draw_bold_text_with_bright_colors` is `false`, the normal foreground + # color will be used. + #dim_foreground: '#828482' + #bright_foreground: '#eaeaea' + + # Cursor colors + # + # Colors which should be used to draw the terminal cursor. + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + cursor: + text: '#191919' + cursor: '#d8dee9' + + # Vi mode cursor colors + # + # Colors for the cursor when the vi mode is active. + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + vi_mode_cursor: + text: CellBackground + cursor: CellForeground + + # Search colors + # + # Colors used for the search bar and match highlighting. + search: + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + matches: + foreground: '#000000' + background: '#ffffff' + focused_match: + foreground: '#ffffff' + background: '#000000' + + # Keyboard hints + hints: + # First character in the hint label + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + start: + foreground: '#1d1f21' + background: '#e9ff5e' + + # All characters after the first one in the hint label + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + end: + foreground: '#e9ff5e' + background: '#1d1f21' + + # Line indicator + # + # Color used for the indicator displaying the position in history during + # search and vi mode. + # + # By default, these will use the opposing primary color. + #line_indicator: + # foreground: None + # background: None + + # Footer bar + # + # Color used for the footer bar on the bottom, used by search regex input, + # hyperlink URI preview, etc. + # + footer_bar: + background: '#c5c8c6' + foreground: '#1d1f21' + + # Selection colors + # + # Colors which should be used to draw the selection area. + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + selection: + text: '#191919' + background: '#d8dee9' + + # Normal colors + normal: + black: '#191919' + red: '#b02626' + green: '#40a62f' + yellow: '#f2e635' + blue: '#314ad0' + magenta: '#b30ad0' + cyan: '#32d0fc' + white: '#acadb1' + + # Bright colors + bright: + black: '#36393d' + red: '#ce2727' + green: '#47c930' + yellow: '#fff138' + blue: '#2e4bea' + magenta: '#cc15ed' + cyan: '#54d9ff' + white: '#dbdbdb' + + # Dim colors + # + # If the dim colors are not set, they will be calculated automatically based + # on the `normal` colors. + dim: + black: '#676f78' + red: '#b55454' + green: '#78a670' + yellow: '#faf380' + blue: '#707fd0' + magenta: '#c583d0' + cyan: '#8adaf1' + white: '#e0e3e7' + # Indexed Colors + # + # The indexed colors include all colors from 16 to 256. + # When these are not set, they're filled with sensible defaults. + # + # Example: + # `- { index: 16, color: '#ff00ff' }` + # + #indexed_colors: [] + + # Transparent cell backgrounds + # + # Whether or not `window.opacity` applies to all cell backgrounds or only to + # the default background. When set to `true` all cells will be transparent + # regardless of their background color. + #transparent_background_colors: false # TODO: diff --git a/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml b/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml new file mode 100644 index 00000000..4e0abfae --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml @@ -0,0 +1,31 @@ +# Nightfox Alacritty Colors +# Style: carbonfox +# Upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/nightfox_alacritty.yml +colors: + # Default colors + primary: + background: '0x161616' + foreground: '0xf2f4f8' + # Normal colors + normal: + black: '0x282828' + red: '0xee5396' + green: '0x25be6a' + yellow: '0x08bdba' + blue: '0x78a9ff' + magenta: '0xbe95ff' + cyan: '0x33b1ff' + white: '0xdfdfe0' + # Bright colors + bright: + black: '0x484848' + red: '0xf16da6' + green: '0x46c880' + yellow: '0x2dc7c4' + blue: '0x8cb6ff' + magenta: '0xc8a5ff' + cyan: '0x52bdff' + white: '0xe4e4e5' + indexed_colors: + - { index: 16, color: '0x3ddbd9' } + - { index: 17, color: '0xff7eb6' } diff --git a/modules/home.legacy/conf/alacritty/yaml/cursor.yml b/modules/home.legacy/conf/alacritty/yaml/cursor.yml new file mode 100644 index 00000000..ef700ebc --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/cursor.yml @@ -0,0 +1,43 @@ +cursor: + # Cursor style + style: + # Cursor shape + # + # Values for `shape`: + # - ▇ Block + # - _ Underline + # - | Beam + shape: Beam + + # Cursor blinking state + # + # Values for `blinking`: + # - Never: Prevent the cursor from ever blinking + # - Off: Disable blinking by default + # - On: Enable blinking by default + # - Always: Force the cursor to always blink + blinking: On + + # Vi mode cursor style + # + # If the vi mode cursor style is `None` or not specified, it will fall back to + # the style of the active value of the normal cursor. + # + # See `cursor.style` for available options. + vi_mode_style: None + + # Cursor blinking interval in milliseconds. + blink_interval: 750 + + # Time after which cursor stops blinking, in seconds. + # + # Specifying '0' will disable timeout for blinking. + blink_timeout: 5 + + # If this is `true`, the cursor will be rendered as a hollow box when the + # window is not focused. + unfocused_hollow: true + + # Thickness of the cursor relative to the cell width as floating point number + # from `0.0` to `1.0`. + thickness: 0.15 diff --git a/modules/home.legacy/conf/alacritty/yaml/debug.yml b/modules/home.legacy/conf/alacritty/yaml/debug.yml new file mode 100644 index 00000000..2c391da2 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/debug.yml @@ -0,0 +1,29 @@ +#debug: + # Display the time it takes to redraw each frame. + #render_timer: false + + # Keep the log file after quitting Alacritty. + #persistent_logging: false + + # Log level + # + # Values for `log_level`: + # - Off + # - Error + # - Warn + # - Info + # - Debug + # - Trace + #log_level: Warn + + # Renderer override. + # - glsl3 + # - gles2 + # - gles2_pure + #renderer: None + + # Print all received window events. + #print_events: false + + # Highlight window damage information. + #highlight_damage: false diff --git a/modules/home.legacy/conf/alacritty/yaml/env.yml b/modules/home.legacy/conf/alacritty/yaml/env.yml new file mode 100644 index 00000000..ee7528b7 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/env.yml @@ -0,0 +1,11 @@ +# Any items in the `env` entry below will be added as +# environment variables. Some entries may override variables +# set by alacritty itself. +env: + # TERM variable + # + # This value is used to set the `$TERM` environment variable for + # each instance of Alacritty. If it is not present, alacritty will + # check the local terminfo database and use `alacritty` if it is + # available, otherwise `xterm-256color` is used. + TERM: alacritty diff --git a/modules/home.legacy/conf/alacritty/yaml/font.yml b/modules/home.legacy/conf/alacritty/yaml/font.yml new file mode 100644 index 00000000..a3fd3b1d --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/font.yml @@ -0,0 +1,73 @@ +# Font configuration +font: + # Normal (roman) font face + normal: + # Font family + # + # Default: + # - (macOS) Menlo + # - (Linux/BSD) monospace + # - (Windows) Consolas + # family: Source Code Pro + # family: SauceCodePro Nerd Font + family: SauceCodePro Nerd Font Mono + + # The `style` can be specified to pick a specific face. + style: Regular + + # Bold font face + #bold: + # Font family + # + # If the bold family is not specified, it will fall back to the + # value specified for the normal font. + # family: Source Code Pro + + # The `style` can be specified to pick a specific face. + #style: Bold + + # Italic font face + #italic: + # Font family + # + # If the italic family is not specified, it will fall back to the + # value specified for the normal font. + # family: Source Code Pro + + # The `style` can be specified to pick a specific face. + #style: Italic + + # Bold italic font face + #bold_italic: + # Font family + # + # If the bold italic family is not specified, it will fall back to the + # value specified for the normal font. + # family: Source Code Pro + + # The `style` can be specified to pick a specific face. + #style: Bold Italic + + # Point size + size: 12.0 + + # Offset is the extra space around each character. `offset.y` can be thought + # of as modifying the line spacing, and `offset.x` as modifying the letter + # spacing. + offset: + x: -1 + y: -1 + + # Glyph offset determines the locations of the glyphs within their cells with + # the default being at the bottom. Increasing `x` moves the glyph to the + # right, increasing `y` moves the glyph upward. + glyph_offset: + x: -1 + y: -1 + + # Use built-in font for box drawing characters. + # + # If `true`, Alacritty will use a custom built-in font for box drawing + # characters (Unicode points 2500 - 259f). + # + builtin_box_drawing: true # TODO: diff --git a/modules/home.legacy/conf/alacritty/yaml/hints.yml b/modules/home.legacy/conf/alacritty/yaml/hints.yml new file mode 100644 index 00000000..8c35548b --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/hints.yml @@ -0,0 +1,77 @@ +# Hints +# +# Terminal hints can be used to find text or hyperlink in the visible part of +# the terminal and pipe it to other applications. +hints: + # Keys used for the hint labels. + alphabet: "jfkdls;ahgurieowpq" + + # List with all available hints + # + # Each hint must have any of `regex` or `hyperlinks` field and either an + # `action` or a `command` field. The fields `mouse`, `binding` and + # `post_processing` are optional. + # + # The `hyperlinks` option will cause OSC 8 escape sequence hyperlinks to be + # highlighted. + # + # The fields `command`, `binding.key`, `binding.mods`, `binding.mode` and + # `mouse.mods` accept the same values as they do in the `key_bindings` section. + # + # The `mouse.enabled` field controls if the hint should be underlined while + # the mouse with all `mouse.mods` keys held or the vi mode cursor is above it. + # + # If the `post_processing` field is set to `true`, heuristics will be used to + # shorten the match if there are characters likely not to be part of the hint + # (e.g. a trailing `.`). This is most useful for URIs and applies only to + # `regex` matches. + # + # Values for `action`: + # - Copy + # Copy the hint's text to the clipboard. + # - Paste + # Paste the hint's text to the terminal or search. + # - Select + # Select the hint's text. + # - MoveViModeCursor + # Move the vi mode cursor to the beginning of the hint. + enabled: + - regex: "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\ + [^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+" + hyperlinks: true + command: xdg-open + post_processing: true + mouse: + enabled: true + mods: None + binding: + key: U + mods: Control|Shift + + - regex: "([^ '\"`=:\\[\\(]*/)([^/: '\"`\\)\\]]*)" + action: Paste + post_procesing: false + binding: + key: T + mods: Control|Shift + + - regex: "([a-z0-9]{7})\\s" + action: Paste + post_procesing: false + binding: + key: H + mods: Control|Shift + + # multi regex for different purposes: + # 2. UUIDs + # 3. hex (for example signatures) + # 4. IP addresses +# - regex: "([[:alnum:]_$%&+=/@-]+)\ +#|([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\ +#|([0-9a-f]{12,128})\ +#|([[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3})" +# action: Copy +# post_processing: false +# binding: +# key: U +# mods: Control|Shift diff --git a/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml b/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml new file mode 100644 index 00000000..c8be747e --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml @@ -0,0 +1,382 @@ +# Key bindings +# +# Key bindings are specified as a list of objects. For example, this is the +# default paste binding: +# +# `- { key: V, mods: Control|Shift, action: Paste }` +# +# Each key binding will specify a: +# +# - `key`: Identifier of the key pressed +# +# - A-Z +# - F1-F24 +# - Key0-Key9 +# +# A full list with available key codes can be found here: +# https://docs.rs/winit/*/winit/event/enum.VirtualKeyCode.html#variants +# +# Instead of using the name of the keys, the `key` field also supports using +# the scancode of the desired key. Scancodes have to be specified as a +# decimal number. This command will allow you to display the hex scancodes +# for certain keys: +# +# `showkey --scancodes`. +# +# Then exactly one of: +# +# - `chars`: Send a byte sequence to the running application +# +# The `chars` field writes the specified string to the terminal. This makes +# it possible to pass escape sequences. To find escape codes for bindings +# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside +# of tmux. Note that applications use terminfo to map escape sequences back +# to keys. It is therefore required to update the terminfo when changing an +# escape sequence. +# +# - `action`: Execute a predefined action +# +# - ToggleViMode +# - SearchForward +# Start searching toward the right of the search origin. +# - SearchBackward +# Start searching toward the left of the search origin. +# - Copy +# - Paste +# - IncreaseFontSize +# - DecreaseFontSize +# - ResetFontSize +# - ScrollPageUp +# - ScrollPageDown +# - ScrollHalfPageUp +# - ScrollHalfPageDown +# - ScrollLineUp +# - ScrollLineDown +# - ScrollToTop +# - ScrollToBottom +# - ClearHistory +# Remove the terminal's scrollback history. +# - Hide +# Hide the Alacritty window. +# - Minimize +# Minimize the Alacritty window. +# - Quit +# Quit Alacritty. +# - ToggleFullscreen +# - ToggleMaximized +# - SpawnNewInstance +# Spawn a new instance of Alacritty. +# - CreateNewWindow +# Create a new Alacritty window from the current process. +# - ClearLogNotice +# Clear Alacritty's UI warning and error notice. +# - ClearSelection +# Remove the active selection. +# - ReceiveChar +# - None +# +# - Vi mode exclusive actions: +# +# - Open +# Perform the action of the first matching hint under the vi mode cursor +# with `mouse.enabled` set to `true`. +# - ToggleNormalSelection +# - ToggleLineSelection +# - ToggleBlockSelection +# - ToggleSemanticSelection +# Toggle semantic selection based on `selection.semantic_escape_chars`. +# - CenterAroundViCursor +# Center view around vi mode cursor +# +# - Vi mode exclusive cursor motion actions: +# +# - Up +# One line up. +# - Down +# One line down. +# - Left +# One character left. +# - Right +# One character right. +# - First +# First column, or beginning of the line when already at the first column. +# - Last +# Last column, or beginning of the line when already at the last column. +# - FirstOccupied +# First non-empty cell in this terminal row, or first non-empty cell of +# the line when already at the first cell of the row. +# - High +# Top of the screen. +# - Middle +# Center of the screen. +# - Low +# Bottom of the screen. +# - SemanticLeft +# Start of the previous semantically separated word. +# - SemanticRight +# Start of the next semantically separated word. +# - SemanticLeftEnd +# End of the previous semantically separated word. +# - SemanticRightEnd +# End of the next semantically separated word. +# - WordLeft +# Start of the previous whitespace separated word. +# - WordRight +# Start of the next whitespace separated word. +# - WordLeftEnd +# End of the previous whitespace separated word. +# - WordRightEnd +# End of the next whitespace separated word. +# - Bracket +# Character matching the bracket at the cursor's location. +# - SearchNext +# Beginning of the next match. +# - SearchPrevious +# Beginning of the previous match. +# - SearchStart +# Start of the match to the left of the vi mode cursor. +# - SearchEnd +# End of the match to the right of the vi mode cursor. +# +# - Search mode exclusive actions: +# - SearchFocusNext +# Move the focus to the next search match. +# - SearchFocusPrevious +# Move the focus to the previous search match. +# - SearchConfirm +# - SearchCancel +# - SearchClear +# Reset the search regex. +# - SearchDeleteWord +# Delete the last word in the search regex. +# - SearchHistoryPrevious +# Go to the previous regex in the search history. +# - SearchHistoryNext +# Go to the next regex in the search history. +# +# - macOS exclusive actions: +# - ToggleSimpleFullscreen +# Enter fullscreen without occupying another space. +# +# - Linux/BSD exclusive actions: +# +# - CopySelection +# Copy from the selection buffer. +# - PasteSelection +# Paste from the selection buffer. +# +# - `command`: Fork and execute a specified command plus arguments +# +# The `command` field must be a map containing a `program` string and an +# `args` array of command line parameter strings. For example: +# `{ program: "alacritty", args: ["-e", "vttest"] }` +# +# And optionally: +# +# - `mods`: Key modifiers to filter binding actions +# +# - Command +# - Control +# - Option +# - Super +# - Shift +# - Alt +# +# Multiple `mods` can be combined using `|` like this: +# `mods: Control|Shift`. +# Whitespace and capitalization are relevant and must match the example. +# +# - `mode`: Indicate a binding for only specific terminal reported modes +# +# This is mainly used to send applications the correct escape sequences +# when in different modes. +# +# - AppCursor +# - AppKeypad +# - Search +# - Alt +# - Vi +# +# A `~` operator can be used before a mode to apply the binding whenever +# the mode is *not* active, e.g. `~Alt`. +# +# Bindings are always filled by default, but will be replaced when a new +# binding with the same triggers is defined. To unset a default binding, it can +# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for +# a no-op if you do not wish to receive input characters for that binding. +# +# If the same trigger is assigned to multiple actions, all of them are executed +# in the order they were defined in. +key_bindings: +# +# + - { key: P, mods: Control, action: Paste } + - { key: Insert, mods: Shift, action: Paste } + - { key: Slash, mods: Control, chars: "gc" } + - { key: Y, mods: Control, action: Copy } + - { key: Key0, mods: Control, action: ResetFontSize } + - { key: Equals, mods: Control, action: IncreaseFontSize } + - { key: Plus, mods: Control, action: IncreaseFontSize } + - { key: Minus, mods: Control, action: DecreaseFontSize } + + # Vi Mode + - { key: Space, mods: Control, action: ToggleViMode } + - { key: Space, mods: Control, mode: Vi, action: ScrollToBottom } + - { key: I, mode: Vi, action: ScrollToBottom } + - { key: I, mode: Vi, action: ToggleViMode } + - { key: C, mods: Control, mode: Vi, action: ScrollToBottom } + - { key: C, mods: Control, mode: Vi, action: ToggleViMode } + - { key: Escape, mode: Vi, action: ClearSelection } + - { key: Y, mods: Control, mode: Vi, action: ScrollLineUp } + - { key: E, mods: Control, mode: Vi, action: ScrollLineDown } + - { key: G, mode: Vi, action: ScrollToTop } + - { key: G, mods: Shift, mode: Vi, action: ScrollToBottom } + - { key: B, mods: Control, mode: Vi, action: ScrollPageUp } + - { key: F, mods: Control, mode: Vi, action: ScrollPageDown } + - { key: U, mods: Control, mode: Vi, action: ScrollHalfPageUp } + - { key: D, mods: Control, mode: Vi, action: ScrollHalfPageDown } + - { key: Y, mode: Vi, action: Copy } + - { key: Y, mode: Vi, action: ClearSelection } + - { key: V, mode: Vi, action: ToggleNormalSelection } + - { key: V, mods: Shift, mode: Vi, action: ToggleLineSelection } + - { key: V, mods: Control, mode: Vi, action: ToggleBlockSelection } + - { key: V, mods: Alt, mode: Vi, action: ToggleSemanticSelection } + - { key: Return, mode: Vi, action: Open } + - { key: K, mode: Vi, action: Up } + - { key: J, mode: Vi, action: Down } + - { key: H, mode: Vi, action: Left } + - { key: L, mode: Vi, action: Right } + - { key: Up, mode: Vi, action: Up } + - { key: Down, mode: Vi, action: Down } + - { key: Left, mode: Vi, action: Left } + - { key: Right, mode: Vi, action: Right } + - { key: Key0, mode: Vi, action: First } + - { key: Key4, mode: Vi, action: Last } + - { key: Key6, mods: Shift, mode: Vi, action: FirstOccupied } + - { key: H, mods: Shift, mode: Vi, action: High } + - { key: M, mods: Shift, mode: Vi, action: Middle } + - { key: L, mods: Shift, mode: Vi, action: Low } + - { key: B, mode: Vi, action: SemanticLeft } + - { key: W, mode: Vi, action: SemanticRight } + - { key: E, mode: Vi, action: SemanticRightEnd } + - { key: B, mods: Shift, mode: Vi, action: WordLeft } + - { key: W, mods: Shift, mode: Vi, action: WordRight } + - { key: E, mods: Shift, mode: Vi, action: WordRightEnd } + - { key: Key5, mods: Shift, mode: Vi, action: Bracket } + - { key: Slash, mode: Vi, action: SearchForward } + - { key: Slash, mods: Shift, mode: Vi, action: SearchBackward } + - { key: N, mode: Vi, action: SearchNext } + - { key: N, mods: Shift, mode: Vi, action: SearchPrevious } +# +# +# + #- { key: Paste, action: Paste } + #- { key: Copy, action: Copy } + #- { key: L, mods: Control, action: ClearLogNotice } + #- { key: L, mods: Control, mode: ~Vi|~Search, chars: "\x0c" } + #- { key: PageUp, mods: Shift, mode: ~Alt, action: ScrollPageUp } + #- { key: PageDown, mods: Shift, mode: ~Alt, action: ScrollPageDown } + #- { key: Home, mods: Shift, mode: ~Alt, action: ScrollToTop } + #- { key: End, mods: Shift, mode: ~Alt, action: ScrollToBottom } + + # Vi Mode + #- { key: Space, mods: Shift|Control, mode: ~Search, action: ToggleViMode } + #- { key: Space, mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom } + #- { key: Escape, mode: Vi|~Search, action: ClearSelection } + #- { key: I, mode: Vi|~Search, action: ToggleViMode } + #- { key: I, mode: Vi|~Search, action: ScrollToBottom } + #- { key: C, mods: Control, mode: Vi|~Search, action: ToggleViMode } + #- { key: Y, mods: Control, mode: Vi|~Search, action: ScrollLineUp } + #- { key: E, mods: Control, mode: Vi|~Search, action: ScrollLineDown } + #- { key: G, mode: Vi|~Search, action: ScrollToTop } + #- { key: G, mods: Shift, mode: Vi|~Search, action: ScrollToBottom } + #- { key: B, mods: Control, mode: Vi|~Search, action: ScrollPageUp } + #- { key: F, mods: Control, mode: Vi|~Search, action: ScrollPageDown } + #- { key: U, mods: Control, mode: Vi|~Search, action: ScrollHalfPageUp } + #- { key: D, mods: Control, mode: Vi|~Search, action: ScrollHalfPageDown } + #- { key: Y, mode: Vi|~Search, action: Copy } + #- { key: Y, mode: Vi|~Search, action: ClearSelection } + #- { key: Copy, mode: Vi|~Search, action: ClearSelection } + #- { key: V, mode: Vi|~Search, action: ToggleNormalSelection } + #- { key: V, mods: Shift, mode: Vi|~Search, action: ToggleLineSelection } + #- { key: V, mods: Control, mode: Vi|~Search, action: ToggleBlockSelection } + #- { key: V, mods: Alt, mode: Vi|~Search, action: ToggleSemanticSelection } + #- { key: Return, mode: Vi|~Search, action: Open } + #- { key: Z, mode: Vi|~Search, action: CenterAroundViCursor } + #- { key: K, mode: Vi|~Search, action: Up } + #- { key: J, mode: Vi|~Search, action: Down } + #- { key: H, mode: Vi|~Search, action: Left } + #- { key: L, mode: Vi|~Search, action: Right } + #- { key: Up, mode: Vi|~Search, action: Up } + #- { key: Down, mode: Vi|~Search, action: Down } + #- { key: Left, mode: Vi|~Search, action: Left } + #- { key: Right, mode: Vi|~Search, action: Right } + #- { key: Key0, mode: Vi|~Search, action: First } + #- { key: Key4, mods: Shift, mode: Vi|~Search, action: Last } + #- { key: Key6, mods: Shift, mode: Vi|~Search, action: FirstOccupied } + #- { key: H, mods: Shift, mode: Vi|~Search, action: High } + #- { key: M, mods: Shift, mode: Vi|~Search, action: Middle } + #- { key: L, mods: Shift, mode: Vi|~Search, action: Low } + #- { key: B, mode: Vi|~Search, action: SemanticLeft } + #- { key: W, mode: Vi|~Search, action: SemanticRight } + #- { key: E, mode: Vi|~Search, action: SemanticRightEnd } + #- { key: B, mods: Shift, mode: Vi|~Search, action: WordLeft } + #- { key: W, mods: Shift, mode: Vi|~Search, action: WordRight } + #- { key: E, mods: Shift, mode: Vi|~Search, action: WordRightEnd } + #- { key: Key5, mods: Shift, mode: Vi|~Search, action: Bracket } + #- { key: Slash, mode: Vi|~Search, action: SearchForward } + #- { key: Slash, mods: Shift, mode: Vi|~Search, action: SearchBackward } + #- { key: N, mode: Vi|~Search, action: SearchNext } + #- { key: N, mods: Shift, mode: Vi|~Search, action: SearchPrevious } + + # Search Mode + #- { key: Return, mode: Search|Vi, action: SearchConfirm } + #- { key: Escape, mode: Search, action: SearchCancel } + #- { key: C, mods: Control, mode: Search, action: SearchCancel } + #- { key: U, mods: Control, mode: Search, action: SearchClear } + #- { key: W, mods: Control, mode: Search, action: SearchDeleteWord } + #- { key: P, mods: Control, mode: Search, action: SearchHistoryPrevious } + #- { key: N, mods: Control, mode: Search, action: SearchHistoryNext } + #- { key: Up, mode: Search, action: SearchHistoryPrevious } + #- { key: Down, mode: Search, action: SearchHistoryNext } + #- { key: Return, mode: Search|~Vi, action: SearchFocusNext } + #- { key: Return, mods: Shift, mode: Search|~Vi, action: SearchFocusPrevious } + + # (Windows, Linux, and BSD only) + #- { key: V, mods: Control|Shift, mode: ~Vi, action: Paste } + #- { key: C, mods: Control|Shift, action: Copy } + #- { key: F, mods: Control|Shift, mode: ~Search, action: SearchForward } + #- { key: B, mods: Control|Shift, mode: ~Search, action: SearchBackward } + #- { key: C, mods: Control|Shift, mode: Vi|~Search, action: ClearSelection } + #- { key: Insert, mods: Shift, action: PasteSelection } + #- { key: Key0, mods: Control, action: ResetFontSize } + #- { key: Equals, mods: Control, action: IncreaseFontSize } + #- { key: Plus, mods: Control, action: IncreaseFontSize } + #- { key: NumpadAdd, mods: Control, action: IncreaseFontSize } + #- { key: Minus, mods: Control, action: DecreaseFontSize } + #- { key: NumpadSubtract, mods: Control, action: DecreaseFontSize } + + # (Windows only) + #- { key: Return, mods: Alt, action: ToggleFullscreen } + + # (macOS only) + #- { key: K, mods: Command, mode: ~Vi|~Search, chars: "\x0c" } + #- { key: K, mods: Command, mode: ~Vi|~Search, action: ClearHistory } + #- { key: Key0, mods: Command, action: ResetFontSize } + #- { key: Equals, mods: Command, action: IncreaseFontSize } + #- { key: Plus, mods: Command, action: IncreaseFontSize } + #- { key: NumpadAdd, mods: Command, action: IncreaseFontSize } + #- { key: Minus, mods: Command, action: DecreaseFontSize } + #- { key: NumpadSubtract, mods: Command, action: DecreaseFontSize } + #- { key: V, mods: Command, action: Paste } + #- { key: C, mods: Command, action: Copy } + #- { key: C, mods: Command, mode: Vi|~Search, action: ClearSelection } + #- { key: H, mods: Command, action: Hide } + #- { key: H, mods: Command|Alt, action: HideOtherApplications } + #- { key: M, mods: Command, action: Minimize } + #- { key: Q, mods: Command, action: Quit } + #- { key: W, mods: Command, action: Quit } + #- { key: N, mods: Command, action: CreateNewWindow } + #- { key: F, mods: Command|Control, action: ToggleFullscreen } + #- { key: F, mods: Command, mode: ~Search, action: SearchForward } + #- { key: B, mods: Command, mode: ~Search, action: SearchBackward } diff --git a/modules/home.legacy/conf/alacritty/yaml/mouse.yml b/modules/home.legacy/conf/alacritty/yaml/mouse.yml new file mode 100644 index 00000000..4bdb408b --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/mouse.yml @@ -0,0 +1,11 @@ +mouse: + # Click settings + # + # The `double_click` and `triple_click` settings control the time + # alacritty should wait for accepting multiple clicks as one double + # or triple click. + double_click: { threshold: 300 } + triple_click: { threshold: 300 } + + # If this is `true`, the cursor is temporarily hidden when typing. + hide_when_typing: false diff --git a/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml b/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml new file mode 100644 index 00000000..ab244d21 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml @@ -0,0 +1,32 @@ +# Mouse bindings +# +# Mouse bindings are specified as a list of objects, much like the key +# bindings further below. +# +# To trigger mouse bindings when an application running within Alacritty +# captures the mouse, the `Shift` modifier is automatically added as a +# requirement. +# +# Each mouse binding will specify a: +# +# - `mouse`: +# +# - Middle +# - Left +# - Right +# - Numeric identifier such as `5` +# +# - `action` (see key bindings for actions not exclusive to mouse mode) +# +# - Mouse exclusive actions: +# +# - ExpandSelection +# Expand the selection to the current mouse cursor location. +# +# And optionally: +# +# - `mods` (see key bindings) +mouse_bindings: +# - { mouse: Right, action: ExpandSelection } +# - { mouse: Right, mods: Control, action: ExpandSelection } + - { mouse: Middle, action: Copy } diff --git a/modules/home.legacy/conf/alacritty/yaml/scrolling.yml b/modules/home.legacy/conf/alacritty/yaml/scrolling.yml new file mode 100644 index 00000000..50365627 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/scrolling.yml @@ -0,0 +1,7 @@ +scrolling: + # Maximum number of lines in the scrollback buffer. + # Specifying '0' will disable scrolling. + history: 10000 + + # Scrolling distance multiplier. + multiplier: 3 diff --git a/modules/home.legacy/conf/alacritty/yaml/selection.yml b/modules/home.legacy/conf/alacritty/yaml/selection.yml new file mode 100644 index 00000000..5e5bd544 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/selection.yml @@ -0,0 +1,7 @@ +selection: + # This string contains all characters that are used as separators for + # "semantic words" in Alacritty. + semantic_escape_chars: ",│`|:\"' ()[]{}<>\t" + + # When set to `true`, selected text will be copied to the primary clipboard. + save_to_clipboard: false diff --git a/modules/home.legacy/conf/alacritty/yaml/shell.yml b/modules/home.legacy/conf/alacritty/yaml/shell.yml new file mode 100644 index 00000000..04844dd0 --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/shell.yml @@ -0,0 +1,13 @@ +# Shell +# +# You can set `shell.program` to the path of your favorite shell, e.g. +# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the +# shell. +# +# Default: +# - (Linux/BSD/macOS) `$SHELL` or the user's login shell, if `$SHELL` is unset +# - (Windows) powershell +#shell: +# program: /bin/bash +# args: +# - --login diff --git a/modules/home.legacy/conf/alacritty/yaml/window.yml b/modules/home.legacy/conf/alacritty/yaml/window.yml new file mode 100644 index 00000000..7b89b6ed --- /dev/null +++ b/modules/home.legacy/conf/alacritty/yaml/window.yml @@ -0,0 +1,89 @@ +window: + # Window dimensions (changes require restart) + # + # Number of lines/columns (not pixels) in the terminal. Both lines and columns + # must be non-zero for this to take effect. The number of columns must be at + # least `2`, while using a value of `0` for columns and lines will fall back + # to the window manager's recommended size + dimensions: + columns: 0 + lines: 0 + + # Window position (changes require restart) + # + # Specified in number of pixels. + # If the position is not set, the window manager will handle the placement. + #position: + # x: 0 + # y: 0 + + # Window padding (changes require restart) + # + # Blank space added around the window in pixels. This padding is scaled + # by DPI and the specified value is always added at both opposing sides. + padding: + x: 5 + y: 5 + + # Spread additional padding evenly around the terminal content. + #dynamic_padding: false + + # Window decorations + # + # Values for `decorations`: + # - full: Borders and title bar + # - none: Neither borders nor title bar + # + # Values for `decorations` (macOS only): + # - transparent: Title bar, transparent background and title bar buttons + # - buttonless: Title bar, transparent background and no title bar buttons + decorations: none + + # Background opacity + # + # Window opacity as a floating point number from `0.0` to `1.0`. + # The value `0.0` is completely transparent and `1.0` is opaque. + opacity: 0.9 + + # Startup Mode (changes require restart) + # + # Values for `startup_mode`: + # - Windowed + # - Maximized + # - Fullscreen + # + # Values for `startup_mode` (macOS only): + # - SimpleFullscreen + startup_mode: Windowed + + # Window title + title: Alacritty + + # Allow terminal applications to change Alacritty's window title. + dynamic_title: true + + # Window class (Linux/BSD only): + class: + # Application instance name + instance: Alacritty + # General application class + general: Alacritty + + # Decorations theme variant + # + # Override the variant of the System theme/GTK theme/Wayland client side + # decorations. Commonly supported values are `Dark`, `Light`, and `None` for + # auto pick-up. Set this to `None` to use the default theme variant. + decorations_theme_variant: None + + # Resize increments + # + # Prefer resizing window by discrete steps equal to cell dimensions. + #resize_increments: false + + # Make `Option` key behave as `Alt` (macOS only): + # - OnlyLeft + # - OnlyRight + # - Both + # - None (default) + #option_as_alt: None diff --git a/modules/home.legacy/conf/beets/default.nix b/modules/home.legacy/conf/beets/default.nix new file mode 100644 index 00000000..8d6277b7 --- /dev/null +++ b/modules/home.legacy/conf/beets/default.nix @@ -0,0 +1,103 @@ +{ + pkgs, + lib, + config, + ... +}: let + plugins = import ./plugins.nix {}; +in { + imports = [ + ./plugins + ]; + + programs.beets = { + enable = true; + package = pkgs.beets.override { + pluginOverrides = { + xtractor = { + enable = true; + propagatedBuildInputs = [pkgs.beetsExtraPlugins.xtractor]; + }; + }; + }; + + settings = { + library = "${config.xdg.dataHome}/beets/library.db"; + art_filename = "cover"; + directory = "${config.xdg.userDirs.music}/beets"; + ui = { + color = true; + }; + + include = [ + "./replace_override.yaml" + ]; + + import = { + # move, instead of copying or linking the files + copy = false; + move = true; + link = false; + + # Show more detail, when beet needs to ask for something + detail = true; + + incremental = false; + + # Write the metadata to the files + write = true; + log = "${config.xdg.dataHome}/beets/beetslog.txt"; + }; + + paths = let + j = lib.strings.concatStringsSep "/"; + in { + default = j ["[Default]" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"]; + "albumtype:live" = j ["[Live]" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"]; + + "albumtype:album" = j ["Music" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"]; + "albumtype::(Single|EP)" = j ["Music" "$genre" "$first_artist_singleton" "$album ($albumtype)" "$track $title"]; + "albumtype:compilation" = j ["Complilations" "$genre" "Various Artists" "$album ($albumtype)" "$track $title"]; + "albumtype:soundtrack" = j ["Soundtracks" "$genre" "$first_artist" "$album" "$track $title"]; + }; + + inherit plugins; + + # Plugin config + # scrub = { + # auto = true; + # }; + + musicbrainz = { + # Search for deezer id's and use them in the autotagger + # external_ids = { + # deezer = true; + # }; + }; + + # Log-on config + # TODO: Add this, to upload the generated fingerprints (to help improve their + # database) <2024-08-07> + # acoustid = { + # apikey = "TODO"; + # }; + }; + + mpdIntegration = { + enableStats = true; + enableUpdate = true; + host = config.home.sessionVariables.MPD_HOST; + }; + }; + + xdg.configFile."beets/replace_override.yaml".source = ./replace_override.yaml; + + # Use the json formatter instead of the YAML one, as the YAML formatter mangles the + # longer python inline strings. + # YAML is a superset of JSON. + xdg.configFile."beets/config.yaml".source = + lib.mkForce + ((pkgs.formats.json {}).generate + "beets-config" + config.programs.beets.settings); +} diff --git a/modules/home.legacy/conf/beets/plugins.nix b/modules/home.legacy/conf/beets/plugins.nix new file mode 100644 index 00000000..bea2fefe --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins.nix @@ -0,0 +1,67 @@ +{...}: +# NOTE: This list is here and not split over the various plugin dirs, as we need a way to +# specify the order plugins are loaded in. <2024-08-11> +[ + # Remove all previous tags before import (this is useful to ensure, that + # the metadata in the libary.db is synced with the tags on disk) + # # FIXME: I think, that this also removes the deezer id, which is not ideal + # <2024-08-07> + # "scrub" + + # Help submitting stuff to music brainz + "mbsubmit" + + # Extract things from the music file + "xtractor" + + # Calculate replay gain + "replaygain" + + # Check for bad files + "badfiles" + + # Alows to use inline python for parsing tags + "inline" + + # Support player integration + "play" + + # Show tags on files/queries + "info" + + # Create playlist from `play_count`/`skip_count` (gathered by the `mpdstats` + # plugin) + # Note that this should come _before_ the `mpdupdate` plugin, to ensure that + # `mpdupgate` can propagate changed playlist to `mpd`. + "smartplaylist" + + # Warn, when importing a matching item + "ihate" + + # Allow fuzzy searching + "fuzzy" + + # Filter out duplicates + "duplicates" + + # Generate fingerprints + "chroma" + + # Download album art + "fetchart" + + # Fetches tags from `last.fm` and adds them as genres to imported music + "lastgenre" + + # Run commands on events + "hook" + + # Fetch lyrics + "lyrics" + + # Allow beets to understand deezer id's + # "deezer" + + "mpdstats" # Transfer MPD stats to beets + "mpdupdate" # Update MPD database on import +] diff --git a/modules/home.legacy/conf/beets/plugins/badfiles/default.nix b/modules/home.legacy/conf/beets/plugins/badfiles/default.nix new file mode 100644 index 00000000..33884785 --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/badfiles/default.nix @@ -0,0 +1,13 @@ +{ + lib, + pkgs, + ... +}: { + programs.beets.settings.badfiles = { + check_on_import = true; + commands = { + flac = "${lib.getExe' pkgs.flac "flac"} --test --warnings-as-errors --silent"; + mp3 = "${lib.getExe pkgs.mp3val}"; + }; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/default.nix b/modules/home.legacy/conf/beets/plugins/default.nix new file mode 100644 index 00000000..3bea5ea8 --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/default.nix @@ -0,0 +1,16 @@ +{...}: { + imports = [ + ./badfiles + ./duplicates + ./fuzzy + ./ihate + ./inline + ./lastgenre + ./lyrics + ./mbsubmit + ./play + ./replaygain + ./smartplaylist + ./xtractor + ]; +} diff --git a/modules/home.legacy/conf/beets/plugins/duplicates/default.nix b/modules/home.legacy/conf/beets/plugins/duplicates/default.nix new file mode 100644 index 00000000..c8a6c108 --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/duplicates/default.nix @@ -0,0 +1,5 @@ +{...}: { + programs.beets.settings.duplicates = { + keys = ["acoustid_fingerprint"]; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix b/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix new file mode 100644 index 00000000..b86b3a20 --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix @@ -0,0 +1,6 @@ +{...}: { + programs.beets.settings.fuzzy = { + # The prefix denoting that a search should be run in fuzzy mode + prefix = "."; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/ihate/default.nix b/modules/home.legacy/conf/beets/plugins/ihate/default.nix new file mode 100644 index 00000000..145f5f8b --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/ihate/default.nix @@ -0,0 +1,8 @@ +{...}: { + programs.beets.settings.ihate = { + warn = [ + "title:commentary" + "albumtype:live" + ]; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/inline/default.nix b/modules/home.legacy/conf/beets/plugins/inline/default.nix new file mode 100644 index 00000000..0dda8cfc --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/inline/default.nix @@ -0,0 +1,42 @@ +{...}: { + programs.beets.settings = { + item_fields = { + # Taken from https://github.com/trapd00r/configs/blob/4f3dada5700846cca6c2869e6fa6b3c795b87b67/beets/config.yaml + first_artist = + /* + python + */ + '' + # import an album to another artists directory, like: + # Tom Jones │1999│ Burning Down the House [Single, CD, FLAC] + # to The Cardigans/+singles/Tom Jones & the Cardigans │1999│ Burning Down the House [Single, CD, FLAC] + # https://github.com/beetbox/beets/discussions/4012#discussioncomment-1021414 + # beet import --set myartist='The Cardigans' + # we must first check to see if myartist is defined, that is, given on + # import time, or we raise an NameError exception. + try: + myartist + except NameError: + import re + return re.split(',|\\s+(feat(.?|uring)|&|(Vs|Ft).)', albumartist, 1, flags=re.IGNORECASE)[0] + else: + return myartist + ''; + + first_artist_singleton = + /* + python + */ + '' + try: + myartist + except NameError: + import re + return re.split(',|\\s+(feat(.?|uring)|&|(Vs|Ft).)', artist, 1, flags=re.IGNORECASE)[0] + else: + return myartist + ''; + }; + album_fields = {}; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix b/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix new file mode 100644 index 00000000..d10ca49f --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix @@ -0,0 +1,7 @@ +{...}: { + programs.beets.settings.lastgenre = { + prefer_specific = false; + # Lookup the track, not the album + source = "track"; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/lyrics/default.nix b/modules/home.legacy/conf/beets/plugins/lyrics/default.nix new file mode 100644 index 00000000..80544aea --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/lyrics/default.nix @@ -0,0 +1,6 @@ +{...}: { + programs.beets.settings.lyrics = { + # Always fetch lyrics (and update them, if some were found) + force = true; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix b/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix new file mode 100644 index 00000000..b70f1c63 --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix @@ -0,0 +1,9 @@ +{ + lib, + pkgs, + ... +}: { + programs.beets.settings.mbsubmit = { + picard_path = lib.getExe pkgs.picard; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/play/default.nix b/modules/home.legacy/conf/beets/plugins/play/default.nix new file mode 100644 index 00000000..f5bc3c9b --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/play/default.nix @@ -0,0 +1,14 @@ +{ + lib, + pkgs, + config, + ... +}: { + programs.beets.settings.play = { + command = "${lib.getExe pkgs.mpc-cli} $args add"; + relative_to = config.services.mpd.musicDirectory; + + # Run the command with the returned paths as arguments + raw = true; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/replaygain/default.nix b/modules/home.legacy/conf/beets/plugins/replaygain/default.nix new file mode 100644 index 00000000..611f3799 --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/replaygain/default.nix @@ -0,0 +1,24 @@ +{...}: { + programs.beets.settings = { + replaygain = { + auto = true; + backend = "ffmpeg"; + + r128_targetlevel = 89; + + # Re-calculate the replay gain value even for files, that already have one set. + overwrite = true; + }; + + hook = { + hooks = [ + { + # Also generate the replaygain for the album variant (so selecting between + # track and album becomes possible) + event = "import"; + command = "echo Remember to run 'beet replaygain --album' to generate the album replaygain values for the imported songs!"; + } + ]; + }; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix b/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix new file mode 100644 index 00000000..b55c487c --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix @@ -0,0 +1,33 @@ +{config, ...}: { + programs.beets.settings.smartplaylist = { + relative_to = config.services.mpd.musicDirectory; + playlist_dir = config.services.mpd.playlistDirectory; + forward_slash = false; + + # Show the real m3u file paths, when running `--pretend` + pretend_paths = true; + + playlists = [ + { + name = "artists-$first_artist.m3u"; + query = ""; + } + { + name = "ratings-good.m3u"; + query = "rating:0.7..1.0"; + } + { + name = "ratings-mediocre.m3u"; + query = "rating:0.4..0.7"; + } + { + name = "ratings-bad.m3u"; + query = "rating:0.0..0.4"; + } + { + name = "not_played.m3u"; + query = "-play_count: artist:"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/beets/plugins/xtractor/default.nix b/modules/home.legacy/conf/beets/plugins/xtractor/default.nix new file mode 100644 index 00000000..d4582c5f --- /dev/null +++ b/modules/home.legacy/conf/beets/plugins/xtractor/default.nix @@ -0,0 +1,95 @@ +{ + lib, + pkgs, + config, + ... +}: { + programs.beets.settings = { + xtractor = { + # This option is not yet implemented, thus requiring the hook + auto = true; + + dry-run = false; + # Writes the bpm key to the media files + write = true; + threads = 0; + # Also run for files, which already have the required keys + force = true; + quiet = false; + keep_output = true; + keep_profiles = true; + output_path = "${config.xdg.dataHome}/beets/xtactor"; + essentia_extractor = "${lib.getExe pkgs.essentia-extractor}"; + extractor_profile = { + highlevel = { + svm_models = let + m = pkgs.beetsExtraPlugins.xtractor.models; + in [ + "${m}/danceability.history" + "${m}/danceability.history.param" + "${m}/danceability.history.results.html" + "${m}/gender.history" + "${m}/gender.history.param" + "${m}/gender.history.results.html" + "${m}/genre_dortmund.history" + "${m}/genre_dortmund.history.param" + "${m}/genre_dortmund.history.results.html" + "${m}/genre_electronic.history" + "${m}/genre_electronic.history.param" + "${m}/genre_electronic.history.results.html" + "${m}/genre_rosamerica.history" + "${m}/genre_rosamerica.history.param" + "${m}/genre_rosamerica.history.results.html" + "${m}/genre_tzanetakis.history" + "${m}/genre_tzanetakis.history.param" + "${m}/genre_tzanetakis.history.results.html" + "${m}/ismir04_rhythm.history" + "${m}/ismir04_rhythm.history.param" + "${m}/ismir04_rhythm.history.results.html" + "${m}/mood_acoustic.history" + "${m}/mood_acoustic.history.param" + "${m}/mood_acoustic.history.results.html" + "${m}/mood_aggressive.history" + "${m}/mood_aggressive.history.param" + "${m}/mood_aggressive.history.results.html" + "${m}/mood_electronic.history" + "${m}/mood_electronic.history.param" + "${m}/mood_electronic.history.results.html" + "${m}/mood_happy.history" + "${m}/mood_happy.history.param" + "${m}/mood_happy.history.results.html" + "${m}/mood_party.history" + "${m}/mood_party.history.param" + "${m}/mood_party.history.results.html" + "${m}/mood_relaxed.history" + "${m}/mood_relaxed.history.param" + "${m}/mood_relaxed.history.results.html" + "${m}/mood_sad.history" + "${m}/mood_sad.history.param" + "${m}/mood_sad.history.results.html" + "${m}/moods_mirex.history" + "${m}/moods_mirex.history.param" + "${m}/moods_mirex.history.results.html" + "${m}/timbre.history" + "${m}/timbre.history.param" + "${m}/timbre.history.results.html" + "${m}/tonal_atonal.history" + "${m}/tonal_atonal.history.param" + "${m}/tonal_atonal.history.results.html" + "${m}/voice_instrumental.history" + "${m}/voice_instrumental.history.param" + "${m}/voice_instrumental.history.results.html" + ]; + }; + }; + }; + hook = { + hooks = [ + { + event = "import"; + command = "echo Remember to run 'beet xtractor'!"; + } + ]; + }; + }; +} diff --git a/modules/home.legacy/conf/beets/replace_override.yaml b/modules/home.legacy/conf/beets/replace_override.yaml new file mode 100644 index 00000000..23d6ea55 --- /dev/null +++ b/modules/home.legacy/conf/beets/replace_override.yaml @@ -0,0 +1,10 @@ +--- +replace: + '[\\/]': _ + '^\.': _ + '[\x00-\x1f]': _ + '[<>:"\?\*\|]': _ + '\.$': _ + '\s+$': '' + '^\s+': '' + '^-': _ diff --git a/modules/home.legacy/conf/btop/default.nix b/modules/home.legacy/conf/btop/default.nix new file mode 100644 index 00000000..06b56ea7 --- /dev/null +++ b/modules/home.legacy/conf/btop/default.nix @@ -0,0 +1,5 @@ +{config, ...}: { + programs.btop = { + enable = true; + }; +} diff --git a/modules/home.legacy/conf/dconf/default.nix b/modules/home.legacy/conf/dconf/default.nix new file mode 100644 index 00000000..dc439e1e --- /dev/null +++ b/modules/home.legacy/conf/dconf/default.nix @@ -0,0 +1,9 @@ +{...}: { + # Also see: https://github.com/gvolpe/dconf2nix + dconf.settings = { + "org/gnome/desktop/wm/preferences" = { + # hide gtk buttons in titelbar + button-layout = ""; + }; + }; +} diff --git a/modules/home.legacy/conf/default.nix b/modules/home.legacy/conf/default.nix new file mode 100644 index 00000000..b6eddec4 --- /dev/null +++ b/modules/home.legacy/conf/default.nix @@ -0,0 +1,48 @@ +{...}: { + imports = [ + ./alacritty + ./beets + ./btop + ./dconf + ./direnv + ./firefox + ./gammastep + ./git + ./gpg + ./gtk + ./himalaya + ./hyfetch + ./iamb + ./keepassxc + ./latexindent + ./less + ./lf + ./mail + ./mako + ./mbsync + ./mpd + ./mpv + ./mumble + ./neomutt + ./nix-index + ./npm + ./nvim + ./prusa_slicer + ./python + ./rclone + ./rofi + ./ssh + ./starship + ./swayidle + ./swaylock + ./taskwarrior + ./timewarrior + ./tridactyl + ./unison + ./xdg + ./yambar + ./yt + ./ytcc + ./zsh + ]; +} diff --git a/modules/home.legacy/conf/direnv/default.nix b/modules/home.legacy/conf/direnv/default.nix new file mode 100644 index 00000000..3a7b8add --- /dev/null +++ b/modules/home.legacy/conf/direnv/default.nix @@ -0,0 +1,6 @@ +{...}: { + programs.direnv = { + enable = true; + nix-direnv.enable = true; + }; +} diff --git a/modules/home.legacy/conf/firefox/config/bookmarks/default.nix b/modules/home.legacy/conf/firefox/config/bookmarks/default.nix new file mode 100644 index 00000000..c612bf4d --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/bookmarks/default.nix @@ -0,0 +1,31 @@ +{ + lib, + pkgs, + ... +}: let + bookmarks = [ + { + name = "Feed - Piped"; + url = "https://piped.video/feed"; + } + + { + name = "DeepL Translate"; + url = "https://www.deepl.com/translator"; + } + + { + name = "Nix lib"; + url = "https://teu5us.github.io/nix-lib.html"; + } + + { + name = "Nixpkgs manual"; + url = "https://ryantm.github.io/nixpkgs/"; + } + ]; + + mkBookmarksFile = (import ./lib.nix) {inherit lib pkgs;}; + bookmarks_file = mkBookmarksFile bookmarks; +in + bookmarks_file diff --git a/modules/home.legacy/conf/firefox/config/bookmarks/lib.nix b/modules/home.legacy/conf/firefox/config/bookmarks/lib.nix new file mode 100644 index 00000000..d1d89dd2 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/bookmarks/lib.nix @@ -0,0 +1,49 @@ +{ + lib, + pkgs, +}: bookmarks: let + indent = level: + lib.concatStringsSep "" (map (lib.const " ") (lib.range 1 level)); + + bookmarkToHTML = indentLevel: bookmark: '' + ${indent indentLevel}
${lib.escapeXML bookmark.name}''; + + directoryToHTML = indentLevel: directory: '' + ${indent indentLevel}
${ + if directory.toolbar + then ''

Bookmarks Toolbar'' + else "

${lib.escapeXML directory.name}" + }

+ ${indent indentLevel}

+ ${allItemsToHTML (indentLevel + 1) directory.bookmarks} + ${indent indentLevel}

''; + + itemToHTMLOrRecurse = indentLevel: item: + if item ? "url" + then bookmarkToHTML indentLevel item + else directoryToHTML indentLevel item; + + allItemsToHTML = indentLevel: bookmarks: + lib.concatStringsSep "\n" + (map (itemToHTMLOrRecurse indentLevel) bookmarks); + + bookmarkEntries = allItemsToHTML 1 bookmarks; +in + pkgs.writeText "firefox-bookmarks.html" '' + + + + Bookmarks +

Bookmarks Menu

+ +

+

Bookmarks Toolbar

+

+ ${bookmarkEntries} +

+

+ '' diff --git a/modules/home.legacy/conf/firefox/config/chrome/userChrome.css b/modules/home.legacy/conf/firefox/config/chrome/userChrome.css new file mode 100644 index 00000000..0b3aff77 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/chrome/userChrome.css @@ -0,0 +1,41 @@ +/* thickness of tab when you have too many open tabs */ +.tabbrowser-tab:not([pinned="true"]) { + min-width: 10px !important; + min-height: 10px !important; +} + +/* tab height +#TabsToolbar .tabbrowser-tabs { +min-height: 10px !important; +} +*/ + +/* +.tabbrowser-tab {min-width: 016px !important;} +.tabbrowser-tab {clip-width: 016px !important;} +*/ + +/* the + button that opens new tabs */ +#TabsToolbar .tabs-newtab-button { + margin-left: 10px !important; + height: Auto !important; +} + +#main-window[privatebrowsingmode="temporary"] #navigator-toolbox { + background-color: #c40944 !important; +} + +/* close button inside a tab */ +.tab-close-button * { + width: 10px !important; + height: 10px !important; +} + +/* bookmark toolbar */ +#personal-bookmarks .bookmark-item > .toolbarbutton-text { + font-size: 10pt !important; +} +#personal-bookmarks .bookmark-item > .toolbarbutton-icon { + height: 12px !important; + width: 12px !important; +} diff --git a/modules/home.legacy/conf/firefox/config/extensions/extensions.json b/modules/home.legacy/conf/firefox/config/extensions/extensions.json new file mode 100644 index 00000000..be05e957 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/extensions/extensions.json @@ -0,0 +1,50 @@ +{ + "darkreader": { + "addonId": "addon@darkreader.org", + "default_area": "navbar", + "pname": "darkreader", + "sha256": "sha256:251c4e7d0a30c0cab006803600e59ab92dcc0c606429740d42677846d4c9ccd6", + "url": "https://addons.mozilla.org/firefox/downloads/file/4359254/darkreader-4.9.94.xpi", + "version": "4.9.94" + }, + "keepassxc-browser": { + "addonId": "keepassxc-browser@keepassxc.org", + "default_area": "navbar", + "pname": "keepassxc-browser", + "sha256": "sha256:a330fa4fc659f04f835802bb0c5df0b9025adced995112cad19d4849a5f1957d", + "url": "https://addons.mozilla.org/firefox/downloads/file/4342010/keepassxc_browser-1.9.3.xpi", + "version": "1.9.3" + }, + "torproject-snowflake": { + "addonId": "{b11bea1f-a888-4332-8d8a-cec2be7d24b9}", + "default_area": "navbar", + "pname": "torproject-snowflake", + "sha256": "sha256:a6b11d5250e6c30c9a0d4b1caaedc446a7fb31bb78088fa14554fdd1e3741cb3", + "url": "https://addons.mozilla.org/firefox/downloads/file/4310769/torproject_snowflake-0.8.4.xpi", + "version": "0.8.4" + }, + "tridactyl-vim": { + "addonId": "tridactyl.vim@cmcaine.co.uk", + "default_area": "menupanel", + "pname": "tridactyl-vim", + "sha256": "sha256:ab63fe1554471c280f234409393172fc58e1bb2ca527f4329d983b028073e19c", + "url": "https://addons.mozilla.org/firefox/downloads/file/4261352/tridactyl_vim-1.24.1.xpi", + "version": "1.24.1" + }, + "ublock-origin": { + "addonId": "uBlock0@raymondhill.net", + "default_area": "menupanel", + "pname": "ublock-origin", + "sha256": "sha256:e2cda9b2a1b0a7f6e5ef0da9f87f28df52f8560587ba2e51a3003121cfb81600", + "url": "https://addons.mozilla.org/firefox/downloads/file/4359936/ublock_origin-1.60.0.xpi", + "version": "1.60.0" + }, + "vhack-libredirect": { + "addonId": "vhack-libredirect@addons.vhack.eu", + "default_area": "navbar", + "pname": "vhack-libredirect", + "sha256": "sha256:2cb6befac6f414e0dd79a11db8905a0d988b98633b74afbe52ffe8006da841f5", + "url": "https://addons.mozilla.org/firefox/downloads/file/4351448/vhack_libredirect-2.9.1.xpi", + "version": "2.9.1" + } +} diff --git a/modules/home.legacy/conf/firefox/config/extensions/native_messaging_hosts/default.nix b/modules/home.legacy/conf/firefox/config/extensions/native_messaging_hosts/default.nix new file mode 100644 index 00000000..9aaa1682 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/extensions/native_messaging_hosts/default.nix @@ -0,0 +1,15 @@ +{pkgs, ...}: +/* +++ lib.optional (cfg.enableBrowserpass or false) (lib.getBin browserpass) +++ lib.optional (cfg.enableBukubrow or false) bukubrow +++ lib.optional (cfg.enableTridactylNative or false) tridactyl-native +++ lib.optional (cfg.enableGnomeExtensions or false) gnome-browser-connector +++ lib.optional (cfg.enableUgetIntegrator or false) uget-integrator +++ lib.optional (cfg.enablePlasmaBrowserIntegration or false) plasma5Packages.plasma-browser-integration +++ lib.optional (cfg.enableFXCastBridge or false) fx-cast-bridge +++ lib.optional (cfg.enableKeePassXC or false) keepassxc +*/ +with pkgs; [ + tridactyl-native + keepassxc +] diff --git a/modules/home.legacy/conf/firefox/config/policies/default.nix b/modules/home.legacy/conf/firefox/config/policies/default.nix new file mode 100644 index 00000000..02c740f6 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/policies/default.nix @@ -0,0 +1,146 @@ +{ + config, + extensions, + ... +}: let + locals = [ + "en-CA" + "de" + "sv-SE" + ]; + mkAllowedExtension = extension: { + name = extension.addonId; + value = { + installation_mode = "normal_installed"; + updates_disabled = true; + inherit (extension) default_area; + install_url = "file://${builtins.fetchurl { + inherit + (extension) + url + sha256 + ; + }}"; + }; + }; + allowedExtensions = + builtins.listToAttrs + (builtins.map mkAllowedExtension (builtins.attrValues + extensions)); + + mkBlockedExtension = id: { + name = id; + value = { + install_mode = "blocked"; + }; + }; + blockedExtensions = builtins.listToAttrs (builtins.map mkBlockedExtension [ + # these are the default search engines + "addons-search-detection@mozilla.com" + "amazon@search.mozilla.org" + "bing@search.mozilla.org" + "ddg@search.mozilla.org" + "google@search.mozilla.org" + "wikipedia@search.mozilla.org" + ]); + + language_packs = builtins.listToAttrs (builtins.map + ( + lang: { + name = "langpack-${lang}@firefox.mozilla.org"; + value = { + installation_mode = "normal_installed"; + updates_disabled = true; + install_url = "https://releases.mozilla.org/pub/firefox/releases/${config.soispha.firefox.package_version}/linux-x86_64/xpi/${lang}.xpi"; + }; + } + ) + locals); +in { + # NOTE: See https://mozilla.github.io/policy-templates for documentation <2023-10-21> + policies = { + # NixOS manages this already + DisableAppUpdate = true; + + DisableFirefoxAccounts = true; + DisableFirefoxScreenshots = true; + + # KeepassXC does this for me + DisableMasterPasswordCreation = true; + + # I use a self-hosted services for that + DisablePocket = true; + + # I don't want to lose my data + DisableProfileRefresh = true; + + DisableDeveloperTools = false; + + DisplayBookmarksToolbar = "newtab"; + DisplayMenuBar = "default-off"; + + DNSOverHTTPS = { + Enabled = true; + Locked = false; + }; + # The concept of a "default browser" does not apply to my NixOS config + DontCheckDefaultBrowser = true; + + EnableTrackingProtection = { + Value = true; + Locked = false; + Cryptomining = true; + Fingerprinting = true; + EmailTracking = true; + }; + + EncryptedMediaExtensions = { + # I want a _free_ config (and I can always just run another browser) + Enabled = false; + Locked = true; + }; + + ExtensionSettings = + { + "*" = { + # Blocking the extension install here, also blocks the 'about:debugging' page + + # blocked_install_message = '' + # You can't install a extension manually, + # please specify it in your NixOS configuration + # ''; + installation_mode = "allowed"; + }; + } + // allowedExtensions + // blockedExtensions + // language_packs; + + ExtensionUpdate = false; + + # TODO: Add handlers for the default file types <2023-10-21> + # Handlers = { + # }; + + HardwareAcceleration = true; + + # Blocking the extension install here, also blocks the 'about:debugging' page + # InstallAddonsPermission = { + # Allowed = []; + # Default = false; + # }; + + # KeepassXC and such things + OfferToSaveLogins = false; + PasswordManagerEnabled = false; + + PDFjs = { + Enabled = true; + # Don't honor documents right to be un-copy-able + EnablePermissions = false; + }; + + SearchBar = "unified"; + RequestedLocales = locals; + }; +} diff --git a/modules/home.legacy/conf/firefox/config/prefs/default.nix b/modules/home.legacy/conf/firefox/config/prefs/default.nix new file mode 100644 index 00000000..80c6d274 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/prefs/default.nix @@ -0,0 +1,21 @@ +{ + pkgs, + config, + user_js, + bookmarks, + ... +}: let + user_js_override = pkgs.writeText "user.override.js" (builtins.readFile ./override.js); +in + pkgs.runCommand "user.js" {} '' + mkdir $out; + cat "${user_js}/user.js" > $out/user.js; + cat "${user_js_override}" >> $out/user.js; + + cat << EOF >> $out/user.js; + // My bookmarks + user_pref("browser.bookmarks.file", "${toString bookmarks}"); + user_pref("browser.startup.homepage", "file:///home/dt/home.html"); // 0103 // TODO: add this from a flake + user_pref("browser.download.dir", "${config.xdg.userDirs.download}"); + EOF + '' diff --git a/modules/home.legacy/conf/firefox/config/prefs/override.js b/modules/home.legacy/conf/firefox/config/prefs/override.js new file mode 100644 index 00000000..bf874b33 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/prefs/override.js @@ -0,0 +1,202 @@ +/* + 0100: STARTUP + 0200: GEOLOCATION / LANGUAGE / LOCALE + 0300: QUIETER FOX + 0400: SAFE BROWSING + 0600: BLOCK IMPLICIT OUTBOUND + 0700: DNS / DoH / PROXY / SOCKS / IPv6 + 0800: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS + 0900: PASSWORDS + 1000: DISK AVOIDANCE + 1200: HTTPS (SSL/TLS / OCSP / CERTS / HPKP) + 1400: FONTS + 1600: HEADERS / REFERERS + 1700: CONTAINERS + 2000: PLUGINS / MEDIA / WEBRTC + 2400: DOM (DOCUMENT OBJECT MODEL) + 2600: MISCELLANEOUS + 2700: ETP (ENHANCED TRACKING PROTECTION) + 2800: SHUTDOWN & SANITIZING + 4500: RFP (RESIST FINGERPRINTING) + 5000: OPTIONAL OPSEC + 5500: OPTIONAL HARDENING + 6000: DON'T TOUCH + 7000: DON'T BOTHER + 8000: DON'T BOTHER: FINGERPRINTING + 9000: NON-PROJECT RELATED + 9999: DEPRECATED / REMOVED / LEGACY / RENAMED +*/ + + +// restore session +user_pref("browser.startup.page", 3); // 0102 + +user_pref("browser.newtabpage.enabled", true); // 0104 + +// disable the geoservice, TODO: don't know if I want this +//user_pref("geo.provider.use_geoclue", false); // 0202 + +// TODO: is this something useful? +user_pref("datareporting.policy.dataSubmissionEnabled", true); // 0330 + +// enable health reports +user_pref("datareporting.healthreport.uploadEnabled", true); // 0331 + +// Do I want to opt-out? +user_pref("toolkit.telemetry.coverage.opt-out", false); // 0333 + +// enables studies +user_pref("app.shield.optoutstudies.enabled", true); // 0340 + +// I guess that browsing protection is useful +user_pref("browser.safebrowsing.downloads.remote.enabled", true); // 0403 + +// TODO: does this (-> set to false) make things slower? +user_pref("network.prefetch-next", true); // 0601 + +// enable ipv6 because the rest of the system uses it +user_pref("network.dns.disableIPv6", false); // 0701 + +// TRR only +user_pref("network.trr.mode", 3); // 0710 + +// I trust my search engine +user_pref("keyword.enabled", true); // 801 +user_pref("browser.search.suggest.enabled", true); // 0804 +user_pref("browser.urlbar.suggest.searches", true); // 0804 +// TODO: no idea what this does, enabling it +user_pref("browser.urlbar.showSearchTerms.enabled", true); // 9004 + +// prefetch urls, if the get auto completed +user_pref("browser.urlbar.speculativeConnect.enabled", true); // 0805 + +// Disable autoScrolling (clicking with the mouse wheel) +user_pref("general.autoScroll", false); + +// add new tabs after the current one +user_pref("browser.tabs.insertAfterCurrent", true); + +// TODO: I might want to enable this +//user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); // 0807 + +// TODO: enable form and search history? +//user_pref("browser.formfill.enable", false); // 0810 + +// disk cache should help performance +user_pref("browser.cache.disk.enable", true); // 1001 + +// store extra session data (form content, cookies and POST data) 0: everywhere +user_pref("browser.sessionstore.privacy_level", 0); // 1003 + +// Disable unsafe passive content (images) on https sites +user_pref("security.mixed_content.block_display_content", true); // 1241 + +// Disable the eme banner +user_pref("browser.eme.ui.enabled", false); // 2022 + +// Don't delete my precious temp files +user_pref("browser.helperApps.deleteTempFileOnExit", false); // 2603 + +// Download to the download dir +user_pref("browser.download.useDownloadDir", true); // 2651 + +// Open the download panel +user_pref("browser.download.alwaysOpenPanel", true); // 2652 + +// Block after custom ruleset +user_pref("browser.contentblocking.category", "custom"); // 2701 + +// set the custom settings // 7016 +user_pref("network.cookie.cookieBehavior", 1); +user_pref("network.http.referer.disallowCrossSiteRelaxingDefault", true); +user_pref("network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation", true); +user_pref("privacy.partition.network_state.ocsp_cache", true); +user_pref("privacy.query_stripping.enabled", true); +user_pref("privacy.trackingprotection.enabled", true); +user_pref("privacy.trackingprotection.socialtracking.enabled", true); +user_pref("privacy.trackingprotection.cryptomining.enabled", true); +user_pref("privacy.trackingprotection.fingerprinting.enabled", true); + + +// I might want to change that, when it hinders session restore +//user_pref("privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage", false); // 2720 + +// I like my history very much! +user_pref("privacy.sanitize.sanitizeOnShutdown", false); // 2810 + +// The downsides (light theme + potential breakages): +//user_pref("privacy.resistFingerprinting", true); // 4501 +user_pref("privacy.resistFingerprinting.letterboxing", false); // 4504 + +// I would like to keep my gl, even in the web +user_pref("webgl.disabled", false); // 4520 + +// I like my service workers and am using a service using them. +user_pref("dom.serviceWorkers.enabled", true); // 7017 + +// I've got a password manager already +user_pref("signon.rememberSignons", false); // 5003 + +// Do not track header +user_pref("privacy.donottrackheader.enabled", true); // 7015 + +// Allow my custom css +user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); + +// might improve performance TODO: +user_pref("gfx.webrender.all", true); + +// disable updates (pretty pointless with nix) +user_pref("extensions.update.autoUpdateDefault", false); +user_pref("extensions.update.enabled", false); +user_pref("app.update.channel", "default"); + +user_pref("browser.ctrlTab.recentlyUsedOrder", false); + +user_pref("browser.download.useDownloadDir", true); +user_pref("browser.download.folderList", 2); // TODO: +user_pref("browser.download.viewableInternally.typeWasRegistered.svg", true); +user_pref("browser.download.viewableInternally.typeWasRegistered.webp", true); +user_pref("browser.download.viewableInternally.typeWasRegistered.xml", true); + +// TODO: what does this do? +user_pref("browser.search.widget.inNavBar", true); + +user_pref("browser.shell.checkDefaultBrowser", false); +user_pref("browser.tabs.loadInBackground", true); +user_pref("browser.urlbar.placeholderName", "Brave"); + +// Set the tabs and bookmarks +user_pref("browser.tabs.inTitlebar", 1); +user_pref("browser.toolbars.bookmarks.visibility", "always"); +user_pref("browser.places.importBookmarksHTML", true); + +// Theme +user_pref("extensions.activeThemeID", "firefox-alpenglow@mozilla.org"); +user_pref("extensions.extensions.activeThemeID", "firefox-alpenglow@mozilla.org"); + +// highlight all entries when searching +user_pref("findbar.highlightAll", true); + +// Set the default position for the developer toolbox +user_pref("devtools,toolbox.host", "right"); +user_pref("devtools,toolsidebar-width.inspector", 700); + +// Don't bother me with translations +user_pref("browser.translations.automaticallyPopup", true); +user_pref("browser.translations.neverTranslateLanguages", "de"); + +// Put all downloads into the downloads directory +user_pref("browser.download.start_downloads_in_tmp_dir", false); + +// TODO: +//user_pref("extensions.webcompat.enable_picture_in_picture_overrides", true); +//user_pref("extensions.webcompat.enable_shims", true); +//user_pref("extensions.webcompat.perform_injections", true); +//user_pref("extensions.webcompat.perform_ua_overrides", true); + +// onlykey / copied from a yubikey config +//user_pref("security.webauth.u2f", true); +//user_pref("security.webauth.webauthn", true); +//user_pref("security.webauth.webauthn_enable_softtoken", true); +//user_pref("security.webauth.webauthn_enable_usbtoken", true); diff --git a/modules/home.legacy/conf/firefox/config/search/engines/default.nix b/modules/home.legacy/conf/firefox/config/search/engines/default.nix new file mode 100644 index 00000000..a47c77df --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/search/engines/default.nix @@ -0,0 +1,84 @@ +{pkgs, ...}: { + # DEFAULT + "Brave Search" = { + urls = [{template = "https://search.brave.com/search?q={searchTerms}";}]; + icon = ./logos/brave.svg; + definedAliases = ["@bs"]; + }; + + # NIX + "Nix Packages" = { + urls = [{template = "https://search.nixos.org/packages?type=packages&query={searchTerms}";}]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["@np"]; + }; + + "NixOS Options" = { + urls = [{template = "https://search.nixos.org/options?type=options&query={searchTerms}";}]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["@no"]; + }; + "HomeManager Options" = { + urls = [{template = "https://home-manager-options.extranix.com/?query={searchTerms}&release=master";}]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["@nh"]; + }; + + "Nixpkgs issues" = { + urls = [{template = "https://github.com/NixOS/nixpkgs/issues?q=is%3Aissue+is%3Aopen+{searchTerms}";}]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["@ni"]; + }; + "Nixpkgs pull requests" = { + urls = [{template = "https://github.com/NixOS/nixpkgs/pulls?q=is%3Apr+is%3Aopen+{searchTerms}";}]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["@nr"]; + }; + + "Nixpkgs pull requests tracker" = { + urls = [{template = "https://nixpk.gs/pr-tracker.html?pr={searchTerms}";}]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["@nt"]; + }; + "NixOS Wiki" = { + urls = [{template = "https://wiki.nixos.org/w/index.php?search={searchTerms}";}]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["@nw"]; + }; + + # RUST + "Rust std" = { + urls = [{template = "https://doc.rust-lang.org/std/?search={searchTerms}";}]; + icon = ./logos/rust_std.svg; + definedAliases = ["@rs"]; + }; + "Rust tokio" = { + urls = [{template = "https://docs.rs/tokio/latest/tokio/index.html?search={searchTerms}";}]; + icon = ./logos/rust_tokio.png; + definedAliases = ["@rt"]; + }; + + # OTHER + "Google Scholar" = { + urls = [{template = "https://scholar.google.com/scholar?hl=en&q={searchTerms}";}]; + icon = ./logos/google_scholar.ico; + definedAliases = ["@gs"]; + }; + "Wikipedia" = { + urls = [{template = "https://en.wikipedia.org/wiki/{searchTerms}";}]; + icon = ./logos/wikipedia.svg; + definedAliases = ["@wp"]; + }; + "Arch Wiki" = { + urls = [{template = "https://wiki.archlinux.org/index.php?search={searchTerms}";}]; + icon = ./logos/arch_linux.svg; + definedAliases = ["@aw"]; + }; + + "Wikipedia (en)".metaData.hidden = true; + "DuckDuckGo".metaData.hidden = true; + "Bing".metaData.hidden = true; + "Google".metaData.hidden = true; + "Amazon.de".metaData.hidden = true; + "eBay".metaData.hidden = true; +} diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/arch_linux.svg b/modules/home.legacy/conf/firefox/config/search/engines/logos/arch_linux.svg new file mode 100644 index 00000000..949b5c5f --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/search/engines/logos/arch_linux.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/brave.svg b/modules/home.legacy/conf/firefox/config/search/engines/logos/brave.svg new file mode 100644 index 00000000..09dd2e42 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/search/engines/logos/brave.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/google_scholar.ico b/modules/home.legacy/conf/firefox/config/search/engines/logos/google_scholar.ico new file mode 100644 index 00000000..85d0c664 Binary files /dev/null and b/modules/home.legacy/conf/firefox/config/search/engines/logos/google_scholar.ico differ diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_std.svg b/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_std.svg new file mode 100644 index 00000000..0091b5a8 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_std.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_tokio.png b/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_tokio.png new file mode 100644 index 00000000..f1de55ff Binary files /dev/null and b/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_tokio.png differ diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/wikipedia.svg b/modules/home.legacy/conf/firefox/config/search/engines/logos/wikipedia.svg new file mode 100644 index 00000000..dc32f984 --- /dev/null +++ b/modules/home.legacy/conf/firefox/config/search/engines/logos/wikipedia.svg @@ -0,0 +1 @@ +]>Wikipedia logo version 2 \ No newline at end of file diff --git a/modules/home.legacy/conf/firefox/default.nix b/modules/home.legacy/conf/firefox/default.nix new file mode 100644 index 00000000..f2ccfc99 --- /dev/null +++ b/modules/home.legacy/conf/firefox/default.nix @@ -0,0 +1,134 @@ +{ + config, + pkgs, + lib, + user_js, + ... +}: let + extensions = + builtins.fromJSON (builtins.readFile ./config/extensions/extensions.json); + + userChrome = builtins.readFile ./config/chrome/userChrome.css; + bookmarks = (import ./config/bookmarks/default.nix) { + inherit + pkgs + lib + ; + }; + engines = (import ./config/search/engines) {inherit pkgs;}; + + native_messaging_hosts = (import ./config/extensions/native_messaging_hosts/default.nix) {inherit pkgs;}; + + policies = (import ./config/policies) {inherit config extensions;}; + + search = { + default = "Brave Search"; + privateDefault = "Brave Search"; + force = true; + order = [ + # DEFAULT + "Brave Search" + + # NIX + "Nix Packages" + "Nix Options" + "Nixpkgs issues" + "Homemanager Options" + "NixOS Wiki" + "Nixpkgs Pull Request Tracker" + + # RUST + "Rust std" + "Rust tokio" + + # OTHER + "Google Scholar" + "Wikipedia" + "Arch Wiki" + ]; + + inherit engines; + }; + + prefConfig = builtins.readFile "${ + (import ./config/prefs) {inherit pkgs lib config bookmarks user_js;} + }/user.js"; + + # Package {{{ + package = import ./package.nix { + inherit config lib pkgs; + extraPolicies = policies; + extraNativeMessagingHosts = native_messaging_hosts; + }; + # }}} + + # Profiles {{{ + profiles = { + "default" = { + inherit search userChrome; + isDefault = true; + id = 0; + name = "default"; + extraConfig = prefConfig; + }; + }; + + taskwarriorProfiles = import ../taskwarrior/firefox { + inherit + config + lib + # options + + prefConfig + search + userChrome + ; + profile_size = builtins.length (builtins.attrNames profiles); + }; + # }}} +in { + options.soispha.firefox = { + package = lib.mkOption { + type = lib.types.package; + default = pkgs.firefox; + description = "Firefox package to use."; + defaultText = lib.literalExpression "pkgs.firefox"; + relatedPackages = [ + "firefox" + "firefox-beta-bin" + "firefox-bin" + "firefox-devedition-bin" + "firefox-esr" + ]; + }; + package_version = lib.mkOption { + type = lib.types.str; + default = pkgs.firefox.version; + description = "Firefox version to use"; + }; + }; + + config = { + soispha.firefox.package = package; + soispha.firefox.package_version = pkgs.firefox.version; + home.sessionVariables = { + # improve touch input & make scrolling smother + MOZ_USE_XINPUT2 = "1"; + + # improve wayland support + MOZ_ENABLE_WAYLAND = 1; + + # tell gtk to use portals + GTK_USE_PORTAL = 1; + + BROWSER = "firefox"; + }; + programs.firefox = { + enable = true; + inherit (config.soispha.firefox) package; + profiles = + profiles + // taskwarriorProfiles; + }; + }; +} diff --git a/modules/home.legacy/conf/firefox/package.nix b/modules/home.legacy/conf/firefox/package.nix new file mode 100644 index 00000000..f7e4319b --- /dev/null +++ b/modules/home.legacy/conf/firefox/package.nix @@ -0,0 +1,30 @@ +# taken from the NixOS Firefox module: https://github.com/NixOS/nixpkgs/blob/7c9cc5a6e5d38010801741ac830a3f8fd667a7a0/nixos/modules/programs/firefox.nix +{ + config, + lib, + pkgs, + # options + autoConfig ? "", + extraNativeMessagingHosts ? [], + wrapperConfig ? {}, + extraPolicies ? {}, + base_package ? pkgs.firefox, +}: let + pkg = base_package.override (old: { + extraPrefsFiles = + (old.extraPrefsFiles or []) + ++ [ + (pkgs.writeText "autoConfig.js" autoConfig) + ]; + nativeMessagingHosts = old.nativeMessagingHosts or [] ++ extraNativeMessagingHosts; + cfg = (old.cfg or {}) // wrapperConfig; + extraPoliciesFiles = + (old.extraPoliciesFiles or []) + ++ [ + ( + pkgs.writeText "policies.json" (builtins.toJSON extraPolicies) + ) + ]; + }); +in + pkg diff --git a/modules/home.legacy/conf/firefox/scripts/default.nix b/modules/home.legacy/conf/firefox/scripts/default.nix new file mode 100644 index 00000000..1127662b --- /dev/null +++ b/modules/home.legacy/conf/firefox/scripts/default.nix @@ -0,0 +1,29 @@ +{ + pkgs, + sysLib, + ... +}: let + unzip_mozlz4 = pkgs.stdenv.mkDerivation { + name = "unzip_mozlz4"; + propagatedBuildInputs = [ + (pkgs.python3.withPackages (pythonPackages: + with pythonPackages; [ + lz4 + ])) + ]; + dontUnpack = true; + installPhase = "install -Dm755 ${./unzip_mozlz4.py} $out/bin/unzip_mozlz4"; + }; + extract_cookies = sysLib.writeShellScript { + name = "extract_cookies"; + src = ./extract_cookies.sh; + dependencies = with pkgs; [ + bash + sqlite + mktemp + coreutils + ]; + }; +in { + inherit unzip_mozlz4 extract_cookies; +} diff --git a/modules/home.legacy/conf/firefox/scripts/extract_cookies.sh b/modules/home.legacy/conf/firefox/scripts/extract_cookies.sh new file mode 100755 index 00000000..e3d50d43 --- /dev/null +++ b/modules/home.legacy/conf/firefox/scripts/extract_cookies.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +# copied from https://superuser.com/a/1239036 +# extract_cookies.sh: +# +# Convert from Firefox's cookies.sqlite format to Netscape cookies, +# which can then be used by wget and curl. (Why don't wget and curl +# just use libsqlite if it's installed? Mysteries abound.) +# +# Note: This script reads directly from the standard cookie jar file, +# which means cookies which are kept only in memory ("session cookies") +# will not be extracted. You will need an extension to do that. + +# USAGE: +# +# $ extract_cookies.sh > /tmp/cookies.txt +# or +# $ extract_cookies.sh ~/.mozilla/firefox/*default*/cookies.sqlite > /tmp/cookies.txt + +# USING WITH WGET: +# $ wget --load-cookies=/tmp/cookies.txt http://example.com + +# USING WITH CURL: +# $ curl --cookie /tmp/cookies.txt http://example.com + +# Note: If you do not specify an SQLite filename, this script will +# intelligently find it for you. +# +# A) Usually it will check all profiles under ~/.mozilla/firefox/ and +# use the cookies.sqlite that was updated most recently. +# +# B) If you've redirected stdin (with < or |) , then that will be used. + +# HISTORY: I believe this is circa 2010 from: +# http://slacy.com/blog/2010/02/using-cookies-sqlite-in-wget-or-curl/ +# However, that site is down now. + +# Cleaned up by Hackerb9 (2017) to be more robust and require less typing. + +cleanup() { + rm -f "$TMPFILE" + exit 0 +} +trap cleanup EXIT INT QUIT TERM + +if [ "$#" -ge 1 ]; then + SQLFILE="$1" +else + SQLFILE="$HOME/.mozilla/firefox/default/cookies.sqlite" +fi + +if ! [ -r "$SQLFILE" ]; then + echo "Error. File $SQLFILE is not readable." >&2 + exit 1 +fi + +# We have to copy cookies.sqlite, because FireFox has a lock on it +TMPFILE=$(mktemp /tmp/cookies.sqlite.XXXXXXXXXX) +cat "$SQLFILE" >>"$TMPFILE" + +# This is the format of the sqlite database: +# CREATE TABLE moz_cookies (id INTEGER PRIMARY KEY, name TEXT, value TEXT, host TEXT, path TEXT,expiry INTEGER, lastAccessed INTEGER, isSecure INTEGER, isHttpOnly INTEGER); + +echo "# Netscape HTTP Cookie File" +sqlite3 -separator $'\t' "$TMPFILE" < ") diff --git a/modules/home.legacy/conf/firefox/scripts/update_extensions.sh b/modules/home.legacy/conf/firefox/scripts/update_extensions.sh new file mode 100755 index 00000000..86bd843c --- /dev/null +++ b/modules/home.legacy/conf/firefox/scripts/update_extensions.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +tmp=$(mktemp) +cat <"$tmp" + darkreader:navbar + keepassxc-browser:navbar + vhack-libredirect:navbar + torproject-snowflake:navbar + tridactyl-vim:menupanel + ublock-origin:menupanel +EOF + +# The bin is provided in the devshell; +# The cat execution should be unquoted; +# shellcheck disable=SC2046 +generate_extensions $(cat "$tmp") >"$(dirname "$0")"/../config/extensions/extensions.json + +rm "$tmp" diff --git a/modules/home.legacy/conf/gammastep/default.nix b/modules/home.legacy/conf/gammastep/default.nix new file mode 100644 index 00000000..1ae0550b --- /dev/null +++ b/modules/home.legacy/conf/gammastep/default.nix @@ -0,0 +1,29 @@ +{ + lib, + nixosConfig, + ... +}: let + temp = + if nixosConfig.soispha.laptop.enable + then 3000 + else 1300; +in { + services.gammastep = { + enable = true; + settings = { + general = { + temp-day = lib.mkForce temp; + temp-night = lib.mkForce temp; + gamma = "0.8:0.8:0.8"; + fade = 0; + adjustment-method = "wayland"; + location-provider = "manual"; + }; + + manual = { + lat = 48.1; + lon = 11.6; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/git/aliases.nix b/modules/home.legacy/conf/git/aliases.nix new file mode 100644 index 00000000..15bf613d --- /dev/null +++ b/modules/home.legacy/conf/git/aliases.nix @@ -0,0 +1,82 @@ +{ + lib, + config, +}: { + cmr = "commit --file .git/COMMIT_EDITMSG --edit --verbose"; + + st = "status"; + sts = "status --short --branch"; + + ds = "diff --staged"; + di = "diff"; + rs = "restore --staged"; + + ## Logging: + ls = "log --max-count=10 --color --format=format:'%C(bold red)%h%C(reset) %C(dim bold blue)%s%C(reset) %C(dim white)[%aN] %C(bold red)<%G?>%C(reset)%C(auto)%d%C(reset)'"; + + # https://stackoverflow.com/a/61487052 + lg = "lg1"; + lg1 = "lg1-specific --all"; + lg2 = "lg2-specific --all"; + lg3 = "lg3-specific --all"; + + lg1-specific = "log --graph --abbrev-commit --decorate \ + --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold cyan) [%G?]%C(reset)%C(auto)%d%C(reset)'"; + + lg2-specific = "log --graph --abbrev-commit --decorate \ + --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'"; + + lg3-specific = "log --graph --abbrev-commit --decorate \ + --format=format:'%C(bold blue)%h%C(reset)\ + - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)\ + %C(bold cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)\ + %C(bold red)(signature: %G? by %GS, trust: %GT)%C(reset)%n\ + '' %C(white)%s%C(reset)%n''\ + %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)\ + %C(bold white)- trailers: %(trailers) %C(reset)'"; + + # hard reset with commit before (use reflog to recover) + # git wipe [] + wipe = lib.strings.concatStringsSep " " [ + "!git" + "add" + "--all" + "&&" + "git" + "commit" + "--quiet" + "--message='WIPE-SAVEPOINT'" + "--no-gpg-sign" + "&&" + "git reset \${1:-HEAD~} --hard" + "&&" + "git clean -fd" + ]; + + branches = lib.strings.concatStringsSep " " [ + "!git" + "for-each-ref" + "--sort=-committerdate" + "--color=always" + "--format='${ + lib.strings.concatStringsSep "|" [ + "%(color:blue)%(authordate:relative)" + "%(color:red)%(authorname)" + "%(color:green)%(color:bold)%(refname:short)" + ] + }'" + "refs/remotes" + "|" + "column -ts'|' -o ' '" + ]; + + tags = "tag --list"; + + remotes = "remote --verbose"; + + day = "!git log --stat --since '1 day ago' --author $(git config user.email)"; + + unpush = "push --force-with-lease origin HEAD~1:${config.programs.git.extraConfig.init.defaultBranch}"; + + wip = "!git add . && git commit --amend && git push --force-with-lease"; +} diff --git a/modules/home.legacy/conf/git/default.nix b/modules/home.legacy/conf/git/default.nix new file mode 100644 index 00000000..6680c598 --- /dev/null +++ b/modules/home.legacy/conf/git/default.nix @@ -0,0 +1,96 @@ +{ + lib, + config, + ... +}: let + gitIgnoreFile = ./git_ignore.git; + gitTemplateFile = ./git_template.git; +in { + programs.git = { + enable = true; + #package = pkgs.gitAndTools.gitFull; # TODO: for git send-email support + aliases = import ./aliases.nix {inherit lib config;}; + extraConfig = { + core = { + excludesFile = "${gitIgnoreFile}"; + }; + rebase = { + autoStash = true; + autoSquash = true; + }; + init = { + defaultBranch = "prime"; + }; + user = { + name = "Benedikt Peetz"; + email = "benedikt.peetz@b-peetz.de"; + # signingKey = "[is down below]"; + }; + help = { + autocorrect = 5; + }; + push = { + gpgSign = "if-asked"; + }; + commit = { + template = "${gitTemplateFile}"; + }; + diff = { + colorMoved = "default"; + # Usually leads to better results + algorithm = "patience"; + bin = { + textconv = "hexdump -v -C"; + }; + }; + # Makes it a bit more readable + blame = { + coloring = "repeatedLines"; + markIgnoredLines = true; + markUnblamables = true; + }; + merge = { + conflictstyle = "zdiff3"; + }; + url = { + "git@codeberg.org:" = { + insteadOf = "@cb:"; + }; + "https://codeberg.org/" = { + insteadOf = "cb://"; + }; + + "git@github.com:" = { + insteadOf = "@gh:"; + }; + "https://github.com/" = { + insteadOf = "gh://"; + }; + + "git@gitlab.com:" = { + insteadOf = "@gl:"; + }; + "https://gitlab.com/" = { + insteadOf = "gl://"; + }; + }; + }; + delta = { + enable = true; + options = { + decorations = { + commit-decoration-style = "bold yellow box ul"; + file-decoration-style = "none"; + file-style = "bold yellow ul"; + }; + keep-plus-minus-markers = true; + features = "decorations"; + whitespace-error-style = "22 reverse"; + }; + }; + signing = { + key = "8321ED3A8DB999A51F3BF80FF2682914EA42DE26"; + signByDefault = true; + }; + }; +} diff --git a/modules/home.legacy/conf/git/git_ignore.git b/modules/home.legacy/conf/git/git_ignore.git new file mode 100644 index 00000000..8f29815e --- /dev/null +++ b/modules/home.legacy/conf/git/git_ignore.git @@ -0,0 +1,4 @@ +# default nvim Session file name +Session.vim + +# vim: ft=gitignore diff --git a/modules/home.legacy/conf/git/git_template.git b/modules/home.legacy/conf/git/git_template.git new file mode 100644 index 00000000..6af39119 --- /dev/null +++ b/modules/home.legacy/conf/git/git_template.git @@ -0,0 +1,66 @@ + +# Title: Summary, imperative, start upper case, don't end with a period +# If applied, this commit will + +# Body: Explain *what* and *why* (not *how*). + + +# BREAKING CHANGE: +# Fixes: # +# Refs: # +# Co-authored-by: + + + +# Convention Commits (https://www.conventionalcommits.org/en/v1.0.0/ or https://github.com/angular/angular/blob/85b4941be137a2fcdc664dc870e408dd72ad7de7/CONTRIBUTING.md#commit): +# feat: [Features] -> MINOR version bump +# A new feature +# +# fix: [Bug Fixes] -> PATCH version bump +# A bug fix +# +# append '!' after the type/scope: [Breaking Change] -> MAJOR version bump +# A breaking API change +# +# docs: [Documentation] +# Documentation only changes +# +# style: [Styles] +# Changes that do not affect the meaning of the code +# (white-space, formatting, missing semi-colons, etc) +# +# refactor: [Code Refactoring] +# A code change that neither fixes a bug nor adds a feature +# +# perf: [Performance Improvements] -> PATCH version bump +# A code change that improves performance +# +# test: [Tests] +# Adding missing tests or correcting existing tests +# +# build: [Builds] -> PATCH version bump +# Changes that affect the build system or external dependencies +# (example scopes: gulp, broccoli, npm) +# +# ci: [Continuous Integrations] +# Changes to our CI configuration files and scripts +# (example scopes: Travis, Circle, BrowserStack, SauceLabs) +# +# chore: [Chores] +# Other changes that don't modify src or test files +# +# reverts: [Reverts] +# Reverts a previous commit + +# How to Write a Git Commit Message: +# [https://chris.beams.io/posts/git-commit/] -> https://cbea.ms/git-commit/ +# +# 1. Separate subject from body with a blank line +# 2. Limit the subject line to 50 characters +# 3. Capitalize the subject line +# 4. Do not end the subject line with a period +# 5. Use the imperative mood in the subject line +# 6. Wrap the body at 72 characters +# 7. Use the body to explain *what* and *why* vs. *how* +# +# vim: ft=gitcommit diff --git a/modules/home.legacy/conf/gpg/default.nix b/modules/home.legacy/conf/gpg/default.nix new file mode 100644 index 00000000..1acdf628 --- /dev/null +++ b/modules/home.legacy/conf/gpg/default.nix @@ -0,0 +1,67 @@ +{ + config, + pkgs, + lib, + ... +}: { + programs.gpg = { + enable = true; + homedir = "${config.xdg.dataHome}/gnupg"; + mutableKeys = true; + mutableTrust = true; + + settings = { + default-key = "Benedikt Peetz "; + # TODO: add more + }; + + publicKeys = [ + { + source = ./keys/key_1.asc; + trust = "ultimate"; + } + { + source = ./keys/key_2.asc; + trust = "full"; + } + ]; + }; + services = { + gpg-agent = { + enable = true; + enableZshIntegration = true; + enableScDaemon = true; # smartcards and such things + + # Cache the key passwords + defaultCacheTtl = 60 * 50; + defaultCacheTtlSsh = 60 * 50; + maxCacheTtl = 60 * 50; + maxCacheTtlSsh = 60 * 50; + + pinentryPackage = pkgs.pinentry-curses; + # pinentryPackage = pkgs.pinentry-tty; + + enableSshSupport = true; + sshKeys = let + removeSpace = str: builtins.replaceStrings [" "] [""] str; + in [ + (removeSpace "8321 ED3A 8DB9 99A5 1F3B F80F F268 2914 EA42 DE26") + ]; + }; + }; + + programs.zsh.initExtraFirst = lib.mkBefore '' + export GPG_TTY=$(tty) + + # Magic copied from the gpg-agent manual + unset SSH_AGENT_PID + if [ "''${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then + export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" + fi + + + # Ensure that get gpg agent is started (necessary because ssh does not start it + # automatically and has it's tty updated) + gpg-connect-agent /bye + ''; +} diff --git a/modules/home.legacy/conf/gpg/keys/key_1.asc b/modules/home.legacy/conf/gpg/keys/key_1.asc new file mode 100644 index 00000000..795f82af --- /dev/null +++ b/modules/home.legacy/conf/gpg/keys/key_1.asc @@ -0,0 +1,26 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: 8321 ED3A 8DB9 99A5 1F3B F80F F268 2914 EA42 DE26 +Comment: Benedikt Peetz + +mDMEZkCPnhYJKwYBBAHaRw8BAQdAA2ve8cO5iCx0Ehd8+9zhXrzzAlpo7DI5ltNM +vLQIHVK0KkJlbmVkaWt0IFBlZXR6IDxiZW5lZGlrdC5wZWV0ekBiLXBlZXR6LmRl +PoiZBBMWCgBBFiEEgyHtOo25maUfO/gP8mgpFOpC3iYFAmZAj54CGwEFCRLMAwAF +CwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQ8mgpFOpC3iYTYwD/UGnlFls7 +ynY52EAiea6Fa+ktXZQKnVjKYO4AYmUdIRMA/iY+fnhm7OgB1SSv0ssjqpeIFSwu +qTL4lz735Pn+UNEKuDMEZkCP8xYJKwYBBAHaRw8BAQdAk5J9kVCFByKW5Wk8Oobn +Ydy/sh+05irq/xjQjtDQG8eI9QQYFgoAJhYhBIMh7TqNuZmlHzv4D/JoKRTqQt4m +BQJmQI/zAhsCBQkDwmcAAIEJEPJoKRTqQt4mdiAEGRYKAB0WIQTeYpC3k+aybU6a +T722E5vLB86UbQUCZkCP8wAKCRC2E5vLB86UbaN2AQCbINgO9vljxk4T/s4N1+t4 +Zp5skgghUn4vTQXGIs2NugD9HwhSazuUHo3gJFyhAowPCtKlCbdOEmrs4qQFHU9h +0gPKdgEAtxZorpsQtrQjTHaOH0Ee5Hx+i10iP3npybzieFzvhQcA/R8L0jr8SJ6F +HP6sEpAAdQ2qp9dqB71KISBtN1JbEagNuDMEZkCQPhYJKwYBBAHaRw8BAQdAwThl +Vr4ihl/pPdTTwkb3eLpAgAnhqabuaQHM7XglKTOIfgQYFgoAJhYhBIMh7TqNuZml +Hzv4D/JoKRTqQt4mBQJmQJA+AhsgBQkDwmcAAAoJEPJoKRTqQt4mO88A/2gXjwaq +A9KN37jKb05zpsvTjOR5J9UOLsWUfye5zl6FAQCArUmXDApaOmB6FRUZqb93xiXQ +6m5T5OoMcpURC6IyBrg4BGZAkGoSCisGAQQBl1UBBQEBB0BIk7HOtw7Z+BV1Oyst +bl3PPAVuMtMJUD1CeYOMzA+1PwMBCAeIfgQYFgoAJhYhBIMh7TqNuZmlHzv4D/Jo +KRTqQt4mBQJmQJBqAhsMBQkDwmcAAAoJEPJoKRTqQt4mg+kBAMTgMMLo/IzGPVhX +8gSTGpM3fDQchgFfOMyjIDfWN0zDAQDiY6RCXavD7uVfg/949r9TQHo0Vvem63GH +9Y7Vp2vzCA== +=IM58 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/modules/home.legacy/conf/gpg/keys/key_2.asc b/modules/home.legacy/conf/gpg/keys/key_2.asc new file mode 100644 index 00000000..47188da7 --- /dev/null +++ b/modules/home.legacy/conf/gpg/keys/key_2.asc @@ -0,0 +1,794 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: 2FEA 7BDB 9171 70A7 B8E7 2001 DF18 78E6 D9C3 B27F +Comment: Silas +Comment: Silas +Comment: Silas +Comment: Silas + +mQGNBGEeXg8BDADF5M9eh/otTBDnbLqy8kxEHhlLRsv4wF0qCW8fGWlclAFpz5A9 +9t0Klt0AkB2EK/2EKWmm7J2DD9lq7nlvJurWXZWmcDzRWV6VWO4KftvKnasBR7kQ +3T09ga/jVgLmjGU8qKW2175MLuj+hRNwlc8TiTHrl9b+1hC5dvV6HwIJtvVbpBzj +ZmFGKBCPdA/8j/keq9kBJTJjb6YED+jAJJAHeZ7XyDeCi46MwTR09wLXIrlZenGO +wljtu+Ar+SN5droeeMN1edw9y2YnRg4zQ0lOtC7ylbV6a205B2QxSanMpaEZPX0C +Y48KZqto1Xs1skHrf3PHmRkGDbMil8yhsBlVDZOmKiMjTTEJs4nsM9llJvz0kaiw +Gu1HgMfuKxgwXZ+7qonQ9Td4Mg20hyfaHC8djwP8IEym5NOfLbkifeUL7owe+5fc +HCd3I6bnvHAtfQN2YV/VZN1rSXykrd6YjnqDYhxxlhHnObFnFYJD1M2KIBUwlLSG +BK25hH/eAvBcYq0AEQEAAbQUU2lsYXMgPHNpbHNAc2lscy5saT6JAxgEEwEIAYIC +GwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4ACGQEWIQQv6nvbkXFw +p7jnIAHfGHjm2cOyfwUCZEFu1T4UgAAAAAAQACVwcm9vZkBhcmlhZG5lLmlkaHR0 +cHM6Ly9jb2RlYmVyZy5vcmcvc2lscy9naXRlYV9wcm9vZpkUgAAAAAAQAIBwcm9v +ZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6c2lscy5saT9vcmcua2V5b3hpZGUu +cj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9 +JGRqVWtvd3Y3bDR5RmNYTGF1eWlCWXNocENodU1rRDgtbUctN1lfVl9TN0EvFIAA +AAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQ0FIAA +AAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNs +aQAKCRDfGHjm2cOyf7ixDAC42r59qDyhO7aN0I775O6DZk2KO9YFNhZ/4wmFoPUV +eE15OwgrghX5rQWwt2xbQoC5vt1DOKsfRqdybdRo6PI8urm20/QTxmC+0yNE7yfZ +iEHHgTbdns4DtGpA8nRAdGSKEAGYd8HVMy6ANucVS4aNH04L+294/LSpG2GhMAHK +drsKWZfy51eyaFeVlZ4+Iskl/KD/vkyOeStzmtzKxlyIC66At9bIaqCGmC7u4ClJ +oFaOuXUXvvDvski7Nk//eQnlMP/kUfbR02tws7QcZ+DE8PU82maCBfXn1EWgpnMN +uZ3/91iTiJC70kmer8a/yqe5EFUQuvZrPB49Y0bAvyh7jJpxlMK1Fsq1cI5pa3Al +RFDDS3VpTP4kt80UbssQK5YKc1WvwTJGp+X/7zUwNbfPr/iA24Lj8KcykKywFmTu ++ucC1eETPphckL8Rbd5wYUAE4+JLID4pUDE/pfTggS1hA9G/IgKBNMdDB/MyJuOP +J18VXSZk9yBiWEaHruqBu56JAxIEEwEIAXwCGwMFCQlmAYAFCwkIBwICIgIGFQoJ +CAsCBBYCAwECHgcCF4ACGQEWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCZEFtVjgU +gAAAAAAQAB9wcm9vZkBhcmlhZG5lLmlkaHR0cHM6Ly9jb2RlYmVyZy5vcmcvc2ls +cy9wcm9vZpkUgAAAAAAQAIBwcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6 +c2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJp +eC5vcmcmb3JnLmtleW94aWRlLmU9JGRqVWtvd3Y3bDR5RmNYTGF1eWlCWXNocENo +dU1rRDgtbUctN1lfVl9TN0EvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5z +OnNpbHMubGk/dHlwZT1UWFQ0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0 +cHM6Ly90cm9ldC5jYWZlL0BkYXNsaQAKCRDfGHjm2cOyf1tOC/wIxixV1NRNoYF3 +WMRAF5sloJYD8cM5TeNlkenqkWoGEze+WcswzY1ALfT0GMQpDuWQMI6yYzru8MDn +1ERMHbqgYhAVSPhQXaMJ8jiJVMq04Yjb2uys7c98vsXjoGy9zv9QaYtIFdocrUJV +dL5t+j2wQYK74uXnO+/EARLwJoIeQpq8AwwocxCJ/0nu5VllgOIyut92UHpmNBEl +qestgU/TRAjeT2m/ezyLI3U2Idy+rzP31A0U0RXOZ3cNUDrDYeeQQ0SrWhf9/4ym +wUczJyQLc5cMHSjZ4K7ib8u+1g/B6pLdiLtKHrxqFduPK8cnSAcKF5UP9CE6E7ab +5oNMmSqMDl4ZAmxn28jcvyGEei4oPDTZeYMZdxoOrIaoYw0G2BOq1pqms2nJlSVk +T1aiBW9g6u5b2kbuP9k5YAkB2XLAGWBuz7OXH0ZBmQ4vJaJRD+s3do5USnyVhJGP +CccaTVs2p12ljwawmKtJzmCcHq8RbV0CW2uBxNShbWchNnZrcbyJAtkEEwEIAUMC +GwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4ACGQEWIQQv6nvbkXFw +p7jnIAHfGHjm2cOyfwUCYs8QWDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpo +dHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpLxSAAAAAABIAFHByb29mQG1ldGFjb2Rl +LmJpemRuczpzaWxzLmxpP3R5cGU9VFhUmRSAAAAAABAAgHByb29mQGFyaWFkbmUu +aWRtYXRyaXg6dS9Ac2lsczpzaWxzLmxpP29yZy5rZXlveGlkZS5yPSFkQmZRWnhD +b0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kZGpVa293djds +NHlGY1hMYXV5aUJZc2hwQ2h1TWtEOC1tRy03WV9WX1M3QQAKCRDfGHjm2cOyfzkw +DACj77EpB21XUgzceBilA62zIKXNZMhr1aefibe84aZQh8h8ABREtSQSIHAwBXxO +qlG30bt2fFO0oB8UEIrHG+ahlNfHxbHJZT7xlkuWHRXfV9yHC5vuOUbWLIxJWJzV +xVN7s4VCBYyrfCcLnNbaRv3BiLE7as7ayC8rLcPSr8QicasAEXSr4k4nEH5BkIUX +KtvpW1BW0vEUIshFc2QRYS9gaC9KioojLvmM+IFtHdJ9TQMds6n2zSKG5tR1/fB/ +SZ82g3imLt9bAEG2K70w572CgY1P/2ClB/hkR2rO/OazAyIdKmzuL0ZJTdgKoFbB +A5d7RFCOi8YQhv+26CchNhNhJKcQMhc0ctHrdLEL8x2+dJX8KA1CXQZV6OrVEL2R +96ETrOpJsToseaRvQoanAOXbx/zoATzhBaRIeotXacOytXXEmOwp9wSKIlrNYkDT +rboPyelwgSQiLvlLUnqTNnq1YbUtkPT1Ka5NsmjUwvsTRQzfcnR1fTWWEqPWN1iA +ebqJA3IEEwEIAdwCGwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AC +GQEWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYs8F+ZkUgAAAAAAQAIBwcm9vZkBh +cmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6c2lscy5saT9vcmcua2V5b3hpZGUucj0h +ZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGRq +VWtvd3Y3bDR5RmNYTGF1eWlCWXNocENodU1rRDgtbUctN1lfVl9TN0GYFIAAAAAA +EAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9vcmcua2V5 +b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94 +aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQxd3hFMmpN +VDgvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1U +WFQ0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZl +L0BkYXNsaQAKCRDfGHjm2cOyfwt2C/wMjQNxEE+M03T4SkI2vRlmTmWWcOZiJHsm +SkmAgvo05wMc9LUnTEfWdOpsqTfI1Ud972kuL7g9bqWQnMPq3FGYZHpHRP2rsCw5 +yPwTgjENh50sH6w1yclfvardtca7VrkTHiWqmmEzBrjEeMQMkQRLCCmvWB3d1+60 +qdKL+/ucAdLnNeyMpNWqAuZ4f5XIwHutKqQJWJlQ9NZN03OcaS/oaHHn95xXzXba +rCa7hdwRrAEYpMbYjjjfHhbQLauEhIV5JuatDD6w+vv8NUHBIJ5sXvIak6EHeWEe +UDBsu+LgRiBXJA9orE4oExdIF5LpJvGjZqEh80HFUd+3sBb/9HzaLLFrr2zSYwWJ +WGcb+Ho/ZYl4VC9rXpJfz5kyLzWVGqyDcHLIid7G0rDicBErFG2o8ppxXm8+ekRp +yodwaqHbUp62mhnSoObYJKpVJZoqwQZTVIeGnwAYpcE94e8TjK54DziyZ5ZZ9q2n +4tf/ZPu3Dt+L+tvPlF1VRMLjCCp2e7KJAtgEEwEIAUICGwMFCQlmAYAFCwkIBwIC +IgIGFQoJCAsCBBYCAwECHgcCF4ACGQEWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUC +Ys8EiDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNh +ZmUvQGRhc2xpLxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxp +P3R5cGU9VFhUmBSAAAAAABAAf3Byb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6 +ZmZmLmNoYXQ/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRy +aXgub3JnJm9yZy5rZXlveGlkZS5lPSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdY +Nm5pLV9JOWs0MXd4RTJqTVQ4AAoJEN8YeObZw7J/vAwL/2WvNAlqoRAr6vT/t+gm +O3AoiUzEBZXLgq5aibdbpZENjPiSfZZWzfkIpOeGQSCoDluHLnVrlcQegCAvUiBS +qbwN32X77yOggG29hAGZBxBXvJ/rj63m0B0v60Cfcgetlf6cEO6PPdsZD6VaY/cL +pO6dVHRhD4r53in7XhyzhMhW6PljY2FTFZ2rdZEliQZAD90M2hn+LCXx8rsh3SqZ +RKT88jhfcBXA20vHgagzzdXyaeo4wbWplroz+3nLz3oQDfLLWnihAhAbIHg9AE/4 +dXFljjCF45SjU+8gHpHkHfwWtwLYucOZ5mr4RUVy8hiPyz/1fLxNKkDOvg42tDAB +dIwt7CpFxHfn63GjsRRmNyZoIQhoDKX0BCuHF+Qsr5jIHd1o1o9HpjHicdZV+uV6 +RQedsgbfCHJPZKdXSyxI/SF9jDlXCvG2aTzTXk2vQ7PCZKsFjVFJA7U87zmr0ZsJ +i5axNn+v8JA2hT1xxd0wkVWwg4f3kR4cr6AhK3EFVNTtTIkB2gQTAQgARAIbAwUJ +CWYBgAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgBYhBC/qe9uRcXCnuOcgAd8Y +eObZw7J/BQJizwJUAhkBAAoJEN8YeObZw7J/o7sL/1iaIT4y0FypOhzzUqJzOBP2 +kabeq4iOS99w2wHEiM6xzXoGuRy+lEXZMb94VVUNhJDayTf11OZgAyAJdt9OAyBK +UsFf1AbVJw0YY+384bjbId/oTqngqKIkBH9bpDIfSX5riXqD5SmhwRuuRPHuO+ZT +aM3tdDnSjW4brEub3aHsHPNbBM39u0Q9JGPpd4GhXnmK1iYCQU5ZRErgpxqPtAOX +h9/eIIa5Tv+KbPzwBJ3od27dbuo/Y3OwxfwSuSKieK+xvDHyxzD429tEh+uMP4W/ +2b4GbksC0Z6nNM7FBa2Vq/vKOa6yTGE7bgkudr3tWa5N+x/towX6crgB+5DAByBR +on967FLER6i4Ok9V1hBnvrjXGLgJeNkoxMxiK3UH0ijY9laHO9fd8v4RoHubHxjV +YXJNUm6EUvRPXskpNw5X24dQ3muuLpOVX657Z609ar6jEQgXjeuyqUL4TwXorDZs +4HU1Mj42iFUD9HdIcMqW+/zpKGxEJWFjlg2z1/uX9Ih1BBAWCgAdFiEElgb8dJ/O +FjYHI9StpelAEMOmQq0FAmTEI7oACgkQpelAEMOmQq2x6AD/WrvWuFlewmBNqoLa +AMQb3Hk3Ls3GZdYkpNhuTqSZbs0BAOPNAm00QHD1QQeOsZkuExxgPoMDtdW27qD5 +vfVP7xQCtBNTaWxhcyA8bGlAZW52cy5uZXQ+iQMVBBMBCAF/AhsDBQkJZgGABQsJ +CAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8F +AmRBbtU+FIAAAAAAEAAlcHJvb2ZAYXJpYWRuZS5pZGh0dHBzOi8vY29kZWJlcmcu +b3JnL3NpbHMvZ2l0ZWFfcHJvb2aZFIAAAAAAEACAcHJvb2ZAYXJpYWRuZS5pZG1h +dHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1Zt +U1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2N2w0eUZj +WExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdBNBSAAAAAABIAGXByb29mQG1l +dGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkvFIAAAAAAEgAUcHJv +b2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQACgkQ3xh45tnDsn9K +9AwAlqvwQNhFakWY7i5XmrdzcBj5nHKoxYkCpVEwwEVy/B7LV6h+ZoXadtQzqn3l +BdoSchkIYcZT4xDV/b00bCD9APpu6+Eom3CcBlcxIthoEe6ZKXEImounCS69wkVA +8ItZlSlhyxTRSQzgmAI5qApw/Kh+AmpsEK8W2kY2tpV7fR/cXZ5/pNoU907T0U5f +bpnEgdZFeNUw+RayCELUZnZ1wgl33yADV9WV+nn4N/t1/xEfAFsv5GuNoCrc/BAu +jyaoVS8ULkmioYyUmFHDAwn/SXAIMOL5LNc/4xMt1CkYkRXiEQW+l2UWrGF5hhIY +R6ofOeUgxiw+iDM2vA0G65+OUCTRpkrHFl5d777LFiHEWKKlBKM0of1Cr+roXrPi +uYwDjuC4WYEtcvKG1bimI6MRwoUmjW8yg8E40jidZYOuOVi8HVteg+HeCRW7qmwX +VR1QI+Fp2eRj0DSeh+wwtaFxMHcTRe10UFkJ244HOihydEqFUfPOvwTzuXtZjO5Z +CHQPiQMPBBMBCAF5AhsDBQkJZgGABQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheA +FiEEL+p725FxcKe45yAB3xh45tnDsn8FAmRBbVY4FIAAAAAAEAAfcHJvb2ZAYXJp +YWRuZS5pZGh0dHBzOi8vY29kZWJlcmcub3JnL3NpbHMvcHJvb2aZFIAAAAAAEACA +cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94 +aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlk +ZS5lPSRkalVrb3d2N2w0eUZjWExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdB +NBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9A +ZGFzbGkvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlw +ZT1UWFQACgkQ3xh45tnDsn8fMgwAhHfRuMb9ayKGl0Kb6by648KHe6NOHKLTrLm8 +5w/cIBrW2s42rSZdybeVNA+AnrtBvRD/yQ7idji5FS0nYac4lbZ+oLNCUc9sSvZW +DgWsXaYs5ujpR1ftYd8A0AytsBvrGczPrclMV5HjuE11kilYXMwNqiOX0hXZ3ewx +O6d3KAYLIgajVH7SOgnexYs5Up7QO6osrFqRwokCd/Yx2usEap7jDajjeXQTNdwX +e5RvKmYND3jYv0hood7IvSWeJHhZ5DIRQ9FpOt6PxiBzrEx8YRF1KbtniMTwf8fB +Dl6eAo89I3WjT8CwQryeQ+9a+15WPQyLddEci1Vj7Etbmk6NfMmaUnm+OOOyeDz1 +0JYxPt4H32GYg/gGDZ7FxKG3gXHeCO2VptiS/VxCw4+EkVt0EYqWk51JGBNkOOL/ +8SMRFNNOah6xKR7hdPLmS69MqNvJGR/R0uJd3B4cF0ynLYFZRTJ2WH6nox0oXihB +TsZxnPulkr20RdS2yXRfhfiouE2XiQLWBBMBCAFAAhsDBQkJZgGABQsJCAcCAiIC +BhUKCQgLAgQWAgMBAh4HAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLPEFwv +FIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQ0 +FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0Bk +YXNsaZkUgAAAAAAQAIBwcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6c2ls +cy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5v +cmcmb3JnLmtleW94aWRlLmU9JGRqVWtvd3Y3bDR5RmNYTGF1eWlCWXNocENodU1r +RDgtbUctN1lfVl9TN0EACgkQ3xh45tnDsn/wMgwAjNJsV6KyVmL5GtytbvmEPHDH +s4Z8yS0BZF7wJr2u9QGQxjO/pthpGCnb2PNKUfLcXxXTUO9EZD8x9jV+WqaV8gL8 +h1zW0fWWpWL6hxwloAenmJCwydjjbWnpf5I8IUkJoliarNvy3f2dYwurus/G8Y1P +YoMHxQBGLojM2XRj97DxuVgTTpbCkTeNyot8PX9BMGcBAdzccExW6NZ07kpgILfx +hlVUNr/R/kRijf+kxG1WclKtKmzti9xjB8/00NgKUNnIyl9DC6vkZBsudIOCsopa +cu1c4bpVLtL0HhZfXfAaiHV/GmGpa9Sdv3PlP3N0UGPMNMNAET+6TUMzPYeXT9tC +0ppHKbIOqOx4qeHQMmXGv5YRTt4+x/HQleVL7vDOOasJu+YcFYaxfX8LVjJstTKh +bxR1PDHA3Rhvt6zulgHh6OE0seNTuMXzvKwUG2SBbRrmJtzQ7k+C4bKPolidPGfY +Jd5v/gzlRky4Hyoiqlg3Mu1smZxYqdA8rw1+wjaXiQNvBBMBCAHZAhsDBQkJZgGA +BQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEEL+p725FxcKe45yAB3xh45tnD +sn8FAmLPBfmZFIAAAAAAEACAcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxz +OnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRy +aXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2N2w0eUZjWExhdXlpQllzaHBD +aHVNa0Q4LW1HLTdZX1ZfUzdBNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0 +dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGmYFIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5p +ZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29H +Vm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGhLOV90RzB1N2Fx +VXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQxd3hFMmpNVDgvFIAAAAAAEgAUcHJvb2ZA +bWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQACgkQ3xh45tnDsn9tmAv+ +N2M+eK83AcE4EYbQiAmDlP6PJAzRiryYErTRO64bhq06JXPz7QvIVbsML6kou2hg +j51E4721EKS2essVlRqYf/5d6IKBjakEbgk3ta8jkc+jSSP7ARAjCWU5Qzjttucq +6Fs+uaQ8Xwdb9SamL6MmR9TSifVPxFm8n14jj4JUuXlpZWj++TprgDzz9hbq5ijE +LKYOaenSK8/OR6fzXgAF4+3tRwZRiNzf3Ui+cUtF+gP2b9GH8R7L+7bkMJ2MYkT6 +i7LShScXOt5htTva3lZ1ekFCzNhPOd+ubvDRfnJ+Jqmk9KaK/unb7c9N5vr1Ures +QFPIk1pIMy3PayWHgzbYmKmjEDpGiBy3ShKVMu9Fwx6uPiD16eHvc8VisuWNlDlI +lRK23lZKVJ27RdfIh892b5Ywn07J8CC5XSNl7M3cCsnXR6P/8/es9eLAyjip7QIe +pHW608TIsKtiGBXTamt2lIcrFZ5wCs9HUfhuBopxU5OzxuI4Jq74oG611n63bo0u +iQLVBBMBCAE/AhsDBQkJZgGABQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEE +L+p725FxcKe45yAB3xh45tnDsn8FAmLPBBIvFIAAAAAAEgAUcHJvb2ZAbWV0YWNv +ZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSYFIAAAAAAEAB/cHJvb2ZAYXJpYWRu +ZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9vcmcua2V5b3hpZGUucj0hZEJmUVp4 +Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGhLOV90RzB1 +N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQxd3hFMmpNVDg0FIAAAAAAEgAZcHJv +b2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaQAKCRDfGHjm +2cOyf7KOC/9/5NPmpyBKBr0ZcHP42VIS/88luyWf9qHttfw8dhhKuHIbqff3HwPo +BMmpWp6WOLtamoAAAUVkrzs2UtFGBs0W8iECOax8Qr5IU3qKSj9IFK5umt2NkTMP +6IFZ4UDWqZWZaH+2cWRdS/SgUJh3zxGIWJYkp2oV4yQQqKm/ZBRFC+ek2sI1bpoL +qf1xesOtBsorKFPKaJEG+0uEsogxczukpTq474bocRhFWNhQ7skNKVLcwo3uxmot +rxXPxj69RbIxhSPsQGYeq3+k/rEkptxng145iY11zalvizXzODVbjvjXWaewq+RT +n401oW3TchjTq8j+2e+ZcWyQAuFW6HrfpSMdUPDx30LXPhUcN6ba48KXdM5Lxovy +dGMixs94uPzYAQbGPK6LRRywXvMsEBtf+hihxzldDiuR8STTmtP+6YWsCiUOHu4C +QcLFXbH+5SBwUH0GRkqj9oZQr8rOsQjVfFnnyt/1v0qO39/46WOMeL265K/Ra6tQ +O36bn4SUD9OJA1wEEwEIAcYCGwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwEC +HgcCF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYs8CzTQUgAAAAAASABlwcm9v +ZkBtZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpmBSAAAAAABAA +f3Byb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6ZmZmLmNoYXQ/b3JnLmtleW94 +aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlk +ZS5lPSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdYNm5pLV9JOWs0MXd4RTJqTVQ4 +LxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhU +hhSAAAAAABAAbXByb29mQGFyaWFkbmUuaWR4bXBwOnMuc2lsYXNAZGlzcm9vdC5v +cmc/b21lbW8tc2lkLTQ1MjE0OTk1NT1lZDhlYzA1ZDNiMGZjOTc3YjY3MTIwZDVj +MTdlMmMyYjNmMDk4NmJlYzc4OGI3MGE4YjhkMzQ2Nzc4YjhkODMzAAoJEN8YeObZ +w7J/SD4L/iUm43LYEZVG6G0RzfZxpP2L2JwHZCuMQGO364lmV5or0ZtQQERimXF3 +e+xCgqvx3Yb4nL6W0tVi75DFLJOBSnOshFnKXms/ufY065en9hiMBS+BmK6PlrO8 +6iwiefFMvSAlkmDp8KVqhOAB5P/i27C3Vd5uhLqRM1EEoWbgCxlOpaOnwBwNq+V/ +kiSaZ5o2HrDDGh+9ecpkEouel1H1qp+EvEL5BgreSLFG5OWDY0SNA6A4l5adM0u9 +PC/15DdCDRmJWcRUcb1Kqa19tuZezb3oPrVHVI75LhzKlf3eklDpDfrF8kgJGhvs +hcaeFWifyFu73aloYivM3ZY8uMUz628MPBJ5n1ud1RkORYSbbfDsDqwekAWsBq7i +WS1oymWMo6F/95DKFeJCzv2GMpZfWBLFvFH8/c7v+7LgboiwoTenlnZdAYaQMFsi +mXfG4+M/iAI177aPPRuU+1Yc4XKG3UeIUVmZkw8oYzrfNaIGdGeMXiZ/O39Eoasx +/a0NIxTLBokDowQTAQgCDQIbAwUJCWYBgAULCQgHAgIiAgYVCgkICwIEFgIDAQIe +BwIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJidalDMRSAAAAAABAAGHByb29m +QGFyaWFkbmUuaWR4bXBwOnMuc2lsYXNAZGlzcm9vdC5vcmebFIAAAAAAEACCcHJv +b2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOmMuc2lscy5saT9vcmcua2V5b3hp +ZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRl +LmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5b2QzWnk0bzMtREFjNk5melREU0Ev +FIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSY +FIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9v +cmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3Jn +LmtleW94aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQx +d3hFMmpNVDg0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9l +dC5jYWZlL0BkYXNsaQAKCRDfGHjm2cOyf1ZtC/9QQRWfVfBJwVV96P/bxqkQTlNU +HZNzAJ3NLmY9VmwQ65Y6g6feVMPle+f6QGR1qg/7BfWre6ZgaIcp9wfQKwV8D2a/ +9EzdwLbE+XAy5NTdIaXriqUdE4A2Wj1ga3HqnO11JYOAcZS2I71ieQkYgiQnp1RK +JZYXuJHXoi//fd6ZbrZxyM9lneKovac1qqb8nFM85E27H4kJ5k7kC9jdDzqeRliH +Dbz7rubFWYsUrEER7uM8+V/fs+GNWsg/5YoEHIrrtmBjq1LCpu++r/Jtlp3/ik+d +uRC/Z5Z2nypkrtq91p1gMBUkDqu5cTPywIZV5YNO4jaN+AdEJk1pB4plTJNa70vW +9mSEHPgomcwjXRrO7jsJAaei1bkKgSY9fC6glvAmlNt4lzlKiOBzPmyxoq6GFv1J +TGnd8kpkBEi+Xcenu1DmUCHcrq/2sFj9UtnonG71+Euhqmdqbx7jSSuilDyaULSC +KZFixzL/s+YO0P8O4XbiOTNzdq9bCJwNDxvt8TmJA/gEEwEIAmICGwMFCQlmAYAF +CwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOy +fwUCYnWhUYYUgAAAAAAQAG1wcm9vZkBhcmlhZG5lLmlkeG1wcDpzLnNpbGFzQGRp +c3Jvb3Qub3JnP29tZW1vLXNpZC00NTIxNDk5NTU9ZWQ4ZWMwNWQzYjBmYzk3N2I2 +NzEyMGQ1YzE3ZTJjMmIzZjA5ODZiZWM3ODhiNzBhOGI4ZDM0Njc3OGI4ZDgzM5sU +gAAAAAAQAIJwcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6Yy5zaWxzLmxp +P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZv +cmcua2V5b3hpZGUuZT0kMUxSOE9PNDBiTDY0MDdpZmYwMEo4ZzlvZDNaeTRvMy1E +QWM2TmZ6VERTQS8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6c2lscy5s +aT90eXBlPVRYVJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQGxp +OmZmZi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0 +cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFVd2ZIdndzS3dlQ1hX +WDZuaS1fSTlrNDF3eEUyak1UODQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpo +dHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpAAoJEN8YeObZw7J/1wML/AlJqYj6jMvV +VWF0YYLcL2zzogi7bvpIjKDOPYIKSMI1mKGYvz9M7CagsY/B/7FYX5ZaAwHV65xM +j9bm7IUwtB7krxUs1MGRnN/lyAMdphyuC6k1RptMmYoAEQwLizg8rbiq0fq97o/P +UVTWKpVzYart6g3Bfbm+Bya93IW2Wmx6hsKWxKT3Kvcrxb0Kj41aHtrbXe9N028P +6/ujKzRpq+CaNvIAcArVwMRqIFYLKYMH0aQPjVqhRIW6b3hcZmza+ZmAc5bPcUSH +zemvnPLKjlQVb0xiozG8EYTLU0z16NX1jwQao7HZyvTZSMj5ExDbqEPYH08apHEz +JjiyoFHsCvWIWpt2kvE4TG9xdGhgTf6PnEF6RCVsMDK8aQSqDQImDG1XHZImrHDY +4Dr6Adgk5PRkU8fEQLpJZBTWaH8HGtM+7F+nIFf2M9p28PZGSkIvKJaLDrT+eGoC +4WA9IByrzvukOEr2dUM0EIuiTeArBDN7AZXkeC4+SAWpxfpNhJxyRYkDcQQTAQgB +2wIbAwUJCWYBgAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgBYhBC/qe9uRcXCn +uOcgAd8YeObZw7J/BQJidX+UNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0 +dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGmYFIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5p +ZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29H +Vm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGhLOV90RzB1N2Fx +VXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQxd3hFMmpNVDgvFIAAAAAAEgAUcHJvb2ZA +bWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSbFIAAAAAAEACCcHJvb2ZA +YXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOmMuc2lscy5saT9vcmcua2V5b3hpZGUu +cj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9 +JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5b2QzWnk0bzMtREFjNk5melREU0EACgkQ +3xh45tnDsn880AwAmlIzYs0RqDgofVK2qomwiufi/ClVpI/QTIfrUf3L+XznXeC5 +Pj4882XPLd+023pafdf+ih9Q7TIwyBdxuQVZniZb1/WYT0LfYjOtOPImUpeuySUD +FAOrxSHNTQ7pCT+2sX/Bz5uK3JMMgh2hKHwJdWab+44ragMPo6htxVMhOViIo5Xy +E/J55TuqrSezDjnQingBZQYBbibHOG6gleGunHVelvtYadNsWjrMBhTvTigueUUn +HVC59uyyuhLLfdHrK9nKA8l5lYnvod7qNJOYq7mQnOd2l63rm5T9YuS418p2ci+l +SzHhhugm1PWHlmGqdVtbBNm/v3iSggK7Lzd0Bnrb59lcP0fDRiQBGzUIeM+mxnV8 +Sd+v5RPGnmYJXu0A3YdwvdLJ1YubejYZjMynTMnZmzltHA/g/iKgdWoR7Z3/LjRs +j2j5mIEpwGlRmsGb4ZEHSWAXJs7ZtjzSrVbYwCZ33pxtrnuRAaHaJCFdVmMIG5mC +2I/fxzcJPF6OLeV7iQHXBBMBCABBFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmJ1 +bRMCGwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQ3xh45tnD +sn9YjgwAnpzuJiD/WqVpx72l8kvuGc50IEZVaLl/DiGHG0P02F8DrNjtDNpn42ZH +2Oi2vEr9w+WcAZp5uL7PI7x4qN8CVfKxAhFuOhZYL29Fe0mTYW7UDJF/kpU0PRTN +4hmz3Hi/dTnKwa0+nY57KF/sIpnocrnDXMF44zqohezR80abym8EHMZFomYyWLOo +wpxz9q3ld/+sjl4zD0uUkECilU1TQD508WO85fpXle2hOGvSWi8bRSlNfjNg9+/7 +PCrV1z8JN5VAAvGviEMpnAsTSPbGmSNJxcNKD3NveYag87/tKBROEd1VWELT9ReM +/jRzVFbbF+YNPIf3YIabOpGAJl0axffetVyTlzlHjX0jnvtHLi7nwDAJvVQB70wo +fVTIR+8J9LOwaEMmzS9ghqDT+aeXmrk4Kuet9stpQjGFJSJZ1dD+83Amu1Ip+BRE +eBv3EMrEz93CMQCYGzOR/XezAda8OlblTWcyyIdGS31CwCHxThz7VHRcBSni4hZZ +q0Rmceq8iHUEEBYKAB0WIQSWBvx0n84WNgcj1K2l6UAQw6ZCrQUCZMQjvAAKCRCl +6UAQw6ZCre3AAQCtEovfpCXUjiTypjnzCpke9rHIBnAVODTm93AAZ3BS1wEA98iA +skdHe9liLwLn9lA1BB3TRqZ6kjWMulKtp7U8zwy0G1NpbGFzIDxzLnNpbGFzQGRp +c3Jvb3Qub3JnPokDEgQTAQgBfAIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIe +AQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJkQW7VPhSAAAAAABAAJXByb29m +QGFyaWFkbmUuaWRodHRwczovL2NvZGViZXJnLm9yZy9zaWxzL2dpdGVhX3Byb29m +mRSAAAAAABAAgHByb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9Ac2lsczpzaWxzLmxp +P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZv +cmcua2V5b3hpZGUuZT0kZGpVa293djdsNHlGY1hMYXV5aUJZc2hwQ2h1TWtEOC1t +Ry03WV9WX1M3QS8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6c2lscy5s +aT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3Ry +b2V0LmNhZmUvQGRhc2xpAAoJEN8YeObZw7J/AaIL/0TLONGoB6BBR0/ET3Zh11Uo ++3ED8S5MOqdk27GTlah/s03RFnETyKBSHVoyqW/oIAQl88QRrdAzuak3OpZuoxRX +Ras7mVh8Yv71QnVmvex+MmH0MPfWEP73qKdSMefatKJopVR9g0fhSeWGImmR1E4Q +37f2ORzx2he/0obcwVtWRPupZhQ5iVsseRTQOPmgt82+LV7/dQPbOGw9oa9fizcG +7ZtI4hkJn8SSNzRwt3xy/I/rF37RAQbwqxVI+EZ9bkjbssAy3QBRVtp8vJZABrcM +F7VCtLKrWiofW88LW7KnVgSVUcIZ/omXCOOia/Q5jdVMKEAHxvS5rKz9EgH4b9t+ +94gFa4yp2CUXWlzZldyyOf6OWjYdTMMPLQmmghhsIu91aIK4DM8MEg7fsgDm+X8F +bRG597KjJRrFCxcrEpqn4RjiWa+une15A6FNjMfs4UAxUyz8xakjog5aoEu8JvDp +LipXM7/sO7p7zxDZU9dAypgsC2XiUQDqOW5hKwd224kDDAQTAQgBdgIbAwUJCWYB +gAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/ +BQJkQW1WOBSAAAAAABAAH3Byb29mQGFyaWFkbmUuaWRodHRwczovL2NvZGViZXJn +Lm9yZy9zaWxzL3Byb29mmRSAAAAAABAAgHByb29mQGFyaWFkbmUuaWRtYXRyaXg6 +dS9Ac2lsczpzaWxzLmxpP29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpm +aXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kZGpVa293djdsNHlGY1hMYXV5 +aUJZc2hwQ2h1TWtEOC1tRy03WV9WX1M3QS8UgAAAAAASABRwcm9vZkBtZXRhY29k +ZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBtZXRhY29k +ZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpAAoJEN8YeObZw7J/dTcL/3Qx +g/pZ6syoO8y4U34wGExBFQRKknpZURr5DXyethMlKh+x/CVZ/NUZFhlzs37e71fq +rw0Yexcgro8676x6Tq/LX982MGO95sceeHz3hiiqw93LgZLw4KdcIg3JLL2VwywK +Ls5JIPxjF/zXa2++QV9euPrvWD6PI0fZIFghVD93S4Qfl9XpJyJ6IEC04OKf7klv +/8FqFqKuRBPPsLXPH3VckC3VrcsNUPppD3ZUHdpQRn31IOkDWC5t2z0w5kJutSSZ +1HD/u/04lElPAL1SDBk7bYzwMs+TkJ7oRgZTCwA3e8Ikfzrt032WRO6PAtX4cxeZ +/OtkuokSmSGhtXF9lo64qCOkwfw0uJIgTFV9k2FIB4WpjdaYs0rCaCpyKSp3Yg6a +GLq6pRuNbtfaY8kjUAfDOp9+NBgocAojoqd2nK+/wroo81fps5bM3N0V1qNgsTQL +c3Ar1nK4aPdxBLwHtg99/S3hJA3j/yG+gQXr+3ewH2xcS821QTLXpmd00mP+kIkC +0wQTAQgBPQIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBC/qe9uR +cXCnuOcgAd8YeObZw7J/BQJizxBbNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJp +emh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkvFIAAAAAAEgAUcHJvb2ZAbWV0YWNv +ZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSZFIAAAAAAEACAcHJvb2ZAYXJpYWRu +ZS5pZG1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFa +eENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2 +N2w0eUZjWExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdBAAoJEN8YeObZw7J/ +l0MMALLTO4OycZTBEuhm66itGT8Az8xzj1y/A30DUBA1QoQ2vtcaFXeZe/pP/qUq +wlXmgWgpIUu8vKvY0OzNq0lt/WPGazdYdDFZJARcig+vmVMRPasNqU/pi5QPkpjj +as9EtwnHrn8Fh+lklw4Cty0FIcCjPVv43y80k9fZt4MyF1cktG0VUO6ASC7ahHW4 +MEQYqB6D9IehQdMLOEDAazVadanSXMAScN0Pnkxvd1FoS/Jubk6lLMMwul3Oihyy +nZJQtM9GgP1l4p1xpBO3AoK2xPvAaqCKuMIKFY51mK5+/rxU3xsZMyRJQWzy2p+s +m0RV/libGmG5bGH1S+UTd3BcR747JO4C9QkhXfhAagsA6iz0z2mXNxhaGhuKKv0o +orLU//ubYfJaMLR2sWRehkuWVlhAMHZ0yF+kFW5Wb/qOAm5tf8ILX2XjbrU03MIY +v7KMAY++6dB2SYJZTtOBDIjKmCyZisYFwszttb740gL1KsAxM6xsHpIOfUaljZu8 +WSV6hokDbAQTAQgB1gIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYh +BC/qe9uRcXCnuOcgAd8YeObZw7J/BQJizwX5mRSAAAAAABAAgHByb29mQGFyaWFk +bmUuaWRtYXRyaXg6dS9Ac2lsczpzaWxzLmxpP29yZy5rZXlveGlkZS5yPSFkQmZR +WnhDb0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kZGpVa293 +djdsNHlGY1hMYXV5aUJZc2hwQ2h1TWtEOC1tRy03WV9WX1M3QZgUgAAAAAAQAH9w +cm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQGxpOmZmZi5jaGF0P29yZy5rZXlveGlk +ZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUu +ZT0kaEs5X3RHMHU3YXFVd2ZIdndzS3dlQ1hXWDZuaS1fSTlrNDF3eEUyak1UOC8U +gAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVDQU +gAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRh +c2xpAAoJEN8YeObZw7J/DUEL/ilBrutKMPEdU6QwtayjwfE1nBwhRxK6LNZaNe5t +EpH1YUS+Kg21gdVFhkSD34UNwpdqE2TdeRe1cLrm18+QDgRzaM+nkQzZmYSTFEa/ +q5IVudDqrdNAimYyJsUBDRVErBOKPDlIrcsZ9FYYwXDsv3fANBhGlMLC1ahQECu6 +bP5Y7Lx+GaAvfywoGAqZkqUmfOAvYvb2pCFQSZxc9TNua6iisyVgiuvNXt/GnrEG ++lLBRlPfG+MdXpYOTkxi9xuszbvAaD6Ec3TKj66fp0tFQrwGtmuGyJcKxv3pcA7T +Jcv8rtaAAqYQQ8G3U2GPIfche1ty3Q8ECSj9faKw9gqJO3WNpyiryB/2Ig37No+4 +3zzdCrHE0NsHDGwTBDRAx1L8rxWBZtLvTKquQntDmXj+M/xLb8nZ+x9JZcVf+3QE +o2q7uOaeqcOeJWOTLEdhjR4ETumxPTAvyszgEzwPH5foZBQXUJbXeoIonqm4ywPg +rsIfyXbsoOIFOqiwph+M7ET684kC0gQTAQgBPAIbAwUJCWYBgAULCQgHAgYVCgkI +CwIEFgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJizwQSNBSAAAAA +ABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkv +FIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSY +FIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9v +cmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3Jn +LmtleW94aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQx +d3hFMmpNVDgACgkQ3xh45tnDsn/oSQv+PhwDVpYgAviMduLMZ8wLMNUYHsGXTwpJ +olCmnc/aMpB9GBM7FdniI2JiAP1Ln45QjABG0TEOrf+/FkSDVcYEz021VRpq3rPs +q2y5PpVc2PA0Y7pE6kpNE2hvd8jHJDFVzyukJInNiLXSbWk1aNes0yYACcXLKnrz +mkBllEaEsVohsfIzQVKWCypZHQbm1WOhTsh87jRWxA0bs7ryK0jPfx4oxOFqB8M2 +LkM84hODNrnoXyoLIMcJpT9gsWuoVVzWhwQzHg26ihXO8IDabIcoszJIZ2z2DBW2 +wTKqFMTMN6ak09OrTbI+g5Xy5rBaCHyCLHstXZt0i5iCNkwQQG3BgYA7m1eIjqKG +ykWQ42ACq8SJWp8L1eslaJVGrJSClCSgd8rpIqcXZLSqNwdlE6NxtQpn0cUrJihg +7X+oRbSFzHUno/ktn08P1gn9EE7vogLHMRMD27VOD172NyTu3iivEVnYcpFGfiRV +k0PGIwna+/DFJNuG7agUJs2Fv9IFgufpiQNZBBMBCAHDAhsDBQkJZgGABQsJCAcC +BhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLPAsqY +FIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9v +cmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3Jn +LmtleW94aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQx +d3hFMmpNVDgvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/ +dHlwZT1UWFQ0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9l +dC5jYWZlL0BkYXNsaYYUgAAAAAAQAG1wcm9vZkBhcmlhZG5lLmlkeG1wcDpzLnNp +bGFzQGRpc3Jvb3Qub3JnP29tZW1vLXNpZC00NTIxNDk5NTU9ZWQ4ZWMwNWQzYjBm +Yzk3N2I2NzEyMGQ1YzE3ZTJjMmIzZjA5ODZiZWM3ODhiNzBhOGI4ZDM0Njc3OGI4 +ZDgzMwAKCRDfGHjm2cOyf+tmC/49Gj5whhg6NM7gjkzGrkdG2gFe4CYeGrqxh5sr +VGo6iFbLug+fVF4N5ThBT/weTyVTCwZ99E+vKGK6JmrizMlgis0kUB/ne7N+Gn15 +THmqXPv5KwiNqUAjRfE0OluYQ6RKe6irvRuJlYqdM82RL/z1BLhvHSUIRFJFeBNn +QWe92EdpsC4AhxKbIsIqy9KeS9CQkyP3K/FIf9tpxT1ne/xNfY0bMqWGMKouC0zQ +43FbdBmCt5qNpT+Hfgd2uVu2SZqXTBQlhnqlHiySzOtb2eP+pEMbMB2ms6YBzE7U +gnGeny8RtpIkkIROIpy+pZObX65SbZLCFwbebqmIRCLDZLxJ6mB63WW3A8Jzvt49 +fvlnd/o9e7h/GB1xgWQP3ko8FIhJ2kBEl6ErotxdQCRvjqPE1qGDmYrt6w+DOZmP +G3/jd+E1/fUca16zm1HCdn5yDzOrhoeKnJzokSjQtcuMXJ+bLRGwGlj00ZYkEWUE +sncVNw41PPC92Zh26EogFgGNqFKJA6AEEwEIAgoCGwMFCQlmAYAFCwkIBwIGFQoJ +CAsCBBYCAwECHgECF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYnWpQzEUgAAA +AAAQABhwcm9vZkBhcmlhZG5lLmlkeG1wcDpzLnNpbGFzQGRpc3Jvb3Qub3JnmxSA +AAAAABAAgnByb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9Ac2lsczpjLnNpbHMubGk/ +b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9y +Zy5rZXlveGlkZS5lPSQxTFI4T080MGJMNjQwN2lmZjAwSjhnOW9kM1p5NG8zLURB +YzZOZnpURFNBNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJv +ZXQuY2FmZS9AZGFzbGkvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNp +bHMubGk/dHlwZT1UWFSYFIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1 +L0BsaTpmZmYuY2hhdD9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2 +Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3 +ZUNYV1g2bmktX0k5azQxd3hFMmpNVDgACgkQ3xh45tnDsn8T/AwAkA2/2uLfZCQE +jBZWKTJmZXO7XYSsaABcZPZYyjeUkwdRzFqX61cFD2i3R8kZ7UAablHunDYQmkRe +5S0Enq7GgxEE+qQXFyFJprPpI09gedkigsF4mGrGKooG0Kf19PH2yrZ6klERmmuE +mqbkeJUxh0iBM4snISbzFbRnUtMWS5hXbiojggqQMen7Ht3YF8Sv/Q/MkGfZBMUR +XmwVWeDSeTXqPqcB1QloxFeDvFxNYNcq0NdhgUHFTDfSHJT/IF6bIuG+yALqgLAb +GBvAFf9PcyHw0HhD/wcXjLYPRBFdi80yQhoKC0tdOwFsJLv2zHYf68nKIiKvdTJQ +6hz8tpy23L/usYR/3zzAk0xsPGubHKiSio2tKU/dgBK8QElt2krhzxI1DtIDBHhk +FmFV9L4vlhXLmrXt8seubOpecDK97YQ4k5nfB3kGqxARTcbeihIPeibTZznPWPax +EEoYue0OHh5hIiyTQpnrTVp1Y/Q1F90MdWWxi64UiGYrcYJpCdCciQP1BBMBCAJf +AhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB +3xh45tnDsn8FAmJ1oT+GFIAAAAAAEABtcHJvb2ZAYXJpYWRuZS5pZHhtcHA6cy5z +aWxhc0BkaXNyb290Lm9yZz9vbWVtby1zaWQtNDUyMTQ5OTU1PWVkOGVjMDVkM2Iw +ZmM5NzdiNjcxMjBkNWMxN2UyYzJiM2YwOTg2YmVjNzg4YjcwYThiOGQzNDY3Nzhi +OGQ4MzObFIAAAAAAEACCcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOmMu +c2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJp +eC5vcmcmb3JnLmtleW94aWRlLmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5b2Qz +Wnk0bzMtREFjNk5melREU0E0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0 +cHM6Ly90cm9ldC5jYWZlL0BkYXNsaS8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5i +aXpkbnM6c2lscy5saT90eXBlPVRYVJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlk +bWF0cml4OnUvQGxpOmZmZi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dW +bVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFV +d2ZIdndzS3dlQ1hXWDZuaS1fSTlrNDF3eEUyak1UOAAKCRDfGHjm2cOyf11LC/43 +AUh1YO7yDyoMCoGgqxdcXhZ+nneT+JKw6vCPvJdCjRv45XIDmQaQ7wgiNtl/I5kN +RtIbFZ24/u6NWfv6oXxE3egTSoy7qTct7Faw8gFSsvy9zshHH/g4sg4qgRU2nFYF +XiObqvoxU5xq2sdSNR3abqJUJQ0KinHPa59wZkKcvn5F5ZT/+6WjUueTr+jmVVoe +zOU2jhSvr14J6lsne4WRnLqXco/0VeS0vjMbBRX/MYI0mQ4w/8YyrUTMUMAZQVLQ +1oO7V34y1a8jBqeEwnSm09JW8N8VLII6rJh3qUVDrWzLB7LQ6NRkXrHjRjjLSLcU ++mKKPaai4DGZjX7ruQ4GT1+zbP9vvmfsFTnfM0HQTd0GSFFQ/XTBiaadKiX2N75v +ANL1slDWr09vvW5HosE1Tuma9U+SRR6DoVnIIFy7q8uJqQavsSK5sdbhk47W71s4 +IAVTy3u40xawor2cn8N8i6q6mfOJQOqULaRlP6uzVFJn3JEwFHuKHvgIpGf3nd6J +A24EEwEIAdgCGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQQv6nvb +kXFwp7jnIAHfGHjm2cOyfwUCYnVqlJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlk +bWF0cml4OnUvQGxpOmZmZi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dW +bVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFV +d2ZIdndzS3dlQ1hXWDZuaS1fSTlrNDF3eEUyak1UOC8UgAAAAAASABRwcm9vZkBt +ZXRhY29kZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBt +ZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpmxSAAAAAABAAgnBy +b29mQGFyaWFkbmUuaWRtYXRyaXg6dS9Ac2lsczpjLnNpbHMubGk/b3JnLmtleW94 +aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlk +ZS5lPSQxTFI4T080MGJMNjQwN2lmZjAwSjhnOW9kM1p5NG8zLURBYzZOZnpURFNB +AAoJEN8YeObZw7J/Kb8L/Rhva+cHBUgeLWD7iSueBrV49scAVQMWSGF3uVjT9LPz +hFH9BIiHAO7LXRAffoHoqVdi5YHVMXZ7AK51cg3nvstdfJT49YjIt6dbgrjQsT2J +kWMbf34kIpc358wD/fWBfXPCHgtxUVMN/TY3Qb7R77u9EyH6CZ7kLtGNRCf0XSyC +IhkvOCswJamCBk+GfJPx+y2F9KC3VqqEUQUPZiM8vzmKwZRdUlKcXoJIgKz6k+fu +c9Fw+IBZq8ZFKrGYMcV+i3IxzhUAgpREm0AoE1Qjl1iGyOkJ+g2htpv80EdRMEiX +UqdDa+5dkcP9wRUaPvFC+RfP8AW9pzbvXj+WXh4k098sjJFMM6bQHCI7LgMS4lhK +9ltCy1Yf5mh5ZjNxYDk288Lqtw8bXVpwUAXk65BAXceP6wvxmG6r0olZzS8kivPL +JTUZPXkEi8nEHIUXO9weoi5jIM2QvoeM5mb5cE2YCbwmjwIANZNs4ICdps3dMOhB +Oo+r+YJ2Sf9xCfkZsCdoqIkC1QQTAQgBPwIbAwUJCWYBgAULCQgHAgYVCgkICwIE +FgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJht3+AmxSAAAAAABAA +gnByb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9Ac2lsczpjLnNpbHMubGk/b3JnLmtl +eW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlv +eGlkZS5lPSQxTFI4T080MGJMNjQwN2lmZjAwSjhnOW9kM1p5NG8zLURBYzZOZnpU +RFNBNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2Fm +ZS9AZGFzbGkvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/ +dHlwZT1UWFQACgkQ3xh45tnDsn9PzAv/WJERGb3uRMKyh5dlhsg6+LttnkjHLcK+ +hQd758VrCirHOTTg9U3Pr/PIPclRfEfk0q5YIcfm6tl5Du0CBYcQkQesZKaLy9KU +WOq2QCvNy2SqNwcpDtKogap/H82892mFtRO5+Lap7G08cXmSjJNMN83h9w5iGI4g +ghPZFEr9lGmz4ichUEXqr+VkJ2lIT5hdeBZitoIqB0/547BRec/dApkv/+Hd06sZ +xynZDXsdQXqNBzpYgdDm25p8kq95CFnht0rBBCfhwG22kSUtI8VMPow/PJVRDRKn +GLlMhhy+x/LFoGZQHDXXApbv0RB+93vbBccm2FpkKwGpdA4DcgChIsRiDL/ZnAPi +mPe2exaTKv6UkVFbPbj0s1K/au8msRnr2oLzTkUVWv5OdkBInj4ntNiJCZKBnCdH +UPwsChLVIz1gcyh0OHIGdUGY9VExcFgYBuEgzVsX/FFb5APlfiPa+OXc7/0g9hDc +o2jDxcgrCEGhU1U1TyGk1PCwQxCS9SlmiQI5BBMBCACjAhsDBQkJZgGABQsJCAcC +BhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmG3fkYv +FIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQ0 +FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0Bk +YXNsaQAKCRDfGHjm2cOyf+eXC/0TmlkUhH996p6/33ybxk1Wx3dL4qtD1IMhGTcj +bTUfPjbOWRV9mqYONTAA9Kg8cNzhAwwXaEEztCVTFX7/Hqt6fpPc3tTwFFfgQO6C +cRaMgbUhSHg0gN4MatbY12mWrMJNVScI0XLNXRmP6Ow8G8RzpYl1XdLPYoWbmL7e +iCk3yO8WiFkpFpDkO/im7AKI3m3XLOwEGn424P4qW6P4LmRC8XV40qIDZzrh2Dxq +XMui+hVLN41xYkaZcI5Y0LRW227hkqMFypkh3Dpaimz0QosnwtgQlm/+J8zMHDyj +k2oLYpEJNaGlAGdEbDbQ9piB44ZbB1jHoIsFZSAAydr5uV2ClCN/jLr/YhtWsebr +yArofcC0gF2caUhr/Vlnh1WRNncn/BVdQ5a06yJ8zqJUz+oXHANVfJU+N11PZRHz +tmogWXmeALm4H2UIZmBfgorb056TxIhGOP2Rr6yykKLGLVmazAiPkLFiWJjS47H9 +1s4aMZVn7qhaHhFt18JvHezXciaJAtUEEwEIAT8CGwMFCQlmAYAFCwkIBwIGFQoJ +CAsCBBYCAwECHgECF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYR6NhTQUgAAA +AAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xp +LxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhU +mxSAAAAAABIAgHByb29mQG1ldGFjb2RlLmJpem1hdHJpeDp1L0BzaWxzOnNpbHMu +bGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3Jn +Jm9yZy5rZXlveGlkZS5lPSRsSU1YUkUzMXJlaG1iNWc1N2dRYmc4SjNya05aSkw1 +RXNlWjhuUWw1V3BzAAoJEN8YeObZw7J/+GML/0aPvBgFFBXd7LKR/Hyf0WQ1eUUL +/pkELt/AQRGwOaAEyUnfmKtqTI+qVeD7UNpcDHdjwchBmkfG5W/N8Caavow7jCdu +0px+BA5WWO7snDW3HOzFKIRgDtajtljX69Z9Wh9aYsO7sYapSMCsmIx7h4SxOxSK +oh6nZOaN98dzx9PcyjbSneToGyYDb+5nzTiYWiaE8LQAVkdZeFAdSN4UDenVXd2R +cLozZVQjYwhk+fVDzlcj9HoieEKpSEpUp+dWZJob7H4z9AVLieYwzkfFmApG9XaJ +wZPx8u06c82q+3ZHXd0HLd/cQFCSL558pmhp8HhnDMrYipRoJ3tX7SqXXrhi3gA9 +1K89I3xhmpiz9dq2B/Qdv8Ml+D9qQNIpBWqns2zWkWharqNmWTxmAsTPY2rEMm0c +81dWXZ61Lra69A9XXUQg52xRNS1AKF8C0lMehSdBu2a8+HlZHADhCjLRaljxvhUK +vqTaL7/f5a6fN6D0wvPOXgYP5+u7Jv8NnLfO74kCoAQTAQgBCgIbAwUJCWYBgAUL +CQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJh +HolFmxSAAAAAABIAgHByb29mQG1ldGFjb2RlLmJpem1hdHJpeDp1L0BzaWxzOnNp +bHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgu +b3JnJm9yZy5rZXlveGlkZS5lPSRsSU1YUkUzMXJlaG1iNWc1N2dRYmc4SjNya05a +Skw1RXNlWjhuUWw1V3BzLxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpz +aWxzLmxpP3R5cGU9VFhUAAoJEN8YeObZw7J/+RkL/10AHiebFztglUSi0/2auWZ9 +4SCX/n6sgwtcUD0SOLUEQjkXlhgGQJy3UfS6VCgNl0fkfkf5E29g9tY4rQS0dL1D +3PNChFsiF6b9XymIqrCz5Kvgt+6RjC1uFTl32yhsmbwL61E3mn9e1nlXZcpv2T2i +xLeU71kNRQR3+lkvJdbu2Fli750n6AS0iMboeLTzLZHK9Ai0CZqZ84O8lvEBCSNL +WCg8OoLfsvTs8XiAiBvY+Bagc5AKrM5tLwdrm1eiVNtHOZNZ/EXEfYMQ23uh02Li +znd+HZMo9URKB9mbtZilBl2O3qorQyhs9lQNwUgrATXxJMUnrXmFy73LLAqT6MX3 +iLPMiA3Da1FHGxVKhcHu0PuWd3vyOqnDUQ7DEg1z8X4NtMOszvMCBH5I+pe7kDQt +jsiGIDaFl0v0bWOqIfq+d4hDSC3o/cAnNRLnsU5GYhI+YESRb80qBD+UKBvvm2eD +MXNo1/weVq29g0k7Ozt6y5EAvrTMcQeve1qXcQDe/4kCBAQTAQgAbgIbAwUJCWYB +gAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/ +BQJhHmJSLxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5 +cGU9VFhUAAoJEN8YeObZw7J/QVEL/3YUztd5V/JQPHyAezqTD8mEVNu4bkLd1E6U +kwFb5e5wvcNndKPRhdL8JFtHGo/vnrglkpoY7KqLPKq2z7NCQbsR5YT5iWIlfCi1 +Duwh207l/wxzohlDuYPe00AFnm/B19eFjFLKI7/dixOkfZhNDXgtz6BRiYG4Dpmq +cnwYR2+xqul0cQ92+6IApVsdNzAyuHXrYyRtVXw1WxG9H3XmzuZl1fNRhpENsc0r +WAclp5F2KD3ZP58zL6N5stKvKGbfEdoAjoZVSjuFR5K3tYHH6gYAccyxuLgYwRhw +5HWkQ4dB8Xv5vV2+v2SQgK39NYufgVX1YBM5O2YXFRBoDc0yCP20PQ4XxbtgdcT6 +rMemuYSEWmFarSwlxHsHMreoSbwxVHrfBySwM4rqoXqyfaTHnVLysF6WNjD7h7d7 +e0rXL70aD9BKwvweQKJBhoCGTkwt3IOEhiPawD59m4EcbXji8YCs570mK2uoc4kp +JjuF1DlS1L1wd/unYaKIinbm34Q+34kB1AQTAQgAPhYhBC/qe9uRcXCnuOcgAd8Y +eObZw7J/BQJhHl4PAhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ +EN8YeObZw7J/yzoMAIUUWbESdqwWbIe0e3VviEmrW7kArLRV9AFfVYvnA+OGObOx +FYcDSY2vH6kQetRLlYV19OLM91N0/Oqh/wwlmpzFrLjXkRG+aNu5IKRh4noythO1 +CH2BUo+n/JeodpVb1x06EYeZQVQ2ASche0hzzw4Zx2P0z+6Mg/IbK/YlUonDvTrI +Ioptt8InjXiDUo3D9n5Rzgn2zPf2c6gF79IbBZl0fBN+V/La1O+lOdhT3yajb21b +Hr9SmEdtvs5GT1WSpEpJDtZGf0Y5Kv0UGIrFn5dYJFzcRjHWbuB3bB/STHVVgoAS +ueLV7xDdqbO6d5DsVtvExiBhWI2LAtQXttzRnHIGajuNP2852ooXqVpUa2hu93RV +Uf6XlRBg6hHPnhRZYUr2gaAWH0VKDw1m6eK3SToNVD9GQrA+j8cqhr4fjemZaqqH +U3MIPwUvNTcYtecy9e4AopWmS3nIkJhsdSOIyXIGVHKt2I2qwFTAPOjm1CAy9S4Z +v8lVNVFDxhsM7LNHboh1BBAWCgAdFiEElgb8dJ/OFjYHI9StpelAEMOmQq0FAmTE +I7wACgkQpelAEMOmQq3gGAEA0YkCNt4pTGr86xG10Lcz6Ds6y98GjZrWPpHUZL1m +zxkA/jL5xHj3Z4uzQEzoITj4s0Yh0YzDIpej6J6pC2Tv+SEJtBxTaWxhcyA8c2ls +YXNzY0BzeXN0ZW1saS5vcmc+iQMSBBMBCAF8AhsDBQkJZgGABQsJCAcCBhUKCQgL +AgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmRBbtU+FIAAAAAA +EAAlcHJvb2ZAYXJpYWRuZS5pZGh0dHBzOi8vY29kZWJlcmcub3JnL3NpbHMvZ2l0 +ZWFfcHJvb2aZFIAAAAAAEACAcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxz +OnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRy +aXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2N2w0eUZjWExhdXlpQllzaHBD +aHVNa0Q4LW1HLTdZX1ZfUzdBLxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRu +czpzaWxzLmxpP3R5cGU9VFhUNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0 +dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkACgkQ3xh45tnDsn+x4AwApA8PTLYRemnD +rNTFfLXUb7kiW7O/Zi93a1hT1g77NoovpZT0Rfd6Jc93579gK354N27W2P7YflRi +IYxp3ch3WX4NgpxTFvx1HbSa9l+UNvH5TmFJmr3EonDLOtZWpPEPdbq5MJANCAYH +5jT1l/MXD+VnUtyN9aFqFuZR2XLDh1VPDB98TTlwC9GYe/QHouCw+PhqZXii58S5 +SgHlzGx5SHtdVfWl/POzy3tlOHHzkBiHo4VLbIbiB2T2GRvmpPGOCH+d27qUrIZV +eF2jfn0opkxW/1Gl8xhyUHS2b8I7/7Zjfp+UareOmR6ccBUaSwCt45b4fnuq/wgJ +kxD7WoxXkr8rw+H2jQoJTxY1EKUYo4GJBUpjU6VYMGpGWxfZawM/z5hiKav57VuE +5/FXJR/c/fJjjBTFOHC0Z9VPDlpu+SdfWe7m52/MEHawLWL870emTbcyTsPyVI6b +bVoNwKEpDcUkTrZUPW7Q973n00s7hMnb2HmkX6t5sfXmHBMkECitiQMMBBMBCAF2 +AhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB +3xh45tnDsn8FAmRBbVY4FIAAAAAAEAAfcHJvb2ZAYXJpYWRuZS5pZGh0dHBzOi8v +Y29kZWJlcmcub3JnL3NpbHMvcHJvb2aZFIAAAAAAEACAcHJvb2ZAYXJpYWRuZS5p +ZG1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENv +R1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2N2w0 +eUZjWExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdBLxSAAAAAABIAFHByb29m +QG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhUNBSAAAAAABIAGXByb29m +QG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkACgkQ3xh45tnD +sn/UbAv+ISlXhbvE0MSRdCVz6zG8PwnH2Q0ejFcrwVBroJ+haKq7E+rWNlC+YNra +jZvVYDvlhQmjNB1UU/xBU7DP4PfCeZj8HNHU897aYfS7qhPyXiTdudHEAsmlnA7O +/eyBVBXqjWDAIWNy7/RzmTFIEX345H5HT1RmdHHaMSNnvlN5lp2TOB5qLAgD8q2c +Lq/HgNthePowyS6Tit06BdvoGgCVbBow20Fc10l326/3YuUX7nfJvfPSTr3X1eiH +XGD3DJNvFUONF35jOCIOLGVs0LgsEtnYiRvoUobXEexTTvj2IZq9+tsGszTPKHJU +25erDuJBprO5Lb9BV6orBYEDWiiKpcw1ZtD0SKnsprS+9JpBvz64H5qHgA6fOqcf +WdmubTZHt0JzqqNV/Ye3YMy2bFBuJt+ZWkeIUAEYgLfbv4Cp2z+7OkCeoVBI0ICv +h9HEmEvc2JWUr+Ir2f/jczewHDqRkpl1beFYsjw4yOTyF9W3mkj1ysWVm+9cy//p +WiOr0LUdiQLTBBMBCAE9AhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA +FiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLPEFo0FIAAAAAAEgAZcHJvb2ZAbWV0 +YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaS8UgAAAAAASABRwcm9v +ZkBtZXRhY29kZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVJkUgAAAAAAQAIBwcm9v +ZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6c2lscy5saT9vcmcua2V5b3hpZGUu +cj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9 +JGRqVWtvd3Y3bDR5RmNYTGF1eWlCWXNocENodU1rRDgtbUctN1lfVl9TN0EACgkQ +3xh45tnDsn8+rAwAqAwIzZHQYrbu1LlO0xa3+H2mhP54OpKj2c+yaDLFT6rpAjUd +tEn2Bx1TIhKjePvZiHnXk5QgRcuQ7pgynLCEVcrS3Dy9gpGc3wNFGa5xsCyz9E0D +/aRw3weSLqTc69y1290JNqEdAWOQ0BY6D16DRw1OjZfGTlaqs8I/FOt6MHNoURlv +I0ucUkMejdlPWNzjkO8HwCNpu9RQPOyamqAfJCm/M+OFoXx1WtzPQvpioIfw5bBO +uPI77fXrGSk+ydud0gW5xchi5dLIDnfMEWscYpEP7GEEQvpLZj2UQa4WOpfz1k8+ +PqAbMSCT0S8h2wvJqiepjEwmkN47F9IshV3vc22Pyk4vSlPizoly1YjBnVhhBNX7 +keBZUZFqTAruKGNEJ2uQFqNw1A3WaoFJxapaA1SWdems/TSXNuj43F4pvClxQxZr +wQwVA8rOISEMFfS8bkcx5vUfEeJvE/JNfiZBEYmH+XfDZRYeMeUQkZY548LHLUgj +lsqVPexm7qUbfPcKiQNsBBMBCAHWAhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMB +Ah4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLPBfmZFIAAAAAAEACAcHJv +b2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRl +LnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5l +PSRkalVrb3d2N2w0eUZjWExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdBmBSA +AAAAABAAf3Byb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6ZmZmLmNoYXQ/b3Jn +LmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5r +ZXlveGlkZS5lPSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdYNm5pLV9JOWs0MXd4 +RTJqTVQ4LxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5 +cGU9VFhUNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQu +Y2FmZS9AZGFzbGkACgkQ3xh45tnDsn9r3Av/R9+c7npoC8Oo8IU++UjzHcfd+Zs+ +YwJc0WU5ZwOW5KCoyAMHmAYXi/ZD/e3atUNwrgZhKMXRNxDIuvdqIq5euBzdTjd7 +wJYKThB44sLVNtE4DWULRAWgAQovpdcSoeg3iZC45LxQlBfgNRBPBCkZs/yF3Zp9 +hrZOSN+krZvanZ0fywJTRKYEUTgejDP3lgXUU8w09Mw5IQ0Xfiy+vGptfziapNGx +BK9Z2tRNOZln+zwXNP+U5wQ7psGgznMM9eEE4+jzEEsgsxoXcsNmChfm4K1ltCLt +72mBs6iEqfBIaAidOX4j8g2Idh1bt/qof8jWaBJwFrVaU4/q+Uex7+7CO3bBrkv6 +rHBrta1D12T3s5xYlbxMLf4H/tqvf3K5PwT/6GXknchXjyoTwtd8DTTWtr9PUARW +/hfjgkx9Epjc+x16u5bM1iU+kmv4HygwMZwMRxpBOjuv3Z7HiamUgsfCYfJUhxIr +JEpUtLTvsiUPNmm05A6BVnpR7tHhsHbU8r/iiQLSBBMBCAE8AhsDBQkJZgGABQsJ +CAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLP +BBE0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZl +L0BkYXNsaS8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6c2lscy5saT90 +eXBlPVRYVJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQGxpOmZm +Zi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4 +Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFVd2ZIdndzS3dlQ1hXWDZu +aS1fSTlrNDF3eEUyak1UOAAKCRDfGHjm2cOyf4WGDACS072ObGtwGJhMZElGcqxE +b4H0XIbAZHcuCqA5lFNPgeayozXqMUk/SXiYcqb38yMyHyT1BWVGa4LSHoGwvt15 +u4RwU0SgRisWTCZsstB8T5ePVu7HA0xICx4RBdxhyF14T+Dno9/eqMx5VaAL434O +r1gHwFT96D99hunf0cjHPBpQEGaDAPIXYlqOZ6ExQA4GufFQv9uNSusXpHw/pWrI +LU/CvbrSLsUckbfXQ5BXzo/vRg92nIWVOcq0T9NL8E/5WuQ4aTowoI+lhC703wP3 +lG9WS6Mb2x+4ubahWLwBXbaBvHytOPJdEqJnsilpFFFJRpcNYrznh6sKXqjKSYxJ +mXcRsRsx1H8a/Cl7jQeX8pGo3xmNb3GUjLYaaxdekypbowGM+5GAmwB+GhZ0wEzx +pdYyUaJ5B/nsZrvNzjhujW3oTTrKCH9/p+yg2rsNfzXjnETna7SvQVh9wekP+ieA +cL5RsEIAfP1QNG0b9dHZJWvXSNH7Du/AG1NI64m56BuJA1kEEwEIAcMCGwMFCQlm +AYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOy +fwUCYs8CwZgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQGxpOmZm +Zi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4 +Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFVd2ZIdndzS3dlQ1hXWDZu +aS1fSTlrNDF3eEUyak1UOC8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6 +c2lscy5saT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRw +czovL3Ryb2V0LmNhZmUvQGRhc2xphhSAAAAAABAAbXByb29mQGFyaWFkbmUuaWR4 +bXBwOnMuc2lsYXNAZGlzcm9vdC5vcmc/b21lbW8tc2lkLTQ1MjE0OTk1NT1lZDhl +YzA1ZDNiMGZjOTc3YjY3MTIwZDVjMTdlMmMyYjNmMDk4NmJlYzc4OGI3MGE4Yjhk +MzQ2Nzc4YjhkODMzAAoJEN8YeObZw7J/G6UL/1H/fk89xpj9oz6aVkvaf6xoedu7 +ofxi2LZx8jaI4P6jVz4J45KBJZ2ULQVRJOYw60QhohfjjscxKXJgB6oYYiXlVtlh +GmG/DBJ3l0HFS+aZmg89J49qG3xHyghhDX/ABw9mT21cIygd21vAViwcb1dZSYeF +m3Q8rV+jF5Cm0LvK+7UigXSJbHBUtMQH3ZIQGym+SEP+FCbD9A7KW3SWmZuDUwRa +ZBTCoenGUD8Bx4tSjns7zMvWkwZdxTiiqMAE/jcvzhmBZIWhGpkEY97ns3mihbEd +hjv1baUk4h2T9R9ASJMvmUfKEY4JxLvbxebquSOC+etMKZ/8ySuIH2Afvw1JtJdL +1hIL5czCpbtDlgCaRxHKkfZx0RiEakze6WrRHr2XLh0TSdIKEcIBSt0LTW2uRJqM +GVsxczzBU/G3qZcCWAjorcqma9N2B26viH4RtRtszEuvJZl0EB78GrDVNud6fyuE +aewdBSU1LqFb4K64f+xmQn8fvAXjthSXWySzNIkDowQTAQgCDQIbAwUJCWYBgAUL +CQgHAgYVCgkICwIEFgIDAQIeAQIXgAIZARYhBC/qe9uRcXCnuOcgAd8YeObZw7J/ +BQJidalDMRSAAAAAABAAGHByb29mQGFyaWFkbmUuaWR4bXBwOnMuc2lsYXNAZGlz +cm9vdC5vcmebFIAAAAAAEACCcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxz +OmMuc2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1h +dHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5 +b2QzWnk0bzMtREFjNk5melREU0E0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6 +aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaS8UgAAAAAASABRwcm9vZkBtZXRhY29k +ZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5l +LmlkbWF0cml4OnUvQGxpOmZmZi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhD +b0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3 +YXFVd2ZIdndzS3dlQ1hXWDZuaS1fSTlrNDF3eEUyak1UOAAKCRDfGHjm2cOyfwq2 +C/9gKXhGmi0Rk//MK72kPuokFn5vuBNcGHZwydU/EcNGOb/AjQkIpTM0Ktx4bp5U +fRwdpYNeOxchHGi1MFjlagfxj9QdmgByxjUVaMWExdputniIXg1GuDB0plr2pGsI +TjLM6K4rSnV1nf/fFIAJkmQZ6AICIQ8VQvgVS9VlZ5LqMRA0rRIzyPtdfoh4I+IT +hFnXbHDp2oXfQhNKTf/MJKV5Rw53AoK8TIEtc5FlxGiDIzj9CoQOyj58/ffiDk4B +eVRezNXpaoCoDKvo6JatIwiR9ONply/mCGfkI2BtyJOsMiqPbK3GUdrFSEPfF1b8 +2r0DU2Ke/qhJF7Abvyx9g7tP2CuaAmcMUB0DIPAwcUxgIIwPIJj7Q8xPI06bGTAk +jJYO62rmqQu8klA6JKcnvM5Vk8IHEYjLsJ2DmYObvRVzTjYaHePMi0e1CUgoYUp1 +UUgo4hJA3bYv7lNrQfLCvhI5Mx4rbLJGW78xpCqg1aj8I4LgrnoHlp+oCAKa0xkt +ds2JA/gEEwEIAmICGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4ACGQEW +IQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYnWhI4YUgAAAAAAQAG1wcm9vZkBhcmlh +ZG5lLmlkeG1wcDpzLnNpbGFzQGRpc3Jvb3Qub3JnP29tZW1vLXNpZC00NTIxNDk5 +NTU9ZWQ4ZWMwNWQzYjBmYzk3N2I2NzEyMGQ1YzE3ZTJjMmIzZjA5ODZiZWM3ODhi +NzBhOGI4ZDM0Njc3OGI4ZDgzM5sUgAAAAAAQAIJwcm9vZkBhcmlhZG5lLmlkbWF0 +cml4OnUvQHNpbHM6Yy5zaWxzLmxpP29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dW +bVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kMUxSOE9PNDBiTDY0 +MDdpZmYwMEo4ZzlvZDNaeTRvMy1EQWM2TmZ6VERTQTQUgAAAAAASABlwcm9vZkBt +ZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpLxSAAAAAABIAFHBy +b29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhUmBSAAAAAABAAf3By +b29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6ZmZmLmNoYXQ/b3JnLmtleW94aWRl +LnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5l +PSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdYNm5pLV9JOWs0MXd4RTJqTVQ4AAoJ +EN8YeObZw7J/D4sL/1ZDzzOzfhQ8qOmUje/9BYqOSevipKK+nv32UIy2aiShJnkN +2SD0OMN4xLmyxSJ3ynZuPFcE/J6g9Zyyk2O+BT8xTQ+O5CdV5BLUFLsbMc2y8O7r +8qTnmuZE2FvOyae/M5a4rrCWCKMruijj0Q9PSThYJRd30Y+VSJfck9UkJcELx7vj +s2GLSxAkyMrOAoLfUuqjQYq+GoniWWQrcCTDV+4Amordk0sajNJvuGTYo/1p6/13 +VvYVRmFJdKtHJFWWtb1q0RlO4aanA3LRpGq7Si/auxoqEcH3t3Jsify6nKTljDU+ +CjFo9aJ9W1S5aHQ+OCYyP8FOacX22c5iODX9BXuJeTXaF/TzUSiuMY1SDpFCwxvP +9RslRQBKeycoAvzqTmLcvdwWxa1ZXRvUSKUUApmuPZVJmhD/jnkwM4v8vcqekvLH +N+bPccSRmFGoF+U3unMRsVrP5FUxjOOtn+CyOZR8fjB/1W/eqsZ2tWcMOLTyFZoH +h4NVPTqYOqsduhOAcokDcQQTAQgB2wIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgID +AQIeAQIXgAIZARYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJidWpdmBSAAAAAABAA +f3Byb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6ZmZmLmNoYXQ/b3JnLmtleW94 +aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlk +ZS5lPSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdYNm5pLV9JOWs0MXd4RTJqTVQ4 +LxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhU +NBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9A +ZGFzbGmbFIAAAAAAEACCcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOmMu +c2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJp +eC5vcmcmb3JnLmtleW94aWRlLmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5b2Qz +Wnk0bzMtREFjNk5melREU0EACgkQ3xh45tnDsn8prQwAiRVx0WOeemcAhiYRqDeX +Km1+ms8TpvGqka1i+UuVZ3QY7EDldZ38V9vP93gojgbKYmzpJBWr75EV+UoMMfZs +pvH/3et+RKItAI15PwoKtCCMUycqiJcmLBMlYPhy1wyp+7zE4ltFFIJ6Z7yDpyUH +75xolgsySnEFAinTHJ5ruJbbPyu7hBRJxtFGPVZzSeYjU8ikA1hGbdjYQc8AevQP +ZCyZthiNU7PHRDaRmiP3lJ7325bDx0Emkzaw9zp8vu/JI6EWrws/Ta4hxM9nNWSX +Xv3vdFLsMDAZ8qFlstCPjCZL09ZfD1d70MuGLbRvc7XMPp4ZIp7CZnRQ1FHf/PVJ +R+uqNtYUpqeB8Q7U17oYpU98aTgawbF7x02Ym7i2Vb9aPgKB+hU7nrfMevU90hUH +Mtu7ze7BZlj3otR9B2QT08PqwWP/yUQoQhSwWyxxSRLN/ecedH8fDo5kc6GCMpVi +/heVT9UoSpVb9H/TLlyR9Z3CuXDvXJCAcTP3WW5t6DsjiQLYBBMBCAFCAhsDBQkJ +ZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAhkBFiEEL+p725FxcKe45yAB3xh4 +5tnDsn8FAmG3f3KbFIAAAAAAEACCcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0Bz +aWxzOmMuc2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2 +Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBK +OGc5b2QzWnk0bzMtREFjNk5melREU0E0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUu +Yml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaS8UgAAAAAASABRwcm9vZkBtZXRh +Y29kZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVAAKCRDfGHjm2cOyf74nDACbLYlO +Oc4PL/QMfzrNzne9ofkh2vmHV6MCYPKTrCmGP3Bh+Sl92J2YEa3CyqgbwtzAcMQW +YX1Rttgr8t3IkTYWnGxdgVjEoMvioMQhjOkmcBPEOWhjAFpVUlKHz7vyfl84C5l8 +0OC6m7cwtdEhBZEsHTiT7y+9VscgAuR8Hr/vKmicMkmYrCA8jND9cvE1mVlmE4kb +isFCBaltyS8t8vldewotQeSvc93pd5Wv+RZF4YMIMnzk/RujPQeWNYAk3bjLcN4Y +wTlHU5KfL2HoMfv1/QmrNfgWTXYEmRw2dybwaSIRVZpr5OqXolIRW+xsyZPcjfiG +W/ejuoHLcYps5/kTBD6swERk925GwmTcwTMterA20aEzLTBJ16glPsfs8mlGzJWF +FiqfhqMxasP4kd6puxmVh4oBow8o1GMQEqYZ7SUDoF6c0zQ2nlXppcPw4e6eYRiG +15M7wlSnI4N0tEg67eGq+58Oob7cIkBe32GEmEwMHRE9oWMJK8QtjmITxHuJAjwE +EwEIAKYCGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4ACGQEWIQQv6nvb +kXFwp7jnIAHfGHjm2cOyfwUCYbd7AC8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5i +aXpkbnM6c2lscy5saT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5i +aXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpAAoJEN8YeObZw7J/YgEL/iG1xKsu +ZW2apQTlJaYkKbLycjn64kAB3B8sKlQA+yJ53KRXsT3UuAy3OXTEbVL3C9sRZ38H +1MGMXhJBF2P4p8HLWctjXkmdyPUEDPgl/BmnM+8wrj+yjJHRuGPHXsrrehsXNyoX +gMEAqacKrNtB3ATXnq3gd7wIZ9BlGzl34HaRzNbAPrImfa3ipG0vwId9zOM6nHlH ++8j9DJuhnY9IR1jvA88Pq96QmbCRDWolwzaLbcOxqaosQxlzw4F8wSUjOQocX6ya +2JvSO6WjglO/RTRoby7Q/r+7FrBJs3APGNstSZuC+QHS2Dn7cNN/mxg/XjHLGhOX +SNdFuZYGOk1NTvcVLdBh5nuVYAlNoqbwAD83UCaE7g7lobYgxua7b97hI48FKGLL +W8ASEQ+syRjLf6/y5U/grCwZnLTF8JtPAx50WwktjzU4so3+rX4j5tW87rO8Od02 +Q2zVVq7jhYw8cWvKY1DAUulRgUdOVpi51ZzDzy/G41qGeKSI4eRILig5sYkC2AQT +AQgBQgIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAIZARYhBC/qe9uR +cXCnuOcgAd8YeObZw7J/BQJhHpHxmxSAAAAAABIAgHByb29mQG1ldGFjb2RlLmJp +em1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENv +R1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5lPSRsSU1YUkUzMXJl +aG1iNWc1N2dRYmc4SjNya05aSkw1RXNlWjhuUWw1V3BzNBSAAAAAABIAGXByb29m +QG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkvFIAAAAAAEgAU +cHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQACgkQ3xh45tnD +sn8RvwwAj5KJJJey5gWntcEu3smb74+EyKlCG+80lxR4esKDiDqn/4iK411pjbjy +C4+WH4fvfqLuaDzmWNURnWi55XRPzN1tIXohrMUmF2NyyrIDVApeT1xbClC0L4Ub +KXVBYWTcDz7+OvSIgW86sueIRAhKG8VoAtnvjx6vm4mwkzk8S8GOxzCii/iRX7h9 +xXJuwaWZQ+aPvURHxh282BbHPt1DXGHUq9/dvN/XbV1qTo8CG+MNgXQdgpboJpk5 +mSYBTwg7zPwqKi/I+fnKUUfpxUF8ABDrpDikTqAmSOZH/74blRy8rW8a2T9Dq/F+ +x2KpSvqYxvy2bYbH4kQy8G62LuWS7E4xUHyf/PYyxK0BFLZI8jB7pnF8uV3vJhvO +UOO6VuP/kecgYC4UyYZXakHHyitLYjYgO2p2HHJKbYWMGVcPJo9uub7/TThFiJUb +eT6S3Uf6vPRKDUB9tAGl+E8Dszccsgz2f/vpK4lkR3zNWQdER3/k3txkHsgA1mAy +NN/VI0XViQI8BBMBCACmAhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA +AhkBFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmEekUkvFIAAAAAAEgAUcHJvb2ZA +bWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQ0FIAAAAAAEgAZcHJvb2ZA +bWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaQAKCRDfGHjm2cOy +f7WvC/0VcA2uaLpOpHkRQEJXY77z95DJrHzNK9kOHJOgOVTs1AOXuJSRnYdQ7/p2 +Du5NSuopD/xaFdE8dkWtahwXB7pPpACQAiGezPEZHeC8XqdmoI0iWvMdeMyq86Dx +yBNS4g9b+2/y9v9NEvrogp/OGay9s9/nfPoeoIn/TEy7FBlRzz5qw0aiJcFqynuL +olL/neDhPPYF/sFxAteOJzcztZsAxDQ3qNutGBnxMYXWv+EJSAO7Rwp/XnhEdzLX +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 +=jEmd +-----END PGP PUBLIC KEY BLOCK----- diff --git a/modules/home.legacy/conf/gtk/default.nix b/modules/home.legacy/conf/gtk/default.nix new file mode 100644 index 00000000..f5411369 --- /dev/null +++ b/modules/home.legacy/conf/gtk/default.nix @@ -0,0 +1,58 @@ +{ + config, + lib, + pkgs, + stdenv, + ... +}: { + gtk = { + enable = true; + theme = { + package = pkgs.nordic; + name = "Nordic"; + }; + cursorTheme = { + package = pkgs.nordzy-cursor-theme; + name = "Nordzy-cursors"; + }; + iconTheme = { + package = pkgs.nordzy-icon-theme; + name = "Nordzy-icon"; + }; + font = { + name = "Noto Sans"; + size = 10; + }; + gtk2 = { + configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; + # extraConfig = '' + # gtk-enable-animations=1 + # gtk-primary-button-warps-slider=0 + # gtk-toolbar-style=3 + # gtk-menu-images=1 + # gtk-button-images=1 + # + # ''; + }; + gtk3 = { + # extraConfig = '' + # gtk-button-images=true + # gtk-decoration-layout=icon:minimize,maximize,close + # gtk-enable-animations=true + # gtk-menu-images=true + # gtk-primary-button-warps-slider=false + # gtk-toolbar-style=3 + # #gtk-modules=window-decorations-gtk-module:colorreload-gtk-module + # ''; + extraCss = ""; + }; + gtk4 = { + # extraConfig = '' + # gtk-application-prefer-dark-theme=true + # gtk-decoration-layout=icon:minimize,maximize,close + # gtk-enable-animations=true + # gtk-primary-button-warps-slider=false + # ''; + }; + }; +} diff --git a/modules/home.legacy/conf/himalaya/default.nix b/modules/home.legacy/conf/himalaya/default.nix new file mode 100644 index 00000000..c072693e --- /dev/null +++ b/modules/home.legacy/conf/himalaya/default.nix @@ -0,0 +1,8 @@ +{...}: { + programs.himalaya = { + enable = true; + settings = { + # TODO: + }; + }; +} diff --git a/modules/home.legacy/conf/hyfetch/default.nix b/modules/home.legacy/conf/hyfetch/default.nix new file mode 100644 index 00000000..aec21dbc --- /dev/null +++ b/modules/home.legacy/conf/hyfetch/default.nix @@ -0,0 +1,20 @@ +{...}: { + programs.hyfetch = { + enable = true; + settings = { + preset = "rainbow"; + mode = "rgb"; + light_dark = "dark"; + lightness = 0.65; + color_align = { + mode = "horizontal"; + custom_colors = []; + fore_back = null; + }; + backend = "neofetch"; + distro = null; + pride_month_shown = []; + pride_month_disable = false; + }; + }; +} diff --git a/modules/home.legacy/conf/iamb/config.json b/modules/home.legacy/conf/iamb/config.json new file mode 100644 index 00000000..ca06d543 --- /dev/null +++ b/modules/home.legacy/conf/iamb/config.json @@ -0,0 +1,9 @@ +{ + "profiles": { + "soispha": { + "user_id": "@soispha:vhack.eu", + "url": "https://matrix.vhack.eu" + } + }, + "default_profile": "soispha" +} diff --git a/modules/home.legacy/conf/iamb/default.nix b/modules/home.legacy/conf/iamb/default.nix new file mode 100644 index 00000000..2a93472c --- /dev/null +++ b/modules/home.legacy/conf/iamb/default.nix @@ -0,0 +1,3 @@ +{...}: { + xdg.configFile."iamb/config.json".source = ./config.json; +} diff --git a/modules/home.legacy/conf/keepassxc/default.nix b/modules/home.legacy/conf/keepassxc/default.nix new file mode 100644 index 00000000..3ac82812 --- /dev/null +++ b/modules/home.legacy/conf/keepassxc/default.nix @@ -0,0 +1,7 @@ +{ + config, + pkgs, + ... +}: { + xdg.configFile."keepassxc/keepassxc.ini".source = ./keepassxc.ini; +} diff --git a/modules/home.legacy/conf/keepassxc/keepassxc.ini b/modules/home.legacy/conf/keepassxc/keepassxc.ini new file mode 100644 index 00000000..288a194b --- /dev/null +++ b/modules/home.legacy/conf/keepassxc/keepassxc.ini @@ -0,0 +1,58 @@ +[General] +AutoSaveAfterEveryChange=true +BackupBeforeSave=true +BackupFilePathPattern=/home/soispha/.local/share/keepassxc/{DB_FILENAME}.old.kdbx +ConfigVersion=2 +HideWindowOnCopy=false + +[Browser] +CustomProxyLocation= +Enabled=true + +[FdoSecrets] +Enabled=true + +[GUI] +AdvancedSettings=true +ApplicationTheme=dark +CompactMode=false +HidePasswords=true +ShowExpiredEntriesOnDatabaseUnlockOffsetDays=1 +TrayIconAppearance=monochrome-light + +[KeeShare] +Active="" +Own="" +QuietSuccess=true + +[PasswordGenerator] +AdditionalChars= +AdvancedMode=true +Braces=true +Dashes=true +EASCII=true +ExcludedChars= +Length=128 +Logograms=true +LowerCase=true +Math=true +Numbers=true +Punctuation=true +Quotes=true +SpecialChars=true +Type=0 +UpperCase=true +WordCount=4 +WordSeparator="," + +[SSHAgent] +Enabled=true + +[Security] +HidePasswordPreviewPanel=true +IconDownloadFallback=true +LockDatabaseIdle=false +LockDatabaseIdleSeconds=960 +PasswordEmptyPlaceholder=true +PasswordsHidden=true +PasswordsRepeatVisible=true diff --git a/modules/home.legacy/conf/latexindent/default.nix b/modules/home.legacy/conf/latexindent/default.nix new file mode 100644 index 00000000..0d776e14 --- /dev/null +++ b/modules/home.legacy/conf/latexindent/default.nix @@ -0,0 +1,8 @@ +{ + config, + pkgs, + ... +}: { + xdg.configFile."latexindent/indentconfig.yaml".source = ./indentconfig.yaml; + xdg.configFile."latexindent/mysettings.yaml".source = ./mysettings.yaml; +} diff --git a/modules/home.legacy/conf/latexindent/indentconfig.yaml b/modules/home.legacy/conf/latexindent/indentconfig.yaml new file mode 100644 index 00000000..d67351f3 --- /dev/null +++ b/modules/home.legacy/conf/latexindent/indentconfig.yaml @@ -0,0 +1,2 @@ +paths: +- /home/dt/.config/latexindent/mysettings.yaml diff --git a/modules/home.legacy/conf/latexindent/mysettings.yaml b/modules/home.legacy/conf/latexindent/mysettings.yaml new file mode 100644 index 00000000..9a0f8b2f --- /dev/null +++ b/modules/home.legacy/conf/latexindent/mysettings.yaml @@ -0,0 +1,672 @@ +# defaultSettings.yaml for latexindent.pl, version 3.19.1, 2022-12-04 +# a script that aims to +# beautify .tex, .sty, .cls files +# +# (or latexindent.exe if you're on Windows) +# +#--------------------------------------------------------------------------------------- +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# See http://www.gnu.org/licenses/. +# +# Chris Hughes, 2017 +# +# For all communication, please visit: https://github.com/cmhughes/latexindent.pl +# +#--------------------------------------------------------------------------------------- +# You should feel encouraged to change anything you like in these settings, but +# it would probably be better to have your own user settings +# files somewhere else - remember that this file may be overwritten +# when you update your tex distribution. Please see the manual linked from: +# +# https://github.com/cmhughes/latexindent.pl +# +# for details of how to create and configure your own settings files. +# +# Please read the manual (linked from above) first to understand what each switch does. +# +#--------------------------------------------------------------------------------------- + +# latexindent can be called to act on a file without using the file's extension, +# e.g, simply +# latexindent myfile +# in which case the choice of file extension is chosen +# according to the choices made in fileExtensionPreference +# Other file extensions can be added. +fileExtensionPreference: + .tex: 1 + .sty: 2 + .cls: 3 + .bib: 4 + +# default file extension of backup file (if -w switch is active) +# for example, if your .tex file is called +# myfile.tex +# and you specify the backupExtension as BACKUP.bak then your +# backup file will be +# myfileBACKUP.bak +backupExtension: .bak + +# only one backup per file: +# - if onlyOneBackUp is 0 then, as a safety measure, +# the number on the extension increments by 1 each time: +# +# myfile.bak0, myfile.bak1, myfile.bak2 +# - if you set onlyOnebackUp to 1, then the backup file will +# be overwritten each time (not recommended until you trust the script) +onlyOneBackUp: 0 + +# some users may want a finite number of backup files, +# say at most 3; in which case, they can change this maxNumberOfBackUps. +# +# If maxNumberOfBackUps is set to 0 (or less) then infinitely +# many backups are possible, unless onlyOneBackUp is switched on +maxNumberOfBackUps: 0 + +# some users may wish to cycle through back up files. +# +# for example, with maxNumberOfBackUps: 4, they may +# wish to delete the oldest back up file, and keep only the most recent. +# +# copy myfile.bak1 to myfile.bak0 +# copy myfile.bak2 to myfile.bak1 +# copy myfile.bak3 to myfile.bak2 +# copy myfile.bak4 to myfile.bak3 +# +# the back up will be written to myfile.bak4 +cycleThroughBackUps: 0 + +# preferences for information displayed in the log file +logFilePreferences: + showEveryYamlRead: 1 + showAmalgamatedSettings: 0 + showDecorationStartCodeBlockTrace: 0 + showDecorationFinishCodeBlockTrace: 0 + endLogFileWith: '--------------' + showGitHubInfoFooter: 1 + Dumper: + Terse: 1 + Indent: 1 + Useqq: 1 + Deparse: 1 + Quotekeys: 0 + Sortkeys: 1 + Pair: " => " + +# verbatim environments specified +# in this field will not be changed at all! +verbatimEnvironments: + verbatim: 1 + lstlisting: 1 + minted: 1 + +# verbatim commands such as \verb! body !, \lstinline$something else$ +verbatimCommands: + verb: 1 + lstinline: 1 + +# no indent blocks (not necessarily verbatim +# environments) which are marked as %\begin{noindent} +# or anything else that you detail in the following +noIndentBlock: + noindent: 1 + cmhtest: 1 + +# \begin{document} and \end{document} are treated differently +# by latexindent within filecontents environments +fileContentsEnvironments: + filecontents: 1 + filecontents*: 1 + +# indent preamble +indentPreamble: 1 + +# assume no preamble in cls, sty, by default +lookForPreamble: + .tex: 1 + .sty: 0 + .cls: 0 + .bib: 0 + +# some preambles can contain \begin and \end statements +# that are not in their 'standard environment block', for example, +# consider the following key = values: +# preheadhook={\begin{mdframed}[style=myframedstyle]}, +# postfoothook=\end{mdframed}, +preambleCommandsBeforeEnvironments: 0 + +# default value of indentation +defaultIndent: " " + +# remove trailing whitespace from all lines +removeTrailingWhitespace: + beforeProcessing: 0 + afterProcessing: 1 + +# name of code blocks that should have their body aligned at ampersand delimiters +lookForAlignDelims: + tabular: + delims: 1 + alignDoubleBackSlash: 1 + spacesBeforeDoubleBackSlash: 1 + multiColumnGrouping: 0 + alignRowsWithoutMaxDelims: 1 + spacesBeforeAmpersand: 1 + spacesAfterAmpersand: 1 + justification: left + alignFinalDoubleBackSlash: 0 + dontMeasure: 0 + delimiterRegEx: '(?]*?>)' + keyEqualsValuesBracesBrackets: + name: '[a-zA-Z@\*0-9_\/.:\#-]+[a-zA-Z@\*0-9_\/.\h\{\}:\#-]*?' + follow: '(?:(?<]+?' + follow: '\h|\R|\{|\[|\$|\)|\(' + UnNamedGroupingBracesBrackets: + follow: '\{|\[|,|&|\)|\(|\$' + arguments: + before: '(?:#\d\h*;?,?\/?)+|\<.*?\>' + between: '_|\^|\*' + trailingComments: + notPreceededBy: '(? goto-end +> goto-end +\ke goto-end +\eG goto-end-buffered += status +ˆG status +:f status +/ forw-search +? back-search +\e/ forw-search * +\e? back-search * +l repeat-search +\el repeat-search-all +L reverse-search +\eL reverse-search-all +& filter +m set-mark +M set-mark-bottom +\em clear-mark +' goto-mark +ˆXˆX goto-mark +E examine +:e examine +ˆXˆV examine +:n next-file +:p prev-file +j next-tag +J prev-tag +:x index-file +:d remove-file +- toggle-option +:t toggle-option t +s toggle-option o + ## Use a long option name by starting the + ## extra string with ONE dash; eg: + ## s toggle-option -log-file\n +_ display-option +| pipe +v visual +! shell +# pshell ++ firstcmd +H help +h help +V version +0 digit +1 digit +2 digit +3 digit +4 digit +5 digit +6 digit +7 digit +8 digit +9 digit +q quit +Q quit +:q quit +:Q quit +ZZ quit + +# Stop processing (and ignore less' default values) +# (// FIXME: This stopped working and thus we just comment it out <2024-08-03> ) +# stop diff --git a/modules/home.legacy/conf/less/default.nix b/modules/home.legacy/conf/less/default.nix new file mode 100644 index 00000000..9991ebef --- /dev/null +++ b/modules/home.legacy/conf/less/default.nix @@ -0,0 +1,18 @@ +{config, ...}: { + home.sessionVariables = { + PAGER = "less"; + MANPAGER = "less --color=d+r --color=u+b"; + + # These are added here because adding them in the lesskey file somehow doesn't work. + LESSHISTSIZE = 10000; + LESSHISTFILE = "${config.xdg.dataHome}/less/history"; + }; + + programs.less = { + enable = true; + keys = + builtins.readFile ./command.less + + builtins.readFile ./line-edit.less + + builtins.readFile ./env.less; + }; +} diff --git a/modules/home.legacy/conf/less/env.less b/modules/home.legacy/conf/less/env.less new file mode 100644 index 00000000..30f7645d --- /dev/null +++ b/modules/home.legacy/conf/less/env.less @@ -0,0 +1,2 @@ +#env +LESS = -R --use-color --incsearch --modelines=2 --save-marks --wordwrap --status-line diff --git a/modules/home.legacy/conf/less/line-edit.less b/modules/home.legacy/conf/less/line-edit.less new file mode 100644 index 00000000..a7e889db --- /dev/null +++ b/modules/home.legacy/conf/less/line-edit.less @@ -0,0 +1,29 @@ +#line-edit +\t forw-complete +\17 back-complete +\e\t back-complete +ˆL expand +ˆV literal +ˆA literal +\es right +\kr right +\eh left +\kl left +\eb word-left +\e\kl word-left +\ew word-right +\e\kr word-right +\ei insert +\ex delete +\kx delete +\eX word-delete +\ekx word-delete +\e\b word-backspace +\e0 home +\kh home +\e$ end +\ke end +\en up +\ku up +\et down +ˆG abort diff --git a/modules/home.legacy/conf/lf/colors b/modules/home.legacy/conf/lf/colors new file mode 100644 index 00000000..1c2853ec --- /dev/null +++ b/modules/home.legacy/conf/lf/colors @@ -0,0 +1,184 @@ +# vim:ft=dircolors +# (This is not a dircolors file but it helps to highlight colors and comments) + +# default values from dircolors +# (entries with a leading # are not implemented in lf) +# #no 00 # NORMAL +# fi 00 # FILE +# #rs 0 # RESET +# di 01;34 # DIR +# ln 01;36 # LINK +# #mh 00 # MULTIHARDLINK +# pi 40;33 # FIFO +# so 01;35 # SOCK +# #do 01;35 # DOOR +# bd 40;33;01 # BLK +# cd 40;33;01 # CHR +# or 40;31;01 # ORPHAN +# #mi 00 # MISSING +# su 37;41 # SETUID +# sg 30;43 # SETGID +# #ca 30;41 # CAPABILITY +# tw 30;42 # STICKY_OTHER_WRITABLE +# ow 34;42 # OTHER_WRITABLE +# st 37;44 # STICKY +# ex 01;32 # EXEC + +# default values from lf (with matching order) +# ln 01;36 # LINK +# or 31;01 # ORPHAN +# tw 01;34 # STICKY_OTHER_WRITABLE +# ow 01;34 # OTHER_WRITABLE +# st 01;34 # STICKY +# di 01;34 # DIR +# pi 33 # FIFO +# so 01;35 # SOCK +# bd 33;01 # BLK +# cd 33;01 # CHR +# su 01;32 # SETUID +# sg 01;32 # SETGID +# ex 01;32 # EXEC +# fi 00 # FILE + + +# file types (with matching order) +ln 01;93 # LINK +or 01;93;106 # ORPHAN +tw 35 # STICKY_OTHER_WRITABLE +ow 35 # OTHER_WRITABLE +st 01;96 # STICKY +di 01;36 # DIR +pi 33 # FIFO +so 01;35 # SOCK +bd 33;01 # BLK +cd 33;01 # CHR +su 01;32 # SETUID +sg 01;32 # SETGID +ex 03;01;95 # EXEC +fi 00 # FILE + +# links to hide +~/.mozilla 01;08;30 +~/.ssh 01;08;30 +~/.zshenv 01;08;30 + +~/.steampid 01;08;30 +~/.steam 01;08;30 +~/.steampath 01;08;30 + +# archives or compressed (dircolors defaults) +*.tar 01;31 +*.tgz 01;31 +*.arc 01;31 +*.arj 01;31 +*.taz 01;31 +*.lha 01;31 +*.lz4 01;31 +*.lzh 01;31 +*.lzma 01;31 +*.tlz 01;31 +*.txz 01;31 +*.tzo 01;31 +*.t7z 01;31 +*.zip 01;31 +*.z 01;31 +*.dz 01;31 +*.gz 01;31 +*.lrz 01;31 +*.lz 01;31 +*.lzo 01;31 +*.xz 01;31 +*.zst 01;31 +*.tzst 01;31 +*.bz2 01;31 +*.bz 01;31 +*.tbz 01;31 +*.tbz2 01;31 +*.tz 01;31 +*.deb 01;31 +*.rpm 01;31 +*.jar 01;31 +*.war 01;31 +*.ear 01;31 +*.sar 01;31 +*.rar 01;31 +*.alz 01;31 +*.ace 01;31 +*.zoo 01;31 +*.cpio 01;31 +*.7z 01;31 +*.rz 01;31 +*.cab 01;31 +*.wim 01;31 +*.swm 01;31 +*.dwm 01;31 +*.esd 01;31 + +# image formats (dircolors defaults) +*.jpg 01;35 +*.jpeg 01;35 +*.mjpg 01;35 +*.mjpeg 01;35 +*.gif 01;35 +*.bmp 01;35 +*.pbm 01;35 +*.pgm 01;35 +*.ppm 01;35 +*.tga 01;35 +*.xbm 01;35 +*.xpm 01;35 +*.tif 01;35 +*.tiff 01;35 +*.png 01;35 +*.svg 01;35 +*.svgz 01;35 +*.mng 01;35 +*.pcx 01;35 +*.mov 01;35 +*.mpg 01;35 +*.mpeg 01;35 +*.m2v 01;35 +*.mkv 01;35 +*.webm 01;35 +*.ogm 01;35 +*.mp4 01;35 +*.m4v 01;35 +*.mp4v 01;35 +*.vob 01;35 +*.qt 01;35 +*.nuv 01;35 +*.wmv 01;35 +*.asf 01;35 +*.rm 01;35 +*.rmvb 01;35 +*.flc 01;35 +*.avi 01;35 +*.fli 01;35 +*.flv 01;35 +*.gl 01;35 +*.dl 01;35 +*.xcf 01;35 +*.xwd 01;35 +*.yuv 01;35 +*.cgm 01;35 +*.emf 01;35 +*.ogv 01;35 +*.ogx 01;35 + +# audio formats (dircolors defaults) +*.aac 00;36 +*.au 00;36 +*.flac 00;36 +*.m4a 00;36 +*.mid 00;36 +*.midi 00;36 +*.mka 00;36 +*.mp3 00;36 +*.mpc 00;36 +*.ogg 00;36 +*.ra 00;36 +*.wav 00;36 +*.oga 00;36 +*.opus 00;36 +*.spx 00;36 +*.xspf 00;36 diff --git a/modules/home.legacy/conf/lf/commands/default.nix b/modules/home.legacy/conf/lf/commands/default.nix new file mode 100644 index 00000000..933769ac --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/default.nix @@ -0,0 +1,227 @@ +{ + pkgs, + sysLib, + shell_library, + system, + ... +}: let + functionCall = { + name, + dependencies, + replacementStrings, + ... + }: + sysLib.writeShellScript { + inherit name; + src = ./scripts/${name}.sh; + keepPath = true; + dependencies = dependencies ++ (builtins.attrValues {inherit (pkgs) dash coreutils;}); + inherit replacementStrings; + } + + "/bin/${name}"; + + shell = { + name, + dependencies, + replacementStrings ? null, + ... + }: '' + ''${{ + ${functionCall {inherit name dependencies replacementStrings;}} + }} + ''; # closes the lf tui + pipe = { + name, + dependencies, + replacementStrings ? null, + ... + }: '' + %{{ + ${functionCall {inherit name dependencies replacementStrings;}} + }} + ''; # runs the command in the ui/term bar + async = { + name, + dependencies, + replacementStrings ? null, + ... + }: '' + &{{ + ${functionCall {inherit name dependencies replacementStrings;}} + }} + ''; # runs the command in the background + wait = { + name, + dependencies, + replacementStrings ? null, + ... + }: '' + !{{ + ${functionCall {inherit name dependencies replacementStrings;}} + }} + ''; # adds a prompt after the command has run +in { + archive = shell { + name = "archive"; + dependencies = builtins.attrValues { + inherit + (pkgs) + fzf + gnutar + xz + p7zip + zip + ; + }; + }; + broot_jump = shell { + name = "broot_jump"; + dependencies = builtins.attrValues { + inherit (pkgs) broot; + }; + }; + chmod = pipe { + name = "chmod"; + dependencies = []; + }; + clear_trash = shell { + name = "clear_trash"; + dependencies = builtins.attrValues { + inherit + (pkgs) + fzf + trashy + ; + }; + }; + dl_file = pipe { + name = "dl_file"; + dependencies = builtins.attrValues { + inherit + (pkgs) + xdragon + curl + ; + }; + }; + dragon = pipe { + name = "dragon"; + dependencies = builtins.attrValues { + inherit + (pkgs) + xdragon + ; + }; + }; + dragon_individual = pipe { + name = "dragon_individual"; + dependencies = builtins.attrValues { + inherit + (pkgs) + xdragon + ; + }; + }; + dragon_stay = pipe { + name = "dragon_stay"; + dependencies = builtins.attrValues { + inherit + (pkgs) + xdragon + ; + }; + }; + execute = shell { + name = "execute"; + dependencies = []; + }; + follow_link = pipe { + name = "follow_link"; + dependencies = with pkgs; [lf]; + }; + fzf_jump = shell { + name = "fzf_jump"; + dependencies = builtins.attrValues { + inherit (pkgs) fzf lf gnused; + }; + }; + mk_dir = pipe { + name = "mk_dir"; + dependencies = []; + }; + mk_file = shell { + name = "mk_file"; + dependencies = []; + }; + mk_file_and_edit = shell { + name = "mk_file_and_edit"; + dependencies = []; + }; + mk_ln = pipe { + name = "mk_ln"; + dependencies = []; + }; + mk_scr_default = shell { + name = "mk_scr_default"; + dependencies = builtins.attrValues {}; + replacementStrings = { + SHELL_LIBRARY_TEMPLATE = "${shell_library.rawTemplate."${system}"}"; + }; + }; + mk_scr_temp = shell { + name = "mk_scr_temp"; + dependencies = builtins.attrValues {}; + replacementStrings = { + SHELL_LIBRARY_TEMPLATE = "${shell_library.rawTemplate."${system}"}"; + TO_BE_SHELL_LIBRARY_PATH = "%SHELL_LIBRARY_PATH"; # replacement is not recursive + }; + }; + view_file = async { + name = "view_file"; + dependencies = builtins.attrValues {inherit (pkgs) file;}; + }; + go_project_base_directory = async { + name = "go_project_root"; + dependencies = []; + }; + restore_trash = shell { + name = "restore_trash"; + dependencies = builtins.attrValues { + inherit + (pkgs) + fzf + trashy + ; + }; + }; + set_wall_paper = pipe { + name = "set_wall_paper"; + dependencies = []; + }; + stripspace = pipe { + name = "stripspace"; + dependencies = []; + }; + trash = pipe { + name = "trash"; + dependencies = builtins.attrValues { + inherit + (pkgs) + trashy + trash-cli + findutils + ; + }; + }; + unarchive = pipe { + name = "unarchive"; + dependencies = builtins.attrValues { + inherit + (pkgs) + gnutar + unzip + p7zip + ; + }; + }; +} diff --git a/modules/home.legacy/conf/lf/commands/scripts/archive.sh b/modules/home.legacy/conf/lf/commands/scripts/archive.sh new file mode 100755 index 00000000..25f40534 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/archive.sh @@ -0,0 +1,77 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# Option '-f' disables pathname expansion which can be useful when $f, $fs, and +# $fx variables contain names with '*' or '?' characters. However, this option +# is used selectively within individual commands as it can be limiting at +# times. +set -f + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" + +archivers="$(tmp echo gzip xz 7z zip)" +archiver="$(awk '{for (i=1; i<=NF; i++) print $i}' "$archivers" | fzf)" + +case "$archiver" in +"gzip") + ext=tar.gz + ;; +"xz") + ext=tar.xz + ;; +"7z") + ext=7z + ;; +"zip") + ext=zip + ;; +esac + +prompt "Archive name: " +name="" +while [ -z "$name" ] || [ -e "$name" ]; do + read -r name_base + name="$name_base.$ext" + if [ -e "$name" ]; then + prompt "Archive already exists, overwrite [y|N]: " + read -r ans + + if [ "$ans" = "y" ]; then + break + else + prompt "Archive name: " + fi + fi +done + +root="$(if [ "$(pwd)" = "/" ]; then pwd; else echo "$(pwd)/"; fi)" + +# fx contains all selected file name separated by a newline +while read -r raw_file; do + file="$(echo "$raw_file" | sed "s|$root||")" + set -- "$@" "$file" +done <"$(tmp echo "$fx")" + +case "$archiver" in +"gzip") + tar --create --gzip -file="$name" "$@" + ;; +"xz") + tar --create --file="$name" "$@" + xz --compress -9 --extreme --threads=0 "$name" + ;; +"7z") + 7z a "$name" "$@" + ;; +"zip") + zip --symlinks -9 -r "$name" "$@" + ;; +esac +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/broot_jump.sh b/modules/home.legacy/conf/lf/commands/scripts/broot_jump.sh new file mode 100755 index 00000000..8f40ba01 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/broot_jump.sh @@ -0,0 +1,25 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +tmp=$(mktmp) +res="$(broot --outcmd "$tmp" && sed 's/cd //' "$tmp")" + +if [ -f "$res" ]; then + cmd="select" +elif [ -d "$res" ]; then + cmd="cd" +fi + +lf -remote "send '$id' '$cmd' '$res'" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/chmod.sh b/modules/home.legacy/conf/lf/commands/scripts/chmod.sh new file mode 100755 index 00000000..9859127b --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/chmod.sh @@ -0,0 +1,24 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +readp "Mode bits: " bits +# shellcheck disable=SC2269 +bits="$bits" + +while read -r file; do + chmod "$bits" "$file" +done <"$(tmp echo "$fx")" + +lf -remote 'send reload' +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/clear_trash.sh b/modules/home.legacy/conf/lf/commands/scripts/clear_trash.sh new file mode 100755 index 00000000..9052bb5f --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/clear_trash.sh @@ -0,0 +1,8 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# could also use --force, for instand removal +trash list | fzf --multi | awk '{print $NF}' | xargs trash empty --match=exact +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/cow_cp.sh b/modules/home.legacy/conf/lf/commands/scripts/cow_cp.sh new file mode 100755 index 00000000..98675b9e --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/cow_cp.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +# source: https://github.com/gokcehan/lf/wiki/Tips#use-copy-on-write-when-possible +# +# # FIXME: Add this. The hardest part is in checking, if a file can be reflinked, as fuse and bind mount are hard to +# backtrack <2023-08-29> + +# # This was very helpful for debugging: +# log_file="$HOME/lf-reflink-log-$(date +'%Y-%m-%d_%H-%M-%S')" +# [ -f "$log_file" ] || touch "$log_file" +# exec 1>> $log_file 2>&1 +# set -x + +# In theory, this may fail, +# but I tested it on selection with 10k files - everything worked (bash) +# FIXME: This will very likely fail on dash, when the file number > 255 <2023-08-29> +set -- "$(cat ~/.local/share/lf/files)" + +mode="$1" +shift + +if [ "$mode" = 'copy' ]; then + # Reflink if all items of selection and the destination are on the + # same mount point and it is CoW fs. + # (to make sure reflink never fails in first place, so we don't have to + # clean up) + + src_targets="$(df --output=target -- "$@" | sed '1d' | sort -u)" + + if [ "$(df --output=target -- "$PWD" | tail -n 1)" = \ + "$(echo "$src_targets" | tail -n 1)" ] && + (("$(echo "$src_targets" | wc -l)" == 1)) && + [[ "$(df --output=fstype -- "$PWD" | tail -n 1)" =~ ^(btrfs|xfs|zfs)$ ]]; then + + echo 'selected copy and cp reflink paste' + + start=$(date '+%s') + + # Handle same names in dst + # TODO parallelism, idk - but exit/return/break won't stop the loop from subshell... + for i in "$@"; do + name="${i##*/}" + original="$name" + + count=0 + while [ -w "$PWD/$name" ]; do + count=$((count + 1)) + name="$original.~$count~" + done + + set +e + cp_out="$(cp -rn --reflink=always -- "$i" "$PWD/$name" 2>&1)" + set -e + + if [ -n "$cp_out" ]; then + lf -remote "send $id echoerr $cp_out" + exit 0 + fi + done + + finish=$(($(date '+%s') - start)) + t='' + if ((finish > 2)); then + t="${finish}s" + fi + + # Or just skip a file when names are the same. + # (A LOT faster if you e.g. pasting selection of 10k files) + # cp -rn --reflink=always -- "$@" . + + lf -remote "send clear" + + green=$'\u001b[32m' + reset=$'\u001b[0m' + lf -remote "send $id echo ${green}reflinked!${reset} $t" + else + echo 'selected copy and lf native paste' + lf -remote "send $id paste" + lf -remote "send clear" + fi + +elif [ "$mode" = 'move' ]; then + echo 'selected move and lf native paste' + lf -remote "send $id paste" + lf -remote "send clear" +fi + +# # for debug +# set +x + +lf -remote "send load" + +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/dl_file.sh b/modules/home.legacy/conf/lf/commands/scripts/dl_file.sh new file mode 100755 index 00000000..c7e3d8b2 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/dl_file.sh @@ -0,0 +1,43 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +# Provides the ability to download a file by dropping it into a window + +url="$(dragon -t -x)" + +if [ -n "$url" ]; then + prompt "File Name: " + name="" + while [ -z "$name" ] || [ -e "$name" ]; do + read -r name + if [ -e "$name" ]; then + prompt "File already exists, overwrite [y|N]: " + read -r ans + + if [ "$ans" = "y" ]; then + break + else + prompt "File Name: " + fi + fi + done + + # Download the file with curl + if [ -n "$name" ]; then + curl -o "$name" "$url" || die "curl failed" + fi +else + die "URL is null!" +fi +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/dragon.sh b/modules/home.legacy/conf/lf/commands/scripts/dragon.sh new file mode 100755 index 00000000..cf3c3176 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/dragon.sh @@ -0,0 +1,20 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +while read -r file; do + set -- "$@" "$file" +done <"$(tmp echo "$fx")" + +dragon -a -x "$@" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/dragon_individual.sh b/modules/home.legacy/conf/lf/commands/scripts/dragon_individual.sh new file mode 100755 index 00000000..2465cdfa --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/dragon_individual.sh @@ -0,0 +1,20 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +while read -r file; do + set -- "$@" "$file" +done <"$(tmp echo "$fx")" + +dragon "$@" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/dragon_stay.sh b/modules/home.legacy/conf/lf/commands/scripts/dragon_stay.sh new file mode 100755 index 00000000..066b4c75 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/dragon_stay.sh @@ -0,0 +1,20 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +while read -r file; do + set -- "$@" "$file" +done <"$(tmp echo "$fx")" + +dragon -a "$@" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/execute.sh b/modules/home.legacy/conf/lf/commands/scripts/execute.sh new file mode 100755 index 00000000..aa97fd7f --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/execute.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +dir="$(realpath "$f")" + +"$dir" + +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/follow_link.sh b/modules/home.legacy/conf/lf/commands/scripts/follow_link.sh new file mode 100755 index 00000000..80413990 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/follow_link.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +dir="$(realpath "$f")" + +lf -remote "send $id cd \"$dir\"" + +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/fzf_jump.sh b/modules/home.legacy/conf/lf/commands/scripts/fzf_jump.sh new file mode 100755 index 00000000..ad1633fb --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/fzf_jump.sh @@ -0,0 +1,24 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +res="$(fd . --maxdepth 3 | fzf --header='Jump to location')" + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +if [ -f "$res" ]; then + cmd="select" +elif [ -d "$res" ]; then + cmd="cd" +fi + +lf -remote "send $id $cmd \"$res\"" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/go_project_root.sh b/modules/home.legacy/conf/lf/commands/scripts/go_project_root.sh new file mode 100755 index 00000000..5f7746d3 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/go_project_root.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +flake_base_dir="$(search_flake_base_dir)" +if [ "$flake_base_dir" ]; then + lf -remote "send $id cd $flake_base_dir" || die "Bug: No base dir ($flake_base_dir)" +else + die "Unable to locate base dir" +fi + +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/mk_dir.sh b/modules/home.legacy/conf/lf/commands/scripts/mk_dir.sh new file mode 100755 index 00000000..150f7eed --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/mk_dir.sh @@ -0,0 +1,32 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +prompt "Directory Name: " +name="" +while [ -z "$name" ] || [ -e "$name" ]; do + read -r name + if [ -e "$name" ]; then + prompt "Directory already exists, overwrite [y|N]: " + read -r ans + + if [ "$ans" = "y" ]; then + break + else + prompt "Directory Name: " + fi + fi +done + +mkdir "$name" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/mk_file.sh b/modules/home.legacy/conf/lf/commands/scripts/mk_file.sh new file mode 100755 index 00000000..41d5cf1a --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/mk_file.sh @@ -0,0 +1,32 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +prompt "File name: " +name="" +while [ -z "$name" ] || [ -e "$name" ]; do + read -r name + if [ -e "$name" ]; then + prompt "File already exists, overwrite [y|N]: " + read -r ans + + if [ "$ans" = "y" ]; then + break + else + prompt "File name: " + fi + fi +done + +touch "$name" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/mk_file_and_edit.sh b/modules/home.legacy/conf/lf/commands/scripts/mk_file_and_edit.sh new file mode 100755 index 00000000..19fc51db --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/mk_file_and_edit.sh @@ -0,0 +1,33 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +prompt "File name: " +name="" +while [ -z "$name" ] || [ -e "$name" ]; do + read -r name + if [ -e "$name" ]; then + prompt "File already exists, overwrite [y|N]: " + read -r ans + + if [ "$ans" = "y" ]; then + break + else + prompt "File name: " + fi + fi +done + +touch "$name" +"$EDITOR" "$name" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/mk_ln.sh b/modules/home.legacy/conf/lf/commands/scripts/mk_ln.sh new file mode 100755 index 00000000..7fab8e22 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/mk_ln.sh @@ -0,0 +1,45 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +while IFS= read -r i; do + set -- "$@" "$i" +done <"$HOME"/.local/share/lf/files + +mode="$1" +shift + +if [ "$#" -eq 0 ]; then + msg "no files to link" + exit 0 +fi + +case "$mode" in +copy) + while [ "$#" -gt 0 ]; do + file="$1" + ans="$(basename "$file")" + + while [ -e "$ans" ]; do + prompt "$ans already exists, new name for link: " + read -r ans + done + + ln --symbolic --relative "$file" "$(pwd)/$ans" + shift + done + ;; +esac +rm ~/.local/share/lf/files +# lf -remote "send clear" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/mk_scr_default.sh b/modules/home.legacy/conf/lf/commands/scripts/mk_scr_default.sh new file mode 100755 index 00000000..47d05080 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/mk_scr_default.sh @@ -0,0 +1,38 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +prompt "Script name: " +name="" +while [ -z "$name" ] || [ -e "$name" ]; do + read -r name_base + name="$name_base.sh" + if [ -e "$name" ]; then + prompt "Script already exists, overwrite [y|N]: " + read -r ans + + if [ "$ans" = "y" ]; then + break + else + prompt "Script Name: " + fi + fi +done + +script="$(pwd)"/"$name" + +cat "%SHELL_LIBRARY_TEMPLATE" >"$script" +chmod +x "$script" +"$VISUAL" "$script" + +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/mk_scr_temp.sh b/modules/home.legacy/conf/lf/commands/scripts/mk_scr_temp.sh new file mode 100755 index 00000000..512b5d0b --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/mk_scr_temp.sh @@ -0,0 +1,38 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +prompt "Script name: " +name="" +while [ -z "$name" ] || [ -e "$name" ]; do + read -r name + if [ -e "$name" ]; then + prompt "Script already exists, overwrite [y|N]: " + read -r ans + + if [ "$ans" = "y" ]; then + break + else + prompt "Script Name: " + fi + fi +done + +script="$(pwd)"/"$name" + +sed 's|%TO_BE_SHELL_LIBRARY_PATH|%SHELL_LIBRARY_PATH|' "%SHELL_LIBRARY_TEMPLATE" >"$script" +sed -i 's|dash|sh|' "$script" +chmod +x "$script" +"$VISUAL" "$script" + +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/restore_trash.sh b/modules/home.legacy/conf/lf/commands/scripts/restore_trash.sh new file mode 100755 index 00000000..b4ef492f --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/restore_trash.sh @@ -0,0 +1,16 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +trash list | fzf --multi | awk '{print $NF}' | xargs trash restore --match=exact +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/set_wall_paper.sh b/modules/home.legacy/conf/lf/commands/scripts/set_wall_paper.sh new file mode 100755 index 00000000..2e607d33 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/set_wall_paper.sh @@ -0,0 +1,19 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +die "No yet implemented" # TODO: do what the 'die' says +#sed -i "s,export AWMWALLPAPER='.*',export AWMWALLPAPER='${f}'," ${ZDOTDIR}/.zshenv +#nohub swaybg -i "$f" +#feh --bg-max --no-fehbg "$f" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/stripspace.sh b/modules/home.legacy/conf/lf/commands/scripts/stripspace.sh new file mode 100755 index 00000000..33b1cbcf --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/stripspace.sh @@ -0,0 +1,40 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +files=$(mktmp) +echo "$fx" >"$files" + +awk_source=$(mktmp) +cat <"$awk_source" +BEGIN {FS=" "} +{for (i=1; i != NF + 1; i++) + if (i == NF) { + parts[i]=tolower(\$i); + } else { + parts[i]=tolower(\$i"_"); + } +} +END {for (i in parts) printf parts[i]} +OFT + +while read -r file; do + dirty_name=$(mktmp) + basename "$file" >"$dirty_name" + clean_name=$(awk -f "$awk_source" "$dirty_name") + + [ -e "$clean_name" ] && die "file \"$clean_name\" already exists!" + mv "$(cat "$dirty_name")" "$clean_name" || die "Move failed" + lf -remote 'send reload' +done <"$files" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/trash.sh b/modules/home.legacy/conf/lf/commands/scripts/trash.sh new file mode 100755 index 00000000..f4878c49 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/trash.sh @@ -0,0 +1,37 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +trash_output=$(mktmp) +expected_error_output=$(mktmp) + +while read -r file; do + set -- "$@" "$file" +done <"$(tmp echo "$fx")" + +# TODO: why are we using trashy at all, when trash-cli can do everything? +# +# try trashy first, through nix because both trashy and trash-cli provide a trash command, which conflicts +nix run nixpkgs#trashy -- put "$@" 2>"$trash_output" + +# FIXME: Find a way, that does not depend on parsing an error message <2023-08-29> +cat <"$expected_error_output" +error: Error during a \`trash\` operation: Unknown { description: "Path: '\"/.Trash-1000\"'. Message: Permission denied (os error 13)" } +EOF + +if [ "$(cat "$expected_error_output")" = "$(cat "$trash_output")" ]; then + warning "Deleting with trash-cli to the /.Trash folder" + # this file could not be trashed because it is on the tempfs volume, trash-cli can do this this + trash-put "$@" +fi +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/unarchive.sh b/modules/home.legacy/conf/lf/commands/scripts/unarchive.sh new file mode 100755 index 00000000..d4835f6b --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/unarchive.sh @@ -0,0 +1,36 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" +# shellcheck disable=SC2269 +id="$id" + +# extract the current file with the right command +# (xkcd link: https://xkcd.com/1168/) +set -f + +unarchive() { + case "$1" in + *.tar.bz | *.tar.bz2 | *.tbz | *.tbz2) tar xjvf "$1" ;; + *.tar.gz | *.tgz) tar xzvf "$1" ;; + *.tar.xz | *.txz) tar xJvf "$1" ;; + *.zip) unzip "$1" ;; + *.rar) + die "rar is a unfree format!" + ;; + *.7z) 7z x "$1" ;; + *) die "Unsupported format" ;; + esac +} + +while read -r file; do + unarchive "$file" +done <"$fx" +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/commands/scripts/view_file.sh b/modules/home.legacy/conf/lf/commands/scripts/view_file.sh new file mode 100755 index 00000000..6258d755 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/view_file.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" + +mime_type="$(file --mime-type --brief --dereference "$f")" +case "$mime_type" in +application/pdf) + "$READER" "$f" + ;; +image/*) + "$IVIEWER" "$f" + ;; +*) + die "Mime-Type: '$mime_type' not supported" + ;; +esac + +# vim: ft=sh diff --git a/modules/home.legacy/conf/lf/default.nix b/modules/home.legacy/conf/lf/default.nix new file mode 100644 index 00000000..7b604ed0 --- /dev/null +++ b/modules/home.legacy/conf/lf/default.nix @@ -0,0 +1,59 @@ +{ + pkgs, + sysLib, + nixosConfig, + shell_library, + system, + ... +}: let + commands = import ./commands {inherit pkgs sysLib shell_library system;}; + keybindings = import ./keybindings {inherit nixosConfig;}; +in { + xdg.configFile."lf/icons".source = ./icons; + xdg.configFile."lf/colors".source = ./colors; + + # TODO: add the systemd tempfile option here + + programs.lf = { + enable = true; + + inherit commands keybindings; + + previewer = { + keybinding = "i"; + source = "${pkgs.ctpv}/bin/ctpv"; + }; + settings = { + # close the server, after the last client exits + autoquit = true; + + # disable the cusor in the preview pane + cursorpreviewfmt = ""; + + # preview for directories + # dirpreviews = true; + + # count things in directories + dircounts = true; + + drawbox = true; + + # errorfmt = "\\033[1;91m==> ERROR:\\033[0m\\033[1;93m%s\\033[0m"; + errorfmt = "\\033[1;91m%s\\033[0m"; + hidden = true; # show hidden files + icons = true; + ifs = "\\n"; # internal field separator for shell commands + #info = "size"; # show the size of a directory + shell = "sh"; + shellopts = "-eu"; # e: exit on error; u: error for unset variables + }; + # TODO: remove auto quit, if it has been added + extraConfig = '' + &${pkgs.ctpv}/bin/ctpv -s $id + cmd on-quit %${pkgs.ctpv}/bin/ctpv -e $id + set cleaner ${pkgs.ctpv}/bin/ctpvclear + + source ${nixosConfig.age.secrets.lf_cd_paths.path} + ''; + }; +} diff --git a/modules/home.legacy/conf/lf/icons b/modules/home.legacy/conf/lf/icons new file mode 100644 index 00000000..9047fbfb --- /dev/null +++ b/modules/home.legacy/conf/lf/icons @@ -0,0 +1,360 @@ +# vim:ft=conf + +# These examples require Nerd Fonts or a compatible font to be used. +# See https://www.nerdfonts.com for more information. + +# default values from lf (with matching order) +# ln l # LINK +# or l # ORPHAN +# tw t # STICKY_OTHER_WRITABLE +# ow d # OTHER_WRITABLE +# st t # STICKY +# di d # DIR +# pi p # FIFO +# so s # SOCK +# bd b # BLK +# cd c # CHR +# su u # SETUID +# sg g # SETGID +# ex x # EXEC +# fi - # FILE + +# file types (with matching order) +ln  # LINK +or  # ORPHAN +tw t # STICKY_OTHER_WRITABLE +ow  # OTHER_WRITABLE +st t # STICKY +di  # DIR +pi p # FIFO +so s # SOCK +bd b # BLK +cd c # CHR +su u # SETUID +sg g # SETGID +ex  # EXEC +fi  # FILE + +# file extensions (vim-devicons) +*.styl  +*.sass  +*.scss  +*.htm  +*.html  +*.slim  +*.haml  +*.ejs  +*.css  +*.less  +*.md  +*.mdx  +*.markdown  +*.rmd  +*.json  +*.webmanifest  +*.js  +*.mjs  +*.jsx  +*.rb  +*.gemspec  +*.rake  +*.php  +*.py  +*.pyc  +*.pyo  +*.pyd  +*.coffee  +*.mustache  +*.hbs  +*.conf  +*.ini  +*.yml  +*.yaml  +*.toml  +*.bat  +*.mk  +*.jpg  +*.jpeg  +*.bmp  +*.png  +*.webp  +*.gif  +*.ico  +*.twig  +*.cpp  +*.c++  +*.cxx  +*.cc  +*.cp  +*.c  +*.cs 󰌛 +*.h  +*.hh  +*.hpp  +*.hxx  +*.hs  +*.lhs  +*.nix  +*.lua  +*.java  +*.sh  +*.fish  +*.bash  +*.zsh  +*.ksh  +*.csh  +*.awk  +*.ps1  +*.ml λ +*.mli λ +*.diff  +*.db  +*.sql  +*.sqlite  +*.dump  +*.clj  +*.cljc  +*.cljs  +*.edn  +*.scala  +*.go  +*.dart  +*.xul  +*.sln  +*.suo  +*.pl  +*.pm  +*.t  +*.rss  +'*.f#'  +*.fsscript  +*.fsx  +*.fs  +*.fsi  +*.rs  +*.rlib  +*.d  +*.erl  +*.hrl  +*.ex  +*.exs  +*.eex  +*.leex  +*.heex  +*.vim  +*.ai  +*.psd  +*.psb  +*.ts  +*.tsx  +*.jl  +*.pp  +*.vue 󰡄 +*.elm  +*.swift  +*.xcplayground  +*.tex 󰙩 +*.r 󰟔 +*.rproj 󰗆 +*.sol 󰡪 +*.pem 󰌋 + +# file names (vim-devicons) (case-insensitive not supported in lf) +*gruntfile.coffee  +*gruntfile.js  +*gruntfile.ls  +*gulpfile.coffee  +*gulpfile.js  +*gulpfile.ls  +*mix.lock  +*dropbox  +*.ds_store  +*.gitconfig  +*.gitignore  +*.gitattributes  +*.gitlab-ci.yml  +*.bashrc  +*.zshrc  +*.zshenv  +*.zprofile  +*.vimrc  +*.gvimrc  +*_vimrc  +*_gvimrc  +*.bashprofile  +*favicon.ico  +*license  +*node_modules  +*react.jsx  +*procfile  +*dockerfile  +*docker-compose.yml  +*rakefile  +*config.ru  +*gemfile  +*makefile  +*cmakelists.txt  +*robots.txt 󰚩 + +# file names (case-sensitive adaptations) +*Gruntfile.coffee  +*Gruntfile.js  +*Gruntfile.ls  +*Gulpfile.coffee  +*Gulpfile.js  +*Gulpfile.ls  +*Dropbox  +*.DS_Store  +*LICENSE  +*COPYING  +*COPYING.LESSER  +*React.jsx  +*Procfile  +*Dockerfile  +*Docker-compose.yml  +*Rakefile  +*Gemfile  +*Makefile  +*CMakeLists.txt  + +# file patterns (vim-devicons) (patterns not supported in lf) +# .*jquery.*\.js$  +# .*angular.*\.js$  +# .*backbone.*\.js$  +# .*require.*\.js$  +# .*materialize.*\.js$  +# .*materialize.*\.css$  +# .*mootools.*\.js$  +# .*vimrc.*  +# Vagrantfile$  + +# file patterns (file name adaptations) +*jquery.min.js  +*angular.min.js  +*backbone.min.js  +*require.min.js  +*materialize.min.js  +*materialize.min.css  +*mootools.min.js  +*vimrc  +Vagrantfile  + +# archives or compressed (extensions from dircolors defaults) +*.tar  +*.tgz  +*.arc  +*.arj  +*.taz  +*.lha  +*.lz4  +*.lzh  +*.lzma  +*.tlz  +*.txz  +*.tzo  +*.t7z  +*.zip  +*.z  +*.dz  +*.gz  +*.lrz  +*.lz  +*.lzo  +*.xz  +*.zst  +*.tzst  +*.bz2  +*.bz  +*.tbz  +*.tbz2  +*.tz  +*.deb  +*.rpm  +*.jar  +*.war  +*.ear  +*.sar  +*.rar  +*.alz  +*.ace  +*.zoo  +*.cpio  +*.7z  +*.rz  +*.cab  +*.wim  +*.swm  +*.dwm  +*.esd  + +# image formats (extensions from dircolors defaults) +*.jpg  +*.jpeg  +*.mjpg  +*.mjpeg  +*.gif  +*.bmp  +*.pbm  +*.pgm  +*.ppm  +*.tga  +*.xbm  +*.xpm  +*.tif  +*.tiff  +*.png  +*.svg  +*.svgz  +*.mng  +*.pcx  +*.mov  +*.mpg  +*.mpeg  +*.m2v  +*.mkv  +*.webm  +*.ogm  +*.mp4  +*.m4v  +*.mp4v  +*.vob  +*.qt  +*.nuv  +*.wmv  +*.asf  +*.rm  +*.rmvb  +*.flc  +*.avi  +*.fli  +*.flv  +*.gl  +*.dl  +*.xcf  +*.xwd  +*.yuv  +*.cgm  +*.emf  +*.ogv  +*.ogx  + +# audio formats (extensions from dircolors defaults) +*.aac  +*.au  +*.flac  +*.m4a  +*.mid  +*.midi  +*.mka  +*.mp3  +*.mpc  +*.ogg  +*.ra  +*.wav  +*.oga  +*.opus  +*.spx  +*.xspf  + +# other formats +*.pdf  diff --git a/modules/home.legacy/conf/lf/keybindings/default.nix b/modules/home.legacy/conf/lf/keybindings/default.nix new file mode 100644 index 00000000..b41004dc --- /dev/null +++ b/modules/home.legacy/conf/lf/keybindings/default.nix @@ -0,0 +1,94 @@ +{nixosConfig, ...}: { + # Remove some defaults + "'\"'" = null; + ";" = null; + "\"'\"" = null; + c = null; + d = null; + e = null; + j = null; + k = null; + m = null; + f = null; + + # Sorting + kn = ":set sortby natural; set info"; + ks = ":set sortby size; set info size"; + kt = ":set sortby time; set info time"; + ka = ":set sortby atime; set info atime"; + kc = ":set sortby ctime; set info ctime"; + ke = ":set sortby ext; set info"; + + # Searching + l = "search-next"; + L = "search-prev"; + + # File Openers + ee = "\$\$EDITOR \"$f\""; + es = "\$ nvim -S \"$f\""; + u = "view_file"; + cc = "\$sudo -e \"$f\""; + fe = "execute"; + fl = "follow_link"; + + # Archive Mappings + au = "unarchive"; + aa = "archive"; + + # Trash Mappings + dd = "trash"; + jc = "clear_trash"; + jr = "restore_trash"; + + # Dragon Mapping + dr = "dragon"; + ds = "dragon-stay"; + di = "dragon-individual"; + #dm = "mvdragon"; + #dc = "cpdragon"; + dl = "dlfile"; + + cs = "stripspace"; + + # Vim keys + h = "updir"; + t = "down"; + n = "up"; + s = "open"; + + # Basic Functions + "." = "set hidden!"; + DD = "delete"; + p = "paste"; + x = "cut"; + y = "copy"; + "" = "open"; + + mk = "mk_ln"; + mf = "mk_file"; + me = "mk_file_and_edit"; + md = "mk_dir"; + ms = "mk_scr_default"; + mt = "mk_scr_temp"; + + ch = "chmod"; + bg = "set_wall_paper"; + r = ":rename; cmd-end"; + H = "go_project_base_directory"; + R = "reload"; + C = "clear"; + U = "unselect"; + + # Movement + gjr = "cd ~/.local/share/Trash/files"; + gus = "cd /run/user/${builtins.toString nixosConfig.users.users.soispha.uid}"; + + gc = "cd ~/.config"; + gl = "cd ~/.local"; + gE = "cd /etc"; + + "gU." = "cd /usr"; + gUs = " cd /usr/share"; + + gt = "cd /tmp"; +} diff --git a/modules/home.legacy/conf/mail/accounts/benedikt.nix b/modules/home.legacy/conf/mail/accounts/benedikt.nix new file mode 100644 index 00000000..87ede61b --- /dev/null +++ b/modules/home.legacy/conf/mail/accounts/benedikt.nix @@ -0,0 +1,48 @@ +{pkgs}: { + address = "benedikt.peetz@b-peetz.de"; + userName = "benedikt.peetz@b-peetz.de"; + realName = "Benedikt Peetz"; + primary = true; + passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup account benedikt.peetz@b-peetz.de"; + aliases = [ + "@b-peetz.de" + ]; + folders = {}; + gpg = { + encryptByDefault = true; + key = "9A254A935C25B0419EAE495014D2BC012F572AD7"; + signByDefault = true; + }; + signature = { + # TODO: + }; + neomutt = { + enable = true; + }; + mbsync = { + enable = true; + create = "both"; + }; + # himalaya = { + # enable = true; + # backend = "imap"; + # sender = "smtp"; + # settings = { + # # TODO: + # }; + # }; + smtp = { + host = "server1.vhack.eu"; + port = 465; + }; + imap = { + host = "server1.vhack.eu"; + port = 993; + }; + jmap = { + # TODO: + }; + maildir = { + path = "bpeetz"; + }; +} diff --git a/modules/home.legacy/conf/mail/accounts/soispha.nix b/modules/home.legacy/conf/mail/accounts/soispha.nix new file mode 100644 index 00000000..012e84d6 --- /dev/null +++ b/modules/home.legacy/conf/mail/accounts/soispha.nix @@ -0,0 +1,49 @@ +{pkgs}: { + address = "soispha@vhack.eu"; + userName = "soispha@vhack.eu"; + realName = "Soispha"; + primary = false; + passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup account soispha@vhack.eu"; + aliases = [ + "admin@vhack.eu" + ]; + folders = { + }; + gpg = { + encryptByDefault = true; + key = "9606FC749FCE16360723D4ADA5E94010C3A642AD"; + signByDefault = true; + }; + signature = { + # TODO: + }; + neomutt = { + enable = true; + }; + mbsync = { + enable = true; + create = "both"; + }; + # himalaya = { + # enable = true; + # backend = "imap"; + # sender = "smtp"; + # settings = { + # # TODO: + # }; + # }; + smtp = { + host = "server1.vhack.eu"; + port = 465; + }; + imap = { + host = "server1.vhack.eu"; + port = 993; + }; + jmap = { + # TODO: + }; + maildir = { + path = "soispha"; + }; +} diff --git a/modules/home.legacy/conf/mail/default.nix b/modules/home.legacy/conf/mail/default.nix new file mode 100644 index 00000000..0ecbe40a --- /dev/null +++ b/modules/home.legacy/conf/mail/default.nix @@ -0,0 +1,15 @@ +{ + config, + pkgs, + ... +}: let + benedikt = import ./accounts/benedikt.nix {inherit pkgs;}; + soispha = import ./accounts/soispha.nix {inherit pkgs;}; + + accounts = {inherit soispha benedikt;}; +in { + accounts.email = { + maildirBasePath = "${config.xdg.dataHome}/maildir"; + inherit accounts; + }; +} diff --git a/modules/home.legacy/conf/mako/default.nix b/modules/home.legacy/conf/mako/default.nix new file mode 100644 index 00000000..711457f2 --- /dev/null +++ b/modules/home.legacy/conf/mako/default.nix @@ -0,0 +1,44 @@ +{ + config, + pkgs, + ... +}: { + services.mako = { + enable = true; + backgroundColor = "#2e3440"; + borderColor = "#88c0d0"; + borderRadius = 25; + borderSize = 2; + defaultTimeout = 5000; + font = "Source Code Pro 10"; + width = 500; + height = 500; + icons = true; + ignoreTimeout = true; + layer = "overlay"; + markup = true; # TODO: + maxIconSize = 64; + sort = "-time"; + extraConfig = '' + [urgency=low] + border-color=#cccccc + + [urgency=normal] + border-color=#d08770 + + [urgency=high] + border-size=3 + border-color=#bf616a + default-timeout=0 + + [urgency=critical] + border-size=4 + border-color=#bf616a + default-timeout=0 + + [category=mpd] + default-timeout=2000 + group-by=category + ''; + }; +} diff --git a/modules/home.legacy/conf/mbsync/default.nix b/modules/home.legacy/conf/mbsync/default.nix new file mode 100644 index 00000000..ac9808c9 --- /dev/null +++ b/modules/home.legacy/conf/mbsync/default.nix @@ -0,0 +1,17 @@ +{ + config, + lib, + ... +}: { + # TODO: I have no clue if both are needed, but it looks neat, right? + programs.mbsync = { + enable = true; + }; + services.mbsync = { + enable = true; + # TODO: enable after isync 1.5 drops + #configFile = "${config.xdg.configHome}/mbsync/mbsync.conf"; + }; + # Disable the timer, and only activate it on neomutt start + systemd.user.timers.mbsync = lib.mkForce {}; +} diff --git a/modules/home.legacy/conf/mpd/default.nix b/modules/home.legacy/conf/mpd/default.nix new file mode 100644 index 00000000..b30f6995 --- /dev/null +++ b/modules/home.legacy/conf/mpd/default.nix @@ -0,0 +1,50 @@ +{ + config, + pkgs, + lib, + osConfig, + ... +}: let + dataDir = "${config.xdg.dataHome}/mpd"; + playlistDirectory = "${dataDir}/playlists"; + runtimeDir = "/run/user/${builtins.toString osConfig.users.users.soispha.uid}/mpd"; +in { + home.sessionVariables = { + MPD_HOST = "/run/user/${builtins.toString osConfig.users.users.soispha.uid}/mpd/socket"; + }; + + systemd.user.services.mpd.Service.ExecStartPre = lib.mkForce '' + ${pkgs.coreutils}/bin/mkdir --parents "${dataDir}" "${playlistDirectory}" "${runtimeDir}" + ''; + + services.mpd = { + enable = true; + inherit dataDir playlistDirectory; + musicDirectory = config.programs.beets.settings.directory; + network = { + listenAddress = "${runtimeDir}/socket"; + }; + + extraConfig = '' + metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc,comment" + # Updated by the beets `mpdupdate` plugin + auto_update "no" + + audio_output { + type "pipewire" + name "pipewire" + } + + replaygain "track" + replaygain_limit "yes" + + #database { + # plugin "simple" + # path "~/.local/share/mpd/db + # cache_directory "~/.local/share/mpd/cache" + #} + + filesystem_charset "UTF-8" + ''; + }; +} diff --git a/modules/home.legacy/conf/mpd/mpdconf.example b/modules/home.legacy/conf/mpd/mpdconf.example new file mode 100644 index 00000000..eaa5e641 --- /dev/null +++ b/modules/home.legacy/conf/mpd/mpdconf.example @@ -0,0 +1,418 @@ +# An example configuration file for MPD. +# Read the user manual for documentation: http://www.musicpd.org/doc/user/ + + +# Files and directories ####################################################### +# +# This setting controls the top directory which MPD will search to discover the +# available audio files and add them to the daemon's online database. This +# setting defaults to the XDG directory, otherwise the music directory will be +# be disabled and audio files will only be accepted over ipc socket (using +# file:// protocol) or streaming files over an accepted protocol. +# +#music_directory "~/music" +# +# This setting sets the MPD internal playlist directory. The purpose of this +# directory is storage for playlists created by MPD. The server will use +# playlist files not created by the server but only if they are in the MPD +# format. This setting defaults to playlist saving being disabled. +# +#playlist_directory "~/.mpd/playlists" +# +# This setting sets the location of the MPD database. This file is used to +# load the database at server start up and store the database while the +# server is not up. This setting defaults to disabled which will allow +# MPD to accept files over ipc socket (using file:// protocol) or streaming +# files over an accepted protocol. +# +#db_file "~/.mpd/database" + +# These settings are the locations for the daemon log files for the daemon. +# +# The special value "syslog" makes MPD use the local syslog daemon. This +# setting defaults to logging to syslog. +# +# If you use systemd, do not configure a log_file. With systemd, MPD +# defaults to the systemd journal, which is fine. +# +#log_file "~/.mpd/log" + +# This setting sets the location of the file which stores the process ID +# for use of mpd --kill and some init scripts. This setting is disabled by +# default and the pid file will not be stored. +# +# If you use systemd, do not configure a pid_file. +# +#pid_file "~/.mpd/pid" + +# This setting sets the location of the file which contains information about +# most variables to get MPD back into the same general shape it was in before +# it was brought down. This setting is disabled by default and the server +# state will be reset on server start up. +# +#state_file "~/.mpd/state" +# +# The location of the sticker database. This is a database which +# manages dynamic information attached to songs. +# +#sticker_file "~/.mpd/sticker.sql" +# +############################################################################### + + +# General music daemon options ################################################ +# +# This setting specifies the user that MPD will run as. MPD should never run as +# root and you may use this setting to make MPD change its user ID after +# initialization. This setting is disabled by default and MPD is run as the +# current user. +# +#user "nobody" +# +# This setting specifies the group that MPD will run as. If not specified +# primary group of user specified with "user" setting will be used (if set). +# This is useful if MPD needs to be a member of group such as "audio" to +# have permission to use sound card. +# +#group "nogroup" +# +# This setting sets the address for the daemon to listen on. Careful attention +# should be paid if this is assigned to anything other than the default, any. +# This setting can deny access to control of the daemon. Not effective if +# systemd socket activation is in use. +# +# For network +#bind_to_address "any" +# +# And for Unix Socket +#bind_to_address "~/.mpd/socket" +# +# This setting is the TCP port that is desired for the daemon to get assigned +# to. +# +#port "6600" +# +# Suppress all messages below the given threshold. Use "verbose" for +# troubleshooting. Available setting arguments are "notice", "info", "verbose", +# "warning" and "error". +# +#log_level "notice" +# +# Setting "restore_paused" to "yes" puts MPD into pause mode instead +# of starting playback after startup. +# +#restore_paused "no" +# +# This setting enables MPD to create playlists in a format usable by other +# music players. +# +#save_absolute_paths_in_playlists "no" +# +# This setting defines a list of tag types that will be extracted during the +# audio file discovery process. The complete list of possible values can be +# found in the user manual. +#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" +# +# This example just enables the "comment" tag without disabling all +# the other supported tags: +#metadata_to_use "+comment" +# +# This setting enables automatic update of MPD's database when files in +# music_directory are changed. +# +#auto_update "yes" +# +# Limit the depth of the directories being watched, 0 means only watch +# the music directory itself. There is no limit by default. +# +#auto_update_depth "3" +# +############################################################################### + + +# Symbolic link behavior ###################################################### +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links outside of the configured music_directory. +# +#follow_outside_symlinks "yes" +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links inside of the configured music_directory. +# +#follow_inside_symlinks "yes" +# +############################################################################### + + +# Zeroconf / Avahi Service Discovery ########################################## +# +# If this setting is set to "yes", service information will be published with +# Zeroconf / Avahi. +# +#zeroconf_enabled "yes" +# +# The argument to this setting will be the Zeroconf / Avahi unique name for +# this MPD server on the network. %h will be replaced with the hostname. +# +#zeroconf_name "Music Player @ %h" +# +############################################################################### + + +# Permissions ################################################################# +# +# If this setting is set, MPD will require password authorization. The password +# setting can be specified multiple times for different password profiles. +# +#password "password@read,add,control,admin" +# +# This setting specifies the permissions a user has who has not yet logged in. +# +#default_permissions "read,add,control,admin" +# +############################################################################### + + +# Database ####################################################################### +# +# An example of a database section instead of the old 'db_file' setting. +# It enables mounting other storages into the music directory. +# +#database { +# plugin "simple" +# path "~/.local/share/mpd/db +# cache_directory "~/.local/share/mpd/cache" +#} +# +# An example of database config for a satellite setup +# +#music_directory "nfs://fileserver.local/srv/mp3" +#database { +# plugin "proxy" +# host "other.mpd.host" +# port "6600" +#} + +# Input ####################################################################### +# +input { + plugin "curl" +# proxy "proxy.isp.com:8080" +# proxy_user "user" +# proxy_password "password" +} + +# +############################################################################### + +# Audio Output ################################################################ +# +# MPD supports various audio output types, as well as playing through multiple +# audio outputs at the same time, through multiple audio_output settings +# blocks. Setting this block is optional, though the server will only attempt +# autodetection for one sound card. +# +# An example of an ALSA output: +# +#audio_output { +# type "alsa" +# name "My ALSA Device" +## device "hw:0,0" # optional +## mixer_type "hardware" # optional +## mixer_device "default" # optional +## mixer_control "PCM" # optional +## mixer_index "0" # optional +#} +# +# An example of an OSS output: +# +#audio_output { +# type "oss" +# name "My OSS Device" +## device "/dev/dsp" # optional +## mixer_type "hardware" # optional +## mixer_device "/dev/mixer" # optional +## mixer_control "PCM" # optional +#} +# +# An example of a shout output (for streaming to Icecast): +# +#audio_output { +# type "shout" +# encoder "vorbis" # optional +# name "My Shout Stream" +# host "localhost" +# port "8000" +# mount "/mpd.ogg" +# password "hackme" +# quality "5.0" +# bitrate "128" +# format "44100:16:1" +## protocol "icecast2" # optional +## user "source" # optional +## description "My Stream Description" # optional +## url "http://example.com" # optional +## genre "jazz" # optional +## public "no" # optional +## timeout "2" # optional +## mixer_type "software" # optional +#} +# +# An example of a recorder output: +# +#audio_output { +# type "recorder" +# name "My recorder" +# encoder "vorbis" # optional, vorbis or lame +# path "/var/lib/mpd/recorder/mpd.ogg" +## quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +#} +# +# An example of a httpd output (built-in HTTP streaming server): +# +#audio_output { +# type "httpd" +# name "My HTTP Stream" +# encoder "vorbis" # optional, vorbis or lame +# port "8000" +# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 +## quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +# max_clients "0" # optional 0=no limit +#} +# +# An example of a pulseaudio output (streaming to a remote pulseaudio server) +# +#audio_output { +# type "pulse" +# name "My Pulse Output" +## server "remote_server" # optional +## sink "remote_server_sink" # optional +## media_role "media_role" #optional +#} +# +# An example of a winmm output (Windows multimedia API). +# +#audio_output { +# type "winmm" +# name "My WinMM output" +## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +# or +## device "0" # optional +## mixer_type "hardware" # optional +#} +# +# An example of a wasapi output (Windows multimedia API). +# +#audio_output { +# type "wasapi" +# name "My WASAPI output" +## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +# or +## device "0" # optional +## Exclusive mode blocks all other audio source, and get best audio quality without resampling. +## exclusive "no" # optional +## Enumerate all devices in log. +## enumerate "no" # optional +#} +# +# An example of an openal output. +# +#audio_output { +# type "openal" +# name "My OpenAL output" +## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +#} +# +# An example of an sndio output. +# +#audio_output { +# type "sndio" +# name "sndio output" +# mixer_type "hardware" +#} +# +# An example of an OS X output: +# +#audio_output { +# type "osx" +# name "My OS X Device" +## device "Built-in Output" # optional +## channel_map "-1,-1,0,1" # optional +#} +# +## Example "pipe" output: +# +#audio_output { +# type "pipe" +# name "my pipe" +# command "aplay -f cd 2>/dev/null" +## Or if you're want to use AudioCompress +# command "AudioCompress -m | aplay -f cd 2>/dev/null" +## Or to send raw PCM stream through PCM: +# command "nc example.org 8765" +# format "44100:16:2" +#} +# +## An example of a null output (for no audio output): +# +#audio_output { +# type "null" +# name "My Null Output" +# mixer_type "none" # optional +#} +# +############################################################################### + + +# Normalization automatic volume adjustments ################################## +# +# This setting specifies the type of ReplayGain to use. This setting can have +# the argument "off", "album", "track" or "auto". "auto" is a special mode that +# chooses between "track" and "album" depending on the current state of +# random playback. If random playback is enabled then "track" mode is used. +# See for +# more details about ReplayGain. +# This setting is off by default. +# +#replaygain "album" +# +# This setting sets the pre-amp used for files that have ReplayGain tags. By +# default this setting is disabled. +# +#replaygain_preamp "0" +# +# This setting sets the pre-amp used for files that do NOT have ReplayGain tags. +# By default this setting is disabled. +# +#replaygain_missing_preamp "0" +# +# This setting enables or disables ReplayGain limiting. +# MPD calculates actual amplification based on the ReplayGain tags +# and replaygain_preamp / replaygain_missing_preamp setting. +# If replaygain_limit is enabled MPD will never amplify audio signal +# above its original level. If replaygain_limit is disabled such amplification +# might occur. By default this setting is enabled. +# +#replaygain_limit "yes" +# +# This setting enables on-the-fly normalization volume adjustment. This will +# result in the volume of all playing audio to be adjusted so the output has +# equal "loudness". This setting is disabled by default. +# +#volume_normalization "no" +# +############################################################################### + +# Character Encoding ########################################################## +# +# If file or directory names do not display correctly for your locale then you +# may need to modify this setting. +# +#filesystem_charset "UTF-8" +# +############################################################################### diff --git a/modules/home.legacy/conf/mpv/default.nix b/modules/home.legacy/conf/mpv/default.nix new file mode 100644 index 00000000..6b252a38 --- /dev/null +++ b/modules/home.legacy/conf/mpv/default.nix @@ -0,0 +1,10 @@ +{...}: { + programs.mpv = { + enable = true; + bindings = { + q = "quit 0"; + "Ctrl+c" = "quit 1"; + "Shift+q" = "quit-watch-later 1"; + }; + }; +} diff --git a/modules/home.legacy/conf/mumble/Mumble.conf b/modules/home.legacy/conf/mumble/Mumble.conf new file mode 100644 index 00000000..2d895f41 --- /dev/null +++ b/modules/home.legacy/conf/mumble/Mumble.conf @@ -0,0 +1,67 @@ +[General] +databaselocation=/home/soispha/.local/share/Mumble/Mumble/mumble.sqlite +lastupdate=3 + +[audio] +headphone=true +input=PipeWire +loudness=1549 +output=PipeWire +quality=72000 +vadmax=@Variant(\0\0\0\x87?Kw\x97) +vadmin=@Variant(\0\0\0\x87?7\x1e\xd4) + +[messages] +10\log=13 +12\log=13 +14\log=13 +15\log=13 +17\log=13 +18\log=13 +19\log=13 +2\log=13 +20\log=13 +21\log=13 +22\log=13 +23\log=13 +25\log=13 +26\log=13 +27\log=13 +28\log=13 +29\log=13 +30\log=13 +31\log=13 +5\log=13 +6\log=13 +9\log=13 +size=32 + +[messagesounds] +size=31 + +[net] +certificate="@ByteArray(0\x82\tX\x2\x1\x3\x30\x82\t\xe\x6\t*\x86H\x86\xf7\r\x1\a\x1\xa0\x82\b\xff\x4\x82\b\xfb\x30\x82\b\xf7\x30\x82\x3\xad\x6\t*\x86H\x86\xf7\r\x1\a\x1\xa0\x82\x3\x9e\x4\x82\x3\x9a\x30\x82\x3\x96\x30\x82\x3\x92\x6\v*\x86H\x86\xf7\r\x1\f\n\x1\x3\xa0\x82\x3+0\x82\x3'\x6\n*\x86H\x86\xf7\r\x1\t\x16\x1\xa0\x82\x3\x17\x4\x82\x3\x13\x30\x82\x3\xf\x30\x82\x1\xf7\xa0\x3\x2\x1\x2\x2\x1\x1\x30\r\x6\t*\x86H\x86\xf7\r\x1\x1\x5\x5\0\x30\x16\x31\x14\x30\x12\x6\x3U\x4\x3\f\vMumble User0\x1e\x17\r230710132716Z\x17\r430705132716Z0\x16\x31\x14\x30\x12\x6\x3U\x4\x3\f\vMumble User0\x82\x1\"0\r\x6\t*\x86H\x86\xf7\r\x1\x1\x1\x5\0\x3\x82\x1\xf\0\x30\x82\x1\n\x2\x82\x1\x1\0\xb3\x8c\xd2\xdbM\x90\xa6\xc7}\xf4\x6X\xf9O\x16Q\x12\xc7\x1\xca\x88\x9c\x96o\xd1\x11\xc1\xc3\xd1/\xb6\x9d\xcfn\xcd\x84\xd2\x1d\xcc\xfcO\xf9\xa4\"\xaa'2\x6\xee[\x3\xd3vx\x84`i@P|\xb8\xc5I\xa8\xa2\b\xc8\0\xbd\xf1\xcc\x63\xbe\x99Zj&\xa5t\xc5\bOr\xc1\xaen\xc7\n\xd2\xcc\xa1\x30\xb8\xe0\0\xe8\xc5\xb6\x86g\x14\x30S\x9d\x8b\xfb\xacP\x7f+\x93}3\xe3\xcbPJ\x86\xf7^Z\xda\x87Z\xfez\xec\xc0\xf7\xe9\x80\xbc\xe2\re@\xe7\x92\x84\xe5\x97\f\x8c\n\x3\x1c\xd1\xbb\x32\xce\xfe\xb6\x1d\xefUYz\xf\xd7,5\x4G\x1f\t\xf7\x43\f?wx\x1a\x12\xd4.I\xbd\xe4G\xea\x33\x9d\xb1\xb0\x62\x45\xcd\xe0\x8b\xe4\x31\x1a\x8c\xedLEyC\xf0\x9f\x32}c\xc9X\x19[\xf7\xfb\xfc\x39\xe0\xd5\x30\x87\xd0\x82:\xb5\x87j]\x9d\xf8\x1b\x4\xb2P \x5/\xb2H\xfa\x42I\x1dN\xa9\xb7\x9a\x91*\x83\xe\x45\xcf\xbe\t\xb5\x36)\xf7\x7f\x1\x43\x2\x3\x1\0\x1\xa3h0f0\f\x6\x3U\x1d\x13\x1\x1\xff\x4\x2\x30\0\x30\x13\x6\x3U\x1d%\x4\f0\n\x6\b+\x6\x1\x5\x5\a\x3\x2\x30\x1d\x6\x3U\x1d\xe\x4\x16\x4\x14\xb9\x41\x19t\x16\x18~\xe8\v\xa9\x9b\x86i\x86\xeP%\xd7\n\xc9\x30\"\x6\t`\x86H\x1\x86\xf8\x42\x1\r\x4\x15\x16\x13Generated by Mumble0\r\x6\t*\x86H\x86\xf7\r\x1\x1\x5\x5\0\x3\x82\x1\x1\0\x91+\r'hS\xc2\x12k\x13O\xb2\"\x85\xd6w\x96\x8a\x97\x46\xee\x95Q\x8b\x8b\t\x8a\xfcH\xab\x30\x1dxV\xc9\xf5\x80\x42;'o\xf1\xd1\xf2\xfb\x18\xe2+\x8d\x39 \xc3\xe\x44\xa9\t\xe2i\x8a\xa7?#\xcd]0\xf4\x1d\x4\a\xd6\x87\x62\xe2\xd8\x34\xb6\xcf\x89\xf2\v\xf1\x8b\xc6\xf8\x8f\x94H/\xfa`\x9d\xb5\xac\x66H\xef\xf4\tJ\xfeHg]!\xed\n\xaf\xa8nd@y\xe8>A\x10\xc4>\xc3\xf7\xe3\xffW\x90T\x87\x94[\x7fg0+p\xdd\x3\x8d\xdb\x80\f?\xe9\xf9l5\xac)z+4R\xbc\xf3\xe1\x82\xde\xc3u\xb2\xa1s\xe2\xbb\xdcpL#|\f\x7f\x93\x30-\x6\t*\x86H\x86\xf7\r\x1\t\x14\x31 \x1e\x1e\0M\0u\0m\0\x62\0l\0\x65\0 \0I\0\x64\0\x65\0n\0t\0i\0t\0y0\x82\x5\x42\x6\t*\x86H\x86\xf7\r\x1\a\x1\xa0\x82\x5\x33\x4\x82\x5/0\x82\x5+0\x82\x5'\x6\v*\x86H\x86\xf7\r\x1\f\n\x1\x1\xa0\x82\x4\xc0\x30\x82\x4\xbc\x2\x1\0\x30\r\x6\t*\x86H\x86\xf7\r\x1\x1\x1\x5\0\x4\x82\x4\xa6\x30\x82\x4\xa2\x2\x1\0\x2\x82\x1\x1\0\xb3\x8c\xd2\xdbM\x90\xa6\xc7}\xf4\x6X\xf9O\x16Q\x12\xc7\x1\xca\x88\x9c\x96o\xd1\x11\xc1\xc3\xd1/\xb6\x9d\xcfn\xcd\x84\xd2\x1d\xcc\xfcO\xf9\xa4\"\xaa'2\x6\xee[\x3\xd3vx\x84`i@P|\xb8\xc5I\xa8\xa2\b\xc8\0\xbd\xf1\xcc\x63\xbe\x99Zj&\xa5t\xc5\bOr\xc1\xaen\xc7\n\xd2\xcc\xa1\x30\xb8\xe0\0\xe8\xc5\xb6\x86g\x14\x30S\x9d\x8b\xfb\xacP\x7f+\x93}3\xe3\xcbPJ\x86\xf7^Z\xda\x87Z\xfez\xec\xc0\xf7\xe9\x80\xbc\xe2\re@\xe7\x92\x84\xe5\x97\f\x8c\n\x3\x1c\xd1\xbb\x32\xce\xfe\xb6\x1d\xefUYz\xf\xd7,5\x4G\x1f\t\xf7\x43\f?wx\x1a\x12\xd4.I\xbd\xe4G\xea\x33\x9d\xb1\xb0\x62\x45\xcd\xe0\x8b\xe4\x31\x1a\x8c\xedLEyC\xf0\x9f\x32}c\xc9X\x19[\xf7\xfb\xfc\x39\xe0\xd5\x30\x87\xd0\x82:\xb5\x87j]\x9d\xf8\x1b\x4\xb2P \x5/\xb2H\xfa\x42I\x1dN\xa9\xb7\x9a\x91*\x83\xe\x45\xcf\xbe\t\xb5\x36)\xf7\x7f\x1\x43\x2\x3\x1\0\x1\x2\x82\x1\0\x4\xd6\xf2\x66\v\xe0\xae\xc6(\xccw\x91Ub\xfe\xd8\x7f\x97\x92\xa2Imc\x16\xaf}y\x8a\x14,\xe3\x90\xbc\x63!\xb2\aQ\xdbQ\x1f\xbc\xbc\x62\\\xd0\xc2\xa5\xf2-\xcc\xdc\x19\xd0\xe4\xcc\x8ey\xb7\xd1\xac\xcfP\x8du\x94\xa4\x3u\x1b;\xe5\xa2\x61\x12\xd1R\xaaZ\v\xe7\x8d\xf0\xabl\xce\xba\x99\xbd\x95\xdbpkCJr\xfb\xc5P9\x1e\xf\xb1iI9&\xeb\x62\x8a#\xa7\x17\xcbw\x92\xf9\xf7JZ\xa6;F\xb3\xba\xb1H\x89]uU7\x1e\xd7\xf6U`\x8d\xa1\x1aG7\x11\x31\xbf\xf4\xdb\x32\x63\xbf\x3\xad&h\x82\x9b\xe7\x19/\xf6\r\x8c\x89\xc6\xd0\x1d\0\x87\t|\xc0\xf2\x8f\xbb\x87_8{\xf2\xc7\x8a\x34)\xe3\xf1\xcc(\xf4\xee\xeb($\x5\x84\xaf\x1\xaa\xf7\xff\x9b\x15h\x2y\xb3\x91\xba,Oq\xc9$\x81\x11Zg\xc4I3\v\xeay\f\xf0\x33\xc6p\xea\xc6\x9d\xac\xaa\xedp\xa7!\xcbHf5\xa0i\xbdo@\xb8![\x7f\xea\xad\x6\x31p\x81\x61\x2\x81\x81\0\xdc\x8d}{\xc3\x31\xb6(F\xc5\x36\x9b\xba\x66\xb1\xce\r_\x90\xc6\x1f\x87\x37\x84m\xd1\a8\xc0\v9\xe0\x8bm\xaf\x64\xbe\x81\xa8\xe7\xaf\x19\x43,vj\xaf!9rz\x87\"\xca\xbf\xcf\x16\x88\x46t\xbd\x12\xaa;\xf4x_\x1b\xb3\x90\b\xb6\xf6\xec\x1f\x95\x62\xac\xfa\x1b\xae\xa2\xa7oA\x9bhOW\xa8\x44\\\xadz T\xe3\x43\x46\x99\x98\xb4{*\"\xdb\xd9\xc8\xd2\x15\n4\"\x8d\x96$\x17\xfd^\xf7\x84\x93\x7fw{o\0\xe1\x2\x81\x81\0\xd0hNA\xc3\x9e\x93&iq\x1dQ\xb6\xc6\x1c\x32\xf3\xfc c&Y\xe7|\xbeq2P\xe1\xdb\x97\xf8\x9fI(\x98\x9d\xf1\xfe\xb6\xf\x90\xa5\xebi>\x14\x6\xd8.\xf4\xce\x86\x9d*\x87 \xf9X\x4\xdcZ\xf9g\x3\x98H{\xdf\x66\xde\xd6zr\xecG_\x14t\x1dm%P\xe5\xea\x8e\x6\xa2. \xa1\xd7\xd7W]\xdd\x15\x6\xcf+/\x11\vel\xd3\xe8\xc3/\xbc\x1f\xc3n\xd4\xb8\x62j\xf5\xc0\xc0\x89\xe3z\xb8\x36\xd5\xb2\xa3\x2\x81\x80z`W\xdc\x30\x36\x89(W\xfc]\x8c\x93% K\x80\xc8\"\0\x8c\xc5\xee\\ \xc2\xf7\n\xda$`|\xe3`}\r\x9dWV\xa8\0\xc9\xcd\xd2\xc4\f\xe4\x8d%k+\x16\xbc.\n\xf7\x44\x9d\xd6\xfc\x1a\x88\x8a\xdd\x11J\xd9\xc4%\xe6g\xd8\xbc.\xe2\x11/J\x81\x2\x81\x80\x63;W\xf\xbf:1,\x98\x6\x31\x4\xa8wz\x13\xd4\xd2\x97\x5>\xcc\x8e\tz\x90\x61y\xdb\xa0\xf8\xa2|\r\x94\x93\xde\x98\xcc\x44\x19\xf3\x30\xdd\x7fu\xfc\x89)\xc4i\xf2\x30l\x83\x44\x66\x31\xf3t\x15\f\b6\xc1\xa2o\xd8\xf3\x8d\x82\xcb\x32\xf0\xa7\x8ap>G\xef~\xf9\xc6\xa4\x42\xe3\xafJ\xe7\x95\xc8\x1a\x2\xc1\xe9\xc2\x8b\xf1{\x11?\xce\xe8\xd3\x39WI<.\xedo^Y\xd6U\x99\x1e\xfe\xb6\xf1\xb6v'\a\xb1\xac\\\xeb\x2\x81\x80@\x19\xc4\x32&\xcb\xc1\xca\x10K\xdf\x45\xf9\xf\x1d\x85\x39\x65\xdc\x33\x45\xbe\xac\x97~;\xe2m-\xd6\x9b\x82\x1\xbd\x90'W\xf5\xf5\xce\x35\xd7\xb4\xcdidTiP\\-vG+`\xb5u\xb7\x14\x44\xe1\xd9\xd3\r\x81\xb0GL\xe1U\xe3\xf0\xaa\xd1\x8f\xc6\"\xa5S\xb6\xbf\x4\x1a\xc4\xe0|\x8d\xa2+y(-\xad\ty\xd5\xe2g\xd3\x8c\xcdl\x96g3\xfe\x80\xb7|b[\xca\xb2\xbf\x61\xf7\x9c\x65\x30\x61\xa0\x35\xf6W\xb4\xcc\xdd\x34\x31T0#\x6\t*\x86H\x86\xf7\r\x1\t\x15\x31\x16\x4\x14\x9f\xdc\xf9\x38\xc2\x8a\x1c\xfe\x6}\xf6\x64\x62>L#|\f\x7f\x93\x30-\x6\t*\x86H\x86\xf7\r\x1\t\x14\x31 \x1e\x1e\0M\0u\0m\0\x62\0l\0\x65\0 \0I\0\x64\0\x65\0n\0t\0i\0t\0y0A010\r\x6\t`\x86H\x1\x65\x3\x4\x2\x1\x5\0\x4 Fm\xb6/lL\x18\x1b!\xfa+x\xb5\xd9?GrR\xb7\xd3\x90\xc1N)L\x9c\xc7')\xe^\xbe\x4\b\x8b\x2\xb2\xb2\x97\b\x8a\xf6\x2\x2\b\0)" +framesperpacket=1 + +[overlay] +blacklist=@Invalid() +blacklistexclude=@Invalid() +launchers=@Invalid() +launchersexclude=@Invalid() +paths=@Invalid() +pathsexclude=@Invalid() +version=1.4.0 +whitelist=@Invalid() +whitelistexclude=@Invalid() + +[shortcuts] +size=0 + +[ui] +HighContrast=true +connect\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\n\0\0\0\0\0\0\0\f=\0\0\x1m\0\0\n\0\0\0\0\0\0\0\f=\0\0\x1m\0\0\0\x1\x2\0\0\0\a\x80\0\0\n\0\0\0\0\0\0\0\f=\0\0\x1m)" +connect\header=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2&\0\0\0\x3\x1\x1\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x3\0\0\x1w\0\0\0\x1\0\0\0\x1\0\0\0S\0\0\0\x1\0\0\0\x3\0\0\0\\\0\0\0\x1\0\0\0\x3\0\0\x3\xe8\0\0\0\0\x64) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\n\0\0\0\0\0\0\0\r\xb9\0\0\x3\xfa\0\0\n\0\0\0\0\0\0\0\f\xde\0\0\x1\xb2\0\0\0\x1\x2\0\0\0\a\x80\0\0\n\0\0\0\0\0\0\0\r\xb9\0\0\x3\xfa) +header=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2\xb0\0\0\0\x1\x1\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x1\0\0\x2\xb0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64) +server=mumble.vhack.eu +state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\x1\0\0\0\x3\xbd\xfc\x2\0\0\0\x2\xfb\0\0\0\f\0q\0\x64\0w\0L\0o\0g\x1\0\0\0>\0\0\x3\xa0\0\0\0z\0\xff\xff\xff\xfb\0\0\0\xe\0q\0\x64\0w\0\x43\0h\0\x61\0t\x1\0\0\x3\xe2\0\0\0\x19\0\0\0\x19\0\0\0\x19\0\0\x2\xb6\0\0\x3\xbd\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x1\0\0\0\x1a\0q\0t\0I\0\x63\0o\0n\0T\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) diff --git a/modules/home.legacy/conf/mumble/default.nix b/modules/home.legacy/conf/mumble/default.nix new file mode 100644 index 00000000..6fa524dc --- /dev/null +++ b/modules/home.legacy/conf/mumble/default.nix @@ -0,0 +1,3 @@ +{...}: { + xdg.configFile."Mumble/Mumble.conf".source = ./Mumble.conf; +} diff --git a/modules/home.legacy/conf/neomutt/default.nix b/modules/home.legacy/conf/neomutt/default.nix new file mode 100644 index 00000000..e4fbcb39 --- /dev/null +++ b/modules/home.legacy/conf/neomutt/default.nix @@ -0,0 +1,168 @@ +{pkgs, ...}: { + programs.neomutt = { + enable = true; + package = pkgs.writeShellScriptBin "neomutt" '' + systemctl --user start mbsync.service; + ${pkgs.neomutt}/bin/neomutt; + ''; + vimKeys = false; # see the modified ones below + checkStatsInterval = 60; + binds = [ + #------------------------------------------------------------ + # Vi Key Bindings (taken from their configuration, modified for dvorak) + #------------------------------------------------------------ + + # Moving around + { + action = "noop"; + key = "g"; + map = ["attach" "browser" "index"]; + } + { + action = "first-entry"; + key = "gg"; + map = ["attach" "browser" "index"]; + } + { + action = "last-entry"; + key = "G"; + map = ["attach" "browser" "index"]; + } + { + action = "noop"; + key = "g"; + map = ["pager"]; + } + { + action = "top"; + key = "gg"; + map = ["pager"]; + } + { + action = "bottom"; + key = "G"; + map = ["pager"]; + } + { + action = "previous-line"; + key = "n"; + map = ["pager"]; + } + { + action = "next-line"; + key = "t"; + map = ["pager"]; + } + + # Scrolling + { + action = "next-page"; + key = "\\CF"; + map = ["attach" "browser" "pager" "index"]; + } + { + action = "previous-page"; + key = "\\CB"; + map = ["attach" "browser" "pager" "index"]; + } + { + action = "half-up"; + key = "\\Cu"; + map = ["attach" "browser" "pager" "index"]; + } + { + action = "half-down"; + key = "\\Cd"; + map = ["attach" "browser" "pager" "index"]; + } + { + action = "next-line"; + key = "\\Ce"; + map = ["browser" "pager"]; + } + { + action = "previous-line"; + key = "\\Cy"; + map = ["browser" "pager"]; + } + { + action = "next-line"; + key = "\\Ce"; + map = ["index"]; + } + { + action = "previous-line"; + key = "\\Cy"; + map = ["index"]; + } + + { + action = "noop"; + key = "d"; + map = ["pager" "index"]; + } + { + action = "delete-message"; + key = "dd"; + map = ["pager" "index"]; + } + + # Mail & Reply + { + # Doesn't work currently + action = "list-reply"; + key = "\\Cm"; + map = ["index"]; + } + + # Threads + { + action = "search-opposite"; + key = "N"; + map = ["browser" "pager" "index"]; + } + { + action = "delete-thread"; + key = "dT"; + map = ["pager" "index"]; + } + { + action = "delete-subthread"; + key = "dt"; + map = ["pager" "index"]; + } + { + action = "next-thread"; + key = "gt"; + map = ["pager" "index"]; + } + { + action = "previous-thread"; + key = "gT"; + map = ["pager" "index"]; + } + { + action = "collapse-thread"; + key = "za"; + map = ["index"]; + } + { + # Missing: folddisable/foldenable + action = "collapse-all"; + key = "zA"; + map = ["index"]; + } + + { + action = "search-next"; + key = "l"; + map = ["index"]; + } + { + action = "limit"; + key = "f"; + map = ["index"]; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nix-index/default.nix b/modules/home.legacy/conf/nix-index/default.nix new file mode 100644 index 00000000..eb8132d9 --- /dev/null +++ b/modules/home.legacy/conf/nix-index/default.nix @@ -0,0 +1,14 @@ +{...}: { + programs.nix-index = { + enable = true; + symlinkToCacheHome = true; + + # Handled by myself (and the script is overridden) + enableBashIntegration = false; + enableZshIntegration = false; + enableFishIntegration = false; + }; + programs.nix-index-database = { + comma.enable = false; + }; +} diff --git a/modules/home.legacy/conf/npm/.npmrc b/modules/home.legacy/conf/npm/.npmrc new file mode 100644 index 00000000..d0d846bd --- /dev/null +++ b/modules/home.legacy/conf/npm/.npmrc @@ -0,0 +1,6 @@ +scripts-prepend-node-path=true +node_gyp= +prefix=${XDG_DATA_HOME}/npm +cache=${XDG_CACHE_HOME}/npm +tmp=${XDG_RUNTIME_DIR}/npm +init-module=${XDG_CONFIG_HOME}/npm/config/npm-init.js diff --git a/modules/home.legacy/conf/npm/default.nix b/modules/home.legacy/conf/npm/default.nix new file mode 100644 index 00000000..7b4bb6a1 --- /dev/null +++ b/modules/home.legacy/conf/npm/default.nix @@ -0,0 +1,7 @@ +{ + config, + pkgs, + ... +}: { + xdg.configFile."npm/.npmrc".source = ./.npmrc; +} diff --git a/modules/home.legacy/conf/nvim/autocmds/default.nix b/modules/home.legacy/conf/nvim/autocmds/default.nix new file mode 100644 index 00000000..a8f00bdc --- /dev/null +++ b/modules/home.legacy/conf/nvim/autocmds/default.nix @@ -0,0 +1,124 @@ +{config, ...}: { + programs.nixvim = { + autoGroups = { + cursor_off = {clear = true;}; + colorcolumn_toggle = {clear = true;}; + numbertoggle = {clear = true;}; + coloroverride = {clear = true;}; + highlight_on_yank = {clear = true;}; + create_dir = {clear = true;}; + }; + autoCmd = [ + { + # Taken from: https://github.com/jghauser/mkdir.nvim + event = ["BufWritePre"]; + pattern = ["*"]; + callback = { + __raw = '' + function() + -- Get current filename, get full path (:p) and leave only the head (:h) + local dir = vim.fn.expand(':p:h') + + -- This handles URLs using netrw. See ':help netrw-transparent' for details. + if dir:find('%l+://') == 1 then + return + end + + if vim.fn.isdirectory(dir) == 0 then + vim.fn.mkdir(dir, 'p') + end + end + ''; + }; + group = "create_dir"; + desc = "Create the directory of the target file on write"; + } + { + event = ["TextYankPost"]; + pattern = ["*"]; + callback = { + __raw = '' + function() + vim.highlight.on_yank() + end + ''; + }; + group = "highlight_on_yank"; + desc = "Highlight the yanked text"; + } + { + event = ["BufWritePre"]; + pattern = ["*"]; + command = '' + ks | if search("\\s\\+$", 'n') != 0 | :%s/\s\+$// | endif | 's + ''; + desc = '' + Remove trailing whitespace on safe + :%s/\s\+$\| \+\ze\t//g >> For trailing spaces and spaces before tabstops + ''; + } + + { + event = ["WinLeave"]; + pattern = ["*"]; + command = "set nocursorline"; # TODO: possible also nocursorcolumn + group = "cursor_off"; + desc = "Display cursorline and cursorcolumn ONLY in active window."; + } + { + event = ["WinEnter"]; + pattern = ["*"]; + command = "set cursorline"; # TODO: possible also cursorcolumn + group = "cursor_off"; + desc = "Display cursorline and cursorcolumn ONLY in active window."; + } + + { + event = ["InsertEnter"]; + pattern = ["*"]; + command = "set colorcolumn=${config.programs.nixvim.opts.colorcolumn}"; + group = "colorcolumn_toggle"; + desc = "Only activate the colorcolumn when focused"; + } + { + event = ["BufLeave" "FocusLost" "InsertLeave" "WinLeave"]; + pattern = ["*"]; + command = "set colorcolumn=0"; + group = "colorcolumn_toggle"; + desc = "Only activate the colorcolumn when focused"; + } + + { + event = ["BufEnter" "FocusGained" "InsertLeave" "WinEnter"]; + pattern = ["*"]; + command = "if &nu && mode() != \"i\" | set rnu | endif"; + group = "numbertoggle"; + desc = "Change line numbers, when not focused"; + } + { + event = ["BufLeave" "FocusLost" "InsertEnter" "WinLeave"]; + pattern = ["*"]; + command = "if &nu | set nornu | endif"; + group = "numbertoggle"; + desc = "Change line numbers, when not focused"; + } + + { + # Override LineNr + event = ["ColorScheme"]; + pattern = ["*"]; + command = "highlight LineNr ctermfg=DarkGrey guifg=DarkGrey "; + group = "coloroverride"; + desc = "Changes Line number colors"; + } + { + # Override CursorLineNr + event = ["ColorScheme"]; + pattern = ["*"]; + command = "highlight CursorLineNr ctermfg=White guifg=White "; + group = "coloroverride"; + desc = "Changes Line number colors"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/clipboard/default.nix b/modules/home.legacy/conf/nvim/clipboard/default.nix new file mode 100644 index 00000000..0a686190 --- /dev/null +++ b/modules/home.legacy/conf/nvim/clipboard/default.nix @@ -0,0 +1,7 @@ +{...}: { + programs.nixvim = { + clipboard.providers = { + wl-copy.enable = true; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/default.nix b/modules/home.legacy/conf/nvim/default.nix new file mode 100644 index 00000000..2da80c22 --- /dev/null +++ b/modules/home.legacy/conf/nvim/default.nix @@ -0,0 +1,55 @@ +{pkgs, ...}: { + imports = [ + ./autocmds + ./clipboard + ./files + ./mappings + ./options + ./plgs + ]; + home.sessionVariables = { + EDITOR = "nvim"; + VISUAL = "nvim"; + CODEEDITOR = "nvim"; + }; + programs.nixvim = { + enable = true; + + # source: https://www.patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=Neovim + extraConfigLuaPre = + /* + FIXME: Update the merge function to support that: <2023-08-29> + + lib.mkBefore + */ + '' + --------------------------------------------------------------------------- + -- + -- ███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗ + -- ████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║ + -- ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║ + -- ██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║ + -- ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║ + -- ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═╝╚═╝ ╚═╝ + -- + --------------------------------------------------------------------------- + ''; + + extraPackages = with pkgs; [ + /* + These are mostly linters and formatters used for different file types. + Including them here is fine, as they are not necessarily sync able to different people. + */ + # nix + alejandra + statix + + # yaml + yamllint + + # shell + shellcheck + shfmt + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/files/default.nix b/modules/home.legacy/conf/nvim/files/default.nix new file mode 100644 index 00000000..f935ac7b --- /dev/null +++ b/modules/home.legacy/conf/nvim/files/default.nix @@ -0,0 +1,9 @@ +{lib, ...}: { + programs.nixvim = { + extraFiles = { + "ftplugin/tex.lua".text = '' + ${lib.strings.fileContents ./ftplugin/tex.lua} + ''; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/files/ftplugin/tex.lua b/modules/home.legacy/conf/nvim/files/ftplugin/tex.lua new file mode 100644 index 00000000..f3fffa86 --- /dev/null +++ b/modules/home.legacy/conf/nvim/files/ftplugin/tex.lua @@ -0,0 +1,57 @@ +-- local used = false; +-- vim.keymap.set('n', 't', function() +-- used = not used; +-- if used then +-- require('nvim-treesitter.configs').setup { +-- highlight = { +-- additional_vim_regex_highlighting = { "latex", "markdown" }, +-- }, +-- } +-- else +-- require('nvim-treesitter.configs').setup { +-- highlight = { +-- additional_vim_regex_highlighting = { "" }, +-- }, +-- } +-- end +-- end +-- ); +-- +-- + +-- Set tex specific telescope extension +require("telescope").setup({ + extensions = { + bibtex = { + -- Depth for the *.bib file + depth = 1, + -- Path to global bibliographies (placed outside of the project) + global_files = {}, + -- Define the search keys to use in the picker + search_keys = { "author", "year", "title" }, + -- Template for the formatted citation + citation_format = "{{author}} ({{year}}), {{title}}.", + -- Only use initials for the authors first name + citation_trim_firstname = true, + -- Max number of authors to write in the formatted citation + -- following authors will be replaced by "et al." + citation_max_auth = 2, + -- Wrapping in the preview window is disabled by default + wrap = false, + -- Custom format for citation label + custom_formats = { + { id = "tex_autocite", cite_marker = "\\autocite{%s}" }, + }, + format = "tex_autocite", + -- Use context awareness + context = true, + -- Fallback to global/directory .bib files if context not found + -- This setting has no effect if context = false + context_fallback = true, + }, + }, +}) +require("telescope").load_extension("bibtex") +vim.keymap.set("n", "ib", function() + require("telescope").extensions.bibtex.bibtex() +end, { noremap = true, silent = true, desc = "list bibtex entries in telescope" }) diff --git a/modules/home.legacy/conf/nvim/mappings/default.nix b/modules/home.legacy/conf/nvim/mappings/default.nix new file mode 100644 index 00000000..af800d22 --- /dev/null +++ b/modules/home.legacy/conf/nvim/mappings/default.nix @@ -0,0 +1,282 @@ +{lib, ...}: { + programs.nixvim = { + globals = { + mapleader = " "; + maplocalleader = " "; + }; + keymaps = [ + { + mode = ["n" "i"]; + key = ""; + action = "noh"; + options.desc = "Disable the search highlighting and send Escape"; + } + { + key = "hh"; + mode = ["i"]; + action.__raw = '' + function() + local cmp = require('cmp'); + local luasnip = require('luasnip'); + + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_locally_jumpable() then + luasnip.expand_or_jump() + end + end + ''; + options.desc = "completion trigger/ forward in completen menu"; + } + { + key = "uu"; + mode = ["i"]; + action.__raw = '' + function() + local cmp = require('cmp'); + cmp.confirm() + end + ''; + options.desc = "confirm the selected item"; + } + + # FIXME: Add the below keymappings, when alacritty gets support for the kitty + # keyboard protocol <2023-08-29> + { + # "" + key = "ztn"; + action = "tabnext"; + options.desc = "cycle to the next tab"; + } + { + # "" + key = "ztp"; + action = "tabprevious"; + options.desc = "cycle to the previous tab"; + } + + # yank/ cut to the system clipboard + { + key = "y"; + action = "\"+y"; + options.desc = "yank to the system clipboard"; + } + { + key = "Y"; + action = "\"+Y"; + options.desc = "yank until the end of the line to the system clipboard"; + } + + # Unmap some old keys + #{key = "s"; action = "''";} + #{key = "t"; action = "''";} + { + key = ""; + action = ""; + } + { + key = ""; + action = ""; + } + { + key = ""; + action = ""; + } + { + key = ""; + action = ""; + } + + # Center the cursor vertically when moving to the next word during a search. + { + key = "l"; + action = "nzzzv"; + options.desc = "Center the cursor vertically when moving to the next word during a search."; + } + { + key = "L"; + action = "Nzzzv"; + options.desc = "Center the cursor vertically when moving to the next word during a search."; + } + # remap the other keys to dvorak + { + key = "k"; + action = "t"; + options.desc = "go the the right on char"; + } + { + key = "K"; + action = "T"; + options.desc = "go to the left on char"; + } + { + key = "j"; + action = "k"; + options.desc = "go to the right before the char"; + } + { + key = "J"; + action = "K"; + options.desc = "go to the left before the char"; + } + + # Change Vim-keys + { + key = "h"; + action = ""; + options.desc = "go left"; + } + { + key = "t"; + action = "g"; + options.desc = "go down, with displaylines"; + } + { + key = "n"; + action = "g"; + options.desc = "go up, with displaylines"; + } + { + key = "s"; + action = ""; + options.desc = "go right"; + } + + # Move display lines + { + key = "0"; + action = "g0"; + options.desc = "go to the leftmost character in the screen line"; + } + { + key = "$"; + action = "g$"; + options.desc = "go to the rightmost character in the screen line"; + } + { + mode = ["n"]; + key = ""; + action = "gf"; + options.desc = "open file/url under cursor"; + } + { + mode = ["n"]; + key = ""; + action = ":"; + options.desc = "jump to command line"; + } + + { + mode = ["n"]; + key = "\\f"; + action.__raw = "function() require('lf').start() end"; + options.desc = "open lf in a floating window"; + } + + # Splits + { + mode = ["n"]; + key = ""; + action = "p"; + options.desc = "go to previous split"; + } + { + mode = ["n"]; + key = ""; + action = "w"; + options.desc = "go to next split"; + } + { + mode = ["n"]; + key = "-"; + action = "s"; + options.desc = "New horizontal split"; + } + { + mode = ["n"]; + key = "|"; + action = "v"; + options.desc = "New vertical split"; + } + + { + mode = ["n"]; + key = "p"; + action = "\"_dP"; + options.desc = "keep the cut thing in the base register"; + } + { + mode = ["n"]; + key = "c"; + action = "\"_c"; + options.desc = "change without saving to register"; + } + + { + mode = ["n"]; + key = "d"; + action = "\"_d"; + options.desc = "delete without saving to register"; + } + { + key = "dd"; + mode = ["n"]; + action.__raw = '' + function() + if vim.api.nvim_get_current_line():match("^%s*$") then + return '"_dd' + else + return "dd" + end + end + ''; + options = { + desc = "Pipe all blank line deletions to the blackhole register"; + expr = true; + silent = true; + }; + } + + { + mode = ["n"]; + key = "s"; + action = ":%s/\\<\\>//gI"; + options.desc = "replace for the word under the cursor"; + } + + { + mode = ["n"]; + key = ""; + action = "mksession! "; + options.desc = "overwrite/create a session"; + } + + { + mode = ["n"]; + key = "X"; + action = "!!$SHELL "; + options.desc = "Read the current line and execute that line in your $SHELL. The resulting output will replace the curent line that was being executed."; + } + { + mode = ["t"]; + key = ""; + action = ""; + options.desc = "Exit terminal mode with "; + } + + # move selected lines in visual mode + { + mode = ["v"]; + key = "T"; + action = ":m '>+1gv=gv"; + options.desc = "move selected lines in visual mode down"; + } + { + mode = ["v"]; + key = "N"; + action = ":m '<-2gv=gv"; + options.desc = "move selected lines in visual mode up"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/options/default.nix b/modules/home.legacy/conf/nvim/options/default.nix new file mode 100644 index 00000000..d22bdd8f --- /dev/null +++ b/modules/home.legacy/conf/nvim/options/default.nix @@ -0,0 +1,105 @@ +{nixosConfig, ...}: { + programs.nixvim.opts = { + autoindent = true; # copy indent from previous line + cindent = true; # use c like indenting rules + breakindent = true; # continue indent visually + showbreak = "↳ "; # downwards arrow with tip rightwards(U+21B3, UTF-8: E2 86 B3) + breakindentopt = { + shift = 2; # wrapped line's beginning will be shifted by the given number of + }; + + incsearch = true; # show search results while typing + inccommand = "split"; # line preview of :s results + ignorecase = true; # ignore case when searching + smartcase = true; # if a capital letter is used in search, overwrite ignorecase + showmatch = true; # show matching words during a search. + hlsearch = true; # highlight when searching + + confirm = true; # confirm to save changes before closing modified buffer + colorcolumn = "+1"; # show a +1 before the 'textwidth' + completeopt = ["menuone" "noselect"]; # have a better completion experience + + # https://www.compart.com/en/unicode/U+XXXX (unicode character code) + # stylua: ignore + fillchars = { + fold = "·"; # MIDDLE DOT (U+00B7, UTF-8: C2 B7) + horiz = "━"; # BOX DRAWINGS HEAVY HORIZONTAL (U+2501, UTF-8: E2 94 81) + horizdown = "┳"; # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL (U+2533, UTF-8: E2 94 B3) + horizup = "┻"; # BOX DRAWINGS HEAVY UP AND HORIZONTAL (U+253B, UTF-8: E2 94 BB) + vert = "┃"; # BOX DRAWINGS HEAVY VERTICAL (U+2503, UTF-8: E2 94 83) + vertleft = "┫"; # BOX DRAWINGS HEAVY VERTICAL AND LEFT (U+252B, UTF-8: E2 94 AB) + vertright = "┣"; # BOX DRAWINGS HEAVY VERTICAL AND RIGHT (U+2523, UTF-8: E2 94 A3) + verthoriz = "╋"; # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL (U+254B, UTF-8: E2 95 8B) + }; + listchars = builtins.concatStringsSep "," [ + "nbsp:⦸" # CIRCLED REVERSE SOLIDUS (U+29B8, UTF-8: E2 A6 B8) + "tab:▷┅" # WHITE RIGHT-POINTING TRIANGLE (U+25B7, UTF-8: E2 96 B7) + "extends:»" # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (U+00BB, UTF-8: C2 BB) + "precedes:«" # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (U+00AB, UTF-8: C2 AB) + "trail:•" # BULLET (U+2022, UTF-8: E2 80 A2) + ]; + + # shell-like autocomplete to unambiguous portions + wildmode = builtins.concatStringsSep "," [ + "longest" + "list" + "full" + ]; + + grepformat = "%f:%l:%c:%m"; # the default format for rg in vimgrep mode + grepprg = "rg --vimgrep"; # use rg as grep implementation in `:grep` + + hidden = true; # allows you to hide buffers with unsaved changes without being prompted + + laststatus = 3; # use global statusline # TODO: + + list = true; # show whitespace + + mouse = ""; # disables the mouse + + number = true; # line numbers + relativenumber = true; # relative line numbers + + # vim.opt.shada:append {'%'}; -- store buffers in the shada file and reopen them if nvim has been started without file name argument + + shell = nixosConfig.users.users.soispha.shell.pname; # try to use default shell for the default user as a shell for ":!" + + spell = true; # activate spell checking + spelllang = "en_us,de_de"; # set spell languages + spelloptions = "camel"; # CamelCase check if both camel and case are correct words + + syntax = "ON"; # use syntax highlighting and let nvim figure out which + + shiftwidth = 0; # use tabstop setting as shiftwidth + tabstop = 4; # use 4 spaces in place of a tab + expandtab = true; # expand tabs to spaces + + showtabline = 2; # always show the tabline + + timeoutlen = 500; # wait 500 msec for the next char in an input sequence + ttyfast = true; # let vim know that I am using a fast term + + undofile = true; # use a undofile, to save the undos + undolevels = 10000; # keep nearly all undo things stored + + virtualedit = "block"; # allow the cursor to move beyond actual character in visual block mode + + textwidth = 90; # automatically hard wrap at 90 columns by default + + foldmethod = "marker"; # use markers to specify folds + + termguicolors = true; + cursorline = true; + # vim.opt.cursorcolumn = true; + + scrolloff = 999; # try to keep at least 999 lines above and below the cursor (this effectively keeps the screen centered) + + linebreak = true; # break to long lines, but do only break them at [[::space::]] + + showcmd = true; # show partial command, being typed + showmode = true; # show the mode (Visual, Insert, Command) + + wildmenu = true; # shell completion + wildignore = "*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx"; # ignore binary files + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/colorscheme/default.nix b/modules/home.legacy/conf/nvim/plgs/colorscheme/default.nix new file mode 100644 index 00000000..11357f77 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/colorscheme/default.nix @@ -0,0 +1,17 @@ +{ + pkgs, + lib, + ... +}: { + programs.nixvim = { + # TODO: package nightfox though a module + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/nightfox.lua} + ${lib.strings.fileContents ./lua/mk_todos_readable.lua} + ''; + colorscheme = "carbonfox"; + extraPlugins = [ + pkgs.vimPlugins.nightfox-nvim + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/colorscheme/lua/mk_todos_readable.lua b/modules/home.legacy/conf/nvim/plgs/colorscheme/lua/mk_todos_readable.lua new file mode 100644 index 00000000..d02171b5 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/colorscheme/lua/mk_todos_readable.lua @@ -0,0 +1,16 @@ +local opts = { bg = "NONE", bold = true } + +---@param hl_group string: The name of the hl group +---@param extra_opts table: Extra options to pass to nvim_set_hl +local set_hl = function(hl_group, extra_opts) + local local_opts = vim.deepcopy(opts) + for k, v in ipairs(extra_opts) do + local_opts[k] = v + end + vim.api.nvim_set_hl(0, hl_group, local_opts) +end + +set_hl("@text.danger", { fg = "red" }) +set_hl("@text.note", { fg = "blue" }) +set_hl("@text.todo", { fg = "green" }) +set_hl("@text.warning", { fg = "yellow" }) diff --git a/modules/home.legacy/conf/nvim/plgs/colorscheme/lua/nightfox.lua b/modules/home.legacy/conf/nvim/plgs/colorscheme/lua/nightfox.lua new file mode 100644 index 00000000..4c502153 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/colorscheme/lua/nightfox.lua @@ -0,0 +1,44 @@ +require("nightfox").setup({ + options = { + -- Compiled file's destination location + compile_path = vim.fn.stdpath("cache") .. "/nightfox", + compile_file_suffix = "_compiled", -- Compiled file suffix + transparent = true, -- Disable setting background + terminal_colors = true, -- Set terminal colors (vim.g.terminal_color_*) used in `:terminal` + dim_inactive = true, -- Non focused panes set to alternative background + module_default = true, -- Default enable value for modules + colorblind = { + enable = true, -- Enable colorblind support + simulate_only = false, -- Only show simulated colorblind colors and not diff shifted + severity = { + protan = 0.3, -- Severity [0,1] for protan (red) + deutan = 0.9, -- Severity [0,1] for deutan (green) + tritan = 0, -- Severity [0,1] for tritan (blue) + }, + }, + styles = { -- Style to be applied to different syntax groups + comments = "italic", -- Value is any valid attr-list value `:help attr-list` + conditionals = "NONE", + constants = "NONE", + functions = "bold", + keywords = "bold", + numbers = "NONE", + operators = "NONE", + strings = "NONE", + types = "NONE", + variables = "NONE", + }, + inverse = { -- Inverse highlight for different types + match_paren = false, + visual = false, + search = false, + }, + modules = { -- List of various plugins and additional options + diagnostic = { enable = true, background = false }, + native_lsp = { enable = true, background = false }, + }, + }, + palettes = {}, + specs = {}, + groups = {}, +}) diff --git a/modules/home.legacy/conf/nvim/plgs/comment-nvim/default.nix b/modules/home.legacy/conf/nvim/plgs/comment-nvim/default.nix new file mode 100644 index 00000000..2a73b8db --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/comment-nvim/default.nix @@ -0,0 +1,41 @@ +{...}: { + programs.nixvim = { + plugins.comment = { + enable = true; + settings = { + padding = true; + sticky = true; + mappings = { + basic = false; + extra = false; + }; + }; + }; + keymaps = [ + { + key = "gcc"; + mode = "v"; + action = "(comment_toggle_linewise_visual)"; + options.desc = "toggle the current line in a linewise comment"; + } + { + key = "gbc"; + mode = "v"; + action = "(comment_toggle_blockwise_visual)"; + options.desc = "toggle the current line in a blockwise comment"; + } + { + key = "gcc"; + mode = "n"; + action = "(comment_toggle_linewise_current)"; + options.desc = "toggle the current line in a linewise comment"; + } + { + key = "gbc"; + mode = "n"; + action = "(comment_toggle_blockwise_current)"; + options.desc = "toggle the current line in a blockwise comment"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/debugprint/default.nix b/modules/home.legacy/conf/nvim/plgs/debugprint/default.nix new file mode 100644 index 00000000..3c591e9f --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/debugprint/default.nix @@ -0,0 +1,70 @@ +{ + pkgs, + lib, + ... +}: { + programs.nixvim = { + # TODO: package debugprint though a module + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/debugprint.lua} + ''; + extraPlugins = [ + pkgs.vimExtraPlugins.debugprint-nvim + ]; + + keymaps = [ + { + key = "g?v"; + mode = ["v" "n"]; + action.__raw = '' + function() + return require('debugprint').debugprint({variable = true;}); + end + ''; + options.expr = true; + options.desc = '' + 'variable' debug line below the current line + ''; + } + { + key = "g?V"; + mode = ["v" "n"]; + action.__raw = '' + function() + return require('debugprint').debugprint({above = true; variable = true;}) ; + end + ''; + options.expr = true; + options.desc = '' + 'variable' debug line above the current line + ''; + } + { + key = "g?p"; + mode = "n"; + action.__raw = '' + function() + return require('debugprint').debugprint(); + end + ''; + options.expr = true; + options.desc = '' + 'plain' debug line below the current line + ''; + } + { + key = "g?P"; + mode = "n"; + action.__raw = '' + function() + return require('debugprint').debugprint({above = true;}); + end + ''; + options.expr = true; + options.desc = '' + 'plain' debug line above the current line + ''; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/debugprint/lua/debugprint.lua b/modules/home.legacy/conf/nvim/plgs/debugprint/lua/debugprint.lua new file mode 100644 index 00000000..da7e1735 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/debugprint/lua/debugprint.lua @@ -0,0 +1,3 @@ +require("debugprint").setup({ + create_keymaps = false, +}) diff --git a/modules/home.legacy/conf/nvim/plgs/default.nix b/modules/home.legacy/conf/nvim/plgs/default.nix new file mode 100644 index 00000000..991bc315 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/default.nix @@ -0,0 +1,33 @@ +{...}: { + imports = + [ + # Plugins not yet packaged in nixpkgs + # ./debugprint + ./lf-nvim + # ./lsp-progress-nvim + ] + ++ [ + # Already packaged in nixpkgs + ./colorscheme + ./comment-nvim + ./femaco + ./flatten-nvim + ./goto-preview + ./harpoon + ./leap + ./lsp + ./lspkind + ./ltex_extra + ./lualine + ./luasnip + ./neorg + ./nvim-cmp + ./nvim-lint + ./raw_plugins + ./telescope + ./todo-comments + ./treesitter + ./vim-tex + ./which-key + ]; +} diff --git a/modules/home.legacy/conf/nvim/plgs/femaco/default.nix b/modules/home.legacy/conf/nvim/plgs/femaco/default.nix new file mode 100644 index 00000000..6c4a7d89 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/femaco/default.nix @@ -0,0 +1,23 @@ +{ + pkgs, + lib, + ... +}: { + programs.nixvim = { + # TODO: package femaco through a module + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/femaco.lua} + ''; + extraPlugins = [ + pkgs.vimPlugins.nvim-FeMaco-lua + ]; + keymaps = [ + { + key = "cc"; + mode = "n"; + action.__raw = "require('femaco.edit').edit_code_block"; + options.desc = "edit a [c]ode blo[c]k with femaco"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/femaco/lua/femaco.lua b/modules/home.legacy/conf/nvim/plgs/femaco/lua/femaco.lua new file mode 100644 index 00000000..da3be8e1 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/femaco/lua/femaco.lua @@ -0,0 +1,50 @@ +local clip_val = require("femaco.utils").clip_val +require("femaco").setup({ + -- should prepare a new buffer and return the winid + -- by default opens a floating window + -- provide a different callback to change this behaviour + -- @param opts: the return value from float_opts + prepare_buffer = function(opts) + local buf = vim.api.nvim_create_buf(false, false) + return vim.api.nvim_open_win(buf, true, opts) + end, + -- should return options passed to nvim_open_win + -- @param code_block: data about the code-block with the keys + -- * range + -- * lines + -- * lang + float_opts = function(code_block) + return { + relative = "cursor", + width = clip_val(5, 120, vim.api.nvim_win_get_width(0) - 10), -- TODO: how to offset sign column etc? + height = clip_val(5, #code_block.lines, vim.api.nvim_win_get_height(0) - 6), + anchor = "NW", + row = 0, + col = 0, + style = "minimal", + border = "rounded", + zindex = 1, + } + end, + -- return filetype to use for a given lang + -- lang can be nil + ft_from_lang = function(lang) + return lang + end, + -- what to do after opening the float + post_open_float = function(winnr) + vim.wo.signcolumn = "no" + end, + -- create the path to a temporary file + create_tmp_filepath = function(filetype) + return os.tmpname() + end, + -- if a newline should always be used, useful for multiline injections + -- which separators needs to be on separate lines such as markdown, neorg etc + -- @param base_filetype: The filetype which FeMaco is called from, not the + -- filetype of the injected language (this is the current buffer so you can + -- get it from vim.bo.filetyp). + ensure_newline = function(base_filetype) + return false + end, +}) diff --git a/modules/home.legacy/conf/nvim/plgs/flatten-nvim/default.nix b/modules/home.legacy/conf/nvim/plgs/flatten-nvim/default.nix new file mode 100644 index 00000000..cd6f8bcc --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/flatten-nvim/default.nix @@ -0,0 +1,20 @@ +{ + pkgs, + lib, + ... +}: { + programs.nixvim = { + # TODO: package flatten-nvim though a module + + extraConfigLuaPre = '' + ${lib.strings.fileContents ./lua/flatten-nvim.lua} + if os.getenv("NVIM") ~= nil then + -- Avoid loading plugins because the host will take control of the instance anyways + return + end + ''; + extraPlugins = [ + pkgs.vimPlugins.flatten-nvim + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua b/modules/home.legacy/conf/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua new file mode 100644 index 00000000..42ea1eb6 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua @@ -0,0 +1,106 @@ +---Types: +-- +-- Passed to callbacks that handle opening files +---@alias BufInfo { fname: string, bufnr: buffer } +-- +-- Needed aliases +---@alias buffer integer: Buffer id +---@alias window integer: Window id +-- +-- The first argument is a list of BufInfo tables representing the newly opened files. +-- The third argument is a single BufInfo table, only provided when a buffer is created from stdin. +-- +-- IMPORTANT: For `block_for` to work, you need to return a buffer number OR a buffer number and a window number. +-- The `winnr` return value is not required, `vim.fn.bufwinid(bufnr)` is used if it is not provided. +-- The `filetype` of this buffer will determine whether block should happen or not. +-- +---@alias OpenHandler fun(files: BufInfo[], argv: string[], stdin_buf: BufInfo, guest_cwd: string):window, buffer +-- +require("flatten").setup({ + callbacks = { + ---Called to determine if a nested session should wait for the host to close the file. + ---param argv: a list of all the arguments in the nested session + ---@type fun(argv: table): boolean + should_block = require("flatten").default_should_block, + + ---If this returns true, the nested session will be opened. + ---If false, default behavior is used, and + ---config.nest_if_no_args is respected. + ---@type fun(host: channel):boolean + should_nest = require("flatten").default_should_nest, + + ---Called before a nested session is opened. + pre_open = function() end, + + ---Called after a nested session is opened. + ---@param bufnr buffer + ---@param winnr window + ---@param filetype string + ---@param is_blocking boolean + ---@param is_diff boolean + post_open = function(bufnr, winnr, filetype, is_blocking, is_diff) + -- If the file is a git commit, create one-shot autocmd to delete its buffer on write + if filetype == "gitcommit" or filetype == "gitrebase" then + vim.api.nvim_create_autocmd("BufWritePost", { + buffer = bufnr, + once = true, + callback = vim.schedule_wrap(function() + vim.api.nvim_buf_delete(bufnr, {}) + end), + }) + end + end, + + ---Called when a nested session is done waiting for the host. + ---@param filetype string + block_end = function(filetype) end, + }, + -- dictionary of filetypes that should be blocking + block_for = { + gitcommit = true, + }, + -- Command passthrough + allow_cmd_passthrough = true, + -- Allow a nested session to open if Neovim is opened without arguments + nest_if_no_args = false, + -- Window options + window = { + -- Options: + -- current -> open in current window (default) + -- alternate -> open in alternate window (recommended) + -- tab -> open in new tab + -- split -> open in split + -- vsplit -> open in vsplit + -- smart -> smart open (avoids special buffers) + -- OpenHandler -> allows you to handle file opening yourself (see Types) + -- + -- TODO: Open gitcommit filetypes in the current buffer, everything else in a new tab <2023-08-29> + open = "split", + + -- Options: + -- vsplit -> opens files in diff vsplits + -- split -> opens files in diff splits + -- tab_vsplit -> creates a new tabpage, and opens diff vsplits + -- tab_split -> creates a new tabpage, and opens diff splits + -- OpenHandler -> allows you to handle file opening yourself (see Types) + diff = "tab_vsplit", + + -- Affects which file gets focused when opening multiple at once + -- Options: + -- "first" -> open first file of new files (default) + -- "last" -> open last file of new files + focus = "first", + }, + -- Override this function to use a different socket to connect to the host + -- On the host side this can return nil or the socket address. + -- On the guest side this should return the socket address + -- or a non-zero channel id from `sockconnect` + -- flatten.nvim will detect if the address refers to this instance of nvim, to determine if this is a host or a guest + pipe_path = require("flatten").default_pipe_path, + -- The `default_pipe_path` will treat the first nvim instance within a single kitty/wezterm session as the host + -- You can configure this behaviour using the following: + one_per = { + kitty = true, -- Flatten all instance in the current Kitty session + wezterm = true, -- Flatten all instance in the current Wezterm session + }, +}) diff --git a/modules/home.legacy/conf/nvim/plgs/goto-preview/default.nix b/modules/home.legacy/conf/nvim/plgs/goto-preview/default.nix new file mode 100644 index 00000000..3de28c68 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/goto-preview/default.nix @@ -0,0 +1,47 @@ +{ + pkgs, + lib, + ... +}: { + programs.nixvim = { + # TODO: package goto-preview though a module + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/goto-preview.lua} + ''; + extraPlugins = [ + pkgs.vimPlugins.goto-preview + ]; + keymaps = [ + { + key = "gd"; + mode = "n"; + action.__raw = "require('goto-preview').goto_preview_definition"; + options.desc = "[G]oto [D]efinition"; + } + { + key = "gtd"; + mode = "n"; + action.__raw = "require('goto-preview').goto_preview_type_definition"; + options.desc = "[G]oto the [t]ype [D]efinition"; + } + { + key = "gi"; + mode = "n"; + action.__raw = "require('goto-preview').goto_preview_implementation"; + options.desc = "[G]oto [I]mplementations"; + } + { + key = "gr"; + mode = "n"; + action.__raw = "require('goto-preview').goto_preview_references"; + options.desc = "[G]o to all [R]eferences of the symbol"; + } + { + key = "\\"; + mode = "n"; + action.__raw = "require('goto-preview').close_all_win"; + options.desc = "close all preview windows"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/goto-preview/lua/goto-preview.lua b/modules/home.legacy/conf/nvim/plgs/goto-preview/lua/goto-preview.lua new file mode 100644 index 00000000..9687a5a0 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/goto-preview/lua/goto-preview.lua @@ -0,0 +1,21 @@ +require("goto-preview").setup({ + width = 120, -- Width of the floating window + height = 15, -- Height of the floating window + border = { "↖", "─", "┐", "│", "┘", "─", "└", "│" }, -- Border characters of the floating window + default_mappings = false, -- Bind default mappings + debug = false, -- Print debug information + opacity = nil, -- 0-100 opacity level of the floating window where 100 is fully transparent. + resizing_mappings = false, -- Binds arrow keys to resizing the floating window. + post_open_hook = nil, -- A function taking two arguments, a buffer and a window to be ran as a hook. + post_close_hook = nil, -- A function taking two arguments, a buffer and a window to be ran as a hook. + references = { -- Configure the telescope UI for slowing the references cycling window. + telescope = {}, -- require("telescope.themes").get_dropdown({ hide_preview = false }) + }, + -- These two configs can also be passed down to the goto-preview definition and implementation calls for one off "peak" functionality. + focus_on_open = true, -- Focus the floating window when opening it. + dismiss_on_move = false, -- Dismiss the floating window when moving the cursor. + force_close = true, -- passed into vim.api.nvim_win_close's second argument. See :h nvim_win_close + bufhidden = "wipe", -- the bufhidden option to set on the floating window. See :h bufhidden + stack_floating_preview_windows = true, -- Whether to nest floating windows + preview_window_title = { enable = true, position = "left" }, -- Whether to set the preview window title as the filename +}) diff --git a/modules/home.legacy/conf/nvim/plgs/harpoon/default.nix b/modules/home.legacy/conf/nvim/plgs/harpoon/default.nix new file mode 100644 index 00000000..465f24f0 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/harpoon/default.nix @@ -0,0 +1,94 @@ +{pkgs, ...}: let + numbers = ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"]; + mkNumberedCommand = { + command_template, + prefix, + number, + desc_template, + }: { + key = "${prefix}${number}"; + action.__raw = '' + function() + ${command_template number} + end + ''; + options.desc = "${desc_template number}"; + }; + mkGotoTerminalCommand = number: let + desc_template = number: "Goto terminal number ${number}"; + command_template = number: ''require("harpoon.term").gotoTerminal(${number})''; + prefix = "gt"; + in + mkNumberedCommand {inherit desc_template command_template prefix number;}; + mkGotoFileCommand = number: let + desc_template = number: "Goto Buffer number ${number}"; + command_template = number: ''require("harpoon.ui").nav_file(${number})''; + prefix = "gf"; + in + mkNumberedCommand {inherit desc_template command_template prefix number;}; + + gotoTerminalMappings = builtins.map mkGotoTerminalCommand numbers; + gotoFileMappings = builtins.map mkGotoFileCommand numbers; +in { + programs.nixvim = { + plugins.harpoon = { + enable = true; + package = pkgs.vimPlugins.harpoon; + enableTelescope = true; + # menu.width = "vim.api.nvim_win_get_width(0) - 4"; # TODO: integrate that + keymaps = { + tmuxGotoTerminal = null; # TODO: + }; + }; + keymaps = + [ + { + key = "-"; + action.__raw = '' + function() + require("harpoon.ui").nav_next() + end + ''; + options.desc = "go to the next marked file"; + } + { + key = "_"; + action.__raw = '' + function() + require("harpoon.ui").nav_prev() + end + ''; + options.desc = "go to the previous marked file"; + } + { + key = ""; + action.__raw = '' + function() + require("harpoon.mark").add_file() + end + ''; + options.desc = "add a mark to the open file in harpoon."; + } + { + key = "gqc"; + action.__raw = '' + function() + require("harpoon.cmd-ui").toggle_quick_menu() + end + ''; + options.desc = "toggle the harpoon command quick menu to see all commands."; + } + { + key = "q"; + action.__raw = '' + function() + require("harpoon.ui").toggle_quick_menu() + end + ''; + options.desc = "toggle the harpoon normal quick menu to see all marks."; + } + ] + ++ gotoFileMappings + ++ gotoTerminalMappings; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/leap/default.nix b/modules/home.legacy/conf/nvim/plgs/leap/default.nix new file mode 100644 index 00000000..4e7ae60c --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/leap/default.nix @@ -0,0 +1,59 @@ +{...}: { + programs.nixvim = { + plugins.leap = { + enable = true; + addDefaultMappings = false; # They don't work with dvorak. + safeLabels = [ + "f" + "j" + "k" + "l" + "/" + "z" + "S" + "F" + "J" + "K" + "L" + "H" + "W" + "E" + "M" + "B" + "U" + "X" + "?" + "Z" + ]; + }; + keymaps = [ + { + key = "j"; + action = "(leap-forward-to)"; + options.desc = "jump forward to"; + } + { + key = "J"; + action = "(leap-backward-to)"; + options.desc = "jump backward to"; + } + { + key = "gj"; + action = "(leap-from-window)"; + options.desc = "jump to enterable windows"; + } + /* + {key= "x"; + mode = "v"; + action = "(leap-forward-till)"; + options.desc = "leap forward till"; + } + {key= "X"; + mode = "v"; + action = "(leap-backward-till)"; + options.desc = "leap backward till"; + } + */ + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lf-nvim/default.nix b/modules/home.legacy/conf/nvim/plgs/lf-nvim/default.nix new file mode 100644 index 00000000..11ad2807 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lf-nvim/default.nix @@ -0,0 +1,18 @@ +{ + pkgs, + lib, + ... +}: { + programs.nixvim = { + # TODO: package lf-nvim though a module + # FIXME: change the nvim path, when I change the path with lf + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/lf-nvim.lua} + ''; + extraPlugins = [ + pkgs.vimExtraPlugins.lf-nvim + + pkgs.vimPlugins.toggleterm-nvim # required by lf-nvim + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua b/modules/home.legacy/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua new file mode 100644 index 00000000..1eadf375 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua @@ -0,0 +1,43 @@ +local fn = vim.fn + +-- Defaults +require("lf").setup({ + default_action = "drop", -- default action when `Lf` opens a file + -- TODO: what do these mappings do? + default_actions = { -- default action keybindings + [""] = "tabedit", + [""] = "split", + [""] = "vsplit", + [""] = "tab drop", + }, + + winblend = 10, -- psuedotransparency level + dir = "", -- directory where `lf` starts ('gwd' is git-working-directory, ""/nil is CWD) + direction = "float", -- window type: float horizontal vertical + border = "rounded", -- border kind: single double shadow curved + height = fn.float2nr(fn.round(0.75 * vim.o.lines)), -- height of the *floating* window + width = fn.float2nr(fn.round(0.75 * vim.o.columns)), -- width of the *floating* window + escape_quit = true, -- map escape to the quit command (so it doesn't go into a meta normal mode) + focus_on_open = true, -- focus the current file when opening Lf (experimental) + mappings = true, -- whether terminal buffer mapping is enabled + tmux = false, -- tmux statusline can be disabled on opening of Lf + default_file_manager = true, -- make lf default file manager + disable_netrw_warning = true, -- don't display a message when opening a directory with `default_file_manager` as true + highlights = { -- highlights passed to toggleterm + Normal = { link = "Normal" }, + NormalFloat = { link = "Normal" }, + FloatBorder = { guifg = "#cdcbe0", guibg = "#191726" }, + }, + + -- Layout configurations + layout_mapping = "", -- resize window with this key + views = { -- window dimensions to rotate through + { width = 0.800, height = 0.800 }, + { width = 0.600, height = 0.600 }, + { width = 0.950, height = 0.950 }, + { width = 0.500, height = 0.500, col = 0, row = 0 }, + { width = 0.500, height = 0.500, col = 0, row = 0.5 }, + { width = 0.500, height = 0.500, col = 0.5, row = 0 }, + { width = 0.500, height = 0.500, col = 0.5, row = 0.5 }, + }, +}) diff --git a/modules/home.legacy/conf/nvim/plgs/lsp-progress-nvim/default.nix b/modules/home.legacy/conf/nvim/plgs/lsp-progress-nvim/default.nix new file mode 100644 index 00000000..6602ceb6 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp-progress-nvim/default.nix @@ -0,0 +1,50 @@ +{ + lib, + pkgs, + ... +}: { + programs.nixvim = { + # TODO: package lsp-progress-nvim though a module + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/lsp-progress-nvim.lua} + ''; + extraPlugins = [ + pkgs.vimExtraPlugins.lsp-progress-nvim + ]; + + # Status line setup + autoGroups.lsp_refresh.clear = true; + autoCmd = [ + { + event = ["User LspProgressStatusUpdated"]; + pattern = ["*"]; + callback = + /* + lua + */ + { + __raw = '' + require("lualine").refresh + ''; + }; + group = "lsp_refresh"; + description = "Refresh the statusbar when the lsp status was updated."; + } + ]; + plugins.lualine = let + get_lsp_progress = { + __raw = + /* + lua + */ + '' + require('lsp-progress').progress + ''; + }; + in { + sections = { + lualine_c = [{name = get_lsp_progress;}]; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua b/modules/home.legacy/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua new file mode 100644 index 00000000..efb15720 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua @@ -0,0 +1,150 @@ +--- @type table +require("lsp-progress").setup({ + -- Spinning icons. + -- + --- @type string[] + spinner = { "⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷" }, + + -- Spinning update time in milliseconds. + -- + --- @type integer + spin_update_time = 200, + + -- Last message cached decay time in milliseconds. + -- + -- Message could be really fast(appear and disappear in an + -- instant) that user cannot even see it, thus we cache the last message + -- for a while for user view. + -- + --- @type integer + decay = 700, + + -- User event name. + -- + --- @type string + event = "LspProgressStatusUpdated", + + -- Event update time limit in milliseconds. + -- + -- Sometimes progress handler could emit many events in an instant, while + -- refreshing statusline cause too heavy synchronized IO, so we limit the + -- event rate to reduce this cost. + -- + --- @type integer + event_update_time_limit = 100, + + -- Max progress string length, by default -1 is unlimited. + -- + --- @type integer + max_size = -1, + + -- Regular internal update time. + -- + -- Emit user event to update the lsp progress status, even there's no new + -- message. + -- + --- @type integer + regular_internal_update_time = 500, + + -- Disable emitting events on specific mode/filetype. + -- User events would interrupt insert mode, thus break which-key like plugins behaviour. + -- See: + -- * https://github.com/linrongbin16/lsp-progress.nvim/issues/50 + -- * https://neovim.io/doc/user/builtin.html#mode() + -- + --- @type table[] + disable_events_opts = { { mode = "i", filetype = "TelescopePrompt" } }, + + -- Format series message. + -- + -- By default it looks like: `formatting isort (100%) - done`. + -- + --- @param title string|nil + --- Message title. + --- @param message string|nil + --- Message body. + --- @param percentage number|nil + --- Progress in percentage numbers: 0-100. + --- @param done boolean + --- Indicate whether this series is the last one in progress. + --- @return string|nil messages + --- The returned value will be passed to function `client_format` as + --- one of the `series_messages` array, or ignored if return nil. + series_format = function(title, message, percentage, done) + local builder = {} + local has_title = false + local has_message = false + if title and title ~= "" then + table.insert(builder, title) + has_title = true + end + if message and message ~= "" then + table.insert(builder, message) + has_message = true + end + if percentage and (has_title or has_message) then + table.insert(builder, string.format("(%.0f%%%%)", percentage)) + end + if done and (has_title or has_message) then + table.insert(builder, "- done") + end + return table.concat(builder, " ") + end, + + -- Format client message. + -- + -- By default it looks like: + -- `[null-ls] ⣷ formatting isort (100%) - done, formatting black (50%)`. + -- + --- @param client_name string + --- Client name. + --- @param spinner string + --- Spinner icon. + --- @param series_messages string[]|table[] + --- Messages array. + --- @return string|nil messages + --- The returned value will be passed to function `format` as one of the + --- `client_messages` array, or ignored if return nil. + client_format = function(client_name, spinner, series_messages) + return #series_messages > 0 + and ("[" .. client_name .. "] " .. spinner .. " " .. table.concat(series_messages, ", ")) + or nil + end, + + -- Format (final) message. + -- + -- By default it looks like: + -- ` LSP [null-ls] ⣷ formatting isort (100%) - done, formatting black (50%)` + -- + --- @param client_messages string[]|table[] + --- Client messages array. + --- @return nil|string message + --- The returned value will be returned from `progress` API. + format = function(client_messages) + local sign = " LSP" -- nf-fa-gear \uf013 + return #client_messages > 0 and (sign .. " " .. table.concat(client_messages, " ")) or sign + end, + + -- Enable debug. + -- + --- @type boolean + debug = false, + + -- Print log to console(command line). + -- + --- @type boolean + console_log = false, + + -- Print log to file. + -- + --- @type boolean + file_log = true, + + -- Log file to write, work with `file_log=true`. + -- + -- For Windows: `$env:USERPROFILE\AppData\Local\nvim-data\lsp-progress.log`. + -- For *NIX: `~/.local/share/nvim/lsp-progress.log`. + -- + --- @type string + file_log_name = "lsp-progress.log", +}) diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/default.nix b/modules/home.legacy/conf/nvim/plgs/lsp/default.nix new file mode 100644 index 00000000..b7c1e174 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/default.nix @@ -0,0 +1,29 @@ +{...}: { + imports = [ + ./keymaps + ./servers + ]; + programs.nixvim.plugins.lsp = { + enable = true; + onAttach = + "" + # + '' + # function(client, bufnr) + # -- Enable completion triggered by + # -- vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') + # end + # '' + ; + preConfig = '' + vim.diagnostic.config({ + underline = true, + -- virtual_text = true, + virtual_text = { + source = "always", -- Or "if_many" + }, + update_in_insert = true, + severity_sort = true, + }, nil); + ''; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/keymaps/default.nix b/modules/home.legacy/conf/nvim/plgs/lsp/keymaps/default.nix new file mode 100644 index 00000000..b1276639 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/keymaps/default.nix @@ -0,0 +1,70 @@ +{...}: { + programs.nixvim = { + plugins.lsp.keymaps = { + diagnostic = { + "N" = { + action = "goto_prev"; + desc = "go to previous diagnostic message"; + }; + "T" = { + action = "goto_next"; + desc = "go to next diagnostic message"; + }; + "e" = { + action = "open_float"; + desc = "open float for the symbol"; + }; + "gq" = { + action = "setloclist"; + desc = "add buffer diagnostic to the location list (quick-fix)"; + }; + }; + lspBuf = { + "gD" = { + action = "declaration"; + desc = "[G]o to [d]eclaration"; + }; + "hi" = { + action = "hover"; + desc = "Display [h]over [i]nformation"; + }; + "sh" = { + action = "signature_help"; + desc = "Display [s]ignature [h]elp"; + }; + "wa" = { + action = "add_workspace_folder"; + desc = "[W]orkspace folder [a]dd"; + }; + "wr" = { + action = "remove_workspace_folder"; + desc = "[W]orkspace folder [r]emove"; + }; + "rn" = { + action = "rename"; + desc = "[R]e[n]ame the item under the cursor"; + }; + "ca" = { + action = "code_action"; + desc = "Open the [c]ode [a]ction menu"; + }; + }; + }; + keymaps = [ + { + key = "f"; + action.__raw = "function() vim.lsp.buf.format { async = true } end"; + options.desc = "[F]ormat the current buffer (asynchronously)"; + } + { + key = "wl"; + action.__raw = '' + function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end + ''; + options.desc = "[W]orkspace folders [l]ist"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/default.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/default.nix new file mode 100644 index 00000000..605046d4 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/default.nix @@ -0,0 +1,15 @@ +{...}: { + imports = [ + # ./servers/pylyzer.nix + ./servers/bashls.nix + ./servers/ccls.nix + ./servers/quick-lint-js.nix + ./servers/ltex.nix + ./servers/lua-ls.nix + ./servers/nil-ls.nix + ./servers/openscad.nix + ./servers/ruff-lsp.nix + ./servers/rust-analyzer.nix + ./servers/texlab.nix + ]; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/bashls.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/bashls.nix new file mode 100644 index 00000000..0577a335 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/bashls.nix @@ -0,0 +1,5 @@ +{...}: { + programs.nixvim.plugins.lsp.servers = { + bashls.enable = true; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ccls.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ccls.nix new file mode 100644 index 00000000..0698bcce --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ccls.nix @@ -0,0 +1,5 @@ +{...}: { + programs.nixvim.plugins.lsp.servers = { + ccls.enable = true; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ltex.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ltex.nix new file mode 100644 index 00000000..3224bc41 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ltex.nix @@ -0,0 +1,39 @@ +{...}: { + programs.nixvim.plugins.lsp.servers = { + ltex = let + filetypes = [ + "java" + "cpp" + "shell" + "bash" + + "bibtex" + "context" + "context.tex" + "latex" + "tex" + + "markdown" + "org" + "restructuredtext" + "rsweave" + + "git-commit" + "gitcommit" + + "mail" + ]; + in { + enable = true; + inherit filetypes; + settings = { + enabled = filetypes; + completionEnabled = false; + language = "en-CA"; + additionalRules = { + enablePickyRules = true; + }; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/lua-ls.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/lua-ls.nix new file mode 100644 index 00000000..4f20558c --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/lua-ls.nix @@ -0,0 +1,8 @@ +{...}: { + programs.nixvim.plugins.lsp.servers = { + lua_ls = { + enable = true; + settings.telemetry.enable = false; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/nil-ls.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/nil-ls.nix new file mode 100644 index 00000000..f0cccbdc --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/nil-ls.nix @@ -0,0 +1,10 @@ +{...}: { + programs.nixvim.plugins.lsp.servers = { + nil_ls = { + enable = true; + settings = { + formatting.command = ["alejandra"]; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/openscad.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/openscad.nix new file mode 100644 index 00000000..a0221cc4 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/openscad.nix @@ -0,0 +1,17 @@ +{pkgs, ...}: { + programs.nixvim = { + extraConfigLuaPost = + /* + lua + */ + '' + require('lspconfig').openscad_lsp.setup{ + cmd = {"openscad-lsp", "--stdio", "--fmt-style", "WebKit"}, + } + ''; + extraPackages = with pkgs; [ + openscad-lsp + clang-tools # Need to satisfy `clang-format` (which is used by openscad-lsp) + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/pylyzer.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/pylyzer.nix new file mode 100644 index 00000000..b1042221 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/pylyzer.nix @@ -0,0 +1,12 @@ +{pkgs, ...}: { + programs.nixvim = { + extraConfigLuaPost = + /* + lua + */ + '' + require('lspconfig').pylyzer.setup{} + ''; + extraPackages = with pkgs; [pylyzer]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/quick-lint-js.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/quick-lint-js.nix new file mode 100644 index 00000000..23c3054a --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/quick-lint-js.nix @@ -0,0 +1,15 @@ +{pkgs, ...}: { + programs.nixvim = { + extraConfigLuaPost = + /* + lua + */ + '' + require('lspconfig').quick_lint_js.setup{ + } + ''; + extraPackages = with pkgs; [ + quick-lint-js + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ruff-lsp.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ruff-lsp.nix new file mode 100644 index 00000000..6fbdc998 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/ruff-lsp.nix @@ -0,0 +1,10 @@ +{pkgs, ...}: { + programs.nixvim = { + plugins.lsp.servers = { + ruff_lsp = { + enable = true; + }; + }; + extraPackages = with pkgs; [ruff]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/rust-analyzer.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/rust-analyzer.nix new file mode 100644 index 00000000..5da61a71 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/rust-analyzer.nix @@ -0,0 +1,17 @@ +{...}: { + programs.nixvim.plugins.lsp.servers = { + rust_analyzer = { + enable = true; + settings = { + typing.autoClosingAngleBrackets.enable = true; + + # Check with `cargo clippy` instead of just `cargo check` + check.command = "clippy"; + }; + # NOTE: These should be provided by the devenv, to support nightly and + # such things <2023-11-25> + installCargo = false; + installRustc = false; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/texlab.nix b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/texlab.nix new file mode 100644 index 00000000..59af8d39 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lsp/servers/servers/texlab.nix @@ -0,0 +1,7 @@ +{...}: { + programs.nixvim.plugins.lsp.servers = { + texlab = { + enable = true; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/lspkind/default.nix b/modules/home.legacy/conf/nvim/plgs/lspkind/default.nix new file mode 100644 index 00000000..ed7d411b --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lspkind/default.nix @@ -0,0 +1,6 @@ +{...}: { + programs.nixvim.plugins.lspkind = { + enable = true; + preset = "default"; # "codicons" is only for a font patched with vscode-codeicons. + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/ltex_extra/default.nix b/modules/home.legacy/conf/nvim/plgs/ltex_extra/default.nix new file mode 100644 index 00000000..af78c7a5 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/ltex_extra/default.nix @@ -0,0 +1,9 @@ +{pkgs, ...}: { + programs.nixvim = { + # TODO: package ltex_extra though a module + extraPlugins = [ + pkgs.vimPlugins.ltex_extra-nvim + ]; + plugins.lsp.servers.ltex.onAttach.function = builtins.readFile ./lua/ltex_extra.lua; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua b/modules/home.legacy/conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua new file mode 100644 index 00000000..d532428a --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua @@ -0,0 +1,16 @@ +require("ltex_extra").setup({ + -- table : languages for witch dictionaries will be loaded, e.g. { "es-AR", "en-US" } + -- https://valentjn.github.io/ltex/supported-languages.html#natural-languages + load_langs = { "en-CA", "de-DE", "sv-SE" }, -- en-US as default + -- boolean : whether to load dictionaries on startup + init_check = true, + -- string : relative or absolute path to store dictionaries + -- e.g. subfolder in the project root or the current working directory: ".ltex" + -- e.g. shared files for all projects: vim.fn.expand("~") .. "/.local/share/ltex" + path = vim.fn.expand("~") .. "/.local/state/nvim/ltex", -- project root or current working directory + -- string : "none", "trace", "debug", "info", "warn", "error", "fatal" + log_level = "warn", + -- table : configurations of the ltex language server. + -- Only if you are calling the server from ltex_extra + server_opts = nil, +}) diff --git a/modules/home.legacy/conf/nvim/plgs/lualine/default.nix b/modules/home.legacy/conf/nvim/plgs/lualine/default.nix new file mode 100644 index 00000000..54d20380 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/lualine/default.nix @@ -0,0 +1,121 @@ +{...}: { + programs.nixvim.plugins.lualine = let + get_location_of_file = { + __raw = '' + function() + local file_lines = vim.fn.line('$'); + local file_current_cursor_positon = vim.fn.getcurpos(); + return file_current_cursor_positon[3] .. ":" .. file_current_cursor_positon[2] .. "/" .. file_lines + end + ''; + }; + + get_trailing_whitespace = { + __raw = '' + function() + local space = vim.fn.search([[\s\+$]], 'nwc') + return space ~= 0 and "TW:" .. space or "" + end + ''; + }; + get_mixed_indent = { + __raw = + /* + lua + */ + '' + function() + local space_pat = [[\v^ +]] + local tab_pat = [[\v^\t+]] + local space_indent = vim.fn.search(space_pat, 'nwc') + local tab_indent = vim.fn.search(tab_pat, 'nwc') + local mixed = (space_indent > 0 and tab_indent > 0) + local mixed_same_line + if not mixed then + mixed_same_line = vim.fn.search([[\v^(\t+ | +\t)]], 'nwc') + mixed = mixed_same_line > 0 + end + if not mixed then return "" end + if mixed_same_line ~= nil and mixed_same_line > 0 then + return 'MI:' .. mixed_same_line + end + local space_indent_cnt = vim.fn.searchcount({ pattern = space_pat, max_count = 1e3 }).total + local tab_indent_cnt = vim.fn.searchcount({ pattern = tab_pat, max_count = 1e3 }).total + if space_indent_cnt > tab_indent_cnt then + return 'MI:' .. tab_indent + else + return 'MI:' .. space_indent + end + end + ''; + }; + in { + enable = true; + + settings = { + options = { + iconsEnabled = true; + theme = "nightfox"; + }; + + # TODO: add all installed and supported extensions here + extensions = [ + "toggleterm" + #"fugitive" # TODO: maybe add this? + ]; + + componentSeparators = { + left = ""; + right = ""; + }; + sectionSeparators = { + left = ""; + right = ""; + }; + disabledFiletypes = { + statusline = []; + winbar = []; + }; + ignoreFocus = []; + alwaysDivideMiddle = true; + globalstatus = false; + refresh = { + statusline = 1000; + tabline = 1000; + winbar = 1000; + }; + sections = { + lualine_a = ["mode"]; + lualine_b = [ + { + __raw = '' + {'FugitiveHead', icon = ""} + ''; + } + "diff" + "diagnostics" + ]; + lualine_c = ["filename"]; + lualine_x = ["searchcount" "filetype"]; + lualine_y = [ + "encoding" + "fileformat" + get_mixed_indent + get_trailing_whitespace + ]; + lualine_z = [get_location_of_file]; + }; + inactiveSections = { + lualine_a = []; + lualine_b = []; + lualine_c = ["filename"]; + lualine_x = [get_location_of_file]; + lualine_y = []; + lualine_z = []; + }; + tabline = {}; + winbar = {}; + inactiveWinbar = {}; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/luasnip/default.nix b/modules/home.legacy/conf/nvim/plgs/luasnip/default.nix new file mode 100644 index 00000000..130fafee --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/luasnip/default.nix @@ -0,0 +1,20 @@ +{ + lib, + pkgs, + ... +}: { + programs.nixvim = { + plugins.luasnip = { + enable = true; + }; + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/luasnip.lua}; + require("luasnip.loaders.from_lua").load({paths = "${./lua/snippets}"}); + require("luasnip.loaders.from_lua").lazy_load({paths = "${./lua/snippets}"}); + ''; + extraPlugins = [ + # needed for the todo-comments snippets + pkgs.vimPlugins.comment-nvim + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/luasnip/lua/luasnip.lua b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/luasnip.lua new file mode 100644 index 00000000..a05fa57f --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/luasnip.lua @@ -0,0 +1,7 @@ +require("luasnip").config.set_config({ + -- Enable auto triggered snippets + enable_autosnippets = true, + + -- Use Tab (or some other key if you prefer) to trigger visual selection + store_selection_keys = "", +}) diff --git a/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/all.lua b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/all.lua new file mode 100644 index 00000000..c3f75058 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/all.lua @@ -0,0 +1,182 @@ +local ls = require("luasnip") +-- auto_pairs {{{ +local get_visual = function(args, parent) + if #parent.snippet.env.SELECT_RAW > 0 then + return sn(nil, i(1, parent.snippet.env.SELECT_RAW)) + else + return sn(nil, i(1, "")) + end +end +local function char_count_same(c1, c2) + local line = vim.api.nvim_get_current_line() + -- '%'-escape chars to force explicit match (gsub accepts patterns). + -- second return value is number of substitutions. + local _, ct1 = string.gsub(line, "%" .. c1, "") + local _, ct2 = string.gsub(line, "%" .. c2, "") + return ct1 == ct2 +end + +local function even_count(c, ...) + local line = vim.api.nvim_get_current_line() + local _, ct = string.gsub(line, c, "") + return ct % 2 == 0 +end + +-- This makes creation of pair-type snippets easier. +local function pair(pair_begin, pair_end, file_types, condition_function) + -- FIXME(@Soispha): This only works if file_types == nil, otherwise the snippet does not expand. + -- It would be nice, if it would support both an empty array (`{}`) and nil <2023-08-27> + -- file_types = file_types or {}; + + return s( + { trig = pair_begin, wordTrig = false, snippetType = "autosnippet" }, + { t({ pair_begin }), d(1, get_visual), t({ pair_end }) }, + { + condition = function() + local filetype_check = true + if file_types ~= nil then + filetype_check = file_types[vim.bo.filetype] or false + end + return (not condition_function(pair_begin, pair_end)) and filetype_check + end, + } + ) +end + +local auto_pairs = { + pair("(", ")", nil, char_count_same), + pair("{", "}", nil, char_count_same), + pair("[", "]", nil, char_count_same), + pair("<", ">", { ["rust"] = true, ["tex"] = true }, char_count_same), + pair("'", "'", nil, even_count), + pair('"', '"', nil, even_count), + pair("`", "`", nil, even_count), +} + +ls.add_snippets("all", auto_pairs, { type = "snippets", key = "auto_pairs" }) +-- }}} + +-- todo_comments {{{ +local calculate_comment_string = require("Comment.ft").calculate +local utils = require("Comment.utils") + +--- Get the comment string {beg,end} table +---@param ctype integer 1 for `line`-comment and 2 for `block`-comment +---@return table comment_strings {begcstring, endcstring} +local get_cstring = function(ctype) + -- use the `Comments.nvim` API to fetch the comment string for the region (eq. '--%s' or '--[[%s]]' for `lua`) + local cstring = calculate_comment_string({ ctype = ctype, range = utils.get_region() }) or vim.bo.commentstring + -- as we want only the strings themselves and not strings ready for using `format` we want to split the left and right side + local left, right = utils.unwrap_cstr(cstring) + -- create a `{left, right}` table for it + return { left, right } +end +_G.luasnip = {} +_G.luasnip.vars = { + username = "@soispha", + email = "soispha@vhack.eu", +} + +--- Options for marks to be used in a TODO comment +---@return table,table: The first table contains a node for the date, the second for the signature +local marks = { + signature = function() + return t("(" .. _G.luasnip.vars.username .. ")"), t("") + end, + date_signature = function() + return t("<" .. os.date("%Y-%m-%d") .. ">"), t("(" .. _G.luasnip.vars.username .. ")") + end, + date = function() + return t("<" .. os.date("%Y-%m-%d") .. ">"), t("") + end, + empty = function() + return t(""), t("") + end, +} + +---@param alias string +---@param opts table +---@param mark_function function: This function should return two nodes +---@return table: Returns the comment node +local todo_snippet_nodes = function(alias, opts, mark_function) + local date_node, signature_node = mark_function() + -- format them into the actual snippet + local comment_node = fmta("<> <><>: <> <> <>", { + f(function() + return get_cstring(opts.ctype)[1] -- get + end), + t(alias), -- [name-of-comment] + signature_node, + i(0), -- {comment-text} + date_node, + f(function() + return get_cstring(opts.ctype)[2] -- get + end), + }) + return comment_node +end + +--- Generate a TODO comment snippet with an automatic description and docstring +---@param context table merged with the generated context table `trig` must be specified +---@param alias string of aliases for the todo comment (ex.: {FIX, ISSUE, FIXIT, BUG}) +---@param opts table merged with the snippet opts table +---@param mark_function function: The function used to get the marks +local todo_snippet = function(context, alias, opts, mark_function) + opts = opts or {} + context = context or {} + if not context.trig then + return error("context doesn't include a `trig` key which is mandatory", 2) -- all we need from the context is the trigger + end + opts.ctype = opts.ctype or 1 -- comment type can be passed in the `opts` table, but if it is not, we have to ensure, it is defined + local alias_string = alias -- `choice_node` documentation + context.name = context.name or (alias_string .. " comment") -- generate the `name` of the snippet if not defined + context.dscr = context.dscr or (alias_string .. " comment with a signature-mark") -- generate the `dscr` if not defined + context.docstring = context.docstring or (" {1:" .. alias_string .. "}: {3} <{2:mark}>{0} ") -- generate the `docstring` if not defined + local comment_node = todo_snippet_nodes(alias, opts, mark_function) + return s(context, comment_node, opts) -- the final todo-snippet constructed from our parameters +end + +---@param context table: The luasnip context +---@param opts table: The luasnip opts table, needs to have a ctype set +---@param aliases string: All aliases for a name +---@param marks table: Possible marks to account in snipped generation +---@return table: All possible snippets build from the marks +local process_marks = function(context, aliases, opts, marks) + local output = {} + for mark_name, mark_function in pairs(marks) do + local contex_trig_local = context.trig + context.trig = context.trig .. "-" .. mark_name + output[#output + 1] = todo_snippet(context, aliases, opts, mark_function) + context.trig = contex_trig_local + end + return output +end + +local todo_snippet_specs = { + { { trig = "todo" }, { "TODO" }, { ctype = 1 } }, + { { trig = "fix" }, { "FIXME", "ISSUE" }, { ctype = 1 } }, + { { trig = "hack" }, { "HACK" }, { ctype = 1 } }, + { { trig = "warn" }, { "WARNING" }, { ctype = 1 } }, + { { trig = "perf" }, { "PERFORMANCE", "OPTIMIZE" }, { ctype = 1 } }, + { { trig = "note" }, { "NOTE", "INFO" }, { ctype = 1 } }, + + -- NOTE: Block commented todo-comments + { { trig = "todob" }, { "TODO" }, { ctype = 2 } }, + { { trig = "fixb" }, { "FIXME", "ISSUE" }, { ctype = 2 } }, + { { trig = "hackb" }, { "HACK" }, { ctype = 2 } }, + { { trig = "warnb" }, { "WARNING" }, { ctype = 2 } }, + { { trig = "perfb" }, { "PERF", "PERFORMANCE", "OPTIM", "OPTIMIZE" }, { ctype = 2 } }, + { { trig = "noteb" }, { "NOTE", "INFO" }, { ctype = 2 } }, +} + +local todo_comment_snippets = {} +for _, v in ipairs(todo_snippet_specs) do + local snippets = process_marks(v[1], v[2][1], v[3], marks) + for _, value in pairs(snippets) do + table.insert(todo_comment_snippets, value) + end +end + +ls.add_snippets("all", todo_comment_snippets, { type = "snippets", key = "todo_comments" }) + +-- }}} diff --git a/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/html/html.lua b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/html/html.lua new file mode 100644 index 00000000..17e1e7fb --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/html/html.lua @@ -0,0 +1,108 @@ +local get_visual = function(args, parent) + if #parent.snippet.env.SELECT_RAW > 0 then + return sn(nil, i(1, parent.snippet.env.SELECT_RAW)) + else + return sn(nil, i(1)) + end +end + +local line_begin = require("luasnip.extras.expand_conditions").line_begin + +return { + -- HEADER + s( + { + trig = "h([123456])", + regTrig = true, + wordTrig = false, + snippetType = "autosnippet", + }, + fmt( + [[ + {} + ]], + { + f(function(_, snip) + return snip.captures[1] + end), + d(1, get_visual), + f(function(_, snip) + return snip.captures[1] + end), + } + ), + { condition = line_begin } + ), -- PARAGRAPH + s( + { trig = "pp", snippetType = "autosnippet" }, + fmt( + [[ +

{}

+ ]], + { d(1, get_visual) } + ), + { condition = line_begin } + ), -- UNORDERED LIST + s( + { trig = "itt", snippetType = "autosnippet" }, + fmt( + [[ +
    +
  • {}
  • {} +
+ ]], + { i(1), i(0) } + ), + { condition = line_begin } + ), -- LIST ITEM + s( + { trig = "ii", snippetType = "autosnippet" }, + fmt( + [[ +
  • {}
  • + ]], + { d(1, get_visual) } + ), + { condition = line_begin } + ), + -- DOCUMENT TEMPLATE + s( + { trig = "base" }, + fmt( + [[ + + + + + {} + + + {} + + + ]], + { i(1, "FooBar"), i(0) } + ), + { condition = line_begin } + ), -- ANCHOR TAG + s( + { + trig = "([^%l])aa", + regTrig = true, + wordTrig = false, + snippetType = "autosnippet", + }, + fmt( + [[ + {}{} + ]], + { + f(function(_, snip) + return snip.captures[1] + end), + i(1), + d(2, get_visual), + } + ) + ), +} diff --git a/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua new file mode 100644 index 00000000..22434aa3 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua @@ -0,0 +1,34 @@ +local get_visual = function(args, parent) + if #parent.snippet.env.SELECT_RAW > 0 then + return sn(nil, i(1, parent.snippet.env.SELECT_RAW)) + else + return sn(nil, i(1, "")) + end +end + +local translation_table = { ["("] = ")", ["{"] = "}", ["["] = "]" } + +-- Return snippet tables +return { + -- LEFT/RIGHT ALL BRACES + s( + { + trig = "([^%a])l([%(%[%{])", + regTrig = true, + wordTrig = false, + snippetType = "autosnippet", + }, + fmta("<>\\left<><>\\right<>", { + f(function(_, snip) + return snip.captures[1] + end), + f(function(_, snip) + return snip.captures[2] + end), + d(1, get_visual), + f(function(_, snip) + return translation_table[snip.captures[2]] + end), + }) + ), +} diff --git a/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/tex/greek.lua b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/tex/greek.lua new file mode 100644 index 00000000..ebf4f9d7 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/luasnip/lua/snippets/tex/greek.lua @@ -0,0 +1,37 @@ +-- Return snippet tables +return { + s({ trig = ";a", snippetType = "autosnippet" }, { t("\\alpha") }), + s({ trig = ";b", snippetType = "autosnippet" }, { t("\\beta") }), + s({ trig = ";g", snippetType = "autosnippet" }, { t("\\gamma") }), + s({ trig = ";G", snippetType = "autosnippet" }, { t("\\Gamma") }), + s({ trig = ";d", snippetType = "autosnippet" }, { t("\\delta") }), + s({ trig = ";D", snippetType = "autosnippet" }, { t("\\Delta") }), + s({ trig = ";e", snippetType = "autosnippet" }, { t("\\epsilon") }), + s({ trig = ";ve", snippetType = "autosnippet" }, { t("\\varepsilon") }), + s({ trig = ";z", snippetType = "autosnippet" }, { t("\\zeta") }), + s({ trig = ";h", snippetType = "autosnippet" }, { t("\\eta") }), + s({ trig = ";o", snippetType = "autosnippet" }, { t("\\theta") }), + s({ trig = ";vo", snippetType = "autosnippet" }, { t("\\vartheta") }), + s({ trig = ";O", snippetType = "autosnippet" }, { t("\\Theta") }), + s({ trig = ";k", snippetType = "autosnippet" }, { t("\\kappa") }), + s({ trig = ";l", snippetType = "autosnippet" }, { t("\\lambda") }), + s({ trig = ";L", snippetType = "autosnippet" }, { t("\\Lambda") }), + s({ trig = ";m", snippetType = "autosnippet" }, { t("\\mu") }), + s({ trig = ";n", snippetType = "autosnippet" }, { t("\\nu") }), + s({ trig = ";x", snippetType = "autosnippet" }, { t("\\xi") }), + s({ trig = ";X", snippetType = "autosnippet" }, { t("\\Xi") }), + s({ trig = ";i", snippetType = "autosnippet" }, { t("\\pi") }), + s({ trig = ";I", snippetType = "autosnippet" }, { t("\\Pi") }), + s({ trig = ";r", snippetType = "autosnippet" }, { t("\\rho") }), + s({ trig = ";s", snippetType = "autosnippet" }, { t("\\sigma") }), + s({ trig = ";S", snippetType = "autosnippet" }, { t("\\Sigma") }), + s({ trig = ";t", snippetType = "autosnippet" }, { t("\\tau") }), + s({ trig = ";f", snippetType = "autosnippet" }, { t("\\phi") }), + s({ trig = ";vf", snippetType = "autosnippet" }, { t("\\varphi") }), + s({ trig = ";F", snippetType = "autosnippet" }, { t("\\Phi") }), + s({ trig = ";c", snippetType = "autosnippet" }, { t("\\chi") }), + s({ trig = ";p", snippetType = "autosnippet" }, { t("\\psi") }), + s({ trig = ";P", snippetType = "autosnippet" }, { t("\\Psi") }), + s({ trig = ";w", snippetType = "autosnippet" }, { t("\\omega") }), + s({ trig = ";W", snippetType = "autosnippet" }, { t("\\Omega") }), +} diff --git a/modules/home.legacy/conf/nvim/plgs/neorg/default.nix b/modules/home.legacy/conf/nvim/plgs/neorg/default.nix new file mode 100644 index 00000000..7d61ce09 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/neorg/default.nix @@ -0,0 +1,57 @@ +{pkgsStable, ...}: { + programs.nixvim.plugins.neorg = { + package = pkgsStable.vimPlugins.neorg; + enable = true; + lazyLoading = true; + + modules = { + "core.defaults" = { + __empty = null; + }; + "core.esupports.metagen".config = { + type = "auto"; + }; + "core.journal".config = { + workspace = "journal"; + }; + "core.keybinds".config = { + hook = { + __raw = '' + function(keybinds) + -- remap the looking glas to the same key, femaco is also mapped to. + keybinds.remap_event("norg", "n", "cc", "core.looking-glass.magnify-code-block") + + keybinds.remap_event("norg", "n", "", "core.integrations.telescope.find_linkable") + keybinds.remap_event("norg", "i", "", "core.integrations.telescope.insert_link") + end, + ''; + }; + }; + "core.completion".config = { + engine = "nvim-cmp"; + }; + "core.concealer".config = { + __empty = null; + }; + "core.dirman".config = { + workspaces = { + general = "~/repos/notes/general"; + journal = "~/repos/notes/journal"; + projects = "~/repos/notes/projects"; + }; + }; + "core.export".config = { + __empty = null; + }; + "core.integrations.telescope".config = { + __empty = null; + }; + + # TODO: Add this when the nvim version in nixpkgs is >= 0.10 <2023-08-29> + # + # "core.ui.calendar".config = { + # __empty = null; + # }; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/nvim-cmp/default.nix b/modules/home.legacy/conf/nvim/plgs/nvim-cmp/default.nix new file mode 100644 index 00000000..ed0e57c3 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/nvim-cmp/default.nix @@ -0,0 +1,54 @@ +{config, ...}: { + programs.nixvim.plugins.cmp = let + neorg_source = + if config.programs.nixvim.plugins.neorg.modules."core.completion".config.engine == "nvim-cmp" + then [{name = "neorg";}] + else []; + in { + /* + TODO: integrate this: + ```lua + enabled = { + function() + -- disable completion in comments + local context = require 'cmp.config.context' + -- keep command mode completion enabled when cursor is in a comment + -- te + if vim.api.nvim_get_mode().mode == 'c' then + return true + else + return not context.in_treesitter_capture("comment") + and not context.in_syntax_group("Comment") + end + end + }, + ``` + */ + enable = true; + autoEnableSources = true; + settings = { + mapping = { + # TODO: add support for desc and which key here + "" = "cmp.mapping.scroll_docs(-4)"; # desc = "Scroll up by four lines" + "" = "cmp.mapping.scroll_docs(4)"; # desc = "Scroll down by four lines" + "HH" = "cmp.mapping.complete()"; # desc = "Confirm snipped" + }; + + snippet.expand = "function(args) require('luasnip').lsp_expand(args.body) end"; + + sources = + [ + {name = "nvim_lsp";} + {name = "luasnip";} + {name = "path";} + {name = "git";} # TODO: I might want to add config to allow all issues/prs <2023-10-16> + # {name = "convertionalcommits";} # TODO: Useless without commitlint [https://commitlint.js.org/] <2023-10-16> + # {name = "rg";} # TODO: This might really RIP-grep my system <2023-10-16> + # {name = "buffer";} + # {name = "digraphs";} + {name = "calc";} + ] + ++ neorg_source; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/nvim-lint/default.nix b/modules/home.legacy/conf/nvim/plgs/nvim-lint/default.nix new file mode 100644 index 00000000..f5cb9acf --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/nvim-lint/default.nix @@ -0,0 +1,15 @@ +{ + pkgs, + lib, + ... +}: { + programs.nixvim = { + # TODO: package nvim-lint though a module + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/nvim-lint.lua} + ''; + extraPlugins = [ + pkgs.vimPlugins.nvim-lint + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua b/modules/home.legacy/conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua new file mode 100644 index 00000000..4ed49f7b --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua @@ -0,0 +1,20 @@ +require("lint").linters_by_ft = { + -- text + markdown = {}, + -- tex = {'chktex'}, -- maybe add some text linters ? + + -- shell (already covered by the bash language sever) + -- sh = { "shellcheck"; }; + -- bash = { "shellcheck"; }; + -- zsh = { "shellcheck"; }; + -- dash = { "shellcheck"; }; + + yaml = { "yamllint" }, + nix = { "nix", "statix" }, +} + +vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost" }, { + callback = function() + require("lint").try_lint() + end, +}) diff --git a/modules/home.legacy/conf/nvim/plgs/raw_plugins/default.nix b/modules/home.legacy/conf/nvim/plgs/raw_plugins/default.nix new file mode 100644 index 00000000..941cb7cb --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/raw_plugins/default.nix @@ -0,0 +1,11 @@ +{...}: { + programs.nixvim = { + # Not all plugins have own modules + # You can add missing plugins here + # `pkgs.vimExtraPlugins` is added by the overlay you added at the beginning + # For a list of available plugins, look here: + # https://github.com/jooooscha/nixpkgs-vim-extra-plugins/blob/main/plugins.md + extraPlugins = [ + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/default.nix new file mode 100644 index 00000000..c32e139c --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/default.nix @@ -0,0 +1,17 @@ +{...}: { + imports = [ + ./defaults + ./keymaps + ./extensions + ]; + programs.nixvim.plugins = { + telescope = { + enable = true; + }; + + # This is a dependency of telescope + web-devicons = { + enable = true; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/defaults/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/defaults/default.nix new file mode 100644 index 00000000..933089ef --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/defaults/default.nix @@ -0,0 +1,30 @@ +{...}: { + programs.nixvim.plugins.telescope.settings.defaults = { + mappings = let + insert_and_normal_mappings = { + # map actions.which_key to (default: ) + # actions.which_key shows the mappings for your picker, + # e.g. git_{create, delete, ...}_branch for the git_branches picker + "" = "which_key"; + }; + in { + i = + insert_and_normal_mappings; + n = + { + "t" = "move_selection_next"; + "n" = "move_selection_previous"; + "" = "toggle_all"; + + "" = "preview_scrolling_up"; + "" = "preview_scrolling_down"; + "" = "preview_scrolling_left"; + "" = "preview_scrolling_right"; + + "" = "close"; + "q" = "close"; + } + // insert_and_normal_mappings; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/extensions/bibtex/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/bibtex/default.nix new file mode 100644 index 00000000..6f3cc2ea --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/bibtex/default.nix @@ -0,0 +1,17 @@ +{pkgs, ...}: { + # WARNING: This is only activated in tex files via the ftplugin. + programs.nixvim = { + extraPlugins = [ + pkgs.vimExtraPlugins.telescope-bibtex-nvim + ]; + keymaps = [ + { + key = "ib"; + # This is registered in the ftplugin file, so we set this to null here + action = ""; + mode = "n"; + options.desc = "[i]nsert a [b]atex citation"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/extensions/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/default.nix new file mode 100644 index 00000000..0b1e033a --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/default.nix @@ -0,0 +1,9 @@ +{...}: { + imports = [ + ./bibtex + ./frecency + ./fzy-native + ./rooter + ./symbols + ]; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/extensions/frecency/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/frecency/default.nix new file mode 100644 index 00000000..0e007b80 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/frecency/default.nix @@ -0,0 +1,22 @@ +{...}: { + programs.nixvim = { + keymaps = [ + { + key = "gff"; + mode = "n"; + action.__raw = "function() require('telescope').extensions.frecency.frecency() end"; + options.desc = "activate the frecency file selection"; + } + ]; + plugins.telescope = { + extensions.frecency = { + enable = true; + settings = { + show_scores = true; + db_safe_mode = false; + default_workspace = "CWD"; # or 'LSP' + }; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/extensions/fzy-native/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/fzy-native/default.nix new file mode 100644 index 00000000..ce0bdccc --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/fzy-native/default.nix @@ -0,0 +1,5 @@ +{...}: { + programs.nixvim.plugins.telescope.extensions.fzy-native = { + enable = true; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/extensions/rooter/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/rooter/default.nix new file mode 100644 index 00000000..779448cc --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/rooter/default.nix @@ -0,0 +1,7 @@ +{lib, ...}: { + programs.nixvim = { + extraConfigLuaPost = '' + ${lib.strings.fileContents ./lua/rooter.lua} + ''; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua new file mode 100644 index 00000000..7235c5a3 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua @@ -0,0 +1,84 @@ +-- Taken from: https://github.com/desdic/telescope-rooter.nvim/blob/69423216c75a5f1f1477bbf8faf6b0dc8af04099/lua/telescope/_extensions/rooter.lua +local has_telescope, telescope = pcall(require, "telescope") +if not has_telescope then + error("This extension requires telescope.nvim") + return +end + +local has_plenary, plenary = pcall(require, "plenary") +if not has_plenary then + error("This extension requires plenary") + return +end + +local log = plenary.log.new({ plugin = "telescope_rooter", level = "info" }) + +-- TODO: expose this function +local toggle = function(_) + vim.g["Telescope#rooter#enabled"] = not vim.g["Telescope#rooter#enabled"] + print("Telescope#rooter#enabled=" .. vim.inspect(vim.g["Telescope#rooter#enabled"])) +end + +local config = { patterns = { ".git" }, enable = true, debug = false } + +-- default enabled +vim.g["Telescope#rooter#enabled"] = vim.F.if_nil(config.enable, true) + +-- redefine log if debug enabled +if vim.F.if_nil(config.debug, false) then + log = plenary.log.new({ plugin = "telescope_rooter", level = "debug" }) +end + +local group = vim.api.nvim_create_augroup("TelescopeRooter", { clear = true }) + +vim.api.nvim_create_autocmd({ "DirChangedPre" }, { + callback = function() + if vim.g["Telescope#rooter#enabled"] ~= true then + return + end + + if vim.g["Telescope#rooter#oldpwd"] == nil then + vim.g["Telescope#rooter#oldpwd"] = vim.loop.cwd() + log.debug("before " .. vim.inspect(vim.loop.cwd())) + end + end, + group = group, +}) + +vim.api.nvim_create_autocmd({ "BufEnter", "BufWinEnter" }, { + callback = function() + if vim.g["Telescope#rooter#enabled"] ~= true then + return + end + + vim.schedule(function() + if vim.bo.filetype == "TelescopePrompt" then + local rootdir = vim.fs.dirname(vim.fs.find(config.patterns, { upward = true })[1]) + if rootdir ~= nil then + vim.api.nvim_set_current_dir(rootdir) + log.debug("changing dir to " .. rootdir) + end + end + end) + end, + group = group, +}) + +vim.api.nvim_create_autocmd({ "BufWinLeave" }, { + callback = function() + if vim.g["Telescope#rooter#enabled"] ~= true then + return + end + + vim.schedule(function() + if vim.bo.filetype ~= "TelescopePrompt" then + if vim.g["Telescope#rooter#oldpwd"] ~= nil then + log.debug("restoring " .. vim.g["Telescope#rooter#oldpwd"]) + vim.api.nvim_set_current_dir(vim.g["Telescope#rooter#oldpwd"]) + vim.g["Telescope#rooter#oldpwd"] = nil + end + end + end) + end, + group = group, +}) diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/extensions/symbols/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/symbols/default.nix new file mode 100644 index 00000000..05b4a4f2 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/extensions/symbols/default.nix @@ -0,0 +1,52 @@ +{pkgs, ...}: { + programs.nixvim = { + extraPlugins = [ + # Source of symbols for telescope symbols + pkgs.vimPlugins.telescope-symbols-nvim + ]; + keymaps = [ + { + key = "il"; + mode = "n"; + action.__raw = '' + function() + require('telescope.builtin').symbols{ sources = { + 'latex' + }} + end + ''; + options.desc = "[i]nsert a [l]atex symbol"; + } + { + key = "ie"; + mode = "n"; + action.__raw = '' + function() + require('telescope.builtin').symbols{ sources = { + 'emoji', + }} + end + ''; + options.desc = "[i]nsert a [e]moji"; + } + { + key = "is"; + mode = "n"; + action.__raw = '' + function() + require('telescope.builtin').symbols{ sources = { + 'emoji', + 'gitmoji', + 'julia', + 'kaomoji', + 'latex', + 'math', + 'nerd', + }} + end + ''; + options.desc = "[i]nsert a [s]ymbol (like emojis)"; + } + ]; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/telescope/keymaps/default.nix b/modules/home.legacy/conf/nvim/plgs/telescope/keymaps/default.nix new file mode 100644 index 00000000..e551cc5a --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/telescope/keymaps/default.nix @@ -0,0 +1,10 @@ +{...}: { + programs.nixvim.plugins.telescope.keymaps = { + "rg" = { + action = "live_grep"; + options = { + desc = "[rg] in a live session"; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/todo-comments/default.nix b/modules/home.legacy/conf/nvim/plgs/todo-comments/default.nix new file mode 100644 index 00000000..e33f961b --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/todo-comments/default.nix @@ -0,0 +1,51 @@ +{...}: { + programs.nixvim.plugins.todo-comments = { + enable = true; + settings = { + guiStyle = { + fg = "BOLD"; + bg = "NONE"; + }; + highlight = { + keyword = "wide_fg"; + }; + keywords = { + /* + # Defaults: + FIX = { + icon = " "; # Icon used for the sign, and in search results. + color = "error"; # Can be a hex color, or a named color. + alt = ["FIXME" "BUG" "FIXIT" "ISSUE"]; # A set of other keywords that all map to this FIX keywords. + }; + TODO = { + icon = " "; + color = "info"; + }; + HACK = { + icon = " "; + color = "warning"; + }; + WARN = { + icon = " "; + color = "warning"; + alt = ["WARNING" "XXX"]; + }; + PERF = { + icon = "󰅒 "; + alt = ["OPTIM" "PERFORMANCE" "OPTIMIZE"]; + }; + NOTE = { + icon = "󰍨 "; + color = "hint"; + alt = ["INFO"]; + }; + TEST = { + icon = "⏲ "; + color = "test"; + alt = ["TESTING" "PASSED" "FAILED"]; + }; + */ + }; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/treesitter/default.nix b/modules/home.legacy/conf/nvim/plgs/treesitter/default.nix new file mode 100644 index 00000000..b4b20388 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/treesitter/default.nix @@ -0,0 +1,59 @@ +{ + config, + pkgs, + lib, + ... +}: { + programs.nixvim = { + plugins.treesitter = { + enable = true; + + # NOTE: These are required to build grammars, but I already use the nix grammars <2024-07-13> + gccPackage = null; + nodejsPackage = null; + treesitterPackage = null; + + # inject nixvim specific highlighting (eg in extraConfigLua). + nixvimInjections = true; + + nixGrammars = true; + grammarPackages = + config.programs.nixvim.plugins.treesitter.package.passthru.allGrammars + ++ [pkgs.tree-sitter-yts]; + + settings = { + auto_install = false; + ensureInstalled = "all"; + indent.enable = true; + disabledLanguages = []; + + highlight = { + enable = true; + disable = []; + + # Setting this to true will run `:h syntax` and tree-sitter at the same time. + # Set this to `true` if you depend on 'syntax' being enabled (like for indentation). + # Using this option may slow down your editor; and you may see some duplicate highlights. + # Instead of true it can also be a list of languages + additionalVimRegexHighlighting = ["latex"]; + }; + + incrementalSelection = { + enable = true; + keymaps = { + # TODO: include these in the which-key description + initSelection = "gnn"; # set to `false` to disable one of the mappings + nodeIncremental = "grn"; + scopeIncremental = "grc"; + nodeDecremental = "grm"; + }; + }; + }; + }; + extraFiles = { + "queries/yts/highlights.scm".text = '' + ${lib.strings.fileContents "${pkgs.tree-sitter-yts}/queries/highlights.scm"} + ''; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/vim-tex/default.nix b/modules/home.legacy/conf/nvim/plgs/vim-tex/default.nix new file mode 100644 index 00000000..0b92c429 --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/vim-tex/default.nix @@ -0,0 +1,69 @@ +{...}: { + programs.nixvim = { + opts.conceallevel = 0; + + plugins.vimtex = { + enable = true; + settings = { + view_method = "zathura"; + quickfix_mode = -1; + view_enabled = -1; + tex_conceal = "abdmg"; + tex_flavor = "latex"; + + # Useful if treesitter is the highlighter + syntax_enabled = 0; + syntax_conceal_disable = 1; + + mappings_disable = { + n = [ + "ts$" + "tsD" + "tsb" + "tsc" + "tsd" + "tse" + "tsf" + ]; + x = [ + "tsD" + "tsd" + "tsf" + ]; + }; + + toc_config = { + name = "TOC"; + layers = ["content" "todo" "include"]; + resize = false; + split_width = 49; + todo_sorted = -1; + show_help = false; + show_numbers = false; + mode = true; + layer_keys = { + content = "C"; + label = "L"; + todo = "j"; + include = "I"; + }; + }; + + compiler_latexmk = { + build_dir = "build"; + callback = false; + continuous = true; + executable = "latexmk"; + hooks = []; + options = [ + "-verbose" + "-file-line-error" + "-synctex=0" + "-interaction=nonstopmode" + "-outdir=build" + ]; + }; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/nvim/plgs/which-key/default.nix b/modules/home.legacy/conf/nvim/plgs/which-key/default.nix new file mode 100644 index 00000000..be63f7ac --- /dev/null +++ b/modules/home.legacy/conf/nvim/plgs/which-key/default.nix @@ -0,0 +1,5 @@ +{...}: { + programs.nixvim.plugins.which-key = { + enable = true; + }; +} diff --git a/modules/home.legacy/conf/prusa_slicer/default.nix b/modules/home.legacy/conf/prusa_slicer/default.nix new file mode 100644 index 00000000..9529e13d --- /dev/null +++ b/modules/home.legacy/conf/prusa_slicer/default.nix @@ -0,0 +1,3 @@ +{...}: { + xdg.configFile."PrusaSlicer/PrusaSlicer.ini".source = ./prusa_slicer.ini; +} diff --git a/modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini b/modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini new file mode 100644 index 00000000..0416a398 --- /dev/null +++ b/modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini @@ -0,0 +1,65 @@ +alert_when_supports_needed = 1 +allow_auto_color_change = 1 +allow_ip_resolve = 1 +auto_toolbar_size = 100 +autocenter = 0 +background_processing = 0 +clear_undo_redo_stack_on_new_project = 1 +collapsed_sidebar = 0 +color_mapinulation_panel = 0 +custom_toolbar_size = 100 +default_action_on_close_application = none +default_action_on_new_project = none +default_action_on_select_preset = none +downloader_url_registered = 1 +drop_project_action = 1 +export_sources_full_pathnames = 0 +no_controller = 1 +no_defaults = 1 +no_templates = 0 +non_manifold_edges = 1 +notify_release = all +order_volumes = 1 +preset_update = 1 +remember_output_path = 1 +remember_output_path_removable = 1 +restore_win_position = 1 +reverse_mouse_wheel_zoom = 0 +seq_top_layer_only = 1 +show_drop_project_dialog = 1 +show_hints = 1 +show_incompatible_presets = 0 +show_splash_screen = 1 +single_instance = 0 +use_binary_gcode_when_supported = 0 +use_custom_toolbar_size = 0 +use_free_camera = 0 +use_inches = 0 +use_perspective_camera = 1 +view_mode = advanced +wifi_config_dialog_declined = 0 +window_mainframe = 3; 33; 1914; 1044; 1 + +[filaments] +Generic PETG @PGIS = 1 +Generic PLA @PGIS = 1 +Generic PLA Silk @PGIS = 1 +Prusa PETG @PGIS = 1 +Prusa PLA @PGIS = 1 +Prusament PETG @PGIS = 1 +Prusament PLA = 1 +Prusament PLA @PGIS = 1 +Prusament PLA @Template = 1 +Prusament PLA Blend @PGIS = 1 +Prusament rPLA @PG = 1 + +[presets] +filament = Prusament PLA +physical_printer = +print = 0.25mm DRAFT @MINI +printer = Original Prusa MINI & MINI+ +sla_material = +sla_print = + +[vendor:PrusaResearch] +model:MINI = 0.4 diff --git a/modules/home.legacy/conf/python/default.nix b/modules/home.legacy/conf/python/default.nix new file mode 100644 index 00000000..826d466d --- /dev/null +++ b/modules/home.legacy/conf/python/default.nix @@ -0,0 +1,6 @@ +{config, ...}: { + xdg.configFile."python/pythonrc".source = ./pythonrc.py; + programs.zsh.sessionVariables = { + "PYTHONSTARTUP" = "${config.xdg.configHome}/python/pythonrc"; + }; +} diff --git a/modules/home.legacy/conf/python/pythonrc.py b/modules/home.legacy/conf/python/pythonrc.py new file mode 100644 index 00000000..466d9788 --- /dev/null +++ b/modules/home.legacy/conf/python/pythonrc.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + + +def is_vanilla() -> bool: + import sys + + return not hasattr(__builtins__, "__IPYTHON__") and "bpython" not in sys.argv[0] + + +def setup_history(): + import os + import atexit + import readline + from pathlib import Path + + if state_home := os.environ.get("XDG_DATA_HOME"): + state_home = Path(state_home) + else: + state_home = Path.home() / ".local" / "state" + + history: Path = state_home / "python" / "history" + + if not os.path.exists(history): + open(history, "w") + + readline.read_history_file(str(history)) + atexit.register(readline.write_history_file, str(history)) + + +if is_vanilla(): + setup_history() + +# vim: ft=python diff --git a/modules/home.legacy/conf/rclone/default.nix b/modules/home.legacy/conf/rclone/default.nix new file mode 100644 index 00000000..bd0c1ac2 --- /dev/null +++ b/modules/home.legacy/conf/rclone/default.nix @@ -0,0 +1,7 @@ +{ + config, + pkgs, + ... +}: { + xdg.configFile."rclone/rclone.conf".source = ./rclone.conf; +} diff --git a/modules/home.legacy/conf/rclone/rclone.conf b/modules/home.legacy/conf/rclone/rclone.conf new file mode 100644 index 00000000..9e1c4f08 --- /dev/null +++ b/modules/home.legacy/conf/rclone/rclone.conf @@ -0,0 +1,10 @@ +[vhack1] +type = sftp +host = server1.vhack.eu +user = soispha +key_use_agent = true +known_hosts_file = ~/.local/share/ssh/known_hosts +shell_type = unix +md5sum_command = md5sum +sha1sum_command = sha1sum + diff --git a/modules/home.legacy/conf/rofi/default.nix b/modules/home.legacy/conf/rofi/default.nix new file mode 100644 index 00000000..10363ab5 --- /dev/null +++ b/modules/home.legacy/conf/rofi/default.nix @@ -0,0 +1,10 @@ +{pkgs, ...}: { + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + terminal = "${pkgs.alacritty}/bin/alacritty"; + # show-icons = true; + # location = "center"; + theme = ./nord-twoLines.rasi; + }; +} diff --git a/modules/home.legacy/conf/rofi/nord-twoLines.rasi b/modules/home.legacy/conf/rofi/nord-twoLines.rasi new file mode 100644 index 00000000..612b907f --- /dev/null +++ b/modules/home.legacy/conf/rofi/nord-twoLines.rasi @@ -0,0 +1,101 @@ +/******************************************************************************* + * ROFI TWO LINES THEME USING THE NORD COLOR PALETTE + * User : LR-Tech + * Theme Repo : https://github.com/lr-tech/rofi-themes-collection + * Nord Project Repo : https://github.com/arcticicestudio/nord + *******************************************************************************/ + +* { + font: "Fira Code 10"; + + nord0: #2e3440; + nord1: #3b4252; + nord2: #434c5e; + nord3: #4c566a; + + nord4: #d8dee9; + nord5: #e5e9f0; + nord6: #eceff4; + + nord7: #8fbcbb; + nord8: #88c0d0; + nord9: #81a1c1; + nord10: #5e81ac; + nord11: #bf616a; + + nord12: #d08770; + nord13: #ebcb8b; + nord14: #a3be8c; + nord15: #b48ead; + + background-color: transparent; + text-color: @nord4; + accent-color: @nord8; + + margin: 0px; + padding: 0px; + spacing: 0px; +} + +window { + background-color: @nord0; + + location: north; + width: 100%; +} + +inputbar { + padding: 2px 8px; + spacing: 8px; + children: [ prompt, entry ]; +} + +prompt, entry, element-text, element-icon { + vertical-align: 0.5; +} + +prompt { + text-color: @accent-color; +} + +listview { + lines: 1; + columns: 4; +} + +element { + padding: 1px 8px; + spacing: 4px; +} + +element normal urgent { + text-color: @nord13; +} + +element normal active { + text-color: @accent-color; +} + +element selected { + text-color: @nord0; +} + +element selected normal { + background-color: @accent-color; +} + +element selected urgent { + background-color: @nord13; +} + +element selected active { + background-color: @nord8; +} + +element-icon { + size: 0.75em; +} + +element-text { + text-color: inherit; +} diff --git a/modules/home.legacy/conf/ssh/default.nix b/modules/home.legacy/conf/ssh/default.nix new file mode 100644 index 00000000..de9b0d90 --- /dev/null +++ b/modules/home.legacy/conf/ssh/default.nix @@ -0,0 +1,16 @@ +{config, ...}: { + programs.ssh = { + enable = true; + compression = true; + hashKnownHosts = false; + serverAliveInterval = 240; + userKnownHostsFile = "${config.xdg.dataHome}/ssh/known_hosts"; + + matchBlocks = { + "codeberg.org" = { + # TODO: Remove this once they fix their ipv6 config + addressFamily = "inet"; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/starship/default.nix b/modules/home.legacy/conf/starship/default.nix new file mode 100644 index 00000000..5db6eb8b --- /dev/null +++ b/modules/home.legacy/conf/starship/default.nix @@ -0,0 +1,119 @@ +{ + lib, + nixosConfig, + pkgs, + ... +}: { + programs.starship = { + enable = true; + enableZshIntegration = true; + settings = { + add_newline = false; + format = lib.concatStrings [ + "$directory" + "$username" + "$cmd_duration" + "$status" + "$character" + ]; + right_format = lib.concatStrings ( + [ + "$git_metrics" + "$git_branch" + "$git_status" + "$git_commit" + "$git_state" + "$time" + ] + ++ lib.optional + nixosConfig.soispha.laptop.enable + "$battery" + ); + scan_timeout = 20; + character = { + # success_symbol = "[❯](bold blue)"; + # a = "⬢"; + success_symbol = "[](bold blue)"; + error_symbol = "[](bold red)"; + }; + status = { + disabled = false; + format = "([($common_meaning )($status)( $signal_name)]($style) )"; + }; + time = { + disabled = false; + format = "[\\[$time\\]]($style)"; + }; + username = { + format = "as [$user]($style) "; + }; + git_branch = { + format = "[($symbol$branch(:$remote_branch) )]($style)"; + }; + git_status = { + disabled = true; + format = "([\\[$ahead_behind\\]]($style) )"; + ahead = "⇡$count"; + diverged = "⇕⇡$ahead_count⇣$behind_count"; + behind = "⇣$count"; + }; + git_metrics = { + disabled = true; + ignore_submodules = true; + }; + git_state = { + format = "[\($state( $progress_current of $progress_total)\)]($style) "; + rebase = "[rebasing](bold magenta)"; + merge = "[merging](bold yellow)"; + revert = "[reverting](bold blue)"; + cherry_pick = "[picking](bold red)"; + bisect = "[bisecting](bold red)"; + am = "[applying](bold green)"; + am_or_rebase = "[applying/rebasing](bold yellow)"; + }; + git_commit = { + disabled = true; + tag_disabled = false; + tag_symbol = "v"; + format = "[(\\[$tag\\] )]($style)"; + }; + directory = { + truncate_to_repo = true; + read_only = " 󰌾"; + before_repo_root_style = "black bold dimmed"; + }; + cmd_duration = { + min_time = 2000; # Milliseconds + style = "bold white"; + }; + custom = { + # status_output = { + # format = "$output"; + # command = "if test $STARSHIP_CMD_STATUS -ne 0; then echo \"bold red\"; else echo \"bold cyan\"; fi"; + # shell = [ "${pkgs.dash}" ]; + # }; + }; + battery = { + # '󰁹 ' + # '󰂄 ' + # '󰂃 ' + # '󰁽 ' + # '󰂎 ' + display = [ + { + threshold = 10; + style = "bold red"; + } + { + threshold = 30; + style = "bold blue"; + } + { + threshold = 50; + style = "bold green"; + } + ]; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/swayidle/config b/modules/home.legacy/conf/swayidle/config new file mode 100644 index 00000000..a48f670b --- /dev/null +++ b/modules/home.legacy/conf/swayidle/config @@ -0,0 +1,5 @@ +timeout 180 'swaylock -fF' + +timeout 360 'systemctl suspend-then-hibernate' + +before-sleep 'swaylock -f' diff --git a/modules/home.legacy/conf/swayidle/default.nix b/modules/home.legacy/conf/swayidle/default.nix new file mode 100644 index 00000000..6b8a7d80 --- /dev/null +++ b/modules/home.legacy/conf/swayidle/default.nix @@ -0,0 +1,29 @@ +{ + config, + pkgs, + ... +}: { + xdg.configFile."swayidle/config".source = ./config; + + # services.swayidle = { + # enable = true; + # events = [ + # { + # event = "before-sleep"; + # command = "${pkgs.swaylock}/bin/swaylock -f "; + # } + # ]; + # timeouts = [ + # { + # timeout = 180; + # command = "${pkgs.swaylock}/bin/swaylock -fFu "; + # } + # { + # timeout = 360; + # # TODO: systemctl is installed? + # command = "systemctl suspend-then-hibernate"; + # } + # ]; + # # systemdTarget = ""; # TODO: this might be usefull + # }; +} diff --git a/modules/home.legacy/conf/swaylock/GTDcanonical.png b/modules/home.legacy/conf/swaylock/GTDcanonical.png new file mode 100644 index 00000000..ef41d79d Binary files /dev/null and b/modules/home.legacy/conf/swaylock/GTDcanonical.png differ diff --git a/modules/home.legacy/conf/swaylock/commands.jpg b/modules/home.legacy/conf/swaylock/commands.jpg new file mode 100644 index 00000000..54016503 Binary files /dev/null and b/modules/home.legacy/conf/swaylock/commands.jpg differ diff --git a/modules/home.legacy/conf/swaylock/default.nix b/modules/home.legacy/conf/swaylock/default.nix new file mode 100644 index 00000000..9e5eabac --- /dev/null +++ b/modules/home.legacy/conf/swaylock/default.nix @@ -0,0 +1,10 @@ +{...}: { + programs.swaylock = { + enable = true; + settings = { + image = "${./GTDcanonical.png}"; + scaling = "center"; + color = "000000"; + }; + }; +} diff --git a/modules/home.legacy/conf/swaylock/gnu.png b/modules/home.legacy/conf/swaylock/gnu.png new file mode 100644 index 00000000..d07dee3e Binary files /dev/null and b/modules/home.legacy/conf/swaylock/gnu.png differ diff --git a/modules/home.legacy/conf/taskwarrior/default.nix b/modules/home.legacy/conf/taskwarrior/default.nix new file mode 100644 index 00000000..d7aec156 --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/default.nix @@ -0,0 +1,125 @@ +{ + nixosConfig, + lib, + config, + ... +}: { + imports = [ + ./hooks + ]; + + services.taskwarrior-sync = { + enable = true; + }; + + programs.taskwarrior = let + projects = import ./projects {}; + + mkContext = project: + if builtins.hasAttr "subprojects" project + then + lib.lists.flatten ( + (builtins.map mkContext (builtins.map (mkProject project) project.subprojects)) + ++ (mkContext (builtins.removeAttrs project ["subprojects"])) + ) + else [ + { + inherit (project) name; + value = let + name = + if builtins.hasAttr "pname" project + then project.pname + else project.name; + in { + read = "project:${name}"; + write = "project:${name}"; + rc = { + neorg_path = + if builtins.hasAttr "neorg_path" project + then project.neorg_path + else "${project.prefix}/${project.name}/index.norg"; + }; + }; + } + ]; + mkProject = project: subproject: let + pname = + if builtins.hasAttr "pname" project + then project.pname + else project.name; + in + if builtins.isString subproject + then { + name = "${project.name}_${subproject}"; + pname = "${pname}.${subproject}"; + neorg_path = + if builtins.hasAttr "neorg_path_prefix" project + then "${project.neorg_path_prefix}/${subproject}/index.norg" + else "${project.prefix}/${project.name}/${subproject}/index.norg"; + } + else if builtins.isAttrs subproject + then let + name = builtins.elemAt (builtins.attrNames subproject) 0; + in { + name = "${project.name}_${name}"; + pname = "${pname}.${name}"; + prefix = "${project.prefix}/${project.name}"; + neorg_path_prefix = "${project.prefix}/${project.name}/${name}"; + subprojects = builtins.elemAt (builtins.attrValues subproject) 0; + } + else builtins.throw "Subproject not a string or a attrs: ${subproject}"; + + context = + builtins.listToAttrs (lib.lists.flatten (builtins.map mkContext projects)); + in { + enable = true; + colorTheme = ./nord.theme; + extraConfig = '' + # This include just contains my taskd user credentials + include ${nixosConfig.age.secrets.taskserverCredentials.path} + ''; + config = { + news.version = "2.6.0"; + complete.all.tags = true; + list.all = { + projects = true; + tags = true; + }; + regex = true; + weekstart = "Monday"; + uda = { + total_active_time = { + type = "duration"; + label = "Total active time"; + }; + }; + alias = { + mod = "modify"; + n = "execute neorg --task"; + fstart = "execute neorg fstart"; + }; + color = true; + + hooks.location = "${config.xdg.configHome}/task/hooks"; + + urgency.uda.priority = { + H.coefficient = 6.0; + M.coefficient = 0; + L.coefficient = -1.8; + }; + + inherit context; + + taskd = { + server = "taskserver.vhack.eu:53589"; + trust = "strict"; + ca = + nixosConfig.age.secrets.taskserverCA.path; + key = + nixosConfig.age.secrets.taskserverPrivate.path; + certificate = + nixosConfig.age.secrets.taskserverPublic.path; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/taskwarrior/firefox/default.nix b/modules/home.legacy/conf/taskwarrior/firefox/default.nix new file mode 100644 index 00000000..fb5daaa8 --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/firefox/default.nix @@ -0,0 +1,32 @@ +{ + config, + lib, + # options + prefConfig, + profile_size, + search, + userChrome, + ... +}: let + inherit (config.soispha.taskwarrior.projects) projects; + + mkFirefoxProfile = { + name, + id, + }: { + inherit name; + value = { + isDefault = false; + extraConfig = prefConfig; + inherit id name search userChrome; + }; + }; + projects_id = + lib.imap0 (id: project: { + name = project; + id = id + profile_size; + }) + projects; + firefoxProfiles = builtins.listToAttrs (builtins.map mkFirefoxProfile projects_id); +in + firefoxProfiles diff --git a/modules/home.legacy/conf/taskwarrior/hooks/default.nix b/modules/home.legacy/conf/taskwarrior/hooks/default.nix new file mode 100644 index 00000000..ef97e1b5 --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/hooks/default.nix @@ -0,0 +1,114 @@ +{ + sysLib, + pkgs, + lib, + config, + ... +}: let + mkProject = project: subproject: + if builtins.isString subproject + then { + name = "${project.name}.${subproject}"; + prefix = null; + } + else let + name = builtins.elemAt (builtins.attrNames subproject) 0; + in { + name = "${project.name}.${name}"; + subprojects = builtins.elemAt (builtins.attrValues subproject) 0; + prefix = null; + }; + + mkProjectName = project: + if builtins.hasAttr "subprojects" project + then + lib.lists.flatten ([project.name] + ++ (builtins.map mkProjectName + (builtins.map (mkProject project) project.subprojects))) + else [project.name]; + projects = lib.lists.unique (lib.lists.naturalSort (lib.lists.flatten (builtins.map mkProjectName (import ../projects {})))); + projects_newline = builtins.concatStringsSep "\n" projects; + projects_comma = builtins.concatStringsSep ", " projects; + projects_pipe = builtins.concatStringsSep "|" projects; + + enforce_policies = sysLib.writeShellScript { + name = "bin"; + src = ./scripts/on-add_enforce-policies.sh; + dependencies = with pkgs; [dash jq taskwarrior gnused gnugrep]; + replacementStrings = { + PROJECTS_NEWLINE = projects_newline; + PROJECTS_COMMA = projects_comma; + }; + }; + track_timewarrior = pkgs.stdenv.mkDerivation { + name = "track_timewarrior.taskwarrior-hook"; + nativeBuildInputs = [ + pkgs.makeWrapper + ]; + buildInputs = [ + pkgs.timewarrior + pkgs.taskwarrior + # TODO: Use a `taskw` package, that actually supports newer python variants <2024-07-13> + (pkgs.python311.withPackages (pythonPackages: + with pythonPackages; [ + taskw + ])) + ]; + dontUnpack = true; + installPhase = '' + install -Dm755 ${./scripts/on-modify_track-timewarrior.py} $out/bin/bin + wrapProgram $out/bin/bin \ + --prefix PATH : ${lib.makeBinPath [pkgs.taskwarrior pkgs.timewarrior]} + ''; + }; + track_total_active_time = pkgs.stdenv.mkDerivation { + name = "track_total_active_time.taskwarrior-hook"; + nativeBuildInputs = [ + pkgs.makeWrapper + ]; + buildInputs = [ + pkgs.taskwarrior + # TODO: Use a `taskw` package, that actually supports newer python variants <2024-07-13> + (pkgs.python311.withPackages (pythonPackages: + with pythonPackages; [ + taskw + ])) + ]; + dontUnpack = true; + installPhase = '' + install -Dm755 ${./scripts/on-modify_track-total-active-time.py} $out/bin/bin + wrapProgram $out/bin/bin \ + --prefix PATH : ${lib.makeBinPath [pkgs.taskwarrior]} + ''; + }; + + mkSyncGitRepo = type: { + name = "${hookPath}/${type}_sync-git-repo"; + value = { + source = "${sysLib.writeShellScript { + name = "bin"; + src = ./scripts + "/${type}_sync-git-repo.sh"; + dependencies = with pkgs; [dash taskwarrior git]; + }}/bin/bin"; + }; + }; + sync_git_repos = + builtins.listToAttrs (builtins.map mkSyncGitRepo ["on-add" "on-modify"]); + hookPath = config.programs.taskwarrior.config.hooks.location; +in { + options.soispha.taskwarrior.projects = lib.mkOption { + type = lib.types.attrs; + }; + config = { + soispha.taskwarrior.projects = { + inherit projects_newline projects_comma projects projects_pipe; + }; + home.file = + { + "${hookPath}/on-add_enforce-policies".source = "${enforce_policies}/bin/bin"; + "${hookPath}/on-modify_track-timewarrior".source = "${track_timewarrior}/bin/bin"; + "${hookPath}/on-modify_track-total-active-time".source = "${track_total_active_time}/bin/bin"; + } + // sync_git_repos; + }; +} diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh new file mode 100755 index 00000000..eaf7f30c --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# override shell lib output to stdout +eprint() { + # shellcheck disable=SC2317 + print "$@" +} +eprintln() { + # shellcheck disable=SC2317 + println "$@" +} + +enable_hook_dbg() { + debug_hooks="$(task _get rc.debug.hooks)" + [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable +} + +enforce_project() { + project="$(jq '.project' "$(ptmp "$1")")" + [ "$project" = "null" ] && die "No project supplied!" + + if grep -q "^$(echo "$project" | sed 's|"\(.*\)"|\1|')\$" "$(ptmp "%PROJECTS_NEWLINE")"; then + dbg "project('$project') is a valid part of %PROJECTS_COMMA" + else + die "The project '$(echo "$project" | sed 's|"||g')' is not registered with the nix config, registered projects: %PROJECTS_COMMA" + fi +} + +read -r new_task +# We don't change the task, thus immediately return the json +echo "$new_task" + +enable_hook_dbg +enforce_project "$new_task" + +exit 0 + +# vim: ft=sh diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh new file mode 100755 index 00000000..dadc96b0 --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# override shell lib output to stdout +eprint() { + # shellcheck disable=SC2317 + print "$@" +} +eprintln() { + # shellcheck disable=SC2317 + println "$@" +} + +enable_hook_dbg() { + debug_hooks="$(task _get rc.debug.hooks)" + [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable +} + +update_git_repo() { + task_data="$(task _get rc.data.location)" + [ "$task_data" ] || die "Taskwarrior should have a location set" + + cd "$task_data" || die "(BUG?): Your data.location path is not accessable" + + [ -d ./.git/ ] || git init + + git add . + git commit --message="chore: Update" --no-gpg-sign +} + +read -r new_task +# We don't change the task, thus immediately return the json +echo "$new_task" + +enable_hook_dbg +update_git_repo + +exit 0 + +# vim: ft=sh diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh new file mode 100755 index 00000000..25813e46 --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# override shell lib output to stdout +eprint() { + # shellcheck disable=SC2317 + print "$@" +} +eprintln() { + # shellcheck disable=SC2317 + println "$@" +} + +enable_hook_dbg() { + debug_hooks="$(task _get rc.debug.hooks)" + [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable +} + +update_git_repo() { + task_data="$(task _get rc.data.location)" + [ "$task_data" ] || die "Taskwarrior should have a location set" + + cd "$task_data" || die "(BUG?): Your data.location path is not accessable" + + [ -d ./.git/ ] || git init + + git add . + git commit --message="chore: Update" --no-gpg-sign +} + +read -r _old_task +read -r new_task +# We don't change the task, thus immediately return the json +echo "$new_task" + +enable_hook_dbg +update_git_repo + +exit 0 + +# vim: ft=sh diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py new file mode 100755 index 00000000..b482af6a --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (C) 2016-present Arctic Ice Studio +# Copyright (C) 2016-present Sven Greb + +# Project: igloo +# Repository: https://github.com/arcticicestudio/igloo +# License: MIT +# References: +# https://taskwarrior.org/docs +# https://taskwarrior.org/docs/timewarrior +# timew(1) +# task(1) + +"""A Taskwarrior hook to track the time of a active task with Taskwarrior. + +This hook will extract all of the following for use as Timewarrior tags: + +* UUID +* Project +* Tags +* Description +* UDAs + +Note: + This hook requires Python 3 and is only compatible with Taskwarrior version greater or equal to 2.4! + +This hook is a fork from the `official on-modify.timewarrior hook`_. + +.. _`official on-modify.timewarrior hook`: + https://github.com/GothenburgBitFactory/timewarrior/blob/dev/ext/on-modify.timewarrior +""" + +import subprocess +import sys +from json import loads, dumps +from os import system +from sys import stdin +from taskw import TaskWarrior + +# Make no changes to the task, simply observe. +old = loads(stdin.readline()) +new = loads(stdin.readline()) +print(dumps(new)) + + +w = TaskWarrior(config_filename=sys.argv[4].replace("rc:", "")) +config = w.load_config(config_filename=sys.argv[4].replace("rc:", "")) +if "max_active_tasks" in config: + MAX_ACTIVE = int(config["max_active_tasks"]) +else: + MAX_ACTIVE = 1 + + +# Extract attributes for use as tags. +tags = [new["description"]] + +if "project" in new: + project = new["project"] + tags.append(project) + if "." in project: + tags.extend([tag for tag in project.split(".")]) + +if "tags" in new: + tags.extend(new["tags"]) + +combined = " ".join(["'%s'" % tag for tag in tags]).encode("utf-8").strip() + +# Task has been started. +if "start" in new and "start" not in old: + # Prevent this task from starting if "task +ACTIVE count" is greater than "MAX_ACTIVE". + p = subprocess.Popen( + ["task", "+ACTIVE", "status:pending", "count", "rc.verbose:off"], + stdout=subprocess.PIPE, + ) + out, err = p.communicate() + count = int(out.rstrip()) + if count >= MAX_ACTIVE: + print( + "Only %d task(s) can be active at a time. " + "See 'max_active_tasks' in .taskrc." % MAX_ACTIVE + ) + sys.exit(1) + + system("timew start " + combined.decode() + " :yes") + +# Task has been stopped. +elif "start" not in new and "start" in old: + system("timew stop " + combined.decode() + " :yes") + +# Any task that is active, with a non-pending status should not be tracked. +elif "start" in new and new["status"] != "pending": + system("timew stop " + combined.decode() + " :yes") diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py new file mode 100755 index 00000000..d5b380d0 --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (C) 2016-present Arctic Ice Studio +# Copyright (C) 2016-present Sven Greb + +# Project: igloo +# Repository: https://github.com/arcticicestudio/igloo +# License: MIT +# References: +# https://taskwarrior.org/docs +# task(1) + +"""A Taskwarrior hook to track the total active time of a task. + +The tracked time is stored in a UDA task duration attribute named ``totalactivetime`` of type ``duration`` holding the total number of seconds the task was +active. The tracked time can then be included in any report by adding the ``totalactivetime`` column. + +By default, this plugin allows to have one task active at a time. This can be changed by setting ``max_active_tasks`` in ``.taskrc`` to a value greater than +``1``. + +Note: + This hook requires Python 3 and the `taskw`_ package to be installed which provides the python bindings for Taskwarrior! + Also note that this hook is only compatible with Taskwarrior version greater or equal to 2.4! + +This hook is a fork from `kostajh/taskwarrior-time-tracking-hook`_ + +.. _taskw: + https://pypi.python.org/pypi/taskw +.. _kostajh/taskwarrior-time-tracking-hook: + https://github.com/kostajh/taskwarrior-time-tracking-hook +""" + +import datetime +import json +import re +import sys +import subprocess +from taskw import TaskWarrior +from typing import TypeVar + +TIME_FORMAT = "%Y%m%dT%H%M%SZ" +UDA_KEY = "total_active_time" + +w = TaskWarrior(config_filename=sys.argv[4].replace("rc:", "")) +config = w.load_config(config_filename=sys.argv[4].replace("rc:", "")) +if "max_active_tasks" in config: + MAX_ACTIVE = int(config["max_active_tasks"]) +else: + MAX_ACTIVE = 1 + +"""Compiled regular expression for the duration as ISO-8601 formatted string.""" +ISO8601DURATION = re.compile("P((\d*)Y)?((\d*)M)?((\d*)D)?T((\d*)H)?((\d*)M)?((\d*)S)?") + +"""The duration type either as integer (in seconds), as ISO-8601 formatted string ("PT1H10M31S") or the seconds suffixed with "seconds".""" +DurationType = TypeVar("DurationType", str, int) + + +def duration_str_to_time_delta(duration_str: DurationType) -> datetime.timedelta: + """Converts duration string into a timedelta object. + + :param duration_str: The duration + :return: The duration as timedelta object + """ + if duration_str.startswith("P"): + match = ISO8601DURATION.match(duration_str) + if match: + year = match.group(2) + month = match.group(4) + day = match.group(6) + hour = match.group(8) + minute = match.group(10) + second = match.group(12) + value = 0 + if second: + value += int(second) + if minute: + value += int(minute) * 60 + if hour: + value += int(hour) * 3600 + if day: + value += int(day) * 3600 * 24 + if month: + # Assume a month is 30 days for now. + value += int(month) * 3600 * 24 * 30 + if year: + # Assume a year is 365 days for now. + value += int(year) * 3600 * 24 * 365 + else: + value = int(duration_str) + elif duration_str.endswith("seconds"): + value = int(duration_str.rstrip("seconds")) + else: + value = int(duration_str) + return datetime.timedelta(seconds=value) + + +def main(): + original = json.loads(sys.stdin.readline()) + modified = json.loads(sys.stdin.readline()) + + # An active task has just been started. + if "start" in modified and "start" not in original: + # Prevent this task from starting if "task +ACTIVE count" is greater than "MAX_ACTIVE". + p = subprocess.Popen( + ["task", "+ACTIVE", "status:pending", "count", "rc.verbose:off"], + stdout=subprocess.PIPE, + ) + out, err = p.communicate() + count = int(out.rstrip()) + if count >= MAX_ACTIVE: + print( + "Only %d task(s) can be active at a time. " + "See 'max_active_tasks' in .taskrc." % MAX_ACTIVE + ) + sys.exit(1) + + # An active task has just been stopped. + if "start" in original and "start" not in modified: + # Calculate the elapsed time. + start = datetime.datetime.strptime(original["start"], TIME_FORMAT) + end = datetime.datetime.utcnow() + + if UDA_KEY not in modified: + modified[UDA_KEY] = 0 + + this_duration = end - start + total_duration = this_duration + duration_str_to_time_delta( + str(modified[UDA_KEY]) + ) + print( + "Total Time Tracked: %s (%s in this instance)" + % (total_duration, this_duration) + ) + modified[UDA_KEY] = ( + str(int(total_duration.days * (60 * 60 * 24) + total_duration.seconds)) + + "seconds" + ) + + return json.dumps(modified, separators=(",", ":")) + + +def cmdline(): + sys.stdout.write(main()) + + +if __name__ == "__main__": + cmdline() diff --git a/modules/home.legacy/conf/taskwarrior/nord.theme b/modules/home.legacy/conf/taskwarrior/nord.theme new file mode 100644 index 00000000..2897418f --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/nord.theme @@ -0,0 +1,100 @@ +# Copyright (C) 2016-present Arctic Ice Studio +# Copyright (C) 2016-present Sven Greb + +# Project: igloo +# Repository: https://github.com/arcticicestudio/igloo +# License: MIT +# References: +# https://taskwarrior.org/docs/themes.html +# task-color(5) +# taskrc(5) + +rule.precedence.color=deleted,completed,active,keyword.,tag.,project.,overdue,scheduled,due.today,due,blocked,blocking,recurring,tagged,uda. + +#+---------+ +#+ General + +#+---------+ +color.label= +color.label.sort= +color.alternate= +color.header=bold blue +color.footnote=cyan +color.warning=bold black on yellow +color.error=bold black on red +color.debug=magenta + +#+-------------+ +#+ Task States + +#+-------------+ +color.completed=green +color.deleted=red +color.active=bold black on cyan +color.recurring= +color.scheduled=white on black +color.until=white on bright black +color.blocked=yellow on black +color.blocking=bold yellow on black + +#+----------+ +#+ Projects + +#+----------+ +color.project.none= + +#+----------+ +#+ Priority + +#+----------+ +color.uda.priority.H=bold cyan +color.uda.priority.M=bold blue +color.uda.priority.L=color245 + +#+------+ +#+ Tags + +#+------+ +color.tag.next= +color.tag.none= +color.tagged= + +#+-----+ +#+ Due + +#+-----+ +color.due=blue +color.due.today=cyan on black +color.overdue=bold red + +#+---------+ +#+ Reports + +#+---------+ +color.burndown.done=bold black on cyan +color.burndown.pending=black on bright cyan +color.burndown.started=black on blue + +color.history.add=bold black on blue +color.history.delete=bright white on bold black +color.history.done=bold black on cyan + +color.summary.background=bright white on black +color.summary.bar=black on cyan + +#+----------+ +#+ Calendar + +#+----------+ +color.calendar.due=bold black on blue +color.calendar.due.today=bold black on cyan +color.calendar.holiday=bold blue on white +color.calendar.overdue=bold black on red +color.calendar.today=bold black on cyan +color.calendar.weekend=bright white on bright black +color.calendar.weeknumber=bold black + +#+-----------------+ +#+ Synchronization + +#+-----------------+ +color.sync.added=green +color.sync.changed=yellow +color.sync.rejected=red + +#+------+ +#+ Undo + +#+------+ +color.undo.after=green +color.undo.before=red diff --git a/modules/home.legacy/conf/taskwarrior/projects/default.nix b/modules/home.legacy/conf/taskwarrior/projects/default.nix new file mode 100644 index 00000000..9b555fef --- /dev/null +++ b/modules/home.legacy/conf/taskwarrior/projects/default.nix @@ -0,0 +1,119 @@ +{}: [ + { + name = "me"; + prefix = ""; + subprojects = ["health" "sweden" "bank"]; + } + { + name = "timesinks"; + prefix = ""; + subprojects = ["youtube" "games" "netflix" "music"]; + } + { + name = "input"; + prefix = "research"; + subprojects = ["read-things" "dotfiles"]; + } + { + name = "aoc"; + prefix = "programming/advent_of_code"; + } + { + name = "camera"; + prefix = "programming/zig"; + subprojects = []; + } + { + name = "trinitrix"; + prefix = "programming/rust"; + subprojects = ["testing" "documentation"]; + } + { + name = "serverphone"; + prefix = "programming/rust"; + } + { + name = "latex"; + prefix = "programming/latex"; + } + { + name = "presentation"; + prefix = "research"; + } + { + name = "possible-projects"; + prefix = "research"; + } + { + name = "school"; + prefix = "research"; + subprojects = [ + "biologie" + "chemie" + "deutsch" + "english" + "geographie" + "geschichte" + "infomatik" + "klausuren" + "latein" + "mathematik" + "musik" + "philosophie" + "physik" + "sozialkunde" + "sport" + {extern = ["bwinf" "dsa"];} + {chemie = ["facharbeit"];} # TODO: Remove once the ff tabs are cleared <2024-05-10> + ]; + } + { + name = "hardware"; + prefix = "research"; + } + { + name = "buy"; + prefix = "buy"; + subprojects = ["books" "pc"]; + } + { + name = "system"; + prefix = "config"; + subprojects = [ + "youtube" + "backup" + "bar" + "email" + "firefox" + "gpg" + "keyboard" + "laptop" + "nvim" + "rss" + "shell" + "task" + "wm" + ]; + } + { + name = "server"; + prefix = "config"; + subprojects = [ + "b-peetz" + "email" + "blog" + "nix-sync" + "sudo-less" + "ci" + ]; + } + { + name = "3d-printer"; + prefix = "hardware"; + } + { + name = "smartphone"; + prefix = "hardware"; + subprojects = ["airplay" "airdrop"]; + } +] diff --git a/modules/home.legacy/conf/timewarrior/default.nix b/modules/home.legacy/conf/timewarrior/default.nix new file mode 100644 index 00000000..bcb627f5 --- /dev/null +++ b/modules/home.legacy/conf/timewarrior/default.nix @@ -0,0 +1,22 @@ +{pkgs, ...}: { + home.packages = [ + pkgs.timewarrior + ]; + xdg.configFile."timewarrior/timewarrior.cfg".text = '' + # source: https://github.com/arcticicestudio/igloo + #+----+ + #+ UI + + #+----+ + import ${./nord.theme} + color = true + + #+---------+ + #+ Reports + + #+---------+ + define reports: + day: + lines = 10 + month = true + week = true + ''; +} diff --git a/modules/home.legacy/conf/timewarrior/nord.theme b/modules/home.legacy/conf/timewarrior/nord.theme new file mode 100644 index 00000000..da3c387a --- /dev/null +++ b/modules/home.legacy/conf/timewarrior/nord.theme @@ -0,0 +1,25 @@ +# Copyright (C) 2016-present Arctic Ice Studio +# Copyright (C) 2016-present Sven Greb + +# Project: igloo +# Repository: https://github.com/arcticicestudio/igloo +# License: MIT +# References: +# https://taskwarrior.org/docs/timewarrior/themes.html +# timew(1) + +define theme: + description = "An arctic, north-bluish clean and elegant Timewarrior theme." + colors: + exclusion = "bold black" + today = "cyan" + holiday = "bold blue on white" + label = "bold white on black" + ids = "bold black on cyan" + debug = "magenta" + + # Rotating color palette for tags. + palette: + color01 = "bold black on cyan" + color02 = "bold black on bright cyan" + color03 = "bold black on blue" diff --git a/modules/home.legacy/conf/tridactyl/config.vim b/modules/home.legacy/conf/tridactyl/config.vim new file mode 100644 index 00000000..84e290cb --- /dev/null +++ b/modules/home.legacy/conf/tridactyl/config.vim @@ -0,0 +1,47 @@ +" vim: filetype=vim + +" This wipes all existing settings. This means that if a setting in this file +" is removed, then it will return to default. In other words, this file serves +" as an enforced single point of truth for Tridactyl's configuration. +sanitize tridactyllocal tridactylsync + +" Just use a blank page for new tab. It would be nicer to use the standard +" Firefox homepage, but Tridactyl doesn't support this yet. +"TODO: use custome file +"set newtab file:///home/soispha/new.html + +" Set a nice colorscheme +colorscheme midnight + +" Delete temp files after use +alias editor_rm composite editor | jsb -p tri.native.run(`rm -f '${JS_ARG[0]}'`) +bind --mode=insert editor_rm +bind --mode=input editor_rm + +" Use vim in tmux for editor. +set editorcmd alacritty -e nvim + +" Ctrl-F should use the browser's native 'find' functionality. +unbind + +" But also support Tridactyl search too. +bind / fillcmdline find +bind ? fillcmdline find -? +bind l findnext 1 +bind L findnext -1 +" Remove search highlighting. +bind , nohlsearch +" Use sensitive case. Smart case would be nice here, but it doesn't work. +set findcase smartcase + +" Smooth scrolling, yes please. This is still a bit janky in Tridactyl. +set smoothscroll true + +" The default jump of 10 is a bit much. +bind t scrollline 5 +bind n scrollline -5 + +" K and J should move between tabs. x should close them. +bind T tabprev +bind N tabnext +bind x tabclose diff --git a/modules/home.legacy/conf/tridactyl/default.nix b/modules/home.legacy/conf/tridactyl/default.nix new file mode 100644 index 00000000..23307cfe --- /dev/null +++ b/modules/home.legacy/conf/tridactyl/default.nix @@ -0,0 +1,3 @@ +{...}: { + xdg.configFile."tridactyl/tridactylrc".source = ./config.vim; +} diff --git a/modules/home.legacy/conf/unison/default.nix b/modules/home.legacy/conf/unison/default.nix new file mode 100644 index 00000000..ae682235 --- /dev/null +++ b/modules/home.legacy/conf/unison/default.nix @@ -0,0 +1,187 @@ +{ + lib, + config, + nixosConfig, + sysLib, + pkgs, + ... +}: let + unisonPath = "${config.xdg.dataHome}/unison"; + + # These are only used for the script + unisonOptions = { + sshcmd = "ssh"; + ui = "text"; + auto = "true"; + # This is useless, with hm links + links = "false"; + + backupdir = "${unisonPath}/backups"; + backuploc = "central"; + backupcurr = paths_to_merge; + # merge = + # builtins.map (x: ''${x} -> diff3 --text --merge CURRENT1 CURRENTARCH CURRENT2 > NEW'') + # paths_to_merge; + }; + + paths_to_merge = mkPathName { + file_names = ["log" "history" "harpoon.json" "file_frecency.bin" "main.shada"]; + extensions = ["log"]; + }; + + paths_to_keep = [ + "~/.local/state/mpv" + "~/.local/state/nvim" + "~/.local/share" + "~/.local/.Trash-1000" + + "~/.mozilla/.Trash-1000" + "~/.mozilla/firefox" + + "~/media" + "~/school" + "~/repos" + ]; + paths_to_ignore = [ + # already synchronized by the taskserver + "~/.local/share/task" + + # Should not be synchronized + "~/.local/share/unison" + + # Is just to big to be synchronized (# TODO: Work around that <2024-08-31> ) + "~/media/music" + ]; + + hostName = let + hn = nixosConfig.networking.hostName; + in + if hn == "tiamat" + then "apzu" + else if hn == "apzu" + then "tiamat" + else builtins.throw "Host (${hn}) not yet covered in the unison host mapping."; + + mkPathName = { + file_names, + extensions, + }: + builtins.map (x: ''Name ${x}'') ( + (builtins.map (x: ''*.${x}'') extensions) + ++ file_names + ); + + unitName = name: builtins.replaceStrings ["/"] ["-"] name; + + mkPath = path: + if lib.strings.hasPrefix "~" path + then "${builtins.elemAt (builtins.attrNames config.home.persistence) + 0}${lib.strings.removePrefix "~" path}" + else + builtins.throw + "Every pathname needs to start with a '~'"; + + mkPair = pathname: let + path = mkPath pathname; + in { + name = unitName "${pathname}"; + value = { + stateDirectory = unisonPath; + roots = [ + "${path}" + "ssh://${config.home.username}@${hostName}.fritz.box/${path}" + ]; + }; + }; + + getIgnoredSingle = path: path_to_ignore: let + clean_path_to_ignore = mkPath path_to_ignore; + commonPath = builtins.substring 0 (builtins.stringLength path) clean_path_to_ignore; + in + if commonPath == path + then let + preFinalPath = + builtins.substring (builtins.stringLength commonPath) + (builtins.stringLength clean_path_to_ignore) + clean_path_to_ignore; + finalPath = + if lib.strings.hasPrefix "/" preFinalPath + then lib.strings.removePrefix "/" preFinalPath + else preFinalPath; + in "BelowPath ${finalPath}" + else null; + + getIgnored = paths_to_ignore: path: + serialiseArgs { + ignore = + builtins.filter (x: x != null) (builtins.map (getIgnoredSingle path) paths_to_ignore); + }; + + serialiseArg = key: val: + if builtins.typeOf val == "string" + then lib.strings.escapeShellArg "-${key}=${lib.strings.escape ["="] val}" + else if builtins.typeOf val == "list" + then lib.strings.concatStringsSep " " (builtins.map (serialiseArg key) val) + else builtins.throw "Unsupported type: ${builtins.typeOf val}"; + + serialiseArgs = args: + lib.strings.concatStringsSep " " ( + lib.attrsets.mapAttrsToList + serialiseArg + args + ); + + esa = a: lib.strings.escapeShellArg a; + + mkScriptLine = pathname: let + path = + mkPath pathname; + in + lib.strings.concatStringsSep " " [ + "unison" + "${serialiseArgs unisonOptions}" + "$EXTRA_OPTIONS" + "${getIgnored paths_to_ignore path}" + "${esa path}" + (esa "ssh://${config.home.username}@${hostName}.fritz.box/${path}") + ]; + + script = lib.strings.concatStringsSep "\n" (builtins.map mkScriptLine paths_to_keep); + + pairs = builtins.listToAttrs (builtins.map mkPair paths_to_keep); +in { + home.sessionVariables = { + UNISON = unisonPath; + }; + home.packages = [ + pkgs.unison + (sysLib.writeShellScript { + name = "unison-sync"; + src = builtins.toFile "unison-backup" ('' + #!/usr/bin/env dash + + # shellcheck source=/dev/null + SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + + export UNISON=${esa unisonPath}; + + if [ "$1" = "links" ]; then + shift 1; + EXTRA_OPTIONS="-links=true"; + fi + EXTRA_OPTIONS="$EXTRA_OPTIONS $*" + '' + + script); + dependencies = with pkgs; [ + unison + openssh # needed to connect to the other server + less # needed to show diffs + diffutils # needed to compute diffs + ]; + }) + ]; + services.unison = { + enable = false; + inherit pairs; + }; +} diff --git a/modules/home.legacy/conf/xdg/default.nix b/modules/home.legacy/conf/xdg/default.nix new file mode 100644 index 00000000..4099720d --- /dev/null +++ b/modules/home.legacy/conf/xdg/default.nix @@ -0,0 +1,63 @@ +{ + sysLib, + pkgs, + config, + ... +}: let + url_handler = sysLib.writeShellScript { + name = "url_handler"; + src = ./url_handler.sh; + keepPath = true; + # Naming dependencies for this will be difficult, as it depend on overridden packages. + dependencies = with pkgs; [ + rofi + libnotify + zathura + ]; + replacementStrings = { + ALL_PROJECTS_PIPE = "${config.soispha.taskwarrior.projects.projects_pipe}"; + }; + }; +in { + imports = [ + ./xdg_vars.nix + ]; + + xdg = { + mimeApps = { + enable = true; + defaultApplications = { + "application/pdf" = ["url_handler.desktop"]; + "application/x-pdf" = ["url_handler.desktop"]; + + "text/html" = ["url_handler.desktop"]; + "text/xml" = ["url_handler.desktop"]; + "x-scheme-handler/http" = ["url_handler.desktop"]; + "x-scheme-handler/https" = ["url_handler.desktop"]; + "x-scheme-handler/about" = ["url_handler.desktop"]; + "x-scheme-handler/unknown" = ["url_handler.desktop"]; + }; + }; + desktopEntries = { + url_handler = { + name = "url_handler"; + genericName = "Web Browser"; + exec = "${url_handler}/bin/url_handler %u"; + terminal = false; + categories = [ + "Application" + "Network" + "WebBrowser" + ]; + mimeType = [ + "text/html" + "text/xml" + "x-scheme-handler/http" + "x-scheme-handler/https" + "x-scheme-handler/about" + "x-scheme-handler/unknown" + ]; + }; + }; + }; +} diff --git a/modules/home.legacy/conf/xdg/url_handler.sh b/modules/home.legacy/conf/xdg/url_handler.sh new file mode 100755 index 00000000..95eedffb --- /dev/null +++ b/modules/home.legacy/conf/xdg/url_handler.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +project="$(echo "%ALL_PROJECTS_PIPE|nvim|zathura|" | rofi -sep "|" -dmenu)" + +if [ "$project" = "nvim" ]; then + "$TERMINAL" -e nvim "$1" +elif [ "$project" = "zathura" ]; then + zathura "$1" +elif [ "$project" ]; then + firefox -P "$project" "$1" +else + notify-send "(URL HANDLER) No project selected" && exit 1 +fi + +# vim: ft=sh diff --git a/modules/home.legacy/conf/xdg/xdg_vars.nix b/modules/home.legacy/conf/xdg/xdg_vars.nix new file mode 100644 index 00000000..3f7d5e00 --- /dev/null +++ b/modules/home.legacy/conf/xdg/xdg_vars.nix @@ -0,0 +1,26 @@ +{config, ...}: let + inherit (config.xdg) dataHome; +in { + # Variables that only have to be set because special applications fail to set reasonable + # defaults (mostly understandable because of backwards-compatibility, but yeah) + programs.zsh.sessionVariables = { + CARGO_HOME = "${dataHome}/cargo"; + GRADLE_USER_HOME = "${dataHome}/gradle"; + + #_JAVA_OPTIONS = lib.concatStringsSep " " [ + # ''-Djava.util.prefs.userRoot="${config.xdg.configHome}/java"'' + # ''-Djavafx.cachedir="${config.xdg.cacheHome}/openjfx"'' + # ]; + #GOPATH = "${config.xdg.dataHome}/go"; + #GTK2_RC_FILES = "${config.xdg.configHome}/gtk-2.0/gtkrc"; + #RUSTUP_HOME = "${config.xdg.dataHome}/rustup"; + #NPM_CONFIG_USERCONFIG = "${config.xdg.configHome}/npm/npmrc"; + #NUGET_PACKAGES = "${config.xdg.cacheHome}/NuGetPackages"; + #XAUTHORITY = "${config.xdg.stateHome}/Xauthority"; + #COMPDUMPFILE = "${config.xdg.dataHome}/zsh/.zcompdump}"; + #IPYTHONDIR = "${config.xdg.configHome}/ipython"; + #PARALLEL_HOME = "${config.xdg.configHome}/parallel"; + #STACK_XDG = "1"; + #WINEPREFIX = "${config.xdg.dataHome}/wine"; + }; +} diff --git a/modules/home.legacy/conf/yambar/config/config.yml b/modules/home.legacy/conf/yambar/config/config.yml new file mode 100644 index 00000000..3d9f0687 --- /dev/null +++ b/modules/home.legacy/conf/yambar/config/config.yml @@ -0,0 +1,243 @@ +--- +# Config file for yambar +# Note that this may be version-dependent, this file is written for v1.8.0 + + +# Font anchors +font-main: &fontmain Source Code Pro:pixelsize=26 +font-aws: &awesome Font Awesome 5 Free:style=solid:pixelsize=23 + +# Color anchors +fg-none: &fgnone 00000000 +fg-1: &fg1 c6ceefff +fg-blue: &fgblue 99d1dbff +fg-sapphire: &fgsapp 74c7ecdd +fg-green: &fggreen a6e3a1dd +fg-peach: &fgpeach fab387dd +fg-mauve: &fgmauve cba6f7dd +fg-teal: &fgteal 94e2d5dd +fg-lavendar: &fglav b4befedd +fg-focus: &fgfocus e78284ff +bg-1: &bg1 303446ff +bg-tag: &bgtag 585b70ff +bg-tag2: &bgtag2 45475aff +bg-urgent: &bgurgent e78284ff + +# Background blocks +background-block: &bgcblock {background: {color: *bg1 }} +background-block-urgent: &bgcurg {background: {color: *bgurgent }} + +# Underlines +underline-focused: &line {underline: { size: 3, color: *fgfocus}} +underline-urgent: &lineurgent {underline: { size: 3, color: *fgblue}} +underline-utils: &lineutil {underline: { size: 3, color: *fgpeach}} +underline-resources: &linemem {underline: { size: 3, color: *fggreen}} +underline-battery: &linebat {underline: { size: 3, color: *fgsapp}} +underline-clock: &lineclock {underline: { size: 3, color: *fgteal}} +underline-weather: &linewea {underline: { size: 3, color: *fglav}} +underline-title: &linetitle {underline: { size: 3, color: *bgtag}} + +# Combined decorations +combination-utils: &combutil {stack: [ <<: *bgcblock, <<: *lineutil]} +combination-resources: &combmem {stack: [ <<: *bgcblock, <<: *linemem]} +combination-battery: &combbat {stack: [ <<: *bgcblock, <<: *linebat]} +combination-clock: &combclock {stack: [ <<: *bgcblock, <<: *lineclock]} +combination-weather: &combwea {stack: [ <<: *bgcblock, <<: *linewea]} + + +### Main + +bar: + location: top + height: 45 + layer: bottom + spacing: 0 + margin: 10 + border: {margin: 0, top-margin: 10} + foreground: *fg1 + background: *fgnone + font: *fontmain + + ### Left, river tags + left: + - river: + anchors: + - id: &name { text: "{id}" } + - string: &focus { stack: [ {background: {color: *bg1}} ] } + - string: &normal { string: { <<: *name, margin: 10 } } + - string: + &occupied { string: { <<: *name, deco: {background: {color: *bgtag2}}, margin: 10 } } + - string: &urgent { string: { <<: *name, deco: {stack: [background: {color: *bgurgent}, <<: *lineurgent]}, margin: 10 } } + - string: &focused { string: { <<: *name, deco: {stack: [background: {color: *bgtag}, <<: *line]}, margin: 10 } } + - string: &unfocused { string: { <<: *name, deco: {background: {color: *bgtag2}}, margin: 10 } } + - base: &river_base + default: *normal + conditions: + state == focused: *focused + state == unfocused: *unfocused + state == urgent: *urgent + state == invisible: + map: + conditions: + occupied: *occupied + ~occupied: *normal + content: + map: + on-click: + left: sh -c "riverctl set-focused-tags $((1 << ({id} - 1)))" + right: sh -c "riverctl toggle-focused-tags $((1 << ({id} -1)))" + middle: sh -c "riverctl toggle-view-tags $((1 << ({id} -1)))" + conditions: + id == 1: { map: { <<: *river_base } } + id == 2: { map: { <<: *river_base } } + id == 3: { map: { <<: *river_base } } + id == 4: { map: { <<: *river_base } } + id == 5: { map: { <<: *river_base } } + id == 6: { map: { <<: *river_base } } + id == 7: { map: { <<: *river_base } } + id == 8: { map: { <<: *river_base } } + id == 9: { map: { <<: *river_base } } + title: + map: + default: + { + string: + { + text: "{title}", + left-margin: 12, + right-margin: 12, + # max: 35, + deco: *linetitle + }, + } + conditions: + title == "": { string: { text: "" } } + + ### Center, clock & weather gadget + center: + - clock: + time-format: "%H:%M:%S %Z" + date-format: "%d/%m/%y (%a)" + foreground: *fgblue + content: + string: + text: " {date} {time} " + deco: *combclock + + ### Right, system tray + right: + #- network: + # name: wlp5s0 + # poll-interval: 10 + # content: + # map: + # on-click: /bin/sh -c "nmtui" + # conditions: + # ~carrier: {empty: {}} + # carrier: + # string: {text: "  {ssid} ", deco: *combutil} + #- network: + # name: enp4s0 + # content: + # map: + # on-click: /bin/sh -c "nmtui" + # conditions: + # ~carrier: + # string: {text: "  Eth failed ", deco: *combutil} + # carrier: {empty: {}} + + - script: # mpd song name + path: @mpd_song_name_script@ + content: + map: + conditions: + playing: + string: {text: "{song} ", deco: *combwea} + ~playing: + string: {text: "", deco: *combwea} + - script: # Sound volume + path: @volume_script@ + content: + map: + on-click: /bin/sh -c "pavucontrol" + conditions: + muted: + string: + text: " 󰝟 " + deco: *bgcurg + ~muted: + string: {text: "  {volume}% ", deco: *combutil} + + # - script: # Grade average + # path: @grade_average_script@ + # content: + # string: + # text: "  {grade} " + # deco: *combmem + + #- backlight: + # name: intel_backlight + # content: + # - string: {text: "  {percent}% ", deco: *combutil} + + - script: # CPU + path: @cpu_script@ + content: + string: + text: "  {cpu}% " + deco: *combmem + + - script: # Memory info + path: @memory_script@ + content: + map: + conditions: + swapstate: + string: + text: "  {memperc}%({swapperc}%) " + deco: *combmem + ~swapstate: + string: + text: "  {memperc}% " + deco: *combmem + - script: # Disk space + path: @disk_script@ + content: + string: + text: " 󰋊 {diskspace}({diskperc})" + deco: *combmem + #- battery: + # name: BAT0 + # poll-interval: 30 + # content: + # list: + # items: + # - ramp: + # tag: capacity + # items: + # - string: + # text: "  {capacity}%({estimate}) " + # deco: *bgcurg + # - string: + # text: "  {capacity}%({estimate}) " + # deco: {stack: [ <<: *bgcblock, <<: *linebat]} + # - string: + # text: "  {capacity}%({estimate}) " + # deco: {stack: [ <<: *bgcblock, <<: *linebat]} + # - string: + # text: "  {capacity}%({estimate}) " + # deco: {stack: [ <<: *bgcblock, <<: *linebat]} + # - string: + # text: "  {capacity}%({estimate}) " + # deco: {stack: [ <<: *bgcblock, <<: *linebat]} + #- script: # tray + # path: /home/dt/.config/yambar/scripts/yambar-tray + # content: + # empty: {} + #- script: + # path: /home/dt/.config/yambar/scripts/yambar-tray-width + # poll-interval: 10 + # content: + # string: + # text: "{padding}" + # deco: *combmem diff --git a/modules/home.legacy/conf/yambar/config/laptop.yml b/modules/home.legacy/conf/yambar/config/laptop.yml new file mode 100644 index 00000000..8de2f508 --- /dev/null +++ b/modules/home.legacy/conf/yambar/config/laptop.yml @@ -0,0 +1,243 @@ +--- +# Config file for yambar +# Note that this may be version-dependent, this file is written for v1.8.0 + + +# Font anchors +font-main: &fontmain Source Code Pro:pixelsize=22 +font-aws: &awesome Font Awesome 5 Free:style=solid:pixelsize=20 + +# Color anchors +fg-none: &fgnone 00000000 +fg-1: &fg1 c6ceefff +fg-blue: &fgblue 99d1dbff +fg-sapphire: &fgsapp 74c7ecdd +fg-green: &fggreen a6e3a1dd +fg-peach: &fgpeach fab387dd +fg-mauve: &fgmauve cba6f7dd +fg-teal: &fgteal 94e2d5dd +fg-lavendar: &fglav b4befedd +fg-focus: &fgfocus e78284ff +bg-1: &bg1 303446ff +bg-tag: &bgtag 585b70ff +bg-tag2: &bgtag2 45475aff +bg-urgent: &bgurgent e78284ff + +# Background blocks +background-block: &bgcblock {background: {color: *bg1 }} +background-block-urgent: &bgcurg {background: {color: *bgurgent }} + +# Underlines +underline-focused: &line {underline: { size: 3, color: *fgfocus}} +underline-urgent: &lineurgent {underline: { size: 3, color: *fgblue}} +underline-utils: &lineutil {underline: { size: 3, color: *fgpeach}} +underline-resources: &linemem {underline: { size: 3, color: *fggreen}} +underline-battery: &linebat {underline: { size: 3, color: *fgsapp}} +underline-clock: &lineclock {underline: { size: 3, color: *fgteal}} +underline-weather: &linewea {underline: { size: 3, color: *fglav}} +underline-title: &linetitle {underline: { size: 3, color: *bgtag}} + +# Combined decorations +combination-utils: &combutil {stack: [ <<: *bgcblock, <<: *lineutil]} +combination-resources: &combmem {stack: [ <<: *bgcblock, <<: *linemem]} +combination-battery: &combbat {stack: [ <<: *bgcblock, <<: *linebat]} +combination-clock: &combclock {stack: [ <<: *bgcblock, <<: *lineclock]} +combination-weather: &combwea {stack: [ <<: *bgcblock, <<: *linewea]} + + +### Main + +bar: + location: top + height: 25 + layer: bottom + spacing: 0 + margin: 10 + border: {margin: 0, top-margin: 5} + foreground: *fg1 + background: *fgnone + font: *fontmain + + ### Left, river tags + left: + - river: + anchors: + - id: &name { text: "{id}" } + - string: &focus { stack: [ {background: {color: *bg1}} ] } + - string: &normal { string: { <<: *name, margin: 10 } } + - string: + &occupied { string: { <<: *name, deco: {background: {color: *bgtag2}}, margin: 10 } } + - string: &urgent { string: { <<: *name, deco: {stack: [background: {color: *bgurgent}, <<: *lineurgent]}, margin: 10 } } + - string: &focused { string: { <<: *name, deco: {stack: [background: {color: *bgtag}, <<: *line]}, margin: 10 } } + - string: &unfocused { string: { <<: *name, deco: {background: {color: *bgtag2}}, margin: 10 } } + - base: &river_base + default: *normal + conditions: + state == focused: *focused + state == unfocused: *unfocused + state == urgent: *urgent + state == invisible: + map: + conditions: + occupied: *occupied + ~occupied: *normal + content: + map: + on-click: + left: sh -c "riverctl set-focused-tags $((1 << ({id} - 1)))" + right: sh -c "riverctl toggle-focused-tags $((1 << ({id} -1)))" + middle: sh -c "riverctl toggle-view-tags $((1 << ({id} -1)))" + conditions: + id == 1: { map: { <<: *river_base } } + id == 2: { map: { <<: *river_base } } + id == 3: { map: { <<: *river_base } } + id == 4: { map: { <<: *river_base } } + id == 5: { map: { <<: *river_base } } + id == 6: { map: { <<: *river_base } } + id == 7: { map: { <<: *river_base } } + id == 8: { map: { <<: *river_base } } + id == 9: { map: { <<: *river_base } } + title: + map: + default: + { + string: + { + text: "{title}", + left-margin: 12, + right-margin: 12, + # max: 35, + deco: *linetitle + }, + } + conditions: + title == "": { string: { text: "" } } + + ### Center, clock & weather gadget + center: + - clock: + time-format: "%H:%M:%S %Z" + date-format: "%d/%m/%y (%a)" + foreground: *fgblue + content: + string: + text: " {date} {time} " + deco: *combclock + + ### Right, system tray + right: + #- network: + # name: wlp5s0 + # poll-interval: 10 + # content: + # map: + # on-click: /bin/sh -c "nmtui" + # conditions: + # ~carrier: {empty: {}} + # carrier: + # string: {text: "  {ssid} ", deco: *combutil} + #- network: + # name: enp4s0 + # content: + # map: + # on-click: /bin/sh -c "nmtui" + # conditions: + # ~carrier: + # string: {text: "  Eth failed ", deco: *combutil} + # carrier: {empty: {}} + + - script: # mpd song name + path: @mpd_song_name_script@ + content: + map: + conditions: + playing: + string: {text: "{song} ", deco: *combwea} + ~playing: + string: {text: "", deco: *combwea} + - script: # Sound volume + path: @volume_script@ + content: + map: + on-click: /bin/sh -c "pavucontrol" + conditions: + muted: + string: + text: " 󰝟 " + deco: *bgcurg + ~muted: + string: {text: "  {volume}% ", deco: *combutil} + + # - script: # Grade average + # path: @grade_average_script@ + # content: + # string: + # text: "  {grade} " + # deco: *combmem + + - backlight: + name: @backlight@ + content: + - string: {text: "  {percent}% ", deco: *combutil} + + - script: # CPU + path: @cpu_script@ + content: + string: + text: "  {cpu}% " + deco: *combmem + + - script: # Memory info + path: @memory_script@ + content: + map: + conditions: + swapstate: + string: + text: "  {memperc}%({swapperc}%) " + deco: *combmem + ~swapstate: + string: + text: "  {memperc}% " + deco: *combmem + - script: # Disk space + path: @disk_script@ + content: + string: + text: " 󰋊 {diskspace}({diskperc})" + deco: *combmem + - battery: + name: BAT0 + poll-interval: 300 + content: + list: + items: + - ramp: + tag: capacity + items: + - string: + text: "  {capacity}%({estimate}) " + deco: *bgcurg + - string: + text: "  {capacity}%({estimate}) " + deco: {stack: [ <<: *bgcblock, <<: *linebat]} + - string: + text: "  {capacity}%({estimate}) " + deco: {stack: [ <<: *bgcblock, <<: *linebat]} + - string: + text: "  {capacity}%({estimate}) " + deco: {stack: [ <<: *bgcblock, <<: *linebat]} + - string: + text: "  {capacity}%({estimate}) " + deco: {stack: [ <<: *bgcblock, <<: *linebat]} + #- script: # tray + # path: /home/dt/.config/yambar/scripts/yambar-tray + # content: + # empty: {} + #- script: + # path: /home/dt/.config/yambar/scripts/yambar-tray-width + # poll-interval: 10 + # content: + # string: + # text: "{padding}" + # deco: *combmem diff --git a/modules/home.legacy/conf/yambar/default.nix b/modules/home.legacy/conf/yambar/default.nix new file mode 100644 index 00000000..007e7f25 --- /dev/null +++ b/modules/home.legacy/conf/yambar/default.nix @@ -0,0 +1,50 @@ +{ + nixosConfig, + sysLib, + pkgs, + lib, + ... +}: let + makeScript = { + name, + dependencies, + ... + }: + sysLib.writeShellScript { + inherit name; + src = ./scripts/${name}.sh; + dependencies = dependencies ++ (builtins.attrValues {inherit (pkgs) dash;}); + } + + "/bin/${name}"; +in { + xdg.configFile."yambar/config.yml".source = pkgs.substituteAll { + src = + if nixosConfig.soispha.laptop.enable + then ./config/laptop.yml + else ./config/config.yml; + + backlight = + if nixosConfig.soispha.laptop.enable + then nixosConfig.soispha.laptop.backlight + else ""; + + mpd_song_name_script = makeScript { + dependencies = builtins.attrValues {inherit (pkgs) mpc-cli;}; + name = "mpd_song_name"; + }; + + volume_script = makeScript { + dependencies = builtins.attrValues {inherit (pkgs) pulseaudio gawk coreutils;}; + name = "sound-volume"; + }; + + cpu_script = lib.getExe pkgs.yambar-cpu; + + memory_script = lib.getExe pkgs.yambar-memory; + + disk_script = makeScript { + dependencies = builtins.attrValues {inherit (pkgs) gawk btrfs-progs coreutils;}; + name = "disk"; + }; + }; +} diff --git a/modules/home.legacy/conf/yambar/scripts/disk.sh b/modules/home.legacy/conf/yambar/scripts/disk.sh new file mode 100755 index 00000000..a5547a74 --- /dev/null +++ b/modules/home.legacy/conf/yambar/scripts/disk.sh @@ -0,0 +1,21 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# Main loop +while true; do + # vars + used_space=$(btrfs filesystem usage /srv 2>/dev/null | awk '{if ( /Used:/ ) { print $2 } } ' | head -n1) + all_space=$(btrfs filesystem usage /srv 2>/dev/null | awk '{if ( /Device size:/ ) { print $3 } } ' | head -n1 | tr -d "GiB") + + # Check space available (4) and percentage used (5) + spaceperc=$(echo "$(echo "$used_space" | tr -d "GiB")" "$all_space" | awk '{div=$1/$2;div *= 100; printf"%2d%%\n",div }') + + echo "diskspace|string|$used_space" + echo "diskperc|string|$spaceperc" + echo "" + sleep 1 +done + +# vim: ft=sh diff --git a/modules/home.legacy/conf/yambar/scripts/mpd_song_name.sh b/modules/home.legacy/conf/yambar/scripts/mpd_song_name.sh new file mode 100755 index 00000000..7d294781 --- /dev/null +++ b/modules/home.legacy/conf/yambar/scripts/mpd_song_name.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +while true; do + state="$(mpc status '%state%')" + + if [ "$state" = "playing" ]; then + song="$(mpc --format '[[%artist% - ]%title%]|[%file%]' current)" + echo "playing|bool|true" + echo "song|string|$song :: $(mpc status "%currenttime%/%totaltime%")" + else + echo "playing|bool|false" + fi + echo "" # commit + + sleep 2 +done + +# vim: ft=sh diff --git a/modules/home.legacy/conf/yambar/scripts/network.sh b/modules/home.legacy/conf/yambar/scripts/network.sh new file mode 100755 index 00000000..adfc93df --- /dev/null +++ b/modules/home.legacy/conf/yambar/scripts/network.sh @@ -0,0 +1,47 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +retest=120 +retest_if_con_fails=10 +backend=nmcli + +case "$backend" in +"nmcli") # Test for connectivity with nmcli + while true; do + connection_status=$(nmcli networking connectivity) + if [ "$connection_status" = "full" ]; then + echo "internet|string|Connected" + echo "" + sleep $retest + else + echo "internet|string|Disconnected" + echo "" + sleep $retest_if_con_fails + fi + done + ;; +"ping") # Test for connectivity with ping + ip_address='8.8.8.8' + ping_number=3 + + while true; do + + ping_result=$(mktmp) + ping $ip_address -c $ping_number -q | awk 'BEGIN {FS="/"} END {print $5}' >"$ping_result" + + if [ "$(wc -l <"$ping_result")" -eq 0 ]; then + echo "med|string|No connection" + echo "" + sleep $retest_if_con_fails + else + echo "med|string|$(cat "$ping_result") ms" + echo "" + sleep $retest + fi + done + ;; +esac + +# vim: ft=sh diff --git a/modules/home.legacy/conf/yambar/scripts/sound-volume.sh b/modules/home.legacy/conf/yambar/scripts/sound-volume.sh new file mode 100755 index 00000000..8a98daf7 --- /dev/null +++ b/modules/home.legacy/conf/yambar/scripts/sound-volume.sh @@ -0,0 +1,20 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +while true; do + volume="$(pactl get-sink-volume 0 | awk 'BEGIN { FS="/" } {gsub("%","",$2); gsub(" ","",$2)} {printf $2}')" + + if [ "$volume" -eq 0 ]; then + echo "muted|bool|true" + else + echo "volume|string|$volume" + echo "muted|bool|false" + fi + echo "" + + sleep 3 +done + +# vim: ft=sh diff --git a/modules/home.legacy/conf/yt/config.toml b/modules/home.legacy/conf/yt/config.toml new file mode 100644 index 00000000..981481d9 --- /dev/null +++ b/modules/home.legacy/conf/yt/config.toml @@ -0,0 +1,2 @@ +[download] +max_cache_size = "5 GiB" diff --git a/modules/home.legacy/conf/yt/default.nix b/modules/home.legacy/conf/yt/default.nix new file mode 100644 index 00000000..507a0db1 --- /dev/null +++ b/modules/home.legacy/conf/yt/default.nix @@ -0,0 +1,5 @@ +{...}: { + xdg.configFile."yt/mpv.conf".source = ./mpv.conf; + xdg.configFile."yt/mpv.input.conf".source = ./input.conf; + xdg.configFile."yt/config.toml".source = ./config.toml; +} diff --git a/modules/home.legacy/conf/yt/input.conf b/modules/home.legacy/conf/yt/input.conf new file mode 100644 index 00000000..f374f062 --- /dev/null +++ b/modules/home.legacy/conf/yt/input.conf @@ -0,0 +1,9 @@ +Q script-message yt-mark-watch-later +c script-message yt-comments-external +C script-message yt-comments-local +d script-message yt-description +WHEEL_LEFT playlist-prev +WHEEL_RIGHT playlist-next +q script-message yt-mark-done-and-go-next +r script-message yt-check-new-videos +P quit diff --git a/modules/home.legacy/conf/yt/mpv.conf b/modules/home.legacy/conf/yt/mpv.conf new file mode 100644 index 00000000..b6d2501f --- /dev/null +++ b/modules/home.legacy/conf/yt/mpv.conf @@ -0,0 +1,2 @@ +speed=2.7 +volume=75 diff --git a/modules/home.legacy/conf/ytcc/default.nix b/modules/home.legacy/conf/ytcc/default.nix new file mode 100644 index 00000000..87300ec1 --- /dev/null +++ b/modules/home.legacy/conf/ytcc/default.nix @@ -0,0 +1,11 @@ +{ + config, + pkgs, + ... +}: { + xdg.configFile."ytcc/ytcc.conf".source = pkgs.substituteAll { + src = ./ytcc.conf; + download_dir = "${config.xdg.userDirs.download}/ytcc"; + xdg_data_home = config.xdg.dataHome; + }; +} diff --git a/modules/home.legacy/conf/ytcc/ytcc.conf b/modules/home.legacy/conf/ytcc/ytcc.conf new file mode 100644 index 00000000..289843ad --- /dev/null +++ b/modules/home.legacy/conf/ytcc/ytcc.conf @@ -0,0 +1,37 @@ +[ytcc] +download_dir = @download_dir@ +mpv_flags = --really-quiet --ytdl --ytdl-format=bestvideo[height<=?1080]+bestaudio/best --speed=2.7 +download_subdirs = true +order_by = playlists:asc, publish_date:desc +video_attrs = id, title, publish_date, duration, playlists +playlist_attrs = name, url, tags, reverse +db_path = @xdg_data_home@/ytcc/ytcc.db +date_format = %Y-%m-%d +max_update_fail = 5 +max_update_backlog = 20 +age_limit = 0 + +[tui] +alphabet = sdfervghnuiojkl +default_action = play_video + +[theme] +prompt_download_audio = 2 +prompt_download_video = 4 +prompt_play_audio = 2 +prompt_play_video = 4 +prompt_mark_watched = 1 +table_alternate_background = 245 +plain_label_text = 244 + +[youtube_dl] +format = bestvideo[height<=?1080]+bestaudio/best +output_template = %(title)s.%(ext)s +ratelimit = 0 +retries = 0 +subtitles = off +thumbnail = true +skip_live_stream = true +merge_output_format = mkv +max_duration = 0 +restrict_filenames = false diff --git a/modules/home.legacy/conf/zsh/config/command_not_found.sh b/modules/home.legacy/conf/zsh/config/command_not_found.sh new file mode 100644 index 00000000..fb21b676 --- /dev/null +++ b/modules/home.legacy/conf/zsh/config/command_not_found.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env dash + +# This was taken from the +# `${pkgs.nix-index}/etc/profile.d/command-not-found.sh` file on 2024-02-28 + +# for bash 4 +# this will be called when a command is entered +# but not found in the user’s path + environment +command_not_found_handle() { + # taken from http://www.linuxjournal.com/content/bash-command-not-found + # - do not run when inside Midnight Commander or within a Pipe + if [ -n "${MC_SID-}" ] || ! [ -t 1 ]; then + >&2 echo "$1: command not found" + return 127 + fi + + toplevel=nixpkgs # nixpkgs should always be available even in NixOS + cmd="$1" + attrs=$(nix-locate --minimal --no-group --type x --type s --top-level --whole-name --at-root "/bin/$cmd") + len=$(if [ -n "$attrs" ]; then echo "$attrs" | wc -l; else echo 0; fi) + + case "$len" in + 0) + eprintln "$cmd: command not found" + ;; + 1) + # If only one package provides this, then we can invoke it + # without asking the user. + + # These will not return 127 if they worked correctly. + + >&2 cat <&2 cat <&2 cat <&2 + fi +} + +function_exists() { + # Zsh returns 0 even on non existing functions with -F so use -f + declare -f "$1" >/dev/null + return $? +} + +# +# The idea below is to copy any existing handlers to another function +# name and insert the message in front of the old handler in the +# new handler. By default, neither bash or zsh has has a handler function +# defined, so the default behaviour is replicated. +# +# Also, ensure the handler is only copied once. If we do not ensure this +# the handler would add itself recursively if this file happens to be +# sourced multiple times in the same shell, resulting in a neverending +# stream of messages. +# + +# +# Zsh +# +if function_exists command_not_found_handler; then + if ! function_exists orig_command_not_found_handler; then + eval "orig_$(declare -f command_not_found_handler)" + fi +else + orig_command_not_found_handler() { + printf "zsh: command not found: %s\n" "$1" >&2 + return 127 + } +fi + +command_not_found_handler() { + print_message + orig_command_not_found_handler "$@" +} + +# +# Bash +# +if function_exists command_not_found_handle; then + if ! function_exists orig_command_not_found_handle; then + eval "orig_$(declare -f command_not_found_handle)" + fi +else + orig_command_not_found_handle() { + printf "%s: %s: command not found\n" "$0" "$1" >&2 + return 127 + } +fi + +command_not_found_handle() { + print_message + orig_command_not_found_handle "$@" +} diff --git a/modules/home.legacy/conf/zsh/config/custom_cursor.zsh b/modules/home.legacy/conf/zsh/config/custom_cursor.zsh new file mode 100644 index 00000000..37390c1c --- /dev/null +++ b/modules/home.legacy/conf/zsh/config/custom_cursor.zsh @@ -0,0 +1,42 @@ +#!/usr/bin/env zsh + +# Change cursor shape for different vi modes. +function zle-keymap-select { + if [[ ${KEYMAP} == vicmd ]] || + [[ $1 = 'block' ]]; then + echo -ne '\e[1 q' + elif [[ ${KEYMAP} == main ]] || + [[ ${KEYMAP} == viins ]] || + [[ ${KEYMAP} = '' ]] || + [[ $1 = 'beam' ]]; then + echo -ne '\e[5 q' + fi +} +zle -N zle-keymap-select + +# ci", ci', ci`, di", etc +autoload -U select-quoted +zle -N select-quoted +for m in visual viopp; do + for c in {a,i}{\',\",\`}; do + bindkey -M "$m" "$c" select-quoted + done +done + +# ci{, ci(, ci<, di{, etc +autoload -U select-bracketed +zle -N select-bracketed +for m in visual viopp; do + for c in {a,i}${(s..)^:-'()[]{}<>bB'}; do + bindkey -M $m $c select-bracketed + done +done + +zle-line-init() { + zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere) + echo -ne "\e[5 q" +} +zle -N zle-line-init + +echo -ne '\e[5 q' # Use beam shape cursor on startup. +precmd() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt. diff --git a/modules/home.legacy/conf/zsh/config/zsh-init.zsh b/modules/home.legacy/conf/zsh/config/zsh-init.zsh new file mode 100644 index 00000000..cd8d34a9 --- /dev/null +++ b/modules/home.legacy/conf/zsh/config/zsh-init.zsh @@ -0,0 +1,42 @@ +#!/usr/bin/env zsh +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +# Flex on the ubuntu users +#[ "$NVIM" ] || hyfetch +[ "$NVIM" ] || task next +#loginctl show-session $XDG_SESSION_ID + +## Enable colors and change prompt: +#autoload -Uz colors && colors +#autoload -Uz compinit && compinit -u +## Edit line in vim buffer ctrl-v +autoload -Uz edit-command-line +zle -N edit-command-line +## Enter vim buffer from normal mode +#autoload -Uz edit-command-line && zle -N edit-command-line +bindkey "^V" edit-command-line + +## zstyles +#zstyle ':completion:*' menu select +## Auto complete with case insensitivity +#zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' + +#zmodload zsh/complist +#fpath+=/home/dt/.config/zsh/comp +#compinit +#_comp_options+=(globdots) # Include hidden files. +# +## Source configs +#source "${ZDOTDIR}/ali.sh" +#source "${ZDOTDIR}/prompt.sh" +#source "${ZDOTDIR}/hotkeys.sh" +#source "./${path_custom_cursor}" +#source ~/.local/lib/shell/lib +# +## Load zsh-syntax-highlighting +#source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh +## Suggest aliases for commands +#source /usr/share/zsh/plugins/zsh-you-should-use/you-should-use.plugin.zsh +# +##eval "$(lua ~/scripts/z.lua --init zsh enhanced)" diff --git a/modules/home.legacy/conf/zsh/default.nix b/modules/home.legacy/conf/zsh/default.nix new file mode 100644 index 00000000..f5c65081 --- /dev/null +++ b/modules/home.legacy/conf/zsh/default.nix @@ -0,0 +1,103 @@ +{ + config, + pkgs, + lib, + shell_library, + system, + ... +}: { + # TODO: ADD THIS ADDON + # next one only works if your alias is only a command, e.g. if you `alias='cat some_file.txt &2> /dev/null'`, running `cat some_file.txt` won't trigger it. + # TODO: find something better for this use case + # zsh-you-should-use # ZSH plugin that reminds you to use existing aliases for commands you just typed + home.sessionPath = []; + programs.zsh = { + enable = true; + autosuggestion.enable = true; + enableCompletion = true; + syntaxHighlighting.enable = true; + + autocd = true; + + dotDir = ".config/zsh"; + + history = { + extended = true; + ignoreDups = false; + expireDuplicatesFirst = false; + ignoreSpace = false; # TODO: I might change that + + path = "${config.xdg.dataHome}/zsh/history"; + save = 9000000; # number of lines to save + size = 9000000; # number of lines to keep + share = false; # share between sessions + }; + historySubstringSearch = { + enable = true; + searchDownKey = "^[[B"; # DOWN Arrow key + searchUpKey = "^[[A"; # UP Arrow key + }; + + loginExtra = + "" + + lib.concatStringsSep "\nsetopt " [ + "setopt AUTO_CD" # This is needed as first item + "AUTO_PUSHD" + "CHASE_DOTS" + + "ALWAYS_TO_END" + + "EXTENDED_HISTORY" + "HIST_ALLOW_CLOBBER" + "HIST_VERIFY" + "HIST_FCNTL_LOCK" + "APPEND_HISTORY" + + "DVORAK" + "CORRECT" + + "PROMPT_SUBST" + "TRANSIENT_RPROMPT" # maybe? + + "COMBINING_CHARS" + "VI" + ]; + + initExtraFirst = + builtins.readFile ./config/zsh-init.zsh + + '' + SHELL_LIBRARY_VERSION="2.1.2" source ${shell_library.rawLib.${system}} + # This next line buffers the first line of the following item: + + '' + # NOTE: This must be before the insult, as we otherwise override the previous handler <2024-02-28> + + builtins.readFile ./config/command_not_found.sh + + builtins.readFile ./config/command_not_found_insult.sh + + builtins.readFile ./config/custom_cursor.zsh + + builtins.readFile "${pkgs.fzf}/share/fzf/key-bindings.zsh"; + + shellAliases = { + ll = ". ll"; + lm = ". lm"; + + hisea = "history 0 | grep"; + }; + sessionVariables = { + IVIEWER = "imv"; + READER = "zathura"; + + LIBVIRT_DEFAULT_URI = "qemu:///system"; + + BEMENU_SCALE = "1.5"; + BEMENU_BACKEND = "wayland"; + BEMENU_OPTS = "--fn 'Source Code Pro 10' -c -l 30 -B 1 -W 0.9 --hf #ffffff"; + + # Export Wayland env Vars {{{ + QT_QPA_PLATFORM = "wayland"; + QT_QPA_PLATFORMTHEME = "qt5ct"; # needs qt5ct + CLUTTER_BACKEND = "wayland"; + SDL_VIDEODRIVER = "wayland"; # might brake some things + # }}} + }; + }; +} diff --git a/modules/home.legacy/default.nix b/modules/home.legacy/default.nix new file mode 100644 index 00000000..574ed66a --- /dev/null +++ b/modules/home.legacy/default.nix @@ -0,0 +1,60 @@ +{ + impermanence, + nixVim, + nix-index-database, + ... +}: let + username = "soispha"; + homeDirectory = "/home/${username}"; + + # xdg + configHome = "${homeDirectory}/.config"; + dataHome = "${homeDirectory}/.local/share"; + stateHome = "${homeDirectory}/.local/state"; + cacheHome = "${homeDirectory}/.cache"; + binHome = "${homeDirectory}/.local/bin"; + # TODO: add XDG_RUNTIME_DIR +in { + imports = [ + ./conf + ./files + ./impermanence + ./pkgs + ./wms + + impermanence.nixosModules.home-manager.impermanence + nixVim.homeManagerModules.nixvim + nix-index-database.hmModules.nix-index + ]; + + # I don't know what this does, but I've seen it a lot online, so it should be good, right? + programs.home-manager.enable = true; + + home = { + inherit username homeDirectory; + stateVersion = "23.05"; + enableNixpkgsReleaseCheck = true; + }; + xdg = { + enable = true; + inherit configHome dataHome stateHome cacheHome; #binHome; # TODO: add binHome, when the standard is extended + + /* + TODO: add this + desktopEntries = {}; + */ + + userDirs = { + enable = true; + createDirectories = true; + desktop = null; + documents = "${homeDirectory}/school/general"; + download = "${homeDirectory}/media/downloads"; + music = "${homeDirectory}/media/music"; + pictures = "${homeDirectory}/media/pictures"; + videos = "${homeDirectory}/media/videos"; + templates = "${homeDirectory}/media/templates"; + publicShare = "${homeDirectory}/media/public"; + }; + }; +} diff --git a/modules/home.legacy/files/default.nix b/modules/home.legacy/files/default.nix new file mode 100644 index 00000000..16fe9afe --- /dev/null +++ b/modules/home.legacy/files/default.nix @@ -0,0 +1,6 @@ +{...}: { + imports = [ + ./wallpaper + ./manifest_json + ]; +} diff --git a/modules/home.legacy/files/manifest_json/default.nix b/modules/home.legacy/files/manifest_json/default.nix new file mode 100644 index 00000000..af8d85d2 --- /dev/null +++ b/modules/home.legacy/files/manifest_json/default.nix @@ -0,0 +1,16 @@ +{ + config, + lib, + ... +}: { + home = { + activation = { + addManifestJson = + lib.hm.dag.entryAfter ["writeBoundary"] + '' + [ -L "${config.xdg.stateHome}/nix/profiles/profile" ] && $DRY_RUN_CMD rm $VERBOSE_ARG "${config.xdg.stateHome}/nix/profiles/profile" + $DRY_RUN_CMD ln -s $DRY_RUN_CMD "${./profile}" "${config.xdg.stateHome}/nix/profiles/profile" + ''; + }; + }; +} diff --git a/modules/home.legacy/files/manifest_json/profile/manifest.json b/modules/home.legacy/files/manifest_json/profile/manifest.json new file mode 100644 index 00000000..bd74d935 --- /dev/null +++ b/modules/home.legacy/files/manifest_json/profile/manifest.json @@ -0,0 +1,4 @@ +{ + "elements": [], + "version": 2 +} diff --git a/modules/home.legacy/files/wallpaper/abstract-nord.png b/modules/home.legacy/files/wallpaper/abstract-nord.png new file mode 100644 index 00000000..5ef498bf Binary files /dev/null and b/modules/home.legacy/files/wallpaper/abstract-nord.png differ diff --git a/modules/home.legacy/files/wallpaper/default.nix b/modules/home.legacy/files/wallpaper/default.nix new file mode 100644 index 00000000..119df225 --- /dev/null +++ b/modules/home.legacy/files/wallpaper/default.nix @@ -0,0 +1,14 @@ +{config, ...}: { + home = { + sessionVariables = { + WALLPAPER = "${config.home.homeDirectory}/media/pictures/wallpaper"; + }; + + file = { + wallpaper = { + source = ./abstract-nord.png; + target = "media/pictures/wallpaper"; + }; + }; + }; +} diff --git a/modules/home.legacy/impermanence/default.nix b/modules/home.legacy/impermanence/default.nix new file mode 100644 index 00000000..dcb60f3b --- /dev/null +++ b/modules/home.legacy/impermanence/default.nix @@ -0,0 +1,29 @@ +{ + lib, + nixosConfig, + ... +}: { + config = lib.mkIf nixosConfig.soispha.impermanence.enable { + home.persistence."/srv/home/soispha" = { + allowOther = true; + directories = [ + ".local/share" + + ".local/state/nvim" + ".local/state/mpv" + ".local/state/wireplumber" + + ".config/Signal" + ".config/Element" + ".config/iamb/profiles" + + ".cache" + ".mozilla" + + "media" + "repos" + "school" + ]; + }; + }; +} diff --git a/modules/home.legacy/pkgs/default.nix b/modules/home.legacy/pkgs/default.nix new file mode 100644 index 00000000..ad77c5fb --- /dev/null +++ b/modules/home.legacy/pkgs/default.nix @@ -0,0 +1,240 @@ +{ + pkgs, + lib, + config, + nixosConfig, + ... +}: +with pkgs; let + onlyShare = drv: + runCommand "${drv.name}-only-share" {} '' + mkdir -p $out + ln -s ${drv}/share $out/share + ''; + mpc-cli-man = onlyShare mpc-cli; + + Gui = { + Terminals = [ + # foot # wayland native terminal + alacritty # default terminal + ]; + Browsers = [ + #ungoogled-chromium # web browser (only for web programming) + #brave + ]; + + ImageManipulation = [ + #krita # new, and better (KDE) + #gimp # conservative, and old (GNOME) + ]; + + Social = [ + mumble # voice chat software (client) + # lutris # multiple game store clients + + # nheko # best matrix client (as of today) + # element-desktop # nheko didn't work + signal-desktop # to avoid encryption problems with signal-bridge + ]; + + Misc = [ + #kalzium # Periodic Table of Elements (`element` is [sort of] better) + keepassxc # password manager + #onlykey # OnlyKey Chrome Desktop App + anki-bin # spaced repetition + ]; + }; + + TuiCli = { + EyeCandy = [ + #banner # Print large banners to ASCII terminals + cmatrix # A curses-based scrolling 'Matrix'-like screen + hyfetch # Neofetch with LGBTQ pride flags. + ]; + + Social = [ + iamb # best tui matrix client (as of today) + ]; + + Pdfs = [ + con2pdf # Scanner implementation + ]; + + Misc = [ + android-file-transfer # Android MTP client with minimalistic UI + #xdg-ninja # A shell script which checks your $HOME for unwanted files and directories. + xdg-utils # open urls and such things + yokadi # Command line oriented, sqlite powered, todo list + killall # kill a application by name + snap-sync-forked # A btrfs based backup solution + bc # Smart calculator + aumo # Automatic mount + nato # Encodes a string in the standardized spelling alphabet + virsh-del # Delete a libvirt virtual machine (not really used anymore). + jq # Json parser + ]; + + Task = { + StartStop = [ + hibernate # Hibernate wrapper that automatically stops all active task + lock # Same as `hibernate`, but for locking + ]; + + Firefox = [ + # `neorg` handles the integration between Firefox profiles and task + # contexts + (neorg.override + { + defaultNeorgProjectDir = config.programs.nixvim.plugins.neorg.modules."core.dirman".config.workspaces.projects; + allProjectsNewline = config.soispha.taskwarrior.projects.projects_newline; + allProjectsComma = config.soispha.taskwarrior.projects.projects_comma; + allProjectsPipe = config.soispha.taskwarrior.projects.projects_pipe; + allWorkspaces = config.programs.nixvim.plugins.neorg.modules."core.dirman".config.workspaces; + xdgConfigHome = config.xdg.configHome; + xdgDataHome = config.xdg.dataHome; + }) + ]; + }; + + WM = { + river = [river]; # A dynamic tiling wayland compositor + + CLITools = [ + lswt # List Wayland toplevels. + wl-clipboard # Command-line copy/paste utilities. + swaylock # My current lockscreen implementation. + ]; + + Media = [ + wf-recorder # Screen recorder. + libnotify # a command to send a notification. + screenshot_persistent # Creates a persisting screenshot. + screenshot_temporary # Takes a screenshot and stores it in the clipboard. + ]; + }; + + Media = { + View = [ + imv # Image viewer + zathura # PDF viewer + ]; + + YouTube = [ + yti # Wrapper around `yt-dlp`. + yt # A command line YouTube client + ]; + + Listen = [ + spodi # Wrapper around `spotdl`. + ncmpc # mpd player client + mpc-cli-man # a cli mpd client (added via a wrapper script) + mpc # Wrapper around `mpc` that allows the usage of `mpc-{rm,lyrics,searchadd}` without the `-` + # Removes the currently playing song from the disk and storage + (mpc-beetrm.override { + beets = config.programs.beets.package; + }) + # Works like normal `mpc searchadd` but uses the `beets` query syntax + (mpc-searchadd.override { + beets = config.programs.beets.package; + }) + # Displays the lyrics of the currently playing song + (mpc-lyrics.override { + mpd_music_dir = config.services.mpd.musicDirectory; + }) + sort_song # Sorts songs in the current directory. + ]; + }; + + Hardware = { + Storage = [ + #compsize # Calculate compression ratio of a set of files on Btrfs + # TODO: smartmontools # Control and monitor S.M.A.R.T. enabled ATA and SCSI Hard Drives + ]; + + Battery = [ + battery # Check the battery level + ]; + + # TODO: Also support setting the brightness with multiple backlights <2024-05-24> + Backlight = + lib.optional nixosConfig.soispha.laptop.enable + ( + # Set the brightness level + brightness.override + { + backlightName = nixosConfig.soispha.laptop.backlight; + } + ); + + Input = [ + #piper # GTK application to configure gaming mice + ]; + }; + + SystemUpdate = [ + fupdate # Generic update tool. + update-sys # System update tool (meant to slot into `fupdate`). + ]; + + FileListers = [ + tree # A directory listing program displaying a depth indented list of files + fd # Simple, fast and user-friendly alternative to find + ripgrep # A search tool that combines the usability of ag with the raw speed of grep + fzf # used to quickly move around with its keybindings + file # Show information about a file + ll # Wrapper around `lf` to automatically change the path + lm # Wrapper around `ll` to automatically cd to the last accessed path + show # Wrapper around `less` to show a file (similar to the `cat ` pattern). + ]; + + Editors = [ + ed # A POSIX-compliant line-oriented text editor + #sed # GNU stream editor + vim # The original ex/vi text editor (this is `vim` and not `vi`, as `vi` is unfree) + #neovim # Fork of Vim aiming to improve user experience, plugins, and GUIs + ]; + + Programming = { + GeneralTools = [ + stamp # Add a license header to a file + git # the fast distributed version control system + git-absorb # git commit --fixup, but automatic + git-edit-index # Allows you to edit the indexed version of a file + git-cm # A wrapper that re-adds the last commit's subject + git-cleanup # An automatic merged branch deleter + glow # Command-line markdown renderer + ]; + }; + }; + # TODO: unmaintained, find sth else: + # handlr # Powerful alternative to xdg-utils written in Rust + mapFun = x: + if builtins.isAttrs x + then + if lib.isDerivation x + then [x] + else builtins.attrValues x + else [x]; +in { + home.packages = + [] + ++ (with builtins; + concatLists + (concatLists [ + (concatMap mapFun + (concatMap mapFun + (concatMap mapFun + (concatMap mapFun + (concatMap mapFun + (concatMap mapFun + (attrValues Gui))))))) + + (concatMap mapFun + (concatMap mapFun + (concatMap mapFun + (concatMap mapFun + (concatMap mapFun + (concatMap mapFun + (attrValues TuiCli))))))) + ])); +} diff --git a/modules/home.legacy/wms/default.nix b/modules/home.legacy/wms/default.nix new file mode 100644 index 00000000..610ea2f4 --- /dev/null +++ b/modules/home.legacy/wms/default.nix @@ -0,0 +1,7 @@ +{config, ...}: { + imports = [ + # ./sway + ./river + # ./plasma + ]; +} diff --git a/modules/home.legacy/wms/plasma/default.nix b/modules/home.legacy/wms/plasma/default.nix new file mode 100644 index 00000000..f68ee272 --- /dev/null +++ b/modules/home.legacy/wms/plasma/default.nix @@ -0,0 +1,5 @@ +{config, ...}: { + services.xserver.enable = true; + services.xserver.displayManager.sddm.enable = true; + services.xserver.desktopManager.plasma5.enable = true; +} diff --git a/modules/home.legacy/wms/river/default.nix b/modules/home.legacy/wms/river/default.nix new file mode 100644 index 00000000..36a9ca74 --- /dev/null +++ b/modules/home.legacy/wms/river/default.nix @@ -0,0 +1,76 @@ +{ + pkgs, + sysLib, + river_init_lesser, + nixosConfig, + system, + ... +}: let + inherit (nixosConfig.networking) hostName; + mappings = + if hostName == "tiamat" + then '' + err_fail riverctl keyboard-layout 'us-modified' + err_fail river_init_lesser ~/.config/river/res/moonlander.ron + '' + else if hostName == "lahmu" || hostName == "apzu" || hostName == "mammun" || hostName == "isimud" + then '' + err_fail riverctl keyboard-layout 'dvorak-modified' + err_fail river_init_lesser ~/.config/river/res/keys.ron + '' + else builtins.throw "Host not covered in river mappings"; + screen_setup = + if hostName == "lahmu" + then '' + err_fail wlr-randr --output Virtual-1 --mode 1920x1080 + '' + else if hostName == "tiamat" + then '' + err_fail wlr-randr --output DP-2 --pos 2560,0 + err_fail wlr-randr --output DP-1 --scale 1.5 --pos 0,0 + err_fail gammastep & + '' + else if hostName == "apzu" || hostName == "mammun" || hostName == "isimud" + then '' + err_fail gammastep & + '' + else builtins.throw "Host not covered in river screen setup"; + env_vars = "XDG_CURRENT_DESKTOP=river DESKTOP_SESSION=river"; + init_scr = pkgs.substituteAll { + src = ./init.sh; + inherit mappings screen_setup env_vars; + }; +in { + home.sessionVariables = { + WM = "river"; + XDG_CURRENT_DESKTOP = "river"; + DESKTOP_SESSION = "river"; + }; + + xdg.configFile."river/init".source = + sysLib.writeShellScript { + name = "river_init"; + src = init_scr; + keepPath = true; + dependencies = builtins.attrValues { + river_init_lesser = river_init_lesser.packages.${system}.default; + inherit + (pkgs) + dash + river + glib # gnome lib + gammastep + wlr-randr + yambar + mako + swaybg + swayidle + swaylock + alacritty + ; + }; + } + + /bin/river_init; + + xdg.configFile."river/res".source = ./res; +} diff --git a/modules/home.legacy/wms/river/init.sh b/modules/home.legacy/wms/river/init.sh new file mode 100755 index 00000000..06a2e2f4 --- /dev/null +++ b/modules/home.legacy/wms/river/init.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +err_fail() { + if ! "$@"; then + warning "\"$*\" failed!\n" >>~/river_log + # msg "Executing the safe init!" + # exec ~/.config/river/res/safe_init.sh + fi +} +err_fail rm ~/river_log +exec 1>>"$HOME"/river_log +exec 2>>"$HOME"/river_log + +#trap err_fail ERR + +#Setup of environment variables {{{ +err_fail riverctl spawn "exec dbus-update-activation-environment --systemd SEATD_SOCK DISPLAY WAYLAND_DISPLAY DESKTOP_SESSION=river XDG_CURRENT_DESKTOP=river" +export @env_vars@ +#}}} + +# Setup of mappings {{{ +@mappings@ +# }}} + +# Setup of Rules {{{ +err_fail riverctl rule-add -app-id float -title '*' float +err_fail riverctl rule-add -app-id mpv -title '*' float +err_fail riverctl rule-add -app-id ModernGL -title '*' float +err_fail riverctl rule-add -app-id '*' -title 'Manim Slides' float +err_fail riverctl rule-add -app-id '*' -title 'floating please' float + +err_fail riverctl rule-add -app-id '*' -title '*' ssd +err_fail riverctl rule-add -app-id firefox -title '*' csd # This remove the focus border around Firefox (which is useful because the Firefox is nearly always in its own tag.) +# }}} + +# Set riverctl settings {{{ +# background +err_fail riverctl background-color 0x002b36 +err_fail riverctl border-color-focused 0x93a1a1 +err_fail riverctl border-color-unfocused 0x586e75 + +# keyboard repeat rate +err_fail riverctl set-repeat 50 300 + +# Cursor +err_fail riverctl focus-follows-cursor normal +#riverctl hide-cursor timeout 2000 +err_fail riverctl hide-cursor when-typing enabled +err_fail riverctl set-cursor-warp on-output-change +err_fail riverctl xcursor-theme Nordzy-cursors 24 + +err_fail riverctl input pointer-1133-49970-Logitech_Gaming_Mouse_G502 pointer-accel 0 +err_fail riverctl input pointer-1133-49970-Logitech_Gaming_Mouse_G502 accel-profile none + +err_fail riverctl input pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I pointer-accel 0 +err_fail riverctl input pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I accel-profile none +# }}} + +# Setup of general apps {{{ +@screen_setup@ + +err_fail yambar & + +err_fail mako & +err_fail swaybg -i "$WALLPAPER" & +err_fail swayidle & +err_fail alacritty & +# }}} + +# Setup of layout [acts as exec!] {{{ +err_fail riverctl default-layout rivertile +@env_vars@ rivertile -main-ratio 0.5 -view-padding 1 -outer-padding 0 + +#riverctl default-layout luatile +#river-luatile +# }}} +# vim: ft=sh diff --git a/modules/home.legacy/wms/river/res/keys.ron b/modules/home.legacy/wms/river/res/keys.ron new file mode 100644 index 00000000..a2bc0fa1 --- /dev/null +++ b/modules/home.legacy/wms/river/res/keys.ron @@ -0,0 +1,58 @@ +#![enable(implicit_some)] +RiverctlCommandArray( + commands: [ + // Focus change + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "T", mods: "Super", command: "focus-view", command_args: "next",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "N", mods: "Super", command: "focus-view", command_args: "previous",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "T", mods: "Super+Control", command: "focus-output", command_args: "next",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "N", mods: "Super+Control", command: "focus-output", command_args: "previous",), + + // Standard program + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Return", mods: "Super", command: "spawn", command_args: "alacritty",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "q", mods: "Super+Shift", command: "exit", command_args: None,), + + // Screenshot + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Print", mods: "None", command: "spawn", command_args: "screenshot_persistent",), + + // Audio + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "XF86AudioRaiseVolume", mods: "None", command: "spawn", command_args: "pactl set-sink-volume 1 +5%",), + RiverctlCommand( map_mode: Map, mode: ["normal", "locked"], key: "XF86AudioLowerVolume", mods: "None", command: "spawn", command_args: "pactl set-sink-volume 1 -5%",), + RiverctlCommand( map_mode: Map, mode: ["normal", "locked"], key: "XF86AudioMute", mods: "None", command: "spawn", command_args: "mpc toggle",), + + // Launcher + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "R", mods: "Super", command: "spawn", command_args: "rofi -show combi -modes combi -combi-modes 'window,drun,run' -show-icons",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F1", mods: "Super", command: "spawn", command_args: "neorg dmenu",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F2", mods: "Super", command: "spawn", command_args: "keepassxc",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F3", mods: "Super", command: "spawn", command_args: "signal-desktop",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F4", mods: "Super", command: "spawn", command_args: "steam",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "L", mods: "Super", command: "spawn", command_args: "lock",), + + // Client + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "f", mods: "Super", command: "toggle-fullscreen", command_args: None,), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "c", mods: "Super+Shift", command: "close", command_args: None,), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "space", mods: "Super+Control", command: "toggle-float", command_args: None,), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Return", mods: "Super+Control", command: "zoom", command_args: None,), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "o", mods: "Super", command: "send-to-output", command_args: "next",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "T", mods: "Super+Shift", command: "swap", command_args: "next",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "N", mods: "Super+Shift", command: "swap", command_args: "previous",), + + // Toggle all tags + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "0", mods: "Super", command: "set-focused-tags", command_args: "4294967295"), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "0", mods: "Super+Shift", command: "set-view-tags", command_args: "4294967295"), + + // Mouse + RiverctlCommand( map_mode: MapMouse, mode: ["normal"], key: "BTN_LEFT", mods: "Super", command: "move-view", command_args: None,), + RiverctlCommand( map_mode: MapMouse, mode: ["normal"], key: "BTN_RIGHT", mods: "Super", command: "resize-view", command_args: None,), + + ], + // Set these mappings for the tags 0-8 with key [1-9] + tags_number: 9, + tag_commands: [ + RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super", command: "set-focused-tags",), + RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift", command: "set-view-tags",), + RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Control", command: "toggle-focused-tags",), + RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift+Control", command: "toggle-view-tags",), + ], +) + +// vim: nolinebreak nowrap textwidth=0 diff --git a/modules/home.legacy/wms/river/res/moonlander.ron b/modules/home.legacy/wms/river/res/moonlander.ron new file mode 100644 index 00000000..77ffa5c4 --- /dev/null +++ b/modules/home.legacy/wms/river/res/moonlander.ron @@ -0,0 +1,64 @@ +#![enable(implicit_some)] +RiverctlCommandArray( + // TODO: add toggle-focus mapping + commands: [ + // Movement + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "A", mods: "Alt+Control+Super+Shift", command: "exit", command_args: None,), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "B", mods: "Alt+Control+Super+Shift", command: "close", command_args: None,), + + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "C", mods: "Alt+Control+Super+Shift", command: "focus-view", command_args: "previous",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "D", mods: "Alt+Control+Super+Shift", command: "focus-view", command_args: "next",), + + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "E", mods: "Alt+Control+Super+Shift", command: "swap", command_args: "previous",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F", mods: "Alt+Control+Super+Shift", command: "swap", command_args: "next",), + + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "G", mods: "Alt+Control+Super+Shift", command: "zoom", command_args: None,), + + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "H", mods: "Alt+Control+Super+Shift", command: "toggle-fullscreen", command_args: None,), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "I", mods: "Alt+Control+Super+Shift", command: "toggle-float", command_args: None,), + + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "J", mods: "Alt+Control+Super+Shift", command: "send-to-output", command_args: "next",), + + + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "K", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "alacritty",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "L", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "screenshot_persistent",), + + // Audio + // RiverctlCommand( map_mode: Map, mode: ["normal", "locked"], key: "M", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "video-pause toggle",), + RiverctlCommand( map_mode: Map, mode: ["normal", "locked"], key: "N", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "mpc toggle",), + + // Launcher + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "O", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "rofi -show combi -modes combi -combi-modes 'window,drun,run' -show-icons",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "P", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "neorg dmenu",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Q", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "keepassxc",), + // RiverctlCommand( map_mode: Map, mode: ["normal"], key: "R", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "nheko",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "S", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "signal-desktop",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "T", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "lock",), + + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "U", mods: "Alt+Control+Super+Shift", command: "focus-output", command_args: "next",), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "V", mods: "Alt+Control+Super+Shift", command: "focus-previous-tags", command_args: None,), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "W", mods: "Alt+Control+Super+Shift", command: "send-to-previous-tags",command_args: None,), + //RiverctlCommand( map_mode: Map, mode: ["normal"], key: "X", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "bemenu-run",), + //RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Y", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "bemenu-run",), + //RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Z", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "bemenu-run",), + + + // Toggle all tags + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "0", mods: "Alt+Control+Super+Shift", command: "set-focused-tags", command_args: "4294967295"), + RiverctlCommand( map_mode: Map, mode: ["normal"], key: "0", mods: "Alt+Control+Shift", command: "set-view-tags", command_args: "4294967295"), + + // Mouse + RiverctlCommand( map_mode: MapMouse, mode: ["normal"], key: "BTN_LEFT", mods: "Super", command: "move-view", command_args: None,), + RiverctlCommand( map_mode: MapMouse, mode: ["normal"], key: "BTN_RIGHT", mods: "Super", command: "resize-view", command_args: None,), + ], + + // Set these mappings for the tags 0-8 with key [1-9] + tags_number: 9, + tag_commands: [ + RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Alt+Control+Super+Shift", command: "set-focused-tags",), + RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Alt+Control+Shift", command: "set-view-tags",), + // TODO: RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Control", command: "toggle-focused-tags",), + // TODO: RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift+Control", command: "toggle-view-tags",), + ], +) +// vim: nolinebreak nowrap textwidth=0 diff --git a/modules/home.legacy/wms/sway/default.nix b/modules/home.legacy/wms/sway/default.nix new file mode 100644 index 00000000..bb3ddb49 --- /dev/null +++ b/modules/home.legacy/wms/sway/default.nix @@ -0,0 +1,16 @@ +# also requires: +# security.polkit.enable = true; +{lib, ...}: { + wayland.windowManager.sway = { + enable = true; + config = { + modifier = "Mod4"; + # Use kitty as default terminal + terminal = "kitty"; + startup = [ + # Launch Firefox on start + {command = "firefox";} + ]; + }; + }; +} diff --git a/modules/home/conf/alacritty/default.nix b/modules/home/conf/alacritty/default.nix deleted file mode 100644 index c1cf5e44..00000000 --- a/modules/home/conf/alacritty/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -{lib, ...}: let - config_file = '' - ${lib.strings.fileContents ./toml/base.toml} - ${lib.strings.fileContents ./toml/bell.toml} - ${lib.strings.fileContents ./toml/colorscheme.toml} - ${lib.strings.fileContents ./toml/cursor.toml} - ${lib.strings.fileContents ./toml/env.toml} - ${lib.strings.fileContents ./toml/font.toml} - ${lib.strings.fileContents ./toml/hints.toml} - ${lib.strings.fileContents ./toml/keyboard_bindings.toml} - ${lib.strings.fileContents ./toml/mouse.toml} - ${lib.strings.fileContents ./toml/mouse_bindings.toml} - ${lib.strings.fileContents ./toml/scrolling.toml} - ${lib.strings.fileContents ./toml/selection.toml} - ${lib.strings.fileContents ./toml/window.toml} - ''; -in { - home.sessionVariables = { - # This is **not** the TERM variable but a special one to signify my favorite terminal. - TERMINAL = "alacritty"; - - # These two here should be set by alacritty at start-up - # TERM = "alacritty"; - # COLORTERM = "truecolor"; - }; - programs.alacritty = { - enable = true; - }; - xdg.configFile."alacritty/alacritty.toml".text = config_file; -} diff --git a/modules/home/conf/alacritty/toml/base.toml b/modules/home/conf/alacritty/toml/base.toml deleted file mode 100644 index 93c9942f..00000000 --- a/modules/home/conf/alacritty/toml/base.toml +++ /dev/null @@ -1,16 +0,0 @@ -# Configuration for Alacritty, the GPU enhanced terminal emulator. - -# If `true`, bold text is drawn using the bright color variants. -#draw_bold_text_with_bright_colors: true # TODO: - -# Live config reload (changes require restart) -live_config_reload = true - -# Startup directory -# -# Directory the shell is started in. If this is unset, or `None`, the working -# directory of the parent process will be used. -#working_directory: None - -# Offer IPC using `alacritty msg` (unix only) -ipc_socket = true diff --git a/modules/home/conf/alacritty/toml/bell.toml b/modules/home/conf/alacritty/toml/bell.toml deleted file mode 100644 index 912d08e3..00000000 --- a/modules/home/conf/alacritty/toml/bell.toml +++ /dev/null @@ -1,7 +0,0 @@ -# Bell -# -# The bell is rung every time the BEL control character is received. -[bell] -# Duration of the visual bell flash in milliseconds. A `duration` of `0` will -# disable the visual bell animation. -duration = 0 diff --git a/modules/home/conf/alacritty/toml/colorscheme.toml b/modules/home/conf/alacritty/toml/colorscheme.toml deleted file mode 100644 index f98a5b91..00000000 --- a/modules/home/conf/alacritty/toml/colorscheme.toml +++ /dev/null @@ -1,79 +0,0 @@ -# Nightfox Alacritty Colors -## name: carbonfox -## upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/alacritty.toml - -[colors.primary] -background = "#161616" -foreground = "#f2f4f8" -dim_foreground = "#b6b8bb" -bright_foreground = "#f9fbff" - -[colors.cursor] -text = "#f2f4f8" -cursor = "#b6b8bb" - -[colors.vi_mode_cursor] -text = "#f2f4f8" -cursor = "#33b1ff" - -[colors.search.matches] -foreground = "#f2f4f8" -background = "#525253" - -[colors.search.focused_match] -foreground = "#f2f4f8" -background = "#3ddbd9" - -[colors.footer_bar] -foreground = "#f2f4f8" -background = "#353535" - -[colors.hints.start] -foreground = "#f2f4f8" -background = "#3ddbd9" - -[colors.hints.end] -foreground = "#f2f4f8" -background = "#353535" - -[colors.selection] -text = "#f2f4f8" -background = "#2a2a2a" - -[colors.normal] -black = "#282828" -red = "#ee5396" -green = "#25be6a" -yellow = "#08bdba" -blue = "#78a9ff" -magenta = "#be95ff" -cyan = "#33b1ff" -white = "#dfdfe0" - -[colors.bright] -black = "#484848" -red = "#f16da6" -green = "#46c880" -yellow = "#2dc7c4" -blue = "#8cb6ff" -magenta = "#c8a5ff" -cyan = "#52bdff" -white = "#e4e4e5" - -[colors.dim] -black = "#222222" -red = "#ca4780" -green = "#1fa25a" -yellow = "#07a19e" -blue = "#6690d9" -magenta = "#a27fd9" -cyan = "#2b96d9" -white = "#bebebe" - -[[colors.indexed_colors]] -index = 16 -color = "#3ddbd9" - -[[colors.indexed_colors]] -index = 17 -color = "#ff7eb6" diff --git a/modules/home/conf/alacritty/toml/cursor.toml b/modules/home/conf/alacritty/toml/cursor.toml deleted file mode 100644 index d9cb93f4..00000000 --- a/modules/home/conf/alacritty/toml/cursor.toml +++ /dev/null @@ -1,11 +0,0 @@ -[cursor] -blink_interval = 750 -blink_timeout = 5 -thickness = 0.15 -unfocused_hollow = true -vi_mode_style = "None" - -# Cursor style -[cursor.style] -blinking = "On" -shape = "Beam" diff --git a/modules/home/conf/alacritty/toml/env.toml b/modules/home/conf/alacritty/toml/env.toml deleted file mode 100644 index fdd4e5d1..00000000 --- a/modules/home/conf/alacritty/toml/env.toml +++ /dev/null @@ -1,3 +0,0 @@ -[env] -TERM = "alacritty" -COLORTERM = "truecolor" diff --git a/modules/home/conf/alacritty/toml/font.toml b/modules/home/conf/alacritty/toml/font.toml deleted file mode 100644 index dd18a6fb..00000000 --- a/modules/home/conf/alacritty/toml/font.toml +++ /dev/null @@ -1,15 +0,0 @@ -[font] -builtin_box_drawing = true -size = 12.0 - -[font.glyph_offset] -x = -1 -y = -1 - -[font.normal] -family = "SauceCodePro Nerd Font Mono" -style = "Regular" - -[font.offset] -x = -1 -y = -1 diff --git a/modules/home/conf/alacritty/toml/hints.toml b/modules/home/conf/alacritty/toml/hints.toml deleted file mode 100644 index 31d91a37..00000000 --- a/modules/home/conf/alacritty/toml/hints.toml +++ /dev/null @@ -1,25 +0,0 @@ -[hints] -alphabet = "jfkdls;ahgurieowpq" - -[[hints.enabled]] -command = "xdg-open" # On Linux/BSD -hyperlinks = true -post_processing = true -persist = false -mouse.enabled = true -binding = { key = "U", mods = "Control|Shift" } -regex = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file:|git://|ssh:|ftp://)[^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+" - - -[[hints.enabled]] -action = "Paste" -post_processing = false -binding = { key = "T", mods = "Control|Shift" } -regex = '''([^ '"`=:\[\(]*/)([^/: '"`\)\]]*)''' - - -[[hints.enabled]] -action = "Paste" -post_processing = false -binding = { key = "H", mods = "Control|Shift" } -regex = '([a-z0-9]{7,40})\s' diff --git a/modules/home/conf/alacritty/toml/keyboard_bindings.toml b/modules/home/conf/alacritty/toml/keyboard_bindings.toml deleted file mode 100644 index 8e0b1e13..00000000 --- a/modules/home/conf/alacritty/toml/keyboard_bindings.toml +++ /dev/null @@ -1,297 +0,0 @@ -[[keyboard.bindings]] -action = "Paste" -key = "P" -mods = "Control" - -[[keyboard.bindings]] -action = "Paste" -key = "Insert" -mods = "Shift" - -[[keyboard.bindings]] -chars = "gc" -key = "Slash" -mods = "Control" - -[[keyboard.bindings]] -action = "Copy" -key = "Y" -mods = "Control" - -[[keyboard.bindings]] -action = "ResetFontSize" -key = "Key0" -mods = "Control" - -[[keyboard.bindings]] -action = "IncreaseFontSize" -key = "Equals" -mods = "Control" - -[[keyboard.bindings]] -action = "IncreaseFontSize" -key = "Plus" -mods = "Control" - -[[keyboard.bindings]] -action = "DecreaseFontSize" -key = "Minus" -mods = "Control" - -[[keyboard.bindings]] -action = "ToggleViMode" -key = "Space" -mods = "Control" - -[[keyboard.bindings]] -action = "ScrollToBottom" -key = "Space" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ScrollToBottom" -key = "I" -mode = "Vi" - -[[keyboard.bindings]] -action = "ToggleViMode" -key = "I" -mode = "Vi" - -[[keyboard.bindings]] -action = "ScrollToBottom" -key = "C" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ToggleViMode" -key = "C" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ClearSelection" -key = "Escape" -mode = "Vi" - -[[keyboard.bindings]] -action = "ScrollLineUp" -key = "Y" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ScrollLineDown" -key = "E" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ScrollToTop" -key = "G" -mode = "Vi" - -[[keyboard.bindings]] -action = "ScrollToBottom" -key = "G" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "ScrollPageUp" -key = "B" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ScrollPageDown" -key = "F" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ScrollHalfPageUp" -key = "U" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ScrollHalfPageDown" -key = "D" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "Copy" -key = "Y" -mode = "Vi" - -[[keyboard.bindings]] -action = "ClearSelection" -key = "Y" -mode = "Vi" - -[[keyboard.bindings]] -action = "ToggleNormalSelection" -key = "V" -mode = "Vi" - -[[keyboard.bindings]] -action = "ToggleLineSelection" -key = "V" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "ToggleBlockSelection" -key = "V" -mode = "Vi" -mods = "Control" - -[[keyboard.bindings]] -action = "ToggleSemanticSelection" -key = "V" -mode = "Vi" -mods = "Alt" - -[[keyboard.bindings]] -action = "Open" -key = "Return" -mode = "Vi" - -[[keyboard.bindings]] -action = "Up" -key = "K" -mode = "Vi" - -[[keyboard.bindings]] -action = "Down" -key = "J" -mode = "Vi" - -[[keyboard.bindings]] -action = "Left" -key = "H" -mode = "Vi" - -[[keyboard.bindings]] -action = "Right" -key = "L" -mode = "Vi" - -[[keyboard.bindings]] -action = "Up" -key = "Up" -mode = "Vi" - -[[keyboard.bindings]] -action = "Down" -key = "Down" -mode = "Vi" - -[[keyboard.bindings]] -action = "Left" -key = "Left" -mode = "Vi" - -[[keyboard.bindings]] -action = "Right" -key = "Right" -mode = "Vi" - -[[keyboard.bindings]] -action = "First" -key = "Key0" -mode = "Vi" - -[[keyboard.bindings]] -action = "Last" -key = "Key4" -mode = "Vi" - -[[keyboard.bindings]] -action = "FirstOccupied" -key = "Key6" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "High" -key = "H" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "Middle" -key = "M" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "Low" -key = "L" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "SemanticLeft" -key = "B" -mode = "Vi" - -[[keyboard.bindings]] -action = "SemanticRight" -key = "W" -mode = "Vi" - -[[keyboard.bindings]] -action = "SemanticRightEnd" -key = "E" -mode = "Vi" - -[[keyboard.bindings]] -action = "WordLeft" -key = "B" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "WordRight" -key = "W" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "WordRightEnd" -key = "E" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "Bracket" -key = "Key5" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "SearchForward" -key = "Slash" -mode = "Vi" - -[[keyboard.bindings]] -action = "SearchBackward" -key = "Slash" -mode = "Vi" -mods = "Shift" - -[[keyboard.bindings]] -action = "SearchNext" -key = "N" -mode = "Vi" - -[[keyboard.bindings]] -action = "SearchPrevious" -key = "N" -mode = "Vi" -mods = "Shift" diff --git a/modules/home/conf/alacritty/toml/mouse.toml b/modules/home/conf/alacritty/toml/mouse.toml deleted file mode 100644 index eba68edf..00000000 --- a/modules/home/conf/alacritty/toml/mouse.toml +++ /dev/null @@ -1,2 +0,0 @@ -[mouse] -hide_when_typing = false diff --git a/modules/home/conf/alacritty/toml/mouse_bindings.toml b/modules/home/conf/alacritty/toml/mouse_bindings.toml deleted file mode 100644 index 1b281748..00000000 --- a/modules/home/conf/alacritty/toml/mouse_bindings.toml +++ /dev/null @@ -1,3 +0,0 @@ -[[mouse.bindings]] -action = "Copy" -mouse = "Middle" diff --git a/modules/home/conf/alacritty/toml/scrolling.toml b/modules/home/conf/alacritty/toml/scrolling.toml deleted file mode 100644 index ed7c22cf..00000000 --- a/modules/home/conf/alacritty/toml/scrolling.toml +++ /dev/null @@ -1,3 +0,0 @@ -[scrolling] -history = 10000 -multiplier = 3 diff --git a/modules/home/conf/alacritty/toml/selection.toml b/modules/home/conf/alacritty/toml/selection.toml deleted file mode 100644 index 60ea0495..00000000 --- a/modules/home/conf/alacritty/toml/selection.toml +++ /dev/null @@ -1,3 +0,0 @@ -[selection] -save_to_clipboard = false -semantic_escape_chars = ",│`|:\"' ()[]{}<>\t" diff --git a/modules/home/conf/alacritty/toml/window.toml b/modules/home/conf/alacritty/toml/window.toml deleted file mode 100644 index 123b5b7a..00000000 --- a/modules/home/conf/alacritty/toml/window.toml +++ /dev/null @@ -1,18 +0,0 @@ -[window] -decorations = "none" -decorations_theme_variant = "None" -dynamic_title = true -opacity = 0.9 -startup_mode = "Windowed" -title = "Alacritty" -[window.class] -general = "Alacritty" -instance = "Alacritty" - -[window.dimensions] -columns = 0 -lines = 0 - -[window.padding] -x = 5 -y = 5 diff --git a/modules/home/conf/alacritty/yaml/base.yml b/modules/home/conf/alacritty/yaml/base.yml deleted file mode 100644 index 0791a60f..00000000 --- a/modules/home/conf/alacritty/yaml/base.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -# Configuration for Alacritty, the GPU enhanced terminal emulator. - -# If `true`, bold text is drawn using the bright color variants. -#draw_bold_text_with_bright_colors: true # TODO: - -# Live config reload (changes require restart) -live_config_reload: true - -# Startup directory -# -# Directory the shell is started in. If this is unset, or `None`, the working -# directory of the parent process will be used. -#working_directory: None - -# Offer IPC using `alacritty msg` (unix only) -ipc_socket: true diff --git a/modules/home/conf/alacritty/yaml/bell.yml b/modules/home/conf/alacritty/yaml/bell.yml deleted file mode 100644 index bd071aeb..00000000 --- a/modules/home/conf/alacritty/yaml/bell.yml +++ /dev/null @@ -1,42 +0,0 @@ -# Bell -# -# The bell is rung every time the BEL control character is received. -bell: - # Visual Bell Animation - # - # Animation effect for flashing the screen when the visual bell is rung. - # - # Values for `animation`: - # - Ease - # - EaseOut - # - EaseOutSine - # - EaseOutQuad - # - EaseOutCubic - # - EaseOutQuart - # - EaseOutQuint - # - EaseOutExpo - # - EaseOutCirc - # - Linear - #animation: EaseOutExpo - - # Duration of the visual bell flash in milliseconds. A `duration` of `0` will - # disable the visual bell animation. - duration: 0 - - # Visual bell animation color. - #color: '#ffffff' - - # Bell Command - # - # This program is executed whenever the bell is rung. - # - # When set to `command: None`, no command will be executed. - # - # Example: - # command: - # program: notify-send - # args: ["Hello, World!"] - # - # command: - # program: notify-send - # args: ["The bell in alacritty was rung!"] diff --git a/modules/home/conf/alacritty/yaml/colors.yml b/modules/home/conf/alacritty/yaml/colors.yml deleted file mode 100644 index 899c660a..00000000 --- a/modules/home/conf/alacritty/yaml/colors.yml +++ /dev/null @@ -1,147 +0,0 @@ -# Colors (Tomorrow Night) -colors: - # Default colors - primary: - background: '#191919' - foreground: '#d8dee9' - - # Bright and dim foreground colors - # - # The dimmed foreground color is calculated automatically if it is not - # present. If the bright foreground color is not set, or - # `draw_bold_text_with_bright_colors` is `false`, the normal foreground - # color will be used. - #dim_foreground: '#828482' - #bright_foreground: '#eaeaea' - - # Cursor colors - # - # Colors which should be used to draw the terminal cursor. - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - cursor: - text: '#191919' - cursor: '#d8dee9' - - # Vi mode cursor colors - # - # Colors for the cursor when the vi mode is active. - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - vi_mode_cursor: - text: CellBackground - cursor: CellForeground - - # Search colors - # - # Colors used for the search bar and match highlighting. - search: - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - matches: - foreground: '#000000' - background: '#ffffff' - focused_match: - foreground: '#ffffff' - background: '#000000' - - # Keyboard hints - hints: - # First character in the hint label - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - start: - foreground: '#1d1f21' - background: '#e9ff5e' - - # All characters after the first one in the hint label - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - end: - foreground: '#e9ff5e' - background: '#1d1f21' - - # Line indicator - # - # Color used for the indicator displaying the position in history during - # search and vi mode. - # - # By default, these will use the opposing primary color. - #line_indicator: - # foreground: None - # background: None - - # Footer bar - # - # Color used for the footer bar on the bottom, used by search regex input, - # hyperlink URI preview, etc. - # - footer_bar: - background: '#c5c8c6' - foreground: '#1d1f21' - - # Selection colors - # - # Colors which should be used to draw the selection area. - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - selection: - text: '#191919' - background: '#d8dee9' - - # Normal colors - normal: - black: '#191919' - red: '#b02626' - green: '#40a62f' - yellow: '#f2e635' - blue: '#314ad0' - magenta: '#b30ad0' - cyan: '#32d0fc' - white: '#acadb1' - - # Bright colors - bright: - black: '#36393d' - red: '#ce2727' - green: '#47c930' - yellow: '#fff138' - blue: '#2e4bea' - magenta: '#cc15ed' - cyan: '#54d9ff' - white: '#dbdbdb' - - # Dim colors - # - # If the dim colors are not set, they will be calculated automatically based - # on the `normal` colors. - dim: - black: '#676f78' - red: '#b55454' - green: '#78a670' - yellow: '#faf380' - blue: '#707fd0' - magenta: '#c583d0' - cyan: '#8adaf1' - white: '#e0e3e7' - # Indexed Colors - # - # The indexed colors include all colors from 16 to 256. - # When these are not set, they're filled with sensible defaults. - # - # Example: - # `- { index: 16, color: '#ff00ff' }` - # - #indexed_colors: [] - - # Transparent cell backgrounds - # - # Whether or not `window.opacity` applies to all cell backgrounds or only to - # the default background. When set to `true` all cells will be transparent - # regardless of their background color. - #transparent_background_colors: false # TODO: diff --git a/modules/home/conf/alacritty/yaml/colorscheme.yml b/modules/home/conf/alacritty/yaml/colorscheme.yml deleted file mode 100644 index 4e0abfae..00000000 --- a/modules/home/conf/alacritty/yaml/colorscheme.yml +++ /dev/null @@ -1,31 +0,0 @@ -# Nightfox Alacritty Colors -# Style: carbonfox -# Upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/nightfox_alacritty.yml -colors: - # Default colors - primary: - background: '0x161616' - foreground: '0xf2f4f8' - # Normal colors - normal: - black: '0x282828' - red: '0xee5396' - green: '0x25be6a' - yellow: '0x08bdba' - blue: '0x78a9ff' - magenta: '0xbe95ff' - cyan: '0x33b1ff' - white: '0xdfdfe0' - # Bright colors - bright: - black: '0x484848' - red: '0xf16da6' - green: '0x46c880' - yellow: '0x2dc7c4' - blue: '0x8cb6ff' - magenta: '0xc8a5ff' - cyan: '0x52bdff' - white: '0xe4e4e5' - indexed_colors: - - { index: 16, color: '0x3ddbd9' } - - { index: 17, color: '0xff7eb6' } diff --git a/modules/home/conf/alacritty/yaml/cursor.yml b/modules/home/conf/alacritty/yaml/cursor.yml deleted file mode 100644 index ef700ebc..00000000 --- a/modules/home/conf/alacritty/yaml/cursor.yml +++ /dev/null @@ -1,43 +0,0 @@ -cursor: - # Cursor style - style: - # Cursor shape - # - # Values for `shape`: - # - ▇ Block - # - _ Underline - # - | Beam - shape: Beam - - # Cursor blinking state - # - # Values for `blinking`: - # - Never: Prevent the cursor from ever blinking - # - Off: Disable blinking by default - # - On: Enable blinking by default - # - Always: Force the cursor to always blink - blinking: On - - # Vi mode cursor style - # - # If the vi mode cursor style is `None` or not specified, it will fall back to - # the style of the active value of the normal cursor. - # - # See `cursor.style` for available options. - vi_mode_style: None - - # Cursor blinking interval in milliseconds. - blink_interval: 750 - - # Time after which cursor stops blinking, in seconds. - # - # Specifying '0' will disable timeout for blinking. - blink_timeout: 5 - - # If this is `true`, the cursor will be rendered as a hollow box when the - # window is not focused. - unfocused_hollow: true - - # Thickness of the cursor relative to the cell width as floating point number - # from `0.0` to `1.0`. - thickness: 0.15 diff --git a/modules/home/conf/alacritty/yaml/debug.yml b/modules/home/conf/alacritty/yaml/debug.yml deleted file mode 100644 index 2c391da2..00000000 --- a/modules/home/conf/alacritty/yaml/debug.yml +++ /dev/null @@ -1,29 +0,0 @@ -#debug: - # Display the time it takes to redraw each frame. - #render_timer: false - - # Keep the log file after quitting Alacritty. - #persistent_logging: false - - # Log level - # - # Values for `log_level`: - # - Off - # - Error - # - Warn - # - Info - # - Debug - # - Trace - #log_level: Warn - - # Renderer override. - # - glsl3 - # - gles2 - # - gles2_pure - #renderer: None - - # Print all received window events. - #print_events: false - - # Highlight window damage information. - #highlight_damage: false diff --git a/modules/home/conf/alacritty/yaml/env.yml b/modules/home/conf/alacritty/yaml/env.yml deleted file mode 100644 index ee7528b7..00000000 --- a/modules/home/conf/alacritty/yaml/env.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Any items in the `env` entry below will be added as -# environment variables. Some entries may override variables -# set by alacritty itself. -env: - # TERM variable - # - # This value is used to set the `$TERM` environment variable for - # each instance of Alacritty. If it is not present, alacritty will - # check the local terminfo database and use `alacritty` if it is - # available, otherwise `xterm-256color` is used. - TERM: alacritty diff --git a/modules/home/conf/alacritty/yaml/font.yml b/modules/home/conf/alacritty/yaml/font.yml deleted file mode 100644 index a3fd3b1d..00000000 --- a/modules/home/conf/alacritty/yaml/font.yml +++ /dev/null @@ -1,73 +0,0 @@ -# Font configuration -font: - # Normal (roman) font face - normal: - # Font family - # - # Default: - # - (macOS) Menlo - # - (Linux/BSD) monospace - # - (Windows) Consolas - # family: Source Code Pro - # family: SauceCodePro Nerd Font - family: SauceCodePro Nerd Font Mono - - # The `style` can be specified to pick a specific face. - style: Regular - - # Bold font face - #bold: - # Font family - # - # If the bold family is not specified, it will fall back to the - # value specified for the normal font. - # family: Source Code Pro - - # The `style` can be specified to pick a specific face. - #style: Bold - - # Italic font face - #italic: - # Font family - # - # If the italic family is not specified, it will fall back to the - # value specified for the normal font. - # family: Source Code Pro - - # The `style` can be specified to pick a specific face. - #style: Italic - - # Bold italic font face - #bold_italic: - # Font family - # - # If the bold italic family is not specified, it will fall back to the - # value specified for the normal font. - # family: Source Code Pro - - # The `style` can be specified to pick a specific face. - #style: Bold Italic - - # Point size - size: 12.0 - - # Offset is the extra space around each character. `offset.y` can be thought - # of as modifying the line spacing, and `offset.x` as modifying the letter - # spacing. - offset: - x: -1 - y: -1 - - # Glyph offset determines the locations of the glyphs within their cells with - # the default being at the bottom. Increasing `x` moves the glyph to the - # right, increasing `y` moves the glyph upward. - glyph_offset: - x: -1 - y: -1 - - # Use built-in font for box drawing characters. - # - # If `true`, Alacritty will use a custom built-in font for box drawing - # characters (Unicode points 2500 - 259f). - # - builtin_box_drawing: true # TODO: diff --git a/modules/home/conf/alacritty/yaml/hints.yml b/modules/home/conf/alacritty/yaml/hints.yml deleted file mode 100644 index 8c35548b..00000000 --- a/modules/home/conf/alacritty/yaml/hints.yml +++ /dev/null @@ -1,77 +0,0 @@ -# Hints -# -# Terminal hints can be used to find text or hyperlink in the visible part of -# the terminal and pipe it to other applications. -hints: - # Keys used for the hint labels. - alphabet: "jfkdls;ahgurieowpq" - - # List with all available hints - # - # Each hint must have any of `regex` or `hyperlinks` field and either an - # `action` or a `command` field. The fields `mouse`, `binding` and - # `post_processing` are optional. - # - # The `hyperlinks` option will cause OSC 8 escape sequence hyperlinks to be - # highlighted. - # - # The fields `command`, `binding.key`, `binding.mods`, `binding.mode` and - # `mouse.mods` accept the same values as they do in the `key_bindings` section. - # - # The `mouse.enabled` field controls if the hint should be underlined while - # the mouse with all `mouse.mods` keys held or the vi mode cursor is above it. - # - # If the `post_processing` field is set to `true`, heuristics will be used to - # shorten the match if there are characters likely not to be part of the hint - # (e.g. a trailing `.`). This is most useful for URIs and applies only to - # `regex` matches. - # - # Values for `action`: - # - Copy - # Copy the hint's text to the clipboard. - # - Paste - # Paste the hint's text to the terminal or search. - # - Select - # Select the hint's text. - # - MoveViModeCursor - # Move the vi mode cursor to the beginning of the hint. - enabled: - - regex: "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\ - [^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+" - hyperlinks: true - command: xdg-open - post_processing: true - mouse: - enabled: true - mods: None - binding: - key: U - mods: Control|Shift - - - regex: "([^ '\"`=:\\[\\(]*/)([^/: '\"`\\)\\]]*)" - action: Paste - post_procesing: false - binding: - key: T - mods: Control|Shift - - - regex: "([a-z0-9]{7})\\s" - action: Paste - post_procesing: false - binding: - key: H - mods: Control|Shift - - # multi regex for different purposes: - # 2. UUIDs - # 3. hex (for example signatures) - # 4. IP addresses -# - regex: "([[:alnum:]_$%&+=/@-]+)\ -#|([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\ -#|([0-9a-f]{12,128})\ -#|([[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3})" -# action: Copy -# post_processing: false -# binding: -# key: U -# mods: Control|Shift diff --git a/modules/home/conf/alacritty/yaml/key_bindings.yml b/modules/home/conf/alacritty/yaml/key_bindings.yml deleted file mode 100644 index c8be747e..00000000 --- a/modules/home/conf/alacritty/yaml/key_bindings.yml +++ /dev/null @@ -1,382 +0,0 @@ -# Key bindings -# -# Key bindings are specified as a list of objects. For example, this is the -# default paste binding: -# -# `- { key: V, mods: Control|Shift, action: Paste }` -# -# Each key binding will specify a: -# -# - `key`: Identifier of the key pressed -# -# - A-Z -# - F1-F24 -# - Key0-Key9 -# -# A full list with available key codes can be found here: -# https://docs.rs/winit/*/winit/event/enum.VirtualKeyCode.html#variants -# -# Instead of using the name of the keys, the `key` field also supports using -# the scancode of the desired key. Scancodes have to be specified as a -# decimal number. This command will allow you to display the hex scancodes -# for certain keys: -# -# `showkey --scancodes`. -# -# Then exactly one of: -# -# - `chars`: Send a byte sequence to the running application -# -# The `chars` field writes the specified string to the terminal. This makes -# it possible to pass escape sequences. To find escape codes for bindings -# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside -# of tmux. Note that applications use terminfo to map escape sequences back -# to keys. It is therefore required to update the terminfo when changing an -# escape sequence. -# -# - `action`: Execute a predefined action -# -# - ToggleViMode -# - SearchForward -# Start searching toward the right of the search origin. -# - SearchBackward -# Start searching toward the left of the search origin. -# - Copy -# - Paste -# - IncreaseFontSize -# - DecreaseFontSize -# - ResetFontSize -# - ScrollPageUp -# - ScrollPageDown -# - ScrollHalfPageUp -# - ScrollHalfPageDown -# - ScrollLineUp -# - ScrollLineDown -# - ScrollToTop -# - ScrollToBottom -# - ClearHistory -# Remove the terminal's scrollback history. -# - Hide -# Hide the Alacritty window. -# - Minimize -# Minimize the Alacritty window. -# - Quit -# Quit Alacritty. -# - ToggleFullscreen -# - ToggleMaximized -# - SpawnNewInstance -# Spawn a new instance of Alacritty. -# - CreateNewWindow -# Create a new Alacritty window from the current process. -# - ClearLogNotice -# Clear Alacritty's UI warning and error notice. -# - ClearSelection -# Remove the active selection. -# - ReceiveChar -# - None -# -# - Vi mode exclusive actions: -# -# - Open -# Perform the action of the first matching hint under the vi mode cursor -# with `mouse.enabled` set to `true`. -# - ToggleNormalSelection -# - ToggleLineSelection -# - ToggleBlockSelection -# - ToggleSemanticSelection -# Toggle semantic selection based on `selection.semantic_escape_chars`. -# - CenterAroundViCursor -# Center view around vi mode cursor -# -# - Vi mode exclusive cursor motion actions: -# -# - Up -# One line up. -# - Down -# One line down. -# - Left -# One character left. -# - Right -# One character right. -# - First -# First column, or beginning of the line when already at the first column. -# - Last -# Last column, or beginning of the line when already at the last column. -# - FirstOccupied -# First non-empty cell in this terminal row, or first non-empty cell of -# the line when already at the first cell of the row. -# - High -# Top of the screen. -# - Middle -# Center of the screen. -# - Low -# Bottom of the screen. -# - SemanticLeft -# Start of the previous semantically separated word. -# - SemanticRight -# Start of the next semantically separated word. -# - SemanticLeftEnd -# End of the previous semantically separated word. -# - SemanticRightEnd -# End of the next semantically separated word. -# - WordLeft -# Start of the previous whitespace separated word. -# - WordRight -# Start of the next whitespace separated word. -# - WordLeftEnd -# End of the previous whitespace separated word. -# - WordRightEnd -# End of the next whitespace separated word. -# - Bracket -# Character matching the bracket at the cursor's location. -# - SearchNext -# Beginning of the next match. -# - SearchPrevious -# Beginning of the previous match. -# - SearchStart -# Start of the match to the left of the vi mode cursor. -# - SearchEnd -# End of the match to the right of the vi mode cursor. -# -# - Search mode exclusive actions: -# - SearchFocusNext -# Move the focus to the next search match. -# - SearchFocusPrevious -# Move the focus to the previous search match. -# - SearchConfirm -# - SearchCancel -# - SearchClear -# Reset the search regex. -# - SearchDeleteWord -# Delete the last word in the search regex. -# - SearchHistoryPrevious -# Go to the previous regex in the search history. -# - SearchHistoryNext -# Go to the next regex in the search history. -# -# - macOS exclusive actions: -# - ToggleSimpleFullscreen -# Enter fullscreen without occupying another space. -# -# - Linux/BSD exclusive actions: -# -# - CopySelection -# Copy from the selection buffer. -# - PasteSelection -# Paste from the selection buffer. -# -# - `command`: Fork and execute a specified command plus arguments -# -# The `command` field must be a map containing a `program` string and an -# `args` array of command line parameter strings. For example: -# `{ program: "alacritty", args: ["-e", "vttest"] }` -# -# And optionally: -# -# - `mods`: Key modifiers to filter binding actions -# -# - Command -# - Control -# - Option -# - Super -# - Shift -# - Alt -# -# Multiple `mods` can be combined using `|` like this: -# `mods: Control|Shift`. -# Whitespace and capitalization are relevant and must match the example. -# -# - `mode`: Indicate a binding for only specific terminal reported modes -# -# This is mainly used to send applications the correct escape sequences -# when in different modes. -# -# - AppCursor -# - AppKeypad -# - Search -# - Alt -# - Vi -# -# A `~` operator can be used before a mode to apply the binding whenever -# the mode is *not* active, e.g. `~Alt`. -# -# Bindings are always filled by default, but will be replaced when a new -# binding with the same triggers is defined. To unset a default binding, it can -# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for -# a no-op if you do not wish to receive input characters for that binding. -# -# If the same trigger is assigned to multiple actions, all of them are executed -# in the order they were defined in. -key_bindings: -# -# - - { key: P, mods: Control, action: Paste } - - { key: Insert, mods: Shift, action: Paste } - - { key: Slash, mods: Control, chars: "gc" } - - { key: Y, mods: Control, action: Copy } - - { key: Key0, mods: Control, action: ResetFontSize } - - { key: Equals, mods: Control, action: IncreaseFontSize } - - { key: Plus, mods: Control, action: IncreaseFontSize } - - { key: Minus, mods: Control, action: DecreaseFontSize } - - # Vi Mode - - { key: Space, mods: Control, action: ToggleViMode } - - { key: Space, mods: Control, mode: Vi, action: ScrollToBottom } - - { key: I, mode: Vi, action: ScrollToBottom } - - { key: I, mode: Vi, action: ToggleViMode } - - { key: C, mods: Control, mode: Vi, action: ScrollToBottom } - - { key: C, mods: Control, mode: Vi, action: ToggleViMode } - - { key: Escape, mode: Vi, action: ClearSelection } - - { key: Y, mods: Control, mode: Vi, action: ScrollLineUp } - - { key: E, mods: Control, mode: Vi, action: ScrollLineDown } - - { key: G, mode: Vi, action: ScrollToTop } - - { key: G, mods: Shift, mode: Vi, action: ScrollToBottom } - - { key: B, mods: Control, mode: Vi, action: ScrollPageUp } - - { key: F, mods: Control, mode: Vi, action: ScrollPageDown } - - { key: U, mods: Control, mode: Vi, action: ScrollHalfPageUp } - - { key: D, mods: Control, mode: Vi, action: ScrollHalfPageDown } - - { key: Y, mode: Vi, action: Copy } - - { key: Y, mode: Vi, action: ClearSelection } - - { key: V, mode: Vi, action: ToggleNormalSelection } - - { key: V, mods: Shift, mode: Vi, action: ToggleLineSelection } - - { key: V, mods: Control, mode: Vi, action: ToggleBlockSelection } - - { key: V, mods: Alt, mode: Vi, action: ToggleSemanticSelection } - - { key: Return, mode: Vi, action: Open } - - { key: K, mode: Vi, action: Up } - - { key: J, mode: Vi, action: Down } - - { key: H, mode: Vi, action: Left } - - { key: L, mode: Vi, action: Right } - - { key: Up, mode: Vi, action: Up } - - { key: Down, mode: Vi, action: Down } - - { key: Left, mode: Vi, action: Left } - - { key: Right, mode: Vi, action: Right } - - { key: Key0, mode: Vi, action: First } - - { key: Key4, mode: Vi, action: Last } - - { key: Key6, mods: Shift, mode: Vi, action: FirstOccupied } - - { key: H, mods: Shift, mode: Vi, action: High } - - { key: M, mods: Shift, mode: Vi, action: Middle } - - { key: L, mods: Shift, mode: Vi, action: Low } - - { key: B, mode: Vi, action: SemanticLeft } - - { key: W, mode: Vi, action: SemanticRight } - - { key: E, mode: Vi, action: SemanticRightEnd } - - { key: B, mods: Shift, mode: Vi, action: WordLeft } - - { key: W, mods: Shift, mode: Vi, action: WordRight } - - { key: E, mods: Shift, mode: Vi, action: WordRightEnd } - - { key: Key5, mods: Shift, mode: Vi, action: Bracket } - - { key: Slash, mode: Vi, action: SearchForward } - - { key: Slash, mods: Shift, mode: Vi, action: SearchBackward } - - { key: N, mode: Vi, action: SearchNext } - - { key: N, mods: Shift, mode: Vi, action: SearchPrevious } -# -# -# - #- { key: Paste, action: Paste } - #- { key: Copy, action: Copy } - #- { key: L, mods: Control, action: ClearLogNotice } - #- { key: L, mods: Control, mode: ~Vi|~Search, chars: "\x0c" } - #- { key: PageUp, mods: Shift, mode: ~Alt, action: ScrollPageUp } - #- { key: PageDown, mods: Shift, mode: ~Alt, action: ScrollPageDown } - #- { key: Home, mods: Shift, mode: ~Alt, action: ScrollToTop } - #- { key: End, mods: Shift, mode: ~Alt, action: ScrollToBottom } - - # Vi Mode - #- { key: Space, mods: Shift|Control, mode: ~Search, action: ToggleViMode } - #- { key: Space, mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom } - #- { key: Escape, mode: Vi|~Search, action: ClearSelection } - #- { key: I, mode: Vi|~Search, action: ToggleViMode } - #- { key: I, mode: Vi|~Search, action: ScrollToBottom } - #- { key: C, mods: Control, mode: Vi|~Search, action: ToggleViMode } - #- { key: Y, mods: Control, mode: Vi|~Search, action: ScrollLineUp } - #- { key: E, mods: Control, mode: Vi|~Search, action: ScrollLineDown } - #- { key: G, mode: Vi|~Search, action: ScrollToTop } - #- { key: G, mods: Shift, mode: Vi|~Search, action: ScrollToBottom } - #- { key: B, mods: Control, mode: Vi|~Search, action: ScrollPageUp } - #- { key: F, mods: Control, mode: Vi|~Search, action: ScrollPageDown } - #- { key: U, mods: Control, mode: Vi|~Search, action: ScrollHalfPageUp } - #- { key: D, mods: Control, mode: Vi|~Search, action: ScrollHalfPageDown } - #- { key: Y, mode: Vi|~Search, action: Copy } - #- { key: Y, mode: Vi|~Search, action: ClearSelection } - #- { key: Copy, mode: Vi|~Search, action: ClearSelection } - #- { key: V, mode: Vi|~Search, action: ToggleNormalSelection } - #- { key: V, mods: Shift, mode: Vi|~Search, action: ToggleLineSelection } - #- { key: V, mods: Control, mode: Vi|~Search, action: ToggleBlockSelection } - #- { key: V, mods: Alt, mode: Vi|~Search, action: ToggleSemanticSelection } - #- { key: Return, mode: Vi|~Search, action: Open } - #- { key: Z, mode: Vi|~Search, action: CenterAroundViCursor } - #- { key: K, mode: Vi|~Search, action: Up } - #- { key: J, mode: Vi|~Search, action: Down } - #- { key: H, mode: Vi|~Search, action: Left } - #- { key: L, mode: Vi|~Search, action: Right } - #- { key: Up, mode: Vi|~Search, action: Up } - #- { key: Down, mode: Vi|~Search, action: Down } - #- { key: Left, mode: Vi|~Search, action: Left } - #- { key: Right, mode: Vi|~Search, action: Right } - #- { key: Key0, mode: Vi|~Search, action: First } - #- { key: Key4, mods: Shift, mode: Vi|~Search, action: Last } - #- { key: Key6, mods: Shift, mode: Vi|~Search, action: FirstOccupied } - #- { key: H, mods: Shift, mode: Vi|~Search, action: High } - #- { key: M, mods: Shift, mode: Vi|~Search, action: Middle } - #- { key: L, mods: Shift, mode: Vi|~Search, action: Low } - #- { key: B, mode: Vi|~Search, action: SemanticLeft } - #- { key: W, mode: Vi|~Search, action: SemanticRight } - #- { key: E, mode: Vi|~Search, action: SemanticRightEnd } - #- { key: B, mods: Shift, mode: Vi|~Search, action: WordLeft } - #- { key: W, mods: Shift, mode: Vi|~Search, action: WordRight } - #- { key: E, mods: Shift, mode: Vi|~Search, action: WordRightEnd } - #- { key: Key5, mods: Shift, mode: Vi|~Search, action: Bracket } - #- { key: Slash, mode: Vi|~Search, action: SearchForward } - #- { key: Slash, mods: Shift, mode: Vi|~Search, action: SearchBackward } - #- { key: N, mode: Vi|~Search, action: SearchNext } - #- { key: N, mods: Shift, mode: Vi|~Search, action: SearchPrevious } - - # Search Mode - #- { key: Return, mode: Search|Vi, action: SearchConfirm } - #- { key: Escape, mode: Search, action: SearchCancel } - #- { key: C, mods: Control, mode: Search, action: SearchCancel } - #- { key: U, mods: Control, mode: Search, action: SearchClear } - #- { key: W, mods: Control, mode: Search, action: SearchDeleteWord } - #- { key: P, mods: Control, mode: Search, action: SearchHistoryPrevious } - #- { key: N, mods: Control, mode: Search, action: SearchHistoryNext } - #- { key: Up, mode: Search, action: SearchHistoryPrevious } - #- { key: Down, mode: Search, action: SearchHistoryNext } - #- { key: Return, mode: Search|~Vi, action: SearchFocusNext } - #- { key: Return, mods: Shift, mode: Search|~Vi, action: SearchFocusPrevious } - - # (Windows, Linux, and BSD only) - #- { key: V, mods: Control|Shift, mode: ~Vi, action: Paste } - #- { key: C, mods: Control|Shift, action: Copy } - #- { key: F, mods: Control|Shift, mode: ~Search, action: SearchForward } - #- { key: B, mods: Control|Shift, mode: ~Search, action: SearchBackward } - #- { key: C, mods: Control|Shift, mode: Vi|~Search, action: ClearSelection } - #- { key: Insert, mods: Shift, action: PasteSelection } - #- { key: Key0, mods: Control, action: ResetFontSize } - #- { key: Equals, mods: Control, action: IncreaseFontSize } - #- { key: Plus, mods: Control, action: IncreaseFontSize } - #- { key: NumpadAdd, mods: Control, action: IncreaseFontSize } - #- { key: Minus, mods: Control, action: DecreaseFontSize } - #- { key: NumpadSubtract, mods: Control, action: DecreaseFontSize } - - # (Windows only) - #- { key: Return, mods: Alt, action: ToggleFullscreen } - - # (macOS only) - #- { key: K, mods: Command, mode: ~Vi|~Search, chars: "\x0c" } - #- { key: K, mods: Command, mode: ~Vi|~Search, action: ClearHistory } - #- { key: Key0, mods: Command, action: ResetFontSize } - #- { key: Equals, mods: Command, action: IncreaseFontSize } - #- { key: Plus, mods: Command, action: IncreaseFontSize } - #- { key: NumpadAdd, mods: Command, action: IncreaseFontSize } - #- { key: Minus, mods: Command, action: DecreaseFontSize } - #- { key: NumpadSubtract, mods: Command, action: DecreaseFontSize } - #- { key: V, mods: Command, action: Paste } - #- { key: C, mods: Command, action: Copy } - #- { key: C, mods: Command, mode: Vi|~Search, action: ClearSelection } - #- { key: H, mods: Command, action: Hide } - #- { key: H, mods: Command|Alt, action: HideOtherApplications } - #- { key: M, mods: Command, action: Minimize } - #- { key: Q, mods: Command, action: Quit } - #- { key: W, mods: Command, action: Quit } - #- { key: N, mods: Command, action: CreateNewWindow } - #- { key: F, mods: Command|Control, action: ToggleFullscreen } - #- { key: F, mods: Command, mode: ~Search, action: SearchForward } - #- { key: B, mods: Command, mode: ~Search, action: SearchBackward } diff --git a/modules/home/conf/alacritty/yaml/mouse.yml b/modules/home/conf/alacritty/yaml/mouse.yml deleted file mode 100644 index 4bdb408b..00000000 --- a/modules/home/conf/alacritty/yaml/mouse.yml +++ /dev/null @@ -1,11 +0,0 @@ -mouse: - # Click settings - # - # The `double_click` and `triple_click` settings control the time - # alacritty should wait for accepting multiple clicks as one double - # or triple click. - double_click: { threshold: 300 } - triple_click: { threshold: 300 } - - # If this is `true`, the cursor is temporarily hidden when typing. - hide_when_typing: false diff --git a/modules/home/conf/alacritty/yaml/mouse_bindings.yml b/modules/home/conf/alacritty/yaml/mouse_bindings.yml deleted file mode 100644 index ab244d21..00000000 --- a/modules/home/conf/alacritty/yaml/mouse_bindings.yml +++ /dev/null @@ -1,32 +0,0 @@ -# Mouse bindings -# -# Mouse bindings are specified as a list of objects, much like the key -# bindings further below. -# -# To trigger mouse bindings when an application running within Alacritty -# captures the mouse, the `Shift` modifier is automatically added as a -# requirement. -# -# Each mouse binding will specify a: -# -# - `mouse`: -# -# - Middle -# - Left -# - Right -# - Numeric identifier such as `5` -# -# - `action` (see key bindings for actions not exclusive to mouse mode) -# -# - Mouse exclusive actions: -# -# - ExpandSelection -# Expand the selection to the current mouse cursor location. -# -# And optionally: -# -# - `mods` (see key bindings) -mouse_bindings: -# - { mouse: Right, action: ExpandSelection } -# - { mouse: Right, mods: Control, action: ExpandSelection } - - { mouse: Middle, action: Copy } diff --git a/modules/home/conf/alacritty/yaml/scrolling.yml b/modules/home/conf/alacritty/yaml/scrolling.yml deleted file mode 100644 index 50365627..00000000 --- a/modules/home/conf/alacritty/yaml/scrolling.yml +++ /dev/null @@ -1,7 +0,0 @@ -scrolling: - # Maximum number of lines in the scrollback buffer. - # Specifying '0' will disable scrolling. - history: 10000 - - # Scrolling distance multiplier. - multiplier: 3 diff --git a/modules/home/conf/alacritty/yaml/selection.yml b/modules/home/conf/alacritty/yaml/selection.yml deleted file mode 100644 index 5e5bd544..00000000 --- a/modules/home/conf/alacritty/yaml/selection.yml +++ /dev/null @@ -1,7 +0,0 @@ -selection: - # This string contains all characters that are used as separators for - # "semantic words" in Alacritty. - semantic_escape_chars: ",│`|:\"' ()[]{}<>\t" - - # When set to `true`, selected text will be copied to the primary clipboard. - save_to_clipboard: false diff --git a/modules/home/conf/alacritty/yaml/shell.yml b/modules/home/conf/alacritty/yaml/shell.yml deleted file mode 100644 index 04844dd0..00000000 --- a/modules/home/conf/alacritty/yaml/shell.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Shell -# -# You can set `shell.program` to the path of your favorite shell, e.g. -# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the -# shell. -# -# Default: -# - (Linux/BSD/macOS) `$SHELL` or the user's login shell, if `$SHELL` is unset -# - (Windows) powershell -#shell: -# program: /bin/bash -# args: -# - --login diff --git a/modules/home/conf/alacritty/yaml/window.yml b/modules/home/conf/alacritty/yaml/window.yml deleted file mode 100644 index 7b89b6ed..00000000 --- a/modules/home/conf/alacritty/yaml/window.yml +++ /dev/null @@ -1,89 +0,0 @@ -window: - # Window dimensions (changes require restart) - # - # Number of lines/columns (not pixels) in the terminal. Both lines and columns - # must be non-zero for this to take effect. The number of columns must be at - # least `2`, while using a value of `0` for columns and lines will fall back - # to the window manager's recommended size - dimensions: - columns: 0 - lines: 0 - - # Window position (changes require restart) - # - # Specified in number of pixels. - # If the position is not set, the window manager will handle the placement. - #position: - # x: 0 - # y: 0 - - # Window padding (changes require restart) - # - # Blank space added around the window in pixels. This padding is scaled - # by DPI and the specified value is always added at both opposing sides. - padding: - x: 5 - y: 5 - - # Spread additional padding evenly around the terminal content. - #dynamic_padding: false - - # Window decorations - # - # Values for `decorations`: - # - full: Borders and title bar - # - none: Neither borders nor title bar - # - # Values for `decorations` (macOS only): - # - transparent: Title bar, transparent background and title bar buttons - # - buttonless: Title bar, transparent background and no title bar buttons - decorations: none - - # Background opacity - # - # Window opacity as a floating point number from `0.0` to `1.0`. - # The value `0.0` is completely transparent and `1.0` is opaque. - opacity: 0.9 - - # Startup Mode (changes require restart) - # - # Values for `startup_mode`: - # - Windowed - # - Maximized - # - Fullscreen - # - # Values for `startup_mode` (macOS only): - # - SimpleFullscreen - startup_mode: Windowed - - # Window title - title: Alacritty - - # Allow terminal applications to change Alacritty's window title. - dynamic_title: true - - # Window class (Linux/BSD only): - class: - # Application instance name - instance: Alacritty - # General application class - general: Alacritty - - # Decorations theme variant - # - # Override the variant of the System theme/GTK theme/Wayland client side - # decorations. Commonly supported values are `Dark`, `Light`, and `None` for - # auto pick-up. Set this to `None` to use the default theme variant. - decorations_theme_variant: None - - # Resize increments - # - # Prefer resizing window by discrete steps equal to cell dimensions. - #resize_increments: false - - # Make `Option` key behave as `Alt` (macOS only): - # - OnlyLeft - # - OnlyRight - # - Both - # - None (default) - #option_as_alt: None diff --git a/modules/home/conf/beets/default.nix b/modules/home/conf/beets/default.nix deleted file mode 100644 index 8d6277b7..00000000 --- a/modules/home/conf/beets/default.nix +++ /dev/null @@ -1,103 +0,0 @@ -{ - pkgs, - lib, - config, - ... -}: let - plugins = import ./plugins.nix {}; -in { - imports = [ - ./plugins - ]; - - programs.beets = { - enable = true; - package = pkgs.beets.override { - pluginOverrides = { - xtractor = { - enable = true; - propagatedBuildInputs = [pkgs.beetsExtraPlugins.xtractor]; - }; - }; - }; - - settings = { - library = "${config.xdg.dataHome}/beets/library.db"; - art_filename = "cover"; - directory = "${config.xdg.userDirs.music}/beets"; - ui = { - color = true; - }; - - include = [ - "./replace_override.yaml" - ]; - - import = { - # move, instead of copying or linking the files - copy = false; - move = true; - link = false; - - # Show more detail, when beet needs to ask for something - detail = true; - - incremental = false; - - # Write the metadata to the files - write = true; - log = "${config.xdg.dataHome}/beets/beetslog.txt"; - }; - - paths = let - j = lib.strings.concatStringsSep "/"; - in { - default = j ["[Default]" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"]; - "albumtype:live" = j ["[Live]" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"]; - - "albumtype:album" = j ["Music" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"]; - "albumtype::(Single|EP)" = j ["Music" "$genre" "$first_artist_singleton" "$album ($albumtype)" "$track $title"]; - "albumtype:compilation" = j ["Complilations" "$genre" "Various Artists" "$album ($albumtype)" "$track $title"]; - "albumtype:soundtrack" = j ["Soundtracks" "$genre" "$first_artist" "$album" "$track $title"]; - }; - - inherit plugins; - - # Plugin config - # scrub = { - # auto = true; - # }; - - musicbrainz = { - # Search for deezer id's and use them in the autotagger - # external_ids = { - # deezer = true; - # }; - }; - - # Log-on config - # TODO: Add this, to upload the generated fingerprints (to help improve their - # database) <2024-08-07> - # acoustid = { - # apikey = "TODO"; - # }; - }; - - mpdIntegration = { - enableStats = true; - enableUpdate = true; - host = config.home.sessionVariables.MPD_HOST; - }; - }; - - xdg.configFile."beets/replace_override.yaml".source = ./replace_override.yaml; - - # Use the json formatter instead of the YAML one, as the YAML formatter mangles the - # longer python inline strings. - # YAML is a superset of JSON. - xdg.configFile."beets/config.yaml".source = - lib.mkForce - ((pkgs.formats.json {}).generate - "beets-config" - config.programs.beets.settings); -} diff --git a/modules/home/conf/beets/plugins.nix b/modules/home/conf/beets/plugins.nix deleted file mode 100644 index bea2fefe..00000000 --- a/modules/home/conf/beets/plugins.nix +++ /dev/null @@ -1,67 +0,0 @@ -{...}: -# NOTE: This list is here and not split over the various plugin dirs, as we need a way to -# specify the order plugins are loaded in. <2024-08-11> -[ - # Remove all previous tags before import (this is useful to ensure, that - # the metadata in the libary.db is synced with the tags on disk) - # # FIXME: I think, that this also removes the deezer id, which is not ideal - # <2024-08-07> - # "scrub" - - # Help submitting stuff to music brainz - "mbsubmit" - - # Extract things from the music file - "xtractor" - - # Calculate replay gain - "replaygain" - - # Check for bad files - "badfiles" - - # Alows to use inline python for parsing tags - "inline" - - # Support player integration - "play" - - # Show tags on files/queries - "info" - - # Create playlist from `play_count`/`skip_count` (gathered by the `mpdstats` - # plugin) - # Note that this should come _before_ the `mpdupdate` plugin, to ensure that - # `mpdupgate` can propagate changed playlist to `mpd`. - "smartplaylist" - - # Warn, when importing a matching item - "ihate" - - # Allow fuzzy searching - "fuzzy" - - # Filter out duplicates - "duplicates" - - # Generate fingerprints - "chroma" - - # Download album art - "fetchart" - - # Fetches tags from `last.fm` and adds them as genres to imported music - "lastgenre" - - # Run commands on events - "hook" - - # Fetch lyrics - "lyrics" - - # Allow beets to understand deezer id's - # "deezer" - - "mpdstats" # Transfer MPD stats to beets - "mpdupdate" # Update MPD database on import -] diff --git a/modules/home/conf/beets/plugins/badfiles/default.nix b/modules/home/conf/beets/plugins/badfiles/default.nix deleted file mode 100644 index 33884785..00000000 --- a/modules/home/conf/beets/plugins/badfiles/default.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ - lib, - pkgs, - ... -}: { - programs.beets.settings.badfiles = { - check_on_import = true; - commands = { - flac = "${lib.getExe' pkgs.flac "flac"} --test --warnings-as-errors --silent"; - mp3 = "${lib.getExe pkgs.mp3val}"; - }; - }; -} diff --git a/modules/home/conf/beets/plugins/default.nix b/modules/home/conf/beets/plugins/default.nix deleted file mode 100644 index 3bea5ea8..00000000 --- a/modules/home/conf/beets/plugins/default.nix +++ /dev/null @@ -1,16 +0,0 @@ -{...}: { - imports = [ - ./badfiles - ./duplicates - ./fuzzy - ./ihate - ./inline - ./lastgenre - ./lyrics - ./mbsubmit - ./play - ./replaygain - ./smartplaylist - ./xtractor - ]; -} diff --git a/modules/home/conf/beets/plugins/duplicates/default.nix b/modules/home/conf/beets/plugins/duplicates/default.nix deleted file mode 100644 index c8a6c108..00000000 --- a/modules/home/conf/beets/plugins/duplicates/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{...}: { - programs.beets.settings.duplicates = { - keys = ["acoustid_fingerprint"]; - }; -} diff --git a/modules/home/conf/beets/plugins/fuzzy/default.nix b/modules/home/conf/beets/plugins/fuzzy/default.nix deleted file mode 100644 index b86b3a20..00000000 --- a/modules/home/conf/beets/plugins/fuzzy/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{...}: { - programs.beets.settings.fuzzy = { - # The prefix denoting that a search should be run in fuzzy mode - prefix = "."; - }; -} diff --git a/modules/home/conf/beets/plugins/ihate/default.nix b/modules/home/conf/beets/plugins/ihate/default.nix deleted file mode 100644 index 145f5f8b..00000000 --- a/modules/home/conf/beets/plugins/ihate/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{...}: { - programs.beets.settings.ihate = { - warn = [ - "title:commentary" - "albumtype:live" - ]; - }; -} diff --git a/modules/home/conf/beets/plugins/inline/default.nix b/modules/home/conf/beets/plugins/inline/default.nix deleted file mode 100644 index 0dda8cfc..00000000 --- a/modules/home/conf/beets/plugins/inline/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{...}: { - programs.beets.settings = { - item_fields = { - # Taken from https://github.com/trapd00r/configs/blob/4f3dada5700846cca6c2869e6fa6b3c795b87b67/beets/config.yaml - first_artist = - /* - python - */ - '' - # import an album to another artists directory, like: - # Tom Jones │1999│ Burning Down the House [Single, CD, FLAC] - # to The Cardigans/+singles/Tom Jones & the Cardigans │1999│ Burning Down the House [Single, CD, FLAC] - # https://github.com/beetbox/beets/discussions/4012#discussioncomment-1021414 - # beet import --set myartist='The Cardigans' - # we must first check to see if myartist is defined, that is, given on - # import time, or we raise an NameError exception. - try: - myartist - except NameError: - import re - return re.split(',|\\s+(feat(.?|uring)|&|(Vs|Ft).)', albumartist, 1, flags=re.IGNORECASE)[0] - else: - return myartist - ''; - - first_artist_singleton = - /* - python - */ - '' - try: - myartist - except NameError: - import re - return re.split(',|\\s+(feat(.?|uring)|&|(Vs|Ft).)', artist, 1, flags=re.IGNORECASE)[0] - else: - return myartist - ''; - }; - album_fields = {}; - }; -} diff --git a/modules/home/conf/beets/plugins/lastgenre/default.nix b/modules/home/conf/beets/plugins/lastgenre/default.nix deleted file mode 100644 index d10ca49f..00000000 --- a/modules/home/conf/beets/plugins/lastgenre/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{...}: { - programs.beets.settings.lastgenre = { - prefer_specific = false; - # Lookup the track, not the album - source = "track"; - }; -} diff --git a/modules/home/conf/beets/plugins/lyrics/default.nix b/modules/home/conf/beets/plugins/lyrics/default.nix deleted file mode 100644 index 80544aea..00000000 --- a/modules/home/conf/beets/plugins/lyrics/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{...}: { - programs.beets.settings.lyrics = { - # Always fetch lyrics (and update them, if some were found) - force = true; - }; -} diff --git a/modules/home/conf/beets/plugins/mbsubmit/default.nix b/modules/home/conf/beets/plugins/mbsubmit/default.nix deleted file mode 100644 index b70f1c63..00000000 --- a/modules/home/conf/beets/plugins/mbsubmit/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ - lib, - pkgs, - ... -}: { - programs.beets.settings.mbsubmit = { - picard_path = lib.getExe pkgs.picard; - }; -} diff --git a/modules/home/conf/beets/plugins/play/default.nix b/modules/home/conf/beets/plugins/play/default.nix deleted file mode 100644 index f5bc3c9b..00000000 --- a/modules/home/conf/beets/plugins/play/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ - lib, - pkgs, - config, - ... -}: { - programs.beets.settings.play = { - command = "${lib.getExe pkgs.mpc-cli} $args add"; - relative_to = config.services.mpd.musicDirectory; - - # Run the command with the returned paths as arguments - raw = true; - }; -} diff --git a/modules/home/conf/beets/plugins/replaygain/default.nix b/modules/home/conf/beets/plugins/replaygain/default.nix deleted file mode 100644 index 611f3799..00000000 --- a/modules/home/conf/beets/plugins/replaygain/default.nix +++ /dev/null @@ -1,24 +0,0 @@ -{...}: { - programs.beets.settings = { - replaygain = { - auto = true; - backend = "ffmpeg"; - - r128_targetlevel = 89; - - # Re-calculate the replay gain value even for files, that already have one set. - overwrite = true; - }; - - hook = { - hooks = [ - { - # Also generate the replaygain for the album variant (so selecting between - # track and album becomes possible) - event = "import"; - command = "echo Remember to run 'beet replaygain --album' to generate the album replaygain values for the imported songs!"; - } - ]; - }; - }; -} diff --git a/modules/home/conf/beets/plugins/smartplaylist/default.nix b/modules/home/conf/beets/plugins/smartplaylist/default.nix deleted file mode 100644 index b55c487c..00000000 --- a/modules/home/conf/beets/plugins/smartplaylist/default.nix +++ /dev/null @@ -1,33 +0,0 @@ -{config, ...}: { - programs.beets.settings.smartplaylist = { - relative_to = config.services.mpd.musicDirectory; - playlist_dir = config.services.mpd.playlistDirectory; - forward_slash = false; - - # Show the real m3u file paths, when running `--pretend` - pretend_paths = true; - - playlists = [ - { - name = "artists-$first_artist.m3u"; - query = ""; - } - { - name = "ratings-good.m3u"; - query = "rating:0.7..1.0"; - } - { - name = "ratings-mediocre.m3u"; - query = "rating:0.4..0.7"; - } - { - name = "ratings-bad.m3u"; - query = "rating:0.0..0.4"; - } - { - name = "not_played.m3u"; - query = "-play_count: artist:"; - } - ]; - }; -} diff --git a/modules/home/conf/beets/plugins/xtractor/default.nix b/modules/home/conf/beets/plugins/xtractor/default.nix deleted file mode 100644 index d4582c5f..00000000 --- a/modules/home/conf/beets/plugins/xtractor/default.nix +++ /dev/null @@ -1,95 +0,0 @@ -{ - lib, - pkgs, - config, - ... -}: { - programs.beets.settings = { - xtractor = { - # This option is not yet implemented, thus requiring the hook - auto = true; - - dry-run = false; - # Writes the bpm key to the media files - write = true; - threads = 0; - # Also run for files, which already have the required keys - force = true; - quiet = false; - keep_output = true; - keep_profiles = true; - output_path = "${config.xdg.dataHome}/beets/xtactor"; - essentia_extractor = "${lib.getExe pkgs.essentia-extractor}"; - extractor_profile = { - highlevel = { - svm_models = let - m = pkgs.beetsExtraPlugins.xtractor.models; - in [ - "${m}/danceability.history" - "${m}/danceability.history.param" - "${m}/danceability.history.results.html" - "${m}/gender.history" - "${m}/gender.history.param" - "${m}/gender.history.results.html" - "${m}/genre_dortmund.history" - "${m}/genre_dortmund.history.param" - "${m}/genre_dortmund.history.results.html" - "${m}/genre_electronic.history" - "${m}/genre_electronic.history.param" - "${m}/genre_electronic.history.results.html" - "${m}/genre_rosamerica.history" - "${m}/genre_rosamerica.history.param" - "${m}/genre_rosamerica.history.results.html" - "${m}/genre_tzanetakis.history" - "${m}/genre_tzanetakis.history.param" - "${m}/genre_tzanetakis.history.results.html" - "${m}/ismir04_rhythm.history" - "${m}/ismir04_rhythm.history.param" - "${m}/ismir04_rhythm.history.results.html" - "${m}/mood_acoustic.history" - "${m}/mood_acoustic.history.param" - "${m}/mood_acoustic.history.results.html" - "${m}/mood_aggressive.history" - "${m}/mood_aggressive.history.param" - "${m}/mood_aggressive.history.results.html" - "${m}/mood_electronic.history" - "${m}/mood_electronic.history.param" - "${m}/mood_electronic.history.results.html" - "${m}/mood_happy.history" - "${m}/mood_happy.history.param" - "${m}/mood_happy.history.results.html" - "${m}/mood_party.history" - "${m}/mood_party.history.param" - "${m}/mood_party.history.results.html" - "${m}/mood_relaxed.history" - "${m}/mood_relaxed.history.param" - "${m}/mood_relaxed.history.results.html" - "${m}/mood_sad.history" - "${m}/mood_sad.history.param" - "${m}/mood_sad.history.results.html" - "${m}/moods_mirex.history" - "${m}/moods_mirex.history.param" - "${m}/moods_mirex.history.results.html" - "${m}/timbre.history" - "${m}/timbre.history.param" - "${m}/timbre.history.results.html" - "${m}/tonal_atonal.history" - "${m}/tonal_atonal.history.param" - "${m}/tonal_atonal.history.results.html" - "${m}/voice_instrumental.history" - "${m}/voice_instrumental.history.param" - "${m}/voice_instrumental.history.results.html" - ]; - }; - }; - }; - hook = { - hooks = [ - { - event = "import"; - command = "echo Remember to run 'beet xtractor'!"; - } - ]; - }; - }; -} diff --git a/modules/home/conf/beets/replace_override.yaml b/modules/home/conf/beets/replace_override.yaml deleted file mode 100644 index 23d6ea55..00000000 --- a/modules/home/conf/beets/replace_override.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -replace: - '[\\/]': _ - '^\.': _ - '[\x00-\x1f]': _ - '[<>:"\?\*\|]': _ - '\.$': _ - '\s+$': '' - '^\s+': '' - '^-': _ diff --git a/modules/home/conf/btop/default.nix b/modules/home/conf/btop/default.nix deleted file mode 100644 index 06b56ea7..00000000 --- a/modules/home/conf/btop/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{config, ...}: { - programs.btop = { - enable = true; - }; -} diff --git a/modules/home/conf/dconf/default.nix b/modules/home/conf/dconf/default.nix deleted file mode 100644 index dc439e1e..00000000 --- a/modules/home/conf/dconf/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{...}: { - # Also see: https://github.com/gvolpe/dconf2nix - dconf.settings = { - "org/gnome/desktop/wm/preferences" = { - # hide gtk buttons in titelbar - button-layout = ""; - }; - }; -} diff --git a/modules/home/conf/default.nix b/modules/home/conf/default.nix deleted file mode 100644 index b6eddec4..00000000 --- a/modules/home/conf/default.nix +++ /dev/null @@ -1,48 +0,0 @@ -{...}: { - imports = [ - ./alacritty - ./beets - ./btop - ./dconf - ./direnv - ./firefox - ./gammastep - ./git - ./gpg - ./gtk - ./himalaya - ./hyfetch - ./iamb - ./keepassxc - ./latexindent - ./less - ./lf - ./mail - ./mako - ./mbsync - ./mpd - ./mpv - ./mumble - ./neomutt - ./nix-index - ./npm - ./nvim - ./prusa_slicer - ./python - ./rclone - ./rofi - ./ssh - ./starship - ./swayidle - ./swaylock - ./taskwarrior - ./timewarrior - ./tridactyl - ./unison - ./xdg - ./yambar - ./yt - ./ytcc - ./zsh - ]; -} diff --git a/modules/home/conf/direnv/default.nix b/modules/home/conf/direnv/default.nix deleted file mode 100644 index 3a7b8add..00000000 --- a/modules/home/conf/direnv/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{...}: { - programs.direnv = { - enable = true; - nix-direnv.enable = true; - }; -} diff --git a/modules/home/conf/firefox/config/bookmarks/default.nix b/modules/home/conf/firefox/config/bookmarks/default.nix deleted file mode 100644 index c612bf4d..00000000 --- a/modules/home/conf/firefox/config/bookmarks/default.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ - lib, - pkgs, - ... -}: let - bookmarks = [ - { - name = "Feed - Piped"; - url = "https://piped.video/feed"; - } - - { - name = "DeepL Translate"; - url = "https://www.deepl.com/translator"; - } - - { - name = "Nix lib"; - url = "https://teu5us.github.io/nix-lib.html"; - } - - { - name = "Nixpkgs manual"; - url = "https://ryantm.github.io/nixpkgs/"; - } - ]; - - mkBookmarksFile = (import ./lib.nix) {inherit lib pkgs;}; - bookmarks_file = mkBookmarksFile bookmarks; -in - bookmarks_file diff --git a/modules/home/conf/firefox/config/bookmarks/lib.nix b/modules/home/conf/firefox/config/bookmarks/lib.nix deleted file mode 100644 index d1d89dd2..00000000 --- a/modules/home/conf/firefox/config/bookmarks/lib.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ - lib, - pkgs, -}: bookmarks: let - indent = level: - lib.concatStringsSep "" (map (lib.const " ") (lib.range 1 level)); - - bookmarkToHTML = indentLevel: bookmark: '' - ${indent indentLevel}
    ${lib.escapeXML bookmark.name}''; - - directoryToHTML = indentLevel: directory: '' - ${indent indentLevel}
    ${ - if directory.toolbar - then ''

    Bookmarks Toolbar'' - else "

    ${lib.escapeXML directory.name}" - }

    - ${indent indentLevel}

    - ${allItemsToHTML (indentLevel + 1) directory.bookmarks} - ${indent indentLevel}

    ''; - - itemToHTMLOrRecurse = indentLevel: item: - if item ? "url" - then bookmarkToHTML indentLevel item - else directoryToHTML indentLevel item; - - allItemsToHTML = indentLevel: bookmarks: - lib.concatStringsSep "\n" - (map (itemToHTMLOrRecurse indentLevel) bookmarks); - - bookmarkEntries = allItemsToHTML 1 bookmarks; -in - pkgs.writeText "firefox-bookmarks.html" '' - - - - Bookmarks -

    Bookmarks Menu

    - -

    -

    Bookmarks Toolbar

    -

    - ${bookmarkEntries} -

    -

    - '' diff --git a/modules/home/conf/firefox/config/chrome/userChrome.css b/modules/home/conf/firefox/config/chrome/userChrome.css deleted file mode 100644 index 0b3aff77..00000000 --- a/modules/home/conf/firefox/config/chrome/userChrome.css +++ /dev/null @@ -1,41 +0,0 @@ -/* thickness of tab when you have too many open tabs */ -.tabbrowser-tab:not([pinned="true"]) { - min-width: 10px !important; - min-height: 10px !important; -} - -/* tab height -#TabsToolbar .tabbrowser-tabs { -min-height: 10px !important; -} -*/ - -/* -.tabbrowser-tab {min-width: 016px !important;} -.tabbrowser-tab {clip-width: 016px !important;} -*/ - -/* the + button that opens new tabs */ -#TabsToolbar .tabs-newtab-button { - margin-left: 10px !important; - height: Auto !important; -} - -#main-window[privatebrowsingmode="temporary"] #navigator-toolbox { - background-color: #c40944 !important; -} - -/* close button inside a tab */ -.tab-close-button * { - width: 10px !important; - height: 10px !important; -} - -/* bookmark toolbar */ -#personal-bookmarks .bookmark-item > .toolbarbutton-text { - font-size: 10pt !important; -} -#personal-bookmarks .bookmark-item > .toolbarbutton-icon { - height: 12px !important; - width: 12px !important; -} diff --git a/modules/home/conf/firefox/config/extensions/extensions.json b/modules/home/conf/firefox/config/extensions/extensions.json deleted file mode 100644 index be05e957..00000000 --- a/modules/home/conf/firefox/config/extensions/extensions.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "darkreader": { - "addonId": "addon@darkreader.org", - "default_area": "navbar", - "pname": "darkreader", - "sha256": "sha256:251c4e7d0a30c0cab006803600e59ab92dcc0c606429740d42677846d4c9ccd6", - "url": "https://addons.mozilla.org/firefox/downloads/file/4359254/darkreader-4.9.94.xpi", - "version": "4.9.94" - }, - "keepassxc-browser": { - "addonId": "keepassxc-browser@keepassxc.org", - "default_area": "navbar", - "pname": "keepassxc-browser", - "sha256": "sha256:a330fa4fc659f04f835802bb0c5df0b9025adced995112cad19d4849a5f1957d", - "url": "https://addons.mozilla.org/firefox/downloads/file/4342010/keepassxc_browser-1.9.3.xpi", - "version": "1.9.3" - }, - "torproject-snowflake": { - "addonId": "{b11bea1f-a888-4332-8d8a-cec2be7d24b9}", - "default_area": "navbar", - "pname": "torproject-snowflake", - "sha256": "sha256:a6b11d5250e6c30c9a0d4b1caaedc446a7fb31bb78088fa14554fdd1e3741cb3", - "url": "https://addons.mozilla.org/firefox/downloads/file/4310769/torproject_snowflake-0.8.4.xpi", - "version": "0.8.4" - }, - "tridactyl-vim": { - "addonId": "tridactyl.vim@cmcaine.co.uk", - "default_area": "menupanel", - "pname": "tridactyl-vim", - "sha256": "sha256:ab63fe1554471c280f234409393172fc58e1bb2ca527f4329d983b028073e19c", - "url": "https://addons.mozilla.org/firefox/downloads/file/4261352/tridactyl_vim-1.24.1.xpi", - "version": "1.24.1" - }, - "ublock-origin": { - "addonId": "uBlock0@raymondhill.net", - "default_area": "menupanel", - "pname": "ublock-origin", - "sha256": "sha256:e2cda9b2a1b0a7f6e5ef0da9f87f28df52f8560587ba2e51a3003121cfb81600", - "url": "https://addons.mozilla.org/firefox/downloads/file/4359936/ublock_origin-1.60.0.xpi", - "version": "1.60.0" - }, - "vhack-libredirect": { - "addonId": "vhack-libredirect@addons.vhack.eu", - "default_area": "navbar", - "pname": "vhack-libredirect", - "sha256": "sha256:2cb6befac6f414e0dd79a11db8905a0d988b98633b74afbe52ffe8006da841f5", - "url": "https://addons.mozilla.org/firefox/downloads/file/4351448/vhack_libredirect-2.9.1.xpi", - "version": "2.9.1" - } -} diff --git a/modules/home/conf/firefox/config/extensions/native_messaging_hosts/default.nix b/modules/home/conf/firefox/config/extensions/native_messaging_hosts/default.nix deleted file mode 100644 index 9aaa1682..00000000 --- a/modules/home/conf/firefox/config/extensions/native_messaging_hosts/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{pkgs, ...}: -/* -++ lib.optional (cfg.enableBrowserpass or false) (lib.getBin browserpass) -++ lib.optional (cfg.enableBukubrow or false) bukubrow -++ lib.optional (cfg.enableTridactylNative or false) tridactyl-native -++ lib.optional (cfg.enableGnomeExtensions or false) gnome-browser-connector -++ lib.optional (cfg.enableUgetIntegrator or false) uget-integrator -++ lib.optional (cfg.enablePlasmaBrowserIntegration or false) plasma5Packages.plasma-browser-integration -++ lib.optional (cfg.enableFXCastBridge or false) fx-cast-bridge -++ lib.optional (cfg.enableKeePassXC or false) keepassxc -*/ -with pkgs; [ - tridactyl-native - keepassxc -] diff --git a/modules/home/conf/firefox/config/policies/default.nix b/modules/home/conf/firefox/config/policies/default.nix deleted file mode 100644 index 02c740f6..00000000 --- a/modules/home/conf/firefox/config/policies/default.nix +++ /dev/null @@ -1,146 +0,0 @@ -{ - config, - extensions, - ... -}: let - locals = [ - "en-CA" - "de" - "sv-SE" - ]; - mkAllowedExtension = extension: { - name = extension.addonId; - value = { - installation_mode = "normal_installed"; - updates_disabled = true; - inherit (extension) default_area; - install_url = "file://${builtins.fetchurl { - inherit - (extension) - url - sha256 - ; - }}"; - }; - }; - allowedExtensions = - builtins.listToAttrs - (builtins.map mkAllowedExtension (builtins.attrValues - extensions)); - - mkBlockedExtension = id: { - name = id; - value = { - install_mode = "blocked"; - }; - }; - blockedExtensions = builtins.listToAttrs (builtins.map mkBlockedExtension [ - # these are the default search engines - "addons-search-detection@mozilla.com" - "amazon@search.mozilla.org" - "bing@search.mozilla.org" - "ddg@search.mozilla.org" - "google@search.mozilla.org" - "wikipedia@search.mozilla.org" - ]); - - language_packs = builtins.listToAttrs (builtins.map - ( - lang: { - name = "langpack-${lang}@firefox.mozilla.org"; - value = { - installation_mode = "normal_installed"; - updates_disabled = true; - install_url = "https://releases.mozilla.org/pub/firefox/releases/${config.soispha.firefox.package_version}/linux-x86_64/xpi/${lang}.xpi"; - }; - } - ) - locals); -in { - # NOTE: See https://mozilla.github.io/policy-templates for documentation <2023-10-21> - policies = { - # NixOS manages this already - DisableAppUpdate = true; - - DisableFirefoxAccounts = true; - DisableFirefoxScreenshots = true; - - # KeepassXC does this for me - DisableMasterPasswordCreation = true; - - # I use a self-hosted services for that - DisablePocket = true; - - # I don't want to lose my data - DisableProfileRefresh = true; - - DisableDeveloperTools = false; - - DisplayBookmarksToolbar = "newtab"; - DisplayMenuBar = "default-off"; - - DNSOverHTTPS = { - Enabled = true; - Locked = false; - }; - # The concept of a "default browser" does not apply to my NixOS config - DontCheckDefaultBrowser = true; - - EnableTrackingProtection = { - Value = true; - Locked = false; - Cryptomining = true; - Fingerprinting = true; - EmailTracking = true; - }; - - EncryptedMediaExtensions = { - # I want a _free_ config (and I can always just run another browser) - Enabled = false; - Locked = true; - }; - - ExtensionSettings = - { - "*" = { - # Blocking the extension install here, also blocks the 'about:debugging' page - - # blocked_install_message = '' - # You can't install a extension manually, - # please specify it in your NixOS configuration - # ''; - installation_mode = "allowed"; - }; - } - // allowedExtensions - // blockedExtensions - // language_packs; - - ExtensionUpdate = false; - - # TODO: Add handlers for the default file types <2023-10-21> - # Handlers = { - # }; - - HardwareAcceleration = true; - - # Blocking the extension install here, also blocks the 'about:debugging' page - # InstallAddonsPermission = { - # Allowed = []; - # Default = false; - # }; - - # KeepassXC and such things - OfferToSaveLogins = false; - PasswordManagerEnabled = false; - - PDFjs = { - Enabled = true; - # Don't honor documents right to be un-copy-able - EnablePermissions = false; - }; - - SearchBar = "unified"; - RequestedLocales = locals; - }; -} diff --git a/modules/home/conf/firefox/config/prefs/default.nix b/modules/home/conf/firefox/config/prefs/default.nix deleted file mode 100644 index 80c6d274..00000000 --- a/modules/home/conf/firefox/config/prefs/default.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ - pkgs, - config, - user_js, - bookmarks, - ... -}: let - user_js_override = pkgs.writeText "user.override.js" (builtins.readFile ./override.js); -in - pkgs.runCommand "user.js" {} '' - mkdir $out; - cat "${user_js}/user.js" > $out/user.js; - cat "${user_js_override}" >> $out/user.js; - - cat << EOF >> $out/user.js; - // My bookmarks - user_pref("browser.bookmarks.file", "${toString bookmarks}"); - user_pref("browser.startup.homepage", "file:///home/dt/home.html"); // 0103 // TODO: add this from a flake - user_pref("browser.download.dir", "${config.xdg.userDirs.download}"); - EOF - '' diff --git a/modules/home/conf/firefox/config/prefs/override.js b/modules/home/conf/firefox/config/prefs/override.js deleted file mode 100644 index bf874b33..00000000 --- a/modules/home/conf/firefox/config/prefs/override.js +++ /dev/null @@ -1,202 +0,0 @@ -/* - 0100: STARTUP - 0200: GEOLOCATION / LANGUAGE / LOCALE - 0300: QUIETER FOX - 0400: SAFE BROWSING - 0600: BLOCK IMPLICIT OUTBOUND - 0700: DNS / DoH / PROXY / SOCKS / IPv6 - 0800: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS - 0900: PASSWORDS - 1000: DISK AVOIDANCE - 1200: HTTPS (SSL/TLS / OCSP / CERTS / HPKP) - 1400: FONTS - 1600: HEADERS / REFERERS - 1700: CONTAINERS - 2000: PLUGINS / MEDIA / WEBRTC - 2400: DOM (DOCUMENT OBJECT MODEL) - 2600: MISCELLANEOUS - 2700: ETP (ENHANCED TRACKING PROTECTION) - 2800: SHUTDOWN & SANITIZING - 4500: RFP (RESIST FINGERPRINTING) - 5000: OPTIONAL OPSEC - 5500: OPTIONAL HARDENING - 6000: DON'T TOUCH - 7000: DON'T BOTHER - 8000: DON'T BOTHER: FINGERPRINTING - 9000: NON-PROJECT RELATED - 9999: DEPRECATED / REMOVED / LEGACY / RENAMED -*/ - - -// restore session -user_pref("browser.startup.page", 3); // 0102 - -user_pref("browser.newtabpage.enabled", true); // 0104 - -// disable the geoservice, TODO: don't know if I want this -//user_pref("geo.provider.use_geoclue", false); // 0202 - -// TODO: is this something useful? -user_pref("datareporting.policy.dataSubmissionEnabled", true); // 0330 - -// enable health reports -user_pref("datareporting.healthreport.uploadEnabled", true); // 0331 - -// Do I want to opt-out? -user_pref("toolkit.telemetry.coverage.opt-out", false); // 0333 - -// enables studies -user_pref("app.shield.optoutstudies.enabled", true); // 0340 - -// I guess that browsing protection is useful -user_pref("browser.safebrowsing.downloads.remote.enabled", true); // 0403 - -// TODO: does this (-> set to false) make things slower? -user_pref("network.prefetch-next", true); // 0601 - -// enable ipv6 because the rest of the system uses it -user_pref("network.dns.disableIPv6", false); // 0701 - -// TRR only -user_pref("network.trr.mode", 3); // 0710 - -// I trust my search engine -user_pref("keyword.enabled", true); // 801 -user_pref("browser.search.suggest.enabled", true); // 0804 -user_pref("browser.urlbar.suggest.searches", true); // 0804 -// TODO: no idea what this does, enabling it -user_pref("browser.urlbar.showSearchTerms.enabled", true); // 9004 - -// prefetch urls, if the get auto completed -user_pref("browser.urlbar.speculativeConnect.enabled", true); // 0805 - -// Disable autoScrolling (clicking with the mouse wheel) -user_pref("general.autoScroll", false); - -// add new tabs after the current one -user_pref("browser.tabs.insertAfterCurrent", true); - -// TODO: I might want to enable this -//user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); // 0807 - -// TODO: enable form and search history? -//user_pref("browser.formfill.enable", false); // 0810 - -// disk cache should help performance -user_pref("browser.cache.disk.enable", true); // 1001 - -// store extra session data (form content, cookies and POST data) 0: everywhere -user_pref("browser.sessionstore.privacy_level", 0); // 1003 - -// Disable unsafe passive content (images) on https sites -user_pref("security.mixed_content.block_display_content", true); // 1241 - -// Disable the eme banner -user_pref("browser.eme.ui.enabled", false); // 2022 - -// Don't delete my precious temp files -user_pref("browser.helperApps.deleteTempFileOnExit", false); // 2603 - -// Download to the download dir -user_pref("browser.download.useDownloadDir", true); // 2651 - -// Open the download panel -user_pref("browser.download.alwaysOpenPanel", true); // 2652 - -// Block after custom ruleset -user_pref("browser.contentblocking.category", "custom"); // 2701 - -// set the custom settings // 7016 -user_pref("network.cookie.cookieBehavior", 1); -user_pref("network.http.referer.disallowCrossSiteRelaxingDefault", true); -user_pref("network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation", true); -user_pref("privacy.partition.network_state.ocsp_cache", true); -user_pref("privacy.query_stripping.enabled", true); -user_pref("privacy.trackingprotection.enabled", true); -user_pref("privacy.trackingprotection.socialtracking.enabled", true); -user_pref("privacy.trackingprotection.cryptomining.enabled", true); -user_pref("privacy.trackingprotection.fingerprinting.enabled", true); - - -// I might want to change that, when it hinders session restore -//user_pref("privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage", false); // 2720 - -// I like my history very much! -user_pref("privacy.sanitize.sanitizeOnShutdown", false); // 2810 - -// The downsides (light theme + potential breakages): -//user_pref("privacy.resistFingerprinting", true); // 4501 -user_pref("privacy.resistFingerprinting.letterboxing", false); // 4504 - -// I would like to keep my gl, even in the web -user_pref("webgl.disabled", false); // 4520 - -// I like my service workers and am using a service using them. -user_pref("dom.serviceWorkers.enabled", true); // 7017 - -// I've got a password manager already -user_pref("signon.rememberSignons", false); // 5003 - -// Do not track header -user_pref("privacy.donottrackheader.enabled", true); // 7015 - -// Allow my custom css -user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); - -// might improve performance TODO: -user_pref("gfx.webrender.all", true); - -// disable updates (pretty pointless with nix) -user_pref("extensions.update.autoUpdateDefault", false); -user_pref("extensions.update.enabled", false); -user_pref("app.update.channel", "default"); - -user_pref("browser.ctrlTab.recentlyUsedOrder", false); - -user_pref("browser.download.useDownloadDir", true); -user_pref("browser.download.folderList", 2); // TODO: -user_pref("browser.download.viewableInternally.typeWasRegistered.svg", true); -user_pref("browser.download.viewableInternally.typeWasRegistered.webp", true); -user_pref("browser.download.viewableInternally.typeWasRegistered.xml", true); - -// TODO: what does this do? -user_pref("browser.search.widget.inNavBar", true); - -user_pref("browser.shell.checkDefaultBrowser", false); -user_pref("browser.tabs.loadInBackground", true); -user_pref("browser.urlbar.placeholderName", "Brave"); - -// Set the tabs and bookmarks -user_pref("browser.tabs.inTitlebar", 1); -user_pref("browser.toolbars.bookmarks.visibility", "always"); -user_pref("browser.places.importBookmarksHTML", true); - -// Theme -user_pref("extensions.activeThemeID", "firefox-alpenglow@mozilla.org"); -user_pref("extensions.extensions.activeThemeID", "firefox-alpenglow@mozilla.org"); - -// highlight all entries when searching -user_pref("findbar.highlightAll", true); - -// Set the default position for the developer toolbox -user_pref("devtools,toolbox.host", "right"); -user_pref("devtools,toolsidebar-width.inspector", 700); - -// Don't bother me with translations -user_pref("browser.translations.automaticallyPopup", true); -user_pref("browser.translations.neverTranslateLanguages", "de"); - -// Put all downloads into the downloads directory -user_pref("browser.download.start_downloads_in_tmp_dir", false); - -// TODO: -//user_pref("extensions.webcompat.enable_picture_in_picture_overrides", true); -//user_pref("extensions.webcompat.enable_shims", true); -//user_pref("extensions.webcompat.perform_injections", true); -//user_pref("extensions.webcompat.perform_ua_overrides", true); - -// onlykey / copied from a yubikey config -//user_pref("security.webauth.u2f", true); -//user_pref("security.webauth.webauthn", true); -//user_pref("security.webauth.webauthn_enable_softtoken", true); -//user_pref("security.webauth.webauthn_enable_usbtoken", true); diff --git a/modules/home/conf/firefox/config/search/engines/default.nix b/modules/home/conf/firefox/config/search/engines/default.nix deleted file mode 100644 index a47c77df..00000000 --- a/modules/home/conf/firefox/config/search/engines/default.nix +++ /dev/null @@ -1,84 +0,0 @@ -{pkgs, ...}: { - # DEFAULT - "Brave Search" = { - urls = [{template = "https://search.brave.com/search?q={searchTerms}";}]; - icon = ./logos/brave.svg; - definedAliases = ["@bs"]; - }; - - # NIX - "Nix Packages" = { - urls = [{template = "https://search.nixos.org/packages?type=packages&query={searchTerms}";}]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = ["@np"]; - }; - - "NixOS Options" = { - urls = [{template = "https://search.nixos.org/options?type=options&query={searchTerms}";}]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = ["@no"]; - }; - "HomeManager Options" = { - urls = [{template = "https://home-manager-options.extranix.com/?query={searchTerms}&release=master";}]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = ["@nh"]; - }; - - "Nixpkgs issues" = { - urls = [{template = "https://github.com/NixOS/nixpkgs/issues?q=is%3Aissue+is%3Aopen+{searchTerms}";}]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = ["@ni"]; - }; - "Nixpkgs pull requests" = { - urls = [{template = "https://github.com/NixOS/nixpkgs/pulls?q=is%3Apr+is%3Aopen+{searchTerms}";}]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = ["@nr"]; - }; - - "Nixpkgs pull requests tracker" = { - urls = [{template = "https://nixpk.gs/pr-tracker.html?pr={searchTerms}";}]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = ["@nt"]; - }; - "NixOS Wiki" = { - urls = [{template = "https://wiki.nixos.org/w/index.php?search={searchTerms}";}]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = ["@nw"]; - }; - - # RUST - "Rust std" = { - urls = [{template = "https://doc.rust-lang.org/std/?search={searchTerms}";}]; - icon = ./logos/rust_std.svg; - definedAliases = ["@rs"]; - }; - "Rust tokio" = { - urls = [{template = "https://docs.rs/tokio/latest/tokio/index.html?search={searchTerms}";}]; - icon = ./logos/rust_tokio.png; - definedAliases = ["@rt"]; - }; - - # OTHER - "Google Scholar" = { - urls = [{template = "https://scholar.google.com/scholar?hl=en&q={searchTerms}";}]; - icon = ./logos/google_scholar.ico; - definedAliases = ["@gs"]; - }; - "Wikipedia" = { - urls = [{template = "https://en.wikipedia.org/wiki/{searchTerms}";}]; - icon = ./logos/wikipedia.svg; - definedAliases = ["@wp"]; - }; - "Arch Wiki" = { - urls = [{template = "https://wiki.archlinux.org/index.php?search={searchTerms}";}]; - icon = ./logos/arch_linux.svg; - definedAliases = ["@aw"]; - }; - - "Wikipedia (en)".metaData.hidden = true; - "DuckDuckGo".metaData.hidden = true; - "Bing".metaData.hidden = true; - "Google".metaData.hidden = true; - "Amazon.de".metaData.hidden = true; - "eBay".metaData.hidden = true; -} diff --git a/modules/home/conf/firefox/config/search/engines/logos/arch_linux.svg b/modules/home/conf/firefox/config/search/engines/logos/arch_linux.svg deleted file mode 100644 index 949b5c5f..00000000 --- a/modules/home/conf/firefox/config/search/engines/logos/arch_linux.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/modules/home/conf/firefox/config/search/engines/logos/brave.svg b/modules/home/conf/firefox/config/search/engines/logos/brave.svg deleted file mode 100644 index 09dd2e42..00000000 --- a/modules/home/conf/firefox/config/search/engines/logos/brave.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/home/conf/firefox/config/search/engines/logos/google_scholar.ico b/modules/home/conf/firefox/config/search/engines/logos/google_scholar.ico deleted file mode 100644 index 85d0c664..00000000 Binary files a/modules/home/conf/firefox/config/search/engines/logos/google_scholar.ico and /dev/null differ diff --git a/modules/home/conf/firefox/config/search/engines/logos/rust_std.svg b/modules/home/conf/firefox/config/search/engines/logos/rust_std.svg deleted file mode 100644 index 0091b5a8..00000000 --- a/modules/home/conf/firefox/config/search/engines/logos/rust_std.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/home/conf/firefox/config/search/engines/logos/rust_tokio.png b/modules/home/conf/firefox/config/search/engines/logos/rust_tokio.png deleted file mode 100644 index f1de55ff..00000000 Binary files a/modules/home/conf/firefox/config/search/engines/logos/rust_tokio.png and /dev/null differ diff --git a/modules/home/conf/firefox/config/search/engines/logos/wikipedia.svg b/modules/home/conf/firefox/config/search/engines/logos/wikipedia.svg deleted file mode 100644 index dc32f984..00000000 --- a/modules/home/conf/firefox/config/search/engines/logos/wikipedia.svg +++ /dev/null @@ -1 +0,0 @@ -]>Wikipedia logo version 2 \ No newline at end of file diff --git a/modules/home/conf/firefox/default.nix b/modules/home/conf/firefox/default.nix deleted file mode 100644 index f2ccfc99..00000000 --- a/modules/home/conf/firefox/default.nix +++ /dev/null @@ -1,134 +0,0 @@ -{ - config, - pkgs, - lib, - user_js, - ... -}: let - extensions = - builtins.fromJSON (builtins.readFile ./config/extensions/extensions.json); - - userChrome = builtins.readFile ./config/chrome/userChrome.css; - bookmarks = (import ./config/bookmarks/default.nix) { - inherit - pkgs - lib - ; - }; - engines = (import ./config/search/engines) {inherit pkgs;}; - - native_messaging_hosts = (import ./config/extensions/native_messaging_hosts/default.nix) {inherit pkgs;}; - - policies = (import ./config/policies) {inherit config extensions;}; - - search = { - default = "Brave Search"; - privateDefault = "Brave Search"; - force = true; - order = [ - # DEFAULT - "Brave Search" - - # NIX - "Nix Packages" - "Nix Options" - "Nixpkgs issues" - "Homemanager Options" - "NixOS Wiki" - "Nixpkgs Pull Request Tracker" - - # RUST - "Rust std" - "Rust tokio" - - # OTHER - "Google Scholar" - "Wikipedia" - "Arch Wiki" - ]; - - inherit engines; - }; - - prefConfig = builtins.readFile "${ - (import ./config/prefs) {inherit pkgs lib config bookmarks user_js;} - }/user.js"; - - # Package {{{ - package = import ./package.nix { - inherit config lib pkgs; - extraPolicies = policies; - extraNativeMessagingHosts = native_messaging_hosts; - }; - # }}} - - # Profiles {{{ - profiles = { - "default" = { - inherit search userChrome; - isDefault = true; - id = 0; - name = "default"; - extraConfig = prefConfig; - }; - }; - - taskwarriorProfiles = import ../taskwarrior/firefox { - inherit - config - lib - # options - - prefConfig - search - userChrome - ; - profile_size = builtins.length (builtins.attrNames profiles); - }; - # }}} -in { - options.soispha.firefox = { - package = lib.mkOption { - type = lib.types.package; - default = pkgs.firefox; - description = "Firefox package to use."; - defaultText = lib.literalExpression "pkgs.firefox"; - relatedPackages = [ - "firefox" - "firefox-beta-bin" - "firefox-bin" - "firefox-devedition-bin" - "firefox-esr" - ]; - }; - package_version = lib.mkOption { - type = lib.types.str; - default = pkgs.firefox.version; - description = "Firefox version to use"; - }; - }; - - config = { - soispha.firefox.package = package; - soispha.firefox.package_version = pkgs.firefox.version; - home.sessionVariables = { - # improve touch input & make scrolling smother - MOZ_USE_XINPUT2 = "1"; - - # improve wayland support - MOZ_ENABLE_WAYLAND = 1; - - # tell gtk to use portals - GTK_USE_PORTAL = 1; - - BROWSER = "firefox"; - }; - programs.firefox = { - enable = true; - inherit (config.soispha.firefox) package; - profiles = - profiles - // taskwarriorProfiles; - }; - }; -} diff --git a/modules/home/conf/firefox/package.nix b/modules/home/conf/firefox/package.nix deleted file mode 100644 index f7e4319b..00000000 --- a/modules/home/conf/firefox/package.nix +++ /dev/null @@ -1,30 +0,0 @@ -# taken from the NixOS Firefox module: https://github.com/NixOS/nixpkgs/blob/7c9cc5a6e5d38010801741ac830a3f8fd667a7a0/nixos/modules/programs/firefox.nix -{ - config, - lib, - pkgs, - # options - autoConfig ? "", - extraNativeMessagingHosts ? [], - wrapperConfig ? {}, - extraPolicies ? {}, - base_package ? pkgs.firefox, -}: let - pkg = base_package.override (old: { - extraPrefsFiles = - (old.extraPrefsFiles or []) - ++ [ - (pkgs.writeText "autoConfig.js" autoConfig) - ]; - nativeMessagingHosts = old.nativeMessagingHosts or [] ++ extraNativeMessagingHosts; - cfg = (old.cfg or {}) // wrapperConfig; - extraPoliciesFiles = - (old.extraPoliciesFiles or []) - ++ [ - ( - pkgs.writeText "policies.json" (builtins.toJSON extraPolicies) - ) - ]; - }); -in - pkg diff --git a/modules/home/conf/firefox/scripts/default.nix b/modules/home/conf/firefox/scripts/default.nix deleted file mode 100644 index 1127662b..00000000 --- a/modules/home/conf/firefox/scripts/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - pkgs, - sysLib, - ... -}: let - unzip_mozlz4 = pkgs.stdenv.mkDerivation { - name = "unzip_mozlz4"; - propagatedBuildInputs = [ - (pkgs.python3.withPackages (pythonPackages: - with pythonPackages; [ - lz4 - ])) - ]; - dontUnpack = true; - installPhase = "install -Dm755 ${./unzip_mozlz4.py} $out/bin/unzip_mozlz4"; - }; - extract_cookies = sysLib.writeShellScript { - name = "extract_cookies"; - src = ./extract_cookies.sh; - dependencies = with pkgs; [ - bash - sqlite - mktemp - coreutils - ]; - }; -in { - inherit unzip_mozlz4 extract_cookies; -} diff --git a/modules/home/conf/firefox/scripts/extract_cookies.sh b/modules/home/conf/firefox/scripts/extract_cookies.sh deleted file mode 100755 index e3d50d43..00000000 --- a/modules/home/conf/firefox/scripts/extract_cookies.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash -# copied from https://superuser.com/a/1239036 -# extract_cookies.sh: -# -# Convert from Firefox's cookies.sqlite format to Netscape cookies, -# which can then be used by wget and curl. (Why don't wget and curl -# just use libsqlite if it's installed? Mysteries abound.) -# -# Note: This script reads directly from the standard cookie jar file, -# which means cookies which are kept only in memory ("session cookies") -# will not be extracted. You will need an extension to do that. - -# USAGE: -# -# $ extract_cookies.sh > /tmp/cookies.txt -# or -# $ extract_cookies.sh ~/.mozilla/firefox/*default*/cookies.sqlite > /tmp/cookies.txt - -# USING WITH WGET: -# $ wget --load-cookies=/tmp/cookies.txt http://example.com - -# USING WITH CURL: -# $ curl --cookie /tmp/cookies.txt http://example.com - -# Note: If you do not specify an SQLite filename, this script will -# intelligently find it for you. -# -# A) Usually it will check all profiles under ~/.mozilla/firefox/ and -# use the cookies.sqlite that was updated most recently. -# -# B) If you've redirected stdin (with < or |) , then that will be used. - -# HISTORY: I believe this is circa 2010 from: -# http://slacy.com/blog/2010/02/using-cookies-sqlite-in-wget-or-curl/ -# However, that site is down now. - -# Cleaned up by Hackerb9 (2017) to be more robust and require less typing. - -cleanup() { - rm -f "$TMPFILE" - exit 0 -} -trap cleanup EXIT INT QUIT TERM - -if [ "$#" -ge 1 ]; then - SQLFILE="$1" -else - SQLFILE="$HOME/.mozilla/firefox/default/cookies.sqlite" -fi - -if ! [ -r "$SQLFILE" ]; then - echo "Error. File $SQLFILE is not readable." >&2 - exit 1 -fi - -# We have to copy cookies.sqlite, because FireFox has a lock on it -TMPFILE=$(mktemp /tmp/cookies.sqlite.XXXXXXXXXX) -cat "$SQLFILE" >>"$TMPFILE" - -# This is the format of the sqlite database: -# CREATE TABLE moz_cookies (id INTEGER PRIMARY KEY, name TEXT, value TEXT, host TEXT, path TEXT,expiry INTEGER, lastAccessed INTEGER, isSecure INTEGER, isHttpOnly INTEGER); - -echo "# Netscape HTTP Cookie File" -sqlite3 -separator $'\t' "$TMPFILE" < ") diff --git a/modules/home/conf/firefox/scripts/update_extensions.sh b/modules/home/conf/firefox/scripts/update_extensions.sh deleted file mode 100755 index 86bd843c..00000000 --- a/modules/home/conf/firefox/scripts/update_extensions.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -tmp=$(mktemp) -cat <"$tmp" - darkreader:navbar - keepassxc-browser:navbar - vhack-libredirect:navbar - torproject-snowflake:navbar - tridactyl-vim:menupanel - ublock-origin:menupanel -EOF - -# The bin is provided in the devshell; -# The cat execution should be unquoted; -# shellcheck disable=SC2046 -generate_extensions $(cat "$tmp") >"$(dirname "$0")"/../config/extensions/extensions.json - -rm "$tmp" diff --git a/modules/home/conf/gammastep/default.nix b/modules/home/conf/gammastep/default.nix deleted file mode 100644 index 1ae0550b..00000000 --- a/modules/home/conf/gammastep/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - lib, - nixosConfig, - ... -}: let - temp = - if nixosConfig.soispha.laptop.enable - then 3000 - else 1300; -in { - services.gammastep = { - enable = true; - settings = { - general = { - temp-day = lib.mkForce temp; - temp-night = lib.mkForce temp; - gamma = "0.8:0.8:0.8"; - fade = 0; - adjustment-method = "wayland"; - location-provider = "manual"; - }; - - manual = { - lat = 48.1; - lon = 11.6; - }; - }; - }; -} diff --git a/modules/home/conf/git/aliases.nix b/modules/home/conf/git/aliases.nix deleted file mode 100644 index 15bf613d..00000000 --- a/modules/home/conf/git/aliases.nix +++ /dev/null @@ -1,82 +0,0 @@ -{ - lib, - config, -}: { - cmr = "commit --file .git/COMMIT_EDITMSG --edit --verbose"; - - st = "status"; - sts = "status --short --branch"; - - ds = "diff --staged"; - di = "diff"; - rs = "restore --staged"; - - ## Logging: - ls = "log --max-count=10 --color --format=format:'%C(bold red)%h%C(reset) %C(dim bold blue)%s%C(reset) %C(dim white)[%aN] %C(bold red)<%G?>%C(reset)%C(auto)%d%C(reset)'"; - - # https://stackoverflow.com/a/61487052 - lg = "lg1"; - lg1 = "lg1-specific --all"; - lg2 = "lg2-specific --all"; - lg3 = "lg3-specific --all"; - - lg1-specific = "log --graph --abbrev-commit --decorate \ - --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold cyan) [%G?]%C(reset)%C(auto)%d%C(reset)'"; - - lg2-specific = "log --graph --abbrev-commit --decorate \ - --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'"; - - lg3-specific = "log --graph --abbrev-commit --decorate \ - --format=format:'%C(bold blue)%h%C(reset)\ - - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)\ - %C(bold cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)\ - %C(bold red)(signature: %G? by %GS, trust: %GT)%C(reset)%n\ - '' %C(white)%s%C(reset)%n''\ - %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)\ - %C(bold white)- trailers: %(trailers) %C(reset)'"; - - # hard reset with commit before (use reflog to recover) - # git wipe [] - wipe = lib.strings.concatStringsSep " " [ - "!git" - "add" - "--all" - "&&" - "git" - "commit" - "--quiet" - "--message='WIPE-SAVEPOINT'" - "--no-gpg-sign" - "&&" - "git reset \${1:-HEAD~} --hard" - "&&" - "git clean -fd" - ]; - - branches = lib.strings.concatStringsSep " " [ - "!git" - "for-each-ref" - "--sort=-committerdate" - "--color=always" - "--format='${ - lib.strings.concatStringsSep "|" [ - "%(color:blue)%(authordate:relative)" - "%(color:red)%(authorname)" - "%(color:green)%(color:bold)%(refname:short)" - ] - }'" - "refs/remotes" - "|" - "column -ts'|' -o ' '" - ]; - - tags = "tag --list"; - - remotes = "remote --verbose"; - - day = "!git log --stat --since '1 day ago' --author $(git config user.email)"; - - unpush = "push --force-with-lease origin HEAD~1:${config.programs.git.extraConfig.init.defaultBranch}"; - - wip = "!git add . && git commit --amend && git push --force-with-lease"; -} diff --git a/modules/home/conf/git/default.nix b/modules/home/conf/git/default.nix deleted file mode 100644 index 6680c598..00000000 --- a/modules/home/conf/git/default.nix +++ /dev/null @@ -1,96 +0,0 @@ -{ - lib, - config, - ... -}: let - gitIgnoreFile = ./git_ignore.git; - gitTemplateFile = ./git_template.git; -in { - programs.git = { - enable = true; - #package = pkgs.gitAndTools.gitFull; # TODO: for git send-email support - aliases = import ./aliases.nix {inherit lib config;}; - extraConfig = { - core = { - excludesFile = "${gitIgnoreFile}"; - }; - rebase = { - autoStash = true; - autoSquash = true; - }; - init = { - defaultBranch = "prime"; - }; - user = { - name = "Benedikt Peetz"; - email = "benedikt.peetz@b-peetz.de"; - # signingKey = "[is down below]"; - }; - help = { - autocorrect = 5; - }; - push = { - gpgSign = "if-asked"; - }; - commit = { - template = "${gitTemplateFile}"; - }; - diff = { - colorMoved = "default"; - # Usually leads to better results - algorithm = "patience"; - bin = { - textconv = "hexdump -v -C"; - }; - }; - # Makes it a bit more readable - blame = { - coloring = "repeatedLines"; - markIgnoredLines = true; - markUnblamables = true; - }; - merge = { - conflictstyle = "zdiff3"; - }; - url = { - "git@codeberg.org:" = { - insteadOf = "@cb:"; - }; - "https://codeberg.org/" = { - insteadOf = "cb://"; - }; - - "git@github.com:" = { - insteadOf = "@gh:"; - }; - "https://github.com/" = { - insteadOf = "gh://"; - }; - - "git@gitlab.com:" = { - insteadOf = "@gl:"; - }; - "https://gitlab.com/" = { - insteadOf = "gl://"; - }; - }; - }; - delta = { - enable = true; - options = { - decorations = { - commit-decoration-style = "bold yellow box ul"; - file-decoration-style = "none"; - file-style = "bold yellow ul"; - }; - keep-plus-minus-markers = true; - features = "decorations"; - whitespace-error-style = "22 reverse"; - }; - }; - signing = { - key = "8321ED3A8DB999A51F3BF80FF2682914EA42DE26"; - signByDefault = true; - }; - }; -} diff --git a/modules/home/conf/git/git_ignore.git b/modules/home/conf/git/git_ignore.git deleted file mode 100644 index 8f29815e..00000000 --- a/modules/home/conf/git/git_ignore.git +++ /dev/null @@ -1,4 +0,0 @@ -# default nvim Session file name -Session.vim - -# vim: ft=gitignore diff --git a/modules/home/conf/git/git_template.git b/modules/home/conf/git/git_template.git deleted file mode 100644 index 6af39119..00000000 --- a/modules/home/conf/git/git_template.git +++ /dev/null @@ -1,66 +0,0 @@ - -# Title: Summary, imperative, start upper case, don't end with a period -# If applied, this commit will - -# Body: Explain *what* and *why* (not *how*). - - -# BREAKING CHANGE: -# Fixes: # -# Refs: # -# Co-authored-by: - - - -# Convention Commits (https://www.conventionalcommits.org/en/v1.0.0/ or https://github.com/angular/angular/blob/85b4941be137a2fcdc664dc870e408dd72ad7de7/CONTRIBUTING.md#commit): -# feat: [Features] -> MINOR version bump -# A new feature -# -# fix: [Bug Fixes] -> PATCH version bump -# A bug fix -# -# append '!' after the type/scope: [Breaking Change] -> MAJOR version bump -# A breaking API change -# -# docs: [Documentation] -# Documentation only changes -# -# style: [Styles] -# Changes that do not affect the meaning of the code -# (white-space, formatting, missing semi-colons, etc) -# -# refactor: [Code Refactoring] -# A code change that neither fixes a bug nor adds a feature -# -# perf: [Performance Improvements] -> PATCH version bump -# A code change that improves performance -# -# test: [Tests] -# Adding missing tests or correcting existing tests -# -# build: [Builds] -> PATCH version bump -# Changes that affect the build system or external dependencies -# (example scopes: gulp, broccoli, npm) -# -# ci: [Continuous Integrations] -# Changes to our CI configuration files and scripts -# (example scopes: Travis, Circle, BrowserStack, SauceLabs) -# -# chore: [Chores] -# Other changes that don't modify src or test files -# -# reverts: [Reverts] -# Reverts a previous commit - -# How to Write a Git Commit Message: -# [https://chris.beams.io/posts/git-commit/] -> https://cbea.ms/git-commit/ -# -# 1. Separate subject from body with a blank line -# 2. Limit the subject line to 50 characters -# 3. Capitalize the subject line -# 4. Do not end the subject line with a period -# 5. Use the imperative mood in the subject line -# 6. Wrap the body at 72 characters -# 7. Use the body to explain *what* and *why* vs. *how* -# -# vim: ft=gitcommit diff --git a/modules/home/conf/gpg/default.nix b/modules/home/conf/gpg/default.nix deleted file mode 100644 index 1acdf628..00000000 --- a/modules/home/conf/gpg/default.nix +++ /dev/null @@ -1,67 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: { - programs.gpg = { - enable = true; - homedir = "${config.xdg.dataHome}/gnupg"; - mutableKeys = true; - mutableTrust = true; - - settings = { - default-key = "Benedikt Peetz "; - # TODO: add more - }; - - publicKeys = [ - { - source = ./keys/key_1.asc; - trust = "ultimate"; - } - { - source = ./keys/key_2.asc; - trust = "full"; - } - ]; - }; - services = { - gpg-agent = { - enable = true; - enableZshIntegration = true; - enableScDaemon = true; # smartcards and such things - - # Cache the key passwords - defaultCacheTtl = 60 * 50; - defaultCacheTtlSsh = 60 * 50; - maxCacheTtl = 60 * 50; - maxCacheTtlSsh = 60 * 50; - - pinentryPackage = pkgs.pinentry-curses; - # pinentryPackage = pkgs.pinentry-tty; - - enableSshSupport = true; - sshKeys = let - removeSpace = str: builtins.replaceStrings [" "] [""] str; - in [ - (removeSpace "8321 ED3A 8DB9 99A5 1F3B F80F F268 2914 EA42 DE26") - ]; - }; - }; - - programs.zsh.initExtraFirst = lib.mkBefore '' - export GPG_TTY=$(tty) - - # Magic copied from the gpg-agent manual - unset SSH_AGENT_PID - if [ "''${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then - export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" - fi - - - # Ensure that get gpg agent is started (necessary because ssh does not start it - # automatically and has it's tty updated) - gpg-connect-agent /bye - ''; -} diff --git a/modules/home/conf/gpg/keys/key_1.asc b/modules/home/conf/gpg/keys/key_1.asc deleted file mode 100644 index 795f82af..00000000 --- a/modules/home/conf/gpg/keys/key_1.asc +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Comment: 8321 ED3A 8DB9 99A5 1F3B F80F F268 2914 EA42 DE26 -Comment: Benedikt Peetz - -mDMEZkCPnhYJKwYBBAHaRw8BAQdAA2ve8cO5iCx0Ehd8+9zhXrzzAlpo7DI5ltNM -vLQIHVK0KkJlbmVkaWt0IFBlZXR6IDxiZW5lZGlrdC5wZWV0ekBiLXBlZXR6LmRl -PoiZBBMWCgBBFiEEgyHtOo25maUfO/gP8mgpFOpC3iYFAmZAj54CGwEFCRLMAwAF -CwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQ8mgpFOpC3iYTYwD/UGnlFls7 -ynY52EAiea6Fa+ktXZQKnVjKYO4AYmUdIRMA/iY+fnhm7OgB1SSv0ssjqpeIFSwu -qTL4lz735Pn+UNEKuDMEZkCP8xYJKwYBBAHaRw8BAQdAk5J9kVCFByKW5Wk8Oobn -Ydy/sh+05irq/xjQjtDQG8eI9QQYFgoAJhYhBIMh7TqNuZmlHzv4D/JoKRTqQt4m -BQJmQI/zAhsCBQkDwmcAAIEJEPJoKRTqQt4mdiAEGRYKAB0WIQTeYpC3k+aybU6a -T722E5vLB86UbQUCZkCP8wAKCRC2E5vLB86UbaN2AQCbINgO9vljxk4T/s4N1+t4 -Zp5skgghUn4vTQXGIs2NugD9HwhSazuUHo3gJFyhAowPCtKlCbdOEmrs4qQFHU9h -0gPKdgEAtxZorpsQtrQjTHaOH0Ee5Hx+i10iP3npybzieFzvhQcA/R8L0jr8SJ6F -HP6sEpAAdQ2qp9dqB71KISBtN1JbEagNuDMEZkCQPhYJKwYBBAHaRw8BAQdAwThl -Vr4ihl/pPdTTwkb3eLpAgAnhqabuaQHM7XglKTOIfgQYFgoAJhYhBIMh7TqNuZml -Hzv4D/JoKRTqQt4mBQJmQJA+AhsgBQkDwmcAAAoJEPJoKRTqQt4mO88A/2gXjwaq -A9KN37jKb05zpsvTjOR5J9UOLsWUfye5zl6FAQCArUmXDApaOmB6FRUZqb93xiXQ -6m5T5OoMcpURC6IyBrg4BGZAkGoSCisGAQQBl1UBBQEBB0BIk7HOtw7Z+BV1Oyst -bl3PPAVuMtMJUD1CeYOMzA+1PwMBCAeIfgQYFgoAJhYhBIMh7TqNuZmlHzv4D/Jo -KRTqQt4mBQJmQJBqAhsMBQkDwmcAAAoJEPJoKRTqQt4mg+kBAMTgMMLo/IzGPVhX -8gSTGpM3fDQchgFfOMyjIDfWN0zDAQDiY6RCXavD7uVfg/949r9TQHo0Vvem63GH -9Y7Vp2vzCA== -=IM58 ------END PGP PUBLIC KEY BLOCK----- diff --git a/modules/home/conf/gpg/keys/key_2.asc b/modules/home/conf/gpg/keys/key_2.asc deleted file mode 100644 index 47188da7..00000000 --- a/modules/home/conf/gpg/keys/key_2.asc +++ /dev/null @@ -1,794 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Comment: 2FEA 7BDB 9171 70A7 B8E7 2001 DF18 78E6 D9C3 B27F -Comment: Silas -Comment: Silas -Comment: Silas -Comment: Silas - -mQGNBGEeXg8BDADF5M9eh/otTBDnbLqy8kxEHhlLRsv4wF0qCW8fGWlclAFpz5A9 -9t0Klt0AkB2EK/2EKWmm7J2DD9lq7nlvJurWXZWmcDzRWV6VWO4KftvKnasBR7kQ -3T09ga/jVgLmjGU8qKW2175MLuj+hRNwlc8TiTHrl9b+1hC5dvV6HwIJtvVbpBzj -ZmFGKBCPdA/8j/keq9kBJTJjb6YED+jAJJAHeZ7XyDeCi46MwTR09wLXIrlZenGO -wljtu+Ar+SN5droeeMN1edw9y2YnRg4zQ0lOtC7ylbV6a205B2QxSanMpaEZPX0C -Y48KZqto1Xs1skHrf3PHmRkGDbMil8yhsBlVDZOmKiMjTTEJs4nsM9llJvz0kaiw -Gu1HgMfuKxgwXZ+7qonQ9Td4Mg20hyfaHC8djwP8IEym5NOfLbkifeUL7owe+5fc -HCd3I6bnvHAtfQN2YV/VZN1rSXykrd6YjnqDYhxxlhHnObFnFYJD1M2KIBUwlLSG -BK25hH/eAvBcYq0AEQEAAbQUU2lsYXMgPHNpbHNAc2lscy5saT6JAxgEEwEIAYIC -GwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4ACGQEWIQQv6nvbkXFw -p7jnIAHfGHjm2cOyfwUCZEFu1T4UgAAAAAAQACVwcm9vZkBhcmlhZG5lLmlkaHR0 -cHM6Ly9jb2RlYmVyZy5vcmcvc2lscy9naXRlYV9wcm9vZpkUgAAAAAAQAIBwcm9v -ZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6c2lscy5saT9vcmcua2V5b3hpZGUu -cj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9 -JGRqVWtvd3Y3bDR5RmNYTGF1eWlCWXNocENodU1rRDgtbUctN1lfVl9TN0EvFIAA -AAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQ0FIAA -AAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNs -aQAKCRDfGHjm2cOyf7ixDAC42r59qDyhO7aN0I775O6DZk2KO9YFNhZ/4wmFoPUV -eE15OwgrghX5rQWwt2xbQoC5vt1DOKsfRqdybdRo6PI8urm20/QTxmC+0yNE7yfZ -iEHHgTbdns4DtGpA8nRAdGSKEAGYd8HVMy6ANucVS4aNH04L+294/LSpG2GhMAHK -drsKWZfy51eyaFeVlZ4+Iskl/KD/vkyOeStzmtzKxlyIC66At9bIaqCGmC7u4ClJ -oFaOuXUXvvDvski7Nk//eQnlMP/kUfbR02tws7QcZ+DE8PU82maCBfXn1EWgpnMN -uZ3/91iTiJC70kmer8a/yqe5EFUQuvZrPB49Y0bAvyh7jJpxlMK1Fsq1cI5pa3Al -RFDDS3VpTP4kt80UbssQK5YKc1WvwTJGp+X/7zUwNbfPr/iA24Lj8KcykKywFmTu -+ucC1eETPphckL8Rbd5wYUAE4+JLID4pUDE/pfTggS1hA9G/IgKBNMdDB/MyJuOP -J18VXSZk9yBiWEaHruqBu56JAxIEEwEIAXwCGwMFCQlmAYAFCwkIBwICIgIGFQoJ -CAsCBBYCAwECHgcCF4ACGQEWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCZEFtVjgU -gAAAAAAQAB9wcm9vZkBhcmlhZG5lLmlkaHR0cHM6Ly9jb2RlYmVyZy5vcmcvc2ls -cy9wcm9vZpkUgAAAAAAQAIBwcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6 -c2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJp -eC5vcmcmb3JnLmtleW94aWRlLmU9JGRqVWtvd3Y3bDR5RmNYTGF1eWlCWXNocENo -dU1rRDgtbUctN1lfVl9TN0EvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5z -OnNpbHMubGk/dHlwZT1UWFQ0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0 -cHM6Ly90cm9ldC5jYWZlL0BkYXNsaQAKCRDfGHjm2cOyf1tOC/wIxixV1NRNoYF3 -WMRAF5sloJYD8cM5TeNlkenqkWoGEze+WcswzY1ALfT0GMQpDuWQMI6yYzru8MDn -1ERMHbqgYhAVSPhQXaMJ8jiJVMq04Yjb2uys7c98vsXjoGy9zv9QaYtIFdocrUJV -dL5t+j2wQYK74uXnO+/EARLwJoIeQpq8AwwocxCJ/0nu5VllgOIyut92UHpmNBEl -qestgU/TRAjeT2m/ezyLI3U2Idy+rzP31A0U0RXOZ3cNUDrDYeeQQ0SrWhf9/4ym -wUczJyQLc5cMHSjZ4K7ib8u+1g/B6pLdiLtKHrxqFduPK8cnSAcKF5UP9CE6E7ab -5oNMmSqMDl4ZAmxn28jcvyGEei4oPDTZeYMZdxoOrIaoYw0G2BOq1pqms2nJlSVk -T1aiBW9g6u5b2kbuP9k5YAkB2XLAGWBuz7OXH0ZBmQ4vJaJRD+s3do5USnyVhJGP -CccaTVs2p12ljwawmKtJzmCcHq8RbV0CW2uBxNShbWchNnZrcbyJAtkEEwEIAUMC -GwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4ACGQEWIQQv6nvbkXFw -p7jnIAHfGHjm2cOyfwUCYs8QWDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpo -dHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpLxSAAAAAABIAFHByb29mQG1ldGFjb2Rl -LmJpemRuczpzaWxzLmxpP3R5cGU9VFhUmRSAAAAAABAAgHByb29mQGFyaWFkbmUu -aWRtYXRyaXg6dS9Ac2lsczpzaWxzLmxpP29yZy5rZXlveGlkZS5yPSFkQmZRWnhD -b0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kZGpVa293djds -NHlGY1hMYXV5aUJZc2hwQ2h1TWtEOC1tRy03WV9WX1M3QQAKCRDfGHjm2cOyfzkw -DACj77EpB21XUgzceBilA62zIKXNZMhr1aefibe84aZQh8h8ABREtSQSIHAwBXxO -qlG30bt2fFO0oB8UEIrHG+ahlNfHxbHJZT7xlkuWHRXfV9yHC5vuOUbWLIxJWJzV -xVN7s4VCBYyrfCcLnNbaRv3BiLE7as7ayC8rLcPSr8QicasAEXSr4k4nEH5BkIUX -KtvpW1BW0vEUIshFc2QRYS9gaC9KioojLvmM+IFtHdJ9TQMds6n2zSKG5tR1/fB/ -SZ82g3imLt9bAEG2K70w572CgY1P/2ClB/hkR2rO/OazAyIdKmzuL0ZJTdgKoFbB -A5d7RFCOi8YQhv+26CchNhNhJKcQMhc0ctHrdLEL8x2+dJX8KA1CXQZV6OrVEL2R -96ETrOpJsToseaRvQoanAOXbx/zoATzhBaRIeotXacOytXXEmOwp9wSKIlrNYkDT -rboPyelwgSQiLvlLUnqTNnq1YbUtkPT1Ka5NsmjUwvsTRQzfcnR1fTWWEqPWN1iA -ebqJA3IEEwEIAdwCGwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AC -GQEWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYs8F+ZkUgAAAAAAQAIBwcm9vZkBh -cmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6c2lscy5saT9vcmcua2V5b3hpZGUucj0h -ZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGRq -VWtvd3Y3bDR5RmNYTGF1eWlCWXNocENodU1rRDgtbUctN1lfVl9TN0GYFIAAAAAA -EAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9vcmcua2V5 -b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94 -aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQxd3hFMmpN -VDgvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1U -WFQ0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZl -L0BkYXNsaQAKCRDfGHjm2cOyfwt2C/wMjQNxEE+M03T4SkI2vRlmTmWWcOZiJHsm -SkmAgvo05wMc9LUnTEfWdOpsqTfI1Ud972kuL7g9bqWQnMPq3FGYZHpHRP2rsCw5 -yPwTgjENh50sH6w1yclfvardtca7VrkTHiWqmmEzBrjEeMQMkQRLCCmvWB3d1+60 -qdKL+/ucAdLnNeyMpNWqAuZ4f5XIwHutKqQJWJlQ9NZN03OcaS/oaHHn95xXzXba -rCa7hdwRrAEYpMbYjjjfHhbQLauEhIV5JuatDD6w+vv8NUHBIJ5sXvIak6EHeWEe -UDBsu+LgRiBXJA9orE4oExdIF5LpJvGjZqEh80HFUd+3sBb/9HzaLLFrr2zSYwWJ -WGcb+Ho/ZYl4VC9rXpJfz5kyLzWVGqyDcHLIid7G0rDicBErFG2o8ppxXm8+ekRp -yodwaqHbUp62mhnSoObYJKpVJZoqwQZTVIeGnwAYpcE94e8TjK54DziyZ5ZZ9q2n -4tf/ZPu3Dt+L+tvPlF1VRMLjCCp2e7KJAtgEEwEIAUICGwMFCQlmAYAFCwkIBwIC -IgIGFQoJCAsCBBYCAwECHgcCF4ACGQEWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUC -Ys8EiDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNh -ZmUvQGRhc2xpLxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxp -P3R5cGU9VFhUmBSAAAAAABAAf3Byb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6 -ZmZmLmNoYXQ/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRy -aXgub3JnJm9yZy5rZXlveGlkZS5lPSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdY -Nm5pLV9JOWs0MXd4RTJqTVQ4AAoJEN8YeObZw7J/vAwL/2WvNAlqoRAr6vT/t+gm -O3AoiUzEBZXLgq5aibdbpZENjPiSfZZWzfkIpOeGQSCoDluHLnVrlcQegCAvUiBS -qbwN32X77yOggG29hAGZBxBXvJ/rj63m0B0v60Cfcgetlf6cEO6PPdsZD6VaY/cL -pO6dVHRhD4r53in7XhyzhMhW6PljY2FTFZ2rdZEliQZAD90M2hn+LCXx8rsh3SqZ -RKT88jhfcBXA20vHgagzzdXyaeo4wbWplroz+3nLz3oQDfLLWnihAhAbIHg9AE/4 -dXFljjCF45SjU+8gHpHkHfwWtwLYucOZ5mr4RUVy8hiPyz/1fLxNKkDOvg42tDAB -dIwt7CpFxHfn63GjsRRmNyZoIQhoDKX0BCuHF+Qsr5jIHd1o1o9HpjHicdZV+uV6 -RQedsgbfCHJPZKdXSyxI/SF9jDlXCvG2aTzTXk2vQ7PCZKsFjVFJA7U87zmr0ZsJ -i5axNn+v8JA2hT1xxd0wkVWwg4f3kR4cr6AhK3EFVNTtTIkB2gQTAQgARAIbAwUJ -CWYBgAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgBYhBC/qe9uRcXCnuOcgAd8Y -eObZw7J/BQJizwJUAhkBAAoJEN8YeObZw7J/o7sL/1iaIT4y0FypOhzzUqJzOBP2 -kabeq4iOS99w2wHEiM6xzXoGuRy+lEXZMb94VVUNhJDayTf11OZgAyAJdt9OAyBK -UsFf1AbVJw0YY+384bjbId/oTqngqKIkBH9bpDIfSX5riXqD5SmhwRuuRPHuO+ZT -aM3tdDnSjW4brEub3aHsHPNbBM39u0Q9JGPpd4GhXnmK1iYCQU5ZRErgpxqPtAOX -h9/eIIa5Tv+KbPzwBJ3od27dbuo/Y3OwxfwSuSKieK+xvDHyxzD429tEh+uMP4W/ -2b4GbksC0Z6nNM7FBa2Vq/vKOa6yTGE7bgkudr3tWa5N+x/towX6crgB+5DAByBR -on967FLER6i4Ok9V1hBnvrjXGLgJeNkoxMxiK3UH0ijY9laHO9fd8v4RoHubHxjV -YXJNUm6EUvRPXskpNw5X24dQ3muuLpOVX657Z609ar6jEQgXjeuyqUL4TwXorDZs -4HU1Mj42iFUD9HdIcMqW+/zpKGxEJWFjlg2z1/uX9Ih1BBAWCgAdFiEElgb8dJ/O -FjYHI9StpelAEMOmQq0FAmTEI7oACgkQpelAEMOmQq2x6AD/WrvWuFlewmBNqoLa -AMQb3Hk3Ls3GZdYkpNhuTqSZbs0BAOPNAm00QHD1QQeOsZkuExxgPoMDtdW27qD5 -vfVP7xQCtBNTaWxhcyA8bGlAZW52cy5uZXQ+iQMVBBMBCAF/AhsDBQkJZgGABQsJ -CAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8F -AmRBbtU+FIAAAAAAEAAlcHJvb2ZAYXJpYWRuZS5pZGh0dHBzOi8vY29kZWJlcmcu -b3JnL3NpbHMvZ2l0ZWFfcHJvb2aZFIAAAAAAEACAcHJvb2ZAYXJpYWRuZS5pZG1h -dHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1Zt -U1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2N2w0eUZj -WExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdBNBSAAAAAABIAGXByb29mQG1l -dGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkvFIAAAAAAEgAUcHJv -b2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQACgkQ3xh45tnDsn9K -9AwAlqvwQNhFakWY7i5XmrdzcBj5nHKoxYkCpVEwwEVy/B7LV6h+ZoXadtQzqn3l -BdoSchkIYcZT4xDV/b00bCD9APpu6+Eom3CcBlcxIthoEe6ZKXEImounCS69wkVA -8ItZlSlhyxTRSQzgmAI5qApw/Kh+AmpsEK8W2kY2tpV7fR/cXZ5/pNoU907T0U5f -bpnEgdZFeNUw+RayCELUZnZ1wgl33yADV9WV+nn4N/t1/xEfAFsv5GuNoCrc/BAu -jyaoVS8ULkmioYyUmFHDAwn/SXAIMOL5LNc/4xMt1CkYkRXiEQW+l2UWrGF5hhIY -R6ofOeUgxiw+iDM2vA0G65+OUCTRpkrHFl5d777LFiHEWKKlBKM0of1Cr+roXrPi -uYwDjuC4WYEtcvKG1bimI6MRwoUmjW8yg8E40jidZYOuOVi8HVteg+HeCRW7qmwX -VR1QI+Fp2eRj0DSeh+wwtaFxMHcTRe10UFkJ244HOihydEqFUfPOvwTzuXtZjO5Z -CHQPiQMPBBMBCAF5AhsDBQkJZgGABQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheA -FiEEL+p725FxcKe45yAB3xh45tnDsn8FAmRBbVY4FIAAAAAAEAAfcHJvb2ZAYXJp -YWRuZS5pZGh0dHBzOi8vY29kZWJlcmcub3JnL3NpbHMvcHJvb2aZFIAAAAAAEACA -cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94 -aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlk -ZS5lPSRkalVrb3d2N2w0eUZjWExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdB -NBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9A -ZGFzbGkvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlw -ZT1UWFQACgkQ3xh45tnDsn8fMgwAhHfRuMb9ayKGl0Kb6by648KHe6NOHKLTrLm8 -5w/cIBrW2s42rSZdybeVNA+AnrtBvRD/yQ7idji5FS0nYac4lbZ+oLNCUc9sSvZW -DgWsXaYs5ujpR1ftYd8A0AytsBvrGczPrclMV5HjuE11kilYXMwNqiOX0hXZ3ewx -O6d3KAYLIgajVH7SOgnexYs5Up7QO6osrFqRwokCd/Yx2usEap7jDajjeXQTNdwX -e5RvKmYND3jYv0hood7IvSWeJHhZ5DIRQ9FpOt6PxiBzrEx8YRF1KbtniMTwf8fB -Dl6eAo89I3WjT8CwQryeQ+9a+15WPQyLddEci1Vj7Etbmk6NfMmaUnm+OOOyeDz1 -0JYxPt4H32GYg/gGDZ7FxKG3gXHeCO2VptiS/VxCw4+EkVt0EYqWk51JGBNkOOL/ -8SMRFNNOah6xKR7hdPLmS69MqNvJGR/R0uJd3B4cF0ynLYFZRTJ2WH6nox0oXihB -TsZxnPulkr20RdS2yXRfhfiouE2XiQLWBBMBCAFAAhsDBQkJZgGABQsJCAcCAiIC -BhUKCQgLAgQWAgMBAh4HAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLPEFwv -FIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQ0 -FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0Bk -YXNsaZkUgAAAAAAQAIBwcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6c2ls -cy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5v -cmcmb3JnLmtleW94aWRlLmU9JGRqVWtvd3Y3bDR5RmNYTGF1eWlCWXNocENodU1r -RDgtbUctN1lfVl9TN0EACgkQ3xh45tnDsn/wMgwAjNJsV6KyVmL5GtytbvmEPHDH -s4Z8yS0BZF7wJr2u9QGQxjO/pthpGCnb2PNKUfLcXxXTUO9EZD8x9jV+WqaV8gL8 -h1zW0fWWpWL6hxwloAenmJCwydjjbWnpf5I8IUkJoliarNvy3f2dYwurus/G8Y1P -YoMHxQBGLojM2XRj97DxuVgTTpbCkTeNyot8PX9BMGcBAdzccExW6NZ07kpgILfx -hlVUNr/R/kRijf+kxG1WclKtKmzti9xjB8/00NgKUNnIyl9DC6vkZBsudIOCsopa -cu1c4bpVLtL0HhZfXfAaiHV/GmGpa9Sdv3PlP3N0UGPMNMNAET+6TUMzPYeXT9tC -0ppHKbIOqOx4qeHQMmXGv5YRTt4+x/HQleVL7vDOOasJu+YcFYaxfX8LVjJstTKh -bxR1PDHA3Rhvt6zulgHh6OE0seNTuMXzvKwUG2SBbRrmJtzQ7k+C4bKPolidPGfY -Jd5v/gzlRky4Hyoiqlg3Mu1smZxYqdA8rw1+wjaXiQNvBBMBCAHZAhsDBQkJZgGA -BQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEEL+p725FxcKe45yAB3xh45tnD -sn8FAmLPBfmZFIAAAAAAEACAcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxz -OnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRy -aXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2N2w0eUZjWExhdXlpQllzaHBD -aHVNa0Q4LW1HLTdZX1ZfUzdBNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0 -dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGmYFIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5p -ZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29H -Vm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGhLOV90RzB1N2Fx -VXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQxd3hFMmpNVDgvFIAAAAAAEgAUcHJvb2ZA -bWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQACgkQ3xh45tnDsn9tmAv+ -N2M+eK83AcE4EYbQiAmDlP6PJAzRiryYErTRO64bhq06JXPz7QvIVbsML6kou2hg -j51E4721EKS2essVlRqYf/5d6IKBjakEbgk3ta8jkc+jSSP7ARAjCWU5Qzjttucq -6Fs+uaQ8Xwdb9SamL6MmR9TSifVPxFm8n14jj4JUuXlpZWj++TprgDzz9hbq5ijE -LKYOaenSK8/OR6fzXgAF4+3tRwZRiNzf3Ui+cUtF+gP2b9GH8R7L+7bkMJ2MYkT6 -i7LShScXOt5htTva3lZ1ekFCzNhPOd+ubvDRfnJ+Jqmk9KaK/unb7c9N5vr1Ures -QFPIk1pIMy3PayWHgzbYmKmjEDpGiBy3ShKVMu9Fwx6uPiD16eHvc8VisuWNlDlI -lRK23lZKVJ27RdfIh892b5Ywn07J8CC5XSNl7M3cCsnXR6P/8/es9eLAyjip7QIe -pHW608TIsKtiGBXTamt2lIcrFZ5wCs9HUfhuBopxU5OzxuI4Jq74oG611n63bo0u -iQLVBBMBCAE/AhsDBQkJZgGABQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEE -L+p725FxcKe45yAB3xh45tnDsn8FAmLPBBIvFIAAAAAAEgAUcHJvb2ZAbWV0YWNv -ZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSYFIAAAAAAEAB/cHJvb2ZAYXJpYWRu -ZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9vcmcua2V5b3hpZGUucj0hZEJmUVp4 -Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGhLOV90RzB1 -N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQxd3hFMmpNVDg0FIAAAAAAEgAZcHJv -b2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaQAKCRDfGHjm -2cOyf7KOC/9/5NPmpyBKBr0ZcHP42VIS/88luyWf9qHttfw8dhhKuHIbqff3HwPo -BMmpWp6WOLtamoAAAUVkrzs2UtFGBs0W8iECOax8Qr5IU3qKSj9IFK5umt2NkTMP -6IFZ4UDWqZWZaH+2cWRdS/SgUJh3zxGIWJYkp2oV4yQQqKm/ZBRFC+ek2sI1bpoL -qf1xesOtBsorKFPKaJEG+0uEsogxczukpTq474bocRhFWNhQ7skNKVLcwo3uxmot -rxXPxj69RbIxhSPsQGYeq3+k/rEkptxng145iY11zalvizXzODVbjvjXWaewq+RT -n401oW3TchjTq8j+2e+ZcWyQAuFW6HrfpSMdUPDx30LXPhUcN6ba48KXdM5Lxovy -dGMixs94uPzYAQbGPK6LRRywXvMsEBtf+hihxzldDiuR8STTmtP+6YWsCiUOHu4C -QcLFXbH+5SBwUH0GRkqj9oZQr8rOsQjVfFnnyt/1v0qO39/46WOMeL265K/Ra6tQ -O36bn4SUD9OJA1wEEwEIAcYCGwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwEC -HgcCF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYs8CzTQUgAAAAAASABlwcm9v -ZkBtZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpmBSAAAAAABAA -f3Byb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6ZmZmLmNoYXQ/b3JnLmtleW94 -aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlk -ZS5lPSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdYNm5pLV9JOWs0MXd4RTJqTVQ4 -LxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhU -hhSAAAAAABAAbXByb29mQGFyaWFkbmUuaWR4bXBwOnMuc2lsYXNAZGlzcm9vdC5v -cmc/b21lbW8tc2lkLTQ1MjE0OTk1NT1lZDhlYzA1ZDNiMGZjOTc3YjY3MTIwZDVj -MTdlMmMyYjNmMDk4NmJlYzc4OGI3MGE4YjhkMzQ2Nzc4YjhkODMzAAoJEN8YeObZ -w7J/SD4L/iUm43LYEZVG6G0RzfZxpP2L2JwHZCuMQGO364lmV5or0ZtQQERimXF3 -e+xCgqvx3Yb4nL6W0tVi75DFLJOBSnOshFnKXms/ufY065en9hiMBS+BmK6PlrO8 -6iwiefFMvSAlkmDp8KVqhOAB5P/i27C3Vd5uhLqRM1EEoWbgCxlOpaOnwBwNq+V/ -kiSaZ5o2HrDDGh+9ecpkEouel1H1qp+EvEL5BgreSLFG5OWDY0SNA6A4l5adM0u9 -PC/15DdCDRmJWcRUcb1Kqa19tuZezb3oPrVHVI75LhzKlf3eklDpDfrF8kgJGhvs -hcaeFWifyFu73aloYivM3ZY8uMUz628MPBJ5n1ud1RkORYSbbfDsDqwekAWsBq7i -WS1oymWMo6F/95DKFeJCzv2GMpZfWBLFvFH8/c7v+7LgboiwoTenlnZdAYaQMFsi -mXfG4+M/iAI177aPPRuU+1Yc4XKG3UeIUVmZkw8oYzrfNaIGdGeMXiZ/O39Eoasx -/a0NIxTLBokDowQTAQgCDQIbAwUJCWYBgAULCQgHAgIiAgYVCgkICwIEFgIDAQIe -BwIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJidalDMRSAAAAAABAAGHByb29m -QGFyaWFkbmUuaWR4bXBwOnMuc2lsYXNAZGlzcm9vdC5vcmebFIAAAAAAEACCcHJv -b2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOmMuc2lscy5saT9vcmcua2V5b3hp -ZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRl -LmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5b2QzWnk0bzMtREFjNk5melREU0Ev -FIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSY -FIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9v -cmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3Jn -LmtleW94aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQx -d3hFMmpNVDg0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9l -dC5jYWZlL0BkYXNsaQAKCRDfGHjm2cOyf1ZtC/9QQRWfVfBJwVV96P/bxqkQTlNU -HZNzAJ3NLmY9VmwQ65Y6g6feVMPle+f6QGR1qg/7BfWre6ZgaIcp9wfQKwV8D2a/ -9EzdwLbE+XAy5NTdIaXriqUdE4A2Wj1ga3HqnO11JYOAcZS2I71ieQkYgiQnp1RK -JZYXuJHXoi//fd6ZbrZxyM9lneKovac1qqb8nFM85E27H4kJ5k7kC9jdDzqeRliH -Dbz7rubFWYsUrEER7uM8+V/fs+GNWsg/5YoEHIrrtmBjq1LCpu++r/Jtlp3/ik+d -uRC/Z5Z2nypkrtq91p1gMBUkDqu5cTPywIZV5YNO4jaN+AdEJk1pB4plTJNa70vW -9mSEHPgomcwjXRrO7jsJAaei1bkKgSY9fC6glvAmlNt4lzlKiOBzPmyxoq6GFv1J -TGnd8kpkBEi+Xcenu1DmUCHcrq/2sFj9UtnonG71+Euhqmdqbx7jSSuilDyaULSC -KZFixzL/s+YO0P8O4XbiOTNzdq9bCJwNDxvt8TmJA/gEEwEIAmICGwMFCQlmAYAF -CwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOy -fwUCYnWhUYYUgAAAAAAQAG1wcm9vZkBhcmlhZG5lLmlkeG1wcDpzLnNpbGFzQGRp -c3Jvb3Qub3JnP29tZW1vLXNpZC00NTIxNDk5NTU9ZWQ4ZWMwNWQzYjBmYzk3N2I2 -NzEyMGQ1YzE3ZTJjMmIzZjA5ODZiZWM3ODhiNzBhOGI4ZDM0Njc3OGI4ZDgzM5sU -gAAAAAAQAIJwcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6Yy5zaWxzLmxp -P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZv -cmcua2V5b3hpZGUuZT0kMUxSOE9PNDBiTDY0MDdpZmYwMEo4ZzlvZDNaeTRvMy1E -QWM2TmZ6VERTQS8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6c2lscy5s -aT90eXBlPVRYVJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQGxp -OmZmZi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0 -cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFVd2ZIdndzS3dlQ1hX -WDZuaS1fSTlrNDF3eEUyak1UODQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpo -dHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpAAoJEN8YeObZw7J/1wML/AlJqYj6jMvV -VWF0YYLcL2zzogi7bvpIjKDOPYIKSMI1mKGYvz9M7CagsY/B/7FYX5ZaAwHV65xM -j9bm7IUwtB7krxUs1MGRnN/lyAMdphyuC6k1RptMmYoAEQwLizg8rbiq0fq97o/P -UVTWKpVzYart6g3Bfbm+Bya93IW2Wmx6hsKWxKT3Kvcrxb0Kj41aHtrbXe9N028P -6/ujKzRpq+CaNvIAcArVwMRqIFYLKYMH0aQPjVqhRIW6b3hcZmza+ZmAc5bPcUSH -zemvnPLKjlQVb0xiozG8EYTLU0z16NX1jwQao7HZyvTZSMj5ExDbqEPYH08apHEz -JjiyoFHsCvWIWpt2kvE4TG9xdGhgTf6PnEF6RCVsMDK8aQSqDQImDG1XHZImrHDY -4Dr6Adgk5PRkU8fEQLpJZBTWaH8HGtM+7F+nIFf2M9p28PZGSkIvKJaLDrT+eGoC -4WA9IByrzvukOEr2dUM0EIuiTeArBDN7AZXkeC4+SAWpxfpNhJxyRYkDcQQTAQgB -2wIbAwUJCWYBgAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgBYhBC/qe9uRcXCn -uOcgAd8YeObZw7J/BQJidX+UNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0 -dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGmYFIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5p -ZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29H -Vm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGhLOV90RzB1N2Fx -VXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQxd3hFMmpNVDgvFIAAAAAAEgAUcHJvb2ZA -bWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSbFIAAAAAAEACCcHJvb2ZA -YXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOmMuc2lscy5saT9vcmcua2V5b3hpZGUu -cj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9 -JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5b2QzWnk0bzMtREFjNk5melREU0EACgkQ -3xh45tnDsn880AwAmlIzYs0RqDgofVK2qomwiufi/ClVpI/QTIfrUf3L+XznXeC5 -Pj4882XPLd+023pafdf+ih9Q7TIwyBdxuQVZniZb1/WYT0LfYjOtOPImUpeuySUD -FAOrxSHNTQ7pCT+2sX/Bz5uK3JMMgh2hKHwJdWab+44ragMPo6htxVMhOViIo5Xy -E/J55TuqrSezDjnQingBZQYBbibHOG6gleGunHVelvtYadNsWjrMBhTvTigueUUn -HVC59uyyuhLLfdHrK9nKA8l5lYnvod7qNJOYq7mQnOd2l63rm5T9YuS418p2ci+l -SzHhhugm1PWHlmGqdVtbBNm/v3iSggK7Lzd0Bnrb59lcP0fDRiQBGzUIeM+mxnV8 -Sd+v5RPGnmYJXu0A3YdwvdLJ1YubejYZjMynTMnZmzltHA/g/iKgdWoR7Z3/LjRs -j2j5mIEpwGlRmsGb4ZEHSWAXJs7ZtjzSrVbYwCZ33pxtrnuRAaHaJCFdVmMIG5mC -2I/fxzcJPF6OLeV7iQHXBBMBCABBFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmJ1 -bRMCGwMFCQlmAYAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQ3xh45tnD -sn9YjgwAnpzuJiD/WqVpx72l8kvuGc50IEZVaLl/DiGHG0P02F8DrNjtDNpn42ZH -2Oi2vEr9w+WcAZp5uL7PI7x4qN8CVfKxAhFuOhZYL29Fe0mTYW7UDJF/kpU0PRTN -4hmz3Hi/dTnKwa0+nY57KF/sIpnocrnDXMF44zqohezR80abym8EHMZFomYyWLOo -wpxz9q3ld/+sjl4zD0uUkECilU1TQD508WO85fpXle2hOGvSWi8bRSlNfjNg9+/7 -PCrV1z8JN5VAAvGviEMpnAsTSPbGmSNJxcNKD3NveYag87/tKBROEd1VWELT9ReM -/jRzVFbbF+YNPIf3YIabOpGAJl0axffetVyTlzlHjX0jnvtHLi7nwDAJvVQB70wo -fVTIR+8J9LOwaEMmzS9ghqDT+aeXmrk4Kuet9stpQjGFJSJZ1dD+83Amu1Ip+BRE -eBv3EMrEz93CMQCYGzOR/XezAda8OlblTWcyyIdGS31CwCHxThz7VHRcBSni4hZZ -q0Rmceq8iHUEEBYKAB0WIQSWBvx0n84WNgcj1K2l6UAQw6ZCrQUCZMQjvAAKCRCl -6UAQw6ZCre3AAQCtEovfpCXUjiTypjnzCpke9rHIBnAVODTm93AAZ3BS1wEA98iA -skdHe9liLwLn9lA1BB3TRqZ6kjWMulKtp7U8zwy0G1NpbGFzIDxzLnNpbGFzQGRp -c3Jvb3Qub3JnPokDEgQTAQgBfAIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIe -AQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJkQW7VPhSAAAAAABAAJXByb29m -QGFyaWFkbmUuaWRodHRwczovL2NvZGViZXJnLm9yZy9zaWxzL2dpdGVhX3Byb29m -mRSAAAAAABAAgHByb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9Ac2lsczpzaWxzLmxp -P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZv -cmcua2V5b3hpZGUuZT0kZGpVa293djdsNHlGY1hMYXV5aUJZc2hwQ2h1TWtEOC1t -Ry03WV9WX1M3QS8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6c2lscy5s -aT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3Ry -b2V0LmNhZmUvQGRhc2xpAAoJEN8YeObZw7J/AaIL/0TLONGoB6BBR0/ET3Zh11Uo -+3ED8S5MOqdk27GTlah/s03RFnETyKBSHVoyqW/oIAQl88QRrdAzuak3OpZuoxRX -Ras7mVh8Yv71QnVmvex+MmH0MPfWEP73qKdSMefatKJopVR9g0fhSeWGImmR1E4Q -37f2ORzx2he/0obcwVtWRPupZhQ5iVsseRTQOPmgt82+LV7/dQPbOGw9oa9fizcG -7ZtI4hkJn8SSNzRwt3xy/I/rF37RAQbwqxVI+EZ9bkjbssAy3QBRVtp8vJZABrcM -F7VCtLKrWiofW88LW7KnVgSVUcIZ/omXCOOia/Q5jdVMKEAHxvS5rKz9EgH4b9t+ -94gFa4yp2CUXWlzZldyyOf6OWjYdTMMPLQmmghhsIu91aIK4DM8MEg7fsgDm+X8F -bRG597KjJRrFCxcrEpqn4RjiWa+une15A6FNjMfs4UAxUyz8xakjog5aoEu8JvDp -LipXM7/sO7p7zxDZU9dAypgsC2XiUQDqOW5hKwd224kDDAQTAQgBdgIbAwUJCWYB -gAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/ -BQJkQW1WOBSAAAAAABAAH3Byb29mQGFyaWFkbmUuaWRodHRwczovL2NvZGViZXJn -Lm9yZy9zaWxzL3Byb29mmRSAAAAAABAAgHByb29mQGFyaWFkbmUuaWRtYXRyaXg6 -dS9Ac2lsczpzaWxzLmxpP29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpm -aXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kZGpVa293djdsNHlGY1hMYXV5 -aUJZc2hwQ2h1TWtEOC1tRy03WV9WX1M3QS8UgAAAAAASABRwcm9vZkBtZXRhY29k -ZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBtZXRhY29k -ZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpAAoJEN8YeObZw7J/dTcL/3Qx -g/pZ6syoO8y4U34wGExBFQRKknpZURr5DXyethMlKh+x/CVZ/NUZFhlzs37e71fq -rw0Yexcgro8676x6Tq/LX982MGO95sceeHz3hiiqw93LgZLw4KdcIg3JLL2VwywK -Ls5JIPxjF/zXa2++QV9euPrvWD6PI0fZIFghVD93S4Qfl9XpJyJ6IEC04OKf7klv -/8FqFqKuRBPPsLXPH3VckC3VrcsNUPppD3ZUHdpQRn31IOkDWC5t2z0w5kJutSSZ -1HD/u/04lElPAL1SDBk7bYzwMs+TkJ7oRgZTCwA3e8Ikfzrt032WRO6PAtX4cxeZ -/OtkuokSmSGhtXF9lo64qCOkwfw0uJIgTFV9k2FIB4WpjdaYs0rCaCpyKSp3Yg6a -GLq6pRuNbtfaY8kjUAfDOp9+NBgocAojoqd2nK+/wroo81fps5bM3N0V1qNgsTQL -c3Ar1nK4aPdxBLwHtg99/S3hJA3j/yG+gQXr+3ewH2xcS821QTLXpmd00mP+kIkC -0wQTAQgBPQIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBC/qe9uR -cXCnuOcgAd8YeObZw7J/BQJizxBbNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJp -emh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkvFIAAAAAAEgAUcHJvb2ZAbWV0YWNv -ZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSZFIAAAAAAEACAcHJvb2ZAYXJpYWRu -ZS5pZG1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFa -eENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2 -N2w0eUZjWExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdBAAoJEN8YeObZw7J/ -l0MMALLTO4OycZTBEuhm66itGT8Az8xzj1y/A30DUBA1QoQ2vtcaFXeZe/pP/qUq -wlXmgWgpIUu8vKvY0OzNq0lt/WPGazdYdDFZJARcig+vmVMRPasNqU/pi5QPkpjj -as9EtwnHrn8Fh+lklw4Cty0FIcCjPVv43y80k9fZt4MyF1cktG0VUO6ASC7ahHW4 -MEQYqB6D9IehQdMLOEDAazVadanSXMAScN0Pnkxvd1FoS/Jubk6lLMMwul3Oihyy -nZJQtM9GgP1l4p1xpBO3AoK2xPvAaqCKuMIKFY51mK5+/rxU3xsZMyRJQWzy2p+s -m0RV/libGmG5bGH1S+UTd3BcR747JO4C9QkhXfhAagsA6iz0z2mXNxhaGhuKKv0o -orLU//ubYfJaMLR2sWRehkuWVlhAMHZ0yF+kFW5Wb/qOAm5tf8ILX2XjbrU03MIY -v7KMAY++6dB2SYJZTtOBDIjKmCyZisYFwszttb740gL1KsAxM6xsHpIOfUaljZu8 -WSV6hokDbAQTAQgB1gIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYh -BC/qe9uRcXCnuOcgAd8YeObZw7J/BQJizwX5mRSAAAAAABAAgHByb29mQGFyaWFk -bmUuaWRtYXRyaXg6dS9Ac2lsczpzaWxzLmxpP29yZy5rZXlveGlkZS5yPSFkQmZR -WnhDb0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kZGpVa293 -djdsNHlGY1hMYXV5aUJZc2hwQ2h1TWtEOC1tRy03WV9WX1M3QZgUgAAAAAAQAH9w -cm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQGxpOmZmZi5jaGF0P29yZy5rZXlveGlk -ZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUu -ZT0kaEs5X3RHMHU3YXFVd2ZIdndzS3dlQ1hXWDZuaS1fSTlrNDF3eEUyak1UOC8U -gAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVDQU -gAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRh -c2xpAAoJEN8YeObZw7J/DUEL/ilBrutKMPEdU6QwtayjwfE1nBwhRxK6LNZaNe5t -EpH1YUS+Kg21gdVFhkSD34UNwpdqE2TdeRe1cLrm18+QDgRzaM+nkQzZmYSTFEa/ -q5IVudDqrdNAimYyJsUBDRVErBOKPDlIrcsZ9FYYwXDsv3fANBhGlMLC1ahQECu6 -bP5Y7Lx+GaAvfywoGAqZkqUmfOAvYvb2pCFQSZxc9TNua6iisyVgiuvNXt/GnrEG -+lLBRlPfG+MdXpYOTkxi9xuszbvAaD6Ec3TKj66fp0tFQrwGtmuGyJcKxv3pcA7T -Jcv8rtaAAqYQQ8G3U2GPIfche1ty3Q8ECSj9faKw9gqJO3WNpyiryB/2Ig37No+4 -3zzdCrHE0NsHDGwTBDRAx1L8rxWBZtLvTKquQntDmXj+M/xLb8nZ+x9JZcVf+3QE -o2q7uOaeqcOeJWOTLEdhjR4ETumxPTAvyszgEzwPH5foZBQXUJbXeoIonqm4ywPg -rsIfyXbsoOIFOqiwph+M7ET684kC0gQTAQgBPAIbAwUJCWYBgAULCQgHAgYVCgkI -CwIEFgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJizwQSNBSAAAAA -ABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkv -FIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFSY -FIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9v -cmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3Jn -LmtleW94aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQx -d3hFMmpNVDgACgkQ3xh45tnDsn/oSQv+PhwDVpYgAviMduLMZ8wLMNUYHsGXTwpJ -olCmnc/aMpB9GBM7FdniI2JiAP1Ln45QjABG0TEOrf+/FkSDVcYEz021VRpq3rPs -q2y5PpVc2PA0Y7pE6kpNE2hvd8jHJDFVzyukJInNiLXSbWk1aNes0yYACcXLKnrz -mkBllEaEsVohsfIzQVKWCypZHQbm1WOhTsh87jRWxA0bs7ryK0jPfx4oxOFqB8M2 -LkM84hODNrnoXyoLIMcJpT9gsWuoVVzWhwQzHg26ihXO8IDabIcoszJIZ2z2DBW2 -wTKqFMTMN6ak09OrTbI+g5Xy5rBaCHyCLHstXZt0i5iCNkwQQG3BgYA7m1eIjqKG -ykWQ42ACq8SJWp8L1eslaJVGrJSClCSgd8rpIqcXZLSqNwdlE6NxtQpn0cUrJihg -7X+oRbSFzHUno/ktn08P1gn9EE7vogLHMRMD27VOD172NyTu3iivEVnYcpFGfiRV -k0PGIwna+/DFJNuG7agUJs2Fv9IFgufpiQNZBBMBCAHDAhsDBQkJZgGABQsJCAcC -BhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLPAsqY -FIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BsaTpmZmYuY2hhdD9v -cmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3Jn -LmtleW94aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3ZUNYV1g2bmktX0k5azQx -d3hFMmpNVDgvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/ -dHlwZT1UWFQ0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9l -dC5jYWZlL0BkYXNsaYYUgAAAAAAQAG1wcm9vZkBhcmlhZG5lLmlkeG1wcDpzLnNp -bGFzQGRpc3Jvb3Qub3JnP29tZW1vLXNpZC00NTIxNDk5NTU9ZWQ4ZWMwNWQzYjBm -Yzk3N2I2NzEyMGQ1YzE3ZTJjMmIzZjA5ODZiZWM3ODhiNzBhOGI4ZDM0Njc3OGI4 -ZDgzMwAKCRDfGHjm2cOyf+tmC/49Gj5whhg6NM7gjkzGrkdG2gFe4CYeGrqxh5sr -VGo6iFbLug+fVF4N5ThBT/weTyVTCwZ99E+vKGK6JmrizMlgis0kUB/ne7N+Gn15 -THmqXPv5KwiNqUAjRfE0OluYQ6RKe6irvRuJlYqdM82RL/z1BLhvHSUIRFJFeBNn -QWe92EdpsC4AhxKbIsIqy9KeS9CQkyP3K/FIf9tpxT1ne/xNfY0bMqWGMKouC0zQ -43FbdBmCt5qNpT+Hfgd2uVu2SZqXTBQlhnqlHiySzOtb2eP+pEMbMB2ms6YBzE7U -gnGeny8RtpIkkIROIpy+pZObX65SbZLCFwbebqmIRCLDZLxJ6mB63WW3A8Jzvt49 -fvlnd/o9e7h/GB1xgWQP3ko8FIhJ2kBEl6ErotxdQCRvjqPE1qGDmYrt6w+DOZmP -G3/jd+E1/fUca16zm1HCdn5yDzOrhoeKnJzokSjQtcuMXJ+bLRGwGlj00ZYkEWUE -sncVNw41PPC92Zh26EogFgGNqFKJA6AEEwEIAgoCGwMFCQlmAYAFCwkIBwIGFQoJ -CAsCBBYCAwECHgECF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYnWpQzEUgAAA -AAAQABhwcm9vZkBhcmlhZG5lLmlkeG1wcDpzLnNpbGFzQGRpc3Jvb3Qub3JnmxSA -AAAAABAAgnByb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9Ac2lsczpjLnNpbHMubGk/ -b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9y -Zy5rZXlveGlkZS5lPSQxTFI4T080MGJMNjQwN2lmZjAwSjhnOW9kM1p5NG8zLURB -YzZOZnpURFNBNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJv -ZXQuY2FmZS9AZGFzbGkvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNp -bHMubGk/dHlwZT1UWFSYFIAAAAAAEAB/cHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1 -L0BsaTpmZmYuY2hhdD9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2 -Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JGhLOV90RzB1N2FxVXdmSHZ3c0t3 -ZUNYV1g2bmktX0k5azQxd3hFMmpNVDgACgkQ3xh45tnDsn8T/AwAkA2/2uLfZCQE -jBZWKTJmZXO7XYSsaABcZPZYyjeUkwdRzFqX61cFD2i3R8kZ7UAablHunDYQmkRe -5S0Enq7GgxEE+qQXFyFJprPpI09gedkigsF4mGrGKooG0Kf19PH2yrZ6klERmmuE -mqbkeJUxh0iBM4snISbzFbRnUtMWS5hXbiojggqQMen7Ht3YF8Sv/Q/MkGfZBMUR -XmwVWeDSeTXqPqcB1QloxFeDvFxNYNcq0NdhgUHFTDfSHJT/IF6bIuG+yALqgLAb -GBvAFf9PcyHw0HhD/wcXjLYPRBFdi80yQhoKC0tdOwFsJLv2zHYf68nKIiKvdTJQ -6hz8tpy23L/usYR/3zzAk0xsPGubHKiSio2tKU/dgBK8QElt2krhzxI1DtIDBHhk -FmFV9L4vlhXLmrXt8seubOpecDK97YQ4k5nfB3kGqxARTcbeihIPeibTZznPWPax -EEoYue0OHh5hIiyTQpnrTVp1Y/Q1F90MdWWxi64UiGYrcYJpCdCciQP1BBMBCAJf -AhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB -3xh45tnDsn8FAmJ1oT+GFIAAAAAAEABtcHJvb2ZAYXJpYWRuZS5pZHhtcHA6cy5z -aWxhc0BkaXNyb290Lm9yZz9vbWVtby1zaWQtNDUyMTQ5OTU1PWVkOGVjMDVkM2Iw -ZmM5NzdiNjcxMjBkNWMxN2UyYzJiM2YwOTg2YmVjNzg4YjcwYThiOGQzNDY3Nzhi -OGQ4MzObFIAAAAAAEACCcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOmMu -c2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJp -eC5vcmcmb3JnLmtleW94aWRlLmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5b2Qz -Wnk0bzMtREFjNk5melREU0E0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0 -cHM6Ly90cm9ldC5jYWZlL0BkYXNsaS8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5i -aXpkbnM6c2lscy5saT90eXBlPVRYVJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlk -bWF0cml4OnUvQGxpOmZmZi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dW -bVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFV -d2ZIdndzS3dlQ1hXWDZuaS1fSTlrNDF3eEUyak1UOAAKCRDfGHjm2cOyf11LC/43 -AUh1YO7yDyoMCoGgqxdcXhZ+nneT+JKw6vCPvJdCjRv45XIDmQaQ7wgiNtl/I5kN -RtIbFZ24/u6NWfv6oXxE3egTSoy7qTct7Faw8gFSsvy9zshHH/g4sg4qgRU2nFYF -XiObqvoxU5xq2sdSNR3abqJUJQ0KinHPa59wZkKcvn5F5ZT/+6WjUueTr+jmVVoe -zOU2jhSvr14J6lsne4WRnLqXco/0VeS0vjMbBRX/MYI0mQ4w/8YyrUTMUMAZQVLQ -1oO7V34y1a8jBqeEwnSm09JW8N8VLII6rJh3qUVDrWzLB7LQ6NRkXrHjRjjLSLcU -+mKKPaai4DGZjX7ruQ4GT1+zbP9vvmfsFTnfM0HQTd0GSFFQ/XTBiaadKiX2N75v -ANL1slDWr09vvW5HosE1Tuma9U+SRR6DoVnIIFy7q8uJqQavsSK5sdbhk47W71s4 -IAVTy3u40xawor2cn8N8i6q6mfOJQOqULaRlP6uzVFJn3JEwFHuKHvgIpGf3nd6J -A24EEwEIAdgCGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQQv6nvb -kXFwp7jnIAHfGHjm2cOyfwUCYnVqlJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlk -bWF0cml4OnUvQGxpOmZmZi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dW -bVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFV -d2ZIdndzS3dlQ1hXWDZuaS1fSTlrNDF3eEUyak1UOC8UgAAAAAASABRwcm9vZkBt -ZXRhY29kZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBt -ZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpmxSAAAAAABAAgnBy -b29mQGFyaWFkbmUuaWRtYXRyaXg6dS9Ac2lsczpjLnNpbHMubGk/b3JnLmtleW94 -aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlk -ZS5lPSQxTFI4T080MGJMNjQwN2lmZjAwSjhnOW9kM1p5NG8zLURBYzZOZnpURFNB -AAoJEN8YeObZw7J/Kb8L/Rhva+cHBUgeLWD7iSueBrV49scAVQMWSGF3uVjT9LPz -hFH9BIiHAO7LXRAffoHoqVdi5YHVMXZ7AK51cg3nvstdfJT49YjIt6dbgrjQsT2J -kWMbf34kIpc358wD/fWBfXPCHgtxUVMN/TY3Qb7R77u9EyH6CZ7kLtGNRCf0XSyC -IhkvOCswJamCBk+GfJPx+y2F9KC3VqqEUQUPZiM8vzmKwZRdUlKcXoJIgKz6k+fu -c9Fw+IBZq8ZFKrGYMcV+i3IxzhUAgpREm0AoE1Qjl1iGyOkJ+g2htpv80EdRMEiX -UqdDa+5dkcP9wRUaPvFC+RfP8AW9pzbvXj+WXh4k098sjJFMM6bQHCI7LgMS4lhK -9ltCy1Yf5mh5ZjNxYDk288Lqtw8bXVpwUAXk65BAXceP6wvxmG6r0olZzS8kivPL -JTUZPXkEi8nEHIUXO9weoi5jIM2QvoeM5mb5cE2YCbwmjwIANZNs4ICdps3dMOhB -Oo+r+YJ2Sf9xCfkZsCdoqIkC1QQTAQgBPwIbAwUJCWYBgAULCQgHAgYVCgkICwIE -FgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJht3+AmxSAAAAAABAA -gnByb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9Ac2lsczpjLnNpbHMubGk/b3JnLmtl -eW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlv -eGlkZS5lPSQxTFI4T080MGJMNjQwN2lmZjAwSjhnOW9kM1p5NG8zLURBYzZOZnpU -RFNBNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2Fm -ZS9AZGFzbGkvFIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/ -dHlwZT1UWFQACgkQ3xh45tnDsn9PzAv/WJERGb3uRMKyh5dlhsg6+LttnkjHLcK+ -hQd758VrCirHOTTg9U3Pr/PIPclRfEfk0q5YIcfm6tl5Du0CBYcQkQesZKaLy9KU -WOq2QCvNy2SqNwcpDtKogap/H82892mFtRO5+Lap7G08cXmSjJNMN83h9w5iGI4g -ghPZFEr9lGmz4ichUEXqr+VkJ2lIT5hdeBZitoIqB0/547BRec/dApkv/+Hd06sZ -xynZDXsdQXqNBzpYgdDm25p8kq95CFnht0rBBCfhwG22kSUtI8VMPow/PJVRDRKn -GLlMhhy+x/LFoGZQHDXXApbv0RB+93vbBccm2FpkKwGpdA4DcgChIsRiDL/ZnAPi -mPe2exaTKv6UkVFbPbj0s1K/au8msRnr2oLzTkUVWv5OdkBInj4ntNiJCZKBnCdH -UPwsChLVIz1gcyh0OHIGdUGY9VExcFgYBuEgzVsX/FFb5APlfiPa+OXc7/0g9hDc -o2jDxcgrCEGhU1U1TyGk1PCwQxCS9SlmiQI5BBMBCACjAhsDBQkJZgGABQsJCAcC -BhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmG3fkYv -FIAAAAAAEgAUcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQ0 -FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0Bk -YXNsaQAKCRDfGHjm2cOyf+eXC/0TmlkUhH996p6/33ybxk1Wx3dL4qtD1IMhGTcj -bTUfPjbOWRV9mqYONTAA9Kg8cNzhAwwXaEEztCVTFX7/Hqt6fpPc3tTwFFfgQO6C -cRaMgbUhSHg0gN4MatbY12mWrMJNVScI0XLNXRmP6Ow8G8RzpYl1XdLPYoWbmL7e -iCk3yO8WiFkpFpDkO/im7AKI3m3XLOwEGn424P4qW6P4LmRC8XV40qIDZzrh2Dxq -XMui+hVLN41xYkaZcI5Y0LRW227hkqMFypkh3Dpaimz0QosnwtgQlm/+J8zMHDyj -k2oLYpEJNaGlAGdEbDbQ9piB44ZbB1jHoIsFZSAAydr5uV2ClCN/jLr/YhtWsebr -yArofcC0gF2caUhr/Vlnh1WRNncn/BVdQ5a06yJ8zqJUz+oXHANVfJU+N11PZRHz -tmogWXmeALm4H2UIZmBfgorb056TxIhGOP2Rr6yykKLGLVmazAiPkLFiWJjS47H9 -1s4aMZVn7qhaHhFt18JvHezXciaJAtUEEwEIAT8CGwMFCQlmAYAFCwkIBwIGFQoJ -CAsCBBYCAwECHgECF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYR6NhTQUgAAA -AAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xp -LxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhU -mxSAAAAAABIAgHByb29mQG1ldGFjb2RlLmJpem1hdHJpeDp1L0BzaWxzOnNpbHMu -bGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3Jn -Jm9yZy5rZXlveGlkZS5lPSRsSU1YUkUzMXJlaG1iNWc1N2dRYmc4SjNya05aSkw1 -RXNlWjhuUWw1V3BzAAoJEN8YeObZw7J/+GML/0aPvBgFFBXd7LKR/Hyf0WQ1eUUL -/pkELt/AQRGwOaAEyUnfmKtqTI+qVeD7UNpcDHdjwchBmkfG5W/N8Caavow7jCdu -0px+BA5WWO7snDW3HOzFKIRgDtajtljX69Z9Wh9aYsO7sYapSMCsmIx7h4SxOxSK -oh6nZOaN98dzx9PcyjbSneToGyYDb+5nzTiYWiaE8LQAVkdZeFAdSN4UDenVXd2R -cLozZVQjYwhk+fVDzlcj9HoieEKpSEpUp+dWZJob7H4z9AVLieYwzkfFmApG9XaJ -wZPx8u06c82q+3ZHXd0HLd/cQFCSL558pmhp8HhnDMrYipRoJ3tX7SqXXrhi3gA9 -1K89I3xhmpiz9dq2B/Qdv8Ml+D9qQNIpBWqns2zWkWharqNmWTxmAsTPY2rEMm0c -81dWXZ61Lra69A9XXUQg52xRNS1AKF8C0lMehSdBu2a8+HlZHADhCjLRaljxvhUK -vqTaL7/f5a6fN6D0wvPOXgYP5+u7Jv8NnLfO74kCoAQTAQgBCgIbAwUJCWYBgAUL -CQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJh -HolFmxSAAAAAABIAgHByb29mQG1ldGFjb2RlLmJpem1hdHJpeDp1L0BzaWxzOnNp -bHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgu -b3JnJm9yZy5rZXlveGlkZS5lPSRsSU1YUkUzMXJlaG1iNWc1N2dRYmc4SjNya05a -Skw1RXNlWjhuUWw1V3BzLxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpz -aWxzLmxpP3R5cGU9VFhUAAoJEN8YeObZw7J/+RkL/10AHiebFztglUSi0/2auWZ9 -4SCX/n6sgwtcUD0SOLUEQjkXlhgGQJy3UfS6VCgNl0fkfkf5E29g9tY4rQS0dL1D -3PNChFsiF6b9XymIqrCz5Kvgt+6RjC1uFTl32yhsmbwL61E3mn9e1nlXZcpv2T2i -xLeU71kNRQR3+lkvJdbu2Fli750n6AS0iMboeLTzLZHK9Ai0CZqZ84O8lvEBCSNL -WCg8OoLfsvTs8XiAiBvY+Bagc5AKrM5tLwdrm1eiVNtHOZNZ/EXEfYMQ23uh02Li -znd+HZMo9URKB9mbtZilBl2O3qorQyhs9lQNwUgrATXxJMUnrXmFy73LLAqT6MX3 -iLPMiA3Da1FHGxVKhcHu0PuWd3vyOqnDUQ7DEg1z8X4NtMOszvMCBH5I+pe7kDQt -jsiGIDaFl0v0bWOqIfq+d4hDSC3o/cAnNRLnsU5GYhI+YESRb80qBD+UKBvvm2eD -MXNo1/weVq29g0k7Ozt6y5EAvrTMcQeve1qXcQDe/4kCBAQTAQgAbgIbAwUJCWYB -gAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBC/qe9uRcXCnuOcgAd8YeObZw7J/ -BQJhHmJSLxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5 -cGU9VFhUAAoJEN8YeObZw7J/QVEL/3YUztd5V/JQPHyAezqTD8mEVNu4bkLd1E6U -kwFb5e5wvcNndKPRhdL8JFtHGo/vnrglkpoY7KqLPKq2z7NCQbsR5YT5iWIlfCi1 -Duwh207l/wxzohlDuYPe00AFnm/B19eFjFLKI7/dixOkfZhNDXgtz6BRiYG4Dpmq -cnwYR2+xqul0cQ92+6IApVsdNzAyuHXrYyRtVXw1WxG9H3XmzuZl1fNRhpENsc0r -WAclp5F2KD3ZP58zL6N5stKvKGbfEdoAjoZVSjuFR5K3tYHH6gYAccyxuLgYwRhw -5HWkQ4dB8Xv5vV2+v2SQgK39NYufgVX1YBM5O2YXFRBoDc0yCP20PQ4XxbtgdcT6 -rMemuYSEWmFarSwlxHsHMreoSbwxVHrfBySwM4rqoXqyfaTHnVLysF6WNjD7h7d7 -e0rXL70aD9BKwvweQKJBhoCGTkwt3IOEhiPawD59m4EcbXji8YCs570mK2uoc4kp -JjuF1DlS1L1wd/unYaKIinbm34Q+34kB1AQTAQgAPhYhBC/qe9uRcXCnuOcgAd8Y -eObZw7J/BQJhHl4PAhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ -EN8YeObZw7J/yzoMAIUUWbESdqwWbIe0e3VviEmrW7kArLRV9AFfVYvnA+OGObOx -FYcDSY2vH6kQetRLlYV19OLM91N0/Oqh/wwlmpzFrLjXkRG+aNu5IKRh4noythO1 -CH2BUo+n/JeodpVb1x06EYeZQVQ2ASche0hzzw4Zx2P0z+6Mg/IbK/YlUonDvTrI -Ioptt8InjXiDUo3D9n5Rzgn2zPf2c6gF79IbBZl0fBN+V/La1O+lOdhT3yajb21b -Hr9SmEdtvs5GT1WSpEpJDtZGf0Y5Kv0UGIrFn5dYJFzcRjHWbuB3bB/STHVVgoAS -ueLV7xDdqbO6d5DsVtvExiBhWI2LAtQXttzRnHIGajuNP2852ooXqVpUa2hu93RV -Uf6XlRBg6hHPnhRZYUr2gaAWH0VKDw1m6eK3SToNVD9GQrA+j8cqhr4fjemZaqqH -U3MIPwUvNTcYtecy9e4AopWmS3nIkJhsdSOIyXIGVHKt2I2qwFTAPOjm1CAy9S4Z -v8lVNVFDxhsM7LNHboh1BBAWCgAdFiEElgb8dJ/OFjYHI9StpelAEMOmQq0FAmTE -I7wACgkQpelAEMOmQq3gGAEA0YkCNt4pTGr86xG10Lcz6Ds6y98GjZrWPpHUZL1m -zxkA/jL5xHj3Z4uzQEzoITj4s0Yh0YzDIpej6J6pC2Tv+SEJtBxTaWxhcyA8c2ls -YXNzY0BzeXN0ZW1saS5vcmc+iQMSBBMBCAF8AhsDBQkJZgGABQsJCAcCBhUKCQgL -AgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmRBbtU+FIAAAAAA -EAAlcHJvb2ZAYXJpYWRuZS5pZGh0dHBzOi8vY29kZWJlcmcub3JnL3NpbHMvZ2l0 -ZWFfcHJvb2aZFIAAAAAAEACAcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxz -OnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRy -aXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2N2w0eUZjWExhdXlpQllzaHBD -aHVNa0Q4LW1HLTdZX1ZfUzdBLxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRu -czpzaWxzLmxpP3R5cGU9VFhUNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0 -dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkACgkQ3xh45tnDsn+x4AwApA8PTLYRemnD -rNTFfLXUb7kiW7O/Zi93a1hT1g77NoovpZT0Rfd6Jc93579gK354N27W2P7YflRi -IYxp3ch3WX4NgpxTFvx1HbSa9l+UNvH5TmFJmr3EonDLOtZWpPEPdbq5MJANCAYH -5jT1l/MXD+VnUtyN9aFqFuZR2XLDh1VPDB98TTlwC9GYe/QHouCw+PhqZXii58S5 -SgHlzGx5SHtdVfWl/POzy3tlOHHzkBiHo4VLbIbiB2T2GRvmpPGOCH+d27qUrIZV -eF2jfn0opkxW/1Gl8xhyUHS2b8I7/7Zjfp+UareOmR6ccBUaSwCt45b4fnuq/wgJ -kxD7WoxXkr8rw+H2jQoJTxY1EKUYo4GJBUpjU6VYMGpGWxfZawM/z5hiKav57VuE -5/FXJR/c/fJjjBTFOHC0Z9VPDlpu+SdfWe7m52/MEHawLWL870emTbcyTsPyVI6b -bVoNwKEpDcUkTrZUPW7Q973n00s7hMnb2HmkX6t5sfXmHBMkECitiQMMBBMBCAF2 -AhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB -3xh45tnDsn8FAmRBbVY4FIAAAAAAEAAfcHJvb2ZAYXJpYWRuZS5pZGh0dHBzOi8v -Y29kZWJlcmcub3JnL3NpbHMvcHJvb2aZFIAAAAAAEACAcHJvb2ZAYXJpYWRuZS5p -ZG1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENv -R1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5lPSRkalVrb3d2N2w0 -eUZjWExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdBLxSAAAAAABIAFHByb29m -QG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhUNBSAAAAAABIAGXByb29m -QG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkACgkQ3xh45tnD -sn/UbAv+ISlXhbvE0MSRdCVz6zG8PwnH2Q0ejFcrwVBroJ+haKq7E+rWNlC+YNra -jZvVYDvlhQmjNB1UU/xBU7DP4PfCeZj8HNHU897aYfS7qhPyXiTdudHEAsmlnA7O -/eyBVBXqjWDAIWNy7/RzmTFIEX345H5HT1RmdHHaMSNnvlN5lp2TOB5qLAgD8q2c -Lq/HgNthePowyS6Tit06BdvoGgCVbBow20Fc10l326/3YuUX7nfJvfPSTr3X1eiH -XGD3DJNvFUONF35jOCIOLGVs0LgsEtnYiRvoUobXEexTTvj2IZq9+tsGszTPKHJU -25erDuJBprO5Lb9BV6orBYEDWiiKpcw1ZtD0SKnsprS+9JpBvz64H5qHgA6fOqcf -WdmubTZHt0JzqqNV/Ye3YMy2bFBuJt+ZWkeIUAEYgLfbv4Cp2z+7OkCeoVBI0ICv -h9HEmEvc2JWUr+Ir2f/jczewHDqRkpl1beFYsjw4yOTyF9W3mkj1ysWVm+9cy//p -WiOr0LUdiQLTBBMBCAE9AhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA -FiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLPEFo0FIAAAAAAEgAZcHJvb2ZAbWV0 -YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaS8UgAAAAAASABRwcm9v -ZkBtZXRhY29kZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVJkUgAAAAAAQAIBwcm9v -ZkBhcmlhZG5lLmlkbWF0cml4OnUvQHNpbHM6c2lscy5saT9vcmcua2V5b3hpZGUu -cj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9 -JGRqVWtvd3Y3bDR5RmNYTGF1eWlCWXNocENodU1rRDgtbUctN1lfVl9TN0EACgkQ -3xh45tnDsn8+rAwAqAwIzZHQYrbu1LlO0xa3+H2mhP54OpKj2c+yaDLFT6rpAjUd -tEn2Bx1TIhKjePvZiHnXk5QgRcuQ7pgynLCEVcrS3Dy9gpGc3wNFGa5xsCyz9E0D -/aRw3weSLqTc69y1290JNqEdAWOQ0BY6D16DRw1OjZfGTlaqs8I/FOt6MHNoURlv -I0ucUkMejdlPWNzjkO8HwCNpu9RQPOyamqAfJCm/M+OFoXx1WtzPQvpioIfw5bBO -uPI77fXrGSk+ydud0gW5xchi5dLIDnfMEWscYpEP7GEEQvpLZj2UQa4WOpfz1k8+ -PqAbMSCT0S8h2wvJqiepjEwmkN47F9IshV3vc22Pyk4vSlPizoly1YjBnVhhBNX7 -keBZUZFqTAruKGNEJ2uQFqNw1A3WaoFJxapaA1SWdems/TSXNuj43F4pvClxQxZr -wQwVA8rOISEMFfS8bkcx5vUfEeJvE/JNfiZBEYmH+XfDZRYeMeUQkZY548LHLUgj -lsqVPexm7qUbfPcKiQNsBBMBCAHWAhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMB -Ah4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLPBfmZFIAAAAAAEACAcHJv -b2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRl -LnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5l -PSRkalVrb3d2N2w0eUZjWExhdXlpQllzaHBDaHVNa0Q4LW1HLTdZX1ZfUzdBmBSA -AAAAABAAf3Byb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6ZmZmLmNoYXQ/b3Jn -LmtleW94aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5r -ZXlveGlkZS5lPSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdYNm5pLV9JOWs0MXd4 -RTJqTVQ4LxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5 -cGU9VFhUNBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQu -Y2FmZS9AZGFzbGkACgkQ3xh45tnDsn9r3Av/R9+c7npoC8Oo8IU++UjzHcfd+Zs+ -YwJc0WU5ZwOW5KCoyAMHmAYXi/ZD/e3atUNwrgZhKMXRNxDIuvdqIq5euBzdTjd7 -wJYKThB44sLVNtE4DWULRAWgAQovpdcSoeg3iZC45LxQlBfgNRBPBCkZs/yF3Zp9 -hrZOSN+krZvanZ0fywJTRKYEUTgejDP3lgXUU8w09Mw5IQ0Xfiy+vGptfziapNGx -BK9Z2tRNOZln+zwXNP+U5wQ7psGgznMM9eEE4+jzEEsgsxoXcsNmChfm4K1ltCLt -72mBs6iEqfBIaAidOX4j8g2Idh1bt/qof8jWaBJwFrVaU4/q+Uex7+7CO3bBrkv6 -rHBrta1D12T3s5xYlbxMLf4H/tqvf3K5PwT/6GXknchXjyoTwtd8DTTWtr9PUARW -/hfjgkx9Epjc+x16u5bM1iU+kmv4HygwMZwMRxpBOjuv3Z7HiamUgsfCYfJUhxIr -JEpUtLTvsiUPNmm05A6BVnpR7tHhsHbU8r/iiQLSBBMBCAE8AhsDBQkJZgGABQsJ -CAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmLP -BBE0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZl -L0BkYXNsaS8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6c2lscy5saT90 -eXBlPVRYVJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQGxpOmZm -Zi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4 -Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFVd2ZIdndzS3dlQ1hXWDZu -aS1fSTlrNDF3eEUyak1UOAAKCRDfGHjm2cOyf4WGDACS072ObGtwGJhMZElGcqxE -b4H0XIbAZHcuCqA5lFNPgeayozXqMUk/SXiYcqb38yMyHyT1BWVGa4LSHoGwvt15 -u4RwU0SgRisWTCZsstB8T5ePVu7HA0xICx4RBdxhyF14T+Dno9/eqMx5VaAL434O -r1gHwFT96D99hunf0cjHPBpQEGaDAPIXYlqOZ6ExQA4GufFQv9uNSusXpHw/pWrI -LU/CvbrSLsUckbfXQ5BXzo/vRg92nIWVOcq0T9NL8E/5WuQ4aTowoI+lhC703wP3 -lG9WS6Mb2x+4ubahWLwBXbaBvHytOPJdEqJnsilpFFFJRpcNYrznh6sKXqjKSYxJ -mXcRsRsx1H8a/Cl7jQeX8pGo3xmNb3GUjLYaaxdekypbowGM+5GAmwB+GhZ0wEzx -pdYyUaJ5B/nsZrvNzjhujW3oTTrKCH9/p+yg2rsNfzXjnETna7SvQVh9wekP+ieA -cL5RsEIAfP1QNG0b9dHZJWvXSNH7Du/AG1NI64m56BuJA1kEEwEIAcMCGwMFCQlm -AYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQQv6nvbkXFwp7jnIAHfGHjm2cOy -fwUCYs8CwZgUgAAAAAAQAH9wcm9vZkBhcmlhZG5lLmlkbWF0cml4OnUvQGxpOmZm -Zi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dWbVNUdWpmaXY6bWF0cml4 -Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3YXFVd2ZIdndzS3dlQ1hXWDZu -aS1fSTlrNDF3eEUyak1UOC8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6 -c2lscy5saT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5iaXpodHRw -czovL3Ryb2V0LmNhZmUvQGRhc2xphhSAAAAAABAAbXByb29mQGFyaWFkbmUuaWR4 -bXBwOnMuc2lsYXNAZGlzcm9vdC5vcmc/b21lbW8tc2lkLTQ1MjE0OTk1NT1lZDhl -YzA1ZDNiMGZjOTc3YjY3MTIwZDVjMTdlMmMyYjNmMDk4NmJlYzc4OGI3MGE4Yjhk -MzQ2Nzc4YjhkODMzAAoJEN8YeObZw7J/G6UL/1H/fk89xpj9oz6aVkvaf6xoedu7 -ofxi2LZx8jaI4P6jVz4J45KBJZ2ULQVRJOYw60QhohfjjscxKXJgB6oYYiXlVtlh -GmG/DBJ3l0HFS+aZmg89J49qG3xHyghhDX/ABw9mT21cIygd21vAViwcb1dZSYeF -m3Q8rV+jF5Cm0LvK+7UigXSJbHBUtMQH3ZIQGym+SEP+FCbD9A7KW3SWmZuDUwRa -ZBTCoenGUD8Bx4tSjns7zMvWkwZdxTiiqMAE/jcvzhmBZIWhGpkEY97ns3mihbEd -hjv1baUk4h2T9R9ASJMvmUfKEY4JxLvbxebquSOC+etMKZ/8ySuIH2Afvw1JtJdL -1hIL5czCpbtDlgCaRxHKkfZx0RiEakze6WrRHr2XLh0TSdIKEcIBSt0LTW2uRJqM -GVsxczzBU/G3qZcCWAjorcqma9N2B26viH4RtRtszEuvJZl0EB78GrDVNud6fyuE -aewdBSU1LqFb4K64f+xmQn8fvAXjthSXWySzNIkDowQTAQgCDQIbAwUJCWYBgAUL -CQgHAgYVCgkICwIEFgIDAQIeAQIXgAIZARYhBC/qe9uRcXCnuOcgAd8YeObZw7J/ -BQJidalDMRSAAAAAABAAGHByb29mQGFyaWFkbmUuaWR4bXBwOnMuc2lsYXNAZGlz -cm9vdC5vcmebFIAAAAAAEACCcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxz -OmMuc2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1h -dHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5 -b2QzWnk0bzMtREFjNk5melREU0E0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUuYml6 -aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaS8UgAAAAAASABRwcm9vZkBtZXRhY29k -ZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVJgUgAAAAAAQAH9wcm9vZkBhcmlhZG5l -LmlkbWF0cml4OnUvQGxpOmZmZi5jaGF0P29yZy5rZXlveGlkZS5yPSFkQmZRWnhD -b0dWbVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kaEs5X3RHMHU3 -YXFVd2ZIdndzS3dlQ1hXWDZuaS1fSTlrNDF3eEUyak1UOAAKCRDfGHjm2cOyfwq2 -C/9gKXhGmi0Rk//MK72kPuokFn5vuBNcGHZwydU/EcNGOb/AjQkIpTM0Ktx4bp5U -fRwdpYNeOxchHGi1MFjlagfxj9QdmgByxjUVaMWExdputniIXg1GuDB0plr2pGsI -TjLM6K4rSnV1nf/fFIAJkmQZ6AICIQ8VQvgVS9VlZ5LqMRA0rRIzyPtdfoh4I+IT -hFnXbHDp2oXfQhNKTf/MJKV5Rw53AoK8TIEtc5FlxGiDIzj9CoQOyj58/ffiDk4B -eVRezNXpaoCoDKvo6JatIwiR9ONply/mCGfkI2BtyJOsMiqPbK3GUdrFSEPfF1b8 -2r0DU2Ke/qhJF7Abvyx9g7tP2CuaAmcMUB0DIPAwcUxgIIwPIJj7Q8xPI06bGTAk -jJYO62rmqQu8klA6JKcnvM5Vk8IHEYjLsJ2DmYObvRVzTjYaHePMi0e1CUgoYUp1 -UUgo4hJA3bYv7lNrQfLCvhI5Mx4rbLJGW78xpCqg1aj8I4LgrnoHlp+oCAKa0xkt -ds2JA/gEEwEIAmICGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4ACGQEW -IQQv6nvbkXFwp7jnIAHfGHjm2cOyfwUCYnWhI4YUgAAAAAAQAG1wcm9vZkBhcmlh -ZG5lLmlkeG1wcDpzLnNpbGFzQGRpc3Jvb3Qub3JnP29tZW1vLXNpZC00NTIxNDk5 -NTU9ZWQ4ZWMwNWQzYjBmYzk3N2I2NzEyMGQ1YzE3ZTJjMmIzZjA5ODZiZWM3ODhi -NzBhOGI4ZDM0Njc3OGI4ZDgzM5sUgAAAAAAQAIJwcm9vZkBhcmlhZG5lLmlkbWF0 -cml4OnUvQHNpbHM6Yy5zaWxzLmxpP29yZy5rZXlveGlkZS5yPSFkQmZRWnhDb0dW -bVNUdWpmaXY6bWF0cml4Lm9yZyZvcmcua2V5b3hpZGUuZT0kMUxSOE9PNDBiTDY0 -MDdpZmYwMEo4ZzlvZDNaeTRvMy1EQWM2TmZ6VERTQTQUgAAAAAASABlwcm9vZkBt -ZXRhY29kZS5iaXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpLxSAAAAAABIAFHBy -b29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhUmBSAAAAAABAAf3By -b29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6ZmZmLmNoYXQ/b3JnLmtleW94aWRl -LnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5l -PSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdYNm5pLV9JOWs0MXd4RTJqTVQ4AAoJ -EN8YeObZw7J/D4sL/1ZDzzOzfhQ8qOmUje/9BYqOSevipKK+nv32UIy2aiShJnkN -2SD0OMN4xLmyxSJ3ynZuPFcE/J6g9Zyyk2O+BT8xTQ+O5CdV5BLUFLsbMc2y8O7r -8qTnmuZE2FvOyae/M5a4rrCWCKMruijj0Q9PSThYJRd30Y+VSJfck9UkJcELx7vj -s2GLSxAkyMrOAoLfUuqjQYq+GoniWWQrcCTDV+4Amordk0sajNJvuGTYo/1p6/13 -VvYVRmFJdKtHJFWWtb1q0RlO4aanA3LRpGq7Si/auxoqEcH3t3Jsify6nKTljDU+ -CjFo9aJ9W1S5aHQ+OCYyP8FOacX22c5iODX9BXuJeTXaF/TzUSiuMY1SDpFCwxvP -9RslRQBKeycoAvzqTmLcvdwWxa1ZXRvUSKUUApmuPZVJmhD/jnkwM4v8vcqekvLH -N+bPccSRmFGoF+U3unMRsVrP5FUxjOOtn+CyOZR8fjB/1W/eqsZ2tWcMOLTyFZoH -h4NVPTqYOqsduhOAcokDcQQTAQgB2wIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgID -AQIeAQIXgAIZARYhBC/qe9uRcXCnuOcgAd8YeObZw7J/BQJidWpdmBSAAAAAABAA -f3Byb29mQGFyaWFkbmUuaWRtYXRyaXg6dS9AbGk6ZmZmLmNoYXQ/b3JnLmtleW94 -aWRlLnI9IWRCZlFaeENvR1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlk -ZS5lPSRoSzlfdEcwdTdhcVV3Zkh2d3NLd2VDWFdYNm5pLV9JOWs0MXd4RTJqTVQ4 -LxSAAAAAABIAFHByb29mQG1ldGFjb2RlLmJpemRuczpzaWxzLmxpP3R5cGU9VFhU -NBSAAAAAABIAGXByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9A -ZGFzbGmbFIAAAAAAEACCcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0BzaWxzOmMu -c2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2Om1hdHJp -eC5vcmcmb3JnLmtleW94aWRlLmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBKOGc5b2Qz -Wnk0bzMtREFjNk5melREU0EACgkQ3xh45tnDsn8prQwAiRVx0WOeemcAhiYRqDeX -Km1+ms8TpvGqka1i+UuVZ3QY7EDldZ38V9vP93gojgbKYmzpJBWr75EV+UoMMfZs -pvH/3et+RKItAI15PwoKtCCMUycqiJcmLBMlYPhy1wyp+7zE4ltFFIJ6Z7yDpyUH -75xolgsySnEFAinTHJ5ruJbbPyu7hBRJxtFGPVZzSeYjU8ikA1hGbdjYQc8AevQP -ZCyZthiNU7PHRDaRmiP3lJ7325bDx0Emkzaw9zp8vu/JI6EWrws/Ta4hxM9nNWSX -Xv3vdFLsMDAZ8qFlstCPjCZL09ZfD1d70MuGLbRvc7XMPp4ZIp7CZnRQ1FHf/PVJ -R+uqNtYUpqeB8Q7U17oYpU98aTgawbF7x02Ym7i2Vb9aPgKB+hU7nrfMevU90hUH -Mtu7ze7BZlj3otR9B2QT08PqwWP/yUQoQhSwWyxxSRLN/ecedH8fDo5kc6GCMpVi -/heVT9UoSpVb9H/TLlyR9Z3CuXDvXJCAcTP3WW5t6DsjiQLYBBMBCAFCAhsDBQkJ -ZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAhkBFiEEL+p725FxcKe45yAB3xh4 -5tnDsn8FAmG3f3KbFIAAAAAAEACCcHJvb2ZAYXJpYWRuZS5pZG1hdHJpeDp1L0Bz -aWxzOmMuc2lscy5saT9vcmcua2V5b3hpZGUucj0hZEJmUVp4Q29HVm1TVHVqZml2 -Om1hdHJpeC5vcmcmb3JnLmtleW94aWRlLmU9JDFMUjhPTzQwYkw2NDA3aWZmMDBK -OGc5b2QzWnk0bzMtREFjNk5melREU0E0FIAAAAAAEgAZcHJvb2ZAbWV0YWNvZGUu -Yml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaS8UgAAAAAASABRwcm9vZkBtZXRh -Y29kZS5iaXpkbnM6c2lscy5saT90eXBlPVRYVAAKCRDfGHjm2cOyf74nDACbLYlO -Oc4PL/QMfzrNzne9ofkh2vmHV6MCYPKTrCmGP3Bh+Sl92J2YEa3CyqgbwtzAcMQW -YX1Rttgr8t3IkTYWnGxdgVjEoMvioMQhjOkmcBPEOWhjAFpVUlKHz7vyfl84C5l8 -0OC6m7cwtdEhBZEsHTiT7y+9VscgAuR8Hr/vKmicMkmYrCA8jND9cvE1mVlmE4kb -isFCBaltyS8t8vldewotQeSvc93pd5Wv+RZF4YMIMnzk/RujPQeWNYAk3bjLcN4Y -wTlHU5KfL2HoMfv1/QmrNfgWTXYEmRw2dybwaSIRVZpr5OqXolIRW+xsyZPcjfiG -W/ejuoHLcYps5/kTBD6swERk925GwmTcwTMterA20aEzLTBJ16glPsfs8mlGzJWF -FiqfhqMxasP4kd6puxmVh4oBow8o1GMQEqYZ7SUDoF6c0zQ2nlXppcPw4e6eYRiG -15M7wlSnI4N0tEg67eGq+58Oob7cIkBe32GEmEwMHRE9oWMJK8QtjmITxHuJAjwE -EwEIAKYCGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4ACGQEWIQQv6nvb -kXFwp7jnIAHfGHjm2cOyfwUCYbd7AC8UgAAAAAASABRwcm9vZkBtZXRhY29kZS5i -aXpkbnM6c2lscy5saT90eXBlPVRYVDQUgAAAAAASABlwcm9vZkBtZXRhY29kZS5i -aXpodHRwczovL3Ryb2V0LmNhZmUvQGRhc2xpAAoJEN8YeObZw7J/YgEL/iG1xKsu -ZW2apQTlJaYkKbLycjn64kAB3B8sKlQA+yJ53KRXsT3UuAy3OXTEbVL3C9sRZ38H -1MGMXhJBF2P4p8HLWctjXkmdyPUEDPgl/BmnM+8wrj+yjJHRuGPHXsrrehsXNyoX -gMEAqacKrNtB3ATXnq3gd7wIZ9BlGzl34HaRzNbAPrImfa3ipG0vwId9zOM6nHlH -+8j9DJuhnY9IR1jvA88Pq96QmbCRDWolwzaLbcOxqaosQxlzw4F8wSUjOQocX6ya -2JvSO6WjglO/RTRoby7Q/r+7FrBJs3APGNstSZuC+QHS2Dn7cNN/mxg/XjHLGhOX -SNdFuZYGOk1NTvcVLdBh5nuVYAlNoqbwAD83UCaE7g7lobYgxua7b97hI48FKGLL -W8ASEQ+syRjLf6/y5U/grCwZnLTF8JtPAx50WwktjzU4so3+rX4j5tW87rO8Od02 -Q2zVVq7jhYw8cWvKY1DAUulRgUdOVpi51ZzDzy/G41qGeKSI4eRILig5sYkC2AQT -AQgBQgIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAIZARYhBC/qe9uR -cXCnuOcgAd8YeObZw7J/BQJhHpHxmxSAAAAAABIAgHByb29mQG1ldGFjb2RlLmJp -em1hdHJpeDp1L0BzaWxzOnNpbHMubGk/b3JnLmtleW94aWRlLnI9IWRCZlFaeENv -R1ZtU1R1amZpdjptYXRyaXgub3JnJm9yZy5rZXlveGlkZS5lPSRsSU1YUkUzMXJl -aG1iNWc1N2dRYmc4SjNya05aSkw1RXNlWjhuUWw1V3BzNBSAAAAAABIAGXByb29m -QG1ldGFjb2RlLmJpemh0dHBzOi8vdHJvZXQuY2FmZS9AZGFzbGkvFIAAAAAAEgAU -cHJvb2ZAbWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQACgkQ3xh45tnD -sn8RvwwAj5KJJJey5gWntcEu3smb74+EyKlCG+80lxR4esKDiDqn/4iK411pjbjy -C4+WH4fvfqLuaDzmWNURnWi55XRPzN1tIXohrMUmF2NyyrIDVApeT1xbClC0L4Ub -KXVBYWTcDz7+OvSIgW86sueIRAhKG8VoAtnvjx6vm4mwkzk8S8GOxzCii/iRX7h9 -xXJuwaWZQ+aPvURHxh282BbHPt1DXGHUq9/dvN/XbV1qTo8CG+MNgXQdgpboJpk5 -mSYBTwg7zPwqKi/I+fnKUUfpxUF8ABDrpDikTqAmSOZH/74blRy8rW8a2T9Dq/F+ -x2KpSvqYxvy2bYbH4kQy8G62LuWS7E4xUHyf/PYyxK0BFLZI8jB7pnF8uV3vJhvO -UOO6VuP/kecgYC4UyYZXakHHyitLYjYgO2p2HHJKbYWMGVcPJo9uub7/TThFiJUb -eT6S3Uf6vPRKDUB9tAGl+E8Dszccsgz2f/vpK4lkR3zNWQdER3/k3txkHsgA1mAy -NN/VI0XViQI8BBMBCACmAhsDBQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA -AhkBFiEEL+p725FxcKe45yAB3xh45tnDsn8FAmEekUkvFIAAAAAAEgAUcHJvb2ZA -bWV0YWNvZGUuYml6ZG5zOnNpbHMubGk/dHlwZT1UWFQ0FIAAAAAAEgAZcHJvb2ZA -bWV0YWNvZGUuYml6aHR0cHM6Ly90cm9ldC5jYWZlL0BkYXNsaQAKCRDfGHjm2cOy -f7WvC/0VcA2uaLpOpHkRQEJXY77z95DJrHzNK9kOHJOgOVTs1AOXuJSRnYdQ7/p2 -Du5NSuopD/xaFdE8dkWtahwXB7pPpACQAiGezPEZHeC8XqdmoI0iWvMdeMyq86Dx -yBNS4g9b+2/y9v9NEvrogp/OGay9s9/nfPoeoIn/TEy7FBlRzz5qw0aiJcFqynuL -olL/neDhPPYF/sFxAteOJzcztZsAxDQ3qNutGBnxMYXWv+EJSAO7Rwp/XnhEdzLX -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 -=jEmd ------END PGP PUBLIC KEY BLOCK----- diff --git a/modules/home/conf/gtk/default.nix b/modules/home/conf/gtk/default.nix deleted file mode 100644 index f5411369..00000000 --- a/modules/home/conf/gtk/default.nix +++ /dev/null @@ -1,58 +0,0 @@ -{ - config, - lib, - pkgs, - stdenv, - ... -}: { - gtk = { - enable = true; - theme = { - package = pkgs.nordic; - name = "Nordic"; - }; - cursorTheme = { - package = pkgs.nordzy-cursor-theme; - name = "Nordzy-cursors"; - }; - iconTheme = { - package = pkgs.nordzy-icon-theme; - name = "Nordzy-icon"; - }; - font = { - name = "Noto Sans"; - size = 10; - }; - gtk2 = { - configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; - # extraConfig = '' - # gtk-enable-animations=1 - # gtk-primary-button-warps-slider=0 - # gtk-toolbar-style=3 - # gtk-menu-images=1 - # gtk-button-images=1 - # - # ''; - }; - gtk3 = { - # extraConfig = '' - # gtk-button-images=true - # gtk-decoration-layout=icon:minimize,maximize,close - # gtk-enable-animations=true - # gtk-menu-images=true - # gtk-primary-button-warps-slider=false - # gtk-toolbar-style=3 - # #gtk-modules=window-decorations-gtk-module:colorreload-gtk-module - # ''; - extraCss = ""; - }; - gtk4 = { - # extraConfig = '' - # gtk-application-prefer-dark-theme=true - # gtk-decoration-layout=icon:minimize,maximize,close - # gtk-enable-animations=true - # gtk-primary-button-warps-slider=false - # ''; - }; - }; -} diff --git a/modules/home/conf/himalaya/default.nix b/modules/home/conf/himalaya/default.nix deleted file mode 100644 index c072693e..00000000 --- a/modules/home/conf/himalaya/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{...}: { - programs.himalaya = { - enable = true; - settings = { - # TODO: - }; - }; -} diff --git a/modules/home/conf/hyfetch/default.nix b/modules/home/conf/hyfetch/default.nix deleted file mode 100644 index aec21dbc..00000000 --- a/modules/home/conf/hyfetch/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{...}: { - programs.hyfetch = { - enable = true; - settings = { - preset = "rainbow"; - mode = "rgb"; - light_dark = "dark"; - lightness = 0.65; - color_align = { - mode = "horizontal"; - custom_colors = []; - fore_back = null; - }; - backend = "neofetch"; - distro = null; - pride_month_shown = []; - pride_month_disable = false; - }; - }; -} diff --git a/modules/home/conf/iamb/config.json b/modules/home/conf/iamb/config.json deleted file mode 100644 index ca06d543..00000000 --- a/modules/home/conf/iamb/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "profiles": { - "soispha": { - "user_id": "@soispha:vhack.eu", - "url": "https://matrix.vhack.eu" - } - }, - "default_profile": "soispha" -} diff --git a/modules/home/conf/iamb/default.nix b/modules/home/conf/iamb/default.nix deleted file mode 100644 index 2a93472c..00000000 --- a/modules/home/conf/iamb/default.nix +++ /dev/null @@ -1,3 +0,0 @@ -{...}: { - xdg.configFile."iamb/config.json".source = ./config.json; -} diff --git a/modules/home/conf/keepassxc/default.nix b/modules/home/conf/keepassxc/default.nix deleted file mode 100644 index 3ac82812..00000000 --- a/modules/home/conf/keepassxc/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ - config, - pkgs, - ... -}: { - xdg.configFile."keepassxc/keepassxc.ini".source = ./keepassxc.ini; -} diff --git a/modules/home/conf/keepassxc/keepassxc.ini b/modules/home/conf/keepassxc/keepassxc.ini deleted file mode 100644 index 288a194b..00000000 --- a/modules/home/conf/keepassxc/keepassxc.ini +++ /dev/null @@ -1,58 +0,0 @@ -[General] -AutoSaveAfterEveryChange=true -BackupBeforeSave=true -BackupFilePathPattern=/home/soispha/.local/share/keepassxc/{DB_FILENAME}.old.kdbx -ConfigVersion=2 -HideWindowOnCopy=false - -[Browser] -CustomProxyLocation= -Enabled=true - -[FdoSecrets] -Enabled=true - -[GUI] -AdvancedSettings=true -ApplicationTheme=dark -CompactMode=false -HidePasswords=true -ShowExpiredEntriesOnDatabaseUnlockOffsetDays=1 -TrayIconAppearance=monochrome-light - -[KeeShare] -Active="" -Own="" -QuietSuccess=true - -[PasswordGenerator] -AdditionalChars= -AdvancedMode=true -Braces=true -Dashes=true -EASCII=true -ExcludedChars= -Length=128 -Logograms=true -LowerCase=true -Math=true -Numbers=true -Punctuation=true -Quotes=true -SpecialChars=true -Type=0 -UpperCase=true -WordCount=4 -WordSeparator="," - -[SSHAgent] -Enabled=true - -[Security] -HidePasswordPreviewPanel=true -IconDownloadFallback=true -LockDatabaseIdle=false -LockDatabaseIdleSeconds=960 -PasswordEmptyPlaceholder=true -PasswordsHidden=true -PasswordsRepeatVisible=true diff --git a/modules/home/conf/latexindent/default.nix b/modules/home/conf/latexindent/default.nix deleted file mode 100644 index 0d776e14..00000000 --- a/modules/home/conf/latexindent/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ - config, - pkgs, - ... -}: { - xdg.configFile."latexindent/indentconfig.yaml".source = ./indentconfig.yaml; - xdg.configFile."latexindent/mysettings.yaml".source = ./mysettings.yaml; -} diff --git a/modules/home/conf/latexindent/indentconfig.yaml b/modules/home/conf/latexindent/indentconfig.yaml deleted file mode 100644 index d67351f3..00000000 --- a/modules/home/conf/latexindent/indentconfig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -paths: -- /home/dt/.config/latexindent/mysettings.yaml diff --git a/modules/home/conf/latexindent/mysettings.yaml b/modules/home/conf/latexindent/mysettings.yaml deleted file mode 100644 index 9a0f8b2f..00000000 --- a/modules/home/conf/latexindent/mysettings.yaml +++ /dev/null @@ -1,672 +0,0 @@ -# defaultSettings.yaml for latexindent.pl, version 3.19.1, 2022-12-04 -# a script that aims to -# beautify .tex, .sty, .cls files -# -# (or latexindent.exe if you're on Windows) -# -#--------------------------------------------------------------------------------------- -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# See http://www.gnu.org/licenses/. -# -# Chris Hughes, 2017 -# -# For all communication, please visit: https://github.com/cmhughes/latexindent.pl -# -#--------------------------------------------------------------------------------------- -# You should feel encouraged to change anything you like in these settings, but -# it would probably be better to have your own user settings -# files somewhere else - remember that this file may be overwritten -# when you update your tex distribution. Please see the manual linked from: -# -# https://github.com/cmhughes/latexindent.pl -# -# for details of how to create and configure your own settings files. -# -# Please read the manual (linked from above) first to understand what each switch does. -# -#--------------------------------------------------------------------------------------- - -# latexindent can be called to act on a file without using the file's extension, -# e.g, simply -# latexindent myfile -# in which case the choice of file extension is chosen -# according to the choices made in fileExtensionPreference -# Other file extensions can be added. -fileExtensionPreference: - .tex: 1 - .sty: 2 - .cls: 3 - .bib: 4 - -# default file extension of backup file (if -w switch is active) -# for example, if your .tex file is called -# myfile.tex -# and you specify the backupExtension as BACKUP.bak then your -# backup file will be -# myfileBACKUP.bak -backupExtension: .bak - -# only one backup per file: -# - if onlyOneBackUp is 0 then, as a safety measure, -# the number on the extension increments by 1 each time: -# -# myfile.bak0, myfile.bak1, myfile.bak2 -# - if you set onlyOnebackUp to 1, then the backup file will -# be overwritten each time (not recommended until you trust the script) -onlyOneBackUp: 0 - -# some users may want a finite number of backup files, -# say at most 3; in which case, they can change this maxNumberOfBackUps. -# -# If maxNumberOfBackUps is set to 0 (or less) then infinitely -# many backups are possible, unless onlyOneBackUp is switched on -maxNumberOfBackUps: 0 - -# some users may wish to cycle through back up files. -# -# for example, with maxNumberOfBackUps: 4, they may -# wish to delete the oldest back up file, and keep only the most recent. -# -# copy myfile.bak1 to myfile.bak0 -# copy myfile.bak2 to myfile.bak1 -# copy myfile.bak3 to myfile.bak2 -# copy myfile.bak4 to myfile.bak3 -# -# the back up will be written to myfile.bak4 -cycleThroughBackUps: 0 - -# preferences for information displayed in the log file -logFilePreferences: - showEveryYamlRead: 1 - showAmalgamatedSettings: 0 - showDecorationStartCodeBlockTrace: 0 - showDecorationFinishCodeBlockTrace: 0 - endLogFileWith: '--------------' - showGitHubInfoFooter: 1 - Dumper: - Terse: 1 - Indent: 1 - Useqq: 1 - Deparse: 1 - Quotekeys: 0 - Sortkeys: 1 - Pair: " => " - -# verbatim environments specified -# in this field will not be changed at all! -verbatimEnvironments: - verbatim: 1 - lstlisting: 1 - minted: 1 - -# verbatim commands such as \verb! body !, \lstinline$something else$ -verbatimCommands: - verb: 1 - lstinline: 1 - -# no indent blocks (not necessarily verbatim -# environments) which are marked as %\begin{noindent} -# or anything else that you detail in the following -noIndentBlock: - noindent: 1 - cmhtest: 1 - -# \begin{document} and \end{document} are treated differently -# by latexindent within filecontents environments -fileContentsEnvironments: - filecontents: 1 - filecontents*: 1 - -# indent preamble -indentPreamble: 1 - -# assume no preamble in cls, sty, by default -lookForPreamble: - .tex: 1 - .sty: 0 - .cls: 0 - .bib: 0 - -# some preambles can contain \begin and \end statements -# that are not in their 'standard environment block', for example, -# consider the following key = values: -# preheadhook={\begin{mdframed}[style=myframedstyle]}, -# postfoothook=\end{mdframed}, -preambleCommandsBeforeEnvironments: 0 - -# default value of indentation -defaultIndent: " " - -# remove trailing whitespace from all lines -removeTrailingWhitespace: - beforeProcessing: 0 - afterProcessing: 1 - -# name of code blocks that should have their body aligned at ampersand delimiters -lookForAlignDelims: - tabular: - delims: 1 - alignDoubleBackSlash: 1 - spacesBeforeDoubleBackSlash: 1 - multiColumnGrouping: 0 - alignRowsWithoutMaxDelims: 1 - spacesBeforeAmpersand: 1 - spacesAfterAmpersand: 1 - justification: left - alignFinalDoubleBackSlash: 0 - dontMeasure: 0 - delimiterRegEx: '(?]*?>)' - keyEqualsValuesBracesBrackets: - name: '[a-zA-Z@\*0-9_\/.:\#-]+[a-zA-Z@\*0-9_\/.\h\{\}:\#-]*?' - follow: '(?:(?<]+?' - follow: '\h|\R|\{|\[|\$|\)|\(' - UnNamedGroupingBracesBrackets: - follow: '\{|\[|,|&|\)|\(|\$' - arguments: - before: '(?:#\d\h*;?,?\/?)+|\<.*?\>' - between: '_|\^|\*' - trailingComments: - notPreceededBy: '(? goto-end -> goto-end -\ke goto-end -\eG goto-end-buffered -= status -ˆG status -:f status -/ forw-search -? back-search -\e/ forw-search * -\e? back-search * -l repeat-search -\el repeat-search-all -L reverse-search -\eL reverse-search-all -& filter -m set-mark -M set-mark-bottom -\em clear-mark -' goto-mark -ˆXˆX goto-mark -E examine -:e examine -ˆXˆV examine -:n next-file -:p prev-file -j next-tag -J prev-tag -:x index-file -:d remove-file -- toggle-option -:t toggle-option t -s toggle-option o - ## Use a long option name by starting the - ## extra string with ONE dash; eg: - ## s toggle-option -log-file\n -_ display-option -| pipe -v visual -! shell -# pshell -+ firstcmd -H help -h help -V version -0 digit -1 digit -2 digit -3 digit -4 digit -5 digit -6 digit -7 digit -8 digit -9 digit -q quit -Q quit -:q quit -:Q quit -ZZ quit - -# Stop processing (and ignore less' default values) -# (// FIXME: This stopped working and thus we just comment it out <2024-08-03> ) -# stop diff --git a/modules/home/conf/less/default.nix b/modules/home/conf/less/default.nix deleted file mode 100644 index 9991ebef..00000000 --- a/modules/home/conf/less/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{config, ...}: { - home.sessionVariables = { - PAGER = "less"; - MANPAGER = "less --color=d+r --color=u+b"; - - # These are added here because adding them in the lesskey file somehow doesn't work. - LESSHISTSIZE = 10000; - LESSHISTFILE = "${config.xdg.dataHome}/less/history"; - }; - - programs.less = { - enable = true; - keys = - builtins.readFile ./command.less - + builtins.readFile ./line-edit.less - + builtins.readFile ./env.less; - }; -} diff --git a/modules/home/conf/less/env.less b/modules/home/conf/less/env.less deleted file mode 100644 index 30f7645d..00000000 --- a/modules/home/conf/less/env.less +++ /dev/null @@ -1,2 +0,0 @@ -#env -LESS = -R --use-color --incsearch --modelines=2 --save-marks --wordwrap --status-line diff --git a/modules/home/conf/less/line-edit.less b/modules/home/conf/less/line-edit.less deleted file mode 100644 index a7e889db..00000000 --- a/modules/home/conf/less/line-edit.less +++ /dev/null @@ -1,29 +0,0 @@ -#line-edit -\t forw-complete -\17 back-complete -\e\t back-complete -ˆL expand -ˆV literal -ˆA literal -\es right -\kr right -\eh left -\kl left -\eb word-left -\e\kl word-left -\ew word-right -\e\kr word-right -\ei insert -\ex delete -\kx delete -\eX word-delete -\ekx word-delete -\e\b word-backspace -\e0 home -\kh home -\e$ end -\ke end -\en up -\ku up -\et down -ˆG abort diff --git a/modules/home/conf/lf/colors b/modules/home/conf/lf/colors deleted file mode 100644 index 1c2853ec..00000000 --- a/modules/home/conf/lf/colors +++ /dev/null @@ -1,184 +0,0 @@ -# vim:ft=dircolors -# (This is not a dircolors file but it helps to highlight colors and comments) - -# default values from dircolors -# (entries with a leading # are not implemented in lf) -# #no 00 # NORMAL -# fi 00 # FILE -# #rs 0 # RESET -# di 01;34 # DIR -# ln 01;36 # LINK -# #mh 00 # MULTIHARDLINK -# pi 40;33 # FIFO -# so 01;35 # SOCK -# #do 01;35 # DOOR -# bd 40;33;01 # BLK -# cd 40;33;01 # CHR -# or 40;31;01 # ORPHAN -# #mi 00 # MISSING -# su 37;41 # SETUID -# sg 30;43 # SETGID -# #ca 30;41 # CAPABILITY -# tw 30;42 # STICKY_OTHER_WRITABLE -# ow 34;42 # OTHER_WRITABLE -# st 37;44 # STICKY -# ex 01;32 # EXEC - -# default values from lf (with matching order) -# ln 01;36 # LINK -# or 31;01 # ORPHAN -# tw 01;34 # STICKY_OTHER_WRITABLE -# ow 01;34 # OTHER_WRITABLE -# st 01;34 # STICKY -# di 01;34 # DIR -# pi 33 # FIFO -# so 01;35 # SOCK -# bd 33;01 # BLK -# cd 33;01 # CHR -# su 01;32 # SETUID -# sg 01;32 # SETGID -# ex 01;32 # EXEC -# fi 00 # FILE - - -# file types (with matching order) -ln 01;93 # LINK -or 01;93;106 # ORPHAN -tw 35 # STICKY_OTHER_WRITABLE -ow 35 # OTHER_WRITABLE -st 01;96 # STICKY -di 01;36 # DIR -pi 33 # FIFO -so 01;35 # SOCK -bd 33;01 # BLK -cd 33;01 # CHR -su 01;32 # SETUID -sg 01;32 # SETGID -ex 03;01;95 # EXEC -fi 00 # FILE - -# links to hide -~/.mozilla 01;08;30 -~/.ssh 01;08;30 -~/.zshenv 01;08;30 - -~/.steampid 01;08;30 -~/.steam 01;08;30 -~/.steampath 01;08;30 - -# archives or compressed (dircolors defaults) -*.tar 01;31 -*.tgz 01;31 -*.arc 01;31 -*.arj 01;31 -*.taz 01;31 -*.lha 01;31 -*.lz4 01;31 -*.lzh 01;31 -*.lzma 01;31 -*.tlz 01;31 -*.txz 01;31 -*.tzo 01;31 -*.t7z 01;31 -*.zip 01;31 -*.z 01;31 -*.dz 01;31 -*.gz 01;31 -*.lrz 01;31 -*.lz 01;31 -*.lzo 01;31 -*.xz 01;31 -*.zst 01;31 -*.tzst 01;31 -*.bz2 01;31 -*.bz 01;31 -*.tbz 01;31 -*.tbz2 01;31 -*.tz 01;31 -*.deb 01;31 -*.rpm 01;31 -*.jar 01;31 -*.war 01;31 -*.ear 01;31 -*.sar 01;31 -*.rar 01;31 -*.alz 01;31 -*.ace 01;31 -*.zoo 01;31 -*.cpio 01;31 -*.7z 01;31 -*.rz 01;31 -*.cab 01;31 -*.wim 01;31 -*.swm 01;31 -*.dwm 01;31 -*.esd 01;31 - -# image formats (dircolors defaults) -*.jpg 01;35 -*.jpeg 01;35 -*.mjpg 01;35 -*.mjpeg 01;35 -*.gif 01;35 -*.bmp 01;35 -*.pbm 01;35 -*.pgm 01;35 -*.ppm 01;35 -*.tga 01;35 -*.xbm 01;35 -*.xpm 01;35 -*.tif 01;35 -*.tiff 01;35 -*.png 01;35 -*.svg 01;35 -*.svgz 01;35 -*.mng 01;35 -*.pcx 01;35 -*.mov 01;35 -*.mpg 01;35 -*.mpeg 01;35 -*.m2v 01;35 -*.mkv 01;35 -*.webm 01;35 -*.ogm 01;35 -*.mp4 01;35 -*.m4v 01;35 -*.mp4v 01;35 -*.vob 01;35 -*.qt 01;35 -*.nuv 01;35 -*.wmv 01;35 -*.asf 01;35 -*.rm 01;35 -*.rmvb 01;35 -*.flc 01;35 -*.avi 01;35 -*.fli 01;35 -*.flv 01;35 -*.gl 01;35 -*.dl 01;35 -*.xcf 01;35 -*.xwd 01;35 -*.yuv 01;35 -*.cgm 01;35 -*.emf 01;35 -*.ogv 01;35 -*.ogx 01;35 - -# audio formats (dircolors defaults) -*.aac 00;36 -*.au 00;36 -*.flac 00;36 -*.m4a 00;36 -*.mid 00;36 -*.midi 00;36 -*.mka 00;36 -*.mp3 00;36 -*.mpc 00;36 -*.ogg 00;36 -*.ra 00;36 -*.wav 00;36 -*.oga 00;36 -*.opus 00;36 -*.spx 00;36 -*.xspf 00;36 diff --git a/modules/home/conf/lf/commands/default.nix b/modules/home/conf/lf/commands/default.nix deleted file mode 100644 index 933769ac..00000000 --- a/modules/home/conf/lf/commands/default.nix +++ /dev/null @@ -1,227 +0,0 @@ -{ - pkgs, - sysLib, - shell_library, - system, - ... -}: let - functionCall = { - name, - dependencies, - replacementStrings, - ... - }: - sysLib.writeShellScript { - inherit name; - src = ./scripts/${name}.sh; - keepPath = true; - dependencies = dependencies ++ (builtins.attrValues {inherit (pkgs) dash coreutils;}); - inherit replacementStrings; - } - + "/bin/${name}"; - - shell = { - name, - dependencies, - replacementStrings ? null, - ... - }: '' - ''${{ - ${functionCall {inherit name dependencies replacementStrings;}} - }} - ''; # closes the lf tui - pipe = { - name, - dependencies, - replacementStrings ? null, - ... - }: '' - %{{ - ${functionCall {inherit name dependencies replacementStrings;}} - }} - ''; # runs the command in the ui/term bar - async = { - name, - dependencies, - replacementStrings ? null, - ... - }: '' - &{{ - ${functionCall {inherit name dependencies replacementStrings;}} - }} - ''; # runs the command in the background - wait = { - name, - dependencies, - replacementStrings ? null, - ... - }: '' - !{{ - ${functionCall {inherit name dependencies replacementStrings;}} - }} - ''; # adds a prompt after the command has run -in { - archive = shell { - name = "archive"; - dependencies = builtins.attrValues { - inherit - (pkgs) - fzf - gnutar - xz - p7zip - zip - ; - }; - }; - broot_jump = shell { - name = "broot_jump"; - dependencies = builtins.attrValues { - inherit (pkgs) broot; - }; - }; - chmod = pipe { - name = "chmod"; - dependencies = []; - }; - clear_trash = shell { - name = "clear_trash"; - dependencies = builtins.attrValues { - inherit - (pkgs) - fzf - trashy - ; - }; - }; - dl_file = pipe { - name = "dl_file"; - dependencies = builtins.attrValues { - inherit - (pkgs) - xdragon - curl - ; - }; - }; - dragon = pipe { - name = "dragon"; - dependencies = builtins.attrValues { - inherit - (pkgs) - xdragon - ; - }; - }; - dragon_individual = pipe { - name = "dragon_individual"; - dependencies = builtins.attrValues { - inherit - (pkgs) - xdragon - ; - }; - }; - dragon_stay = pipe { - name = "dragon_stay"; - dependencies = builtins.attrValues { - inherit - (pkgs) - xdragon - ; - }; - }; - execute = shell { - name = "execute"; - dependencies = []; - }; - follow_link = pipe { - name = "follow_link"; - dependencies = with pkgs; [lf]; - }; - fzf_jump = shell { - name = "fzf_jump"; - dependencies = builtins.attrValues { - inherit (pkgs) fzf lf gnused; - }; - }; - mk_dir = pipe { - name = "mk_dir"; - dependencies = []; - }; - mk_file = shell { - name = "mk_file"; - dependencies = []; - }; - mk_file_and_edit = shell { - name = "mk_file_and_edit"; - dependencies = []; - }; - mk_ln = pipe { - name = "mk_ln"; - dependencies = []; - }; - mk_scr_default = shell { - name = "mk_scr_default"; - dependencies = builtins.attrValues {}; - replacementStrings = { - SHELL_LIBRARY_TEMPLATE = "${shell_library.rawTemplate."${system}"}"; - }; - }; - mk_scr_temp = shell { - name = "mk_scr_temp"; - dependencies = builtins.attrValues {}; - replacementStrings = { - SHELL_LIBRARY_TEMPLATE = "${shell_library.rawTemplate."${system}"}"; - TO_BE_SHELL_LIBRARY_PATH = "%SHELL_LIBRARY_PATH"; # replacement is not recursive - }; - }; - view_file = async { - name = "view_file"; - dependencies = builtins.attrValues {inherit (pkgs) file;}; - }; - go_project_base_directory = async { - name = "go_project_root"; - dependencies = []; - }; - restore_trash = shell { - name = "restore_trash"; - dependencies = builtins.attrValues { - inherit - (pkgs) - fzf - trashy - ; - }; - }; - set_wall_paper = pipe { - name = "set_wall_paper"; - dependencies = []; - }; - stripspace = pipe { - name = "stripspace"; - dependencies = []; - }; - trash = pipe { - name = "trash"; - dependencies = builtins.attrValues { - inherit - (pkgs) - trashy - trash-cli - findutils - ; - }; - }; - unarchive = pipe { - name = "unarchive"; - dependencies = builtins.attrValues { - inherit - (pkgs) - gnutar - unzip - p7zip - ; - }; - }; -} diff --git a/modules/home/conf/lf/commands/scripts/archive.sh b/modules/home/conf/lf/commands/scripts/archive.sh deleted file mode 100755 index 25f40534..00000000 --- a/modules/home/conf/lf/commands/scripts/archive.sh +++ /dev/null @@ -1,77 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# Option '-f' disables pathname expansion which can be useful when $f, $fs, and -# $fx variables contain names with '*' or '?' characters. However, this option -# is used selectively within individual commands as it can be limiting at -# times. -set -f - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" - -archivers="$(tmp echo gzip xz 7z zip)" -archiver="$(awk '{for (i=1; i<=NF; i++) print $i}' "$archivers" | fzf)" - -case "$archiver" in -"gzip") - ext=tar.gz - ;; -"xz") - ext=tar.xz - ;; -"7z") - ext=7z - ;; -"zip") - ext=zip - ;; -esac - -prompt "Archive name: " -name="" -while [ -z "$name" ] || [ -e "$name" ]; do - read -r name_base - name="$name_base.$ext" - if [ -e "$name" ]; then - prompt "Archive already exists, overwrite [y|N]: " - read -r ans - - if [ "$ans" = "y" ]; then - break - else - prompt "Archive name: " - fi - fi -done - -root="$(if [ "$(pwd)" = "/" ]; then pwd; else echo "$(pwd)/"; fi)" - -# fx contains all selected file name separated by a newline -while read -r raw_file; do - file="$(echo "$raw_file" | sed "s|$root||")" - set -- "$@" "$file" -done <"$(tmp echo "$fx")" - -case "$archiver" in -"gzip") - tar --create --gzip -file="$name" "$@" - ;; -"xz") - tar --create --file="$name" "$@" - xz --compress -9 --extreme --threads=0 "$name" - ;; -"7z") - 7z a "$name" "$@" - ;; -"zip") - zip --symlinks -9 -r "$name" "$@" - ;; -esac -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/broot_jump.sh b/modules/home/conf/lf/commands/scripts/broot_jump.sh deleted file mode 100755 index 8f40ba01..00000000 --- a/modules/home/conf/lf/commands/scripts/broot_jump.sh +++ /dev/null @@ -1,25 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -tmp=$(mktmp) -res="$(broot --outcmd "$tmp" && sed 's/cd //' "$tmp")" - -if [ -f "$res" ]; then - cmd="select" -elif [ -d "$res" ]; then - cmd="cd" -fi - -lf -remote "send '$id' '$cmd' '$res'" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/chmod.sh b/modules/home/conf/lf/commands/scripts/chmod.sh deleted file mode 100755 index 9859127b..00000000 --- a/modules/home/conf/lf/commands/scripts/chmod.sh +++ /dev/null @@ -1,24 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -readp "Mode bits: " bits -# shellcheck disable=SC2269 -bits="$bits" - -while read -r file; do - chmod "$bits" "$file" -done <"$(tmp echo "$fx")" - -lf -remote 'send reload' -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/clear_trash.sh b/modules/home/conf/lf/commands/scripts/clear_trash.sh deleted file mode 100755 index 9052bb5f..00000000 --- a/modules/home/conf/lf/commands/scripts/clear_trash.sh +++ /dev/null @@ -1,8 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# could also use --force, for instand removal -trash list | fzf --multi | awk '{print $NF}' | xargs trash empty --match=exact -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/cow_cp.sh b/modules/home/conf/lf/commands/scripts/cow_cp.sh deleted file mode 100755 index 98675b9e..00000000 --- a/modules/home/conf/lf/commands/scripts/cow_cp.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env bash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -# source: https://github.com/gokcehan/lf/wiki/Tips#use-copy-on-write-when-possible -# -# # FIXME: Add this. The hardest part is in checking, if a file can be reflinked, as fuse and bind mount are hard to -# backtrack <2023-08-29> - -# # This was very helpful for debugging: -# log_file="$HOME/lf-reflink-log-$(date +'%Y-%m-%d_%H-%M-%S')" -# [ -f "$log_file" ] || touch "$log_file" -# exec 1>> $log_file 2>&1 -# set -x - -# In theory, this may fail, -# but I tested it on selection with 10k files - everything worked (bash) -# FIXME: This will very likely fail on dash, when the file number > 255 <2023-08-29> -set -- "$(cat ~/.local/share/lf/files)" - -mode="$1" -shift - -if [ "$mode" = 'copy' ]; then - # Reflink if all items of selection and the destination are on the - # same mount point and it is CoW fs. - # (to make sure reflink never fails in first place, so we don't have to - # clean up) - - src_targets="$(df --output=target -- "$@" | sed '1d' | sort -u)" - - if [ "$(df --output=target -- "$PWD" | tail -n 1)" = \ - "$(echo "$src_targets" | tail -n 1)" ] && - (("$(echo "$src_targets" | wc -l)" == 1)) && - [[ "$(df --output=fstype -- "$PWD" | tail -n 1)" =~ ^(btrfs|xfs|zfs)$ ]]; then - - echo 'selected copy and cp reflink paste' - - start=$(date '+%s') - - # Handle same names in dst - # TODO parallelism, idk - but exit/return/break won't stop the loop from subshell... - for i in "$@"; do - name="${i##*/}" - original="$name" - - count=0 - while [ -w "$PWD/$name" ]; do - count=$((count + 1)) - name="$original.~$count~" - done - - set +e - cp_out="$(cp -rn --reflink=always -- "$i" "$PWD/$name" 2>&1)" - set -e - - if [ -n "$cp_out" ]; then - lf -remote "send $id echoerr $cp_out" - exit 0 - fi - done - - finish=$(($(date '+%s') - start)) - t='' - if ((finish > 2)); then - t="${finish}s" - fi - - # Or just skip a file when names are the same. - # (A LOT faster if you e.g. pasting selection of 10k files) - # cp -rn --reflink=always -- "$@" . - - lf -remote "send clear" - - green=$'\u001b[32m' - reset=$'\u001b[0m' - lf -remote "send $id echo ${green}reflinked!${reset} $t" - else - echo 'selected copy and lf native paste' - lf -remote "send $id paste" - lf -remote "send clear" - fi - -elif [ "$mode" = 'move' ]; then - echo 'selected move and lf native paste' - lf -remote "send $id paste" - lf -remote "send clear" -fi - -# # for debug -# set +x - -lf -remote "send load" - -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/dl_file.sh b/modules/home/conf/lf/commands/scripts/dl_file.sh deleted file mode 100755 index c7e3d8b2..00000000 --- a/modules/home/conf/lf/commands/scripts/dl_file.sh +++ /dev/null @@ -1,43 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -# Provides the ability to download a file by dropping it into a window - -url="$(dragon -t -x)" - -if [ -n "$url" ]; then - prompt "File Name: " - name="" - while [ -z "$name" ] || [ -e "$name" ]; do - read -r name - if [ -e "$name" ]; then - prompt "File already exists, overwrite [y|N]: " - read -r ans - - if [ "$ans" = "y" ]; then - break - else - prompt "File Name: " - fi - fi - done - - # Download the file with curl - if [ -n "$name" ]; then - curl -o "$name" "$url" || die "curl failed" - fi -else - die "URL is null!" -fi -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/dragon.sh b/modules/home/conf/lf/commands/scripts/dragon.sh deleted file mode 100755 index cf3c3176..00000000 --- a/modules/home/conf/lf/commands/scripts/dragon.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -while read -r file; do - set -- "$@" "$file" -done <"$(tmp echo "$fx")" - -dragon -a -x "$@" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/dragon_individual.sh b/modules/home/conf/lf/commands/scripts/dragon_individual.sh deleted file mode 100755 index 2465cdfa..00000000 --- a/modules/home/conf/lf/commands/scripts/dragon_individual.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -while read -r file; do - set -- "$@" "$file" -done <"$(tmp echo "$fx")" - -dragon "$@" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/dragon_stay.sh b/modules/home/conf/lf/commands/scripts/dragon_stay.sh deleted file mode 100755 index 066b4c75..00000000 --- a/modules/home/conf/lf/commands/scripts/dragon_stay.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -while read -r file; do - set -- "$@" "$file" -done <"$(tmp echo "$fx")" - -dragon -a "$@" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/execute.sh b/modules/home/conf/lf/commands/scripts/execute.sh deleted file mode 100755 index aa97fd7f..00000000 --- a/modules/home/conf/lf/commands/scripts/execute.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -dir="$(realpath "$f")" - -"$dir" - -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/follow_link.sh b/modules/home/conf/lf/commands/scripts/follow_link.sh deleted file mode 100755 index 80413990..00000000 --- a/modules/home/conf/lf/commands/scripts/follow_link.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -dir="$(realpath "$f")" - -lf -remote "send $id cd \"$dir\"" - -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/fzf_jump.sh b/modules/home/conf/lf/commands/scripts/fzf_jump.sh deleted file mode 100755 index ad1633fb..00000000 --- a/modules/home/conf/lf/commands/scripts/fzf_jump.sh +++ /dev/null @@ -1,24 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -res="$(fd . --maxdepth 3 | fzf --header='Jump to location')" - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -if [ -f "$res" ]; then - cmd="select" -elif [ -d "$res" ]; then - cmd="cd" -fi - -lf -remote "send $id $cmd \"$res\"" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/go_project_root.sh b/modules/home/conf/lf/commands/scripts/go_project_root.sh deleted file mode 100755 index 5f7746d3..00000000 --- a/modules/home/conf/lf/commands/scripts/go_project_root.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -flake_base_dir="$(search_flake_base_dir)" -if [ "$flake_base_dir" ]; then - lf -remote "send $id cd $flake_base_dir" || die "Bug: No base dir ($flake_base_dir)" -else - die "Unable to locate base dir" -fi - -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/mk_dir.sh b/modules/home/conf/lf/commands/scripts/mk_dir.sh deleted file mode 100755 index 150f7eed..00000000 --- a/modules/home/conf/lf/commands/scripts/mk_dir.sh +++ /dev/null @@ -1,32 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -prompt "Directory Name: " -name="" -while [ -z "$name" ] || [ -e "$name" ]; do - read -r name - if [ -e "$name" ]; then - prompt "Directory already exists, overwrite [y|N]: " - read -r ans - - if [ "$ans" = "y" ]; then - break - else - prompt "Directory Name: " - fi - fi -done - -mkdir "$name" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/mk_file.sh b/modules/home/conf/lf/commands/scripts/mk_file.sh deleted file mode 100755 index 41d5cf1a..00000000 --- a/modules/home/conf/lf/commands/scripts/mk_file.sh +++ /dev/null @@ -1,32 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -prompt "File name: " -name="" -while [ -z "$name" ] || [ -e "$name" ]; do - read -r name - if [ -e "$name" ]; then - prompt "File already exists, overwrite [y|N]: " - read -r ans - - if [ "$ans" = "y" ]; then - break - else - prompt "File name: " - fi - fi -done - -touch "$name" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/mk_file_and_edit.sh b/modules/home/conf/lf/commands/scripts/mk_file_and_edit.sh deleted file mode 100755 index 19fc51db..00000000 --- a/modules/home/conf/lf/commands/scripts/mk_file_and_edit.sh +++ /dev/null @@ -1,33 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -prompt "File name: " -name="" -while [ -z "$name" ] || [ -e "$name" ]; do - read -r name - if [ -e "$name" ]; then - prompt "File already exists, overwrite [y|N]: " - read -r ans - - if [ "$ans" = "y" ]; then - break - else - prompt "File name: " - fi - fi -done - -touch "$name" -"$EDITOR" "$name" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/mk_ln.sh b/modules/home/conf/lf/commands/scripts/mk_ln.sh deleted file mode 100755 index 7fab8e22..00000000 --- a/modules/home/conf/lf/commands/scripts/mk_ln.sh +++ /dev/null @@ -1,45 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -while IFS= read -r i; do - set -- "$@" "$i" -done <"$HOME"/.local/share/lf/files - -mode="$1" -shift - -if [ "$#" -eq 0 ]; then - msg "no files to link" - exit 0 -fi - -case "$mode" in -copy) - while [ "$#" -gt 0 ]; do - file="$1" - ans="$(basename "$file")" - - while [ -e "$ans" ]; do - prompt "$ans already exists, new name for link: " - read -r ans - done - - ln --symbolic --relative "$file" "$(pwd)/$ans" - shift - done - ;; -esac -rm ~/.local/share/lf/files -# lf -remote "send clear" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/mk_scr_default.sh b/modules/home/conf/lf/commands/scripts/mk_scr_default.sh deleted file mode 100755 index 47d05080..00000000 --- a/modules/home/conf/lf/commands/scripts/mk_scr_default.sh +++ /dev/null @@ -1,38 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -prompt "Script name: " -name="" -while [ -z "$name" ] || [ -e "$name" ]; do - read -r name_base - name="$name_base.sh" - if [ -e "$name" ]; then - prompt "Script already exists, overwrite [y|N]: " - read -r ans - - if [ "$ans" = "y" ]; then - break - else - prompt "Script Name: " - fi - fi -done - -script="$(pwd)"/"$name" - -cat "%SHELL_LIBRARY_TEMPLATE" >"$script" -chmod +x "$script" -"$VISUAL" "$script" - -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/mk_scr_temp.sh b/modules/home/conf/lf/commands/scripts/mk_scr_temp.sh deleted file mode 100755 index 512b5d0b..00000000 --- a/modules/home/conf/lf/commands/scripts/mk_scr_temp.sh +++ /dev/null @@ -1,38 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -prompt "Script name: " -name="" -while [ -z "$name" ] || [ -e "$name" ]; do - read -r name - if [ -e "$name" ]; then - prompt "Script already exists, overwrite [y|N]: " - read -r ans - - if [ "$ans" = "y" ]; then - break - else - prompt "Script Name: " - fi - fi -done - -script="$(pwd)"/"$name" - -sed 's|%TO_BE_SHELL_LIBRARY_PATH|%SHELL_LIBRARY_PATH|' "%SHELL_LIBRARY_TEMPLATE" >"$script" -sed -i 's|dash|sh|' "$script" -chmod +x "$script" -"$VISUAL" "$script" - -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/restore_trash.sh b/modules/home/conf/lf/commands/scripts/restore_trash.sh deleted file mode 100755 index b4ef492f..00000000 --- a/modules/home/conf/lf/commands/scripts/restore_trash.sh +++ /dev/null @@ -1,16 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -trash list | fzf --multi | awk '{print $NF}' | xargs trash restore --match=exact -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/set_wall_paper.sh b/modules/home/conf/lf/commands/scripts/set_wall_paper.sh deleted file mode 100755 index 2e607d33..00000000 --- a/modules/home/conf/lf/commands/scripts/set_wall_paper.sh +++ /dev/null @@ -1,19 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -die "No yet implemented" # TODO: do what the 'die' says -#sed -i "s,export AWMWALLPAPER='.*',export AWMWALLPAPER='${f}'," ${ZDOTDIR}/.zshenv -#nohub swaybg -i "$f" -#feh --bg-max --no-fehbg "$f" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/stripspace.sh b/modules/home/conf/lf/commands/scripts/stripspace.sh deleted file mode 100755 index 33b1cbcf..00000000 --- a/modules/home/conf/lf/commands/scripts/stripspace.sh +++ /dev/null @@ -1,40 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -files=$(mktmp) -echo "$fx" >"$files" - -awk_source=$(mktmp) -cat <"$awk_source" -BEGIN {FS=" "} -{for (i=1; i != NF + 1; i++) - if (i == NF) { - parts[i]=tolower(\$i); - } else { - parts[i]=tolower(\$i"_"); - } -} -END {for (i in parts) printf parts[i]} -OFT - -while read -r file; do - dirty_name=$(mktmp) - basename "$file" >"$dirty_name" - clean_name=$(awk -f "$awk_source" "$dirty_name") - - [ -e "$clean_name" ] && die "file \"$clean_name\" already exists!" - mv "$(cat "$dirty_name")" "$clean_name" || die "Move failed" - lf -remote 'send reload' -done <"$files" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/trash.sh b/modules/home/conf/lf/commands/scripts/trash.sh deleted file mode 100755 index f4878c49..00000000 --- a/modules/home/conf/lf/commands/scripts/trash.sh +++ /dev/null @@ -1,37 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -trash_output=$(mktmp) -expected_error_output=$(mktmp) - -while read -r file; do - set -- "$@" "$file" -done <"$(tmp echo "$fx")" - -# TODO: why are we using trashy at all, when trash-cli can do everything? -# -# try trashy first, through nix because both trashy and trash-cli provide a trash command, which conflicts -nix run nixpkgs#trashy -- put "$@" 2>"$trash_output" - -# FIXME: Find a way, that does not depend on parsing an error message <2023-08-29> -cat <"$expected_error_output" -error: Error during a \`trash\` operation: Unknown { description: "Path: '\"/.Trash-1000\"'. Message: Permission denied (os error 13)" } -EOF - -if [ "$(cat "$expected_error_output")" = "$(cat "$trash_output")" ]; then - warning "Deleting with trash-cli to the /.Trash folder" - # this file could not be trashed because it is on the tempfs volume, trash-cli can do this this - trash-put "$@" -fi -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/unarchive.sh b/modules/home/conf/lf/commands/scripts/unarchive.sh deleted file mode 100755 index d4835f6b..00000000 --- a/modules/home/conf/lf/commands/scripts/unarchive.sh +++ /dev/null @@ -1,36 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" -# shellcheck disable=SC2269 -id="$id" - -# extract the current file with the right command -# (xkcd link: https://xkcd.com/1168/) -set -f - -unarchive() { - case "$1" in - *.tar.bz | *.tar.bz2 | *.tbz | *.tbz2) tar xjvf "$1" ;; - *.tar.gz | *.tgz) tar xzvf "$1" ;; - *.tar.xz | *.txz) tar xJvf "$1" ;; - *.zip) unzip "$1" ;; - *.rar) - die "rar is a unfree format!" - ;; - *.7z) 7z x "$1" ;; - *) die "Unsupported format" ;; - esac -} - -while read -r file; do - unarchive "$file" -done <"$fx" -# vim: ft=sh diff --git a/modules/home/conf/lf/commands/scripts/view_file.sh b/modules/home/conf/lf/commands/scripts/view_file.sh deleted file mode 100755 index 6258d755..00000000 --- a/modules/home/conf/lf/commands/scripts/view_file.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# shellcheck disable=SC2269 -f="$f" -# shellcheck disable=SC2269 -fx="$fx" -# shellcheck disable=SC2269 -fs="$fs" - -mime_type="$(file --mime-type --brief --dereference "$f")" -case "$mime_type" in -application/pdf) - "$READER" "$f" - ;; -image/*) - "$IVIEWER" "$f" - ;; -*) - die "Mime-Type: '$mime_type' not supported" - ;; -esac - -# vim: ft=sh diff --git a/modules/home/conf/lf/default.nix b/modules/home/conf/lf/default.nix deleted file mode 100644 index 7b604ed0..00000000 --- a/modules/home/conf/lf/default.nix +++ /dev/null @@ -1,59 +0,0 @@ -{ - pkgs, - sysLib, - nixosConfig, - shell_library, - system, - ... -}: let - commands = import ./commands {inherit pkgs sysLib shell_library system;}; - keybindings = import ./keybindings {inherit nixosConfig;}; -in { - xdg.configFile."lf/icons".source = ./icons; - xdg.configFile."lf/colors".source = ./colors; - - # TODO: add the systemd tempfile option here - - programs.lf = { - enable = true; - - inherit commands keybindings; - - previewer = { - keybinding = "i"; - source = "${pkgs.ctpv}/bin/ctpv"; - }; - settings = { - # close the server, after the last client exits - autoquit = true; - - # disable the cusor in the preview pane - cursorpreviewfmt = ""; - - # preview for directories - # dirpreviews = true; - - # count things in directories - dircounts = true; - - drawbox = true; - - # errorfmt = "\\033[1;91m==> ERROR:\\033[0m\\033[1;93m%s\\033[0m"; - errorfmt = "\\033[1;91m%s\\033[0m"; - hidden = true; # show hidden files - icons = true; - ifs = "\\n"; # internal field separator for shell commands - #info = "size"; # show the size of a directory - shell = "sh"; - shellopts = "-eu"; # e: exit on error; u: error for unset variables - }; - # TODO: remove auto quit, if it has been added - extraConfig = '' - &${pkgs.ctpv}/bin/ctpv -s $id - cmd on-quit %${pkgs.ctpv}/bin/ctpv -e $id - set cleaner ${pkgs.ctpv}/bin/ctpvclear - - source ${nixosConfig.age.secrets.lf_cd_paths.path} - ''; - }; -} diff --git a/modules/home/conf/lf/icons b/modules/home/conf/lf/icons deleted file mode 100644 index 9047fbfb..00000000 --- a/modules/home/conf/lf/icons +++ /dev/null @@ -1,360 +0,0 @@ -# vim:ft=conf - -# These examples require Nerd Fonts or a compatible font to be used. -# See https://www.nerdfonts.com for more information. - -# default values from lf (with matching order) -# ln l # LINK -# or l # ORPHAN -# tw t # STICKY_OTHER_WRITABLE -# ow d # OTHER_WRITABLE -# st t # STICKY -# di d # DIR -# pi p # FIFO -# so s # SOCK -# bd b # BLK -# cd c # CHR -# su u # SETUID -# sg g # SETGID -# ex x # EXEC -# fi - # FILE - -# file types (with matching order) -ln  # LINK -or  # ORPHAN -tw t # STICKY_OTHER_WRITABLE -ow  # OTHER_WRITABLE -st t # STICKY -di  # DIR -pi p # FIFO -so s # SOCK -bd b # BLK -cd c # CHR -su u # SETUID -sg g # SETGID -ex  # EXEC -fi  # FILE - -# file extensions (vim-devicons) -*.styl  -*.sass  -*.scss  -*.htm  -*.html  -*.slim  -*.haml  -*.ejs  -*.css  -*.less  -*.md  -*.mdx  -*.markdown  -*.rmd  -*.json  -*.webmanifest  -*.js  -*.mjs  -*.jsx  -*.rb  -*.gemspec  -*.rake  -*.php  -*.py  -*.pyc  -*.pyo  -*.pyd  -*.coffee  -*.mustache  -*.hbs  -*.conf  -*.ini  -*.yml  -*.yaml  -*.toml  -*.bat  -*.mk  -*.jpg  -*.jpeg  -*.bmp  -*.png  -*.webp  -*.gif  -*.ico  -*.twig  -*.cpp  -*.c++  -*.cxx  -*.cc  -*.cp  -*.c  -*.cs 󰌛 -*.h  -*.hh  -*.hpp  -*.hxx  -*.hs  -*.lhs  -*.nix  -*.lua  -*.java  -*.sh  -*.fish  -*.bash  -*.zsh  -*.ksh  -*.csh  -*.awk  -*.ps1  -*.ml λ -*.mli λ -*.diff  -*.db  -*.sql  -*.sqlite  -*.dump  -*.clj  -*.cljc  -*.cljs  -*.edn  -*.scala  -*.go  -*.dart  -*.xul  -*.sln  -*.suo  -*.pl  -*.pm  -*.t  -*.rss  -'*.f#'  -*.fsscript  -*.fsx  -*.fs  -*.fsi  -*.rs  -*.rlib  -*.d  -*.erl  -*.hrl  -*.ex  -*.exs  -*.eex  -*.leex  -*.heex  -*.vim  -*.ai  -*.psd  -*.psb  -*.ts  -*.tsx  -*.jl  -*.pp  -*.vue 󰡄 -*.elm  -*.swift  -*.xcplayground  -*.tex 󰙩 -*.r 󰟔 -*.rproj 󰗆 -*.sol 󰡪 -*.pem 󰌋 - -# file names (vim-devicons) (case-insensitive not supported in lf) -*gruntfile.coffee  -*gruntfile.js  -*gruntfile.ls  -*gulpfile.coffee  -*gulpfile.js  -*gulpfile.ls  -*mix.lock  -*dropbox  -*.ds_store  -*.gitconfig  -*.gitignore  -*.gitattributes  -*.gitlab-ci.yml  -*.bashrc  -*.zshrc  -*.zshenv  -*.zprofile  -*.vimrc  -*.gvimrc  -*_vimrc  -*_gvimrc  -*.bashprofile  -*favicon.ico  -*license  -*node_modules  -*react.jsx  -*procfile  -*dockerfile  -*docker-compose.yml  -*rakefile  -*config.ru  -*gemfile  -*makefile  -*cmakelists.txt  -*robots.txt 󰚩 - -# file names (case-sensitive adaptations) -*Gruntfile.coffee  -*Gruntfile.js  -*Gruntfile.ls  -*Gulpfile.coffee  -*Gulpfile.js  -*Gulpfile.ls  -*Dropbox  -*.DS_Store  -*LICENSE  -*COPYING  -*COPYING.LESSER  -*React.jsx  -*Procfile  -*Dockerfile  -*Docker-compose.yml  -*Rakefile  -*Gemfile  -*Makefile  -*CMakeLists.txt  - -# file patterns (vim-devicons) (patterns not supported in lf) -# .*jquery.*\.js$  -# .*angular.*\.js$  -# .*backbone.*\.js$  -# .*require.*\.js$  -# .*materialize.*\.js$  -# .*materialize.*\.css$  -# .*mootools.*\.js$  -# .*vimrc.*  -# Vagrantfile$  - -# file patterns (file name adaptations) -*jquery.min.js  -*angular.min.js  -*backbone.min.js  -*require.min.js  -*materialize.min.js  -*materialize.min.css  -*mootools.min.js  -*vimrc  -Vagrantfile  - -# archives or compressed (extensions from dircolors defaults) -*.tar  -*.tgz  -*.arc  -*.arj  -*.taz  -*.lha  -*.lz4  -*.lzh  -*.lzma  -*.tlz  -*.txz  -*.tzo  -*.t7z  -*.zip  -*.z  -*.dz  -*.gz  -*.lrz  -*.lz  -*.lzo  -*.xz  -*.zst  -*.tzst  -*.bz2  -*.bz  -*.tbz  -*.tbz2  -*.tz  -*.deb  -*.rpm  -*.jar  -*.war  -*.ear  -*.sar  -*.rar  -*.alz  -*.ace  -*.zoo  -*.cpio  -*.7z  -*.rz  -*.cab  -*.wim  -*.swm  -*.dwm  -*.esd  - -# image formats (extensions from dircolors defaults) -*.jpg  -*.jpeg  -*.mjpg  -*.mjpeg  -*.gif  -*.bmp  -*.pbm  -*.pgm  -*.ppm  -*.tga  -*.xbm  -*.xpm  -*.tif  -*.tiff  -*.png  -*.svg  -*.svgz  -*.mng  -*.pcx  -*.mov  -*.mpg  -*.mpeg  -*.m2v  -*.mkv  -*.webm  -*.ogm  -*.mp4  -*.m4v  -*.mp4v  -*.vob  -*.qt  -*.nuv  -*.wmv  -*.asf  -*.rm  -*.rmvb  -*.flc  -*.avi  -*.fli  -*.flv  -*.gl  -*.dl  -*.xcf  -*.xwd  -*.yuv  -*.cgm  -*.emf  -*.ogv  -*.ogx  - -# audio formats (extensions from dircolors defaults) -*.aac  -*.au  -*.flac  -*.m4a  -*.mid  -*.midi  -*.mka  -*.mp3  -*.mpc  -*.ogg  -*.ra  -*.wav  -*.oga  -*.opus  -*.spx  -*.xspf  - -# other formats -*.pdf  diff --git a/modules/home/conf/lf/keybindings/default.nix b/modules/home/conf/lf/keybindings/default.nix deleted file mode 100644 index b41004dc..00000000 --- a/modules/home/conf/lf/keybindings/default.nix +++ /dev/null @@ -1,94 +0,0 @@ -{nixosConfig, ...}: { - # Remove some defaults - "'\"'" = null; - ";" = null; - "\"'\"" = null; - c = null; - d = null; - e = null; - j = null; - k = null; - m = null; - f = null; - - # Sorting - kn = ":set sortby natural; set info"; - ks = ":set sortby size; set info size"; - kt = ":set sortby time; set info time"; - ka = ":set sortby atime; set info atime"; - kc = ":set sortby ctime; set info ctime"; - ke = ":set sortby ext; set info"; - - # Searching - l = "search-next"; - L = "search-prev"; - - # File Openers - ee = "\$\$EDITOR \"$f\""; - es = "\$ nvim -S \"$f\""; - u = "view_file"; - cc = "\$sudo -e \"$f\""; - fe = "execute"; - fl = "follow_link"; - - # Archive Mappings - au = "unarchive"; - aa = "archive"; - - # Trash Mappings - dd = "trash"; - jc = "clear_trash"; - jr = "restore_trash"; - - # Dragon Mapping - dr = "dragon"; - ds = "dragon-stay"; - di = "dragon-individual"; - #dm = "mvdragon"; - #dc = "cpdragon"; - dl = "dlfile"; - - cs = "stripspace"; - - # Vim keys - h = "updir"; - t = "down"; - n = "up"; - s = "open"; - - # Basic Functions - "." = "set hidden!"; - DD = "delete"; - p = "paste"; - x = "cut"; - y = "copy"; - "" = "open"; - - mk = "mk_ln"; - mf = "mk_file"; - me = "mk_file_and_edit"; - md = "mk_dir"; - ms = "mk_scr_default"; - mt = "mk_scr_temp"; - - ch = "chmod"; - bg = "set_wall_paper"; - r = ":rename; cmd-end"; - H = "go_project_base_directory"; - R = "reload"; - C = "clear"; - U = "unselect"; - - # Movement - gjr = "cd ~/.local/share/Trash/files"; - gus = "cd /run/user/${builtins.toString nixosConfig.users.users.soispha.uid}"; - - gc = "cd ~/.config"; - gl = "cd ~/.local"; - gE = "cd /etc"; - - "gU." = "cd /usr"; - gUs = " cd /usr/share"; - - gt = "cd /tmp"; -} diff --git a/modules/home/conf/mail/accounts/benedikt.nix b/modules/home/conf/mail/accounts/benedikt.nix deleted file mode 100644 index 87ede61b..00000000 --- a/modules/home/conf/mail/accounts/benedikt.nix +++ /dev/null @@ -1,48 +0,0 @@ -{pkgs}: { - address = "benedikt.peetz@b-peetz.de"; - userName = "benedikt.peetz@b-peetz.de"; - realName = "Benedikt Peetz"; - primary = true; - passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup account benedikt.peetz@b-peetz.de"; - aliases = [ - "@b-peetz.de" - ]; - folders = {}; - gpg = { - encryptByDefault = true; - key = "9A254A935C25B0419EAE495014D2BC012F572AD7"; - signByDefault = true; - }; - signature = { - # TODO: - }; - neomutt = { - enable = true; - }; - mbsync = { - enable = true; - create = "both"; - }; - # himalaya = { - # enable = true; - # backend = "imap"; - # sender = "smtp"; - # settings = { - # # TODO: - # }; - # }; - smtp = { - host = "server1.vhack.eu"; - port = 465; - }; - imap = { - host = "server1.vhack.eu"; - port = 993; - }; - jmap = { - # TODO: - }; - maildir = { - path = "bpeetz"; - }; -} diff --git a/modules/home/conf/mail/accounts/soispha.nix b/modules/home/conf/mail/accounts/soispha.nix deleted file mode 100644 index 012e84d6..00000000 --- a/modules/home/conf/mail/accounts/soispha.nix +++ /dev/null @@ -1,49 +0,0 @@ -{pkgs}: { - address = "soispha@vhack.eu"; - userName = "soispha@vhack.eu"; - realName = "Soispha"; - primary = false; - passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup account soispha@vhack.eu"; - aliases = [ - "admin@vhack.eu" - ]; - folders = { - }; - gpg = { - encryptByDefault = true; - key = "9606FC749FCE16360723D4ADA5E94010C3A642AD"; - signByDefault = true; - }; - signature = { - # TODO: - }; - neomutt = { - enable = true; - }; - mbsync = { - enable = true; - create = "both"; - }; - # himalaya = { - # enable = true; - # backend = "imap"; - # sender = "smtp"; - # settings = { - # # TODO: - # }; - # }; - smtp = { - host = "server1.vhack.eu"; - port = 465; - }; - imap = { - host = "server1.vhack.eu"; - port = 993; - }; - jmap = { - # TODO: - }; - maildir = { - path = "soispha"; - }; -} diff --git a/modules/home/conf/mail/default.nix b/modules/home/conf/mail/default.nix deleted file mode 100644 index 0ecbe40a..00000000 --- a/modules/home/conf/mail/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ - config, - pkgs, - ... -}: let - benedikt = import ./accounts/benedikt.nix {inherit pkgs;}; - soispha = import ./accounts/soispha.nix {inherit pkgs;}; - - accounts = {inherit soispha benedikt;}; -in { - accounts.email = { - maildirBasePath = "${config.xdg.dataHome}/maildir"; - inherit accounts; - }; -} diff --git a/modules/home/conf/mako/default.nix b/modules/home/conf/mako/default.nix deleted file mode 100644 index 711457f2..00000000 --- a/modules/home/conf/mako/default.nix +++ /dev/null @@ -1,44 +0,0 @@ -{ - config, - pkgs, - ... -}: { - services.mako = { - enable = true; - backgroundColor = "#2e3440"; - borderColor = "#88c0d0"; - borderRadius = 25; - borderSize = 2; - defaultTimeout = 5000; - font = "Source Code Pro 10"; - width = 500; - height = 500; - icons = true; - ignoreTimeout = true; - layer = "overlay"; - markup = true; # TODO: - maxIconSize = 64; - sort = "-time"; - extraConfig = '' - [urgency=low] - border-color=#cccccc - - [urgency=normal] - border-color=#d08770 - - [urgency=high] - border-size=3 - border-color=#bf616a - default-timeout=0 - - [urgency=critical] - border-size=4 - border-color=#bf616a - default-timeout=0 - - [category=mpd] - default-timeout=2000 - group-by=category - ''; - }; -} diff --git a/modules/home/conf/mbsync/default.nix b/modules/home/conf/mbsync/default.nix deleted file mode 100644 index ac9808c9..00000000 --- a/modules/home/conf/mbsync/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - config, - lib, - ... -}: { - # TODO: I have no clue if both are needed, but it looks neat, right? - programs.mbsync = { - enable = true; - }; - services.mbsync = { - enable = true; - # TODO: enable after isync 1.5 drops - #configFile = "${config.xdg.configHome}/mbsync/mbsync.conf"; - }; - # Disable the timer, and only activate it on neomutt start - systemd.user.timers.mbsync = lib.mkForce {}; -} diff --git a/modules/home/conf/mpd/default.nix b/modules/home/conf/mpd/default.nix deleted file mode 100644 index b30f6995..00000000 --- a/modules/home/conf/mpd/default.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ - config, - pkgs, - lib, - osConfig, - ... -}: let - dataDir = "${config.xdg.dataHome}/mpd"; - playlistDirectory = "${dataDir}/playlists"; - runtimeDir = "/run/user/${builtins.toString osConfig.users.users.soispha.uid}/mpd"; -in { - home.sessionVariables = { - MPD_HOST = "/run/user/${builtins.toString osConfig.users.users.soispha.uid}/mpd/socket"; - }; - - systemd.user.services.mpd.Service.ExecStartPre = lib.mkForce '' - ${pkgs.coreutils}/bin/mkdir --parents "${dataDir}" "${playlistDirectory}" "${runtimeDir}" - ''; - - services.mpd = { - enable = true; - inherit dataDir playlistDirectory; - musicDirectory = config.programs.beets.settings.directory; - network = { - listenAddress = "${runtimeDir}/socket"; - }; - - extraConfig = '' - metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc,comment" - # Updated by the beets `mpdupdate` plugin - auto_update "no" - - audio_output { - type "pipewire" - name "pipewire" - } - - replaygain "track" - replaygain_limit "yes" - - #database { - # plugin "simple" - # path "~/.local/share/mpd/db - # cache_directory "~/.local/share/mpd/cache" - #} - - filesystem_charset "UTF-8" - ''; - }; -} diff --git a/modules/home/conf/mpd/mpdconf.example b/modules/home/conf/mpd/mpdconf.example deleted file mode 100644 index eaa5e641..00000000 --- a/modules/home/conf/mpd/mpdconf.example +++ /dev/null @@ -1,418 +0,0 @@ -# An example configuration file for MPD. -# Read the user manual for documentation: http://www.musicpd.org/doc/user/ - - -# Files and directories ####################################################### -# -# This setting controls the top directory which MPD will search to discover the -# available audio files and add them to the daemon's online database. This -# setting defaults to the XDG directory, otherwise the music directory will be -# be disabled and audio files will only be accepted over ipc socket (using -# file:// protocol) or streaming files over an accepted protocol. -# -#music_directory "~/music" -# -# This setting sets the MPD internal playlist directory. The purpose of this -# directory is storage for playlists created by MPD. The server will use -# playlist files not created by the server but only if they are in the MPD -# format. This setting defaults to playlist saving being disabled. -# -#playlist_directory "~/.mpd/playlists" -# -# This setting sets the location of the MPD database. This file is used to -# load the database at server start up and store the database while the -# server is not up. This setting defaults to disabled which will allow -# MPD to accept files over ipc socket (using file:// protocol) or streaming -# files over an accepted protocol. -# -#db_file "~/.mpd/database" - -# These settings are the locations for the daemon log files for the daemon. -# -# The special value "syslog" makes MPD use the local syslog daemon. This -# setting defaults to logging to syslog. -# -# If you use systemd, do not configure a log_file. With systemd, MPD -# defaults to the systemd journal, which is fine. -# -#log_file "~/.mpd/log" - -# This setting sets the location of the file which stores the process ID -# for use of mpd --kill and some init scripts. This setting is disabled by -# default and the pid file will not be stored. -# -# If you use systemd, do not configure a pid_file. -# -#pid_file "~/.mpd/pid" - -# This setting sets the location of the file which contains information about -# most variables to get MPD back into the same general shape it was in before -# it was brought down. This setting is disabled by default and the server -# state will be reset on server start up. -# -#state_file "~/.mpd/state" -# -# The location of the sticker database. This is a database which -# manages dynamic information attached to songs. -# -#sticker_file "~/.mpd/sticker.sql" -# -############################################################################### - - -# General music daemon options ################################################ -# -# This setting specifies the user that MPD will run as. MPD should never run as -# root and you may use this setting to make MPD change its user ID after -# initialization. This setting is disabled by default and MPD is run as the -# current user. -# -#user "nobody" -# -# This setting specifies the group that MPD will run as. If not specified -# primary group of user specified with "user" setting will be used (if set). -# This is useful if MPD needs to be a member of group such as "audio" to -# have permission to use sound card. -# -#group "nogroup" -# -# This setting sets the address for the daemon to listen on. Careful attention -# should be paid if this is assigned to anything other than the default, any. -# This setting can deny access to control of the daemon. Not effective if -# systemd socket activation is in use. -# -# For network -#bind_to_address "any" -# -# And for Unix Socket -#bind_to_address "~/.mpd/socket" -# -# This setting is the TCP port that is desired for the daemon to get assigned -# to. -# -#port "6600" -# -# Suppress all messages below the given threshold. Use "verbose" for -# troubleshooting. Available setting arguments are "notice", "info", "verbose", -# "warning" and "error". -# -#log_level "notice" -# -# Setting "restore_paused" to "yes" puts MPD into pause mode instead -# of starting playback after startup. -# -#restore_paused "no" -# -# This setting enables MPD to create playlists in a format usable by other -# music players. -# -#save_absolute_paths_in_playlists "no" -# -# This setting defines a list of tag types that will be extracted during the -# audio file discovery process. The complete list of possible values can be -# found in the user manual. -#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" -# -# This example just enables the "comment" tag without disabling all -# the other supported tags: -#metadata_to_use "+comment" -# -# This setting enables automatic update of MPD's database when files in -# music_directory are changed. -# -#auto_update "yes" -# -# Limit the depth of the directories being watched, 0 means only watch -# the music directory itself. There is no limit by default. -# -#auto_update_depth "3" -# -############################################################################### - - -# Symbolic link behavior ###################################################### -# -# If this setting is set to "yes", MPD will discover audio files by following -# symbolic links outside of the configured music_directory. -# -#follow_outside_symlinks "yes" -# -# If this setting is set to "yes", MPD will discover audio files by following -# symbolic links inside of the configured music_directory. -# -#follow_inside_symlinks "yes" -# -############################################################################### - - -# Zeroconf / Avahi Service Discovery ########################################## -# -# If this setting is set to "yes", service information will be published with -# Zeroconf / Avahi. -# -#zeroconf_enabled "yes" -# -# The argument to this setting will be the Zeroconf / Avahi unique name for -# this MPD server on the network. %h will be replaced with the hostname. -# -#zeroconf_name "Music Player @ %h" -# -############################################################################### - - -# Permissions ################################################################# -# -# If this setting is set, MPD will require password authorization. The password -# setting can be specified multiple times for different password profiles. -# -#password "password@read,add,control,admin" -# -# This setting specifies the permissions a user has who has not yet logged in. -# -#default_permissions "read,add,control,admin" -# -############################################################################### - - -# Database ####################################################################### -# -# An example of a database section instead of the old 'db_file' setting. -# It enables mounting other storages into the music directory. -# -#database { -# plugin "simple" -# path "~/.local/share/mpd/db -# cache_directory "~/.local/share/mpd/cache" -#} -# -# An example of database config for a satellite setup -# -#music_directory "nfs://fileserver.local/srv/mp3" -#database { -# plugin "proxy" -# host "other.mpd.host" -# port "6600" -#} - -# Input ####################################################################### -# -input { - plugin "curl" -# proxy "proxy.isp.com:8080" -# proxy_user "user" -# proxy_password "password" -} - -# -############################################################################### - -# Audio Output ################################################################ -# -# MPD supports various audio output types, as well as playing through multiple -# audio outputs at the same time, through multiple audio_output settings -# blocks. Setting this block is optional, though the server will only attempt -# autodetection for one sound card. -# -# An example of an ALSA output: -# -#audio_output { -# type "alsa" -# name "My ALSA Device" -## device "hw:0,0" # optional -## mixer_type "hardware" # optional -## mixer_device "default" # optional -## mixer_control "PCM" # optional -## mixer_index "0" # optional -#} -# -# An example of an OSS output: -# -#audio_output { -# type "oss" -# name "My OSS Device" -## device "/dev/dsp" # optional -## mixer_type "hardware" # optional -## mixer_device "/dev/mixer" # optional -## mixer_control "PCM" # optional -#} -# -# An example of a shout output (for streaming to Icecast): -# -#audio_output { -# type "shout" -# encoder "vorbis" # optional -# name "My Shout Stream" -# host "localhost" -# port "8000" -# mount "/mpd.ogg" -# password "hackme" -# quality "5.0" -# bitrate "128" -# format "44100:16:1" -## protocol "icecast2" # optional -## user "source" # optional -## description "My Stream Description" # optional -## url "http://example.com" # optional -## genre "jazz" # optional -## public "no" # optional -## timeout "2" # optional -## mixer_type "software" # optional -#} -# -# An example of a recorder output: -# -#audio_output { -# type "recorder" -# name "My recorder" -# encoder "vorbis" # optional, vorbis or lame -# path "/var/lib/mpd/recorder/mpd.ogg" -## quality "5.0" # do not define if bitrate is defined -# bitrate "128" # do not define if quality is defined -# format "44100:16:1" -#} -# -# An example of a httpd output (built-in HTTP streaming server): -# -#audio_output { -# type "httpd" -# name "My HTTP Stream" -# encoder "vorbis" # optional, vorbis or lame -# port "8000" -# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 -## quality "5.0" # do not define if bitrate is defined -# bitrate "128" # do not define if quality is defined -# format "44100:16:1" -# max_clients "0" # optional 0=no limit -#} -# -# An example of a pulseaudio output (streaming to a remote pulseaudio server) -# -#audio_output { -# type "pulse" -# name "My Pulse Output" -## server "remote_server" # optional -## sink "remote_server_sink" # optional -## media_role "media_role" #optional -#} -# -# An example of a winmm output (Windows multimedia API). -# -#audio_output { -# type "winmm" -# name "My WinMM output" -## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional -# or -## device "0" # optional -## mixer_type "hardware" # optional -#} -# -# An example of a wasapi output (Windows multimedia API). -# -#audio_output { -# type "wasapi" -# name "My WASAPI output" -## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional -# or -## device "0" # optional -## Exclusive mode blocks all other audio source, and get best audio quality without resampling. -## exclusive "no" # optional -## Enumerate all devices in log. -## enumerate "no" # optional -#} -# -# An example of an openal output. -# -#audio_output { -# type "openal" -# name "My OpenAL output" -## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional -#} -# -# An example of an sndio output. -# -#audio_output { -# type "sndio" -# name "sndio output" -# mixer_type "hardware" -#} -# -# An example of an OS X output: -# -#audio_output { -# type "osx" -# name "My OS X Device" -## device "Built-in Output" # optional -## channel_map "-1,-1,0,1" # optional -#} -# -## Example "pipe" output: -# -#audio_output { -# type "pipe" -# name "my pipe" -# command "aplay -f cd 2>/dev/null" -## Or if you're want to use AudioCompress -# command "AudioCompress -m | aplay -f cd 2>/dev/null" -## Or to send raw PCM stream through PCM: -# command "nc example.org 8765" -# format "44100:16:2" -#} -# -## An example of a null output (for no audio output): -# -#audio_output { -# type "null" -# name "My Null Output" -# mixer_type "none" # optional -#} -# -############################################################################### - - -# Normalization automatic volume adjustments ################################## -# -# This setting specifies the type of ReplayGain to use. This setting can have -# the argument "off", "album", "track" or "auto". "auto" is a special mode that -# chooses between "track" and "album" depending on the current state of -# random playback. If random playback is enabled then "track" mode is used. -# See for -# more details about ReplayGain. -# This setting is off by default. -# -#replaygain "album" -# -# This setting sets the pre-amp used for files that have ReplayGain tags. By -# default this setting is disabled. -# -#replaygain_preamp "0" -# -# This setting sets the pre-amp used for files that do NOT have ReplayGain tags. -# By default this setting is disabled. -# -#replaygain_missing_preamp "0" -# -# This setting enables or disables ReplayGain limiting. -# MPD calculates actual amplification based on the ReplayGain tags -# and replaygain_preamp / replaygain_missing_preamp setting. -# If replaygain_limit is enabled MPD will never amplify audio signal -# above its original level. If replaygain_limit is disabled such amplification -# might occur. By default this setting is enabled. -# -#replaygain_limit "yes" -# -# This setting enables on-the-fly normalization volume adjustment. This will -# result in the volume of all playing audio to be adjusted so the output has -# equal "loudness". This setting is disabled by default. -# -#volume_normalization "no" -# -############################################################################### - -# Character Encoding ########################################################## -# -# If file or directory names do not display correctly for your locale then you -# may need to modify this setting. -# -#filesystem_charset "UTF-8" -# -############################################################################### diff --git a/modules/home/conf/mpv/default.nix b/modules/home/conf/mpv/default.nix deleted file mode 100644 index 6b252a38..00000000 --- a/modules/home/conf/mpv/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{...}: { - programs.mpv = { - enable = true; - bindings = { - q = "quit 0"; - "Ctrl+c" = "quit 1"; - "Shift+q" = "quit-watch-later 1"; - }; - }; -} diff --git a/modules/home/conf/mumble/Mumble.conf b/modules/home/conf/mumble/Mumble.conf deleted file mode 100644 index 2d895f41..00000000 --- a/modules/home/conf/mumble/Mumble.conf +++ /dev/null @@ -1,67 +0,0 @@ -[General] -databaselocation=/home/soispha/.local/share/Mumble/Mumble/mumble.sqlite -lastupdate=3 - -[audio] -headphone=true -input=PipeWire -loudness=1549 -output=PipeWire -quality=72000 -vadmax=@Variant(\0\0\0\x87?Kw\x97) -vadmin=@Variant(\0\0\0\x87?7\x1e\xd4) - -[messages] -10\log=13 -12\log=13 -14\log=13 -15\log=13 -17\log=13 -18\log=13 -19\log=13 -2\log=13 -20\log=13 -21\log=13 -22\log=13 -23\log=13 -25\log=13 -26\log=13 -27\log=13 -28\log=13 -29\log=13 -30\log=13 -31\log=13 -5\log=13 -6\log=13 -9\log=13 -size=32 - -[messagesounds] -size=31 - -[net] -certificate="@ByteArray(0\x82\tX\x2\x1\x3\x30\x82\t\xe\x6\t*\x86H\x86\xf7\r\x1\a\x1\xa0\x82\b\xff\x4\x82\b\xfb\x30\x82\b\xf7\x30\x82\x3\xad\x6\t*\x86H\x86\xf7\r\x1\a\x1\xa0\x82\x3\x9e\x4\x82\x3\x9a\x30\x82\x3\x96\x30\x82\x3\x92\x6\v*\x86H\x86\xf7\r\x1\f\n\x1\x3\xa0\x82\x3+0\x82\x3'\x6\n*\x86H\x86\xf7\r\x1\t\x16\x1\xa0\x82\x3\x17\x4\x82\x3\x13\x30\x82\x3\xf\x30\x82\x1\xf7\xa0\x3\x2\x1\x2\x2\x1\x1\x30\r\x6\t*\x86H\x86\xf7\r\x1\x1\x5\x5\0\x30\x16\x31\x14\x30\x12\x6\x3U\x4\x3\f\vMumble User0\x1e\x17\r230710132716Z\x17\r430705132716Z0\x16\x31\x14\x30\x12\x6\x3U\x4\x3\f\vMumble User0\x82\x1\"0\r\x6\t*\x86H\x86\xf7\r\x1\x1\x1\x5\0\x3\x82\x1\xf\0\x30\x82\x1\n\x2\x82\x1\x1\0\xb3\x8c\xd2\xdbM\x90\xa6\xc7}\xf4\x6X\xf9O\x16Q\x12\xc7\x1\xca\x88\x9c\x96o\xd1\x11\xc1\xc3\xd1/\xb6\x9d\xcfn\xcd\x84\xd2\x1d\xcc\xfcO\xf9\xa4\"\xaa'2\x6\xee[\x3\xd3vx\x84`i@P|\xb8\xc5I\xa8\xa2\b\xc8\0\xbd\xf1\xcc\x63\xbe\x99Zj&\xa5t\xc5\bOr\xc1\xaen\xc7\n\xd2\xcc\xa1\x30\xb8\xe0\0\xe8\xc5\xb6\x86g\x14\x30S\x9d\x8b\xfb\xacP\x7f+\x93}3\xe3\xcbPJ\x86\xf7^Z\xda\x87Z\xfez\xec\xc0\xf7\xe9\x80\xbc\xe2\re@\xe7\x92\x84\xe5\x97\f\x8c\n\x3\x1c\xd1\xbb\x32\xce\xfe\xb6\x1d\xefUYz\xf\xd7,5\x4G\x1f\t\xf7\x43\f?wx\x1a\x12\xd4.I\xbd\xe4G\xea\x33\x9d\xb1\xb0\x62\x45\xcd\xe0\x8b\xe4\x31\x1a\x8c\xedLEyC\xf0\x9f\x32}c\xc9X\x19[\xf7\xfb\xfc\x39\xe0\xd5\x30\x87\xd0\x82:\xb5\x87j]\x9d\xf8\x1b\x4\xb2P \x5/\xb2H\xfa\x42I\x1dN\xa9\xb7\x9a\x91*\x83\xe\x45\xcf\xbe\t\xb5\x36)\xf7\x7f\x1\x43\x2\x3\x1\0\x1\xa3h0f0\f\x6\x3U\x1d\x13\x1\x1\xff\x4\x2\x30\0\x30\x13\x6\x3U\x1d%\x4\f0\n\x6\b+\x6\x1\x5\x5\a\x3\x2\x30\x1d\x6\x3U\x1d\xe\x4\x16\x4\x14\xb9\x41\x19t\x16\x18~\xe8\v\xa9\x9b\x86i\x86\xeP%\xd7\n\xc9\x30\"\x6\t`\x86H\x1\x86\xf8\x42\x1\r\x4\x15\x16\x13Generated by Mumble0\r\x6\t*\x86H\x86\xf7\r\x1\x1\x5\x5\0\x3\x82\x1\x1\0\x91+\r'hS\xc2\x12k\x13O\xb2\"\x85\xd6w\x96\x8a\x97\x46\xee\x95Q\x8b\x8b\t\x8a\xfcH\xab\x30\x1dxV\xc9\xf5\x80\x42;'o\xf1\xd1\xf2\xfb\x18\xe2+\x8d\x39 \xc3\xe\x44\xa9\t\xe2i\x8a\xa7?#\xcd]0\xf4\x1d\x4\a\xd6\x87\x62\xe2\xd8\x34\xb6\xcf\x89\xf2\v\xf1\x8b\xc6\xf8\x8f\x94H/\xfa`\x9d\xb5\xac\x66H\xef\xf4\tJ\xfeHg]!\xed\n\xaf\xa8nd@y\xe8>A\x10\xc4>\xc3\xf7\xe3\xffW\x90T\x87\x94[\x7fg0+p\xdd\x3\x8d\xdb\x80\f?\xe9\xf9l5\xac)z+4R\xbc\xf3\xe1\x82\xde\xc3u\xb2\xa1s\xe2\xbb\xdcpL#|\f\x7f\x93\x30-\x6\t*\x86H\x86\xf7\r\x1\t\x14\x31 \x1e\x1e\0M\0u\0m\0\x62\0l\0\x65\0 \0I\0\x64\0\x65\0n\0t\0i\0t\0y0\x82\x5\x42\x6\t*\x86H\x86\xf7\r\x1\a\x1\xa0\x82\x5\x33\x4\x82\x5/0\x82\x5+0\x82\x5'\x6\v*\x86H\x86\xf7\r\x1\f\n\x1\x1\xa0\x82\x4\xc0\x30\x82\x4\xbc\x2\x1\0\x30\r\x6\t*\x86H\x86\xf7\r\x1\x1\x1\x5\0\x4\x82\x4\xa6\x30\x82\x4\xa2\x2\x1\0\x2\x82\x1\x1\0\xb3\x8c\xd2\xdbM\x90\xa6\xc7}\xf4\x6X\xf9O\x16Q\x12\xc7\x1\xca\x88\x9c\x96o\xd1\x11\xc1\xc3\xd1/\xb6\x9d\xcfn\xcd\x84\xd2\x1d\xcc\xfcO\xf9\xa4\"\xaa'2\x6\xee[\x3\xd3vx\x84`i@P|\xb8\xc5I\xa8\xa2\b\xc8\0\xbd\xf1\xcc\x63\xbe\x99Zj&\xa5t\xc5\bOr\xc1\xaen\xc7\n\xd2\xcc\xa1\x30\xb8\xe0\0\xe8\xc5\xb6\x86g\x14\x30S\x9d\x8b\xfb\xacP\x7f+\x93}3\xe3\xcbPJ\x86\xf7^Z\xda\x87Z\xfez\xec\xc0\xf7\xe9\x80\xbc\xe2\re@\xe7\x92\x84\xe5\x97\f\x8c\n\x3\x1c\xd1\xbb\x32\xce\xfe\xb6\x1d\xefUYz\xf\xd7,5\x4G\x1f\t\xf7\x43\f?wx\x1a\x12\xd4.I\xbd\xe4G\xea\x33\x9d\xb1\xb0\x62\x45\xcd\xe0\x8b\xe4\x31\x1a\x8c\xedLEyC\xf0\x9f\x32}c\xc9X\x19[\xf7\xfb\xfc\x39\xe0\xd5\x30\x87\xd0\x82:\xb5\x87j]\x9d\xf8\x1b\x4\xb2P \x5/\xb2H\xfa\x42I\x1dN\xa9\xb7\x9a\x91*\x83\xe\x45\xcf\xbe\t\xb5\x36)\xf7\x7f\x1\x43\x2\x3\x1\0\x1\x2\x82\x1\0\x4\xd6\xf2\x66\v\xe0\xae\xc6(\xccw\x91Ub\xfe\xd8\x7f\x97\x92\xa2Imc\x16\xaf}y\x8a\x14,\xe3\x90\xbc\x63!\xb2\aQ\xdbQ\x1f\xbc\xbc\x62\\\xd0\xc2\xa5\xf2-\xcc\xdc\x19\xd0\xe4\xcc\x8ey\xb7\xd1\xac\xcfP\x8du\x94\xa4\x3u\x1b;\xe5\xa2\x61\x12\xd1R\xaaZ\v\xe7\x8d\xf0\xabl\xce\xba\x99\xbd\x95\xdbpkCJr\xfb\xc5P9\x1e\xf\xb1iI9&\xeb\x62\x8a#\xa7\x17\xcbw\x92\xf9\xf7JZ\xa6;F\xb3\xba\xb1H\x89]uU7\x1e\xd7\xf6U`\x8d\xa1\x1aG7\x11\x31\xbf\xf4\xdb\x32\x63\xbf\x3\xad&h\x82\x9b\xe7\x19/\xf6\r\x8c\x89\xc6\xd0\x1d\0\x87\t|\xc0\xf2\x8f\xbb\x87_8{\xf2\xc7\x8a\x34)\xe3\xf1\xcc(\xf4\xee\xeb($\x5\x84\xaf\x1\xaa\xf7\xff\x9b\x15h\x2y\xb3\x91\xba,Oq\xc9$\x81\x11Zg\xc4I3\v\xeay\f\xf0\x33\xc6p\xea\xc6\x9d\xac\xaa\xedp\xa7!\xcbHf5\xa0i\xbdo@\xb8![\x7f\xea\xad\x6\x31p\x81\x61\x2\x81\x81\0\xdc\x8d}{\xc3\x31\xb6(F\xc5\x36\x9b\xba\x66\xb1\xce\r_\x90\xc6\x1f\x87\x37\x84m\xd1\a8\xc0\v9\xe0\x8bm\xaf\x64\xbe\x81\xa8\xe7\xaf\x19\x43,vj\xaf!9rz\x87\"\xca\xbf\xcf\x16\x88\x46t\xbd\x12\xaa;\xf4x_\x1b\xb3\x90\b\xb6\xf6\xec\x1f\x95\x62\xac\xfa\x1b\xae\xa2\xa7oA\x9bhOW\xa8\x44\\\xadz T\xe3\x43\x46\x99\x98\xb4{*\"\xdb\xd9\xc8\xd2\x15\n4\"\x8d\x96$\x17\xfd^\xf7\x84\x93\x7fw{o\0\xe1\x2\x81\x81\0\xd0hNA\xc3\x9e\x93&iq\x1dQ\xb6\xc6\x1c\x32\xf3\xfc c&Y\xe7|\xbeq2P\xe1\xdb\x97\xf8\x9fI(\x98\x9d\xf1\xfe\xb6\xf\x90\xa5\xebi>\x14\x6\xd8.\xf4\xce\x86\x9d*\x87 \xf9X\x4\xdcZ\xf9g\x3\x98H{\xdf\x66\xde\xd6zr\xecG_\x14t\x1dm%P\xe5\xea\x8e\x6\xa2. \xa1\xd7\xd7W]\xdd\x15\x6\xcf+/\x11\vel\xd3\xe8\xc3/\xbc\x1f\xc3n\xd4\xb8\x62j\xf5\xc0\xc0\x89\xe3z\xb8\x36\xd5\xb2\xa3\x2\x81\x80z`W\xdc\x30\x36\x89(W\xfc]\x8c\x93% K\x80\xc8\"\0\x8c\xc5\xee\\ \xc2\xf7\n\xda$`|\xe3`}\r\x9dWV\xa8\0\xc9\xcd\xd2\xc4\f\xe4\x8d%k+\x16\xbc.\n\xf7\x44\x9d\xd6\xfc\x1a\x88\x8a\xdd\x11J\xd9\xc4%\xe6g\xd8\xbc.\xe2\x11/J\x81\x2\x81\x80\x63;W\xf\xbf:1,\x98\x6\x31\x4\xa8wz\x13\xd4\xd2\x97\x5>\xcc\x8e\tz\x90\x61y\xdb\xa0\xf8\xa2|\r\x94\x93\xde\x98\xcc\x44\x19\xf3\x30\xdd\x7fu\xfc\x89)\xc4i\xf2\x30l\x83\x44\x66\x31\xf3t\x15\f\b6\xc1\xa2o\xd8\xf3\x8d\x82\xcb\x32\xf0\xa7\x8ap>G\xef~\xf9\xc6\xa4\x42\xe3\xafJ\xe7\x95\xc8\x1a\x2\xc1\xe9\xc2\x8b\xf1{\x11?\xce\xe8\xd3\x39WI<.\xedo^Y\xd6U\x99\x1e\xfe\xb6\xf1\xb6v'\a\xb1\xac\\\xeb\x2\x81\x80@\x19\xc4\x32&\xcb\xc1\xca\x10K\xdf\x45\xf9\xf\x1d\x85\x39\x65\xdc\x33\x45\xbe\xac\x97~;\xe2m-\xd6\x9b\x82\x1\xbd\x90'W\xf5\xf5\xce\x35\xd7\xb4\xcdidTiP\\-vG+`\xb5u\xb7\x14\x44\xe1\xd9\xd3\r\x81\xb0GL\xe1U\xe3\xf0\xaa\xd1\x8f\xc6\"\xa5S\xb6\xbf\x4\x1a\xc4\xe0|\x8d\xa2+y(-\xad\ty\xd5\xe2g\xd3\x8c\xcdl\x96g3\xfe\x80\xb7|b[\xca\xb2\xbf\x61\xf7\x9c\x65\x30\x61\xa0\x35\xf6W\xb4\xcc\xdd\x34\x31T0#\x6\t*\x86H\x86\xf7\r\x1\t\x15\x31\x16\x4\x14\x9f\xdc\xf9\x38\xc2\x8a\x1c\xfe\x6}\xf6\x64\x62>L#|\f\x7f\x93\x30-\x6\t*\x86H\x86\xf7\r\x1\t\x14\x31 \x1e\x1e\0M\0u\0m\0\x62\0l\0\x65\0 \0I\0\x64\0\x65\0n\0t\0i\0t\0y0A010\r\x6\t`\x86H\x1\x65\x3\x4\x2\x1\x5\0\x4 Fm\xb6/lL\x18\x1b!\xfa+x\xb5\xd9?GrR\xb7\xd3\x90\xc1N)L\x9c\xc7')\xe^\xbe\x4\b\x8b\x2\xb2\xb2\x97\b\x8a\xf6\x2\x2\b\0)" -framesperpacket=1 - -[overlay] -blacklist=@Invalid() -blacklistexclude=@Invalid() -launchers=@Invalid() -launchersexclude=@Invalid() -paths=@Invalid() -pathsexclude=@Invalid() -version=1.4.0 -whitelist=@Invalid() -whitelistexclude=@Invalid() - -[shortcuts] -size=0 - -[ui] -HighContrast=true -connect\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\n\0\0\0\0\0\0\0\f=\0\0\x1m\0\0\n\0\0\0\0\0\0\0\f=\0\0\x1m\0\0\0\x1\x2\0\0\0\a\x80\0\0\n\0\0\0\0\0\0\0\f=\0\0\x1m)" -connect\header=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2&\0\0\0\x3\x1\x1\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x3\0\0\x1w\0\0\0\x1\0\0\0\x1\0\0\0S\0\0\0\x1\0\0\0\x3\0\0\0\\\0\0\0\x1\0\0\0\x3\0\0\x3\xe8\0\0\0\0\x64) -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\n\0\0\0\0\0\0\0\r\xb9\0\0\x3\xfa\0\0\n\0\0\0\0\0\0\0\f\xde\0\0\x1\xb2\0\0\0\x1\x2\0\0\0\a\x80\0\0\n\0\0\0\0\0\0\0\r\xb9\0\0\x3\xfa) -header=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2\xb0\0\0\0\x1\x1\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x1\0\0\x2\xb0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64) -server=mumble.vhack.eu -state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\x1\0\0\0\x3\xbd\xfc\x2\0\0\0\x2\xfb\0\0\0\f\0q\0\x64\0w\0L\0o\0g\x1\0\0\0>\0\0\x3\xa0\0\0\0z\0\xff\xff\xff\xfb\0\0\0\xe\0q\0\x64\0w\0\x43\0h\0\x61\0t\x1\0\0\x3\xe2\0\0\0\x19\0\0\0\x19\0\0\0\x19\0\0\x2\xb6\0\0\x3\xbd\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x1\0\0\0\x1a\0q\0t\0I\0\x63\0o\0n\0T\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) diff --git a/modules/home/conf/mumble/default.nix b/modules/home/conf/mumble/default.nix deleted file mode 100644 index 6fa524dc..00000000 --- a/modules/home/conf/mumble/default.nix +++ /dev/null @@ -1,3 +0,0 @@ -{...}: { - xdg.configFile."Mumble/Mumble.conf".source = ./Mumble.conf; -} diff --git a/modules/home/conf/neomutt/default.nix b/modules/home/conf/neomutt/default.nix deleted file mode 100644 index e4fbcb39..00000000 --- a/modules/home/conf/neomutt/default.nix +++ /dev/null @@ -1,168 +0,0 @@ -{pkgs, ...}: { - programs.neomutt = { - enable = true; - package = pkgs.writeShellScriptBin "neomutt" '' - systemctl --user start mbsync.service; - ${pkgs.neomutt}/bin/neomutt; - ''; - vimKeys = false; # see the modified ones below - checkStatsInterval = 60; - binds = [ - #------------------------------------------------------------ - # Vi Key Bindings (taken from their configuration, modified for dvorak) - #------------------------------------------------------------ - - # Moving around - { - action = "noop"; - key = "g"; - map = ["attach" "browser" "index"]; - } - { - action = "first-entry"; - key = "gg"; - map = ["attach" "browser" "index"]; - } - { - action = "last-entry"; - key = "G"; - map = ["attach" "browser" "index"]; - } - { - action = "noop"; - key = "g"; - map = ["pager"]; - } - { - action = "top"; - key = "gg"; - map = ["pager"]; - } - { - action = "bottom"; - key = "G"; - map = ["pager"]; - } - { - action = "previous-line"; - key = "n"; - map = ["pager"]; - } - { - action = "next-line"; - key = "t"; - map = ["pager"]; - } - - # Scrolling - { - action = "next-page"; - key = "\\CF"; - map = ["attach" "browser" "pager" "index"]; - } - { - action = "previous-page"; - key = "\\CB"; - map = ["attach" "browser" "pager" "index"]; - } - { - action = "half-up"; - key = "\\Cu"; - map = ["attach" "browser" "pager" "index"]; - } - { - action = "half-down"; - key = "\\Cd"; - map = ["attach" "browser" "pager" "index"]; - } - { - action = "next-line"; - key = "\\Ce"; - map = ["browser" "pager"]; - } - { - action = "previous-line"; - key = "\\Cy"; - map = ["browser" "pager"]; - } - { - action = "next-line"; - key = "\\Ce"; - map = ["index"]; - } - { - action = "previous-line"; - key = "\\Cy"; - map = ["index"]; - } - - { - action = "noop"; - key = "d"; - map = ["pager" "index"]; - } - { - action = "delete-message"; - key = "dd"; - map = ["pager" "index"]; - } - - # Mail & Reply - { - # Doesn't work currently - action = "list-reply"; - key = "\\Cm"; - map = ["index"]; - } - - # Threads - { - action = "search-opposite"; - key = "N"; - map = ["browser" "pager" "index"]; - } - { - action = "delete-thread"; - key = "dT"; - map = ["pager" "index"]; - } - { - action = "delete-subthread"; - key = "dt"; - map = ["pager" "index"]; - } - { - action = "next-thread"; - key = "gt"; - map = ["pager" "index"]; - } - { - action = "previous-thread"; - key = "gT"; - map = ["pager" "index"]; - } - { - action = "collapse-thread"; - key = "za"; - map = ["index"]; - } - { - # Missing: folddisable/foldenable - action = "collapse-all"; - key = "zA"; - map = ["index"]; - } - - { - action = "search-next"; - key = "l"; - map = ["index"]; - } - { - action = "limit"; - key = "f"; - map = ["index"]; - } - ]; - }; -} diff --git a/modules/home/conf/nix-index/default.nix b/modules/home/conf/nix-index/default.nix deleted file mode 100644 index eb8132d9..00000000 --- a/modules/home/conf/nix-index/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{...}: { - programs.nix-index = { - enable = true; - symlinkToCacheHome = true; - - # Handled by myself (and the script is overridden) - enableBashIntegration = false; - enableZshIntegration = false; - enableFishIntegration = false; - }; - programs.nix-index-database = { - comma.enable = false; - }; -} diff --git a/modules/home/conf/npm/.npmrc b/modules/home/conf/npm/.npmrc deleted file mode 100644 index d0d846bd..00000000 --- a/modules/home/conf/npm/.npmrc +++ /dev/null @@ -1,6 +0,0 @@ -scripts-prepend-node-path=true -node_gyp= -prefix=${XDG_DATA_HOME}/npm -cache=${XDG_CACHE_HOME}/npm -tmp=${XDG_RUNTIME_DIR}/npm -init-module=${XDG_CONFIG_HOME}/npm/config/npm-init.js diff --git a/modules/home/conf/npm/default.nix b/modules/home/conf/npm/default.nix deleted file mode 100644 index 7b4bb6a1..00000000 --- a/modules/home/conf/npm/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ - config, - pkgs, - ... -}: { - xdg.configFile."npm/.npmrc".source = ./.npmrc; -} diff --git a/modules/home/conf/nvim/autocmds/default.nix b/modules/home/conf/nvim/autocmds/default.nix deleted file mode 100644 index a8f00bdc..00000000 --- a/modules/home/conf/nvim/autocmds/default.nix +++ /dev/null @@ -1,124 +0,0 @@ -{config, ...}: { - programs.nixvim = { - autoGroups = { - cursor_off = {clear = true;}; - colorcolumn_toggle = {clear = true;}; - numbertoggle = {clear = true;}; - coloroverride = {clear = true;}; - highlight_on_yank = {clear = true;}; - create_dir = {clear = true;}; - }; - autoCmd = [ - { - # Taken from: https://github.com/jghauser/mkdir.nvim - event = ["BufWritePre"]; - pattern = ["*"]; - callback = { - __raw = '' - function() - -- Get current filename, get full path (:p) and leave only the head (:h) - local dir = vim.fn.expand(':p:h') - - -- This handles URLs using netrw. See ':help netrw-transparent' for details. - if dir:find('%l+://') == 1 then - return - end - - if vim.fn.isdirectory(dir) == 0 then - vim.fn.mkdir(dir, 'p') - end - end - ''; - }; - group = "create_dir"; - desc = "Create the directory of the target file on write"; - } - { - event = ["TextYankPost"]; - pattern = ["*"]; - callback = { - __raw = '' - function() - vim.highlight.on_yank() - end - ''; - }; - group = "highlight_on_yank"; - desc = "Highlight the yanked text"; - } - { - event = ["BufWritePre"]; - pattern = ["*"]; - command = '' - ks | if search("\\s\\+$", 'n') != 0 | :%s/\s\+$// | endif | 's - ''; - desc = '' - Remove trailing whitespace on safe - :%s/\s\+$\| \+\ze\t//g >> For trailing spaces and spaces before tabstops - ''; - } - - { - event = ["WinLeave"]; - pattern = ["*"]; - command = "set nocursorline"; # TODO: possible also nocursorcolumn - group = "cursor_off"; - desc = "Display cursorline and cursorcolumn ONLY in active window."; - } - { - event = ["WinEnter"]; - pattern = ["*"]; - command = "set cursorline"; # TODO: possible also cursorcolumn - group = "cursor_off"; - desc = "Display cursorline and cursorcolumn ONLY in active window."; - } - - { - event = ["InsertEnter"]; - pattern = ["*"]; - command = "set colorcolumn=${config.programs.nixvim.opts.colorcolumn}"; - group = "colorcolumn_toggle"; - desc = "Only activate the colorcolumn when focused"; - } - { - event = ["BufLeave" "FocusLost" "InsertLeave" "WinLeave"]; - pattern = ["*"]; - command = "set colorcolumn=0"; - group = "colorcolumn_toggle"; - desc = "Only activate the colorcolumn when focused"; - } - - { - event = ["BufEnter" "FocusGained" "InsertLeave" "WinEnter"]; - pattern = ["*"]; - command = "if &nu && mode() != \"i\" | set rnu | endif"; - group = "numbertoggle"; - desc = "Change line numbers, when not focused"; - } - { - event = ["BufLeave" "FocusLost" "InsertEnter" "WinLeave"]; - pattern = ["*"]; - command = "if &nu | set nornu | endif"; - group = "numbertoggle"; - desc = "Change line numbers, when not focused"; - } - - { - # Override LineNr - event = ["ColorScheme"]; - pattern = ["*"]; - command = "highlight LineNr ctermfg=DarkGrey guifg=DarkGrey "; - group = "coloroverride"; - desc = "Changes Line number colors"; - } - { - # Override CursorLineNr - event = ["ColorScheme"]; - pattern = ["*"]; - command = "highlight CursorLineNr ctermfg=White guifg=White "; - group = "coloroverride"; - desc = "Changes Line number colors"; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/clipboard/default.nix b/modules/home/conf/nvim/clipboard/default.nix deleted file mode 100644 index 0a686190..00000000 --- a/modules/home/conf/nvim/clipboard/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{...}: { - programs.nixvim = { - clipboard.providers = { - wl-copy.enable = true; - }; - }; -} diff --git a/modules/home/conf/nvim/default.nix b/modules/home/conf/nvim/default.nix deleted file mode 100644 index 2da80c22..00000000 --- a/modules/home/conf/nvim/default.nix +++ /dev/null @@ -1,55 +0,0 @@ -{pkgs, ...}: { - imports = [ - ./autocmds - ./clipboard - ./files - ./mappings - ./options - ./plgs - ]; - home.sessionVariables = { - EDITOR = "nvim"; - VISUAL = "nvim"; - CODEEDITOR = "nvim"; - }; - programs.nixvim = { - enable = true; - - # source: https://www.patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=Neovim - extraConfigLuaPre = - /* - FIXME: Update the merge function to support that: <2023-08-29> - - lib.mkBefore - */ - '' - --------------------------------------------------------------------------- - -- - -- ███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗ - -- ████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║ - -- ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║ - -- ██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║ - -- ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║ - -- ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═╝╚═╝ ╚═╝ - -- - --------------------------------------------------------------------------- - ''; - - extraPackages = with pkgs; [ - /* - These are mostly linters and formatters used for different file types. - Including them here is fine, as they are not necessarily sync able to different people. - */ - # nix - alejandra - statix - - # yaml - yamllint - - # shell - shellcheck - shfmt - ]; - }; -} diff --git a/modules/home/conf/nvim/files/default.nix b/modules/home/conf/nvim/files/default.nix deleted file mode 100644 index f935ac7b..00000000 --- a/modules/home/conf/nvim/files/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{lib, ...}: { - programs.nixvim = { - extraFiles = { - "ftplugin/tex.lua".text = '' - ${lib.strings.fileContents ./ftplugin/tex.lua} - ''; - }; - }; -} diff --git a/modules/home/conf/nvim/files/ftplugin/tex.lua b/modules/home/conf/nvim/files/ftplugin/tex.lua deleted file mode 100644 index f3fffa86..00000000 --- a/modules/home/conf/nvim/files/ftplugin/tex.lua +++ /dev/null @@ -1,57 +0,0 @@ --- local used = false; --- vim.keymap.set('n', 't', function() --- used = not used; --- if used then --- require('nvim-treesitter.configs').setup { --- highlight = { --- additional_vim_regex_highlighting = { "latex", "markdown" }, --- }, --- } --- else --- require('nvim-treesitter.configs').setup { --- highlight = { --- additional_vim_regex_highlighting = { "" }, --- }, --- } --- end --- end --- ); --- --- - --- Set tex specific telescope extension -require("telescope").setup({ - extensions = { - bibtex = { - -- Depth for the *.bib file - depth = 1, - -- Path to global bibliographies (placed outside of the project) - global_files = {}, - -- Define the search keys to use in the picker - search_keys = { "author", "year", "title" }, - -- Template for the formatted citation - citation_format = "{{author}} ({{year}}), {{title}}.", - -- Only use initials for the authors first name - citation_trim_firstname = true, - -- Max number of authors to write in the formatted citation - -- following authors will be replaced by "et al." - citation_max_auth = 2, - -- Wrapping in the preview window is disabled by default - wrap = false, - -- Custom format for citation label - custom_formats = { - { id = "tex_autocite", cite_marker = "\\autocite{%s}" }, - }, - format = "tex_autocite", - -- Use context awareness - context = true, - -- Fallback to global/directory .bib files if context not found - -- This setting has no effect if context = false - context_fallback = true, - }, - }, -}) -require("telescope").load_extension("bibtex") -vim.keymap.set("n", "ib", function() - require("telescope").extensions.bibtex.bibtex() -end, { noremap = true, silent = true, desc = "list bibtex entries in telescope" }) diff --git a/modules/home/conf/nvim/mappings/default.nix b/modules/home/conf/nvim/mappings/default.nix deleted file mode 100644 index af800d22..00000000 --- a/modules/home/conf/nvim/mappings/default.nix +++ /dev/null @@ -1,282 +0,0 @@ -{lib, ...}: { - programs.nixvim = { - globals = { - mapleader = " "; - maplocalleader = " "; - }; - keymaps = [ - { - mode = ["n" "i"]; - key = ""; - action = "noh"; - options.desc = "Disable the search highlighting and send Escape"; - } - { - key = "hh"; - mode = ["i"]; - action.__raw = '' - function() - local cmp = require('cmp'); - local luasnip = require('luasnip'); - - if cmp.visible() then - cmp.select_next_item() - elseif luasnip.expand_or_locally_jumpable() then - luasnip.expand_or_jump() - end - end - ''; - options.desc = "completion trigger/ forward in completen menu"; - } - { - key = "uu"; - mode = ["i"]; - action.__raw = '' - function() - local cmp = require('cmp'); - cmp.confirm() - end - ''; - options.desc = "confirm the selected item"; - } - - # FIXME: Add the below keymappings, when alacritty gets support for the kitty - # keyboard protocol <2023-08-29> - { - # "" - key = "ztn"; - action = "tabnext"; - options.desc = "cycle to the next tab"; - } - { - # "" - key = "ztp"; - action = "tabprevious"; - options.desc = "cycle to the previous tab"; - } - - # yank/ cut to the system clipboard - { - key = "y"; - action = "\"+y"; - options.desc = "yank to the system clipboard"; - } - { - key = "Y"; - action = "\"+Y"; - options.desc = "yank until the end of the line to the system clipboard"; - } - - # Unmap some old keys - #{key = "s"; action = "''";} - #{key = "t"; action = "''";} - { - key = ""; - action = ""; - } - { - key = ""; - action = ""; - } - { - key = ""; - action = ""; - } - { - key = ""; - action = ""; - } - - # Center the cursor vertically when moving to the next word during a search. - { - key = "l"; - action = "nzzzv"; - options.desc = "Center the cursor vertically when moving to the next word during a search."; - } - { - key = "L"; - action = "Nzzzv"; - options.desc = "Center the cursor vertically when moving to the next word during a search."; - } - # remap the other keys to dvorak - { - key = "k"; - action = "t"; - options.desc = "go the the right on char"; - } - { - key = "K"; - action = "T"; - options.desc = "go to the left on char"; - } - { - key = "j"; - action = "k"; - options.desc = "go to the right before the char"; - } - { - key = "J"; - action = "K"; - options.desc = "go to the left before the char"; - } - - # Change Vim-keys - { - key = "h"; - action = ""; - options.desc = "go left"; - } - { - key = "t"; - action = "g"; - options.desc = "go down, with displaylines"; - } - { - key = "n"; - action = "g"; - options.desc = "go up, with displaylines"; - } - { - key = "s"; - action = ""; - options.desc = "go right"; - } - - # Move display lines - { - key = "0"; - action = "g0"; - options.desc = "go to the leftmost character in the screen line"; - } - { - key = "$"; - action = "g$"; - options.desc = "go to the rightmost character in the screen line"; - } - { - mode = ["n"]; - key = ""; - action = "gf"; - options.desc = "open file/url under cursor"; - } - { - mode = ["n"]; - key = ""; - action = ":"; - options.desc = "jump to command line"; - } - - { - mode = ["n"]; - key = "\\f"; - action.__raw = "function() require('lf').start() end"; - options.desc = "open lf in a floating window"; - } - - # Splits - { - mode = ["n"]; - key = ""; - action = "p"; - options.desc = "go to previous split"; - } - { - mode = ["n"]; - key = ""; - action = "w"; - options.desc = "go to next split"; - } - { - mode = ["n"]; - key = "-"; - action = "s"; - options.desc = "New horizontal split"; - } - { - mode = ["n"]; - key = "|"; - action = "v"; - options.desc = "New vertical split"; - } - - { - mode = ["n"]; - key = "p"; - action = "\"_dP"; - options.desc = "keep the cut thing in the base register"; - } - { - mode = ["n"]; - key = "c"; - action = "\"_c"; - options.desc = "change without saving to register"; - } - - { - mode = ["n"]; - key = "d"; - action = "\"_d"; - options.desc = "delete without saving to register"; - } - { - key = "dd"; - mode = ["n"]; - action.__raw = '' - function() - if vim.api.nvim_get_current_line():match("^%s*$") then - return '"_dd' - else - return "dd" - end - end - ''; - options = { - desc = "Pipe all blank line deletions to the blackhole register"; - expr = true; - silent = true; - }; - } - - { - mode = ["n"]; - key = "s"; - action = ":%s/\\<\\>//gI"; - options.desc = "replace for the word under the cursor"; - } - - { - mode = ["n"]; - key = ""; - action = "mksession! "; - options.desc = "overwrite/create a session"; - } - - { - mode = ["n"]; - key = "X"; - action = "!!$SHELL "; - options.desc = "Read the current line and execute that line in your $SHELL. The resulting output will replace the curent line that was being executed."; - } - { - mode = ["t"]; - key = ""; - action = ""; - options.desc = "Exit terminal mode with "; - } - - # move selected lines in visual mode - { - mode = ["v"]; - key = "T"; - action = ":m '>+1gv=gv"; - options.desc = "move selected lines in visual mode down"; - } - { - mode = ["v"]; - key = "N"; - action = ":m '<-2gv=gv"; - options.desc = "move selected lines in visual mode up"; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/options/default.nix b/modules/home/conf/nvim/options/default.nix deleted file mode 100644 index d22bdd8f..00000000 --- a/modules/home/conf/nvim/options/default.nix +++ /dev/null @@ -1,105 +0,0 @@ -{nixosConfig, ...}: { - programs.nixvim.opts = { - autoindent = true; # copy indent from previous line - cindent = true; # use c like indenting rules - breakindent = true; # continue indent visually - showbreak = "↳ "; # downwards arrow with tip rightwards(U+21B3, UTF-8: E2 86 B3) - breakindentopt = { - shift = 2; # wrapped line's beginning will be shifted by the given number of - }; - - incsearch = true; # show search results while typing - inccommand = "split"; # line preview of :s results - ignorecase = true; # ignore case when searching - smartcase = true; # if a capital letter is used in search, overwrite ignorecase - showmatch = true; # show matching words during a search. - hlsearch = true; # highlight when searching - - confirm = true; # confirm to save changes before closing modified buffer - colorcolumn = "+1"; # show a +1 before the 'textwidth' - completeopt = ["menuone" "noselect"]; # have a better completion experience - - # https://www.compart.com/en/unicode/U+XXXX (unicode character code) - # stylua: ignore - fillchars = { - fold = "·"; # MIDDLE DOT (U+00B7, UTF-8: C2 B7) - horiz = "━"; # BOX DRAWINGS HEAVY HORIZONTAL (U+2501, UTF-8: E2 94 81) - horizdown = "┳"; # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL (U+2533, UTF-8: E2 94 B3) - horizup = "┻"; # BOX DRAWINGS HEAVY UP AND HORIZONTAL (U+253B, UTF-8: E2 94 BB) - vert = "┃"; # BOX DRAWINGS HEAVY VERTICAL (U+2503, UTF-8: E2 94 83) - vertleft = "┫"; # BOX DRAWINGS HEAVY VERTICAL AND LEFT (U+252B, UTF-8: E2 94 AB) - vertright = "┣"; # BOX DRAWINGS HEAVY VERTICAL AND RIGHT (U+2523, UTF-8: E2 94 A3) - verthoriz = "╋"; # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL (U+254B, UTF-8: E2 95 8B) - }; - listchars = builtins.concatStringsSep "," [ - "nbsp:⦸" # CIRCLED REVERSE SOLIDUS (U+29B8, UTF-8: E2 A6 B8) - "tab:▷┅" # WHITE RIGHT-POINTING TRIANGLE (U+25B7, UTF-8: E2 96 B7) - "extends:»" # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (U+00BB, UTF-8: C2 BB) - "precedes:«" # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (U+00AB, UTF-8: C2 AB) - "trail:•" # BULLET (U+2022, UTF-8: E2 80 A2) - ]; - - # shell-like autocomplete to unambiguous portions - wildmode = builtins.concatStringsSep "," [ - "longest" - "list" - "full" - ]; - - grepformat = "%f:%l:%c:%m"; # the default format for rg in vimgrep mode - grepprg = "rg --vimgrep"; # use rg as grep implementation in `:grep` - - hidden = true; # allows you to hide buffers with unsaved changes without being prompted - - laststatus = 3; # use global statusline # TODO: - - list = true; # show whitespace - - mouse = ""; # disables the mouse - - number = true; # line numbers - relativenumber = true; # relative line numbers - - # vim.opt.shada:append {'%'}; -- store buffers in the shada file and reopen them if nvim has been started without file name argument - - shell = nixosConfig.users.users.soispha.shell.pname; # try to use default shell for the default user as a shell for ":!" - - spell = true; # activate spell checking - spelllang = "en_us,de_de"; # set spell languages - spelloptions = "camel"; # CamelCase check if both camel and case are correct words - - syntax = "ON"; # use syntax highlighting and let nvim figure out which - - shiftwidth = 0; # use tabstop setting as shiftwidth - tabstop = 4; # use 4 spaces in place of a tab - expandtab = true; # expand tabs to spaces - - showtabline = 2; # always show the tabline - - timeoutlen = 500; # wait 500 msec for the next char in an input sequence - ttyfast = true; # let vim know that I am using a fast term - - undofile = true; # use a undofile, to save the undos - undolevels = 10000; # keep nearly all undo things stored - - virtualedit = "block"; # allow the cursor to move beyond actual character in visual block mode - - textwidth = 90; # automatically hard wrap at 90 columns by default - - foldmethod = "marker"; # use markers to specify folds - - termguicolors = true; - cursorline = true; - # vim.opt.cursorcolumn = true; - - scrolloff = 999; # try to keep at least 999 lines above and below the cursor (this effectively keeps the screen centered) - - linebreak = true; # break to long lines, but do only break them at [[::space::]] - - showcmd = true; # show partial command, being typed - showmode = true; # show the mode (Visual, Insert, Command) - - wildmenu = true; # shell completion - wildignore = "*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx"; # ignore binary files - }; -} diff --git a/modules/home/conf/nvim/plgs/colorscheme/default.nix b/modules/home/conf/nvim/plgs/colorscheme/default.nix deleted file mode 100644 index 11357f77..00000000 --- a/modules/home/conf/nvim/plgs/colorscheme/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - pkgs, - lib, - ... -}: { - programs.nixvim = { - # TODO: package nightfox though a module - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/nightfox.lua} - ${lib.strings.fileContents ./lua/mk_todos_readable.lua} - ''; - colorscheme = "carbonfox"; - extraPlugins = [ - pkgs.vimPlugins.nightfox-nvim - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/colorscheme/lua/mk_todos_readable.lua b/modules/home/conf/nvim/plgs/colorscheme/lua/mk_todos_readable.lua deleted file mode 100644 index d02171b5..00000000 --- a/modules/home/conf/nvim/plgs/colorscheme/lua/mk_todos_readable.lua +++ /dev/null @@ -1,16 +0,0 @@ -local opts = { bg = "NONE", bold = true } - ----@param hl_group string: The name of the hl group ----@param extra_opts table: Extra options to pass to nvim_set_hl -local set_hl = function(hl_group, extra_opts) - local local_opts = vim.deepcopy(opts) - for k, v in ipairs(extra_opts) do - local_opts[k] = v - end - vim.api.nvim_set_hl(0, hl_group, local_opts) -end - -set_hl("@text.danger", { fg = "red" }) -set_hl("@text.note", { fg = "blue" }) -set_hl("@text.todo", { fg = "green" }) -set_hl("@text.warning", { fg = "yellow" }) diff --git a/modules/home/conf/nvim/plgs/colorscheme/lua/nightfox.lua b/modules/home/conf/nvim/plgs/colorscheme/lua/nightfox.lua deleted file mode 100644 index 4c502153..00000000 --- a/modules/home/conf/nvim/plgs/colorscheme/lua/nightfox.lua +++ /dev/null @@ -1,44 +0,0 @@ -require("nightfox").setup({ - options = { - -- Compiled file's destination location - compile_path = vim.fn.stdpath("cache") .. "/nightfox", - compile_file_suffix = "_compiled", -- Compiled file suffix - transparent = true, -- Disable setting background - terminal_colors = true, -- Set terminal colors (vim.g.terminal_color_*) used in `:terminal` - dim_inactive = true, -- Non focused panes set to alternative background - module_default = true, -- Default enable value for modules - colorblind = { - enable = true, -- Enable colorblind support - simulate_only = false, -- Only show simulated colorblind colors and not diff shifted - severity = { - protan = 0.3, -- Severity [0,1] for protan (red) - deutan = 0.9, -- Severity [0,1] for deutan (green) - tritan = 0, -- Severity [0,1] for tritan (blue) - }, - }, - styles = { -- Style to be applied to different syntax groups - comments = "italic", -- Value is any valid attr-list value `:help attr-list` - conditionals = "NONE", - constants = "NONE", - functions = "bold", - keywords = "bold", - numbers = "NONE", - operators = "NONE", - strings = "NONE", - types = "NONE", - variables = "NONE", - }, - inverse = { -- Inverse highlight for different types - match_paren = false, - visual = false, - search = false, - }, - modules = { -- List of various plugins and additional options - diagnostic = { enable = true, background = false }, - native_lsp = { enable = true, background = false }, - }, - }, - palettes = {}, - specs = {}, - groups = {}, -}) diff --git a/modules/home/conf/nvim/plgs/comment-nvim/default.nix b/modules/home/conf/nvim/plgs/comment-nvim/default.nix deleted file mode 100644 index 2a73b8db..00000000 --- a/modules/home/conf/nvim/plgs/comment-nvim/default.nix +++ /dev/null @@ -1,41 +0,0 @@ -{...}: { - programs.nixvim = { - plugins.comment = { - enable = true; - settings = { - padding = true; - sticky = true; - mappings = { - basic = false; - extra = false; - }; - }; - }; - keymaps = [ - { - key = "gcc"; - mode = "v"; - action = "(comment_toggle_linewise_visual)"; - options.desc = "toggle the current line in a linewise comment"; - } - { - key = "gbc"; - mode = "v"; - action = "(comment_toggle_blockwise_visual)"; - options.desc = "toggle the current line in a blockwise comment"; - } - { - key = "gcc"; - mode = "n"; - action = "(comment_toggle_linewise_current)"; - options.desc = "toggle the current line in a linewise comment"; - } - { - key = "gbc"; - mode = "n"; - action = "(comment_toggle_blockwise_current)"; - options.desc = "toggle the current line in a blockwise comment"; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/debugprint/default.nix b/modules/home/conf/nvim/plgs/debugprint/default.nix deleted file mode 100644 index 3c591e9f..00000000 --- a/modules/home/conf/nvim/plgs/debugprint/default.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ - pkgs, - lib, - ... -}: { - programs.nixvim = { - # TODO: package debugprint though a module - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/debugprint.lua} - ''; - extraPlugins = [ - pkgs.vimExtraPlugins.debugprint-nvim - ]; - - keymaps = [ - { - key = "g?v"; - mode = ["v" "n"]; - action.__raw = '' - function() - return require('debugprint').debugprint({variable = true;}); - end - ''; - options.expr = true; - options.desc = '' - 'variable' debug line below the current line - ''; - } - { - key = "g?V"; - mode = ["v" "n"]; - action.__raw = '' - function() - return require('debugprint').debugprint({above = true; variable = true;}) ; - end - ''; - options.expr = true; - options.desc = '' - 'variable' debug line above the current line - ''; - } - { - key = "g?p"; - mode = "n"; - action.__raw = '' - function() - return require('debugprint').debugprint(); - end - ''; - options.expr = true; - options.desc = '' - 'plain' debug line below the current line - ''; - } - { - key = "g?P"; - mode = "n"; - action.__raw = '' - function() - return require('debugprint').debugprint({above = true;}); - end - ''; - options.expr = true; - options.desc = '' - 'plain' debug line above the current line - ''; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/debugprint/lua/debugprint.lua b/modules/home/conf/nvim/plgs/debugprint/lua/debugprint.lua deleted file mode 100644 index da7e1735..00000000 --- a/modules/home/conf/nvim/plgs/debugprint/lua/debugprint.lua +++ /dev/null @@ -1,3 +0,0 @@ -require("debugprint").setup({ - create_keymaps = false, -}) diff --git a/modules/home/conf/nvim/plgs/default.nix b/modules/home/conf/nvim/plgs/default.nix deleted file mode 100644 index 991bc315..00000000 --- a/modules/home/conf/nvim/plgs/default.nix +++ /dev/null @@ -1,33 +0,0 @@ -{...}: { - imports = - [ - # Plugins not yet packaged in nixpkgs - # ./debugprint - ./lf-nvim - # ./lsp-progress-nvim - ] - ++ [ - # Already packaged in nixpkgs - ./colorscheme - ./comment-nvim - ./femaco - ./flatten-nvim - ./goto-preview - ./harpoon - ./leap - ./lsp - ./lspkind - ./ltex_extra - ./lualine - ./luasnip - ./neorg - ./nvim-cmp - ./nvim-lint - ./raw_plugins - ./telescope - ./todo-comments - ./treesitter - ./vim-tex - ./which-key - ]; -} diff --git a/modules/home/conf/nvim/plgs/femaco/default.nix b/modules/home/conf/nvim/plgs/femaco/default.nix deleted file mode 100644 index 6c4a7d89..00000000 --- a/modules/home/conf/nvim/plgs/femaco/default.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - pkgs, - lib, - ... -}: { - programs.nixvim = { - # TODO: package femaco through a module - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/femaco.lua} - ''; - extraPlugins = [ - pkgs.vimPlugins.nvim-FeMaco-lua - ]; - keymaps = [ - { - key = "cc"; - mode = "n"; - action.__raw = "require('femaco.edit').edit_code_block"; - options.desc = "edit a [c]ode blo[c]k with femaco"; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/femaco/lua/femaco.lua b/modules/home/conf/nvim/plgs/femaco/lua/femaco.lua deleted file mode 100644 index da3be8e1..00000000 --- a/modules/home/conf/nvim/plgs/femaco/lua/femaco.lua +++ /dev/null @@ -1,50 +0,0 @@ -local clip_val = require("femaco.utils").clip_val -require("femaco").setup({ - -- should prepare a new buffer and return the winid - -- by default opens a floating window - -- provide a different callback to change this behaviour - -- @param opts: the return value from float_opts - prepare_buffer = function(opts) - local buf = vim.api.nvim_create_buf(false, false) - return vim.api.nvim_open_win(buf, true, opts) - end, - -- should return options passed to nvim_open_win - -- @param code_block: data about the code-block with the keys - -- * range - -- * lines - -- * lang - float_opts = function(code_block) - return { - relative = "cursor", - width = clip_val(5, 120, vim.api.nvim_win_get_width(0) - 10), -- TODO: how to offset sign column etc? - height = clip_val(5, #code_block.lines, vim.api.nvim_win_get_height(0) - 6), - anchor = "NW", - row = 0, - col = 0, - style = "minimal", - border = "rounded", - zindex = 1, - } - end, - -- return filetype to use for a given lang - -- lang can be nil - ft_from_lang = function(lang) - return lang - end, - -- what to do after opening the float - post_open_float = function(winnr) - vim.wo.signcolumn = "no" - end, - -- create the path to a temporary file - create_tmp_filepath = function(filetype) - return os.tmpname() - end, - -- if a newline should always be used, useful for multiline injections - -- which separators needs to be on separate lines such as markdown, neorg etc - -- @param base_filetype: The filetype which FeMaco is called from, not the - -- filetype of the injected language (this is the current buffer so you can - -- get it from vim.bo.filetyp). - ensure_newline = function(base_filetype) - return false - end, -}) diff --git a/modules/home/conf/nvim/plgs/flatten-nvim/default.nix b/modules/home/conf/nvim/plgs/flatten-nvim/default.nix deleted file mode 100644 index cd6f8bcc..00000000 --- a/modules/home/conf/nvim/plgs/flatten-nvim/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - pkgs, - lib, - ... -}: { - programs.nixvim = { - # TODO: package flatten-nvim though a module - - extraConfigLuaPre = '' - ${lib.strings.fileContents ./lua/flatten-nvim.lua} - if os.getenv("NVIM") ~= nil then - -- Avoid loading plugins because the host will take control of the instance anyways - return - end - ''; - extraPlugins = [ - pkgs.vimPlugins.flatten-nvim - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua b/modules/home/conf/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua deleted file mode 100644 index 42ea1eb6..00000000 --- a/modules/home/conf/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua +++ /dev/null @@ -1,106 +0,0 @@ ----Types: --- --- Passed to callbacks that handle opening files ----@alias BufInfo { fname: string, bufnr: buffer } --- --- Needed aliases ----@alias buffer integer: Buffer id ----@alias window integer: Window id --- --- The first argument is a list of BufInfo tables representing the newly opened files. --- The third argument is a single BufInfo table, only provided when a buffer is created from stdin. --- --- IMPORTANT: For `block_for` to work, you need to return a buffer number OR a buffer number and a window number. --- The `winnr` return value is not required, `vim.fn.bufwinid(bufnr)` is used if it is not provided. --- The `filetype` of this buffer will determine whether block should happen or not. --- ----@alias OpenHandler fun(files: BufInfo[], argv: string[], stdin_buf: BufInfo, guest_cwd: string):window, buffer --- -require("flatten").setup({ - callbacks = { - ---Called to determine if a nested session should wait for the host to close the file. - ---param argv: a list of all the arguments in the nested session - ---@type fun(argv: table): boolean - should_block = require("flatten").default_should_block, - - ---If this returns true, the nested session will be opened. - ---If false, default behavior is used, and - ---config.nest_if_no_args is respected. - ---@type fun(host: channel):boolean - should_nest = require("flatten").default_should_nest, - - ---Called before a nested session is opened. - pre_open = function() end, - - ---Called after a nested session is opened. - ---@param bufnr buffer - ---@param winnr window - ---@param filetype string - ---@param is_blocking boolean - ---@param is_diff boolean - post_open = function(bufnr, winnr, filetype, is_blocking, is_diff) - -- If the file is a git commit, create one-shot autocmd to delete its buffer on write - if filetype == "gitcommit" or filetype == "gitrebase" then - vim.api.nvim_create_autocmd("BufWritePost", { - buffer = bufnr, - once = true, - callback = vim.schedule_wrap(function() - vim.api.nvim_buf_delete(bufnr, {}) - end), - }) - end - end, - - ---Called when a nested session is done waiting for the host. - ---@param filetype string - block_end = function(filetype) end, - }, - -- dictionary of filetypes that should be blocking - block_for = { - gitcommit = true, - }, - -- Command passthrough - allow_cmd_passthrough = true, - -- Allow a nested session to open if Neovim is opened without arguments - nest_if_no_args = false, - -- Window options - window = { - -- Options: - -- current -> open in current window (default) - -- alternate -> open in alternate window (recommended) - -- tab -> open in new tab - -- split -> open in split - -- vsplit -> open in vsplit - -- smart -> smart open (avoids special buffers) - -- OpenHandler -> allows you to handle file opening yourself (see Types) - -- - -- TODO: Open gitcommit filetypes in the current buffer, everything else in a new tab <2023-08-29> - open = "split", - - -- Options: - -- vsplit -> opens files in diff vsplits - -- split -> opens files in diff splits - -- tab_vsplit -> creates a new tabpage, and opens diff vsplits - -- tab_split -> creates a new tabpage, and opens diff splits - -- OpenHandler -> allows you to handle file opening yourself (see Types) - diff = "tab_vsplit", - - -- Affects which file gets focused when opening multiple at once - -- Options: - -- "first" -> open first file of new files (default) - -- "last" -> open last file of new files - focus = "first", - }, - -- Override this function to use a different socket to connect to the host - -- On the host side this can return nil or the socket address. - -- On the guest side this should return the socket address - -- or a non-zero channel id from `sockconnect` - -- flatten.nvim will detect if the address refers to this instance of nvim, to determine if this is a host or a guest - pipe_path = require("flatten").default_pipe_path, - -- The `default_pipe_path` will treat the first nvim instance within a single kitty/wezterm session as the host - -- You can configure this behaviour using the following: - one_per = { - kitty = true, -- Flatten all instance in the current Kitty session - wezterm = true, -- Flatten all instance in the current Wezterm session - }, -}) diff --git a/modules/home/conf/nvim/plgs/goto-preview/default.nix b/modules/home/conf/nvim/plgs/goto-preview/default.nix deleted file mode 100644 index 3de28c68..00000000 --- a/modules/home/conf/nvim/plgs/goto-preview/default.nix +++ /dev/null @@ -1,47 +0,0 @@ -{ - pkgs, - lib, - ... -}: { - programs.nixvim = { - # TODO: package goto-preview though a module - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/goto-preview.lua} - ''; - extraPlugins = [ - pkgs.vimPlugins.goto-preview - ]; - keymaps = [ - { - key = "gd"; - mode = "n"; - action.__raw = "require('goto-preview').goto_preview_definition"; - options.desc = "[G]oto [D]efinition"; - } - { - key = "gtd"; - mode = "n"; - action.__raw = "require('goto-preview').goto_preview_type_definition"; - options.desc = "[G]oto the [t]ype [D]efinition"; - } - { - key = "gi"; - mode = "n"; - action.__raw = "require('goto-preview').goto_preview_implementation"; - options.desc = "[G]oto [I]mplementations"; - } - { - key = "gr"; - mode = "n"; - action.__raw = "require('goto-preview').goto_preview_references"; - options.desc = "[G]o to all [R]eferences of the symbol"; - } - { - key = "\\"; - mode = "n"; - action.__raw = "require('goto-preview').close_all_win"; - options.desc = "close all preview windows"; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/goto-preview/lua/goto-preview.lua b/modules/home/conf/nvim/plgs/goto-preview/lua/goto-preview.lua deleted file mode 100644 index 9687a5a0..00000000 --- a/modules/home/conf/nvim/plgs/goto-preview/lua/goto-preview.lua +++ /dev/null @@ -1,21 +0,0 @@ -require("goto-preview").setup({ - width = 120, -- Width of the floating window - height = 15, -- Height of the floating window - border = { "↖", "─", "┐", "│", "┘", "─", "└", "│" }, -- Border characters of the floating window - default_mappings = false, -- Bind default mappings - debug = false, -- Print debug information - opacity = nil, -- 0-100 opacity level of the floating window where 100 is fully transparent. - resizing_mappings = false, -- Binds arrow keys to resizing the floating window. - post_open_hook = nil, -- A function taking two arguments, a buffer and a window to be ran as a hook. - post_close_hook = nil, -- A function taking two arguments, a buffer and a window to be ran as a hook. - references = { -- Configure the telescope UI for slowing the references cycling window. - telescope = {}, -- require("telescope.themes").get_dropdown({ hide_preview = false }) - }, - -- These two configs can also be passed down to the goto-preview definition and implementation calls for one off "peak" functionality. - focus_on_open = true, -- Focus the floating window when opening it. - dismiss_on_move = false, -- Dismiss the floating window when moving the cursor. - force_close = true, -- passed into vim.api.nvim_win_close's second argument. See :h nvim_win_close - bufhidden = "wipe", -- the bufhidden option to set on the floating window. See :h bufhidden - stack_floating_preview_windows = true, -- Whether to nest floating windows - preview_window_title = { enable = true, position = "left" }, -- Whether to set the preview window title as the filename -}) diff --git a/modules/home/conf/nvim/plgs/harpoon/default.nix b/modules/home/conf/nvim/plgs/harpoon/default.nix deleted file mode 100644 index 465f24f0..00000000 --- a/modules/home/conf/nvim/plgs/harpoon/default.nix +++ /dev/null @@ -1,94 +0,0 @@ -{pkgs, ...}: let - numbers = ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"]; - mkNumberedCommand = { - command_template, - prefix, - number, - desc_template, - }: { - key = "${prefix}${number}"; - action.__raw = '' - function() - ${command_template number} - end - ''; - options.desc = "${desc_template number}"; - }; - mkGotoTerminalCommand = number: let - desc_template = number: "Goto terminal number ${number}"; - command_template = number: ''require("harpoon.term").gotoTerminal(${number})''; - prefix = "gt"; - in - mkNumberedCommand {inherit desc_template command_template prefix number;}; - mkGotoFileCommand = number: let - desc_template = number: "Goto Buffer number ${number}"; - command_template = number: ''require("harpoon.ui").nav_file(${number})''; - prefix = "gf"; - in - mkNumberedCommand {inherit desc_template command_template prefix number;}; - - gotoTerminalMappings = builtins.map mkGotoTerminalCommand numbers; - gotoFileMappings = builtins.map mkGotoFileCommand numbers; -in { - programs.nixvim = { - plugins.harpoon = { - enable = true; - package = pkgs.vimPlugins.harpoon; - enableTelescope = true; - # menu.width = "vim.api.nvim_win_get_width(0) - 4"; # TODO: integrate that - keymaps = { - tmuxGotoTerminal = null; # TODO: - }; - }; - keymaps = - [ - { - key = "-"; - action.__raw = '' - function() - require("harpoon.ui").nav_next() - end - ''; - options.desc = "go to the next marked file"; - } - { - key = "_"; - action.__raw = '' - function() - require("harpoon.ui").nav_prev() - end - ''; - options.desc = "go to the previous marked file"; - } - { - key = ""; - action.__raw = '' - function() - require("harpoon.mark").add_file() - end - ''; - options.desc = "add a mark to the open file in harpoon."; - } - { - key = "gqc"; - action.__raw = '' - function() - require("harpoon.cmd-ui").toggle_quick_menu() - end - ''; - options.desc = "toggle the harpoon command quick menu to see all commands."; - } - { - key = "q"; - action.__raw = '' - function() - require("harpoon.ui").toggle_quick_menu() - end - ''; - options.desc = "toggle the harpoon normal quick menu to see all marks."; - } - ] - ++ gotoFileMappings - ++ gotoTerminalMappings; - }; -} diff --git a/modules/home/conf/nvim/plgs/leap/default.nix b/modules/home/conf/nvim/plgs/leap/default.nix deleted file mode 100644 index 4e7ae60c..00000000 --- a/modules/home/conf/nvim/plgs/leap/default.nix +++ /dev/null @@ -1,59 +0,0 @@ -{...}: { - programs.nixvim = { - plugins.leap = { - enable = true; - addDefaultMappings = false; # They don't work with dvorak. - safeLabels = [ - "f" - "j" - "k" - "l" - "/" - "z" - "S" - "F" - "J" - "K" - "L" - "H" - "W" - "E" - "M" - "B" - "U" - "X" - "?" - "Z" - ]; - }; - keymaps = [ - { - key = "j"; - action = "(leap-forward-to)"; - options.desc = "jump forward to"; - } - { - key = "J"; - action = "(leap-backward-to)"; - options.desc = "jump backward to"; - } - { - key = "gj"; - action = "(leap-from-window)"; - options.desc = "jump to enterable windows"; - } - /* - {key= "x"; - mode = "v"; - action = "(leap-forward-till)"; - options.desc = "leap forward till"; - } - {key= "X"; - mode = "v"; - action = "(leap-backward-till)"; - options.desc = "leap backward till"; - } - */ - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/lf-nvim/default.nix b/modules/home/conf/nvim/plgs/lf-nvim/default.nix deleted file mode 100644 index 11ad2807..00000000 --- a/modules/home/conf/nvim/plgs/lf-nvim/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - pkgs, - lib, - ... -}: { - programs.nixvim = { - # TODO: package lf-nvim though a module - # FIXME: change the nvim path, when I change the path with lf - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/lf-nvim.lua} - ''; - extraPlugins = [ - pkgs.vimExtraPlugins.lf-nvim - - pkgs.vimPlugins.toggleterm-nvim # required by lf-nvim - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua b/modules/home/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua deleted file mode 100644 index 1eadf375..00000000 --- a/modules/home/conf/nvim/plgs/lf-nvim/lua/lf-nvim.lua +++ /dev/null @@ -1,43 +0,0 @@ -local fn = vim.fn - --- Defaults -require("lf").setup({ - default_action = "drop", -- default action when `Lf` opens a file - -- TODO: what do these mappings do? - default_actions = { -- default action keybindings - [""] = "tabedit", - [""] = "split", - [""] = "vsplit", - [""] = "tab drop", - }, - - winblend = 10, -- psuedotransparency level - dir = "", -- directory where `lf` starts ('gwd' is git-working-directory, ""/nil is CWD) - direction = "float", -- window type: float horizontal vertical - border = "rounded", -- border kind: single double shadow curved - height = fn.float2nr(fn.round(0.75 * vim.o.lines)), -- height of the *floating* window - width = fn.float2nr(fn.round(0.75 * vim.o.columns)), -- width of the *floating* window - escape_quit = true, -- map escape to the quit command (so it doesn't go into a meta normal mode) - focus_on_open = true, -- focus the current file when opening Lf (experimental) - mappings = true, -- whether terminal buffer mapping is enabled - tmux = false, -- tmux statusline can be disabled on opening of Lf - default_file_manager = true, -- make lf default file manager - disable_netrw_warning = true, -- don't display a message when opening a directory with `default_file_manager` as true - highlights = { -- highlights passed to toggleterm - Normal = { link = "Normal" }, - NormalFloat = { link = "Normal" }, - FloatBorder = { guifg = "#cdcbe0", guibg = "#191726" }, - }, - - -- Layout configurations - layout_mapping = "", -- resize window with this key - views = { -- window dimensions to rotate through - { width = 0.800, height = 0.800 }, - { width = 0.600, height = 0.600 }, - { width = 0.950, height = 0.950 }, - { width = 0.500, height = 0.500, col = 0, row = 0 }, - { width = 0.500, height = 0.500, col = 0, row = 0.5 }, - { width = 0.500, height = 0.500, col = 0.5, row = 0 }, - { width = 0.500, height = 0.500, col = 0.5, row = 0.5 }, - }, -}) diff --git a/modules/home/conf/nvim/plgs/lsp-progress-nvim/default.nix b/modules/home/conf/nvim/plgs/lsp-progress-nvim/default.nix deleted file mode 100644 index 6602ceb6..00000000 --- a/modules/home/conf/nvim/plgs/lsp-progress-nvim/default.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ - lib, - pkgs, - ... -}: { - programs.nixvim = { - # TODO: package lsp-progress-nvim though a module - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/lsp-progress-nvim.lua} - ''; - extraPlugins = [ - pkgs.vimExtraPlugins.lsp-progress-nvim - ]; - - # Status line setup - autoGroups.lsp_refresh.clear = true; - autoCmd = [ - { - event = ["User LspProgressStatusUpdated"]; - pattern = ["*"]; - callback = - /* - lua - */ - { - __raw = '' - require("lualine").refresh - ''; - }; - group = "lsp_refresh"; - description = "Refresh the statusbar when the lsp status was updated."; - } - ]; - plugins.lualine = let - get_lsp_progress = { - __raw = - /* - lua - */ - '' - require('lsp-progress').progress - ''; - }; - in { - sections = { - lualine_c = [{name = get_lsp_progress;}]; - }; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua b/modules/home/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua deleted file mode 100644 index efb15720..00000000 --- a/modules/home/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua +++ /dev/null @@ -1,150 +0,0 @@ ---- @type table -require("lsp-progress").setup({ - -- Spinning icons. - -- - --- @type string[] - spinner = { "⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷" }, - - -- Spinning update time in milliseconds. - -- - --- @type integer - spin_update_time = 200, - - -- Last message cached decay time in milliseconds. - -- - -- Message could be really fast(appear and disappear in an - -- instant) that user cannot even see it, thus we cache the last message - -- for a while for user view. - -- - --- @type integer - decay = 700, - - -- User event name. - -- - --- @type string - event = "LspProgressStatusUpdated", - - -- Event update time limit in milliseconds. - -- - -- Sometimes progress handler could emit many events in an instant, while - -- refreshing statusline cause too heavy synchronized IO, so we limit the - -- event rate to reduce this cost. - -- - --- @type integer - event_update_time_limit = 100, - - -- Max progress string length, by default -1 is unlimited. - -- - --- @type integer - max_size = -1, - - -- Regular internal update time. - -- - -- Emit user event to update the lsp progress status, even there's no new - -- message. - -- - --- @type integer - regular_internal_update_time = 500, - - -- Disable emitting events on specific mode/filetype. - -- User events would interrupt insert mode, thus break which-key like plugins behaviour. - -- See: - -- * https://github.com/linrongbin16/lsp-progress.nvim/issues/50 - -- * https://neovim.io/doc/user/builtin.html#mode() - -- - --- @type table[] - disable_events_opts = { { mode = "i", filetype = "TelescopePrompt" } }, - - -- Format series message. - -- - -- By default it looks like: `formatting isort (100%) - done`. - -- - --- @param title string|nil - --- Message title. - --- @param message string|nil - --- Message body. - --- @param percentage number|nil - --- Progress in percentage numbers: 0-100. - --- @param done boolean - --- Indicate whether this series is the last one in progress. - --- @return string|nil messages - --- The returned value will be passed to function `client_format` as - --- one of the `series_messages` array, or ignored if return nil. - series_format = function(title, message, percentage, done) - local builder = {} - local has_title = false - local has_message = false - if title and title ~= "" then - table.insert(builder, title) - has_title = true - end - if message and message ~= "" then - table.insert(builder, message) - has_message = true - end - if percentage and (has_title or has_message) then - table.insert(builder, string.format("(%.0f%%%%)", percentage)) - end - if done and (has_title or has_message) then - table.insert(builder, "- done") - end - return table.concat(builder, " ") - end, - - -- Format client message. - -- - -- By default it looks like: - -- `[null-ls] ⣷ formatting isort (100%) - done, formatting black (50%)`. - -- - --- @param client_name string - --- Client name. - --- @param spinner string - --- Spinner icon. - --- @param series_messages string[]|table[] - --- Messages array. - --- @return string|nil messages - --- The returned value will be passed to function `format` as one of the - --- `client_messages` array, or ignored if return nil. - client_format = function(client_name, spinner, series_messages) - return #series_messages > 0 - and ("[" .. client_name .. "] " .. spinner .. " " .. table.concat(series_messages, ", ")) - or nil - end, - - -- Format (final) message. - -- - -- By default it looks like: - -- ` LSP [null-ls] ⣷ formatting isort (100%) - done, formatting black (50%)` - -- - --- @param client_messages string[]|table[] - --- Client messages array. - --- @return nil|string message - --- The returned value will be returned from `progress` API. - format = function(client_messages) - local sign = " LSP" -- nf-fa-gear \uf013 - return #client_messages > 0 and (sign .. " " .. table.concat(client_messages, " ")) or sign - end, - - -- Enable debug. - -- - --- @type boolean - debug = false, - - -- Print log to console(command line). - -- - --- @type boolean - console_log = false, - - -- Print log to file. - -- - --- @type boolean - file_log = true, - - -- Log file to write, work with `file_log=true`. - -- - -- For Windows: `$env:USERPROFILE\AppData\Local\nvim-data\lsp-progress.log`. - -- For *NIX: `~/.local/share/nvim/lsp-progress.log`. - -- - --- @type string - file_log_name = "lsp-progress.log", -}) diff --git a/modules/home/conf/nvim/plgs/lsp/default.nix b/modules/home/conf/nvim/plgs/lsp/default.nix deleted file mode 100644 index b7c1e174..00000000 --- a/modules/home/conf/nvim/plgs/lsp/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{...}: { - imports = [ - ./keymaps - ./servers - ]; - programs.nixvim.plugins.lsp = { - enable = true; - onAttach = - "" - # + '' - # function(client, bufnr) - # -- Enable completion triggered by - # -- vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') - # end - # '' - ; - preConfig = '' - vim.diagnostic.config({ - underline = true, - -- virtual_text = true, - virtual_text = { - source = "always", -- Or "if_many" - }, - update_in_insert = true, - severity_sort = true, - }, nil); - ''; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/keymaps/default.nix b/modules/home/conf/nvim/plgs/lsp/keymaps/default.nix deleted file mode 100644 index b1276639..00000000 --- a/modules/home/conf/nvim/plgs/lsp/keymaps/default.nix +++ /dev/null @@ -1,70 +0,0 @@ -{...}: { - programs.nixvim = { - plugins.lsp.keymaps = { - diagnostic = { - "N" = { - action = "goto_prev"; - desc = "go to previous diagnostic message"; - }; - "T" = { - action = "goto_next"; - desc = "go to next diagnostic message"; - }; - "e" = { - action = "open_float"; - desc = "open float for the symbol"; - }; - "gq" = { - action = "setloclist"; - desc = "add buffer diagnostic to the location list (quick-fix)"; - }; - }; - lspBuf = { - "gD" = { - action = "declaration"; - desc = "[G]o to [d]eclaration"; - }; - "hi" = { - action = "hover"; - desc = "Display [h]over [i]nformation"; - }; - "sh" = { - action = "signature_help"; - desc = "Display [s]ignature [h]elp"; - }; - "wa" = { - action = "add_workspace_folder"; - desc = "[W]orkspace folder [a]dd"; - }; - "wr" = { - action = "remove_workspace_folder"; - desc = "[W]orkspace folder [r]emove"; - }; - "rn" = { - action = "rename"; - desc = "[R]e[n]ame the item under the cursor"; - }; - "ca" = { - action = "code_action"; - desc = "Open the [c]ode [a]ction menu"; - }; - }; - }; - keymaps = [ - { - key = "f"; - action.__raw = "function() vim.lsp.buf.format { async = true } end"; - options.desc = "[F]ormat the current buffer (asynchronously)"; - } - { - key = "wl"; - action.__raw = '' - function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end - ''; - options.desc = "[W]orkspace folders [l]ist"; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/default.nix b/modules/home/conf/nvim/plgs/lsp/servers/default.nix deleted file mode 100644 index 605046d4..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{...}: { - imports = [ - # ./servers/pylyzer.nix - ./servers/bashls.nix - ./servers/ccls.nix - ./servers/quick-lint-js.nix - ./servers/ltex.nix - ./servers/lua-ls.nix - ./servers/nil-ls.nix - ./servers/openscad.nix - ./servers/ruff-lsp.nix - ./servers/rust-analyzer.nix - ./servers/texlab.nix - ]; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/bashls.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/bashls.nix deleted file mode 100644 index 0577a335..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/bashls.nix +++ /dev/null @@ -1,5 +0,0 @@ -{...}: { - programs.nixvim.plugins.lsp.servers = { - bashls.enable = true; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/ccls.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/ccls.nix deleted file mode 100644 index 0698bcce..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/ccls.nix +++ /dev/null @@ -1,5 +0,0 @@ -{...}: { - programs.nixvim.plugins.lsp.servers = { - ccls.enable = true; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/ltex.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/ltex.nix deleted file mode 100644 index 3224bc41..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/ltex.nix +++ /dev/null @@ -1,39 +0,0 @@ -{...}: { - programs.nixvim.plugins.lsp.servers = { - ltex = let - filetypes = [ - "java" - "cpp" - "shell" - "bash" - - "bibtex" - "context" - "context.tex" - "latex" - "tex" - - "markdown" - "org" - "restructuredtext" - "rsweave" - - "git-commit" - "gitcommit" - - "mail" - ]; - in { - enable = true; - inherit filetypes; - settings = { - enabled = filetypes; - completionEnabled = false; - language = "en-CA"; - additionalRules = { - enablePickyRules = true; - }; - }; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/lua-ls.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/lua-ls.nix deleted file mode 100644 index 4f20558c..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/lua-ls.nix +++ /dev/null @@ -1,8 +0,0 @@ -{...}: { - programs.nixvim.plugins.lsp.servers = { - lua_ls = { - enable = true; - settings.telemetry.enable = false; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/nil-ls.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/nil-ls.nix deleted file mode 100644 index f0cccbdc..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/nil-ls.nix +++ /dev/null @@ -1,10 +0,0 @@ -{...}: { - programs.nixvim.plugins.lsp.servers = { - nil_ls = { - enable = true; - settings = { - formatting.command = ["alejandra"]; - }; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/openscad.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/openscad.nix deleted file mode 100644 index a0221cc4..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/openscad.nix +++ /dev/null @@ -1,17 +0,0 @@ -{pkgs, ...}: { - programs.nixvim = { - extraConfigLuaPost = - /* - lua - */ - '' - require('lspconfig').openscad_lsp.setup{ - cmd = {"openscad-lsp", "--stdio", "--fmt-style", "WebKit"}, - } - ''; - extraPackages = with pkgs; [ - openscad-lsp - clang-tools # Need to satisfy `clang-format` (which is used by openscad-lsp) - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/pylyzer.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/pylyzer.nix deleted file mode 100644 index b1042221..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/pylyzer.nix +++ /dev/null @@ -1,12 +0,0 @@ -{pkgs, ...}: { - programs.nixvim = { - extraConfigLuaPost = - /* - lua - */ - '' - require('lspconfig').pylyzer.setup{} - ''; - extraPackages = with pkgs; [pylyzer]; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/quick-lint-js.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/quick-lint-js.nix deleted file mode 100644 index 23c3054a..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/quick-lint-js.nix +++ /dev/null @@ -1,15 +0,0 @@ -{pkgs, ...}: { - programs.nixvim = { - extraConfigLuaPost = - /* - lua - */ - '' - require('lspconfig').quick_lint_js.setup{ - } - ''; - extraPackages = with pkgs; [ - quick-lint-js - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/ruff-lsp.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/ruff-lsp.nix deleted file mode 100644 index 6fbdc998..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/ruff-lsp.nix +++ /dev/null @@ -1,10 +0,0 @@ -{pkgs, ...}: { - programs.nixvim = { - plugins.lsp.servers = { - ruff_lsp = { - enable = true; - }; - }; - extraPackages = with pkgs; [ruff]; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/rust-analyzer.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/rust-analyzer.nix deleted file mode 100644 index 5da61a71..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/rust-analyzer.nix +++ /dev/null @@ -1,17 +0,0 @@ -{...}: { - programs.nixvim.plugins.lsp.servers = { - rust_analyzer = { - enable = true; - settings = { - typing.autoClosingAngleBrackets.enable = true; - - # Check with `cargo clippy` instead of just `cargo check` - check.command = "clippy"; - }; - # NOTE: These should be provided by the devenv, to support nightly and - # such things <2023-11-25> - installCargo = false; - installRustc = false; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/lsp/servers/servers/texlab.nix b/modules/home/conf/nvim/plgs/lsp/servers/servers/texlab.nix deleted file mode 100644 index 59af8d39..00000000 --- a/modules/home/conf/nvim/plgs/lsp/servers/servers/texlab.nix +++ /dev/null @@ -1,7 +0,0 @@ -{...}: { - programs.nixvim.plugins.lsp.servers = { - texlab = { - enable = true; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/lspkind/default.nix b/modules/home/conf/nvim/plgs/lspkind/default.nix deleted file mode 100644 index ed7d411b..00000000 --- a/modules/home/conf/nvim/plgs/lspkind/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{...}: { - programs.nixvim.plugins.lspkind = { - enable = true; - preset = "default"; # "codicons" is only for a font patched with vscode-codeicons. - }; -} diff --git a/modules/home/conf/nvim/plgs/ltex_extra/default.nix b/modules/home/conf/nvim/plgs/ltex_extra/default.nix deleted file mode 100644 index af78c7a5..00000000 --- a/modules/home/conf/nvim/plgs/ltex_extra/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{pkgs, ...}: { - programs.nixvim = { - # TODO: package ltex_extra though a module - extraPlugins = [ - pkgs.vimPlugins.ltex_extra-nvim - ]; - plugins.lsp.servers.ltex.onAttach.function = builtins.readFile ./lua/ltex_extra.lua; - }; -} diff --git a/modules/home/conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua b/modules/home/conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua deleted file mode 100644 index d532428a..00000000 --- a/modules/home/conf/nvim/plgs/ltex_extra/lua/ltex_extra.lua +++ /dev/null @@ -1,16 +0,0 @@ -require("ltex_extra").setup({ - -- table : languages for witch dictionaries will be loaded, e.g. { "es-AR", "en-US" } - -- https://valentjn.github.io/ltex/supported-languages.html#natural-languages - load_langs = { "en-CA", "de-DE", "sv-SE" }, -- en-US as default - -- boolean : whether to load dictionaries on startup - init_check = true, - -- string : relative or absolute path to store dictionaries - -- e.g. subfolder in the project root or the current working directory: ".ltex" - -- e.g. shared files for all projects: vim.fn.expand("~") .. "/.local/share/ltex" - path = vim.fn.expand("~") .. "/.local/state/nvim/ltex", -- project root or current working directory - -- string : "none", "trace", "debug", "info", "warn", "error", "fatal" - log_level = "warn", - -- table : configurations of the ltex language server. - -- Only if you are calling the server from ltex_extra - server_opts = nil, -}) diff --git a/modules/home/conf/nvim/plgs/lualine/default.nix b/modules/home/conf/nvim/plgs/lualine/default.nix deleted file mode 100644 index 54d20380..00000000 --- a/modules/home/conf/nvim/plgs/lualine/default.nix +++ /dev/null @@ -1,121 +0,0 @@ -{...}: { - programs.nixvim.plugins.lualine = let - get_location_of_file = { - __raw = '' - function() - local file_lines = vim.fn.line('$'); - local file_current_cursor_positon = vim.fn.getcurpos(); - return file_current_cursor_positon[3] .. ":" .. file_current_cursor_positon[2] .. "/" .. file_lines - end - ''; - }; - - get_trailing_whitespace = { - __raw = '' - function() - local space = vim.fn.search([[\s\+$]], 'nwc') - return space ~= 0 and "TW:" .. space or "" - end - ''; - }; - get_mixed_indent = { - __raw = - /* - lua - */ - '' - function() - local space_pat = [[\v^ +]] - local tab_pat = [[\v^\t+]] - local space_indent = vim.fn.search(space_pat, 'nwc') - local tab_indent = vim.fn.search(tab_pat, 'nwc') - local mixed = (space_indent > 0 and tab_indent > 0) - local mixed_same_line - if not mixed then - mixed_same_line = vim.fn.search([[\v^(\t+ | +\t)]], 'nwc') - mixed = mixed_same_line > 0 - end - if not mixed then return "" end - if mixed_same_line ~= nil and mixed_same_line > 0 then - return 'MI:' .. mixed_same_line - end - local space_indent_cnt = vim.fn.searchcount({ pattern = space_pat, max_count = 1e3 }).total - local tab_indent_cnt = vim.fn.searchcount({ pattern = tab_pat, max_count = 1e3 }).total - if space_indent_cnt > tab_indent_cnt then - return 'MI:' .. tab_indent - else - return 'MI:' .. space_indent - end - end - ''; - }; - in { - enable = true; - - settings = { - options = { - iconsEnabled = true; - theme = "nightfox"; - }; - - # TODO: add all installed and supported extensions here - extensions = [ - "toggleterm" - #"fugitive" # TODO: maybe add this? - ]; - - componentSeparators = { - left = ""; - right = ""; - }; - sectionSeparators = { - left = ""; - right = ""; - }; - disabledFiletypes = { - statusline = []; - winbar = []; - }; - ignoreFocus = []; - alwaysDivideMiddle = true; - globalstatus = false; - refresh = { - statusline = 1000; - tabline = 1000; - winbar = 1000; - }; - sections = { - lualine_a = ["mode"]; - lualine_b = [ - { - __raw = '' - {'FugitiveHead', icon = ""} - ''; - } - "diff" - "diagnostics" - ]; - lualine_c = ["filename"]; - lualine_x = ["searchcount" "filetype"]; - lualine_y = [ - "encoding" - "fileformat" - get_mixed_indent - get_trailing_whitespace - ]; - lualine_z = [get_location_of_file]; - }; - inactiveSections = { - lualine_a = []; - lualine_b = []; - lualine_c = ["filename"]; - lualine_x = [get_location_of_file]; - lualine_y = []; - lualine_z = []; - }; - tabline = {}; - winbar = {}; - inactiveWinbar = {}; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/luasnip/default.nix b/modules/home/conf/nvim/plgs/luasnip/default.nix deleted file mode 100644 index 130fafee..00000000 --- a/modules/home/conf/nvim/plgs/luasnip/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - lib, - pkgs, - ... -}: { - programs.nixvim = { - plugins.luasnip = { - enable = true; - }; - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/luasnip.lua}; - require("luasnip.loaders.from_lua").load({paths = "${./lua/snippets}"}); - require("luasnip.loaders.from_lua").lazy_load({paths = "${./lua/snippets}"}); - ''; - extraPlugins = [ - # needed for the todo-comments snippets - pkgs.vimPlugins.comment-nvim - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/luasnip/lua/luasnip.lua b/modules/home/conf/nvim/plgs/luasnip/lua/luasnip.lua deleted file mode 100644 index a05fa57f..00000000 --- a/modules/home/conf/nvim/plgs/luasnip/lua/luasnip.lua +++ /dev/null @@ -1,7 +0,0 @@ -require("luasnip").config.set_config({ - -- Enable auto triggered snippets - enable_autosnippets = true, - - -- Use Tab (or some other key if you prefer) to trigger visual selection - store_selection_keys = "", -}) diff --git a/modules/home/conf/nvim/plgs/luasnip/lua/snippets/all.lua b/modules/home/conf/nvim/plgs/luasnip/lua/snippets/all.lua deleted file mode 100644 index c3f75058..00000000 --- a/modules/home/conf/nvim/plgs/luasnip/lua/snippets/all.lua +++ /dev/null @@ -1,182 +0,0 @@ -local ls = require("luasnip") --- auto_pairs {{{ -local get_visual = function(args, parent) - if #parent.snippet.env.SELECT_RAW > 0 then - return sn(nil, i(1, parent.snippet.env.SELECT_RAW)) - else - return sn(nil, i(1, "")) - end -end -local function char_count_same(c1, c2) - local line = vim.api.nvim_get_current_line() - -- '%'-escape chars to force explicit match (gsub accepts patterns). - -- second return value is number of substitutions. - local _, ct1 = string.gsub(line, "%" .. c1, "") - local _, ct2 = string.gsub(line, "%" .. c2, "") - return ct1 == ct2 -end - -local function even_count(c, ...) - local line = vim.api.nvim_get_current_line() - local _, ct = string.gsub(line, c, "") - return ct % 2 == 0 -end - --- This makes creation of pair-type snippets easier. -local function pair(pair_begin, pair_end, file_types, condition_function) - -- FIXME(@Soispha): This only works if file_types == nil, otherwise the snippet does not expand. - -- It would be nice, if it would support both an empty array (`{}`) and nil <2023-08-27> - -- file_types = file_types or {}; - - return s( - { trig = pair_begin, wordTrig = false, snippetType = "autosnippet" }, - { t({ pair_begin }), d(1, get_visual), t({ pair_end }) }, - { - condition = function() - local filetype_check = true - if file_types ~= nil then - filetype_check = file_types[vim.bo.filetype] or false - end - return (not condition_function(pair_begin, pair_end)) and filetype_check - end, - } - ) -end - -local auto_pairs = { - pair("(", ")", nil, char_count_same), - pair("{", "}", nil, char_count_same), - pair("[", "]", nil, char_count_same), - pair("<", ">", { ["rust"] = true, ["tex"] = true }, char_count_same), - pair("'", "'", nil, even_count), - pair('"', '"', nil, even_count), - pair("`", "`", nil, even_count), -} - -ls.add_snippets("all", auto_pairs, { type = "snippets", key = "auto_pairs" }) --- }}} - --- todo_comments {{{ -local calculate_comment_string = require("Comment.ft").calculate -local utils = require("Comment.utils") - ---- Get the comment string {beg,end} table ----@param ctype integer 1 for `line`-comment and 2 for `block`-comment ----@return table comment_strings {begcstring, endcstring} -local get_cstring = function(ctype) - -- use the `Comments.nvim` API to fetch the comment string for the region (eq. '--%s' or '--[[%s]]' for `lua`) - local cstring = calculate_comment_string({ ctype = ctype, range = utils.get_region() }) or vim.bo.commentstring - -- as we want only the strings themselves and not strings ready for using `format` we want to split the left and right side - local left, right = utils.unwrap_cstr(cstring) - -- create a `{left, right}` table for it - return { left, right } -end -_G.luasnip = {} -_G.luasnip.vars = { - username = "@soispha", - email = "soispha@vhack.eu", -} - ---- Options for marks to be used in a TODO comment ----@return table,table: The first table contains a node for the date, the second for the signature -local marks = { - signature = function() - return t("(" .. _G.luasnip.vars.username .. ")"), t("") - end, - date_signature = function() - return t("<" .. os.date("%Y-%m-%d") .. ">"), t("(" .. _G.luasnip.vars.username .. ")") - end, - date = function() - return t("<" .. os.date("%Y-%m-%d") .. ">"), t("") - end, - empty = function() - return t(""), t("") - end, -} - ----@param alias string ----@param opts table ----@param mark_function function: This function should return two nodes ----@return table: Returns the comment node -local todo_snippet_nodes = function(alias, opts, mark_function) - local date_node, signature_node = mark_function() - -- format them into the actual snippet - local comment_node = fmta("<> <><>: <> <> <>", { - f(function() - return get_cstring(opts.ctype)[1] -- get - end), - t(alias), -- [name-of-comment] - signature_node, - i(0), -- {comment-text} - date_node, - f(function() - return get_cstring(opts.ctype)[2] -- get - end), - }) - return comment_node -end - ---- Generate a TODO comment snippet with an automatic description and docstring ----@param context table merged with the generated context table `trig` must be specified ----@param alias string of aliases for the todo comment (ex.: {FIX, ISSUE, FIXIT, BUG}) ----@param opts table merged with the snippet opts table ----@param mark_function function: The function used to get the marks -local todo_snippet = function(context, alias, opts, mark_function) - opts = opts or {} - context = context or {} - if not context.trig then - return error("context doesn't include a `trig` key which is mandatory", 2) -- all we need from the context is the trigger - end - opts.ctype = opts.ctype or 1 -- comment type can be passed in the `opts` table, but if it is not, we have to ensure, it is defined - local alias_string = alias -- `choice_node` documentation - context.name = context.name or (alias_string .. " comment") -- generate the `name` of the snippet if not defined - context.dscr = context.dscr or (alias_string .. " comment with a signature-mark") -- generate the `dscr` if not defined - context.docstring = context.docstring or (" {1:" .. alias_string .. "}: {3} <{2:mark}>{0} ") -- generate the `docstring` if not defined - local comment_node = todo_snippet_nodes(alias, opts, mark_function) - return s(context, comment_node, opts) -- the final todo-snippet constructed from our parameters -end - ----@param context table: The luasnip context ----@param opts table: The luasnip opts table, needs to have a ctype set ----@param aliases string: All aliases for a name ----@param marks table: Possible marks to account in snipped generation ----@return table: All possible snippets build from the marks -local process_marks = function(context, aliases, opts, marks) - local output = {} - for mark_name, mark_function in pairs(marks) do - local contex_trig_local = context.trig - context.trig = context.trig .. "-" .. mark_name - output[#output + 1] = todo_snippet(context, aliases, opts, mark_function) - context.trig = contex_trig_local - end - return output -end - -local todo_snippet_specs = { - { { trig = "todo" }, { "TODO" }, { ctype = 1 } }, - { { trig = "fix" }, { "FIXME", "ISSUE" }, { ctype = 1 } }, - { { trig = "hack" }, { "HACK" }, { ctype = 1 } }, - { { trig = "warn" }, { "WARNING" }, { ctype = 1 } }, - { { trig = "perf" }, { "PERFORMANCE", "OPTIMIZE" }, { ctype = 1 } }, - { { trig = "note" }, { "NOTE", "INFO" }, { ctype = 1 } }, - - -- NOTE: Block commented todo-comments - { { trig = "todob" }, { "TODO" }, { ctype = 2 } }, - { { trig = "fixb" }, { "FIXME", "ISSUE" }, { ctype = 2 } }, - { { trig = "hackb" }, { "HACK" }, { ctype = 2 } }, - { { trig = "warnb" }, { "WARNING" }, { ctype = 2 } }, - { { trig = "perfb" }, { "PERF", "PERFORMANCE", "OPTIM", "OPTIMIZE" }, { ctype = 2 } }, - { { trig = "noteb" }, { "NOTE", "INFO" }, { ctype = 2 } }, -} - -local todo_comment_snippets = {} -for _, v in ipairs(todo_snippet_specs) do - local snippets = process_marks(v[1], v[2][1], v[3], marks) - for _, value in pairs(snippets) do - table.insert(todo_comment_snippets, value) - end -end - -ls.add_snippets("all", todo_comment_snippets, { type = "snippets", key = "todo_comments" }) - --- }}} diff --git a/modules/home/conf/nvim/plgs/luasnip/lua/snippets/html/html.lua b/modules/home/conf/nvim/plgs/luasnip/lua/snippets/html/html.lua deleted file mode 100644 index 17e1e7fb..00000000 --- a/modules/home/conf/nvim/plgs/luasnip/lua/snippets/html/html.lua +++ /dev/null @@ -1,108 +0,0 @@ -local get_visual = function(args, parent) - if #parent.snippet.env.SELECT_RAW > 0 then - return sn(nil, i(1, parent.snippet.env.SELECT_RAW)) - else - return sn(nil, i(1)) - end -end - -local line_begin = require("luasnip.extras.expand_conditions").line_begin - -return { - -- HEADER - s( - { - trig = "h([123456])", - regTrig = true, - wordTrig = false, - snippetType = "autosnippet", - }, - fmt( - [[ - {} - ]], - { - f(function(_, snip) - return snip.captures[1] - end), - d(1, get_visual), - f(function(_, snip) - return snip.captures[1] - end), - } - ), - { condition = line_begin } - ), -- PARAGRAPH - s( - { trig = "pp", snippetType = "autosnippet" }, - fmt( - [[ -

    {}

    - ]], - { d(1, get_visual) } - ), - { condition = line_begin } - ), -- UNORDERED LIST - s( - { trig = "itt", snippetType = "autosnippet" }, - fmt( - [[ -
      -
    • {}
    • {} -
    - ]], - { i(1), i(0) } - ), - { condition = line_begin } - ), -- LIST ITEM - s( - { trig = "ii", snippetType = "autosnippet" }, - fmt( - [[ -
  • {}
  • - ]], - { d(1, get_visual) } - ), - { condition = line_begin } - ), - -- DOCUMENT TEMPLATE - s( - { trig = "base" }, - fmt( - [[ - - - - - {} - - - {} - - - ]], - { i(1, "FooBar"), i(0) } - ), - { condition = line_begin } - ), -- ANCHOR TAG - s( - { - trig = "([^%l])aa", - regTrig = true, - wordTrig = false, - snippetType = "autosnippet", - }, - fmt( - [[ - {}{} - ]], - { - f(function(_, snip) - return snip.captures[1] - end), - i(1), - d(2, get_visual), - } - ) - ), -} diff --git a/modules/home/conf/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua b/modules/home/conf/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua deleted file mode 100644 index 22434aa3..00000000 --- a/modules/home/conf/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua +++ /dev/null @@ -1,34 +0,0 @@ -local get_visual = function(args, parent) - if #parent.snippet.env.SELECT_RAW > 0 then - return sn(nil, i(1, parent.snippet.env.SELECT_RAW)) - else - return sn(nil, i(1, "")) - end -end - -local translation_table = { ["("] = ")", ["{"] = "}", ["["] = "]" } - --- Return snippet tables -return { - -- LEFT/RIGHT ALL BRACES - s( - { - trig = "([^%a])l([%(%[%{])", - regTrig = true, - wordTrig = false, - snippetType = "autosnippet", - }, - fmta("<>\\left<><>\\right<>", { - f(function(_, snip) - return snip.captures[1] - end), - f(function(_, snip) - return snip.captures[2] - end), - d(1, get_visual), - f(function(_, snip) - return translation_table[snip.captures[2]] - end), - }) - ), -} diff --git a/modules/home/conf/nvim/plgs/luasnip/lua/snippets/tex/greek.lua b/modules/home/conf/nvim/plgs/luasnip/lua/snippets/tex/greek.lua deleted file mode 100644 index ebf4f9d7..00000000 --- a/modules/home/conf/nvim/plgs/luasnip/lua/snippets/tex/greek.lua +++ /dev/null @@ -1,37 +0,0 @@ --- Return snippet tables -return { - s({ trig = ";a", snippetType = "autosnippet" }, { t("\\alpha") }), - s({ trig = ";b", snippetType = "autosnippet" }, { t("\\beta") }), - s({ trig = ";g", snippetType = "autosnippet" }, { t("\\gamma") }), - s({ trig = ";G", snippetType = "autosnippet" }, { t("\\Gamma") }), - s({ trig = ";d", snippetType = "autosnippet" }, { t("\\delta") }), - s({ trig = ";D", snippetType = "autosnippet" }, { t("\\Delta") }), - s({ trig = ";e", snippetType = "autosnippet" }, { t("\\epsilon") }), - s({ trig = ";ve", snippetType = "autosnippet" }, { t("\\varepsilon") }), - s({ trig = ";z", snippetType = "autosnippet" }, { t("\\zeta") }), - s({ trig = ";h", snippetType = "autosnippet" }, { t("\\eta") }), - s({ trig = ";o", snippetType = "autosnippet" }, { t("\\theta") }), - s({ trig = ";vo", snippetType = "autosnippet" }, { t("\\vartheta") }), - s({ trig = ";O", snippetType = "autosnippet" }, { t("\\Theta") }), - s({ trig = ";k", snippetType = "autosnippet" }, { t("\\kappa") }), - s({ trig = ";l", snippetType = "autosnippet" }, { t("\\lambda") }), - s({ trig = ";L", snippetType = "autosnippet" }, { t("\\Lambda") }), - s({ trig = ";m", snippetType = "autosnippet" }, { t("\\mu") }), - s({ trig = ";n", snippetType = "autosnippet" }, { t("\\nu") }), - s({ trig = ";x", snippetType = "autosnippet" }, { t("\\xi") }), - s({ trig = ";X", snippetType = "autosnippet" }, { t("\\Xi") }), - s({ trig = ";i", snippetType = "autosnippet" }, { t("\\pi") }), - s({ trig = ";I", snippetType = "autosnippet" }, { t("\\Pi") }), - s({ trig = ";r", snippetType = "autosnippet" }, { t("\\rho") }), - s({ trig = ";s", snippetType = "autosnippet" }, { t("\\sigma") }), - s({ trig = ";S", snippetType = "autosnippet" }, { t("\\Sigma") }), - s({ trig = ";t", snippetType = "autosnippet" }, { t("\\tau") }), - s({ trig = ";f", snippetType = "autosnippet" }, { t("\\phi") }), - s({ trig = ";vf", snippetType = "autosnippet" }, { t("\\varphi") }), - s({ trig = ";F", snippetType = "autosnippet" }, { t("\\Phi") }), - s({ trig = ";c", snippetType = "autosnippet" }, { t("\\chi") }), - s({ trig = ";p", snippetType = "autosnippet" }, { t("\\psi") }), - s({ trig = ";P", snippetType = "autosnippet" }, { t("\\Psi") }), - s({ trig = ";w", snippetType = "autosnippet" }, { t("\\omega") }), - s({ trig = ";W", snippetType = "autosnippet" }, { t("\\Omega") }), -} diff --git a/modules/home/conf/nvim/plgs/neorg/default.nix b/modules/home/conf/nvim/plgs/neorg/default.nix deleted file mode 100644 index 7d61ce09..00000000 --- a/modules/home/conf/nvim/plgs/neorg/default.nix +++ /dev/null @@ -1,57 +0,0 @@ -{pkgsStable, ...}: { - programs.nixvim.plugins.neorg = { - package = pkgsStable.vimPlugins.neorg; - enable = true; - lazyLoading = true; - - modules = { - "core.defaults" = { - __empty = null; - }; - "core.esupports.metagen".config = { - type = "auto"; - }; - "core.journal".config = { - workspace = "journal"; - }; - "core.keybinds".config = { - hook = { - __raw = '' - function(keybinds) - -- remap the looking glas to the same key, femaco is also mapped to. - keybinds.remap_event("norg", "n", "cc", "core.looking-glass.magnify-code-block") - - keybinds.remap_event("norg", "n", "", "core.integrations.telescope.find_linkable") - keybinds.remap_event("norg", "i", "", "core.integrations.telescope.insert_link") - end, - ''; - }; - }; - "core.completion".config = { - engine = "nvim-cmp"; - }; - "core.concealer".config = { - __empty = null; - }; - "core.dirman".config = { - workspaces = { - general = "~/repos/notes/general"; - journal = "~/repos/notes/journal"; - projects = "~/repos/notes/projects"; - }; - }; - "core.export".config = { - __empty = null; - }; - "core.integrations.telescope".config = { - __empty = null; - }; - - # TODO: Add this when the nvim version in nixpkgs is >= 0.10 <2023-08-29> - # - # "core.ui.calendar".config = { - # __empty = null; - # }; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/nvim-cmp/default.nix b/modules/home/conf/nvim/plgs/nvim-cmp/default.nix deleted file mode 100644 index ed0e57c3..00000000 --- a/modules/home/conf/nvim/plgs/nvim-cmp/default.nix +++ /dev/null @@ -1,54 +0,0 @@ -{config, ...}: { - programs.nixvim.plugins.cmp = let - neorg_source = - if config.programs.nixvim.plugins.neorg.modules."core.completion".config.engine == "nvim-cmp" - then [{name = "neorg";}] - else []; - in { - /* - TODO: integrate this: - ```lua - enabled = { - function() - -- disable completion in comments - local context = require 'cmp.config.context' - -- keep command mode completion enabled when cursor is in a comment - -- te - if vim.api.nvim_get_mode().mode == 'c' then - return true - else - return not context.in_treesitter_capture("comment") - and not context.in_syntax_group("Comment") - end - end - }, - ``` - */ - enable = true; - autoEnableSources = true; - settings = { - mapping = { - # TODO: add support for desc and which key here - "" = "cmp.mapping.scroll_docs(-4)"; # desc = "Scroll up by four lines" - "" = "cmp.mapping.scroll_docs(4)"; # desc = "Scroll down by four lines" - "HH" = "cmp.mapping.complete()"; # desc = "Confirm snipped" - }; - - snippet.expand = "function(args) require('luasnip').lsp_expand(args.body) end"; - - sources = - [ - {name = "nvim_lsp";} - {name = "luasnip";} - {name = "path";} - {name = "git";} # TODO: I might want to add config to allow all issues/prs <2023-10-16> - # {name = "convertionalcommits";} # TODO: Useless without commitlint [https://commitlint.js.org/] <2023-10-16> - # {name = "rg";} # TODO: This might really RIP-grep my system <2023-10-16> - # {name = "buffer";} - # {name = "digraphs";} - {name = "calc";} - ] - ++ neorg_source; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/nvim-lint/default.nix b/modules/home/conf/nvim/plgs/nvim-lint/default.nix deleted file mode 100644 index f5cb9acf..00000000 --- a/modules/home/conf/nvim/plgs/nvim-lint/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ - pkgs, - lib, - ... -}: { - programs.nixvim = { - # TODO: package nvim-lint though a module - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/nvim-lint.lua} - ''; - extraPlugins = [ - pkgs.vimPlugins.nvim-lint - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua b/modules/home/conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua deleted file mode 100644 index 4ed49f7b..00000000 --- a/modules/home/conf/nvim/plgs/nvim-lint/lua/nvim-lint.lua +++ /dev/null @@ -1,20 +0,0 @@ -require("lint").linters_by_ft = { - -- text - markdown = {}, - -- tex = {'chktex'}, -- maybe add some text linters ? - - -- shell (already covered by the bash language sever) - -- sh = { "shellcheck"; }; - -- bash = { "shellcheck"; }; - -- zsh = { "shellcheck"; }; - -- dash = { "shellcheck"; }; - - yaml = { "yamllint" }, - nix = { "nix", "statix" }, -} - -vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost" }, { - callback = function() - require("lint").try_lint() - end, -}) diff --git a/modules/home/conf/nvim/plgs/raw_plugins/default.nix b/modules/home/conf/nvim/plgs/raw_plugins/default.nix deleted file mode 100644 index 941cb7cb..00000000 --- a/modules/home/conf/nvim/plgs/raw_plugins/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{...}: { - programs.nixvim = { - # Not all plugins have own modules - # You can add missing plugins here - # `pkgs.vimExtraPlugins` is added by the overlay you added at the beginning - # For a list of available plugins, look here: - # https://github.com/jooooscha/nixpkgs-vim-extra-plugins/blob/main/plugins.md - extraPlugins = [ - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/telescope/default.nix b/modules/home/conf/nvim/plgs/telescope/default.nix deleted file mode 100644 index c32e139c..00000000 --- a/modules/home/conf/nvim/plgs/telescope/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{...}: { - imports = [ - ./defaults - ./keymaps - ./extensions - ]; - programs.nixvim.plugins = { - telescope = { - enable = true; - }; - - # This is a dependency of telescope - web-devicons = { - enable = true; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/telescope/defaults/default.nix b/modules/home/conf/nvim/plgs/telescope/defaults/default.nix deleted file mode 100644 index 933089ef..00000000 --- a/modules/home/conf/nvim/plgs/telescope/defaults/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -{...}: { - programs.nixvim.plugins.telescope.settings.defaults = { - mappings = let - insert_and_normal_mappings = { - # map actions.which_key to (default: ) - # actions.which_key shows the mappings for your picker, - # e.g. git_{create, delete, ...}_branch for the git_branches picker - "" = "which_key"; - }; - in { - i = - insert_and_normal_mappings; - n = - { - "t" = "move_selection_next"; - "n" = "move_selection_previous"; - "" = "toggle_all"; - - "" = "preview_scrolling_up"; - "" = "preview_scrolling_down"; - "" = "preview_scrolling_left"; - "" = "preview_scrolling_right"; - - "" = "close"; - "q" = "close"; - } - // insert_and_normal_mappings; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/telescope/extensions/bibtex/default.nix b/modules/home/conf/nvim/plgs/telescope/extensions/bibtex/default.nix deleted file mode 100644 index 6f3cc2ea..00000000 --- a/modules/home/conf/nvim/plgs/telescope/extensions/bibtex/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{pkgs, ...}: { - # WARNING: This is only activated in tex files via the ftplugin. - programs.nixvim = { - extraPlugins = [ - pkgs.vimExtraPlugins.telescope-bibtex-nvim - ]; - keymaps = [ - { - key = "ib"; - # This is registered in the ftplugin file, so we set this to null here - action = ""; - mode = "n"; - options.desc = "[i]nsert a [b]atex citation"; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/telescope/extensions/default.nix b/modules/home/conf/nvim/plgs/telescope/extensions/default.nix deleted file mode 100644 index 0b1e033a..00000000 --- a/modules/home/conf/nvim/plgs/telescope/extensions/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{...}: { - imports = [ - ./bibtex - ./frecency - ./fzy-native - ./rooter - ./symbols - ]; -} diff --git a/modules/home/conf/nvim/plgs/telescope/extensions/frecency/default.nix b/modules/home/conf/nvim/plgs/telescope/extensions/frecency/default.nix deleted file mode 100644 index 0e007b80..00000000 --- a/modules/home/conf/nvim/plgs/telescope/extensions/frecency/default.nix +++ /dev/null @@ -1,22 +0,0 @@ -{...}: { - programs.nixvim = { - keymaps = [ - { - key = "gff"; - mode = "n"; - action.__raw = "function() require('telescope').extensions.frecency.frecency() end"; - options.desc = "activate the frecency file selection"; - } - ]; - plugins.telescope = { - extensions.frecency = { - enable = true; - settings = { - show_scores = true; - db_safe_mode = false; - default_workspace = "CWD"; # or 'LSP' - }; - }; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/telescope/extensions/fzy-native/default.nix b/modules/home/conf/nvim/plgs/telescope/extensions/fzy-native/default.nix deleted file mode 100644 index ce0bdccc..00000000 --- a/modules/home/conf/nvim/plgs/telescope/extensions/fzy-native/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{...}: { - programs.nixvim.plugins.telescope.extensions.fzy-native = { - enable = true; - }; -} diff --git a/modules/home/conf/nvim/plgs/telescope/extensions/rooter/default.nix b/modules/home/conf/nvim/plgs/telescope/extensions/rooter/default.nix deleted file mode 100644 index 779448cc..00000000 --- a/modules/home/conf/nvim/plgs/telescope/extensions/rooter/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{lib, ...}: { - programs.nixvim = { - extraConfigLuaPost = '' - ${lib.strings.fileContents ./lua/rooter.lua} - ''; - }; -} diff --git a/modules/home/conf/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua b/modules/home/conf/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua deleted file mode 100644 index 7235c5a3..00000000 --- a/modules/home/conf/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua +++ /dev/null @@ -1,84 +0,0 @@ --- Taken from: https://github.com/desdic/telescope-rooter.nvim/blob/69423216c75a5f1f1477bbf8faf6b0dc8af04099/lua/telescope/_extensions/rooter.lua -local has_telescope, telescope = pcall(require, "telescope") -if not has_telescope then - error("This extension requires telescope.nvim") - return -end - -local has_plenary, plenary = pcall(require, "plenary") -if not has_plenary then - error("This extension requires plenary") - return -end - -local log = plenary.log.new({ plugin = "telescope_rooter", level = "info" }) - --- TODO: expose this function -local toggle = function(_) - vim.g["Telescope#rooter#enabled"] = not vim.g["Telescope#rooter#enabled"] - print("Telescope#rooter#enabled=" .. vim.inspect(vim.g["Telescope#rooter#enabled"])) -end - -local config = { patterns = { ".git" }, enable = true, debug = false } - --- default enabled -vim.g["Telescope#rooter#enabled"] = vim.F.if_nil(config.enable, true) - --- redefine log if debug enabled -if vim.F.if_nil(config.debug, false) then - log = plenary.log.new({ plugin = "telescope_rooter", level = "debug" }) -end - -local group = vim.api.nvim_create_augroup("TelescopeRooter", { clear = true }) - -vim.api.nvim_create_autocmd({ "DirChangedPre" }, { - callback = function() - if vim.g["Telescope#rooter#enabled"] ~= true then - return - end - - if vim.g["Telescope#rooter#oldpwd"] == nil then - vim.g["Telescope#rooter#oldpwd"] = vim.loop.cwd() - log.debug("before " .. vim.inspect(vim.loop.cwd())) - end - end, - group = group, -}) - -vim.api.nvim_create_autocmd({ "BufEnter", "BufWinEnter" }, { - callback = function() - if vim.g["Telescope#rooter#enabled"] ~= true then - return - end - - vim.schedule(function() - if vim.bo.filetype == "TelescopePrompt" then - local rootdir = vim.fs.dirname(vim.fs.find(config.patterns, { upward = true })[1]) - if rootdir ~= nil then - vim.api.nvim_set_current_dir(rootdir) - log.debug("changing dir to " .. rootdir) - end - end - end) - end, - group = group, -}) - -vim.api.nvim_create_autocmd({ "BufWinLeave" }, { - callback = function() - if vim.g["Telescope#rooter#enabled"] ~= true then - return - end - - vim.schedule(function() - if vim.bo.filetype ~= "TelescopePrompt" then - if vim.g["Telescope#rooter#oldpwd"] ~= nil then - log.debug("restoring " .. vim.g["Telescope#rooter#oldpwd"]) - vim.api.nvim_set_current_dir(vim.g["Telescope#rooter#oldpwd"]) - vim.g["Telescope#rooter#oldpwd"] = nil - end - end - end) - end, - group = group, -}) diff --git a/modules/home/conf/nvim/plgs/telescope/extensions/symbols/default.nix b/modules/home/conf/nvim/plgs/telescope/extensions/symbols/default.nix deleted file mode 100644 index 05b4a4f2..00000000 --- a/modules/home/conf/nvim/plgs/telescope/extensions/symbols/default.nix +++ /dev/null @@ -1,52 +0,0 @@ -{pkgs, ...}: { - programs.nixvim = { - extraPlugins = [ - # Source of symbols for telescope symbols - pkgs.vimPlugins.telescope-symbols-nvim - ]; - keymaps = [ - { - key = "il"; - mode = "n"; - action.__raw = '' - function() - require('telescope.builtin').symbols{ sources = { - 'latex' - }} - end - ''; - options.desc = "[i]nsert a [l]atex symbol"; - } - { - key = "ie"; - mode = "n"; - action.__raw = '' - function() - require('telescope.builtin').symbols{ sources = { - 'emoji', - }} - end - ''; - options.desc = "[i]nsert a [e]moji"; - } - { - key = "is"; - mode = "n"; - action.__raw = '' - function() - require('telescope.builtin').symbols{ sources = { - 'emoji', - 'gitmoji', - 'julia', - 'kaomoji', - 'latex', - 'math', - 'nerd', - }} - end - ''; - options.desc = "[i]nsert a [s]ymbol (like emojis)"; - } - ]; - }; -} diff --git a/modules/home/conf/nvim/plgs/telescope/keymaps/default.nix b/modules/home/conf/nvim/plgs/telescope/keymaps/default.nix deleted file mode 100644 index e551cc5a..00000000 --- a/modules/home/conf/nvim/plgs/telescope/keymaps/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{...}: { - programs.nixvim.plugins.telescope.keymaps = { - "rg" = { - action = "live_grep"; - options = { - desc = "[rg] in a live session"; - }; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/todo-comments/default.nix b/modules/home/conf/nvim/plgs/todo-comments/default.nix deleted file mode 100644 index e33f961b..00000000 --- a/modules/home/conf/nvim/plgs/todo-comments/default.nix +++ /dev/null @@ -1,51 +0,0 @@ -{...}: { - programs.nixvim.plugins.todo-comments = { - enable = true; - settings = { - guiStyle = { - fg = "BOLD"; - bg = "NONE"; - }; - highlight = { - keyword = "wide_fg"; - }; - keywords = { - /* - # Defaults: - FIX = { - icon = " "; # Icon used for the sign, and in search results. - color = "error"; # Can be a hex color, or a named color. - alt = ["FIXME" "BUG" "FIXIT" "ISSUE"]; # A set of other keywords that all map to this FIX keywords. - }; - TODO = { - icon = " "; - color = "info"; - }; - HACK = { - icon = " "; - color = "warning"; - }; - WARN = { - icon = " "; - color = "warning"; - alt = ["WARNING" "XXX"]; - }; - PERF = { - icon = "󰅒 "; - alt = ["OPTIM" "PERFORMANCE" "OPTIMIZE"]; - }; - NOTE = { - icon = "󰍨 "; - color = "hint"; - alt = ["INFO"]; - }; - TEST = { - icon = "⏲ "; - color = "test"; - alt = ["TESTING" "PASSED" "FAILED"]; - }; - */ - }; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/treesitter/default.nix b/modules/home/conf/nvim/plgs/treesitter/default.nix deleted file mode 100644 index b4b20388..00000000 --- a/modules/home/conf/nvim/plgs/treesitter/default.nix +++ /dev/null @@ -1,59 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: { - programs.nixvim = { - plugins.treesitter = { - enable = true; - - # NOTE: These are required to build grammars, but I already use the nix grammars <2024-07-13> - gccPackage = null; - nodejsPackage = null; - treesitterPackage = null; - - # inject nixvim specific highlighting (eg in extraConfigLua). - nixvimInjections = true; - - nixGrammars = true; - grammarPackages = - config.programs.nixvim.plugins.treesitter.package.passthru.allGrammars - ++ [pkgs.tree-sitter-yts]; - - settings = { - auto_install = false; - ensureInstalled = "all"; - indent.enable = true; - disabledLanguages = []; - - highlight = { - enable = true; - disable = []; - - # Setting this to true will run `:h syntax` and tree-sitter at the same time. - # Set this to `true` if you depend on 'syntax' being enabled (like for indentation). - # Using this option may slow down your editor; and you may see some duplicate highlights. - # Instead of true it can also be a list of languages - additionalVimRegexHighlighting = ["latex"]; - }; - - incrementalSelection = { - enable = true; - keymaps = { - # TODO: include these in the which-key description - initSelection = "gnn"; # set to `false` to disable one of the mappings - nodeIncremental = "grn"; - scopeIncremental = "grc"; - nodeDecremental = "grm"; - }; - }; - }; - }; - extraFiles = { - "queries/yts/highlights.scm".text = '' - ${lib.strings.fileContents "${pkgs.tree-sitter-yts}/queries/highlights.scm"} - ''; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/vim-tex/default.nix b/modules/home/conf/nvim/plgs/vim-tex/default.nix deleted file mode 100644 index 0b92c429..00000000 --- a/modules/home/conf/nvim/plgs/vim-tex/default.nix +++ /dev/null @@ -1,69 +0,0 @@ -{...}: { - programs.nixvim = { - opts.conceallevel = 0; - - plugins.vimtex = { - enable = true; - settings = { - view_method = "zathura"; - quickfix_mode = -1; - view_enabled = -1; - tex_conceal = "abdmg"; - tex_flavor = "latex"; - - # Useful if treesitter is the highlighter - syntax_enabled = 0; - syntax_conceal_disable = 1; - - mappings_disable = { - n = [ - "ts$" - "tsD" - "tsb" - "tsc" - "tsd" - "tse" - "tsf" - ]; - x = [ - "tsD" - "tsd" - "tsf" - ]; - }; - - toc_config = { - name = "TOC"; - layers = ["content" "todo" "include"]; - resize = false; - split_width = 49; - todo_sorted = -1; - show_help = false; - show_numbers = false; - mode = true; - layer_keys = { - content = "C"; - label = "L"; - todo = "j"; - include = "I"; - }; - }; - - compiler_latexmk = { - build_dir = "build"; - callback = false; - continuous = true; - executable = "latexmk"; - hooks = []; - options = [ - "-verbose" - "-file-line-error" - "-synctex=0" - "-interaction=nonstopmode" - "-outdir=build" - ]; - }; - }; - }; - }; -} diff --git a/modules/home/conf/nvim/plgs/which-key/default.nix b/modules/home/conf/nvim/plgs/which-key/default.nix deleted file mode 100644 index be63f7ac..00000000 --- a/modules/home/conf/nvim/plgs/which-key/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{...}: { - programs.nixvim.plugins.which-key = { - enable = true; - }; -} diff --git a/modules/home/conf/prusa_slicer/default.nix b/modules/home/conf/prusa_slicer/default.nix deleted file mode 100644 index 9529e13d..00000000 --- a/modules/home/conf/prusa_slicer/default.nix +++ /dev/null @@ -1,3 +0,0 @@ -{...}: { - xdg.configFile."PrusaSlicer/PrusaSlicer.ini".source = ./prusa_slicer.ini; -} diff --git a/modules/home/conf/prusa_slicer/prusa_slicer.ini b/modules/home/conf/prusa_slicer/prusa_slicer.ini deleted file mode 100644 index 0416a398..00000000 --- a/modules/home/conf/prusa_slicer/prusa_slicer.ini +++ /dev/null @@ -1,65 +0,0 @@ -alert_when_supports_needed = 1 -allow_auto_color_change = 1 -allow_ip_resolve = 1 -auto_toolbar_size = 100 -autocenter = 0 -background_processing = 0 -clear_undo_redo_stack_on_new_project = 1 -collapsed_sidebar = 0 -color_mapinulation_panel = 0 -custom_toolbar_size = 100 -default_action_on_close_application = none -default_action_on_new_project = none -default_action_on_select_preset = none -downloader_url_registered = 1 -drop_project_action = 1 -export_sources_full_pathnames = 0 -no_controller = 1 -no_defaults = 1 -no_templates = 0 -non_manifold_edges = 1 -notify_release = all -order_volumes = 1 -preset_update = 1 -remember_output_path = 1 -remember_output_path_removable = 1 -restore_win_position = 1 -reverse_mouse_wheel_zoom = 0 -seq_top_layer_only = 1 -show_drop_project_dialog = 1 -show_hints = 1 -show_incompatible_presets = 0 -show_splash_screen = 1 -single_instance = 0 -use_binary_gcode_when_supported = 0 -use_custom_toolbar_size = 0 -use_free_camera = 0 -use_inches = 0 -use_perspective_camera = 1 -view_mode = advanced -wifi_config_dialog_declined = 0 -window_mainframe = 3; 33; 1914; 1044; 1 - -[filaments] -Generic PETG @PGIS = 1 -Generic PLA @PGIS = 1 -Generic PLA Silk @PGIS = 1 -Prusa PETG @PGIS = 1 -Prusa PLA @PGIS = 1 -Prusament PETG @PGIS = 1 -Prusament PLA = 1 -Prusament PLA @PGIS = 1 -Prusament PLA @Template = 1 -Prusament PLA Blend @PGIS = 1 -Prusament rPLA @PG = 1 - -[presets] -filament = Prusament PLA -physical_printer = -print = 0.25mm DRAFT @MINI -printer = Original Prusa MINI & MINI+ -sla_material = -sla_print = - -[vendor:PrusaResearch] -model:MINI = 0.4 diff --git a/modules/home/conf/python/default.nix b/modules/home/conf/python/default.nix deleted file mode 100644 index 826d466d..00000000 --- a/modules/home/conf/python/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{config, ...}: { - xdg.configFile."python/pythonrc".source = ./pythonrc.py; - programs.zsh.sessionVariables = { - "PYTHONSTARTUP" = "${config.xdg.configHome}/python/pythonrc"; - }; -} diff --git a/modules/home/conf/python/pythonrc.py b/modules/home/conf/python/pythonrc.py deleted file mode 100644 index 466d9788..00000000 --- a/modules/home/conf/python/pythonrc.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python3 - - -def is_vanilla() -> bool: - import sys - - return not hasattr(__builtins__, "__IPYTHON__") and "bpython" not in sys.argv[0] - - -def setup_history(): - import os - import atexit - import readline - from pathlib import Path - - if state_home := os.environ.get("XDG_DATA_HOME"): - state_home = Path(state_home) - else: - state_home = Path.home() / ".local" / "state" - - history: Path = state_home / "python" / "history" - - if not os.path.exists(history): - open(history, "w") - - readline.read_history_file(str(history)) - atexit.register(readline.write_history_file, str(history)) - - -if is_vanilla(): - setup_history() - -# vim: ft=python diff --git a/modules/home/conf/rclone/default.nix b/modules/home/conf/rclone/default.nix deleted file mode 100644 index bd0c1ac2..00000000 --- a/modules/home/conf/rclone/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ - config, - pkgs, - ... -}: { - xdg.configFile."rclone/rclone.conf".source = ./rclone.conf; -} diff --git a/modules/home/conf/rclone/rclone.conf b/modules/home/conf/rclone/rclone.conf deleted file mode 100644 index 9e1c4f08..00000000 --- a/modules/home/conf/rclone/rclone.conf +++ /dev/null @@ -1,10 +0,0 @@ -[vhack1] -type = sftp -host = server1.vhack.eu -user = soispha -key_use_agent = true -known_hosts_file = ~/.local/share/ssh/known_hosts -shell_type = unix -md5sum_command = md5sum -sha1sum_command = sha1sum - diff --git a/modules/home/conf/rofi/default.nix b/modules/home/conf/rofi/default.nix deleted file mode 100644 index 10363ab5..00000000 --- a/modules/home/conf/rofi/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{pkgs, ...}: { - programs.rofi = { - enable = true; - package = pkgs.rofi-wayland; - terminal = "${pkgs.alacritty}/bin/alacritty"; - # show-icons = true; - # location = "center"; - theme = ./nord-twoLines.rasi; - }; -} diff --git a/modules/home/conf/rofi/nord-twoLines.rasi b/modules/home/conf/rofi/nord-twoLines.rasi deleted file mode 100644 index 612b907f..00000000 --- a/modules/home/conf/rofi/nord-twoLines.rasi +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * ROFI TWO LINES THEME USING THE NORD COLOR PALETTE - * User : LR-Tech - * Theme Repo : https://github.com/lr-tech/rofi-themes-collection - * Nord Project Repo : https://github.com/arcticicestudio/nord - *******************************************************************************/ - -* { - font: "Fira Code 10"; - - nord0: #2e3440; - nord1: #3b4252; - nord2: #434c5e; - nord3: #4c566a; - - nord4: #d8dee9; - nord5: #e5e9f0; - nord6: #eceff4; - - nord7: #8fbcbb; - nord8: #88c0d0; - nord9: #81a1c1; - nord10: #5e81ac; - nord11: #bf616a; - - nord12: #d08770; - nord13: #ebcb8b; - nord14: #a3be8c; - nord15: #b48ead; - - background-color: transparent; - text-color: @nord4; - accent-color: @nord8; - - margin: 0px; - padding: 0px; - spacing: 0px; -} - -window { - background-color: @nord0; - - location: north; - width: 100%; -} - -inputbar { - padding: 2px 8px; - spacing: 8px; - children: [ prompt, entry ]; -} - -prompt, entry, element-text, element-icon { - vertical-align: 0.5; -} - -prompt { - text-color: @accent-color; -} - -listview { - lines: 1; - columns: 4; -} - -element { - padding: 1px 8px; - spacing: 4px; -} - -element normal urgent { - text-color: @nord13; -} - -element normal active { - text-color: @accent-color; -} - -element selected { - text-color: @nord0; -} - -element selected normal { - background-color: @accent-color; -} - -element selected urgent { - background-color: @nord13; -} - -element selected active { - background-color: @nord8; -} - -element-icon { - size: 0.75em; -} - -element-text { - text-color: inherit; -} diff --git a/modules/home/conf/ssh/default.nix b/modules/home/conf/ssh/default.nix deleted file mode 100644 index de9b0d90..00000000 --- a/modules/home/conf/ssh/default.nix +++ /dev/null @@ -1,16 +0,0 @@ -{config, ...}: { - programs.ssh = { - enable = true; - compression = true; - hashKnownHosts = false; - serverAliveInterval = 240; - userKnownHostsFile = "${config.xdg.dataHome}/ssh/known_hosts"; - - matchBlocks = { - "codeberg.org" = { - # TODO: Remove this once they fix their ipv6 config - addressFamily = "inet"; - }; - }; - }; -} diff --git a/modules/home/conf/starship/default.nix b/modules/home/conf/starship/default.nix deleted file mode 100644 index 5db6eb8b..00000000 --- a/modules/home/conf/starship/default.nix +++ /dev/null @@ -1,119 +0,0 @@ -{ - lib, - nixosConfig, - pkgs, - ... -}: { - programs.starship = { - enable = true; - enableZshIntegration = true; - settings = { - add_newline = false; - format = lib.concatStrings [ - "$directory" - "$username" - "$cmd_duration" - "$status" - "$character" - ]; - right_format = lib.concatStrings ( - [ - "$git_metrics" - "$git_branch" - "$git_status" - "$git_commit" - "$git_state" - "$time" - ] - ++ lib.optional - nixosConfig.soispha.laptop.enable - "$battery" - ); - scan_timeout = 20; - character = { - # success_symbol = "[❯](bold blue)"; - # a = "⬢"; - success_symbol = "[](bold blue)"; - error_symbol = "[](bold red)"; - }; - status = { - disabled = false; - format = "([($common_meaning )($status)( $signal_name)]($style) )"; - }; - time = { - disabled = false; - format = "[\\[$time\\]]($style)"; - }; - username = { - format = "as [$user]($style) "; - }; - git_branch = { - format = "[($symbol$branch(:$remote_branch) )]($style)"; - }; - git_status = { - disabled = true; - format = "([\\[$ahead_behind\\]]($style) )"; - ahead = "⇡$count"; - diverged = "⇕⇡$ahead_count⇣$behind_count"; - behind = "⇣$count"; - }; - git_metrics = { - disabled = true; - ignore_submodules = true; - }; - git_state = { - format = "[\($state( $progress_current of $progress_total)\)]($style) "; - rebase = "[rebasing](bold magenta)"; - merge = "[merging](bold yellow)"; - revert = "[reverting](bold blue)"; - cherry_pick = "[picking](bold red)"; - bisect = "[bisecting](bold red)"; - am = "[applying](bold green)"; - am_or_rebase = "[applying/rebasing](bold yellow)"; - }; - git_commit = { - disabled = true; - tag_disabled = false; - tag_symbol = "v"; - format = "[(\\[$tag\\] )]($style)"; - }; - directory = { - truncate_to_repo = true; - read_only = " 󰌾"; - before_repo_root_style = "black bold dimmed"; - }; - cmd_duration = { - min_time = 2000; # Milliseconds - style = "bold white"; - }; - custom = { - # status_output = { - # format = "$output"; - # command = "if test $STARSHIP_CMD_STATUS -ne 0; then echo \"bold red\"; else echo \"bold cyan\"; fi"; - # shell = [ "${pkgs.dash}" ]; - # }; - }; - battery = { - # '󰁹 ' - # '󰂄 ' - # '󰂃 ' - # '󰁽 ' - # '󰂎 ' - display = [ - { - threshold = 10; - style = "bold red"; - } - { - threshold = 30; - style = "bold blue"; - } - { - threshold = 50; - style = "bold green"; - } - ]; - }; - }; - }; -} diff --git a/modules/home/conf/swayidle/config b/modules/home/conf/swayidle/config deleted file mode 100644 index a48f670b..00000000 --- a/modules/home/conf/swayidle/config +++ /dev/null @@ -1,5 +0,0 @@ -timeout 180 'swaylock -fF' - -timeout 360 'systemctl suspend-then-hibernate' - -before-sleep 'swaylock -f' diff --git a/modules/home/conf/swayidle/default.nix b/modules/home/conf/swayidle/default.nix deleted file mode 100644 index 6b8a7d80..00000000 --- a/modules/home/conf/swayidle/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - config, - pkgs, - ... -}: { - xdg.configFile."swayidle/config".source = ./config; - - # services.swayidle = { - # enable = true; - # events = [ - # { - # event = "before-sleep"; - # command = "${pkgs.swaylock}/bin/swaylock -f "; - # } - # ]; - # timeouts = [ - # { - # timeout = 180; - # command = "${pkgs.swaylock}/bin/swaylock -fFu "; - # } - # { - # timeout = 360; - # # TODO: systemctl is installed? - # command = "systemctl suspend-then-hibernate"; - # } - # ]; - # # systemdTarget = ""; # TODO: this might be usefull - # }; -} diff --git a/modules/home/conf/swaylock/GTDcanonical.png b/modules/home/conf/swaylock/GTDcanonical.png deleted file mode 100644 index ef41d79d..00000000 Binary files a/modules/home/conf/swaylock/GTDcanonical.png and /dev/null differ diff --git a/modules/home/conf/swaylock/commands.jpg b/modules/home/conf/swaylock/commands.jpg deleted file mode 100644 index 54016503..00000000 Binary files a/modules/home/conf/swaylock/commands.jpg and /dev/null differ diff --git a/modules/home/conf/swaylock/default.nix b/modules/home/conf/swaylock/default.nix deleted file mode 100644 index 9e5eabac..00000000 --- a/modules/home/conf/swaylock/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{...}: { - programs.swaylock = { - enable = true; - settings = { - image = "${./GTDcanonical.png}"; - scaling = "center"; - color = "000000"; - }; - }; -} diff --git a/modules/home/conf/swaylock/gnu.png b/modules/home/conf/swaylock/gnu.png deleted file mode 100644 index d07dee3e..00000000 Binary files a/modules/home/conf/swaylock/gnu.png and /dev/null differ diff --git a/modules/home/conf/taskwarrior/default.nix b/modules/home/conf/taskwarrior/default.nix deleted file mode 100644 index d7aec156..00000000 --- a/modules/home/conf/taskwarrior/default.nix +++ /dev/null @@ -1,125 +0,0 @@ -{ - nixosConfig, - lib, - config, - ... -}: { - imports = [ - ./hooks - ]; - - services.taskwarrior-sync = { - enable = true; - }; - - programs.taskwarrior = let - projects = import ./projects {}; - - mkContext = project: - if builtins.hasAttr "subprojects" project - then - lib.lists.flatten ( - (builtins.map mkContext (builtins.map (mkProject project) project.subprojects)) - ++ (mkContext (builtins.removeAttrs project ["subprojects"])) - ) - else [ - { - inherit (project) name; - value = let - name = - if builtins.hasAttr "pname" project - then project.pname - else project.name; - in { - read = "project:${name}"; - write = "project:${name}"; - rc = { - neorg_path = - if builtins.hasAttr "neorg_path" project - then project.neorg_path - else "${project.prefix}/${project.name}/index.norg"; - }; - }; - } - ]; - mkProject = project: subproject: let - pname = - if builtins.hasAttr "pname" project - then project.pname - else project.name; - in - if builtins.isString subproject - then { - name = "${project.name}_${subproject}"; - pname = "${pname}.${subproject}"; - neorg_path = - if builtins.hasAttr "neorg_path_prefix" project - then "${project.neorg_path_prefix}/${subproject}/index.norg" - else "${project.prefix}/${project.name}/${subproject}/index.norg"; - } - else if builtins.isAttrs subproject - then let - name = builtins.elemAt (builtins.attrNames subproject) 0; - in { - name = "${project.name}_${name}"; - pname = "${pname}.${name}"; - prefix = "${project.prefix}/${project.name}"; - neorg_path_prefix = "${project.prefix}/${project.name}/${name}"; - subprojects = builtins.elemAt (builtins.attrValues subproject) 0; - } - else builtins.throw "Subproject not a string or a attrs: ${subproject}"; - - context = - builtins.listToAttrs (lib.lists.flatten (builtins.map mkContext projects)); - in { - enable = true; - colorTheme = ./nord.theme; - extraConfig = '' - # This include just contains my taskd user credentials - include ${nixosConfig.age.secrets.taskserverCredentials.path} - ''; - config = { - news.version = "2.6.0"; - complete.all.tags = true; - list.all = { - projects = true; - tags = true; - }; - regex = true; - weekstart = "Monday"; - uda = { - total_active_time = { - type = "duration"; - label = "Total active time"; - }; - }; - alias = { - mod = "modify"; - n = "execute neorg --task"; - fstart = "execute neorg fstart"; - }; - color = true; - - hooks.location = "${config.xdg.configHome}/task/hooks"; - - urgency.uda.priority = { - H.coefficient = 6.0; - M.coefficient = 0; - L.coefficient = -1.8; - }; - - inherit context; - - taskd = { - server = "taskserver.vhack.eu:53589"; - trust = "strict"; - ca = - nixosConfig.age.secrets.taskserverCA.path; - key = - nixosConfig.age.secrets.taskserverPrivate.path; - certificate = - nixosConfig.age.secrets.taskserverPublic.path; - }; - }; - }; -} diff --git a/modules/home/conf/taskwarrior/firefox/default.nix b/modules/home/conf/taskwarrior/firefox/default.nix deleted file mode 100644 index fb5daaa8..00000000 --- a/modules/home/conf/taskwarrior/firefox/default.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ - config, - lib, - # options - prefConfig, - profile_size, - search, - userChrome, - ... -}: let - inherit (config.soispha.taskwarrior.projects) projects; - - mkFirefoxProfile = { - name, - id, - }: { - inherit name; - value = { - isDefault = false; - extraConfig = prefConfig; - inherit id name search userChrome; - }; - }; - projects_id = - lib.imap0 (id: project: { - name = project; - id = id + profile_size; - }) - projects; - firefoxProfiles = builtins.listToAttrs (builtins.map mkFirefoxProfile projects_id); -in - firefoxProfiles diff --git a/modules/home/conf/taskwarrior/hooks/default.nix b/modules/home/conf/taskwarrior/hooks/default.nix deleted file mode 100644 index ef97e1b5..00000000 --- a/modules/home/conf/taskwarrior/hooks/default.nix +++ /dev/null @@ -1,114 +0,0 @@ -{ - sysLib, - pkgs, - lib, - config, - ... -}: let - mkProject = project: subproject: - if builtins.isString subproject - then { - name = "${project.name}.${subproject}"; - prefix = null; - } - else let - name = builtins.elemAt (builtins.attrNames subproject) 0; - in { - name = "${project.name}.${name}"; - subprojects = builtins.elemAt (builtins.attrValues subproject) 0; - prefix = null; - }; - - mkProjectName = project: - if builtins.hasAttr "subprojects" project - then - lib.lists.flatten ([project.name] - ++ (builtins.map mkProjectName - (builtins.map (mkProject project) project.subprojects))) - else [project.name]; - projects = lib.lists.unique (lib.lists.naturalSort (lib.lists.flatten (builtins.map mkProjectName (import ../projects {})))); - projects_newline = builtins.concatStringsSep "\n" projects; - projects_comma = builtins.concatStringsSep ", " projects; - projects_pipe = builtins.concatStringsSep "|" projects; - - enforce_policies = sysLib.writeShellScript { - name = "bin"; - src = ./scripts/on-add_enforce-policies.sh; - dependencies = with pkgs; [dash jq taskwarrior gnused gnugrep]; - replacementStrings = { - PROJECTS_NEWLINE = projects_newline; - PROJECTS_COMMA = projects_comma; - }; - }; - track_timewarrior = pkgs.stdenv.mkDerivation { - name = "track_timewarrior.taskwarrior-hook"; - nativeBuildInputs = [ - pkgs.makeWrapper - ]; - buildInputs = [ - pkgs.timewarrior - pkgs.taskwarrior - # TODO: Use a `taskw` package, that actually supports newer python variants <2024-07-13> - (pkgs.python311.withPackages (pythonPackages: - with pythonPackages; [ - taskw - ])) - ]; - dontUnpack = true; - installPhase = '' - install -Dm755 ${./scripts/on-modify_track-timewarrior.py} $out/bin/bin - wrapProgram $out/bin/bin \ - --prefix PATH : ${lib.makeBinPath [pkgs.taskwarrior pkgs.timewarrior]} - ''; - }; - track_total_active_time = pkgs.stdenv.mkDerivation { - name = "track_total_active_time.taskwarrior-hook"; - nativeBuildInputs = [ - pkgs.makeWrapper - ]; - buildInputs = [ - pkgs.taskwarrior - # TODO: Use a `taskw` package, that actually supports newer python variants <2024-07-13> - (pkgs.python311.withPackages (pythonPackages: - with pythonPackages; [ - taskw - ])) - ]; - dontUnpack = true; - installPhase = '' - install -Dm755 ${./scripts/on-modify_track-total-active-time.py} $out/bin/bin - wrapProgram $out/bin/bin \ - --prefix PATH : ${lib.makeBinPath [pkgs.taskwarrior]} - ''; - }; - - mkSyncGitRepo = type: { - name = "${hookPath}/${type}_sync-git-repo"; - value = { - source = "${sysLib.writeShellScript { - name = "bin"; - src = ./scripts + "/${type}_sync-git-repo.sh"; - dependencies = with pkgs; [dash taskwarrior git]; - }}/bin/bin"; - }; - }; - sync_git_repos = - builtins.listToAttrs (builtins.map mkSyncGitRepo ["on-add" "on-modify"]); - hookPath = config.programs.taskwarrior.config.hooks.location; -in { - options.soispha.taskwarrior.projects = lib.mkOption { - type = lib.types.attrs; - }; - config = { - soispha.taskwarrior.projects = { - inherit projects_newline projects_comma projects projects_pipe; - }; - home.file = - { - "${hookPath}/on-add_enforce-policies".source = "${enforce_policies}/bin/bin"; - "${hookPath}/on-modify_track-timewarrior".source = "${track_timewarrior}/bin/bin"; - "${hookPath}/on-modify_track-total-active-time".source = "${track_total_active_time}/bin/bin"; - } - // sync_git_repos; - }; -} diff --git a/modules/home/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh b/modules/home/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh deleted file mode 100755 index eaf7f30c..00000000 --- a/modules/home/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# override shell lib output to stdout -eprint() { - # shellcheck disable=SC2317 - print "$@" -} -eprintln() { - # shellcheck disable=SC2317 - println "$@" -} - -enable_hook_dbg() { - debug_hooks="$(task _get rc.debug.hooks)" - [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable -} - -enforce_project() { - project="$(jq '.project' "$(ptmp "$1")")" - [ "$project" = "null" ] && die "No project supplied!" - - if grep -q "^$(echo "$project" | sed 's|"\(.*\)"|\1|')\$" "$(ptmp "%PROJECTS_NEWLINE")"; then - dbg "project('$project') is a valid part of %PROJECTS_COMMA" - else - die "The project '$(echo "$project" | sed 's|"||g')' is not registered with the nix config, registered projects: %PROJECTS_COMMA" - fi -} - -read -r new_task -# We don't change the task, thus immediately return the json -echo "$new_task" - -enable_hook_dbg -enforce_project "$new_task" - -exit 0 - -# vim: ft=sh diff --git a/modules/home/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh b/modules/home/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh deleted file mode 100755 index dadc96b0..00000000 --- a/modules/home/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# override shell lib output to stdout -eprint() { - # shellcheck disable=SC2317 - print "$@" -} -eprintln() { - # shellcheck disable=SC2317 - println "$@" -} - -enable_hook_dbg() { - debug_hooks="$(task _get rc.debug.hooks)" - [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable -} - -update_git_repo() { - task_data="$(task _get rc.data.location)" - [ "$task_data" ] || die "Taskwarrior should have a location set" - - cd "$task_data" || die "(BUG?): Your data.location path is not accessable" - - [ -d ./.git/ ] || git init - - git add . - git commit --message="chore: Update" --no-gpg-sign -} - -read -r new_task -# We don't change the task, thus immediately return the json -echo "$new_task" - -enable_hook_dbg -update_git_repo - -exit 0 - -# vim: ft=sh diff --git a/modules/home/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh b/modules/home/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh deleted file mode 100755 index 25813e46..00000000 --- a/modules/home/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# override shell lib output to stdout -eprint() { - # shellcheck disable=SC2317 - print "$@" -} -eprintln() { - # shellcheck disable=SC2317 - println "$@" -} - -enable_hook_dbg() { - debug_hooks="$(task _get rc.debug.hooks)" - [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable -} - -update_git_repo() { - task_data="$(task _get rc.data.location)" - [ "$task_data" ] || die "Taskwarrior should have a location set" - - cd "$task_data" || die "(BUG?): Your data.location path is not accessable" - - [ -d ./.git/ ] || git init - - git add . - git commit --message="chore: Update" --no-gpg-sign -} - -read -r _old_task -read -r new_task -# We don't change the task, thus immediately return the json -echo "$new_task" - -enable_hook_dbg -update_git_repo - -exit 0 - -# vim: ft=sh diff --git a/modules/home/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py b/modules/home/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py deleted file mode 100755 index b482af6a..00000000 --- a/modules/home/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# Copyright (C) 2016-present Arctic Ice Studio -# Copyright (C) 2016-present Sven Greb - -# Project: igloo -# Repository: https://github.com/arcticicestudio/igloo -# License: MIT -# References: -# https://taskwarrior.org/docs -# https://taskwarrior.org/docs/timewarrior -# timew(1) -# task(1) - -"""A Taskwarrior hook to track the time of a active task with Taskwarrior. - -This hook will extract all of the following for use as Timewarrior tags: - -* UUID -* Project -* Tags -* Description -* UDAs - -Note: - This hook requires Python 3 and is only compatible with Taskwarrior version greater or equal to 2.4! - -This hook is a fork from the `official on-modify.timewarrior hook`_. - -.. _`official on-modify.timewarrior hook`: - https://github.com/GothenburgBitFactory/timewarrior/blob/dev/ext/on-modify.timewarrior -""" - -import subprocess -import sys -from json import loads, dumps -from os import system -from sys import stdin -from taskw import TaskWarrior - -# Make no changes to the task, simply observe. -old = loads(stdin.readline()) -new = loads(stdin.readline()) -print(dumps(new)) - - -w = TaskWarrior(config_filename=sys.argv[4].replace("rc:", "")) -config = w.load_config(config_filename=sys.argv[4].replace("rc:", "")) -if "max_active_tasks" in config: - MAX_ACTIVE = int(config["max_active_tasks"]) -else: - MAX_ACTIVE = 1 - - -# Extract attributes for use as tags. -tags = [new["description"]] - -if "project" in new: - project = new["project"] - tags.append(project) - if "." in project: - tags.extend([tag for tag in project.split(".")]) - -if "tags" in new: - tags.extend(new["tags"]) - -combined = " ".join(["'%s'" % tag for tag in tags]).encode("utf-8").strip() - -# Task has been started. -if "start" in new and "start" not in old: - # Prevent this task from starting if "task +ACTIVE count" is greater than "MAX_ACTIVE". - p = subprocess.Popen( - ["task", "+ACTIVE", "status:pending", "count", "rc.verbose:off"], - stdout=subprocess.PIPE, - ) - out, err = p.communicate() - count = int(out.rstrip()) - if count >= MAX_ACTIVE: - print( - "Only %d task(s) can be active at a time. " - "See 'max_active_tasks' in .taskrc." % MAX_ACTIVE - ) - sys.exit(1) - - system("timew start " + combined.decode() + " :yes") - -# Task has been stopped. -elif "start" not in new and "start" in old: - system("timew stop " + combined.decode() + " :yes") - -# Any task that is active, with a non-pending status should not be tracked. -elif "start" in new and new["status"] != "pending": - system("timew stop " + combined.decode() + " :yes") diff --git a/modules/home/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py b/modules/home/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py deleted file mode 100755 index d5b380d0..00000000 --- a/modules/home/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# Copyright (C) 2016-present Arctic Ice Studio -# Copyright (C) 2016-present Sven Greb - -# Project: igloo -# Repository: https://github.com/arcticicestudio/igloo -# License: MIT -# References: -# https://taskwarrior.org/docs -# task(1) - -"""A Taskwarrior hook to track the total active time of a task. - -The tracked time is stored in a UDA task duration attribute named ``totalactivetime`` of type ``duration`` holding the total number of seconds the task was -active. The tracked time can then be included in any report by adding the ``totalactivetime`` column. - -By default, this plugin allows to have one task active at a time. This can be changed by setting ``max_active_tasks`` in ``.taskrc`` to a value greater than -``1``. - -Note: - This hook requires Python 3 and the `taskw`_ package to be installed which provides the python bindings for Taskwarrior! - Also note that this hook is only compatible with Taskwarrior version greater or equal to 2.4! - -This hook is a fork from `kostajh/taskwarrior-time-tracking-hook`_ - -.. _taskw: - https://pypi.python.org/pypi/taskw -.. _kostajh/taskwarrior-time-tracking-hook: - https://github.com/kostajh/taskwarrior-time-tracking-hook -""" - -import datetime -import json -import re -import sys -import subprocess -from taskw import TaskWarrior -from typing import TypeVar - -TIME_FORMAT = "%Y%m%dT%H%M%SZ" -UDA_KEY = "total_active_time" - -w = TaskWarrior(config_filename=sys.argv[4].replace("rc:", "")) -config = w.load_config(config_filename=sys.argv[4].replace("rc:", "")) -if "max_active_tasks" in config: - MAX_ACTIVE = int(config["max_active_tasks"]) -else: - MAX_ACTIVE = 1 - -"""Compiled regular expression for the duration as ISO-8601 formatted string.""" -ISO8601DURATION = re.compile("P((\d*)Y)?((\d*)M)?((\d*)D)?T((\d*)H)?((\d*)M)?((\d*)S)?") - -"""The duration type either as integer (in seconds), as ISO-8601 formatted string ("PT1H10M31S") or the seconds suffixed with "seconds".""" -DurationType = TypeVar("DurationType", str, int) - - -def duration_str_to_time_delta(duration_str: DurationType) -> datetime.timedelta: - """Converts duration string into a timedelta object. - - :param duration_str: The duration - :return: The duration as timedelta object - """ - if duration_str.startswith("P"): - match = ISO8601DURATION.match(duration_str) - if match: - year = match.group(2) - month = match.group(4) - day = match.group(6) - hour = match.group(8) - minute = match.group(10) - second = match.group(12) - value = 0 - if second: - value += int(second) - if minute: - value += int(minute) * 60 - if hour: - value += int(hour) * 3600 - if day: - value += int(day) * 3600 * 24 - if month: - # Assume a month is 30 days for now. - value += int(month) * 3600 * 24 * 30 - if year: - # Assume a year is 365 days for now. - value += int(year) * 3600 * 24 * 365 - else: - value = int(duration_str) - elif duration_str.endswith("seconds"): - value = int(duration_str.rstrip("seconds")) - else: - value = int(duration_str) - return datetime.timedelta(seconds=value) - - -def main(): - original = json.loads(sys.stdin.readline()) - modified = json.loads(sys.stdin.readline()) - - # An active task has just been started. - if "start" in modified and "start" not in original: - # Prevent this task from starting if "task +ACTIVE count" is greater than "MAX_ACTIVE". - p = subprocess.Popen( - ["task", "+ACTIVE", "status:pending", "count", "rc.verbose:off"], - stdout=subprocess.PIPE, - ) - out, err = p.communicate() - count = int(out.rstrip()) - if count >= MAX_ACTIVE: - print( - "Only %d task(s) can be active at a time. " - "See 'max_active_tasks' in .taskrc." % MAX_ACTIVE - ) - sys.exit(1) - - # An active task has just been stopped. - if "start" in original and "start" not in modified: - # Calculate the elapsed time. - start = datetime.datetime.strptime(original["start"], TIME_FORMAT) - end = datetime.datetime.utcnow() - - if UDA_KEY not in modified: - modified[UDA_KEY] = 0 - - this_duration = end - start - total_duration = this_duration + duration_str_to_time_delta( - str(modified[UDA_KEY]) - ) - print( - "Total Time Tracked: %s (%s in this instance)" - % (total_duration, this_duration) - ) - modified[UDA_KEY] = ( - str(int(total_duration.days * (60 * 60 * 24) + total_duration.seconds)) - + "seconds" - ) - - return json.dumps(modified, separators=(",", ":")) - - -def cmdline(): - sys.stdout.write(main()) - - -if __name__ == "__main__": - cmdline() diff --git a/modules/home/conf/taskwarrior/nord.theme b/modules/home/conf/taskwarrior/nord.theme deleted file mode 100644 index 2897418f..00000000 --- a/modules/home/conf/taskwarrior/nord.theme +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright (C) 2016-present Arctic Ice Studio -# Copyright (C) 2016-present Sven Greb - -# Project: igloo -# Repository: https://github.com/arcticicestudio/igloo -# License: MIT -# References: -# https://taskwarrior.org/docs/themes.html -# task-color(5) -# taskrc(5) - -rule.precedence.color=deleted,completed,active,keyword.,tag.,project.,overdue,scheduled,due.today,due,blocked,blocking,recurring,tagged,uda. - -#+---------+ -#+ General + -#+---------+ -color.label= -color.label.sort= -color.alternate= -color.header=bold blue -color.footnote=cyan -color.warning=bold black on yellow -color.error=bold black on red -color.debug=magenta - -#+-------------+ -#+ Task States + -#+-------------+ -color.completed=green -color.deleted=red -color.active=bold black on cyan -color.recurring= -color.scheduled=white on black -color.until=white on bright black -color.blocked=yellow on black -color.blocking=bold yellow on black - -#+----------+ -#+ Projects + -#+----------+ -color.project.none= - -#+----------+ -#+ Priority + -#+----------+ -color.uda.priority.H=bold cyan -color.uda.priority.M=bold blue -color.uda.priority.L=color245 - -#+------+ -#+ Tags + -#+------+ -color.tag.next= -color.tag.none= -color.tagged= - -#+-----+ -#+ Due + -#+-----+ -color.due=blue -color.due.today=cyan on black -color.overdue=bold red - -#+---------+ -#+ Reports + -#+---------+ -color.burndown.done=bold black on cyan -color.burndown.pending=black on bright cyan -color.burndown.started=black on blue - -color.history.add=bold black on blue -color.history.delete=bright white on bold black -color.history.done=bold black on cyan - -color.summary.background=bright white on black -color.summary.bar=black on cyan - -#+----------+ -#+ Calendar + -#+----------+ -color.calendar.due=bold black on blue -color.calendar.due.today=bold black on cyan -color.calendar.holiday=bold blue on white -color.calendar.overdue=bold black on red -color.calendar.today=bold black on cyan -color.calendar.weekend=bright white on bright black -color.calendar.weeknumber=bold black - -#+-----------------+ -#+ Synchronization + -#+-----------------+ -color.sync.added=green -color.sync.changed=yellow -color.sync.rejected=red - -#+------+ -#+ Undo + -#+------+ -color.undo.after=green -color.undo.before=red diff --git a/modules/home/conf/taskwarrior/projects/default.nix b/modules/home/conf/taskwarrior/projects/default.nix deleted file mode 100644 index 9b555fef..00000000 --- a/modules/home/conf/taskwarrior/projects/default.nix +++ /dev/null @@ -1,119 +0,0 @@ -{}: [ - { - name = "me"; - prefix = ""; - subprojects = ["health" "sweden" "bank"]; - } - { - name = "timesinks"; - prefix = ""; - subprojects = ["youtube" "games" "netflix" "music"]; - } - { - name = "input"; - prefix = "research"; - subprojects = ["read-things" "dotfiles"]; - } - { - name = "aoc"; - prefix = "programming/advent_of_code"; - } - { - name = "camera"; - prefix = "programming/zig"; - subprojects = []; - } - { - name = "trinitrix"; - prefix = "programming/rust"; - subprojects = ["testing" "documentation"]; - } - { - name = "serverphone"; - prefix = "programming/rust"; - } - { - name = "latex"; - prefix = "programming/latex"; - } - { - name = "presentation"; - prefix = "research"; - } - { - name = "possible-projects"; - prefix = "research"; - } - { - name = "school"; - prefix = "research"; - subprojects = [ - "biologie" - "chemie" - "deutsch" - "english" - "geographie" - "geschichte" - "infomatik" - "klausuren" - "latein" - "mathematik" - "musik" - "philosophie" - "physik" - "sozialkunde" - "sport" - {extern = ["bwinf" "dsa"];} - {chemie = ["facharbeit"];} # TODO: Remove once the ff tabs are cleared <2024-05-10> - ]; - } - { - name = "hardware"; - prefix = "research"; - } - { - name = "buy"; - prefix = "buy"; - subprojects = ["books" "pc"]; - } - { - name = "system"; - prefix = "config"; - subprojects = [ - "youtube" - "backup" - "bar" - "email" - "firefox" - "gpg" - "keyboard" - "laptop" - "nvim" - "rss" - "shell" - "task" - "wm" - ]; - } - { - name = "server"; - prefix = "config"; - subprojects = [ - "b-peetz" - "email" - "blog" - "nix-sync" - "sudo-less" - "ci" - ]; - } - { - name = "3d-printer"; - prefix = "hardware"; - } - { - name = "smartphone"; - prefix = "hardware"; - subprojects = ["airplay" "airdrop"]; - } -] diff --git a/modules/home/conf/timewarrior/default.nix b/modules/home/conf/timewarrior/default.nix deleted file mode 100644 index bcb627f5..00000000 --- a/modules/home/conf/timewarrior/default.nix +++ /dev/null @@ -1,22 +0,0 @@ -{pkgs, ...}: { - home.packages = [ - pkgs.timewarrior - ]; - xdg.configFile."timewarrior/timewarrior.cfg".text = '' - # source: https://github.com/arcticicestudio/igloo - #+----+ - #+ UI + - #+----+ - import ${./nord.theme} - color = true - - #+---------+ - #+ Reports + - #+---------+ - define reports: - day: - lines = 10 - month = true - week = true - ''; -} diff --git a/modules/home/conf/timewarrior/nord.theme b/modules/home/conf/timewarrior/nord.theme deleted file mode 100644 index da3c387a..00000000 --- a/modules/home/conf/timewarrior/nord.theme +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) 2016-present Arctic Ice Studio -# Copyright (C) 2016-present Sven Greb - -# Project: igloo -# Repository: https://github.com/arcticicestudio/igloo -# License: MIT -# References: -# https://taskwarrior.org/docs/timewarrior/themes.html -# timew(1) - -define theme: - description = "An arctic, north-bluish clean and elegant Timewarrior theme." - colors: - exclusion = "bold black" - today = "cyan" - holiday = "bold blue on white" - label = "bold white on black" - ids = "bold black on cyan" - debug = "magenta" - - # Rotating color palette for tags. - palette: - color01 = "bold black on cyan" - color02 = "bold black on bright cyan" - color03 = "bold black on blue" diff --git a/modules/home/conf/tridactyl/config.vim b/modules/home/conf/tridactyl/config.vim deleted file mode 100644 index 84e290cb..00000000 --- a/modules/home/conf/tridactyl/config.vim +++ /dev/null @@ -1,47 +0,0 @@ -" vim: filetype=vim - -" This wipes all existing settings. This means that if a setting in this file -" is removed, then it will return to default. In other words, this file serves -" as an enforced single point of truth for Tridactyl's configuration. -sanitize tridactyllocal tridactylsync - -" Just use a blank page for new tab. It would be nicer to use the standard -" Firefox homepage, but Tridactyl doesn't support this yet. -"TODO: use custome file -"set newtab file:///home/soispha/new.html - -" Set a nice colorscheme -colorscheme midnight - -" Delete temp files after use -alias editor_rm composite editor | jsb -p tri.native.run(`rm -f '${JS_ARG[0]}'`) -bind --mode=insert editor_rm -bind --mode=input editor_rm - -" Use vim in tmux for editor. -set editorcmd alacritty -e nvim - -" Ctrl-F should use the browser's native 'find' functionality. -unbind - -" But also support Tridactyl search too. -bind / fillcmdline find -bind ? fillcmdline find -? -bind l findnext 1 -bind L findnext -1 -" Remove search highlighting. -bind , nohlsearch -" Use sensitive case. Smart case would be nice here, but it doesn't work. -set findcase smartcase - -" Smooth scrolling, yes please. This is still a bit janky in Tridactyl. -set smoothscroll true - -" The default jump of 10 is a bit much. -bind t scrollline 5 -bind n scrollline -5 - -" K and J should move between tabs. x should close them. -bind T tabprev -bind N tabnext -bind x tabclose diff --git a/modules/home/conf/tridactyl/default.nix b/modules/home/conf/tridactyl/default.nix deleted file mode 100644 index 23307cfe..00000000 --- a/modules/home/conf/tridactyl/default.nix +++ /dev/null @@ -1,3 +0,0 @@ -{...}: { - xdg.configFile."tridactyl/tridactylrc".source = ./config.vim; -} diff --git a/modules/home/conf/unison/default.nix b/modules/home/conf/unison/default.nix deleted file mode 100644 index ae682235..00000000 --- a/modules/home/conf/unison/default.nix +++ /dev/null @@ -1,187 +0,0 @@ -{ - lib, - config, - nixosConfig, - sysLib, - pkgs, - ... -}: let - unisonPath = "${config.xdg.dataHome}/unison"; - - # These are only used for the script - unisonOptions = { - sshcmd = "ssh"; - ui = "text"; - auto = "true"; - # This is useless, with hm links - links = "false"; - - backupdir = "${unisonPath}/backups"; - backuploc = "central"; - backupcurr = paths_to_merge; - # merge = - # builtins.map (x: ''${x} -> diff3 --text --merge CURRENT1 CURRENTARCH CURRENT2 > NEW'') - # paths_to_merge; - }; - - paths_to_merge = mkPathName { - file_names = ["log" "history" "harpoon.json" "file_frecency.bin" "main.shada"]; - extensions = ["log"]; - }; - - paths_to_keep = [ - "~/.local/state/mpv" - "~/.local/state/nvim" - "~/.local/share" - "~/.local/.Trash-1000" - - "~/.mozilla/.Trash-1000" - "~/.mozilla/firefox" - - "~/media" - "~/school" - "~/repos" - ]; - paths_to_ignore = [ - # already synchronized by the taskserver - "~/.local/share/task" - - # Should not be synchronized - "~/.local/share/unison" - - # Is just to big to be synchronized (# TODO: Work around that <2024-08-31> ) - "~/media/music" - ]; - - hostName = let - hn = nixosConfig.networking.hostName; - in - if hn == "tiamat" - then "apzu" - else if hn == "apzu" - then "tiamat" - else builtins.throw "Host (${hn}) not yet covered in the unison host mapping."; - - mkPathName = { - file_names, - extensions, - }: - builtins.map (x: ''Name ${x}'') ( - (builtins.map (x: ''*.${x}'') extensions) - ++ file_names - ); - - unitName = name: builtins.replaceStrings ["/"] ["-"] name; - - mkPath = path: - if lib.strings.hasPrefix "~" path - then "${builtins.elemAt (builtins.attrNames config.home.persistence) - 0}${lib.strings.removePrefix "~" path}" - else - builtins.throw - "Every pathname needs to start with a '~'"; - - mkPair = pathname: let - path = mkPath pathname; - in { - name = unitName "${pathname}"; - value = { - stateDirectory = unisonPath; - roots = [ - "${path}" - "ssh://${config.home.username}@${hostName}.fritz.box/${path}" - ]; - }; - }; - - getIgnoredSingle = path: path_to_ignore: let - clean_path_to_ignore = mkPath path_to_ignore; - commonPath = builtins.substring 0 (builtins.stringLength path) clean_path_to_ignore; - in - if commonPath == path - then let - preFinalPath = - builtins.substring (builtins.stringLength commonPath) - (builtins.stringLength clean_path_to_ignore) - clean_path_to_ignore; - finalPath = - if lib.strings.hasPrefix "/" preFinalPath - then lib.strings.removePrefix "/" preFinalPath - else preFinalPath; - in "BelowPath ${finalPath}" - else null; - - getIgnored = paths_to_ignore: path: - serialiseArgs { - ignore = - builtins.filter (x: x != null) (builtins.map (getIgnoredSingle path) paths_to_ignore); - }; - - serialiseArg = key: val: - if builtins.typeOf val == "string" - then lib.strings.escapeShellArg "-${key}=${lib.strings.escape ["="] val}" - else if builtins.typeOf val == "list" - then lib.strings.concatStringsSep " " (builtins.map (serialiseArg key) val) - else builtins.throw "Unsupported type: ${builtins.typeOf val}"; - - serialiseArgs = args: - lib.strings.concatStringsSep " " ( - lib.attrsets.mapAttrsToList - serialiseArg - args - ); - - esa = a: lib.strings.escapeShellArg a; - - mkScriptLine = pathname: let - path = - mkPath pathname; - in - lib.strings.concatStringsSep " " [ - "unison" - "${serialiseArgs unisonOptions}" - "$EXTRA_OPTIONS" - "${getIgnored paths_to_ignore path}" - "${esa path}" - (esa "ssh://${config.home.username}@${hostName}.fritz.box/${path}") - ]; - - script = lib.strings.concatStringsSep "\n" (builtins.map mkScriptLine paths_to_keep); - - pairs = builtins.listToAttrs (builtins.map mkPair paths_to_keep); -in { - home.sessionVariables = { - UNISON = unisonPath; - }; - home.packages = [ - pkgs.unison - (sysLib.writeShellScript { - name = "unison-sync"; - src = builtins.toFile "unison-backup" ('' - #!/usr/bin/env dash - - # shellcheck source=/dev/null - SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - - export UNISON=${esa unisonPath}; - - if [ "$1" = "links" ]; then - shift 1; - EXTRA_OPTIONS="-links=true"; - fi - EXTRA_OPTIONS="$EXTRA_OPTIONS $*" - '' - + script); - dependencies = with pkgs; [ - unison - openssh # needed to connect to the other server - less # needed to show diffs - diffutils # needed to compute diffs - ]; - }) - ]; - services.unison = { - enable = false; - inherit pairs; - }; -} diff --git a/modules/home/conf/xdg/default.nix b/modules/home/conf/xdg/default.nix deleted file mode 100644 index 4099720d..00000000 --- a/modules/home/conf/xdg/default.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ - sysLib, - pkgs, - config, - ... -}: let - url_handler = sysLib.writeShellScript { - name = "url_handler"; - src = ./url_handler.sh; - keepPath = true; - # Naming dependencies for this will be difficult, as it depend on overridden packages. - dependencies = with pkgs; [ - rofi - libnotify - zathura - ]; - replacementStrings = { - ALL_PROJECTS_PIPE = "${config.soispha.taskwarrior.projects.projects_pipe}"; - }; - }; -in { - imports = [ - ./xdg_vars.nix - ]; - - xdg = { - mimeApps = { - enable = true; - defaultApplications = { - "application/pdf" = ["url_handler.desktop"]; - "application/x-pdf" = ["url_handler.desktop"]; - - "text/html" = ["url_handler.desktop"]; - "text/xml" = ["url_handler.desktop"]; - "x-scheme-handler/http" = ["url_handler.desktop"]; - "x-scheme-handler/https" = ["url_handler.desktop"]; - "x-scheme-handler/about" = ["url_handler.desktop"]; - "x-scheme-handler/unknown" = ["url_handler.desktop"]; - }; - }; - desktopEntries = { - url_handler = { - name = "url_handler"; - genericName = "Web Browser"; - exec = "${url_handler}/bin/url_handler %u"; - terminal = false; - categories = [ - "Application" - "Network" - "WebBrowser" - ]; - mimeType = [ - "text/html" - "text/xml" - "x-scheme-handler/http" - "x-scheme-handler/https" - "x-scheme-handler/about" - "x-scheme-handler/unknown" - ]; - }; - }; - }; -} diff --git a/modules/home/conf/xdg/url_handler.sh b/modules/home/conf/xdg/url_handler.sh deleted file mode 100755 index 95eedffb..00000000 --- a/modules/home/conf/xdg/url_handler.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -project="$(echo "%ALL_PROJECTS_PIPE|nvim|zathura|" | rofi -sep "|" -dmenu)" - -if [ "$project" = "nvim" ]; then - "$TERMINAL" -e nvim "$1" -elif [ "$project" = "zathura" ]; then - zathura "$1" -elif [ "$project" ]; then - firefox -P "$project" "$1" -else - notify-send "(URL HANDLER) No project selected" && exit 1 -fi - -# vim: ft=sh diff --git a/modules/home/conf/xdg/xdg_vars.nix b/modules/home/conf/xdg/xdg_vars.nix deleted file mode 100644 index 3f7d5e00..00000000 --- a/modules/home/conf/xdg/xdg_vars.nix +++ /dev/null @@ -1,26 +0,0 @@ -{config, ...}: let - inherit (config.xdg) dataHome; -in { - # Variables that only have to be set because special applications fail to set reasonable - # defaults (mostly understandable because of backwards-compatibility, but yeah) - programs.zsh.sessionVariables = { - CARGO_HOME = "${dataHome}/cargo"; - GRADLE_USER_HOME = "${dataHome}/gradle"; - - #_JAVA_OPTIONS = lib.concatStringsSep " " [ - # ''-Djava.util.prefs.userRoot="${config.xdg.configHome}/java"'' - # ''-Djavafx.cachedir="${config.xdg.cacheHome}/openjfx"'' - # ]; - #GOPATH = "${config.xdg.dataHome}/go"; - #GTK2_RC_FILES = "${config.xdg.configHome}/gtk-2.0/gtkrc"; - #RUSTUP_HOME = "${config.xdg.dataHome}/rustup"; - #NPM_CONFIG_USERCONFIG = "${config.xdg.configHome}/npm/npmrc"; - #NUGET_PACKAGES = "${config.xdg.cacheHome}/NuGetPackages"; - #XAUTHORITY = "${config.xdg.stateHome}/Xauthority"; - #COMPDUMPFILE = "${config.xdg.dataHome}/zsh/.zcompdump}"; - #IPYTHONDIR = "${config.xdg.configHome}/ipython"; - #PARALLEL_HOME = "${config.xdg.configHome}/parallel"; - #STACK_XDG = "1"; - #WINEPREFIX = "${config.xdg.dataHome}/wine"; - }; -} diff --git a/modules/home/conf/yambar/config/config.yml b/modules/home/conf/yambar/config/config.yml deleted file mode 100644 index 3d9f0687..00000000 --- a/modules/home/conf/yambar/config/config.yml +++ /dev/null @@ -1,243 +0,0 @@ ---- -# Config file for yambar -# Note that this may be version-dependent, this file is written for v1.8.0 - - -# Font anchors -font-main: &fontmain Source Code Pro:pixelsize=26 -font-aws: &awesome Font Awesome 5 Free:style=solid:pixelsize=23 - -# Color anchors -fg-none: &fgnone 00000000 -fg-1: &fg1 c6ceefff -fg-blue: &fgblue 99d1dbff -fg-sapphire: &fgsapp 74c7ecdd -fg-green: &fggreen a6e3a1dd -fg-peach: &fgpeach fab387dd -fg-mauve: &fgmauve cba6f7dd -fg-teal: &fgteal 94e2d5dd -fg-lavendar: &fglav b4befedd -fg-focus: &fgfocus e78284ff -bg-1: &bg1 303446ff -bg-tag: &bgtag 585b70ff -bg-tag2: &bgtag2 45475aff -bg-urgent: &bgurgent e78284ff - -# Background blocks -background-block: &bgcblock {background: {color: *bg1 }} -background-block-urgent: &bgcurg {background: {color: *bgurgent }} - -# Underlines -underline-focused: &line {underline: { size: 3, color: *fgfocus}} -underline-urgent: &lineurgent {underline: { size: 3, color: *fgblue}} -underline-utils: &lineutil {underline: { size: 3, color: *fgpeach}} -underline-resources: &linemem {underline: { size: 3, color: *fggreen}} -underline-battery: &linebat {underline: { size: 3, color: *fgsapp}} -underline-clock: &lineclock {underline: { size: 3, color: *fgteal}} -underline-weather: &linewea {underline: { size: 3, color: *fglav}} -underline-title: &linetitle {underline: { size: 3, color: *bgtag}} - -# Combined decorations -combination-utils: &combutil {stack: [ <<: *bgcblock, <<: *lineutil]} -combination-resources: &combmem {stack: [ <<: *bgcblock, <<: *linemem]} -combination-battery: &combbat {stack: [ <<: *bgcblock, <<: *linebat]} -combination-clock: &combclock {stack: [ <<: *bgcblock, <<: *lineclock]} -combination-weather: &combwea {stack: [ <<: *bgcblock, <<: *linewea]} - - -### Main - -bar: - location: top - height: 45 - layer: bottom - spacing: 0 - margin: 10 - border: {margin: 0, top-margin: 10} - foreground: *fg1 - background: *fgnone - font: *fontmain - - ### Left, river tags - left: - - river: - anchors: - - id: &name { text: "{id}" } - - string: &focus { stack: [ {background: {color: *bg1}} ] } - - string: &normal { string: { <<: *name, margin: 10 } } - - string: - &occupied { string: { <<: *name, deco: {background: {color: *bgtag2}}, margin: 10 } } - - string: &urgent { string: { <<: *name, deco: {stack: [background: {color: *bgurgent}, <<: *lineurgent]}, margin: 10 } } - - string: &focused { string: { <<: *name, deco: {stack: [background: {color: *bgtag}, <<: *line]}, margin: 10 } } - - string: &unfocused { string: { <<: *name, deco: {background: {color: *bgtag2}}, margin: 10 } } - - base: &river_base - default: *normal - conditions: - state == focused: *focused - state == unfocused: *unfocused - state == urgent: *urgent - state == invisible: - map: - conditions: - occupied: *occupied - ~occupied: *normal - content: - map: - on-click: - left: sh -c "riverctl set-focused-tags $((1 << ({id} - 1)))" - right: sh -c "riverctl toggle-focused-tags $((1 << ({id} -1)))" - middle: sh -c "riverctl toggle-view-tags $((1 << ({id} -1)))" - conditions: - id == 1: { map: { <<: *river_base } } - id == 2: { map: { <<: *river_base } } - id == 3: { map: { <<: *river_base } } - id == 4: { map: { <<: *river_base } } - id == 5: { map: { <<: *river_base } } - id == 6: { map: { <<: *river_base } } - id == 7: { map: { <<: *river_base } } - id == 8: { map: { <<: *river_base } } - id == 9: { map: { <<: *river_base } } - title: - map: - default: - { - string: - { - text: "{title}", - left-margin: 12, - right-margin: 12, - # max: 35, - deco: *linetitle - }, - } - conditions: - title == "": { string: { text: "" } } - - ### Center, clock & weather gadget - center: - - clock: - time-format: "%H:%M:%S %Z" - date-format: "%d/%m/%y (%a)" - foreground: *fgblue - content: - string: - text: " {date} {time} " - deco: *combclock - - ### Right, system tray - right: - #- network: - # name: wlp5s0 - # poll-interval: 10 - # content: - # map: - # on-click: /bin/sh -c "nmtui" - # conditions: - # ~carrier: {empty: {}} - # carrier: - # string: {text: "  {ssid} ", deco: *combutil} - #- network: - # name: enp4s0 - # content: - # map: - # on-click: /bin/sh -c "nmtui" - # conditions: - # ~carrier: - # string: {text: "  Eth failed ", deco: *combutil} - # carrier: {empty: {}} - - - script: # mpd song name - path: @mpd_song_name_script@ - content: - map: - conditions: - playing: - string: {text: "{song} ", deco: *combwea} - ~playing: - string: {text: "", deco: *combwea} - - script: # Sound volume - path: @volume_script@ - content: - map: - on-click: /bin/sh -c "pavucontrol" - conditions: - muted: - string: - text: " 󰝟 " - deco: *bgcurg - ~muted: - string: {text: "  {volume}% ", deco: *combutil} - - # - script: # Grade average - # path: @grade_average_script@ - # content: - # string: - # text: "  {grade} " - # deco: *combmem - - #- backlight: - # name: intel_backlight - # content: - # - string: {text: "  {percent}% ", deco: *combutil} - - - script: # CPU - path: @cpu_script@ - content: - string: - text: "  {cpu}% " - deco: *combmem - - - script: # Memory info - path: @memory_script@ - content: - map: - conditions: - swapstate: - string: - text: "  {memperc}%({swapperc}%) " - deco: *combmem - ~swapstate: - string: - text: "  {memperc}% " - deco: *combmem - - script: # Disk space - path: @disk_script@ - content: - string: - text: " 󰋊 {diskspace}({diskperc})" - deco: *combmem - #- battery: - # name: BAT0 - # poll-interval: 30 - # content: - # list: - # items: - # - ramp: - # tag: capacity - # items: - # - string: - # text: "  {capacity}%({estimate}) " - # deco: *bgcurg - # - string: - # text: "  {capacity}%({estimate}) " - # deco: {stack: [ <<: *bgcblock, <<: *linebat]} - # - string: - # text: "  {capacity}%({estimate}) " - # deco: {stack: [ <<: *bgcblock, <<: *linebat]} - # - string: - # text: "  {capacity}%({estimate}) " - # deco: {stack: [ <<: *bgcblock, <<: *linebat]} - # - string: - # text: "  {capacity}%({estimate}) " - # deco: {stack: [ <<: *bgcblock, <<: *linebat]} - #- script: # tray - # path: /home/dt/.config/yambar/scripts/yambar-tray - # content: - # empty: {} - #- script: - # path: /home/dt/.config/yambar/scripts/yambar-tray-width - # poll-interval: 10 - # content: - # string: - # text: "{padding}" - # deco: *combmem diff --git a/modules/home/conf/yambar/config/laptop.yml b/modules/home/conf/yambar/config/laptop.yml deleted file mode 100644 index 8de2f508..00000000 --- a/modules/home/conf/yambar/config/laptop.yml +++ /dev/null @@ -1,243 +0,0 @@ ---- -# Config file for yambar -# Note that this may be version-dependent, this file is written for v1.8.0 - - -# Font anchors -font-main: &fontmain Source Code Pro:pixelsize=22 -font-aws: &awesome Font Awesome 5 Free:style=solid:pixelsize=20 - -# Color anchors -fg-none: &fgnone 00000000 -fg-1: &fg1 c6ceefff -fg-blue: &fgblue 99d1dbff -fg-sapphire: &fgsapp 74c7ecdd -fg-green: &fggreen a6e3a1dd -fg-peach: &fgpeach fab387dd -fg-mauve: &fgmauve cba6f7dd -fg-teal: &fgteal 94e2d5dd -fg-lavendar: &fglav b4befedd -fg-focus: &fgfocus e78284ff -bg-1: &bg1 303446ff -bg-tag: &bgtag 585b70ff -bg-tag2: &bgtag2 45475aff -bg-urgent: &bgurgent e78284ff - -# Background blocks -background-block: &bgcblock {background: {color: *bg1 }} -background-block-urgent: &bgcurg {background: {color: *bgurgent }} - -# Underlines -underline-focused: &line {underline: { size: 3, color: *fgfocus}} -underline-urgent: &lineurgent {underline: { size: 3, color: *fgblue}} -underline-utils: &lineutil {underline: { size: 3, color: *fgpeach}} -underline-resources: &linemem {underline: { size: 3, color: *fggreen}} -underline-battery: &linebat {underline: { size: 3, color: *fgsapp}} -underline-clock: &lineclock {underline: { size: 3, color: *fgteal}} -underline-weather: &linewea {underline: { size: 3, color: *fglav}} -underline-title: &linetitle {underline: { size: 3, color: *bgtag}} - -# Combined decorations -combination-utils: &combutil {stack: [ <<: *bgcblock, <<: *lineutil]} -combination-resources: &combmem {stack: [ <<: *bgcblock, <<: *linemem]} -combination-battery: &combbat {stack: [ <<: *bgcblock, <<: *linebat]} -combination-clock: &combclock {stack: [ <<: *bgcblock, <<: *lineclock]} -combination-weather: &combwea {stack: [ <<: *bgcblock, <<: *linewea]} - - -### Main - -bar: - location: top - height: 25 - layer: bottom - spacing: 0 - margin: 10 - border: {margin: 0, top-margin: 5} - foreground: *fg1 - background: *fgnone - font: *fontmain - - ### Left, river tags - left: - - river: - anchors: - - id: &name { text: "{id}" } - - string: &focus { stack: [ {background: {color: *bg1}} ] } - - string: &normal { string: { <<: *name, margin: 10 } } - - string: - &occupied { string: { <<: *name, deco: {background: {color: *bgtag2}}, margin: 10 } } - - string: &urgent { string: { <<: *name, deco: {stack: [background: {color: *bgurgent}, <<: *lineurgent]}, margin: 10 } } - - string: &focused { string: { <<: *name, deco: {stack: [background: {color: *bgtag}, <<: *line]}, margin: 10 } } - - string: &unfocused { string: { <<: *name, deco: {background: {color: *bgtag2}}, margin: 10 } } - - base: &river_base - default: *normal - conditions: - state == focused: *focused - state == unfocused: *unfocused - state == urgent: *urgent - state == invisible: - map: - conditions: - occupied: *occupied - ~occupied: *normal - content: - map: - on-click: - left: sh -c "riverctl set-focused-tags $((1 << ({id} - 1)))" - right: sh -c "riverctl toggle-focused-tags $((1 << ({id} -1)))" - middle: sh -c "riverctl toggle-view-tags $((1 << ({id} -1)))" - conditions: - id == 1: { map: { <<: *river_base } } - id == 2: { map: { <<: *river_base } } - id == 3: { map: { <<: *river_base } } - id == 4: { map: { <<: *river_base } } - id == 5: { map: { <<: *river_base } } - id == 6: { map: { <<: *river_base } } - id == 7: { map: { <<: *river_base } } - id == 8: { map: { <<: *river_base } } - id == 9: { map: { <<: *river_base } } - title: - map: - default: - { - string: - { - text: "{title}", - left-margin: 12, - right-margin: 12, - # max: 35, - deco: *linetitle - }, - } - conditions: - title == "": { string: { text: "" } } - - ### Center, clock & weather gadget - center: - - clock: - time-format: "%H:%M:%S %Z" - date-format: "%d/%m/%y (%a)" - foreground: *fgblue - content: - string: - text: " {date} {time} " - deco: *combclock - - ### Right, system tray - right: - #- network: - # name: wlp5s0 - # poll-interval: 10 - # content: - # map: - # on-click: /bin/sh -c "nmtui" - # conditions: - # ~carrier: {empty: {}} - # carrier: - # string: {text: "  {ssid} ", deco: *combutil} - #- network: - # name: enp4s0 - # content: - # map: - # on-click: /bin/sh -c "nmtui" - # conditions: - # ~carrier: - # string: {text: "  Eth failed ", deco: *combutil} - # carrier: {empty: {}} - - - script: # mpd song name - path: @mpd_song_name_script@ - content: - map: - conditions: - playing: - string: {text: "{song} ", deco: *combwea} - ~playing: - string: {text: "", deco: *combwea} - - script: # Sound volume - path: @volume_script@ - content: - map: - on-click: /bin/sh -c "pavucontrol" - conditions: - muted: - string: - text: " 󰝟 " - deco: *bgcurg - ~muted: - string: {text: "  {volume}% ", deco: *combutil} - - # - script: # Grade average - # path: @grade_average_script@ - # content: - # string: - # text: "  {grade} " - # deco: *combmem - - - backlight: - name: @backlight@ - content: - - string: {text: "  {percent}% ", deco: *combutil} - - - script: # CPU - path: @cpu_script@ - content: - string: - text: "  {cpu}% " - deco: *combmem - - - script: # Memory info - path: @memory_script@ - content: - map: - conditions: - swapstate: - string: - text: "  {memperc}%({swapperc}%) " - deco: *combmem - ~swapstate: - string: - text: "  {memperc}% " - deco: *combmem - - script: # Disk space - path: @disk_script@ - content: - string: - text: " 󰋊 {diskspace}({diskperc})" - deco: *combmem - - battery: - name: BAT0 - poll-interval: 300 - content: - list: - items: - - ramp: - tag: capacity - items: - - string: - text: "  {capacity}%({estimate}) " - deco: *bgcurg - - string: - text: "  {capacity}%({estimate}) " - deco: {stack: [ <<: *bgcblock, <<: *linebat]} - - string: - text: "  {capacity}%({estimate}) " - deco: {stack: [ <<: *bgcblock, <<: *linebat]} - - string: - text: "  {capacity}%({estimate}) " - deco: {stack: [ <<: *bgcblock, <<: *linebat]} - - string: - text: "  {capacity}%({estimate}) " - deco: {stack: [ <<: *bgcblock, <<: *linebat]} - #- script: # tray - # path: /home/dt/.config/yambar/scripts/yambar-tray - # content: - # empty: {} - #- script: - # path: /home/dt/.config/yambar/scripts/yambar-tray-width - # poll-interval: 10 - # content: - # string: - # text: "{padding}" - # deco: *combmem diff --git a/modules/home/conf/yambar/default.nix b/modules/home/conf/yambar/default.nix deleted file mode 100644 index 007e7f25..00000000 --- a/modules/home/conf/yambar/default.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ - nixosConfig, - sysLib, - pkgs, - lib, - ... -}: let - makeScript = { - name, - dependencies, - ... - }: - sysLib.writeShellScript { - inherit name; - src = ./scripts/${name}.sh; - dependencies = dependencies ++ (builtins.attrValues {inherit (pkgs) dash;}); - } - + "/bin/${name}"; -in { - xdg.configFile."yambar/config.yml".source = pkgs.substituteAll { - src = - if nixosConfig.soispha.laptop.enable - then ./config/laptop.yml - else ./config/config.yml; - - backlight = - if nixosConfig.soispha.laptop.enable - then nixosConfig.soispha.laptop.backlight - else ""; - - mpd_song_name_script = makeScript { - dependencies = builtins.attrValues {inherit (pkgs) mpc-cli;}; - name = "mpd_song_name"; - }; - - volume_script = makeScript { - dependencies = builtins.attrValues {inherit (pkgs) pulseaudio gawk coreutils;}; - name = "sound-volume"; - }; - - cpu_script = lib.getExe pkgs.yambar-cpu; - - memory_script = lib.getExe pkgs.yambar-memory; - - disk_script = makeScript { - dependencies = builtins.attrValues {inherit (pkgs) gawk btrfs-progs coreutils;}; - name = "disk"; - }; - }; -} diff --git a/modules/home/conf/yambar/scripts/disk.sh b/modules/home/conf/yambar/scripts/disk.sh deleted file mode 100755 index a5547a74..00000000 --- a/modules/home/conf/yambar/scripts/disk.sh +++ /dev/null @@ -1,21 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# Main loop -while true; do - # vars - used_space=$(btrfs filesystem usage /srv 2>/dev/null | awk '{if ( /Used:/ ) { print $2 } } ' | head -n1) - all_space=$(btrfs filesystem usage /srv 2>/dev/null | awk '{if ( /Device size:/ ) { print $3 } } ' | head -n1 | tr -d "GiB") - - # Check space available (4) and percentage used (5) - spaceperc=$(echo "$(echo "$used_space" | tr -d "GiB")" "$all_space" | awk '{div=$1/$2;div *= 100; printf"%2d%%\n",div }') - - echo "diskspace|string|$used_space" - echo "diskperc|string|$spaceperc" - echo "" - sleep 1 -done - -# vim: ft=sh diff --git a/modules/home/conf/yambar/scripts/mpd_song_name.sh b/modules/home/conf/yambar/scripts/mpd_song_name.sh deleted file mode 100755 index 7d294781..00000000 --- a/modules/home/conf/yambar/scripts/mpd_song_name.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -while true; do - state="$(mpc status '%state%')" - - if [ "$state" = "playing" ]; then - song="$(mpc --format '[[%artist% - ]%title%]|[%file%]' current)" - echo "playing|bool|true" - echo "song|string|$song :: $(mpc status "%currenttime%/%totaltime%")" - else - echo "playing|bool|false" - fi - echo "" # commit - - sleep 2 -done - -# vim: ft=sh diff --git a/modules/home/conf/yambar/scripts/network.sh b/modules/home/conf/yambar/scripts/network.sh deleted file mode 100755 index adfc93df..00000000 --- a/modules/home/conf/yambar/scripts/network.sh +++ /dev/null @@ -1,47 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -retest=120 -retest_if_con_fails=10 -backend=nmcli - -case "$backend" in -"nmcli") # Test for connectivity with nmcli - while true; do - connection_status=$(nmcli networking connectivity) - if [ "$connection_status" = "full" ]; then - echo "internet|string|Connected" - echo "" - sleep $retest - else - echo "internet|string|Disconnected" - echo "" - sleep $retest_if_con_fails - fi - done - ;; -"ping") # Test for connectivity with ping - ip_address='8.8.8.8' - ping_number=3 - - while true; do - - ping_result=$(mktmp) - ping $ip_address -c $ping_number -q | awk 'BEGIN {FS="/"} END {print $5}' >"$ping_result" - - if [ "$(wc -l <"$ping_result")" -eq 0 ]; then - echo "med|string|No connection" - echo "" - sleep $retest_if_con_fails - else - echo "med|string|$(cat "$ping_result") ms" - echo "" - sleep $retest - fi - done - ;; -esac - -# vim: ft=sh diff --git a/modules/home/conf/yambar/scripts/sound-volume.sh b/modules/home/conf/yambar/scripts/sound-volume.sh deleted file mode 100755 index 8a98daf7..00000000 --- a/modules/home/conf/yambar/scripts/sound-volume.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -while true; do - volume="$(pactl get-sink-volume 0 | awk 'BEGIN { FS="/" } {gsub("%","",$2); gsub(" ","",$2)} {printf $2}')" - - if [ "$volume" -eq 0 ]; then - echo "muted|bool|true" - else - echo "volume|string|$volume" - echo "muted|bool|false" - fi - echo "" - - sleep 3 -done - -# vim: ft=sh diff --git a/modules/home/conf/yt/config.toml b/modules/home/conf/yt/config.toml deleted file mode 100644 index 981481d9..00000000 --- a/modules/home/conf/yt/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[download] -max_cache_size = "5 GiB" diff --git a/modules/home/conf/yt/default.nix b/modules/home/conf/yt/default.nix deleted file mode 100644 index 507a0db1..00000000 --- a/modules/home/conf/yt/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{...}: { - xdg.configFile."yt/mpv.conf".source = ./mpv.conf; - xdg.configFile."yt/mpv.input.conf".source = ./input.conf; - xdg.configFile."yt/config.toml".source = ./config.toml; -} diff --git a/modules/home/conf/yt/input.conf b/modules/home/conf/yt/input.conf deleted file mode 100644 index f374f062..00000000 --- a/modules/home/conf/yt/input.conf +++ /dev/null @@ -1,9 +0,0 @@ -Q script-message yt-mark-watch-later -c script-message yt-comments-external -C script-message yt-comments-local -d script-message yt-description -WHEEL_LEFT playlist-prev -WHEEL_RIGHT playlist-next -q script-message yt-mark-done-and-go-next -r script-message yt-check-new-videos -P quit diff --git a/modules/home/conf/yt/mpv.conf b/modules/home/conf/yt/mpv.conf deleted file mode 100644 index b6d2501f..00000000 --- a/modules/home/conf/yt/mpv.conf +++ /dev/null @@ -1,2 +0,0 @@ -speed=2.7 -volume=75 diff --git a/modules/home/conf/ytcc/default.nix b/modules/home/conf/ytcc/default.nix deleted file mode 100644 index 87300ec1..00000000 --- a/modules/home/conf/ytcc/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ - config, - pkgs, - ... -}: { - xdg.configFile."ytcc/ytcc.conf".source = pkgs.substituteAll { - src = ./ytcc.conf; - download_dir = "${config.xdg.userDirs.download}/ytcc"; - xdg_data_home = config.xdg.dataHome; - }; -} diff --git a/modules/home/conf/ytcc/ytcc.conf b/modules/home/conf/ytcc/ytcc.conf deleted file mode 100644 index 289843ad..00000000 --- a/modules/home/conf/ytcc/ytcc.conf +++ /dev/null @@ -1,37 +0,0 @@ -[ytcc] -download_dir = @download_dir@ -mpv_flags = --really-quiet --ytdl --ytdl-format=bestvideo[height<=?1080]+bestaudio/best --speed=2.7 -download_subdirs = true -order_by = playlists:asc, publish_date:desc -video_attrs = id, title, publish_date, duration, playlists -playlist_attrs = name, url, tags, reverse -db_path = @xdg_data_home@/ytcc/ytcc.db -date_format = %Y-%m-%d -max_update_fail = 5 -max_update_backlog = 20 -age_limit = 0 - -[tui] -alphabet = sdfervghnuiojkl -default_action = play_video - -[theme] -prompt_download_audio = 2 -prompt_download_video = 4 -prompt_play_audio = 2 -prompt_play_video = 4 -prompt_mark_watched = 1 -table_alternate_background = 245 -plain_label_text = 244 - -[youtube_dl] -format = bestvideo[height<=?1080]+bestaudio/best -output_template = %(title)s.%(ext)s -ratelimit = 0 -retries = 0 -subtitles = off -thumbnail = true -skip_live_stream = true -merge_output_format = mkv -max_duration = 0 -restrict_filenames = false diff --git a/modules/home/conf/zsh/config/command_not_found.sh b/modules/home/conf/zsh/config/command_not_found.sh deleted file mode 100644 index fb21b676..00000000 --- a/modules/home/conf/zsh/config/command_not_found.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env dash - -# This was taken from the -# `${pkgs.nix-index}/etc/profile.d/command-not-found.sh` file on 2024-02-28 - -# for bash 4 -# this will be called when a command is entered -# but not found in the user’s path + environment -command_not_found_handle() { - # taken from http://www.linuxjournal.com/content/bash-command-not-found - # - do not run when inside Midnight Commander or within a Pipe - if [ -n "${MC_SID-}" ] || ! [ -t 1 ]; then - >&2 echo "$1: command not found" - return 127 - fi - - toplevel=nixpkgs # nixpkgs should always be available even in NixOS - cmd="$1" - attrs=$(nix-locate --minimal --no-group --type x --type s --top-level --whole-name --at-root "/bin/$cmd") - len=$(if [ -n "$attrs" ]; then echo "$attrs" | wc -l; else echo 0; fi) - - case "$len" in - 0) - eprintln "$cmd: command not found" - ;; - 1) - # If only one package provides this, then we can invoke it - # without asking the user. - - # These will not return 127 if they worked correctly. - - >&2 cat <&2 cat <&2 cat <&2 - fi -} - -function_exists() { - # Zsh returns 0 even on non existing functions with -F so use -f - declare -f "$1" >/dev/null - return $? -} - -# -# The idea below is to copy any existing handlers to another function -# name and insert the message in front of the old handler in the -# new handler. By default, neither bash or zsh has has a handler function -# defined, so the default behaviour is replicated. -# -# Also, ensure the handler is only copied once. If we do not ensure this -# the handler would add itself recursively if this file happens to be -# sourced multiple times in the same shell, resulting in a neverending -# stream of messages. -# - -# -# Zsh -# -if function_exists command_not_found_handler; then - if ! function_exists orig_command_not_found_handler; then - eval "orig_$(declare -f command_not_found_handler)" - fi -else - orig_command_not_found_handler() { - printf "zsh: command not found: %s\n" "$1" >&2 - return 127 - } -fi - -command_not_found_handler() { - print_message - orig_command_not_found_handler "$@" -} - -# -# Bash -# -if function_exists command_not_found_handle; then - if ! function_exists orig_command_not_found_handle; then - eval "orig_$(declare -f command_not_found_handle)" - fi -else - orig_command_not_found_handle() { - printf "%s: %s: command not found\n" "$0" "$1" >&2 - return 127 - } -fi - -command_not_found_handle() { - print_message - orig_command_not_found_handle "$@" -} diff --git a/modules/home/conf/zsh/config/custom_cursor.zsh b/modules/home/conf/zsh/config/custom_cursor.zsh deleted file mode 100644 index 37390c1c..00000000 --- a/modules/home/conf/zsh/config/custom_cursor.zsh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env zsh - -# Change cursor shape for different vi modes. -function zle-keymap-select { - if [[ ${KEYMAP} == vicmd ]] || - [[ $1 = 'block' ]]; then - echo -ne '\e[1 q' - elif [[ ${KEYMAP} == main ]] || - [[ ${KEYMAP} == viins ]] || - [[ ${KEYMAP} = '' ]] || - [[ $1 = 'beam' ]]; then - echo -ne '\e[5 q' - fi -} -zle -N zle-keymap-select - -# ci", ci', ci`, di", etc -autoload -U select-quoted -zle -N select-quoted -for m in visual viopp; do - for c in {a,i}{\',\",\`}; do - bindkey -M "$m" "$c" select-quoted - done -done - -# ci{, ci(, ci<, di{, etc -autoload -U select-bracketed -zle -N select-bracketed -for m in visual viopp; do - for c in {a,i}${(s..)^:-'()[]{}<>bB'}; do - bindkey -M $m $c select-bracketed - done -done - -zle-line-init() { - zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere) - echo -ne "\e[5 q" -} -zle -N zle-line-init - -echo -ne '\e[5 q' # Use beam shape cursor on startup. -precmd() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt. diff --git a/modules/home/conf/zsh/config/zsh-init.zsh b/modules/home/conf/zsh/config/zsh-init.zsh deleted file mode 100644 index cd8d34a9..00000000 --- a/modules/home/conf/zsh/config/zsh-init.zsh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env zsh -# If not running interactively, don't do anything -[[ $- != *i* ]] && return - -# Flex on the ubuntu users -#[ "$NVIM" ] || hyfetch -[ "$NVIM" ] || task next -#loginctl show-session $XDG_SESSION_ID - -## Enable colors and change prompt: -#autoload -Uz colors && colors -#autoload -Uz compinit && compinit -u -## Edit line in vim buffer ctrl-v -autoload -Uz edit-command-line -zle -N edit-command-line -## Enter vim buffer from normal mode -#autoload -Uz edit-command-line && zle -N edit-command-line -bindkey "^V" edit-command-line - -## zstyles -#zstyle ':completion:*' menu select -## Auto complete with case insensitivity -#zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' - -#zmodload zsh/complist -#fpath+=/home/dt/.config/zsh/comp -#compinit -#_comp_options+=(globdots) # Include hidden files. -# -## Source configs -#source "${ZDOTDIR}/ali.sh" -#source "${ZDOTDIR}/prompt.sh" -#source "${ZDOTDIR}/hotkeys.sh" -#source "./${path_custom_cursor}" -#source ~/.local/lib/shell/lib -# -## Load zsh-syntax-highlighting -#source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh -## Suggest aliases for commands -#source /usr/share/zsh/plugins/zsh-you-should-use/you-should-use.plugin.zsh -# -##eval "$(lua ~/scripts/z.lua --init zsh enhanced)" diff --git a/modules/home/conf/zsh/default.nix b/modules/home/conf/zsh/default.nix deleted file mode 100644 index f5c65081..00000000 --- a/modules/home/conf/zsh/default.nix +++ /dev/null @@ -1,103 +0,0 @@ -{ - config, - pkgs, - lib, - shell_library, - system, - ... -}: { - # TODO: ADD THIS ADDON - # next one only works if your alias is only a command, e.g. if you `alias='cat some_file.txt &2> /dev/null'`, running `cat some_file.txt` won't trigger it. - # TODO: find something better for this use case - # zsh-you-should-use # ZSH plugin that reminds you to use existing aliases for commands you just typed - home.sessionPath = []; - programs.zsh = { - enable = true; - autosuggestion.enable = true; - enableCompletion = true; - syntaxHighlighting.enable = true; - - autocd = true; - - dotDir = ".config/zsh"; - - history = { - extended = true; - ignoreDups = false; - expireDuplicatesFirst = false; - ignoreSpace = false; # TODO: I might change that - - path = "${config.xdg.dataHome}/zsh/history"; - save = 9000000; # number of lines to save - size = 9000000; # number of lines to keep - share = false; # share between sessions - }; - historySubstringSearch = { - enable = true; - searchDownKey = "^[[B"; # DOWN Arrow key - searchUpKey = "^[[A"; # UP Arrow key - }; - - loginExtra = - "" - + lib.concatStringsSep "\nsetopt " [ - "setopt AUTO_CD" # This is needed as first item - "AUTO_PUSHD" - "CHASE_DOTS" - - "ALWAYS_TO_END" - - "EXTENDED_HISTORY" - "HIST_ALLOW_CLOBBER" - "HIST_VERIFY" - "HIST_FCNTL_LOCK" - "APPEND_HISTORY" - - "DVORAK" - "CORRECT" - - "PROMPT_SUBST" - "TRANSIENT_RPROMPT" # maybe? - - "COMBINING_CHARS" - "VI" - ]; - - initExtraFirst = - builtins.readFile ./config/zsh-init.zsh - + '' - SHELL_LIBRARY_VERSION="2.1.2" source ${shell_library.rawLib.${system}} - # This next line buffers the first line of the following item: - - '' - # NOTE: This must be before the insult, as we otherwise override the previous handler <2024-02-28> - + builtins.readFile ./config/command_not_found.sh - + builtins.readFile ./config/command_not_found_insult.sh - + builtins.readFile ./config/custom_cursor.zsh - + builtins.readFile "${pkgs.fzf}/share/fzf/key-bindings.zsh"; - - shellAliases = { - ll = ". ll"; - lm = ". lm"; - - hisea = "history 0 | grep"; - }; - sessionVariables = { - IVIEWER = "imv"; - READER = "zathura"; - - LIBVIRT_DEFAULT_URI = "qemu:///system"; - - BEMENU_SCALE = "1.5"; - BEMENU_BACKEND = "wayland"; - BEMENU_OPTS = "--fn 'Source Code Pro 10' -c -l 30 -B 1 -W 0.9 --hf #ffffff"; - - # Export Wayland env Vars {{{ - QT_QPA_PLATFORM = "wayland"; - QT_QPA_PLATFORMTHEME = "qt5ct"; # needs qt5ct - CLUTTER_BACKEND = "wayland"; - SDL_VIDEODRIVER = "wayland"; # might brake some things - # }}} - }; - }; -} diff --git a/modules/home/default.nix b/modules/home/default.nix deleted file mode 100644 index 574ed66a..00000000 --- a/modules/home/default.nix +++ /dev/null @@ -1,60 +0,0 @@ -{ - impermanence, - nixVim, - nix-index-database, - ... -}: let - username = "soispha"; - homeDirectory = "/home/${username}"; - - # xdg - configHome = "${homeDirectory}/.config"; - dataHome = "${homeDirectory}/.local/share"; - stateHome = "${homeDirectory}/.local/state"; - cacheHome = "${homeDirectory}/.cache"; - binHome = "${homeDirectory}/.local/bin"; - # TODO: add XDG_RUNTIME_DIR -in { - imports = [ - ./conf - ./files - ./impermanence - ./pkgs - ./wms - - impermanence.nixosModules.home-manager.impermanence - nixVim.homeManagerModules.nixvim - nix-index-database.hmModules.nix-index - ]; - - # I don't know what this does, but I've seen it a lot online, so it should be good, right? - programs.home-manager.enable = true; - - home = { - inherit username homeDirectory; - stateVersion = "23.05"; - enableNixpkgsReleaseCheck = true; - }; - xdg = { - enable = true; - inherit configHome dataHome stateHome cacheHome; #binHome; # TODO: add binHome, when the standard is extended - - /* - TODO: add this - desktopEntries = {}; - */ - - userDirs = { - enable = true; - createDirectories = true; - desktop = null; - documents = "${homeDirectory}/school/general"; - download = "${homeDirectory}/media/downloads"; - music = "${homeDirectory}/media/music"; - pictures = "${homeDirectory}/media/pictures"; - videos = "${homeDirectory}/media/videos"; - templates = "${homeDirectory}/media/templates"; - publicShare = "${homeDirectory}/media/public"; - }; - }; -} diff --git a/modules/home/files/default.nix b/modules/home/files/default.nix deleted file mode 100644 index 16fe9afe..00000000 --- a/modules/home/files/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{...}: { - imports = [ - ./wallpaper - ./manifest_json - ]; -} diff --git a/modules/home/files/manifest_json/default.nix b/modules/home/files/manifest_json/default.nix deleted file mode 100644 index af8d85d2..00000000 --- a/modules/home/files/manifest_json/default.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - config, - lib, - ... -}: { - home = { - activation = { - addManifestJson = - lib.hm.dag.entryAfter ["writeBoundary"] - '' - [ -L "${config.xdg.stateHome}/nix/profiles/profile" ] && $DRY_RUN_CMD rm $VERBOSE_ARG "${config.xdg.stateHome}/nix/profiles/profile" - $DRY_RUN_CMD ln -s $DRY_RUN_CMD "${./profile}" "${config.xdg.stateHome}/nix/profiles/profile" - ''; - }; - }; -} diff --git a/modules/home/files/manifest_json/profile/manifest.json b/modules/home/files/manifest_json/profile/manifest.json deleted file mode 100644 index bd74d935..00000000 --- a/modules/home/files/manifest_json/profile/manifest.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "elements": [], - "version": 2 -} diff --git a/modules/home/files/wallpaper/abstract-nord.png b/modules/home/files/wallpaper/abstract-nord.png deleted file mode 100644 index 5ef498bf..00000000 Binary files a/modules/home/files/wallpaper/abstract-nord.png and /dev/null differ diff --git a/modules/home/files/wallpaper/default.nix b/modules/home/files/wallpaper/default.nix deleted file mode 100644 index 119df225..00000000 --- a/modules/home/files/wallpaper/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{config, ...}: { - home = { - sessionVariables = { - WALLPAPER = "${config.home.homeDirectory}/media/pictures/wallpaper"; - }; - - file = { - wallpaper = { - source = ./abstract-nord.png; - target = "media/pictures/wallpaper"; - }; - }; - }; -} diff --git a/modules/home/impermanence/default.nix b/modules/home/impermanence/default.nix deleted file mode 100644 index dcb60f3b..00000000 --- a/modules/home/impermanence/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - lib, - nixosConfig, - ... -}: { - config = lib.mkIf nixosConfig.soispha.impermanence.enable { - home.persistence."/srv/home/soispha" = { - allowOther = true; - directories = [ - ".local/share" - - ".local/state/nvim" - ".local/state/mpv" - ".local/state/wireplumber" - - ".config/Signal" - ".config/Element" - ".config/iamb/profiles" - - ".cache" - ".mozilla" - - "media" - "repos" - "school" - ]; - }; - }; -} diff --git a/modules/home/pkgs/default.nix b/modules/home/pkgs/default.nix deleted file mode 100644 index ad77c5fb..00000000 --- a/modules/home/pkgs/default.nix +++ /dev/null @@ -1,240 +0,0 @@ -{ - pkgs, - lib, - config, - nixosConfig, - ... -}: -with pkgs; let - onlyShare = drv: - runCommand "${drv.name}-only-share" {} '' - mkdir -p $out - ln -s ${drv}/share $out/share - ''; - mpc-cli-man = onlyShare mpc-cli; - - Gui = { - Terminals = [ - # foot # wayland native terminal - alacritty # default terminal - ]; - Browsers = [ - #ungoogled-chromium # web browser (only for web programming) - #brave - ]; - - ImageManipulation = [ - #krita # new, and better (KDE) - #gimp # conservative, and old (GNOME) - ]; - - Social = [ - mumble # voice chat software (client) - # lutris # multiple game store clients - - # nheko # best matrix client (as of today) - # element-desktop # nheko didn't work - signal-desktop # to avoid encryption problems with signal-bridge - ]; - - Misc = [ - #kalzium # Periodic Table of Elements (`element` is [sort of] better) - keepassxc # password manager - #onlykey # OnlyKey Chrome Desktop App - anki-bin # spaced repetition - ]; - }; - - TuiCli = { - EyeCandy = [ - #banner # Print large banners to ASCII terminals - cmatrix # A curses-based scrolling 'Matrix'-like screen - hyfetch # Neofetch with LGBTQ pride flags. - ]; - - Social = [ - iamb # best tui matrix client (as of today) - ]; - - Pdfs = [ - con2pdf # Scanner implementation - ]; - - Misc = [ - android-file-transfer # Android MTP client with minimalistic UI - #xdg-ninja # A shell script which checks your $HOME for unwanted files and directories. - xdg-utils # open urls and such things - yokadi # Command line oriented, sqlite powered, todo list - killall # kill a application by name - snap-sync-forked # A btrfs based backup solution - bc # Smart calculator - aumo # Automatic mount - nato # Encodes a string in the standardized spelling alphabet - virsh-del # Delete a libvirt virtual machine (not really used anymore). - jq # Json parser - ]; - - Task = { - StartStop = [ - hibernate # Hibernate wrapper that automatically stops all active task - lock # Same as `hibernate`, but for locking - ]; - - Firefox = [ - # `neorg` handles the integration between Firefox profiles and task - # contexts - (neorg.override - { - defaultNeorgProjectDir = config.programs.nixvim.plugins.neorg.modules."core.dirman".config.workspaces.projects; - allProjectsNewline = config.soispha.taskwarrior.projects.projects_newline; - allProjectsComma = config.soispha.taskwarrior.projects.projects_comma; - allProjectsPipe = config.soispha.taskwarrior.projects.projects_pipe; - allWorkspaces = config.programs.nixvim.plugins.neorg.modules."core.dirman".config.workspaces; - xdgConfigHome = config.xdg.configHome; - xdgDataHome = config.xdg.dataHome; - }) - ]; - }; - - WM = { - river = [river]; # A dynamic tiling wayland compositor - - CLITools = [ - lswt # List Wayland toplevels. - wl-clipboard # Command-line copy/paste utilities. - swaylock # My current lockscreen implementation. - ]; - - Media = [ - wf-recorder # Screen recorder. - libnotify # a command to send a notification. - screenshot_persistent # Creates a persisting screenshot. - screenshot_temporary # Takes a screenshot and stores it in the clipboard. - ]; - }; - - Media = { - View = [ - imv # Image viewer - zathura # PDF viewer - ]; - - YouTube = [ - yti # Wrapper around `yt-dlp`. - yt # A command line YouTube client - ]; - - Listen = [ - spodi # Wrapper around `spotdl`. - ncmpc # mpd player client - mpc-cli-man # a cli mpd client (added via a wrapper script) - mpc # Wrapper around `mpc` that allows the usage of `mpc-{rm,lyrics,searchadd}` without the `-` - # Removes the currently playing song from the disk and storage - (mpc-beetrm.override { - beets = config.programs.beets.package; - }) - # Works like normal `mpc searchadd` but uses the `beets` query syntax - (mpc-searchadd.override { - beets = config.programs.beets.package; - }) - # Displays the lyrics of the currently playing song - (mpc-lyrics.override { - mpd_music_dir = config.services.mpd.musicDirectory; - }) - sort_song # Sorts songs in the current directory. - ]; - }; - - Hardware = { - Storage = [ - #compsize # Calculate compression ratio of a set of files on Btrfs - # TODO: smartmontools # Control and monitor S.M.A.R.T. enabled ATA and SCSI Hard Drives - ]; - - Battery = [ - battery # Check the battery level - ]; - - # TODO: Also support setting the brightness with multiple backlights <2024-05-24> - Backlight = - lib.optional nixosConfig.soispha.laptop.enable - ( - # Set the brightness level - brightness.override - { - backlightName = nixosConfig.soispha.laptop.backlight; - } - ); - - Input = [ - #piper # GTK application to configure gaming mice - ]; - }; - - SystemUpdate = [ - fupdate # Generic update tool. - update-sys # System update tool (meant to slot into `fupdate`). - ]; - - FileListers = [ - tree # A directory listing program displaying a depth indented list of files - fd # Simple, fast and user-friendly alternative to find - ripgrep # A search tool that combines the usability of ag with the raw speed of grep - fzf # used to quickly move around with its keybindings - file # Show information about a file - ll # Wrapper around `lf` to automatically change the path - lm # Wrapper around `ll` to automatically cd to the last accessed path - show # Wrapper around `less` to show a file (similar to the `cat ` pattern). - ]; - - Editors = [ - ed # A POSIX-compliant line-oriented text editor - #sed # GNU stream editor - vim # The original ex/vi text editor (this is `vim` and not `vi`, as `vi` is unfree) - #neovim # Fork of Vim aiming to improve user experience, plugins, and GUIs - ]; - - Programming = { - GeneralTools = [ - stamp # Add a license header to a file - git # the fast distributed version control system - git-absorb # git commit --fixup, but automatic - git-edit-index # Allows you to edit the indexed version of a file - git-cm # A wrapper that re-adds the last commit's subject - git-cleanup # An automatic merged branch deleter - glow # Command-line markdown renderer - ]; - }; - }; - # TODO: unmaintained, find sth else: - # handlr # Powerful alternative to xdg-utils written in Rust - mapFun = x: - if builtins.isAttrs x - then - if lib.isDerivation x - then [x] - else builtins.attrValues x - else [x]; -in { - home.packages = - [] - ++ (with builtins; - concatLists - (concatLists [ - (concatMap mapFun - (concatMap mapFun - (concatMap mapFun - (concatMap mapFun - (concatMap mapFun - (concatMap mapFun - (attrValues Gui))))))) - - (concatMap mapFun - (concatMap mapFun - (concatMap mapFun - (concatMap mapFun - (concatMap mapFun - (concatMap mapFun - (attrValues TuiCli))))))) - ])); -} diff --git a/modules/home/wms/default.nix b/modules/home/wms/default.nix deleted file mode 100644 index 610ea2f4..00000000 --- a/modules/home/wms/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{config, ...}: { - imports = [ - # ./sway - ./river - # ./plasma - ]; -} diff --git a/modules/home/wms/plasma/default.nix b/modules/home/wms/plasma/default.nix deleted file mode 100644 index f68ee272..00000000 --- a/modules/home/wms/plasma/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{config, ...}: { - services.xserver.enable = true; - services.xserver.displayManager.sddm.enable = true; - services.xserver.desktopManager.plasma5.enable = true; -} diff --git a/modules/home/wms/river/default.nix b/modules/home/wms/river/default.nix deleted file mode 100644 index 36a9ca74..00000000 --- a/modules/home/wms/river/default.nix +++ /dev/null @@ -1,76 +0,0 @@ -{ - pkgs, - sysLib, - river_init_lesser, - nixosConfig, - system, - ... -}: let - inherit (nixosConfig.networking) hostName; - mappings = - if hostName == "tiamat" - then '' - err_fail riverctl keyboard-layout 'us-modified' - err_fail river_init_lesser ~/.config/river/res/moonlander.ron - '' - else if hostName == "lahmu" || hostName == "apzu" || hostName == "mammun" || hostName == "isimud" - then '' - err_fail riverctl keyboard-layout 'dvorak-modified' - err_fail river_init_lesser ~/.config/river/res/keys.ron - '' - else builtins.throw "Host not covered in river mappings"; - screen_setup = - if hostName == "lahmu" - then '' - err_fail wlr-randr --output Virtual-1 --mode 1920x1080 - '' - else if hostName == "tiamat" - then '' - err_fail wlr-randr --output DP-2 --pos 2560,0 - err_fail wlr-randr --output DP-1 --scale 1.5 --pos 0,0 - err_fail gammastep & - '' - else if hostName == "apzu" || hostName == "mammun" || hostName == "isimud" - then '' - err_fail gammastep & - '' - else builtins.throw "Host not covered in river screen setup"; - env_vars = "XDG_CURRENT_DESKTOP=river DESKTOP_SESSION=river"; - init_scr = pkgs.substituteAll { - src = ./init.sh; - inherit mappings screen_setup env_vars; - }; -in { - home.sessionVariables = { - WM = "river"; - XDG_CURRENT_DESKTOP = "river"; - DESKTOP_SESSION = "river"; - }; - - xdg.configFile."river/init".source = - sysLib.writeShellScript { - name = "river_init"; - src = init_scr; - keepPath = true; - dependencies = builtins.attrValues { - river_init_lesser = river_init_lesser.packages.${system}.default; - inherit - (pkgs) - dash - river - glib # gnome lib - gammastep - wlr-randr - yambar - mako - swaybg - swayidle - swaylock - alacritty - ; - }; - } - + /bin/river_init; - - xdg.configFile."river/res".source = ./res; -} diff --git a/modules/home/wms/river/init.sh b/modules/home/wms/river/init.sh deleted file mode 100755 index 06a2e2f4..00000000 --- a/modules/home/wms/river/init.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env bash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -err_fail() { - if ! "$@"; then - warning "\"$*\" failed!\n" >>~/river_log - # msg "Executing the safe init!" - # exec ~/.config/river/res/safe_init.sh - fi -} -err_fail rm ~/river_log -exec 1>>"$HOME"/river_log -exec 2>>"$HOME"/river_log - -#trap err_fail ERR - -#Setup of environment variables {{{ -err_fail riverctl spawn "exec dbus-update-activation-environment --systemd SEATD_SOCK DISPLAY WAYLAND_DISPLAY DESKTOP_SESSION=river XDG_CURRENT_DESKTOP=river" -export @env_vars@ -#}}} - -# Setup of mappings {{{ -@mappings@ -# }}} - -# Setup of Rules {{{ -err_fail riverctl rule-add -app-id float -title '*' float -err_fail riverctl rule-add -app-id mpv -title '*' float -err_fail riverctl rule-add -app-id ModernGL -title '*' float -err_fail riverctl rule-add -app-id '*' -title 'Manim Slides' float -err_fail riverctl rule-add -app-id '*' -title 'floating please' float - -err_fail riverctl rule-add -app-id '*' -title '*' ssd -err_fail riverctl rule-add -app-id firefox -title '*' csd # This remove the focus border around Firefox (which is useful because the Firefox is nearly always in its own tag.) -# }}} - -# Set riverctl settings {{{ -# background -err_fail riverctl background-color 0x002b36 -err_fail riverctl border-color-focused 0x93a1a1 -err_fail riverctl border-color-unfocused 0x586e75 - -# keyboard repeat rate -err_fail riverctl set-repeat 50 300 - -# Cursor -err_fail riverctl focus-follows-cursor normal -#riverctl hide-cursor timeout 2000 -err_fail riverctl hide-cursor when-typing enabled -err_fail riverctl set-cursor-warp on-output-change -err_fail riverctl xcursor-theme Nordzy-cursors 24 - -err_fail riverctl input pointer-1133-49970-Logitech_Gaming_Mouse_G502 pointer-accel 0 -err_fail riverctl input pointer-1133-49970-Logitech_Gaming_Mouse_G502 accel-profile none - -err_fail riverctl input pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I pointer-accel 0 -err_fail riverctl input pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I accel-profile none -# }}} - -# Setup of general apps {{{ -@screen_setup@ - -err_fail yambar & - -err_fail mako & -err_fail swaybg -i "$WALLPAPER" & -err_fail swayidle & -err_fail alacritty & -# }}} - -# Setup of layout [acts as exec!] {{{ -err_fail riverctl default-layout rivertile -@env_vars@ rivertile -main-ratio 0.5 -view-padding 1 -outer-padding 0 - -#riverctl default-layout luatile -#river-luatile -# }}} -# vim: ft=sh diff --git a/modules/home/wms/river/res/keys.ron b/modules/home/wms/river/res/keys.ron deleted file mode 100644 index a2bc0fa1..00000000 --- a/modules/home/wms/river/res/keys.ron +++ /dev/null @@ -1,58 +0,0 @@ -#![enable(implicit_some)] -RiverctlCommandArray( - commands: [ - // Focus change - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "T", mods: "Super", command: "focus-view", command_args: "next",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "N", mods: "Super", command: "focus-view", command_args: "previous",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "T", mods: "Super+Control", command: "focus-output", command_args: "next",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "N", mods: "Super+Control", command: "focus-output", command_args: "previous",), - - // Standard program - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Return", mods: "Super", command: "spawn", command_args: "alacritty",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "q", mods: "Super+Shift", command: "exit", command_args: None,), - - // Screenshot - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Print", mods: "None", command: "spawn", command_args: "screenshot_persistent",), - - // Audio - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "XF86AudioRaiseVolume", mods: "None", command: "spawn", command_args: "pactl set-sink-volume 1 +5%",), - RiverctlCommand( map_mode: Map, mode: ["normal", "locked"], key: "XF86AudioLowerVolume", mods: "None", command: "spawn", command_args: "pactl set-sink-volume 1 -5%",), - RiverctlCommand( map_mode: Map, mode: ["normal", "locked"], key: "XF86AudioMute", mods: "None", command: "spawn", command_args: "mpc toggle",), - - // Launcher - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "R", mods: "Super", command: "spawn", command_args: "rofi -show combi -modes combi -combi-modes 'window,drun,run' -show-icons",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F1", mods: "Super", command: "spawn", command_args: "neorg dmenu",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F2", mods: "Super", command: "spawn", command_args: "keepassxc",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F3", mods: "Super", command: "spawn", command_args: "signal-desktop",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F4", mods: "Super", command: "spawn", command_args: "steam",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "L", mods: "Super", command: "spawn", command_args: "lock",), - - // Client - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "f", mods: "Super", command: "toggle-fullscreen", command_args: None,), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "c", mods: "Super+Shift", command: "close", command_args: None,), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "space", mods: "Super+Control", command: "toggle-float", command_args: None,), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Return", mods: "Super+Control", command: "zoom", command_args: None,), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "o", mods: "Super", command: "send-to-output", command_args: "next",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "T", mods: "Super+Shift", command: "swap", command_args: "next",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "N", mods: "Super+Shift", command: "swap", command_args: "previous",), - - // Toggle all tags - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "0", mods: "Super", command: "set-focused-tags", command_args: "4294967295"), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "0", mods: "Super+Shift", command: "set-view-tags", command_args: "4294967295"), - - // Mouse - RiverctlCommand( map_mode: MapMouse, mode: ["normal"], key: "BTN_LEFT", mods: "Super", command: "move-view", command_args: None,), - RiverctlCommand( map_mode: MapMouse, mode: ["normal"], key: "BTN_RIGHT", mods: "Super", command: "resize-view", command_args: None,), - - ], - // Set these mappings for the tags 0-8 with key [1-9] - tags_number: 9, - tag_commands: [ - RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super", command: "set-focused-tags",), - RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift", command: "set-view-tags",), - RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Control", command: "toggle-focused-tags",), - RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift+Control", command: "toggle-view-tags",), - ], -) - -// vim: nolinebreak nowrap textwidth=0 diff --git a/modules/home/wms/river/res/moonlander.ron b/modules/home/wms/river/res/moonlander.ron deleted file mode 100644 index 77ffa5c4..00000000 --- a/modules/home/wms/river/res/moonlander.ron +++ /dev/null @@ -1,64 +0,0 @@ -#![enable(implicit_some)] -RiverctlCommandArray( - // TODO: add toggle-focus mapping - commands: [ - // Movement - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "A", mods: "Alt+Control+Super+Shift", command: "exit", command_args: None,), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "B", mods: "Alt+Control+Super+Shift", command: "close", command_args: None,), - - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "C", mods: "Alt+Control+Super+Shift", command: "focus-view", command_args: "previous",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "D", mods: "Alt+Control+Super+Shift", command: "focus-view", command_args: "next",), - - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "E", mods: "Alt+Control+Super+Shift", command: "swap", command_args: "previous",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "F", mods: "Alt+Control+Super+Shift", command: "swap", command_args: "next",), - - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "G", mods: "Alt+Control+Super+Shift", command: "zoom", command_args: None,), - - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "H", mods: "Alt+Control+Super+Shift", command: "toggle-fullscreen", command_args: None,), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "I", mods: "Alt+Control+Super+Shift", command: "toggle-float", command_args: None,), - - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "J", mods: "Alt+Control+Super+Shift", command: "send-to-output", command_args: "next",), - - - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "K", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "alacritty",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "L", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "screenshot_persistent",), - - // Audio - // RiverctlCommand( map_mode: Map, mode: ["normal", "locked"], key: "M", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "video-pause toggle",), - RiverctlCommand( map_mode: Map, mode: ["normal", "locked"], key: "N", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "mpc toggle",), - - // Launcher - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "O", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "rofi -show combi -modes combi -combi-modes 'window,drun,run' -show-icons",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "P", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "neorg dmenu",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Q", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "keepassxc",), - // RiverctlCommand( map_mode: Map, mode: ["normal"], key: "R", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "nheko",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "S", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "signal-desktop",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "T", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "lock",), - - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "U", mods: "Alt+Control+Super+Shift", command: "focus-output", command_args: "next",), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "V", mods: "Alt+Control+Super+Shift", command: "focus-previous-tags", command_args: None,), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "W", mods: "Alt+Control+Super+Shift", command: "send-to-previous-tags",command_args: None,), - //RiverctlCommand( map_mode: Map, mode: ["normal"], key: "X", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "bemenu-run",), - //RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Y", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "bemenu-run",), - //RiverctlCommand( map_mode: Map, mode: ["normal"], key: "Z", mods: "Alt+Control+Super+Shift", command: "spawn", command_args: "bemenu-run",), - - - // Toggle all tags - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "0", mods: "Alt+Control+Super+Shift", command: "set-focused-tags", command_args: "4294967295"), - RiverctlCommand( map_mode: Map, mode: ["normal"], key: "0", mods: "Alt+Control+Shift", command: "set-view-tags", command_args: "4294967295"), - - // Mouse - RiverctlCommand( map_mode: MapMouse, mode: ["normal"], key: "BTN_LEFT", mods: "Super", command: "move-view", command_args: None,), - RiverctlCommand( map_mode: MapMouse, mode: ["normal"], key: "BTN_RIGHT", mods: "Super", command: "resize-view", command_args: None,), - ], - - // Set these mappings for the tags 0-8 with key [1-9] - tags_number: 9, - tag_commands: [ - RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Alt+Control+Super+Shift", command: "set-focused-tags",), - RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Alt+Control+Shift", command: "set-view-tags",), - // TODO: RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Control", command: "toggle-focused-tags",), - // TODO: RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift+Control", command: "toggle-view-tags",), - ], -) -// vim: nolinebreak nowrap textwidth=0 diff --git a/modules/home/wms/sway/default.nix b/modules/home/wms/sway/default.nix deleted file mode 100644 index bb3ddb49..00000000 --- a/modules/home/wms/sway/default.nix +++ /dev/null @@ -1,16 +0,0 @@ -# also requires: -# security.polkit.enable = true; -{lib, ...}: { - wayland.windowManager.sway = { - enable = true; - config = { - modifier = "Mod4"; - # Use kitty as default terminal - terminal = "kitty"; - startup = [ - # Launch Firefox on start - {command = "firefox";} - ]; - }; - }; -} diff --git a/modules/system/bluetooth/default.nix b/modules/system/bluetooth/default.nix deleted file mode 100644 index bf1c6a90..00000000 --- a/modules/system/bluetooth/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.bluetooth; -in { - options.soispha.bluetooth = { - enable = lib.mkEnableOption "an integrated bluetooth setup."; - }; - - config = lib.mkIf cfg.enable { - hardware = { - bluetooth = { - enable = true; - powerOnBoot = !config.soispha.laptop.enable; - }; - }; - }; -} diff --git a/modules/system/boot/boot_pictures/gnu.png b/modules/system/boot/boot_pictures/gnu.png deleted file mode 100755 index d07dee3e..00000000 Binary files a/modules/system/boot/boot_pictures/gnu.png and /dev/null differ diff --git a/modules/system/boot/boot_pictures/gnulin_emb_1.png b/modules/system/boot/boot_pictures/gnulin_emb_1.png deleted file mode 100755 index 483f2681..00000000 Binary files a/modules/system/boot/boot_pictures/gnulin_emb_1.png and /dev/null differ diff --git a/modules/system/boot/boot_pictures/gnulin_emb_2.png b/modules/system/boot/boot_pictures/gnulin_emb_2.png deleted file mode 100755 index 48cd6ad7..00000000 Binary files a/modules/system/boot/boot_pictures/gnulin_emb_2.png and /dev/null differ diff --git a/modules/system/boot/default.nix b/modules/system/boot/default.nix deleted file mode 100644 index 711e9d23..00000000 --- a/modules/system/boot/default.nix +++ /dev/null @@ -1,130 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - cfg = config.soispha.boot; -in { - options.soispha.boot = { - enable = lib.mkEnableOption "Bootloader configuration"; - # TODO: Add this option <2024-05-16> - # enableIsoEntry = lib.mkEnableOption "an tails iso boot entry"; - }; - - config = lib.mkIf cfg.enable ( - # let - # cfg = config.boot.loader.systemd-boot; - # inherit (config.boot.loader) efi; - # - # esa = n: lib.strings.escapeShellArg n; - # - # bootMountPoint = - # if cfg.xbootldrMountPoint != null - # then cfg.xbootldrMountPoint - # else efi.efiSysMountPoint; - # - # nixosDir = "/EFI/nixos"; - # - # # FIXME: This system has two big problems: - # # 1. It does not updated files, which still have the same name - # # 2. It forgets about files, which were 'deleted' in this configuration (these just - # # stay on disk forever) <2024-05-11> - # copyExtraFiles = '' - # echo "[systemd-boot] copying files to ${bootMountPoint}" - # empty_file=$(mktemp) - # - # ${lib.concatStrings (lib.mapAttrsToList (n: v: - # /* - # bash - # */ - # '' - # if ! [ -e ${esa "${bootMountPoint}/${n}"} ]; then - # install -Dp "${v}" ${esa "${bootMountPoint}/${n}"} - # install -D "$empty_file" ${esa "${bootMountPoint}/${nixosDir}/.extra-files/${n}"} - # fi - # '') - # cfg.extraFiles)} - # - # ${lib.concatStrings (lib.mapAttrsToList (n: v: - # /* - # bash - # */ - # '' - # # if ! [ -e ${esa "${bootMountPoint}/loader/entries/${n}"} ]; then - # install -Dp "${pkgs.writeText n v}" ${esa "${bootMountPoint}/loader/entries/${n}"} - # install -D "$empty_file" ${esa "${bootMountPoint}/${nixosDir}/.extra-files/loader/entries/${n}"} - # # fi - # '') - # cfg.extraEntries)} - # ''; - # in - { - # FIXME: Reactviate this whole iso thing when a disko redeploy is done. - # (and switch to tails instead of arch) <2024-05-12> - # - # system.activationScripts = { - # copyExtraFilesForBoot = copyExtraFiles; - # }; - - boot = { - initrd = { - kernelModules = ["nvme" "btrfs"]; - }; - - kernelPackages = pkgs.linuxPackages_latest; - - lanzaboote = { - enable = true; - pkiBundle = "/etc/secureboot"; - - settings = { - # Disable editing the kernel command line (which could allow someone to become root) - editor = false; - default = "@saved"; - }; - }; - - loader = { - systemd-boot = { - # Lanzaboote currently replaces the systemd-boot module. - # This setting is usually set to true in configuration.nix - # generated at installation time. So we force it to false - # for now. - enable = false; - - # extraEntries = { - # "live.conf" = '' - # title Archlinux Live ISO - # linux /live/vmlinuz-linux - # initrd /live/initramfs-linux.img - # options img_dev=${config.soispha.disks.disk} img_loop=/archlinux.iso copytoram - # ''; - # }; - # - # extraFiles = let - # iso = import ./archlive_iso.nix {inherit pkgs;}; - # in { - # "archlinux.iso" = "${iso}/archlinux.iso"; - # "live/initramfs-linux.img" = "${iso}/live/initramfs-linux.img"; - # "live/vmlinuz-linux" = "${iso}/live/vmlinuz-linux"; - # }; - }; - - grub = { - enable = false; - # theme = pkgs.nixos-grub2-theme; - splashImage = ./boot_pictures/gnu.png; - efiSupport = true; - device = "nodev"; # only for efi - }; - - efi = { - canTouchEfiVariables = true; - efiSysMountPoint = "/boot"; - }; - }; - }; - } - ); -} diff --git a/modules/system/boot/iso_entry/archlive_iso.nix b/modules/system/boot/iso_entry/archlive_iso.nix deleted file mode 100644 index d19a4a87..00000000 --- a/modules/system/boot/iso_entry/archlive_iso.nix +++ /dev/null @@ -1,77 +0,0 @@ -{pkgs ? (builtins.getFlake "nixpkgs").legacyPackages."x86_64-linux"}: let - signing_key = import ./signing_key.nix {inherit pkgs;}; - - checked_iso = pkgs.stdenv.mkDerivation { - pname = "archlinux-iso"; - version = "2024.05.01"; - - srcs = [ - (pkgs.fetchurl { - url = "https://archlinux.org/iso/2024.05.01/archlinux-2024.05.01-x86_64.iso.sig"; - hash = "sha256-QOGYng6a7zA5EJKGotDccJ7fD2MmPPXQEdVr1kjJvi4="; - }) - (pkgs.fetchurl { - url = "https://mirror.informatik.tu-freiberg.de/arch/iso/latest/archlinux-2024.05.01-x86_64.iso"; - hash = "sha256-G0oE74pzUIUqEwcO5JhEKwh6YHoYhAtN19mYZ+tfakw="; - }) - (pkgs.fetchurl { - url = "https://archlinux.org/iso/2024.05.01/b2sums.txt"; - hash = "sha256-HSMS13hHXFKKQsCA8spa7XtirHCBTmePwhOsStVPbHw="; - }) - ]; - - dontUnpack = true; - - nativeBuildInputs = with pkgs; [ - sequoia-sq - ]; - - buildPhase = - /* - bash - */ - '' - cp -r "${signing_key}" ./release-key.pgp - for src in $srcs; do - cp -r "$src" "$(stripHash "$src")" - done - - sed '2d;3d;4d' b2sums.txt > b2sums_clean.txt - - # As per the directions from: https://archlinux.org/download/ - - # blake hash check - b2sum -c ./b2sums_clean.txt - - # pgp signature check - sq verify --signer-file release-key.pgp --detached archlinux-2024.05.01-x86_64.iso.sig archlinux-2024.05.01-x86_64.iso - ''; - - installPhase = '' - cp archlinux-2024.05.01-x86_64.iso "$out"; - ''; - }; -in - pkgs.stdenv.mkDerivation { - name = "live_iso_boot_entry"; - - src = checked_iso; - - dontUnpack = true; - - nativeBuildInputs = with pkgs; [ - libarchive # for bsdtar - ]; - - buildPhase = '' - mkdir iso - bsdtar -xf "$src" -C iso - ''; - - installPhase = '' - install -D ./iso/arch/boot/x86_64/initramfs-linux.img "$out/live/initramfs-linux.img" - install -D ./iso/arch/boot/x86_64/vmlinuz-linux "$out/live/vmlinuz-linux" - - install -D "$src" "$out/archlinux.iso" - ''; - } diff --git a/modules/system/boot/iso_entry/signing_key.nix b/modules/system/boot/iso_entry/signing_key.nix deleted file mode 100644 index 788447be..00000000 --- a/modules/system/boot/iso_entry/signing_key.nix +++ /dev/null @@ -1,18 +0,0 @@ -{pkgs ? (builtins.getFlake "nixpkgs").legacyPackages."x86_64-linux"}: -pkgs.stdenv.mkDerivation { - name = "archlinux_signing_keys"; - - outputHash = "sha256-evGWzkxMaZw3rlixKsyWCS/ZvNuZ+OfXQb6sgiHz9XY="; - outputHashAlgo = "sha256"; - NIX_SSL_CERT_FILE = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; - - nativeBuildInputs = with pkgs; [ - sequoia-sq - ]; - - dontUnpack = true; - - buildPhase = '' - sq --verbose --no-cert-store --no-key-store network wkd fetch pierre@archlinux.org --output "$out" - ''; -} diff --git a/modules/system/cleanup/default.nix b/modules/system/cleanup/default.nix deleted file mode 100644 index f8307b73..00000000 --- a/modules/system/cleanup/default.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.cleanup; -in { - # remove all the bloat, which NixOS installs by default - options.soispha.cleanup = { - enable = lib.mkEnableOption "avoiding of nixos' default installed packages"; - }; - - config = lib.mkIf cfg.enable { - programs.nano.enable = false; - environment = { - defaultPackages = lib.mkForce []; - }; - }; -} diff --git a/modules/system/default.nix b/modules/system/default.nix deleted file mode 100644 index 85f8dfb3..00000000 --- a/modules/system/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -{config, ...}: let - cfg = config.soispha; -in { - imports = [ - ./bluetooth - ./boot - ./cleanup - ./disks - ./documentation - ./fonts - ./hardware - ./home-manager - ./impermanence - ./laptop - ./locale - ./networking - ./nixpkgs - ./polkit - ./power - ./secrets - ./services - ./sound - ./tempfiles - ./users - ./version - ./waydroid - ]; - options = {}; - config = {}; -} diff --git a/modules/system/disks/default.nix b/modules/system/disks/default.nix deleted file mode 100644 index c0e5bcfd..00000000 --- a/modules/system/disks/default.nix +++ /dev/null @@ -1,133 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - # FIXME: The iso redeploy requires a bigger efi partition <2024-05-12> - cfg = config.soispha.disks; - defaultMountOptions = [ - "compress-force=zstd:15" # This saves disk space, at a performance cost - "noatime" # should have some performance upsides, and I don't use it anyways - "lazytime" # make time changes in memory - ]; -in { - options.soispha.disks = { - enable = lib.mkEnableOption "disk setup with disko"; - - disk = lib.mkOption { - type = lib.types.path; - example = lib.literalExpression "/dev/disk/by-uuid/0442cb6d-f13a-4635-b487-fa76189774c5"; - description = "The disk used for installing the OS."; - }; - - ssd = lib.mkEnableOption "ssd specific improvements, like trim"; - - swap = { - uuid = lib.mkOption { - type = lib.types.str; - example = lib.literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89"; - description = "The uuid of the swapfile"; - }; - resumeOffset = lib.mkOption { - type = lib.types.str; - example = lib.literalExpression "134324224"; - description = "The resume offset of the swapfile"; - }; - }; - }; - - config = lib.mkIf cfg.enable { - systemd = lib.recursiveUpdate (import ./hibernate.nix {inherit pkgs;}) (import ./fstrim.nix {inherit pkgs lib cfg;}); - - disko.devices = { - disk = { - main = { - device = cfg.disk; - content = { - type = "gpt"; - partitions = { - root = { - size = "100%"; - name = "root"; - content = { - type = "luks"; - name = "nixos"; - extraOpenArgs = ["--allow-discards"]; - content = { - type = "btrfs"; - extraArgs = ["-f" "--label nixos"]; # Override existing partitions - subvolumes = { - "nix" = { - mountpoint = "/nix"; - mountOptions = defaultMountOptions; - }; - "persistent-storage" = { - mountpoint = "/srv"; - mountOptions = defaultMountOptions; - }; - "persistent-storage@snapshots" = { - mountpoint = "/srv/.snapshots"; - mountOptions = defaultMountOptions; - }; - "swap" = { - mountpoint = "/swap"; - mountOptions = defaultMountOptions; - }; - }; - }; - }; - }; - boot = { - type = "EF00"; - size = "512M"; - name = "boot"; - content = { - type = "filesystem"; - format = "vfat"; - mountpoint = "/boot"; - }; - }; - }; - }; - }; - }; - nodev = { - "/" = { - fsType = "tmpfs"; - mountOptions = ["defaults" "size=4G" "mode=755"]; - }; - "/tmp" = { - fsType = "tmpfs"; - mountOptions = ["defaults" "size=16G" "mode=755"]; - }; - }; - }; - fileSystems = { - "/srv" = { - neededForBoot = true; - }; - "/swap" = { - neededForBoot = true; - }; - }; - swapDevices = [ - #{ - # device = "/swap/swapfile"; - # priority = 1; # lower than zramSwap, just in case - # # size = 2048; # TODO: can nixos create a btrfs swapfile correctly? - #} - ]; - zramSwap = { - enable = true; - priority = 10; # needs to be higher than hardware-swap - }; - boot = { - kernelParams = [ - "resume_offset=${cfg.swap.resumeOffset}" - "zswap.enabled=0" # zswap and zram are not really compatible - ]; - resumeDevice = "/dev/disk/by-uuid/${cfg.swap.uuid}"; - }; - }; -} diff --git a/modules/system/disks/fstrim.nix b/modules/system/disks/fstrim.nix deleted file mode 100644 index 6daeb65e..00000000 --- a/modules/system/disks/fstrim.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ - pkgs, - lib, - cfg, -}: { - timers.fstrim = lib.mkIf cfg.ssd { - wantedBy = ["timers.target"]; - wants = ["fstrim.service"]; - unitConfig = { - Description = "Discard unused blocks once a week"; - Documentation = "man:fstrim"; - ConditionVirtualization = "!container"; - ConditionPathExists = "!/etc/initrd-release"; - }; - timerConfig = { - OnCalendar = "weekly"; - AccuracySec = "1h"; - Persistent = "true"; - RandomizedDelaySec = "6000"; - }; - }; - services.fstrim = lib.mkIf cfg.ssd { - wantedBy = lib.mkForce []; - unitConfig = { - Description = "Discard unused blocks on filesystems from /etc/fstab"; - Documentation = "man:fstrim(8)"; - ConditionVirtualization = "!container"; - }; - serviceConfig = { - Type = "oneshot"; - ExecStart = "${pkgs.util-linux}/bin/fstrim --listed-in /etc/fstab:/proc/self/mountinfo --verbose --quiet-unsupported"; - PrivateDevices = "no"; - PrivateNetwork = "yes"; - PrivateUsers = "no"; - ProtectKernelTunables = "yes"; - ProtectKernelModules = "yes"; - ProtectControlGroups = "yes"; - MemoryDenyWriteExecute = "yes"; - SystemCallFilter = "@default @file-system @basic-io @system-service"; - }; - }; -} diff --git a/modules/system/disks/hibernate.nix b/modules/system/disks/hibernate.nix deleted file mode 100644 index a50e5b57..00000000 --- a/modules/system/disks/hibernate.nix +++ /dev/null @@ -1,45 +0,0 @@ -{pkgs}: { - services = { - hibernate-preparation = { - wantedBy = ["systemd-hibernate.service"]; - unitConfig = { - Description = "Enable swap file and disable zram before hibernate"; - Before = "systemd-hibernate.service"; - }; - serviceConfig = { - Type = "oneshot"; - User = "root"; - ExecStart = "${pkgs.bash}/bin/bash -c \"${pkgs.util-linux}/bin/swapon /swap/swapfile && ${pkgs.util-linux}/bin/swapoff /dev/zram0\""; - }; - }; - - hibernate-resume = { - wantedBy = ["systemd-hibernate.service"]; - unitConfig = { - Description = "Disable swap after resuming from hibernation"; - After = "hibernate.target"; - }; - serviceConfig = { - Type = "oneshot"; - User = "root"; - ExecStart = "${pkgs.util-linux}/bin/swapoff /swap/swapfile"; - }; - }; - # swapoff-start = { - # wantedBy = ["multi-user.target"]; - # unitConfig = { - # Description = "Disable hardware swap after booting"; - # }; - # serviceConfig = { - # Type = "oneshot"; - # User = "root"; - # ExecStart = "${pkgs.util-linux}/bin/swapoff /swap/swapfile"; - # }; - # }; - systemd-hibernate.serviceConfig.Environment = "SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1"; - systemd-logind.serviceConfig.Environment = "SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1"; - }; - sleep.extraConfig = '' - HibernateDelaySec=5m - ''; -} diff --git a/modules/system/documentation/default.nix b/modules/system/documentation/default.nix deleted file mode 100644 index 4616a991..00000000 --- a/modules/system/documentation/default.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.documentation; -in { - options.soispha.documentation = { - enable = lib.mkEnableOption "documentation"; - }; - config = lib.mkIf cfg.enable { - documentation = { - nixos = { - # FIXME: This results in a evaluation failure (with lanzaboote options) <2024-05-23> - includeAllModules = false; - - enable = true; - }; - dev = { - # Add man pages aimed at developers (I guess c library stuff, and the like) - enable = true; - }; - }; - }; -} diff --git a/modules/system/fonts/default.nix b/modules/system/fonts/default.nix deleted file mode 100644 index abd5664b..00000000 --- a/modules/system/fonts/default.nix +++ /dev/null @@ -1,55 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - cfg = config.soispha.fonts; -in { - options.soispha.fonts = { - enable = lib.mkEnableOption "fonts"; - - fonts = lib.mkOption { - type = lib.types.listOf lib.types.str; - example = lib.literalExpression ''["SourceCodePro" "Overpass" "FiraCode"]''; - default = [ - "SourceCodePro" - "Overpass" - ]; - description = "The nerd-fonts to install"; - }; - - enableEmoji = lib.mkEnableOption "emoji font support"; - }; - - config = lib.mkIf cfg.enable { - fonts = { - packages = let - nerdFont = pkgs.nerdfonts.override { - inherit (cfg) fonts; - }; - in - [ - nerdFont - ] - ++ (with pkgs; [liberation_ttf]) - ++ lib.optional cfg.enableEmoji pkgs.noto-fonts-emoji; - - fontconfig = { - # NOTE: This is responsible for color emoji support <2023-08-28> - # WARNING: This could lead to broken font rendering, if the emoji font is used as - # a fallback for normal characters <2024-05-16> - localConf = lib.mkIf cfg.enableEmoji (builtins.readFile ./emoji_font.xml); - - defaultFonts = { - serif = lib.mkForce (["Liberation Serif"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); - sansSerif = lib.mkForce (["Overpass Nerd Font Propo"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); - monospace = lib.mkForce (["SauceCodePro Nerd Font Mono"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); - emoji = lib.mkIf cfg.enableEmoji (lib.mkForce ["Noto Color Emoji"]); - }; - allowType1 = false; - allowBitmaps = false; - }; - }; - }; -} diff --git a/modules/system/fonts/emoji_font.xml b/modules/system/fonts/emoji_font.xml deleted file mode 100644 index f3f6bb3e..00000000 --- a/modules/system/fonts/emoji_font.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - monospace - - emoji - - - - sans-serif - - emoji - - - - serif - - emoji - - - diff --git a/modules/system/hardware/default.nix b/modules/system/hardware/default.nix deleted file mode 100644 index 850416b7..00000000 --- a/modules/system/hardware/default.nix +++ /dev/null @@ -1,80 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - cfg = config.soispha.hardware; -in { - options.soispha.hardware = { - enable = lib.mkEnableOption "the various hardware dependend things (and graphics drivers)"; - moonlander = { - enableLiveTraining = lib.mkEnableOption "udev rules for live training"; - enableFlashing = lib.mkEnableOption "udev rules for firmware flashing"; - }; - - cpuType = lib.mkOption { - type = lib.types.enum ["amd" "intel"]; - description = '' - The manuafacturer of the used cpu. - - This is used to enable, for example, the correct microcode updates. - ''; - }; - }; - - config = lib.mkIf cfg.enable { - hardware = { - cpu.amd.updateMicrocode = cfg.cpuType == "amd"; - cpu.intel.updateMicrocode = cfg.cpuType == "intel"; - - # This is enabled manually to support older firmware. - keyboard.zsa.enable = false; - - nitrokey.enable = true; - onlykey.enable = false; - - graphics = { - enable = true; - extraPackages = builtins.attrValues { - inherit - (pkgs) - vaapiVdpau - libvdpau-va-gl - ; - }; - }; - }; - - # TODO: Remove the support for the old keyboards <2024-05-16> - services.udev.extraRules = - lib.strings.optionalString cfg.moonlander.enableLiveTraining '' - # Rules for Oryx web flashing and live training - KERNEL=="hidraw*", ATTRS{idVendor}=="16c0", MODE="0664", GROUP="plugdev" - KERNEL=="hidraw*", ATTRS{idVendor}=="3297", MODE="0664", GROUP="plugdev" - - # Legacy rules for live training over webusb (Not needed for firmware v21+) - # Rule for all ZSA keyboards - SUBSYSTEM=="usb", ATTR{idVendor}=="3297", GROUP="plugdev" - # Rule for the Moonlander - SUBSYSTEM=="usb", ATTR{idVendor}=="3297", ATTR{idProduct}=="1969", GROUP="plugdev" - # Rule for the Ergodox EZ - SUBSYSTEM=="usb", ATTR{idVendor}=="feed", ATTR{idProduct}=="1307", GROUP="plugdev" - # Rule for the Planck EZ - SUBSYSTEM=="usb", ATTR{idVendor}=="feed", ATTR{idProduct}=="6060", GROUP="plugdev" - '' - + lib.strings.optionalString cfg.moonlander.enableFlashing - '' - # Wally Flashing rules for the Ergodox EZ - ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", ENV{ID_MM_DEVICE_IGNORE}="1" - ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789A]?", ENV{MTP_NO_PROBE}="1" - SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789ABCD]?", MODE:="0666" - KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", MODE:="0666" - - # Wally Flashing rules for the Moonlander and Planck EZ - SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", \ - MODE:="0666", \ - SYMLINK+="stm32_dfu" - ''; - }; -} diff --git a/modules/system/home-manager/default.nix b/modules/system/home-manager/default.nix deleted file mode 100644 index 096aaceb..00000000 --- a/modules/system/home-manager/default.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ - config, - lib, - pkgsStable, - nixpkgs_open_prs, - sysLib, - # extra information - system, - # bins - # TODO: Integrate these <2024-05-22> - river_init_lesser, - shell_library, - # external deps - user_js, - # modules - impermanence, - nix-index-database, - nixVim, - ... -}: let - cfg = config.soispha.home-manager; -in { - options.soispha.home-manager = { - enable = lib.mkEnableOption "home-manager with custom config."; - }; - - config = lib.mkIf cfg.enable { - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - users.soispha = import ../../home; - extraSpecialArgs = { - inherit - nixpkgs_open_prs - pkgsStable - sysLib - # extra information - - system - # bins - - river_init_lesser - shell_library - # external deps - - user_js - # modules - - impermanence - nixVim - nix-index-database - ; - }; - }; - }; -} diff --git a/modules/system/impermanence/default.nix b/modules/system/impermanence/default.nix deleted file mode 100644 index 9730dde6..00000000 --- a/modules/system/impermanence/default.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.impermanence; -in { - options.soispha.impermanence = { - enable = lib.mkEnableOption "persisting directories and files with impermanence"; - - directories = lib.mkOption { - type = lib.types.listOf lib.types.str; - default = - [ - "/etc/nixos" - "/var/log" - "/var/lib/systemd" - "/var/lib/nixos" - ] - ++ lib.optional config.networking.networkmanager.enable "/etc/NetworkManager" - ++ lib.optional config.boot.lanzaboote.enable "/etc/secureboot" - ++ lib.optional config.hardware.bluetooth.enable "/var/lib/bluetooth" - ++ lib.optional config.virtualisation.waydroid.enable "/var/lib/waydroid" - ++ lib.optional config.services.postgresql.enable "/var/lib/postgresql"; - - defaultText = lib.literalExpression '' - [ - "/etc/nixos" - "/var/log" - "/var/lib/systemd" - "/var/lib/nixos" - ] - ++ lib.optional config.networking.networkmanager.enable "/etc/NetworkManager" - ++ lib.optional config.boot.lanzaboote.enable "/etc/secureboot" - ++ lib.optional config.hardware.bluetooth.enable "/var/lib/bluetooth" - ++ lib.optional config.virtualisation.waydroid.enable "/var/lib/waydroid" - ++ lib.optional config.services.postgresql.enable "/var/lib/postgresql" - ''; - description = "The directories to persist"; - }; - }; - - config = lib.mkIf cfg.enable { - # needed for the hm impermanence config - programs.fuse.userAllowOther = true; - - environment.persistence = { - "/srv" = { - hideMounts = true; - inherit (cfg) directories; - files = [ - "/etc/machine-id" - ]; - }; - }; - }; -} diff --git a/modules/system/laptop/default.nix b/modules/system/laptop/default.nix deleted file mode 100644 index f70230ad..00000000 --- a/modules/system/laptop/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - lib, - config, - ... -}: let - cfg = config.soispha.laptop; -in { - # TODO: Add an actual config to this module, instead of the implicit one in home manager. <2024-05-22> - options.soispha.laptop = { - enable = lib.mkEnableOption "Laptop improvements"; - backlight = lib.mkOption { - type = lib.types.str; - example = lib.mdDoc "intel_backlight"; - description = lib.mdDoc "Which backlight to query for the screen brightness"; - }; - }; -} diff --git a/modules/system/libvirtd/default.nix b/modules/system/libvirtd/default.nix deleted file mode 100644 index 5c519550..00000000 --- a/modules/system/libvirtd/default.nix +++ /dev/null @@ -1,27 +0,0 @@ -{pkgs, ...}: { - # virtualisation = { - # spiceUSBRedirection.enable = true; # TODO: this allows usb access to any user, which shouldn't be that bad - # cores = 8; - # diskSize = 25000; - # useEFIBoot = true; - # resolution = { - # x = 1920; - # y = 1080; - # }; - # memorySize = 8024; - # sharedDirectories = {}; # TODO: add some - # libvirtd = { - # enable = true; - # qemu = { - # package = pkgs.qemu_full; - # ovmf = { - # enable = true; - # packages = [pkgs.OVMFFull.fd]; - # }; - # }; - # }; - # }; - # users.users.soispha.extraGroups = [ - # "libvirtd" # to run libvirt stuff as this user - # ]; -} diff --git a/modules/system/locale/default.nix b/modules/system/locale/default.nix deleted file mode 100644 index 10569216..00000000 --- a/modules/system/locale/default.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.locale; -in { - options.soispha.locale = { - enable = lib.mkEnableOption "locale setup"; - - keyMap = lib.mkOption { - type = lib.types.str; - example = "us"; - default = "dvorak"; - description = "The console key map language to use"; - }; - - timeZone = lib.mkOption { - type = lib.types.str; - default = "Europe/Berlin"; - description = "The time zone to use"; - }; - }; - - config = lib.mkIf cfg.enable { - time = { - inherit (cfg) timeZone; - }; - - i18n = { - defaultLocale = "en_CA.UTF-8"; - extraLocaleSettings = { - LANGUAGE = "en_CA:en_US:en"; - LC_TIME = "en_DK.UTF-8"; - LC_COLLATE = "C.UTF-8"; - }; - }; - - # Layout - console = { - inherit (cfg) keyMap; - }; - - services.xserver.xkb.extraLayouts = { - "us-modified" = { - description = "standard us with caps as compose key."; - languages = ["eng" "swe" "deu"]; - symbolsFile = ./keymaps/us_modified.xkb; - }; - "dvorak-modified" = { - description = "standard dvorak english with german and swedish extra chars."; - languages = ["eng" "swe" "deu"]; - symbolsFile = ./keymaps/dvorak_modified.xkb; - }; - }; - }; -} diff --git a/modules/system/locale/keymaps/dvorak_modified.xkb b/modules/system/locale/keymaps/dvorak_modified.xkb deleted file mode 100644 index 63f5d4fb..00000000 --- a/modules/system/locale/keymaps/dvorak_modified.xkb +++ /dev/null @@ -1,15 +0,0 @@ -partial alphanumeric_keys -xkb_symbols "dvorak-modified" { - name[Group1]= "Dvorak English with additional keys"; - - key {[ o, O, odiaeresis, Odiaeresis]}; - key {[ u, U, udiaeresis, Udiaeresis]}; - key {type[Group1]="EIGHT_LEVEL", - [ a, A, adiaeresis, Adiaeresis, aring, Aring]}; - - - include "us(dvorak)" - include "level3(caps_switch)" - include "level5(ralt_switch)" -}; -// vim: ft=xkb diff --git a/modules/system/locale/keymaps/us_modified.xkb b/modules/system/locale/keymaps/us_modified.xkb deleted file mode 100644 index 6299a5e9..00000000 --- a/modules/system/locale/keymaps/us_modified.xkb +++ /dev/null @@ -1,9 +0,0 @@ -partial alphanumeric_keys -xkb_symbols "us-modified" { - name[Group1]= "US English with caps lock key as compose key"; - - - include "us(basic)" - include "compose(caps)" -}; -// vim: ft=xkb diff --git a/modules/system/networking/default.nix b/modules/system/networking/default.nix deleted file mode 100644 index c5f0e491..00000000 --- a/modules/system/networking/default.nix +++ /dev/null @@ -1,88 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.networking; -in { - options.soispha.networking = { - enable = lib.mkEnableOption "networking"; - - mode = lib.mkOption { - type = lib.types.enum ["NetworkManager" "systemd-networkd"]; - example = "systemd-networkd"; - description = "The daemon used to setup networking."; - }; - - userName = lib.mkOption { - type = lib.types.str; - default = "soispha"; - description = '' - The name of the user to allow access to the configured network - ''; - }; - - hostName = lib.mkOption { - type = lib.types.str; - example = "apzu"; - description = "The name of the host"; - }; - }; - - config = { - networking.hostName = cfg.hostName; - - systemd.network = lib.mkIf (cfg.mode == "systemd-networkd") { - networks = { - "tap0" = { - name = "tap0"; - bridge = [ - "virbr0" - ]; - }; - "enp4s0" = { - name = "enp4s0"; - networkConfig = { - DHCP = "yes"; - DNSOverTLS = "yes"; - DNSSEC = "yes"; - }; - bridge = [ - "virbr0" - ]; - }; - }; - - netdevs = { - "tap0" = { - netdevConfig = { - Name = "tap0"; - Kind = "tap"; - }; - tapConfig = { - User = config.users.users."${cfg.userName}".uid; - Group = "libvirtd"; - }; - }; - "virbr0" = { - netdevConfig = { - Name = "br0"; - Kind = "bridge"; - }; - }; - }; - }; - - networking.networkmanager = lib.mkIf (cfg.mode == "NetworkManager") { - enable = true; - dns = "default"; - wifi = { - powersave = true; - }; - }; - - users.users."${cfg.userName}".extraGroups = lib.mkIf (cfg.mode == "NetworkManager") [ - "networkmanager" # allows to configure NetworkManager as this user - ]; - }; -} diff --git a/modules/system/nixpkgs/config.nix b/modules/system/nixpkgs/config.nix deleted file mode 100644 index 1a24444d..00000000 --- a/modules/system/nixpkgs/config.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ - cfg, - myPkgs, - lib, - ... -}: let - myPkgsOverlay = self: super: myPkgs; -in { - nixpkgs = { - hostPlatform = cfg.systemName; - - overlays = [ - myPkgsOverlay - ]; - - config = { - # TODO: this fails because of the root tempsize, which should be increased - # contentAddressedByDefault = true; - - hostSystem = cfg.systemName; - - allowUnfreePredicate = pkg: - builtins.elem (lib.getName pkg) [ - "pypemicro" # required by pynitrokey - ]; - }; - }; -} diff --git a/modules/system/nixpkgs/default.nix b/modules/system/nixpkgs/default.nix deleted file mode 100644 index eda3ac89..00000000 --- a/modules/system/nixpkgs/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - lib, - config, - ... -} @ args: let - cfg = config.soispha.nixpkgs; -in { - options.soispha.nixpkgs = { - enable = lib.mkEnableOption "Nixpkgs config"; - systemName = lib.mkOption { - description = "The name of the system."; - example = "x86_64-linux"; - type = lib.types.str; - }; - }; - config = lib.mkIf cfg.enable (import ./config.nix (args // {inherit cfg;})); -} diff --git a/modules/system/polkit/default.nix b/modules/system/polkit/default.nix deleted file mode 100644 index fb13505b..00000000 --- a/modules/system/polkit/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.polkit; -in { - options.soispha.polkit = { - enable = lib.mkEnableOption "polkit"; - }; - config = lib.mkIf cfg.enable { - security.polkit.enable = true; - }; -} diff --git a/modules/system/power/default.nix b/modules/system/power/default.nix deleted file mode 100644 index 13013879..00000000 --- a/modules/system/power/default.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.power; -in { - options.soispha.power = { - enable = lib.mkEnableOption "power optimizations"; - }; - - config = lib.mkIf cfg.enable { - # see this for reference: https://github.com/NixOS/nixpkgs/issues/211345 - services = { - # conflicts with tlp - power-profiles-daemon.enable = false; - - thermald.enable = true; - - tlp = { - enable = true; - settings = { - CPU_BOOST_ON_AC = 1; - CPU_BOOST_ON_BAT = 0; - CPU_SCALING_GOVERNOR_ON_AC = "performance"; - CPU_SCALING_GOVERNOR_ON_BAT = "powersave"; - SATA_LINKPWR_ON_AC = "max_performance"; - SATA_LINKPWR_ON_BAT = "min_power"; - }; - }; - }; - }; -} diff --git a/modules/system/secrets/default.nix b/modules/system/secrets/default.nix deleted file mode 100644 index 8b3188b0..00000000 --- a/modules/system/secrets/default.nix +++ /dev/null @@ -1,73 +0,0 @@ -{ - config, - lib, - ... -}: let - # mkFakeSecret = secretName: { - # name = secretName; - # value = { - # path = "/dev/null"; - # }; - # }; - # fakeSecrets = - # builtins.listToAttrs (lib.debug.traceValSeqN 2 (builtins.map mkFakeSecret - # (lib.debug.traceValSeqN 2 (builtins.attrNames secrets)))); - cfg = config.soispha.secrets; -in { - options.soispha.secrets = { - enable = lib.mkEnableOption "secrets through agenix"; - }; - - config = lib.mkIf cfg.enable { - age = { - secrets = { - lf_cd_paths = { - file = ./lf/cd_paths.age; - mode = "700"; - owner = "soispha"; - group = "users"; - }; - - # FIXME: Reactive when serverphone is merged in tree again <2024-05-11> - # - # serverphoneCa = { - # file = ./serverphone/ca.key; - # mode = "700"; - # owner = "serverphone"; - # group = "serverphone"; - # }; - # serverphoneServer = { - # file = ./serverphone/server.key; - # mode = "700"; - # owner = "serverphone"; - # group = "serverphone"; - # }; - - taskserverPrivate = { - file = ./taskserver/private.key; - mode = "700"; - owner = "soispha"; - group = "users"; - }; - taskserverPublic = { - file = ./taskserver/public.cert; - mode = "700"; - owner = "soispha"; - group = "users"; - }; - taskserverCA = { - file = ./taskserver/ca.cert; - mode = "700"; - owner = "soispha"; - group = "users"; - }; - taskserverCredentials = { - file = ./taskserver/credentials; - mode = "700"; - owner = "soispha"; - group = "users"; - }; - }; - }; - }; -} diff --git a/modules/system/secrets/lf/cd_paths.age b/modules/system/secrets/lf/cd_paths.age deleted file mode 100644 index 3b018fb7..00000000 --- a/modules/system/secrets/lf/cd_paths.age +++ /dev/null @@ -1,2357 +0,0 @@ ------BEGIN AGE ENCRYPTED FILE----- -YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUaUtDc0NHYjY3cWZ0ZHlh -bFkrRXpuYWhveGpGcjVIM3ZUN0Y0Y0ZLdGtJCklucDhCdGkyUDl0dXBHd3BFUEMr -SmpkWHh4b0hSSDJ5N0pTcEJmS241WUUKLT4gc3NoLWVkMjU1MTkgelpFb25nIHB5 -YWZKSFd3eDNYUzJnSDFzUzMydjAvNGo3czM3cDVOYU1NdTEwZjZwUXMKQ2MyQlBO -VEtVY1BGWk9JWGJ6SVBMRy94c1hPUWpsTndBM1FRbldZdGhMRQotPiBzc2gtZWQy -NTUxOSA3SGZGVXcgZXJEMTRKenk2UGNNZjdZMmlVdkJYcFU3cjdXdGhRWXhZd1Z1 -VXlyRmhXUQpKZWZDeWhQcDB4eXhuMTZGM1lQMFhma1FkUmpMMy9DMzBLclF3cDdS -N1VVCi0tLSBaZGJLYmRpd3JRNVBLeU9DNCtJMWxhTU8vVGNtcjhJRHRERFdHSXVK -QVVJCsDf6LK4+HTF7SEzvqcR7MmWCfWEzivFmgZBzv60M8utLu45n92LkOSkPg77 -2L7il4KF3a3Ai1efvNqYCVtf5BXRGgI1jub4yoMaS2gXH8xwMehIpSBoDiId2AFw -YSzzZNmJXWQ+wzc+k/PlKO5UZu2S+QnxbUYNAGHQW134jA7j61lSXGiBHbF7an4/ -YX2ElCfe0N1774rgXMQHW1g4udvAQ8ZpaloSuiupJXB/bEuFhAhT3PAfPdF7vvgl -tVdeuMVITU3oYrn/5Ej1GJm2PILxEim5+Y/aDeVKva+Wn81buombADwpW8csOdOi -UfRZ4m0j0Fdp4T9EAGF5n95id+9FUnBqe4936yPT/hH1mwZbixiePDm6irEB+lsR -1zLmAoTUJsJW94JE7BgucM10YwrMI7clYS0lYLDx/HRuZPVlIcsgaEcaoLgR8M3h -H8S2QDscKnDO6sCp62Wiu30P65LXOTwZrDcD54ddx8+U9uU9muT+ZJtADL4KZUMX -AvgfrH9jKOirBrviwEgF74FcdugTlKHQIGBPfasPS3piFMQcPbCm+GCU2MBAWdoT -5iXDjObmpwNBzUiCeVLeEBYA0CuY8xxAiScvQZG+4gB2jpnnEqDOqGmG8h79JWx5 -AtsuBzIGq/ykgqQDbWAHV8YL3Zq+1f0OaaphuZ3/GsrHBtAvW2ScL3cpab/8kQXB -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 -een8QUTzn4aUFDM+ZxG0bZ5yc1hVci/6Wv4OsdsZ27hN6z+DiF7qS4N7OdjOiaT5 -1sUkpKrze0wOxqmDXdjWMJH9ahC9tbILLtYerojBQr7rYnhPXuYbBgWWQRFIfCji -HNZIa0mfPtihRF1pqaH1ZjF+pJQBz0XU9X9ucBbH74I8ttDLdJVlaLZ9SG/cq/ET -n9ptU54qx+b+fhK+tdoZmR7N9yUU4OScmNlNA0CVPN4aoKs85jBMTLGuKmaGjWRL -W775J4hn+bAWIvWmP6qCnGzbKMjTEBhvM7MZr/1/F4uAYdCyZfsvATZ1qn6P7Out -P6uu7KNQLvuWvlPbRc/dbl9/R1BZFLOih1uQHTm+10WCvmvYL89oyPWTfu+W+fuR -ztOpY8Gkq81Z8BtX8yN3RPSCA+SjD9dfCSaeRZa9FveeEQUwaJfRrAfC5J9MJsNu -4yvEvnWEczdLXv3txS/jOKXce1rGx5lCO980Lq7KDt8wtusI/ngu/yJABElk9ooG -Qtw3s93YkCJoeSi3z5JWJs+mmrO0FCV3Sq9NoJMs64tnD2oi7Vx08umxm8+gMV55 -anqNcEx1z8Ja+OD5pnAYHgQVwbcNf/fyiNGOnVWlUDqDsuaBqe0hNmT1O7QITr+R -WXVOY4bUDUOXy2qWvgmpQndEfuDWmvpzUfS+ZBLIj7+/6h3YT4oal7ddzlRpLglF -fdbOsVzN+oDb62CzLAEh9gh3SSbtxale92jn6IKqR+zyWEliMdy57NQ3/NYzGlRR -STTdTV4W+7LxX2yoHe7W9Y7srTZT9L75UqH4lqxuMWPNgfRZWe7/3jwjM21bR6JV -mzM0PAKhKrLxAxXR+KFacteZm+/A36YcIHlOGKWYYCdW/WzZVrJhZ14wEboOaTVD -SElKug4MTXiDgmjfqBWDW5Qsu4lXh6fZrrdbZHUr4/ok0/qkzHUVPgtmRJnNOa0n -HoM/Ufl3irfTAfpA2nS4I5GBPZeqWTXFT3AAnXmRfqzORLLXYU3hQ2vM4lJ1oNQ2 -gLQ2zpXBNOFaaL3OK223xmOybXEAKqqw9hzzrS+6/Nmz21iU2tHnyMd92jZFBfrI -Cs5mNh5wfUgbp0qqAsSJL0PYESGzGf1ABMjsUKLt6TMK7YCC3rRbyn6yMsugmY4V -FA5XeVQFwhz5594iUxeGHuaDOGjACsgNtLIyzk92c1CRBdCCWAcaHYi5oyZnaXjB -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 -4hAIo//cP8JShYtNJTxeVKySh77gKmDL ------END AGE ENCRYPTED FILE----- diff --git a/modules/system/secrets/secrets.nix b/modules/system/secrets/secrets.nix deleted file mode 100644 index ff97c0fd..00000000 --- a/modules/system/secrets/secrets.nix +++ /dev/null @@ -1,16 +0,0 @@ -let - soispha = "age1mshh4ynzhhzhff25tqwkg4j054g3xwrfznh98ycchludj9wjj48qn2uffn"; - - tiamat = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMD87QQIUXdEv3TaNRrI9clD9VgpsuVLFg2CrNGa5lVB"; - apzu = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBivF5b6PyxsR/t+4Qg4IEDXHVXrjmZpslTUNXpvcVbO"; -in { - "lf/cd_paths.age".publicKeys = [soispha tiamat apzu]; - - "serverphone/ca.key".publicKeys = [soispha tiamat apzu]; - "serverphone/server.key".publicKeys = [soispha tiamat apzu]; - - "taskserver/private.key".publicKeys = [soispha tiamat apzu]; - "taskserver/public.cert".publicKeys = [soispha tiamat apzu]; - "taskserver/ca.cert".publicKeys = [soispha tiamat apzu]; - "taskserver/credentials".publicKeys = [soispha tiamat apzu]; -} diff --git a/modules/system/secrets/serverphone/ca.key b/modules/system/secrets/serverphone/ca.key deleted file mode 100644 index d49c5395..00000000 --- a/modules/system/secrets/serverphone/ca.key +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN AGE ENCRYPTED FILE----- -YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyaGJNQkRRVy9MRXZ3b2tJ -Q2R1NUcrYUNGRE5uQkNyUDdkSm5rUWYxaXpjCjduMG1FSG1VamozdnJoVFFZUDYz -T2pyK1k3ekZ4RnFMaDFKdUZPWVNuR3MKLT4gc3NoLWVkMjU1MTkgelpFb25nIEpP -d0xwS3Nia3AwNmppRjZhODdzNXhEcnRsZW5rUzBQcTN6NWhWeTNiQ0EKTkpUZ1Jk -NHE3WVRzVEhpMnJGaVFpdkFBVW5QNThCSUdFSHVQR1RrQUJsZwotPiBzc2gtZWQy -NTUxOSA3SGZGVXcgdjJKUUtlRjE5UFEyR2tBOWhEbHNMVlNSOUMyZ1dkYkhYZWRW -by9QZ2UxTQpVSnhJcFFYay9LSStrSFFJcXJPWUxydXNGbUNXRVpLcHJibjM2TDlw -RnlVCi0+IGNHPjMiSyQtZ3JlYXNlIGcgdWZkbApmY0YzMmhDdzBWT0RKaWlUUmZP -bmRPOExuRVJ3Yk5mMFhYSnhlRENqWXJxK1VWdnBibUxzNWV1NHMyNVNXN054CmR0 -VFAzYUR0RHVaZUpOTlB3USt2TXVDcXdLOGtpZwotLS0gaTliQzBjbjdUYkVidURX -em9wcU04cDhNMHB6KzNBSVMyMmtSRERKS240SQryB70ZEgDQ4eJ/pjIWh6MBEUQr -iAx2i+J+XJu+74bC9DfB5rWpR4/HAdp8EF6wmi05TuEPUpG9brwm/mHi+FB/Drpu -00viGfM3dlCyALz1jB2W/MbruouK85o2L3RWDCgc+eT1gA+u2C7ZxO6iYA3aP4lu -ShDcSHlsKkh9lx4cRsNTua/8N+GQZLciSC7iMDroruxWj1HET9IxeeVN+VSuqcjW -ocX3LU2uU8vP9WT9zT1lbQB5Z0EM7W+ez61SjGpzrpXB2mpmi+SHOIWF3VdG1H8R -18BIyRjKIj5Op+8XD7qAe6nl9SSCnMURH+arc7yjNMgEbzFykfldfug2ibI2G/kW -OxeiEBoSFlC+V8ivS6I= ------END AGE ENCRYPTED FILE----- diff --git a/modules/system/secrets/serverphone/server.key b/modules/system/secrets/serverphone/server.key deleted file mode 100644 index a2720406..00000000 --- a/modules/system/secrets/serverphone/server.key +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN AGE ENCRYPTED FILE----- -YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJZnBXSzF4K0ljR3B1Rkk1 -M0lSSkVmVlA2Tjcrd0JCRmhHWDY4bzNoYnhjCmsvQjJmYU5vNVh1Umw0dzhCQjNF -WVRhVHpUTUIzRVBxaXhFWHpuenZHN0kKLT4gc3NoLWVkMjU1MTkgelpFb25nIHAz -aG02dkxiNVRreVNadXJjbnc0bXBtSFRSNDhrYjljanUrNldwVFlabXcKU2c2L25r -VlNjeDFENUdQeWllenRGWlRqRW53UU5VNEdCaUZsbHpaL1ZFTQotPiBzc2gtZWQy -NTUxOSA3SGZGVXcgZytvUUhZSXhwQ01mQmtkZmhzdHJUd2tlQS9yYkxCdTBYZ2pJ -UEd4WEF4SQp4WVh2UEJReDVES2tCWlpqQS9aanQzRGRsSTA4S0VXSWZxZ2hoKzZq -YllzCi0+IEc4eC1ncmVhc2UgaGQhIGFydERoaS4gLERUcQprczdDdHhaOXpmN1VU -MDlHNlYzVmMxY09Oa2xzTVN6M0ZyYnpRSzJEMS9nMmlqRVo4Wk1qN1lKZnp0N0RT -UStuCm51L01Rb3ZxNUhEa0c5Z3orYlp0YmlXMkhpeHVJMjNkRFZYWmR3QmV2Zwot -LS0gdWJDeHZvc0xOMU9uUjUyMlRGUnlGSW9PZzVKWWNoa3pWbVM1OE9LdFk2NAo+ -WS82jL1us5iVw+xWVI80luHMs31hxZfQgJDBuFbtpY0nKkM97U7rusl6t8P+s93c -R0IYBEUuz6n33GTeVOLipDqkZftlOOvSZkFneZ766+GpEO01dCjeSW9KViDC1jI/ -721IXq9TQNZw0Ou3Vf5E0nDypsfG0UhEoLCy6QZL9YCIyl5s//kyFFnpQjyaGT/P -pRHGhD0BxZa2ib07WDWzBpsTFtVemwcn9lqAx7DlYV2X3UwCT3qVOVjDuA/j6qUt -8bCDoXs4/dWleHNHzpwRhe+j2W4OWDKp7o0zYqxkUuPpEWXL7+A+B/+/08nAtZQk -ZvJyaZSL5wicIPAjLxrD00z2QcE/ZPyUrXsi0gOovuk= ------END AGE ENCRYPTED FILE----- diff --git a/modules/system/secrets/taskserver/ca.cert b/modules/system/secrets/taskserver/ca.cert deleted file mode 100644 index 203d62a8..00000000 --- a/modules/system/secrets/taskserver/ca.cert +++ /dev/null @@ -1,92 +0,0 @@ ------BEGIN AGE ENCRYPTED FILE----- -YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5c0xqVmk5MzZrUmhqTkUv -YUdRamtpQTdvZ2N1QUM4MWNiWWlYbmwvWURvCnhLYzJuSGM5dkhGbmZGaWNpNVhn -L3hSTU9xb0cwc1FSZHJpYUFqTE1NZlUKLT4gc3NoLWVkMjU1MTkgelpFb25nIFhv -N2dOR2xleGVRUWU1cTd5Q1RnQjVtZElJOVdaS2EzTGtVbmswNXdiRWMKa0hubkRD -bFE0NXp6R2QvcHpCUTZjblk1RVpIMmJ1TFhyajM0N1lYRy80UQotPiBzc2gtZWQy -NTUxOSA3SGZGVXcgOFpvTm1tN21pemJFUXVYYzREcE1aZ3dnMU5TLzVxLzFjdWI2 -eENGWXR4QQpwcHFLMS9WNDRiNFZxSThRUk85RVZhS2hyQnptL2FHdHo5OCt3dHF0 -amZZCi0+IGctZ3JlYXNlIDttPFJBT3FfIDZeMT91Ois3IEx0CkFTbFYxZzloWlJZ -WndXZGx3WHI0aXh0U09la3BmblZmcDRIb3RRYjdhL3drQnhQRWNrNUZabzE4R0Q0 -bnpqZGcKVy8xbWV2TXV4blpRNFg3czZHWExOZllLR20yU3hrdlltZwotLS0gUjQv -QXQ1L2NselJ2OVJtUzc0YnIrWlpXK29WNFFVUXEzUTQ4ZG0xRm9zSQqJzYGOwU7Y -Jt/x8jJohpCDiaBjukoqL0WH7ocjgjt084M+on5vp3pBbT9eIgErCJvGc7oDmke0 -Isnb6RvWg6fY66WY4Bsm67VqGiNyV1yQmAXB+zp6gfKjAfvdZk7wUbgll6mUYU8M -IVwvPHS6C3ByIMVU6OaNPXvAMIakDoQUM+HSQpy7Cu3ZuLwZJs7kM9CWGM/GzyNU -fhBiO8L17J5ZtiC5qOZ0DqIUCefdvKINXGLFCV1a/PoZwpbM7Q36R/urEEz77tLm -qzlM1qwq+G4SWjiihYwQ+3rcA2BPzDtYF/F0O9skw2FYFyRZhENqnba3OOewMb6C -CLVtJcCw7doOjHrpxCwYg7bcP1k9V7sR5F7ez80krQ72qHWlGBL7G4v8Mx9o/GQq -cNv8000KWIORBnPl7qyUc+Y5fZBqm8ebkGh9xg5wRflqXXZvOU81av2ayT4hjfgZ -dmSZPtYmX8jaTQwp/WqzpcJq47a9xaLfo4J8UNiG9y9paoN7J5fwn6IALrWnxK9U -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 ------END AGE ENCRYPTED FILE----- diff --git a/modules/system/secrets/taskserver/credentials b/modules/system/secrets/taskserver/credentials deleted file mode 100644 index f3aaf502..00000000 --- a/modules/system/secrets/taskserver/credentials +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN AGE ENCRYPTED FILE----- -YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqdGQ3a0pWb3lvZXFWbTFQ -UG1JbGREZW9SS3ZuWXJhbTdvTTBqZUdhN0Q0CjF1cnJFM1d2ZFNyRW44Rzlvamlz -VWQycXhmWnB4L1hiSE5qbFozWFlGMU0KLT4gc3NoLWVkMjU1MTkgelpFb25nIEFk -bVQ3U3BsU1FkeWxBY0sySTV2UkxocXJpVXMyd1FrMXA3YUR0NWtTR1kKeUtHODVy -aXE3aXh4WkFmYTJtdlZyZ1A1QlhYZGZuTUYxYVVlblRUV1BqOAotPiBzc2gtZWQy -NTUxOSA3SGZGVXcgdGR4cFMya3p6TEx5cnhYcWNXR2FlVEk3UTBEcHQ3Y3RmK0lY -YlpwRXJGcwpwZUVqODB3SUZUdTlQVW4yaWlZaTE0RE9OT1dLanZlSGV6cnlJRElQ -UjBBCi0+ICFALWdyZWFzZSB0MFU2IDZoIEJPWUZIP1sKN1l2dzdWN1JDbEhEeXBq -THV0cWJIV1RLalVsVVp3RCtwbk5NS2pnd3kxS1RhNTNaa3pqWXZFVm9FM2N2cFp5 -TQpYR2MKLS0tIEhLQWdwL0VoT1ZGNU5UUWs0SVVqK0ZQTndkTURPb0VtNEtJN3or -S0Q0K1UKRfhyrcVb0EbsKj9gL5kqaIpfrsWd2cizrVQ67y9ZOwWilWgk/gkoXadf -q7QeYjnWsHeIVtSZIaHSa8+9pvKAwiYW+B6DjRi7EXkCYz8zGeanMuoKA4by5Q9x -VMKJlWk7c0WIzSuviw== ------END AGE ENCRYPTED FILE----- diff --git a/modules/system/secrets/taskserver/private.key b/modules/system/secrets/taskserver/private.key deleted file mode 100644 index 5afecdaf..00000000 --- a/modules/system/secrets/taskserver/private.key +++ /dev/null @@ -1,450 +0,0 @@ ------BEGIN AGE ENCRYPTED FILE----- -YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtNkZidXVhQ1ExVjdEQWY4 -bUtLR1VCNUl0c2tQUUxCZXFRNE43aDQybFdJCk5qN3FGY2JOV0VjS0R2a1JTR0Fz -NTl1WlV3QVZYdTBvUCt5T2tzV1dWbXcKLT4gc3NoLWVkMjU1MTkgelpFb25nIDBm -MUl6ZDNEL1BVVHNnSlpiRWhDMStBMjYrUEZZZEVnWGh3NjFBYWh0dzQKZjhXbFY4 -NllvbHdwKzFSR2FJUEdHWHdBeVRBRzh2NWU1UUlabnlHQmxkOAotPiBzc2gtZWQy -NTUxOSA3SGZGVXcgd0MwWm1WY2R2NnhaS3dQYWZPcUtCY3BseEtkWUp1eURvKzRu -UXA2OStXMApXdjNEQ01JWlZSb1l3SmxYcDBMMUM4NEtPOVFvL2tHdlMzQ3hMN2t2 -N2w4Ci0+IFciK2Uicy1ncmVhc2UgKildWHNqZSA4QVIgNUE+T2EzdSYKODJIck9K -NzF0RW85RkJVNDBVaWNkTXlkbk03ZnBHNWFxSDN4K3A3THNVNEJLQXJ4MWxENWdq -d2oyL3lQUlVxcwp1VzJxTWpCMU9JRHc2NHZXM0ZvUm1MK1htaGFsTUVKaTZXbEtD -NTZzcy9hSFpGYmRzMzQKLS0tIFFjd25qSEdFT09LYlZCVzNNU04vVEY5RGdIdGs3 -ZkhodEM4SGZ4emlRUmMK3XxmNQwv5++wwwJ3CqpDfqKBLDcwyIfYM7VXqGlxaVR9 -TR9VjtFB6siP6Umo1oewRDt9Gc+MUI+rlc8aUN044ve5g+9im6uni2nQ6hubRZzD -Q3LQCLGGDiFL9+F7xHTLgFH8dIaLs4pnzeSzl+Od0Iybe05HOPGaZDhptqZvGWHr -uGHQz940sUU6k3kbnJ02qpj06AP3Uujl++s/4w5QKvVwx5m9Jio0ZOCaXv/6uUTn -Xq8l0uLMNBLtMhJsd4D5X5XRnvWSEWvUaQf2+nKFdCkxmDqxf8rv8qAE5ryx5SO0 -SnHVFZrSUhUDH4q2lVOPsGExwaExV/N/KB/24foJRoUafvpRb6GfNR8t2SmA82Qd -HVj2aqzuIcPBvefbq19T0WD2vJWHuF2p8NafL9x3KLdRIIm7urG+GLgZtB4am7BS -9B/bZrryjCVJybwy7POlIS1P+1OhuyNSdpv49tTL+v6o5PzGHeJFjykoEKyzTP5e -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 -Z/W/Onv5TRV/l+3dh4SPufGMw5b6CW0elZf1geeTz2fKM/M84xkOnSwk72c1fM2L -15U3MUbeW9kyKxq840CkIRWNuUp4AwtfH9oqdObFpVL4sOTYPHd7zx903tenAsmH -Q+oo/HhxrlDpnVLeHdli2Lffyei3E5TRujQ/XdEvcKylpldMXCUimhiW317SEjip -Tx9OeMUHAjEsGTp9qln4kgA9GTAs+3Zxs0CBJcWeiumd+qhfVyiqxkQ7spy6Yct2 -XuZcFzax/FvcwMZjXBjpgCqeYImG6FH3y3gtkm+ZhbK7qcw/FSR12/xew0SIIVI5 -xU4kvOmZd6nQojefy/S/THwcBbeihstfPpjH0kJ/vOfshfTYawP/Pj4ZqDKv76MJ -i45w8i4UuYCUtEnxo+3KeUMxdofi7lMpW1m4UlRUwHaSlb9blkzYe0OusL5IywP6 -yNqQ4ns1hs+NR9ylsDTMz4DdtgxxOcrdgXT4/zjMQztUe/NwBa6Dyj+zjap28lry -vLHYtpKRtB50JaC2j8RRodM/56YtENOU7HfS7T/FCC2nDCK4Th+saeG1QtQk/2uA -y/ASPmk6UToUYesV0TLCA23JftSZoaVGmfDaM5Zpko8Z9bW2MauRB9cNxm5yE3LL -5TKJJ4R2yNVHAeSNCVtZC0n2UjM/eMwqVQ/pQsWusTgoOeRBMCDc9j+3nIrg6j27 -QYMp3yKZhDgCeCEZrWD66PZeMGm4Q5MVO4g982TqWyDlDe2sragxRyeYwGSRc7VF -87VcMqGO2Kmegzhacew0jR/sbT9yUjAYHbTu81zHjDjCfeFqYbqo9YcTId+pzKzM -nVWu+DQQB9u7G/jIWLb0VR/LcD+Chs/Sd147sCy3aZiWwkgMvN1Atrw1JPjeQoyu -hMKDdiCBiRhY4VDQWtykaQGndrrxkYyS2d8MQfeBzyyJr/v9yhhRB5RnJnhVSKUp -LlN6GvqyUY38NLrNIMUxJ6CR9GvaF5/eIAopCAFN9ViAIAFR92ItHVRby8I0JY3S -wvszNDWPxwao5hQOa4mH4EpCE8x4y88Wo1uVO3OexwnK0ARWKVuv8BgNm/loojxR -GHdPUEuZiS2SsPZ33dqB5oblMRF7eiH/nj/dMhyzUWaE0VDww0Ve7VNptk7yo7DF -sJpaKMIpbpfHqsuI5P+IBcqPvg4QQi16Q4H8BwkmHV3JlQFWeElyAiWD5Kpzg61T -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 -7b+Hg4y4ZcH8mURkx3RCVDbH3g== ------END AGE ENCRYPTED FILE----- diff --git a/modules/system/secrets/taskserver/public.cert b/modules/system/secrets/taskserver/public.cert deleted file mode 100644 index 1cf9b5f0..00000000 --- a/modules/system/secrets/taskserver/public.cert +++ /dev/null @@ -1,83 +0,0 @@ ------BEGIN AGE ENCRYPTED FILE----- -YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6RnRGSEZSNE0yWWhXODhk -N1FGNkFPSEVIaFJhWm52eEZ3Q3Bwb2I5c25nCkpCU1Zhd3ZhZ1YyOVFmTGxkVnZT -aDhxOHBrWGdhcE00THh2WnFSbUM1bHMKLT4gc3NoLWVkMjU1MTkgelpFb25nIFh2 -WmVLTTc0ZjUxaUFFNVFuNzVjNkhLRzR6VGdJOVRvZGtBT1BrTnJJQnMKOExOck0r -TW9mSVY0d0VTSk9IS0c3NHdscXVyMHhlUnkyNnFJWnFmekJJWQotPiBzc2gtZWQy -NTUxOSA3SGZGVXcgOXFTejhFNWd0TklHcytUMlJQdU1OaUlNVlBSbWZWdnhWbmVp -TlpNekwwcwoyQXpEd3JCVVcrdHR2cDN4LzdmSVhveGNiaThEOVE3TlJEUXdnejdY -R3NjCi0+IFdAQS1ncmVhc2UgWgpRei9tQTFCcjY1bGxEVlhxdWJFVnB1d3B5MWov -amVZbm1EaEovVmVnczA5RWpuSUx0eUFLc0J0aEZqVmpJMmIxCjUwWmJyYTNxT3g3 -Qjl5MGhuWEEKLS0tIHNaMnh1N1JhUkJIdFZ5TnRtR3hDM1kxRlNMU2pWL2VBdkkx -cUw1TWhWa28KwuibZXNGOy/Qqhs17FD2aTdWit9nvgRl/n+F/gKwJXoaEvRM7veM -uTEvmfIRJzLm5ox7ko48f8g+EWQDWvcXsa1KwCDI4DDoP3WxhMOUmNE6SYqDgGpP -ilQLOvX7kKrtY/oB6OQj6QFMEJe8dElNEq8rcapaqiWnRDQsqvDtFm7j0HcGNQ2U -Kg+/c6UQRf4lgZXLs2cGMCjUivEA6eojyLctIcXdswIxWI9TwxBOJ7NTKI7wF4hn -TKqZSlWhLg8xpW7s0ZRpAQaONMVo+Ve9TH3fPaPFsUZUu+x0jfk+NMUWBscYbYUN -JZT9xuMOmEcnXZ+/1DIgl0zw5kG2hQ30lX0QGRqrWaPoOv0KchORWuwsVgkFFMTk -eiYeqf5mkAfswR8iN6Ye1K6gH6WAI666yRbkMmdJTAO5iC2JhQVLgdJuKBWixTE7 -0Y6xdPIRUhDXn2fgeYFxnTwqR7oi7Aa9H6LVtxdFMVvhqJ2l0QKd8UqcwO3RrCRK -VLehYc3prKklzrkevKVr5k+62ateISjMF/NoEpZf4wTzh6wByyk32cNHT5OU1Qr7 -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 -m7vbEx2mecNNVw96F/k= ------END AGE ENCRYPTED FILE----- diff --git a/modules/system/secrets/update_secrets.sh b/modules/system/secrets/update_secrets.sh deleted file mode 100755 index f1c27d77..00000000 --- a/modules/system/secrets/update_secrets.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env nix -#! nix shell nixpkgs#age nixpkgs#jq nixpkgs#dash --command dash -# shellcheck shell=dash - -cleanup() { - [ "$key_file" ] && rm "$key_file" -} -trap cleanup EXIT - -update_lf_cd_paths() { - echo "Starting to update the lf/cd_paths.age file.." - - cd "$(git rev-parse --show-toplevel)/modules/system/secrets" || { - echo "A secrets dir does not exist! (This is most likely a bug)" - exit 1 - } - - key_file="$(mktemp)" - - nix eval -f ./secrets.nix --json | jq --raw-output '.["lf/cd_paths.age"].publicKeys | join("\n")' >"$key_file" - - # `lf-make-map` is provided by the dev shell - { - lf-make-map --quiet --depth 4 visualize ~/media ~/repos ~/school | sed 's|\(.*\)|# \1|' - lf-make-map --quiet --depth 4 generate ~/media ~/repos ~/school - } | age --recipients-file "$key_file" --encrypt --armor --output ./lf/cd_paths.age - - echo "Finished updating the lf/cd_paths.age file.." -} - -main() { - update_lf_cd_paths -} - -main - -# vim: ft=sh diff --git a/modules/system/services/adb/default.nix b/modules/system/services/adb/default.nix deleted file mode 100644 index ec5d4be6..00000000 --- a/modules/system/services/adb/default.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ - lib, - config, - ... -}: let - cfg = config.soispha.services.adb; -in { - options.soispha.services.adb = { - enable = lib.mkEnableOption "Android adb bridge"; - user = lib.mkOption { - type = lib.types.str; - example = "soispha"; - default = "soispha"; - description = "Username to grant access to adb bridge"; - }; - }; - - config = lib.mkIf cfg.enable { - programs.adb.enable = true; - users.users."${cfg.user}".extraGroups = ["adbusers"]; - }; -} diff --git a/modules/system/services/backup/default.nix b/modules/system/services/backup/default.nix deleted file mode 100644 index 92700bf2..00000000 --- a/modules/system/services/backup/default.nix +++ /dev/null @@ -1,51 +0,0 @@ -{ - lib, - pkgs, - config, - ... -}: let - backup-script = pkgs.writeShellScriptBin "backsnap" '' - set -xeu; - - ${pkgs.util-linux}/bin/mount --mkdir "/dev/disk/by-uuid/${cfg.backupDiskUuid}" "/run/media/${cfg.backupDiskUuid}"; - ${pkgs.snap-sync-forked}/bin/snap-sync-forked --UUID "${cfg.backupDiskUuid}" --noconfirm; - ${pkgs.util-linux}/bin/umount "/run/media/${cfg.backupDiskUuid}"; - ''; - - cfg = config.soispha.services.backup; -in { - options.soispha.services.backup = { - enable = lib.mkEnableOption "backups with my forked snap-sync"; - backupDiskUuid = lib.mkOption { - type = lib.types.str; - example = lib.literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89"; - description = "The UUID of the backup disk"; - }; - }; - - config = lib.mkIf cfg.enable { - systemd = { - services.backup = { - wantedBy = lib.mkForce []; - unitConfig = { - Description = "Backup the last snapshots of the persitent-storage subvolume."; - }; - serviceConfig = { - Type = "oneshot"; - ExecStart = "${backup-script}/bin/backsnap"; - }; - }; - - timers.backup = { - wantedBy = ["timers.target"]; - unitConfig = { - Description = "Backup 15min after boot and every 8 hours"; - }; - timerConfig = { - OnBootSec = "15min"; - OnUnitActiveSec = "8h"; - }; - }; - }; - }; -} diff --git a/modules/system/services/dconf/default.nix b/modules/system/services/dconf/default.nix deleted file mode 100644 index e4a1c7a9..00000000 --- a/modules/system/services/dconf/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{...}: { - # needed to make home-manager play nice with some apps. See: - # https://nix-community.github.io/home-manager/index.xhtml#_why_do_i_get_an_error_message_about_literal_ca_desrt_dconf_literal_or_literal_dconf_service_literal - programs.dconf.enable = true; - # FIXME: This should also be parameterized. <2024-05-16> -} -# vim: nolinebreak nowrap textwidth=0 - diff --git a/modules/system/services/default.nix b/modules/system/services/default.nix deleted file mode 100644 index b5d500bd..00000000 --- a/modules/system/services/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{...}: { - imports = [ - #./serverphone - ./adb - ./backup - ./dconf - ./fwupd - ./issue_file - ./nix - ./openssh - ./postgresql - ./printing - ./scanning - ./snapper - ./steam - ./swaylock - ./system_diff - ./xdg - ]; -} diff --git a/modules/system/services/fwupd/default.nix b/modules/system/services/fwupd/default.nix deleted file mode 100644 index 5ad4f467..00000000 --- a/modules/system/services/fwupd/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.services.fwupd; -in { - options.soispha.services.fwupd = { - enable = lib.mkEnableOption "fwupd"; - }; - config = lib.mkIf cfg.enable { - services.fwupd.enable = true; - }; -} diff --git a/modules/system/services/issue_file/default.nix b/modules/system/services/issue_file/default.nix deleted file mode 100644 index d8b6faa8..00000000 --- a/modules/system/services/issue_file/default.nix +++ /dev/null @@ -1,52 +0,0 @@ -{ - config, - self, - pkgs, - lib, - ... -}: let - lastModifiedFile = pkgs.runCommandLocal "formatDate" {} '' - date --date='@${builtins.toString self.sourceInfo.lastModified}' +'%F %T' > $out - ''; - lastModified = lib.strings.replaceStrings ["\n"] [""] ( - builtins.readFile lastModifiedFile - ); -in { - environment.etc.issue = { - # Friendly greeting on the virtual consoles. - text = '' - [?25l[?7l  -  ▗▄▄▄ ▗▄▄▄▄ ▄▄▄▖  -  ▜███▙ ▜███▙ ▟███▛  -  ▜███▙ ▜███▙▟███▛  -  ▜███▙ ▜██████▛  -  ▟█████████████████▙ ▜████▛ ▟▙  -  ▟███████████████████▙ ▜███▙ ▟██▙  -  ▄▄▄▄▖ ▜███▙ ▟███▛  -  ▟███▛ ▜██▛ ▟███▛  -  ▟███▛ ▜▛ ▟███▛  - ▟███████████▛ ▟██████████▙ - ▜██████████▛ ▟███████████▛ -  ▟███▛ ▟▙ ▟███▛  -  ▟███▛ ▟██▙ ▟███▛  -  ▟███▛ ▜███▙ ▝▀▀▀▀  -  ▜██▛ ▜███▙ ▜██████████████████▛  -  ▜▛ ▟████▙ ▜████████████████▛  -  ▟██████▙ ▜███▙  -  ▟███▛▜███▙ ▜███▙  -  ▟███▛ ▜███▙ ▜███▙  -  ▝▀▀▀ ▀▀▀▀▘ ▀▀▀▘  -   -  NixOS ${config.system.nixos.label}  -  -------------- -  -   last update: ${lastModified} -   date: \d -   time: \t -   ipv4: \4 -   ipv6: \6 -   tty: \l -  - ''; - }; -} diff --git a/modules/system/services/nix/default.nix b/modules/system/services/nix/default.nix deleted file mode 100644 index 980bbd39..00000000 --- a/modules/system/services/nix/default.nix +++ /dev/null @@ -1,61 +0,0 @@ -{ - pkgs, - # flakes - nixpkgs_as_input, - templates, - self, - system, - ... -}: { - nix = { - package = pkgs.nixVersions.latest; - - # Disable nix channels (this is a remnant of old days) - channel.enable = false; - - registry = { - nixpkgs.flake = nixpkgs_as_input; - n.flake = - nixpkgs_as_input - // { - # Otherwise nixpkgs's config and overlays are not available: - - # Both attrs exists, so we just override both and hope - outputs.legacyPackages."${system}" = pkgs; - legacyPackages."${system}" = pkgs; - }; - - t.flake = templates; - - my_flake.flake = self; - m.flake = self; - }; - - gc = { - automatic = true; - dates = "weekly"; - options = "--delete-older-than 7d"; - }; - - settings = { - auto-optimise-store = true; - experimental-features = [ - "nix-command" - "flakes" - #"ca-derivations" - ]; - - use-xdg-base-directories = true; - - #substituters = ["https://cache.ngi0.nixos.org/"]; - #trusted-public-keys = ["cache.ngi0.nixos.org-1:KqH5CBLNSyX184S9BKZJo1LxrxJ9ltnY2uAs5c/f1MA="]; - - fallback = true; # Build from source, if binary can't be substituted - - keep-failed = true; # keep failed tmp build dirs - pure-eval = true; # restrict file system and network access to hash - - sandbox-fallback = false; # Don't disable the sandbox, if the kernel doesn't support it - }; - }; -} diff --git a/modules/system/services/openssh/default.nix b/modules/system/services/openssh/default.nix deleted file mode 100644 index b733dbe7..00000000 --- a/modules/system/services/openssh/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{...}: { - services.openssh = { - enable = true; - hostKeys = [ - { - path = "/srv/sshd/ssh_host_ed25519_key"; - rounds = 1000; - type = "ed25519"; - } - ]; - settings = { - PasswordAuthentication = false; - }; - }; -} diff --git a/modules/system/services/postgresql/default.nix b/modules/system/services/postgresql/default.nix deleted file mode 100644 index c47a235c..00000000 --- a/modules/system/services/postgresql/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.services.postgresql; -in { - options.soispha.services.postgresql = { - enable = lib.mkEnableOption "postgresql"; - }; - - config = lib.mkIf cfg.enable { - services.postgresql = { - enable = true; - }; - }; -} diff --git a/modules/system/services/printing/default.nix b/modules/system/services/printing/default.nix deleted file mode 100644 index 85d15b16..00000000 --- a/modules/system/services/printing/default.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.services.printing; -in { - options.soispha.services.printing = { - enable = lib.mkEnableOption "default printing configuration"; - }; - - config = lib.mkIf cfg.enable { - services.avahi = { - enable = true; - nssmdns4 = true; - nssmdns6 = true; - openFirewall = true; - }; - - services.printing = { - enable = true; - startWhenNeeded = true; - webInterface = true; - - # deletes `/var/cache/cups`, `/var/lib/cups` and `/var/spool/cups` on cups startup - stateless = true; - - drivers = []; - }; - - hardware = { - printers = { - ensurePrinters = [ - { - name = "Brother"; - description = "Brother DCP-9022CDW"; - model = "everywhere"; - deviceUri = "dnssd://Brother%20DCP-9022CDW._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-30055c773bcf"; - } - ]; - ensureDefaultPrinter = "Brother"; - }; - }; - }; -} diff --git a/modules/system/services/scanning/default.nix b/modules/system/services/scanning/default.nix deleted file mode 100644 index dda507fa..00000000 --- a/modules/system/services/scanning/default.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - cfg = config.soispha.services.scanning; -in { - options.soispha.services.scanning = { - enable = lib.mkEnableOption "default scanning configuration"; - }; - - config = lib.mkIf cfg.enable { - hardware = { - sane = { - enable = true; - extraBackends = [pkgs.sane-airscan]; - }; - }; - - users.users.soispha.extraGroups = [ - "scanner" # for permission to access the scanner. - ]; - }; -} diff --git a/modules/system/services/serverphone/certificates/ca.crt b/modules/system/services/serverphone/certificates/ca.crt deleted file mode 100644 index 7a4ae6f9..00000000 --- a/modules/system/services/serverphone/certificates/ca.crt +++ /dev/null @@ -1,10 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBXDCCAQOgAwIBAgIIRQ2wXiaD5pMwCgYIKoZIzj0EAwIwGTEXMBUGA1UEAwwO -U2VydmVycGhvbmUgQ0EwHhcNMjMwNjA2MTIzNzM3WhcNMzMwNjAzMTIzNzM3WjAZ -MRcwFQYDVQQDDA5TZXJ2ZXJwaG9uZSBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEH -A0IABDZMtz3liWniBedisStXDO2sxFCKBH239ezH7uADu8g5peGssmNu1rXEDrg1 -sFwVUjQeJAocYYNoUeHiVpODf1ejNTAzMB0GA1UdDgQWBBST5oMmXrANRbCLIQpN -W7e5uSCL3DASBgNVHRMBAf8ECDAGAQH/AgEBMAoGCCqGSM49BAMCA0cAMEQCIFig -xA3MvRNP4uXaUEWwdP1pYL/R8N46G4NZrPEfiNV4AiA+NJSTFRCOUqEsvSb7PTFx -YuMuJF4XxWnmStz3ym7xXA== ------END CERTIFICATE----- diff --git a/modules/system/services/serverphone/certificates/server.crt b/modules/system/services/serverphone/certificates/server.crt deleted file mode 100644 index f994cdc8..00000000 --- a/modules/system/services/serverphone/certificates/server.crt +++ /dev/null @@ -1,10 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBTjCB9KADAgECAgkAhKrdjsoiOrkwCgYIKoZIzj0EAwIwGTEXMBUGA1UEAwwO -U2VydmVycGhvbmUgQ0EwHhcNMjMwNjA2MTIzOTIwWhcNMjQwNjA1MTIzOTIwWjAm -MSQwIgYDVQQDDBtDbGllbnQgcnVubmluZyBvbiBsb2NhbGhvc3QwWTATBgcqhkjO -PQIBBggqhkjOPQMBBwNCAAS1ILQo8ae8ydqFlt5RncUT7joQiozk6Omunb0vxVz5 -toJRDmVqc1s6KhpCTipUV5coTcaK1TBz0+fft+9VH7cwoxgwFjAUBgNVHREEDTAL -gglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSQAwRgIhAN7ohtsBLrjlgmSe9ngovxZM -z61n0+/7w2mtX/OrLMWIAiEAu+D2S2o0s7E9pp2Rkug8cT5T4GCWgFgEHk5x2L/E -RVI= ------END CERTIFICATE----- diff --git a/modules/system/services/serverphone/default.nix b/modules/system/services/serverphone/default.nix deleted file mode 100644 index 20125a75..00000000 --- a/modules/system/services/serverphone/default.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ - config, - serverphone, - system, - lib, - ... -}: { - config = lib.mkIf config.soispha.secrets.enable { - services.serverphone = { - package = "${serverphone.packages.${system}.default}"; - enable = true; - domain = "localhost"; - configureDoas = true; - acceptedSshKeys = [ - "AAAAC3NzaC1lZDI1NTE5AAAAIGBFuTNNn71Rhfnop2cdz3r/RhWWlCePnSBOhTBbu2ME" - ]; - authorized = { - acceptedGpgKeys = [ - { - source = ./keys/key_1; - trust = "ultimate"; - } - { - source = ./keys/key_2; - trust = "ultimate"; - } - ]; - }; - caCertificate = "${./certificates/ca.crt}"; - certificate = "${./certificates/server.crt}"; - privateKey = config.age.secrets.serverphoneServer.path; - certificateRequest = { - acceptedUsers = [ - "soispha $argon2id$v=19$m=19456,t=2,p=1$EvhPENIBqL5b1RO5waNMWA$pJ8vDrCNJKDlqwB5bVDLjHVPEXm9McQhtt9OXSD8Zkc" - ]; - caPrivateKey = config.age.secrets.serverphoneCa.path; - }; - }; - - users.users.serverphone = { - group = "serverphone"; - isSystemUser = true; - home = "/run/serverphone"; - }; - users.groups.serverphone = { - members = ["serverphone"]; - }; - }; -} diff --git a/modules/system/services/serverphone/keys/key_1 b/modules/system/services/serverphone/keys/key_1 deleted file mode 120000 index 67720882..00000000 --- a/modules/system/services/serverphone/keys/key_1 +++ /dev/null @@ -1 +0,0 @@ -../../../../home-manager/soispha/config/gpg/keys/key_1 \ No newline at end of file diff --git a/modules/system/services/serverphone/keys/key_2 b/modules/system/services/serverphone/keys/key_2 deleted file mode 120000 index 24df7207..00000000 --- a/modules/system/services/serverphone/keys/key_2 +++ /dev/null @@ -1 +0,0 @@ -../../../../home-manager/soispha/config/gpg/keys/key_2 \ No newline at end of file diff --git a/modules/system/services/snapper/default.nix b/modules/system/services/snapper/default.nix deleted file mode 100644 index bf8201a4..00000000 --- a/modules/system/services/snapper/default.nix +++ /dev/null @@ -1,53 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.services.snapper; -in { - options.soispha.services.snapper = { - enable = lib.mkEnableOption "snapper config"; - }; - - config = lib.mkIf cfg.enable { - services.snapper = { - configs = { - srv = { - SUBVOLUME = "/srv"; - FSTYPE = "btrfs"; - # users and groups allowed to work with config - ALLOW_GROUPS = ["wheel"]; - - # sync users and groups from ALLOW_USERS and ALLOW_GROUPS to .snapshots - # directory - SYNC_ACL = true; - - # run daily number cleanup - NUMBER_CLEANUP = false; - - # limit for number cleanup - NUMBER_MIN_AGE = 1800; - NUMBER_LIMIT = 50; - NUMBER_LIMIT_IMPORTANT = 10; - - # create hourly snapshots - TIMELINE_CREATE = true; - - # cleanup hourly snapshots after some time - TIMELINE_CLEANUP = true; - - # limits for timeline cleanup - TIMELINE_MIN_AGE = 1800; - TIMELINE_LIMIT_HOURLY = 7; - TIMELINE_LIMIT_DAILY = 3; - TIMELINE_LIMIT_WEEKLY = 2; - TIMELINE_LIMIT_MONTHLY = 0; - TIMELINE_LIMIT_YEARLY = 2; - - # cleanup empty pre-post-pairs - EMPTY_PRE_POST_CLEANUP = true; - }; - }; - }; - }; -} diff --git a/modules/system/services/steam/default.nix b/modules/system/services/steam/default.nix deleted file mode 100644 index 49149cd7..00000000 --- a/modules/system/services/steam/default.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - lib, - config, - pkgs, - ... -}: let - cfg = config.soispha.services.steam; -in { - options.soispha.services.steam = { - enable = lib.mkEnableOption "Steam"; - }; - - config = lib.mkIf cfg.enable { - programs.steam = { - enable = true; - }; - - environment.systemPackages = [ - # TODO: Why is this package needed? <2024-05-16> - pkgs.wineWowPackages.waylandFull - ]; - }; -} diff --git a/modules/system/services/swaylock/default.nix b/modules/system/services/swaylock/default.nix deleted file mode 100644 index 6cbcef28..00000000 --- a/modules/system/services/swaylock/default.nix +++ /dev/null @@ -1,4 +0,0 @@ -{...}: { - # otherwise swaylock can't access the user password. - security.pam.services.swaylock = {}; -} diff --git a/modules/system/services/system_diff/default.nix b/modules/system/services/system_diff/default.nix deleted file mode 100644 index 052ffae2..00000000 --- a/modules/system/services/system_diff/default.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - cfg = config.soispha.services.systemDiff; -in { - options.soispha.services.systemDiff = { - enable = lib.mkEnableOption "nvd run at system activation"; - }; - - config = lib.mkIf cfg.enable { - system.activationScripts.diff = { - supportsDryActivation = true; - text = '' - PATH="${lib.makeBinPath [pkgs.nvd config.nix.package]}:$PATH" - - if [ -e /run/current-system ]; then - # ${lib.getExe config.nix.package} --extra-experimental-features nix-command store diff-closures /run/current-system "$systemConfig" - nvd diff $(ls -dv /nix/var/nix/profiles/system-*-link | tail -2) - fi - ''; - }; - }; -} diff --git a/modules/system/services/xdg/default.nix b/modules/system/services/xdg/default.nix deleted file mode 100644 index 5140a832..00000000 --- a/modules/system/services/xdg/default.nix +++ /dev/null @@ -1,58 +0,0 @@ -{ - pkgs, - nixpkgs_open_prs, - sysLib, - system, - ... -}: let - pkgs_tfc = nixpkgs_open_prs.nixpkgs-tfc.legacyPackages."${system}"; -in { - services.dbus.enable = true; - xdg = { - portal = { - enable = true; - termfilechooser = { - enable = true; - logLevel = "TRACE"; - package = pkgs_tfc.xdg-desktop-portal-termfilechooser; - settings = { - filechooser = { - default_dir = "/tmp"; - cmd = "${sysLib.writeShellScript { - src = ./scripts/lf_wrapper.sh; - name = "lf_wrapper"; - keepPath = true; - dependencies = with pkgs; [ - lf - alacritty - bash - ]; - }}/bin/lf_wrapper"; - }; - }; - }; - wlr = { - enable = true; - }; - config = { - common = { - # NOTE: The next entry is supposedly needed for gtk based apps <2023-08-31> - default = ["wlr" "gtk"]; - "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"]; - }; - - # TODO: Also activate, when on another wlr-based compositor <2023-11-25> - river = { - default = ["wlr" "gtk"]; - "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"]; - }; - }; - extraPortals = [ - pkgs.xdg-desktop-portal-gtk - pkgs.xdg-desktop-portal-wlr - pkgs_tfc.xdg-desktop-portal-termfilechooser - ]; - }; - }; - # TODO: mime = {}; -} diff --git a/modules/system/services/xdg/scripts/lf_wrapper.sh b/modules/system/services/xdg/scripts/lf_wrapper.sh deleted file mode 100755 index 16603fe4..00000000 --- a/modules/system/services/xdg/scripts/lf_wrapper.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH - -# This wrapper script is invoked by xdg-desktop-portal-termfilechooser. -# -# Inputs: -# 1. "1" if multiple files can be chosen, "0" otherwise. -# 2. "1" if a directory should be chosen, "0" otherwise. -# 3. "0" if opening files was requested, "1" if writing to a file was -# requested. For example, when uploading files in Firefox, this will be "0". -# When saving a web page in Firefox, this will be "1". -# 4. If writing to a file, this is recommended path provided by the caller. For -# example, when saving a web page in Firefox, this will be the recommended -# path Firefox provided, such as "~/Downloads/webpage_title.html". -# Note that if the path already exists, we keep appending "_" to it until we -# get a path that does not exist. -# 5. The output path, to which results should be written. -# -# Output: -# The script should print the selected paths to the output path (argument #5), -# one path per line. -# If nothing is printed, then the operation is assumed to have been canceled. - -multiple="$1" -directory="$2" -save="$3" -recommended_path="$4" -out="$5" - -# echo > /tmp/stdout -# echo > /tmp/stderr -# -# exec 1>> /tmp/stdout -# exec 2>> /tmp/stderr - -cmd="$(command -v lf)" -termcmd="${TERMINAL:-$(command -v alacritty)}" - -if [ "$save" = "1" ]; then - set -- -selection-path="$out" -command='set promptfmt "Select the file to write to %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$recommended_path" - cat <"$recommended_path" -xdg-desktop-portal-termfilechooser saving files tutorial - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!! === WARNING! === !!! -!!! The contents of *whatever* file you open last in !!! -!!! lf will be *overwritten*! !!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -Instructions: -1) Move this file wherever you want. -2) Rename the file if needed. -3) Confirm your selection by opening the file, for - example by pressing . - -Notes: -1) This file is provided for your convenience. You - could delete it and choose another file to overwrite - that, for example. -2) If you quit lf without opening a file, this file - will be removed and the save operation aborted. -EOF - -elif [ "$directory" = "1" ]; then - set -- -selection-path="$out" -command='set dironly' -command='set promptfmt "Select directory (quit in dir to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' -elif [ "$multiple" = "1" ]; then - set -- -selection-path="$out" -command='set promptfmt "Select file(s) (open file to select it; to select multiple) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' -else - set -- -selection-path="$out" -command='set promptfmt "Select file (open file to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' -fi - -"$termcmd" --title 'floating please' -e "$cmd" "$@" - -if [ "$save" = "1" ] && [ ! -s "$out" ]; then - rm "$recommended_path" -fi -# vim: ft=sh diff --git a/modules/system/services/xdg/scripts/ranger_wrapper.sh b/modules/system/services/xdg/scripts/ranger_wrapper.sh deleted file mode 100755 index e148bf19..00000000 --- a/modules/system/services/xdg/scripts/ranger_wrapper.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env dash - -# shellcheck source=/dev/null -SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH -# This wrapper script is invoked by xdg-desktop-portal-termfilechooser. -# -# Inputs: -# 1. "1" if multiple files can be chosen, "0" otherwise. -# 2. "1" if a directory should be chosen, "0" otherwise. -# 3. "0" if opening files was requested, "1" if writing to a file was -# requested. For example, when uploading files in Firefox, this will be "0". -# When saving a web page in Firefox, this will be "1". -# 4. If writing to a file, this is recommended path provided by the caller. For -# example, when saving a web page in Firefox, this will be the recommended -# path Firefox provided, such as "~/Downloads/webpage_title.html". -# Note that if the path already exists, we keep appending "_" to it until we -# get a path that does not exist. -# 5. The output path, to which results should be written. -# -# Output: -# The script should print the selected paths to the output path (argument #5), -# one path per line. -# If nothing is printed, then the operation is assumed to have been canceled. - -multiple="$1" -directory="$2" -save="$3" -path="$4" -out="$5" - -cmd="$(command -v ranger)" -termcmd="${TERMCMD:-$(command -v kitty)}" - -if [ "$save" = "1" ]; then - set -- --choosefile="$out" --cmd='echo Select save path (see tutorial in preview pane; try pressing zv or zp if no preview)' "$path" - printf '%s' 'xdg-desktop-portal-termfilechooser saving files tutorial - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!! === WARNING! === !!! -!!! The contents of *whatever* file you open last in !!! -!!! ranger will be *overwritten*! !!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -Instructions: -1) Move this file wherever you want. -2) Rename the file if needed. -3) Confirm your selection by opening the file, for - example by pressing . - -Notes: -1) This file is provided for your convenience. You - could delete it and choose another file to overwrite - that, for example. -2) If you quit ranger without opening a file, this file - will be removed and the save operation aborted. -' >"$path" -elif [ "$directory" = "1" ]; then - set -- --choosedir="$out" --show-only-dirs --cmd="echo Select directory (quit in dir to select it)" -elif [ "$multiple" = "1" ]; then - set -- --choosefiles="$out" --cmd="echo Select file(s) (open file to select it; to select multiple)" -else - set -- --choosefile="$out" --cmd="echo Select file (open file to select it)" -fi - -"$termcmd" -- "$cmd" "$@" -if [ "$save" = "1" ] && [ ! -s "$out" ]; then - rm "$path" -fi diff --git a/modules/system/sound/default.nix b/modules/system/sound/default.nix deleted file mode 100644 index f3120a67..00000000 --- a/modules/system/sound/default.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.sound; -in { - options.soispha.sound = { - enable = lib.mkEnableOption "sound based on pipewire"; - }; - - config = lib.mkIf cfg.enable { - hardware.pulseaudio.enable = false; - security.rtkit.enable = true; - - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - jack.enable = true; - }; - - # TODO: Find a better way to set the default volume <2024-03-10> - # - # environment.etc.pipewire-pulse-config = { - # target = "pipewire/pipewire-pulse.conf.d/pipewire-pulse-config.conf"; - # text = '' - # # Extra scripts can be started here. Setup in default.pa can be moved in - # # a script or in pulse.cmd below - # context.exec = [ - # { path = "${pkgs.pulseaudio}/bin/pactl" args = "set-sink-volume 0 13%" } - # ] - # ''; - # }; - }; -} diff --git a/modules/system/tempfiles/default.nix b/modules/system/tempfiles/default.nix deleted file mode 100644 index f8bfd4dc..00000000 --- a/modules/system/tempfiles/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - ... -}: let - cfg = config.soispha.tempfiles; -in { - options.soispha.tempfiles = { - enable = lib.mkEnableOption "systemd tempfiles generation"; - }; - - config = lib.mkIf cfg.enable { - systemd.tmpfiles.rules = [ - # TODO: Find a way to move this file to the lf home manager config. - # - # This file is needed to trash stuff on the root ('/') temp file system. - "d /.Trash 1777 root root" - ]; - }; -} diff --git a/modules/system/users/default.nix b/modules/system/users/default.nix deleted file mode 100644 index a44df7e8..00000000 --- a/modules/system/users/default.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: let - cfg = config.soispha.users; -in { - options.soispha.users = { - enable = lib.mkEnableOption "user set-up for soispha"; - hashedPassword = lib.mkOption { - type = lib.types.str; - example = lib.literalExpression "$y$jFT$ONrCqZIJKB7engmfA4orD/$0GO58/wV5wrYWj0cyONhyujZPjFmbT0XKtx2AvXLG0B"; - description = "The hashed password of the user"; - }; - groups = lib.mkOption { - type = lib.types.listOf lib.types.str; - default = ["wheel"]; - description = "The groups the soispha user should be part of"; - }; - - # Although deprecated, this helps with old udev rules, that still use this group. - # TODO: Try to find a way to remove this option (i.e. set it always to false). - enableDeprecatedPlugdev = lib.mkEnableOption "the deprecated plugdev group for the user"; - }; - - config = lib.mkIf cfg.enable { - # Ensure that the default shell of the user is actually enabled. - programs.zsh.enable = true; - - users = { - mutableUsers = false; - - users.soispha = { - isNormalUser = true; - home = "/home/soispha"; - createHome = true; - shell = pkgs.zsh; - initialHashedPassword = cfg.hashedPassword; - extraGroups = cfg.groups ++ lib.optional cfg.enableDeprecatedPlugdev "plugdev"; - - uid = 1000; - openssh.authorizedKeys.keys = [ - # TODO: This should be parameterized. <2024-05-16> - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIME4ZVa+IoZf6T3U08JG93i6QIAJ4amm7mkBzO14JSkz" - ]; - }; - }; - }; -} diff --git a/modules/system/version/default.nix b/modules/system/version/default.nix deleted file mode 100644 index 77cada14..00000000 --- a/modules/system/version/default.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ - config, - lib, - self, - ... -}: let - cfg = config.soispha.version; -in { - options.soispha.version = { - enable = lib.mkEnableOption "storing the git revision in /etc/nixos_git_rev"; - }; - config = lib.mkIf cfg.enable { - environment.etc.nixos_git_rev = { - text = builtins.toString (self.longRev - or self.lastModified - or "unknown"); - }; - }; -} diff --git a/modules/system/waydroid/default.nix b/modules/system/waydroid/default.nix deleted file mode 100644 index 4680db63..00000000 --- a/modules/system/waydroid/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{...}: { - # FIXME: Running `waydroid session start` causes all fuse mounts instances to coredump <2023-09-02> - # Thus this setting must be false. - virtualisation.waydroid.enable = false; -} -- cgit 1.4.1