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