diff --git a/apply.sh b/apply.sh
index 9c1fe1c..44e5c2d 100755
--- a/apply.sh
+++ b/apply.sh
@@ -1,4 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
-stow -t ~ zsh tmux nvim hypr waybar alacritty
+stow -t ~ bash zsh tmux nvim hypr waybar alacritty rider-palette walker
diff --git a/bash/.bashrc b/bash/.bashrc
new file mode 100644
index 0000000..84994df
--- /dev/null
+++ b/bash/.bashrc
@@ -0,0 +1,118 @@
+# ~/.bashrc: executed by bash(1) for non-login shells.
+# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
+# for examples
+
+# If not running interactively, don't do anything
+case $- in
+ *i*) ;;
+ *) return;;
+esac
+
+# don't put duplicate lines or lines starting with space in the history.
+# See bash(1) for more options
+HISTCONTROL=ignoreboth
+
+# append to the history file, don't overwrite it
+shopt -s histappend
+
+# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
+HISTSIZE=1000
+HISTFILESIZE=2000
+
+# check the window size after each command and, if necessary,
+# update the values of LINES and COLUMNS.
+shopt -s checkwinsize
+
+# If set, the pattern "**" used in a pathname expansion context will
+# match all files and zero or more directories and subdirectories.
+#shopt -s globstar
+
+# make less more friendly for non-text input files, see lesspipe(1)
+#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
+
+# set variable identifying the chroot you work in (used in the prompt below)
+if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
+ debian_chroot=$(cat /etc/debian_chroot)
+fi
+
+# set a fancy prompt (non-color, unless we know we "want" color)
+case "$TERM" in
+ xterm-color|*-256color) color_prompt=yes;;
+esac
+
+# uncomment for a colored prompt, if the terminal has the capability; turned
+# off by default to not distract the user: the focus in a terminal window
+# should be on the output of commands, not on the prompt
+#force_color_prompt=yes
+
+if [ -n "$force_color_prompt" ]; then
+ if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
+ # We have color support; assume it's compliant with Ecma-48
+ # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
+ # a case would tend to support setf rather than setaf.)
+ color_prompt=yes
+ else
+ color_prompt=
+ fi
+fi
+
+if [ "$color_prompt" = yes ]; then
+ PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+else
+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+fi
+unset color_prompt force_color_prompt
+
+# If this is an xterm set the title to user@host:dir
+case "$TERM" in
+xterm*|rxvt*)
+ PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
+ ;;
+*)
+ ;;
+esac
+
+# enable color support of ls and also add handy aliases
+if [ -x /usr/bin/dircolors ]; then
+ test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
+ alias ls='ls --color=auto'
+ #alias dir='dir --color=auto'
+ #alias vdir='vdir --color=auto'
+
+ #alias grep='grep --color=auto'
+ #alias fgrep='fgrep --color=auto'
+ #alias egrep='egrep --color=auto'
+fi
+
+# colored GCC warnings and errors
+#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
+
+# some more ls aliases
+#alias ll='ls -l'
+#alias la='ls -A'
+#alias l='ls -CF'
+
+# Alias definitions.
+# You may want to put all your additions into a separate file like
+# ~/.bash_aliases, instead of adding them here directly.
+# See /usr/share/doc/bash-doc/examples in the bash-doc package.
+
+if [ -f ~/.bash_aliases ]; then
+ . ~/.bash_aliases
+fi
+
+# enable programmable completion features (you don't need to enable
+# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
+# sources /etc/bash.bashrc).
+if ! shopt -oq posix; then
+ if [ -f /usr/share/bash-completion/bash_completion ]; then
+ . /usr/share/bash-completion/bash_completion
+ elif [ -f /etc/bash_completion ]; then
+ . /etc/bash_completion
+ fi
+fi
+
+# Shared Rider palette prompt
+if [ -r ~/.config/rider-palette/bash-prompt.sh ]; then
+ . ~/.config/rider-palette/bash-prompt.sh
+fi
diff --git a/hypr/.config/hypr/hyprland.conf b/hypr/.config/hypr/hyprland.conf
index 2a48114..f3639c9 100644
--- a/hypr/.config/hypr/hyprland.conf
+++ b/hypr/.config/hypr/hyprland.conf
@@ -17,6 +17,7 @@
# 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
+source = ~/.config/rider-palette/palette.hyprland.conf
################
@@ -36,7 +37,7 @@ monitor=DP-3,1920x1080@60, 3440x1200,1
$terminal = alacritty
$fileManager = thunar
$navigator = firefox
-$menu = wofi --show drun
+$menu = walker
#################
@@ -49,6 +50,7 @@ $menu = wofi --show drun
# exec-once = $terminal
# exec-once = nm-applet &
exec-once = waybar & hyprpaper & mako & hypridle
+exec-once = walker --gapplication-service
#############################
@@ -78,8 +80,8 @@ general {
border_size = 1
# https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
- col.active_border = rgba(33ccffff)
- col.inactive_border = rgba(595959ff)
+ col.active_border = $func
+ col.inactive_border = $border
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
@@ -192,6 +194,7 @@ bind = $mainMod, E, exec, $fileManager bind = $mainMod, N, exec, $navigator
bind = $mainMod, V, togglefloating
bind = $mainMod, F, fullscreen
bind = $mainMod, R, exec, $menu
+bind = $mainMod ALT, SPACE, exec, $menu
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, S, togglesplit, # dwindle
bind = $mainMod, Q, exec, hyprlock
diff --git a/hypr/.config/hypr/hyprlock.conf b/hypr/.config/hypr/hyprlock.conf
index ce9c0af..829f321 100644
--- a/hypr/.config/hypr/hyprlock.conf
+++ b/hypr/.config/hypr/hyprlock.conf
@@ -1,7 +1,7 @@
-source = $HOME/.config/hypr/mocha.conf
+source = ~/.config/rider-palette/palette.hyprland.conf
-$accent = $mauve
-$accentAlpha = $mauveAlpha
+$accent = $func
+$accentAlpha = $funcAlpha
$font = JetBrainsMono Nerd Font
# GENERAL
@@ -14,14 +14,14 @@ background {
monitor =
path = $HOME/.config/hypr/hyprlock-background.png
blur_passes = 0
- color = $base
+ color = $bg
}
# LAYOUT
label {
monitor =
text = Layout: $LAYOUT
- color = $text
+ color = $fg_bright
font_size = 25
font_family = $font
position = 30, -30
@@ -33,7 +33,7 @@ label {
label {
monitor =
text = $TIME
- color = $text
+ color = $fg_bright
font_size = 90
font_family = $font
position = -30, 0
@@ -45,7 +45,7 @@ label {
label {
monitor =
text = cmd[update:43200000] date +"%A, %d %B %Y"
- color = $text
+ color = $fg_bright
font_size = 25
font_family = $font
position = -30, -150
@@ -57,7 +57,7 @@ label {
{
monitor = "";
text = "$FPRINTPROMPT";
- color = "$text";
+ color = "$fg_bright";
font_size = 14;
font_family = font;
position = "0, -107";
@@ -85,15 +85,15 @@ input-field {
dots_spacing = 0.2
dots_center = true
outer_color = $accent
- inner_color = $surface0
- font_color = $text
+ inner_color = $cursor_line
+ font_color = $fg_bright
fade_on_empty = false
- placeholder_text = Logged in as $USER
+ placeholder_text = Logged in as $USER
hide_input = false
check_color = $accent
- fail_color = $red
+ fail_color = $error
fail_text = $FAIL ($ATTEMPTS)
- capslock_color = $yellow
+ capslock_color = $string
position = 0, -47
halign = center
valign = center
diff --git a/nvim/.config/nvim/init.lua b/nvim/.config/nvim/init.lua
index 85368fb..87f9240 100644
--- a/nvim/.config/nvim/init.lua
+++ b/nvim/.config/nvim/init.lua
@@ -172,6 +172,12 @@ vim.o.scrolloff = 10
-- See `:help 'confirm'`
vim.o.confirm = true
+-- Folding via treesitter
+vim.o.foldmethod = 'expr'
+vim.o.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
+vim.o.foldlevel = 99
+vim.o.foldlevelstart = 99
+
-- [[ Basic Keymaps ]]
-- See `:help vim.keymap.set()`
@@ -216,6 +222,18 @@ vim.keymap.set('n', '', '', { desc = 'Move focus to the upper win
-- [[ Basic Autocommands ]]
-- See `:help lua-guide-autocommands`
+vim.opt.autoread = true
+vim.opt.updatetime = 200
+
+vim.api.nvim_create_autocmd({ 'FocusGained', 'BufEnter', 'CursorHold', 'CursorHoldI' }, {
+ command = 'checktime',
+})
+
+vim.api.nvim_create_autocmd('FileChangedShellPost', {
+ callback = function()
+ vim.notify 'File changed on disk. Buffer reloaded.'
+ end,
+})
-- Highlight when yanking (copying) text
-- Try it with `yap` in normal mode
@@ -491,7 +509,15 @@ require('lazy').setup({
-- Automatically install LSPs and related tools to stdpath for Neovim
-- Mason must be loaded before its dependents so we need to set it up here.
-- NOTE: `opts = {}` is the same as calling `require('mason').setup({})`
- { 'mason-org/mason.nvim', opts = {} },
+ {
+ 'mason-org/mason.nvim',
+ opts = {
+ registries = {
+ 'github:mason-org/mason-registry',
+ 'github:Crashdummyy/mason-registry',
+ },
+ },
+ },
'mason-org/mason-lspconfig.nvim',
'WhoIsSethDaniel/mason-tool-installer.nvim',
@@ -895,8 +921,12 @@ require('lazy').setup({
'folke/tokyonight.nvim',
priority = 1000, -- Make sure to load this before all the other start plugins.
config = function()
+ local rider_black = require 'custom.rider_black'
+
---@diagnostic disable-next-line: missing-fields
require('tokyonight').setup {
+ on_colors = rider_black.on_colors,
+ on_highlights = rider_black.on_highlights,
styles = {
comments = { italic = false }, -- Disable italics in comments
},
@@ -955,7 +985,7 @@ require('lazy').setup({
main = 'nvim-treesitter', -- Current releases expose `setup()` from the top-level module
-- [[ Configure Treesitter ]] See `:help nvim-treesitter`
opts = {
- ensure_installed = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' },
+ ensure_installed = { 'bash', 'c', 'c_sharp', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' },
-- Autoinstall languages that are not installed
auto_install = true,
highlight = {
@@ -991,6 +1021,12 @@ require('lazy').setup({
require 'kickstart.plugins.neo-tree',
require 'kickstart.plugins.gitsigns', -- adds gitsigns recommend keymaps
+ { -- C# / .NET LSP via Roslyn
+ 'seblyng/roslyn.nvim',
+ ft = 'cs',
+ opts = {},
+ },
+
-- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua`
-- This is the easiest way to modularize your config.
--
diff --git a/nvim/.config/nvim/lua/custom/rider_black.lua b/nvim/.config/nvim/lua/custom/rider_black.lua
new file mode 100644
index 0000000..9663197
--- /dev/null
+++ b/nvim/.config/nvim/lua/custom/rider_black.lua
@@ -0,0 +1,278 @@
+local M = {}
+
+local fallback_palette = {
+ bg = '#262626',
+ gutter = '#282828',
+ cursor_line = '#202424',
+ selection = '#08335E',
+ border = '#404040',
+ fg = '#BDBDBD',
+ fg_bright = '#F0F0F0',
+ fg_gutter = '#808080',
+ comment = '#85C46C',
+ keyword = '#6C95EB',
+ type = '#C191FF',
+ type_alt = '#E1BFFF',
+ func = '#39CC9B',
+ field = '#66C3CC',
+ string = '#C9A26D',
+ number = '#ED94C0',
+ escape = '#D688D4',
+ error = '#FF5647',
+}
+
+local function load_palette()
+ local palette_file = vim.fn.expand '~/.config/rider-palette/palette.json'
+ if vim.fn.filereadable(palette_file) == 0 then
+ return fallback_palette
+ end
+
+ local ok, data = pcall(vim.json.decode, table.concat(vim.fn.readfile(palette_file), '\n'))
+ if not ok or type(data) ~= 'table' or type(data.colors) ~= 'table' then
+ return fallback_palette
+ end
+
+ return vim.tbl_extend('force', fallback_palette, data.colors)
+end
+
+local palette = load_palette()
+
+M.palette = palette
+
+function M.on_colors(colors)
+ colors.bg = palette.bg
+ colors.bg_dark = palette.gutter
+ colors.bg_float = palette.bg
+ colors.bg_popup = palette.bg
+ colors.bg_sidebar = palette.gutter
+ colors.bg_statusline = palette.gutter
+ colors.bg_highlight = palette.cursor_line
+ colors.bg_search = palette.selection
+ colors.bg_visual = palette.selection
+ colors.border = palette.border
+ colors.fg = palette.fg
+ colors.fg_dark = palette.fg_gutter
+ colors.fg_float = palette.fg
+ colors.fg_gutter = palette.fg_gutter
+ colors.comment = palette.comment
+ colors.blue = palette.keyword
+ colors.cyan = palette.field
+ colors.green = palette.func
+ colors.magenta = palette.type
+ colors.orange = palette.string
+ colors.purple = palette.type
+ colors.red = palette.error
+ colors.teal = palette.func
+ colors.yellow = palette.string
+ colors.terminal_black = palette.gutter
+end
+
+local function set_many(hl, groups, spec)
+ for _, group in ipairs(groups) do
+ hl[group] = spec
+ end
+end
+
+function M.on_highlights(hl)
+ set_many(hl, {
+ 'Normal',
+ 'NormalNC',
+ 'SignColumn',
+ 'FoldColumn',
+ }, { fg = palette.fg, bg = palette.bg })
+
+ hl.EndOfBuffer = { fg = palette.bg, bg = palette.bg }
+ hl.NormalFloat = { fg = palette.fg, bg = palette.bg }
+ hl.FloatBorder = { fg = palette.border, bg = palette.bg }
+ hl.CursorLine = { bg = palette.cursor_line }
+ hl.CursorLineNr = { fg = palette.fg_bright, bg = palette.cursor_line, bold = true }
+ hl.LineNr = { fg = palette.fg_gutter, bg = palette.gutter }
+ hl.Folded = { fg = palette.fg_gutter, bg = palette.bg }
+ hl.FoldColumn = { fg = palette.fg_gutter, bg = palette.bg }
+ hl.ColorColumn = { bg = palette.cursor_line }
+ hl.Visual = { bg = palette.selection }
+ hl.Search = { bg = palette.selection, fg = palette.fg_bright }
+ hl.IncSearch = { bg = palette.keyword, fg = palette.bg }
+ hl.Pmenu = { fg = palette.fg, bg = palette.bg }
+ hl.PmenuSel = { fg = palette.fg_bright, bg = palette.cursor_line }
+ hl.WinSeparator = { fg = palette.border }
+
+ set_many(hl, {
+ 'Comment',
+ '@comment',
+ '@comment.documentation',
+ '@comment.todo',
+ '@comment.note',
+ '@comment.warning',
+ }, { fg = palette.comment, italic = false })
+
+ set_many(hl, {
+ 'Keyword',
+ 'Conditional',
+ 'Repeat',
+ 'Exception',
+ 'Include',
+ 'PreProc',
+ '@keyword',
+ '@keyword.function',
+ '@keyword.return',
+ '@keyword.repeat',
+ '@keyword.conditional',
+ '@keyword.exception',
+ '@keyword.import',
+ '@keyword.directive',
+ '@keyword.operator',
+ '@conditional',
+ '@repeat',
+ '@exception',
+ '@include',
+ '@module',
+ '@namespace',
+ }, { fg = palette.keyword })
+
+ set_many(hl, {
+ 'Type',
+ 'StorageClass',
+ 'Structure',
+ 'Typedef',
+ '@type',
+ '@type.builtin',
+ '@type.definition',
+ '@type.qualifier',
+ '@module',
+ '@namespace',
+ '@attribute',
+ '@tag.attribute',
+ '@lsp.type.type',
+ '@lsp.type.class',
+ '@lsp.type.interface',
+ '@lsp.type.namespace',
+ '@lsp.type.typeParameter',
+ }, { fg = palette.type })
+
+ set_many(hl, {
+ '@constructor',
+ '@lsp.type.enum',
+ '@lsp.type.struct',
+ }, { fg = palette.type_alt })
+
+ set_many(hl, {
+ 'Function',
+ '@function',
+ '@function.call',
+ '@function.method',
+ '@function.method.call',
+ '@method',
+ '@constructor.lua',
+ '@lsp.type.function',
+ '@lsp.type.method',
+ }, { fg = palette.func })
+
+ set_many(hl, {
+ 'Identifier',
+ '@variable',
+ '@variable.member',
+ '@lsp.type.variable',
+ }, { fg = palette.fg_bright })
+
+ set_many(hl, {
+ 'Constant',
+ '@constant',
+ '@field',
+ '@property',
+ '@lsp.type.property',
+ '@lsp.type.enumMember',
+ }, { fg = palette.field })
+
+ set_many(hl, {
+ 'String',
+ 'Character',
+ '@string',
+ '@string.documentation',
+ '@string.regex',
+ '@string.special.url',
+ '@lsp.type.string',
+ }, { fg = palette.string })
+
+ set_many(hl, {
+ 'SpecialChar',
+ '@string.escape',
+ '@string.special',
+ }, { fg = palette.escape })
+
+ set_many(hl, {
+ 'Number',
+ 'Float',
+ '@number',
+ '@number.float',
+ '@lsp.type.number',
+ }, { fg = palette.number })
+
+ set_many(hl, {
+ 'Boolean',
+ '@boolean',
+ '@constant.builtin.boolean',
+ }, { fg = palette.keyword })
+
+ set_many(hl, {
+ '@parameter',
+ '@lsp.type.parameter',
+ }, { fg = palette.fg_bright })
+
+ set_many(hl, {
+ '@variable.builtin',
+ '@constant.builtin',
+ '@function.builtin',
+ }, { fg = palette.fg_bright })
+
+ set_many(hl, {
+ '@lsp.typemod.function.defaultLibrary',
+ '@lsp.typemod.function.defaultLibrary.cs',
+ '@lsp.typemod.method.defaultLibrary',
+ '@lsp.typemod.method.defaultLibrary.cs',
+ '@lsp.type.extensionMethod',
+ '@lsp.type.extensionMethod.cs',
+ '@lsp.typemod.extensionMethod.defaultLibrary',
+ '@lsp.typemod.extensionMethod.defaultLibrary.cs',
+ }, { fg = palette.func })
+
+ set_many(hl, {
+ '@lsp.typemod.class.defaultLibrary',
+ '@lsp.typemod.class.defaultLibrary.cs',
+ '@lsp.typemod.interface.defaultLibrary',
+ '@lsp.typemod.interface.defaultLibrary.cs',
+ '@lsp.typemod.enum.defaultLibrary',
+ '@lsp.typemod.enum.defaultLibrary.cs',
+ '@lsp.typemod.type.defaultLibrary',
+ '@lsp.typemod.type.defaultLibrary.cs',
+ '@lsp.typemod.typeParameter.defaultLibrary',
+ '@lsp.typemod.typeParameter.defaultLibrary.cs',
+ '@lsp.typemod.namespace.defaultLibrary',
+ '@lsp.typemod.namespace.defaultLibrary.cs',
+ }, { fg = palette.type })
+
+ set_many(hl, {
+ '@lsp.typemod.struct.defaultLibrary',
+ '@lsp.typemod.struct.defaultLibrary.cs',
+ }, { fg = palette.type_alt })
+
+ set_many(hl, {
+ '@lsp.typemod.property.defaultLibrary',
+ '@lsp.typemod.property.defaultLibrary.cs',
+ '@lsp.typemod.variable.defaultLibrary',
+ '@lsp.typemod.variable.defaultLibrary.cs',
+ '@lsp.typemod.enumMember.defaultLibrary',
+ '@lsp.typemod.enumMember.defaultLibrary.cs',
+ }, { fg = palette.field })
+
+ set_many(hl, {
+ 'Operator',
+ 'Delimiter',
+ '@operator',
+ '@punctuation.delimiter',
+ '@punctuation.bracket',
+ '@punctuation.special',
+ }, { fg = palette.fg })
+end
+
+return M
diff --git a/rider-palette/.config/rider-palette/README.md b/rider-palette/.config/rider-palette/README.md
new file mode 100644
index 0000000..33625c3
--- /dev/null
+++ b/rider-palette/.config/rider-palette/README.md
@@ -0,0 +1,22 @@
+# Rider Palette Reuse
+
+`palette.json` is the single source of truth for your shared Rider palette.
+
+Regenerate all derived files with:
+
+```bash
+python3 ~/.config/rider-palette/generate.py
+```
+
+Generated outputs:
+
+- `palette.sh`: shell env vars for prompts and scripts
+- `palette.css`: CSS variables for Waybar and Wofi
+- `palette.hyprland.conf`: Hyprlang variables for Hyprland and Hyprlock
+- `palette.rasi`: Rasi variables for Rofi
+- `tmux.conf`: tmux status and pane colors
+- `bash-prompt.sh`: bash prompt using the shared palette
+- `p10k.zsh`: Powerlevel10k overrides using the shared palette
+
+This package is meant to be stowed from the dotfiles repo so that
+`~/.config/rider-palette/*` becomes available to the rest of the system.
diff --git a/rider-palette/.config/rider-palette/__pycache__/generate.cpython-313.pyc b/rider-palette/.config/rider-palette/__pycache__/generate.cpython-313.pyc
new file mode 100644
index 0000000..49e1e81
Binary files /dev/null and b/rider-palette/.config/rider-palette/__pycache__/generate.cpython-313.pyc differ
diff --git a/rider-palette/.config/rider-palette/bash-prompt.sh b/rider-palette/.config/rider-palette/bash-prompt.sh
new file mode 100644
index 0000000..faec067
--- /dev/null
+++ b/rider-palette/.config/rider-palette/bash-prompt.sh
@@ -0,0 +1,32 @@
+# Generated from palette.json by generate.py. Do not edit directly.
+# Rider-colored bash prompt using the shared palette.
+
+# shellcheck shell=bash
+
+if [ -r "$HOME/.config/rider-palette/palette.sh" ]; then
+ . "$HOME/.config/rider-palette/palette.sh"
+fi
+
+rider_fg() {
+ local hex="${1#\#}"
+ printf '\[\033[38;2;%d;%d;%dm\]' "$((16#${hex:0:2}))" "$((16#${hex:2:2}))" "$((16#${hex:4:2}))"
+}
+
+RIDER_RESET='\[\033[0m\]'
+
+__rider_git_branch() {
+ command -v git >/dev/null 2>&1 || return 0
+ git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0
+
+ local branch
+ branch="$(git symbolic-ref --quiet --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null)" || return 0
+ [ -n "$branch" ] || return 0
+
+ printf ' %sgit:%s%s' "$(rider_fg "$RIDER_FUNC")" "$branch" "$RIDER_RESET"
+}
+
+__rider_set_bash_prompt() {
+ PS1="${debian_chroot:+($debian_chroot)}$(rider_fg "$RIDER_FG_BRIGHT")\u@\h${RIDER_RESET}$(rider_fg "$RIDER_BORDER"):$(rider_fg "$RIDER_KEYWORD")\w${RIDER_RESET}$(__rider_git_branch)$(rider_fg "$RIDER_BORDER") \$ ${RIDER_RESET}"
+}
+
+PROMPT_COMMAND=__rider_set_bash_prompt
diff --git a/rider-palette/.config/rider-palette/generate.py b/rider-palette/.config/rider-palette/generate.py
new file mode 100644
index 0000000..6fbf056
--- /dev/null
+++ b/rider-palette/.config/rider-palette/generate.py
@@ -0,0 +1,239 @@
+#!/usr/bin/env python3
+
+from __future__ import annotations
+
+import json
+from pathlib import Path
+from textwrap import dedent
+
+
+ROOT = Path(__file__).resolve().parent
+PALETTE_FILE = ROOT / "palette.json"
+
+
+def load_palette() -> dict[str, str]:
+ data = json.loads(PALETTE_FILE.read_text())
+ return data["colors"]
+
+
+def hex_no_hash(value: str) -> str:
+ return value.lstrip("#")
+
+
+def camel_from_snake(name: str) -> str:
+ head, *tail = name.split("_")
+ return head + "".join(part.capitalize() for part in tail)
+
+
+def write(path: Path, content: str) -> None:
+ path.write_text(content.rstrip() + "\n")
+
+
+def render_palette_sh(colors: dict[str, str]) -> str:
+ lines = [
+ "# Generated from palette.json by generate.py. Do not edit directly.",
+ "",
+ ]
+ for name, value in colors.items():
+ lines.append(f'export RIDER_{name.upper()}="{value}"')
+ return "\n".join(lines)
+
+
+def render_palette_css(colors: dict[str, str]) -> str:
+ lines = [
+ "/* Generated from palette.json by generate.py. Do not edit directly. */",
+ ":root {",
+ ]
+ for name, value in colors.items():
+ lines.append(f" --rider-{name.replace('_', '-')}: {value};")
+ lines.append("}")
+ lines.append("")
+ for name, value in colors.items():
+ lines.append(f"@define-color rider-{name.replace('_', '-')} {value};")
+ return "\n".join(lines)
+
+
+def render_palette_hypr(colors: dict[str, str]) -> str:
+ lines = [
+ "# Generated from palette.json by generate.py. Do not edit directly.",
+ "# Usage:",
+ "# source = ~/.config/rider-palette/palette.hyprland.conf",
+ "",
+ ]
+ for name, value in colors.items():
+ lines.append(f"${name} = rgb({hex_no_hash(value)})")
+ lines.append(f"${camel_from_snake(name)}Alpha = {hex_no_hash(value)}")
+ return "\n".join(lines)
+
+
+def render_palette_rasi(colors: dict[str, str]) -> str:
+ lines = [
+ "/* Generated from palette.json by generate.py. Do not edit directly. */",
+ "* {",
+ ]
+ for name, value in colors.items():
+ lines.append(f" rider-{name.replace('_', '-')}: {value};")
+ lines.append("}")
+ return "\n".join(lines)
+
+
+def render_tmux_conf(colors: dict[str, str]) -> str:
+ return dedent(
+ f"""
+ # Generated from palette.json by generate.py. Do not edit directly.
+ # Source this near the end of ~/.tmux.conf, after plugin/theme setup.
+
+ set -g status-style "bg={colors['bg']},fg={colors['fg_bright']}"
+ set -g status-left-style "bg={colors['bg']},fg={colors['fg_bright']}"
+ set -g status-right-style "bg={colors['bg']},fg={colors['fg_bright']}"
+
+ set -g message-style "bg={colors['cursor_line']},fg={colors['fg_bright']}"
+ set -g message-command-style "bg={colors['cursor_line']},fg={colors['fg_bright']}"
+ set -g mode-style "bg={colors['selection']},fg={colors['fg_bright']}"
+
+ set -g pane-border-style "fg={colors['border']}"
+ set -g pane-active-border-style "fg={colors['keyword']}"
+ set -g clock-mode-colour "{colors['keyword']}"
+
+ set -g window-status-style "bg={colors['bg']},fg={colors['fg_gutter']}"
+ set -g window-status-current-style "bg={colors['cursor_line']},fg={colors['fg_bright']}"
+ set -g window-status-current-format "#[fg={colors['func']},bg={colors['cursor_line']},bold] #I #W "
+ set -g window-status-format "#[fg={colors['fg_gutter']},bg={colors['bg']}] #I #W "
+ """
+ ).strip()
+
+
+def render_bash_prompt() -> str:
+ return dedent(
+ """
+ # Generated from palette.json by generate.py. Do not edit directly.
+ # Rider-colored bash prompt using the shared palette.
+
+ # shellcheck shell=bash
+
+ if [ -r "$HOME/.config/rider-palette/palette.sh" ]; then
+ . "$HOME/.config/rider-palette/palette.sh"
+ fi
+
+ rider_fg() {
+ local hex="${1#\\#}"
+ printf '\\[\\033[38;2;%d;%d;%dm\\]' "$((16#${hex:0:2}))" "$((16#${hex:2:2}))" "$((16#${hex:4:2}))"
+ }
+
+ RIDER_RESET='\\[\\033[0m\\]'
+
+ __rider_git_branch() {
+ command -v git >/dev/null 2>&1 || return 0
+ git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0
+
+ local branch
+ branch="$(git symbolic-ref --quiet --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null)" || return 0
+ [ -n "$branch" ] || return 0
+
+ printf ' %sgit:%s%s' "$(rider_fg "$RIDER_FUNC")" "$branch" "$RIDER_RESET"
+ }
+
+ __rider_set_bash_prompt() {
+ PS1="${debian_chroot:+($debian_chroot)}$(rider_fg "$RIDER_FG_BRIGHT")\\u@\\h${RIDER_RESET}$(rider_fg "$RIDER_BORDER"):$(rider_fg "$RIDER_KEYWORD")\\w${RIDER_RESET}$(__rider_git_branch)$(rider_fg "$RIDER_BORDER") \\\\$ ${RIDER_RESET}"
+ }
+
+ PROMPT_COMMAND=__rider_set_bash_prompt
+ """
+ ).strip()
+
+
+def render_p10k_zsh() -> str:
+ return dedent(
+ """
+ # Generated from palette.json by generate.py. Do not edit directly.
+ # Rider-colored Powerlevel10k overrides using the shared palette.
+
+ [[ -r "$HOME/.config/rider-palette/palette.sh" ]] && source "$HOME/.config/rider-palette/palette.sh"
+
+ typeset -g POWERLEVEL9K_BACKGROUND="$RIDER_BG"
+
+ typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="%F{$RIDER_BORDER}╭─%f"
+ typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX="%F{$RIDER_BORDER}├─%f"
+ typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="%F{$RIDER_BORDER}╰─%f"
+ typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX="%F{$RIDER_BORDER}─╮%f"
+ typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX="%F{$RIDER_BORDER}─┤%f"
+ typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX="%F{$RIDER_BORDER}─╯%f"
+
+ typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR="%F{$RIDER_BORDER}\\uE0B1%f"
+ typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR="%F{$RIDER_BORDER}\\uE0B3%f"
+
+ typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND="$RIDER_FG_BRIGHT"
+
+ typeset -g POWERLEVEL9K_DIR_FOREGROUND="$RIDER_KEYWORD"
+ typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND="$RIDER_TYPE"
+ typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND="$RIDER_FUNC"
+
+ typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR="$RIDER_FUNC"
+ typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR="$RIDER_BORDER"
+ typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND="$RIDER_FUNC"
+ typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND="$RIDER_FIELD"
+ typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND="$RIDER_NUMBER"
+
+ typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND="$RIDER_FUNC"
+ typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND="$RIDER_FUNC"
+ typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND="$RIDER_ERROR"
+ typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND="$RIDER_ERROR"
+ typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND="$RIDER_ERROR"
+
+ typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND="$RIDER_STRING"
+ typeset -g POWERLEVEL9K_TIME_FOREGROUND="$RIDER_FIELD"
+ typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND="$RIDER_TYPE"
+ typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND="$RIDER_FG_BRIGHT"
+ """
+ ).strip()
+
+
+def render_readme() -> str:
+ return dedent(
+ """
+ # Rider Palette Reuse
+
+ `palette.json` is the single source of truth for your shared Rider palette.
+
+ Regenerate all derived files with:
+
+ ```bash
+ python3 ~/.config/rider-palette/generate.py
+ ```
+
+ Generated outputs:
+
+ - `palette.sh`: shell env vars for prompts and scripts
+ - `palette.css`: CSS variables for Waybar and Wofi
+ - `palette.hyprland.conf`: Hyprlang variables for Hyprland and Hyprlock
+ - `palette.rasi`: Rasi variables for Rofi
+ - `tmux.conf`: tmux status and pane colors
+ - `bash-prompt.sh`: bash prompt using the shared palette
+ - `p10k.zsh`: Powerlevel10k overrides using the shared palette
+
+ This package is meant to be stowed from the dotfiles repo so that
+ `~/.config/rider-palette/*` becomes available to the rest of the system.
+ """
+ ).strip()
+
+
+def main() -> None:
+ colors = load_palette()
+
+ outputs = {
+ ROOT / "palette.sh": render_palette_sh(colors),
+ ROOT / "palette.css": render_palette_css(colors),
+ ROOT / "palette.hyprland.conf": render_palette_hypr(colors),
+ ROOT / "palette.rasi": render_palette_rasi(colors),
+ ROOT / "tmux.conf": render_tmux_conf(colors),
+ ROOT / "bash-prompt.sh": render_bash_prompt(),
+ ROOT / "p10k.zsh": render_p10k_zsh(),
+ ROOT / "README.md": render_readme(),
+ }
+
+ for path, content in outputs.items():
+ write(path, content)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/rider-palette/.config/rider-palette/p10k.zsh b/rider-palette/.config/rider-palette/p10k.zsh
new file mode 100644
index 0000000..8bf02d0
--- /dev/null
+++ b/rider-palette/.config/rider-palette/p10k.zsh
@@ -0,0 +1,39 @@
+# Generated from palette.json by generate.py. Do not edit directly.
+# Rider-colored Powerlevel10k overrides using the shared palette.
+
+[[ -r "$HOME/.config/rider-palette/palette.sh" ]] && source "$HOME/.config/rider-palette/palette.sh"
+
+typeset -g POWERLEVEL9K_BACKGROUND="$RIDER_BG"
+
+typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="%F{$RIDER_BORDER}╭─%f"
+typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX="%F{$RIDER_BORDER}├─%f"
+typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="%F{$RIDER_BORDER}╰─%f"
+typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX="%F{$RIDER_BORDER}─╮%f"
+typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX="%F{$RIDER_BORDER}─┤%f"
+typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX="%F{$RIDER_BORDER}─╯%f"
+
+typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR="%F{$RIDER_BORDER}\uE0B1%f"
+typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR="%F{$RIDER_BORDER}\uE0B3%f"
+
+typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND="$RIDER_FG_BRIGHT"
+
+typeset -g POWERLEVEL9K_DIR_FOREGROUND="$RIDER_KEYWORD"
+typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND="$RIDER_TYPE"
+typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND="$RIDER_FUNC"
+
+typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR="$RIDER_FUNC"
+typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR="$RIDER_BORDER"
+typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND="$RIDER_FUNC"
+typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND="$RIDER_FIELD"
+typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND="$RIDER_NUMBER"
+
+typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND="$RIDER_FUNC"
+typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND="$RIDER_FUNC"
+typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND="$RIDER_ERROR"
+typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND="$RIDER_ERROR"
+typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND="$RIDER_ERROR"
+
+typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND="$RIDER_STRING"
+typeset -g POWERLEVEL9K_TIME_FOREGROUND="$RIDER_FIELD"
+typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND="$RIDER_TYPE"
+typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND="$RIDER_FG_BRIGHT"
diff --git a/rider-palette/.config/rider-palette/palette.css b/rider-palette/.config/rider-palette/palette.css
new file mode 100644
index 0000000..1bcc5c0
--- /dev/null
+++ b/rider-palette/.config/rider-palette/palette.css
@@ -0,0 +1,40 @@
+/* Generated from palette.json by generate.py. Do not edit directly. */
+:root {
+ --rider-bg: #262626;
+ --rider-gutter: #282828;
+ --rider-cursor-line: #202424;
+ --rider-selection: #08335E;
+ --rider-border: #404040;
+ --rider-fg: #BDBDBD;
+ --rider-fg-bright: #F0F0F0;
+ --rider-fg-gutter: #808080;
+ --rider-comment: #85C46C;
+ --rider-keyword: #6C95EB;
+ --rider-type: #C191FF;
+ --rider-type-alt: #E1BFFF;
+ --rider-func: #39CC9B;
+ --rider-field: #66C3CC;
+ --rider-string: #C9A26D;
+ --rider-number: #ED94C0;
+ --rider-escape: #D688D4;
+ --rider-error: #FF5647;
+}
+
+@define-color rider-bg #262626;
+@define-color rider-gutter #282828;
+@define-color rider-cursor-line #202424;
+@define-color rider-selection #08335E;
+@define-color rider-border #404040;
+@define-color rider-fg #BDBDBD;
+@define-color rider-fg-bright #F0F0F0;
+@define-color rider-fg-gutter #808080;
+@define-color rider-comment #85C46C;
+@define-color rider-keyword #6C95EB;
+@define-color rider-type #C191FF;
+@define-color rider-type-alt #E1BFFF;
+@define-color rider-func #39CC9B;
+@define-color rider-field #66C3CC;
+@define-color rider-string #C9A26D;
+@define-color rider-number #ED94C0;
+@define-color rider-escape #D688D4;
+@define-color rider-error #FF5647;
diff --git a/rider-palette/.config/rider-palette/palette.hyprland.conf b/rider-palette/.config/rider-palette/palette.hyprland.conf
new file mode 100644
index 0000000..0ffe34e
--- /dev/null
+++ b/rider-palette/.config/rider-palette/palette.hyprland.conf
@@ -0,0 +1,40 @@
+# Generated from palette.json by generate.py. Do not edit directly.
+# Usage:
+# source = ~/.config/rider-palette/palette.hyprland.conf
+
+$bg = rgb(262626)
+$bgAlpha = 262626
+$gutter = rgb(282828)
+$gutterAlpha = 282828
+$cursor_line = rgb(202424)
+$cursorLineAlpha = 202424
+$selection = rgb(08335E)
+$selectionAlpha = 08335E
+$border = rgb(404040)
+$borderAlpha = 404040
+$fg = rgb(BDBDBD)
+$fgAlpha = BDBDBD
+$fg_bright = rgb(F0F0F0)
+$fgBrightAlpha = F0F0F0
+$fg_gutter = rgb(808080)
+$fgGutterAlpha = 808080
+$comment = rgb(85C46C)
+$commentAlpha = 85C46C
+$keyword = rgb(6C95EB)
+$keywordAlpha = 6C95EB
+$type = rgb(C191FF)
+$typeAlpha = C191FF
+$type_alt = rgb(E1BFFF)
+$typeAltAlpha = E1BFFF
+$func = rgb(39CC9B)
+$funcAlpha = 39CC9B
+$field = rgb(66C3CC)
+$fieldAlpha = 66C3CC
+$string = rgb(C9A26D)
+$stringAlpha = C9A26D
+$number = rgb(ED94C0)
+$numberAlpha = ED94C0
+$escape = rgb(D688D4)
+$escapeAlpha = D688D4
+$error = rgb(FF5647)
+$errorAlpha = FF5647
diff --git a/rider-palette/.config/rider-palette/palette.json b/rider-palette/.config/rider-palette/palette.json
new file mode 100644
index 0000000..a206ced
--- /dev/null
+++ b/rider-palette/.config/rider-palette/palette.json
@@ -0,0 +1,23 @@
+{
+ "name": "rider-black",
+ "colors": {
+ "bg": "#262626",
+ "gutter": "#282828",
+ "cursor_line": "#202424",
+ "selection": "#08335E",
+ "border": "#404040",
+ "fg": "#BDBDBD",
+ "fg_bright": "#F0F0F0",
+ "fg_gutter": "#808080",
+ "comment": "#85C46C",
+ "keyword": "#6C95EB",
+ "type": "#C191FF",
+ "type_alt": "#E1BFFF",
+ "func": "#39CC9B",
+ "field": "#66C3CC",
+ "string": "#C9A26D",
+ "number": "#ED94C0",
+ "escape": "#D688D4",
+ "error": "#FF5647"
+ }
+}
diff --git a/rider-palette/.config/rider-palette/palette.rasi b/rider-palette/.config/rider-palette/palette.rasi
new file mode 100644
index 0000000..78e6b14
--- /dev/null
+++ b/rider-palette/.config/rider-palette/palette.rasi
@@ -0,0 +1,21 @@
+/* Generated from palette.json by generate.py. Do not edit directly. */
+* {
+ rider-bg: #262626;
+ rider-gutter: #282828;
+ rider-cursor-line: #202424;
+ rider-selection: #08335E;
+ rider-border: #404040;
+ rider-fg: #BDBDBD;
+ rider-fg-bright: #F0F0F0;
+ rider-fg-gutter: #808080;
+ rider-comment: #85C46C;
+ rider-keyword: #6C95EB;
+ rider-type: #C191FF;
+ rider-type-alt: #E1BFFF;
+ rider-func: #39CC9B;
+ rider-field: #66C3CC;
+ rider-string: #C9A26D;
+ rider-number: #ED94C0;
+ rider-escape: #D688D4;
+ rider-error: #FF5647;
+}
diff --git a/rider-palette/.config/rider-palette/palette.sh b/rider-palette/.config/rider-palette/palette.sh
new file mode 100644
index 0000000..5a4a310
--- /dev/null
+++ b/rider-palette/.config/rider-palette/palette.sh
@@ -0,0 +1,20 @@
+# Generated from palette.json by generate.py. Do not edit directly.
+
+export RIDER_BG="#262626"
+export RIDER_GUTTER="#282828"
+export RIDER_CURSOR_LINE="#202424"
+export RIDER_SELECTION="#08335E"
+export RIDER_BORDER="#404040"
+export RIDER_FG="#BDBDBD"
+export RIDER_FG_BRIGHT="#F0F0F0"
+export RIDER_FG_GUTTER="#808080"
+export RIDER_COMMENT="#85C46C"
+export RIDER_KEYWORD="#6C95EB"
+export RIDER_TYPE="#C191FF"
+export RIDER_TYPE_ALT="#E1BFFF"
+export RIDER_FUNC="#39CC9B"
+export RIDER_FIELD="#66C3CC"
+export RIDER_STRING="#C9A26D"
+export RIDER_NUMBER="#ED94C0"
+export RIDER_ESCAPE="#D688D4"
+export RIDER_ERROR="#FF5647"
diff --git a/rider-palette/.config/rider-palette/tmux.conf b/rider-palette/.config/rider-palette/tmux.conf
new file mode 100644
index 0000000..8bdedb0
--- /dev/null
+++ b/rider-palette/.config/rider-palette/tmux.conf
@@ -0,0 +1,19 @@
+# Generated from palette.json by generate.py. Do not edit directly.
+# Source this near the end of ~/.tmux.conf, after plugin/theme setup.
+
+set -g status-style "bg=#262626,fg=#F0F0F0"
+set -g status-left-style "bg=#262626,fg=#F0F0F0"
+set -g status-right-style "bg=#262626,fg=#F0F0F0"
+
+set -g message-style "bg=#202424,fg=#F0F0F0"
+set -g message-command-style "bg=#202424,fg=#F0F0F0"
+set -g mode-style "bg=#08335E,fg=#F0F0F0"
+
+set -g pane-border-style "fg=#404040"
+set -g pane-active-border-style "fg=#6C95EB"
+set -g clock-mode-colour "#6C95EB"
+
+set -g window-status-style "bg=#262626,fg=#808080"
+set -g window-status-current-style "bg=#202424,fg=#F0F0F0"
+set -g window-status-current-format "#[fg=#39CC9B,bg=#202424,bold] #I #W "
+set -g window-status-format "#[fg=#808080,bg=#262626] #I #W "
diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf
index 0287acb..ebe8f1f 100644
--- a/tmux/.tmux.conf
+++ b/tmux/.tmux.conf
@@ -18,6 +18,13 @@ bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R
+# Split panes in the same directory
+bind '"' split-window -v -c "#{pane_current_path}"
+bind % split-window -h -c "#{pane_current_path}"
+
+# New window in same directory
+bind c new-window -c "#{pane_current_path}"
+
# list of plugins
set -g @plugin 'tmux-plugins/tpm'
# set -g @plugin '2kabhishek/tmux2k'
@@ -38,3 +45,6 @@ set -g @catppuccin_window_current_text "#W"
# initialize TMUX plugin manager
run '~/.tmux/plugins/tpm/tpm'
+
+# Shared Rider palette overrides
+source-file ~/.config/rider-palette/tmux.conf
diff --git a/walker/.config/walker/config.toml b/walker/.config/walker/config.toml
new file mode 100644
index 0000000..13d2c7b
--- /dev/null
+++ b/walker/.config/walker/config.toml
@@ -0,0 +1,68 @@
+force_keyboard_focus = true
+close_when_open = true
+click_to_close = true
+single_click_activation = true
+selection_wrap = true
+resume_last_query = true
+hide_quick_activation = true
+hide_action_hints = true
+hide_action_hints_dmenu = true
+hide_return_action = true
+theme = "rider-omarchy"
+
+[shell]
+exclusive_zone = -1
+layer = "overlay"
+anchor_top = true
+anchor_bottom = true
+anchor_left = true
+anchor_right = true
+
+[placeholders]
+"default" = { input = "Search apps, files, commands", list = "No matches" }
+
+[keybinds]
+close = ["Escape"]
+next = ["Down", "ctrl j"]
+previous = ["Up", "ctrl k"]
+left = ["Left"]
+right = ["Right"]
+down = ["Down"]
+up = ["Up"]
+toggle_exact = ["ctrl e"]
+show_actions = ["alt Return"]
+page_down = ["Page_Down"]
+page_up = ["Page_Up"]
+
+[providers]
+default = ["desktopapplications", "calc", "websearch"]
+empty = ["desktopapplications"]
+max_results = 12
+
+[[providers.prefixes]]
+prefix = ";"
+provider = "providerlist"
+
+[[providers.prefixes]]
+prefix = ">"
+provider = "runner"
+
+[[providers.prefixes]]
+prefix = "/"
+provider = "files"
+
+[[providers.prefixes]]
+prefix = "="
+provider = "calc"
+
+[[providers.prefixes]]
+prefix = "$"
+provider = "windows"
+
+[[providers.prefixes]]
+prefix = ":"
+provider = "clipboard"
+
+[[providers.prefixes]]
+prefix = "@"
+provider = "websearch"
diff --git a/walker/.config/walker/themes/rider-omarchy/style.css b/walker/.config/walker/themes/rider-omarchy/style.css
new file mode 100644
index 0000000..ecbec06
--- /dev/null
+++ b/walker/.config/walker/themes/rider-omarchy/style.css
@@ -0,0 +1,99 @@
+@import url("../../../rider-palette/palette.css");
+
+* {
+ all: unset;
+ font-family: "JetBrainsMono Nerd Font", "JetBrains Mono", monospace;
+ font-size: 16px;
+ color: @rider-fg-bright;
+}
+
+window,
+#window,
+.background {
+ background: transparent;
+}
+
+box,
+listview,
+scrolledwindow {
+ background: transparent;
+}
+
+entry,
+#input,
+searchentry {
+ background: rgba(32, 36, 36, 0.96);
+ color: @rider-fg-bright;
+ border: 1px solid rgba(108, 149, 235, 0.35);
+ border-radius: 18px;
+ padding: 16px 18px;
+ margin: 0 0 16px 0;
+ min-height: 30px;
+ caret-color: @rider-func;
+}
+
+entry selection,
+#input selection,
+searchentry selection {
+ background: @rider-selection;
+ color: @rider-fg-bright;
+}
+
+listview,
+#list,
+.list {
+ background: rgba(38, 38, 38, 0.94);
+ border: 1px solid rgba(64, 64, 64, 0.95);
+ border-radius: 24px;
+ padding: 12px;
+}
+
+child,
+.item,
+row {
+ background: transparent;
+ border-radius: 18px;
+ padding: 10px 12px;
+ margin: 4px 0;
+}
+
+child:selected,
+child:focus,
+child:hover,
+.item:selected,
+.item:hover,
+row:selected,
+row:hover {
+ background: rgba(8, 51, 94, 0.92);
+}
+
+label,
+.label,
+#label {
+ color: @rider-fg-bright;
+}
+
+#sub,
+.sub,
+.dim-label,
+.description {
+ color: @rider-fg-gutter;
+}
+
+#icon {
+ color: @rider-func;
+ margin-right: 14px;
+}
+
+#activationlabel,
+.activationlabel,
+.quick-activation {
+ color: @rider-string;
+ font-weight: 700;
+}
+
+#typeahead,
+#placeholder,
+.placeholder {
+ color: @rider-fg-gutter;
+}
diff --git a/waybar/.config/waybar/config.jsonc b/waybar/.config/waybar/config.jsonc
index 7f3ff18..79e59fa 100644
--- a/waybar/.config/waybar/config.jsonc
+++ b/waybar/.config/waybar/config.jsonc
@@ -1,80 +1,57 @@
-// --// waybar config generated by wbarconfgen.sh //-- //
{
"layer": "top",
"position": "top",
"mod": "dock",
- "margin-left": 0,
- "margin-right": 0,
- "margin-top": 0,
+ "margin-left": 10,
+ "margin-right": 10,
+ "margin-top": 10,
"margin-bottom": 0,
"exclusive": true,
"passthrough": false,
"gtk-layer-shell": true,
"reload_style_on_change": true,
"modules-left": [
- "hyprland/workspaces"
+ "custom/launcher",
+ "hyprland/workspaces",
+ "hyprland/window"
],
"modules-center": [
- "group/center"
+ "clock"
],
"modules-right": [
- "group/right"
+ "network",
+ "bluetooth",
+ "pulseaudio",
+ "cpu",
+ "memory",
+ "tray",
+ "custom/power"
],
- "custom/flexspace": {
- "format": "",
- "tooltip": false,
- "expand": true
+ "custom/launcher": {
+ "format": "",
+ "tooltip": true,
+ "tooltip-format": "Open Walker",
+ "on-click": "walker",
+ "on-click-right": "thunar"
},
"memory": {
- "interval": 1,
- "rotate": 270,
- "format": "{icon}",
- "format-icons": [
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- ""
- ]
+ "interval": 5,
+ "format": " {}%"
},
"cpu": {
- "interval": 1,
- "format": "{icon}",
- "rotate": 270,
- "format-icons": [
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- ""
- ]
+ "interval": 5,
+ "format": " {usage}%"
},
"tray": {
"icon-size": 18,
"spacing": 6,
"rotate": 0
},
- "group/system": {
- "orientation": "horizontal",
- "modules": [
- "memory",
- "cpu",
- "pulseaudio"
- ]
- },
"custom/power": {
- "format": "⏻",
+ "format": "",
"tooltip": false,
"menu": "on-click",
- "menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder
+ "menu-file": "$HOME/.config/waybar/power_menu.xml",
"menu-actions": {
"shutdown": "systemctl poweroff",
"reboot": "systemctl reboot",
@@ -84,28 +61,39 @@
"lock": "hyprlock"
}
},
- "group/center": {
- "orientation": "horizontal",
- "modules": [
- "clock"
- ]
- },
- "group/right": {
- "orientation": "horizontal",
- "modules": [
- "tray",
- "group/system",
- "custom/power"
- ]
- },
"hyprland/workspaces": {
"all-outputs": false,
- "format": "{name}"
+ "sort-by-number": true,
+ "format": "{icon}",
+ "format-icons": {
+ "1": "",
+ "2": "",
+ "3": "",
+ "4": "",
+ "5": "",
+ "6": "",
+ "7": "",
+ "8": "",
+ "9": "",
+ "10": "",
+ "urgent": "",
+ "active": "",
+ "default": "",
+ "empty": ""
+ }
+ },
+ "hyprland/window": {
+ "separate-outputs": true,
+ "icon": true,
+ "max-length": 56,
+ "rewrite": {
+ "": "Desktop"
+ }
},
"clock": {
- "format": "{:%R %a %d %b}",
+ "format": " {:%a %d %b} {:%H:%M}",
"rotate": 0,
- "on-click": "/usr/local/bin/ags -t ActivityCenter",
+ "on-click": "walker",
"tooltip-format": "{calendar}",
"calendar": {
"mode": "year",
@@ -114,10 +102,10 @@
"on-scroll": 1,
"on-click-right": "mode",
"format": {
- "months": "{}",
- "weeks": "{}",
- "weekdays": "{}",
- "today": "{}"
+ "months": "{}",
+ "weeks": "{}",
+ "weekdays": "{}",
+ "today": "{}"
}
},
"actions": {
@@ -129,18 +117,45 @@
}
},
"pulseaudio": {
- "format": "{icon}",
- "format-muted": "",
+ "format": "{icon} {volume}%",
+ "format-muted": " muted",
"format-icons": {
"default": [
- "",
- ""
- ]
+ "",
+ "",
+ ""
+ ],
+ "headphone": "",
+ "hands-free": "",
+ "headset": "",
+ "phone": "",
+ "portable": "",
+ "car": ""
},
"scroll-step": 5,
- "on-click": "pavucontrol", // Open PulseAudio control GUI
- "on-click-right": "pamixer -t", // Toggle mute
- "on-scroll-up": "pamixer -i 5", // Increase volume
- "on-scroll-down": "pamixer -d 5" // Decrease volume
+ "on-click": "pavucontrol",
+ "on-click-right": "pamixer -t",
+ "on-scroll-up": "pamixer -i 5",
+ "on-scroll-down": "pamixer -d 5"
+ },
+ "network": {
+ "interval": 5,
+ "format-wifi": " {signalStrength}%",
+ "format-ethernet": " ethernet",
+ "format-linked": " linked",
+ "format-disconnected": " offline",
+ "tooltip-format-wifi": "{essid} ({signalStrength}%)",
+ "tooltip-format-ethernet": "{ifname}",
+ "tooltip-format-disconnected": "Disconnected",
+ "on-click": "nm-connection-editor"
+ },
+ "bluetooth": {
+ "format": " {status}",
+ "format-disabled": " off",
+ "format-off": " off",
+ "format-no-controller": " n/a",
+ "format-on": " on",
+ "format-connected": " on",
+ "tooltip-format": "{controller_alias}\t{controller_address}"
}
}
diff --git a/waybar/.config/waybar/style.css b/waybar/.config/waybar/style.css
index 9d9ce12..cdc6f4c 100644
--- a/waybar/.config/waybar/style.css
+++ b/waybar/.config/waybar/style.css
@@ -1,56 +1,153 @@
-@define-color foreground #d8dee9;
-@define-color background #1a1b26;
+@import url("../rider-palette/palette.css");
+
+@define-color foreground @rider-fg-bright;
+@define-color foreground-muted @rider-fg-gutter;
+@define-color background @rider-bg;
+@define-color background-alt @rider-cursor-line;
+@define-color accent @rider-func;
+@define-color accent-alt @rider-keyword;
+@define-color accent-soft @rider-field;
+@define-color type @rider-type;
+@define-color warning @rider-string;
+@define-color danger @rider-error;
* {
- background-color: @background;
color: @foreground;
font-family: 'JetBrainsMono Nerd Font Mono';
- font-size: 20px;
+ font-size: 15px;
+ min-height: 0;
}
-.modules-left {
- margin-left: 8px;
+window#waybar {
+ background: transparent;
+ color: @foreground;
}
-.modules-right {}
+tooltip {
+ background: @background;
+ border: 1px solid @accent-alt;
+ border-radius: 12px;
+}
+
+.modules-left,
+.modules-center,
+.modules-right {
+ margin: 0;
+}
+
+#custom-launcher,
+#workspaces,
+#window,
+#clock,
+#network,
+#bluetooth,
+#pulseaudio,
+#cpu,
+#memory,
+#tray,
+#custom-power {
+ background: @background;
+ border: 1px solid alpha(@accent-alt, 0.22);
+ border-radius: 14px;
+ margin: 0 5px;
+ padding: 0 12px;
+ min-height: 34px;
+}
+
+#custom-launcher {
+ background: @accent;
+ border-color: @accent;
+ color: @background;
+ font-size: 18px;
+ padding: 0 14px 0 12px;
+}
+
+#workspaces {
+ padding: 0 6px;
+}
#workspaces button {
all: initial;
- padding: 0 6px;
- margin: 0 1.5px;
- min-width: 9px;
- opacity: 0.5;
+ min-width: 18px;
+ padding: 0 8px;
+ margin: 5px 2px;
+ border-radius: 10px;
+ color: @foreground-muted;
+ opacity: 0.9;
}
#workspaces button.empty {
- opacity: 0.25;
+ color: @foreground-muted;
+ opacity: 0.45;
}
#workspaces button.visible {
- opacity: 0.8;
+ color: @accent-alt;
+ background: alpha(@accent-alt, 0.12);
}
#workspaces button.active {
- opacity: 1.0;
+ color: @background;
+ background: @accent;
+ opacity: 1;
+}
+
+#window {
+ color: @foreground-muted;
+ padding-right: 16px;
+}
+
+#clock {
+ border-color: alpha(@accent, 0.35);
+ color: @foreground;
+ font-weight: 700;
+ padding: 0 18px;
+}
+
+#network {
+ color: @accent-soft;
+}
+
+#bluetooth {
+ color: @type;
+}
+
+#pulseaudio {
+ color: @accent;
}
#cpu,
-#memory,
-#battery,
-#pulseaudio,
-#custom-omarchy,
-#custom-screenrecording-indicator,
-#custom-update,
-#tray,
-#bluetooth,
-#network,
-#custom-power,
-#custom-expand-icon {
- min-width: 24px;
- font-size: 20px;
- margin: 0px 2px;
+#memory {
+ color: @warning;
}
+#tray {
+ padding: 0 14px;
+}
+
+#custom-power {
+ color: @danger;
+ padding: 0 13px;
+}
+
+#custom-launcher:hover,
+#workspaces button:hover,
+#network:hover,
+#bluetooth:hover,
+#pulseaudio:hover,
+#cpu:hover,
+#memory:hover,
+#tray:hover,
+#custom-power:hover,
+#clock:hover {
+ box-shadow: none;
+ background: @background-alt;
+}
+
+#custom-launcher:hover,
+#workspaces button.active:hover {
+ background: @accent;
+}
.hidden {
opacity: 0;
diff --git a/zsh/.zshrc b/zsh/.zshrc
index f030d9b..4efcc05 100644
--- a/zsh/.zshrc
+++ b/zsh/.zshrc
@@ -118,4 +118,5 @@ source $ZSH/oh-my-zsh.sh
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
-export PATH="$HOME/.local/bin:$PATH"
+[[ -r ~/.config/rider-palette/p10k.zsh ]] && source ~/.config/rider-palette/p10k.zsh
+export PATH="$HOME/.dotnet/tools:$HOME/.local/bin:$PATH"