Register generated VS Code theme extension

This commit is contained in:
Ryan Hughes
2026-06-02 20:28:18 -04:00
parent 4087be7f79
commit 357b77c92c
3 changed files with 90 additions and 29 deletions
+56 -4
View File
@@ -5,6 +5,56 @@
VS_CODE_THEME_DESCRIPTOR="$HOME/.config/omarchy/current/theme/vscode.json" VS_CODE_THEME_DESCRIPTOR="$HOME/.config/omarchy/current/theme/vscode.json"
GENERATED_THEME="$HOME/.config/omarchy/current/theme/vscode-theme.json" GENERATED_THEME="$HOME/.config/omarchy/current/theme/vscode-theme.json"
GENERATED_EXTENSION_NAME="omarchy-theme"
GENERATED_EXTENSION_ID="local.$GENERATED_EXTENSION_NAME"
GENERATED_EXTENSION_VERSION="1.0.0"
register_generated_extension() {
local ext_dir="$1"
local ext_base extensions_file obsolete_file relative tmp
ext_base=$(dirname "$ext_dir")
extensions_file="$ext_base/extensions.json"
obsolete_file="$ext_base/.obsolete"
relative=$(basename "$ext_dir")
if [[ -f $obsolete_file ]]; then
tmp=$(mktemp)
if jq --arg key "$GENERATED_EXTENSION_ID-$GENERATED_EXTENSION_VERSION" 'del(.[$key])' "$obsolete_file" >"$tmp"; then
mv "$tmp" "$obsolete_file"
[[ $(jq 'length' "$obsolete_file") == "0" ]] && rm -f "$obsolete_file"
else
rm -f "$tmp"
fi
fi
[[ -f $extensions_file ]] || printf '[]\n' >"$extensions_file"
tmp=$(mktemp)
if jq \
--arg id "$GENERATED_EXTENSION_ID" \
--arg version "$GENERATED_EXTENSION_VERSION" \
--arg fs_path "$ext_dir" \
--arg external "file://$ext_dir" \
--arg relative "$relative" \
'map(select(.identifier.id != $id)) + [{
identifier: { id: $id },
version: $version,
location: {
"$mid": 1,
fsPath: $fs_path,
external: $external,
path: $fs_path,
scheme: "file"
},
relativeLocation: $relative
}]' \
"$extensions_file" >"$tmp"; then
mv "$tmp" "$extensions_file"
else
rm -f "$tmp"
fi
}
# Install generated theme as a local extension for a given editor # Install generated theme as a local extension for a given editor
install_generated_extension() { install_generated_extension() {
@@ -19,15 +69,15 @@ install_generated_extension() {
fi fi
mkdir -p "$ext_dir/themes" mkdir -p "$ext_dir/themes"
cp "$GENERATED_THEME" "$ext_dir/themes/omarchy-color-theme.json" ln -sfn "$GENERATED_THEME" "$ext_dir/themes/omarchy-color-theme.json"
cat > "$ext_dir/package.json" <<EOF cat > "$ext_dir/package.json" <<EOF
{ {
"name": "omarchy-theme", "name": "$GENERATED_EXTENSION_NAME",
"displayName": "Omarchy", "displayName": "Omarchy",
"description": "Omarchy color theme", "description": "Omarchy color theme",
"publisher": "local", "publisher": "local",
"version": "1.0.0", "version": "$GENERATED_EXTENSION_VERSION",
"engines": { "vscode": "^1.70.0" }, "engines": { "vscode": "^1.70.0" },
"categories": ["Themes"], "categories": ["Themes"],
"contributes": { "contributes": {
@@ -39,6 +89,8 @@ install_generated_extension() {
} }
} }
EOF EOF
register_generated_extension "$ext_dir"
} }
set_theme() { set_theme() {
@@ -61,7 +113,7 @@ set_theme() {
fi fi
elif [[ -f "$GENERATED_THEME" ]]; then elif [[ -f "$GENERATED_THEME" ]]; then
# VS Code only discovers local color themes through an extension package. # VS Code only discovers local color themes through an extension package.
install_generated_extension "$ext_base/omarchy-theme" install_generated_extension "$ext_base/$GENERATED_EXTENSION_NAME"
theme_name="Omarchy" theme_name="Omarchy"
fi fi
+25 -25
View File
@@ -6,38 +6,38 @@ return {
priority = 1000, priority = 1000,
opts = { opts = {
colors = { colors = {
bg = "{{ bg }}", bg = "{{ bg }}",
dark_bg = "{{ dark_bg }}", dark_bg = "{{ dark_bg }}",
darker_bg = "{{ darker_bg }}", darker_bg = "{{ darker_bg }}",
lighter_bg = "{{ lighter_bg }}", lighter_bg = "{{ lighter_bg }}",
fg = "{{ fg }}", fg = "{{ fg }}",
dark_fg = "{{ dark_fg }}", dark_fg = "{{ dark_fg }}",
light_fg = "{{ light_fg }}", light_fg = "{{ light_fg }}",
bright_fg = "{{ bright_fg }}", bright_fg = "{{ bright_fg }}",
muted = "{{ muted }}", muted = "{{ muted }}",
red = "{{ red }}", red = "{{ red }}",
yellow = "{{ yellow }}", yellow = "{{ yellow }}",
orange = "{{ orange }}", orange = "{{ orange }}",
green = "{{ green }}", green = "{{ green }}",
cyan = "{{ cyan }}", cyan = "{{ cyan }}",
blue = "{{ blue }}", blue = "{{ blue }}",
purple = "{{ purple }}", purple = "{{ purple }}",
brown = "{{ brown }}", brown = "{{ brown }}",
bright_red = "{{ bright_red }}", bright_red = "{{ bright_red }}",
bright_yellow = "{{ bright_yellow }}", bright_yellow = "{{ bright_yellow }}",
bright_green = "{{ bright_green }}", bright_green = "{{ bright_green }}",
bright_cyan = "{{ bright_cyan }}", bright_cyan = "{{ bright_cyan }}",
bright_blue = "{{ bright_blue }}", bright_blue = "{{ bright_blue }}",
bright_purple = "{{ bright_purple }}", bright_purple = "{{ bright_purple }}",
accent = "{{ accent }}", accent = "{{ accent }}",
cursor = "{{ cursor }}", cursor = "{{ cursor }}",
foreground = "{{ foreground }}", foreground = "{{ foreground }}",
background = "{{ background }}", background = "{{ background }}",
selection = "{{ selection }}", selection = "{{ selection }}",
selection_foreground = "{{ selection_foreground }}", selection_foreground = "{{ selection_foreground }}",
selection_background = "{{ selection_background }}", selection_background = "{{ selection_background }}",
}, },
+9
View File
@@ -365,9 +365,18 @@ exit 1
EOF EOF
chmod +x "$FAKE_BIN/omarchy-toggle-enabled" chmod +x "$FAKE_BIN/omarchy-toggle-enabled"
mkdir -p "$PI_TMPDIR/.vscode/extensions"
echo '{"local.omarchy-theme-1.0.0":true}' >"$PI_TMPDIR/.vscode/extensions/.obsolete"
PATH="$FAKE_BIN:$ROOT/bin:$PATH" HOME="$PI_TMPDIR" "$ROOT/bin/omarchy-theme-set-vscode" PATH="$FAKE_BIN:$ROOT/bin:$PATH" HOME="$PI_TMPDIR" "$ROOT/bin/omarchy-theme-set-vscode"
jq -e '.contributes.themes[0].uiTheme == "vs"' "$PI_TMPDIR/.vscode/extensions/omarchy-theme/package.json" >/dev/null || fail "vscode generated light theme uses VS Code light uiTheme" jq -e '.contributes.themes[0].uiTheme == "vs"' "$PI_TMPDIR/.vscode/extensions/omarchy-theme/package.json" >/dev/null || fail "vscode generated light theme uses VS Code light uiTheme"
pass "vscode generated light theme uses VS Code light uiTheme" pass "vscode generated light theme uses VS Code light uiTheme"
[[ -L $PI_TMPDIR/.vscode/extensions/omarchy-theme/themes/omarchy-color-theme.json ]] || fail "vscode generated theme references current theme file"
[[ $(readlink "$PI_TMPDIR/.vscode/extensions/omarchy-theme/themes/omarchy-color-theme.json") == "$PI_TMPDIR/.config/omarchy/current/theme/vscode-theme.json" ]] || fail "vscode generated theme references current theme file"
pass "vscode generated theme references current theme file"
[[ ! -f $PI_TMPDIR/.vscode/extensions/.obsolete ]] || fail "vscode generated theme clears obsolete extension marker"
pass "vscode generated theme clears obsolete extension marker"
jq -e '.[] | select(.identifier.id == "local.omarchy-theme" and .relativeLocation == "omarchy-theme")' "$PI_TMPDIR/.vscode/extensions/extensions.json" >/dev/null || fail "vscode generated theme registers local extension"
pass "vscode generated theme registers local extension"
for binary in \ for binary in \
omarchy-update \ omarchy-update \