Compare commits

161 Commits

Author SHA1 Message Date
warg 067e353178 fix: disable mouse accel 2025-08-02 18:13:13 +02:00
warg 7be76b6d1d fix: remove debug message 2025-08-02 17:17:49 +02:00
warg 3d6aea794c fix: add a base arch profile 2025-08-02 14:05:36 +02:00
warg b201011fa9 fix: theming issues and add missing packages 2025-08-02 13:51:59 +02:00
Oscar Wallberg 20dc7268e2 feat: rewrite setup script in python 2025-08-01 13:21:14 +02:00
Oscar Wallberg ced9d30f82 fix(setup): make it profile based 2025-08-01 13:20:48 +02:00
warg 81b2f5f82c fix: show the menu to allow for cancelling to enter tty 2025-08-01 12:39:51 +02:00
warg 8f695dcc2d fix: autostart default uwsm session 2025-08-01 12:39:51 +02:00
warg 80292db194 feat: use fnott for notifications 2025-08-01 12:39:51 +02:00
warg 8c33707900 feat: add lock handling 2025-08-01 12:39:51 +02:00
warg 5a592ff1b2 feat: change to hyprland 2025-08-01 12:39:51 +02:00
Oscar Wallberg 677d54a8b1 fix: replace ruff config with full pyproject template 2025-08-01 11:34:19 +02:00
Oscar Wallberg f49e44c303 feat(vim): add undo tree 2025-08-01 11:34:05 +02:00
warg 5687898ac3 fix(linux-tkg): sync config with master 2025-07-24 21:48:23 +02:00
warg 1a837eda56 fix(alacritty): reduce default window size 2025-07-24 21:48:01 +02:00
warg 7411e31d67 feat: add sysctl network config 2025-07-16 23:04:36 +02:00
warg ea2483d2a5 fix: update xremap config 2025-07-14 13:40:37 +02:00
warg e2431446e9 fix(xremap): add additional setup step 2025-07-05 08:57:28 +02:00
warg a5997a197c feat: add xremap 2025-07-05 08:55:25 +02:00
warg 519dc57efc chore(linux-tkg): bump to linux 6.15 2025-06-15 17:06:08 +02:00
warg 21a905724f fix(kde): put application launcher back on Meta 2025-05-30 02:16:33 +02:00
warg 409851a22e feat(kde): set overview keybind to the meta 2025-05-15 00:28:57 +02:00
warg 96ce4ba12d feat(linux-tkg): update to 6.14 2025-05-14 14:54:38 +02:00
warg 8828947c66 feat(wezterm): add keybind for last tab 2025-05-14 14:54:15 +02:00
warg 0a3befa677 feat(wezterm): add onedark 2025-05-14 14:53:56 +02:00
warg 1551f4750c fix(wezterm): format lua code 2025-05-05 16:35:35 +02:00
warg 3c56f15af6 fix(vim): set darker background 2025-05-02 05:05:21 +02:00
warg 3ac9e3c2e9 feat(vim): add NERDTree 2025-05-02 04:57:59 +02:00
Oscar Wallberg e43ba5b82f fix(alacritty): update colors 2025-05-01 02:18:49 +02:00
warg 711a3bf5f1 feat(zsh): change some dircolors 2025-05-01 02:15:10 +02:00
warg be541c1422 fix(zsh): track dircolors file 2025-05-01 01:46:18 +02:00
Oscar Wallberg d48ed3960d feat(colorscheme): change to onedark 2025-04-30 19:36:47 +02:00
Oscar Wallberg cda15e8850 fix: bootstrap 2025-04-30 19:36:26 +02:00
Oscar Wallberg 6876b3b042 feat(alacritty): change theme to onedark 2025-04-29 19:33:48 +02:00
Oscar Wallberg 9da2a6b053 Revert "feat(fonts): remove nerd font"
This reverts commit 1063c3351d.
2025-04-29 09:44:59 +02:00
Oscar Wallberg c57b861523 fix(setup): set executable 2025-04-29 09:32:31 +02:00
Oscar Wallberg c2a2132898 fix(zed): disable cursor blink 2025-04-29 09:32:13 +02:00
warg c93bb12638 feat: add zed config 2025-04-28 07:52:24 +02:00
Oscar Wallberg 922b02c4ea feat: add vim maps for visual mode diff 2025-04-28 03:16:52 +02:00
warg 22000d0191 fix(alacritty): remove y-padding 2025-04-20 21:34:58 +02:00
warg a5ee4eb418 fix: change default terminal to alacritty 2025-04-20 21:28:48 +02:00
warg 8e71219816 fix: update kde config 2025-04-20 21:27:47 +02:00
warg d02c0d93f5 fix(alacritty): update config 2025-04-20 21:27:47 +02:00
Oscar Wallberg b34e7b7e3d fix(zsh): skip sudo for cmd in preexec 2025-04-20 14:39:52 +02:00
Oscar Wallberg 6389b29173 fix: more consistent terminal title 2025-04-19 00:10:43 +02:00
warg fd54cf10d3 feat(kwinrc): add some good to have config 2025-04-02 01:26:34 +02:00
warg 8608f11bb4 feat: add ruff toml 2025-03-29 22:27:52 +01:00
Oscar Wallberg 8312cc5925 chore: update kde settings 2025-03-27 22:56:42 +01:00
warg 8321502031 chore: update kde settings 2025-03-27 22:55:32 +01:00
Oscar Wallberg 7a3447d131 feat(strawberry): update settings 2025-03-27 22:52:57 +01:00
Oscar Wallberg d3c42090a1 feat: add strawberry config 2025-03-27 18:18:00 +01:00
Oscar Wallberg 9cf5f8f1b5 fix(ghostty): adjust window width to fit 2 nvim windows 2025-03-07 12:06:02 +01:00
Oscar Wallberg 189ad2b56f fix(ghostty): use link-url over default link behavior 2025-03-07 05:50:55 +01:00
Oscar Wallberg eecf91c960 fix(linux): update config 2025-03-07 05:38:08 +01:00
Oscar Wallberg c9b3e72807 Revert "fix(ghostty): increase width to fit 2x80 cols"
This reverts commit 64e7637d29.
2025-02-19 22:16:44 +01:00
Oscar Wallberg 64e7637d29 fix(ghostty): increase width to fit 2x80 cols 2025-02-19 18:26:41 +01:00
Oscar Wallberg 0aa8048eea fix(ghostty): update window padding 2025-02-14 18:52:11 +01:00
Oscar Wallberg dc60872abd fix(ghostty): adjust window padding 2025-02-09 16:16:53 +01:00
Oscar Wallberg 2cc2c8d9bb fix(ghostty): prefer server-side decorations explicitly 2025-02-09 16:08:19 +01:00
Oscar Wallberg 77649428fd 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
Oscar Wallberg 66c52a15d9 fix: update kde mappings 2025-02-09 13:02:42 +01:00
Oscar Wallberg 72791dd6da feat(linux-tkg): bump linux to 6.12 2025-02-09 13:02:07 +01:00
Oscar Wallberg 909618c686 feat(ghostty): switch to ghostty 2025-01-07 12:09:26 +01:00
Oscar Wallberg 87d520b03d feat: add some bindings 2024-11-18 17:18:16 +01:00
Oscar Wallberg a96a77df6d fix(alacritty): update dimensions 2024-11-18 17:17:23 +01:00
Oscar Wallberg a528a1d4b4 feat: add klipperrc 2024-10-31 19:19:35 +01:00
Oscar Wallberg b900cb788f feat: add amdgpu power profile service 2024-10-31 19:18:54 +01:00
Oscar Wallberg 3fa59bd2b7 fix(shortcuts): update kde shortcuts 2024-10-31 19:18:20 +01:00
Oscar Wallberg 581297ae85 fix(tmux): set clipboard to external and update keymaps 2024-10-31 19:14:48 +01:00
Oscar Wallberg 788faa2eca fix(linux-tkg): update config 2024-10-31 19:14:33 +01:00
Oscar Wallberg 09a25a09b8 fix(wezterm): update config 2024-10-31 19:14:00 +01:00
Oscar Wallberg 5c60435fa5 fix: update xresources 2024-10-31 19:13:36 +01:00
Oscar Wallberg 5b3555e6df feat(setup): add wezterm 2024-10-31 19:13:13 +01:00
Oscar Wallberg a36efad994 fix(alacritty): migrate config 2024-10-31 19:12:51 +01:00
Oscar Wallberg 7f5fee9b7f feat(vim): add some vim config 2024-10-31 05:04:25 +01:00
Oscar Wallberg fb6045a490 feat(kde): add keyboard shortcuts 2024-10-23 14:05:42 +02:00
Oscar Wallberg 894184014e fix(setup): update print outs 2024-10-23 14:01:33 +02:00
Oscar Wallberg 65309d2bb9 fix(setup): make copy item work with FORCE and IGNORE_EXISTING 2024-10-23 14:01:01 +02:00
Oscar Wallberg b9c91a61d3 fix(setup): proceed on already existing copy paths 2024-10-23 13:44:15 +02:00
Oscar Wallberg 0252b222f8 fix(foot): add some padding 2024-10-23 05:52:50 +02:00
Oscar Wallberg 373f35c01b feat(dolphin): Set open external in new tab 2024-10-23 05:47:45 +02:00
Oscar Wallberg 9ab77c8815 feat(zsh): set MESA_WHICH_LLVM 2024-10-23 05:47:16 +02:00
Oscar Wallberg 720184ec1c feat: add foot 2024-10-23 05:47:03 +02:00
Oscar Wallberg 360b2f66f9 feat(tmux): enable jumping to prev/next prompts in vi-copy-mode 2024-10-23 05:42:42 +02:00
Oscar Wallberg 910f46d0cc fix(alacritty): update font size 2024-10-15 19:02:44 +02:00
Oscar Wallberg 7989440d06 fix(alacritty): update window dimensions 2024-10-15 19:02:08 +02:00
Oscar Wallberg bd1020783d fix(gitignore): remove gtk ignores 2024-09-16 00:42:51 +02:00
Oscar Wallberg 32f0f5968b Revert "feat: add kglobalshortcutsrc"
This reverts commit 54b999e405.
2024-09-16 00:41:56 +02:00
Oscar Wallberg 7e76f825c7 feat(setup): copy gtk-related config instead of symlinking 2024-09-16 00:40:03 +02:00
Oscar Wallberg 54b999e405 feat: add kglobalshortcutsrc 2024-09-16 00:31:59 +02:00
Oscar Wallberg c8ef2f57fd fix(setup): add kde-mimeapps.list 2024-09-16 00:31:25 +02:00
Oscar Wallberg 06bb3b1083 fix(setup): add konsole 2024-09-16 00:30:55 +02:00
Oscar Wallberg 864dafa163 fix(dokphin): update settings 2024-09-15 21:40:27 +02:00
Oscar Wallberg 5cf856728d feat(konsole): add konsole settings 2024-09-15 21:38:19 +02:00
Oscar Wallberg 90e97a9117 fix(lfrc): change mode to perm 2024-09-13 16:29:45 +02:00
Oscar Wallberg 0eb7b8bf67 fix(zsh): skip setting terminal title if ssh session 2024-09-13 15:33:45 +02:00
Oscar Wallberg 5c87341977 feat(lf): add mode, user and group info parameters 2024-09-13 03:42:50 +02:00
Oscar Wallberg e22ae4e5c1 feat: add keychron via rule 2024-09-13 03:42:38 +02:00
Oscar Wallberg 1d713d02d2 fix: add gtk directories to gitignore 2024-09-12 02:35:18 +02:00
Oscar Wallberg 8d094bacc6 fix(gtk2): remove setting 2024-09-12 02:32:39 +02:00
Oscar Wallberg 7831e7f29f Revert "feat: remove gtk config"
This reverts commit 477af9c3ac6c442226dab070399bec0d8febf210.
2024-09-12 02:30:49 +02:00
Oscar Wallberg c4518509c2 fix(tmux): fix escape delay 2024-09-10 07:03:21 +02:00
Oscar Wallberg b23e192905 feat(mimeapps): use associations only with KDE 2024-09-09 02:09:22 +02:00
Oscar Wallberg c0dfb8e350 feat(mimeapps): add mpv associations 2024-09-09 02:02:07 +02:00
Oscar Wallberg c915ba259b fix(mimeapps): only track default applications 2024-09-09 02:01:37 +02:00
Oscar Wallberg 5fa63e3ef0 feat(zsh): add cargo bin to path 2024-09-09 01:40:38 +02:00
Oscar Wallberg fd8fd52488 fix(setup): update error messages 2024-09-03 12:15:39 +02:00
Oscar Wallberg 5db6d3da6d feat: add dolphin config 2024-09-03 12:14:56 +02:00
Oscar Wallberg ae200fa07b feat(mimeapps): update defaults for kde 2024-09-03 12:11:11 +02:00
Oscar Wallberg de40e96371 feat: remove gtk config 2024-09-03 12:08:40 +02:00
Oscar Wallberg 724911b983 feat: add mimeapps list 2024-08-24 17:13:16 +02:00
Oscar Wallberg 949ec26a92 fix(alacritty): restore previous dimensions 2024-08-24 17:11:56 +02:00
Oscar Wallberg 628a64791e feat(frogminer): add linux-tkg config 2024-08-23 16:49:09 +02:00
Oscar Wallberg 25a30b71e0 feat(alacritty): enable decorations 2024-08-23 16:48:44 +02:00
Oscar Wallberg 183f0ea978 fix(tmux): change navigation bindings 2024-08-23 16:04:45 +02:00
Oscar Wallberg b2042b1100 fix(alacritty): update window properties 2024-08-23 16:04:05 +02:00
Oscar Wallberg 1063c3351d feat(fonts): remove nerd font 2024-08-08 23:03:52 +02:00
Oscar Wallberg d5e9e4510e feat(zsh): remove approximation completer 2024-08-04 19:44:22 +02:00
Oscar Wallberg 97539a8878 feat(fish): add some config 2024-08-04 14:30:23 +02:00
Oscar Wallberg 76c16400b3 feat(zsh): disable completion group names 2024-08-04 01:44:55 +02:00
Oscar Wallberg 006d91c2e4 fix(setup): improve error handling 2024-08-03 04:40:16 +02:00
Oscar Wallberg 5384722cd5 feat(setup): add force flag 2024-08-03 04:01:41 +02:00
Oscar Wallberg 6af7e68509 fix(setup): fix check for symlink 2024-08-03 03:57:04 +02:00
Oscar Wallberg 0069028c07 fix(setup): fix order of packages/config 2024-08-03 03:31:15 +02:00
Oscar Wallberg db4e9979c1 feat(fish): add fish config 2024-08-03 03:27:17 +02:00
Oscar Wallberg d4a444099c fix(zsh): add alias for grep coloring 2024-08-01 12:37:23 +02:00
Oscar Wallberg 230c2d4047 feat(zsh): refine syntax highlighting 2024-08-01 10:13:28 +02:00
Oscar Wallberg 441ad36127 fix(zsh): fix coloring for ambigous completions 2024-08-01 10:06:33 +02:00
Oscar Wallberg 7b764c23b9 feat(zsh): add auto-suggestions plugin 2024-08-01 09:01:08 +02:00
Oscar Wallberg a239deb66f fix(zsh): ask to show large number of completions 2024-07-31 22:39:47 +02:00
Oscar Wallberg 34ec1ccb45 fix(zsh): disable immediate menu completion 2024-07-31 22:39:26 +02:00
Oscar Wallberg 9a5d8e7397 fix(wezterm): update title 2024-07-31 21:55:41 +02:00
Oscar Wallberg 88223a67cc fix(zsh): add go bin to path 2024-07-31 21:53:52 +02:00
Oscar Wallberg c7fcce2b0c fix(alacritty): disable dynamic title 2024-07-31 21:53:35 +02:00
Oscar Wallberg e11866eb06 fix(wezterm): set title 2024-07-31 21:49:35 +02:00
Oscar Wallberg 13250a6f07 feat(dircolors): make it more portable across systems 2024-07-31 21:31:40 +02:00
Oscar Wallberg c57b652298 feat(zsh): add telnet alias 2024-07-31 21:21:26 +02:00
Oscar Wallberg 94cc7f2ab2 chore(zsh): clean up 2024-07-31 11:50:46 +02:00
Oscar Wallberg cdf764c5ff feat(tmux): change prefix to C-z 2024-07-31 11:49:48 +02:00
Oscar Wallberg a884bcbce4 feat(zsh): replace completion plugin with manual configuration 2024-07-31 11:49:15 +02:00
Oscar Wallberg 541629eb31 feat(zsh): add safe aliases for cp/mv 2024-07-31 11:47:54 +02:00
Oscar Wallberg 2f08099205 fix(zsh): add ls alias 2024-07-31 11:45:12 +02:00
Oscar Wallberg 8010661af8 fix(zsh): move cache directory 2024-07-31 11:43:10 +02:00
Oscar Wallberg ebbbe06702 fix(zsh): Minor re-ordering 2024-07-31 11:41:43 +02:00
Oscar Wallberg 219fe1906a fix(zsh): disable beep and flow control 2024-07-31 11:40:10 +02:00
Oscar Wallberg 8ac6a321aa feat(zsh-prompt): remove timestamp 2024-07-31 01:59:39 +02:00
Oscar Wallberg eefe054ab4 fix(bootstrap): rename script to setup 2024-07-30 01:33:55 +02:00
Oscar Wallberg 8343ed058d fix(bootstrap): fix check for symlink 2024-07-30 01:33:09 +02:00
Oscar Wallberg 2a708e72df fix(zsh): make prompt a sourced script 2024-07-29 04:55:27 +02:00
Oscar Wallberg 02216e8a3e feat(zsh): move configuration to zsh/ 2024-07-27 18:33:25 +02:00
Oscar Wallberg b9e0cabe03 fix(zsh): add cleanup 2024-07-27 18:27:44 +02:00
Oscar Wallberg d14eb673b9 fix(zsh): apply formatting 2024-07-27 18:27:10 +02:00
Oscar Wallberg 0c6034ffea feat(zsh): remove keybinds in favor of emacs 2024-07-27 18:26:40 +02:00
Oscar Wallberg 534308fa26 feat(zsh): configure history 2024-07-27 18:24:10 +02:00
Oscar Wallberg 7fa1a88560 fix(zsh): clean gcloud sdk 2024-07-26 22:24:46 +02:00
Oscar Wallberg 5a329e1982 feat(tmux): change prefix key to C-Space 2024-07-26 15:40:05 +02:00
Oscar Wallberg cb98b2eab4 fix(zsh): update plugin handling 2024-07-26 14:44:55 +02:00
Oscar Wallberg 03fb6c9100 feat(yay): add yay config 2024-07-23 03:08:13 +02:00
Oscar Wallberg 3278fa85e6 fix(zsh): apply shfmt fixes 2024-07-15 02:28:38 +02:00
Oscar Wallberg 5f5872ec30 feat(zsh): write my own prompt 2024-07-15 02:00:54 +02:00
Oscar Wallberg 24430a42fb Initial commit 2024-07-14 13:55:45 +02:00
73 changed files with 1689 additions and 6668 deletions
-93
View File
@@ -1,93 +0,0 @@
# 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
@@ -1,21 +0,0 @@
{
"$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
@@ -1,17 +0,0 @@
{
"$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
@@ -1,247 +0,0 @@
---
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
@@ -1,16 +0,0 @@
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
+5 -4
View File
@@ -20,9 +20,10 @@ dynamic_padding = false
dynamic_title = false
title = "Terminal"
# [window.dimensions]
# columns = 120
# lines = 45
[window.dimensions]
columns = 120
lines = 45
[window.padding]
x = 3
x = 10
y = 7
+3 -5
View File
@@ -7,11 +7,6 @@ update_info=dolphin_detailsmodesettings.upd:rename-leading-padding,dolphin_detai
ExpandableFolders=false
PreviewSize=16
[ExtractDialog]
2 screens: Height=720
2 screens: Width=1576
DirHistory[$e]=$HOME/Downloads/protondrive/
[General]
EditableUrl=true
OpenExternallyCalledFolderInNewTab=true
@@ -20,6 +15,9 @@ ShowStatusBar=FullWidth
Version=202
ViewPropsTimestamp=2024,8,26,16,47,20.342
[InformationPanel]
dateFormat=ShortFormat
[KFileDialog Settings]
Places Icons Auto-resize=false
Places Icons Static Size=22
+65
View File
@@ -0,0 +1,65 @@
# 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
@@ -1,11 +0,0 @@
<?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>
+28 -24
View File
@@ -1,40 +1,44 @@
# See: man 5 foot.ini
term=foot
font=Iosevka Custom:size=11
font=Iosevka Custom:style=Regular:size=12
initial-window-size-chars=179x60
pad=5x5 center
title=Terminal
locked-title=yes
[bell]
system=no
[cursor]
color=080808 9e9e9e
[mouse]
hide-when-typing=yes
[colors-dark]
background=1f2329
foreground=a0a8b7
cursor=1f2329 a0a8b7
scrollback-indicator=1f2329 a0a8b7
[colors]
background=080808
foreground=bdbdbd
# Normal/regular colors (color palette 0-7)
regular0=181a1f # black
regular1=e55561 # red
regular2=8ebd6b # green
regular3=e2b86b # yellow
regular4=4fa6ed # blue
regular5=bf68d9 # magenta
regular6=48b0bd # cyan
regular7=a0a8b7 # white
regular0=323437 # black
regular1=ff5454 # red
regular2=8cc85f # green
regular3=e3c78a # yellow
regular4=80a0ff # blue
regular5=cf87e8 # magenta
regular6=79dac8 # cyan
regular7=c6c6c6 # white
# Bright colors (color palette 8-15)
bright0=5c6370 # bright black
bright1=e86671 # bright red
bright2=98c379 # bright green
bright3=e5c07b # bright yellow
bright4=61afef # bright blue
bright5=c678dd # bright magenta
bright6=56b6c2 # bright cyan
bright7=abb2bf # bright white
bright0=949494 # bright black
bright1=ff5189 # bright red
bright2=36c692 # bright green
bright3=c2c292 # bright yellow
bright4=74b2ff # bright blue
bright5=ae81ff # bright magenta
bright6=85dc85 # bright cyan
bright7=e4e4e4 # bright white
# Misc colors
selection-foreground=080808
selection-background=b2ceee
# vim: ft=dosini
+5 -15
View File
@@ -8,10 +8,10 @@ _distro="Arch"
# Kernel Version
# Accepts
# - "x.y-latest" to pick latest kernel from the x.y series (e.g. "6.13-latest")
# - git tags, e.g. "v6.0-rc4" or "v5.10.51"
# - Tags, e.g. "6.0-rc4" or "5.10.51"
# - Note: Patches may fail as they may only apply to newer trees.
# If left empty, the script will prompt
_version="6.18-latest"
_version="6.15-latest"
#### MISC OPTIONS ####
@@ -100,10 +100,7 @@ _configfile=""
# Determine whether to call "olddefconfig" (default) or "oldconfig" for manual config updating interaction.
_config_updating="olddefconfig"
# 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
# Disable some non-module debugging - See PKGBUILD for the list
_debugdisable="false"
# Strip the kernel and its modules from debug symbols
@@ -122,7 +119,7 @@ _compiler="gcc"
# [Generic and Gentoo specific] Replace `libunwind` with `llvm-libunwind`.
# ! This is currently experimental.
# ! It can only work with the `llvm-libunwind` `USE` flag in `llvm-core/clang-common` for Gentoo.
# ! It can only work with the `llvm-libunwind` `USE` flag in `sys-devel/clang-common` for Gentoo.
# Set to "true" to enable.
_libunwind_replace=""
@@ -166,10 +163,7 @@ _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.
_rr_interval="default"
# 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
# Set to "true" to disable FUNCTION_TRACER/GRAPH_TRACER, lowering overhead but limiting debugging and analyzing of kernel functions - Kernel default is "false"
_ftracedisable="false"
# Set to "true" to disable NUMA, lowering overhead, but breaking CUDA/NvEnc on Nvidia equipped systems - Kernel default is "false"
@@ -242,10 +236,6 @@ _openrgb="true"
#### 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.
# !!! 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
+3 -1
View File
@@ -2,11 +2,13 @@ font-family = Iosevka Custom
font-style = Regular
font-synthetic-style = false
font-size = 12
theme = onedarker.conf
theme = moonfly-ghostty.conf
shell-integration-features = no-cursor
cursor-style = block
mouse-hide-while-typing = true
title = Terminal
window-width = 179
window-height = 60
window-padding-x = 2
window-padding-y = 1
window-decoration = server
-23
View File
@@ -1,23 +0,0 @@
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
+1 -3
View File
@@ -1,5 +1,3 @@
[Settings]
gtk-application-prefer-dark-theme=1
gtk-theme-name=Adwaita
[AdwStyleManager]
color-scheme=ADW_COLOR_SCHEME_PREFER_DARK
+36
View File
@@ -0,0 +1,36 @@
# 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
@@ -0,0 +1,329 @@
# 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
@@ -0,0 +1,92 @@
# 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,7 +1,47 @@
# vim: set ft=dosini:
[Default Applications]
application/json=org.kde.kwrite.desktop;
application/pdf=firefox.desktop;
application/x-docbook+xml=org.kde.kwrite.desktop;
application/x-matroska=mpv.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/plain=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
@@ -0,0 +1,152 @@
[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
+35 -69
View File
@@ -40,26 +40,16 @@ stop=none,none,Stop
stop_after_current=Meta+Shift+V,Meta+Shift+V,Stop after current Track
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]
Toggle Screen Reader On and Off=Meta+Alt+S,Meta+Alt+S,Toggle Screen Reader On and Off
_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]
_k_friendly_name=Audio Volume
decrease_microphone_volume=Microphone Volume Down,Microphone Volume Down,Decrease Microphone Volume
@@ -72,14 +62,14 @@ mic_mute=Microphone Mute\tMeta+Volume Mute,Microphone Mute\tMeta+Volume Mute,Mut
mute=Volume Mute,Volume Mute,Mute
[ksmserver]
Halt Without Confirmation=none,,Shut Down Without Confirmation
Halt Without Confirmation=none,none,Shut Down Without Confirmation
Lock Session=Meta+L\tScreensaver,Meta+L\tScreensaver,Lock Session
Log Out=Ctrl+Alt+Del,Ctrl+Alt+Del,Show Logout Screen
Log Out Without Confirmation=none,,Log Out Without Confirmation
LogOut=none,,Log Out
Reboot=none,,Reboot
Reboot Without Confirmation=none,,Reboot Without Confirmation
Shut Down=none,,Shut Down
Log Out Without Confirmation=none,none,Log Out Without Confirmation
LogOut=none,none,Log Out
Reboot=none,none,Reboot
Reboot Without Confirmation=none,none,Reboot Without Confirmation
Shut Down=none,none,Shut Down
_k_friendly_name=Session Management
[kwin]
@@ -88,14 +78,13 @@ Cycle Overview=none,none,Cycle through Overview and Grid View
Cycle Overview Opposite=none,none,Cycle through Grid View and Overview
Decrease Opacity=none,,Decrease Opacity of Active Window by 5%
Edit Tiles=Meta+T,Meta+T,Toggle Tiles Editor
Expose=Ctrl+F9,Meta+F9\tCtrl+F9,Toggle Present Windows (Current desktop)
ExposeAll=Ctrl+F10\tLaunch (C),Meta+F10\tLaunch (C)\tCtrl+F10,Toggle Present Windows (All desktops)
ExposeClass=Ctrl+F7,Meta+F7\tCtrl+F7,Toggle Present Windows (Window class)
Expose=Ctrl+F9,Ctrl+F9,Toggle Present Windows (Current desktop)
ExposeAll=Ctrl+F10\tLaunch (C),Ctrl+F10\tLaunch (C),Toggle Present Windows (All desktops)
ExposeClass=Ctrl+F7,Ctrl+F7,Toggle Present Windows (Window class)
ExposeClassCurrentDesktop=none,none,Toggle Present Windows (Window class on current desktop)
Grid View=Meta+G,Meta+G,Toggle Grid View
Increase Opacity=none,,Increase Opacity of Active Window by 5%
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
MoveMouseToCenter=Meta+F6,Meta+F6,Move Mouse to Center
MoveMouseToFocus=Meta+F5,Meta+F5,Move Mouse to Focus
@@ -114,7 +103,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 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 to Desktop 1=Ctrl+F1,Meta+F1\tCtrl+F1,Switch to Desktop 1
Switch to Desktop 1=Ctrl+F1,Ctrl+F1,Switch to Desktop 1
Switch to Desktop 10=none,,Switch to Desktop 10
Switch to Desktop 11=none,,Switch to Desktop 11
Switch to Desktop 12=none,,Switch to Desktop 12
@@ -125,15 +114,10 @@ Switch to Desktop 16=none,,Switch to Desktop 16
Switch to Desktop 17=none,,Switch to Desktop 17
Switch to Desktop 18=none,,Switch to Desktop 18
Switch to Desktop 19=none,,Switch to Desktop 19
Switch to Desktop 2=Ctrl+F2,Meta+F2\tCtrl+F2,Switch to Desktop 2
Switch to Desktop 2=Ctrl+F2,Ctrl+F2,Switch to Desktop 2
Switch to Desktop 20=none,,Switch to Desktop 20
Switch to Desktop 21=,,Switch to Desktop 21
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 3=Ctrl+F3,Ctrl+F3,Switch to Desktop 3
Switch to Desktop 4=Ctrl+F4,Ctrl+F4,Switch to Desktop 4
Switch to Desktop 5=none,,Switch to Desktop 5
Switch to Desktop 6=none,,Switch to Desktop 6
Switch to Desktop 7=none,,Switch to Desktop 7
@@ -157,14 +141,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
Toggle Night Color=none,none,Suspend/Resume Night Light
Toggle Window Raise/Lower=none,,Toggle Window Raise/Lower
Walk Through Windows=Alt+Tab,Meta+Tab\tAlt+Tab,Walk Through Windows
Walk Through Windows (Reverse)=Alt+Shift+Tab,Meta+Shift+Tab\tAlt+Shift+Tab,Walk Through Windows (Reverse)
Walk Through Windows Alternative=none,none,Walk Through Windows Alternative
Walk Through Windows Alternative (Reverse)=none,none,Walk Through Windows Alternative (Reverse)
Walk Through Windows of Current Application=Alt+`,Meta+`\tAlt+`,Walk Through Windows of Current Application
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,none,Walk Through Windows of Current Application Alternative
Walk Through Windows of Current Application Alternative (Reverse)=none,none,Walk Through Windows of Current Application Alternative (Reverse)
Walk Through Windows=Alt+Tab,Alt+Tab,Walk Through Windows
Walk Through Windows (Reverse)=Alt+Shift+Tab,Alt+Shift+Tab,Walk Through Windows (Reverse)
Walk Through Windows Alternative=none,,Walk Through Windows Alternative
Walk Through Windows Alternative (Reverse)=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 (Reverse)=Alt+~,Alt+~,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 (Reverse)=none,,Walk Through Windows of Current Application Alternative (Reverse)
Window Above Other Windows=none,,Keep Window Above Others
Window Below Other Windows=none,,Keep Window Below Others
Window Close=Meta+Shift+Q\tAlt+F4,Alt+F4,Close Window
@@ -192,7 +176,7 @@ Window One Screen Down=none,,Move Window One Screen Down
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 Right=none,,Move Window One Screen to the Right
Window Operations Menu=Alt+F3,Alt+F3,Window Menu
Window Operations Menu=Alt+F3,Alt+F3,Window Operations Menu
Window Pack Down=none,,Move Window Down
Window Pack Left=none,,Move Window Left
Window Pack Right=none,,Move Window Right
@@ -207,7 +191,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 Raise=none,,Raise Window
Window Resize=none,,Resize Window
Window Shade=none,none,Shade Window
Window Shade=none,,Shade Window
Window Shrink Horizontal=none,,Shrink Window Horizontally
Window Shrink Vertical=none,,Shrink Window Vertically
Window to Desktop 1=none,,Window to Desktop 1
@@ -223,11 +207,6 @@ Window to Desktop 18=none,,Window to Desktop 18
Window to Desktop 19=none,,Window to Desktop 19
Window to Desktop 2=none,,Window to Desktop 2
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 4=none,,Window to Desktop 4
Window to Desktop 5=none,,Window to Desktop 5
@@ -255,17 +234,13 @@ view_zoom_out=Meta+-,Meta+-,Zoom Out
[mediacontrol]
_k_friendly_name=Media Controller
mediavolumedown=none,,Media volume down
mediavolumeup=none,,Media volume up
mediavolumedown=none,none,Media volume down
mediavolumeup=none,none,Media volume up
nextmedia=Media Next,Media Next,Media playback next
pausemedia=Media Pause,Media Pause,Pause media playback
playmedia=none,,Play media playback
playmedia=none,none,Play media playback
playpausemedia=Media Play,Media Play,Play/Pause media playback
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
[org_kde_powerdevil]
@@ -285,7 +260,6 @@ _k_friendly_name=Power Management
powerProfile=Battery\tMeta+B,Battery\tMeta+B,Switch Power Profile
[plasmashell]
Slideshow Wallpaper Next Image=none,,Next Wallpaper Image
_k_friendly_name=plasmashell
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
@@ -303,7 +277,6 @@ 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
cycleNextAction=none,,Next History Item
cyclePrevAction=none,,Previous History Item
edit_clipboard=none,,Edit Contents…
manage activities=Meta+Q,Meta+Q,Show Activity Switcher
next activity=Meta+A,none,Walk through activities
previous activity=Meta+Shift+A,none,Walk through activities (Reverse)
@@ -311,24 +284,17 @@ repeat_action=none,,Manually Invoke Action on Current Clipboard
show dashboard=Ctrl+F12,Ctrl+F12,Show Desktop
show-barcode=none,,Show Barcode…
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 previous activity=none,,Switch to Previous Activity
toggle do not disturb=none,,Toggle do not disturb
[services][com.mitchellh.ghostty.desktop]
_launch=none
[services][foot.desktop]
_launch=Meta+Return
[services][Alacritty.desktop]
New=Meta+Return
[services][org.kde.spectacle.desktop]
CurrentMonitorScreenShot=
OpenWithoutScreenshot=
RecordWindow=none
[services][org.kde.touchpadshortcuts.desktop]
ToggleTouchpad=Touchpad Toggle\tMeta+Ctrl+Zenkaku Hankaku
[wacomtablet]
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
+4 -68
View File
@@ -1,7 +1,5 @@
[Desktops]
Id_1=e1fac5a2-0626-4ae9-8c30-7a8246a37a63
Number=1
Rows=1
[Compositing]
AllowTearing=false
[EdgeBarrier]
EdgeBarrier=0
@@ -9,9 +7,6 @@ EdgeBarrier=0
[Effect-hidecursor]
InactivityDuration=3
[Effect-overview]
BorderActivate=9
[MouseBindings]
CommandWindow3=Activate, raise and pass click
@@ -22,68 +17,9 @@ scripts=trigger-attention
[TabBox]
HighlightWindows=false
[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]
[Tiling]
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]
Scale=1
-21
View File
@@ -10,29 +10,8 @@ set incsearch true
set incfilter true
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 j updir
# map k down
# map l up
# map ; open
map D trash
-44
View File
@@ -1,44 +0,0 @@
[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
@@ -1,31 +0,0 @@
{
"$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
@@ -1,84 +0,0 @@
{
"$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" }
}
}
@@ -1,3 +0,0 @@
stream.properties = {
resample.quality = 10
}
@@ -1,3 +0,0 @@
context.properties = {
default.clock.allowed-rates = [ 44100 48000 88200 96000 176400 192000 352800 384000 ]
}
+17 -31
View File
@@ -27,24 +27,23 @@ tab_system_color=true
[Backend]
AutoCrossfadeEnabled=false
CrossfadeEnabled=false
Device=@Invalid()
FadeoutDuration=2000
FadeoutEnabled=false
FadeoutPauseDuration=250
FadeoutPauseEnabled=false
NoCrossfadeSameAlbum=true
alsaplugin=1
Output=autoaudiosink
alsaplugin=3
bs2b=false
bufferduration=4000
bufferhighwatermark=0.99
bufferlowwatermark=0.33
channels=2
channels_enabled=false
device=@Invalid()
ebur128_loudness_normalization=false
ebur128_target_level_lufs=-23
http2=false
output=pulsesink
playbin3=true
rgcompression=true
rgenabled=false
rgfallbackgain=0
@@ -80,8 +79,8 @@ disk_cache_enable=false
disk_cache_size=360
disk_cache_size_unit=1
expire_unavailable_songs=60
group_by1=3
group_by2=0
group_by1=1
group_by2=3
group_by3=0
group_by_version=1
last_path=/home/oscar/Music
@@ -94,8 +93,6 @@ save_playcounts=false
save_ratings=false
separate_albums_by_grouping=false
show_dividers=false
skip_articles_for_albums=false
skip_articles_for_artists=false
song_ebur128_loudness_analysis=false
song_tracking=false
sort_skips_articles=true
@@ -127,7 +124,7 @@ types=art_unset, art_manual, art_automatic, art_embedded
[EditTagDialog]
current_tab=1
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)
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)
[Equalizer]
enable_stereo_balancer=false
@@ -171,7 +168,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\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
selected_preset=Zero
selected_preset=Custom
stereo_balance=0
[GlobalShortcuts]
@@ -212,15 +209,15 @@ user_token=
providers=Genius, Lyrics.ovh, LoloLyrics, Musixmatch, songlyrics.com, azlyrics.com, elyrics.net, letras.mus.br, lyricfind.com
[MainWindow]
current_tab=5
current_tab=1
file_path=/home/oscar/Music
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)
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)
hidden=false
maximized=true
minimized=false
search_for_cover_auto=true
show_sidebar=true
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)
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)
tab_collection=1
tab_context=0
tab_devices=7
@@ -269,19 +266,13 @@ foreground_color=4278190080
popup_pos=@Point(1524 0)
popup_screen=eDP-1
[OpenTidal]
access_token=eyJraWQiOiJ2OU1GbFhqWSIsImFsZyI6IkVTMjU2In0.eyJ0eXBlIjoibzJfYWNjZXNzIiwic2NvcGUiOiIiLCJnVmVyIjowLCJzVmVyIjowLCJjaWQiOjk3MDYsImV4cCI6MTc1Njg5MDgyNywiaXNzIjoiaHR0cHM6Ly9hdXRoLnRpZGFsLmNvbS92MSJ9.tGq9QEleFDMW6ZFjO4RlZMzNsysWr8ngJWESiaWR_kUthK-sgAosgVkytL1Ap9p9ELGJfgIuauCpz7rw4Gzavw
expires_in=43200
login_time=1756847627
token_type=Bearer
[OrganizeDialog]
albumcover=true
allow_ascii_ext=false
destination=/home/oscar/Music
eject_after=false
format=%albumartist/%album/{%disc.}{%track - }{%artist - }%title.%extension
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)
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)
overwrite=false
remove_non_ascii=false
remove_non_fat=false
@@ -290,32 +281,28 @@ replace_spaces=false
[Player]
playback_playlist=1
playback_position=96
playback_position=16
playback_state=3
volume=10
volume=100
[Playlist]
alternating_row_colors=true
auto_sort=false
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)
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)
continue_on_error=false
current_playlist=2
delete_files=false
editmetadatainline=false
glow_effect=true
greyout_songs_play=true
greyout_songs_startup=true
last_save_extension=xspf
last_save_filter=XSPF playlists (*.xspf)
last_save_path=/home/oscar/Music
path_type=0
playlist_clear=true
rating_locked=false
select_track=false
show_bars=true
show_toolbar=true
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=2
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_version=1
warn_close_playlist=true
write_metadata=false
@@ -391,7 +378,7 @@ songs\size=10
songs_version=3
[SettingsDialog]
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)
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)
[Spotify]
albums_group_by1=1
@@ -445,6 +432,5 @@ songs_separate_albums_by_grouping=false
tab=artists
[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\target=1
+1
View File
@@ -0,0 +1 @@
default-id
+4
View File
@@ -0,0 +1,4 @@
export XCURSOR_SIZE=24
export XCURSOR_THEME=breeze_cursors
export QT_STYLE_OVERRIDE=Breeze
export QT_QPA_PLATFORM=wayland
-39
View File
@@ -1,39 +0,0 @@
[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
@@ -0,0 +1,86 @@
{
"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
@@ -0,0 +1,59 @@
* {
/* `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]
name = "onedark"
origin_url = "https://codeberg.org/warg/dotfiles"
origin_url = "https://github.com/owallb/dotfiles"
[colors]
background = "#1f2329"
+7 -6
View File
@@ -2,7 +2,7 @@ local wezterm = require("wezterm")
local config = wezterm.config_builder()
local ENABLE_MULTIPLEXING = false
local ENABLE_MULTIPLEXING = true
-- quickstart: https://wezfurlong.org/wezterm/config/files.html
-- spec: https://wezfurlong.org/wezterm/config/lua/general.html
@@ -10,14 +10,15 @@ local ENABLE_MULTIPLEXING = false
-- General settings
config.window_padding = {
left = 0,
right = 0,
top = 0,
bottom = 0,
left = 5,
right = 5,
top = 5,
bottom = 5,
}
config.audible_bell = "Disabled"
config.warn_about_missing_glyphs = false
config.initial_cols = 179
config.initial_rows = 60
-- Settings below get overriden if multiplexing is enabled
config.window_decorations = "TITLE|RESIZE"
config.enable_tab_bar = false
@@ -1,8 +0,0 @@
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
}
@@ -1,39 +0,0 @@
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
}
}
}
]
@@ -1,16 +0,0 @@
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
}
}
}
]
@@ -0,0 +1,3 @@
[preferred]
default = hyprland;gtk
org.freedesktop.impl.portal.FileChooser = kde
-17
View File
@@ -1,17 +0,0 @@
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
@@ -1 +0,0 @@
__pycache__
@@ -1,4 +0,0 @@
[D-BUS Service]
Name=org.freedesktop.FileManager1
Exec=/usr/bin/dolphin --daemon
SystemdService=plasma-dolphin.service
@@ -1,100 +0,0 @@
{
"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
}
}
}
@@ -1,243 +0,0 @@
{
"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"
]
}
}
@@ -1,221 +0,0 @@
{
"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"
]
}
}
+2 -12
View File
@@ -1,11 +1,8 @@
[Appearance]
AntiAliasFonts=true
BoldIntense=true
ColorScheme=Breeze
EmojiFont=Noto Color Emoji,5.8,-1,5,400,0,0,0,0,0,0,0,0,0,0,1
ColorScheme=Moonfly
Font=Iosevka Custom,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1
LineSpacing=0
UseFontLineChararacters=false
[Cursor Options]
CustomCursorColor=158,158,158
@@ -13,16 +10,10 @@ CustomCursorTextColor=8,8,8
UseCustomCursorColor=true
[General]
DimWhenInactive=false
Environment=
LocalTabTitleFormat=[%#] %w
Name=Oscar
Parent=FALLBACK/
RemoteTabTitleFormat=[%#] (%h) %w
ShowTerminalSizeHint=true
TerminalCenter=false
TerminalColumns=120
TerminalMargin=0
TerminalRows=36
[Interaction Options]
@@ -33,5 +24,4 @@ HighlightScrolledLines=false
ScrollBarPosition=2
[Terminal Features]
BellMode=3
UrlHintsModifiers=0
BellMode=0
+189
View File
@@ -0,0 +1,189 @@
<!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>
+181 -364
View File
@@ -1,9 +1,4 @@
" vim: set foldmethod=marker:
" {{{1 Platform Detection
let s:is_windows = has('win32') || has('win64')
let s:is_unix = has('unix')
" {{{1 Global Variables
let g:skip_defaults_vim = 1
@@ -23,15 +18,11 @@ let g:netrw_sort_options = 'i'
let g:netrw_sort_sequence = '[\/]\s*,*'
let g:netrw_special_syntax = v:true
let g:netrw_timefmt = '%d-%m-%Y %H:%M'
" Terminal codes (Unix/Linux only)
if s:is_unix
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
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
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
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"
" {{{1 Options
@@ -53,11 +44,7 @@ set nosmarttab
set foldlevelstart=99
set foldmethod=indent
set foldignore=
if s:is_windows
set guifont=Iosevka_Custom:h12
else
set guifont=Iosevka\ Custom\ 12
endif
set guifont=Iosevka\ Custom\ 12
set completeopt=menu,menuone,preview,noinsert,noselect
set matchpairs=(:),{:},[:],<:>
set linebreak
@@ -89,13 +76,13 @@ set updatetime=100
set hidden
set incsearch
set jumpoptions=stack
set signcolumn=yes
set statusline=\ %m\%=
\%-5.5{&filetype}\ %-6.6{&fileencoding}\ %-4.4{&fileformat}
\\ %4.4(%p%%%)%5.5l:%-3.3v
syntax on
filetype plugin indent on
runtime ftplugin/man.vim
" {{{1 Mappings
if !empty($TMUX) && executable('tmux')
@@ -112,6 +99,16 @@ map <Leader>dp :diffput<CR>
map <Leader>do :diffget<CR>
xmap <Leader>dp :diffput<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
map <C-LeftMouse> <Nop>
@@ -121,11 +118,9 @@ imap <C-a> <C-o>^
imap <C-e> <C-o>$
imap <C-k> <C-o>C
imap <C-d> <C-o>x
if !s:is_windows
execute "set <M-f>=\ef"
execute "set <M-b>=\eb"
execute "set <M-d>=\ed"
endif
execute "set <M-f>=\ef"
execute "set <M-b>=\eb"
execute "set <M-d>=\ed"
imap <M-f> <C-o>w
imap <M-b> <C-o>b
imap <M-d> <C-o>dw
@@ -143,10 +138,14 @@ inoremap <C-Y> <C-D>
noremap <C-l> :nohlsearch<CR>:diffupdate<CR><C-l>
nmap tn :tabnew<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 <C-w>q :bn \| bd#<CR>
tnoremap <Esc> <C-\><C-n>
tnoremap <C-\> <Esc>
nmap <Leader>tt :NERDTreeToggle<CR>
nmap <Leader>uu :tabnew \| bprevious \| UndotreeToggle \| UndotreeFocus<CR>
" {{{2 Default Mappings
@@ -190,64 +189,19 @@ autocmd BufReadPost * silent! normal! g`"zv
" Filetype specific config
autocmd FileType go setlocal noexpandtab
autocmd FileType c,cpp
\ setlocal tabstop=2 |
\ setlocal softtabstop=2 |
\ setlocal shiftwidth=2
\ setlocal tabstop=2 |
\ setlocal softtabstop=2 |
\ setlocal shiftwidth=2
autocmd FileType netrw nmap <buffer> <C-h> -
autocmd FileType netrw nmap <buffer> <C-l> <CR>
autocmd FileType netrw setlocal colorcolumn=0
" Misc
autocmd VimEnter * :clearjumps
autocmd TerminalWinOpen * setlocal nonumber norelativenumber nowrap signcolumn=no colorcolumn=
" {{{1 Custom abbreviations
cnoreabbrev term terminal ++curwin
" {{{1 Custom commands
command! W write
" {{{1 Statusline
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
" {{{2 Plugin variables
" {{{3 GitGutter
let g:gitgutter_sign_added = '┃'
@@ -264,323 +218,117 @@ let g:NERDTreeDirArrowCollapsible = ""
let g:NERDTreeDirArrowExpandable = ""
let g:NERDTreeHijackNetrw = 0
let g:NERDTreeShowHidden = 1
let g:NERDTreeWinSize = 50
let g:NERDTreeWinSize = 40
let g:NERDTreeMinimalUI = 1
let g:NERDTreeCascadeSingleChildDir = 0
if s:is_windows
let g:NERDTreeRemoveFileCmd = "del /q "
let g:NERDTreeRemoveDirCmd = "rmdir /s /q "
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
let g:NERDTreeRemoveFileCmd = "gio trash "
let g:NERDTreeRemoveDirCmd = "gio trash "
let g:NERDTreeMapActivateNode = "l"
let g:NERDTreeMapCloseDir = "h"
" {{{3 onedark
let g:onedark_color_overrides = {
\ "background": {"gui": "#1f2329", "cterm": "235", "cterm16": "NONE" },
\ "cursor_grey": { "gui": "#282c34", "cterm": "236", "cterm16": "0" },
\ "background": {"gui": "#1f2329" },
\}
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
let g:undotree_WindowLayout = 2
if s:is_windows
let g:undotree_DiffCommand = "FC"
else
let g:undotree_DiffCommand = "diff -u"
endif
let g:undotree_DiffCommand = "diff -u"
let g:undotree_SplitWidth = 50
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
if s:is_windows
let s:plug_file = expand('$HOME/vimfiles/autoload/plug.vim')
let s:plug_dir = expand('$HOME/vimfiles/plugged')
else
let s:plug_file = expand('$HOME/.vim/autoload/plug.vim')
let s:plug_dir = expand('$HOME/.vim/plugged')
endif
let s:plug_file = expand('$HOME/.vim/autoload/plug.vim')
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
silent execute '!curl -fkLo ' . s:plug_file ' --create-dirs'
\ ' https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
let s:plug_dir = expand('$HOME/.vim/plugged')
call plug#begin(s:plug_dir)
Plug 'joshdick/onedark.vim'
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-fugitive'
Plug 'airblade/vim-gitgutter'
Plug 'markonm/traces.vim'
Plug 'rbong/vim-flog'
Plug 'chrisbra/Colorizer'
Plug 'jceb/vim-orgmode'
Plug 'preservim/nerdtree'
Plug 'ryanoasis/vim-devicons'
Plug 'tiagofumo/vim-nerdtree-syntax-highlight'
Plug 'mbbill/undotree'
Plug 'vim-fuzzbox/fuzzbox.vim'
Plug 'joshdick/onedark.vim'
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-fugitive'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'airblade/vim-gitgutter'
Plug 'markonm/traces.vim'
Plug 'rbong/vim-flog'
Plug 'chrisbra/Colorizer'
Plug 'jceb/vim-orgmode'
Plug 'preservim/nerdtree'
Plug 'ryanoasis/vim-devicons'
Plug 'mbbill/undotree'
" Plug 'prabirshrestha/vim-lsp'
" Plug 'dense-analysis/ale'
" Plug 'prabirshrestha/asyncomplete.vim'
" Plug 'prabirshrestha/asyncomplete-lsp.vim'
" Plug 'prabirshrestha/vim-lsp'
" Plug 'dense-analysis/ale'
" Plug 'prabirshrestha/asyncomplete.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:
" * ALE doesn't support semantic highlighting
" * vim-lsp doesn't support clangd switch to header/source or request document
" highlight on cursor or request diagnostic float on cursor
" * CoC flickers in C++/clangd when semanticTokens is enabled
" * lsp slow loading new buffers
" * YouCompleteMe ??? haven't tried but supports semantic highlighting
"
" To conclude, vim-lsp + asynccomplete + ALE seems to be the best stack.
" Disabling LSP stuff for now.
" Some notes:
" * ALE doesn't support semantic highlighting
" * vim-lsp doesn't support clangd switch to header/source or request document
" highlight on cursor or request diagnostic float on cursor
" * CoC flickers in C++/clangd when semanticTokens is enabled
" * lsp slow loading new buffers
" * YouCompleteMe ??? haven't tried but supports semantic highlighting
"
" To conclude, vim-lsp + asynccomplete + ALE seems to be the best stack.
" Disabling LSP stuff for now.
call plug#end()
" {{{2 Setup
" {{{3 Colorscheme
" {{{2 Colorscheme
silent! colorscheme onedark
highlight! link netrwMarkFile Identifier
" {{{2 Fzf
" {{{3 GitGutter
function! s:SetupGitGutter()
if !exists('g:loaded_gitgutter')
return
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)
function! s:build_quickfix_list(lines)
echo "lines"
echo lines
call setqflist(map(copy(a:lines), '{ "filename": v:val, "lnum": 1 }'))
copen
cc
endfunction
autocmd VimEnter * call s:SetupGitGutter()
autocmd! FileType fzf tnoremap <buffer> <C-k> <Up>
autocmd! FileType fzf tnoremap <buffer> <C-j> <Down>
autocmd! FileType fzf tnoremap <buffer> <C-l> <CR>
" {{{3 Fugitive
" To match exact, prefix word with `'`
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)
function! OpenGitStatus()
let l:previous_win = win_getid()
echo l:previous_win
leftabove vertical G
vertical resize 50
setlocal winfixwidth
call win_gotoid(l:previous_win)
endfunction
command! -bang CwdHistory call fzf#run(fzf#wrap({
\ 'source': filter(
\ fzf#vim#_recent_files(),
\ 'v:val !~ "^\\~\\?/"'
\ ),
\ 'options': [
\ '-m',
\ '--header-lines', !empty(expand('%')),
\ '--prompt', 'CwdHist> '
\ ]},
\ <bang>0))
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
" {{{2 flog
nmap <Leader>gl :Flog<CR>
" {{{3 vim-lsp
" {{{2 vim-lsp
" let g:lsp_use_native_client = 1
" let g:lsp_semantic_enabled = 1
@@ -682,7 +430,7 @@ nmap <Leader>gl :Flog<CR>
" autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
" augroup END
" {{{3 CoC
" {{{2 CoC
" inoremap <silent><expr> <TAB>
" \ coc#pum#visible() ? coc#pum#next(1) :
@@ -742,7 +490,7 @@ nmap <Leader>gl :Flog<CR>
" xmap <leader>la <Plug>(coc-codeaction-selected)
" nmap <leader>la <Plug>(coc-codeaction-selected)
" {{{3 lsp
" {{{2 lsp
" autocmd User LspSetup call LspOptionsSet(#{
" \ aleSupport: v:false,
@@ -802,7 +550,7 @@ nmap <Leader>gl :Flog<CR>
" \ ]
" \ }])
" {{{3 ALE
" {{{2 ALE
" let g:ale_linters_explicit = 1
" let g:ale_linters = #{
@@ -814,3 +562,72 @@ nmap <Leader>gl :Flog<CR>
" \ python: ['black', 'isort', 'remove_trailing_lines', 'trim_whitespace'],
" \ }
" 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
@@ -0,0 +1,3 @@
if uwsm check may-start && uwsm select; then
exec uwsm start default
fi
-201
View File
@@ -1,201 +0,0 @@
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
@@ -0,0 +1,10 @@
[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
@@ -1,25 +0,0 @@
---
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
@@ -1,36 +0,0 @@
---
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
@@ -1,23 +0,0 @@
---
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
@@ -1,20 +0,0 @@
---
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
@@ -1,20 +0,0 @@
---
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
@@ -1,15 +0,0 @@
---
Diagnostics:
UnusedIncludes: Strict
MissingIncludes: Strict
Completion:
AllScopes: true
InlayHints:
Enabled: No
# Will possibly be supported in clangd 22
Documentation:
CommentFormat: Doxygen
...
-8
View File
@@ -1,8 +0,0 @@
# 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
@@ -1,6 +0,0 @@
# 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
@@ -1,8 +0,0 @@
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
@@ -1,6 +0,0 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"printWidth": 80,
"sortImports": {},
"ignorePatterns": []
}
-13
View File
@@ -1,13 +0,0 @@
{
"$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": "^_" }
]
}
}
+1
View File
@@ -62,6 +62,7 @@ select = [
]
ignore = [
"A001",
"D100",
"D101",
"D202",
"D203",
-31
View File
@@ -1,31 +0,0 @@
[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
@@ -1,3 +0,0 @@
allow-unwrap-in-tests = true
allow-panic-in-tests = true
-5
View File
@@ -1,5 +0,0 @@
edition = "2024"
max_width = 80
wrap_comments = true
imports_granularity = "Item"
group_imports = "StdExternalCrate"
+323 -482
View File
@@ -1,553 +1,394 @@
#!/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 filecmp
import platform
import shlex
import shutil
import subprocess
import sys
from abc import ABC, abstractmethod
from dataclasses import dataclass
from pathlib import Path
SCRIPT_DIR = Path(__file__).resolve().parent
HOME = Path.home()
DISTRO: str = platform.freedesktop_os_release().get("ID", "")
class InstallerError(BaseException): ...
class PackageManager(ABC):
@property
@abstractmethod
def check_cmd(self) -> list[str]: ...
@property
@abstractmethod
def install_cmd(self) -> list[str]: ...
def is_installed(self, name: str) -> bool:
return (
subprocess.run(
[*self.check_cmd, name],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
).returncode
== 0
)
def install(self, names: list[str]) -> None:
subprocess.run([*self.install_cmd, *names], check=True)
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"),
],
symlinks=[
".claude/CLAUDE.md",
".claude/skills",
".config/fish",
".config/lf",
".config/opencode",
".config/tmux",
".config/yay",
".gdbinit",
".vimrc",
],
symlink_map={"zsh/rc": ".zshrc"},
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=[
class Installer:
def __init__(self, profile: str) -> None:
"""Initialize a new installer."""
self.script_file = Path(__file__).resolve()
self.script_name = self.script_file.name
self.script_dir = self.script_file.parent
self.source_dir = self.script_dir
self.dest_dir = Path.home()
self.distro = platform.freedesktop_os_release().get("NAME", "Unknown")
self.profile = profile
self.has_error = False
self.pkg_query = {"Arch Linux": self._pkg_query_arch}
self.pkgs = {
"Arch Linux base": [
"alacritty",
"tmux",
"zsh",
"vim",
"unzip",
"npm",
"nvim",
"firefox",
],
"Arch Linux hyprland": [
"libnewt",
"hyprland",
"uwsm",
"fnott",
"pipewire",
"wireplumber",
"hyprpolkitagent",
"qt5-wayland",
"qt6-wayland",
"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",
],
}
self.symlinks = [
".config/alacritty",
".config/dolphinrc",
".config/dunst",
".config/fish",
".config/fnott",
".config/foot",
".config/fontconfig",
".config/frogminer",
".config/ghostty",
".config/hypr",
".config/i3",
".config/i3status",
".config/lf",
".config/kde-mimeapps.list",
".config/kdeglobals",
".config/kglobalshortcutsrc",
".config/klipperrc",
".config/kwinrc",
".config/mimeapps.list",
".config/picom",
".config/pipewire",
".config/rofi",
".config/strawberry",
".config/vlc",
".config/tmux",
".config/uwsm",
".config/waybar",
".config/wezterm",
".config/wireplumber",
".config/xdg-desktop-portal",
".config/yay",
".config/zed",
".local/share/dbus-1",
".local/share/easyeffects",
".local/bin",
".local/share/fonts",
".local/share/konsole",
".local/share/kxmlgui5/dolphin/dolphinui.rc",
".vimrc",
".xinit-scripts",
".xinitrc",
".Xresources",
],
copies=[
".config/gtk-3.0/bookmarks",
".config/gtk-3.0/settings.ini",
".config/gtk-4.0/settings.ini",
".zprofile",
]
self.copies = [
".config/gtk-3.0",
".config/gtk-4.0",
".gtkrc-2.0",
],
),
"gaming": Profile(
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",
],
),
}
]
self.symlink_map = {"zsh/rc": ".zshrc"}
self.gsettings = [
["org.gnome.desktop.interface", "color-scheme", "prefer-dark"]
]
@staticmethod
def _pkg_query_arch(package: str) -> bool:
"""
Check if package is installed on Arch Linux using pacman.
@dataclass(frozen=True)
class Resolved:
pkgs: list[Pkg]
symlinks: list[str]
symlink_map: dict[str, str]
copies: list[str]
system_installs: list[str]
Returns:
True if package is found, otherwise False.
"""
result = subprocess.run(
["pacman", "-Qi", package],
capture_output=True,
text=True,
check=False,
)
return result.returncode == 0
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,
)
def resolve_profiles(ctx: Context, profile_names: list[str]) -> Resolved:
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)
def error(self, msg: str) -> None:
"""Print error message and set error flag."""
self.has_error = True
print(f"Error: {msg}", file=sys.stderr)
def prompt_yes_no(question: str, default: bool = False) -> bool:
if not sys.stdin.isatty():
return default
suffix = " [Y/n] " if default else " [y/N] "
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(
["infocmp", "tmux-256color"],
stdout=subprocess.DEVNULL,
)
if result.returncode != 0:
ctx.error("Missing terminfo for tmux-256color. Try installing ncurses-term.")
def _describe_kind(p: Path) -> str:
return "directory" if p.is_dir() else "regular file"
def remove_symlink(ctx: Context, rel_dst: str) -> None:
link = HOME / rel_dst
if link.is_symlink():
target = link.resolve()
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
if not dst.parent.is_dir():
print(f"Creating parent: {dst.parent}")
dst.parent.mkdir(parents=True, exist_ok=True)
if dst.is_symlink():
dst_target = dst.resolve()
if dst_target == src.resolve():
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 ctx.force:
remove_symlink(ctx, rel_dst)
elif ctx.ignore_existing:
if self.distro not in self.pkg_query:
self.error(f"No package query function for {self.distro}")
return
else:
ctx.error(
"symlink exists but points elsewhere:",
f"{dst} -> {dst_target}",
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}"
)
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 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 remove_path(path: Path) -> None:
print(f"Trashing item: {path}")
subprocess.run(["gio", "trash", str(path)], check=True)
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}'"
)
def copy_item(ctx: Context, rel_src: str, rel_dst: str) -> None:
src = SCRIPT_DIR / rel_src
dst = HOME / rel_dst
src = self.script_dir / rel_src
dst = self.dest_dir / rel_dst
dst_parent = dst.parent
if not src.is_file():
ctx.error(f"source is not a regular file: {src}")
return
if not src.exists():
raise InstallerError(f"source path does not exist: {src}")
if not dst.parent.is_dir():
print(f"Creating parent: {dst.parent}")
dst.parent.mkdir(parents=True, exist_ok=True)
# 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 filecmp.cmp(src, dst, shallow=False):
return
if dst.is_symlink():
if ignore or dst.resolve() == src:
return
if ctx.diff:
subprocess.run(["diff", "--color=always", "-u", str(dst), str(src)])
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}"
)
if ctx.force:
remove_path(dst)
elif ctx.ignore_existing:
return
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:
ctx.error(f"file already exists and differs: {dst}")
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:
result = subprocess.run(
["infocmp", "tmux-256color"],
capture_output=True,
text=True,
check=False,
)
if result.returncode != 0:
self.error(
"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(
self,
force: bool = False,
ignore: bool = False,
remove: bool = False,
) -> None:
"""Run main run function."""
if remove:
self.remove_all_symlinks()
return
print(f"Copying item: from {rel_src} to {dst.parent}/")
shutil.copy2(src, dst)
self.check_packages_installed()
self.check_terminfo()
self.create_all_symlinks(force, ignore)
self.copy_all_items(force, ignore)
self.set_gsettings()
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:
def main() -> None:
"""Run installer."""
parser = argparse.ArgumentParser(
description="Install dotfiles and system configuration.",
description="Linux dotfiles setup script",
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument(
"-F",
"--force",
action="store_true",
help="Overwrite any existing links or files",
)
parser.add_argument(
"-i",
"--ignore-existing",
action="store_true",
help="Ignore existing links or files",
)
parser.add_argument(
"-r",
"--remove-existing",
action="store_true",
help="Remove any existing symlinks",
)
parser.add_argument(
"-d",
"--diff",
action="store_true",
help="Show unified diff when a managed file differs",
)
extras = sorted(PROFILES.keys() - {"base"})
parser.add_argument(
"profiles",
nargs="*",
metavar="PROFILE",
help=f"Extra profiles to apply on top of base (available: {', '.join(extras)})",
"profile",
nargs="?",
default="hyprland",
help="Profile to install (default: hyprland)",
)
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."
),
"--force",
action="store_true",
help="Overwrite any existing links",
)
parser.add_argument(
"-i",
"--ignore",
action="store_true",
help="Ignore existing symlinks",
)
parser.add_argument(
"-r",
"--remove",
action="store_true",
help="Remove any existing symlinks",
)
return parser.parse_args()
args = parser.parse_args()
def main() -> int:
args = parse_args()
ctx = Context(args)
resolved = resolve_profiles(ctx, ["base", *args.profiles])
installer = Installer(args.profile)
try:
installer.run(
force=args.force,
ignore=args.ignore,
remove=args.remove,
)
except InstallerError as e:
installer.error(str(e))
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 installer.has_error:
sys.exit(1)
if __name__ == "__main__":
sys.exit(main())
main()
View File
+4 -1
View File
@@ -16,7 +16,10 @@ bindkey ' ' magic-space
# https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Completion
bindkey -M menuselect '^[[Z' reverse-menu-complete
bindkey -M menuselect '^F' vi-insert
bindkey -M menuselect '^M' .accept-line # Immediately execute command line on <Enter>
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
# :completion:<function>:<completer>:<command>:<argument>:<tag>
-69
View File
@@ -33,74 +33,6 @@ setopt INC_APPEND_HISTORY_TIME
# Emacs mode
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 #
###################
@@ -124,7 +56,6 @@ export DIFFPROG="nvim -d"
export NNN_TRASH=2
export NNN_PLUG=''
export MESA_WHICH_LLVM=1
export CC=gcc
#############
# LS_COLORS #