阅读时间:8 minutes

为什么要在…​安装 VS Code`/opt`或 通过`apt`当可以把它放在自己的 home 目录,并把 IDE 变成游乐场时,就可以永不输入`sudo`? 这是一个关于本地安装的叙述,随后是一场为扩大菜单和文件资源管理器字体而进行的艰苦斗争。

路径概览

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

actor Développeur as dev
actor "opencode\n+ LLM" as agent

package "主页 用户 (~)" #LightGreen {
    package "~/apps/" {
        component "VS Code\n(tarball)" as vscode #SkyBlue
        component "vscode-update.sh" as script #LightYellow
    }
    package "~/.config/Code/" {
        component "settings.json" as settings #Lavender
    }
    package "~/.vscode-custom-css/" {
        component "custom.css\n(zoom: 1.25)" as customcss #Lavender
    }
}

cloud "code.visualstudio.com" as download

dev --> vscode : 下载并安装
dev --> script : 启动更新
script --> download : wget 最新版本
script --> vscode : 替换并重新修补 CSS
agent --> settings : Écrit config
agent --> customcss : Écrit zoom CSS
agent --> vscode : Patch workbench CSS

note right of vscode
在主目录中的安装
= 完全控制 无需sudo
end note
@enduml

为什么:VS Code 在主目录中

系统安装的问题

VS Code 已通过`apt`, dnf`或 在/opt`将应用程序的文件锁定在根权限之后。任何对原生 CSS 的修改,product.json`或安装文件夹需要`sudo.

但是,当使用时开放代码(tool CLI pour piloter un LLM sur son code), 智能体需要能够:

  • 写入配置文件`~/.config/Code/User/settings.json`) — 那已经在家里了

  • 修改 IDE 的资源 (workbench 的 CSS,product.json) 用于高级自定义 — 没有 sudo 的话,这就会被锁定

解决方案:本地安装

下载官方 tarball 存档并直接解压到`~/apps/`:

mkdir -p ~/apps
cd ~/apps
wget "https://code.visualstudio.com/sha/download?build=stable&os=linux-x64" -O vscode.tar.gz
tar -xzf vscode.tar.gz
rm vscode.tar.gz

二进制文件随后位于`~/apps/VSCode-linux-x64/bin/code`. 没有`sudo`不需要为了读取、修改或替换任何文件而`~/apps/VSCode-linux-x64/`。

具体优势

@startuml
skinparam backgroundColor #FEFEFE

rectangle "安装系统\n(/opt, apt, dnf)" #LightCoral {
    card "VS Code 属于 root" {
        [CSS du workbench : sudo requis]
        [product.json : sudo requis]
        [Dossier d'install : non modifiable]
    }
}

rectangle "安装Home\n(~/apps)" #LightGreen {
    card "VS Code 属于用户" {
        [CSS du workbench : libre]
        [product.json : libre]
        [Dossier d'install : libre]
        [Script update maison]
    }
}

"安装系统\n(/opt, apt, dnf)" -right-> "安装Home\n(~/apps)" : **Non, merci**\nJe prends le home

note bottom of "安装Home\n(~/apps)"
代理 opencode+LLM 可以在不提升权限的情况下修改 IDE 的文件.
end note
@enduml
优势 细节

没有 sudo

IDE的所有文件都属于用户

直接修改 CSS

我们可以打补丁`workbench.desktop.main.css`没有特权提升

自制更新脚本

一个简单的 shell 脚本会自动下载、替换并重新打补丁

隔离

系统安装未被污染;回滚 = 删除文件夹

自定义主菜单的字体

发现

主菜单(File、Edit、View…​)和下拉菜单的默认字体太小,VS Code 没有提供任何设置来修改它。

技术:直接CSS补丁

我们在文件末尾添加CSS`workbench.desktop.main.css` :

@startuml
skinparam backgroundColor #FEFEFE
autonumber

actor Développeur as dev
participant "workbench.desktop\n.main.css" as css
participant "product.json" as product
participant "VS Code" as vscode

== Patch CSS ==
dev -> css : 添加规则 font-size\n(.menubar-menu-title, etc.)
dev -> vscode : 重新启动 VS Code
vscode -> vscode : 加载已修补的 CSS
vscode --> dev : 菜单和下拉框为23px/22px ✓

== Suppression warning ==
vscode --> dev : ⚠️ "您的安装已损坏"
dev -> product : Supprimer clé "校验和"\n(python3 -c ...)
dev -> vscode : 重新启动 VS Code
vscode --> dev : 没有更多警告 ✓

note over css, product
在 ~/apps/ 中的两个文件 = 可在不使用 sudo 的情况下修改
end note
@enduml
CSS_FILE="$HOME/apps/VSCode-linux-x64/resources/app/out/vs/workbench/workbench.desktop.main.css"

cat >> "$CSS_FILE" << 'EOF'
.menubar-menu-title{font-size:23px!important}
.menubar>.menubar-menu-button{font-size:23px!important}
.monaco-menu-option{font-size:22px!important;line-height:34px!important}
.monaco-menu .action-label:not(.codicon){font-size:22px!important}
.menubar-menu-items-holder .monaco-menu .action-item .action-label{font-size:22px!important}
EOF

删除完整性警告

VS Code 检测到其文件的修改并显示横幅 "Your installation is corrupt"。为避免这种情况,我们删除其校验和的`product.json`:

import json
product_json = "$HOME/apps/VSCode-linux-x64/resources/app/product.json"
with open(product_json, 'r') as f:
    data = json.load(f)
data.pop('checksums', None)
with open(product_json, 'w') as f:
    json.dump(data, f, indent=2)

重新启动后,不再有警告,菜单终于可以阅读。

自定义资源管理器窗格字体 — 战斗

尝试 1 : 不存在的参数

首先尝试原生参数`workbench.tree.fontSize`在`settings.json`:

{
    "workbench.tree.fontSize": 20
}

结果 :没有效果. 此设置在 VS Code 中不存在。这证明未识别的设置会被静默忽略。

尝试 2 :Custom CSS and JS Loader 扩展

安装扩展`be5invis.vscode-custom-css`:

~/apps/VSCode-linux-x64/bin/code --install-extension be5invis.vscode-custom-css

我们创建一个 CSS 文件在`~/.vscode-custom-css/custom.css`使用针对资源管理器元素的选择器:

.monaco-tree-rows .monaco-tree-row,
.sidebar .monaco-list-row,
.explorer-viewlet .monaco-list-row,
.monaco-list-row .monaco-icon-label {
    font-size: 22px !important;
    line-height: 36px !important;
}

我们在设置中引用此文件:

{
    "vscode_custom_css.imports": [
        "file:///home/user/.vscode-custom-css/custom.css"
    ]
}

结果 :更改未应用.

陷阱:必须每次都启用扩展

扩展的文档对此关键点含糊其辞:每次修改自定义 CSS 之后,需要必须从调色板执行命令:

  1. Ctrl+Shift+P→ 输入启用自定义 CSS 和 JS

  2. VS Code 要求重新启动 → 接受

没有这一步,CSS 永远不会被注入到 IDE 中。

尝试 3:线条重叠

即使有`font-size: 22px` et line-height: 36px, 带有挂脚的字母(g, p, f, b)溢出到相邻的行。尝试添加`height` et min-height:

.monaco-list-row {
    height: 36px !important;
    min-height: 36px !important;
}

结果 :没有变化. VS Code 使用 JavaScript 计算行高并覆盖 CSS 值。

解决方案:在父容器上进行 `zoom

@startuml
skinparam backgroundColor #FEFEFE

rectangle "尝试 1\nParam不存在" #LightCoral {
    card "workbench.tree.fontSize" as t1 {
        [VS Code ignore le paramètre]
    }
}

rectangle "尝试 2\nCustom CSS + font-size" #LightYellow {
    card ".monaco-list-row { font-size: 22px }" as t2 {
        [Texte plus grand\nmais lignes superposées]
    }
}

rectangle "尝试 3\nfont-size + line-height + height" #LightYellow {
    card "height: 36px !important" as t3 {
        [VS Code override\npar JavaScript]
        [Aucun effet]
    }
}

rectangle "解决方案\n父容器的缩放" #LightGreen {
    card ".monaco-list-rows { zoom: 1.25 }" as t4 {
        [Texte + espacement\nproportionnels]
        [Layout JS respecté]
        [✓ Résultat conforme]
    }
}

t1 -down-> t2 : 没有参数?\nOn 尝试它 CSS
t2 -down-> t3 : 重叠的线条? `\nOn` 强制高度
t3 -down-> t4 : 覆盖 JS ?\\nOn 使用 缩放

@enduml

与其与 JavaScript 布局作斗争,我们使用该属性`zoom`在行容器上:

.explorer-viewlet .monaco-list-rows,
.sidebar .monaco-list-rows {
    zoom: 1.25;
}

`zoom`均匀放大容器的渲染 — 文本和间距 — 而不破坏 VS Code JavaScript 引擎计算的布局。因子 1.25 大致相当于从 13px 增加到 16px。

结果:文件名终于可以读取,行间距正确调整。

选择器概述及其有效情况

方法 CSS 结果

font-size`在.monaco-list-row`

font-size: 22px !important

更大的文字但行线重叠

line-height+height`在.monaco-list-row`

line-height: 36px; height: 36px

无效果 (override JS)

zoom`在.monaco-list-rows`

zoom: 1.25

成功 — 文本 + 比例间距

自动更新脚本

@startuml
skinparam backgroundColor #FEFEFE
autonumber

actor "开发者\n或cron" as dev
participant "vscode-update.sh" as script
participant "vscode tarball\n(code.visualstudio.com)" as remote
participant "~/apps/\nVSCode-linux-x64/" as local
participant "~/apps/\nvscode-backup/" as backup
participant "workbench\n.desktop.main.css" as css
participant "product.json" as product

dev -> script : ./vscode-update.sh
script -> local : 读取当前版本
script -> remote : wget 最新版本
script -> script : 比较版本

alt Version identique
    script --> dev : "已经是最新的!"
else Nouvelle version
    script -> backup : Sauvegarder installation courante\n(horodatée)
    script -> local : rm -rf 旧的安装
    script -> local : mv 新安装
    script -> css : 添加 补丁 CSS\n(menubar 23px, dropdown 22px)
    script -> product : 删除 checksumsn(python3)
    script --> dev : "更新完成\n1.xx.yy → 1.zz.ww"
end note
@enduml

问题

当 VS Code 更新时,它会替换安装文件夹并删除所有 CSS 补丁. 必须每次手动重新应用修改。

脚本 `vscode-update.sh

我们创建`~/apps/vscode-update.sh`:

#!/bin/bash
set -e

VSCODE_DIR="$HOME/apps/VSCode-linux-x64"
BACKUP_DIR="$HOME/apps/vscode-backup"
TEMP_DIR="/tmp/vscode-update"

MENUBAR_FONT_SIZE="23px"
DROPDOWN_FONT_SIZE="22px"

echo "=== VS Code Local Updater ==="

CURRENT_VERSION=$("$VSCODE_DIR/bin/code" --version 2>/dev/null | head -1)
echo "Current version: $CURRENT_VERSION"

echo "Downloading latest VS Code..."
mkdir -p "$TEMP_DIR"
wget -q "https://code.visualstudio.com/sha/download?build=stable&os=linux-x64" \
    -O "$TEMP_DIR/vscode.tar.gz"

echo "Extracting..."
mkdir -p "$TEMP_DIR/extracted"
tar -xzf "$TEMP_DIR/vscode.tar.gz" -C "$TEMP_DIR/extracted"

NEW_VERSION=$("$TEMP_DIR/extracted/VSCode-linux-x64/bin/code" \
    --version 2>/dev/null | head -1)
echo "New version: $NEW_VERSION"

if [ "$CURRENT_VERSION" = "$NEW_VERSION" ]; then
    echo "Already up to date!"
    rm -rf "$TEMP_DIR"
    exit 0
fi

echo "Backing up current installation..."
mkdir -p "$BACKUP_DIR"
cp -r "$VSCODE_DIR" "$BACKUP_DIR/VSCode-linux-x64-$(date +%Y%m%d-%H%M%S)"

echo "Updating..."
rm -rf "$VSCODE_DIR"
mv "$TEMP_DIR/extracted/VSCode-linux-x64" "$VSCODE_DIR"
rm -rf "$TEMP_DIR"

CSS_FILE="$VSCODE_DIR/resources/app/out/vs/workbench/workbench.desktop.main.css"
echo "Re-applying custom CSS patch \
    (menubar=${MENUBAR_FONT_SIZE}, dropdown=${DROPDOWN_FONT_SIZE})..."
cat >> "$CSS_FILE" << CSSEOF
.menubar-menu-title{font-size:${MENUBAR_FONT_SIZE}!important}\
.menubar>.menubar-menu-button{font-size:${MENUBAR_FONT_SIZE}!important}\
.monaco-menu-option{font-size:${DROPDOWN_FONT_SIZE}!important;\
line-height:34px!important}\
.monaco-menu .action-label:not(.codicon)\
{font-size:${DROPDOWN_FONT_SIZE}!important}\
.menubar-menu-items-holder .monaco-menu .action-item .action-label\
{font-size:${DROPDOWN_FONT_SIZE}!important}
CSSEOF

PRODUCT_JSON="$VSCODE_DIR/resources/app/product.json"
if [ -f "$PRODUCT_JSON" ]; then
    echo "Removing checksums to prevent integrity warning..."
    python3 -c "
import json
with open('$PRODUCT_JSON','r') as f: data=json.load(f)
data.pop('checksums', None)
with open('$PRODUCT_JSON','w') as f: json.dump(data,f,indent=2)
print('Done.')
"
fi

echo "=== Update complete: $CURRENT_VERSION -> $NEW_VERSION ==="

脚本:

  1. 下载最新稳定版

  2. 检查版本是否与当前版本不同

  3. 保存当前安装(带时间戳)到`~/apps/vscode-backup/`

  4. 替换安装文件夹

  5. 重新应用主菜单的 CSS 补丁

  6. 删除校验和 de `product.json`为了避免完整性警告

注释:通过自定义CSS扩展和文件自定义资源管理器窗格`~/.vscode-custom-css/custom.css`它们能够幸免于更新,因为它们位于安装文件夹之外。

相关文件 — 概览

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

rectangle "安装 VS Coden(~/apps/VSCode-linux-x64/)" #LightCoral {
    component "workbench.desktop\n.main.css" as css #LightCoral
    component "product.json" as product #LightCoral
    component "二进制\nbin/code" as binary #LightCoral
}

rectangle "用户配置n(~/.config/Code/)" #LightGreen {
    component "settings.json" as settings #LightGreen
    component "扩展/" as extensions #LightGreen
}

rectangle "持久自定义\n(~/.vscode-custom-css/)" #SkyBlue {
    component "custom.css\n(zoom: 1.25)" as customcss #SkyBlue
}

rectangle "自动化\n(~/apps/)" #LightYellow {
    component "vscode-update.sh" as script #LightYellow
    component "vscode-backup/" as backup #LightYellow
}

script ..> css : 在 MAJ 之后重新打补丁
script ..> product : 删除校验和\n在 MAJ 之后
settings --> customcss : 参考通过\nvscode_custom_css.imports
extensions ..> css : 自定义 CSS 加载器\n注入 custom.css

note bottom of css
在更新时无法生存
由脚本重新修补
end note

note bottom of customcss
经得起更新
位于安装文件夹之外
end note

note bottom of settings
Survit" 在更新中仍然存活
Vit 在 ~/.config/ 中
end note
@enduml
路径 角色 经得起更新吗?

~/apps/VSCode-linux-x64/

IDE的安装

不(已替换)

~/apps/VSCode-linux-x64/resources/app/out/vs/workbench/workbench.desktop.main.css

工作台的CSS(菜单、下拉框)

不 (由脚本重新修补)

~/apps/VSCode-linux-x64/resources/app/product.json

完整性校验和

否(由脚本重新清洁)

~/apps/vscode-update.sh

自动更新脚本

是的

~/.config/Code/User/settings.json

用户设置(fontSize,自定义 CSS)

是的

~/.vscode-custom-css/custom.css

适用于 Explorer 的自定义 CSS(缩放)

是的

吸取的教训

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
skinparam ArrowColor #444444

rectangle "**本地安装**\n 在 home 中" as install #LightGreen {
    card "不需要 sudo\n 来修改 CSS/config" as i1
    card "opencode+LLM 可以\n 修改所有内容" as i2
    card "Rollback = 恢复\n 带时间戳的备份" as i3
}

rectangle "自定义 CSS\n缩放 vs 字体大小" as css #LightYellow {
    card "对于组件列表,zoom > font-size" as c1
    card "布局 JS 覆盖\n 高度/line-height" as c2
    card "自定义扩展 CSS 需要手动激活 (Ctrl+Shift+P)" as c3
}

rectangle "自动化\n更新脚本" as auto #LightCoral {
    card "重新打补丁 CSS 之后\n 每次 MAJ" as a1
    card "删除 校验和\n product.json" as a2
    card "带时间戳的备份\n替换之前" as a3
}

install -right-> css : 然后
css -right-> auto : 终于

note top of install
完全控制,无需提升特权
end note

note top of auto
没有脚本,每个 MAJ

删除补丁 CSS
end note
@enduml

在 home 中安装将释放全部

一个本地安装在`~/apps`对 VS Code 给予完全控制:

  • 没有`sudo`要修改 CSS 或配置

  • opencode+LLM 代理可以写入 IDE 的配置文件和资源

  • 简单回滚 : 恢复带时间戳的备份

zoom` > font-size 对于列表组件

VS Code 通过 JavaScript 控制行高。修改`font-size`无法修改布局引擎分配的高度会导致文本溢出。属性`zoom`在父容器上按比例放大一切,从而规避此问题。

Custom CSS 扩展需要显式激活

这不是一个 "set and forget" 参数。对自定义 CSS 文件的每次修改都需要重新执行 "Enable Custom CSS and JS" 从命令面板 (Ctrl+Shift+P).

一个更新脚本是必不可少的

没有脚本,每次 VS Code 更新都会删除 workbench 的 CSS 补丁。脚本`vscode-update.sh`自动化下载、替换、重新打补丁和清理校验和。

快速参考

  • 下载 VS Code : https://code.visualstudio.com/Download

  • 自定义 CSS 和 JS 加载器扩展 :`be5invis.vscode-custom-css`

  • Issue VS Code 要求 Explorer 使用原生字体设置 :https://github.com/microsoft/vscode/issues/149[github.com/microsoft/vscode#149]

相关文章