thời gian đọc: 8 minutes

Tại sao cài đặt VS Code trong`/opt` ou via apt`khi có thể đặt nó trong thư mục home của mình và biến IDE của mình thành sân chơi mà không bao giờ phải gõ phím`sudo? Đây là câu chuyện về một lần cài đặt cục bộ, tiếp sau là một cuộc chiến gay gắt nhằm phóng to phông chữ của menu và trình quản lý tệp.

Tổng quan về hành trình

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

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

package "Home Người dùng (~)" #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 : Tải xuống & cài đặt
dev --> script : Chạy cập nhật
script --> download : wget phiên bản mới nhất
script --> vscode : Thay thế + patch lại CSS
agent --> settings : Écrit config
agent --> customcss : Écrit zoom CSS
agent --> vscode : Patch workbench CSS

note right of vscode
Cài đặt trong thư mục home
= kiểm soát hoàn toàn mà không cần sudo
end note
@enduml

Lý do: VS Code trong Home

Vấn đề với việc cài đặt hệ thống

VS Code được cài đặt qua`apt`, dnf`hoặc trong/opt`khóa các tệp của ứng dụng đằng sau quyền root. Mọi sửa đổi đối với CSS gốc, của`product.json`hoặc của thư mục cài đặt cần`sudo`.

Tuy nhiên, khi sử dụngopencode(công cụ CLI để điều khiển một LLM trên mã của mình), tác nhân cần có khả năng:

  • Ghi vào các tệp cấu hình (~/.config/Code/User/settings.json) — cái đó thì đã có trong home rồi

  • Sửa đổi tài nguyên của IDE (CSS của Workbench,product.json) cho các tùy chỉnh nâng cao — điều đó bị chặn nếu không có sudo

Giải pháp: cài đặt cục bộ

Tải xuống tệp lưu trữ tarball chính thức và giải nén nó trực tiếp vào`~/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

Khi đó, tệp nhị phân nằm ở`~/apps/VSCode-linux-x64/bin/code`. Không có`sudo`cần thiết để đọc, sửa đổi hoặc thay thế bất kỳ tệp nào trong`~/apps/VSCode-linux-x64/`.

Lợi ích cụ thể

@startuml
skinparam backgroundColor #FEFEFE

rectangle "Installation Hệ thống\n(/opt, apt, dnf)" #LightCoral {
    card "VS Code thuộc về root" {
        [CSS du workbench : sudo requis]
        [product.json : sudo requis]
        [Dossier d'install : non modifiable]
    }
}

rectangle "Cài đặt Home\n(~/apps)" #LightGreen {
    card "VS Code thuộc về người dùng" {
        [CSS du workbench : libre]
        [product.json : libre]
        [Dossier d'install : libre]
        [Script update maison]
    }
}

"Installation Hệ thống\n(/opt, apt, dnf)" -right-> "Cài đặt Home\n(~/apps)" : **Non, merci**\nJe prends le home

note bottom of "Cài đặt Home\n(~/apps)"
Người dùng opencode+LLM có thể sửa đổi các tệp của IDE mà không cần bất kỳ nâng cấp đặc quyền nào.
end note
@enduml
Ưu điểm Chi tiết

Không có sudo

Tất cả các tệp của IDE đều thuộc về người dùng

Chỉnh sửa trực tiếp CSS

Có thể vá`workbench.desktop.main.css`không leo thang đặc quyền

Script cập nhật tự tạo

Một script shell đơn giản tải xuống, thay thế và tự động vá lại

Cách ly

Việc cài đặt hệ thống không bị ô nhiễm; rollback = xóa thư mục

Tùy chỉnh phông chữ của menu chính

Nhận định

Phông chữ mặc định của menu chính (File, Edit, View…​) và các menu thả xuống quá nhỏ. VS Code không cung cấp bất kỳ cài đặt nào để thay đổi nó.

Kỹ thuật: bản vá CSS trực tiếp

Chúng ta thêm CSS vào cuối tệp`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 : Thêm các quy tắc font-size\n(.menubar-menu-title, v.v.)
dev -> vscode : Khởi động lại VS Code
vscode -> vscode : Tải CSS đã vá
vscode --> dev : các menu và các dropdown trong 23px/22px ✓

== Suppression warning ==
vscode --> dev : ⚠️ "Cài đặt của bạn bị hỏng
dev -> product : Xóa khóa "checksums"\n(python3 -c ...)
dev -> vscode : Khởi động lại VS Code
vscode --> dev : Không còn cảnh báo ✓

note over css, product
Hai file trong /apps/ có thể chỉnh sửa mà không cần 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

Xóa cảnh báo về tính toàn vẹn

VS Code phát hiện các thay đổi đối với các tệp của nó và hiển thị biểu ngữ "Your installation is corrupt". Để tránh điều đó, người ta xóa các checksum của`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)

Sau khi khởi động lại, không còn cảnh báo nữa và các menu cuối cùng đã đọc được.

Tùy chỉnh phông chữ của ngăn Explorer — cuộc chiến

Lần thử 1: một tham số không tồn tại

Đầu tiên, ta thử tham số native`workbench.tree.fontSize`trong`settings.json` :

{
    "workbench.tree.fontSize": 20
}

Kết quả:không có tác dụng. Tham số này không tồn tại trong VS Code. Bằng chứng rằng các tham số không được nhận diện bị âm thầm bỏ qua.

Lần thử 2: tiện ích mở rộng Custom CSS and JS Loader

Chúng ta cài đặt tiện ích mở rộng`be5invis.vscode-custom-css` :

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

Chúng ta tạo một tệp CSS trong`~/.vscode-custom-css/custom.css`với các bộ chọn nhắm đến các phần tử của trình khám phá:

.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;
}

Và chúng ta tham chiếu tệp này trong phần cài đặt:

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

Kết quả:các thay đổi không được áp dụng.

Cái bẫy: phải kích hoạt tiện ích mở rộng mỗi lần

Tài liệu của tiện ích mở rộng khá kín tiếng về điểm quan trọng này: sau mỗi lần chỉnh sửa CSS tùy chỉnh, cần phảibắt buộcthực thi lệnh từ bảng lệnh:

  1. Ctrl+Shift+P→ gõBật CSS và JS tùy chỉnh

  2. VS Code yêu cầu khởi động lại → chấp nhận

Nếu không có bước này, CSS sẽ không bao giờ được chèn vào IDE.

Lần thử 3: các dòng chồng lên nhau

Ngay cả với`font-size: 22px` et line-height: 36px, các chữ cái có nét thò (g, p, f, b) tràn sang các dòng bên cạnh. Người ta đang cố thêm`height` et min-height:

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

Kết quả:không có thay đổi. VS Code tính toán chiều cao dòng bằng JavaScript và ghi đè các giá trị CSS.

Giải pháp: zoom trên vùng chứa cha

@startuml
skinparam backgroundColor #FEFEFE

rectangle "Lần thử 1\nParamkhông tồn tại" #LightCoral {
    card "workbench.tree.fontSize" as t1 {
        [VS Code ignore le paramètre]
    }
}

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

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

rectangle "Giải pháp\nzoom trên container cha" #LightGreen {
    card ".monaco-list-rows { zoom: 1.25 }" as t4 {
        [Texte + espacement\nproportionnels]
        [Layout JS respecté]
        [✓ Résultat conforme]
    }
}

t1 -down-> t2 : Không có tham số? \nOn thử CSS
t2 -down-> t3 : Các dòng xếp chồng lên nhau?\nOn buộc chiều cao
t3 -down-> t4 : Ghi đè JS ?\nOn sử dụng zoom

@enduml

Thay vì phải vật lộn với layout JavaScript, người ta sử dụng thuộc tính`zoom`trên vùng chứa các dòng:

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

`zoom`phóng to đồng đều phần hiển thị của vùng chứa — văn bản VÀ khoảng cách — mà không làm hỏng bố cục do engine JavaScript của VS Code tính toán. Hệ số 1,25 tương ứng gần đúng với việc chuyển từ 13px sang 16px.

Kết quả:cuối cùng tên tệp đã dễ đọc, các dòng được giãn cách đúng.

Tóm tắt các selector và những gì hoạt động

Cách tiếp cận CSS Kết quả

font-size`trên.monaco-list-row`

font-size: 22px !important

Chữ lớn hơn nhưng các dòng bị chồng lên nhau

line-height+height`trên.monaco-list-row`

line-height: 36px; height: 36px

Không có hiệu ứng (ghi đè JS)

zoom`trên.monaco-list-rows`

zoom: 1.25

Thành công — văn bản + khoảng cách tỷ lệ

Tập lệnh cập nhật tự động

@startuml
skinparam backgroundColor #FEFEFE
autonumber

actor "Nhà phát triển\nhoặc 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 : Đọc phiên bản hiện tại
script -> remote : wget phiên bản mới nhất
script -> script : So sánh phiên bản

alt Version identique
    script --> dev : "Đã cập nhật!"
else Nouvelle version
    script -> backup : Sao lưu bản cài đặt hiện tại\n(horodatée)
    script -> local : rm -rf cài đặt cũ
    script -> local : mv cài đặt mới
    script -> css : Thêm bản vá CSS\n(menubar 23px, dropdown 22px)
    script -> product : Xóa checksums\n(python3)
    script --> dev : "Cập nhật hoàn tất\n1.xx.yy → 1.zz.ww"
end note
@enduml

Vấn đề

Khi VS Code cập nhật, nó thay thế thư mục cài đặt vàxóa tất cả các bản vá CSS. Cần phải áp dụng lại các thay đổi thủ công mỗi lần.

Tập lệnh `vscode-update.sh

Người ta tạo ra`~/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 ==="

Kịch bản:

  1. Tải phiên bản ổn định mới nhất

  2. Kiểm tra xem phiên bản có khác với phiên bản hiện tại không.

  3. Sao lưu bản cài đặt hiện tại (có dấu thời gian) vào`~/apps/vscode-backup/`

  4. Thay thế thư mục cài đặt

  5. Áp dụng lạibản vá CSS của menu chính

  6. Xóa các checksum de `product.json`để tránh cảnh báo về tính toàn vẹn

GHI CHÚ: Các tùy chỉnh của ngăn Explorer thông qua tiện ích Custom CSS và tệp`~/.vscode-custom-css/custom.css`sống sót qua các bản cập nhật vì chúng nằm ngoài thư mục cài đặt.

Các tệp liên quan — tổng quan

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

rectangle "Cài đặt VS Code\n(~/apps/VSCode-linux-x64/)" #LightCoral {
    component "workbench.desktop\n.main.css" as css #LightCoral
    component "product.json" as product #LightCoral
    component "nhị phân\nbin/code" as binary #LightCoral
}

rectangle "Cấu hình người dùng\n(~/.config/Code/)" #LightGreen {
    component "settings.json" as settings #LightGreen
    component "mở rộng/" as extensions #LightGreen
}

rectangle "Tùy chỉnh bền vững\n(~/.vscode-custom-css/)" #SkyBlue {
    component "custom.css\n(zoom: 1.25)" as customcss #SkyBlue
}

rectangle "Tự động hoá\n(~/apps/)" #LightYellow {
    component "vscode-update.sh" as script #LightYellow
    component "vscode-backup/" as backup #LightYellow
}

script ..> css : Patch lại sau MAJ
script ..> product : Xóa checksums\nsau MAJ
settings --> customcss : Tham chiếu qua\nvscode_custom_css.imports
extensions ..> css : Tùy chỉnh CSS Trình tải\ntiêm custom.css

note bottom of css
Không còn sống sau các bản cập nhật
Được vá lại bởi script
end note

note bottom of customcss
Có thể chịu đựng các bản cập nhật
Không nằm trong thư mục cài đặt
end note

note bottom of settings
Sống sót qua các bản cập nhật
Sống trong ~/.config/
end note
@enduml
Đường Vai trò Có sống sót qua các bản cập nhật không?

~/apps/VSCode-linux-x64/

Cài đặt IDE

Không (đã thay thế)

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

CSS của workbench (menu, menu thả xuống)

Không (được vá lại bởi script)

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

Tổng kiểm tra tính toàn vẹn

Không (được làm sạch lại bởi script)

~/apps/vscode-update.sh

Script cập nhật tự động

Vâng

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

Cài đặt người dùng (fontSize, custom CSS)

Vâng

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

CSS tùy chỉnh cho Explorer (zoom)

Vâng

Bài học kinh nghiệm

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

rectangle "**Cài đặt cục bộ**\n trong thư mục home" as install #LightGreen {
    card "Không cần sudo\n để sửa CSS/config" as i1
    card "opencode+LLM có thể\n sửa mọi thứ" as i2
    card "Rollback = khôi phục\n bản sao lưu có dấu thời gian" as i3
}

rectangle "**Tùy chỉnh CSS**\n zoom so với font-size" as css #LightYellow {
    card "zoom > font-size\n cho các thành phần danh sách" as c1
    card "Ghi đè bố cục JS\n height/line-height" as c2
    card "Tiện ích tùy chỉnh CSS\n cần kích hoạt\n thủ công (Ctrl+Shift+P)" as c3
}

rectangle "**Tự động hóa**\n script cập nhật" as auto #LightCoral {
    card "Vá lại CSS sau\n mỗi MAJ" as a1
    card "Xóa checksums\n product.json" as a2
    card "Sao lưu có dấu thời gian\n trước khi thay thế" as a3
}

install -right-> css : sau đó
css -right-> auto : cuối cùng

note top of install
Kiểm soát hoàn toàn mà không cần nâng đặc quyền
end note

note top of auto
Không có script, mỗi MAJ
xóa các patch CSS
end note
@enduml

Cài đặt trong thư mục home giải phóng mọi thứ

Một bản cài đặt cục bộ trong`~/apps`mang lại toàn quyền kiểm soát VS Code:

  • Không có`sudo`để sửa đổi CSS hoặc cấu hình

  • Tác nhân opencode+LLM có thể ghi vào các tệp cấu hình và tài nguyên của IDE

  • Rollback đơn giản: khôi phục bản sao lưu có dấu thời gian

zoom` > font-size cho các thành phần list

VS Code kiểm soát chiều cao dòng thông qua JavaScript. Chỉnh sửa`font-size`không thể thay đổi chiều cao do công cụ bố cục phân bổ sẽ tạo ra những văn bản bị tràn. Thuộc tính`zoom`trên container cha phóng to mọi thứ theo tỷ lệ và tránh được vấn đề này.

Tiện ích mở rộng Custom CSS cần được kích hoạt rõ ràng

Đây không phải là một thiết lập "set and forget". Mỗi lần sửa đổi tệp CSS tùy chỉnh đều cần chạy lại "Enable Custom CSS and JS" từ bảng lệnh (Ctrl+Shift+P).

Một script cập nhật là không thể thiếu

Nếu không có script, mỗi lần cập nhật VS Code đều xóa các bản vá CSS của workbench. Script`vscode-update.sh`tự động hóa việc tải xuống, thay thế, vá lại và dọn dẹp các checksum.

Tham khảo nhanh

  • Tải xuống VS Code: https://code.visualstudio.com/Download

  • Tiện ích tải CSS và JS tùy chỉnh:`be5invis.vscode-custom-css`

  • Issue VS Code yêu cầu một tham số gốc cho phông chữ của Explorer:https://github.com/microsoft/vscode/issues/149[github.com/microsoft/vscode#149]

Bài viết liên quan