Merge branch 'master' of github.com:ksyasuda/dotfiles

This commit is contained in:
2026-01-16 18:17:30 -08:00
29 changed files with 1463 additions and 354 deletions

View File

@@ -4,7 +4,7 @@ font-size = 12
font-feature = +calt
font-feature = +liga
font-feature = +dlig
theme = catppuccin-macchiato
theme = Catppuccin Macchiato
cursor-style = block
window-padding-x = 10
window-padding-y = 10
@@ -14,7 +14,12 @@ window-width = 180
confirm-close-surface = false
copy-on-select = clipboard
app-notifications = no-clipboard-copy
shell-integration = zsh
shell-integration-features = title,sudo,ssh-env,ssh-terminfo
desktop-notifications = true
term=ghostty
keybind = all:ctrl+enter=unbind
keybind = all:ctrl+shift+j=next_tab
keybind = all:ctrl+shift+k=last_tab
keybind = all:ctrl+grave_accent=toggle_quick_terminal
keybind = shift+enter=text:\x1b\r

View File

@@ -18,3 +18,6 @@ keybind = all:ctrl+enter=unbind
keybind = all:ctrl+grave_accent=toggle_quick_terminal
shell-integration = zsh
keybind = shift+enter=text:\x1b\r
shell-integration-features = title,sudo,ssh-env,ssh-terminfo
desktop-notifications = true
term=ghostty

View File

@@ -54,7 +54,7 @@ xwayland {
# See https://wiki.hyprland.org/Configuring/Keywords/
# Set programs that you use
$terminal = uwsm app -- ghostty
$terminal = uwsm app -- ghostty +new-window
$fileManager = uwsm app -- thunar
$menu = rofi -show drun -run-command "uwsm app -- {cmd}"
# $notification_daemon = dunst

View File

@@ -93,8 +93,12 @@ bindl = , XF86AudioPrev, exec, mpc prev
# rofi
bind = $mainMod SHIFT, v, exec, uwsm app -sb -- rofi-rbw
bind = $mainMod, w, exec, rofi -show window -theme $HOME/.config/rofi/launchers/type-2/style-2.rasi -dpi 96 -theme-str 'window {width: 35%;}'
bind = $mainMod SHIFT, w, exec, $HOME/.config/rofi/scripts/rofi-wallpaper.sh
bind = $mainMod SHIFT, d, exec, $HOME/.config/rofi/scripts/rofi-docs.sh
bind = $mainMod SHIFT, w, exec, "$HOME/.config/rofi/scripts/rofi-wallpaper.sh"
bind = $mainMod SHIFT, d, exec, "$HOME/.config/rofi/scripts/rofi-docs.sh"
bind = SUPER, j, exec, "$HOME/.config/rofi/scripts/rofi-jellyfin-dir.sh"
bind = SUPER, t, exec, "$HOME/.config/rofi/scripts/rofi-launch-texthooker-steam.sh"
bind = $mainMod SHIFT, t, exec, "$HOME/projects/scripts/popup-ai-translator.py"
bind = SUPER SHIFT, g, exec, "$HOME/.config/rofi/scripts/rofi-vn-helper.sh"
# ncmcppp
bind = $mainMod, n, exec, uwsm app -sb -- ghostty --command=/usr/bin/ncmpcpp
@@ -139,3 +143,7 @@ bind = $mainMod, code:112, submap, reset
submap = reset
bind = SUPER, l, exec, hyprlock
# ANKI
bind = $mainMod, a, exec, ~/.config/rofi/scripts/rofi-anki-script.sh
bind = $mainMod SHIFT, a, exec, ~/projects/scripts/screenshot-anki.sh -cdMinecraft

155
.config/mimeapps.list Normal file
View File

@@ -0,0 +1,155 @@
[Added Associations]
application/epub+zip=calibre-ebook-viewer.desktop;calibre-ebook-edit.desktop;opencomic.desktop;
application/json=notepadqq.desktop;
application/octet-stream=nvim.desktop;vim.desktop;emacsclient.desktop;
application/pdf=okularApplication_pdf.desktop;google-chrome.desktop;microsoft-edge-beta.desktop;org.inkscape.Inkscape.desktop;chromium.desktop;
application/rss+xml=fluent-reader.desktop;
application/sql=notepadqq.desktop;nvim.desktop;gvim.desktop;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet=libreoffice-calc.desktop;ms-office-online.desktop;
application/x-desktop=nvim.desktop;
application/x-extension-htm=google-chrome.desktop;
application/x-extension-html=google-chrome.desktop;
application/x-extension-shtml=google-chrome.desktop;
application/x-extension-xht=google-chrome.desktop;
application/x-extension-xhtml=google-chrome.desktop;
application/x-ms-dos-executable=wine.desktop;
application/x-ms-shortcut=wine.desktop;
application/x-yaml=notepadqq.desktop;nvim.desktop;
application/xhtml+xml=google-chrome.desktop;microsoft-edge-beta.desktop;qutebrowser.desktop;
application/zip=org.gnome.FileRoller.desktop;
audio/aac=mpv.desktop;
audio/mp4=mpv.desktop;
audio/mpeg=mpv.desktop;
audio/mpegurl=mpv.desktop;
audio/ogg=mpv.desktop;
audio/vnd.rn-realaudio=mpv.desktop;
audio/vorbis=mpv.desktop;
audio/x-flac=mpv.desktop;
audio/x-mp3=mpv.desktop;
audio/x-mpegurl=mpv.desktop;
audio/x-ms-wma=mpv.desktop;
audio/x-musepack=mpv.desktop;
audio/x-oggflac=mpv.desktop;
audio/x-pn-realaudio=mpv.desktop;
audio/x-scpls=mpv.desktop;
audio/x-vorbis=mpv.desktop;
audio/x-vorbis+ogg=mpv.desktop;
audio/x-wav=mpv.desktop;
image/avif=okularApplication_kimgio.desktop;
image/bmp=okularApplication_kimgio.desktop;
image/gif=org.gnome.gThumb.desktop;google-chrome.desktop;gimp.desktop;org.kde.gwenview.desktop;okularApplication_kimgio.desktop;
image/heif=okularApplication_kimgio.desktop;
image/jpeg=okularApplication_kimgio.desktop;
image/png=okularApplication_kimgio.desktop;org.gnome.gThumb.desktop;feh.desktop;gimp.desktop;org.kde.gwenview.desktop;
image/webp=okularApplication_kimgio.desktop;
inode/directory=thunar.desktop;
text/csv=libreoffice-calc.desktop;
text/html=google-chrome.desktop;
text/javascript=notepadqq.desktop;
text/plain=notepadqq.desktop;nvim.desktop;vim.desktop;okularApplication_txt.desktop;xed.desktop;
text/vnd.trolltech.linguist=mpv.desktop;
text/x-log=notepadqq.desktop;
video/mp4=mpv.desktop;vlc.desktop;io.github.celluloid_player.Celluloid.desktop;
video/webm=mpv.desktop;vlc.desktop;io.github.celluloid_player.Celluloid.desktop;
video/x-matroska=mpv.desktop;vlc.desktop;
x-scheme-handler/betterdiscord=discord.desktop;
x-scheme-handler/bitwarden=bitwarden.desktop;Bitwarden.desktop;
x-scheme-handler/chrome=google-chrome.desktop;
x-scheme-handler/exodus=Exodus.desktop;
x-scheme-handler/geo=google-maps-geo-handler.desktop;
x-scheme-handler/http=zen.desktop;firefox.desktop;microsoft-edge-beta.desktop;google-chrome.desktop;
x-scheme-handler/https=zen.desktop;firefox.desktop;microsoft-edge-beta.desktop;google-chrome.desktop;
x-scheme-handler/mailspring=Mailspring.desktop;
x-scheme-handler/mailto=org.mozilla.Thunderbird.desktop;Mailspring.desktop;userapp-Thunderbird-6JYZ12.desktop;
x-scheme-handler/mid=userapp-Thunderbird-6JYZ12.desktop;
x-scheme-handler/postman=Postman.desktop;
x-scheme-handler/ror2mm=r2modman.desktop;
x-scheme-handler/ssh=kitty-open.desktop;Termius.desktop;
x-scheme-handler/termius=Termius.desktop;
x-scheme-handler/tg=org.telegram.desktop.desktop;org.telegram.desktop._f79d601e26a782fd149b3ffb098aae9f.desktop;userapp-Kotatogram Desktop-IP6312.desktop;
x-scheme-handler/tonsite=org.telegram.desktop.desktop;
x-scheme-handler/tradingview=tradingview.desktop;TradingView.desktop;
application/x-wine-extension-ini=nvim.desktop;
[Default Applications]
application/x-extension-htm=google-chrome.desktop
application/x-extension-html=google-chrome.desktop
application/x-extension-shtml=google-chrome.desktop
application/x-extension-xht=google-chrome.desktop
application/x-extension-xhtml=google-chrome.desktop
audio/aac=mpv.desktop;
audio/mp4=mpv.desktop;
audio/mpeg=mpv.desktop;
audio/mpegurl=mpv.desktop;
audio/ogg=mpv.desktop;
audio/vnd.rn-realaudio=mpv.desktop;
audio/vorbis=mpv.desktop;
audio/x-flac=mpv.desktop;
audio/x-mp3=mpv.desktop;
audio/x-mpegurl=mpv.desktop;
audio/x-ms-wma=mpv.desktop;
audio/x-musepack=mpv.desktop;
audio/x-oggflac=mpv.desktop;
audio/x-pn-realaudio=mpv.desktop;
audio/x-scpls=mpv.desktop;
audio/x-vorbis=mpv.desktop;
audio/x-vorbis+ogg=mpv.desktop;
audio/x-wav=mpv.desktop;
image/avif=okularApplication_kimgio.desktop;
image/bmp=okularApplication_kimgio.desktop;
image/heif=okularApplication_kimgio.desktop;
image/jpeg=okularApplication_kimgio.desktop;
image/png=okularApplication_kimgio.desktop;
image/webp=okularApplication_kimgio.desktop;
inode/directory=Thunar.desktop
message/rfc822=userapp-Thunderbird-6JYZ12.desktop
text/plain=nvim.desktop;
x-scheme-handler/betterdiscord=discord.desktop
x-scheme-handler/bitwarden=bitwarden.desktop
x-scheme-handler/chrome=chromium.desktop
x-scheme-handler/discord-455712169795780630=discord-455712169795780630.desktop
x-scheme-handler/discord-712465656758665259=discord-712465656758665259.desktop
x-scheme-handler/eclipse+command=_usr_lib_dbeaver_.desktop
x-scheme-handler/exodus=Exodus.desktop
x-scheme-handler/geo=google-maps-geo-handler.desktop;
x-scheme-handler/http=zen.desktop;
x-scheme-handler/https=zen.desktop;
x-scheme-handler/mailspring=Mailspring.desktop
x-scheme-handler/mailto=Mailspring.desktop
x-scheme-handler/mid=userapp-Thunderbird-6JYZ12.desktop
x-scheme-handler/msteams=teams.desktop
x-scheme-handler/postman=Postman.desktop
x-scheme-handler/ror2mm=r2modman.desktop
x-scheme-handler/ssh=kitty-open.desktop
x-scheme-handler/termius=Termius.desktop
x-scheme-handler/tg=org.telegram.desktop.desktop
x-scheme-handler/tonsite=org.telegram.desktop.desktop
x-scheme-handler/tradingview=tradingview.desktop
x-scheme-handler/webcal=google-chrome.desktop
video/webm=mpv.desktop
video/x-matroska=mpv.desktop
video/x-ms-wmv=mpv.desktop
video/quicktime=mpv.desktop
video/x-flv=mpv.desktop
video/dv=mpv.desktop
video/vnd.avi=mpv.desktop
video/x-ogm+ogg=mpv.desktop
video/ogg=mpv.desktop
video/vnd.rn-realvideo=mpv.desktop
video/mp4=mpv.desktop
video/mp2t=mpv.desktop
video/x-flic=mpv.desktop
video/3gpp2=mpv.desktop
video/x-theora+ogg=mpv.desktop
video/mpeg=mpv.desktop
video/vnd.mpegurl=mpv.desktop
video/3gpp=mpv.desktop
application/json=zen.desktop
application/xhtml+xml=zen.desktop
application/x-xpinstall=zen.desktop
application/xml=zen.desktop
application/pdf=zen.desktop
text/html=zen.desktop
text/vnd.trolltech.linguist=zen.desktop
x-scheme-handler/nxm=modorganizer2-nxm-handler.desktop
x-scheme-handler/discord-1361252452329848892=discord-1361252452329848892.desktop

View File

@@ -14,6 +14,7 @@ deck_name=Minecraft
# If you don't have a model for Japanese, get it from
# https://tatsumoto.neocities.org/blog/setting-up-anki.html#import-an-example-mining-deck
model_name=Lapis
# model_name=Kiku
# Field names as they appear in the selected note type.
# If you set `audio_field` or `image_field` empty,

View File

@@ -131,7 +131,7 @@ return {
},
-- }}}
},
strategies = {
interactions = {
chat = {
adapter = "copilot",
-- adapter = "openrouter",
@@ -182,11 +182,21 @@ return {
end,
completion_provider = "cmp",
},
fold_reasoning = true,
show_reasoning = true,
},
inline = {
adapter = "copilot",
-- adapter = "openrouter",
},
cmd = {
adapter = "copilot",
},
background = {
adapter = {
name = "copilot",
},
},
},
display = {
action_palette = {
@@ -232,7 +242,6 @@ return {
-- Options for inline diff provider
inline = {
layout = "buffer", -- float|buffer - Where to display the diff
diff_signs = {
signs = {
text = "", -- Sign text for normal changes
@@ -307,6 +316,31 @@ return {
},
},
},
rules = {
default = {
description = "Collection of common files for all projects",
files = {
".clinerules",
".cursorrules",
".goosehints",
".rules",
".windsurfrules",
".github/copilot-instructions.md",
"AGENT.md",
"AGENTS.md",
{ path = "CLAUDE.md", parser = "claude" },
{ path = "CLAUDE.local.md", parser = "claude" },
{ path = "~/.claude/CLAUDE.md", parser = "claude" },
},
is_preset = true,
},
opts = {
chat = {
enabled = true,
default_rules = "default", -- The rule groups to load
},
},
},
},
init = function()
require("utils.codecompanion.fidget-spinner"):init()

View File

@@ -50,7 +50,7 @@ end
function M:create_progress_handle(request)
local title = " Requesting assistance"
.. " ("
.. request.data.strategy
.. request.data.interaction
.. ") from "
.. request.data.adapter.formatted_name
.. " using "

View File

@@ -43,10 +43,10 @@ end
function M:create_progress_handle(request)
return progress.handle.create({
title = " Requesting assistance (" .. request.data.strategy .. ")",
title = " Requesting assistance (" .. request.data.adapter.model .. ")",
message = "In progress...",
lsp_client = {
name = M:llm_role_title(request.data.adapter),
name = M:llm_role_title(request.data.adapter.name),
},
})
end

View File

@@ -0,0 +1,44 @@
{
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json",
"google_auth": true,
"agents": {
"Sisyphus": {
"model": "opencode/glm-4.7-free"
},
"librarian": {
"model": "opencode/glm-4.7-free"
},
"explore": {
"model": "google/antigravity-gemini-3-flash"
},
"frontend-ui-ux-engineer": {
"model": "google/antigravity-gemini-3-pro-high"
},
"document-writer": {
"model": "google/antigravity-gemini-3-flash"
},
"multimodal-looker": {
"model": "google/antigravity-gemini-3-flash"
}
},
"lsp": {
"typescript-language-server": {
"command": ["typescript-language-server", "--stdio"],
"extensions": [".ts", ".tsx"],
"priority": 10
},
"pylsp": {
"disabled": true
},
"pyright": {
"command": ["basedpyright-languageserver", "--stdio"],
"extensions": [".py"],
"priority": 10
},
"bash-language-server": {
"command": ["bash-language-server", "start"],
"extensions": [".sh", ".bash"],
"priority": 10
}
}
}

View File

@@ -0,0 +1,24 @@
{
"sound": false,
"notification": true,
"timeout": 5,
"showProjectName": true,
"events": {
"permission": { "sound": false, "notification": true },
"complete": { "sound": false, "notification": true },
"error": { "sound": false, "notification": true },
"question": { "sound": false, "notification": true }
},
"messages": {
"permission": "Session needs permission",
"complete": "Session has finished",
"error": "Session encountered an error",
"question": "Session has a question"
},
"sounds": {
"permission": "/path/to/custom/sound.wav",
"complete": "/path/to/custom/sound.wav",
"error": "/path/to/custom/sound.wav",
"question": "/path/to/custom/sound.wav"
}
}

View File

@@ -1,49 +0,0 @@
{
"$schema": "https://opencode.ai/config.json",
"theme": "catppuccin",
"model": "github-copilot/gpt-5.1",
"provider": {
"openai": {
"models": {
"gpt-5": {
"options": {
"reasoningEffort": "high",
"textVerbosity": "low",
"reasoningSummary": "auto",
"include": ["reasoning.encrypted_content"],
},
},
},
},
},
"agent": {
"build": {
"mode": "primary",
"model": "github-copilot/gpt-5.1",
"tools": {
"write": true,
"edit": true,
"bash": true
}
},
"plan": {
"mode": "primary",
"model": "github-copilot/gpt-5.1-codex",
"tools": {
"write": false,
"edit": false,
"bash": false
}
},
"code-reviewer": {
"description": "Reviews code for best practices and potential issues",
"mode": "subagent",
"model": "github-copilot/gpt-5.1",
"prompt": "You are a code reviewer. Focus on security, performance, and maintainability.",
"tools": {
"write": false,
"edit": false
}
}
}
}

View File

@@ -0,0 +1,225 @@
{
"$schema": "https://opencode.ai/config.json",
"plugin": [
"opencode-openai-codex-auth",
"opencode-antigravity-auth@beta",
"@mohak34/opencode-notifier@latest",
"oh-my-opencode"
],
"provider": {
"openai": {
"name": "OpenAI",
"options": {
"reasoningEffort": "medium",
"reasoningSummary": "auto",
"textVerbosity": "medium",
"include": [
"reasoning.encrypted_content"
],
"store": false
},
"models": {
"gpt-5.2": {
"name": "GPT 5.2 (OAuth)",
"limit": {
"context": 272000,
"output": 128000
},
"modalities": {
"input": [
"text",
"image"
],
"output": [
"text"
]
},
"variants": {
"none": {
"reasoningEffort": "none",
"reasoningSummary": "auto",
"textVerbosity": "medium"
},
"low": {
"reasoningEffort": "low",
"reasoningSummary": "auto",
"textVerbosity": "medium"
},
"medium": {
"reasoningEffort": "medium",
"reasoningSummary": "auto",
"textVerbosity": "medium"
},
"high": {
"reasoningEffort": "high",
"reasoningSummary": "detailed",
"textVerbosity": "medium"
},
"xhigh": {
"reasoningEffort": "xhigh",
"reasoningSummary": "detailed",
"textVerbosity": "medium"
}
}
},
"gpt-5.2-codex": {
"name": "GPT 5.2 Codex (OAuth)",
"limit": {
"context": 272000,
"output": 128000
},
"modalities": {
"input": [
"text",
"image"
],
"output": [
"text"
]
},
"variants": {
"low": {
"reasoningEffort": "low",
"reasoningSummary": "auto",
"textVerbosity": "medium"
},
"medium": {
"reasoningEffort": "medium",
"reasoningSummary": "auto",
"textVerbosity": "medium"
},
"high": {
"reasoningEffort": "high",
"reasoningSummary": "detailed",
"textVerbosity": "medium"
},
"xhigh": {
"reasoningEffort": "xhigh",
"reasoningSummary": "detailed",
"textVerbosity": "medium"
}
}
},
"gpt-5.1-codex-max": {
"name": "GPT 5.1 Codex Max (OAuth)",
"limit": {
"context": 272000,
"output": 128000
},
"modalities": {
"input": [
"text",
"image"
],
"output": [
"text"
]
},
"variants": {
"low": {
"reasoningEffort": "low",
"reasoningSummary": "detailed",
"textVerbosity": "medium"
},
"medium": {
"reasoningEffort": "medium",
"reasoningSummary": "detailed",
"textVerbosity": "medium"
},
"high": {
"reasoningEffort": "high",
"reasoningSummary": "detailed",
"textVerbosity": "medium"
},
"xhigh": {
"reasoningEffort": "xhigh",
"reasoningSummary": "detailed",
"textVerbosity": "medium"
}
}
}
}
},
"google": {
"name": "Google",
"models": {
"antigravity-gemini-3-pro-high": {
"name": "Gemini 3 Pro High (Antigravity)",
"thinking": true,
"attachment": true,
"limit": {
"context": 1048576,
"output": 65535
},
"modalities": {
"input": [
"text",
"image",
"pdf"
],
"output": [
"text"
]
}
},
"antigravity-gemini-3-pro-low": {
"name": "Gemini 3 Pro Low (Antigravity)",
"thinking": true,
"attachment": true,
"limit": {
"context": 1048576,
"output": 65535
},
"modalities": {
"input": [
"text",
"image",
"pdf"
],
"output": [
"text"
]
}
},
"antigravity-gemini-3-flash": {
"name": "Gemini 3 Flash (Antigravity)",
"attachment": true,
"limit": {
"context": 1048576,
"output": 65536
},
"modalities": {
"input": [
"text",
"image",
"pdf"
],
"output": [
"text"
]
}
}
}
}
},
"theme": "catppuccin-macchiato",
"share": "manual",
"formatter": {
"prettier": {
"disabled": false
},
"ruff": {
"disabled": false
}
},
"instructions": [
"AGENTS.md",
"CONTRIBUTING.md",
"docs/guidelines.md",
".cursor/rules/*.md"
],
"permission": {
"edit": "ask",
"bash": "ask"
}
}

View File

@@ -35,7 +35,7 @@
"Pihole2 - https://pihole2.suda.codes/admin",
"Proxmox - https://thebox.unicorn-ilish.ts.net",
"qBittorrent - https://qbittorrent.suda.codes",
"qui - https://qui.suda.codes",
"qui - http://pve-main:7476",
"Plausible - https://plausible.sudacode.com",
"Paperless - https://paperless.suda.codes",
"Prometheus - http://prometheus:9090",

View File

@@ -0,0 +1,23 @@
#!/usr/bin/env bash
CHOICES=(
"1. Screenshot (Kiku)"
"2. Screenshot (Luna)"
"3. Record Audio"
)
CHOICE=$(printf "%s\n" "${CHOICES[@]}" | rofi -dmenu -i -theme "$HOME/.config/rofi/launchers/type-2/style-2.rasi" -theme-str 'window {width: 25%;} listview {columns: 1; lines: 5;}' -p "Select an option")
case "$CHOICE" in
"1. Screenshot (Kiku)")
PICTURE_FIELD=Picture "$HOME/projects/scripts/screenshot-anki.sh"
;;
"2. Screenshot (Luna)")
PICTURE_FIELD=screenshot "$HOME/projects/scripts/screenshot-anki.sh"
;;
"3. Record Audio")
"$HOME/projects/scripts/record-audio.sh"
;;
*)
exit 1
;;
esac

View File

@@ -1,9 +1,12 @@
#!/usr/bin/env bash
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/rofi-menu-helpers.sh"
BROWSER=/usr/bin/zen-browser
OPTIONS=(
"Arch Linux (btw)"
"Hyprland"
DOC_GROUPS=(
"Arch Linux (btw)|ARCH"
"Hyprland|HYPRLAND"
)
ARCH=(
"Archlinux Wiki|https://wiki.archlinux.org/title/Main_page"
@@ -13,56 +16,37 @@ HYPRLAND=(
"Hyprland Window Rules|https://wiki.hypr.land/Configuring/Window-Rules/"
)
get_url() {
urls=("$@")
display_urls=()
declare -A url_map
for url in "${urls[@]}"; do
display_urls+=("${url%%|*}")
label="${url%%|*}"
url_map["$label"]="${url##*|}"
done
display_urls+=("Back")
url_map["Back"]="Back"
selection="$(printf "%s\n" "${display_urls[@]}" | rofi -theme-str 'window {width: 25%;} listview {columns: 1; lines: 10;}' -theme ~/.config/rofi/launchers/type-2/style-2.rasi -dmenu -l 5 -i -p "Select Documentation")"
url="${url_map[$selection]}"
if [ -z "$url" ]; then
exit 0
fi
printf "%s\n" "$url"
select_group() {
rofi_select_label_value "Select Documentation Group" DOC_GROUPS
}
get_docs_list() {
selection="$(printf "%s\n" "${OPTIONS[@]}" | rofi -theme-str 'window {width: 25%;} listview {columns: 1; lines: 10;}' -theme ~/.config/rofi/launchers/type-2/style-2.rasi -dmenu -l 5 -i -p "Select Documentation Group")"
case "$selection" in
"Arch Linux (btw)")
urls=("${ARCH[@]}")
;;
"Hyprland")
urls=("${HYPRLAND[@]}")
;;
*)
exit 0
;;
esac
printf "%s\n" "${urls[@]}"
select_url() {
local urls_array="$1"
rofi_select_label_value "Select Documentation" "$urls_array" "Back"
}
main() {
mapfile -t urls < <(get_docs_list)
url="$(get_url "${urls[@]}")"
if [ -z "$url" ]; then
printf "No URL selected.\n"
while true; do
group_key="$(select_group)" || exit 0
case "$group_key" in
ARCH)
urls_ref=ARCH
;;
HYPRLAND)
urls_ref=HYPRLAND
;;
*)
exit 0
;;
esac
selection="$(select_url "$urls_ref")" || exit 0
if [[ "$selection" == "Back" ]]; then
continue
fi
$BROWSER "$selection" &>/dev/null &
exit 0
elif [ "$url" == "Back" ]; then
main
exit 0
fi
$BROWSER "$url" &>/dev/null &
done
}
main

View File

@@ -0,0 +1,89 @@
#!/usr/bin/env bash
set -Eeuo pipefail
BASE_DIR="/truenas/jellyfin"
. "$HOME/.config/rofi/scripts/rofi-menu-helpers.sh"
ACTION="xdg-open"
# Theme for icon display
ICON_THEME="$HOME/.config/rofi/launchers/type-3/style-4.rasi"
ICON_THEME_STR='configuration {show-icons: true; icon-size: 128; dpi: 96;} window {width: 50%; height: 60%;} listview {columns: 3; lines: 5;}'
# Map display names to actual directory names
declare -A DIR_MAP=(
["Anime"]="anime"
["Movies"]="movies"
["Manga"]="manga"
["TV"]="tv"
["YouTube"]="youtube"
["Books"]="books"
["Podcasts"]="podcasts"
["Audiobooks"]="audiobooks"
)
DIRS=(
"Anime"
"Movies"
"Manga"
"TV"
"YouTube"
"Books"
"Podcasts"
"Audiobooks"
)
# Select top-level category
CHOICE=$(rofi_select_list "Select a category" DIRS) || exit 1
# Get the actual directory name
ACTUAL_DIR="${DIR_MAP[$CHOICE]}"
TARGET_DIR="$BASE_DIR/$ACTUAL_DIR"
if [[ ! -d "$TARGET_DIR" ]]; then
notify-send -u critical "Jellyfin Browser" "Directory not found: $TARGET_DIR"
exit 1
fi
# Build rofi entries with folder.jpg icons
build_icon_menu() {
local dir="$1"
local entries=""
while IFS= read -r -d '' subdir; do
local name
name="$(basename "$subdir")"
local icon="$subdir/folder.jpg"
# Check for folder.jpg, fallback to folder.png, then no icon
if [[ -f "$icon" ]]; then
entries+="${name}\0icon\x1f${icon}\n"
elif [[ -f "$subdir/folder.png" ]]; then
entries+="${name}\0icon\x1f${subdir}/folder.png\n"
else
entries+="${name}\n"
fi
done < <(find "$dir" -mindepth 1 -maxdepth 1 -type d -print0 | sort -z)
printf "%b" "$entries"
}
# Show subdirectories with icons
SELECTION=$(build_icon_menu "$TARGET_DIR" | rofi -dmenu -i -no-custom \
-theme "$ICON_THEME" \
-theme-str "$ICON_THEME_STR" \
-p "Select from $CHOICE") || exit 1
# Full path to selected item
SELECTED_PATH="$TARGET_DIR/$SELECTION"
if [[ -d "$SELECTED_PATH" ]]; then
# Open in file manager or do something with it
# You can customize this action as needed
$ACTION "$SELECTED_PATH" &>/dev/null &
else
notify-send -u critical "Jellyfin Browser" "Path not found: $SELECTED_PATH"
exit 1
fi

View File

@@ -0,0 +1,12 @@
#!/usr/bin/env bash
PROGRAM="$HOME/S/lutris/wineprefix/drive_c/users/steamuser/luna-translator/LunaTranslator.exe"
SELECTION="$(protontricks -l | tail -n +2 | rofi -dmenu -theme ~/.config/rofi/launchers/type-2/style-2.rasi -theme-str 'listview {lines: 12; columns: 1;}' -i -p "Select game" | awk '{print $NF}' | tr -d '()')"
if [[ -z "$SELECTION" ]]; then
printf "%s\n" "No game selected"
exit 1
fi
printf "%s\n" "Launching $PROGRAM for game ID: $SELECTION"
protontricks-launch --appid "$SELECTION" "$PROGRAM" &>/dev/null &

View File

@@ -0,0 +1,68 @@
#!/usr/bin/env bash
# Lightweight helpers to build rofi menus with label/value pairs.
# Intended to be sourced from other scripts.
# Allow callers to override theme/args without touching code.
: "${ROFI_THEME:=$HOME/.config/rofi/launchers/type-2/style-2.rasi}"
: "${ROFI_THEME_STR:="window {width: 25%;} listview {columns: 1; lines: 10;}"}"
: "${ROFI_DMENU_ARGS:=-i -l 5}"
# rofi_menu prompt option...
# Prints the selected option to stdout and propagates the rofi exit code
# (1 when the user cancels).
rofi_menu() {
local prompt="$1"
shift
local -a options=("$@")
local selection
selection="$(printf "%s\n" "${options[@]}" | rofi -dmenu $ROFI_DMENU_ARGS \
${ROFI_THEME:+-theme "$ROFI_THEME"} \
${ROFI_THEME_STR:+-theme-str "$ROFI_THEME_STR"} \
-p "$prompt")"
local status=$?
[[ $status -ne 0 ]] && return "$status"
printf "%s\n" "$selection"
}
# rofi_select_label_value prompt array_name [back_label]
# array_name should contain entries shaped as "Label|Value".
# Prints the mapped value (or the back label when chosen). Returns 1 on cancel.
rofi_select_label_value() {
local prompt="$1"
local array_name="$2"
local back_label="${3:-}"
# Access caller's array by name
local -n kv_source="$array_name"
local -A kv_map=()
local -a display=()
for entry in "${kv_source[@]}"; do
local label="${entry%%|*}"
local value="${entry#*|}"
kv_map["$label"]="$value"
display+=("$label")
done
if [[ -n "$back_label" ]]; then
kv_map["$back_label"]="$back_label"
display+=("$back_label")
fi
local selection
selection="$(rofi_menu "$prompt" "${display[@]}")" || return "$?"
[[ -z "$selection" ]] && return 1
printf "%s\n" "${kv_map[$selection]}"
}
# rofi_select_list prompt array_name
# Convenience wrapper for plain lists (no label/value mapping).
rofi_select_list() {
local prompt="$1"
local array_name="$2"
local -n list_source="$array_name"
rofi_menu "$prompt" "${list_source[@]}"
}

View File

@@ -6,8 +6,6 @@ THEME="$HOME/.config/rofi/launchers/type-3/style-4.rasi"
DIR="$HOME/Pictures/wallpapers/favorites"
SELECTED_WALL=$(cd "$DIR" && for a in *.jpg *.png; do echo -en "$a\0icon\x1f$a\n"; done | rofi -dmenu -i -no-custom -theme "$THEME" -p "Select a wallpaper" -theme-str 'configuration {icon-size: 128; dpi: 96;} window {width: 45%; height: 45%;}')
PTH="$(printf "%s" "$DIR/$SELECTED_WALL" | tr -s '/')"
hyprctl hyprpaper wallpaper "DP-1, $PTH"
notify-send -a "rofi-wallpaper" "Wallpaper set to" -i "$PTH" "$PTH"
hyprctl hyprpaper preload "$PTH"
hyprctl hyprpaper wallpaper "DP-1,$PTH"
hyprctl hyprpaper unload "$(cat "$HOME/.wallpaper")"
echo "$PTH" >"$HOME/.wallpaper"

View File

@@ -15,6 +15,7 @@ export QT_QPA_PLATFORMTHEME=qt5ct
export GTK_THEME=Dracula
export XDG_CONFIG_HOME=$HOME/.config
export COMPOSE_BAKE=true
export ANKI_WAYLAND=1
# nvidia
export NVD_BACKEND=direct