Compare commits

281 Commits

Author SHA1 Message Date
warg f258fdfb10 chore: remove gitlab-ci.yml 2026-05-13 01:17:54 +02:00
warg b5c33695c3 fix(claude): treat questions as questions 2026-05-10 03:48:52 +02:00
warg a907dcdd1a fix(claude): disable alt screen 2026-05-10 03:23:34 +02:00
warg 470ae372b3 fix(claude): update keybinds 2026-05-10 03:23:07 +02:00
warg 580e5f4927 feat(claude): switch to fullscreen mode 2026-05-10 02:28:27 +02:00
warg 2937ee24fd fix(claude): disable alt screen 2026-05-10 01:29:22 +02:00
warg 1a84ea933e feat(setup): add -f/--filter to install a subset of profile paths 2026-05-10 00:08:09 +02:00
warg cd6024b578 fix(claude): disable attribution
Disable attribution in settings.json, add back the section about
attribution in CLAUDE.md due to claude sometimes ignoring the setting
2026-05-09 00:06:19 +02:00
warg 961484f517 fix(claude): mention sub-scopes for commits 2026-05-07 16:41:24 +02:00
warg 4cb787e420 fix(claude): add another jargon example 2026-04-29 12:19:00 +02:00
warg 349fc08188 Update .gitlab-ci.yml file 2026-04-28 15:58:35 +02:00
warg 603ca3d23e fix(claude): forbid audit self-reference in commit messages 2026-04-28 14:39:59 +02:00
warg ad6da302c7 fix(claude): walk audit findings tier by tier 2026-04-27 03:38:26 +02:00
warg 52256352ce fix(claude): no jargon 2026-04-26 04:54:34 +02:00
warg 851985dbf0 feat(claude): add global CLAUDE.md 2026-04-25 04:20:10 +02:00
warg e1533a5b9c feat(claude): add audit skill 2026-04-25 03:15:49 +02:00
warg 1e8706a2b1 fix(easyeffects): update SmartLav+ preset 2026-04-24 23:50:10 +02:00
warg fcaaa85762 chore(setup): use Apache 2.0 boilerplate header 2026-04-24 20:20:08 +02:00
warg fb520a29a6 fix(rust): lax lints 2026-04-24 05:24:48 +02:00
warg 7f32e59107 fix(rust): group imports 2026-04-24 05:24:48 +02:00
warg 040e219c21 refactor(setup): profile-based configuration 2026-04-24 00:41:07 +02:00
warg 8c800227b2 chore(setup): license under Apache-2.0 2026-04-24 00:40:28 +02:00
warg 357468cd82 fix(setup): remove .local/bin directory 2026-04-24 00:12:11 +02:00
warg 769fbc1181 feat(setup): per-distro package detection and install prompt 2026-04-24 00:08:26 +02:00
warg 781e8c8686 feat(setup): port setup.sh to Python 2026-04-23 22:56:08 +02:00
warg b5c28d9e8f feat: add claude settings 2026-04-23 21:55:12 +02:00
warg dcb5ec9713 refactor(setup): idempotent symlinks/copies, diff flag, flat COPIES 2026-04-23 21:38:57 +02:00
warg 201ca63d45 fix(codex): update config 2026-04-23 21:33:35 +02:00
warg 32a49ea461 feat(setup): install system files from etc/ 2026-04-23 21:08:51 +02:00
warg 038a827d14 fix: move root fs configuration into etc/ 2026-04-23 20:56:31 +02:00
warg b53480f112 fix: replace amdgpu service with udev rules 2026-04-23 20:53:08 +02:00
warg 003cb240ea fix(amd): use correct path to GPU 2026-04-23 20:15:45 +02:00
warg c9958f30ff feat: add gaming performance tweaks 2026-04-23 19:54:47 +02:00
warg 94cac779ca fix(foot): change font-size to 11 2026-04-21 20:35:30 +02:00
warg 5dd087538d fix(zsh): insert on accept, don't immediately submit line 2026-04-21 20:34:59 +02:00
warg a857da8caf fix(wireplumber): fix weird audio glitch on FiiO K11 2026-04-10 04:47:02 +02:00
warg 88cf4fe0bf fix(rust): change from separated literal suffix to unseparated 2026-03-21 04:23:22 +01:00
warg 66a1dca18c fix(rust): allow unused results 2026-03-21 04:13:49 +01:00
warg 22bdbd2697 fix(rust): allow missing_docs 2026-03-16 16:19:32 +01:00
warg e5a55d6c7e feat: add front_end config 2026-03-16 16:19:13 +01:00
warg 416830c4b5 feat(rust): add rustfmt config 2026-03-14 20:21:09 +01:00
warg f3efb33fb6 feat(dbus): add dbus service 2026-03-12 14:11:47 +01:00
warg 130a471f22 feat: separate mimelists between desktop-specific and global 2026-03-12 13:46:31 +01:00
warg ce950b78ba fix(foot): fix deprecated config 2026-03-08 10:19:25 +01:00
warg a16ac22e53 fix(codex): update config 2026-03-06 05:49:11 +01:00
warg 84290aebf6 fix(codex): update sandbox mode 2026-02-27 20:18:11 +01:00
warg 35bc9b5ce6 fix(rust): remove clippy lint 2026-02-26 10:16:45 +01:00
warg 800b391184 fix(rust): remove clippy diagnostic 2026-02-26 10:02:28 +01:00
warg 63d5746840 fix(codex): set sandbox to read-only 2026-02-26 07:35:24 +01:00
warg 57a88cc1c8 fix(codex): update config 2026-02-26 06:57:43 +01:00
warg aca920ac9c fix(rust): update configuration 2026-02-26 05:17:15 +01:00
warg 3b4c2c8cb1 fix(rust): update config 2026-02-26 05:15:50 +01:00
warg 8750eae1fa fix(rust): update config 2026-02-26 02:50:23 +01:00
warg a7969c900b fix(rust): update config 2026-02-26 02:42:57 +01:00
warg be185efd5d feat: add rust language settings 2026-02-26 02:42:57 +01:00
warg 9c8e58bc7c feat: add cpp language settings 2026-02-26 02:42:57 +01:00
warg 918a7ea383 feat(codex): add config 2026-02-25 23:17:58 +01:00
warg fcc5571574 fix(gtk-4.0): use AdwStyleManager to configure preferred dark scheme 2026-02-23 23:53:00 +01:00
warg f599a4db47 chore: update some config 2026-02-23 23:48:48 +01:00
warg c47e530c8c chore: update linux-tkg config 2026-02-23 23:48:14 +01:00
warg 1030907706 chore: remove uuid files 2026-02-11 22:51:10 +01:00
warg b73afabeba fix(wezterm): update theme url 2026-01-13 15:05:53 +01:00
warg 0572ed38c8 feat(zsh): change up/down keys to put cursor at end 2026-01-12 12:40:47 +01:00
warg 3d88e63e5f feat(linux-tkg): bump to linux 6.18 2026-01-12 12:25:54 +01:00
warg febd1b358b fix(linux-tkg): sync with master 2026-01-12 12:24:53 +01:00
warg 3ba48caee4 feat(zsh): add some keybinds 2026-01-11 17:51:11 +01:00
warg 0795bba5c4 fix(opencode): change context7 to remote 2026-01-07 17:15:41 +01:00
warg 15f780c9e7 feat(opencode): add context7 2026-01-07 17:12:01 +01:00
warg 8e416a49cd fix(opencode): remove half-page scroll keybinds 2026-01-07 09:44:21 +01:00
warg cbfba38110 feat(opencode): add keybinds 2026-01-06 16:43:53 +01:00
warg 76b8de0be0 feat(easyeffects): add FT1 oratory preset 2026-01-05 22:51:04 +01:00
warg 309ef6c288 fix(easyeffects): rename presets 2026-01-05 22:11:59 +01:00
warg 9a9bd609d3 fix(wireplumber): update config 2026-01-05 21:52:36 +01:00
warg 4baa7ec12c feat: add fontconfig 2026-01-05 21:52:08 +01:00
warg 8113a8038c feat: add easyeffects config 2026-01-05 21:51:26 +01:00
warg c8278d3880 feat(opencode): add one-darker theme 2026-01-05 19:27:53 +01:00
warg efec2fc621 fix(opencode): update config 2026-01-05 19:27:33 +01:00
warg 92323c8813 Revert "feat: change from emacs mode to vi mode"
This reverts commit 0e2029550e908a00794423cf3111aab84b024e7d.
2025-12-09 15:32:57 +01:00
warg 730efb4643 Revert "fix(zsh): indicate vi mode in prompt"
This reverts commit a194d840244f86a1a5dde20cb5fd9ab73a381a12.
2025-12-09 15:31:59 +01:00
warg 901df5cef4 fix(vim): make windows compatible 2025-10-31 09:18:34 +01:00
warg 0f72c8a7d7 fix(zsh): indicate vi mode in prompt 2025-10-22 11:54:45 +02:00
warg e2b9de241d fix: add wireplumber to setup.sh 2025-10-22 09:52:14 +02:00
warg eabe7284f5 fix: audio stuff 2025-10-21 18:05:57 +02:00
warg d4d8a7c381 fix(pipewire): revert to default clock rate 2025-10-21 17:32:31 +02:00
warg 1915036a5e feat: change from emacs mode to vi mode 2025-10-20 02:45:56 +02:00
warg 47f2852064 fix(foot): disable system bell 2025-10-17 06:49:33 +02:00
warg e560b30ce7 chore: add .uuid files that appeared for some reason 2025-10-17 06:03:32 +02:00
warg e764a21af1 feat: add pipewire config 2025-10-17 06:02:59 +02:00
warg 596e619c37 fix(strawberry): update config 2025-10-17 06:02:46 +02:00
warg 8c56e15134 fix(linux-tkg): update config 2025-10-16 04:27:40 +02:00
warg d070569b10 fix(kde): change default terminal to foot 2025-09-30 20:56:08 +02:00
warg dbba1d9f56 fix(wezterm): disable multiplexing 2025-09-30 20:55:19 +02:00
warg a8e7f0ffed fix(foot): detect font styles automatically 2025-09-30 14:43:23 +02:00
warg a0d4d18196 fix(foot): set scrollbar color 2025-09-30 14:36:10 +02:00
warg 90d35fea55 fix(wezterm): set no padding 2025-09-30 14:27:08 +02:00
warg b7b1243614 fix(wezterm): reset window size and padding to defaults 2025-09-30 14:23:10 +02:00
warg 024cd3dc17 fix(foot): remove padding 2025-09-30 14:11:57 +02:00
warg e16af9f40a fix(foot): reset default window size 2025-09-30 13:58:19 +02:00
warg 4a06edece7 fix(foot): change theme to onedark 2025-09-30 12:58:13 +02:00
warg 9a798530e2 fix(gdb): don't load tui automatically and enable pretty print 2025-09-25 10:02:42 +02:00
warg cd9198e332 feat(vim): load man ftplugin 2025-09-25 10:02:22 +02:00
warg 2439437bdc feat: add gdbinit 2025-09-20 08:16:12 +02:00
warg 056a83264a feat: set CC 2025-09-20 08:16:12 +02:00
warg 57377b4551 feat: add opencode 2025-09-20 08:16:12 +02:00
warg 3078bf2f6f fix(alacritty): update config 2025-09-10 19:25:17 +02:00
warg c106b2609a fix(ghostty): update config 2025-09-10 19:24:28 +02:00
warg 73b7ec5e80 fix(vim): fix netrw styling 2025-09-07 07:56:27 +02:00
warg 115b45ef2a feat(vim): replace fzf with fuzzbox 2025-09-07 06:39:10 +02:00
warg 1f78a18386 fix(vim): formatting 2025-09-07 06:38:33 +02:00
warg fd0e80940a fix(vim): add vim-nerdtree-syntax-highlight 2025-09-07 06:38:02 +02:00
warg ad75460479 fix(vim): change GitGutterChange highlight 2025-09-07 06:03:15 +02:00
warg a6d8176c49 fix(vim): change nerd-tree binding 2025-09-07 05:55:52 +02:00
warg f7146a13ef fix(vim): add comment 2025-09-07 05:47:21 +02:00
warg d89bd73917 fix(vim): move keybinds to the plugin section 2025-09-07 05:45:47 +02:00
warg 1fc320d032 fix(vim): reorganize 2025-09-07 03:18:23 +02:00
warg 9d8a16f10a fix(vim): update nerd-tree settings 2025-09-07 02:53:40 +02:00
warg 6ada640621 fix(vim): re-organize a little bit 2025-09-07 02:51:00 +02:00
warg 0d7cd6a048 Revert "feat(vim): remove nerd-tree"
This reverts commit 9acbbc65b30a2a08e19bf6fe4e0e3b07e1e71c44.
2025-09-07 02:47:16 +02:00
warg c998f1bf30 fix(vim): always enable signcolumn 2025-09-07 02:41:23 +02:00
warg c9300659ea fix(vim): update terminal settings 2025-09-07 02:33:05 +02:00
warg 4f697af31b feat(vim): set terminal local settings 2025-09-07 02:27:44 +02:00
warg 5749f50df7 fix(vim): remove not-needed if condition 2025-09-07 02:14:22 +02:00
warg 1cb7a114be feat: add vlc config 2025-09-07 02:07:12 +02:00
warg dba3dd424d feat: add language specific project configs 2025-09-06 01:34:46 +02:00
warg 4200a717d9 fix(vim): update colorscheme 2025-09-05 22:39:07 +02:00
warg f4e44d2740 feat(vim): make terminal a bit nicer 2025-09-05 22:39:07 +02:00
warg 14e2bec1c6 feat(vim): open git status in current tab 2025-09-05 22:39:07 +02:00
warg 6a4627acca fix(vim): Fix git status colors in status line 2025-09-05 22:39:07 +02:00
warg 761fe7b6a3 feat(vim): remove nerd-tree 2025-09-05 22:39:07 +02:00
warg 52b67ce9bb chore: bump linux version 2025-08-29 20:05:46 +02:00
warg 807d74cf1a feat(lf): add trash command 2025-08-19 20:47:33 +02:00
warg 26b24518d1 fix: replace ruff config with full pyproject template 2025-08-01 11:34:19 +02:00
warg e676c510f0 feat(vim): add undo tree 2025-08-01 11:34:05 +02:00
warg 450c423abf fix(linux-tkg): sync config with master 2025-07-24 21:48:23 +02:00
warg 211e08b247 fix(alacritty): reduce default window size 2025-07-24 21:48:01 +02:00
warg 99c9ea2230 feat: add sysctl network config 2025-07-16 23:04:36 +02:00
warg 598e95ed32 fix: update xremap config 2025-07-14 13:40:37 +02:00
warg b3997ed4ce fix(xremap): add additional setup step 2025-07-05 08:57:28 +02:00
warg 4790bfda15 feat: add xremap 2025-07-05 08:55:25 +02:00
warg 7a3b52eb45 chore(linux-tkg): bump to linux 6.15 2025-06-15 17:06:08 +02:00
warg 899e945b58 fix(kde): put application launcher back on Meta 2025-05-30 02:16:33 +02:00
warg 9a2a237e52 feat(kde): set overview keybind to the meta 2025-05-15 00:28:57 +02:00
warg d0df7172ed feat(linux-tkg): update to 6.14 2025-05-14 14:54:38 +02:00
warg 82bf700354 feat(wezterm): add keybind for last tab 2025-05-14 14:54:15 +02:00
warg 67dec48e62 feat(wezterm): add onedark 2025-05-14 14:53:56 +02:00
warg 9253604fdb fix(wezterm): format lua code 2025-05-05 16:35:35 +02:00
warg 227b0aec84 fix(vim): set darker background 2025-05-02 05:05:21 +02:00
warg f8d972115b feat(vim): add NERDTree 2025-05-02 04:57:59 +02:00
warg f5aa726e46 fix(alacritty): update colors 2025-05-01 02:18:49 +02:00
warg 2eb6fea8ad feat(zsh): change some dircolors 2025-05-01 02:15:10 +02:00
warg 9763c95fb1 fix(zsh): track dircolors file 2025-05-01 01:46:18 +02:00
warg 542efed796 feat(colorscheme): change to onedark 2025-04-30 19:36:47 +02:00
warg 70646c7f52 fix: bootstrap 2025-04-30 19:36:26 +02:00
warg 671df15ae1 feat(alacritty): change theme to onedark 2025-04-29 19:33:48 +02:00
warg 0a76572835 Revert "feat(fonts): remove nerd font"
This reverts commit 1063c3351d.
2025-04-29 09:44:59 +02:00
warg 834e64204f fix(setup): set executable 2025-04-29 09:32:31 +02:00
warg 3d08154cf2 fix(zed): disable cursor blink 2025-04-29 09:32:13 +02:00
warg 9b84dcba5d feat: add zed config 2025-04-28 07:52:24 +02:00
warg 8d1ec154e4 feat: add vim maps for visual mode diff 2025-04-28 03:16:52 +02:00
warg c2fb0c3b05 fix(alacritty): remove y-padding 2025-04-20 21:34:58 +02:00
warg 675da83a72 fix: change default terminal to alacritty 2025-04-20 21:28:48 +02:00
warg 6e8fc4dc43 fix: update kde config 2025-04-20 21:27:47 +02:00
warg cbc9567fcd fix(alacritty): update config 2025-04-20 21:27:47 +02:00
warg 9c5f3883f8 fix(zsh): skip sudo for cmd in preexec 2025-04-20 14:39:52 +02:00
warg 8aa289d62f fix: more consistent terminal title 2025-04-19 00:10:43 +02:00
warg c7ef223b5e feat(kwinrc): add some good to have config 2025-04-02 01:26:34 +02:00
warg fb58229cf8 feat: add ruff toml 2025-03-29 22:27:52 +01:00
warg 2870daebb9 chore: update kde settings 2025-03-27 22:56:42 +01:00
warg 57615a4e48 chore: update kde settings 2025-03-27 22:55:32 +01:00
warg 7fcfd2301b feat(strawberry): update settings 2025-03-27 22:52:57 +01:00
warg eb04f23b07 feat: add strawberry config 2025-03-27 18:18:00 +01:00
warg 1b5efe7eea fix(ghostty): adjust window width to fit 2 nvim windows 2025-03-07 12:06:02 +01:00
warg aba85a09f0 fix(ghostty): use link-url over default link behavior 2025-03-07 05:50:55 +01:00
warg 5e7f298a8f fix(linux): update config 2025-03-07 05:38:08 +01:00
warg cf350e1f4f Revert "fix(ghostty): increase width to fit 2x80 cols"
This reverts commit 64e7637d29.
2025-02-19 22:16:44 +01:00
warg d0c9d8e472 fix(ghostty): increase width to fit 2x80 cols 2025-02-19 18:26:41 +01:00
warg 1488f6888c fix(ghostty): update window padding 2025-02-14 18:52:11 +01:00
warg 7c0f920471 fix(ghostty): adjust window padding 2025-02-09 16:16:53 +01:00
warg 65a979d2ee fix(ghostty): prefer server-side decorations explicitly 2025-02-09 16:08:19 +01:00
warg 3c90e64b5e fix(tmux): make pane navigation bindings non-repeatable
Fixes issue with having to wait before input after navigation
2025-02-09 13:03:19 +01:00
warg 16baa1cd4f fix: update kde mappings 2025-02-09 13:02:42 +01:00
warg 05026f1df5 feat(linux-tkg): bump linux to 6.12 2025-02-09 13:02:07 +01:00
warg bb69320283 feat(ghostty): switch to ghostty 2025-01-07 12:09:26 +01:00
warg db61256d39 feat: add some bindings 2024-11-18 17:18:16 +01:00
warg 552b7842c3 fix(alacritty): update dimensions 2024-11-18 17:17:23 +01:00
warg 1a4c9b7093 feat: add klipperrc 2024-10-31 19:19:35 +01:00
warg 333e346662 feat: add amdgpu power profile service 2024-10-31 19:18:54 +01:00
warg f535301978 fix(shortcuts): update kde shortcuts 2024-10-31 19:18:20 +01:00
warg 3567d587f4 fix(tmux): set clipboard to external and update keymaps 2024-10-31 19:14:48 +01:00
warg 82d6aacfd7 fix(linux-tkg): update config 2024-10-31 19:14:33 +01:00
warg b743753458 fix(wezterm): update config 2024-10-31 19:14:00 +01:00
warg 2da6d81a69 fix: update xresources 2024-10-31 19:13:36 +01:00
warg 0f93585e70 feat(setup): add wezterm 2024-10-31 19:13:13 +01:00
warg f69f89ed4f fix(alacritty): migrate config 2024-10-31 19:12:51 +01:00
warg 34d1df107f feat(vim): add some vim config 2024-10-31 05:04:25 +01:00
warg f5163fb62c feat(kde): add keyboard shortcuts 2024-10-23 14:05:42 +02:00
warg a70951fb64 fix(setup): update print outs 2024-10-23 14:01:33 +02:00
warg 9831b6f2ac fix(setup): make copy item work with FORCE and IGNORE_EXISTING 2024-10-23 14:01:01 +02:00
warg 21d723583e fix(setup): proceed on already existing copy paths 2024-10-23 13:44:15 +02:00
warg e045b299af fix(foot): add some padding 2024-10-23 05:52:50 +02:00
warg 5e3097c67c feat(dolphin): Set open external in new tab 2024-10-23 05:47:45 +02:00
warg 6d2782f884 feat(zsh): set MESA_WHICH_LLVM 2024-10-23 05:47:16 +02:00
warg a3804056b3 feat: add foot 2024-10-23 05:47:03 +02:00
warg 5207e34289 feat(tmux): enable jumping to prev/next prompts in vi-copy-mode 2024-10-23 05:42:42 +02:00
warg 75d28e752b fix(alacritty): update font size 2024-10-15 19:02:44 +02:00
warg cdd2f0ede6 fix(alacritty): update window dimensions 2024-10-15 19:02:08 +02:00
warg a31ae99438 fix(gitignore): remove gtk ignores 2024-09-16 00:42:51 +02:00
warg 9bbe06cd01 Revert "feat: add kglobalshortcutsrc"
This reverts commit 54b999e405.
2024-09-16 00:41:56 +02:00
warg 3b30f44efc feat(setup): copy gtk-related config instead of symlinking 2024-09-16 00:40:03 +02:00
warg bea51344ae feat: add kglobalshortcutsrc 2024-09-16 00:31:59 +02:00
warg 6ca028ad66 fix(setup): add kde-mimeapps.list 2024-09-16 00:31:25 +02:00
warg 570c6f0bca fix(setup): add konsole 2024-09-16 00:30:55 +02:00
warg 2e9246c629 fix(dokphin): update settings 2024-09-15 21:40:27 +02:00
warg 9659e7aaef feat(konsole): add konsole settings 2024-09-15 21:38:19 +02:00
warg 790629e319 fix(lfrc): change mode to perm 2024-09-13 16:29:45 +02:00
warg b8660a92ca fix(zsh): skip setting terminal title if ssh session 2024-09-13 15:33:45 +02:00
warg 0a3baf545c feat(lf): add mode, user and group info parameters 2024-09-13 03:42:50 +02:00
warg 6c3022aaee feat: add keychron via rule 2024-09-13 03:42:38 +02:00
warg a00082ea5e fix: add gtk directories to gitignore 2024-09-12 02:35:18 +02:00
warg ebce44b65b fix(gtk2): remove setting 2024-09-12 02:32:39 +02:00
warg 8ba938357b Revert "feat: remove gtk config"
This reverts commit 477af9c3ac6c442226dab070399bec0d8febf210.
2024-09-12 02:30:49 +02:00
warg 59c9d20454 fix(tmux): fix escape delay 2024-09-10 07:03:21 +02:00
warg 7cdbd1e32e feat(mimeapps): use associations only with KDE 2024-09-09 02:09:22 +02:00
warg b731288f0b feat(mimeapps): add mpv associations 2024-09-09 02:02:07 +02:00
warg 5a9ce7d34b fix(mimeapps): only track default applications 2024-09-09 02:01:37 +02:00
warg 58fa033022 feat(zsh): add cargo bin to path 2024-09-09 01:40:38 +02:00
warg 310597669a fix(setup): update error messages 2024-09-03 12:15:39 +02:00
warg 3d299db80e feat: add dolphin config 2024-09-03 12:14:56 +02:00
warg 73520e260d feat(mimeapps): update defaults for kde 2024-09-03 12:11:11 +02:00
warg 683a8eec07 feat: remove gtk config 2024-09-03 12:08:40 +02:00
warg 7e68229a6f feat: add mimeapps list 2024-08-24 17:13:16 +02:00
warg ebd5fc37e1 fix(alacritty): restore previous dimensions 2024-08-24 17:11:56 +02:00
warg 8648c88903 feat(frogminer): add linux-tkg config 2024-08-23 16:49:09 +02:00
warg 1ba04612ac feat(alacritty): enable decorations 2024-08-23 16:48:44 +02:00
warg 9e70e4a870 fix(tmux): change navigation bindings 2024-08-23 16:04:45 +02:00
warg 3e0b02b818 fix(alacritty): update window properties 2024-08-23 16:04:05 +02:00
warg 2053d73c26 feat(fonts): remove nerd font 2024-08-08 23:03:52 +02:00
warg d2f4bf2bdd feat(zsh): remove approximation completer 2024-08-04 19:44:22 +02:00
warg 73b62bf30b feat(fish): add some config 2024-08-04 14:30:23 +02:00
warg 2c3631cd1a feat(zsh): disable completion group names 2024-08-04 01:44:55 +02:00
warg ac4801da8f fix(setup): improve error handling 2024-08-03 04:40:16 +02:00
warg d89c157503 feat(setup): add force flag 2024-08-03 04:01:41 +02:00
warg e5e6e83488 fix(setup): fix check for symlink 2024-08-03 03:57:04 +02:00
warg 40a5a65975 fix(setup): fix order of packages/config 2024-08-03 03:31:15 +02:00
warg b2a010b5cf feat(fish): add fish config 2024-08-03 03:27:17 +02:00
warg 95b15cc539 fix(zsh): add alias for grep coloring 2024-08-01 12:37:23 +02:00
warg 744497a3d1 feat(zsh): refine syntax highlighting 2024-08-01 10:13:28 +02:00
warg 0a9206f50a fix(zsh): fix coloring for ambigous completions 2024-08-01 10:06:33 +02:00
warg 7ab475c799 feat(zsh): add auto-suggestions plugin 2024-08-01 09:01:08 +02:00
warg 1aa763a80c fix(zsh): ask to show large number of completions 2024-07-31 22:39:47 +02:00
warg cdb568f2c6 fix(zsh): disable immediate menu completion 2024-07-31 22:39:26 +02:00
warg 6a0d88359d fix(wezterm): update title 2024-07-31 21:55:41 +02:00
warg 2b72bb84b5 fix(zsh): add go bin to path 2024-07-31 21:53:52 +02:00
warg 5bbd3ec5b7 fix(alacritty): disable dynamic title 2024-07-31 21:53:35 +02:00
warg 3719e19eeb fix(wezterm): set title 2024-07-31 21:49:35 +02:00
warg 3f1bd482cf feat(dircolors): make it more portable across systems 2024-07-31 21:31:40 +02:00
warg 84224d114c feat(zsh): add telnet alias 2024-07-31 21:21:26 +02:00
warg fcb1ae8437 chore(zsh): clean up 2024-07-31 11:50:46 +02:00
warg 7816df80a4 feat(tmux): change prefix to C-z 2024-07-31 11:49:48 +02:00
warg 316ae75a47 feat(zsh): replace completion plugin with manual configuration 2024-07-31 11:49:15 +02:00
warg 122dbd406f feat(zsh): add safe aliases for cp/mv 2024-07-31 11:47:54 +02:00
warg e2570b74ca fix(zsh): add ls alias 2024-07-31 11:45:12 +02:00
warg 171564e299 fix(zsh): move cache directory 2024-07-31 11:43:10 +02:00
warg b7ca715bc7 fix(zsh): Minor re-ordering 2024-07-31 11:41:43 +02:00
warg 57f541e2f4 fix(zsh): disable beep and flow control 2024-07-31 11:40:10 +02:00
warg 384437bfe6 feat(zsh-prompt): remove timestamp 2024-07-31 01:59:39 +02:00
warg fff0a4c08a fix(bootstrap): rename script to setup 2024-07-30 01:33:55 +02:00
warg 2355878c9a fix(bootstrap): fix check for symlink 2024-07-30 01:33:09 +02:00
warg c62c5cd67b fix(zsh): make prompt a sourced script 2024-07-29 04:55:27 +02:00
warg 780515cfb0 feat(zsh): move configuration to zsh/ 2024-07-27 18:33:25 +02:00
warg 2a3dba5e9e fix(zsh): add cleanup 2024-07-27 18:27:44 +02:00
warg 7489e0cf84 fix(zsh): apply formatting 2024-07-27 18:27:10 +02:00
warg 61fe8c2e6e feat(zsh): remove keybinds in favor of emacs 2024-07-27 18:26:40 +02:00
warg 253646946a feat(zsh): configure history 2024-07-27 18:24:10 +02:00
warg cc28744031 fix(zsh): clean gcloud sdk 2024-07-26 22:24:46 +02:00
warg d7e71a3dc1 feat(tmux): change prefix key to C-Space 2024-07-26 15:40:05 +02:00
warg 17110793a0 fix(zsh): update plugin handling 2024-07-26 14:44:55 +02:00
warg c8eddbcc40 feat(yay): add yay config 2024-07-23 03:08:13 +02:00
warg ac10db27cc fix(zsh): apply shfmt fixes 2024-07-15 02:28:38 +02:00
warg 9e107afd0f feat(zsh): write my own prompt 2024-07-15 02:00:54 +02:00
warg 55373d6ed9 Initial commit 2024-07-14 13:55:45 +02:00
73 changed files with 6669 additions and 1690 deletions
+93
View File
@@ -0,0 +1,93 @@
# CLAUDE.md
Cross-project preferences for working with me. Project-specific CLAUDE.md files extend or override these.
## Writing
### Linear prose
Avoid em-dashes (—), en-dashes (), double hyphens (--) as em-dash substitutes, and semicolons in prose. Applies to anything checked in to a project: code comments, Markdown docs, commit messages, and PR descriptions. Code syntax isn't prose, so language constructs like `;` as a statement terminator or separator don't count.
Sentences should read linearly. Em-dashes, en-dashes, and semicolons all introduce sub-clauses or asides that interrupt the flow. Swapping one for another (em-dash for semicolon, em-dash for double hyphen) shifts the punctuation without solving the underlying issue. Restructure instead:
- Split into two sentences with a period.
- Use a connective: "because", "since", "which", "and", "so", "while", "where".
- Use parentheses for a genuine aside, sparingly.
- Use a comma for a short, tightly-integrated clause.
- Rework so the sub-clause isn't needed.
Don't substitute a regular hyphen between words where an em-dash would have gone. That's broken English, not a fix.
### No jargon acronyms
Don't use programming-culture acronyms like YAGNI, DRY, KISS, SOLID, TDD, BDD, DDD, MVP, SOA, NBO, TOCTOU. Applies in chat, code comments, commit messages, and docs. Even when the reader knows them, they read as in-group shorthand and force a mental expansion step. Say what you mean: "don't build it until a second caller exists" instead of "YAGNI", "extract this once it's duplicated three times" instead of "DRY", "network byte order" or "big-endian" instead of "NBO", and so on.
Common technical abbreviations that name a thing (HTTP, JSON, SQL, API, CLI, TCP, MAC) are fine. The rule targets acronyms that encode a *principle*, *opinion*, or piece of jargon, not those that name a protocol or format.
## Code
### No section-divider comments
Don't add section-divider comments in source files: no `// ---` horizontal rules, no `// ===` banners, no `// -- Label --` headers that announce the next region of a file. The `struct` / `impl` / `class` / `function` definitions already mark structure, and the banner just duplicates that visually.
If a file is large enough that its structure is genuinely hard to follow, split it into submodules or smaller files instead of layering dividers on top. Strip these when touching files that already have them.
Markdown section headers in docs (`## Foo`) are fine. They're the intended way to structure prose.
### No milestone references in code docs
Don't write "for M2", "added in M1", "comes in M3", or similar milestone references in code comments or doc comments (rustdoc, JSDoc, equivalents). Describe what the code currently does or doesn't do, not which roadmap milestone it was written in or will be extended in.
Milestones live in roadmap docs (`TODO.md`, `ROADMAP.md`, equivalents) and are a planning artifact. Pinning them into code docs ties the code to a numbering that will keep shifting as milestones are added, renumbered, or dropped. The code's current behaviour is the durable thing to document. The project-management metadata belongs in roadmap docs.
If future work is worth flagging in a doc comment, say *what* that future work is, not *when* it's scheduled.
## Commits
### Use Conventional Commits
Commit messages follow the Conventional Commits format. Apply this to every new commit you make.
Format:
```
<type>(<optional scope>): <short description>
<optional body explaining the why>
<optional footers, e.g. BREAKING CHANGE: ...>
```
Common types:
- `feat`: a new user-facing capability.
- `fix`: a bug fix.
- `refactor`: code restructuring with no external behaviour change.
- `perf`: a performance-focused change with no behaviour change.
- `docs`: documentation only.
- `test`: test-only changes.
- `build`: build-system, dependency, or configuration changes.
- `chore`: repo housekeeping that doesn't fit above.
- `style`: formatting only (rarely warranted if a formatter runs).
Subject line: imperative, lowercase after the colon, no trailing period, aim for <= 72 chars. Body paragraphs explain the *why*, not the *what* (the diff shows the what).
Scope may use slash-separated subscopes (`fix(parser/lexer)`, `feat(api/auth)`) when the precision adds information about which submodule changed. Flat scopes (`fix(parser)`) are fine for broader changes. Inconsistency between commits is acceptable — subscope depth doesn't need to be uniform.
Breaking changes: append `!` to the type or scope (`feat(api)!: ...`) and include a `BREAKING CHANGE:` footer when the change needs explanation.
Don't retroactively rewrite committed history unless the user explicitly asks.
### No Co-Authored-By Claude line
Don't add `Co-Authored-By: Claude ... <noreply@anthropic.com>` (or any Claude co-author trailer) to commit messages. End the commit with the actual content. The user finds the trailer adds clutter without serving any audience.
## Collaboration
### Treat questions as questions, not directives
When the user asks a clarifying question about something I've done or written ("why did you do X?", "is X needed?", "what about Y?", "won't this cause Z?"), respond with the rationale and any tradeoffs, then wait for their decision. Don't immediately remove or change X based on the question alone.
A question is information-seeking, not an instruction. Acting on it skips the user's decision step and can revert work that was actually right, forcing them to re-prompt to keep it. The user wanted to know *why*, not for me to undo it.
Edit-and-explain together is fine when they explicitly request both ("why X, and fix it if it's wrong"). The rule applies to bare questions.
+21
View File
@@ -0,0 +1,21 @@
{
"$schema": "https://www.schemastore.org/claude-code-keybindings.json",
"$docs": "https://code.claude.com/docs/en/keybindings",
"bindings": [
{
"context": "Global",
"bindings": {
"Ctrl+L": "app:redraw"
}
},
{
"context": "Scroll",
"bindings": {
"Ctrl+B": "scroll:lineUp",
"Ctrl+F": "scroll:lineDown",
"PageUp": "scroll:halfPageUp",
"PageDown": "scroll:halfPageDown"
}
}
]
}
+17
View File
@@ -0,0 +1,17 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"$docs": "https://code.claude.com/docs/en/settings",
"env": {
"ENABLE_CLAUDEAI_MCP_SERVERS": "false",
"CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN": "1"
},
"feedbackSurveyRate": 0,
"effortLevel": "high",
"awaySummaryEnabled": false,
"showClearContextOnPlanAccept": true,
"disableAutoMode": "disable",
"attribution": {
"commit": "",
"pr": ""
}
}
+247
View File
@@ -0,0 +1,247 @@
---
name: audit
description: Run a deep, multi-lens review of existing code state (not a diff). Launches six specialized review agents in parallel - reuse, quality, efficiency, errors, api, bugs - then validates each finding before presenting. Optional scope (`/audit path/ path2/`) and optional lens subset (`/audit --lenses reuse,bugs`). Opt-in lenses for docs, tests, security, a11y, deps. Use when the user asks for a full review, deep review, codebase audit, cleanup pass, retrospective review, tech-debt sweep, or otherwise wants to surface issues across landed code - even if they say "clean up the project" or "look over the repo" without using the word "audit". Do NOT use for reviewing in-flight work (use /simplify), PR review (use /review or /code-review), or security-only review (use /security-review).
---
# /audit: Retrospective multi-lens codebase review
`/simplify` reviews a diff; `/audit` reviews current file state. Use it when issues may have accumulated before a review gate existed, when rolling onto an unfamiliar codebase, or when the user wants a deliberate "what's lurking?" sweep.
## Invocation
```
/audit # whole primary source tree
/audit crates/uitk/src/text/ # one directory
/audit src/auth.rs src/api.rs # specific files
/audit --lenses reuse,bugs # only those lenses
/audit src/foo/ --lenses docs,tests # both scope and lenses
```
If the user invokes `/audit` with no arguments, infer the primary source tree from the project layout (Rust: `crates/*/src/`; TS/JS: `src/` or `packages/*/src/`; Python: the package directory). Ask briefly only if ambiguous.
## Communicating with the user
Phases are internal scaffolding for organizing this skill, not concepts the user needs to track. Do not announce them in user-facing text. No "Phase 3: validating findings before reporting", no "moving on to Phase 5", no "Phase 4 triage complete". Brief, plain progress notes are fine when warranted ("validating findings before reporting", "running the gate"), but they should describe the action, not name a phase.
## Phase 1: Context gather
Before spawning review agents:
1. **Identify scope** from args or inference (see above).
2. **Read `CLAUDE.md`** (project root, plus any in touched directories) and any memory index. Capture project-specific conventions to feed each agent as "do NOT flag these" directives (example: "no em-dashes", "we intentionally keep `cargo test --all-targets` off", "focus state uses two bools deliberately, scheduled for refactor in TODO.md").
3. **Read `TODO.md` / `BACKLOG.md` / equivalents** for items explicitly deferred. Agents must not re-raise known debt.
4. **Identify the gate script** (e.g. `scripts/prepare.sh`, `pnpm check`, `make test`) so fixes can be verified at the end.
All three pieces of context get fed into every agent prompt so they respect the project's existing shape.
## Phase 2: Launch lens agents in parallel
Send a single message with multiple `Agent` tool uses, each `subagent_type: general-purpose`. The default set is six lenses; if `--lenses <list>` was given, run only those (plus any opt-in lenses named in the list).
### Model selection per lens
The `Agent` tool accepts a `model: "sonnet" | "opus" | "haiku"` parameter. Pick deliberately - some lenses are pattern-matching (cheap), others are reasoning-heavy (expensive but worth it).
| lens | model | why |
| ----------------- | -------- | --------------------------------------------------------------------- |
| reuse | sonnet | pattern recognition across files, fits sonnet's strengths |
| quality | sonnet | structural critique, naming, dead code; sonnet is enough |
| efficiency | **opus** | needs reasoning about hot paths, allocations, asymptotic patterns |
| errors | **opus** | control-flow analysis, silent-failure detection wants careful reading |
| api | sonnet | visibility analysis, type design - mostly mechanical |
| bugs | **opus** | correctness reasoning is the place not to skimp |
| docs (opt-in) | haiku | "does the comment still match the code?" - cheap |
| tests (opt-in) | sonnet | gap analysis with semantic context |
| security (opt-in) | **opus** | high-stakes correctness, needs careful reading |
| a11y (opt-in) | sonnet | pattern matching with semantic context |
| deps (opt-in) | haiku | mostly file scanning |
The validation agent in Phase 3 also runs on **opus** - false negatives drop real findings, so this is the wrong place to economize.
These are defaults; if a project's lens is unusually subtle (e.g. obscure embedded language, novel runtime), bump up.
### Default lenses
Each lens prompt must include:
- One-paragraph project summary (language, domain, what the code does).
- The scope: exact file/directory list the agent must read.
- The lens's concrete focus (see below).
- Project conventions to skip (from Phase 1).
- Deferred TODO items to skip (from Phase 1).
- Explicit "skip" list: the other lenses' topics (so findings don't overlap).
- Output format: bulleted findings, each with **file:line** (or range), **the issue** (concrete, one line), **suggested fix** (one line).
- Word cap: 400-700 words per agent. Findings scale with scope, so give bigger caps when auditing whole repos, smaller when auditing a single file.
- "HIGH SIGNAL only. If you are not certain a finding is real, don't flag it. Don't invent findings to fill space. If the area is clean, say so."
#### reuse
Duplicated logic, reinvented std / framework primitives, inline patterns that match an existing helper in the same codebase, inconsistent import paths (e.g. some files use top-level re-exports, others use deep paths). Flag the concrete duplication with file:line of each duplicate site. Don't propose new abstractions where no duplication exists yet.
#### quality
Structural and maintainability issues: redundant state (fields that duplicate each other, derived values cached unnecessarily, bools that encode the same thing as an adjacent enum), leaky abstractions (pub(crate) fields poked directly when a method would be cleaner), stringly-typed code, parameter sprawl, unnecessary comments (especially WHAT-not-WHY narration, section dividers, PR/commit/task references in code), nested conditionals 3+ levels deep that could flatten, dead code, brittle test fixtures. Skip anything a linter/formatter would catch - the gate handles those.
#### efficiency
Hot-path bloat (anything that runs per-frame / per-event / per-request / per-render): redundant allocations, repeated hashmap lookups, multiple tree walks where one would do, reconstructing immutable objects every call. Recurring no-op updates (state writes that trigger downstream invalidation even when the value didn't change). Unbounded growth in caches or maps. Overly broad operations (scanning entire collections to find one thing). Note "hot path" context per project - for GUI/game code it's paint/layout/event loops; for servers it's request handlers; for data pipelines it's per-record transforms.
#### errors
Error-handling hygiene. Silent failures (catch/Result discarded, unwrap/expect on fallible ops that could surface meaningful errors), inconsistent error propagation patterns within one codebase, `expect("...")` messages that don't explain why, panic locations that could be Result returns, missing error context at boundaries. Inspired by Anthropic's `silent-failure-hunter` agent.
#### api
Public API surface appropriateness. `pub` on items that could be `pub(crate)` (check whether external callers exist), missing `#[non_exhaustive]` on enums that will grow, doc-commented-but-private items (doc comment misplaced), trait methods with confusing defaults, constructors/builders inconsistent with the rest of the crate. Type design: invariants expressed via state instead of type (e.g. a pair of Option + bool that could be an enum). Inspired by Anthropic's `type-design-analyzer`.
#### bugs
Correctness issues: logic errors, off-by-one, missing bounds checks, wrong condition in if, incorrect loop termination, type confusion that compiles but is wrong, borrow patterns that compile but violate invariants (lifetimes too permissive / not permissive enough). Only flag with high confidence - "this might be wrong depending on inputs" is NOT a finding. Include language-specific bug profiles: Rust bugs often involve lifetimes/Send/Sync; JS/TS bugs often involve null/undefined, async Promise lifetimes, reference equality mistakes.
### Opt-in lenses
Enabled only via explicit `--lenses` containing their name.
#### docs
Public items without doc comments. Stale / rotted comments (code has moved on, comment hasn't). Outdated examples in doc comments. Missing module-level docs on non-trivial modules. Inspired by Anthropic's `comment-analyzer`.
#### tests
Coverage gaps (public API without tests), brittle fixtures (parallel arrays that should be tuples, over-complex setup), test-only code leaking into production, missing edge case assertions (empty input, single element, boundary values), assertions that don't match their descriptions. Inspired by Anthropic's `pr-test-analyzer`.
#### security
Common vulnerability patterns for the project type: injection (SQL / shell / template), hardcoded secrets, unsafe deserialization, missing input validation at trust boundaries, auth/session flaws, path traversal. Skip entirely for projects with no security surface (pure algorithm libraries, graphics code, offline tools).
#### a11y
UI accessibility: missing labels on inputs / buttons, colour-only signalling, tabindex / focus management, screen reader compatibility, keyboard-only navigation support. Only meaningful for UI-layer code.
#### deps
Dependency hygiene: duplicate deps at different versions, unused deps, feature flags that enable more than needed, dev-deps used in production code paths.
## Phase 3: Validation pass
Once lens agents return, do NOT present findings to the user yet. Launch a single validation agent with all raw findings as input:
> "Each finding below was flagged by a lens agent. For each one, confirm independently whether it's real by reading the referenced file(s) and the surrounding context. Classify each as: **confirmed** (high-confidence real issue), **misfire** (wrong reading of the code, semantics differ from what the agent thought), or **context-dependent** (real only under unstated assumptions - treat as misfire). Return the confirmed list, with the reasoning for any misfires you're dropping so the aggregator can double-check."
This mirrors the confidence-scoring approach in Anthropic's `/code-review`. Misfires are noisy; validation keeps signal high.
Skip validation only if the raw finding count is ≤3 and each one is obviously right (saves tokens when the audit turns up almost nothing).
## Phase 4: Triage
Classify each confirmed finding into one of four tiers:
- **Trivial fix** - small local change, clear improvement, no judgment call (e.g. "use existing helper at file.rs:42 instead of inline arithmetic").
- **Substantive fix** - real value, more than a few lines, clear scope (e.g. "merge two near-duplicate functions into one walker").
- **Needs discussion** - chunky refactor, public API change, enum redesign, hot-path caching with lifetime gymnastics. Outcome shouldn't be assumed.
- **Backlog item** - real but larger than cleanup. Should land in `TODO.md` (or equivalent) so it's not lost.
This phase is **classification only**. Do NOT apply any fixes here, do NOT edit `TODO.md` here. Recording happens in the next phase, after the user has seen the proposed plan.
## Phase 5: Report and apply tier by tier
Don't dump every tier at once. The user shouldn't have to scroll back through a wall of findings to track decisions. Walk through one tier at a time: present, get approval, apply, commit, gate, then move to the next.
### Set up internal tracking
Before presenting anything, use `TaskCreate` to record one task per non-empty tier in the order below. The full finding set lives in those tasks, so you can hold detail internally and surface only the active tier to the user. Mark each tier's task complete as you finish it.
### Tier order
1. **Suggested backlog additions** - lock these in first. A single `TODO.md` append is cheap and ensures nothing is lost if a later code change goes sideways.
2. **Trivial fixes** - grouped by theme (e.g. "use existing helpers", "drop dead code"), one commit per theme.
3. **Substantive fixes** - one commit per logical change. Commit message explains the why.
4. **Needs discussion** - present each as: issue, two options, tradeoff. Apply only if the user gives specific direction.
Skip any tier that has zero items.
### Opening the report
Only on the first non-empty tier, lead with a single summary line:
```
## Audit findings
Ran <N> lens(es) over <scope>. <K> raw findings, <V> confirmed. Working through them one tier at a time.
```
If there's a useful cross-cutting observation, mention it in one line here. Don't pad.
### Format per tier
Items are **numbered 1..N within the tier**, resetting each tier so the user can say "skip 2 and 5" without ambiguity.
```
### <Tier name> (<count>)
1. file.rs:42 - <issue>. Fix: <one-line change>.
2. file.rs:88 - <issue>. Fix: <one-line change>.
3. ...
Ready to apply? "Go ahead" for all, or tell me which numbers to skip.
```
For **Needs discussion**, expand each item:
```
### Needs discussion (<count>)
1. file.rs:220 - <issue>.
- Option a: <option>
- Option b: <option>
- Tradeoff: <one line>
2. ...
```
Stop after presenting a tier and wait for the user. They may:
- Approve all in the tier ("go ahead").
- Skip specific numbers ("skip 2 and 5, apply the rest").
- Reject the whole tier.
- Ask for more detail on a specific number before deciding.
Match their direction precisely. Don't slip auto-applied items past their stated scope.
### After approval, before the next tier
1. Apply the approved items in the current tier.
2. Commit per the tier's rule (one commit for the backlog append, one per theme for trivials, one per logical change for substantives).
3. Run the project's gate (`scripts/prepare.sh` / `pnpm check` / etc.). If it fails, fix the underlying issue rather than reverting or bypassing.
4. Mark the tier's task complete.
5. Present the next non-empty tier the same way.
### Public-API guard
A generic "go ahead" on Trivial or Substantive does NOT extend to items that touch public API surface (`pub` items, exported types, breaking signature changes). If such an item is sitting in those tiers, lift it into Needs discussion before presenting, so it gets explicit attention.
### Closing
After the final tier, give a brief summary: what was applied, what was backlogged, what's still open. If items got dropped during discussion, note them so the user can confirm the bookkeeping.
## Do not
- **Edit any file before the user has approved the active tier.** This includes `TODO.md` and any code file. Validation is the last automatic step. Everything after waits on per-tier go-ahead.
- Dump every tier at once or rely on a single big report. Walk tier by tier so the user only has to track one decision at a time.
- Surface phase numbers/names to the user. Phases are scaffolding for this skill, not vocabulary the user should have to learn.
- Auto-apply changes that affect public API surface even after a generic "go ahead". If a finding touches `pub` items, lift it into the Needs discussion tier before presenting.
- Reference the audit run itself in commit titles or bodies (no "from audit", "audit cleanup", "via /audit", "found by audit"). Commits should describe the change, not how it surfaced. The audit is the trigger, not the subject.
- Stack findings from multiple lenses into one commit without clear grouping.
- Invent findings to fill space if a lens comes up empty. "Nothing to flag" is a valid outcome and should be reported as such.
- Re-raise items already in `TODO.md` / `BACKLOG.md`.
- Run `/audit` against a codebase that was just audited - diminishing returns.
## Parallelism note
All lens agents run in parallel (single message, multiple `Agent` tool uses). Six agents is the upper bound where parallelism still pays; above that, coordination overhead catches up. Keep opt-in lenses opt-in for this reason - running all 11 in parallel would be wasteful for most projects.
## When NOT to use this skill
- **Reviewing in-flight work** → `/simplify` against the diff.
- **PR review** → `/review` (built-in) or `/code-review:code-review` if that plugin is installed.
- **Security-only audit of a diff** → `/security-review`.
- **Back-to-back on the same code** → re-runs produce sharply diminishing returns.
+16
View File
@@ -0,0 +1,16 @@
model = "gpt-5.4"
model_reasoning_effort = "xhigh"
check_for_update_on_startup = false
approval_policy = "on-request"
sandbox_mode = "read-only"
allow_login_shell = false
web_search = "cached"
[features]
use_linux_sandbox_bwrap = true
[tui]
alternate_screen = "never"
[notice]
hide_rate_limit_model_nudge = true
+4 -5
View File
@@ -20,10 +20,9 @@ dynamic_padding = false
dynamic_title = false dynamic_title = false
title = "Terminal" title = "Terminal"
[window.dimensions] # [window.dimensions]
columns = 120 # columns = 120
lines = 45 # lines = 45
[window.padding] [window.padding]
x = 10 x = 3
y = 7
+5 -3
View File
@@ -7,6 +7,11 @@ update_info=dolphin_detailsmodesettings.upd:rename-leading-padding,dolphin_detai
ExpandableFolders=false ExpandableFolders=false
PreviewSize=16 PreviewSize=16
[ExtractDialog]
2 screens: Height=720
2 screens: Width=1576
DirHistory[$e]=$HOME/Downloads/protondrive/
[General] [General]
EditableUrl=true EditableUrl=true
OpenExternallyCalledFolderInNewTab=true OpenExternallyCalledFolderInNewTab=true
@@ -15,9 +20,6 @@ ShowStatusBar=FullWidth
Version=202 Version=202
ViewPropsTimestamp=2024,8,26,16,47,20.342 ViewPropsTimestamp=2024,8,26,16,47,20.342
[InformationPanel]
dateFormat=ShortFormat
[KFileDialog Settings] [KFileDialog Settings]
Places Icons Auto-resize=false Places Icons Auto-resize=false
Places Icons Static Size=22 Places Icons Static Size=22
-65
View File
@@ -1,65 +0,0 @@
# For documentation on these options, see `man fnott.ini`
# Global values
# output=<undefined>#
# min-width=0
max-width=400
# max-height=0
# stacking-order=bottom-up
# anchor=top-right
# edge-margin-vertical=10
# edge-margin-horizontal=10
# notification-margin=10
# icon-theme=hicolor
# max-icon-size=32
# selection-helper=dmenu
# selection-helper-uses-null-separator=no
# play-sound=aplay ${filename}
# Default values, may be overridden in 'urgency' specific sections
# layer=top
background=1f2329ff
border-color=595959aa
border-radius=8
border-size=1
# padding-vertical=20
# padding-horizontal=20
# dpi-aware=no
# title-font=sans serif
# title-color=ffffffff
# title-format=<i>%a%A</i>
# summary-font=sans serif
# summary-color=ffffffff
# summary-format=<b>%s</b>\n
# body-font=sans serif
# body-color=ffffffff
# body-format=%b
# progress-bar-height=20
# progress-color=ffffffff
# progress-style=bar
# sound-file=
# icon=
# Timeout values are in seconds. 0 to disable
# max-timeout=0
default-timeout=5
idle-timeout=300
# [low]
# background=2b2b2bff
# title-color=888888ff
# summary-color=888888ff
# body-color=888888ff
# [normal]
# [critical]
# background=6c3333ff
+11
View File
@@ -0,0 +1,11 @@
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<alias>
<family>monospace</family>
<prefer>
<family>Symbols Nerd Font Mono</family>
</prefer>
</alias>
<dir>~/.local/share/fonts</dir>
</fontconfig>
+24 -28
View File
@@ -1,44 +1,40 @@
# See: man 5 foot.ini # See: man 5 foot.ini
term=foot term=foot
font=Iosevka Custom:style=Regular:size=12 font=Iosevka Custom:size=11
initial-window-size-chars=179x60
pad=5x5 center
title=Terminal title=Terminal
locked-title=yes locked-title=yes
[cursor] [bell]
color=080808 9e9e9e system=no
[mouse] [mouse]
hide-when-typing=yes hide-when-typing=yes
[colors] [colors-dark]
background=080808 background=1f2329
foreground=bdbdbd foreground=a0a8b7
cursor=1f2329 a0a8b7
scrollback-indicator=1f2329 a0a8b7
# Normal/regular colors (color palette 0-7) # Normal/regular colors (color palette 0-7)
regular0=323437 # black regular0=181a1f # black
regular1=ff5454 # red regular1=e55561 # red
regular2=8cc85f # green regular2=8ebd6b # green
regular3=e3c78a # yellow regular3=e2b86b # yellow
regular4=80a0ff # blue regular4=4fa6ed # blue
regular5=cf87e8 # magenta regular5=bf68d9 # magenta
regular6=79dac8 # cyan regular6=48b0bd # cyan
regular7=c6c6c6 # white regular7=a0a8b7 # white
# Bright colors (color palette 8-15) # Bright colors (color palette 8-15)
bright0=949494 # bright black bright0=5c6370 # bright black
bright1=ff5189 # bright red bright1=e86671 # bright red
bright2=36c692 # bright green bright2=98c379 # bright green
bright3=c2c292 # bright yellow bright3=e5c07b # bright yellow
bright4=74b2ff # bright blue bright4=61afef # bright blue
bright5=ae81ff # bright magenta bright5=c678dd # bright magenta
bright6=85dc85 # bright cyan bright6=56b6c2 # bright cyan
bright7=e4e4e4 # bright white bright7=abb2bf # bright white
# Misc colors
selection-foreground=080808
selection-background=b2ceee
# vim: ft=dosini # vim: ft=dosini
+15 -5
View File
@@ -8,10 +8,10 @@ _distro="Arch"
# Kernel Version # Kernel Version
# Accepts # Accepts
# - "x.y-latest" to pick latest kernel from the x.y series (e.g. "6.13-latest") # - "x.y-latest" to pick latest kernel from the x.y series (e.g. "6.13-latest")
# - Tags, e.g. "6.0-rc4" or "5.10.51" # - git tags, e.g. "v6.0-rc4" or "v5.10.51"
# - Note: Patches may fail as they may only apply to newer trees. # - Note: Patches may fail as they may only apply to newer trees.
# If left empty, the script will prompt # If left empty, the script will prompt
_version="6.15-latest" _version="6.18-latest"
#### MISC OPTIONS #### #### MISC OPTIONS ####
@@ -100,7 +100,10 @@ _configfile=""
# Determine whether to call "olddefconfig" (default) or "oldconfig" for manual config updating interaction. # Determine whether to call "olddefconfig" (default) or "oldconfig" for manual config updating interaction.
_config_updating="olddefconfig" _config_updating="olddefconfig"
# Disable some non-module debugging - See PKGBUILD for the list # Aggressively disable kernel debugging features
# Note:
# - if you encounter issues, test with this setting disabled first, then open a bug report on what necessary feature was disabled
# - search '_debugdisable' in linux-tkg-config/prepare for the list of disabled CONFIG entries
_debugdisable="false" _debugdisable="false"
# Strip the kernel and its modules from debug symbols # Strip the kernel and its modules from debug symbols
@@ -119,7 +122,7 @@ _compiler="gcc"
# [Generic and Gentoo specific] Replace `libunwind` with `llvm-libunwind`. # [Generic and Gentoo specific] Replace `libunwind` with `llvm-libunwind`.
# ! This is currently experimental. # ! This is currently experimental.
# ! It can only work with the `llvm-libunwind` `USE` flag in `sys-devel/clang-common` for Gentoo. # ! It can only work with the `llvm-libunwind` `USE` flag in `llvm-core/clang-common` for Gentoo.
# Set to "true" to enable. # Set to "true" to enable.
_libunwind_replace="" _libunwind_replace=""
@@ -163,7 +166,10 @@ _sched_yield_type=""
# Set to "1" for 2ms, "2" for 4ms, "3" for 6ms, "4" for 8ms, or "default" to keep the chosen scheduler defaults. # Set to "1" for 2ms, "2" for 4ms, "3" for 6ms, "4" for 8ms, or "default" to keep the chosen scheduler defaults.
_rr_interval="default" _rr_interval="default"
# Set to "true" to disable FUNCTION_TRACER/GRAPH_TRACER, lowering overhead but limiting debugging and analyzing of kernel functions - Kernel default is "false" # Set to "true" to disable FTRACE, lowering overhead but limiting debugging and analyzing of kernel functions - Kernel default is "false"
# Notes:
# - May break many things, as it disables many child config options (FUNCTION_TRACER, GRAPH_TRACER, FBROBE, STACK TRACER...)
# - Prevents sched-ext LAVD from properly working, see https://github.com/sched-ext/scx/blob/main/kernel.config#L19
_ftracedisable="false" _ftracedisable="false"
# Set to "true" to disable NUMA, lowering overhead, but breaking CUDA/NvEnc on Nvidia equipped systems - Kernel default is "false" # Set to "true" to disable NUMA, lowering overhead, but breaking CUDA/NvEnc on Nvidia equipped systems - Kernel default is "false"
@@ -236,6 +242,10 @@ _openrgb="true"
#### SPESHUL OPTION #### #### SPESHUL OPTION ####
# Do not query nor fetch kernel sources from git remotes on the internet.
# Only use the kernel versions that have already been fetched in the $_kernel_source_folder
_offline=""
# [Arch only] If you want to bypass the stock naming scheme and enforce something else (example : "linux") - Useful for some bootloaders requiring manual entry editing on each release. # [Arch only] If you want to bypass the stock naming scheme and enforce something else (example : "linux") - Useful for some bootloaders requiring manual entry editing on each release.
# !!! It will also change pkgname - If you don't explicitely need this, don't use it !!! # !!! It will also change pkgname - If you don't explicitely need this, don't use it !!!
# Use _kernel_localversion instead on non-Arch based distros # Use _kernel_localversion instead on non-Arch based distros
+1 -3
View File
@@ -2,13 +2,11 @@ font-family = Iosevka Custom
font-style = Regular font-style = Regular
font-synthetic-style = false font-synthetic-style = false
font-size = 12 font-size = 12
theme = moonfly-ghostty.conf theme = onedarker.conf
shell-integration-features = no-cursor shell-integration-features = no-cursor
cursor-style = block cursor-style = block
mouse-hide-while-typing = true mouse-hide-while-typing = true
title = Terminal title = Terminal
window-width = 179
window-height = 60
window-padding-x = 2 window-padding-x = 2
window-padding-y = 1 window-padding-y = 1
window-decoration = server window-decoration = server
+23
View File
@@ -0,0 +1,23 @@
palette = 0=#181a1f
palette = 1=#e55561
palette = 2=#8ebd6b
palette = 3=#e2b86b
palette = 4=#4fa6ed
palette = 5=#bf68d9
palette = 6=#48b0bd
palette = 7=#a0a8b7
palette = 8=#5c6370
palette = 9=#e86671
palette = 10=#98c379
palette = 11=#e5c07b
palette = 12=#61afef
palette = 13=#c678dd
palette = 14=#56b6c2
palette = 15=#abb2bf
background = #1f2329
foreground = #a0a8b7
cursor-color = #a0a8b7
cursor-text = #1f2329
selection-background = #282c34
selection-foreground = #a0a8b7
+3 -1
View File
@@ -1,3 +1,5 @@
[Settings] [Settings]
gtk-application-prefer-dark-theme=1
gtk-theme-name=Adwaita gtk-theme-name=Adwaita
[AdwStyleManager]
color-scheme=ADW_COLOR_SCHEME_PREFER_DARK
-36
View File
@@ -1,36 +0,0 @@
# for more configuration options, refer https://wiki.hyprland.org/Hypr-Ecosystem/hypridle
general {
lock_cmd = pidof hyprlock || uwsm app -- hyprlock # avoid starting multiple hyprlock instances.
before_sleep_cmd = loginctl lock-session # lock before suspend.
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
}
# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
listener {
timeout = 150 # 2.5min.
on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight.
on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight.
}
listener {
timeout = 1500 # 25min.
on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = brightnessctl -r # monitor backlight restore.
}
listener {
timeout = 1800 # 30min.
on-timeout = loginctl lock-session # lock screen when timeout has passed.
}
listener {
timeout = 2100 # 35min.
on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed.
on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired.
}
# listener {
# timeout = 1800 # 30min.
# on-timeout = systemctl suspend # suspend pc.
# }
-329
View File
@@ -1,329 +0,0 @@
# This is an example Hyprland config file.
# Refer to the wiki for more information.
# https://wiki.hypr.land/Configuring/
# Please note not all available settings / options are set here.
# For a full list, see the wiki
# You can split this configuration into multiple files
# Create your files separately and then link them to this file like this:
# source = ~/.config/hypr/myColors.conf
################
### MONITORS ###
################
# See https://wiki.hypr.land/Configuring/Monitors/
monitor=,preferred,auto,1.0
#################
### AUTOSTART ###
#################
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
exec-once = systemctl --user start hypridle.service
exec-once = systemctl --user start hyprpolkitagent.service
exec-once = uwsm app -- fnott
exec-once = uwsm app -- waybar
exec-once = uwsm app -- pasystray
###################
### PERMISSIONS ###
###################
# See https://wiki.hypr.land/Configuring/Permissions/
# Please note permission changes here require a Hyprland restart and are not applied on-the-fly
# for security reasons
# ecosystem {
# enforce_permissions = 1
# }
# permission = /usr/(bin|local/bin)/grim, screencopy, allow
permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow
#####################
### LOOK AND FEEL ###
#####################
# Refer to https://wiki.hypr.land/Configuring/Variables/
# https://wiki.hypr.land/Configuring/Variables/#general
general {
gaps_in = 10
gaps_out = 20
border_size = 1
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
# col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
col.active_border = rgba(a0a8b7ff)
# col.active_border = rgba(ffffffaa)
col.inactive_border = rgba(595959aa)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
# https://wiki.hypr.land/Configuring/Variables/#decoration
decoration {
rounding = 10
rounding_power = 2
# Change transparency of focused and unfocused windows
active_opacity = 1.0
inactive_opacity = 1.0
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(1a1a1aee)
}
# https://wiki.hypr.land/Configuring/Variables/#blur
blur {
enabled = true
size = 3
passes = 1
vibrancy = 0.1696
}
}
# https://wiki.hypr.land/Configuring/Variables/#animations
animations {
enabled = true
# Default animations, see https://wiki.hypr.land/Configuring/Animations/ for more
bezier = easeOutQuint,0.23,1,0.32,1
bezier = easeInOutCubic,0.65,0.05,0.36,1
bezier = linear,0,0,1,1
bezier = almostLinear,0.5,0.5,0.75,1.0
bezier = quick,0.15,0,0.1,1
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
animation = windows, 1, 4.79, easeOutQuint
animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1.49, linear, popin 87%
animation = fadeIn, 1, 1.73, almostLinear
animation = fadeOut, 1, 1.46, almostLinear
animation = fade, 1, 3.03, quick
animation = layers, 1, 3.81, easeOutQuint
animation = layersIn, 1, 4, easeOutQuint, fade
animation = layersOut, 1, 1.5, linear, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 1, 1.94, almostLinear, fade
animation = workspacesIn, 1, 1.21, almostLinear, fade
animation = workspacesOut, 1, 1.94, almostLinear, fade
}
# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/
# "Smart gaps" / "No gaps when only"
# uncomment all if you wish to use that.
workspace = w[tv1], gapsout:0, gapsin:0
workspace = f[1], gapsout:0, gapsin:0
windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
windowrule = rounding 0, floating:0, onworkspace:w[tv1]
windowrule = bordersize 0, floating:0, onworkspace:f[1]
windowrule = rounding 0, floating:0, onworkspace:f[1]
# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more
dwindle {
pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = true # You probably want this
force_split = 2
}
# See https://wiki.hypr.land/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hypr.land/Configuring/Variables/#misc
misc {
force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
}
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = eu
kb_variant =
kb_model =
kb_options =
kb_rules =
accel_profile = flat
follow_mouse = 2
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = true
}
}
cursor {
no_warps = true
}
# https://wiki.hypr.land/Configuring/Variables/#gestures
gestures {
workspace_swipe = false
}
# Example per-device config
# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more
# device {
# name = epic-mouse-v1
# sensitivity = -0.5
# }
###################
### KEYBINDINGS ###
###################
$mod = SUPER
# General
bind = $mod, Return, exec, uwsm app -- Alacritty.desktop
bind = $mod, E, exec, uwsm app -- org.gnome.Nautilus.desktop
bind = $mod, D, exec, rofi -show drun
bind = $mod, F2, exec, rofi -show run
bind = $mod, W, togglegroup, # dwindle
bind = $mod, slash, togglesplit, # dwindle
bind = $mod SHIFT, Q, killactive,
bind = $mod SHIFT, X, exec, uwsm stop
bind = $mod SHIFT, Space, togglefloating,
bind = $mod, F, fullscreen, 1
bind = $mod SHIFT, F, fullscreen, 0
# Change focus
bind = $mod, H, movefocus, l
bind = $mod, L, movefocus, r
bind = $mod, K, movefocus, u
bind = $mod, J, movefocus, d
bind = $mod, N, changegroupactive, f
bind = $mod, P, changegroupactive, b
bind = $mod CTRL, L, focusmonitor, r
bind = $mod CTRL, H, focusmonitor, l
# Move window
bind = $mod SHIFT, H, movewindoworgroup, l
bind = $mod SHIFT, L, movewindoworgroup, r
bind = $mod SHIFT, K, movewindoworgroup, u
bind = $mod SHIFT, J, movewindoworgroup, d
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mod SHIFT, 1, movetoworkspacesilent, 1
bind = $mod SHIFT, 2, movetoworkspacesilent, 2
bind = $mod SHIFT, 3, movetoworkspacesilent, 3
bind = $mod SHIFT, 4, movetoworkspacesilent, 4
bind = $mod SHIFT, 5, movetoworkspacesilent, 5
bind = $mod SHIFT, 6, movetoworkspacesilent, 6
bind = $mod SHIFT, 7, movetoworkspacesilent, 7
bind = $mod SHIFT, 8, movetoworkspacesilent, 8
bind = $mod SHIFT, 9, movetoworkspacesilent, 9
bind = $mod SHIFT, 0, movetoworkspacesilent, 10
# Move current workspace
bind = $mod CTRL SHIFT, L, movecurrentworkspacetomonitor, r
bind = $mod CTRL SHIFT, H, movecurrentworkspacetomonitor, l
# Resize
bind = $mod SHIFT, R, submap, resize
submap = resize
bind = , H, resizeactive, -10 0
bind = , L, resizeactive, 10 0
bind = , K, resizeactive, 0 -10
bind = , J, resizeactive, 0 10
bind = SHIFT, H, resizeactive, -50 0
bind = SHIFT, L, resizeactive, 50 0
bind = SHIFT, K, resizeactive, 0 -50
bind = SHIFT, J, resizeactive, 0 50
bind = , R, splitratio, exact 1.0
bind = , Return, submap, reset
bind = , Escape, submap, reset
submap = reset
# Switch workspaces with mainMod + [0-9]
bind = $mod, 1, workspace, 1
bind = $mod, 2, workspace, 2
bind = $mod, 3, workspace, 3
bind = $mod, 4, workspace, 4
bind = $mod, 5, workspace, 5
bind = $mod, 6, workspace, 6
bind = $mod, 7, workspace, 7
bind = $mod, 8, workspace, 8
bind = $mod, 9, workspace, 9
bind = $mod, 0, workspace, 10
# Special workspace (scratchpad)
bind = $mod, S, togglespecialworkspace, magic
bind = $mod SHIFT, S, movetoworkspace, special:magic
# Scroll through existing workspaces
bind = $mod, Tab, workspace, m+1
bind = $mod SHIFT, Tab, workspace, m-1
bind = ALT, Tab, workspace, previous_per_monitor
bind = $mod, Right, focusmonitor, r
bind = $mod, Left, focusmonitor, l
# Move/resize windows with mad + LMB/RMB and dragging
bindm = $mod, mouse:272, movewindow
bindm = $mod, mouse:273, resizewindow
# Laptop multimedia keys for volume and LCD brightness
bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
# Reload
bind = $mod, R, exec, hyperctl reload
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hypr.land/Configuring/Window-Rules/ for more
# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
# Example windowrule
# windowrule = float,class:^(kitty)$,title:^(kitty)$
# Ignore maximize requests from apps. You'll probably like this.
windowrule = suppressevent maximize, class:.*
# Fix some dragging issues with XWayland
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
-92
View File
@@ -1,92 +0,0 @@
# for more configuration options, refer https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock
#
# rendered text in all widgets supports pango markup (e.g. <b> or <i> tags)
# ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#general-remarks
#
# shortcuts to clear password buffer: ESC, Ctrl+U, Ctrl+Backspace
#
$font = Monospace
general {
hide_cursor = true
}
# uncomment to enable fingerprint authentication
# auth {
# fingerprint {
# enabled = true
# ready_message = Scan fingerprint to unlock
# present_message = Scanning...
# retry_delay = 250 # in milliseconds
# }
# }
animations {
enabled = true
bezier = linear, 1, 1, 0, 0
animation = fadeIn, 1, 5, linear
animation = fadeOut, 1, 5, linear
animation = inputFieldDots, 1, 2, linear
}
background {
monitor =
path = screenshot
blur_passes = 3
}
input-field {
monitor =
size = 20%, 5%
outline_thickness = 3
inner_color = rgba(0, 0, 0, 0.0) # no fill
outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg
check_color = rgba(00ff99ee) rgba(ff6633ee) 120deg
fail_color = rgba(ff6633ee) rgba(ff0066ee) 40deg
font_color = rgb(143, 143, 143)
fade_on_empty = false
rounding = 15
font_family = $font
placeholder_text = Input password...
fail_text = $PAMFAIL
# uncomment to use a letter instead of a dot to indicate the typed password
# dots_text_format = *
# dots_size = 0.4
dots_spacing = 0.3
# uncomment to use an input indicator that does not show the password length (similar to swaylock's input indicator)
# hide_input = true
position = 0, -20
halign = center
valign = center
}
# TIME
label {
monitor =
text = $TIME # ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#variable-substitution
font_size = 90
font_family = $font
position = -30, 0
halign = right
valign = top
}
# DATE
label {
monitor =
text = cmd[update:60000] date +"%A, %d %B %Y" # update every 60 seconds
font_size = 25
font_family = $font
position = -30, -150
halign = right
valign = top
}
-40
View File
@@ -1,47 +1,7 @@
# vim: set ft=dosini:
[Default Applications] [Default Applications]
application/json=org.kde.kwrite.desktop; application/json=org.kde.kwrite.desktop;
application/pdf=firefox.desktop;
application/x-docbook+xml=org.kde.kwrite.desktop; application/x-docbook+xml=org.kde.kwrite.desktop;
application/x-matroska=mpv.desktop;
application/x-yaml=org.kde.kwrite.desktop; application/x-yaml=org.kde.kwrite.desktop;
image/bmp=org.xfce.ristretto.desktop;
image/jpeg=org.xfce.ristretto.desktop;
image/png=org.xfce.ristretto.desktop;
text/markdown=org.kde.kwrite.desktop; text/markdown=org.kde.kwrite.desktop;
text/plain=org.kde.kwrite.desktop; text/plain=org.kde.kwrite.desktop;
text/x-cmake=org.kde.kwrite.desktop; text/x-cmake=org.kde.kwrite.desktop;
video/3gp=mpv.desktop;
video/3gpp=mpv.desktop;
video/3gpp2=mpv.desktop;
video/avi=mpv.desktop;
video/divx=mpv.desktop;
video/dv=mpv.desktop;
video/fli=mpv.desktop;
video/flv=mpv.desktop;
video/mp2t=mpv.desktop;
video/mp4=mpv.desktop;
video/mp4v-es=mpv.desktop;
video/mpeg=mpv.desktop;
video/msvideo=mpv.desktop;
video/ogg=mpv.desktop;
video/quicktime=mpv.desktop;
video/vnd.divx=mpv.desktop;
video/vnd.mpegurl=mpv.desktop;
video/vnd.rn-realvideo=mpv.desktop;
video/webm=mpv.desktop;
video/x-avi=mpv.desktop;
video/x-flv=mpv.desktop;
video/x-m4v=mpv.desktop;
video/x-matroska=mpv.desktop;
video/x-mpeg2=mpv.desktop;
video/x-ms-asf=mpv.desktop;
video/x-ms-wmv=mpv.desktop;
video/x-ms-wmx=mpv.desktop;
video/x-msvideo=mpv.desktop;
video/x-ogm=mpv.desktop;
video/x-ogm+ogg=mpv.desktop;
video/x-theora=mpv.desktop;
video/x-theora+ogg=mpv.desktop;
x-scheme-handler/http=firefox.desktop;
x-scheme-handler/https=firefox.desktop;
-152
View File
@@ -1,152 +0,0 @@
[ColorEffects:Disabled]
ChangeSelectionColor=
Color=56,56,56
ColorAmount=0
ColorEffect=0
ContrastAmount=0.65
ContrastEffect=1
Enable=
IntensityAmount=0.1
IntensityEffect=2
[ColorEffects:Inactive]
ChangeSelectionColor=true
Color=112,111,110
ColorAmount=0.025
ColorEffect=2
ContrastAmount=0.1
ContrastEffect=2
Enable=false
IntensityAmount=0
IntensityEffect=0
[Colors:Button]
BackgroundAlternate=30,87,116
BackgroundNormal=41,44,48
DecorationFocus=61,174,233
DecorationHover=61,174,233
ForegroundActive=61,174,233
ForegroundInactive=161,169,177
ForegroundLink=29,153,243
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=252,252,252
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Complementary]
BackgroundAlternate=30,87,116
BackgroundNormal=32,35,38
DecorationFocus=61,174,233
DecorationHover=61,174,233
ForegroundActive=61,174,233
ForegroundInactive=161,169,177
ForegroundLink=29,153,243
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=252,252,252
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Header]
BackgroundAlternate=32,35,38
BackgroundNormal=41,44,48
DecorationFocus=61,174,233
DecorationHover=61,174,233
ForegroundActive=61,174,233
ForegroundInactive=161,169,177
ForegroundLink=29,153,243
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=252,252,252
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Header][Inactive]
BackgroundAlternate=41,44,48
BackgroundNormal=32,35,38
DecorationFocus=61,174,233
DecorationHover=61,174,233
ForegroundActive=61,174,233
ForegroundInactive=161,169,177
ForegroundLink=29,153,243
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=252,252,252
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Selection]
BackgroundAlternate=30,87,116
BackgroundNormal=61,174,233
DecorationFocus=61,174,233
DecorationHover=61,174,233
ForegroundActive=252,252,252
ForegroundInactive=161,169,177
ForegroundLink=253,188,75
ForegroundNegative=176,55,69
ForegroundNeutral=198,92,0
ForegroundNormal=252,252,252
ForegroundPositive=23,104,57
ForegroundVisited=155,89,182
[Colors:Tooltip]
BackgroundAlternate=32,35,38
BackgroundNormal=41,44,48
DecorationFocus=61,174,233
DecorationHover=61,174,233
ForegroundActive=61,174,233
ForegroundInactive=161,169,177
ForegroundLink=29,153,243
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=252,252,252
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:View]
BackgroundAlternate=29,31,34
BackgroundNormal=20,22,24
DecorationFocus=61,174,233
DecorationHover=61,174,233
ForegroundActive=61,174,233
ForegroundInactive=161,169,177
ForegroundLink=29,153,243
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=252,252,252
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Window]
BackgroundAlternate=41,44,48
BackgroundNormal=32,35,38
DecorationFocus=61,174,233
DecorationHover=61,174,233
ForegroundActive=61,174,233
ForegroundInactive=161,169,177
ForegroundLink=29,153,243
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=252,252,252
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[General]
ColorSchemeHash=8ff306d9a93379c74540e00506966df24df1798b
[KDE]
LookAndFeelPackage=org.kde.breezedark.desktop
ShowDeleteCommand=false
[PreviewSettings]
EnableRemoteFolderThumbnail=false
MaximumRemoteSize=0
[WM]
activeBackground=39,44,49
activeBlend=252,252,252
activeForeground=252,252,252
inactiveBackground=32,36,40
inactiveBlend=161,169,177
inactiveForeground=161,169,177
+69 -35
View File
@@ -40,16 +40,26 @@ stop=none,none,Stop
stop_after_current=Meta+Shift+V,Meta+Shift+V,Stop after current Track stop_after_current=Meta+Shift+V,Meta+Shift+V,Stop after current Track
toggleMainWindow=none,none,Toggle Main Window toggleMainWindow=none,none,Toggle Main Window
[com.google.Chrome]
EA4407DAD5FBC76D7D67E9CD18A2654B-autofill_card=none,none,Autofill the last used card for the current website
EA4407DAD5FBC76D7D67E9CD18A2654B-autofill_identity=none,none,Autofill the last used identity for the current website
EA4407DAD5FBC76D7D67E9CD18A2654B-autofill_login=none,none,Autofill the last used login for the current website
EA4407DAD5FBC76D7D67E9CD18A2654B-generate_password=none,none,Generate and copy a new random password to the clipboard
EA4407DAD5FBC76D7D67E9CD18A2654B-lock_vault=none,none,Lock the vault
_k_friendly_name=Google Chrome
[google-chrome]
EA4407DAD5FBC76D7D67E9CD18A2654B-autofill_card=none,none,Autofill the last used card for the current website
EA4407DAD5FBC76D7D67E9CD18A2654B-autofill_identity=none,none,Autofill the last used identity for the current website
EA4407DAD5FBC76D7D67E9CD18A2654B-autofill_login=none,none,Autofill the last used login for the current website
EA4407DAD5FBC76D7D67E9CD18A2654B-generate_password=none,none,Generate and copy a new random password to the clipboard
EA4407DAD5FBC76D7D67E9CD18A2654B-lock_vault=none,none,Lock the vault
_k_friendly_name=Google Chrome
[kaccess] [kaccess]
Toggle Screen Reader On and Off=Meta+Alt+S,Meta+Alt+S,Toggle Screen Reader On and Off Toggle Screen Reader On and Off=Meta+Alt+S,Meta+Alt+S,Toggle Screen Reader On and Off
_k_friendly_name=Accessibility _k_friendly_name=Accessibility
[kcm_touchpad]
Disable Touchpad=Touchpad Off,Touchpad Off,
Enable Touchpad=Touchpad On,Touchpad On,
Toggle Touchpad=Touchpad Toggle\tMeta+Ctrl+Zenkaku Hankaku,Touchpad Toggle\tTouchpad Toggle\tMeta+Ctrl+Touchpad Toggle\tMeta+Ctrl+Zenkaku Hankaku,
_k_friendly_name=Touchpad
[kmix] [kmix]
_k_friendly_name=Audio Volume _k_friendly_name=Audio Volume
decrease_microphone_volume=Microphone Volume Down,Microphone Volume Down,Decrease Microphone Volume decrease_microphone_volume=Microphone Volume Down,Microphone Volume Down,Decrease Microphone Volume
@@ -62,14 +72,14 @@ mic_mute=Microphone Mute\tMeta+Volume Mute,Microphone Mute\tMeta+Volume Mute,Mut
mute=Volume Mute,Volume Mute,Mute mute=Volume Mute,Volume Mute,Mute
[ksmserver] [ksmserver]
Halt Without Confirmation=none,none,Shut Down Without Confirmation Halt Without Confirmation=none,,Shut Down Without Confirmation
Lock Session=Meta+L\tScreensaver,Meta+L\tScreensaver,Lock Session Lock Session=Meta+L\tScreensaver,Meta+L\tScreensaver,Lock Session
Log Out=Ctrl+Alt+Del,Ctrl+Alt+Del,Show Logout Screen Log Out=Ctrl+Alt+Del,Ctrl+Alt+Del,Show Logout Screen
Log Out Without Confirmation=none,none,Log Out Without Confirmation Log Out Without Confirmation=none,,Log Out Without Confirmation
LogOut=none,none,Log Out LogOut=none,,Log Out
Reboot=none,none,Reboot Reboot=none,,Reboot
Reboot Without Confirmation=none,none,Reboot Without Confirmation Reboot Without Confirmation=none,,Reboot Without Confirmation
Shut Down=none,none,Shut Down Shut Down=none,,Shut Down
_k_friendly_name=Session Management _k_friendly_name=Session Management
[kwin] [kwin]
@@ -78,13 +88,14 @@ Cycle Overview=none,none,Cycle through Overview and Grid View
Cycle Overview Opposite=none,none,Cycle through Grid View and Overview Cycle Overview Opposite=none,none,Cycle through Grid View and Overview
Decrease Opacity=none,,Decrease Opacity of Active Window by 5% Decrease Opacity=none,,Decrease Opacity of Active Window by 5%
Edit Tiles=Meta+T,Meta+T,Toggle Tiles Editor Edit Tiles=Meta+T,Meta+T,Toggle Tiles Editor
Expose=Ctrl+F9,Ctrl+F9,Toggle Present Windows (Current desktop) Expose=Ctrl+F9,Meta+F9\tCtrl+F9,Toggle Present Windows (Current desktop)
ExposeAll=Ctrl+F10\tLaunch (C),Ctrl+F10\tLaunch (C),Toggle Present Windows (All desktops) ExposeAll=Ctrl+F10\tLaunch (C),Meta+F10\tLaunch (C)\tCtrl+F10,Toggle Present Windows (All desktops)
ExposeClass=Ctrl+F7,Ctrl+F7,Toggle Present Windows (Window class) ExposeClass=Ctrl+F7,Meta+F7\tCtrl+F7,Toggle Present Windows (Window class)
ExposeClassCurrentDesktop=none,none,Toggle Present Windows (Window class on current desktop) ExposeClassCurrentDesktop=none,none,Toggle Present Windows (Window class on current desktop)
Grid View=Meta+G,Meta+G,Toggle Grid View Grid View=Meta+G,Meta+G,Toggle Grid View
Increase Opacity=none,,Increase Opacity of Active Window by 5% Increase Opacity=none,,Increase Opacity of Active Window by 5%
Kill Window=Meta+Ctrl+Esc,Meta+Ctrl+Esc,Kill Window Kill Window=Meta+Ctrl+Esc,Meta+Ctrl+Esc,Kill Window
Move Tablet to Next LogicalOutput=none,none,Move the tablet to the next output
Move Tablet to Next Output=none,none,Move the tablet to the next output Move Tablet to Next Output=none,none,Move the tablet to the next output
MoveMouseToCenter=Meta+F6,Meta+F6,Move Mouse to Center MoveMouseToCenter=Meta+F6,Meta+F6,Move Mouse to Center
MoveMouseToFocus=Meta+F5,Meta+F5,Move Mouse to Focus MoveMouseToFocus=Meta+F5,Meta+F5,Move Mouse to Focus
@@ -103,7 +114,7 @@ Switch Window Down=Meta+Alt+Down,Meta+Alt+Down,Switch to Window Below
Switch Window Left=Meta+Alt+Left,Meta+Alt+Left,Switch to Window to the Left Switch Window Left=Meta+Alt+Left,Meta+Alt+Left,Switch to Window to the Left
Switch Window Right=Meta+Alt+Right,Meta+Alt+Right,Switch to Window to the Right Switch Window Right=Meta+Alt+Right,Meta+Alt+Right,Switch to Window to the Right
Switch Window Up=Meta+Alt+Up,Meta+Alt+Up,Switch to Window Above Switch Window Up=Meta+Alt+Up,Meta+Alt+Up,Switch to Window Above
Switch to Desktop 1=Ctrl+F1,Ctrl+F1,Switch to Desktop 1 Switch to Desktop 1=Ctrl+F1,Meta+F1\tCtrl+F1,Switch to Desktop 1
Switch to Desktop 10=none,,Switch to Desktop 10 Switch to Desktop 10=none,,Switch to Desktop 10
Switch to Desktop 11=none,,Switch to Desktop 11 Switch to Desktop 11=none,,Switch to Desktop 11
Switch to Desktop 12=none,,Switch to Desktop 12 Switch to Desktop 12=none,,Switch to Desktop 12
@@ -114,10 +125,15 @@ Switch to Desktop 16=none,,Switch to Desktop 16
Switch to Desktop 17=none,,Switch to Desktop 17 Switch to Desktop 17=none,,Switch to Desktop 17
Switch to Desktop 18=none,,Switch to Desktop 18 Switch to Desktop 18=none,,Switch to Desktop 18
Switch to Desktop 19=none,,Switch to Desktop 19 Switch to Desktop 19=none,,Switch to Desktop 19
Switch to Desktop 2=Ctrl+F2,Ctrl+F2,Switch to Desktop 2 Switch to Desktop 2=Ctrl+F2,Meta+F2\tCtrl+F2,Switch to Desktop 2
Switch to Desktop 20=none,,Switch to Desktop 20 Switch to Desktop 20=none,,Switch to Desktop 20
Switch to Desktop 3=Ctrl+F3,Ctrl+F3,Switch to Desktop 3 Switch to Desktop 21=,,Switch to Desktop 21
Switch to Desktop 4=Ctrl+F4,Ctrl+F4,Switch to Desktop 4 Switch to Desktop 22=,,Switch to Desktop 22
Switch to Desktop 23=,,Switch to Desktop 23
Switch to Desktop 24=,,Switch to Desktop 24
Switch to Desktop 25=,,Switch to Desktop 25
Switch to Desktop 3=Ctrl+F3,Meta+F3\tCtrl+F3,Switch to Desktop 3
Switch to Desktop 4=Ctrl+F4,Meta+F4\tCtrl+F4,Switch to Desktop 4
Switch to Desktop 5=none,,Switch to Desktop 5 Switch to Desktop 5=none,,Switch to Desktop 5
Switch to Desktop 6=none,,Switch to Desktop 6 Switch to Desktop 6=none,,Switch to Desktop 6
Switch to Desktop 7=none,,Switch to Desktop 7 Switch to Desktop 7=none,,Switch to Desktop 7
@@ -141,14 +157,14 @@ Switch to Screen to the Left=none,,Switch to Screen to the Left
Switch to Screen to the Right=none,,Switch to Screen to the Right Switch to Screen to the Right=none,,Switch to Screen to the Right
Toggle Night Color=none,none,Suspend/Resume Night Light Toggle Night Color=none,none,Suspend/Resume Night Light
Toggle Window Raise/Lower=none,,Toggle Window Raise/Lower Toggle Window Raise/Lower=none,,Toggle Window Raise/Lower
Walk Through Windows=Alt+Tab,Alt+Tab,Walk Through Windows Walk Through Windows=Alt+Tab,Meta+Tab\tAlt+Tab,Walk Through Windows
Walk Through Windows (Reverse)=Alt+Shift+Tab,Alt+Shift+Tab,Walk Through Windows (Reverse) Walk Through Windows (Reverse)=Alt+Shift+Tab,Meta+Shift+Tab\tAlt+Shift+Tab,Walk Through Windows (Reverse)
Walk Through Windows Alternative=none,,Walk Through Windows Alternative Walk Through Windows Alternative=none,none,Walk Through Windows Alternative
Walk Through Windows Alternative (Reverse)=none,,Walk Through Windows Alternative (Reverse) Walk Through Windows Alternative (Reverse)=none,none,Walk Through Windows Alternative (Reverse)
Walk Through Windows of Current Application=Alt+`,Alt+`,Walk Through Windows of Current Application Walk Through Windows of Current Application=Alt+`,Meta+`\tAlt+`,Walk Through Windows of Current Application
Walk Through Windows of Current Application (Reverse)=Alt+~,Alt+~,Walk Through Windows of Current Application (Reverse) Walk Through Windows of Current Application (Reverse)=Alt+~,Meta+~\tAlt+~,Walk Through Windows of Current Application (Reverse)
Walk Through Windows of Current Application Alternative=none,,Walk Through Windows of Current Application Alternative Walk Through Windows of Current Application Alternative=none,none,Walk Through Windows of Current Application Alternative
Walk Through Windows of Current Application Alternative (Reverse)=none,,Walk Through Windows of Current Application Alternative (Reverse) Walk Through Windows of Current Application Alternative (Reverse)=none,none,Walk Through Windows of Current Application Alternative (Reverse)
Window Above Other Windows=none,,Keep Window Above Others Window Above Other Windows=none,,Keep Window Above Others
Window Below Other Windows=none,,Keep Window Below Others Window Below Other Windows=none,,Keep Window Below Others
Window Close=Meta+Shift+Q\tAlt+F4,Alt+F4,Close Window Window Close=Meta+Shift+Q\tAlt+F4,Alt+F4,Close Window
@@ -176,7 +192,7 @@ Window One Screen Down=none,,Move Window One Screen Down
Window One Screen Up=none,,Move Window One Screen Up Window One Screen Up=none,,Move Window One Screen Up
Window One Screen to the Left=none,,Move Window One Screen to the Left Window One Screen to the Left=none,,Move Window One Screen to the Left
Window One Screen to the Right=none,,Move Window One Screen to the Right Window One Screen to the Right=none,,Move Window One Screen to the Right
Window Operations Menu=Alt+F3,Alt+F3,Window Operations Menu Window Operations Menu=Alt+F3,Alt+F3,Window Menu
Window Pack Down=none,,Move Window Down Window Pack Down=none,,Move Window Down
Window Pack Left=none,,Move Window Left Window Pack Left=none,,Move Window Left
Window Pack Right=none,,Move Window Right Window Pack Right=none,,Move Window Right
@@ -191,7 +207,7 @@ Window Quick Tile Top Left=none,,Quick Tile Window to the Top Left
Window Quick Tile Top Right=none,,Quick Tile Window to the Top Right Window Quick Tile Top Right=none,,Quick Tile Window to the Top Right
Window Raise=none,,Raise Window Window Raise=none,,Raise Window
Window Resize=none,,Resize Window Window Resize=none,,Resize Window
Window Shade=none,,Shade Window Window Shade=none,none,Shade Window
Window Shrink Horizontal=none,,Shrink Window Horizontally Window Shrink Horizontal=none,,Shrink Window Horizontally
Window Shrink Vertical=none,,Shrink Window Vertically Window Shrink Vertical=none,,Shrink Window Vertically
Window to Desktop 1=none,,Window to Desktop 1 Window to Desktop 1=none,,Window to Desktop 1
@@ -207,6 +223,11 @@ Window to Desktop 18=none,,Window to Desktop 18
Window to Desktop 19=none,,Window to Desktop 19 Window to Desktop 19=none,,Window to Desktop 19
Window to Desktop 2=none,,Window to Desktop 2 Window to Desktop 2=none,,Window to Desktop 2
Window to Desktop 20=none,,Window to Desktop 20 Window to Desktop 20=none,,Window to Desktop 20
Window to Desktop 21=,,Window to Desktop 21
Window to Desktop 22=,,Window to Desktop 22
Window to Desktop 23=,,Window to Desktop 23
Window to Desktop 24=,,Window to Desktop 24
Window to Desktop 25=,,Window to Desktop 25
Window to Desktop 3=none,,Window to Desktop 3 Window to Desktop 3=none,,Window to Desktop 3
Window to Desktop 4=none,,Window to Desktop 4 Window to Desktop 4=none,,Window to Desktop 4
Window to Desktop 5=none,,Window to Desktop 5 Window to Desktop 5=none,,Window to Desktop 5
@@ -234,13 +255,17 @@ view_zoom_out=Meta+-,Meta+-,Zoom Out
[mediacontrol] [mediacontrol]
_k_friendly_name=Media Controller _k_friendly_name=Media Controller
mediavolumedown=none,none,Media volume down mediavolumedown=none,,Media volume down
mediavolumeup=none,none,Media volume up mediavolumeup=none,,Media volume up
nextmedia=Media Next,Media Next,Media playback next nextmedia=Media Next,Media Next,Media playback next
pausemedia=Media Pause,Media Pause,Pause media playback pausemedia=Media Pause,Media Pause,Pause media playback
playmedia=none,none,Play media playback playmedia=none,,Play media playback
playpausemedia=Media Play,Media Play,Play/Pause media playback playpausemedia=Media Play,Media Play,Play/Pause media playback
previousmedia=Media Previous,Media Previous,Media playback previous previousmedia=Media Previous,Media Previous,Media playback previous
seekbackwardmedia=Media Rewind,Media Rewind,Media playback seek backward 5s
seekbackwardmedialong=,,Media playback seek backward 30s
seekforwardmedia=Media Fast Forward,Media Fast Forward,Media playback seek forward 5s
seekforwardmedialong=,,Media playback seek forward 30s
stopmedia=Media Stop,Media Stop,Stop media playback stopmedia=Media Stop,Media Stop,Stop media playback
[org_kde_powerdevil] [org_kde_powerdevil]
@@ -260,6 +285,7 @@ _k_friendly_name=Power Management
powerProfile=Battery\tMeta+B,Battery\tMeta+B,Switch Power Profile powerProfile=Battery\tMeta+B,Battery\tMeta+B,Switch Power Profile
[plasmashell] [plasmashell]
Slideshow Wallpaper Next Image=none,,Next Wallpaper Image
_k_friendly_name=plasmashell _k_friendly_name=plasmashell
activate application launcher=Meta\tAlt+F1,Meta\tAlt+F1,Activate Application Launcher activate application launcher=Meta\tAlt+F1,Meta\tAlt+F1,Activate Application Launcher
activate task manager entry 1=Meta+1,Meta+1,Activate Task Manager Entry 1 activate task manager entry 1=Meta+1,Meta+1,Activate Task Manager Entry 1
@@ -277,6 +303,7 @@ clipboard_action=Meta+Ctrl+X,Meta+Ctrl+X,Automatic Action Popup Menu
cycle-panels=Meta+Alt+P,Meta+Alt+P,Move keyboard focus between panels cycle-panels=Meta+Alt+P,Meta+Alt+P,Move keyboard focus between panels
cycleNextAction=none,,Next History Item cycleNextAction=none,,Next History Item
cyclePrevAction=none,,Previous History Item cyclePrevAction=none,,Previous History Item
edit_clipboard=none,,Edit Contents…
manage activities=Meta+Q,Meta+Q,Show Activity Switcher manage activities=Meta+Q,Meta+Q,Show Activity Switcher
next activity=Meta+A,none,Walk through activities next activity=Meta+A,none,Walk through activities
previous activity=Meta+Shift+A,none,Walk through activities (Reverse) previous activity=Meta+Shift+A,none,Walk through activities (Reverse)
@@ -284,17 +311,24 @@ repeat_action=none,,Manually Invoke Action on Current Clipboard
show dashboard=Ctrl+F12,Ctrl+F12,Show Desktop show dashboard=Ctrl+F12,Ctrl+F12,Show Desktop
show-barcode=none,,Show Barcode… show-barcode=none,,Show Barcode…
show-on-mouse-pos=Meta+V,Meta+V,Show Clipboard Items at Mouse Position show-on-mouse-pos=Meta+V,Meta+V,Show Clipboard Items at Mouse Position
stop current activity=Meta+S,Meta+S,Stop Current Activity
switch to next activity=none,,Switch to Next Activity switch to next activity=none,,Switch to Next Activity
switch to previous activity=none,,Switch to Previous Activity switch to previous activity=none,,Switch to Previous Activity
toggle do not disturb=none,,Toggle do not disturb toggle do not disturb=none,,Toggle do not disturb
[services][Alacritty.desktop] [services][com.mitchellh.ghostty.desktop]
New=Meta+Return _launch=none
[services][foot.desktop]
_launch=Meta+Return
[services][org.kde.spectacle.desktop] [services][org.kde.spectacle.desktop]
CurrentMonitorScreenShot=
OpenWithoutScreenshot=
RecordWindow=none RecordWindow=none
[services][org.kde.touchpadshortcuts.desktop]
ToggleTouchpad=Touchpad Toggle\tMeta+Ctrl+Zenkaku Hankaku
[wacomtablet] [wacomtablet]
Map to fullscreen=Meta+Ctrl+F,Meta+Ctrl+F,Map to fullscreen Map to fullscreen=Meta+Ctrl+F,Meta+Ctrl+F,Map to fullscreen
Map to screen 1=Meta+Ctrl+1,Meta+Ctrl+1,Map to screen 1 Map to screen 1=Meta+Ctrl+1,Meta+Ctrl+1,Map to screen 1
+68 -4
View File
@@ -1,5 +1,7 @@
[Compositing] [Desktops]
AllowTearing=false Id_1=e1fac5a2-0626-4ae9-8c30-7a8246a37a63
Number=1
Rows=1
[EdgeBarrier] [EdgeBarrier]
EdgeBarrier=0 EdgeBarrier=0
@@ -7,6 +9,9 @@ EdgeBarrier=0
[Effect-hidecursor] [Effect-hidecursor]
InactivityDuration=3 InactivityDuration=3
[Effect-overview]
BorderActivate=9
[MouseBindings] [MouseBindings]
CommandWindow3=Activate, raise and pass click CommandWindow3=Activate, raise and pass click
@@ -17,9 +22,68 @@ scripts=trigger-attention
[TabBox] [TabBox]
HighlightWindows=false HighlightWindows=false
[Tiling] [Tiling][0526520b-9945-49bf-8303-7e354eeccb52][16f895ff-1e6b-4d60-9110-12cfa484626d]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][0526520b-9945-49bf-8303-7e354eeccb52][34337f64-615a-4ab5-8e05-42c1c15fb9fc]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][0526520b-9945-49bf-8303-7e354eeccb52][4d50157c-0afe-45fa-80ed-b0e417d24309]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][0526520b-9945-49bf-8303-7e354eeccb52][c830e5fd-112b-4270-a0ca-f2e1f487770c]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][07ed97c2-12b4-5349-b502-a095df5d8eb0]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][277e38c9-7156-539b-ab74-f945e901d1e4]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][37ea0b47-de66-53f6-ad76-29c6da638eb1]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][6eaae419-5e61-55c0-8db5-81649aa01251]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][6ebdc25d-2b2b-5a5b-b16b-518da25fc2a8]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][7a6f13f6-891f-58e4-b427-001c89ba703f]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][86ce8148-2c7b-5c78-bf9c-d45fe68dd950]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][b341567f-2a68-5520-ba5d-2040a678ebee]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][cbeedb01-d6f4-5a05-983a-056296d6f76e]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][e1a94be5-520c-5e02-9a77-49110e95e977]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][e1fac5a2-0626-4ae9-8c30-7a8246a37a63][34337f64-615a-4ab5-8e05-42c1c15fb9fc]
padding=4 padding=4
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][e1fac5a2-0626-4ae9-8c30-7a8246a37a63][4d50157c-0afe-45fa-80ed-b0e417d24309]
padding=4
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][e1fac5a2-0626-4ae9-8c30-7a8246a37a63][c830e5fd-112b-4270-a0ca-f2e1f487770c]
padding=4
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][f115894f-391a-585f-9f08-5661f296807c]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][f813429e-783e-583b-bd7b-f0cfb1b89b5b]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
[Tiling][fe7c57c0-f576-58d5-aa4c-8b60cc6e9bec]
tiles={"layoutDirection":"horizontal","tiles":[{"width":0.15039062499999728},{"width":0.6996093749999988},{"width":0.1500000000000039}]}
[Xwayland] [Xwayland]
Scale=1 Scale=1
+21
View File
@@ -10,8 +10,29 @@ set incsearch true
set incfilter true set incfilter true
set period 1 set period 1
cmd trash ${{
echo "Selected file(s):"
for file in $fx; do
echo " $file"
done
printf "Send to trash? [y/N] "
read -n1 ans
echo
case "$ans" in
[Yy])
for file in $fx; do
gio trash -- $file
done
;;
*)
;;
esac
}}
# map f filter # map f filter
# map j updir # map j updir
# map k down # map k down
# map l up # map l up
# map ; open # map ; open
map D trash
+44
View File
@@ -0,0 +1,44 @@
[Default Applications]
application/html=firefox.desktop
application/pdf=mupdf.desktop
application/x-matroska=mpv.desktop;
application/xhtml+xml=firefox.desktop;
text/html=firefox.desktop
text/x-component=firefox.desktop;
video/3gp=mpv.desktop;
video/3gpp=mpv.desktop;
video/3gpp2=mpv.desktop;
video/avi=mpv.desktop;
video/divx=mpv.desktop;
video/dv=mpv.desktop;
video/fli=mpv.desktop;
video/flv=mpv.desktop;
video/mp2t=mpv.desktop;
video/mp4=mpv.desktop;
video/mp4v-es=mpv.desktop;
video/mpeg=mpv.desktop;
video/msvideo=mpv.desktop;
video/ogg=mpv.desktop;
video/quicktime=mpv.desktop;
video/vnd.divx=mpv.desktop;
video/vnd.mpegurl=mpv.desktop;
video/vnd.rn-realvideo=mpv.desktop;
video/webm=mpv.desktop;
video/x-avi=mpv.desktop;
video/x-flv=mpv.desktop;
video/x-m4v=mpv.desktop;
video/x-matroska=mpv.desktop;
video/x-mpeg2=mpv.desktop;
video/x-ms-asf=mpv.desktop;
video/x-ms-wmv=mpv.desktop;
video/x-ms-wmx=mpv.desktop;
video/x-msvideo=mpv.desktop;
video/x-ogm=mpv.desktop;
video/x-ogm+ogg=mpv.desktop;
video/x-theora=mpv.desktop;
video/x-theora+ogg=mpv.desktop;
x-scheme-handler/about=firefox.desktop
x-scheme-handler/discord-1352351827206733974=discord-1352351827206733974.desktop
x-scheme-handler/http=firefox.desktop
x-scheme-handler/https=firefox.desktop
x-scheme-handler/unknown=firefox.desktop
+31
View File
@@ -0,0 +1,31 @@
{
"$schema": "https://opencode.ai/config.json",
"share": "disabled",
"autoupdate": true,
"theme": "one-darker",
"permission": {
"edit": "ask",
"bash": "ask",
"skill": "ask",
"webfetch": "deny",
"doom_loop": "ask",
"external_directory": "ask"
},
"keybinds": {
"messages_page_up": "pageup,ctrl+b",
"messages_page_down": "pagedown,ctrl+f",
"command_list": "ctrl+shift+p",
"messages_next": "ctrl+n",
"messages_previous": "ctrl+p"
},
"mcp": {
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp",
"headers": {
"CONTEXT7_API_KEY": "ctx7sk-43398b88-9678-4c96-af38-c0ce152e2e66"
},
"enabled": true
}
}
}
+84
View File
@@ -0,0 +1,84 @@
{
"$schema": "https://opencode.ai/theme.json",
"defs": {
"darkBg": "#1f2329",
"darkBgAlt": "#181b20",
"darkBgPanel": "#282c34",
"darkFg": "#a0a8b7",
"darkFgMuted": "#535965",
"darkPurple": "#bf68d9",
"darkBlue": "#4fa6ed",
"darkRed": "#e55561",
"darkGreen": "#8ebd6b",
"darkYellow": "#e2b86b",
"darkOrange": "#cc9057",
"darkCyan": "#48b0bd",
"lightBg": "#fafafa",
"lightBgAlt": "#f0f0f1",
"lightBgPanel": "#eaeaeb",
"lightFg": "#383a42",
"lightFgMuted": "#a0a1a7",
"lightPurple": "#a626a4",
"lightBlue": "#4078f2",
"lightRed": "#e45649",
"lightGreen": "#50a14f",
"lightYellow": "#c18401",
"lightOrange": "#986801",
"lightCyan": "#0184bc"
},
"theme": {
"primary": { "dark": "darkBlue", "light": "lightBlue" },
"secondary": { "dark": "darkPurple", "light": "lightPurple" },
"accent": { "dark": "darkCyan", "light": "lightCyan" },
"error": { "dark": "darkRed", "light": "lightRed" },
"warning": { "dark": "darkYellow", "light": "lightYellow" },
"success": { "dark": "darkGreen", "light": "lightGreen" },
"info": { "dark": "darkOrange", "light": "lightOrange" },
"text": { "dark": "darkFg", "light": "lightFg" },
"textMuted": { "dark": "darkFgMuted", "light": "lightFgMuted" },
"background": { "dark": "darkBg", "light": "lightBg" },
"backgroundPanel": { "dark": "darkBgAlt", "light": "lightBgAlt" },
"backgroundElement": { "dark": "darkBgPanel", "light": "lightBgPanel" },
"border": { "dark": "#30363f", "light": "#d1d1d2" },
"borderActive": { "dark": "darkBlue", "light": "lightBlue" },
"borderSubtle": { "dark": "#232830", "light": "#e0e0e1" },
"diffAdded": { "dark": "darkGreen", "light": "lightGreen" },
"diffRemoved": { "dark": "darkRed", "light": "lightRed" },
"diffContext": { "dark": "darkFgMuted", "light": "lightFgMuted" },
"diffHunkHeader": { "dark": "darkCyan", "light": "lightCyan" },
"diffHighlightAdded": { "dark": "#aad482", "light": "#489447" },
"diffHighlightRemoved": { "dark": "#e8828b", "light": "#d65145" },
"diffAddedBg": { "dark": "#1a2f22", "light": "#eafbe9" },
"diffRemovedBg": { "dark": "#311c1e", "light": "#fce9e8" },
"diffContextBg": { "dark": "darkBgAlt", "light": "lightBgAlt" },
"diffLineNumber": { "dark": "#3d4552", "light": "#c9c9ca" },
"diffAddedLineNumberBg": { "dark": "#1a2f22", "light": "#e1f3df" },
"diffRemovedLineNumberBg": { "dark": "#311c1e", "light": "#f5e2e1" },
"markdownText": { "dark": "darkFg", "light": "lightFg" },
"markdownHeading": { "dark": "darkPurple", "light": "lightPurple" },
"markdownLink": { "dark": "darkBlue", "light": "lightBlue" },
"markdownLinkText": { "dark": "darkCyan", "light": "lightCyan" },
"markdownCode": { "dark": "darkGreen", "light": "lightGreen" },
"markdownBlockQuote": { "dark": "darkFgMuted", "light": "lightFgMuted" },
"markdownEmph": { "dark": "darkYellow", "light": "lightYellow" },
"markdownStrong": { "dark": "darkOrange", "light": "lightOrange" },
"markdownHorizontalRule": {
"dark": "darkFgMuted",
"light": "lightFgMuted"
},
"markdownListItem": { "dark": "darkBlue", "light": "lightBlue" },
"markdownListEnumeration": { "dark": "darkCyan", "light": "lightCyan" },
"markdownImage": { "dark": "darkBlue", "light": "lightBlue" },
"markdownImageText": { "dark": "darkCyan", "light": "lightCyan" },
"markdownCodeBlock": { "dark": "darkFg", "light": "lightFg" },
"syntaxComment": { "dark": "darkFgMuted", "light": "lightFgMuted" },
"syntaxKeyword": { "dark": "darkPurple", "light": "lightPurple" },
"syntaxFunction": { "dark": "darkBlue", "light": "lightBlue" },
"syntaxVariable": { "dark": "darkRed", "light": "lightRed" },
"syntaxString": { "dark": "darkGreen", "light": "lightGreen" },
"syntaxNumber": { "dark": "darkOrange", "light": "lightOrange" },
"syntaxType": { "dark": "darkYellow", "light": "lightYellow" },
"syntaxOperator": { "dark": "darkCyan", "light": "lightCyan" },
"syntaxPunctuation": { "dark": "darkFg", "light": "lightFg" }
}
}
@@ -0,0 +1,3 @@
stream.properties = {
resample.quality = 10
}
@@ -0,0 +1,3 @@
context.properties = {
default.clock.allowed-rates = [ 44100 48000 88200 96000 176400 192000 352800 384000 ]
}
+31 -17
View File
@@ -27,23 +27,24 @@ tab_system_color=true
[Backend] [Backend]
AutoCrossfadeEnabled=false AutoCrossfadeEnabled=false
CrossfadeEnabled=false CrossfadeEnabled=false
Device=@Invalid()
FadeoutDuration=2000 FadeoutDuration=2000
FadeoutEnabled=false FadeoutEnabled=false
FadeoutPauseDuration=250 FadeoutPauseDuration=250
FadeoutPauseEnabled=false FadeoutPauseEnabled=false
NoCrossfadeSameAlbum=true NoCrossfadeSameAlbum=true
Output=autoaudiosink alsaplugin=1
alsaplugin=3
bs2b=false bs2b=false
bufferduration=4000 bufferduration=4000
bufferhighwatermark=0.99 bufferhighwatermark=0.99
bufferlowwatermark=0.33 bufferlowwatermark=0.33
channels=2 channels=2
channels_enabled=false channels_enabled=false
device=@Invalid()
ebur128_loudness_normalization=false ebur128_loudness_normalization=false
ebur128_target_level_lufs=-23 ebur128_target_level_lufs=-23
http2=false http2=false
output=pulsesink
playbin3=true
rgcompression=true rgcompression=true
rgenabled=false rgenabled=false
rgfallbackgain=0 rgfallbackgain=0
@@ -79,8 +80,8 @@ disk_cache_enable=false
disk_cache_size=360 disk_cache_size=360
disk_cache_size_unit=1 disk_cache_size_unit=1
expire_unavailable_songs=60 expire_unavailable_songs=60
group_by1=1 group_by1=3
group_by2=3 group_by2=0
group_by3=0 group_by3=0
group_by_version=1 group_by_version=1
last_path=/home/oscar/Music last_path=/home/oscar/Music
@@ -93,6 +94,8 @@ save_playcounts=false
save_ratings=false save_ratings=false
separate_albums_by_grouping=false separate_albums_by_grouping=false
show_dividers=false show_dividers=false
skip_articles_for_albums=false
skip_articles_for_artists=false
song_ebur128_loudness_analysis=false song_ebur128_loudness_analysis=false
song_tracking=false song_tracking=false
sort_skips_articles=true sort_skips_articles=true
@@ -124,7 +127,7 @@ types=art_unset, art_manual, art_automatic, art_embedded
[EditTagDialog] [EditTagDialog]
current_tab=1 current_tab=1
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\a\x81\0\0\0\x19\0\0\n\xad\0\0\x1\xdc\0\0\a\x81\0\0\0\x19\0\0\n\xad\0\0\x1\xdc\0\0\0\x1\0\0\0\0\n\0\0\0\a\x81\0\0\0\x19\0\0\n\xad\0\0\x1\xdc) geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x11\x81\0\0\0\x19\0\0\x14\xad\0\0\x1\xdc\0\0\x11\x81\0\0\0\x19\0\0\x14\xad\0\0\x1\xdc\0\0\0\x1\0\0\0\0\a\x80\0\0\x11\x81\0\0\0\x19\0\0\x14\xad\0\0\x1\xdc)
[Equalizer] [Equalizer]
enable_stereo_balancer=false enable_stereo_balancer=false
@@ -168,7 +171,7 @@ presets\8\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0
presets\9\name=Large Hall presets\9\name=Large Hall
presets\9\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x32\0\0\0\x32\0\0\0\x1e\0\0\0\x1e\0\0\0\0\xff\xff\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\xe7\0\0\0\0\0\0\0\0) presets\9\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x32\0\0\0\x32\0\0\0\x1e\0\0\0\x1e\0\0\0\0\xff\xff\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\xe7\0\0\0\0\0\0\0\0)
presets\size=19 presets\size=19
selected_preset=Custom selected_preset=Zero
stereo_balance=0 stereo_balance=0
[GlobalShortcuts] [GlobalShortcuts]
@@ -209,15 +212,15 @@ user_token=
providers=Genius, Lyrics.ovh, LoloLyrics, Musixmatch, songlyrics.com, azlyrics.com, elyrics.net, letras.mus.br, lyricfind.com providers=Genius, Lyrics.ovh, LoloLyrics, Musixmatch, songlyrics.com, azlyrics.com, elyrics.net, letras.mus.br, lyricfind.com
[MainWindow] [MainWindow]
current_tab=1 current_tab=5
file_path=/home/oscar/Music file_path=/home/oscar/Music
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x11\x80\0\0\0\0\0\0\x18\xff\0\0\x4g\0\0\x11\x81\0\0\0\x19\0\0\x15\xeb\0\0\x2\xc5\0\0\0\x2\x2\0\0\0\a\x80\0\0\x11\x80\0\0\0\0\0\0\x18\xff\0\0\x4g) geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\n\0\0\0\0\xf0\0\0\x11\x7f\0\0\x5W\0\0\n\x1\0\0\x1\t\0\0\xek\0\0\x3\xb5\0\0\0\x1\x2\0\0\0\a\x80\0\0\n\0\0\0\0\xf0\0\0\x11\x7f\0\0\x5W)
hidden=false hidden=false
maximized=true maximized=true
minimized=false minimized=false
search_for_cover_auto=true search_for_cover_auto=true
show_sidebar=true show_sidebar=true
splitter_state=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\x1\xbb\0\0\x5\xc4\0\xff\xff\xff\xff\x1\0\0\0\x1\0) splitter_state=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\x2\0\0\0\x5\x7f\0\xff\xff\xff\xff\x1\0\0\0\x1\0)
tab_collection=1 tab_collection=1
tab_context=0 tab_context=0
tab_devices=7 tab_devices=7
@@ -266,13 +269,19 @@ foreground_color=4278190080
popup_pos=@Point(1524 0) popup_pos=@Point(1524 0)
popup_screen=eDP-1 popup_screen=eDP-1
[OpenTidal]
access_token=eyJraWQiOiJ2OU1GbFhqWSIsImFsZyI6IkVTMjU2In0.eyJ0eXBlIjoibzJfYWNjZXNzIiwic2NvcGUiOiIiLCJnVmVyIjowLCJzVmVyIjowLCJjaWQiOjk3MDYsImV4cCI6MTc1Njg5MDgyNywiaXNzIjoiaHR0cHM6Ly9hdXRoLnRpZGFsLmNvbS92MSJ9.tGq9QEleFDMW6ZFjO4RlZMzNsysWr8ngJWESiaWR_kUthK-sgAosgVkytL1Ap9p9ELGJfgIuauCpz7rw4Gzavw
expires_in=43200
login_time=1756847627
token_type=Bearer
[OrganizeDialog] [OrganizeDialog]
albumcover=true albumcover=true
allow_ascii_ext=false allow_ascii_ext=false
destination=/home/oscar/Music destination=/home/oscar/Music
eject_after=false eject_after=false
format=%albumartist/%album/{%disc.}{%track - }{%artist - }%title.%extension format=%albumartist/%album/{%disc.}{%track - }{%artist - }%title.%extension
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\a\x80\0\0\0\0\0\0\t\xc5\0\0\x3Y\0\0\a\x80\0\0\0\0\0\0\t\xc5\0\0\x3Y\0\0\0\x1\0\0\0\0\n\0\0\0\a\x80\0\0\0\0\0\0\t\xc5\0\0\x3Y) geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x11\x80\0\0\0\0\0\0\x13\xc5\0\0\x3Y\0\0\x11\x80\0\0\0\0\0\0\x13\xc5\0\0\x3Y\0\0\0\x1\0\0\0\0\a\x80\0\0\x11\x80\0\0\0\0\0\0\x13\xc5\0\0\x3Y)
overwrite=false overwrite=false
remove_non_ascii=false remove_non_ascii=false
remove_non_fat=false remove_non_fat=false
@@ -281,28 +290,32 @@ replace_spaces=false
[Player] [Player]
playback_playlist=1 playback_playlist=1
playback_position=16 playback_position=96
playback_state=3 playback_state=3
volume=100 volume=10
[Playlist] [Playlist]
alternating_row_colors=true alternating_row_colors=true
auto_sort=false auto_sort=false
column_alignments=@Variant(\0\0\0\x7f\0\0\0\x13\x43olumnAlignmentMap\0\0\0\0\v\0\0\0\x6\0\0\0\x82\0\0\0\a\0\0\0\x82\0\0\0\b\0\0\0\x82\0\0\0\t\0\0\0\x82\0\0\0\n\0\0\0\x82\0\0\0\f\0\0\0\x82\0\0\0\r\0\0\0\x82\0\0\0\xe\0\0\0\x82\0\0\0\x11\0\0\0\x82\0\0\0\x15\0\0\0\x82\0\0\0\x16\0\0\0\x82) column_alignments=@Variant(\0\0\0\x7f\0\0\0\x13\x43olumnAlignmentMap\0\0\0\0\f\0\0\0\f\0\0\0\x82\0\0\0\r\0\0\0\x82\0\0\0\xe\0\0\0\x82\0\0\0\xf\0\0\0\x82\0\0\0\x10\0\0\0\x82\0\0\0\x12\0\0\0\x82\0\0\0\x13\0\0\0\x82\0\0\0\x14\0\0\0\x82\0\0\0\x17\0\0\0\x82\0\0\0\x1b\0\0\0\x82\0\0\0\x1c\0\0\0\x82\0\0\0&\0\0\0\x82)
continue_on_error=false continue_on_error=false
current_playlist=2
delete_files=false delete_files=false
editmetadatainline=false editmetadatainline=false
glow_effect=true glow_effect=true
greyout_songs_play=true greyout_songs_play=true
greyout_songs_startup=true greyout_songs_startup=true
last_save_extension=xspf
last_save_filter=XSPF playlists (*.xspf)
last_save_path=/home/oscar/Music
path_type=0 path_type=0
playlist_clear=true playlist_clear=true
rating_locked=false rating_locked=false
select_track=false select_track=false
show_bars=true show_bars=true
show_toolbar=true show_toolbar=true
state="@ByteArray(P,\x95\x10\x1\0\0\0 \0\0\0\b\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\x3\0\0\0\x4\0\0\0\x5\0\0\0\x6\0\0\0\a\0\0\0\t\0\0\0\n\0\0\0\v\0\0\0\f\0\0\0\r\0\0\0\xe\0\0\0\xf\0\0\0\x10\0\0\0\x11\0\0\0\x12\0\0\0\x13\0\0\0\x14\0\0\0\x15\0\0\0\x16\0\0\0\x17\0\0\0\x18\0\0\0\x19\0\0\0\x1a\0\0\0\x1b\0\0\0\x1c\0\0\0\x1d\0\0\0\x1e\0\0\0\x1f\0\0\0 \0\0\x1\x15\0\0\x1H\0\0\x1\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0>\0\0\0\0\0\0\0\x42\0\0\0\0\0\0\0R\0\0\0?\0\0\0>\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0<\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\b\0\0\0\n\0\0\0\f\0\0\0\r\0\0\0\xe\0\0\0\x12\0\0\0\x1a\0\0\0 ?\xc8i\xfb\xbd\xea\xca\xe2?\xcc\xdb\xf4\x8cW\x14\x41?\xd1P\xeb\xa0\xfd}\xec\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\xa5\xe7\x62\xd6\xdboV\0\0\0\0\0\0\0\0?\xa7\x81\xd0T\xf5\xd3\xe0\0\0\0\0\0\0\0\0?\xac\xecp]\x1a\x64\xef?\xa6\x83\xa8>\xca\xd1\xf3?\xa5\xdd\x19\xddH\x18\x8d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\xa5/\x9a\xe2_\xec\xc3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\xa4z\xe1G\xae\x14{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)" state="@ByteArray(P,\x95\x10\x1\0\0\0)\0\0\0\xe\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\x3\0\0\0\x4\0\0\0\x5\0\0\0\x6\0\0\0\a\0\0\0\b\0\0\0\t\0\0\0\n\0\0\0\v\0\0\0\f\0\0\0\r\0\0\0\xf\0\0\0\x10\0\0\0\x11\0\0\0\x12\0\0\0\x13\0\0\0\x14\0\0\0\x15\0\0\0\x16\0\0\0\x17\0\0\0\x18\0\0\0\x19\0\0\0\x1a\0\0\0\x1b\0\0\0\x1c\0\0\0\x1d\0\0\0\x1e\0\0\0\x1f\0\0\0 \0\0\0!\0\0\0\"\0\0\0#\0\0\0$\0\0\0%\0\0\0&\0\0\0'\0\0\0(\0\0\0)\0\0\x1\b\0\0\0\0\0\0\x1\x38\0\0\0\0\0\0\x1w\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0;\0\0\0\0\0\0\0?\0\0\0\0\0\0\0N\0\0\0<\0\0\0K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\0\0\0\0\0\0\0\x2\0\0\0\x4\0\0\0\xe\0\0\0\x10\0\0\0\x12\0\0\0\x13\0\0\0\x14\0\0\0\x18\0\0\0 \0\0\0)?\xc8i\xfb\xbd\xea\xca\xe2\0\0\0\0\0\0\0\0?\xcc\xdb\xf4\x8cW\x14\x41\0\0\0\0\0\0\0\0?\xd1P\xeb\xa0\xfd}\xec\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\xa5\xe7\x62\xd6\xdboV\0\0\0\0\0\0\0\0?\xa7\x81\xd0T\xf5\xd3\xe0\0\0\0\0\0\0\0\0?\xac\xecp]\x1a\x64\xef?\xa6\x83\xa8>\xca\xd1\xf3?\xab\xb4\xa4\x4n\xd2\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\x9e\xb0!vre\xda\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\xa4z\xe1G\xae\x14{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)"
state_version=1 state_version=2
warn_close_playlist=true warn_close_playlist=true
write_metadata=false write_metadata=false
@@ -378,7 +391,7 @@ songs\size=10
songs_version=3 songs_version=3
[SettingsDialog] [SettingsDialog]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\a\x80\0\0\0\0\0\0\n\xba\0\0\x2\xff\0\0\a\x80\0\0\0\0\0\0\n\xba\0\0\x2\xff\0\0\0\x1\0\0\0\0\n\0\0\0\a\x80\0\0\0\0\0\0\n\xba\0\0\x2\xff) geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x11\x80\0\0\0\0\0\0\x14\xba\0\0\x2\xff\0\0\x11\x80\0\0\0\0\0\0\x14\xba\0\0\x2\xff\0\0\0\x2\0\0\0\0\a\x80\0\0\x11\x80\0\0\0\0\0\0\x14\xba\0\0\x2\xff)
[Spotify] [Spotify]
albums_group_by1=1 albums_group_by1=1
@@ -432,5 +445,6 @@ songs_separate_albums_by_grouping=false
tab=artists tab=artists
[Transcoder] [Transcoder]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\n\0\0\0\0\0\0\0\v\xf3\0\0\x1\xc1\0\0\n\0\0\0\0\0\0\0\v\xf3\0\0\x1\xc1\0\0\0\0\0\0\0\0\n\0\0\0\n\0\0\0\0\0\0\0\v\xf3\0\0\x1\xc1)
lamemp3enc\cbr=false lamemp3enc\cbr=false
lamemp3enc\target=1 lamemp3enc\target=1
-1
View File
@@ -1 +0,0 @@
default-id
-4
View File
@@ -1,4 +0,0 @@
export XCURSOR_SIZE=24
export XCURSOR_THEME=breeze_cursors
export QT_STYLE_OVERRIDE=Breeze
export QT_QPA_PLATFORM=wayland
+39
View File
@@ -0,0 +1,39 @@
[General]
filedialog-path=@Variant(\0\0\0\x11\0\0\0\v/home/oscar)
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1\x85\0\0\0\x8b\0\0\t\x4\0\0\x5\x11\0\0\x1\x85\0\0\0\x8b\0\0\t\x4\0\0\x5\x11\0\0\0\0\0\0\0\0\n\0\0\0\x1\x85\0\0\0\x8b\0\0\t\x4\0\0\x5\x11)
[FullScreen]
pos=@Point(880 1376)
screen=@Rect(0 0 2560 1440)
wide=true
[MainWindow]
QtStyle=System's default
adv-controls=0
bgSize=@Size(1920 1085)
pl-dock-status=true
playlist-visible=false
playlistSize=@Size(-1 -1)
status-bar-visible=false
[Preferences]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x3p\0\0\x1r\0\0\a\x16\0\0\x4\x45\0\0\x3p\0\0\x1r\0\0\a\x16\0\0\x4\x45\0\0\0\0\0\0\0\0\n\0\0\0\x3p\0\0\x1r\0\0\a\x16\0\0\x4\x45)
[RecentsMRL]
list=file:///storage/Other/SONE-028/hhd800.com%40SONE-028.mp4, file:///storage/Videos/TV-Series/The.Walking.Dead.S01-S07.Season.1-7.1080p.10bit.BluRay.5.1.x265.HEVC-MZABI/The.Walking.Dead.S06.Season.6.1080p.10bit.BluRay.5.1.x265.HEVC-MZABI/The.Walking.Dead.S06E16.1080p.10bit.BluRay.5.1.x265.HEVC-MZABI.mkv, file:///home/oscar/.cache/kioexec/krun/2850812_0/BABYMETAL%20feat.%20Polyphia%20-%2006%20-%20Sunset%20Kiss.wav, file:///storage/Videos/Movies/Fanny.and.Alexander.1983.bdrip_%5BTV.Version%5D_%5B4.37%5D_%5Bteko%5D/Fanny.and.Alexander.ep01_Videoimpul%27s.ac3, file:///home/oscar/Videos2/Reactions/tectone/Tectone%20%28live%29%202025-04-07%2015_52%20%5B319181720572%5D.temp.mp4, file:///storage/Videos/Reactions/Tectone%20%28live%29%20Frieren%20ep%2020p2%20-%2022%20%282025-03-13%2002_17%29%20%5B317714500732%5D.mp4, file:///storage/Videos/Movies/Gladiator.1992.720p.WEB-DL.H264.AAC2.0-HDCLUB%20%5BPublicHD%5D/Gladiator.1992.720p.WEB-DL.H264.AAC2.0-HDCLUB.mkv
times=0, 0, 35418, 1027752, 0, 0, 0
[ToolbarProfiles]
1\ProfileName=VLC 2.x.x Style
1\Value="0|64;39;64;38;65;|0-2;64;3;1;4;64;7;9;64;10;20;19;64-4;37;65;35-4;|12;11;13;14;|43;33-4;44;|0-2;64;3;1;4;64;37;64;38;64;8;65;25;35-4;34;"
2\ProfileName=VLC 1.1.x Style
2\Value="0|64;39;64;38;65;|0-2;64;3;1;4;64;7;10;9;64-4;20;19;64-4;37;65;35-4;|12;11;13;14;|5-1;33;6-1;|0-2;64;3;1;4;64;37;64;38;64;8;65;25;35-4;34;"
3\ProfileName=VLC 0.8.x Style
3\Value="1|64;39-1;64;38;|2-1;32-4;0-5;1-5;32-5;3-5;5-5;6-5;4-5;32-5;10-1;64-1;35-1;65;|12-1;11-1;13-1;14-1;|33;37-4;|0-5;1-5;32-1;1-5;5-1;6-1;4-5;32-1;12-5;11-1;65;34-4;35-1;"
4\ProfileName=Minimalist Style
4\Value="0|64;65;|0-7;64;3-1;1-5;4-1;64;12-5;64-5;37-5;38-5;64-4;10-1;65;36-4;|11-5;13-5;14-5;|5-1;33;6-1;|0-5;64;3-5;1-5;4-5;64;12-5;65;34-4;35-1;"
5\ProfileName=One-Liner Style
5\Value="0|64;38;65;|0-4;64;3;1;4;64;7;10;9;64-4;39;64-4;37;65;36-4;|12;11;14;13;|5-1;33;6-1;|0-2;64;3;1;4;64;37;64;38;64;8;65;25;35-4;34;"
6\ProfileName=Simplest Style
6\Value="0||36-4;65-4;0-7;4-5;1-5;65-4;7-5;|12-4;11;13;||36-4;65-4;0-5;4-5;1-5;65;8-5;"
size=6
+3791
View File
File diff suppressed because it is too large Load Diff
-86
View File
@@ -1,86 +0,0 @@
{
"height": 30,
"reload_style_on_change": true,
"modules-left": [
"hyprland/workspaces",
"hyprland/submap"
],
"modules-center": [
"clock"
],
"modules-right": [
"pulseaudio",
"network",
"battery",
"tray",
"custom/lock"
],
"clock": {
"format": "{:%H:%M}",
"tooltip-format": "<tt><small>{calendar}</small></tt>",
"calendar": {
"mode" : "month",
"mode-mon-col" : 3,
"weeks-pos" : "left",
"on-scroll" : 1,
"format": {
"months": "<span color='#ffead3'><b>{}</b></span>",
"days": "<span color='#ecc6d9'><b>{}</b></span>",
"weeks": "<span color='#99ffdd'><b>{}</b></span>",
"weekdays": "<span color='#ffcc66'><b>{}</b></span>",
"today": "<span color='#ff6699'><b><u>{}</u></b></span>"
}
},
"actions": {
"on-click-right": "mode",
"on-scroll-up": "tz_up",
"on-scroll-down": "tz_down",
"on-scroll-up": "shift_up",
"on-scroll-down": "shift_down"
}
},
"pulseaudio": {
// "scroll-step": 1, // %, can be a float
"format": "{volume}% {icon} {format_source}",
"format-bluetooth": "{volume}% {icon} {format_source}",
"format-bluetooth-muted": " {icon} {format_source}",
"format-muted": " {format_source}",
"format-source": "{volume}% ",
"format-source-muted": "",
"format-icons": {
"headphone": "",
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
},
"on-click": "pavucontrol"
},
"network": {
"format-wifi": "{icon}",
"format-ethernet": "",
"format-linked": "",
"format-disconnected": "󰤮",
"tooltip-format": "{ifname}: {ipaddr}",
"format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"]
},
"battery": {
"states": {
"warning": 30,
"critical": 15
},
"format": "{icon}",
"format-full": "{icon}",
"format-charging": "{capacity}% 󰂄",
"format-plugged": "{capacity}% ",
"format-alt": "{time} {icon}",
"format-icons": ["", "", "", "", ""]
},
"custom/lock": {
"format": "",
"tooltip-format": "",
"on-click": "pidof hyprlock || uwsm app -- hyprlock"
}
}
-59
View File
@@ -1,59 +0,0 @@
* {
/* `otf-font-awesome` is required to be installed for icons */
font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif;
font-size: 14px;
}
window#waybar {
background-color: #1f2329;
color: #ffffff;
}
.module {
margin-right: 10px;
}
button {
/* Use box-shadow instead of border so the text isn't offset */
box-shadow: inset 0 -3px transparent;
/* Avoid rounded borders under each button name */
border: none;
border-radius: 0;
}
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
button:hover {
background: inherit;
box-shadow: inset 0 -3px #a0a8b7;
}
#workspaces button {
padding: 0 5px;
}
#workspaces button.active {
border-radius: 0px;
box-shadow: inset 0 -3px #a0a8b7;
}
#workspaces button.urgent {
background-color: #e2b86b;
}
#battery.critical:not(.charging) {
color: #f53c3c;
}
#temperature.critical {
color: #e55561;
}
#tray > .passive {
-gtk-icon-effect: dim;
}
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: #e2b86b;
}
+1 -1
View File
@@ -1,6 +1,6 @@
[metadata] [metadata]
name = "onedark" name = "onedark"
origin_url = "https://github.com/owallb/dotfiles" origin_url = "https://codeberg.org/warg/dotfiles"
[colors] [colors]
background = "#1f2329" background = "#1f2329"
+6 -7
View File
@@ -2,7 +2,7 @@ local wezterm = require("wezterm")
local config = wezterm.config_builder() local config = wezterm.config_builder()
local ENABLE_MULTIPLEXING = true local ENABLE_MULTIPLEXING = false
-- quickstart: https://wezfurlong.org/wezterm/config/files.html -- quickstart: https://wezfurlong.org/wezterm/config/files.html
-- spec: https://wezfurlong.org/wezterm/config/lua/general.html -- spec: https://wezfurlong.org/wezterm/config/lua/general.html
@@ -10,15 +10,14 @@ local ENABLE_MULTIPLEXING = true
-- General settings -- General settings
config.window_padding = { config.window_padding = {
left = 5, left = 0,
right = 5, right = 0,
top = 5, top = 0,
bottom = 5, bottom = 0,
} }
config.audible_bell = "Disabled" config.audible_bell = "Disabled"
config.warn_about_missing_glyphs = false config.warn_about_missing_glyphs = false
config.initial_cols = 179
config.initial_rows = 60
-- Settings below get overriden if multiplexing is enabled -- Settings below get overriden if multiplexing is enabled
config.window_decorations = "TITLE|RESIZE" config.window_decorations = "TITLE|RESIZE"
config.enable_tab_bar = false config.enable_tab_bar = false
@@ -0,0 +1,8 @@
monitor.alsa.properties = {
# Use ALSA-Card-Profile devices. They use UCM or the profile
# configuration to configure the device and mixer settings.
# alsa.use-acp = true
# Use UCM instead of profile when available. Can be disabled
# to skip trying to use the UCM profile.
alsa.use-ucm = true
}
@@ -0,0 +1,39 @@
monitor.alsa.rules = [
{
matches = [
{
# Matches all sources
node.name = "~alsa_input.*"
},
{
# Matches all sinks
node.name = "~alsa_output.*"
}
]
actions = {
update-props = {
session.suspend-timeout-seconds = 0
}
}
}
]
# bluetooth devices
monitor.bluez.rules = [
{
matches = [
{
# Matches all sources
node.name = "~bluez_input.*"
},
{
# Matches all sinks
node.name = "~bluez_output.*"
}
]
actions = {
update-props = {
session.suspend-timeout-seconds = 0
}
}
}
]
@@ -0,0 +1,16 @@
monitor.alsa.rules = [
{
matches = [
{
node.name = "alsa_output.usb-FIIO_FiiO_K11_R2R-01.analog-stereo"
}
]
actions = {
update-props = {
api.alsa.period-size = 1024
api.alsa.headroom = 8192
}
}
}
]
@@ -1,3 +0,0 @@
[preferred]
default = hyprland;gtk
org.freedesktop.impl.portal.FileChooser = kde
+17
View File
@@ -0,0 +1,17 @@
set debuginfod enabled on
set breakpoint pending on
set tui compact-source on
set tui border-kind acs
set tui border-mode normal
set tui active-border-mode normal
set tui tab-width 4
set tui mouse-events on
set print pretty on
break __assert_fail
commands
frame 1
info locals
end
+1
View File
@@ -0,0 +1 @@
__pycache__
@@ -0,0 +1,4 @@
[D-BUS Service]
Name=org.freedesktop.FileManager1
Exec=/usr/bin/dolphin --daemon
SystemdService=plasma-dolphin.service
@@ -0,0 +1,100 @@
{
"input": {
"blocklist": [],
"compressor#0": {
"attack": 20.0,
"boost-amount": 6.0,
"boost-threshold": -72.0,
"bypass": false,
"dry": -80.01,
"hpf-frequency": 10.0,
"hpf-mode": "Off",
"input-gain": 0.0,
"input-to-link": -80.01,
"input-to-sidechain": -80.01,
"knee": -6.0,
"link-to-input": -80.01,
"link-to-sidechain": -80.01,
"lpf-frequency": 20000.0,
"lpf-mode": "Off",
"makeup": 24.0,
"mode": "Downward",
"output-gain": 0.0,
"ratio": 6.0,
"release": 100.0,
"release-threshold": -80.01,
"sidechain": {
"lookahead": 0.0,
"mode": "RMS",
"preamp": 0.0,
"reactivity": 10.0,
"source": "Middle",
"stereo-split-source": "Left/Right",
"type": "Feed-forward"
},
"sidechain-to-input": -80.01,
"sidechain-to-link": -80.01,
"stereo-split": false,
"threshold": -30.0,
"wet": 0.0
},
"filter#0": {
"balance": 0.0,
"bypass": false,
"equal-mode": "IIR",
"frequency": 100.0,
"gain": 0.0,
"input-gain": 0.0,
"mode": "RLC (BT)",
"output-gain": 0.0,
"quality": 0.0,
"slope": "x1",
"type": "High-pass",
"width": 4.0
},
"limiter#0": {
"alr": false,
"alr-attack": 5.0,
"alr-knee": 0.0,
"alr-knee-smooth": -5.0,
"alr-release": 50.0,
"attack": 5.0,
"bypass": false,
"dithering": "None",
"gain-boost": true,
"input-gain": 0.0,
"input-to-link": -80.01,
"input-to-sidechain": -80.01,
"link-to-input": -80.01,
"link-to-sidechain": -80.01,
"lookahead": 5.0,
"mode": "Herm Thin",
"output-gain": 0.0,
"oversampling": "None",
"release": 5.0,
"sidechain-preamp": 0.0,
"sidechain-to-input": -80.01,
"sidechain-to-link": -80.01,
"sidechain-type": "Internal",
"stereo-link": 100.0,
"threshold": 0.0
},
"plugins_order": [
"rnnoise#0",
"filter#0",
"compressor#0",
"limiter#0"
],
"rnnoise#0": {
"bypass": false,
"enable-vad": false,
"input-gain": 0.0,
"model-name": "",
"output-gain": 0.0,
"release": 20.0,
"use-standard-model": true,
"vad-thres": 50.0,
"wet": 0.0
}
}
}
@@ -0,0 +1,243 @@
{
"output": {
"blocklist": [],
"equalizer#4": {
"balance": 0.0,
"bypass": false,
"input-gain": -4.4,
"left": {
"band0": {
"frequency": 25.0,
"gain": -3.299999952316284,
"mode": "APO (DR)",
"mute": false,
"q": 0.5,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band1": {
"frequency": 105.0,
"gain": 5.5,
"mode": "APO (DR)",
"mute": false,
"q": 0.7100000000000001,
"slope": "x1",
"solo": false,
"type": "Lo-shelf",
"width": 4.0
},
"band2": {
"frequency": 120.0,
"gain": -4.5,
"mode": "APO (DR)",
"mute": false,
"q": 1.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band3": {
"frequency": 260.0,
"gain": 5.5,
"mode": "APO (DR)",
"mute": false,
"q": 1.2999999523162842,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band4": {
"frequency": 1900.0,
"gain": -1.7999999523162842,
"mode": "APO (DR)",
"mute": false,
"q": 1.399999976158142,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band5": {
"frequency": 2650.0,
"gain": -1.2000000476837158,
"mode": "APO (DR)",
"mute": false,
"q": 6.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band6": {
"frequency": 3600.0,
"gain": 3.5999999046325684,
"mode": "APO (DR)",
"mute": false,
"q": 1.399999976158142,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band7": {
"frequency": 4850.0,
"gain": -1.0,
"mode": "APO (DR)",
"mute": false,
"q": 4.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band8": {
"frequency": 6200.0,
"gain": -3.0999999046325684,
"mode": "APO (DR)",
"mute": false,
"q": 3.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band9": {
"frequency": 9000.0,
"gain": 1.0,
"mode": "APO (DR)",
"mute": false,
"q": 0.7100000000000001,
"slope": "x1",
"solo": false,
"type": "Hi-shelf",
"width": 4.0
}
},
"mode": "IIR",
"num-bands": 10,
"output-gain": 0.0,
"pitch-left": 0.0,
"pitch-right": 0.0,
"right": {
"band0": {
"frequency": 25.0,
"gain": -3.299999952316284,
"mode": "APO (DR)",
"mute": false,
"q": 0.5,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band1": {
"frequency": 105.0,
"gain": 5.5,
"mode": "APO (DR)",
"mute": false,
"q": 0.7100000000000001,
"slope": "x1",
"solo": false,
"type": "Lo-shelf",
"width": 4.0
},
"band2": {
"frequency": 120.0,
"gain": -4.5,
"mode": "APO (DR)",
"mute": false,
"q": 1.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band3": {
"frequency": 260.0,
"gain": 5.5,
"mode": "APO (DR)",
"mute": false,
"q": 1.2999999523162842,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band4": {
"frequency": 1900.0,
"gain": -1.7999999523162842,
"mode": "APO (DR)",
"mute": false,
"q": 1.399999976158142,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band5": {
"frequency": 2650.0,
"gain": -1.2000000476837158,
"mode": "APO (DR)",
"mute": false,
"q": 6.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band6": {
"frequency": 3600.0,
"gain": 3.5999999046325684,
"mode": "APO (DR)",
"mute": false,
"q": 1.399999976158142,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band7": {
"frequency": 4850.0,
"gain": -1.0,
"mode": "APO (DR)",
"mute": false,
"q": 4.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band8": {
"frequency": 6200.0,
"gain": -3.0999999046325684,
"mode": "APO (DR)",
"mute": false,
"q": 3.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band9": {
"frequency": 9000.0,
"gain": 1.0,
"mode": "APO (DR)",
"mute": false,
"q": 0.7100000000000001,
"slope": "x1",
"solo": false,
"type": "Hi-shelf",
"width": 4.0
}
},
"split-channels": false
},
"plugins_order": [
"equalizer#4"
]
}
}
@@ -0,0 +1,221 @@
{
"output": {
"blocklist": [],
"equalizer#0": {
"balance": 0.0,
"bypass": false,
"input-gain": -1.2,
"left": {
"band0": {
"frequency": 90.0,
"gain": -10.6,
"mode": "APO (DR)",
"mute": false,
"q": 0.48,
"slope": "x1",
"solo": false,
"type": "Lo-shelf",
"width": 4.0
},
"band1": {
"frequency": 105.0,
"gain": 5.5,
"mode": "APO (DR)",
"mute": false,
"q": 0.71,
"slope": "x1",
"solo": false,
"type": "Lo-shelf",
"width": 4.0
},
"band2": {
"frequency": 135.0,
"gain": -3.0,
"mode": "APO (DR)",
"mute": false,
"q": 1.2,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band3": {
"frequency": 1140.0,
"gain": -2.2,
"mode": "APO (DR)",
"mute": false,
"q": 2.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band4": {
"frequency": 1850.0,
"gain": -3.7,
"mode": "APO (DR)",
"mute": false,
"q": 2.5,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band5": {
"frequency": 2800.0,
"gain": -2.0,
"mode": "APO (DR)",
"mute": false,
"q": 3.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band6": {
"frequency": 3000.0,
"gain": 5.0,
"mode": "APO (DR)",
"mute": false,
"q": 0.35,
"slope": "x1",
"solo": false,
"type": "Hi-shelf",
"width": 4.0
},
"band7": {
"frequency": 5250.0,
"gain": -7.0,
"mode": "APO (DR)",
"mute": false,
"q": 4.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band8": {
"frequency": 10000.0,
"gain": -10.0,
"mode": "APO (DR)",
"mute": false,
"q": 0.71,
"slope": "x1",
"solo": false,
"type": "Hi-shelf",
"width": 4.0
}
},
"mode": "IIR",
"num-bands": 9,
"output-gain": 0.0,
"pitch-left": 0.0,
"pitch-right": 0.0,
"right": {
"band0": {
"frequency": 90.0,
"gain": -10.6,
"mode": "APO (DR)",
"mute": false,
"q": 0.48,
"slope": "x1",
"solo": false,
"type": "Lo-shelf",
"width": 4.0
},
"band1": {
"frequency": 105.0,
"gain": 5.5,
"mode": "APO (DR)",
"mute": false,
"q": 0.71,
"slope": "x1",
"solo": false,
"type": "Lo-shelf",
"width": 4.0
},
"band2": {
"frequency": 135.0,
"gain": -3.0,
"mode": "APO (DR)",
"mute": false,
"q": 1.2,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band3": {
"frequency": 1140.0,
"gain": -2.2,
"mode": "APO (DR)",
"mute": false,
"q": 2.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band4": {
"frequency": 1850.0,
"gain": -3.7,
"mode": "APO (DR)",
"mute": false,
"q": 2.5,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band5": {
"frequency": 2800.0,
"gain": -2.0,
"mode": "APO (DR)",
"mute": false,
"q": 3.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band6": {
"frequency": 3000.0,
"gain": 5.0,
"mode": "APO (DR)",
"mute": false,
"q": 0.35,
"slope": "x1",
"solo": false,
"type": "Hi-shelf",
"width": 4.0
},
"band7": {
"frequency": 5250.0,
"gain": -7.0,
"mode": "APO (DR)",
"mute": false,
"q": 4.0,
"slope": "x1",
"solo": false,
"type": "Bell",
"width": 4.0
},
"band8": {
"frequency": 10000.0,
"gain": -10.0,
"mode": "APO (DR)",
"mute": false,
"q": 0.71,
"slope": "x1",
"solo": false,
"type": "Hi-shelf",
"width": 4.0
}
},
"split-channels": false
},
"plugins_order": [
"equalizer#0"
]
}
}
+12 -2
View File
@@ -1,8 +1,11 @@
[Appearance] [Appearance]
AntiAliasFonts=true
BoldIntense=true BoldIntense=true
ColorScheme=Moonfly ColorScheme=Breeze
EmojiFont=Noto Color Emoji,5.8,-1,5,400,0,0,0,0,0,0,0,0,0,0,1
Font=Iosevka Custom,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1 Font=Iosevka Custom,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1
LineSpacing=0 LineSpacing=0
UseFontLineChararacters=false
[Cursor Options] [Cursor Options]
CustomCursorColor=158,158,158 CustomCursorColor=158,158,158
@@ -10,10 +13,16 @@ CustomCursorTextColor=8,8,8
UseCustomCursorColor=true UseCustomCursorColor=true
[General] [General]
DimWhenInactive=false
Environment= Environment=
LocalTabTitleFormat=[%#] %w
Name=Oscar Name=Oscar
Parent=FALLBACK/ Parent=FALLBACK/
RemoteTabTitleFormat=[%#] (%h) %w
ShowTerminalSizeHint=true
TerminalCenter=false
TerminalColumns=120 TerminalColumns=120
TerminalMargin=0
TerminalRows=36 TerminalRows=36
[Interaction Options] [Interaction Options]
@@ -24,4 +33,5 @@ HighlightScrolledLines=false
ScrollBarPosition=2 ScrollBarPosition=2
[Terminal Features] [Terminal Features]
BellMode=0 BellMode=3
UrlHintsModifiers=0
-189
View File
@@ -1,189 +0,0 @@
<!DOCTYPE gui>
<gui name="dolphin" translationDomain="kxmlgui6" version="43">
<MenuBar alreadyVisited="1">
<Menu alreadyVisited="1" name="file" noMerge="1">
<text translationDomain="kxmlgui6">&amp;File</text>
<Action name="file_new"/>
<Separator weakSeparator="1"/>
<Action name="new_menu"/>
<Action name="file_new"/>
<Action name="new_tab"/>
<Action name="file_close"/>
<Action name="undo_close_tab"/>
<Separator/>
<Action name="add_to_places"/>
<Separator/>
<Action name="renamefile"/>
<Action name="duplicate"/>
<Action name="movetotrash"/>
<Action name="deletefile"/>
<Separator/>
<Action name="show_target"/>
<Separator/>
<Action name="properties"/>
<Separator weakSeparator="1"/>
<Action name="file_close"/>
<Separator weakSeparator="1"/>
<Action name="file_quit"/>
</Menu>
<Menu alreadyVisited="1" name="edit" noMerge="1">
<text translationDomain="kxmlgui6">&amp;Edit</text>
<Action name="edit_undo"/>
<Separator weakSeparator="1"/>
<Action name="edit_cut"/>
<Action name="edit_copy"/>
<Action name="edit_paste"/>
<Separator weakSeparator="1"/>
<Action name="edit_select_all"/>
<Separator weakSeparator="1"/>
<Action name="edit_find"/>
<Separator weakSeparator="1"/>
<Action name="edit_undo"/>
<Separator/>
<Action name="edit_cut"/>
<Action name="edit_copy"/>
<Action name="copy_location"/>
<Action name="edit_paste"/>
<Separator/>
<Action name="show_filter_bar"/>
<Action name="edit_find"/>
<Separator/>
<Action name="toggle_selection_mode"/>
<Action name="copy_to_inactive_split_view"/>
<Action name="move_to_inactive_split_view"/>
<Action name="edit_select_all"/>
<Action name="invert_selection"/>
</Menu>
<Menu alreadyVisited="1" name="view" noMerge="1">
<text translationDomain="kxmlgui6">&amp;View</text>
<Action name="view_zoom_in"/>
<Action name="view_zoom_out"/>
<Separator weakSeparator="1"/>
<Action name="view_redisplay"/>
<Separator weakSeparator="1"/>
<Action name="view_zoom_in"/>
<Action name="view_zoom_reset"/>
<Action name="view_zoom_out"/>
<Separator/>
<Action name="sort"/>
<Action name="view_mode"/>
<Action name="additional_info"/>
<Action name="show_preview"/>
<Action name="show_in_groups"/>
<Action name="show_hidden_files"/>
<Action name="act_as_admin"/>
<Separator/>
<Action name="split_view_menu"/>
<Action name="popout_split_view"/>
<Action name="split_stash"/>
<Action name="redisplay"/>
<Action name="stop"/>
<Separator/>
<Action name="panels"/>
<Menu icon="edit-select-text" name="location_bar" noMerge="1">
<text context="@title:menu" translationDomain="dolphin">Location Bar</text>
<Action name="editable_location"/>
<Action name="replace_location"/>
</Menu>
<Separator/>
<Action name="view_properties"/>
</Menu>
<Menu alreadyVisited="1" name="go" noMerge="1">
<text translationDomain="kxmlgui6">&amp;Go</text>
<Action name="go_up"/>
<Action name="go_back"/>
<Action name="go_forward"/>
<Action name="go_home"/>
<Separator weakSeparator="1"/>
<Action name="bookmarks"/>
<Action name="closed_tabs"/>
</Menu>
<Separator weakSeparator="1"/>
<Menu alreadyVisited="1" name="tools" noMerge="1">
<text translationDomain="kxmlgui6">&amp;Tools</text>
<Action name="open_preferred_search_tool"/>
<Action name="open_terminal"/>
<Action name="open_terminal_here"/>
<Action name="compare_files"/>
<Action name="change_remote_encoding"/>
</Menu>
<Menu alreadyVisited="1" name="settings" noMerge="1">
<text translationDomain="kxmlgui6">&amp;Settings</text>
<Action name="options_show_menubar"/>
<Merge name="StandardToolBarMenuHandler"/>
<Merge name="KMDIViewActions"/>
<Separator weakSeparator="1"/>
<Action name="switch_application_language"/>
<Action name="options_configure_keybinding"/>
<Action name="options_configure_toolbars"/>
<Action name="options_configure"/>
</Menu>
<Separator weakSeparator="1"/>
<Menu alreadyVisited="1" name="help" noMerge="1">
<text translationDomain="kxmlgui6">&amp;Help</text>
<Action name="help_contents"/>
<Action name="help_whats_this"/>
<Action name="open_kcommand_bar"/>
<Separator weakSeparator="1"/>
<Action name="help_report_bug"/>
<Separator weakSeparator="1"/>
<Action name="help_donate"/>
<Separator weakSeparator="1"/>
<Action name="help_about_app"/>
<Action name="help_about_kde"/>
</Menu>
</MenuBar>
<ToolBar alreadyVisited="1" name="mainToolBar" noMerge="1">
<text context="@title:menu" translationDomain="dolphin">Main Toolbar</text>
<Action name="go_back"/>
<Action name="go_forward"/>
<Action name="go_up"/>
<Action name="url_navigators"/>
<Action name="view_mode"/>
<Action name="hamburger_menu"/>
</ToolBar>
<State name="new_file">
<disable>
<Action name="edit_undo"/>
<Action name="edit_redo"/>
<Action name="edit_cut"/>
<Action name="renamefile"/>
<Action name="movetotrash"/>
<Action name="deletefile"/>
<Action name="invert_selection"/>
<Separator/>
<Action name="go_back"/>
<Action name="go_forward"/>
</disable>
</State>
<State name="has_selection">
<enable>
<Action name="invert_selection"/>
</enable>
</State>
<State name="has_no_selection">
<disable>
<Action name="delete_shortcut"/>
<Action name="invert_selection"/>
</disable>
</State>
<ActionProperties scheme="Default">
<Action name="go_back" priority="0"/>
<Action name="go_forward" priority="0"/>
<Action name="go_up" priority="0"/>
<Action name="go_home" priority="0"/>
<Action name="stop" priority="0"/>
<Action name="icons" priority="0"/>
<Action name="compact" priority="0"/>
<Action name="details" priority="0"/>
<Action name="view_mode" priority="0"/>
<Action name="view_zoom_in" priority="0"/>
<Action name="view_zoom_reset" priority="0"/>
<Action name="view_zoom_out" priority="0"/>
<Action name="edit_cut" priority="0"/>
<Action name="edit_copy" priority="0"/>
<Action name="edit_paste" priority="0"/>
<Action name="toggle_search" priority="0"/>
<Action name="toggle_filter" priority="0"/>
</ActionProperties>
</gui>
+362 -179
View File
@@ -1,4 +1,9 @@
" vim: set foldmethod=marker: " vim: set foldmethod=marker:
" {{{1 Platform Detection
let s:is_windows = has('win32') || has('win64')
let s:is_unix = has('unix')
" {{{1 Global Variables " {{{1 Global Variables
let g:skip_defaults_vim = 1 let g:skip_defaults_vim = 1
@@ -18,11 +23,15 @@ let g:netrw_sort_options = 'i'
let g:netrw_sort_sequence = '[\/]\s*,*' let g:netrw_sort_sequence = '[\/]\s*,*'
let g:netrw_special_syntax = v:true let g:netrw_special_syntax = v:true
let g:netrw_timefmt = '%d-%m-%Y %H:%M' let g:netrw_timefmt = '%d-%m-%Y %H:%M'
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum" " Terminal codes (Unix/Linux only)
let &t_SI = "\e[6 q" if s:is_unix
let &t_EI = "\e[2 q" let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_SR = "\e[4 q" let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"
let &t_SR = "\e[4 q"
endif
" {{{1 Options " {{{1 Options
@@ -44,7 +53,11 @@ set nosmarttab
set foldlevelstart=99 set foldlevelstart=99
set foldmethod=indent set foldmethod=indent
set foldignore= set foldignore=
set guifont=Iosevka\ Custom\ 12 if s:is_windows
set guifont=Iosevka_Custom:h12
else
set guifont=Iosevka\ Custom\ 12
endif
set completeopt=menu,menuone,preview,noinsert,noselect set completeopt=menu,menuone,preview,noinsert,noselect
set matchpairs=(:),{:},[:],<:> set matchpairs=(:),{:},[:],<:>
set linebreak set linebreak
@@ -76,13 +89,13 @@ set updatetime=100
set hidden set hidden
set incsearch set incsearch
set jumpoptions=stack set jumpoptions=stack
set statusline=\ %m\%= set signcolumn=yes
\%-5.5{&filetype}\ %-6.6{&fileencoding}\ %-4.4{&fileformat}
\\ %4.4(%p%%%)%5.5l:%-3.3v
syntax on syntax on
filetype plugin indent on filetype plugin indent on
runtime ftplugin/man.vim
" {{{1 Mappings " {{{1 Mappings
if !empty($TMUX) && executable('tmux') if !empty($TMUX) && executable('tmux')
@@ -99,16 +112,6 @@ map <Leader>dp :diffput<CR>
map <Leader>do :diffget<CR> map <Leader>do :diffget<CR>
xmap <Leader>dp :diffput<CR> xmap <Leader>dp :diffput<CR>
xmap <Leader>do :diffget<CR> xmap <Leader>do :diffget<CR>
nmap <Leader>gd :Gdiffsplit<CR>
nmap <Leader>gc :G commit<CR>
nmap <Leader>ga :G commit --amend<CR>
nmap <Leader>gp :G push<CR>
nmap <Leader>gg :tabnew \| leftabove vert G \| vert resize 50 \| set wfw<CR>
nmap ]g <Plug>(GitGutterNextHunk)
nmap [g <Plug>(GitGutterPrevHunk)
map <Leader>gs <Plug>(GitGutterStageHunk)
map <Leader>gr <Plug>(GitGutterUndoHunk)
map <Leader>g? <Plug>(GitGutterPreviewHunk)
xmap < <gv xmap < <gv
xmap > >gv xmap > >gv
map <C-LeftMouse> <Nop> map <C-LeftMouse> <Nop>
@@ -118,9 +121,11 @@ imap <C-a> <C-o>^
imap <C-e> <C-o>$ imap <C-e> <C-o>$
imap <C-k> <C-o>C imap <C-k> <C-o>C
imap <C-d> <C-o>x imap <C-d> <C-o>x
execute "set <M-f>=\ef" if !s:is_windows
execute "set <M-b>=\eb" execute "set <M-f>=\ef"
execute "set <M-d>=\ed" execute "set <M-b>=\eb"
execute "set <M-d>=\ed"
endif
imap <M-f> <C-o>w imap <M-f> <C-o>w
imap <M-b> <C-o>b imap <M-b> <C-o>b
imap <M-d> <C-o>dw imap <M-d> <C-o>dw
@@ -138,14 +143,10 @@ inoremap <C-Y> <C-D>
noremap <C-l> :nohlsearch<CR>:diffupdate<CR><C-l> noremap <C-l> :nohlsearch<CR>:diffupdate<CR><C-l>
nmap tn :tabnew<CR> nmap tn :tabnew<CR>
nmap tq :tabclose<CR> nmap tq :tabclose<CR>
nmap <Leader>ff :Files<CR>
nmap <Leader>fr :CwdHistory<CR>
nmap <Leader>fb :Buffers<CR>
nmap <Leader>fg :Rg ""<CR>
nmap <expr> <Leader>fe &filetype ==# 'netrw' ? ':Rex<CR>' : ':Ex<CR>' nmap <expr> <Leader>fe &filetype ==# 'netrw' ? ':Rex<CR>' : ':Ex<CR>'
nmap <C-w>q :bn \| bd#<CR> nmap <C-w>q :bn \| bd#<CR>
nmap <Leader>tt :NERDTreeToggle<CR> tnoremap <Esc> <C-\><C-n>
nmap <Leader>uu :tabnew \| bprevious \| UndotreeToggle \| UndotreeFocus<CR> tnoremap <C-\> <Esc>
" {{{2 Default Mappings " {{{2 Default Mappings
@@ -194,14 +195,59 @@ autocmd FileType c,cpp
\ setlocal shiftwidth=2 \ setlocal shiftwidth=2
autocmd FileType netrw nmap <buffer> <C-h> - autocmd FileType netrw nmap <buffer> <C-h> -
autocmd FileType netrw nmap <buffer> <C-l> <CR> autocmd FileType netrw nmap <buffer> <C-l> <CR>
autocmd FileType netrw setlocal colorcolumn=0
" Misc
autocmd VimEnter * :clearjumps autocmd VimEnter * :clearjumps
autocmd TerminalWinOpen * setlocal nonumber norelativenumber nowrap signcolumn=no colorcolumn=
" {{{1 Custom abbreviations
cnoreabbrev term terminal ++curwin
" {{{1 Custom commands " {{{1 Custom commands
command! W write command! W write
" {{{1 Plugins " {{{1 Statusline
" {{{2 Plugin variables
function! StatusLine() abort
let git_status = ''
if exists('g:loaded_gitgutter')
let [a,m,r] = GitGutterGetHunkSummary()
let parts = []
let suffix = g:statusline_winid == win_getid(winnr()) ? '' : 'NC'
if a > 0
let parts += ['%#GitStatusAdd' . suffix . '#' . printf('+%d', a) . '%*']
endif
if m > 0
let parts += ['%#GitStatusChange' . suffix . '#' . printf('~%d', m) . '%*']
endif
if r > 0
let parts += ['%#GitStatusDelete' . suffix . '#' . printf('-%d', r) . '%*']
endif
if !empty(parts)
let git_status = ' ' . join(parts, ' ')
endif
endif
return " %f%4( %m%) "
\ . git_status
\ . "%="
\ . "%{&filetype} %-6.6{&fileencoding} %-4.4{&fileformat}"
\ . " %4.4(%p%%%)%6.6l:%-3.3v"
endfunction
set statusline=%!StatusLine()
" {{{1 Plugins
" {{{2 Variables
" {{{3 GitGutter " {{{3 GitGutter
let g:gitgutter_sign_added = '┃' let g:gitgutter_sign_added = '┃'
@@ -218,117 +264,323 @@ let g:NERDTreeDirArrowCollapsible = ""
let g:NERDTreeDirArrowExpandable = "" let g:NERDTreeDirArrowExpandable = ""
let g:NERDTreeHijackNetrw = 0 let g:NERDTreeHijackNetrw = 0
let g:NERDTreeShowHidden = 1 let g:NERDTreeShowHidden = 1
let g:NERDTreeWinSize = 40 let g:NERDTreeWinSize = 50
let g:NERDTreeMinimalUI = 1 let g:NERDTreeMinimalUI = 1
let g:NERDTreeCascadeSingleChildDir = 0 let g:NERDTreeCascadeSingleChildDir = 0
let g:NERDTreeRemoveFileCmd = "gio trash " if s:is_windows
let g:NERDTreeRemoveDirCmd = "gio trash " let g:NERDTreeRemoveFileCmd = "del /q "
let g:NERDTreeMapActivateNode = "l" let g:NERDTreeRemoveDirCmd = "rmdir /s /q "
let g:NERDTreeMapCloseDir = "h" else
let g:NERDTreeRemoveFileCmd = "gio trash "
let g:NERDTreeRemoveDirCmd = "gio trash "
endif
let g:NERDTreeMapActivateNode = "<C-l>"
let g:NERDTreeMapCloseDir = "<C-h>"
" {{{3 vim-nerdtree-syntax-highlight
let g:NERDTreeSyntaxDisableDefaultExtensions = 1
let g:NERDTreeSyntaxDisableDefaultExactMatches = 1
let g:NERDTreeSyntaxDisableDefaultPatternMatches = 1
" {{{3 onedark " {{{3 onedark
let g:onedark_color_overrides = { let g:onedark_color_overrides = {
\ "background": {"gui": "#1f2329" }, \ "background": {"gui": "#1f2329", "cterm": "235", "cterm16": "NONE" },
\ "cursor_grey": { "gui": "#282c34", "cterm": "236", "cterm16": "0" },
\} \}
augroup colorextend
autocmd!
autocmd ColorScheme * call onedark#extend_highlight("Terminal",
\ { "bg": { "gui": "#1f2329" } }
\)
autocmd ColorScheme * call onedark#extend_highlight("StatusLine",
\ { "bg": { "gui": "#30363f" } }
\)
autocmd ColorScheme * call onedark#extend_highlight("StatusLineNC",
\ { "bg": { "gui": "#282c34" } }
\)
autocmd ColorScheme * call onedark#extend_highlight("StatusLineTerm",
\ { "bg": { "gui": "#30363f" } }
\)
autocmd ColorScheme * call onedark#extend_highlight("StatusLineTermNC",
\ { "bg": { "gui": "#282c34" } }
\)
autocmd ColorScheme * call onedark#set_highlight("DiffAdd",
\ { "bg": { "gui": "#1e3a2a", "cterm": "NONE" } }
\)
autocmd ColorScheme * call onedark#set_highlight("DiffText",
\ { "bg": { "gui": "#274964", "cterm": "NONE" } }
\)
autocmd ColorScheme * call onedark#set_highlight("DiffChange",
\ { "bg": { "gui": "#15304a", "cterm": "NONE" } }
\)
autocmd ColorScheme * call onedark#set_highlight("DiffDelete",
\ { "bg": { "gui": "#3d2224", "cterm": "NONE" } }
\)
augroup END
" {{{3 Undotree " {{{3 Undotree
let g:undotree_WindowLayout = 2 let g:undotree_WindowLayout = 2
let g:undotree_DiffCommand = "diff -u" if s:is_windows
let g:undotree_DiffCommand = "FC"
else
let g:undotree_DiffCommand = "diff -u"
endif
let g:undotree_SplitWidth = 50 let g:undotree_SplitWidth = 50
let g:undotree_DiffpanelHeight = 20 let g:undotree_DiffpanelHeight = 20
" {{{3 Fuzzbox
let g:fuzzbox_respect_gitignore = 0
let g:fuzzbox_keymaps = {
\ 'menu_up': ["\<C-p>", "\<Up>"],
\ 'menu_down': ["\<C-n>", "\<Down>"],
\ 'menu_select': ["\<CR>"],
\ 'menu_page_up': [],
\ 'menu_page_down': [],
\ 'menu_scroll_up': ["\<C-u>", "\<PageUp>"],
\ 'menu_scroll_down': ["\<C-d>", "\<PageDown>"],
\ 'preview_page_up': [],
\ 'preview_page_down': [],
\ 'preview_scroll_up': ["\<S-Up>"],
\ 'preview_scroll_down': ["\<S-Down>"],
\ 'cursor_end': ["\<C-e>", "\<End>"],
\ 'cursor_begining': ["\<C-a>", "\<Home>"],
\ 'cursor_word_left': ["\<M-f>"],
\ 'cursor_word_right': ["\<M-b>"],
\ 'backspace': ["\<BS>"],
\ 'delete': ["\<Del>"],
\ 'delete_all': ["\<C-k>"],
\ 'delete_word': ["\<A-d>"],
\ 'delete_prefix': [],
\ 'exit': ["\<Esc>", "\<C-c>", "\<c-[>"],
\ }
let g:fuzzbox_buffers_keymap = {
\ 'delete_file': "",
\ 'wipe_buffer': "",
\ 'close_buffer': "\<C-x>",
\ }
let g:fuzzbox_window_layout = {
\ 'files': {
\ 'preview': 0,
\ 'width': 0.3,
\ 'height': 0.5,
\ },
\ 'grep': {
\ 'preview': 1,
\ 'width': 0.6,
\ 'height': 0.5,
\ 'preview_ratio': 0.5,
\ },
\ 'buffers': {
\ 'preview': 0,
\ 'width': 0.3,
\ 'height': 0.5,
\ },
\ 'mru': {
\ 'preview': 0,
\ 'width': 0.3,
\ 'height': 0.5,
\ },
\ 'highlights': {
\ 'preview': 1,
\ 'width': 0.6,
\ 'height': 0.5,
\ 'preview_ratio': 0.5,
\ },
\ }
" {{{2 Install " {{{2 Install
let s:plug_file = expand('$HOME/.vim/autoload/plug.vim')
if !filereadable(s:plug_file) if s:is_windows
silent execute '!curl -fkLo ' . s:plug_file ' --create-dirs' let s:plug_file = expand('$HOME/vimfiles/autoload/plug.vim')
\ ' https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' let s:plug_dir = expand('$HOME/vimfiles/plugged')
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC else
let s:plug_file = expand('$HOME/.vim/autoload/plug.vim')
let s:plug_dir = expand('$HOME/.vim/plugged')
endif endif
let s:plug_dir = expand('$HOME/.vim/plugged') if !filereadable(s:plug_file)
if s:is_windows
silent execute '!powershell -Command "'
\ . 'New-Item -ItemType Directory -Force -Path '
\ . fnamemodify(s:plug_file, ':h') . '; '
\ . 'Invoke-WebRequest -Uri '
\ . 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim '
\ . '-OutFile ' . s:plug_file . '"'
else
silent execute '!curl -fkLo ' . s:plug_file ' --create-dirs'
\ ' https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
endif
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
call plug#begin(s:plug_dir) call plug#begin(s:plug_dir)
Plug 'joshdick/onedark.vim' Plug 'joshdick/onedark.vim'
Plug 'tpope/vim-commentary' Plug 'tpope/vim-commentary'
Plug 'tpope/vim-fugitive' Plug 'tpope/vim-fugitive'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'airblade/vim-gitgutter'
Plug 'junegunn/fzf.vim' Plug 'markonm/traces.vim'
Plug 'airblade/vim-gitgutter' Plug 'rbong/vim-flog'
Plug 'markonm/traces.vim' Plug 'chrisbra/Colorizer'
Plug 'rbong/vim-flog' Plug 'jceb/vim-orgmode'
Plug 'chrisbra/Colorizer' Plug 'preservim/nerdtree'
Plug 'jceb/vim-orgmode' Plug 'ryanoasis/vim-devicons'
Plug 'preservim/nerdtree' Plug 'tiagofumo/vim-nerdtree-syntax-highlight'
Plug 'ryanoasis/vim-devicons' Plug 'mbbill/undotree'
Plug 'mbbill/undotree' Plug 'vim-fuzzbox/fuzzbox.vim'
" Plug 'prabirshrestha/vim-lsp' " Plug 'prabirshrestha/vim-lsp'
" Plug 'dense-analysis/ale' " Plug 'dense-analysis/ale'
" Plug 'prabirshrestha/asyncomplete.vim' " Plug 'prabirshrestha/asyncomplete.vim'
" Plug 'prabirshrestha/asyncomplete-lsp.vim' " Plug 'prabirshrestha/asyncomplete-lsp.vim'
" Plug 'neoclide/coc.nvim', {'branch': 'release'} " Plug 'neoclide/coc.nvim', {'branch': 'release'}
" Plug 'https://github.com/yegappan/lsp' " Plug 'https://github.com/yegappan/lsp'
" Some notes: " Some notes:
" * ALE doesn't support semantic highlighting " * ALE doesn't support semantic highlighting
" * vim-lsp doesn't support clangd switch to header/source or request document " * vim-lsp doesn't support clangd switch to header/source or request document
" highlight on cursor or request diagnostic float on cursor " highlight on cursor or request diagnostic float on cursor
" * CoC flickers in C++/clangd when semanticTokens is enabled " * CoC flickers in C++/clangd when semanticTokens is enabled
" * lsp slow loading new buffers " * lsp slow loading new buffers
" * YouCompleteMe ??? haven't tried but supports semantic highlighting " * YouCompleteMe ??? haven't tried but supports semantic highlighting
" "
" To conclude, vim-lsp + asynccomplete + ALE seems to be the best stack. " To conclude, vim-lsp + asynccomplete + ALE seems to be the best stack.
" Disabling LSP stuff for now. " Disabling LSP stuff for now.
call plug#end() call plug#end()
" {{{2 Colorscheme " {{{2 Setup
" {{{3 Colorscheme
silent! colorscheme onedark silent! colorscheme onedark
" {{{2 Fzf highlight! link netrwMarkFile Identifier
function! s:build_quickfix_list(lines) " {{{3 GitGutter
echo "lines"
echo lines function! s:SetupGitGutter()
call setqflist(map(copy(a:lines), '{ "filename": v:val, "lnum": 1 }')) if !exists('g:loaded_gitgutter')
copen return
cc endif
highlight GitGutterChange guifg=#4fa6ed
execute 'highlight default GitStatusAdd guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterAdd')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLine')), 'bg')
execute 'highlight GitStatusChange guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterChange')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLine')), 'bg')
execute 'highlight GitStatusDelete guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterDelete')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLine')), 'bg')
execute 'highlight default GitStatusAddNC guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterAdd')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLineNC')), 'bg')
execute 'highlight GitStatusChangeNC guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterChange')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLineNC')), 'bg')
execute 'highlight GitStatusDeleteNC guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterDelete')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLineNC')), 'bg')
nmap ]g <Plug>(GitGutterNextHunk)
nmap [g <Plug>(GitGutterPrevHunk)
map <Leader>gs <Plug>(GitGutterStageHunk)
map <Leader>gr <Plug>(GitGutterUndoHunk)
map <Leader>g? <Plug>(GitGutterPreviewHunk)
endfunction endfunction
autocmd! FileType fzf tnoremap <buffer> <C-k> <Up> autocmd VimEnter * call s:SetupGitGutter()
autocmd! FileType fzf tnoremap <buffer> <C-j> <Down>
autocmd! FileType fzf tnoremap <buffer> <C-l> <CR>
" To match exact, prefix word with `'` " {{{3 Fugitive
command! -bang -nargs=* Rg call fzf#vim#grep(
\ "rg"
\ . " --column"
\ . " --line-number"
\ . " --no-heading"
\ . " --color=always"
\ . " --smart-case"
\ . " --iglob=!.git"
\ . " --hidden"
\ . " --no-ignore-vcs " .<q-args>, 1, <bang>0)
command! -bang CwdHistory call fzf#run(fzf#wrap({ function! OpenGitStatus()
\ 'source': filter( let l:previous_win = win_getid()
\ fzf#vim#_recent_files(), echo l:previous_win
\ 'v:val !~ "^\\~\\?/"' leftabove vertical G
\ ), vertical resize 50
\ 'options': [ setlocal winfixwidth
\ '-m', call win_gotoid(l:previous_win)
\ '--header-lines', !empty(expand('%')), endfunction
\ '--prompt', 'CwdHist> '
\ ]},
\ <bang>0))
" {{{2 flog function! GetGitStatusWin()
let l:current_tabpage = tabpagenr()
for l:winnr in range(1, winnr('$'))
let l:bufnr = winbufnr(l:winnr)
let l:buftype = getbufvar(l:bufnr, '&buftype')
let l:bufname = bufname(l:bufnr)
if l:buftype ==# 'nowrite' && l:bufname =~# '^fugitive://.*\.git//$'
return l:winnr
endif
endfor
return 0
endfunction
function! ToggleGitStatus()
let l:win = GetGitStatusWin()
if l:win
execute l:win . 'wincmd c'
return
endif
call OpenGitStatus()
endfunction
nmap <Leader>gd :Gvdiffsplit<CR>
nmap <Leader>gD :Gvdiffsplit HEAD<CR>
nmap <Leader>gc :G commit<CR>
nmap <Leader>ga :G commit --amend<CR>
nmap <Leader>gp :G push<CR>
nmap <Leader>gg :call ToggleGitStatus()<CR>
" {{{3 Fuzzbox
nmap <Leader>ff :FuzzyFiles<CR>
nmap <Leader>fr :FuzzyMruCwd<CR>
nmap <Leader>fb :FuzzyBuffers<CR>
nmap <Leader>fg :FuzzyGrep<CR>
" {{{3 NERDTree
function! s:SetupNERDTree()
if !exists('g:loaded_nerd_tree')
return
endif
" Exit Vim if NERDTree is the only window remaining in the only tab.
autocmd BufEnter * if tabpagenr('$') == 1 &&
\ winnr('$') == 1 &&
\ exists('b:NERDTree') &&
\ b:NERDTree.isTabTree() |
\ quit |
\ endif
endfunction
autocmd VimEnter * call s:SetupNERDTree()
nmap <Leader>tt :NERDTreeToggle \| wincmd p<CR>
" {{{3 Undotree
nmap <Leader>uu :tabnew \| bprevious \| UndotreeToggle \| UndotreeFocus<CR>
" {{{3 flog
nmap <Leader>gl :Flog<CR> nmap <Leader>gl :Flog<CR>
" {{{2 vim-lsp " {{{3 vim-lsp
" let g:lsp_use_native_client = 1 " let g:lsp_use_native_client = 1
" let g:lsp_semantic_enabled = 1 " let g:lsp_semantic_enabled = 1
@@ -430,7 +682,7 @@ nmap <Leader>gl :Flog<CR>
" autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled() " autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
" augroup END " augroup END
" {{{2 CoC " {{{3 CoC
" inoremap <silent><expr> <TAB> " inoremap <silent><expr> <TAB>
" \ coc#pum#visible() ? coc#pum#next(1) : " \ coc#pum#visible() ? coc#pum#next(1) :
@@ -490,7 +742,7 @@ nmap <Leader>gl :Flog<CR>
" xmap <leader>la <Plug>(coc-codeaction-selected) " xmap <leader>la <Plug>(coc-codeaction-selected)
" nmap <leader>la <Plug>(coc-codeaction-selected) " nmap <leader>la <Plug>(coc-codeaction-selected)
" {{{2 lsp " {{{3 lsp
" autocmd User LspSetup call LspOptionsSet(#{ " autocmd User LspSetup call LspOptionsSet(#{
" \ aleSupport: v:false, " \ aleSupport: v:false,
@@ -550,7 +802,7 @@ nmap <Leader>gl :Flog<CR>
" \ ] " \ ]
" \ }]) " \ }])
" {{{2 ALE " {{{3 ALE
" let g:ale_linters_explicit = 1 " let g:ale_linters_explicit = 1
" let g:ale_linters = #{ " let g:ale_linters = #{
@@ -562,72 +814,3 @@ nmap <Leader>gl :Flog<CR>
" \ python: ['black', 'isort', 'remove_trailing_lines', 'trim_whitespace'], " \ python: ['black', 'isort', 'remove_trailing_lines', 'trim_whitespace'],
" \ } " \ }
" let g:ale_python_black_options = '--line-length 80' " let g:ale_python_black_options = '--line-length 80'
" {{{1 Statusline
function! GitStatus()
let [a,m,r] = GitGutterGetHunkSummary()
let parts = []
if a > 0
let parts += ['%#GitStatusAdd#' . printf('+%d', a) . '%*']
endif
if m > 0
let parts += ['%#GitStatusChange#' . printf('~%d', m) . '%*']
endif
if r > 0
let parts += ['%#GitStatusDelete#' . printf('-%d', r) . '%*']
endif
if empty(parts)
return ''
endif
return ' ' . join(parts, ' ')
endfunction
function! s:SetupGitGutter()
if !exists('g:loaded_gitgutter')
return
endif
execute 'highlight default GitStatusAdd guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterAdd')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLine')), 'bg')
execute 'highlight GitStatusChange guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterChange')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLine')), 'bg')
execute 'highlight GitStatusDelete guifg='
\ . synIDattr(synIDtrans(hlID('GitGutterDelete')), 'fg')
\ . ' guibg='
\ . synIDattr(synIDtrans(hlID('StatusLine')), 'bg')
set statusline=\ %f%{%GitStatus()%}\ %m
\%=
\%-5.5{&filetype}\ %-6.6{&fileencoding}\ %-4.4{&fileformat}
\\ %4.4(%p%%%)%5.5l:%-3.3v
endfunction
function! s:SetupNERDTree()
if !exists('g:loaded_nerd_tree')
return
endif
" Exit Vim if NERDTree is the only window remaining in the only tab.
autocmd BufEnter * if tabpagenr('$') == 1 &&
\ winnr('$') == 1 &&
\ exists('b:NERDTree') &&
\ b:NERDTree.isTabTree() |
\ quit |
\ endif
" Start NERDTree and put the cursor back in the other window.
NERDTree | wincmd p
endfunction
autocmd VimEnter * call s:SetupGitGutter()
autocmd VimEnter * call s:SetupNERDTree()
-3
View File
@@ -1,3 +0,0 @@
if uwsm check may-start && uwsm select; then
exec uwsm start default
fi
+201
View File
@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-10
View File
@@ -1,10 +0,0 @@
[Unit]
Description=Apply AMDGPU power profile
[Service]
Type=oneshot
ExecStart=sh -c 'echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level'
ExecStart=sh -c 'echo "1" > /sys/class/drm/card0/device/pp_power_profile_mode'
[Install]
WantedBy=multi-user.target
+25
View File
@@ -0,0 +1,25 @@
---
BasedOnStyle: LLVM
AlignAfterOpenBracket: BlockIndent
AlignArrayOfStructures: Left
AlignEscapedNewlines: Right
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: AllIfsAndElse
BinPackArguments: false
BinPackParameters: false
BreakBeforeBraces: WebKit
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterColon
IncludeBlocks: Regroup
IncludeIsMainRegex: '(_test)?$'
IndentWidth: 4
LineEnding: LF
PackConstructorInitializers: Never
PenaltyBreakAssignment: 100
PointerAlignment: Left
QualifierAlignment: Right
Standard: Latest
WhitespaceSensitiveMacros:
- STRINGIZE
- STRINGIZE_VALUE
...
+36
View File
@@ -0,0 +1,36 @@
---
Checks: >
bugprone-*,
cert-*,
clang-analyzer-*,
clang-diagnostic-*,
concurrency-*,
cppcoreguidelines-*,
misc-*,
modernize-*,
performance-*,
portability-*,
readability-*,
-bugprone-easily-swappable-parameters,
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
-clang-analyzer-security.insecureAPI.strcpy,
-readability-braces-around-statements,
-readability-identifier-length,
-readability-implicit-bool-conversion,
-misc-no-recursion
CheckOptions:
- key: readability-identifier-naming.VariableCase
value: lower_case
- key: readability-identifier-naming.FunctionCase
value: lower_case
- key: readability-identifier-naming.TypeCase
value: lower_case
- key: readability-identifier-naming.ConstantCase
value: UPPER_CASE
- key: readability-identifier-naming.MacroCase
value: UPPER_CASE
- key: readability-identifier-naming.EnumConstantCase
value: UPPER_CASE
FormatStyle: file
+23
View File
@@ -0,0 +1,23 @@
---
Diagnostics:
UnusedIncludes: Strict
MissingIncludes: Strict
CompileFlags:
Add: [-xc]
Remove: [-fanalyzer]
Completion:
AllScopes: true
InlayHints:
Enabled: No
SemanticTokens:
DisabledKinds: []
DisabledModifiers: []
# Will possibly be supported in clangd 22
Documentation:
CommentFormat: Doxygen
...
+20
View File
@@ -0,0 +1,20 @@
---
Language: Cpp
BasedOnStyle: LLVM
AlignAfterOpenBracket: BlockIndent
AlignArrayOfStructures: Left
AllowShortFunctionsOnASingleLine: None
BinPackArguments: false
BinPackParameters: false
BreakBeforeBraces: WebKit
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterColon
IncludeIsMainRegex: '(_test)?$'
LineEnding: LF
PackConstructorInitializers: Never
PenaltyBreakAssignment: 100
PointerAlignment: Left
QualifierAlignment: Left
SeparateDefinitionBlocks: Always
Standard: Latest
...
+20
View File
@@ -0,0 +1,20 @@
---
Checks: >
bugprone-*,
cert-*,
clang-analyzer-*,
clang-diagnostic-*,
concurrency-*,
cppcoreguidelines-*,
hicpp-*,
misc-*,
modernize-*,
performance-*,
portability-*,
readability-*,
-bugprone-easily-swappable-parameters,
-cppcoreguidelines-pro-type-reinterpret-cast,
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
-cppcoreguidelines-pro-bounds-constant-array-index
FormatStyle: file
+15
View File
@@ -0,0 +1,15 @@
---
Diagnostics:
UnusedIncludes: Strict
MissingIncludes: Strict
Completion:
AllScopes: true
InlayHints:
Enabled: No
# Will possibly be supported in clangd 22
Documentation:
CommentFormat: Doxygen
...
+8
View File
@@ -0,0 +1,8 @@
# https://wiki.archlinux.org/title/Gaming#Improving_performance
vm.compaction_proactiveness = 0
vm.watermark_boost_factor = 1
vm.min_free_kbytes = 1048576
vm.watermark_scale_factor = 500
vm.swappiness = 10
vm.zone_reclaim_mode = 0
vm.page_lock_unfairness = 1
+6
View File
@@ -0,0 +1,6 @@
# https://wiki.archlinux.org/title/Gaming#Improving_performance
# Path Mode UID GID Age Argument
w /sys/kernel/mm/lru_gen/enabled - - - - 5
w /sys/kernel/mm/transparent_hugepage/enabled - - - - madvise
w /sys/kernel/mm/transparent_hugepage/shmem_enabled - - - - advise
w /sys/kernel/mm/transparent_hugepage/defrag - - - - never
+8
View File
@@ -0,0 +1,8 @@
SUBSYSTEM=="pci", KERNEL=="0000:03:00.0", ACTION=="add|change", \
ATTR{power_dpm_force_performance_level}="manual", \
ATTR{pp_power_profile_mode}="1"
SUBSYSTEM=="cpu", ACTION=="add|change", \
ATTR{cpufreq/scaling_governor}="powersave", \
ATTR{cpufreq/energy_performance_preference}="balance_performance"
+6
View File
@@ -0,0 +1,6 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"printWidth": 80,
"sortImports": {},
"ignorePatterns": []
}
+13
View File
@@ -0,0 +1,13 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["react", "typescript", "import"],
"ignorePatterns": [],
"rules": {
"no-console": ["warn", { "allow": ["warn", "error"] }],
"typescript/consistent-type-imports": "warn",
"typescript/no-unused-vars": [
"warn",
{ "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }
]
}
}
View File
-1
View File
@@ -62,7 +62,6 @@ select = [
] ]
ignore = [ ignore = [
"A001", "A001",
"D100",
"D101", "D101",
"D202", "D202",
"D203", "D203",
+31
View File
@@ -0,0 +1,31 @@
[lints.rust]
ambiguous_negative_literals = "warn"
closure_returning_async_block = "warn"
elided_lifetimes_in_paths = "warn"
explicit_outlives_requirements = "warn"
ffi_unwind_calls = "warn"
let_underscore_drop = "warn"
linker_messages = "warn"
macro_use_extern_crate = "warn"
meta_variable_misuse = "warn"
missing_unsafe_on_extern = "warn"
non_ascii_idents = "warn"
redundant_imports = "warn"
redundant_lifetimes = "warn"
single_use_lifetimes = "warn"
trivial_numeric_casts = "warn"
unit_bindings = "warn"
unnameable_types = "warn"
unsafe_attr_outside_unsafe = "warn"
unsafe_op_in_unsafe_fn = "warn"
unused_crate_dependencies = "warn"
unused_extern_crates = "warn"
unused_import_braces = "warn"
unused_lifetimes = "warn"
unused_macro_rules = "warn"
unused_qualifications = "warn"
[lints.clippy]
pedantic = { level = "warn", priority = -1 }
similar_names = "allow"
allow_attributes = "warn"
+3
View File
@@ -0,0 +1,3 @@
allow-unwrap-in-tests = true
allow-panic-in-tests = true
+5
View File
@@ -0,0 +1,5 @@
edition = "2024"
max_width = 80
wrap_comments = true
imports_granularity = "Item"
group_imports = "StdExternalCrate"
+479 -320
View File
@@ -1,394 +1,553 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
#
# Copyright 2026 Oscar Wallberg
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Install dotfiles and system configuration from this repo."""
from __future__ import annotations
import argparse import argparse
import filecmp
import platform import platform
import shlex
import shutil import shutil
import subprocess import subprocess
import sys import sys
from abc import ABC, abstractmethod
from dataclasses import dataclass
from pathlib import Path from pathlib import Path
SCRIPT_DIR = Path(__file__).resolve().parent
class InstallerError(BaseException): ... HOME = Path.home()
DISTRO: str = platform.freedesktop_os_release().get("ID", "")
class Installer: class PackageManager(ABC):
def __init__(self, profile: str) -> None: @property
"""Initialize a new installer.""" @abstractmethod
self.script_file = Path(__file__).resolve() def check_cmd(self) -> list[str]: ...
self.script_name = self.script_file.name
self.script_dir = self.script_file.parent @property
self.source_dir = self.script_dir @abstractmethod
self.dest_dir = Path.home() def install_cmd(self) -> list[str]: ...
self.distro = platform.freedesktop_os_release().get("NAME", "Unknown")
self.profile = profile def is_installed(self, name: str) -> bool:
self.has_error = False return (
self.pkg_query = {"Arch Linux": self._pkg_query_arch} subprocess.run(
self.pkgs = { [*self.check_cmd, name],
"Arch Linux base": [ stdout=subprocess.DEVNULL,
"alacritty", stderr=subprocess.DEVNULL,
"tmux", ).returncode
"zsh", == 0
"vim", )
"unzip",
"npm", def install(self, names: list[str]) -> None:
"nvim", subprocess.run([*self.install_cmd, *names], check=True)
"firefox",
class Pacman(PackageManager):
@property
def check_cmd(self) -> list[str]:
return ["pacman", "-Q"]
@property
def install_cmd(self) -> list[str]:
return ["sudo", "pacman", "-S", "--needed"]
class Apt(PackageManager):
@property
def check_cmd(self) -> list[str]:
return ["dpkg-query", "-W", "-f=${Status}"]
@property
def install_cmd(self) -> list[str]:
return ["sudo", "apt", "install"]
def is_installed(self, name: str) -> bool:
r = subprocess.run([*self.check_cmd, name], capture_output=True, text=True)
return r.returncode == 0 and r.stdout.strip() == "install ok installed"
_apt = Apt()
PACKAGE_MANAGERS: dict[str, PackageManager] = {
"arch": Pacman(),
"ubuntu": _apt,
"debian": _apt,
}
PM: PackageManager | None = PACKAGE_MANAGERS.get(DISTRO)
@dataclass(frozen=True)
class Pkg:
default_name: str
distro_names: dict[str, str] | None = None
def name(self, distro: str) -> str:
return (self.distro_names or {}).get(distro, self.default_name)
@dataclass(frozen=True)
class Profile:
pkgs: list[Pkg] | None = None
symlinks: list[str] | None = None
# repo-relative path -> $HOME-relative path
symlink_map: dict[str, str] | None = None
copies: list[str] | None = None
system_installs: list[str] | None = None
PROFILES: dict[str, Profile] = {
"base": Profile(
pkgs=[
Pkg("jq"),
Pkg("lf"),
Pkg("tmux"),
Pkg("vim"),
Pkg("zsh"),
], ],
"Arch Linux hyprland": [ symlinks=[
"libnewt", ".claude/CLAUDE.md",
"hyprland", ".claude/skills",
"uwsm", ".config/fish",
"fnott", ".config/lf",
"pipewire", ".config/opencode",
"wireplumber", ".config/tmux",
"hyprpolkitagent", ".config/yay",
"qt5-wayland", ".gdbinit",
"qt6-wayland", ".vimrc",
"hyprlock",
"hypridle",
"xdg-desktop-portal-hyprland",
"xdg-desktop-portal-gtk",
"hyprland-qt-support",
"waybar",
"rofi",
"wl-clipboard",
"nautilus",
"pasystray",
"playerctl",
"brightnessctl",
"breeze",
"pavucontrol",
"otf-font-awesome",
], ],
} symlink_map={"zsh/rc": ".zshrc"},
self.symlinks = [ copies=[
".claude/settings.json",
".claude/keybindings.json",
".codex/config.toml",
],
system_installs=[
"etc/sysctl.d/99-network.conf",
"etc/ssh/sshd_config.d/sshd_harden.conf",
],
),
"desktop": Profile(
pkgs=[
Pkg("foot"),
Pkg("firefox"),
Pkg("mupdf"),
],
symlinks=[
".config/alacritty", ".config/alacritty",
".config/dolphinrc", ".config/dolphinrc",
".config/dunst", ".config/dunst",
".config/fish",
".config/fnott",
".config/foot", ".config/foot",
".config/fontconfig",
".config/frogminer", ".config/frogminer",
".config/ghostty", ".config/ghostty",
".config/hypr",
".config/i3", ".config/i3",
".config/i3status", ".config/i3status",
".config/lf",
".config/kde-mimeapps.list", ".config/kde-mimeapps.list",
".config/kdeglobals",
".config/kglobalshortcutsrc", ".config/kglobalshortcutsrc",
".config/klipperrc", ".config/klipperrc",
".config/kwinrc", ".config/kwinrc",
".config/mimeapps.list",
".config/picom", ".config/picom",
".config/pipewire",
".config/rofi", ".config/rofi",
".config/strawberry", ".config/strawberry",
".config/tmux", ".config/vlc",
".config/uwsm",
".config/waybar",
".config/wezterm", ".config/wezterm",
".config/xdg-desktop-portal", ".config/wireplumber",
".config/yay",
".config/zed", ".config/zed",
".local/bin", ".local/share/dbus-1",
".local/share/easyeffects",
".local/share/fonts", ".local/share/fonts",
".local/share/konsole", ".local/share/konsole",
".local/share/kxmlgui5/dolphin/dolphinui.rc",
".vimrc",
".xinit-scripts", ".xinit-scripts",
".xinitrc", ".xinitrc",
".Xresources", ".Xresources",
".zprofile", ],
] copies=[
self.copies = [ ".config/gtk-3.0/bookmarks",
".config/gtk-3.0", ".config/gtk-3.0/settings.ini",
".config/gtk-4.0", ".config/gtk-4.0/settings.ini",
".gtkrc-2.0", ".gtkrc-2.0",
] ],
self.symlink_map = {"zsh/rc": ".zshrc"} ),
self.gsettings = [ "gaming": Profile(
["org.gnome.desktop.interface", "color-scheme", "prefer-dark"] pkgs=[
] Pkg("steam"),
],
system_installs=[
"etc/sysctl.d/99-gaming-perf.conf",
"etc/tmpfiles.d/99-gaming-perf.conf",
"etc/udev/rules.d/99-perf.rules",
],
),
}
@staticmethod
def _pkg_query_arch(package: str) -> bool:
"""
Check if package is installed on Arch Linux using pacman.
Returns: @dataclass(frozen=True)
True if package is found, otherwise False. class Resolved:
""" pkgs: list[Pkg]
result = subprocess.run( symlinks: list[str]
["pacman", "-Qi", package], symlink_map: dict[str, str]
capture_output=True, copies: list[str]
text=True, system_installs: list[str]
check=False,
def apply_filter(ctx: Context, resolved: Resolved, filters: list[str]) -> Resolved:
wanted = set(filters)
symlinks = [p for p in resolved.symlinks if p in wanted]
symlink_map = {s: d for s, d in resolved.symlink_map.items() if s in wanted}
copies = [p for p in resolved.copies if p in wanted]
system_installs = [p for p in resolved.system_installs if p in wanted]
matched = set(symlinks) | set(symlink_map) | set(copies) | set(system_installs)
for f in wanted - matched:
ctx.error(f"--filter path not in selected profiles: {f!r}")
return Resolved(
pkgs=[],
symlinks=symlinks,
symlink_map=symlink_map,
copies=copies,
system_installs=system_installs,
) )
return result.returncode == 0
def error(self, msg: str) -> None:
"""Print error message and set error flag.""" def resolve_profiles(ctx: Context, profile_names: list[str]) -> Resolved:
self.has_error = True pkgs: list[Pkg] = []
symlinks: list[str] = []
symlink_map: dict[str, str] = {}
copies: list[str] = []
system_installs: list[str] = []
seen: set[str] = set()
for name in profile_names:
if name in seen:
continue
seen.add(name)
profile = PROFILES.get(name)
if profile is None:
ctx.error(f"unknown profile: {name!r}")
continue
if profile.pkgs:
pkgs.extend(profile.pkgs)
if profile.symlinks:
symlinks.extend(profile.symlinks)
if profile.symlink_map:
symlink_map.update(profile.symlink_map)
if profile.copies:
copies.extend(profile.copies)
if profile.system_installs:
system_installs.extend(profile.system_installs)
return Resolved(pkgs, symlinks, symlink_map, copies, system_installs)
class Context:
def __init__(self, args: argparse.Namespace) -> None:
self.force: bool = args.force
self.ignore_existing: bool = args.ignore_existing
self.diff: bool = args.diff
self.errors: list[str] = []
def error(self, *parts: str) -> None:
msg = " ".join(parts)
self.errors.append(msg)
print(f"Error: {msg}", file=sys.stderr) print(f"Error: {msg}", file=sys.stderr)
def check_packages_installed(self) -> None:
"""Check if required packages are installed."""
profile = f"{self.distro} {self.profile}"
if profile not in self.pkgs:
self.error(f"No package list defined for {profile}")
return
if self.distro not in self.pkg_query: def prompt_yes_no(question: str, default: bool = False) -> bool:
self.error(f"No package query function for {self.distro}") if not sys.stdin.isatty():
return return default
suffix = " [Y/n] " if default else " [y/N] "
pkg_list: list[str] = []
if self.profile != "base":
base = f"{self.distro} base"
if base in self.pkgs:
pkg_list.extend(self.pkgs[base])
pkg_list.extend(self.pkgs[profile])
query_func = self.pkg_query[self.distro]
missing: list[str] = []
for pkg in pkg_list:
if not query_func(pkg):
missing.append(pkg)
if missing:
self.error(f"missing {len(missing)} packages: {' '.join(missing)}")
def remove_symlink(self, rel_path: str) -> None:
"""
Remove a symlink.
Raises:
InstallerError: on error
"""
link_path = self.dest_dir / rel_path
if link_path.is_symlink():
src = link_path.resolve()
print(f"Removing symlink: {link_path} -> {src}")
link_path.unlink()
elif link_path.exists():
raise InstallerError(
f"object to be removed is not a symlink: {link_path}"
)
def remove_all_symlinks(self) -> None:
"""Remove all symlinks."""
for link in self.symlinks:
self.remove_symlink(link)
for dst in self.symlink_map.values():
self.remove_symlink(dst)
def create_symlink(
self,
rel_src: str,
rel_dst: str,
force: bool = False,
ignore: bool = False,
) -> None:
"""
Create a symlink.
Raises:
InstallerError: on error
"""
if not rel_src or not rel_dst:
raise InstallerError(
f"missing src or dst argument: src='{rel_src}', dst='{rel_dst}'"
)
src = self.script_dir / rel_src
dst = self.dest_dir / rel_dst
dst_parent = dst.parent
if not src.exists():
raise InstallerError(f"source path does not exist: {src}")
# Create parent directory if needed
if not dst_parent.exists():
print(f"Creating parent: {dst_parent}")
dst_parent.mkdir(parents=True, exist_ok=True)
if dst.is_symlink():
if ignore or dst.resolve() == src:
return
if force:
self.remove_symlink(rel_dst)
else:
raise InstallerError(f"symbolic link already exists: {dst}")
elif dst.exists():
raise InstallerError(
f"path already exists and is not a symlink: {dst}"
)
print(f"Creating link: {dst} -> {rel_src}")
dst.symlink_to(src)
@staticmethod
def remove_path(target: Path) -> None:
"""Remove path using gio trash if available, otherwise rm."""
print(f"Trashing item: {target}")
subprocess.run(["gio", "trash", str(target)], check=True)
def copy_item(
self,
rel_src: str,
rel_dst: str,
force: bool = False,
ignore_existing: bool = False,
) -> None:
"""
Copy an item.
Raises:
InstallerError: on error
"""
if not rel_src or not rel_dst:
raise InstallerError(
f"missing src or dst argument: src='{rel_src}', dst='{rel_dst}'"
)
src = self.script_dir / rel_src
dst = self.dest_dir / rel_dst
dst_parent = dst.parent
if not src.exists():
raise InstallerError(f"source path does not exist: {src}")
# Create parent directory if needed
if not dst_parent.exists():
print(f"Creating parent: {dst_parent}")
dst_parent.mkdir(parents=True, exist_ok=True)
if dst.exists():
if force:
self.remove_path(dst)
elif ignore_existing:
return
else:
raise InstallerError(f"path already exists: {dst}")
print(f"Copying item: from {rel_src} to {dst_parent}/")
if src.is_dir():
shutil.copytree(src, dst)
else:
shutil.copy2(src, dst)
def create_all_symlinks(
self, force: bool = False, ignore_existing: bool = False
) -> None:
"""Create all symlinks."""
for link in self.symlinks:
self.create_symlink(link, link, force, ignore_existing)
for src, dst in self.symlink_map.items():
self.create_symlink(src, dst, force, ignore_existing)
def copy_all_items(
self, force: bool = False, ignore_existing: bool = False
) -> None:
"""Copy all items."""
for item in self.copies:
self.copy_item(item, item, force, ignore_existing)
def check_terminfo(self) -> None:
"""Check if tmux-256color terminfo is available."""
try: try:
answer = input(question + suffix).strip().lower()
except EOFError:
return default
if answer in ("y", "yes"):
return True
if answer in ("n", "no"):
return False
return default
def check_packages_installed(ctx: Context, pkgs: list[Pkg]) -> None:
if not pkgs:
return
if PM is None:
ctx.error(f"don't know how to manage packages on distro {DISTRO!r}")
return
missing = [name for pkg in pkgs if not PM.is_installed(name := pkg.name(DISTRO))]
if not missing:
return
print(f"Missing packages: {', '.join(missing)}")
if not prompt_yes_no(f"Install with `{shlex.join([*PM.install_cmd, *missing])}`?"):
ctx.error(f"packages not installed: {', '.join(missing)}")
return
try:
PM.install(missing)
except subprocess.CalledProcessError as e:
ctx.error(f"package install failed (exit {e.returncode})")
def check_terminfo(ctx: Context) -> None:
result = subprocess.run( result = subprocess.run(
["infocmp", "tmux-256color"], ["infocmp", "tmux-256color"],
capture_output=True, stdout=subprocess.DEVNULL,
text=True,
check=False,
) )
if result.returncode != 0: if result.returncode != 0:
self.error( ctx.error("Missing terminfo for tmux-256color. Try installing ncurses-term.")
"Missing terminfo for tmux-256color. Try installing ncurses-term."
)
except FileNotFoundError:
self.error("infocmp command not found")
def set_gsettings(self) -> None:
"""Set gsettings."""
for setting in self.gsettings:
result = subprocess.run(
["gsettings", "set", *setting],
capture_output=True,
text=True,
check=False,
)
if result.returncode != 0:
self.error(f"Failed to set gsettings: {setting}")
def run( def _describe_kind(p: Path) -> str:
self, return "directory" if p.is_dir() else "regular file"
force: bool = False,
ignore: bool = False,
remove: bool = False, def remove_symlink(ctx: Context, rel_dst: str) -> None:
) -> None: link = HOME / rel_dst
"""Run main run function.""" if link.is_symlink():
if remove: target = link.resolve()
self.remove_all_symlinks() print(f"Removing symlink: {link} -> {target}")
link.unlink()
elif link.exists():
ctx.error(
"object to be removed is not a symlink:",
f"{link}: {_describe_kind(link)}",
)
def remove_all_symlinks(
ctx: Context, symlinks: list[str], symlink_map: dict[str, str]
) -> None:
for rel in symlinks:
remove_symlink(ctx, rel)
for rel_dst in symlink_map.values():
remove_symlink(ctx, rel_dst)
def create_symlink(ctx: Context, rel_src: str, rel_dst: str) -> None:
src = SCRIPT_DIR / rel_src
dst = HOME / rel_dst
if not src.exists():
ctx.error(f"the following source path does not exist: {src}")
return return
self.check_packages_installed() if not dst.parent.is_dir():
self.check_terminfo() print(f"Creating parent: {dst.parent}")
self.create_all_symlinks(force, ignore) dst.parent.mkdir(parents=True, exist_ok=True)
self.copy_all_items(force, ignore)
self.set_gsettings() if dst.is_symlink():
dst_target = dst.resolve()
if dst_target == src.resolve():
return
if ctx.force:
remove_symlink(ctx, rel_dst)
elif ctx.ignore_existing:
return
else:
ctx.error(
"symlink exists but points elsewhere:",
f"{dst} -> {dst_target}",
)
return
elif dst.exists():
ctx.error(
"path already exists but is not a symlink:",
f"{dst}: {_describe_kind(dst)}",
)
return
print(f"Creating link: {dst} -> {src}")
dst.symlink_to(src)
def main() -> None: def remove_path(path: Path) -> None:
"""Run installer.""" print(f"Trashing item: {path}")
subprocess.run(["gio", "trash", str(path)], check=True)
def copy_item(ctx: Context, rel_src: str, rel_dst: str) -> None:
src = SCRIPT_DIR / rel_src
dst = HOME / rel_dst
if not src.is_file():
ctx.error(f"source is not a regular file: {src}")
return
if not dst.parent.is_dir():
print(f"Creating parent: {dst.parent}")
dst.parent.mkdir(parents=True, exist_ok=True)
if dst.exists():
if filecmp.cmp(src, dst, shallow=False):
return
if ctx.diff:
subprocess.run(["diff", "--color=always", "-u", str(dst), str(src)])
if ctx.force:
remove_path(dst)
elif ctx.ignore_existing:
return
else:
ctx.error(f"file already exists and differs: {dst}")
return
print(f"Copying item: from {rel_src} to {dst.parent}/")
shutil.copy2(src, dst)
def _sudo_test(*args: str) -> bool:
return subprocess.run(["sudo", "test", *args]).returncode == 0
def _sudo_cmp(a: Path, b: Path) -> bool:
return subprocess.run(["sudo", "cmp", "-s", str(a), str(b)]).returncode == 0
def install_system_file(ctx: Context, rel: str) -> None:
src = SCRIPT_DIR / rel
dst = Path("/") / rel
if not src.exists():
ctx.error(f"the following source path does not exist: {src}")
return
if not _sudo_test("-d", str(dst.parent)):
print(f"Creating parent: {dst.parent}")
subprocess.run(["sudo", "mkdir", "-p", str(dst.parent)], check=True)
if _sudo_test("-e", str(dst)):
if _sudo_cmp(src, dst):
return
if ctx.diff:
subprocess.run(["sudo", "diff", "--color=always", "-u", str(dst), str(src)])
if ctx.force:
print(f"Overwriting: {dst}")
elif ctx.ignore_existing:
return
else:
ctx.error(f"system file already exists and differs: {dst}")
return
print(f"Installing: {rel} -> {dst}")
subprocess.run(["sudo", "install", "-m", "644", str(src), str(dst)], check=True)
def create_all_symlinks(
ctx: Context, symlinks: list[str], symlink_map: dict[str, str]
) -> None:
for rel in symlinks:
create_symlink(ctx, rel, rel)
for src, dst in symlink_map.items():
create_symlink(ctx, src, dst)
def copy_all_items(ctx: Context, rels: list[str]) -> None:
for rel in rels:
copy_item(ctx, rel, rel)
def install_all_system_files(ctx: Context, rels: list[str]) -> None:
if not rels:
return
subprocess.run(["sudo", "-v"], check=True)
for rel in rels:
install_system_file(ctx, rel)
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Linux dotfiles setup script", description="Install dotfiles and system configuration.",
formatter_class=argparse.RawDescriptionHelpFormatter,
) )
parser.add_argument( parser.add_argument(
"profile", "-F",
nargs="?",
default="hyprland",
help="Profile to install (default: hyprland)",
)
parser.add_argument(
"-f",
"--force", "--force",
action="store_true", action="store_true",
help="Overwrite any existing links", help="Overwrite any existing links or files",
) )
parser.add_argument( parser.add_argument(
"-i", "-i",
"--ignore", "--ignore-existing",
action="store_true", action="store_true",
help="Ignore existing symlinks", help="Ignore existing links or files",
) )
parser.add_argument( parser.add_argument(
"-r", "-r",
"--remove", "--remove-existing",
action="store_true", action="store_true",
help="Remove any existing symlinks", help="Remove any existing symlinks",
) )
parser.add_argument(
args = parser.parse_args() "-d",
"--diff",
installer = Installer(args.profile) action="store_true",
try: help="Show unified diff when a managed file differs",
installer.run(
force=args.force,
ignore=args.ignore,
remove=args.remove,
) )
except InstallerError as e: extras = sorted(PROFILES.keys() - {"base"})
installer.error(str(e)) parser.add_argument(
"profiles",
nargs="*",
metavar="PROFILE",
help=f"Extra profiles to apply on top of base (available: {', '.join(extras)})",
)
parser.add_argument(
"-f",
"--filter",
action="append",
metavar="PATH",
default=[],
dest="filters",
help=(
"Restrict the run to a single repo-relative path from the "
"selected profiles. Repeat to allow multiple paths. Skips "
"package and terminfo checks."
),
)
return parser.parse_args()
if installer.has_error:
sys.exit(1) def main() -> int:
args = parse_args()
ctx = Context(args)
resolved = resolve_profiles(ctx, ["base", *args.profiles])
if args.filters:
resolved = apply_filter(ctx, resolved, args.filters)
if args.remove_existing:
remove_all_symlinks(ctx, resolved.symlinks, resolved.symlink_map)
else:
if not args.filters:
check_terminfo(ctx)
check_packages_installed(ctx, resolved.pkgs)
create_all_symlinks(ctx, resolved.symlinks, resolved.symlink_map)
copy_all_items(ctx, resolved.copies)
install_all_system_files(ctx, resolved.system_installs)
return 1 if ctx.errors else 0
if __name__ == "__main__": if __name__ == "__main__":
main() sys.exit(main())
+1 -4
View File
@@ -16,10 +16,7 @@ bindkey ' ' magic-space
# https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Completion # https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Completion
bindkey -M menuselect '^[[Z' reverse-menu-complete bindkey -M menuselect '^[[Z' reverse-menu-complete
bindkey -M menuselect '^M' .accept-line # Immediately execute command line on <Enter> bindkey -M menuselect '^F' vi-insert
bindkey -M menuselect '^F' vi-insert # Toggle interactive mode
bindkey '^P' history-beginning-search-backward
bindkey '^N' history-beginning-search-forward
# See: https://zsh.sourceforge.io/Doc/Release/Completion-System.html#Standard-Styles # See: https://zsh.sourceforge.io/Doc/Release/Completion-System.html#Standard-Styles
# :completion:<function>:<completer>:<command>:<argument>:<tag> # :completion:<function>:<completer>:<command>:<argument>:<tag>
+69
View File
@@ -33,6 +33,74 @@ setopt INC_APPEND_HISTORY_TIME
# Emacs mode # Emacs mode
bindkey -e bindkey -e
############
# Keybinds #
############
# History search keybindings
bindkey '^P' history-beginning-search-backward
bindkey '^N' history-beginning-search-forward
# Load history search widgets
autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
# Fix for buggy behaviour of history search
# See https://github.com/zsh-users/zsh-autosuggestions/issues/619#issuecomment-904193190
ZSH_AUTOSUGGEST_CLEAR_WIDGETS+=(history-beginning-search-backward-end history-beginning-search-forward-end)
if ! infocmp "$TERM" >/dev/null; then
echo "TERM $TERM not supported on your system!" >&2
echo "Some keybindings might not work properly." >&2
fi
if [[ -n $terminfo ]]; then
# create a zkbd compatible hash;
# to add other keys to this hash, see: man 5 terminfo
typeset -g -A key
key[Home]=${terminfo[khome]}
key[End]=${terminfo[kend]}
key[Insert]=${terminfo[kich1]}
key[Delete]=${terminfo[kdch1]}
key[Up]=${terminfo[kcuu1]}
key[Down]=${terminfo[kcud1]}
key[Left]=${terminfo[kcub1]}
key[Right]=${terminfo[kcuf1]}
key[PageUp]=${terminfo[kpp]}
key[PageDown]=${terminfo[knp]}
key[CtrlLeft]=${terminfo[kLFT5]}
key[CtrlRight]=${terminfo[kRIT5]}
# Function mapping
[[ -n "${key[Home]}" ]] && bindkey "${key[Home]}" beginning-of-line
[[ -n "${key[End]}" ]] && bindkey "${key[End]}" end-of-line
[[ -n "${key[Insert]}" ]] && bindkey "${key[Insert]}" overwrite-mode
[[ -n "${key[Delete]}" ]] && bindkey "${key[Delete]}" delete-char
[[ -n "${key[Up]}" ]] && bindkey "${key[Up]}" history-beginning-search-backward-end
[[ -n "${key[Down]}" ]] && bindkey "${key[Down]}" history-beginning-search-forward-end
[[ -n "${key[Left]}" ]] && bindkey "${key[Left]}" backward-char
[[ -n "${key[Right]}" ]] && bindkey "${key[Right]}" forward-char
[[ -n "${key[PageUp]}" ]] && bindkey "${key[PageUp]}" beginning-of-history
[[ -n "${key[PageDown]}" ]] && bindkey "${key[PageDown]}" end-of-history
[[ -n "${key[CtrlLeft]}" ]] && bindkey "${key[CtrlLeft]}" backward-word
[[ -n "${key[CtrlRight]}" ]] && bindkey "${key[CtrlRight]}" forward-word
bindkey "^R" history-incremental-search-backward
# Enable terminal application mode during zle editing.
# This ensures special keys (arrows, Home, End, etc.) send escape sequences
# that match the terminfo database, making our keybindings work correctly.
if (( ${+terminfo[smkx]} && ${+terminfo[rmkx]} )); then
autoload -Uz add-zle-hook-widget
function zle_application_mode_start { echoti smkx; }
function zle_application_mode_stop { echoti rmkx; }
add-zle-hook-widget -Uz zle-line-init zle_application_mode_start
add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop
fi
fi
################### ###################
# Shell Variables # # Shell Variables #
################### ###################
@@ -56,6 +124,7 @@ export DIFFPROG="nvim -d"
export NNN_TRASH=2 export NNN_TRASH=2
export NNN_PLUG='' export NNN_PLUG=''
export MESA_WHICH_LLVM=1 export MESA_WHICH_LLVM=1
export CC=gcc
############# #############
# LS_COLORS # # LS_COLORS #