mirror of
https://github.com/mr0xb/dotfiles.git
synced 2026-08-27 19:34:57 -04:00
updates
This commit is contained in:
parent
bc4d4c403a
commit
715eb53860
57 changed files with 7755 additions and 3 deletions
200
.aerospace.toml
Normal file
200
.aerospace.toml
Normal file
|
|
@ -0,0 +1,200 @@
|
||||||
|
# Place a copy of this config to ~/.aerospace.toml
|
||||||
|
# After that, you can edit ~/.aerospace.toml to your liking
|
||||||
|
|
||||||
|
# It's not necessary to copy all keys to your config.
|
||||||
|
# If the key is missing in your config, "default-config.toml" will serve as a fallback
|
||||||
|
|
||||||
|
# You can use it to add commands that run after login to macOS user session.
|
||||||
|
# 'start-at-login' needs to be 'true' for 'after-login-command' to work
|
||||||
|
# Available commands: https://nikitabobko.github.io/AeroSpace/commands
|
||||||
|
after-login-command = []
|
||||||
|
|
||||||
|
# You can use it to add commands that run after AeroSpace startup.
|
||||||
|
# 'after-startup-command' is run after 'after-login-command'
|
||||||
|
# Available commands : https://nikitabobko.github.io/AeroSpace/commands
|
||||||
|
after-startup-command = [
|
||||||
|
'exec-and-forget /opt/homebrew/bin/borders active_color=0xff906cff inactive_color=0xff494d64 width=10.0 hidpi=on',
|
||||||
|
]
|
||||||
|
|
||||||
|
# Start AeroSpace at login
|
||||||
|
start-at-login = true
|
||||||
|
|
||||||
|
# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization
|
||||||
|
enable-normalization-flatten-containers = true
|
||||||
|
enable-normalization-opposite-orientation-for-nested-containers = true
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/guide#layouts
|
||||||
|
# The 'accordion-padding' specifies the size of accordion padding
|
||||||
|
# You can set 0 to disable the padding feature
|
||||||
|
accordion-padding = 30
|
||||||
|
|
||||||
|
# Possible values: tiles|accordion
|
||||||
|
default-root-container-layout = 'tiles'
|
||||||
|
|
||||||
|
# Possible values: horizontal|vertical|auto
|
||||||
|
# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation,
|
||||||
|
# tall monitor (anything higher than wide) gets vertical orientation
|
||||||
|
default-root-container-orientation = 'auto'
|
||||||
|
|
||||||
|
# Possible values: (qwerty|dvorak)
|
||||||
|
# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping
|
||||||
|
key-mapping.preset = 'qwerty'
|
||||||
|
|
||||||
|
# Mouse follows focus when focused monitor changes
|
||||||
|
# Drop it from your config, if you don't like this behavior
|
||||||
|
# See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks
|
||||||
|
# See https://nikitabobko.github.io/AeroSpace/commands#move-mouse
|
||||||
|
on-focused-monitor-changed = ['move-mouse monitor-lazy-center']
|
||||||
|
|
||||||
|
[workspace-to-monitor-force-assignment]
|
||||||
|
1 = 'built-in'
|
||||||
|
2 = 2
|
||||||
|
3 = 3
|
||||||
|
|
||||||
|
|
||||||
|
# Gaps between windows (inner-*) and between monitor edges (outer-*).
|
||||||
|
# Possible values:
|
||||||
|
# - Constant: gaps.outer.top = 8
|
||||||
|
# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24]
|
||||||
|
# In this example, 24 is a default value when there is no match.
|
||||||
|
# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'.
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors
|
||||||
|
[gaps]
|
||||||
|
inner.horizontal = 10
|
||||||
|
inner.vertical = 10
|
||||||
|
outer.left = 10
|
||||||
|
outer.bottom = 10
|
||||||
|
outer.top = [{ monitor.built-in = 20 }, 58]
|
||||||
|
outer.right = 10
|
||||||
|
|
||||||
|
# 'main' binding mode declaration
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
|
||||||
|
# 'main' binding mode must be always presented
|
||||||
|
[mode.main.binding]
|
||||||
|
|
||||||
|
# All possible keys:
|
||||||
|
# - Letters. a, b, c, ..., z
|
||||||
|
# - Numbers. 0, 1, 2, ..., 9
|
||||||
|
# - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9
|
||||||
|
# - F-keys. f1, f2, ..., f20
|
||||||
|
# - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, backtick,
|
||||||
|
# leftSquareBracket, rightSquareBracket, space, enter, esc, backspace, tab
|
||||||
|
# - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual,
|
||||||
|
# keypadMinus, keypadMultiply, keypadPlus
|
||||||
|
# - Arrows. left, down, up, right
|
||||||
|
|
||||||
|
# All possible modifiers: cmd, alt, ctrl, shift
|
||||||
|
|
||||||
|
# All possible commands: https://nikitabobko.github.io/AeroSpace/commands
|
||||||
|
|
||||||
|
# You can uncomment this line to open up terminal with alt + enter shortcut
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget
|
||||||
|
# alt-enter = 'exec-and-forget open -n /System/Applications/Utilities/Terminal.app'
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#layout
|
||||||
|
alt-slash = 'layout tiles horizontal vertical'
|
||||||
|
alt-comma = 'layout accordion horizontal vertical'
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#focus
|
||||||
|
alt-h = 'focus left'
|
||||||
|
alt-j = 'focus down'
|
||||||
|
alt-k = 'focus up'
|
||||||
|
alt-l = 'focus right'
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#move
|
||||||
|
alt-shift-h = 'move left'
|
||||||
|
alt-shift-j = 'move down'
|
||||||
|
alt-shift-k = 'move up'
|
||||||
|
alt-shift-l = 'move right'
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#resize
|
||||||
|
alt-shift-minus = 'resize smart -50'
|
||||||
|
alt-shift-equal = 'resize smart +50'
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace
|
||||||
|
alt-1 = 'workspace 1'
|
||||||
|
alt-2 = 'workspace 2'
|
||||||
|
alt-3 = 'workspace 3'
|
||||||
|
alt-4 = 'workspace 4'
|
||||||
|
alt-5 = 'workspace 5'
|
||||||
|
alt-6 = 'workspace 6'
|
||||||
|
alt-7 = 'workspace 7'
|
||||||
|
alt-8 = 'workspace 8'
|
||||||
|
alt-9 = 'workspace 9'
|
||||||
|
# alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need
|
||||||
|
# alt-b = 'workspace B'
|
||||||
|
# alt-c = 'workspace5C'
|
||||||
|
# alt-d = 'workspace D'
|
||||||
|
# alt-e = 'workspace E'
|
||||||
|
# alt-f = 'workspace F'
|
||||||
|
# alt-g = 'workspace G'
|
||||||
|
# alt-i = 'workspace I'
|
||||||
|
# alt-m = 'workspace M'
|
||||||
|
# alt-n = 'workspace N'
|
||||||
|
# alt-o = 'workspace O'
|
||||||
|
# alt-p = 'workspace P'
|
||||||
|
# alt-q = 'workspace Q'
|
||||||
|
# alt-r = 'workspace R'
|
||||||
|
# alt-s = 'workspace S'
|
||||||
|
# alt-t = 'workspace T'
|
||||||
|
# alt-u = 'workspace U'
|
||||||
|
# alt-v = 'workspace V'
|
||||||
|
# alt-w = 'workspace W'
|
||||||
|
# alt-x = 'workspace X'
|
||||||
|
# alt-y = 'workspace Y'
|
||||||
|
# alt-z = 'workspace Z'
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
|
||||||
|
alt-shift-1 = 'move-node-to-workspace 1'
|
||||||
|
alt-shift-2 = 'move-node-to-workspace 2'
|
||||||
|
alt-shift-3 = 'move-node-to-workspace 3'
|
||||||
|
alt-shift-4 = 'move-node-to-workspace 4'
|
||||||
|
alt-shift-5 = 'move-node-to-workspace 5'
|
||||||
|
alt-shift-6 = 'move-node-to-workspace 6'
|
||||||
|
alt-shift-7 = 'move-node-to-workspace 7'
|
||||||
|
alt-shift-8 = 'move-node-to-workspace 8'
|
||||||
|
alt-shift-9 = 'move-node-to-workspace 9'
|
||||||
|
# alt-shift-a = 'move-node-to-workspace A'
|
||||||
|
# alt-shift-b = 'move-node-to-workspace B'
|
||||||
|
# alt-shift-c = 'move-node-to-workspace C'
|
||||||
|
# alt-shift-d = 'move-node-to-workspace D'
|
||||||
|
# alt-shift-e = 'move-node-to-workspace E'
|
||||||
|
# alt-shift-f = 'move-node-to-workspace F'
|
||||||
|
# alt-shift-g = 'move-node-to-workspace G'
|
||||||
|
# alt-shift-i = 'move-node-to-workspace I'
|
||||||
|
# alt-shift-m = 'move-node-to-workspace M'
|
||||||
|
# alt-shift-n = 'move-node-to-workspace N'
|
||||||
|
# alt-shift-o = 'move-node-to-workspace O'
|
||||||
|
# alt-shift-p = 'move-node-to-workspace P'
|
||||||
|
# alt-shift-q = 'move-node-to-workspace Q'
|
||||||
|
# alt-shift-r = 'move-node-to-workspace R'
|
||||||
|
# alt-shift-s = 'move-node-to-workspace S'
|
||||||
|
# alt-shift-t = 'move-node-to-workspace T'
|
||||||
|
# alt-shift-u = 'move-node-to-workspace U'
|
||||||
|
# alt-shift-v = 'move-node-to-workspace V'
|
||||||
|
# alt-shift-w = 'move-node-to-workspace W'
|
||||||
|
# alt-shift-x = 'move-node-to-workspace X'
|
||||||
|
# alt-shift-y = 'move-node-to-workspace Y'
|
||||||
|
# alt-shift-z = 'move-node-to-workspace Z'
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth
|
||||||
|
alt-tab = 'workspace-back-and-forth'
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor
|
||||||
|
alt-shift-tab = 'move-workspace-to-monitor --wrap-around next'
|
||||||
|
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/commands#mode
|
||||||
|
alt-shift-semicolon = 'mode service'
|
||||||
|
|
||||||
|
# 'service' binding mode declaration.
|
||||||
|
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
|
||||||
|
[mode.service.binding]
|
||||||
|
esc = ['reload-config', 'mode main']
|
||||||
|
r = ['flatten-workspace-tree', 'mode main'] # reset layout
|
||||||
|
#s = ['layout sticky tiling', 'mode main'] # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2
|
||||||
|
f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout
|
||||||
|
backspace = ['close-all-windows-but-current', 'mode main']
|
||||||
|
|
||||||
|
alt-shift-h = ['join-with left', 'mode main']
|
||||||
|
alt-shift-j = ['join-with down', 'mode main']
|
||||||
|
alt-shift-k = ['join-with up', 'mode main']
|
||||||
|
alt-shift-l = ['join-with right', 'mode main']
|
||||||
27
.config/sketchybar/colors.sh
Executable file
27
.config/sketchybar/colors.sh
Executable file
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# IR Black Color Palette (from Ghostty theme)
|
||||||
|
export BLACK=0xff000000 # IR Black bg
|
||||||
|
export WHITE=0xfff1f1f1 # IR Black fg
|
||||||
|
export RED=0xfffa6c60 # IR Black red
|
||||||
|
#export GREEN=0xffa8ff60 # IR Black green
|
||||||
|
export GREEN=0xff906cff # PURPLE
|
||||||
|
export BLUE=0xff96cafe # IR Black blue
|
||||||
|
export YELLOW=0xfffffeb7 # IR Black yellow
|
||||||
|
export ORANGE=0xfffcb6b0 # IR Black bright red (warm accent)
|
||||||
|
export MAGENTA=0xfffa73fd # IR Black magenta
|
||||||
|
export CYAN=0xffc6c5fe # IR Black cyan/lavender
|
||||||
|
export GREY=0xff4f4f4f # IR Black dim
|
||||||
|
export TRANSPARENT=0x00000000
|
||||||
|
|
||||||
|
# Bar colors with IR Black background
|
||||||
|
export BAR_COLOR=0xa0000000 # IR Black bg with transparency
|
||||||
|
export ICON_COLOR=$WHITE # Color of all icons
|
||||||
|
export LABEL_COLOR=$WHITE # Color of all labels
|
||||||
|
export BACKGROUND_1=0x90000000 # IR Black bg
|
||||||
|
export BACKGROUND_2=0x604f4f4f # IR Black dim, semi-transparent
|
||||||
|
|
||||||
|
export POPUP_BACKGROUND_COLOR=0xff000000
|
||||||
|
export POPUP_BORDER_COLOR=$GREEN
|
||||||
|
|
||||||
|
export SHADOW_COLOR=$BLACK
|
||||||
26
.config/sketchybar/helpers/colors.sh
Executable file
26
.config/sketchybar/helpers/colors.sh
Executable file
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Gruvbox Dark Hard Color Palette
|
||||||
|
export BLACK=0xff1d2021 # Gruvbox bg
|
||||||
|
export WHITE=0xffd5c4a1 # Gruvbox fg
|
||||||
|
export RED=0xfffb4934 # Gruvbox red
|
||||||
|
export GREEN=0xffb8bb26 # Gruvbox green (active workspace)
|
||||||
|
export BLUE=0xff83a598 # Gruvbox blue (front app icon)
|
||||||
|
export YELLOW=0xfffabd2f # Gruvbox yellow/gold (apple icon)
|
||||||
|
export ORANGE=0xfffe8019 # Gruvbox orange
|
||||||
|
export MAGENTA=0xffd3869b # Gruvbox magenta
|
||||||
|
export CYAN=0xff8ec07c # Gruvbox cyan/aqua
|
||||||
|
export GREY=0xff665c54 # Gruvbox grey
|
||||||
|
export TRANSPARENT=0x00000000
|
||||||
|
|
||||||
|
# Bar colors with Gruvbox background tones
|
||||||
|
export BAR_COLOR=0xa01d2021 # Gruvbox bg with transparency
|
||||||
|
export ICON_COLOR=$WHITE # Color of all icons
|
||||||
|
export LABEL_COLOR=$WHITE # Color of all labels
|
||||||
|
export BACKGROUND_1=0x901d2021 # Gruvbox bg
|
||||||
|
export BACKGROUND_2=0x903c3836 # Gruvbox bg1
|
||||||
|
|
||||||
|
export POPUP_BACKGROUND_COLOR=0xff1d2021
|
||||||
|
export POPUP_BORDER_COLOR=$YELLOW
|
||||||
|
|
||||||
|
export SHADOW_COLOR=$BLACK
|
||||||
26
.config/sketchybar/helpers/event_providers.sh
Executable file
26
.config/sketchybar/helpers/event_providers.sh
Executable file
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
aerospace_workspace_change() {
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
CURRENT_WORKSPACE=$(aerospace list-workspaces --focused)
|
||||||
|
|
||||||
|
args=()
|
||||||
|
while read -r line
|
||||||
|
do
|
||||||
|
if [[ $line =~ (aerospace\.workspace\.[0-9]+) ]]; then
|
||||||
|
WORKSPACE_NUMBER=${line##*.}
|
||||||
|
if [ "$WORKSPACE_NUMBER" = "$CURRENT_WORKSPACE" ]; then
|
||||||
|
args+=(--set "${line}" icon.highlight=on)
|
||||||
|
else
|
||||||
|
args+=(--set "${line}" icon.highlight=off)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done <<< "$(sketchybar --query bar | jq -r '.items[]')"
|
||||||
|
|
||||||
|
[ ${#args[@]} -gt 0 ] && sketchybar "${args[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$SENDER" in
|
||||||
|
"aerospace_workspace_change") aerospace_workspace_change
|
||||||
|
;;
|
||||||
|
esac
|
||||||
2079
.config/sketchybar/helpers/icon_map.json
Normal file
2079
.config/sketchybar/helpers/icon_map.json
Normal file
File diff suppressed because it is too large
Load diff
455
.config/sketchybar/helpers/icon_map.lua
Normal file
455
.config/sketchybar/helpers/icon_map.lua
Normal file
|
|
@ -0,0 +1,455 @@
|
||||||
|
return {
|
||||||
|
["Live"] = ":ableton:",
|
||||||
|
["Acrobat"] = ":acrobat:",
|
||||||
|
["Activity Monitor"] = ":activity_monitor:",
|
||||||
|
["Aktivitätsanzeige"] = ":activity_monitor:",
|
||||||
|
["Adobe Bridge"] = ":adobe_bridge:",
|
||||||
|
["AFFiNE"] = ":affine:",
|
||||||
|
["Affinity Designer"] = ":affinity_designer:",
|
||||||
|
["Affinity Designer 2"] = ":affinity_designer_2:",
|
||||||
|
["Affinity Photo"] = ":affinity_photo:",
|
||||||
|
["Affinity Photo 2"] = ":affinity_photo_2:",
|
||||||
|
["Affinity Publisher"] = ":affinity_publisher:",
|
||||||
|
["Affinity Publisher 2"] = ":affinity_publisher_2:",
|
||||||
|
["Airmail"] = ":airmail:",
|
||||||
|
["AirPort Utility"] = ":airport_utility:",
|
||||||
|
["Alacritty"] = ":alacritty:",
|
||||||
|
["Alfred"] = ":alfred:",
|
||||||
|
["Android Messages"] = ":android_messages:",
|
||||||
|
["Android Studio"] = ":android_studio:",
|
||||||
|
["Anki"] = ":anki:",
|
||||||
|
["Anytype"] = ":anytype:",
|
||||||
|
["Apifox"] = ":apifox:",
|
||||||
|
["App Eraser"] = ":app_eraser:",
|
||||||
|
["App Store"] = ":app_store:",
|
||||||
|
["Arc"] = ":arc:",
|
||||||
|
["Arduino"] = ":arduino:",
|
||||||
|
["Arduino IDE"] = ":arduino:",
|
||||||
|
["Atom"] = ":atom:",
|
||||||
|
["Audacity"] = ":audacity:",
|
||||||
|
["balenaEtcher"] = ":balena_etcher:",
|
||||||
|
["Bambu Studio"] = ":bambu_studio:",
|
||||||
|
["MoneyMoney"] = ":bank:",
|
||||||
|
["Battle.net"] = ":battle_net:",
|
||||||
|
["Bazecor"] = ":bazecor:",
|
||||||
|
["Bear"] = ":bear:",
|
||||||
|
["BetterTouchTool"] = ":bettertouchtool:",
|
||||||
|
["Bilibili"] = ":bilibili:",
|
||||||
|
["哔哩哔哩"] = ":bilibili:",
|
||||||
|
["Bitwarden"] = ":bit_warden:",
|
||||||
|
["Blender"] = ":blender:",
|
||||||
|
["Blitzit"] = ":blitzit:",
|
||||||
|
["BluOS Controller"] = ":bluos_controller:",
|
||||||
|
["Books"] = ":book:",
|
||||||
|
["Calibre"] = ":book:",
|
||||||
|
["Bücher"] = ":book:",
|
||||||
|
["Brave Browser"] = ":brave_browser:",
|
||||||
|
["Bruno"] = ":bruno:",
|
||||||
|
["BusyCal"] = ":busycal:",
|
||||||
|
["Calculator"] = ":calculator:",
|
||||||
|
["Calculette"] = ":calculator:",
|
||||||
|
["Rechner"] = ":calculator:",
|
||||||
|
["Calendar"] = ":calendar:",
|
||||||
|
["日历"] = ":calendar:",
|
||||||
|
["Fantastical"] = ":calendar:",
|
||||||
|
["Cron"] = ":calendar:",
|
||||||
|
["Amie"] = ":calendar:",
|
||||||
|
["Calendrier"] = ":calendar:",
|
||||||
|
["カレンダー"] = ":calendar:",
|
||||||
|
["Notion Calendar"] = ":calendar:",
|
||||||
|
["Kalender"] = ":calendar:",
|
||||||
|
["calibre"] = ":calibre:",
|
||||||
|
["Capacities"] = ":capacities:",
|
||||||
|
["Caprine"] = ":caprine:",
|
||||||
|
["Amazon Chime"] = ":chime:",
|
||||||
|
["Cisco AnyConnect Secure Mobility Client"] = ":cisco_anyconnect:",
|
||||||
|
["Cisco Secure Client"] = ":cisco_anyconnect:",
|
||||||
|
["Citrix Workspace"] = ":citrix:",
|
||||||
|
["Citrix Viewer"] = ":citrix:",
|
||||||
|
["Claude"] = ":claude:",
|
||||||
|
["ClickUp"] = ":click_up:",
|
||||||
|
["Code"] = ":code:",
|
||||||
|
["Code - Insiders"] = ":code:",
|
||||||
|
["Cold Turkey Blocker"] = ":cold_turkey_blocker:",
|
||||||
|
["Color Picker"] = ":color_picker:",
|
||||||
|
["数码测色计"] = ":color_picker:",
|
||||||
|
["Comet"] = ":comet:",
|
||||||
|
["Copilot"] = ":copilot:",
|
||||||
|
["CotEditor"] = ":coteditor:",
|
||||||
|
["Creative Cloud"] = ":creative_cloud:",
|
||||||
|
["Cursor"] = ":cursor:",
|
||||||
|
["Cypress"] = ":cypress:",
|
||||||
|
["DataGrip"] = ":datagrip:",
|
||||||
|
["DataSpell"] = ":dataspell:",
|
||||||
|
["DaVinci Resolve"] = ":davinciresolve:",
|
||||||
|
["DBeaver"] = ":dbeaver:",
|
||||||
|
["DeepSeek"] = ":deepseek:",
|
||||||
|
["Deezer"] = ":deezer:",
|
||||||
|
["Default"] = ":default:",
|
||||||
|
["deno"] = ":deno:",
|
||||||
|
["CleanMyMac X"] = ":desktop:",
|
||||||
|
["DEVONthink 3"] = ":devonthink3:",
|
||||||
|
["Dexcom"] = ":dexcom:",
|
||||||
|
["Dia"] = ":dia:",
|
||||||
|
["DingTalk"] = ":dingtalk:",
|
||||||
|
["钉钉"] = ":dingtalk:",
|
||||||
|
["阿里钉"] = ":dingtalk:",
|
||||||
|
["Discord"] = ":discord:",
|
||||||
|
["Discord Canary"] = ":discord:",
|
||||||
|
["Discord PTB"] = ":discord:",
|
||||||
|
["Docker"] = ":docker:",
|
||||||
|
["Docker Desktop"] = ":docker:",
|
||||||
|
["GrandTotal"] = ":dollar:",
|
||||||
|
["Receipts"] = ":dollar:",
|
||||||
|
["Double Commander"] = ":doublecmd:",
|
||||||
|
["Drafts"] = ":drafts:",
|
||||||
|
["draw.io"] = ":draw_io:",
|
||||||
|
["Dropbox"] = ":dropbox:",
|
||||||
|
["Eagle"] = ":eagle:",
|
||||||
|
["Element"] = ":element:",
|
||||||
|
["Emacs"] = ":emacs:",
|
||||||
|
["Evernote Legacy"] = ":evernote_legacy:",
|
||||||
|
["FaceTime"] = ":face_time:",
|
||||||
|
["FaceTime 通话"] = ":face_time:",
|
||||||
|
["Feishu"] = ":feishu:",
|
||||||
|
["Figma"] = ":figma:",
|
||||||
|
["Final Cut Pro"] = ":final_cut_pro:",
|
||||||
|
["Finder"] = ":finder:",
|
||||||
|
["访达"] = ":finder:",
|
||||||
|
["Firefox"] = ":firefox:",
|
||||||
|
["Firefox Developer Edition"] = ":firefox_developer_edition:",
|
||||||
|
["Firefox Nightly"] = ":firefox_developer_edition:",
|
||||||
|
["FL Studio"] = ":flstudio:",
|
||||||
|
["Folx"] = ":folx:",
|
||||||
|
["Fork"] = ":fork:",
|
||||||
|
["Foxit PDF Reader"] = ":foxit_reader:",
|
||||||
|
["FreeCAD"] = ":freecad:",
|
||||||
|
["Freeform"] = ":freeform:",
|
||||||
|
["FreeTube"] = ":freetube:",
|
||||||
|
["Fusion"] = ":fusion:",
|
||||||
|
["System Preferences"] = ":gear:",
|
||||||
|
["System Settings"] = ":gear:",
|
||||||
|
["系统设置"] = ":gear:",
|
||||||
|
["Réglages Système"] = ":gear:",
|
||||||
|
["システム設定"] = ":gear:",
|
||||||
|
["Systemeinstellungen"] = ":gear:",
|
||||||
|
["Systemeinstellungen"] = ":gear:",
|
||||||
|
["Ghostty"] = ":ghostty:",
|
||||||
|
["GIMP"] = ":gimp:",
|
||||||
|
["GitHub Desktop"] = ":git_hub:",
|
||||||
|
["Godot"] = ":godot:",
|
||||||
|
["GoLand"] = ":goland:",
|
||||||
|
["Goodnotes"] = ":goodnotes:",
|
||||||
|
["Chromium"] = ":google_chrome:",
|
||||||
|
["Google Chrome"] = ":google_chrome:",
|
||||||
|
["Google Chrome Canary"] = ":google_chrome:",
|
||||||
|
["Grammarly Editor"] = ":grammarly:",
|
||||||
|
["Granola"] = ":granola:",
|
||||||
|
["Grayjay"] = ":grayjay:",
|
||||||
|
["Helium"] = ":helium:",
|
||||||
|
["Home Assistant"] = ":home_assistant:",
|
||||||
|
["Hyper"] = ":hyper:",
|
||||||
|
["IntelliJ IDEA"] = ":idea:",
|
||||||
|
["IINA"] = ":iina:",
|
||||||
|
["Adobe Illustrator"] = ":illustrator:",
|
||||||
|
["Illustrator"] = ":illustrator:",
|
||||||
|
["Adobe InDesign"] = ":indesign:",
|
||||||
|
["InDesign"] = ":indesign:",
|
||||||
|
["Infuse"] = ":infuse:",
|
||||||
|
["Inkdrop"] = ":inkdrop:",
|
||||||
|
["Inkscape"] = ":inkscape:",
|
||||||
|
["Insomnia"] = ":insomnia:",
|
||||||
|
["iPhone Mirroring"] = ":iphone_mirroring:",
|
||||||
|
["Iris"] = ":iris:",
|
||||||
|
["iTerm"] = ":iterm:",
|
||||||
|
["iTerm2"] = ":iterm:",
|
||||||
|
["Jellyfin Media Player"] = ":jellyfin:",
|
||||||
|
["JetBrains Gateway"] = ":jetbrains_gateway:",
|
||||||
|
["JetBrains Toolbox"] = ":jetbrains_toolbox:",
|
||||||
|
["Joplin"] = ":joplin:",
|
||||||
|
["카카오톡"] = ":kakaotalk:",
|
||||||
|
["KakaoTalk"] = ":kakaotalk:",
|
||||||
|
["Kakoune"] = ":kakoune:",
|
||||||
|
["KeePassXC"] = ":kee_pass_x_c:",
|
||||||
|
["Keyboard Maestro"] = ":keyboard_maestro:",
|
||||||
|
["Keynote"] = ":keynote:",
|
||||||
|
["Keynote 讲演"] = ":keynote:",
|
||||||
|
["KiCad"] = ":kicad:",
|
||||||
|
["Kiro"] = ":kiro:",
|
||||||
|
["kitty"] = ":kitty:",
|
||||||
|
["Kodi"] = ":kodi:",
|
||||||
|
["LanguageTool for Desktop"] = ":languagetool_for_desktop:",
|
||||||
|
["League of Legends"] = ":league_of_legends:",
|
||||||
|
["LibreWolf"] = ":libre_wolf:",
|
||||||
|
["LibreOffice"] = ":libreoffice:",
|
||||||
|
["Adobe Lightroom"] = ":lightroom:",
|
||||||
|
["Lightroom Classic"] = ":lightroomclassic:",
|
||||||
|
["LINE"] = ":line:",
|
||||||
|
["Linear"] = ":linear:",
|
||||||
|
["LM Studio"] = ":lm_studio:",
|
||||||
|
["LocalSend"] = ":localsend:",
|
||||||
|
["Logic Pro"] = ":logicpro:",
|
||||||
|
["Logseq"] = ":logseq:",
|
||||||
|
["MacPass"] = ":macpass:",
|
||||||
|
["Canary Mail"] = ":mail:",
|
||||||
|
["HEY"] = ":mail:",
|
||||||
|
["Mail"] = ":mail:",
|
||||||
|
["Mailspring"] = ":mail:",
|
||||||
|
["MailMate"] = ":mail:",
|
||||||
|
["Superhuman"] = ":mail:",
|
||||||
|
["Spark"] = ":mail:",
|
||||||
|
["邮件"] = ":mail:",
|
||||||
|
["メール"] = ":mail:",
|
||||||
|
["MAMP"] = ":mamp:",
|
||||||
|
["MAMP PRO"] = ":mamp:",
|
||||||
|
["Maps"] = ":maps:",
|
||||||
|
["Google Maps"] = ":maps:",
|
||||||
|
["マップ"] = ":maps:",
|
||||||
|
["Karten"] = ":maps:",
|
||||||
|
["Marta"] = ":marta:",
|
||||||
|
["Matlab"] = ":matlab:",
|
||||||
|
["MATLAB"] = ":matlab:",
|
||||||
|
["MATLABWindow"] = ":matlab:",
|
||||||
|
["MATLAB_R2024b"] = ":matlab:",
|
||||||
|
["MATLAB_R2024a"] = ":matlab:",
|
||||||
|
["MATLAB_R2023b"] = ":matlab:",
|
||||||
|
["MATLAB_R2023a"] = ":matlab:",
|
||||||
|
["MATLAB_R2022b"] = ":matlab:",
|
||||||
|
["MATLAB_R2022a"] = ":matlab:",
|
||||||
|
["MATLAB_R2021b"] = ":matlab:",
|
||||||
|
["MATLAB_R2021a"] = ":matlab:",
|
||||||
|
["Mattermost"] = ":mattermost:",
|
||||||
|
["Google Meet"] = ":meet:",
|
||||||
|
["Messages"] = ":messages:",
|
||||||
|
["信息"] = ":messages:",
|
||||||
|
["Nachrichten"] = ":messages:",
|
||||||
|
["メッセージ"] = ":messages:",
|
||||||
|
["Messenger"] = ":messenger:",
|
||||||
|
["Microsoft Edge"] = ":microsoft_edge:",
|
||||||
|
["Microsoft Excel"] = ":microsoft_excel:",
|
||||||
|
["Microsoft Outlook"] = ":microsoft_outlook:",
|
||||||
|
["Microsoft PowerPoint"] = ":microsoft_power_point:",
|
||||||
|
["Microsoft Remote Desktop"] = ":microsoft_remote_desktop:",
|
||||||
|
["Microsoft Teams"] = ":microsoft_teams:",
|
||||||
|
["Microsoft Teams (work or school)"] = ":microsoft_teams:",
|
||||||
|
["Microsoft Word"] = ":microsoft_word:",
|
||||||
|
["Mimestream"] = ":mimestream:",
|
||||||
|
["Min"] = ":min_browser:",
|
||||||
|
["Miro"] = ":miro:",
|
||||||
|
["MongoDB Compass"] = ":mongodb:",
|
||||||
|
["Moonlight"] = ":moonlight:",
|
||||||
|
["mpv"] = ":mpv:",
|
||||||
|
["Mullvad Browser"] = ":mullvad_browser:",
|
||||||
|
["Music"] = ":music:",
|
||||||
|
["音乐"] = ":music:",
|
||||||
|
["Musique"] = ":music:",
|
||||||
|
["ミュージック"] = ":music:",
|
||||||
|
["Musik"] = ":music:",
|
||||||
|
["Navicat Premium"] = ":navicat:",
|
||||||
|
["Neovide"] = ":neovide:",
|
||||||
|
["neovide"] = ":neovide:",
|
||||||
|
["Neovim"] = ":neovim:",
|
||||||
|
["neovim"] = ":neovim:",
|
||||||
|
["nvim"] = ":neovim:",
|
||||||
|
["网易云音乐"] = ":netease_music:",
|
||||||
|
["NetEaseMusic"] = ":netease_music:",
|
||||||
|
["News"] = ":news:",
|
||||||
|
["Nextcloud"] = ":nextcloud:",
|
||||||
|
["Nicotine+"] = ":nicotine_plus:",
|
||||||
|
["Nimble Commander"] = ":nimble_commander:",
|
||||||
|
["NimbleCommander-Unsigned"] = ":nimble_commander:",
|
||||||
|
["Noodl"] = ":noodl:",
|
||||||
|
["Noodl Editor"] = ":noodl:",
|
||||||
|
["NordVPN"] = ":nord_vpn:",
|
||||||
|
["Notability"] = ":notability:",
|
||||||
|
["Notes"] = ":notes:",
|
||||||
|
["备忘录"] = ":notes:",
|
||||||
|
["メモ"] = ":notes:",
|
||||||
|
["Notizen"] = ":notes:",
|
||||||
|
["Notion"] = ":notion:",
|
||||||
|
["Notion Mail"] = ":notion_mail:",
|
||||||
|
["Nova"] = ":nova:",
|
||||||
|
["Numbers"] = ":numbers:",
|
||||||
|
["Numbers 表格"] = ":numbers:",
|
||||||
|
["Obsidian"] = ":obsidian:",
|
||||||
|
["OBS"] = ":obsstudio:",
|
||||||
|
["OmniFocus"] = ":omni_focus:",
|
||||||
|
["1Password"] = ":one_password:",
|
||||||
|
["Open Video Downloader"] = ":open_video_downloader:",
|
||||||
|
["ChatGPT"] = ":openai:",
|
||||||
|
["OpenAI Translator"] = ":openai_translator:",
|
||||||
|
["OpenVPN Connect"] = ":openvpn_connect:",
|
||||||
|
["Opera"] = ":opera:",
|
||||||
|
["OrbStack"] = ":orbstack:",
|
||||||
|
["OrcaSlicer"] = ":orcaslicer:",
|
||||||
|
["Orion"] = ":orion:",
|
||||||
|
["Orion RC"] = ":orion:",
|
||||||
|
["Overleaf"] = ":overleaf:",
|
||||||
|
["ShareLaTeX"] = ":overleaf:",
|
||||||
|
["Pages"] = ":pages:",
|
||||||
|
["Pages 文稿"] = ":pages:",
|
||||||
|
["Parallels Desktop"] = ":parallels:",
|
||||||
|
["Parsec"] = ":parsec:",
|
||||||
|
["Passepartout"] = ":passepartout:",
|
||||||
|
["Passwords"] = ":passwords:",
|
||||||
|
["Passwörter"] = ":passwords:",
|
||||||
|
["PDF Expert"] = ":pdf_expert:",
|
||||||
|
["Pearcleaner"] = ":pearcleaner:",
|
||||||
|
["Perplexity"] = ":perplexity:",
|
||||||
|
["Perplexity AI"] = ":perplexity:",
|
||||||
|
["Phoenix Slides"] = ":phoenix_slides:",
|
||||||
|
["Photos"] = ":photos:",
|
||||||
|
["Fotos"] = ":photos:",
|
||||||
|
["Adobe Photoshop"] = ":photoshop:",
|
||||||
|
["PhpStorm"] = ":php_storm:",
|
||||||
|
["Pi-hole Remote"] = ":pihole:",
|
||||||
|
["Pine"] = ":pine:",
|
||||||
|
["Plex"] = ":plex:",
|
||||||
|
["Plexamp"] = ":plexamp:",
|
||||||
|
["Podcasts"] = ":podcasts:",
|
||||||
|
["播客"] = ":podcasts:",
|
||||||
|
["PomoDone App"] = ":pomodone:",
|
||||||
|
["Postman"] = ":postman:",
|
||||||
|
["Premiere"] = ":premiere:",
|
||||||
|
["Adobe Premiere"] = ":premiere:",
|
||||||
|
["Adobe Premiere Pro 2024"] = ":premiere:",
|
||||||
|
["Preview"] = ":preview:",
|
||||||
|
["预览"] = ":preview:",
|
||||||
|
["Skim"] = ":preview:",
|
||||||
|
["zathura"] = ":preview:",
|
||||||
|
["Aperçu"] = ":preview:",
|
||||||
|
["プレビュー"] = ":preview:",
|
||||||
|
["Vorschau"] = ":preview:",
|
||||||
|
["Proton Mail"] = ":proton_mail:",
|
||||||
|
["Proton Mail Bridge"] = ":proton_mail:",
|
||||||
|
["Proton VPN"] = ":proton_vpn:",
|
||||||
|
["ProtonVPN"] = ":proton_vpn:",
|
||||||
|
["PrusaSlicer"] = ":prusaslicer:",
|
||||||
|
["SuperSlicer"] = ":prusaslicer:",
|
||||||
|
["PyCharm"] = ":pycharm:",
|
||||||
|
["qBittorrent"] = ":qbittorrent:",
|
||||||
|
["QLMarkdown"] = ":qlmarkdown:",
|
||||||
|
["QQ"] = ":qq:",
|
||||||
|
["QQ音乐"] = ":qqmusic:",
|
||||||
|
["QQMusic"] = ":qqmusic:",
|
||||||
|
["Quantumult X"] = ":quantumult_x:",
|
||||||
|
["Quip"] = ":quip:",
|
||||||
|
["qutebrowser"] = ":qute_browser:",
|
||||||
|
["Raindrop.io"] = ":raindrop_io:",
|
||||||
|
["Raspberry Pi Imager"] = ":raspberry_pi:",
|
||||||
|
["Raspberry Pi Connect"] = ":raspberry_pi:",
|
||||||
|
["Raycast"] = ":raycast:",
|
||||||
|
["Reeder"] = ":reeder5:",
|
||||||
|
["rekordbox"] = ":rekordbox:",
|
||||||
|
["Reminders"] = ":reminders:",
|
||||||
|
["提醒事项"] = ":reminders:",
|
||||||
|
["Rappels"] = ":reminders:",
|
||||||
|
["リマインダー"] = ":reminders:",
|
||||||
|
["Erinnerungen"] = ":reminders:",
|
||||||
|
["Replit"] = ":replit:",
|
||||||
|
["Repo Prompt"] = ":repo_prompt:",
|
||||||
|
["Rider"] = ":rider:",
|
||||||
|
["JetBrains Rider"] = ":rider:",
|
||||||
|
["Rio"] = ":rio:",
|
||||||
|
["Royal TSX"] = ":royaltsx:",
|
||||||
|
["RustDesk"] = ":rustdesk:",
|
||||||
|
["Safari"] = ":safari:",
|
||||||
|
["Safari浏览器"] = ":safari:",
|
||||||
|
["Safari Technology Preview"] = ":safari:",
|
||||||
|
["Scribus"] = ":scribus:",
|
||||||
|
["Seafile"] = ":seafile:",
|
||||||
|
["Sequel Ace"] = ":sequel_ace:",
|
||||||
|
["Sequel Pro"] = ":sequel_pro:",
|
||||||
|
["Session"] = ":session:",
|
||||||
|
["Setapp"] = ":setapp:",
|
||||||
|
["SF Symbols"] = ":sf_symbols:",
|
||||||
|
["SF Symbole"] = ":sf_symbols:",
|
||||||
|
["SF-Symbole"] = ":sf_symbols:",
|
||||||
|
["Shortcuts"] = ":shortcuts:",
|
||||||
|
["Signal"] = ":signal:",
|
||||||
|
["sioyek"] = ":sioyek:",
|
||||||
|
["Sketch"] = ":sketch:",
|
||||||
|
["Skype"] = ":skype:",
|
||||||
|
["Slack"] = ":slack:",
|
||||||
|
["Spark Desktop"] = ":spark:",
|
||||||
|
["Spotify"] = ":spotify:",
|
||||||
|
["Spotlight"] = ":spotlight:",
|
||||||
|
["Steam"] = ":steam:",
|
||||||
|
["Steam Helper"] = ":steam:",
|
||||||
|
["Studio 3T"] = ":studio_3t:",
|
||||||
|
["Sublime Text"] = ":sublime_text:",
|
||||||
|
["Summoners War"] = ":summoners_war:",
|
||||||
|
["superProductivity"] = ":superproductivity:",
|
||||||
|
["Surfshark"] = ":surfshark:",
|
||||||
|
["T3 Chat"] = ":t3chat:",
|
||||||
|
["Tabby"] = ":tabby:",
|
||||||
|
["TablePlus"] = ":tableplus:",
|
||||||
|
["Tana"] = ":tana:",
|
||||||
|
["TeamSpeak 3"] = ":team_speak:",
|
||||||
|
["Telegram"] = ":telegram:",
|
||||||
|
["Terminal"] = ":terminal:",
|
||||||
|
["终端"] = ":terminal:",
|
||||||
|
["ターミナル"] = ":terminal:",
|
||||||
|
["Termius"] = ":termius:",
|
||||||
|
["Typora"] = ":text:",
|
||||||
|
["TextEdit"] = ":textedit:",
|
||||||
|
["Microsoft To Do"] = ":things:",
|
||||||
|
["Things"] = ":things:",
|
||||||
|
["Thunderbird"] = ":thunderbird:",
|
||||||
|
["Thunderbird Daily"] = ":thunderbird:",
|
||||||
|
["TickTick"] = ":tick_tick:",
|
||||||
|
["TIDAL"] = ":tidal:",
|
||||||
|
["Tiny RDM"] = ":tinyrdm:",
|
||||||
|
["Todoist"] = ":todoist:",
|
||||||
|
["Toggl Track"] = ":toggl_track:",
|
||||||
|
["Tor Browser"] = ":tor_browser:",
|
||||||
|
["Tower"] = ":tower:",
|
||||||
|
["TradingView"] = ":trading_view:",
|
||||||
|
["Transmit"] = ":transmit:",
|
||||||
|
["Trello"] = ":trello:",
|
||||||
|
["Tweetbot"] = ":twitter:",
|
||||||
|
["Twitter"] = ":twitter:",
|
||||||
|
["UTM"] = ":utm:",
|
||||||
|
["VeraCrypt"] = ":veracrypt:",
|
||||||
|
["MacVim"] = ":vim:",
|
||||||
|
["Vim"] = ":vim:",
|
||||||
|
["VimR"] = ":vim:",
|
||||||
|
["Vivaldi"] = ":vivaldi:",
|
||||||
|
["VLC"] = ":vlc:",
|
||||||
|
["VMware Fusion"] = ":vmware_fusion:",
|
||||||
|
["Vorta"] = ":vorta:",
|
||||||
|
["VSCodium"] = ":vscodium:",
|
||||||
|
["Warp"] = ":warp:",
|
||||||
|
["Weather"] = ":weather:",
|
||||||
|
["Wetter"] = ":weather:",
|
||||||
|
["WebStorm"] = ":web_storm:",
|
||||||
|
["Webull Desktop"] = ":webull:",
|
||||||
|
["微信"] = ":wechat:",
|
||||||
|
["WeChat"] = ":wechat:",
|
||||||
|
["企业微信"] = ":wecom:",
|
||||||
|
["WeCom"] = ":wecom:",
|
||||||
|
["WezTerm"] = ":wezterm:",
|
||||||
|
["wezterm-gui"] = ":wezterm:",
|
||||||
|
["WhatsApp"] = ":whats_app:",
|
||||||
|
["WhatsApp"] = ":whats_app:",
|
||||||
|
["Windows App"] = ":windows_app:",
|
||||||
|
["WireGuard"] = ":wireguard:",
|
||||||
|
["Xcode"] = ":xcode:",
|
||||||
|
["Yandex Browser"] = ":yandex_bower:",
|
||||||
|
["Yandex Browser"] = ":yandex_bower:",
|
||||||
|
["Yandex"] = ":yandex_bower:",
|
||||||
|
["Yandex Music"] = ":yandex_music:",
|
||||||
|
["Yazi"] = ":yazi:",
|
||||||
|
["yazi"] = ":yazi:",
|
||||||
|
["YouTube"] = ":youtube:",
|
||||||
|
["YouTube Music"] = ":youtube_music:",
|
||||||
|
["Yuque"] = ":yuque:",
|
||||||
|
["语雀"] = ":yuque:",
|
||||||
|
["Zed"] = ":zed:",
|
||||||
|
["Zen"] = ":zen_browser:",
|
||||||
|
["Zen Browser"] = ":zen_browser:",
|
||||||
|
["Zeplin"] = ":zeplin:",
|
||||||
|
["zoom.us"] = ":zoom:",
|
||||||
|
["Zotero"] = ":zotero:",
|
||||||
|
["Zulip"] = ":zulip:",
|
||||||
|
}
|
||||||
986
.config/sketchybar/helpers/icon_map.sh
Executable file
986
.config/sketchybar/helpers/icon_map.sh
Executable file
|
|
@ -0,0 +1,986 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
### START-OF-ICON-MAP
|
||||||
|
function __icon_map() {
|
||||||
|
case "$1" in
|
||||||
|
"Live")
|
||||||
|
icon_result=":ableton:"
|
||||||
|
;;
|
||||||
|
"Acrobat")
|
||||||
|
icon_result=":acrobat:"
|
||||||
|
;;
|
||||||
|
"Activity Monitor" | "Aktivitätsanzeige")
|
||||||
|
icon_result=":activity_monitor:"
|
||||||
|
;;
|
||||||
|
"Adobe Bridge"*)
|
||||||
|
icon_result=":adobe_bridge:"
|
||||||
|
;;
|
||||||
|
"AFFiNE")
|
||||||
|
icon_result=":affine:"
|
||||||
|
;;
|
||||||
|
"Affinity Designer")
|
||||||
|
icon_result=":affinity_designer:"
|
||||||
|
;;
|
||||||
|
"Affinity Designer 2")
|
||||||
|
icon_result=":affinity_designer_2:"
|
||||||
|
;;
|
||||||
|
"Affinity Photo")
|
||||||
|
icon_result=":affinity_photo:"
|
||||||
|
;;
|
||||||
|
"Affinity Photo 2")
|
||||||
|
icon_result=":affinity_photo_2:"
|
||||||
|
;;
|
||||||
|
"Affinity Publisher")
|
||||||
|
icon_result=":affinity_publisher:"
|
||||||
|
;;
|
||||||
|
"Affinity Publisher 2")
|
||||||
|
icon_result=":affinity_publisher_2:"
|
||||||
|
;;
|
||||||
|
"Airmail")
|
||||||
|
icon_result=":airmail:"
|
||||||
|
;;
|
||||||
|
"AirPort Utility")
|
||||||
|
icon_result=":airport_utility:"
|
||||||
|
;;
|
||||||
|
"Alacritty")
|
||||||
|
icon_result=":alacritty:"
|
||||||
|
;;
|
||||||
|
"Alfred")
|
||||||
|
icon_result=":alfred:"
|
||||||
|
;;
|
||||||
|
"Android Messages")
|
||||||
|
icon_result=":android_messages:"
|
||||||
|
;;
|
||||||
|
"Android Studio")
|
||||||
|
icon_result=":android_studio:"
|
||||||
|
;;
|
||||||
|
"Anki")
|
||||||
|
icon_result=":anki:"
|
||||||
|
;;
|
||||||
|
"Anytype")
|
||||||
|
icon_result=":anytype:"
|
||||||
|
;;
|
||||||
|
"Apifox")
|
||||||
|
icon_result=":apifox:"
|
||||||
|
;;
|
||||||
|
"App Eraser")
|
||||||
|
icon_result=":app_eraser:"
|
||||||
|
;;
|
||||||
|
"App Store")
|
||||||
|
icon_result=":app_store:"
|
||||||
|
;;
|
||||||
|
"Arc")
|
||||||
|
icon_result=":arc:"
|
||||||
|
;;
|
||||||
|
"Arduino" | "Arduino IDE")
|
||||||
|
icon_result=":arduino:"
|
||||||
|
;;
|
||||||
|
"Atom")
|
||||||
|
icon_result=":atom:"
|
||||||
|
;;
|
||||||
|
"Audacity")
|
||||||
|
icon_result=":audacity:"
|
||||||
|
;;
|
||||||
|
"balenaEtcher")
|
||||||
|
icon_result=":balena_etcher:"
|
||||||
|
;;
|
||||||
|
"Bambu Studio")
|
||||||
|
icon_result=":bambu_studio:"
|
||||||
|
;;
|
||||||
|
"MoneyMoney")
|
||||||
|
icon_result=":bank:"
|
||||||
|
;;
|
||||||
|
"Battle.net")
|
||||||
|
icon_result=":battle_net:"
|
||||||
|
;;
|
||||||
|
"Bazecor")
|
||||||
|
icon_result=":bazecor:"
|
||||||
|
;;
|
||||||
|
"Bear")
|
||||||
|
icon_result=":bear:"
|
||||||
|
;;
|
||||||
|
"BetterTouchTool")
|
||||||
|
icon_result=":bettertouchtool:"
|
||||||
|
;;
|
||||||
|
"Bilibili" | "哔哩哔哩")
|
||||||
|
icon_result=":bilibili:"
|
||||||
|
;;
|
||||||
|
"Bitwarden")
|
||||||
|
icon_result=":bit_warden:"
|
||||||
|
;;
|
||||||
|
"Blender")
|
||||||
|
icon_result=":blender:"
|
||||||
|
;;
|
||||||
|
"Blitzit")
|
||||||
|
icon_result=":blitzit:"
|
||||||
|
;;
|
||||||
|
"BluOS Controller")
|
||||||
|
icon_result=":bluos_controller:"
|
||||||
|
;;
|
||||||
|
"Books" | "Calibre" | "Bücher")
|
||||||
|
icon_result=":book:"
|
||||||
|
;;
|
||||||
|
"Brave Browser")
|
||||||
|
icon_result=":brave_browser:"
|
||||||
|
;;
|
||||||
|
"Bruno")
|
||||||
|
icon_result=":bruno:"
|
||||||
|
;;
|
||||||
|
"BusyCal")
|
||||||
|
icon_result=":busycal:"
|
||||||
|
;;
|
||||||
|
"Calculator" | "Calculette" | "Rechner")
|
||||||
|
icon_result=":calculator:"
|
||||||
|
;;
|
||||||
|
"Calendar" | "日历" | "Fantastical" | "Cron" | "Amie" | "Calendrier" | "カレンダー" | "Notion Calendar" | "Kalender")
|
||||||
|
icon_result=":calendar:"
|
||||||
|
;;
|
||||||
|
"calibre")
|
||||||
|
icon_result=":calibre:"
|
||||||
|
;;
|
||||||
|
"Capacities")
|
||||||
|
icon_result=":capacities:"
|
||||||
|
;;
|
||||||
|
"Caprine")
|
||||||
|
icon_result=":caprine:"
|
||||||
|
;;
|
||||||
|
"Amazon Chime")
|
||||||
|
icon_result=":chime:"
|
||||||
|
;;
|
||||||
|
"Cisco AnyConnect Secure Mobility Client" | "Cisco Secure Client")
|
||||||
|
icon_result=":cisco_anyconnect:"
|
||||||
|
;;
|
||||||
|
"Citrix Workspace" | "Citrix Viewer")
|
||||||
|
icon_result=":citrix:"
|
||||||
|
;;
|
||||||
|
"Claude")
|
||||||
|
icon_result=":claude:"
|
||||||
|
;;
|
||||||
|
"ClickUp")
|
||||||
|
icon_result=":click_up:"
|
||||||
|
;;
|
||||||
|
"Code" | "Code - Insiders")
|
||||||
|
icon_result=":code:"
|
||||||
|
;;
|
||||||
|
"Cold Turkey Blocker")
|
||||||
|
icon_result=":cold_turkey_blocker:"
|
||||||
|
;;
|
||||||
|
"Color Picker" | "数码测色计")
|
||||||
|
icon_result=":color_picker:"
|
||||||
|
;;
|
||||||
|
"Comet")
|
||||||
|
icon_result=":comet:"
|
||||||
|
;;
|
||||||
|
"Copilot")
|
||||||
|
icon_result=":copilot:"
|
||||||
|
;;
|
||||||
|
"CotEditor")
|
||||||
|
icon_result=":coteditor:"
|
||||||
|
;;
|
||||||
|
"Creative Cloud")
|
||||||
|
icon_result=":creative_cloud:"
|
||||||
|
;;
|
||||||
|
"Cursor")
|
||||||
|
icon_result=":cursor:"
|
||||||
|
;;
|
||||||
|
"Cypress")
|
||||||
|
icon_result=":cypress:"
|
||||||
|
;;
|
||||||
|
"DataGrip")
|
||||||
|
icon_result=":datagrip:"
|
||||||
|
;;
|
||||||
|
"DataSpell")
|
||||||
|
icon_result=":dataspell:"
|
||||||
|
;;
|
||||||
|
"DaVinci Resolve")
|
||||||
|
icon_result=":davinciresolve:"
|
||||||
|
;;
|
||||||
|
"DBeaver")
|
||||||
|
icon_result=":dbeaver:"
|
||||||
|
;;
|
||||||
|
"DeepSeek")
|
||||||
|
icon_result=":deepseek:"
|
||||||
|
;;
|
||||||
|
"Deezer")
|
||||||
|
icon_result=":deezer:"
|
||||||
|
;;
|
||||||
|
"Default")
|
||||||
|
icon_result=":default:"
|
||||||
|
;;
|
||||||
|
"deno")
|
||||||
|
icon_result=":deno:"
|
||||||
|
;;
|
||||||
|
"CleanMyMac X")
|
||||||
|
icon_result=":desktop:"
|
||||||
|
;;
|
||||||
|
"DEVONthink 3")
|
||||||
|
icon_result=":devonthink3:"
|
||||||
|
;;
|
||||||
|
"Dexcom")
|
||||||
|
icon_result=":dexcom:"
|
||||||
|
;;
|
||||||
|
"Dia")
|
||||||
|
icon_result=":dia:"
|
||||||
|
;;
|
||||||
|
"DingTalk" | "钉钉" | "阿里钉")
|
||||||
|
icon_result=":dingtalk:"
|
||||||
|
;;
|
||||||
|
"Discord" | "Discord Canary" | "Discord PTB")
|
||||||
|
icon_result=":discord:"
|
||||||
|
;;
|
||||||
|
"Docker" | "Docker Desktop")
|
||||||
|
icon_result=":docker:"
|
||||||
|
;;
|
||||||
|
"GrandTotal" | "Receipts")
|
||||||
|
icon_result=":dollar:"
|
||||||
|
;;
|
||||||
|
"Double Commander")
|
||||||
|
icon_result=":doublecmd:"
|
||||||
|
;;
|
||||||
|
"Drafts")
|
||||||
|
icon_result=":drafts:"
|
||||||
|
;;
|
||||||
|
"draw.io")
|
||||||
|
icon_result=":draw_io:"
|
||||||
|
;;
|
||||||
|
"Dropbox")
|
||||||
|
icon_result=":dropbox:"
|
||||||
|
;;
|
||||||
|
"Eagle")
|
||||||
|
icon_result=":eagle:"
|
||||||
|
;;
|
||||||
|
"Element")
|
||||||
|
icon_result=":element:"
|
||||||
|
;;
|
||||||
|
"Emacs")
|
||||||
|
icon_result=":emacs:"
|
||||||
|
;;
|
||||||
|
"Evernote Legacy")
|
||||||
|
icon_result=":evernote_legacy:"
|
||||||
|
;;
|
||||||
|
"FaceTime" | "FaceTime 通话")
|
||||||
|
icon_result=":face_time:"
|
||||||
|
;;
|
||||||
|
"Feishu")
|
||||||
|
icon_result=":feishu:"
|
||||||
|
;;
|
||||||
|
"Figma")
|
||||||
|
icon_result=":figma:"
|
||||||
|
;;
|
||||||
|
"Final Cut Pro")
|
||||||
|
icon_result=":final_cut_pro:"
|
||||||
|
;;
|
||||||
|
"Finder" | "访达")
|
||||||
|
icon_result=":finder:"
|
||||||
|
;;
|
||||||
|
"Firefox")
|
||||||
|
icon_result=":firefox:"
|
||||||
|
;;
|
||||||
|
"Firefox Developer Edition" | "Firefox Nightly")
|
||||||
|
icon_result=":firefox_developer_edition:"
|
||||||
|
;;
|
||||||
|
"FL Studio")
|
||||||
|
icon_result=":flstudio:"
|
||||||
|
;;
|
||||||
|
"Folx")
|
||||||
|
icon_result=":folx:"
|
||||||
|
;;
|
||||||
|
"Fork")
|
||||||
|
icon_result=":fork:"
|
||||||
|
;;
|
||||||
|
"Foxit PDF Reader")
|
||||||
|
icon_result=":foxit_reader:"
|
||||||
|
;;
|
||||||
|
"FreeCAD")
|
||||||
|
icon_result=":freecad:"
|
||||||
|
;;
|
||||||
|
"Freeform")
|
||||||
|
icon_result=":freeform:"
|
||||||
|
;;
|
||||||
|
"FreeTube")
|
||||||
|
icon_result=":freetube:"
|
||||||
|
;;
|
||||||
|
"Fusion")
|
||||||
|
icon_result=":fusion:"
|
||||||
|
;;
|
||||||
|
"System Preferences" | "System Settings" | "系统设置" | "Réglages Système" | "システム設定" | "Systemeinstellungen" | "Systemeinstellungen")
|
||||||
|
icon_result=":gear:"
|
||||||
|
;;
|
||||||
|
"Ghostty")
|
||||||
|
icon_result=":ghostty:"
|
||||||
|
;;
|
||||||
|
"GIMP")
|
||||||
|
icon_result=":gimp:"
|
||||||
|
;;
|
||||||
|
"GitHub Desktop")
|
||||||
|
icon_result=":git_hub:"
|
||||||
|
;;
|
||||||
|
"Godot")
|
||||||
|
icon_result=":godot:"
|
||||||
|
;;
|
||||||
|
"GoLand")
|
||||||
|
icon_result=":goland:"
|
||||||
|
;;
|
||||||
|
"Goodnotes")
|
||||||
|
icon_result=":goodnotes:"
|
||||||
|
;;
|
||||||
|
"Chromium" | "Google Chrome" | "Google Chrome Canary")
|
||||||
|
icon_result=":google_chrome:"
|
||||||
|
;;
|
||||||
|
"Grammarly Editor")
|
||||||
|
icon_result=":grammarly:"
|
||||||
|
;;
|
||||||
|
"Granola")
|
||||||
|
icon_result=":granola:"
|
||||||
|
;;
|
||||||
|
"Grayjay")
|
||||||
|
icon_result=":grayjay:"
|
||||||
|
;;
|
||||||
|
"Helium")
|
||||||
|
icon_result=":helium:"
|
||||||
|
;;
|
||||||
|
"Home Assistant")
|
||||||
|
icon_result=":home_assistant:"
|
||||||
|
;;
|
||||||
|
"Hyper")
|
||||||
|
icon_result=":hyper:"
|
||||||
|
;;
|
||||||
|
"IntelliJ IDEA")
|
||||||
|
icon_result=":idea:"
|
||||||
|
;;
|
||||||
|
"IINA")
|
||||||
|
icon_result=":iina:"
|
||||||
|
;;
|
||||||
|
"Adobe Illustrator"* | "Illustrator")
|
||||||
|
icon_result=":illustrator:"
|
||||||
|
;;
|
||||||
|
"Adobe InDesign"* | "InDesign")
|
||||||
|
icon_result=":indesign:"
|
||||||
|
;;
|
||||||
|
"Infuse")
|
||||||
|
icon_result=":infuse:"
|
||||||
|
;;
|
||||||
|
"Inkdrop")
|
||||||
|
icon_result=":inkdrop:"
|
||||||
|
;;
|
||||||
|
"Inkscape")
|
||||||
|
icon_result=":inkscape:"
|
||||||
|
;;
|
||||||
|
"Insomnia")
|
||||||
|
icon_result=":insomnia:"
|
||||||
|
;;
|
||||||
|
"iPhone Mirroring")
|
||||||
|
icon_result=":iphone_mirroring:"
|
||||||
|
;;
|
||||||
|
"Iris")
|
||||||
|
icon_result=":iris:"
|
||||||
|
;;
|
||||||
|
"iTerm" | "iTerm2")
|
||||||
|
icon_result=":iterm:"
|
||||||
|
;;
|
||||||
|
"Jellyfin Media Player")
|
||||||
|
icon_result=":jellyfin:"
|
||||||
|
;;
|
||||||
|
"JetBrains Gateway")
|
||||||
|
icon_result=":jetbrains_gateway:"
|
||||||
|
;;
|
||||||
|
"JetBrains Toolbox")
|
||||||
|
icon_result=":jetbrains_toolbox:"
|
||||||
|
;;
|
||||||
|
"Joplin")
|
||||||
|
icon_result=":joplin:"
|
||||||
|
;;
|
||||||
|
"카카오톡" | "KakaoTalk")
|
||||||
|
icon_result=":kakaotalk:"
|
||||||
|
;;
|
||||||
|
"Kakoune")
|
||||||
|
icon_result=":kakoune:"
|
||||||
|
;;
|
||||||
|
"KeePassXC")
|
||||||
|
icon_result=":kee_pass_x_c:"
|
||||||
|
;;
|
||||||
|
"Keyboard Maestro")
|
||||||
|
icon_result=":keyboard_maestro:"
|
||||||
|
;;
|
||||||
|
"Keynote" | "Keynote 讲演")
|
||||||
|
icon_result=":keynote:"
|
||||||
|
;;
|
||||||
|
"KiCad")
|
||||||
|
icon_result=":kicad:"
|
||||||
|
;;
|
||||||
|
"Kiro")
|
||||||
|
icon_result=":kiro:"
|
||||||
|
;;
|
||||||
|
"kitty")
|
||||||
|
icon_result=":kitty:"
|
||||||
|
;;
|
||||||
|
"Kodi")
|
||||||
|
icon_result=":kodi:"
|
||||||
|
;;
|
||||||
|
"LanguageTool for Desktop")
|
||||||
|
icon_result=":languagetool_for_desktop:"
|
||||||
|
;;
|
||||||
|
"League of Legends")
|
||||||
|
icon_result=":league_of_legends:"
|
||||||
|
;;
|
||||||
|
"LibreWolf")
|
||||||
|
icon_result=":libre_wolf:"
|
||||||
|
;;
|
||||||
|
"LibreOffice")
|
||||||
|
icon_result=":libreoffice:"
|
||||||
|
;;
|
||||||
|
"Adobe Lightroom")
|
||||||
|
icon_result=":lightroom:"
|
||||||
|
;;
|
||||||
|
"Lightroom Classic")
|
||||||
|
icon_result=":lightroomclassic:"
|
||||||
|
;;
|
||||||
|
"LINE")
|
||||||
|
icon_result=":line:"
|
||||||
|
;;
|
||||||
|
"Linear")
|
||||||
|
icon_result=":linear:"
|
||||||
|
;;
|
||||||
|
"LM Studio")
|
||||||
|
icon_result=":lm_studio:"
|
||||||
|
;;
|
||||||
|
"LocalSend")
|
||||||
|
icon_result=":localsend:"
|
||||||
|
;;
|
||||||
|
"Logic Pro")
|
||||||
|
icon_result=":logicpro:"
|
||||||
|
;;
|
||||||
|
"Logseq")
|
||||||
|
icon_result=":logseq:"
|
||||||
|
;;
|
||||||
|
"MacPass")
|
||||||
|
icon_result=":macpass:"
|
||||||
|
;;
|
||||||
|
"Canary Mail" | "HEY" | "Mail" | "Mailspring" | "MailMate" | "Superhuman" | "Spark" | "邮件" | "メール")
|
||||||
|
icon_result=":mail:"
|
||||||
|
;;
|
||||||
|
"MAMP" | "MAMP PRO")
|
||||||
|
icon_result=":mamp:"
|
||||||
|
;;
|
||||||
|
"Maps" | "Google Maps" | "マップ" | "Karten")
|
||||||
|
icon_result=":maps:"
|
||||||
|
;;
|
||||||
|
"Marta")
|
||||||
|
icon_result=":marta:"
|
||||||
|
;;
|
||||||
|
"Matlab" | "MATLAB" |"MATLABWindow" | "MATLAB_R2024b" | "MATLAB_R2024a" | "MATLAB_R2023b" | "MATLAB_R2023a" | "MATLAB_R2022b" | "MATLAB_R2022a" | "MATLAB_R2021b" | "MATLAB_R2021a")
|
||||||
|
icon_result=":matlab:"
|
||||||
|
;;
|
||||||
|
"Mattermost")
|
||||||
|
icon_result=":mattermost:"
|
||||||
|
;;
|
||||||
|
"Google Meet")
|
||||||
|
icon_result=":meet:"
|
||||||
|
;;
|
||||||
|
"Messages" | "信息" | "Nachrichten" | "メッセージ")
|
||||||
|
icon_result=":messages:"
|
||||||
|
;;
|
||||||
|
"Messenger")
|
||||||
|
icon_result=":messenger:"
|
||||||
|
;;
|
||||||
|
"Microsoft Edge")
|
||||||
|
icon_result=":microsoft_edge:"
|
||||||
|
;;
|
||||||
|
"Microsoft Excel")
|
||||||
|
icon_result=":microsoft_excel:"
|
||||||
|
;;
|
||||||
|
"Microsoft Outlook")
|
||||||
|
icon_result=":microsoft_outlook:"
|
||||||
|
;;
|
||||||
|
"Microsoft PowerPoint")
|
||||||
|
icon_result=":microsoft_power_point:"
|
||||||
|
;;
|
||||||
|
"Microsoft Remote Desktop")
|
||||||
|
icon_result=":microsoft_remote_desktop:"
|
||||||
|
;;
|
||||||
|
"Microsoft Teams" | "Microsoft Teams (work or school)")
|
||||||
|
icon_result=":microsoft_teams:"
|
||||||
|
;;
|
||||||
|
"Microsoft Word")
|
||||||
|
icon_result=":microsoft_word:"
|
||||||
|
;;
|
||||||
|
"Mimestream")
|
||||||
|
icon_result=":mimestream:"
|
||||||
|
;;
|
||||||
|
"Min")
|
||||||
|
icon_result=":min_browser:"
|
||||||
|
;;
|
||||||
|
"Miro")
|
||||||
|
icon_result=":miro:"
|
||||||
|
;;
|
||||||
|
"MongoDB Compass"*)
|
||||||
|
icon_result=":mongodb:"
|
||||||
|
;;
|
||||||
|
"Moonlight")
|
||||||
|
icon_result=":moonlight:"
|
||||||
|
;;
|
||||||
|
"mpv")
|
||||||
|
icon_result=":mpv:"
|
||||||
|
;;
|
||||||
|
"Mullvad Browser")
|
||||||
|
icon_result=":mullvad_browser:"
|
||||||
|
;;
|
||||||
|
"Music" | "音乐" | "Musique" | "ミュージック" | "Musik")
|
||||||
|
icon_result=":music:"
|
||||||
|
;;
|
||||||
|
"Navicat Premium")
|
||||||
|
icon_result=":navicat:"
|
||||||
|
;;
|
||||||
|
"Neovide" | "neovide")
|
||||||
|
icon_result=":neovide:"
|
||||||
|
;;
|
||||||
|
"Neovim" | "neovim" | "nvim")
|
||||||
|
icon_result=":neovim:"
|
||||||
|
;;
|
||||||
|
"网易云音乐" | "NetEaseMusic")
|
||||||
|
icon_result=":netease_music:"
|
||||||
|
;;
|
||||||
|
"News")
|
||||||
|
icon_result=":news:"
|
||||||
|
;;
|
||||||
|
"Nextcloud")
|
||||||
|
icon_result=":nextcloud:"
|
||||||
|
;;
|
||||||
|
"Nicotine+")
|
||||||
|
icon_result=":nicotine_plus:"
|
||||||
|
;;
|
||||||
|
"Nimble Commander" | "NimbleCommander-Unsigned")
|
||||||
|
icon_result=":nimble_commander:"
|
||||||
|
;;
|
||||||
|
"Noodl" | "Noodl Editor")
|
||||||
|
icon_result=":noodl:"
|
||||||
|
;;
|
||||||
|
"NordVPN")
|
||||||
|
icon_result=":nord_vpn:"
|
||||||
|
;;
|
||||||
|
"Notability")
|
||||||
|
icon_result=":notability:"
|
||||||
|
;;
|
||||||
|
"Notes" | "备忘录" | "メモ" | "Notizen")
|
||||||
|
icon_result=":notes:"
|
||||||
|
;;
|
||||||
|
"Notion")
|
||||||
|
icon_result=":notion:"
|
||||||
|
;;
|
||||||
|
"Notion Mail")
|
||||||
|
icon_result=":notion_mail:"
|
||||||
|
;;
|
||||||
|
"Nova")
|
||||||
|
icon_result=":nova:"
|
||||||
|
;;
|
||||||
|
"Numbers" | "Numbers 表格")
|
||||||
|
icon_result=":numbers:"
|
||||||
|
;;
|
||||||
|
"Obsidian")
|
||||||
|
icon_result=":obsidian:"
|
||||||
|
;;
|
||||||
|
"OBS")
|
||||||
|
icon_result=":obsstudio:"
|
||||||
|
;;
|
||||||
|
"OmniFocus")
|
||||||
|
icon_result=":omni_focus:"
|
||||||
|
;;
|
||||||
|
"1Password")
|
||||||
|
icon_result=":one_password:"
|
||||||
|
;;
|
||||||
|
"Open Video Downloader")
|
||||||
|
icon_result=":open_video_downloader:"
|
||||||
|
;;
|
||||||
|
"ChatGPT")
|
||||||
|
icon_result=":openai:"
|
||||||
|
;;
|
||||||
|
"OpenAI Translator")
|
||||||
|
icon_result=":openai_translator:"
|
||||||
|
;;
|
||||||
|
"OpenVPN Connect")
|
||||||
|
icon_result=":openvpn_connect:"
|
||||||
|
;;
|
||||||
|
"Opera")
|
||||||
|
icon_result=":opera:"
|
||||||
|
;;
|
||||||
|
"OrbStack")
|
||||||
|
icon_result=":orbstack:"
|
||||||
|
;;
|
||||||
|
"OrcaSlicer")
|
||||||
|
icon_result=":orcaslicer:"
|
||||||
|
;;
|
||||||
|
"Orion" | "Orion RC")
|
||||||
|
icon_result=":orion:"
|
||||||
|
;;
|
||||||
|
"Overleaf" | "ShareLaTeX")
|
||||||
|
icon_result=":overleaf:"
|
||||||
|
;;
|
||||||
|
"Pages" | "Pages 文稿")
|
||||||
|
icon_result=":pages:"
|
||||||
|
;;
|
||||||
|
"Parallels Desktop")
|
||||||
|
icon_result=":parallels:"
|
||||||
|
;;
|
||||||
|
"Parsec")
|
||||||
|
icon_result=":parsec:"
|
||||||
|
;;
|
||||||
|
"Passepartout")
|
||||||
|
icon_result=":passepartout:"
|
||||||
|
;;
|
||||||
|
"Passwords" | "Passwörter")
|
||||||
|
icon_result=":passwords:"
|
||||||
|
;;
|
||||||
|
"PDF Expert")
|
||||||
|
icon_result=":pdf_expert:"
|
||||||
|
;;
|
||||||
|
"Pearcleaner")
|
||||||
|
icon_result=":pearcleaner:"
|
||||||
|
;;
|
||||||
|
"Perplexity" | "Perplexity AI")
|
||||||
|
icon_result=":perplexity:"
|
||||||
|
;;
|
||||||
|
"Phoenix Slides")
|
||||||
|
icon_result=":phoenix_slides:"
|
||||||
|
;;
|
||||||
|
"Photos" | "Fotos")
|
||||||
|
icon_result=":photos:"
|
||||||
|
;;
|
||||||
|
"Adobe Photoshop"*)
|
||||||
|
icon_result=":photoshop:"
|
||||||
|
;;
|
||||||
|
"PhpStorm")
|
||||||
|
icon_result=":php_storm:"
|
||||||
|
;;
|
||||||
|
"Pi-hole Remote")
|
||||||
|
icon_result=":pihole:"
|
||||||
|
;;
|
||||||
|
"Pine")
|
||||||
|
icon_result=":pine:"
|
||||||
|
;;
|
||||||
|
"Plex")
|
||||||
|
icon_result=":plex:"
|
||||||
|
;;
|
||||||
|
"Plexamp")
|
||||||
|
icon_result=":plexamp:"
|
||||||
|
;;
|
||||||
|
"Podcasts" | "播客")
|
||||||
|
icon_result=":podcasts:"
|
||||||
|
;;
|
||||||
|
"PomoDone App")
|
||||||
|
icon_result=":pomodone:"
|
||||||
|
;;
|
||||||
|
"Postman")
|
||||||
|
icon_result=":postman:"
|
||||||
|
;;
|
||||||
|
"Premiere" | "Adobe Premiere" | "Adobe Premiere Pro 2024")
|
||||||
|
icon_result=":premiere:"
|
||||||
|
;;
|
||||||
|
"Preview" | "预览" | "Skim" | "zathura" | "Aperçu" | "プレビュー" | "Vorschau")
|
||||||
|
icon_result=":preview:"
|
||||||
|
;;
|
||||||
|
"Proton Mail" | "Proton Mail Bridge")
|
||||||
|
icon_result=":proton_mail:"
|
||||||
|
;;
|
||||||
|
"Proton VPN" | "ProtonVPN")
|
||||||
|
icon_result=":proton_vpn:"
|
||||||
|
;;
|
||||||
|
"PrusaSlicer" | "SuperSlicer")
|
||||||
|
icon_result=":prusaslicer:"
|
||||||
|
;;
|
||||||
|
"PyCharm")
|
||||||
|
icon_result=":pycharm:"
|
||||||
|
;;
|
||||||
|
"qBittorrent")
|
||||||
|
icon_result=":qbittorrent:"
|
||||||
|
;;
|
||||||
|
"QLMarkdown")
|
||||||
|
icon_result=":qlmarkdown:"
|
||||||
|
;;
|
||||||
|
"QQ")
|
||||||
|
icon_result=":qq:"
|
||||||
|
;;
|
||||||
|
"QQ音乐" | "QQMusic")
|
||||||
|
icon_result=":qqmusic:"
|
||||||
|
;;
|
||||||
|
"Quantumult X")
|
||||||
|
icon_result=":quantumult_x:"
|
||||||
|
;;
|
||||||
|
"Quip")
|
||||||
|
icon_result=":quip:"
|
||||||
|
;;
|
||||||
|
"qutebrowser")
|
||||||
|
icon_result=":qute_browser:"
|
||||||
|
;;
|
||||||
|
"Raindrop.io")
|
||||||
|
icon_result=":raindrop_io:"
|
||||||
|
;;
|
||||||
|
"Raspberry Pi Imager" | "Raspberry Pi Connect")
|
||||||
|
icon_result=":raspberry_pi:"
|
||||||
|
;;
|
||||||
|
"Raycast")
|
||||||
|
icon_result=":raycast:"
|
||||||
|
;;
|
||||||
|
"Reeder")
|
||||||
|
icon_result=":reeder5:"
|
||||||
|
;;
|
||||||
|
"rekordbox")
|
||||||
|
icon_result=":rekordbox:"
|
||||||
|
;;
|
||||||
|
"Reminders" | "提醒事项" | "Rappels" | "リマインダー" | "Erinnerungen")
|
||||||
|
icon_result=":reminders:"
|
||||||
|
;;
|
||||||
|
"Replit")
|
||||||
|
icon_result=":replit:"
|
||||||
|
;;
|
||||||
|
"Repo Prompt")
|
||||||
|
icon_result=":repo_prompt:"
|
||||||
|
;;
|
||||||
|
"Rider" | "JetBrains Rider")
|
||||||
|
icon_result=":rider:"
|
||||||
|
;;
|
||||||
|
"Rio")
|
||||||
|
icon_result=":rio:"
|
||||||
|
;;
|
||||||
|
"Royal TSX")
|
||||||
|
icon_result=":royaltsx:"
|
||||||
|
;;
|
||||||
|
"RustDesk")
|
||||||
|
icon_result=":rustdesk:"
|
||||||
|
;;
|
||||||
|
"Safari" | "Safari浏览器" | "Safari Technology Preview")
|
||||||
|
icon_result=":safari:"
|
||||||
|
;;
|
||||||
|
"Scribus")
|
||||||
|
icon_result=":scribus:"
|
||||||
|
;;
|
||||||
|
"Seafile")
|
||||||
|
icon_result=":seafile:"
|
||||||
|
;;
|
||||||
|
"Sequel Ace")
|
||||||
|
icon_result=":sequel_ace:"
|
||||||
|
;;
|
||||||
|
"Sequel Pro")
|
||||||
|
icon_result=":sequel_pro:"
|
||||||
|
;;
|
||||||
|
"Session")
|
||||||
|
icon_result=":session:"
|
||||||
|
;;
|
||||||
|
"Setapp")
|
||||||
|
icon_result=":setapp:"
|
||||||
|
;;
|
||||||
|
"SF Symbols" | "SF Symbole" | "SF-Symbole")
|
||||||
|
icon_result=":sf_symbols:"
|
||||||
|
;;
|
||||||
|
"Shortcuts")
|
||||||
|
icon_result=":shortcuts:"
|
||||||
|
;;
|
||||||
|
"Signal")
|
||||||
|
icon_result=":signal:"
|
||||||
|
;;
|
||||||
|
"sioyek")
|
||||||
|
icon_result=":sioyek:"
|
||||||
|
;;
|
||||||
|
"Sketch")
|
||||||
|
icon_result=":sketch:"
|
||||||
|
;;
|
||||||
|
"Skype")
|
||||||
|
icon_result=":skype:"
|
||||||
|
;;
|
||||||
|
"Slack")
|
||||||
|
icon_result=":slack:"
|
||||||
|
;;
|
||||||
|
"Spark Desktop")
|
||||||
|
icon_result=":spark:"
|
||||||
|
;;
|
||||||
|
"Spotify")
|
||||||
|
icon_result=":spotify:"
|
||||||
|
;;
|
||||||
|
"Spotlight")
|
||||||
|
icon_result=":spotlight:"
|
||||||
|
;;
|
||||||
|
"Steam" | "Steam Helper")
|
||||||
|
icon_result=":steam:"
|
||||||
|
;;
|
||||||
|
"Studio 3T")
|
||||||
|
icon_result=":studio_3t:"
|
||||||
|
;;
|
||||||
|
"Sublime Text")
|
||||||
|
icon_result=":sublime_text:"
|
||||||
|
;;
|
||||||
|
"Summoners War")
|
||||||
|
icon_result=":summoners_war:"
|
||||||
|
;;
|
||||||
|
"superProductivity")
|
||||||
|
icon_result=":superproductivity:"
|
||||||
|
;;
|
||||||
|
"Surfshark")
|
||||||
|
icon_result=":surfshark:"
|
||||||
|
;;
|
||||||
|
"T3 Chat")
|
||||||
|
icon_result=":t3chat:"
|
||||||
|
;;
|
||||||
|
"Tabby")
|
||||||
|
icon_result=":tabby:"
|
||||||
|
;;
|
||||||
|
"TablePlus")
|
||||||
|
icon_result=":tableplus:"
|
||||||
|
;;
|
||||||
|
"Tana")
|
||||||
|
icon_result=":tana:"
|
||||||
|
;;
|
||||||
|
"TeamSpeak 3")
|
||||||
|
icon_result=":team_speak:"
|
||||||
|
;;
|
||||||
|
"Telegram")
|
||||||
|
icon_result=":telegram:"
|
||||||
|
;;
|
||||||
|
"Terminal" | "终端" | "ターミナル")
|
||||||
|
icon_result=":terminal:"
|
||||||
|
;;
|
||||||
|
"Termius")
|
||||||
|
icon_result=":termius:"
|
||||||
|
;;
|
||||||
|
"Typora")
|
||||||
|
icon_result=":text:"
|
||||||
|
;;
|
||||||
|
"TextEdit")
|
||||||
|
icon_result=":textedit:"
|
||||||
|
;;
|
||||||
|
"Microsoft To Do" | "Things")
|
||||||
|
icon_result=":things:"
|
||||||
|
;;
|
||||||
|
"Thunderbird" | "Thunderbird Daily")
|
||||||
|
icon_result=":thunderbird:"
|
||||||
|
;;
|
||||||
|
"TickTick")
|
||||||
|
icon_result=":tick_tick:"
|
||||||
|
;;
|
||||||
|
"TIDAL")
|
||||||
|
icon_result=":tidal:"
|
||||||
|
;;
|
||||||
|
"Tiny RDM")
|
||||||
|
icon_result=":tinyrdm:"
|
||||||
|
;;
|
||||||
|
"Todoist")
|
||||||
|
icon_result=":todoist:"
|
||||||
|
;;
|
||||||
|
"Toggl Track")
|
||||||
|
icon_result=":toggl_track:"
|
||||||
|
;;
|
||||||
|
"Tor Browser")
|
||||||
|
icon_result=":tor_browser:"
|
||||||
|
;;
|
||||||
|
"Tower")
|
||||||
|
icon_result=":tower:"
|
||||||
|
;;
|
||||||
|
"TradingView")
|
||||||
|
icon_result=":trading_view:"
|
||||||
|
;;
|
||||||
|
"Transmit")
|
||||||
|
icon_result=":transmit:"
|
||||||
|
;;
|
||||||
|
"Trello")
|
||||||
|
icon_result=":trello:"
|
||||||
|
;;
|
||||||
|
"Tweetbot" | "Twitter")
|
||||||
|
icon_result=":twitter:"
|
||||||
|
;;
|
||||||
|
"UTM")
|
||||||
|
icon_result=":utm:"
|
||||||
|
;;
|
||||||
|
"VeraCrypt")
|
||||||
|
icon_result=":veracrypt:"
|
||||||
|
;;
|
||||||
|
"MacVim" | "Vim" | "VimR")
|
||||||
|
icon_result=":vim:"
|
||||||
|
;;
|
||||||
|
"Vivaldi")
|
||||||
|
icon_result=":vivaldi:"
|
||||||
|
;;
|
||||||
|
"VLC")
|
||||||
|
icon_result=":vlc:"
|
||||||
|
;;
|
||||||
|
"VMware Fusion")
|
||||||
|
icon_result=":vmware_fusion:"
|
||||||
|
;;
|
||||||
|
"Vorta")
|
||||||
|
icon_result=":vorta:"
|
||||||
|
;;
|
||||||
|
"VSCodium")
|
||||||
|
icon_result=":vscodium:"
|
||||||
|
;;
|
||||||
|
"Warp")
|
||||||
|
icon_result=":warp:"
|
||||||
|
;;
|
||||||
|
"Weather" | "Wetter")
|
||||||
|
icon_result=":weather:"
|
||||||
|
;;
|
||||||
|
"WebStorm")
|
||||||
|
icon_result=":web_storm:"
|
||||||
|
;;
|
||||||
|
"Webull Desktop")
|
||||||
|
icon_result=":webull:"
|
||||||
|
;;
|
||||||
|
"微信" | "WeChat")
|
||||||
|
icon_result=":wechat:"
|
||||||
|
;;
|
||||||
|
"企业微信" | "WeCom")
|
||||||
|
icon_result=":wecom:"
|
||||||
|
;;
|
||||||
|
"WezTerm" | "wezterm-gui")
|
||||||
|
icon_result=":wezterm:"
|
||||||
|
;;
|
||||||
|
"WhatsApp" | "WhatsApp")
|
||||||
|
icon_result=":whats_app:"
|
||||||
|
;;
|
||||||
|
"Windows App")
|
||||||
|
icon_result=":windows_app:"
|
||||||
|
;;
|
||||||
|
"WireGuard")
|
||||||
|
icon_result=":wireguard:"
|
||||||
|
;;
|
||||||
|
"Xcode")
|
||||||
|
icon_result=":xcode:"
|
||||||
|
;;
|
||||||
|
"Yandex Browser" | "Yandex Browser" | "Yandex")
|
||||||
|
icon_result=":yandex_bower:"
|
||||||
|
;;
|
||||||
|
"Yandex Music")
|
||||||
|
icon_result=":yandex_music:"
|
||||||
|
;;
|
||||||
|
"Yazi" | "yazi")
|
||||||
|
icon_result=":yazi:"
|
||||||
|
;;
|
||||||
|
"YouTube")
|
||||||
|
icon_result=":youtube:"
|
||||||
|
;;
|
||||||
|
"YouTube Music")
|
||||||
|
icon_result=":youtube_music:"
|
||||||
|
;;
|
||||||
|
"Yuque" | "语雀")
|
||||||
|
icon_result=":yuque:"
|
||||||
|
;;
|
||||||
|
"Zed")
|
||||||
|
icon_result=":zed:"
|
||||||
|
;;
|
||||||
|
"Zen" | "Zen Browser")
|
||||||
|
icon_result=":zen_browser:"
|
||||||
|
;;
|
||||||
|
"Zeplin")
|
||||||
|
icon_result=":zeplin:"
|
||||||
|
;;
|
||||||
|
"zoom.us")
|
||||||
|
icon_result=":zoom:"
|
||||||
|
;;
|
||||||
|
"Zotero")
|
||||||
|
icon_result=":zotero:"
|
||||||
|
;;
|
||||||
|
"Zulip")
|
||||||
|
icon_result=":zulip:"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
icon_result=":default:"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
### END-OF-ICON-MAP
|
||||||
50
.config/sketchybar/helpers/icons.sh
Executable file
50
.config/sketchybar/helpers/icons.sh
Executable file
|
|
@ -0,0 +1,50 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# General Icons
|
||||||
|
LOADING=
|
||||||
|
APPLE=
|
||||||
|
PREFERENCES=
|
||||||
|
ACTIVITY=
|
||||||
|
LOCK=
|
||||||
|
BELL=
|
||||||
|
BELL_DOT=
|
||||||
|
|
||||||
|
# Git Icons
|
||||||
|
GIT_ISSUE=
|
||||||
|
GIT_DISCUSSION=
|
||||||
|
GIT_PULL_REQUEST=
|
||||||
|
GIT_COMMIT=
|
||||||
|
GIT_INDICATOR=
|
||||||
|
|
||||||
|
# Spotify Icons
|
||||||
|
SPOTIFY_BACK=
|
||||||
|
SPOTIFY_PLAY_PAUSE=
|
||||||
|
SPOTIFY_NEXT=
|
||||||
|
SPOTIFY_SHUFFLE=
|
||||||
|
SPOTIFY_REPEAT=
|
||||||
|
|
||||||
|
# Yabai Icons
|
||||||
|
YABAI_STACK=
|
||||||
|
YABAI_FULLSCREEN_ZOOM=
|
||||||
|
YABAI_PARENT_ZOOM=
|
||||||
|
YABAI_FLOAT=
|
||||||
|
YABAI_GRID=
|
||||||
|
|
||||||
|
# Battery Icons
|
||||||
|
BATTERY_100=
|
||||||
|
BATTERY_75=
|
||||||
|
BATTERY_50=
|
||||||
|
BATTERY_25=
|
||||||
|
BATTERY_0=
|
||||||
|
BATTERY_CHARGING=
|
||||||
|
|
||||||
|
# Volume Icons
|
||||||
|
VOLUME_100=
|
||||||
|
VOLUME_66=
|
||||||
|
VOLUME_33=
|
||||||
|
VOLUME_10=
|
||||||
|
VOLUME_0=
|
||||||
|
|
||||||
|
# WiFi Icons
|
||||||
|
WIFI=
|
||||||
|
WIFI_OFF=
|
||||||
BIN
.config/sketchybar/helpers/sketchybar-app-font.eot
Normal file
BIN
.config/sketchybar/helpers/sketchybar-app-font.eot
Normal file
Binary file not shown.
547
.config/sketchybar/helpers/sketchybar-app-font.json
Normal file
547
.config/sketchybar/helpers/sketchybar-app-font.json
Normal file
File diff suppressed because one or more lines are too long
1134
.config/sketchybar/helpers/sketchybar-app-font.svg
Normal file
1134
.config/sketchybar/helpers/sketchybar-app-font.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 1.2 MiB |
257
.config/sketchybar/helpers/sketchybar-app-font.symbol.svg
Normal file
257
.config/sketchybar/helpers/sketchybar-app-font.symbol.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 517 KiB |
BIN
.config/sketchybar/helpers/sketchybar-app-font.ttf
Normal file
BIN
.config/sketchybar/helpers/sketchybar-app-font.ttf
Normal file
Binary file not shown.
BIN
.config/sketchybar/helpers/sketchybar-app-font.woff
Normal file
BIN
.config/sketchybar/helpers/sketchybar-app-font.woff
Normal file
Binary file not shown.
BIN
.config/sketchybar/helpers/sketchybar-app-font.woff2
Normal file
BIN
.config/sketchybar/helpers/sketchybar-app-font.woff2
Normal file
Binary file not shown.
50
.config/sketchybar/icons.sh
Executable file
50
.config/sketchybar/icons.sh
Executable file
|
|
@ -0,0 +1,50 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# General Icons
|
||||||
|
LOADING=
|
||||||
|
APPLE=
|
||||||
|
PREFERENCES=
|
||||||
|
ACTIVITY=
|
||||||
|
LOCK=
|
||||||
|
BELL=
|
||||||
|
BELL_DOT=
|
||||||
|
|
||||||
|
# Git Icons
|
||||||
|
GIT_ISSUE=
|
||||||
|
GIT_DISCUSSION=
|
||||||
|
GIT_PULL_REQUEST=
|
||||||
|
GIT_COMMIT=
|
||||||
|
GIT_INDICATOR=
|
||||||
|
|
||||||
|
# Spotify Icons
|
||||||
|
SPOTIFY_BACK=
|
||||||
|
SPOTIFY_PLAY_PAUSE=
|
||||||
|
SPOTIFY_NEXT=
|
||||||
|
SPOTIFY_SHUFFLE=
|
||||||
|
SPOTIFY_REPEAT=
|
||||||
|
|
||||||
|
# Yabai Icons
|
||||||
|
YABAI_STACK=
|
||||||
|
YABAI_FULLSCREEN_ZOOM=
|
||||||
|
YABAI_PARENT_ZOOM=
|
||||||
|
YABAI_FLOAT=
|
||||||
|
YABAI_GRID=
|
||||||
|
|
||||||
|
# Battery Icons
|
||||||
|
BATTERY_100=
|
||||||
|
BATTERY_75=
|
||||||
|
BATTERY_50=
|
||||||
|
BATTERY_25=
|
||||||
|
BATTERY_0=
|
||||||
|
BATTERY_CHARGING=
|
||||||
|
|
||||||
|
# Volume Icons
|
||||||
|
VOLUME_100=
|
||||||
|
VOLUME_66=
|
||||||
|
VOLUME_33=
|
||||||
|
VOLUME_10=
|
||||||
|
VOLUME_0=
|
||||||
|
|
||||||
|
# WiFi Icons
|
||||||
|
WIFI=
|
||||||
|
WIFI_OFF=
|
||||||
107
.config/sketchybar/items/aerospace.sh
Executable file
107
.config/sketchybar/items/aerospace.sh
Executable file
|
|
@ -0,0 +1,107 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/sketchybar}"
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
# ─── Fast path: workspace switch (color-only update) ─────────────────────────
|
||||||
|
# When called from exec-on-workspace-change, FOCUSED_WORKSPACE and
|
||||||
|
# PREV_WORKSPACE are passed as env vars. We can swap highlight colors
|
||||||
|
# with ZERO aerospace CLI calls — just one sketchybar call (~10ms).
|
||||||
|
if [ -n "$FOCUSED_WORKSPACE" ] && [ -n "$PREV_WORKSPACE" ] \
|
||||||
|
&& [ "$FOCUSED_WORKSPACE" != "$PREV_WORKSPACE" ]; then
|
||||||
|
sketchybar --animate sin 8 \
|
||||||
|
--set aerospace.workspace.$PREV_WORKSPACE \
|
||||||
|
background.color=$BACKGROUND_2 \
|
||||||
|
icon.color=$WHITE \
|
||||||
|
label.color=$WHITE \
|
||||||
|
--set aerospace.workspace.$FOCUSED_WORKSPACE \
|
||||||
|
background.color=$GREEN \
|
||||||
|
icon.color=$BLACK \
|
||||||
|
label.color=$BLACK
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ─── Full path: initial load / icon refresh ──────────────────────────────────
|
||||||
|
# Only source the 986-line icon map when we actually need it.
|
||||||
|
source "$CONFIG_DIR/helpers/icon_map.sh"
|
||||||
|
|
||||||
|
# Use env var if available, otherwise query (1 call)
|
||||||
|
CURRENT_WORKSPACE="${FOCUSED_WORKSPACE:-$(aerospace list-workspaces --focused 2>/dev/null)}" || exit
|
||||||
|
[ -z "$CURRENT_WORKSPACE" ] && exit
|
||||||
|
|
||||||
|
# ONE aerospace call gets every window across all workspaces
|
||||||
|
ALL_WINDOWS=$(aerospace list-windows --all --format '%{workspace}|%{app-name}' 2>/dev/null)
|
||||||
|
|
||||||
|
# Parse into per-workspace app lists — pure bash, no subprocesses
|
||||||
|
# (bash 3.2 compatible: no associative arrays)
|
||||||
|
WS_1_APPS="" WS_2_APPS="" WS_3_APPS="" WS_4_APPS="" WS_5_APPS=""
|
||||||
|
WS_6_APPS="" WS_7_APPS="" WS_8_APPS="" WS_9_APPS=""
|
||||||
|
WS_1_ACT=0 WS_2_ACT=0 WS_3_ACT=0 WS_4_ACT=0 WS_5_ACT=0
|
||||||
|
WS_6_ACT=0 WS_7_ACT=0 WS_8_ACT=0 WS_9_ACT=0
|
||||||
|
|
||||||
|
while IFS='|' read -r ws app; do
|
||||||
|
[ -z "$ws" ] && continue
|
||||||
|
case "$ws" in
|
||||||
|
1) WS_1_ACT=1; WS_1_APPS="${WS_1_APPS:+${WS_1_APPS}|}$app" ;;
|
||||||
|
2) WS_2_ACT=1; WS_2_APPS="${WS_2_APPS:+${WS_2_APPS}|}$app" ;;
|
||||||
|
3) WS_3_ACT=1; WS_3_APPS="${WS_3_APPS:+${WS_3_APPS}|}$app" ;;
|
||||||
|
4) WS_4_ACT=1; WS_4_APPS="${WS_4_APPS:+${WS_4_APPS}|}$app" ;;
|
||||||
|
5) WS_5_ACT=1; WS_5_APPS="${WS_5_APPS:+${WS_5_APPS}|}$app" ;;
|
||||||
|
6) WS_6_ACT=1; WS_6_APPS="${WS_6_APPS:+${WS_6_APPS}|}$app" ;;
|
||||||
|
7) WS_7_ACT=1; WS_7_APPS="${WS_7_APPS:+${WS_7_APPS}|}$app" ;;
|
||||||
|
8) WS_8_ACT=1; WS_8_APPS="${WS_8_APPS:+${WS_8_APPS}|}$app" ;;
|
||||||
|
9) WS_9_ACT=1; WS_9_APPS="${WS_9_APPS:+${WS_9_APPS}|}$app" ;;
|
||||||
|
esac
|
||||||
|
done <<< "$ALL_WINDOWS"
|
||||||
|
|
||||||
|
# Always show the focused workspace even if empty
|
||||||
|
case "$CURRENT_WORKSPACE" in
|
||||||
|
[1-9]) eval "WS_${CURRENT_WORKSPACE}_ACT=1" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Build ONE sketchybar call for all 9 workspaces
|
||||||
|
args=(--animate sin 8)
|
||||||
|
|
||||||
|
for i in {1..9}; do
|
||||||
|
eval "IS_ACTIVE=\$WS_${i}_ACT"
|
||||||
|
|
||||||
|
if [ "$IS_ACTIVE" = "1" ]; then
|
||||||
|
eval "APPS_STR=\$WS_${i}_APPS"
|
||||||
|
|
||||||
|
# Build icon strip (up to 3 app icons)
|
||||||
|
ICON_STRIP=""
|
||||||
|
APP_COUNT=0
|
||||||
|
OLD_IFS="$IFS"; IFS='|'
|
||||||
|
for APP in $APPS_STR; do
|
||||||
|
[ -z "$APP" ] && continue
|
||||||
|
APP_COUNT=$((APP_COUNT + 1))
|
||||||
|
[ $APP_COUNT -gt 3 ] && break
|
||||||
|
__icon_map "$APP"
|
||||||
|
if [ -n "$icon_result" ] && [ "$icon_result" != ":default:" ]; then
|
||||||
|
ICON_STRIP="${ICON_STRIP}${icon_result} "
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$OLD_IFS"
|
||||||
|
|
||||||
|
ICON_STRIP="${ICON_STRIP% }"
|
||||||
|
[ -z "$ICON_STRIP" ] && ICON_STRIP="$i"
|
||||||
|
|
||||||
|
if [ "$i" = "$CURRENT_WORKSPACE" ]; then
|
||||||
|
BG_COLOR=$GREEN; ICON_COLOR=$BLACK; TEXT_COLOR=$BLACK
|
||||||
|
else
|
||||||
|
BG_COLOR=$BACKGROUND_2; ICON_COLOR=$WHITE; TEXT_COLOR=$WHITE
|
||||||
|
fi
|
||||||
|
|
||||||
|
args+=(
|
||||||
|
--set aerospace.workspace.$i drawing=on
|
||||||
|
--set aerospace.workspace.$i icon="$ICON_STRIP"
|
||||||
|
--set aerospace.workspace.$i icon.color="$ICON_COLOR"
|
||||||
|
--set aerospace.workspace.$i label="$i"
|
||||||
|
--set aerospace.workspace.$i label.color="$TEXT_COLOR"
|
||||||
|
--set aerospace.workspace.$i background.color="$BG_COLOR"
|
||||||
|
)
|
||||||
|
else
|
||||||
|
args+=(--set aerospace.workspace.$i drawing=off)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
sketchybar "${args[@]}" 2>/dev/null
|
||||||
62
.config/sketchybar/items/apple.sh
Executable file
62
.config/sketchybar/items/apple.sh
Executable file
|
|
@ -0,0 +1,62 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
source "$CONFIG_DIR/icons.sh"
|
||||||
|
|
||||||
|
POPUP_OFF="sketchybar --set apple.icon popup.drawing=off"
|
||||||
|
POPUP_CLICK_SCRIPT="sketchybar --set \$NAME popup.drawing=toggle"
|
||||||
|
|
||||||
|
# Apple icon (far left) - opens popup menu on click
|
||||||
|
apple_icon=(
|
||||||
|
icon=""
|
||||||
|
icon.drawing=on
|
||||||
|
icon.font="SF Pro:Black:28.0"
|
||||||
|
icon.color=$GREEN
|
||||||
|
label.drawing=off
|
||||||
|
background.drawing=off
|
||||||
|
padding_right=4
|
||||||
|
padding_left=10
|
||||||
|
click_script="$POPUP_CLICK_SCRIPT"
|
||||||
|
)
|
||||||
|
|
||||||
|
apple_logo=(
|
||||||
|
icon.drawing=off
|
||||||
|
label.drawing=off
|
||||||
|
padding_right=0
|
||||||
|
padding_left=0
|
||||||
|
width=0
|
||||||
|
)
|
||||||
|
|
||||||
|
apple_prefs=(
|
||||||
|
icon="⚙️"
|
||||||
|
label="System Preferences"
|
||||||
|
click_script="open 'x-apple.systempreferences:'; $POPUP_OFF"
|
||||||
|
)
|
||||||
|
|
||||||
|
apple_activity=(
|
||||||
|
icon="📊"
|
||||||
|
label="Activity Monitor"
|
||||||
|
click_script="open -a 'Activity Monitor'; $POPUP_OFF"
|
||||||
|
)
|
||||||
|
|
||||||
|
apple_lock=(
|
||||||
|
icon="🔒"
|
||||||
|
label="Lock Screen"
|
||||||
|
click_script="open -a ScreenSaverEngine; $POPUP_OFF"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add apple icon first (far left)
|
||||||
|
sketchybar --add item apple.icon left \
|
||||||
|
--set apple.icon "${apple_icon[@]}"
|
||||||
|
|
||||||
|
sketchybar --add item apple.logo left \
|
||||||
|
--set apple.logo "${apple_logo[@]}" \
|
||||||
|
\
|
||||||
|
--add item apple.prefs popup.apple.icon \
|
||||||
|
--set apple.prefs "${apple_prefs[@]}" \
|
||||||
|
\
|
||||||
|
--add item apple.activity popup.apple.icon \
|
||||||
|
--set apple.activity "${apple_activity[@]}" \
|
||||||
|
\
|
||||||
|
--add item apple.lock popup.apple.icon \
|
||||||
|
--set apple.lock "${apple_lock[@]}"
|
||||||
28
.config/sketchybar/items/battery.sh
Executable file
28
.config/sketchybar/items/battery.sh
Executable file
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
source "$CONFIG_DIR/icons.sh"
|
||||||
|
|
||||||
|
battery=(
|
||||||
|
script="$PLUGIN_DIR/battery.sh"
|
||||||
|
#icon.font="SF Pro:Bold:20.0"
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:20.0"
|
||||||
|
icon.color=$GREEN
|
||||||
|
icon.padding_left=4
|
||||||
|
icon.padding_right=4
|
||||||
|
label.font="0xProto Nerd Font Mono:Bold:15.0"
|
||||||
|
label.color=$WHITE
|
||||||
|
label.padding_left=4
|
||||||
|
label.padding_right=8
|
||||||
|
background.color=$BACKGROUND_2
|
||||||
|
background.corner_radius=8
|
||||||
|
background.height=28
|
||||||
|
background.drawing=on
|
||||||
|
padding_left=4
|
||||||
|
padding_right=4
|
||||||
|
update_freq=120
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add item battery right \
|
||||||
|
--set battery "${battery[@]}" \
|
||||||
|
--subscribe battery system_woke power_source_change
|
||||||
11
.config/sketchybar/items/clock.sh
Executable file
11
.config/sketchybar/items/clock.sh
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
sketchybar --add item clock right \
|
||||||
|
--set clock update_freq=10 \
|
||||||
|
--set clock icon= \
|
||||||
|
--set clock icon.color=$ICON_COLOR \
|
||||||
|
--set clock label.color=$LABEL_COLOR \
|
||||||
|
--set clock script="$PLUGIN_DIR/clock.sh" \
|
||||||
|
--set clock click_script="$PLUGIN_DIR/zen.sh"
|
||||||
46
.config/sketchybar/items/menu_items.sh
Executable file
46
.config/sketchybar/items/menu_items.sh
Executable file
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
# Control Center style menu items
|
||||||
|
# These will be positioned to the right of the workspaces
|
||||||
|
|
||||||
|
# Bluetooth
|
||||||
|
bluetooth=(
|
||||||
|
script="$PLUGIN_DIR/bluetooth.sh"
|
||||||
|
icon=""
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:18.0"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
label.drawing=off
|
||||||
|
update_freq=10
|
||||||
|
click_script="open 'x-apple.systempreferences:com.apple.BluetoothSettings'"
|
||||||
|
)
|
||||||
|
|
||||||
|
# AirDrop
|
||||||
|
airdrop=(
|
||||||
|
icon=""
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:18.0"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
label.drawing=off
|
||||||
|
click_script="open 'x-apple.systempreferences:com.apple.AirDrop-Handoff-Settings'"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Focus/Do Not Disturb
|
||||||
|
focus=(
|
||||||
|
script="$PLUGIN_DIR/focus.sh"
|
||||||
|
icon=""
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:18.0"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
label.drawing=off
|
||||||
|
update_freq=30
|
||||||
|
click_script="shortcuts run 'Toggle Focus'"
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add item bluetooth right \
|
||||||
|
--set bluetooth "${bluetooth[@]}" \
|
||||||
|
\
|
||||||
|
--add item airdrop right \
|
||||||
|
--set airdrop "${airdrop[@]}" \
|
||||||
|
\
|
||||||
|
--add item focus right \
|
||||||
|
--set focus "${focus[@]}"
|
||||||
24
.config/sketchybar/items/mic.old
Executable file
24
.config/sketchybar/items/mic.old
Executable file
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
mic=(
|
||||||
|
script="$PLUGIN_DIR/mic/mic.sh"
|
||||||
|
click_script="$PLUGIN_DIR/mic/mic_click.sh"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
icon.padding_right=4
|
||||||
|
icon.padding_left=4
|
||||||
|
label.padding_right=4
|
||||||
|
label.padding_left=4
|
||||||
|
background.color=$BACKGROUND_2
|
||||||
|
background.corner_radius=8
|
||||||
|
background.height=28
|
||||||
|
background.drawing=on
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:30.0"
|
||||||
|
label.color=0xffffffff
|
||||||
|
label.font="0xProto Nerd Font Mono:Bold:15.0"
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add item mic right \
|
||||||
|
--set mic "${mic[@]}" \
|
||||||
|
--subscribe mic volume_change
|
||||||
219
.config/sketchybar/items/mic.sh
Executable file
219
.config/sketchybar/items/mic.sh
Executable file
|
|
@ -0,0 +1,219 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
source "$CONFIG_DIR/icons.sh"
|
||||||
|
|
||||||
|
SPOTIFY_EVENT="com.spotify.client.PlaybackStateChanged"
|
||||||
|
POPUP_SCRIPT="sketchybar -m --set spotify.anchor popup.drawing=toggle"
|
||||||
|
|
||||||
|
spotify_anchor=(
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
click_script="$POPUP_SCRIPT"
|
||||||
|
popup.horizontal=on
|
||||||
|
popup.align=right
|
||||||
|
popup.height=150
|
||||||
|
icon=""
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:20.0"
|
||||||
|
icon.color=$GREEN
|
||||||
|
icon.padding_left=8
|
||||||
|
icon.padding_right=8
|
||||||
|
label.drawing=off
|
||||||
|
drawing=on
|
||||||
|
background.color=$BACKGROUND_2
|
||||||
|
background.corner_radius=8
|
||||||
|
background.height=28
|
||||||
|
background.drawing=on
|
||||||
|
padding_left=4
|
||||||
|
padding_right=4
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_cover=(
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
click_script="open -a 'Spotify'; $POPUP_SCRIPT"
|
||||||
|
label.drawing=off
|
||||||
|
icon.drawing=off
|
||||||
|
padding_left=12
|
||||||
|
padding_right=10
|
||||||
|
background.image.scale=0.2
|
||||||
|
background.image.drawing=on
|
||||||
|
background.drawing=on
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_title=(
|
||||||
|
icon.drawing=off
|
||||||
|
padding_left=0
|
||||||
|
padding_right=0
|
||||||
|
width=0
|
||||||
|
label.font="SF Pro:Heavy:15.0"
|
||||||
|
label.color=$WHITE
|
||||||
|
y_offset=55
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_artist=(
|
||||||
|
icon.drawing=off
|
||||||
|
y_offset=30
|
||||||
|
padding_left=0
|
||||||
|
padding_right=0
|
||||||
|
width=0
|
||||||
|
label.color=$GREY
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_album=(
|
||||||
|
icon.drawing=off
|
||||||
|
padding_left=0
|
||||||
|
padding_right=0
|
||||||
|
y_offset=15
|
||||||
|
width=0
|
||||||
|
label.color=$GREY
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_state=(
|
||||||
|
icon.drawing=on
|
||||||
|
icon.font="SF Pro:Light Italic:10.0"
|
||||||
|
icon.width=45
|
||||||
|
icon="00:00"
|
||||||
|
icon.color=$GREY
|
||||||
|
label.drawing=on
|
||||||
|
label.font="SF Pro:Light Italic:10.0"
|
||||||
|
label.width=45
|
||||||
|
label="00:00"
|
||||||
|
label.color=$GREY
|
||||||
|
padding_left=0
|
||||||
|
padding_right=0
|
||||||
|
y_offset=-15
|
||||||
|
width=0
|
||||||
|
slider.background.height=6
|
||||||
|
slider.background.corner_radius=1
|
||||||
|
slider.background.color=$GREY
|
||||||
|
slider.highlight_color=$GREEN
|
||||||
|
slider.percentage=40
|
||||||
|
slider.width=115
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
update_freq=1
|
||||||
|
updates=when_shown
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_shuffle=(
|
||||||
|
icon=$SPOTIFY_SHUFFLE
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
icon.padding_left=5
|
||||||
|
icon.padding_right=5
|
||||||
|
icon.color=0xff000000
|
||||||
|
icon.highlight_color=$GREY
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_back=(
|
||||||
|
icon=$SPOTIFY_BACK
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
icon.padding_left=5
|
||||||
|
icon.padding_right=5
|
||||||
|
icon.color=0xff000000
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
label.drawing=off
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_play=(
|
||||||
|
icon=
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
background.height=40
|
||||||
|
background.corner_radius=20
|
||||||
|
width=40
|
||||||
|
align=center
|
||||||
|
background.color=$BACKGROUND_1
|
||||||
|
background.border_color=0xffffffff
|
||||||
|
background.border_width=0
|
||||||
|
background.drawing=on
|
||||||
|
icon.padding_left=4
|
||||||
|
icon.padding_right=5
|
||||||
|
icon.color=0xff000000
|
||||||
|
updates=on
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_next=(
|
||||||
|
icon=$SPOTIFY_NEXT
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
icon.padding_left=5
|
||||||
|
icon.padding_right=5
|
||||||
|
icon.color=0xff000000
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_repeat=(
|
||||||
|
icon=$SPOTIFY_REPEAT
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
icon.highlight_color=$GREY
|
||||||
|
icon.padding_left=5
|
||||||
|
icon.padding_right=10
|
||||||
|
icon.color=0xff000000
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_controls=(
|
||||||
|
background.color=$GREEN
|
||||||
|
background.corner_radius=11
|
||||||
|
background.drawing=on
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add event spotify_change $SPOTIFY_EVENT \
|
||||||
|
--add item spotify.anchor right \
|
||||||
|
--set spotify.anchor "${spotify_anchor[@]}" \
|
||||||
|
--subscribe spotify.anchor mouse.entered mouse.exited \
|
||||||
|
mouse.exited.global \
|
||||||
|
\
|
||||||
|
--add item spotify.cover popup.spotify.anchor \
|
||||||
|
--set spotify.cover "${spotify_cover[@]}" \
|
||||||
|
\
|
||||||
|
--add item spotify.title popup.spotify.anchor \
|
||||||
|
--set spotify.title "${spotify_title[@]}" \
|
||||||
|
\
|
||||||
|
--add item spotify.artist popup.spotify.anchor \
|
||||||
|
--set spotify.artist "${spotify_artist[@]}" \
|
||||||
|
\
|
||||||
|
--add item spotify.album popup.spotify.anchor \
|
||||||
|
--set spotify.album "${spotify_album[@]}" \
|
||||||
|
\
|
||||||
|
--add slider spotify.state popup.spotify.anchor \
|
||||||
|
--set spotify.state "${spotify_state[@]}" \
|
||||||
|
--subscribe spotify.state mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.shuffle popup.spotify.anchor \
|
||||||
|
--set spotify.shuffle "${spotify_shuffle[@]}" \
|
||||||
|
--subscribe spotify.shuffle mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.back popup.spotify.anchor \
|
||||||
|
--set spotify.back "${spotify_back[@]}" \
|
||||||
|
--subscribe spotify.back mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.play popup.spotify.anchor \
|
||||||
|
--set spotify.play "${spotify_play[@]}" \
|
||||||
|
--subscribe spotify.play mouse.clicked spotify_change \
|
||||||
|
\
|
||||||
|
--add item spotify.next popup.spotify.anchor \
|
||||||
|
--set spotify.next "${spotify_next[@]}" \
|
||||||
|
--subscribe spotify.next mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.repeat popup.spotify.anchor \
|
||||||
|
--set spotify.repeat "${spotify_repeat[@]}" \
|
||||||
|
--subscribe spotify.repeat mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.spacer popup.spotify.anchor \
|
||||||
|
--set spotify.spacer width=5 \
|
||||||
|
\
|
||||||
|
--add bracket spotify.controls spotify.shuffle \
|
||||||
|
spotify.back \
|
||||||
|
spotify.play \
|
||||||
|
spotify.next \
|
||||||
|
spotify.repeat \
|
||||||
|
--set spotify.controls "${spotify_controls[@]}"
|
||||||
25
.config/sketchybar/items/recording.sh
Executable file
25
.config/sketchybar/items/recording.sh
Executable file
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
recording=(
|
||||||
|
script="$PLUGIN_DIR/recording.sh"
|
||||||
|
icon=""
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:14.0"
|
||||||
|
icon.color=$RED
|
||||||
|
icon.padding_left=8
|
||||||
|
icon.padding_right=8
|
||||||
|
label.drawing=off
|
||||||
|
drawing=off
|
||||||
|
background.color=$BACKGROUND_2
|
||||||
|
background.corner_radius=8
|
||||||
|
background.height=28
|
||||||
|
background.drawing=off
|
||||||
|
padding_left=4
|
||||||
|
padding_right=4
|
||||||
|
update_freq=2
|
||||||
|
click_script="$PLUGIN_DIR/recording_click.sh"
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add item recording right \
|
||||||
|
--set recording "${recording[@]}"
|
||||||
15
.config/sketchybar/items/simple_calendar.sh
Executable file
15
.config/sketchybar/items/simple_calendar.sh
Executable file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
# Simple calendar item for far right
|
||||||
|
simple_calendar=(
|
||||||
|
icon="📅"
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:14.0"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
label.drawing=off
|
||||||
|
click_script="open -a Calendar"
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add item simple_calendar right \
|
||||||
|
--set simple_calendar "${simple_calendar[@]}"
|
||||||
219
.config/sketchybar/items/spotify.sh
Executable file
219
.config/sketchybar/items/spotify.sh
Executable file
|
|
@ -0,0 +1,219 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
source "$CONFIG_DIR/icons.sh"
|
||||||
|
|
||||||
|
SPOTIFY_EVENT="com.spotify.client.PlaybackStateChanged"
|
||||||
|
POPUP_SCRIPT="sketchybar -m --set spotify.anchor popup.drawing=toggle"
|
||||||
|
|
||||||
|
spotify_anchor=(
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
click_script="$POPUP_SCRIPT"
|
||||||
|
popup.horizontal=on
|
||||||
|
popup.align=right
|
||||||
|
popup.height=150
|
||||||
|
icon=""
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:20.0"
|
||||||
|
icon.color=$GREEN
|
||||||
|
icon.padding_left=8
|
||||||
|
icon.padding_right=8
|
||||||
|
label.drawing=off
|
||||||
|
drawing=on
|
||||||
|
background.color=$BACKGROUND_2
|
||||||
|
background.corner_radius=8
|
||||||
|
background.height=28
|
||||||
|
background.drawing=on
|
||||||
|
padding_left=4
|
||||||
|
padding_right=4
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_cover=(
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
click_script="open -a 'Spotify'; $POPUP_SCRIPT"
|
||||||
|
label.drawing=off
|
||||||
|
icon.drawing=off
|
||||||
|
padding_left=12
|
||||||
|
padding_right=10
|
||||||
|
background.image.scale=0.2
|
||||||
|
background.image.drawing=on
|
||||||
|
background.drawing=on
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_title=(
|
||||||
|
icon.drawing=off
|
||||||
|
padding_left=0
|
||||||
|
padding_right=0
|
||||||
|
width=0
|
||||||
|
label.font="SF Pro:Heavy:15.0"
|
||||||
|
label.color=$WHITE
|
||||||
|
y_offset=55
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_artist=(
|
||||||
|
icon.drawing=off
|
||||||
|
y_offset=30
|
||||||
|
padding_left=0
|
||||||
|
padding_right=0
|
||||||
|
width=0
|
||||||
|
label.color=$GREY
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_album=(
|
||||||
|
icon.drawing=off
|
||||||
|
padding_left=0
|
||||||
|
padding_right=0
|
||||||
|
y_offset=15
|
||||||
|
width=0
|
||||||
|
label.color=$GREY
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_state=(
|
||||||
|
icon.drawing=on
|
||||||
|
icon.font="SF Pro:Light Italic:10.0"
|
||||||
|
icon.width=45
|
||||||
|
icon="00:00"
|
||||||
|
icon.color=$GREY
|
||||||
|
label.drawing=on
|
||||||
|
label.font="SF Pro:Light Italic:10.0"
|
||||||
|
label.width=45
|
||||||
|
label="00:00"
|
||||||
|
label.color=$GREY
|
||||||
|
padding_left=0
|
||||||
|
padding_right=0
|
||||||
|
y_offset=-15
|
||||||
|
width=0
|
||||||
|
slider.background.height=6
|
||||||
|
slider.background.corner_radius=1
|
||||||
|
slider.background.color=$GREY
|
||||||
|
slider.highlight_color=$GREEN
|
||||||
|
slider.percentage=40
|
||||||
|
slider.width=115
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
update_freq=1
|
||||||
|
updates=when_shown
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_shuffle=(
|
||||||
|
icon=$SPOTIFY_SHUFFLE
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
icon.padding_left=5
|
||||||
|
icon.padding_right=5
|
||||||
|
icon.color=0xff000000
|
||||||
|
icon.highlight_color=$GREY
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_back=(
|
||||||
|
icon=$SPOTIFY_BACK
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
icon.padding_left=5
|
||||||
|
icon.padding_right=5
|
||||||
|
icon.color=0xff000000
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
label.drawing=off
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_play=(
|
||||||
|
icon=
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
background.height=40
|
||||||
|
background.corner_radius=20
|
||||||
|
width=40
|
||||||
|
align=center
|
||||||
|
background.color=$BACKGROUND_1
|
||||||
|
background.border_color=0xffffffff
|
||||||
|
background.border_width=0
|
||||||
|
background.drawing=on
|
||||||
|
icon.padding_left=4
|
||||||
|
icon.padding_right=5
|
||||||
|
icon.color=0xff000000
|
||||||
|
updates=on
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_next=(
|
||||||
|
icon=$SPOTIFY_NEXT
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
icon.padding_left=5
|
||||||
|
icon.padding_right=5
|
||||||
|
icon.color=0xff000000
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_repeat=(
|
||||||
|
icon=$SPOTIFY_REPEAT
|
||||||
|
icon.font="SF Pro:Regular:14.0"
|
||||||
|
icon.highlight_color=$GREY
|
||||||
|
icon.padding_left=5
|
||||||
|
icon.padding_right=10
|
||||||
|
icon.color=0xff000000
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/spotify.sh"
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
spotify_controls=(
|
||||||
|
background.color=$GREEN
|
||||||
|
background.corner_radius=11
|
||||||
|
background.drawing=on
|
||||||
|
y_offset=-45
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add event spotify_change $SPOTIFY_EVENT \
|
||||||
|
--add item spotify.anchor right \
|
||||||
|
--set spotify.anchor "${spotify_anchor[@]}" \
|
||||||
|
--subscribe spotify.anchor mouse.entered mouse.exited \
|
||||||
|
mouse.exited.global \
|
||||||
|
\
|
||||||
|
--add item spotify.cover popup.spotify.anchor \
|
||||||
|
--set spotify.cover "${spotify_cover[@]}" \
|
||||||
|
\
|
||||||
|
--add item spotify.title popup.spotify.anchor \
|
||||||
|
--set spotify.title "${spotify_title[@]}" \
|
||||||
|
\
|
||||||
|
--add item spotify.artist popup.spotify.anchor \
|
||||||
|
--set spotify.artist "${spotify_artist[@]}" \
|
||||||
|
\
|
||||||
|
--add item spotify.album popup.spotify.anchor \
|
||||||
|
--set spotify.album "${spotify_album[@]}" \
|
||||||
|
\
|
||||||
|
--add slider spotify.state popup.spotify.anchor \
|
||||||
|
--set spotify.state "${spotify_state[@]}" \
|
||||||
|
--subscribe spotify.state mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.shuffle popup.spotify.anchor \
|
||||||
|
--set spotify.shuffle "${spotify_shuffle[@]}" \
|
||||||
|
--subscribe spotify.shuffle mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.back popup.spotify.anchor \
|
||||||
|
--set spotify.back "${spotify_back[@]}" \
|
||||||
|
--subscribe spotify.back mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.play popup.spotify.anchor \
|
||||||
|
--set spotify.play "${spotify_play[@]}" \
|
||||||
|
--subscribe spotify.play mouse.clicked spotify_change \
|
||||||
|
\
|
||||||
|
--add item spotify.next popup.spotify.anchor \
|
||||||
|
--set spotify.next "${spotify_next[@]}" \
|
||||||
|
--subscribe spotify.next mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.repeat popup.spotify.anchor \
|
||||||
|
--set spotify.repeat "${spotify_repeat[@]}" \
|
||||||
|
--subscribe spotify.repeat mouse.clicked \
|
||||||
|
\
|
||||||
|
--add item spotify.spacer popup.spotify.anchor \
|
||||||
|
--set spotify.spacer width=5 \
|
||||||
|
\
|
||||||
|
--add bracket spotify.controls spotify.shuffle \
|
||||||
|
spotify.back \
|
||||||
|
spotify.play \
|
||||||
|
spotify.next \
|
||||||
|
spotify.repeat \
|
||||||
|
--set spotify.controls "${spotify_controls[@]}"
|
||||||
18
.config/sketchybar/items/volume.sh.old
Executable file
18
.config/sketchybar/items/volume.sh.old
Executable file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
source "$CONFIG_DIR/icons.sh"
|
||||||
|
|
||||||
|
volume=(
|
||||||
|
script="$PLUGIN_DIR/volume.sh"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:18.0"
|
||||||
|
label.color=0xffffffff
|
||||||
|
label.font="0xProto Nerd Font Mono:Bold:15.0"
|
||||||
|
click_script="open -a 'Audio MIDI Setup'"
|
||||||
|
scroll_script="$PLUGIN_DIR/volume_scroll.sh"
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add item volume right \
|
||||||
|
--set volume "${volume[@]}" \
|
||||||
|
--subscribe volume volume_change mouse.scrolled
|
||||||
17
.config/sketchybar/items/wifi.sh
Executable file
17
.config/sketchybar/items/wifi.sh
Executable file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
source "$CONFIG_DIR/icons.sh"
|
||||||
|
|
||||||
|
wifi=(
|
||||||
|
script="$PLUGIN_DIR/wifi.sh"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
icon.font="0xProto Nerd Font Mono:Bold:18.0"
|
||||||
|
label.color=0xffffffff
|
||||||
|
label.font="0xProto Nerd Font Mono:Bold:15.0"
|
||||||
|
click_script="open 'x-apple.systempreferences:com.apple.Network-Settings.extension'"
|
||||||
|
update_freq=10
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --add item wifi right \
|
||||||
|
--set wifi "${wifi[@]}"
|
||||||
23
.config/sketchybar/plugins/aerospace_space_click.sh
Executable file
23
.config/sketchybar/plugins/aerospace_space_click.sh
Executable file
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Handle left/right click on aerospace spaces
|
||||||
|
# Left click: focus workspace
|
||||||
|
# Right click: destroy workspace (if using yabai with SIP disabled)
|
||||||
|
|
||||||
|
WORKSPACE_NUMBER=$(echo "$NAME" | grep -o '[0-9]\+$')
|
||||||
|
|
||||||
|
case "$BUTTON" in
|
||||||
|
"left")
|
||||||
|
aerospace workspace "$WORKSPACE_NUMBER"
|
||||||
|
;;
|
||||||
|
"right")
|
||||||
|
# Destroy space (requires yabai with SIP disabled)
|
||||||
|
# For aerospace, we'll just move all windows from this space to space 1 and focus space 1
|
||||||
|
aerospace list-windows --workspace "$WORKSPACE_NUMBER" --format '%{window-id}' | while read -r window_id; do
|
||||||
|
if [ -n "$window_id" ]; then
|
||||||
|
aerospace move-node-to-workspace --window-id "$window_id" 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
aerospace workspace 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
26
.config/sketchybar/plugins/battery.sh
Executable file
26
.config/sketchybar/plugins/battery.sh
Executable file
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
PERCENTAGE="$(pmset -g batt | grep -Eo "\d+%" | cut -d% -f1)"
|
||||||
|
CHARGING="$(pmset -g batt | grep 'AC Power')"
|
||||||
|
|
||||||
|
if [ "$PERCENTAGE" = "" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${PERCENTAGE}" in
|
||||||
|
9[0-9]|100) ICON=" " ; COLOR="0xffa8ff60" ;;
|
||||||
|
[6-8][0-9]) ICON=" " ; COLOR="0xffa8ff60" ;;
|
||||||
|
[3-5][0-9]) ICON=" " ; COLOR="0xfffffeb7" ;;
|
||||||
|
[1-2][0-9]) ICON=" " ; COLOR="0xfffcb6b0" ;;
|
||||||
|
*) ICON=" " ; COLOR="0xfffa6c60" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ "$CHARGING" != "" ]; then
|
||||||
|
ICON=" "
|
||||||
|
#COLOR="0xffa8ff60"
|
||||||
|
COLOR=$GREEN
|
||||||
|
fi
|
||||||
|
|
||||||
|
sketchybar --set "$NAME" icon="$ICON" icon.color="$COLOR" label="${PERCENTAGE}%" label.drawing=on
|
||||||
16
.config/sketchybar/plugins/bluetooth.sh
Executable file
16
.config/sketchybar/plugins/bluetooth.sh
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Check Bluetooth status
|
||||||
|
BT_STATUS=$(system_profiler SPBluetoothDataType 2>/dev/null | grep "Bluetooth Power" | awk '{print $3}')
|
||||||
|
|
||||||
|
if [ "$BT_STATUS" = "On" ]; then
|
||||||
|
# Check if any devices are connected
|
||||||
|
CONNECTED=$(system_profiler SPBluetoothDataType 2>/dev/null | grep "Connected: Yes" | wc -l)
|
||||||
|
if [ $CONNECTED -gt 0 ]; then
|
||||||
|
sketchybar --set "$NAME" icon="" icon.color=0xfffacc15
|
||||||
|
else
|
||||||
|
sketchybar --set "$NAME" icon="" icon.color=0xffffffff
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
sketchybar --set "$NAME" icon="" icon.color=0xff6272a4
|
||||||
|
fi
|
||||||
14
.config/sketchybar/plugins/calendar.sh
Executable file
14
.config/sketchybar/plugins/calendar.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Calendar plugin with proper date formatting
|
||||||
|
|
||||||
|
# Get current date components
|
||||||
|
DAY=$(date '+%d')
|
||||||
|
MONTH_DAY=$(date '+%a %b %d')
|
||||||
|
TIME=$(date '+%H:%M')
|
||||||
|
|
||||||
|
# Remove leading zero from day for icon
|
||||||
|
ICON_DAY=$(date '+%-d')
|
||||||
|
|
||||||
|
# Format the display
|
||||||
|
sketchybar --set "$NAME" icon="$ICON_DAY" label="$MONTH_DAY $TIME"
|
||||||
9
.config/sketchybar/plugins/clock.sh
Executable file
9
.config/sketchybar/plugins/clock.sh
Executable file
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Enhanced clock script with better date formatting
|
||||||
|
|
||||||
|
DATE=$(date '+%a %b %d')
|
||||||
|
TIME=$(date '+%H:%M')
|
||||||
|
|
||||||
|
sketchybar --set "$NAME" icon="$(date '+%d')" label="$DATE $TIME"
|
||||||
|
|
||||||
21
.config/sketchybar/plugins/dato.sh
Executable file
21
.config/sketchybar/plugins/dato.sh
Executable file
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Dato integration with clean 12-hour format
|
||||||
|
# Simple, clean date and time display
|
||||||
|
|
||||||
|
# Get current date and time in 12-hour format
|
||||||
|
DAY=$(date '+%-d')
|
||||||
|
MONTH=$(date '+%B')
|
||||||
|
YEAR=$(date '+%Y')
|
||||||
|
TIME=$(date '+%-I:%M %p %Z')
|
||||||
|
|
||||||
|
# Add ordinal suffix to day
|
||||||
|
case $DAY in
|
||||||
|
1|21|31) SUFFIX="st";;
|
||||||
|
2|22) SUFFIX="nd";;
|
||||||
|
3|23) SUFFIX="rd";;
|
||||||
|
*) SUFFIX="th";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Set clean label with full format
|
||||||
|
sketchybar --set "$NAME" label="$MONTH ${DAY}${SUFFIX}, $YEAR $TIME"
|
||||||
18
.config/sketchybar/plugins/focus.sh
Executable file
18
.config/sketchybar/plugins/focus.sh
Executable file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Check Focus/Do Not Disturb status
|
||||||
|
# This is a simplified version - macOS Focus status is complex to detect
|
||||||
|
|
||||||
|
# Try to detect if Focus is active
|
||||||
|
FOCUS_ACTIVE=0
|
||||||
|
|
||||||
|
# Check if Do Not Disturb is enabled (basic detection)
|
||||||
|
if plutil -extract dnd_prefs xml1 -o - ~/Library/Preferences/com.apple.ncprefs.plist 2>/dev/null | grep -q "userPref.*1"; then
|
||||||
|
FOCUS_ACTIVE=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $FOCUS_ACTIVE -eq 1 ]; then
|
||||||
|
sketchybar --set "$NAME" icon="" icon.color=0xfffacc15
|
||||||
|
else
|
||||||
|
sketchybar --set "$NAME" icon="" icon.color=0xff6272a4
|
||||||
|
fi
|
||||||
15
.config/sketchybar/plugins/front_app.sh
Executable file
15
.config/sketchybar/plugins/front_app.sh
Executable file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/sketchybar}"
|
||||||
|
source "$CONFIG_DIR/helpers/icon_map.sh"
|
||||||
|
|
||||||
|
if [ "$SENDER" = "front_app_switched" ]; then
|
||||||
|
__icon_map "$INFO"
|
||||||
|
|
||||||
|
# Use smooth animation for app switching - sin 6 for quick buttery transition
|
||||||
|
if [ -n "$icon_result" ] && [ "$icon_result" != ":default:" ]; then
|
||||||
|
sketchybar --animate sin 6 --set "$NAME" label="$INFO" icon="$icon_result"
|
||||||
|
else
|
||||||
|
sketchybar --animate sin 6 --set "$NAME" label="$INFO" icon=":default:"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
33
.config/sketchybar/plugins/mic.sh
Executable file
33
.config/sketchybar/plugins/mic.sh
Executable file
|
|
@ -0,0 +1,33 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Detect microphone usage from various apps
|
||||||
|
|
||||||
|
# Check for apps that commonly use microphone
|
||||||
|
MIC_USAGE=0
|
||||||
|
|
||||||
|
# Check for Zoom
|
||||||
|
if pgrep -f "zoom.us" > /dev/null; then
|
||||||
|
MIC_USAGE=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Teams
|
||||||
|
if pgrep -f "Microsoft Teams" > /dev/null; then
|
||||||
|
MIC_USAGE=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Discord
|
||||||
|
if pgrep -f "Discord" > /dev/null; then
|
||||||
|
MIC_USAGE=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for QuickTime recording
|
||||||
|
if pgrep -f "QuickTime Player" > /dev/null && lsof | grep -q "AppleH13CamIn"; then
|
||||||
|
MIC_USAGE=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show/hide mic indicator based on usage
|
||||||
|
if [ $MIC_USAGE -eq 1 ]; then
|
||||||
|
sketchybar --set "$NAME" drawing=on background.drawing=on
|
||||||
|
else
|
||||||
|
sketchybar --set "$NAME" drawing=off background.drawing=off
|
||||||
|
fi
|
||||||
35
.config/sketchybar/plugins/mic/mic.sh
Executable file
35
.config/sketchybar/plugins/mic/mic.sh
Executable file
|
|
@ -0,0 +1,35 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Filename: ~/github/dotfiles-latest/sketchybar/felixkratz/plugins/mic.sh
|
||||||
|
|
||||||
|
# https://github.com/FelixKratz/SketchyBar/discussions/12#discussioncomment-1216899
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
# Attempt to get the current input device name
|
||||||
|
MIC_NAME=$(SwitchAudioSource -t input -c)
|
||||||
|
# I just want the first word, in case it's too long
|
||||||
|
MIC_NAME=$(echo $MIC_NAME | awk '{print $1}')
|
||||||
|
|
||||||
|
# When no microphone is connected, SwitchAudioSource gives me back random
|
||||||
|
# characters and sketchybar shows "Warning: Malformed UTF-8 string"
|
||||||
|
# Validate MIC_NAME as UTF-8, replace invalid sequences with a '?', then compare with original
|
||||||
|
VALIDATED_MIC_NAME=$(echo "$MIC_NAME" | iconv -f UTF-8 -t UTF-8//IGNORE)
|
||||||
|
|
||||||
|
# Get the current microphone volume
|
||||||
|
MIC_VOLUME=$(osascript -e 'input volume of (get volume settings)')
|
||||||
|
|
||||||
|
# Check if MIC_NAME is not meaningful
|
||||||
|
if [[ "$MIC_NAME" != "$VALIDATED_MIC_NAME" || -z "$MIC_NAME" ]]; then
|
||||||
|
# If the mic name is not valid or empty
|
||||||
|
sketchybar -m --set mic label="" icon= icon.color=$YELLOW label.color=$YELLOW
|
||||||
|
else
|
||||||
|
# Update SketchyBar with the microphone's name and volume
|
||||||
|
if [[ $MIC_VOLUME -eq 0 ]]; then
|
||||||
|
sketchybar -m --set mic label="$MIC_NAME $MIC_VOLUME" icon= icon.color=$RED label.color=$RED
|
||||||
|
elif [[ $MIC_VOLUME -gt 0 && $MIC_VOLUME -lt 100 ]]; then
|
||||||
|
sketchybar -m --set mic label="$MIC_NAME $MIC_VOLUME" icon= icon.color=$ORANGE label.color=$ORANGE
|
||||||
|
elif [[ $MIC_VOLUME -eq 100 ]]; then
|
||||||
|
sketchybar -m --set mic label="$MIC_NAME $MIC_VOLUME" icon= icon.color=$GREEN label.color=$WHITE
|
||||||
|
fi
|
||||||
|
fi
|
||||||
16
.config/sketchybar/plugins/mic/mic.sh.old
Executable file
16
.config/sketchybar/plugins/mic/mic.sh.old
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
MIC_VOLUME=$(osascript -e 'input volume of (get volume settings)')
|
||||||
|
|
||||||
|
if [[ $MIC_VOLUME -eq 0 ]]; then
|
||||||
|
ICON=" "
|
||||||
|
COLOR=$RED
|
||||||
|
#sketchybar -m --set mic icon.color=$RED icon= icon.font="0xProto Nerd Font Mono:Bold:20"
|
||||||
|
elif [[ $MIC_VOLUME -gt 0 ]]; then
|
||||||
|
ICON=" "
|
||||||
|
COLOR=$GREEN
|
||||||
|
fi
|
||||||
|
#sketchybar -m --set mic icon= icon.color=$GREEN icon.font="0xProto Nerd Font Mono:Bold:25"
|
||||||
|
sketchybar -m --set mic icon="$ICON" icon.color="$COLOR" icon.font="0xProto Nerd Font Mono:Bold:30"
|
||||||
64
.config/sketchybar/plugins/mic/mic_click.sh
Executable file
64
.config/sketchybar/plugins/mic/mic_click.sh
Executable file
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Filename: ~/github/dotfiles-latest/sketchybar/felixkratz/plugins/mic_click.sh
|
||||||
|
|
||||||
|
# https://github.com/FelixKratz/SketchyBar/discussions/12#discussioncomment-1216899
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
# This is basically the same as the `toggle_devices()` function in:
|
||||||
|
# ~/github/dotfiles-latest/sketchybar/felixkratz/plugins/volume_click.sh
|
||||||
|
toggle_mics() {
|
||||||
|
which SwitchAudioSource >/dev/null || exit 0
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
args=(--remove '/mic.device\.*/' --set "$NAME" popup.drawing=toggle popup.align=left popup.horizontal=on)
|
||||||
|
COUNTER=0
|
||||||
|
CURRENT="$(SwitchAudioSource -t input -c)"
|
||||||
|
while IFS= read -r device; do
|
||||||
|
COLOR=$GREY
|
||||||
|
if [ "${device}" = "$CURRENT" ]; then
|
||||||
|
COLOR=$WHITE
|
||||||
|
fi
|
||||||
|
args+=(--add item mic.device.$COUNTER popup."$NAME"
|
||||||
|
--set mic.device.$COUNTER label="${device}"
|
||||||
|
label.color="$COLOR"
|
||||||
|
click_script="SwitchAudioSource -t input -s \"${device}\" && sketchybar --set /mic.device\.*/ label.color=$GREY --set \$NAME label.color=$WHITE --set $NAME popup.drawing=off")
|
||||||
|
COUNTER=$((COUNTER + 1))
|
||||||
|
done <<<"$(SwitchAudioSource -a -t input)"
|
||||||
|
|
||||||
|
sketchybar -m "${args[@]}" >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$BUTTON" = "left" ]; then
|
||||||
|
# Attempt to get the current input device name
|
||||||
|
MIC_NAME=$(SwitchAudioSource -t input -c)
|
||||||
|
# I just want the first word, in case it's too long
|
||||||
|
MIC_NAME=$(echo $MIC_NAME | awk '{print $1}')
|
||||||
|
|
||||||
|
# When no microphone is connected, SwitchAudioSource gives me back random
|
||||||
|
# characters and sketchybar shows "Warning: Malformed UTF-8 string"
|
||||||
|
# Validate MIC_NAME as UTF-8, replace invalid sequences with a '?', then compare with original
|
||||||
|
VALIDATED_MIC_NAME=$(echo "$MIC_NAME" | iconv -f UTF-8 -t UTF-8//IGNORE)
|
||||||
|
|
||||||
|
# Get the current microphone volume
|
||||||
|
MIC_VOLUME=$(osascript -e 'input volume of (get volume settings)')
|
||||||
|
|
||||||
|
# Check if MIC_NAME is not meaningful
|
||||||
|
if [[ "$MIC_NAME" != "$VALIDATED_MIC_NAME" || -z "$MIC_NAME" ]]; then
|
||||||
|
# If the mic name is not valid or empty
|
||||||
|
sketchybar -m --set mic label="" icon=
|
||||||
|
else
|
||||||
|
# Update SketchyBar with the microphone's name and volume
|
||||||
|
if [[ $MIC_VOLUME -lt 100 ]]; then
|
||||||
|
osascript -e 'set volume input volume 100'
|
||||||
|
sketchybar -m --set mic label="$MIC_NAME 100" icon= icon.color=$GREEN label.color=$WHITE
|
||||||
|
elif [[ $MIC_VOLUME -gt 0 ]]; then
|
||||||
|
osascript -e 'set volume input volume 0'
|
||||||
|
sketchybar -m --set mic label="$MIC_NAME 0" icon= icon.color=$RED label.color=$RED
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
# Check for right-click or shift modifier to show the microphone selection popup
|
||||||
|
elif [ "$BUTTON" = "right" ] || [ "$MODIFIER" = "shift" ]; then
|
||||||
|
toggle_mics
|
||||||
|
fi
|
||||||
18
.config/sketchybar/plugins/mic/mic_click.sh.old
Executable file
18
.config/sketchybar/plugins/mic/mic_click.sh.old
Executable file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh"
|
||||||
|
|
||||||
|
MIC_VOLUME=$(osascript -e 'input volume of (get volume settings)')
|
||||||
|
|
||||||
|
if [[ $MIC_VOLUME -eq 0 ]]; then
|
||||||
|
osascript -e 'set volume input volume 25'
|
||||||
|
ICON=""
|
||||||
|
COLOR=$GREEN
|
||||||
|
#sketchybar -m --set mic icon="" icon.color=$GREEN
|
||||||
|
elif [[ $MIC_VOLUME -gt 0 ]]; then
|
||||||
|
osascript -e 'set volume input volume 0'
|
||||||
|
ICON=""
|
||||||
|
COLOR=$RED
|
||||||
|
#sketchybar -m --set mic icon="" icon.color=$RED
|
||||||
|
fi
|
||||||
|
sketchybar -m --set mic icon="$ICON" icon.color=$COLOR
|
||||||
19
.config/sketchybar/plugins/recording.sh
Executable file
19
.config/sketchybar/plugins/recording.sh
Executable file
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SCREEN_RECORDING=0
|
||||||
|
|
||||||
|
# Check for active screencapture process (macOS screenshot/recording tool)
|
||||||
|
if pgrep -x screencapture > /dev/null 2>&1; then
|
||||||
|
SCREEN_RECORDING=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for common recording applications
|
||||||
|
if pgrep -x OBS > /dev/null 2>&1 || pgrep -x Kap > /dev/null 2>&1 || pgrep -x "CleanShot X" > /dev/null 2>&1 || pgrep -x Camtasia > /dev/null 2>&1; then
|
||||||
|
SCREEN_RECORDING=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $SCREEN_RECORDING -eq 1 ]; then
|
||||||
|
sketchybar --set "$NAME" drawing=on background.drawing=on
|
||||||
|
else
|
||||||
|
sketchybar --set "$NAME" drawing=off background.drawing=off
|
||||||
|
fi
|
||||||
10
.config/sketchybar/plugins/recording_click.sh
Executable file
10
.config/sketchybar/plugins/recording_click.sh
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Stop screen recording when clicked
|
||||||
|
# This simulates the macOS menu bar behavior
|
||||||
|
|
||||||
|
# Try to stop screen recording via keyboard shortcut
|
||||||
|
osascript -e 'tell application "System Events" to key code 28 using {shift down, command down}'
|
||||||
|
|
||||||
|
# Or try to quit QuickTime Player if it's recording
|
||||||
|
pkill -f "QuickTime Player"
|
||||||
7
.config/sketchybar/plugins/space.sh
Executable file
7
.config/sketchybar/plugins/space.sh
Executable file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# The $SELECTED variable is available for space components and indicates if
|
||||||
|
# the space invoking this script (with name: $NAME) is currently selected:
|
||||||
|
# https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item
|
||||||
|
|
||||||
|
sketchybar --set "$NAME" background.drawing="$SELECTED"
|
||||||
175
.config/sketchybar/plugins/spotify.sh
Executable file
175
.config/sketchybar/plugins/spotify.sh
Executable file
|
|
@ -0,0 +1,175 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
next ()
|
||||||
|
{
|
||||||
|
osascript -e 'tell application "Spotify" to play next track'
|
||||||
|
}
|
||||||
|
|
||||||
|
back ()
|
||||||
|
{
|
||||||
|
osascript -e 'tell application "Spotify" to play previous track'
|
||||||
|
}
|
||||||
|
|
||||||
|
play ()
|
||||||
|
{
|
||||||
|
osascript -e 'tell application "Spotify" to playpause'
|
||||||
|
}
|
||||||
|
|
||||||
|
repeat ()
|
||||||
|
{
|
||||||
|
REPEAT=$(osascript -e 'tell application "Spotify" to get repeating')
|
||||||
|
if [ "$REPEAT" = "false" ]; then
|
||||||
|
sketchybar -m --set spotify.repeat icon.highlight=on
|
||||||
|
osascript -e 'tell application "Spotify" to set repeating to true'
|
||||||
|
else
|
||||||
|
sketchybar -m --set spotify.repeat icon.highlight=off
|
||||||
|
osascript -e 'tell application "Spotify" to set repeating to false'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
shuffle ()
|
||||||
|
{
|
||||||
|
SHUFFLE=$(osascript -e 'tell application "Spotify" to get shuffling')
|
||||||
|
if [ "$SHUFFLE" = "false" ]; then
|
||||||
|
sketchybar -m --set spotify.shuffle icon.highlight=on
|
||||||
|
osascript -e 'tell application "Spotify" to set shuffling to true'
|
||||||
|
else
|
||||||
|
sketchybar -m --set spotify.shuffle icon.highlight=off
|
||||||
|
osascript -e 'tell application "Spotify" to set shuffling to false'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
update ()
|
||||||
|
{
|
||||||
|
PLAYING=1
|
||||||
|
if [ "$(echo "$INFO" | jq -r '.["Player State"]')" = "Playing" ]; then
|
||||||
|
PLAYING=0
|
||||||
|
TRACK="$(echo "$INFO" | jq -r .Name | sed 's/\(.\{20\}\).*/\1.../')"
|
||||||
|
ARTIST="$(echo "$INFO" | jq -r .Artist | sed 's/\(.\{20\}\).*/\1.../')"
|
||||||
|
ALBUM="$(echo "$INFO" | jq -r .Album | sed 's/\(.\{25\}\).*/\1.../')"
|
||||||
|
SHUFFLE=$(osascript -e 'tell application "Spotify" to get shuffling')
|
||||||
|
REPEAT=$(osascript -e 'tell application "Spotify" to get repeating')
|
||||||
|
COVER=$(osascript -e 'tell application "Spotify" to get artwork url of current track')
|
||||||
|
fi
|
||||||
|
|
||||||
|
args=()
|
||||||
|
if [ $PLAYING -eq 0 ]; then
|
||||||
|
curl -s --max-time 20 "$COVER" -o /tmp/cover.jpg
|
||||||
|
if [ "$ARTIST" == "" ]; then
|
||||||
|
args+=(--set spotify.title label="$TRACK"
|
||||||
|
--set spotify.album label="Podcast"
|
||||||
|
--set spotify.artist label="$ALBUM" )
|
||||||
|
else
|
||||||
|
args+=(--set spotify.title label="$TRACK"
|
||||||
|
--set spotify.album label="$ALBUM"
|
||||||
|
--set spotify.artist label="$ARTIST")
|
||||||
|
fi
|
||||||
|
args+=(--set spotify.play icon=""
|
||||||
|
--set spotify.shuffle icon.highlight=$SHUFFLE
|
||||||
|
--set spotify.repeat icon.highlight=$REPEAT
|
||||||
|
--set spotify.cover background.image="/tmp/cover.jpg"
|
||||||
|
background.color=0x00000000
|
||||||
|
--set spotify.anchor drawing=on
|
||||||
|
--set spotify.anchor icon.color=0xfffacc15 )
|
||||||
|
else
|
||||||
|
args+=(--set spotify.anchor drawing=on popup.drawing=off
|
||||||
|
--set spotify.anchor icon.color=0xfffacc15
|
||||||
|
--set spotify.play icon="" )
|
||||||
|
fi
|
||||||
|
sketchybar -m "${args[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
scrubbing() {
|
||||||
|
DURATION_MS=$(osascript -e 'tell application "Spotify" to get duration of current track')
|
||||||
|
DURATION=$((DURATION_MS/1000))
|
||||||
|
|
||||||
|
TARGET=$((DURATION*PERCENTAGE/100))
|
||||||
|
osascript -e "tell application \"Spotify\" to set player position to $TARGET"
|
||||||
|
sketchybar --set spotify.state slider.percentage=$PERCENTAGE
|
||||||
|
}
|
||||||
|
|
||||||
|
scroll() {
|
||||||
|
DURATION_MS=$(osascript -e 'tell application "Spotify" to get duration of current track')
|
||||||
|
DURATION=$((DURATION_MS/1000))
|
||||||
|
|
||||||
|
FLOAT="$(osascript -e 'tell application "Spotify" to get player position')"
|
||||||
|
TIME=${FLOAT%.*}
|
||||||
|
|
||||||
|
sketchybar --animate linear 10 \
|
||||||
|
--set spotify.state slider.percentage="$((TIME*100/DURATION))" \
|
||||||
|
icon="$(date -r $TIME +'%M:%S')" \
|
||||||
|
label="$(date -r $DURATION +'%M:%S')"
|
||||||
|
}
|
||||||
|
|
||||||
|
mouse_clicked () {
|
||||||
|
case "$NAME" in
|
||||||
|
"spotify.next") next
|
||||||
|
;;
|
||||||
|
"spotify.back") back
|
||||||
|
;;
|
||||||
|
"spotify.play") play
|
||||||
|
;;
|
||||||
|
"spotify.shuffle") shuffle
|
||||||
|
;;
|
||||||
|
"spotify.repeat") repeat
|
||||||
|
;;
|
||||||
|
"spotify.state") scrubbing
|
||||||
|
;;
|
||||||
|
*) exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
popup () {
|
||||||
|
# Toggle popup instead of just on/off - stays open until clicked elsewhere
|
||||||
|
sketchybar --set spotify.anchor popup.drawing=toggle
|
||||||
|
}
|
||||||
|
|
||||||
|
routine() {
|
||||||
|
case "$NAME" in
|
||||||
|
"spotify.state") scroll
|
||||||
|
;;
|
||||||
|
*) update
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$SENDER" in
|
||||||
|
"mouse.clicked")
|
||||||
|
if [ "$NAME" = "spotify.anchor" ]; then
|
||||||
|
sketchybar --set spotify.anchor popup.drawing=toggle
|
||||||
|
else
|
||||||
|
mouse_clicked
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"mouse.entered")
|
||||||
|
if [ "$NAME" = "spotify.anchor" ]; then
|
||||||
|
sketchybar --set spotify.anchor popup.drawing=on
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"mouse.exited")
|
||||||
|
# Close popup after a brief moment to avoid flickering
|
||||||
|
sleep 0.3
|
||||||
|
sketchybar --set spotify.anchor popup.drawing=off
|
||||||
|
;;
|
||||||
|
"mouse.exited.global")
|
||||||
|
sketchybar --set spotify.anchor popup.drawing=off
|
||||||
|
;;
|
||||||
|
"routine") routine
|
||||||
|
;;
|
||||||
|
"forced")
|
||||||
|
if pgrep -x Spotify > /dev/null 2>&1; then
|
||||||
|
STATE=$(osascript -e 'tell application "Spotify" to get player state as string' 2>/dev/null)
|
||||||
|
if [ "$STATE" = "playing" ]; then
|
||||||
|
TRACK=$(osascript -e 'tell application "Spotify" to get name of current track' 2>/dev/null)
|
||||||
|
ARTIST=$(osascript -e 'tell application "Spotify" to get artist of current track' 2>/dev/null)
|
||||||
|
ALBUM=$(osascript -e 'tell application "Spotify" to get album of current track' 2>/dev/null)
|
||||||
|
INFO=$(jq -n --arg t "$TRACK" --arg a "$ARTIST" --arg al "$ALBUM" \
|
||||||
|
'{"Player State":"Playing","Name":$t,"Artist":$a,"Album":$al}')
|
||||||
|
update
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*) update
|
||||||
|
;;
|
||||||
|
esac
|
||||||
7
.config/sketchybar/plugins/trigger_workspace_update.sh
Executable file
7
.config/sketchybar/plugins/trigger_workspace_update.sh
Executable file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Trigger the workspace update
|
||||||
|
/Users/zion/.config/sketchybar/plugins/aerospace_workspaces.sh
|
||||||
|
|
||||||
|
# Also trigger a sketchybar update
|
||||||
|
sketchybar --trigger aerospace_workspace_change
|
||||||
20
.config/sketchybar/plugins/volume.sh
Executable file
20
.config/sketchybar/plugins/volume.sh
Executable file
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# The volume_change event supplies a $INFO variable in which the current volume
|
||||||
|
# percentage is passed to the script.
|
||||||
|
|
||||||
|
if [ "$SENDER" = "volume_change" ]; then
|
||||||
|
VOLUME="$INFO"
|
||||||
|
|
||||||
|
case "$VOLUME" in
|
||||||
|
[6-9][0-9]|100) ICON=""
|
||||||
|
;;
|
||||||
|
[3-5][0-9]) ICON=""
|
||||||
|
;;
|
||||||
|
[1-9]|[1-2][0-9]) ICON=""
|
||||||
|
;;
|
||||||
|
*) ICON=""
|
||||||
|
esac
|
||||||
|
|
||||||
|
sketchybar --set "$NAME" icon="$ICON" label="$VOLUME%"
|
||||||
|
fi
|
||||||
17
.config/sketchybar/plugins/volume_scroll.sh
Executable file
17
.config/sketchybar/plugins/volume_scroll.sh
Executable file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Volume scroll script - allows changing volume with mouse scroll
|
||||||
|
|
||||||
|
VOLUME_STEP=5
|
||||||
|
|
||||||
|
case "$SCROLL_DIRECTION" in
|
||||||
|
"up")
|
||||||
|
osascript -e "set volume output volume (output volume of (get volume settings) + $VOLUME_STEP)"
|
||||||
|
;;
|
||||||
|
"down")
|
||||||
|
osascript -e "set volume output volume (output volume of (get volume settings) - $VOLUME_STEP)"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Trigger volume update
|
||||||
|
sketchybar --trigger volume_change
|
||||||
29
.config/sketchybar/plugins/wifi.sh
Executable file
29
.config/sketchybar/plugins/wifi.sh
Executable file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/sketchybar}"
|
||||||
|
source "$CONFIG_DIR/icons.sh"
|
||||||
|
|
||||||
|
# Check overall internet connection status
|
||||||
|
INTERNET_CONNECTED=0
|
||||||
|
|
||||||
|
# First check if we can reach the internet
|
||||||
|
if ping -c 1 8.8.8.8 >/dev/null 2>&1; then
|
||||||
|
INTERNET_CONNECTED=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $INTERNET_CONNECTED -eq 1 ]; then
|
||||||
|
# Check if WiFi is on and connected
|
||||||
|
WIFI_STATUS=$(networksetup -getairportpower en0 2>/dev/null | awk '{print $4}')
|
||||||
|
SSID=$(networksetup -getairportnetwork en0 2>/dev/null | cut -d' ' -f4-)
|
||||||
|
|
||||||
|
if [ "$WIFI_STATUS" = "On" ] && [ "$SSID" != "You are not associated with an AirPort network." ] && [ "$SSID" != "" ]; then
|
||||||
|
# Connected via WiFi
|
||||||
|
sketchybar --set "$NAME" icon="📶" label="$SSID"
|
||||||
|
else
|
||||||
|
# Connected via Ethernet or other means
|
||||||
|
sketchybar --set "$NAME" icon="📶" label="Ethernet"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# No internet connection at all
|
||||||
|
sketchybar --set "$NAME" icon="🚫" label="No Internet"
|
||||||
|
fi
|
||||||
7
.config/sketchybar/plugins/zen.sh
Executable file
7
.config/sketchybar/plugins/zen.sh
Executable file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Simple zen script - toggles between 12h and 24h format
|
||||||
|
# You can customize this to do whatever you want when clicking the clock
|
||||||
|
|
||||||
|
# For now, just open the Calendar app
|
||||||
|
open -a Calendar
|
||||||
137
.config/sketchybar/sketchybarrc
Executable file
137
.config/sketchybar/sketchybarrc
Executable file
|
|
@ -0,0 +1,137 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Ensure CONFIG_DIR is set
|
||||||
|
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/sketchybar}"
|
||||||
|
export CONFIG_DIR
|
||||||
|
|
||||||
|
source "$CONFIG_DIR/colors.sh" # Loads all defined colors
|
||||||
|
source "$CONFIG_DIR/icons.sh" # Loads all defined icons
|
||||||
|
|
||||||
|
ITEM_DIR="$CONFIG_DIR/items" # Directory where the items are configured
|
||||||
|
PLUGIN_DIR="$CONFIG_DIR/plugins" # Directory where all the plugin scripts are stored
|
||||||
|
|
||||||
|
FONT="0xProto Nerd Font Mono" # Match user's preferred font
|
||||||
|
PADDINGS=3 # All paddings use this value (icon, label, background)
|
||||||
|
|
||||||
|
# Unload the macOS on screen indicator overlay for volume change
|
||||||
|
launchctl unload -F /System/Library/LaunchAgents/com.apple.OSDUIHelper.plist > /dev/null 2>&1 &
|
||||||
|
|
||||||
|
# Setting up the general bar appearance of the bar
|
||||||
|
bar=(
|
||||||
|
height=39
|
||||||
|
color=$BAR_COLOR
|
||||||
|
shadow=on
|
||||||
|
position=top
|
||||||
|
sticky=on
|
||||||
|
padding_right=10
|
||||||
|
padding_left=10
|
||||||
|
corner_radius=9
|
||||||
|
y_offset=10
|
||||||
|
margin=10
|
||||||
|
blur_radius=20
|
||||||
|
notch_width=200
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --bar "${bar[@]}"
|
||||||
|
|
||||||
|
# Setting up default values
|
||||||
|
defaults=(
|
||||||
|
updates=when_shown
|
||||||
|
icon.font="$FONT:Bold:16.0"
|
||||||
|
icon.color=$ICON_COLOR
|
||||||
|
icon.padding_left=8
|
||||||
|
icon.padding_right=4
|
||||||
|
label.font="$FONT:Bold:15.0"
|
||||||
|
label.color=$LABEL_COLOR
|
||||||
|
label.padding_left=4
|
||||||
|
label.padding_right=8
|
||||||
|
padding_right=8
|
||||||
|
padding_left=8
|
||||||
|
background.height=30
|
||||||
|
background.corner_radius=9
|
||||||
|
popup.background.border_width=2
|
||||||
|
popup.background.corner_radius=9
|
||||||
|
popup.background.border_color=$POPUP_BORDER_COLOR
|
||||||
|
popup.background.color=$POPUP_BACKGROUND_COLOR
|
||||||
|
popup.blur_radius=20
|
||||||
|
popup.background.shadow.drawing=on
|
||||||
|
)
|
||||||
|
|
||||||
|
sketchybar --default "${defaults[@]}"
|
||||||
|
|
||||||
|
# Create aerospace workspace events
|
||||||
|
sketchybar --add event aerospace_workspace_change
|
||||||
|
sketchybar --add event window_focus
|
||||||
|
sketchybar --add event space_change
|
||||||
|
|
||||||
|
# Left: Apple + Aerospace workspaces + Current App
|
||||||
|
source "$ITEM_DIR/apple.sh"
|
||||||
|
|
||||||
|
# Pre-create all workspace items for smooth updates (no add/remove cycle)
|
||||||
|
for i in {1..9}; do
|
||||||
|
sketchybar --add space aerospace.workspace.$i left \
|
||||||
|
--set aerospace.workspace.$i associated_display=1 \
|
||||||
|
--set aerospace.workspace.$i icon.padding_left=8 \
|
||||||
|
--set aerospace.workspace.$i icon.padding_right=4 \
|
||||||
|
--set aerospace.workspace.$i icon.font="sketchybar-app-font:Regular:16.0" \
|
||||||
|
--set aerospace.workspace.$i label.padding_left=4 \
|
||||||
|
--set aerospace.workspace.$i label.padding_right=8 \
|
||||||
|
--set aerospace.workspace.$i label.font="SF Pro:Semibold:13.0" \
|
||||||
|
--set aerospace.workspace.$i background.border_width=0 \
|
||||||
|
--set aerospace.workspace.$i background.corner_radius=8 \
|
||||||
|
--set aerospace.workspace.$i background.height=28 \
|
||||||
|
--set aerospace.workspace.$i background.drawing=on \
|
||||||
|
--set aerospace.workspace.$i click_script="aerospace workspace $i &" \
|
||||||
|
--set aerospace.workspace.$i drawing=off
|
||||||
|
done
|
||||||
|
|
||||||
|
# Now run aerospace.sh to set initial state
|
||||||
|
source "$ITEM_DIR/aerospace.sh"
|
||||||
|
|
||||||
|
# Add current app right after aerospace workspaces
|
||||||
|
sketchybar --add item front_app left \
|
||||||
|
--set front_app background.color=$BACKGROUND_2 \
|
||||||
|
--set front_app icon.color=$BLUE \
|
||||||
|
--set front_app icon.font="sketchybar-app-font:Regular:16.0" \
|
||||||
|
--set front_app label.color=0xffffffff \
|
||||||
|
--set front_app label.font="0xProto Nerd Font Mono:Bold:15.0" \
|
||||||
|
--set front_app script="$PLUGIN_DIR/front_app.sh" \
|
||||||
|
--subscribe front_app front_app_switched
|
||||||
|
|
||||||
|
# Volume
|
||||||
|
#source "$ITEM_DIR/volume.sh"
|
||||||
|
|
||||||
|
|
||||||
|
# Center: Spotify popup player
|
||||||
|
#source "$ITEM_DIR/spotify.sh"
|
||||||
|
|
||||||
|
# Subscribe to Spotify events
|
||||||
|
#sketchybar --trigger spotify_change
|
||||||
|
|
||||||
|
# Right: System indicators and Dato
|
||||||
|
#source "$ITEM_DIR/recording.sh"
|
||||||
|
source "$ITEM_DIR/mic.sh"
|
||||||
|
source "$ITEM_DIR/clock.sh"
|
||||||
|
source "$ITEM_DIR/battery.sh"
|
||||||
|
|
||||||
|
#sketchybar -m --add item mic right \
|
||||||
|
# --set mic update_freq=3 \
|
||||||
|
# script="$PLUGIN_DIR/mic/mic.sh" \
|
||||||
|
# click_script="$PLUGIN_DIR/mic/mic_click.sh" \
|
||||||
|
# --subscribe mic volume_change
|
||||||
|
|
||||||
|
# Event listener for aerospace changes
|
||||||
|
# aerospace_workspace_change → fast path (color swap via env vars from exec-on-workspace-change)
|
||||||
|
# front_app_switched → full path (icon refresh when apps open/close/move)
|
||||||
|
sketchybar --add item aerospace_listener left \
|
||||||
|
--set aerospace_listener script="$CONFIG_DIR/items/aerospace.sh" \
|
||||||
|
--set aerospace_listener icon.drawing=off \
|
||||||
|
--set aerospace_listener label.drawing=off \
|
||||||
|
--set aerospace_listener background.drawing=off \
|
||||||
|
--set aerospace_listener width=0 \
|
||||||
|
--subscribe aerospace_listener aerospace_workspace_change front_app_switched
|
||||||
|
|
||||||
|
# Forcing all item scripts to run (never do this outside of sketchybarrc)
|
||||||
|
sketchybar --update
|
||||||
|
|
||||||
|
echo "sketchybar configuration loaded.."
|
||||||
91
.config/sketchybar/sketchybarrc.backup
Normal file
91
.config/sketchybar/sketchybarrc.backup
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
# This is a demo config to showcase some of the most important commands.
|
||||||
|
# It is meant to be changed and configured, as it is intentionally kept sparse.
|
||||||
|
# For a (much) more advanced configuration example see my dotfiles:
|
||||||
|
# https://github.com/FelixKratz/dotfiles
|
||||||
|
|
||||||
|
PLUGIN_DIR="$CONFIG_DIR/plugins"
|
||||||
|
|
||||||
|
##### Bar Appearance #####
|
||||||
|
# Configuring the general appearance of the bar.
|
||||||
|
# These are only some of the options available. For all options see:
|
||||||
|
# https://felixkratz.github.io/SketchyBar/config/bar
|
||||||
|
# If you are looking for other colors, see the color picker:
|
||||||
|
# https://felixkratz.github.io/SketchyBar/config/tricks#color-picker
|
||||||
|
|
||||||
|
sketchybar --bar position=top height=40 blur_radius=30 color=0x40000000
|
||||||
|
|
||||||
|
##### Changing Defaults #####
|
||||||
|
# We now change some default values, which are applied to all further items.
|
||||||
|
# For a full list of all available item properties see:
|
||||||
|
# https://felixkratz.github.io/SketchyBar/config/items
|
||||||
|
|
||||||
|
default=(
|
||||||
|
padding_left=5
|
||||||
|
padding_right=5
|
||||||
|
icon.font="Hack Nerd Font:Bold:17.0"
|
||||||
|
label.font="Hack Nerd Font:Bold:14.0"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
label.color=0xffffffff
|
||||||
|
icon.padding_left=4
|
||||||
|
icon.padding_right=4
|
||||||
|
label.padding_left=4
|
||||||
|
label.padding_right=4
|
||||||
|
)
|
||||||
|
sketchybar --default "${default[@]}"
|
||||||
|
|
||||||
|
##### Adding Mission Control Space Indicators #####
|
||||||
|
# Let's add some mission control spaces:
|
||||||
|
# https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item
|
||||||
|
# to indicate active and available mission control spaces.
|
||||||
|
|
||||||
|
SPACE_ICONS=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10")
|
||||||
|
for i in "${!SPACE_ICONS[@]}"
|
||||||
|
do
|
||||||
|
sid="$(($i+1))"
|
||||||
|
space=(
|
||||||
|
space="$sid"
|
||||||
|
icon="${SPACE_ICONS[i]}"
|
||||||
|
icon.padding_left=7
|
||||||
|
icon.padding_right=7
|
||||||
|
background.color=0x40ffffff
|
||||||
|
background.corner_radius=5
|
||||||
|
background.height=25
|
||||||
|
label.drawing=off
|
||||||
|
script="$PLUGIN_DIR/space.sh"
|
||||||
|
click_script="yabai -m space --focus $sid"
|
||||||
|
)
|
||||||
|
sketchybar --add space space."$sid" left --set space."$sid" "${space[@]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
##### Adding Left Items #####
|
||||||
|
# We add some regular items to the left side of the bar, where
|
||||||
|
# only the properties deviating from the current defaults need to be set
|
||||||
|
|
||||||
|
sketchybar --add item chevron left \
|
||||||
|
--set chevron icon= label.drawing=off \
|
||||||
|
--add item front_app left \
|
||||||
|
--set front_app icon.drawing=off script="$PLUGIN_DIR/front_app.sh" \
|
||||||
|
--subscribe front_app front_app_switched
|
||||||
|
|
||||||
|
##### Adding Right Items #####
|
||||||
|
# In the same way as the left items we can add items to the right side.
|
||||||
|
# Additional position (e.g. center) are available, see:
|
||||||
|
# https://felixkratz.github.io/SketchyBar/config/items#adding-items-to-sketchybar
|
||||||
|
|
||||||
|
# Some items refresh on a fixed cycle, e.g. the clock runs its script once
|
||||||
|
# every 10s. Other items respond to events they subscribe to, e.g. the
|
||||||
|
# volume.sh script is only executed once an actual change in system audio
|
||||||
|
# volume is registered. More info about the event system can be found here:
|
||||||
|
# https://felixkratz.github.io/SketchyBar/config/events
|
||||||
|
|
||||||
|
sketchybar --add item clock right \
|
||||||
|
--set clock update_freq=10 icon= script="$PLUGIN_DIR/clock.sh" \
|
||||||
|
--add item volume right \
|
||||||
|
--set volume script="$PLUGIN_DIR/volume.sh" \
|
||||||
|
--subscribe volume volume_change \
|
||||||
|
--add item battery right \
|
||||||
|
--set battery update_freq=120 script="$PLUGIN_DIR/battery.sh" \
|
||||||
|
--subscribe battery system_woke power_source_change
|
||||||
|
|
||||||
|
##### Force all scripts to run the first time (never do this in a script) #####
|
||||||
|
sketchybar --update
|
||||||
80
.config/sketchybar/sketchybarrc.backup2
Executable file
80
.config/sketchybar/sketchybarrc.backup2
Executable file
|
|
@ -0,0 +1,80 @@
|
||||||
|
# Modern Sketchybar config with Aerospace integration
|
||||||
|
# Shows only active aerospace workspaces with app icons
|
||||||
|
|
||||||
|
PLUGIN_DIR="$CONFIG_DIR/plugins"
|
||||||
|
|
||||||
|
##### Bar Appearance #####
|
||||||
|
sketchybar --bar position=top height=40 blur_radius=30 color=0x20000000 margin=8
|
||||||
|
|
||||||
|
##### Changing Defaults #####
|
||||||
|
default=(
|
||||||
|
padding_left=4
|
||||||
|
padding_right=4
|
||||||
|
icon.font="SF Pro Display:Bold:16.0"
|
||||||
|
label.font="SF Pro Display:Medium:13.0"
|
||||||
|
icon.color=0xffffffff
|
||||||
|
label.color=0xffffffff
|
||||||
|
background.border_width=0
|
||||||
|
background.corner_radius=8
|
||||||
|
background.height=32
|
||||||
|
)
|
||||||
|
sketchybar --default "${default[@]}"
|
||||||
|
|
||||||
|
##### Adding Dynamic Aerospace Workspaces #####
|
||||||
|
# This will be populated by the aerospace_workspaces.sh script
|
||||||
|
# Only shows workspaces that actually have windows
|
||||||
|
|
||||||
|
##### Adding Left Items #####
|
||||||
|
# Separator and current app
|
||||||
|
sketchybar --add item separator left \
|
||||||
|
--set separator icon="" \
|
||||||
|
icon.color=0xff9ca0a4 \
|
||||||
|
icon.padding_left=8 \
|
||||||
|
icon.padding_right=8 \
|
||||||
|
label.drawing=off \
|
||||||
|
--add item front_app left \
|
||||||
|
--set front_app icon.drawing=off \
|
||||||
|
script="$PLUGIN_DIR/front_app.sh" \
|
||||||
|
label.font="SF Pro Display:Semibold:13.0" \
|
||||||
|
--subscribe front_app front_app_switched
|
||||||
|
|
||||||
|
##### Adding Right Items #####
|
||||||
|
# Modern right-side items with proper icons
|
||||||
|
|
||||||
|
# Dato (Date/Time)
|
||||||
|
sketchybar --add item dato right \
|
||||||
|
--set dato update_freq=30 \
|
||||||
|
icon="" \
|
||||||
|
icon.color=0xff9ca0a4 \
|
||||||
|
icon.padding_right=8 \
|
||||||
|
script="$PLUGIN_DIR/dato.sh" \
|
||||||
|
|
||||||
|
# Volume
|
||||||
|
sketchybar --add item volume right \
|
||||||
|
--set volume script="$PLUGIN_DIR/volume.sh" \
|
||||||
|
icon.color=0xff9ca0a4 \
|
||||||
|
icon.padding_right=8 \
|
||||||
|
--subscribe volume volume_change \
|
||||||
|
|
||||||
|
# Battery
|
||||||
|
sketchybar --add item battery right \
|
||||||
|
--set battery update_freq=120 \
|
||||||
|
script="$PLUGIN_DIR/battery.sh" \
|
||||||
|
icon.color=0xff9ca0a4 \
|
||||||
|
icon.padding_right=8 \
|
||||||
|
--subscribe battery system_woke power_source_change
|
||||||
|
|
||||||
|
##### Initialization #####
|
||||||
|
# Run the aerospace workspace script to populate workspaces
|
||||||
|
sketchybar --add event aerospace_workspace_change \
|
||||||
|
--add item aerospace_trigger left \
|
||||||
|
--set aerospace_trigger script="$PLUGIN_DIR/aerospace_workspaces.sh" \
|
||||||
|
label.drawing=off \
|
||||||
|
icon.drawing=off \
|
||||||
|
--subscribe aerospace_trigger aerospace_workspace_change
|
||||||
|
|
||||||
|
# Initial population of workspaces
|
||||||
|
"$PLUGIN_DIR/aerospace_workspaces.sh"
|
||||||
|
|
||||||
|
##### Force all scripts to run #####
|
||||||
|
sketchybar --update
|
||||||
67
.local/bin/sidestep
Executable file
67
.local/bin/sidestep
Executable file
|
|
@ -0,0 +1,67 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Prints the target path; use with:
|
||||||
|
# cd "$(sidestep <region> [nonprod|prod])"
|
||||||
|
# Or add this wrapper to ~/.zshrc so plain "sidestep <region>" cds directly:
|
||||||
|
# sidestep() { local d; d="$(command sidestep "$@")" && cd "$d"; }
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
region="${1-}"
|
||||||
|
env="${2-}"
|
||||||
|
|
||||||
|
if [[ -z "$region" ]]; then
|
||||||
|
echo "sidestep: usage: sidestep <region> [nonprod|prod]" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Split PWD into path segments; IFS scoped to read only — avoids the bash 3.2
|
||||||
|
# bug that corrupts ${array[*]:offset:N} when a local IFS is set.
|
||||||
|
IFS='/' read -ra segs <<< "$PWD"
|
||||||
|
|
||||||
|
# Locate the *-hosting segment (0-indexed).
|
||||||
|
idx=-1
|
||||||
|
for i in "${!segs[@]}"; do
|
||||||
|
if [[ "${segs[$i]}" == *-hosting ]]; then
|
||||||
|
idx=$i
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ $idx -eq -1 ]]; then
|
||||||
|
echo "sidestep: not inside a *-hosting directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Determine the target tier: keep current unless an env was given.
|
||||||
|
tier="${segs[$idx]}"
|
||||||
|
case "$env" in
|
||||||
|
'') ;;
|
||||||
|
nonprod) tier="staging-hosting" ;;
|
||||||
|
prod) tier="prod-hosting" ;;
|
||||||
|
*)
|
||||||
|
echo "sidestep: unknown env '$env' (expected nonprod or prod)" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# prefix = everything before the tier segment, joined by /.
|
||||||
|
# Uses printf to avoid the bash 3.2 0x7f corruption from ${array[*]:...} with custom IFS.
|
||||||
|
prefix=$(printf '%s/' "${segs[@]:0:$idx}")
|
||||||
|
prefix="${prefix%/}"
|
||||||
|
|
||||||
|
# subpath = everything after the region segment (tier+2 onward), preserved as-is.
|
||||||
|
sub_start=$((idx + 2))
|
||||||
|
sub=("${segs[@]:$sub_start}")
|
||||||
|
|
||||||
|
dest="${prefix}/${tier}/${region}"
|
||||||
|
if [[ ${#sub[@]} -gt 0 ]]; then
|
||||||
|
subpath=$(printf '%s/' "${sub[@]}")
|
||||||
|
dest="${dest}/${subpath%/}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -d "$dest" ]]; then
|
||||||
|
echo "sidestep: directory does not exist: $dest" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf '%s\n' "$dest"
|
||||||
65
.local/bin/tsh-proxy-db
Executable file
65
.local/bin/tsh-proxy-db
Executable file
|
|
@ -0,0 +1,65 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Usage: run from a directory containing terragrunt.hcl with a postgres provider block
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
TERRAGRUNT_HCL="${PWD}/terragrunt.hcl"
|
||||||
|
|
||||||
|
if [[ ! -f "$TERRAGRUNT_HCL" ]]; then
|
||||||
|
echo "error: no terragrunt.hcl found in current directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract the db_ports key from the postgres provider block
|
||||||
|
# Matches: port = "${local.common_vars.locals.db_ports["some_key"]}"
|
||||||
|
DB_PORT_KEY=$(grep -oP 'db_ports\["\K[^"]+' "$TERRAGRUNT_HCL" | head -1)
|
||||||
|
|
||||||
|
if [[ -z "$DB_PORT_KEY" ]]; then
|
||||||
|
echo "error: could not find db_ports key in postgres provider block of terragrunt.hcl" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Walk up directory tree to find common.hcl
|
||||||
|
find_parent_file() {
|
||||||
|
local dir
|
||||||
|
dir="$(dirname "$1")"
|
||||||
|
while [[ "$dir" != "/" ]]; do
|
||||||
|
if [[ -f "$dir/$2" ]]; then
|
||||||
|
echo "$dir/$2"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
dir="$(dirname "$dir")"
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
COMMON_HCL=$(find_parent_file "$TERRAGRUNT_HCL" "common.hcl" || true)
|
||||||
|
|
||||||
|
if [[ -z "$COMMON_HCL" ]]; then
|
||||||
|
echo "error: could not find common.hcl in any parent directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract port value for the key using yq
|
||||||
|
DB_PORT=$(yq -oy -r ".[].db_ports[\"${DB_PORT_KEY}\"]" "$COMMON_HCL")
|
||||||
|
|
||||||
|
if [[ -z "$DB_PORT" || "$DB_PORT" == "null" ]]; then
|
||||||
|
echo "error: no port found for key '${DB_PORT_KEY}' in ${COMMON_HCL}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Derive teleport DB name: saas_psql_prod_usw2 -> saas-psql-prod-usw2
|
||||||
|
TSH_DB_NAME=$(echo "$DB_PORT_KEY" | tr '_' '-')
|
||||||
|
|
||||||
|
echo "db port key : ${DB_PORT_KEY}"
|
||||||
|
echo "common.hcl : ${COMMON_HCL}"
|
||||||
|
echo "port : ${DB_PORT}"
|
||||||
|
echo "tsh db name : ${TSH_DB_NAME}"
|
||||||
|
echo ""
|
||||||
|
echo "running: tsh proxy db --tunnel --db-user immuta_admin --db-name postgres --port ${DB_PORT} ${TSH_DB_NAME}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
exec tsh proxy db --tunnel \
|
||||||
|
--db-user immuta_admin \
|
||||||
|
--db-name postgres \
|
||||||
|
--port "$DB_PORT" \
|
||||||
|
"$TSH_DB_NAME"
|
||||||
87
.zshrc.d/cd_history.zsh
Normal file
87
.zshrc.d/cd_history.zsh
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# --- CONFIGURATION ---
|
||||||
|
# File where the history of directories will be stored
|
||||||
|
CD_HISTORY_FILE="$HOME/.cd_history"
|
||||||
|
|
||||||
|
# --- FUNCTIONS ---
|
||||||
|
|
||||||
|
# 1. History Logging Function
|
||||||
|
# Logs the current directory path, ensuring it's an absolute path.
|
||||||
|
_cd_log_history() {
|
||||||
|
local current_dir=$(pwd -P) # -P ensures physical path (no symlinks)
|
||||||
|
|
||||||
|
# Check if the history file exists, if not, create it.
|
||||||
|
if [[ ! -f "$CD_HISTORY_FILE" ]]; then
|
||||||
|
echo "# cd_history file created on $(date)" > "$CD_HISTORY_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Optimization: Prevent adding the exact same directory path consecutively.
|
||||||
|
# We read the last few lines of the file to check if the path is already there.
|
||||||
|
local last_entries=$(tail -n 5 "$CD_HISTORY_FILE" | grep "$current_dir$")
|
||||||
|
|
||||||
|
if [[ -z "$last_entries" ]]; then
|
||||||
|
echo "$current_dir" >> "$CD_HISTORY_FILE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 2. The Main Wrapper Function (Overrides built-in 'cd')
|
||||||
|
# This function intercepts all calls to 'cd'.
|
||||||
|
cd() {
|
||||||
|
# 1. LOGGING: Always log the directory we are leaving.
|
||||||
|
_cd_log_history
|
||||||
|
|
||||||
|
# 2. ARGUMENT HANDLING: Check if the user provided a target directory argument.
|
||||||
|
if [ $# -gt 0 ]; then
|
||||||
|
# Standard behavior: User explicitly provided a path (e.g., cd /etc/ssh)
|
||||||
|
# We skip fzf and use the standard built-in 'cd' command.
|
||||||
|
builtin cd "$@"
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. INTERACTIVE HISTORY SEARCH: No arguments provided (just "cd").
|
||||||
|
echo ""
|
||||||
|
echo "--- CD History Search ---"
|
||||||
|
echo "Select a directory from your history list:"
|
||||||
|
echo "-------------------------"
|
||||||
|
|
||||||
|
# Check if fzf is available
|
||||||
|
if ! command -v fzf &> /dev/null; then
|
||||||
|
echo "Error: fzf could not be found. Please install it (e.g., 'sudo apt install fzf')."
|
||||||
|
echo "Falling back to standard 'cd' behavior..."
|
||||||
|
builtin cd
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Use fzf on the history file content
|
||||||
|
local selected_dir=$(
|
||||||
|
cat "$CD_HISTORY_FILE" | \
|
||||||
|
grep -vE '^(#|$)' | \
|
||||||
|
fzf --header="Select directory (Use 'Ctrl+C' to cancel search)" --reverse
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the user selected a directory
|
||||||
|
if [ -n "$selected_dir" ]; then
|
||||||
|
echo ""
|
||||||
|
echo "=> Changing directory to: $selected_dir"
|
||||||
|
# Perform the actual directory change
|
||||||
|
builtin cd "$selected_dir"
|
||||||
|
return $?
|
||||||
|
else
|
||||||
|
# User pressed ESC or Ctrl+C
|
||||||
|
echo ""
|
||||||
|
echo "Search cancelled. Remaining in current directory."
|
||||||
|
# Replicate the behavior of calling 'cd' with no args (usually returns to HOME)
|
||||||
|
builtin cd
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 3. Installation Function
|
||||||
|
# This function overwrites the existing 'cd' command with our wrapper.
|
||||||
|
install_cd_wrapper() {
|
||||||
|
# Ensure the wrapper function replaces the built-in command
|
||||||
|
export -f cd
|
||||||
|
echo "✅ Successfully installed custom 'cd' wrapper."
|
||||||
|
echo "You can now use 'cd' and it will prompt for history lookup."
|
||||||
|
}
|
||||||
|
|
@ -2,9 +2,7 @@
|
||||||
[ -f $HOME/.vault-token ] && source ~/.vault-token
|
[ -f $HOME/.vault-token ] && source ~/.vault-token
|
||||||
|
|
||||||
export AWS_VAULT_BACKEND=keychain
|
export AWS_VAULT_BACKEND=keychain
|
||||||
export AWS_VAULT_KEYCHAIN_NAME="aws-vault"
|
export AWS_VAULT_KEYCHAIN_NAME="aws-vault.keychain-db"
|
||||||
export AWS_LOGIN_BROWSER="firefox"
|
export AWS_LOGIN_BROWSER="firefox"
|
||||||
|
|
||||||
#export KUBECONFIG=/Users/steve.briggs/.kube/config:/Users/steve.briggs/.kube/minikube
|
|
||||||
export KUBECONFIG="${HOME}/.kube/teleport-kubeconfig:${HOME}/.kube/config:${HOME}/.kube/minikube"
|
export KUBECONFIG="${HOME}/.kube/teleport-kubeconfig:${HOME}/.kube/config:${HOME}/.kube/minikube"
|
||||||
export PATH=$PATH:/private/var/folders/ky/m6p32md91_n2q6z94fdn8fsw0000gq/T/AppTranslocation/F252CD76-5A71-4D7F-8826-12175DB43E32/d/Visual\ Studio\ Code.app/Contents/Resources/app/bin
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue