diff --git a/README.md b/README.md index 4a8054e..a96287b 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,54 @@ -# My personal opinionated dotfiles for `zsh` +# Personal dotfiles -## Requirement - -- **GNU** `stow` -- `zsh` (I mean, duh) +These are my config files for macOS and KDE, managed with GNU Stow. You need `stow` and `zsh` installed. ## Installation -1. clone this repo to your `$HOME` and switch to cloned dir: - ```sh -git -C $HOME clone https://github.com/vokhactri/.dotfiles.git && cd $HOME/.dotfiles +git clone https://github.com/vokhactri/.dotfiles.git "$HOME/.dotfiles" +cd "$HOME/.dotfiles" ``` -2. use `stow` to symlink configs to `$HOME/.config`: +The packages are split into three groups: -- to symlink all config dirs - ```sh - stow */ - ``` -- to symlink only one config dir, for example `zsh` - ```sh - stow zsh - ``` +- [common/](common/README.md) has Git, Micro, mpv, npm, Starship and Zsh. +- [mac/](mac/README.md) has Ghostty and the original Fastfetch config. +- [kde/](kde/README.md) has the Darwin Breeze theme, Helium, Konsole Fastfetch, Spectacle and tray icons. -3. reload your `zsh` to apply changes: +Install all of `common`, then the group for your platform: ```sh -exec zsh +(cd common && stow -t "$HOME" */) +(cd mac && stow -t "$HOME" */) # macOS +(cd kde && stow -t "$HOME" */) # KDE ``` -### `darwin-breeze` + `helium` (theme and colors) +`*/` matches every package in the group. Each line runs in a subshell, so you stay in the repo root and can run them one after another. KDE needs a few more steps after this. They're in [`kde/README.md`](kde/README.md). -The Darwin Breeze Dark KDE color scheme and global theme, and the Helium, T3 -Code, Ghostty, VS Code and Telegram themes generated from it. After stowing, apply it -once (Telegram imports its theme by hand): +### Picking packages + +You don't have to install everything. List only the packages you want: ```sh -./darwin-breeze/apply.sh +stow -d common -t "$HOME" git zsh starship +stow -d mac -t "$HOME" ghostty +stow -d kde -t "$HOME" spectacle fastfetch ``` -To change colors, edit `DarwinBreezeDark.colors` and run `apply.sh` again; see -[`darwin-breeze/README.md`](darwin-breeze/README.md). +`-d` tells Stow which group to read from. `-t` puts the symlinks in your home directory. You can mix packages from different groups. Fastfetch is the exception. Install `mac/fastfetch` or `kde/fastfetch`, never both. -### `tray-icons` (tray icons that match Breeze) +### Previewing and removing -Some icons need an extra step after `stow tray-icons` (a root step for -Ngó Sen); see [`tray-icons/README.md`](tray-icons/README.md). +`-n -v` prints what Stow would do and changes nothing. `-D` removes the symlinks. Pass the same `-d` and `-t` you used to install: -## Credit +```sh +stow -n -v -d kde -t "$HOME" spectacle +stow -D -d kde -t "$HOME" spectacle +``` + +Once the Zsh config is linked, run `exec zsh` to reload the shell. + +## Credits - [Machfiles](https://github.com/ChristianChiarulli/Machfiles/) - [zsh_unplugged](https://github.com/mattmc3/zsh_unplugged) diff --git a/common/README.md b/common/README.md new file mode 100644 index 0000000..521995a --- /dev/null +++ b/common/README.md @@ -0,0 +1,18 @@ +# Common packages + +Shared configuration for Git, Micro, mpv, npm, Starship, and Zsh. +From the repository root, install all shared packages: + +```sh +(cd common && stow -t "$HOME" */) +``` + +Or choose individual packages: + +```sh +stow -d common -t "$HOME" git +stow -d common -t "$HOME" zsh starship +``` + +Choose any of `git`, `micro`, `mpv`, `npm`, `starship`, and `zsh`. +Reload Zsh with `exec zsh` after installing its configuration. diff --git a/git/.config/git/config b/common/git/.config/git/config similarity index 100% rename from git/.config/git/config rename to common/git/.config/git/config diff --git a/git/.config/git/ignore b/common/git/.config/git/ignore similarity index 100% rename from git/.config/git/ignore rename to common/git/.config/git/ignore diff --git a/micro/.config/micro/.gitignore b/common/micro/.config/micro/.gitignore similarity index 100% rename from micro/.config/micro/.gitignore rename to common/micro/.config/micro/.gitignore diff --git a/micro/.config/micro/bindings.json b/common/micro/.config/micro/bindings.json similarity index 100% rename from micro/.config/micro/bindings.json rename to common/micro/.config/micro/bindings.json diff --git a/micro/.config/micro/settings.json b/common/micro/.config/micro/settings.json similarity index 100% rename from micro/.config/micro/settings.json rename to common/micro/.config/micro/settings.json diff --git a/mpv/.config/mpv/mpv.conf b/common/mpv/.config/mpv/mpv.conf similarity index 100% rename from mpv/.config/mpv/mpv.conf rename to common/mpv/.config/mpv/mpv.conf diff --git a/npm/.npmrc b/common/npm/.npmrc similarity index 100% rename from npm/.npmrc rename to common/npm/.npmrc diff --git a/starship/.config/starship/starship.toml b/common/starship/.config/starship/starship.toml similarity index 100% rename from starship/.config/starship/starship.toml rename to common/starship/.config/starship/starship.toml diff --git a/zsh/.config/zsh/.gitignore b/common/zsh/.config/zsh/.gitignore similarity index 100% rename from zsh/.config/zsh/.gitignore rename to common/zsh/.config/zsh/.gitignore diff --git a/zsh/.config/zsh/.zshrc b/common/zsh/.config/zsh/.zshrc similarity index 100% rename from zsh/.config/zsh/.zshrc rename to common/zsh/.config/zsh/.zshrc diff --git a/common/zsh/.config/zsh/config/alias.zsh b/common/zsh/.config/zsh/config/alias.zsh new file mode 100644 index 0000000..0f4383f --- /dev/null +++ b/common/zsh/.config/zsh/config/alias.zsh @@ -0,0 +1,20 @@ +#!/usr/bin/env zsh + +# Modern alternatives to traditional commands +alias cat='bat' +alias ls='lsd -A' +alias la='lsd -lA' +alias tree='lsd --tree' +alias nano='micro' +alias fetch='fastfetch' + +# Global alias +alias \-g -- --help="--help | bat -plhelp" + +docker() { + if command -v podman >/dev/null 2>&1; then + podman "$@" + else + command docker "$@" + fi +} diff --git a/zsh/.config/zsh/config/bin.zsh b/common/zsh/.config/zsh/config/bin.zsh similarity index 100% rename from zsh/.config/zsh/config/bin.zsh rename to common/zsh/.config/zsh/config/bin.zsh diff --git a/zsh/.config/zsh/config/default.zsh b/common/zsh/.config/zsh/config/default.zsh similarity index 100% rename from zsh/.config/zsh/config/default.zsh rename to common/zsh/.config/zsh/config/default.zsh diff --git a/zsh/.config/zsh/config/netbird.zsh b/common/zsh/.config/zsh/config/netbird.zsh similarity index 100% rename from zsh/.config/zsh/config/netbird.zsh rename to common/zsh/.config/zsh/config/netbird.zsh diff --git a/zsh/.config/zsh/config/shell.zsh b/common/zsh/.config/zsh/config/shell.zsh similarity index 100% rename from zsh/.config/zsh/config/shell.zsh rename to common/zsh/.config/zsh/config/shell.zsh diff --git a/zsh/.config/zsh/zinit.zsh b/common/zsh/.config/zsh/zinit.zsh similarity index 100% rename from zsh/.config/zsh/zinit.zsh rename to common/zsh/.config/zsh/zinit.zsh diff --git a/zsh/.hushlogin b/common/zsh/.hushlogin similarity index 100% rename from zsh/.hushlogin rename to common/zsh/.hushlogin diff --git a/zsh/.zshenv b/common/zsh/.zshenv similarity index 100% rename from zsh/.zshenv rename to common/zsh/.zshenv diff --git a/darwin-breeze/.config/ghostty/themes/DarwinBreezeDark b/darwin-breeze/.config/ghostty/themes/DarwinBreezeDark deleted file mode 100644 index 63bf5ff..0000000 --- a/darwin-breeze/.config/ghostty/themes/DarwinBreezeDark +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by darwin-breeze/build.py from DarwinBreezeDark.colors -background = #1e1e1e -foreground = #dddddd -cursor-color = #007aff -cursor-text = #ffffff -selection-background = #007aff -selection-foreground = #ffffff -palette = 0=#3b3b3b -palette = 1=#ff4a4c -palette = 2=#30d158 -palette = 3=#ff9230 -palette = 4=#419cff -palette = 5=#bf5af2 -palette = 6=#64d2ff -palette = 7=#dddddd -palette = 8=#747474 -palette = 9=#ff7779 -palette = 10=#64dc82 -palette = 11=#ffad64 -palette = 12=#70b5ff -palette = 13=#cf83f5 -palette = 14=#8bddff -palette = 15=#f1f1f1 diff --git a/kde/README.md b/kde/README.md new file mode 100644 index 0000000..2479176 --- /dev/null +++ b/kde/README.md @@ -0,0 +1,37 @@ +# KDE Plasma packages + +From the repository root, install all KDE packages: + +```sh +(cd kde && stow -t "$HOME" */) +``` + +Or choose individual packages: + +```sh +stow -d kde -t "$HOME" spectacle fastfetch +``` + +| Package | Details | +| ---------------------------------- | -------------------------------------------------------- | +| [theme](theme/README.md) | Darwin Breeze KDE colors and generated app themes | +| [helium](helium/README.md) | Browser flags and the generated Helium theme | +| [fastfetch](fastfetch/README.md) | Konsole configuration and a pre-scaled inline image logo | +| [spectacle](spectacle/README.md) | Screenshots to clipboard with a notification, no preview | +| [tray-icons](tray-icons/README.md) | Ngó Sen and qBittorrent tray icons | + +Theme and Spectacle need an additional apply step after stowing their package: + +```sh +# If you selected theme: +./kde/theme/apply.sh +# If you selected spectacle: +./kde/spectacle/apply.py +``` + +The apply scripts require a running KDE Plasma 6 session. Ngó Sen icons need +an additional install step described in the tray-icons README. + +Packages can be selected independently. Helium includes its generated theme; +it does not require the KDE theme to be installed. Choose either +`kde/fastfetch` or `mac/fastfetch`; both own `~/.config/fastfetch/`. diff --git a/kde/fastfetch/.config/fastfetch/albedo-konsole.kitty b/kde/fastfetch/.config/fastfetch/albedo-konsole.kitty new file mode 100644 index 0000000..a55e9d6 --- /dev/null +++ b/kde/fastfetch/.config/fastfetch/albedo-konsole.kitty @@ -0,0 +1 @@ +_Ga=T,f=100,t=d,c=20,r=10,q=2,m=1;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\_Gm=1;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\_Gm=1;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\_Gm=1;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\_Gm=1;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\_Gm=1;+EaRIVIFI0YMF+8NHjxYMJyJiQkx423k5uaiWDFa/PHx4v2kpCTRuRV0VNPc8QbmD2+nHfL1v0TlhtSbkTp16ohSn1UmC1jbBcMWrpdrlLCAOfjO1aJ8vKWj56ZPn07iQo8mxwO38vKQk5sND7Ieq0dKWdT8yHqQu6sfvvqqE06cOI4zZ07RhNuTruUlCj8aGdsTGxqgRbOG2LN9lXC/PLp1HqFBEeKMD4WNmQmd7SLQt/fX4HT7RcRc1V09sIPAtpvE8cau3whxy52f7+jVF3sJgMkeXli7egEe5Z4XsV92gp85uhP1atcUuizrbYrYZTGrp2cKMzN78VxLD+Q8QLpmjoT4a3IBJSkR5p9GC9GI7idEWNBcc+fSpUuk4rxEgwYNSLWpJjbo29g4kMjNE6AyNjaGn5+fRqa2aNFCpPRzOJTBuHfvXjX7KczHbYR6Pj+YBh2Z0OobjE+IFQUX1S4YBqC9tQ+CfKXkBA/3UJocJ7KWQzUALFKkNOrUEVWAsXDRAlHfma3o2LDGsLVyw8hRI/DgwX1h4U2dOpUAbCXEL++zYKZh5nEiAFQhJtXTM0bzJg0wYlh/An6Q6nAaKd3eiT5/aPc6YaSwmJ41czxqEMAWftEOR0jUsrGxj/rh/oOxrmNXJDm7YeyYoSRqc0SeIIv3nwf3EddQtZqF1mYjheUsLBzpOky0kg7U1jCrEPZkqGg721uIzCCODfv4RBFTOhO7mWP1GskR/VXnTqisZ0b3aIqRI0aI15YvX445c+ZoAMhuGRa59evX18V+GgOEk1rlefxwxC83FEjDUp8b9+zZc1jbWBHDhOTnAUZlCh2H0/DZ2uO/Oe5pYuJACnS0+D8eQPb4//rrr+Jvds14OseJwkCcMb14yULx+qZNG+Dq7IUKpJAbk/5nYGAuJjvf1eEjb/yRNi+VLFlG5BsqBgiLYc6Iad6kkciSZjF67fwhIarXEbvVio1Gc1oUA0nX+7lWXXwdHY+M+Fispvc4rf/UoW0YOqgPMbGbMApsbdlvF6TD2PAVi4LFcsH3JD0wQDjejYwsERUq7YxjYyQtsT08nCNRqlQFYkJzArClcGSz1Tx85Ai0bJoJg0+Ko0yJMggJC9ckIqglEFu9rVq1InVGXxyjpov96O8Pv+YgXfxeRQQrN8jWV+nSpRHilypbwJlCh2Md0NbKQ6x0joAwaLjWH9dX5rZgwQJ8+mlRTf4bW3ghfulwc4xCr15Sxv/+A/vgaO+F6JAmCA1Ohq2du4iiSCLudWvTlVjJyNBKKPdKCQzWI20t/TDsxz7Cic1dbK28f4Vo4i6ePcnFZrJkx435mdhzEMb9/is2rp6POdN+R/26aaTg2wjRyIaGm1vwa24WNciktDEjkf+nZL2oGdDS0kmoDFwxVdFNfdzi4ezohYyMDPTu/S0ZIV/Dy8sHBvpWKF2+Cmw/KYEd349Ft5QM1K5bV8N67EdVwLZnzx6hFzZs2FAn+xFYH33I7KdYwAa6qqUuXbaUDJDimmgDD2qgd4rYhlmtkjmJGD43owEcnXwEABMSEjUADJLPyXj06JFIQypf2hihIdF4/OQRHj58SHqRN4l2J3i7R8DY0JpYwVAo8rpAwK+xw9eMWDZZczKmJOIM9S2JHU3g5eGJlMTqaPdlFvp92w39yZIe8F13/PJTf3reHS0yM5CSXAMNmmfBwd2D9C8DOBCzsrjl79fFeuoFwCzHqEw4WAAAIABJREFUbhVDQ0udYpgZslIlPfE8MbY5/D2SkFIzRdyvmrVY7WhABtlnxIoBZQwxJpUWtI0nxk0Yj+vXpbo4HKYbOHCgeL5q1SoBwALnDmvYj9rv8hx+eOyHfAMkXLWqNBbw9z8MQPGiZTQV4H3cEoSvasGC+ejY8Su4OfvB3oaMCY9gYenVqCHpKBzH3Ldvn2ZFs6Fha2unUaCjY6Lpb3tMJwt53749NLh7hY5TrFhJra2OSndxliZfSfFKEBt+WiLYt6YALTuz2Venp28DfUMTdPiuD9p80xvtqHcb+BM8/f3gblMZ4bExWLnvIKqnpsHczFGubPA24GmznJWVq9BTJQbM/z+JIf2JIY2FRRwenI6EiEz4e0ciMzMLzTKbkyWbgEGDBov759AbHwjEQ29YvBSaN2qCB7Qo27RujTwy2tjpzE5pbi1bthSuGV3sx19F3Umeww+L/bhBNkDoxjR7gdU3mp6eiqoVzYUFzIzDpW19vUIJYCfF+1euXCLQ1SDdyFjsbouOjpWA+/33wpHKjff4shhRGrtoevXqpflb+a1Dhw7i889LCybRYkGVFcq1oZkBGYBsCNlaecLUzE68zwxlYelKLFcLd4h1l2zdjilLl2Phth2o27gh4oPtEBYZillrNyAgLAKmxKbOLgHvBT410ISxQaqDLoc050Hq65uJDBlJD2xGTJhCC7cGypfTR/HiZfDTTz+J+2VGS0tPx+nz59jtIF7jXECOdihMx50rbLEhoh4rVZLqeHkePzz244Z8A2SacmOKAcJVoewd7OBoEygYUPJttRIDGh4WLWKZ0ueeISurBel8pZCcLI4eQYcOHXD+/HnxnPXI9u3by5+Vig+pNzuNGTtauBi4cSoSF6xUs6Dk5vCEkYGVVu4fK/n6ZEFKYPAR5X5LlaqMIUOkTeD3HzzErsNHsHDTFtRq0ACBLpYIDPTDnPUbEV09ESbG9gUA6COAL6xvepQWQUGWCxB6qm490A82Nm6CIXmrQYwo28tFilognYwRV8dgsVhYj9y5U8uRrGVwsBNfaQsXLhSZMcpG/QKhN47HOcvz+EGyn6ZYubomjNoAKVWqNEJlA4QZkBMreTCtTL00RXcYRNxq1EjUiJhBgwbh7FnpLGyOdfbu3Zt0nweaQeTOemBaah1ULGuOmilSNGD48F9RtmxVYRAoOhZPuqmpnai4IMQvAY+zSnzcYkn3syDQcuSAow12iIqK04qTKozxbd9+6NjaFg0ywkHrilSL70lfMxb+Rq7OwOKTrW3eImps4igc0MzoLKLzd71JAGRL19jYSqexxCBkAFqRvhrkl6wp18ZsGBlcV7Aju2JYUijXp85uUcZGuW5PT09hAatBqmK/9ep5/OAa8iMglpAC2eL+lJvn0NmnnxQTq1hJKhVhL2JBL9dIlCtdDaNGKTs4gXnz5uGPP/4QzxlsKn1F1HwpmIJ+//5dBPlHIjWhHZxsgtG0SSbpiLtp4u0EABTDQBG/XHNGscTZ9+dgS6xoaEx6VAliJH3SzyqhfoM0AvEIUdU+O/uOhmFGj56I+fN8MKCfD723nhbXaQKDMemhzFo+BBg3VOQ6MnbOqJ0ah9m/u5EYdUG58gbCbaKkYDHrsT+Q9c6ChohyrYa0KFhf9fQI1/IJ8qLh7CDOqvHw8Mbdu3e0xkNpCtBYVDP7FcyOVgGwnTx/H7b4pccU9Y0pA9CjR3eRhJpaQzvpk3UvTsPiwjt82Mv8BfPE5zmdSNH73rThRmkvX0jAqJ/RWGTG1E7uACe7EJpYQ2IQPS0diwP5BnrmpNRL9WjYGPJzT0bThvVx7vhf6PF1e8TGOuOXIfbYuSkAU6d4o39fJzRs4IuePXqSUv8QPXp+jeVLAnFofxTq1rHFyVMX0bZNe/q9zwk0esSkRvh91E+4du4QHt06jQfnauHm+S2Y+8dkhAQFiIr+imjmzUdSposua91fiGfFmteqlpXQGl4usQQ+D9y8Ke16KJhipSxSNkB4anhRq19HvuuFv0Bfnr8PlgGVCMj3yuJTD0p0dCSM9Ow1OYDqWjC8E479f1x/xcjQAlu3bdEa0HcBUBnQL1p+qdlayalZjjSB7KRVACjirBYOsLZwE75HFr+i7Jm1P2ZNH0taUA5ePbyGs8eOYMnsYXh4zh/H94Xg3JkM3L+djpnTPREb44quXbwwbXIQ6ajx6P2NIyIjvdG+XTgOH4xCowauOH5wN11UrogJ51w+gZtHa+HW5Y14fj8HD3PPonuXtqhQQU92kvuKa2S99E1+QzZUOCtaCs21lNWX5nCh906cPK4TfMoY8SKuVq0aunXrBjUhqOeI2kB57j5M9uOGfB1wjTwAGgOEU8UNDQ3g6Rz9\_Gm=1;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\_Gm=1;DrbvlDbxPLhYncCWhrtXBhDIRpMxsR13L3XC/WuDNNdw90I7sqaXyhdE7P9SBiqB7s65Znjx9Coe31qA3GNBuH2mHm4e9qV/+gFLlm5AFlm/cuFmvKDxY+nB+1648Sb+cuX05H0mvrCyciM29xa5j2rQ5uvEV+Dq4fXORc0GnpdfkABhly5dNOP6BiZUdsj9s9ESFfgS5ZnTqsaugI/38PLHzK3siPLrIrp6itBD+MYDw6KFYvz3QEj/T93Z1R2XL2u7HQr+dt++/YQ/8MsvvxRZ06xXjRs3Dps2bcK1a9fF5cbHJZEYbgg/nwhk59zUfN9j+o45a9ah3Te9kJ2bK00K3WHemca4d6krHmZPIOB1JUA1R84Rd+SdiCFgpuP22UYCWM+fnFeWBBTPxosnF5F9xJWs5BoCpLlH/fHw5hgC6zL6Xuk8uzZt2+D7kaNxOTePrk4bUPwYGRElcgg9PcPExnMGpQIYpalzLq3tnLTEr66e72uNFHPF+0SURVpgbBUlsb889/9MvBj5sV5v6nc1I60sFdkhPGHCBHFDji4eAnw8CJE04bziLG3sBfXni+H3BJ8wRurAxMwKgwcP0gKc0tQp+VwBatcuycXB+yR4QfD5we3atUPHjh3JKPGHn3sNce7bzHlzcPrKNazYsg3j5i3AuPkLsWDTFjxky1SuKsLMdfdie/l3JN32AYnbe5d74cWzbDy5t5VYrbZgO+kzzyRr7OUjAmcGAXe8DMYLBERpi8Gj3Gm4fUFKj1o4fw7SmmTiu+Gj0fvHIZj+52xRQGgjLZqLly7TPf8oYsWWlq5CjZCYSrfzuUePnkJasOX7tjFl9mNSYMkUHB4j5iwrq7kuEGpcNCpn9f+/ERPkO5rN6eIuyBejWX4K+LgaAX/M2c1LKLt8gwJ8tNJYB7S0sRP+vr8DPvWKtaGV7e3toym++KYAPO+U4xQkVcq55jOcWc0boAL8I+Du8P+19x3QVRVd25+KBaSlEUghIRXSK4QaCJ1QQ0dAlCJVQBRUqg0roNgVsRBpAkoVQgelNxUQEAGFIAIqRZqU59/PnDMn597cmwR83/9b31qctWbl5p5yz8w8s/ve0xAtO3XGtKU5eHf2XHwyfyGmCACzFy/BZR2Gz+deuyDAaYarl36ynnP10o9C/bIsmfDCqU+EClbFlb+3aTsU/hRWe/KHeLnfSB04d2yUsG1j06i/Dj2Ev08ZyfTZ2Z+hfkY6Rj35GJ58/FGMHTkMz4x6Ak/J56eeGIwe3TurEDJq9zqqxWnrBQsrmc1boHqdBkrJcytTNxeZOjJK5iRefW6cmYXa9RqpuSPn0IB2AqEuXFnHTpD+f4BPCZ7yMqWl0zoVzSI/GnzU3P7HpHzNhPIReOwsV1hSag34BwYbZoFbBF96/aaIFepJMwJLTdhXvf3QoGMBI5Yk40GZSgvZ+p65Qvn8fCIRH1cD782eLaBbis+/zsGMnJVYumGTbXKN688fe0ao3qvmd0afKctdEep39dI+nP6xLs7lvqwo3NkjfXH20AO4dOJZXDn9Ds793EpkwGP4Y38T+fubUM3f5XMmrl4xtOlxY8eoTXVw4y/lAmSYFjVyFrKkV+af87ki14apahCu+q2B8ssvvyA2PlHGrHARhwqKf2AQqtWsq+Ry/q8p4Yjhw139jkY8q5352wnTfxV8yKN+c53BpyebpgNW3wyLiDLYrgm+RrKyakqnyvsFGFSPst9NA7Cl8pBQVokWKurr649HHnnELQDt78VEJjYeXCi83r5xy5SPpsCrjD+yHuiG2StX45X3P0THh3tiwOAh1rNY9Ec98+IeAVcrpeFqUF76az7+ONBGabaXz20wricwD/fH8T1ZOHnmCk4Ixn79abLyBZ/LNajf+eOv4OxRA0wXLpzHkEEDlE/YKOW212hH96pwfhYyZ+WFhx/u4SqgwGEccnKWqRxmLvqCuIwxN21QO6MxKvgHqu9IMHhfWq16CoQTJkxwGEunuV9gJ07/TQBque8184etsFvdaVbe9PH2Vj5HQ+ZrYVIt6WjjlmZkS0NF/W6F9apnyWAlpVRH5SoxiBA2HB0do5KtDYC4DlTQ78d84YkTJ6rPGniXLl0WDfkQtu/YoYo3UmkJr1IFAUIR7rzzbmUYtj8DJgjPHHoQl8/kWL9x4VQ2Tn9XDheOtBEqtRI792xCds5P2Lm5P5aunIi356zF/KWv4octvfDbzgjk7u2MHw7swdmDLYRqGnnQDBgl67123rGYuaqif+4Yvt+yCh3at7UqHLgKztUgYT+9vH3RsIhytWFdSBGlJUp9rteouZLVE1PSFAhZjcIdCGXch9gx8t8An9Z4B5kdzyseZw4Cc0sjIyPh6VVOKQl2o2cTUTQCg0OUH7IpV2TjFrcEPv28mNgkAWCssOFkeMnv0cDtAJICQEgq2KlTJ7w4/nk8NmQwevd8CEMf7afkrWULZ+G1F8casquID5WrxCEhMUmlEJgDbdn0Lv4xE2cO91Kfz+c+h78PZeLEiV1YueZl7FjXAAc2V8PGtd2wb0sj7N7UGvu3NsHBbRlYv3YQshfNxZpVg3F4S2Vs2/AIfj1hRLG8/sYbmPnZe6qGoA6G5V/WpCH42mW1lkX+U4F9tfJhhDN4+1RAnXqNi2Rp0PJgYFAlxYrJhglC2gkJylKlSmL37t3Ov61X/Ln/Wv0YG/haIi90W4fuKAByVdSrWxf33ldCgS2vU4bSERkVi4jKMWpFaap4S9RPBrJORhMFvipRcUoO9C0fgB49HioUgPaKUC+8MB710mtg/3ff4MxvB3Dh9GElWzGAdMTjg1CuPOPsEhUIuaB0GQvj+aaB+Np5UR66C4t9RNoAoWb78enC5fjgy2WY8tVqzFryOdatfRzHv0vA95va4atlb2Lq/CV4b946vCtt5erRuLAvAKtXDsD0pRsVO+/TuycO79uqQr709g38zO/aZrXC4cNHjN92k5Zg94Q0adpUqHglpFarZQCwMI5jsuIaorT4Vwy2vFPaWO3lQ/tjnCubox70AjfHvlXwababIO2M+UPXnSeUbIqXKRlNOqtfnCYWRreQJTf+F2zXLv9Vq56OyMrRAsB4REXHKzbMujAFhevbJyb3+HFcvHQJmzdtRscObbFj4wqcP3lIJR+x/FpyUiIqhUaqZ8eJBu/lXV7ZD+0A1GNOee/Mbh8cPfgWpn45F+/NXSEgy8GnC+bj4/mL8f6Xa7B3cwvMXDxNff7gy1WYvmgGftyciQNbG2HOkg9xaHttzM3JxrdbdsHL0wOvjh+jFA++j8GCDygWPKBfL3zz7QYRN/60gjFc9ZPHpYsXkZCQhBDpB7lEUTmOQTDaKWIRK+zYkB9bWIoKS+L169fXNhbW7+p/mttx82/BpxUOP1lxPzn9kKXx0mHOy2oLqbfLdkpbbdBM5D5/1G2YabKBfwPAVkpxiU9kpagYRQENKpiMsh7e+Pzzz/MNjDP4GH708EPd0b1bF8yfvxBdOndSfl9SGUY8q33avMspysdnU9EJrhSBtLQaVn+vm16Ns0fH4u9f++PAz2uweU0z/LqrFnZu7Ib5yyYrSvf+vLUKhGS9nyxYgI++Woa1a4bj2K6q2LB+EKYuWCaUcCPWrOyDI/uG4vlXPhD52Uf9/szP3hce/7taEGTBzE/Z/m0OMurVURW4dIK+jpxxBiCTzSOFbUZEyjgJt6hdRDasG1mvX0CQKCPNTcdBSwVArZTo8h4u9pujZUSH4926UoK8qObi0tY7g89u3uBlKWm1TZteC5s8kaUoX2r1Ooot/zvqZ4CPbjxSJg0+NoKlfIVAJdcZALluBlrmsak//zQqw+3c9R1eHj8Wh37cgrSqyQK+1Uq+0lXrufM5s+bI2o3nxyI+IRHlfH2xaeMGa6QvnhaFY18T9d/WvUcw8fPFmL7wM6xfM1AoWz38tDUDm9b3wfKV8lvbagvwHpPv0rF7YzNMX/Ah3pwtrHrOXLw/dz5mLpmNPw/KeDWqjaBKkep3vby8RR6dqWIT+W7cX27Prm/w7NgnsXv7GquchnPJDb1IWDcnJCRMPStSFmtVmYOGRQz4UDK7zCXttxSdtK2WVJSs\_Gm=1;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\_Gm=1;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\_Gm=0;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\ \ No newline at end of file diff --git a/fastfetch/.config/fastfetch/albedo.png b/kde/fastfetch/.config/fastfetch/albedo.png similarity index 100% rename from fastfetch/.config/fastfetch/albedo.png rename to kde/fastfetch/.config/fastfetch/albedo.png diff --git a/kde/fastfetch/.config/fastfetch/config.jsonc b/kde/fastfetch/.config/fastfetch/config.jsonc new file mode 100644 index 0000000..257eae9 --- /dev/null +++ b/kde/fastfetch/.config/fastfetch/config.jsonc @@ -0,0 +1,80 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json", + "display": { + "key": { + "width": 10 + }, + "size": { + "binaryPrefix": "jedec" + }, + "separator": "" + }, + "logo": { + "type": "raw", + "source": "~/.config/fastfetch/albedo-konsole.kitty", + "width": 20, + "height": 10 + }, + "modules": [ + "break", + { + "type": "os", + "key": "os", + "keyColor": "yellow", + "format": "{name}" + }, + { + "type": "kernel", + "key": "ker", + "keyColor": "green" + }, + { + "type": "packages", + "key": "pkgs", + "keyColor": "cyan" + }, + { + "type": "shell", + "key": "sh", + "keyColor": "blue", + "format": "{pretty-name}" + }, + { + "type": "wm", + "key": "wm", + "keyColor": "red", + "format": "{pretty-name}" + }, + { + "type": "uptime", + "key": "up", + "keyColor": "green" + }, + { + "type": "cpu", + "key": "cpu", + "keyColor": "red", + "format": "{name}" + }, + { + "type": "memory", + "key": "ram", + "keyColor": "yellow", + "format": "{used} / {total}" + }, + { + "type": "disk", + "key": "disk", + "keyColor": "cyan", + "folders": [ + "/" + ], + "format": "{size-used} / {size-total}" + }, + "break", + { + "type": "custom", + "format": "\u001b[33m󰮯 \u001b[32m󰊠 \u001b[34m󰊠 \u001b[31m󰊠 \u001b[36m󰊠 \u001b[35m󰊠 \u001b[37m󰊠 \u001b[97m󰊠" + } + ] +} \ No newline at end of file diff --git a/kde/fastfetch/.stow-local-ignore b/kde/fastfetch/.stow-local-ignore new file mode 100644 index 0000000..5638fba --- /dev/null +++ b/kde/fastfetch/.stow-local-ignore @@ -0,0 +1,3 @@ +^/README.* +^/build\.py +__pycache__ diff --git a/kde/fastfetch/README.md b/kde/fastfetch/README.md new file mode 100644 index 0000000..ad55f4a --- /dev/null +++ b/kde/fastfetch/README.md @@ -0,0 +1,26 @@ +# Fastfetch for Konsole + +From the repository root: + +```sh +stow -d kde -t "$HOME" fastfetch +``` + +The configuration, source PNG, and generated logo live in +`kde/fastfetch/.config/fastfetch/`. The generated logo is included, so a new +machine does not need to run the build script. + +Choose either this package or `mac/fastfetch`; both own `~/.config/fastfetch/`. + +Konsole needs inline image data instead of the original `kitty-direct` file +transfer. The committed `albedo-konsole.kitty` logo is pre-scaled to 20 × 10 +cells to avoid grainy terminal scaling. + +After changing `albedo.png`, the logo dimensions, or Konsole's font, update +the cell size in `build.py` and regenerate the logo from the repository root: + +```sh +python3 kde/fastfetch/build.py +``` + +The build script requires `vipsthumbnail` from libvips. diff --git a/kde/fastfetch/build.py b/kde/fastfetch/build.py new file mode 100755 index 0000000..4088248 --- /dev/null +++ b/kde/fastfetch/build.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +"""Encode albedo.png as kitty graphics escapes for fastfetch's "raw" logo. + +fastfetch's "kitty-direct" logo sends the terminal a file path (t=f). Konsole +only accepts inline data (t=d) and answers t=f with ENOTSUPPORTED, which lands +on the prompt as typed input. These files carry the PNG inline instead, with +q=2 so the terminal never answers at all. + + .config/fastfetch/albedo-konsole.kitty pre-scaled for Konsole + +Konsole stretches the image to the c x r cell box with nearest-neighbour +scaling, at logical (not device) pixel size, so a 512px source turns grainy. +The Konsole copy is resized with Lanczos to exactly that box, which leaves +Konsole nothing to scale. Rerun after changing the image, the logo size or the +Konsole font. +""" + +import base64 +import subprocess +import tempfile +from pathlib import Path + +PKG = Path(__file__).resolve().parent +DIR = PKG / ".config/fastfetch" +SOURCE = DIR / "albedo.png" +# Logo size in cells; keep in sync with "width" and "height" in config.jsonc. +COLS, ROWS = 20, 10 +# Konsole's cell size in logical pixels for JetBrainsMono Nerd Font 10pt +# (QFontMetrics: average advance of Konsole's REPCHAR, and height()). +KONSOLE_CELL = 8, 17 + + +def encode(png, dst): + data = base64.b64encode(png) + chunks = [data[i : i + 4096] for i in range(0, len(data), 4096)] + out = bytearray() + for n, chunk in enumerate(chunks): + more = int(n < len(chunks) - 1) + if n == 0: + keys = b"a=T,f=100,t=d,c=%d,r=%d,q=2,m=%d" % (COLS, ROWS, more) + else: + keys = b"m=%d" % more + out += b"\x1b_G" + keys + b";" + chunk + b"\x1b\\" + dst.write_bytes(out) + + +def resize(width, height): + with tempfile.TemporaryDirectory() as tmp: + out = Path(tmp) / "out.png" + subprocess.run( + ["vipsthumbnail", SOURCE, "--size", f"{width}x{height}!", "-o", out], + check=True, + ) + return out.read_bytes() + + +encode(resize(COLS * KONSOLE_CELL[0], ROWS * KONSOLE_CELL[1]), DIR / "albedo-konsole.kitty") diff --git a/helium/.config/helium-browser-flags.conf b/kde/helium/.config/helium-browser-flags.conf similarity index 81% rename from helium/.config/helium-browser-flags.conf rename to kde/helium/.config/helium-browser-flags.conf index d91df01..c8225e1 100644 --- a/helium/.config/helium-browser-flags.conf +++ b/kde/helium/.config/helium-browser-flags.conf @@ -2,5 +2,5 @@ --ozone-platform-hint=auto --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoEncoder -# Darwin Breeze theme, generated by darwin-breeze/build.py +# Darwin Breeze theme, generated by kde/theme/build.py --load-extension=~/.local/share/helium-themes/darwinbreeze diff --git a/kde/helium/.gitignore b/kde/helium/.gitignore new file mode 100644 index 0000000..4cda4b3 --- /dev/null +++ b/kde/helium/.gitignore @@ -0,0 +1,2 @@ +# Helium caches the built theme next to the manifest. +Cached Theme.pak diff --git a/darwin-breeze/.local/share/helium-themes/darwinbreeze/manifest.json b/kde/helium/.local/share/helium-themes/darwinbreeze/manifest.json similarity index 94% rename from darwin-breeze/.local/share/helium-themes/darwinbreeze/manifest.json rename to kde/helium/.local/share/helium-themes/darwinbreeze/manifest.json index 31a7e58..5206125 100644 --- a/darwin-breeze/.local/share/helium-themes/darwinbreeze/manifest.json +++ b/kde/helium/.local/share/helium-themes/darwinbreeze/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Darwin Breeze", "version": "1.0", - "description": "Generated by darwin-breeze/build.py from DarwinBreezeDark.colors", + "description": "Generated by kde/theme/build.py from DarwinBreezeDark.colors", "theme": { "colors": { "frame": [ diff --git a/kde/helium/README.md b/kde/helium/README.md new file mode 100644 index 0000000..034a396 --- /dev/null +++ b/kde/helium/README.md @@ -0,0 +1,11 @@ +# Helium + +Browser flags and the generated Darwin Breeze theme. From the repository root: + +```sh +stow -d kde -t "$HOME" helium +``` + +The theme files are included, so the KDE `theme` package does not need to be +stowed to use Helium's theme. To regenerate its colors from the shared color +scheme, run `python3 kde/theme/build.py` and restart Helium. diff --git a/kde/spectacle/.local/share/applications/org.kde.spectacle.desktop b/kde/spectacle/.local/share/applications/org.kde.spectacle.desktop new file mode 100644 index 0000000..feaf3b3 --- /dev/null +++ b/kde/spectacle/.local/share/applications/org.kde.spectacle.desktop @@ -0,0 +1,61 @@ +[Desktop Entry] +GenericName=Screenshot Capture Utility +Name=Spectacle +Comment=Take screenshots and screen recordings +Categories=Qt;KDE;Utility; +Keywords=snapshot;capture;print;screenshot;snipping;snipping tool;snip; +Exec=/usr/bin/spectacle --background --region --copy-image +Icon=spectacle +Type=Application +StartupNotify=false +Actions=FullScreenScreenShot;CurrentMonitorScreenShot;ActiveWindowScreenShot;RectangularRegionScreenShot;WindowUnderCursorScreenShot;RecordRegion;RecordScreen;RecordWindow;OpenWithoutScreenshot; +DBusActivatable=false +X-DBUS-StartupType=Unique +X-DBUS-ServiceName=org.kde.Spectacle +X-KDE-Shortcuts=Print,Meta+Shift+S +X-KDE-DBUS-Restricted-Interfaces=org.kde.KWin.ScreenShot2 +X-KDE-Wayland-Interfaces=org_kde_plasma_window_management,zkde_screencast_unstable_v1 + +[Desktop Action FullScreenScreenShot] +Name=Capture Entire Desktop +Exec=/usr/bin/spectacle --background --copy-image -f +X-KDE-Shortcuts=Shift+Print + +[Desktop Action CurrentMonitorScreenShot] +Name=Capture Current Monitor +Exec=/usr/bin/spectacle --background --copy-image -m + + +[Desktop Action ActiveWindowScreenShot] +Name=Capture Active Window +Exec=/usr/bin/spectacle --background --copy-image -a +X-KDE-Shortcuts=Meta+Print + +[Desktop Action RectangularRegionScreenShot] +Name=Capture Rectangular Region +Exec=/usr/bin/spectacle --background --copy-image -r +X-KDE-Shortcuts=Meta+Shift+Print + +[Desktop Action WindowUnderCursorScreenShot] +Name=Capture Window Under Cursor +Exec=/usr/bin/spectacle --background --copy-image -u +X-KDE-Shortcuts=Meta+Ctrl+Print + +[Desktop Action RecordRegion] +Name=Start/Stop Region Recording +Exec=/usr/bin/spectacle -R region +X-KDE-Shortcuts=Meta+Shift+R,Meta+R + +[Desktop Action RecordScreen] +Name=Start/Stop Screen Recording +Exec=/usr/bin/spectacle -R screen +X-KDE-Shortcuts=Meta+Alt+R + +[Desktop Action RecordWindow] +Name=Start/Stop Window Recording +Exec=/usr/bin/spectacle -R window +X-KDE-Shortcuts=Meta+Ctrl+R + +[Desktop Action OpenWithoutScreenshot] +Name=Launch without taking a screenshot +Exec=/usr/bin/spectacle -l diff --git a/kde/spectacle/.local/share/kglobalaccel/org.kde.spectacle.desktop b/kde/spectacle/.local/share/kglobalaccel/org.kde.spectacle.desktop new file mode 120000 index 0000000..5da295c --- /dev/null +++ b/kde/spectacle/.local/share/kglobalaccel/org.kde.spectacle.desktop @@ -0,0 +1 @@ +../applications/org.kde.spectacle.desktop \ No newline at end of file diff --git a/kde/spectacle/.stow-local-ignore b/kde/spectacle/.stow-local-ignore new file mode 100644 index 0000000..d1a989d --- /dev/null +++ b/kde/spectacle/.stow-local-ignore @@ -0,0 +1,4 @@ +^/README.* +^/apply\.py +^/settings +__pycache__ diff --git a/kde/spectacle/README.md b/kde/spectacle/README.md new file mode 100644 index 0000000..84a611f --- /dev/null +++ b/kde/spectacle/README.md @@ -0,0 +1,28 @@ +# Spectacle + +Capture screenshots in the background, copy the image to the clipboard, and +show a completion notification. Screenshots are not automatically saved. + +```sh +stow -d kde -t "$HOME" spectacle +./kde/spectacle/apply.py +``` + +Requires Spectacle, KDE Plasma 6, GNU Stow, Python 3, `kwriteconfig6`, +`kbuildsycoca6`, `qdbus6`, and `gdbus`. Run the apply script in your KDE session. +Move any existing files reported as conflicts by Stow out of the way first. + +- **Print** / **Meta+Shift+S**: select a rectangular region. +- **Shift+Print**: entire desktop. +- **Meta+Print**: active window. +- **Meta+Shift+Print**: select a rectangular region. +- **Meta+Ctrl+Print**: window under the cursor. + +The desktop launcher and shortcut entry are managed by Stow. The files in +`settings/` are merged into `~/.config/spectaclerc` and `~/.config/klipperrc` +by `apply.py`, preserving unrelated preferences and window state. Klipper's +`SaveImages=true` keeps captured images available after Spectacle exits. + +After editing settings or launcher commands, run `apply.py` again. It rebuilds +the cache using the KDE session's environment and reloads only Spectacle's +shortcut component, preserving custom key bindings. diff --git a/kde/spectacle/apply.py b/kde/spectacle/apply.py new file mode 100755 index 0000000..7ff74c4 --- /dev/null +++ b/kde/spectacle/apply.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +"""Apply screenshot preferences and reload Spectacle's KDE shortcuts.""" + +import ast +import configparser +import os +from pathlib import Path +import re +import subprocess + + +HERE = Path(__file__).resolve().parent +COMPONENT = "org.kde.spectacle.desktop" +ACCEL = "/component/org_kde_spectacle_desktop" + + +def run(*args, **kwargs): + return subprocess.run(args, check=True, text=True, **kwargs) + + +def accel(path, method, *args): + return run( + "gdbus", "call", "--session", "--dest", "org.kde.kglobalaccel", + "--object-path", path, "--method", method, *args, + capture_output=True, + ).stdout + + +def main(): + for name in ("spectaclerc", "klipperrc"): + config = configparser.ConfigParser(interpolation=None) + config.optionxform = str + config.read(HERE / "settings" / name) + for group in config.sections(): + for key, value in config[group].items(): + run("kwriteconfig6", "--file", name, "--group", group, + "--key", key, value) + + # T3's locale and XDG_DATA_DIRS can differ from the running KDE session. + # Build the cache KDE actually reads, rather than an app-specific cache. + session = dict( + line.split("=", 1) for line in + run("systemctl", "--user", "show-environment", capture_output=True) + .stdout.splitlines() if "=" in line + ) + env = os.environ.copy() + for key in ("LANG", "LANGUAGE", "XDG_DATA_DIRS", "XDG_DATA_HOME", + "XDG_CACHE_HOME", "XDG_CONFIG_HOME"): + env.pop(key, None) + if key in session: + env[key] = session[key] + for key in set(env) | set(session): + if key.startswith("LC_"): + env.pop(key, None) + if key in session: + env[key] = session[key] + run("kbuildsycoca6", "--noincremental", env=env) + + # Existing shortcut components retain their old Exec commands. Recreate + # only Spectacle's component, preserving any customized key bindings. + try: + output = accel(ACCEL, "org.kde.kglobalaccel.Component.allShortcutInfos") + except subprocess.CalledProcessError: + shortcuts = [] # Component has not been registered yet. + else: + shortcuts = ast.literal_eval(re.sub(r"@a[is] ", "", output))[0] + accel(ACCEL, "org.kde.kglobalaccel.Component.cleanUp") + + action = [COMPONENT, "_reload_config", "Spectacle", "Reload configuration"] + accel("/kglobalaccel", "org.kde.KGlobalAccel.doRegister", repr(action)) + accel("/kglobalaccel", "org.kde.KGlobalAccel.unregister", + COMPONENT, "_reload_config") + for name, label, component, friendly, context, _, keys, defaults in shortcuts: + if keys != defaults: + identity = component if context == "default" else f"{component}|{context}" + accel("/kglobalaccel", "org.kde.KGlobalAccel.setForeignShortcut", + repr([identity, name, friendly, label]), repr(keys)) + + run("qdbus6", "org.kde.klipper", "/klipper", + "org.kde.klipper.klipper.reloadConfig") + print("Applied Spectacle: copy to clipboard with a notification, no preview.") + + +if __name__ == "__main__": + main() diff --git a/kde/spectacle/settings/klipperrc b/kde/spectacle/settings/klipperrc new file mode 100644 index 0000000..b744434 --- /dev/null +++ b/kde/spectacle/settings/klipperrc @@ -0,0 +1,2 @@ +[General] +SaveImages=true diff --git a/kde/spectacle/settings/spectaclerc b/kde/spectacle/settings/spectaclerc new file mode 100644 index 0000000..5683516 --- /dev/null +++ b/kde/spectacle/settings/spectaclerc @@ -0,0 +1,3 @@ +[General] +autoSaveImage=false +clipboardGroup=PostScreenshotCopyImage diff --git a/darwin-breeze/.gitignore b/kde/theme/.gitignore similarity index 51% rename from darwin-breeze/.gitignore rename to kde/theme/.gitignore index 536a28d..2a167cb 100644 --- a/darwin-breeze/.gitignore +++ b/kde/theme/.gitignore @@ -1,5 +1,3 @@ -# Helium caches the built theme next to the manifest. -Cached Theme.pak __pycache__/ # Binary packages built by build.py. *.vsix diff --git a/darwin-breeze/.local/share/color-schemes/DarwinBreezeDark.colors b/kde/theme/.local/share/color-schemes/DarwinBreezeDark.colors similarity index 100% rename from darwin-breeze/.local/share/color-schemes/DarwinBreezeDark.colors rename to kde/theme/.local/share/color-schemes/DarwinBreezeDark.colors diff --git a/darwin-breeze/.local/share/plasma/look-and-feel/dev.trivk.darwinbreeze.dark/contents/defaults b/kde/theme/.local/share/plasma/look-and-feel/dev.trivk.darwinbreeze.dark/contents/defaults similarity index 100% rename from darwin-breeze/.local/share/plasma/look-and-feel/dev.trivk.darwinbreeze.dark/contents/defaults rename to kde/theme/.local/share/plasma/look-and-feel/dev.trivk.darwinbreeze.dark/contents/defaults diff --git a/darwin-breeze/.local/share/plasma/look-and-feel/dev.trivk.darwinbreeze.dark/metadata.json b/kde/theme/.local/share/plasma/look-and-feel/dev.trivk.darwinbreeze.dark/metadata.json similarity index 100% rename from darwin-breeze/.local/share/plasma/look-and-feel/dev.trivk.darwinbreeze.dark/metadata.json rename to kde/theme/.local/share/plasma/look-and-feel/dev.trivk.darwinbreeze.dark/metadata.json diff --git a/darwin-breeze/.stow-local-ignore b/kde/theme/.stow-local-ignore similarity index 53% rename from darwin-breeze/.stow-local-ignore rename to kde/theme/.stow-local-ignore index 6fcd543..6577ded 100644 --- a/darwin-breeze/.stow-local-ignore +++ b/kde/theme/.stow-local-ignore @@ -1,9 +1,8 @@ -# Build and apply scripts stay in the repo; only the dotfiles get linked. ^/README.* +^/\.gitignore ^/apply\.sh ^/build\.py -__pycache__ -^/\.gitignore ^/t3 ^/telegram ^/vscode +__pycache__ diff --git a/darwin-breeze/README.md b/kde/theme/README.md similarity index 69% rename from darwin-breeze/README.md rename to kde/theme/README.md index 95c52cc..56defa3 100644 --- a/darwin-breeze/README.md +++ b/kde/theme/README.md @@ -1,7 +1,7 @@ # Darwin Breeze Breeze for KDE Plasma 6 in the macOS dark system colors, with Helium, T3 Code, -Ghostty, VS Code and Telegram themed from the same colors. +VS Code and Telegram themed from the same colors. Only the colors change. Breeze still draws the widgets and the title bar, and the window buttons stay on the right. @@ -18,8 +18,8 @@ the window buttons stay on the right. From `~/.dotfiles`: ```sh -stow darwin-breeze helium -./darwin-breeze/apply.sh +stow -d kde -t "$HOME" theme +./kde/theme/apply.sh ``` `apply.sh` regenerates the app themes, applies the global theme, hides the @@ -31,7 +31,7 @@ Reload Window. Telegram has to import its theme by hand: Settings → Chat Settings → Chat background → Choose from file, then pick -`darwin-breeze/telegram/DarwinBreezeDark.tdesktop-theme` and Apply. Import it +`kde/theme/telegram/DarwinBreezeDark.tdesktop-theme` and Apply. Import it again after the colors change. ## Changing colors @@ -39,21 +39,20 @@ again after the colors change. The color scheme is the only place colors are defined: ``` -.local/share/color-schemes/DarwinBreezeDark.colors +kde/theme/.local/share/color-schemes/DarwinBreezeDark.colors ``` -Edit it, then run `./darwin-breeze/apply.sh` again. Everything else follows: +Edit it, then run `./kde/theme/apply.sh` again. Everything else follows: -| App | How it gets the colors | -| --- | --- | -| Qt / KDE apps | the color scheme itself | -| GTK apps | Breeze GTK, which `kde-gtk-config` syncs from the scheme | -| Tray icons in `tray-icons/` | `ColorScheme-Text`, recolored by Plasma | -| Helium | `.local/share/helium-themes/`, generated by `build.py` | -| T3 Code | `t3/darwin-breeze.json`, generated by `build.py` and published with `t3 theme set` | -| Ghostty | `.config/ghostty/themes/`, generated by `build.py` | -| VS Code | `vscode/package.json` and `vscode/themes/`, generated by `build.py`, packed into `darwin-breeze.vsix` and installed by `apply.sh` | -| Telegram | `telegram/DarwinBreezeDark.tdesktop-theme`, built by `build.py` and imported by hand | +| App | How it gets the colors | +| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Qt / KDE apps | the color scheme itself | +| GTK apps | Breeze GTK, which `kde-gtk-config` syncs from the scheme | +| Tray icons in `kde/tray-icons/` | `ColorScheme-Text`, recolored by Plasma | +| Helium | `../helium/.local/share/helium-themes/`, generated by `build.py` | +| T3 Code | `t3/darwin-breeze.json`, generated by `build.py` and published with `t3 theme set` | +| VS Code | `vscode/package.json` and `vscode/themes/`, generated by `build.py`, packed into `darwin-breeze.vsix` and installed by `apply.sh` | +| Telegram | `telegram/DarwinBreezeDark.tdesktop-theme`, built by `build.py` and imported by hand | The generated text files are committed so that `stow` alone gives a working setup; the binary packages (Telegram's `.tdesktop-theme`, VS Code's `.vsix`) @@ -80,7 +79,7 @@ are built by `build.py` instead. Don't edit generated files by hand. - Syntax colors are Pierre Dark's, the theme T3 Code highlights code with (`vscode/base/pierre-dark.json`, taken from T3 Code). They are used as they are, without gamma compensation, so code looks the same in both apps. -- The terminal uses the same 16 colors as Ghostty. +- The terminal palette is generated from the color scheme. - VS Code is Electron, so its workbench colors get the same gamma compensation as Helium and T3 Code. - The `.vsix` isn't committed; `build.py` packs it from `vscode/`. @@ -103,7 +102,8 @@ are built by `build.py` instead. Don't edit generated files by hand. ## Helium notes - Helium loads the theme from `~/.local/share/helium-themes/darwinbreeze` - through `--load-extension` in `helium/.config/helium-browser-flags.conf`. + through `--load-extension` in `kde/helium/.config/helium-browser-flags.conf`. + Install it separately with `stow -d kde -t "$HOME" helium`. - In Helium's compact layout the active tab and the toolbar segments on either side share one theme color, so the toolbar is the same color as the tab strip and inactive tabs are drawn lighter, as Dolphin does. diff --git a/darwin-breeze/apply.sh b/kde/theme/apply.sh similarity index 91% rename from darwin-breeze/apply.sh rename to kde/theme/apply.sh index af62ae8..3432796 100755 --- a/darwin-breeze/apply.sh +++ b/kde/theme/apply.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash # Regenerate the app themes from the color scheme and apply Darwin Breeze. # -# Run `stow darwin-breeze helium` first. +# Run `stow -d kde -t "$HOME" theme` from the repo root first. set -euo pipefail here="$(cd "$(dirname "$0")" && pwd)" data="${XDG_DATA_HOME:-$HOME/.local/share}" if [ ! -e "$data/color-schemes/DarwinBreezeDark.colors" ]; then - echo "DarwinBreezeDark.colors is not installed; run 'stow darwin-breeze' in ~/.dotfiles" >&2 + echo 'DarwinBreezeDark.colors is not installed; run: stow -d kde -t "$HOME" theme' >&2 exit 1 fi diff --git a/darwin-breeze/build.py b/kde/theme/build.py similarity index 93% rename from darwin-breeze/build.py rename to kde/theme/build.py index fd0a5a0..32323c1 100755 --- a/darwin-breeze/build.py +++ b/kde/theme/build.py @@ -4,8 +4,7 @@ .local/share/color-schemes/DarwinBreezeDark.colors is the only place colors are defined. This script derives from it: - .local/share/helium-themes/darwinbreeze/manifest.json - .config/ghostty/themes/DarwinBreezeDark + ../helium/.local/share/helium-themes/darwinbreeze/manifest.json t3/darwin-breeze.json (published to T3 Code by apply.sh) telegram/DarwinBreezeDark.tdesktop-theme (not committed; imported into Telegram by hand) vscode/ (packed into vscode/darwin-breeze.vsix, installed by apply.sh) @@ -21,25 +20,25 @@ import zipfile import zlib from pathlib import Path -PKG = Path(__file__).resolve().parent +HERE = Path(__file__).resolve().parent +PKG = HERE SCHEME = PKG / ".local/share/color-schemes/DarwinBreezeDark.colors" -HELIUM = PKG / ".local/share/helium-themes/darwinbreeze" -GHOSTTY = PKG / ".config/ghostty/themes/DarwinBreezeDark" -T3 = PKG / "t3/darwin-breeze.json" +HELIUM = PKG.parent / "helium/.local/share/helium-themes/darwinbreeze" +T3 = HERE / "t3/darwin-breeze.json" # Telegram Desktop's built-in night theme, used as the base for every key the # scheme has no role for: the colors file from telegramdesktop/tdesktop at # 837b256, Telegram/Resources/night.tdesktop-theme. -TELEGRAM_BASE = PKG / "telegram/night.tdesktop-palette" -TELEGRAM = PKG / "telegram/DarwinBreezeDark.tdesktop-theme" -VSCODE = PKG / "vscode" +TELEGRAM_BASE = HERE / "telegram/night.tdesktop-palette" +TELEGRAM = HERE / "telegram/DarwinBreezeDark.tdesktop-theme" +VSCODE = HERE / "vscode" VSCODE_THEME = "themes/DarwinBreezeDark-color-theme.json" # VS Code's default dark theme, Dark 2026 (which includes Dark Modern, Dark+ # and Visual Studio Dark), from Code - OSS 1.138 extensions/theme-defaults. # The workbench colors start from it. -VSCODE_UI = PKG / "vscode/base/2026-dark.json" +VSCODE_UI = VSCODE / "base/2026-dark.json" # Pierre Dark, the syntax theme T3 Code highlights code with (from T3 Code # 0.1.4). The editor uses its token colors as they are. -VSCODE_SYNTAX = PKG / "vscode/base/pierre-dark.json" +VSCODE_SYNTAX = VSCODE / "base/pierre-dark.json" WHITE = (255, 255, 255) @@ -125,7 +124,7 @@ def helium(color): def ansi(color): - """The 16 terminal colors, shared by Ghostty and the VS Code terminal.""" + """The 16 colors for the VS Code terminal.""" bg = color("View", "BackgroundNormal") fg = color("View", "ForegroundNormal") normal = [ @@ -146,25 +145,6 @@ def ansi(color): return normal + bright -def ghostty(color): - bg = color("View", "BackgroundNormal") - fg = color("View", "ForegroundNormal") - accent = color("Selection", "BackgroundNormal") - accent_text = color("Selection", "ForegroundNormal") - - lines = [ - f"# Generated by darwin-breeze/build.py from {SCHEME.name}", - f"background = {hexc(bg)}", - f"foreground = {hexc(fg)}", - f"cursor-color = {hexc(accent)}", - f"cursor-text = {hexc(accent_text)}", - f"selection-background = {hexc(accent)}", - f"selection-foreground = {hexc(accent_text)}", - ] - lines += [f"palette = {i}={hexc(c)}" for i, c in enumerate(ansi(color))] - return "\n".join(lines) + "\n" - - def t3(color): """Every color slot of a T3 Code theme, mapped onto a scheme role.""" window, window_text = color("Window", "BackgroundNormal"), color("Window", "ForegroundNormal") @@ -432,7 +412,7 @@ def telegram_theme(color): pinned = telegram(color) seen = set() - out = [f"// Generated by darwin-breeze/build.py from {SCHEME.name}"] + out = [f"// Generated by kde/theme/build.py from {SCHEME.name}"] for line in base.splitlines(): m = line_re.match(line) if m: @@ -565,7 +545,7 @@ def vscode_files(color): package = { "name": "darwin-breeze", "displayName": "Darwin Breeze", - "description": f"Generated by darwin-breeze/build.py from {SCHEME.name}", + "description": f"Generated by kde/theme/build.py from {SCHEME.name}", "publisher": "trivk", "version": "1.0.0", "engines": {"vscode": "^1.70.0"}, @@ -645,7 +625,7 @@ def write(path, data): if path.exists() and path.read_bytes() == data: return False path.write_bytes(data) - print(f"wrote {path.relative_to(PKG)}") + print(f"wrote {path.relative_to(PKG.parent)}") return True @@ -655,15 +635,13 @@ def main(): "manifest_version": 3, "name": "Darwin Breeze", "version": "1.0", - "description": f"Generated by darwin-breeze/build.py from {SCHEME.name}", + "description": f"Generated by kde/theme/build.py from {SCHEME.name}", "theme": {"colors": helium(color)}, } if write(HELIUM / "manifest.json", json.dumps(manifest, indent=2) + "\n"): # Helium would keep showing the old colors from its cache. (HELIUM / "Cached Theme.pak").unlink(missing_ok=True) - write(GHOSTTY, ghostty(color)) - theme = {"version": 1, "name": "Darwin Breeze", "appearance": "dark", "colors": t3(color)} write(T3, json.dumps(theme, indent=2) + "\n") diff --git a/darwin-breeze/t3/darwin-breeze.json b/kde/theme/t3/darwin-breeze.json similarity index 100% rename from darwin-breeze/t3/darwin-breeze.json rename to kde/theme/t3/darwin-breeze.json diff --git a/darwin-breeze/telegram/night.tdesktop-palette b/kde/theme/telegram/night.tdesktop-palette similarity index 100% rename from darwin-breeze/telegram/night.tdesktop-palette rename to kde/theme/telegram/night.tdesktop-palette diff --git a/darwin-breeze/vscode/base/2026-dark.json b/kde/theme/vscode/base/2026-dark.json similarity index 100% rename from darwin-breeze/vscode/base/2026-dark.json rename to kde/theme/vscode/base/2026-dark.json diff --git a/darwin-breeze/vscode/base/dark_modern.json b/kde/theme/vscode/base/dark_modern.json similarity index 100% rename from darwin-breeze/vscode/base/dark_modern.json rename to kde/theme/vscode/base/dark_modern.json diff --git a/darwin-breeze/vscode/base/dark_plus.json b/kde/theme/vscode/base/dark_plus.json similarity index 100% rename from darwin-breeze/vscode/base/dark_plus.json rename to kde/theme/vscode/base/dark_plus.json diff --git a/darwin-breeze/vscode/base/dark_vs.json b/kde/theme/vscode/base/dark_vs.json similarity index 100% rename from darwin-breeze/vscode/base/dark_vs.json rename to kde/theme/vscode/base/dark_vs.json diff --git a/darwin-breeze/vscode/base/pierre-dark.json b/kde/theme/vscode/base/pierre-dark.json similarity index 100% rename from darwin-breeze/vscode/base/pierre-dark.json rename to kde/theme/vscode/base/pierre-dark.json diff --git a/darwin-breeze/vscode/package.json b/kde/theme/vscode/package.json similarity index 81% rename from darwin-breeze/vscode/package.json rename to kde/theme/vscode/package.json index 5e89112..b70414e 100644 --- a/darwin-breeze/vscode/package.json +++ b/kde/theme/vscode/package.json @@ -1,7 +1,7 @@ { "name": "darwin-breeze", "displayName": "Darwin Breeze", - "description": "Generated by darwin-breeze/build.py from DarwinBreezeDark.colors", + "description": "Generated by kde/theme/build.py from DarwinBreezeDark.colors", "publisher": "trivk", "version": "1.0.0", "engines": { diff --git a/darwin-breeze/vscode/themes/DarwinBreezeDark-color-theme.json b/kde/theme/vscode/themes/DarwinBreezeDark-color-theme.json similarity index 100% rename from darwin-breeze/vscode/themes/DarwinBreezeDark-color-theme.json rename to kde/theme/vscode/themes/DarwinBreezeDark-color-theme.json diff --git a/tray-icons/.local/share/icons/hicolor/scalable/status/qbittorrent-tray-mono.svg b/kde/tray-icons/.local/share/icons/hicolor/scalable/status/qbittorrent-tray-mono.svg similarity index 100% rename from tray-icons/.local/share/icons/hicolor/scalable/status/qbittorrent-tray-mono.svg rename to kde/tray-icons/.local/share/icons/hicolor/scalable/status/qbittorrent-tray-mono.svg diff --git a/tray-icons/.local/share/ngosen-breeze-icons/apply.sh b/kde/tray-icons/.local/share/ngosen-breeze-icons/apply.sh similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/apply.sh rename to kde/tray-icons/.local/share/ngosen-breeze-icons/apply.sh diff --git a/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-default-black.svg b/kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-default-black.svg similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-default-black.svg rename to kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-default-black.svg diff --git a/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-default.svg b/kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-default.svg similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-default.svg rename to kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-default.svg diff --git a/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-emoji-default-black.svg b/kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-emoji-default-black.svg similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-emoji-default-black.svg rename to kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-emoji-default-black.svg diff --git a/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-emoji-default.svg b/kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-emoji-default.svg similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-emoji-default.svg rename to kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-emoji-default.svg diff --git a/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-off-default-black.svg b/kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-off-default-black.svg similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-off-default-black.svg rename to kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-off-default-black.svg diff --git a/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-off-default.svg b/kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-off-default.svg similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-off-default.svg rename to kde/tray-icons/.local/share/ngosen-breeze-icons/icons/fcitx-ngosen-off-default.svg diff --git a/tray-icons/.local/share/ngosen-breeze-icons/install.sh b/kde/tray-icons/.local/share/ngosen-breeze-icons/install.sh similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/install.sh rename to kde/tray-icons/.local/share/ngosen-breeze-icons/install.sh diff --git a/tray-icons/.local/share/ngosen-breeze-icons/ngosen-breeze-icons.hook b/kde/tray-icons/.local/share/ngosen-breeze-icons/ngosen-breeze-icons.hook similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/ngosen-breeze-icons.hook rename to kde/tray-icons/.local/share/ngosen-breeze-icons/ngosen-breeze-icons.hook diff --git a/tray-icons/.local/share/ngosen-breeze-icons/restart-fcitx5.sh b/kde/tray-icons/.local/share/ngosen-breeze-icons/restart-fcitx5.sh similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/restart-fcitx5.sh rename to kde/tray-icons/.local/share/ngosen-breeze-icons/restart-fcitx5.sh diff --git a/tray-icons/.local/share/ngosen-breeze-icons/restore.sh b/kde/tray-icons/.local/share/ngosen-breeze-icons/restore.sh similarity index 100% rename from tray-icons/.local/share/ngosen-breeze-icons/restore.sh rename to kde/tray-icons/.local/share/ngosen-breeze-icons/restore.sh diff --git a/tray-icons/README.md b/kde/tray-icons/README.md similarity index 98% rename from tray-icons/README.md rename to kde/tray-icons/README.md index df31529..14137e0 100644 --- a/tray-icons/README.md +++ b/kde/tray-icons/README.md @@ -1,7 +1,7 @@ # Tray icons that match Breeze ```sh -stow tray-icons +stow -d kde -t "$HOME" tray-icons ``` Some icons need one more step after stowing; see below. diff --git a/mac/README.md b/mac/README.md new file mode 100644 index 0000000..9f34023 --- /dev/null +++ b/mac/README.md @@ -0,0 +1,21 @@ +# macOS packages + +From the repository root, install all macOS packages: + +```sh +(cd mac && stow -t "$HOME" */) +``` + +Or choose individual packages: + +```sh +stow -d mac -t "$HOME" ghostty +stow -d mac -t "$HOME" fastfetch +``` + +- `ghostty`: JetBrainsMono Nerd Font and Ghostty's bundled SpaceGray Eighties theme. +- `fastfetch`: the original configuration, with a `kitty-direct` image logo. + Its source PNG is included in `fastfetch/.config/fastfetch/`. + +These packages are independent. Choose either `mac/fastfetch` or +`kde/fastfetch`; both own `~/.config/fastfetch/`. diff --git a/mac/fastfetch/.config/fastfetch/albedo.png b/mac/fastfetch/.config/fastfetch/albedo.png new file mode 100644 index 0000000..95a4d84 Binary files /dev/null and b/mac/fastfetch/.config/fastfetch/albedo.png differ diff --git a/fastfetch/.config/fastfetch/config.jsonc b/mac/fastfetch/.config/fastfetch/config.jsonc similarity index 100% rename from fastfetch/.config/fastfetch/config.jsonc rename to mac/fastfetch/.config/fastfetch/config.jsonc diff --git a/ghostty/.config/ghostty/config b/mac/ghostty/.config/ghostty/config similarity index 67% rename from ghostty/.config/ghostty/config rename to mac/ghostty/.config/ghostty/config index 9501208..fcbbeb4 100644 --- a/ghostty/.config/ghostty/config +++ b/mac/ghostty/.config/ghostty/config @@ -1,3 +1,3 @@ font-family = "JetBrainsMono Nerd Font" -theme = DarwinBreezeDark +theme = "SpaceGray Eighties" cursor-style = bar diff --git a/zsh/.config/zsh/config/alias.zsh b/zsh/.config/zsh/config/alias.zsh deleted file mode 100644 index 68a960e..0000000 --- a/zsh/.config/zsh/config/alias.zsh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env zsh - -# Modern alternatives to traditional commands -alias cat='bat' -alias ls='lsd -A' -alias la='lsd -lA' -alias tree='lsd --tree' -alias nano='micro' -alias fetch='fastfetch' -alias claudex='ANTHROPIC_BASE_URL="$(pass tk_ai/cc_url)" \ -ANTHROPIC_AUTH_TOKEN="$(pass tk_ai/api_key)" \ -ANTHROPIC_DEFAULT_OPUS_MODEL=gpt-5.6-sol \ -ANTHROPIC_DEFAULT_SONNET_MODEL=gpt-5.6-terra \ -ANTHROPIC_DEFAULT_HAIKU_MODEL=gpt-5.6-luna \ -CLAUDE_CODE_DISABLE_1M_CONTEXT=1 \ -CLAUDE_CODE_SUBAGENT_MODEL=gpt-5.6-sol \ -CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1 \ -CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY=3 \ -ENABLE_TOOL_SEARCH=false \ -claude --model gpt-5.6-sol' - -# Global alias -alias \-g -- --help="--help | bat -plhelp" - -docker() { - if command -v podman >/dev/null 2>&1; then - podman "$@" - else - command docker "$@" - fi -}