VS Code in het thuismap: lokale installatie en aanpassing van fonts zonder sudo
Gepubliceerd op 17 April 2026
Waarom VS Code installeren in`/opt`of via`apt`als je het kunt zetten in jouw home en jouw IDE transformeren tot een speelterrein zonder ooit te typen`sudo`Hier is het verhaal van een lokale installatie, gevolgd door een hardnekkige strijd om de lettertypen in het menu en de bestandsverkenner te vergroten.
Overzicht van het parcours
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
actor Développeur as dev
actor "opencode\n+ LLM" as agent
package "Home Gebruiker (~)" #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élécharge & installe
dev --> script : Lance mise à jour
script --> download : wget dernière version
script --> vscode : Remplace + re-patch CSS
agent --> settings : Écrit config
agent --> customcss : Écrit zoom CSS
agent --> vscode : Patch workbench CSS
note right of vscode
Installatie in de home
= volledige controle zonder sudo
end note
@enduml
De waarom: VS Code in de Home
Het probleem met de systeeminstallatie
VS Code geïnstalleerd via`apt`, dnf`of in/opt`Vergrendelt de toepassingsbestanden achter root-rechten. Elke wijziging van de native CSS, van`product.json`of de installatiemap vereist`sudo`.
Echter, wanneer men gebruiktopencode(tool CLI om een LLM op zijn code te besturen), de agent heeft de mogelijkheid nodig om :
-
Schrijven in de configuratiebestanden (
~/.config/Code/User/settings.json) — dat is al thuis -
Wijzig de assets van de IDE (CSS van de workbench,
product.json) voor de geavanceerde aanpassingen — dat, is geblokkeerd zonder sudo
De oplossing: een lokale installatie
We downloaden de officiële tarball-archief en pakken het direct uit in`~/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
De binaire bevindt zich dan in`~/apps/VSCode-linux-x64/bin/code`. Geen`sudo`is niet nodig om een bestand te lezen, te bewerken of te vervangen onder`~/apps/VSCode-linux-x64/`.
Concrete voordelen
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Installatie Systeem\n(/opt, apt, dnf)" #LightCoral {
card "VS Code eigendom van root" {
[CSS du workbench : sudo requis]
[product.json : sudo requis]
[Dossier d'install : non modifiable]
}
}
rectangle "Installatie Thuis\n(~/apps)" #LightGreen {
card "VS Code eigendom van de gebruiker" {
[CSS du workbench : libre]
[product.json : libre]
[Dossier d'install : libre]
[Script update maison]
}
}
"Installatie Systeem\n(/opt, apt, dnf)" -right-> "Installatie Thuis\n(~/apps)" : **Non, merci**\nJe prends le home
note bottom of "Installatie Thuis\n(~/apps)"
De agent opencode+LLM kan
de bestanden van IDE bewerken
zonder enige verhoging van privileges
end note
@enduml
| voordeel | detail |
|---|---|
Geen sudo |
Alle bestanden van de IDE zijn eigendom van de gebruiker |
Directe wijziging van CSS |
We kunnen patchen`workbench.desktop.main.css`zonder verhoging van privileges |
Zelfgemaakt update-script |
Een eenvoudig shellscript downloadt, vervangt en repatcht automatisch |
Isolatie |
De systeeminstallatie is niet vervuild ; rollback = de map verwijderen |
Aanpassen van het lettertype van het hoofdmenu
De bevinding
Het standaardlettertype van het hoofdmenu (File, Edit, View…) en van de vervolgkeuzelijsten is te klein. VS Code biedt geen parameter om het te wijzigen.
De techniek: directe CSS-patch
We voegen CSS toe aan het einde van het bestand`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 : Voeg regels font-size\n(.menubar-menu-title, etc.) dev -> vscode : VS Code opnieuw opstarten vscode -> vscode : Laad het gepatchte CSS vscode --> dev : Menus en dropdowns op 23px/22px ✓ == Suppression warning == vscode --> dev : ⚠️ "Uw installatie is beschadigd" dev -> product : Supprimer clé "controlsom"\n(python3 -c ...) dev -> vscode : VS Code opnieuw opstarten vscode --> dev : Geen waarschuwingen meer ✓ note over css, product Twee bestanden in ~/apps/ = bewerkbaar zonder 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
Verwijder de integriteitswaarschuwing
VS Code detecteert de wijzigingen in zijn bestanden en toont een banner "Your installation is corrupt". Om dit te voorkomen, verwijderen we de checksums van`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)
Na het opnieuw opstarten zijn er geen waarschuwingen meer en zijn de menu’s eindelijk leesbaar.
Het lettertype van het Explorer-venster aanpassen — de strijd
Tentative 1 : een parameter die niet bestaat
We proberen eerst de native parameter`workbench.tree.fontSize`in`settings.json`:
{
"workbench.tree.fontSize": 20
}
Resultaat :geen effect. Deze instelling bestaat niet in VS Code. Het bewijs dat niet-herkende instellingen stilzwijgend worden genegeerd.
Tentative 2: de extensie Custom CSS and JS Loader
We installeren de extensie`be5invis.vscode-custom-css`:
~/apps/VSCode-linux-x64/bin/code --install-extension be5invis.vscode-custom-css
We maken een CSS-bestand in`~/.vscode-custom-css/custom.css`met selectors gericht op de elementen van de verkenner :
.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;
}
En we verwijzen naar dit bestand in de instellingen:
{
"vscode_custom_css.imports": [
"file:///home/user/.vscode-custom-css/custom.css"
]
}
Resultaat :De wijzigingen worden niet toegepast.
De valkuil: je moet de extensie elke keer activeren
De documentatie van de extensie is discreet over dit cruciale punt: na elke wijziging van de custom CSS, moetabsoluutvoer de opdracht uit vanuit het palet :
-
Ctrl+Shift+P→ typenAangepaste CSS en JS inschakelen -
VS Code vraagt een herstart → accepteren
Zonder deze stap wordt de CSS nooit in de IDE geïnjecteerd.
Poging 3: de lijnen overlappen
Zelfs met`font-size: 22px` et line-height: 36px, de letters met een staaf (g, p, f, b) steken uit op de naastgelegen lijnen. We proberen toe te voegen`height` et min-height :
.monaco-list-row {
height: 36px !important;
min-height: 36px !important;
}
Resultaat :geen wijziging. VS Code berekent de regelhoogtes in JavaScript en overschrijft de CSS-waarden.
De oplossing: zoom op de oudercontainer
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Poging 1\nParameter bestaat niet" #LightCoral {
card "workbench.tree.fontSize" as t1 {
[VS Code ignore le paramètre]
}
}
rectangle "Poging 2\nCustom CSS + font-size" #LightYellow {
card ".monaco-list-row { font-size: 22px }" as t2 {
[Texte plus grand\nmais lignes superposées]
}
}
rectangle "Poging 3\nfont-size + line-height + height" #LightYellow {
card "height: 36px !important" as t3 {
[VS Code override\npar JavaScript]
[Aucun effet]
}
}
rectangle "Oplossing\nzoom op bovenliggende container" #LightGreen {
card ".monaco-list-rows { zoom: 1.25 }" as t4 {
[Texte + espacement\nproportionnels]
[Layout JS respecté]
[✓ Résultat conforme]
}
}
t1 -down-> t2 : Geen parameter ?\nWe proberen het CSS
t2 -down-> t3 : Overlappende lijnen ?\nMen dwingt de hoogte
t3 -down-> t4 : Override JS ?\nWe gebruiken zoom
@enduml
In plaats van te vechten tegen de JavaScript-layout, wordt de eigenschap gebruikt.`zoom`op de container van de lijnen :
.explorer-viewlet .monaco-list-rows,
.sidebar .monaco-list-rows {
zoom: 1.25;
}
`zoom`vergroot uniform de rendering van de container — tekst EN spatie — zonder het door JavaScript van VS Code berekende layout te verbreken. De factor 1.25 komt ongeveer overeen met een overgang van 13px naar 16px.
Resultaat :de bestandsnamen zijn eindelijk leesbaar, de regels zijn correct gespatieerd.
Samenvatting van selectors en wat werkt
| Benadering | CSS | Resultaat |
|---|---|---|
|
|
Grotere tekst maar overlappende lijnen |
|
|
Geen effect (override JS) |
|
|
Geslaagd — tekst + proportionele spatiëring |
Het script voor automatische updates
@startuml
skinparam backgroundColor #FEFEFE
autonumber
actor "Ontwikkelaar\nof 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 : Lees de huidige versie
script -> remote : wget laatste versie
script -> script : Vergelijk versies
alt Version identique
script --> dev : "Alles is up-to-date!"
else Nouvelle version
script -> backup : Back-up huidige installatie\n(gedateerd)
script -> local : rm -rf oude installatie
script -> local : mv nieuwe installatie
script -> css : Voeg patch CSS\n (menubalk 23px, dropdown 22px)
script -> product : Verwijder checksums\n(python3)
script --> dev : "Update voltooid\n1.xx.yy → 1.zz.ww"
end note
@enduml
Het probleem
Wanneer VS Code wordt bijgewerkt, vervangt het de installatiemap enWis alle CSS-patches. U moet de wijzigingen elke keer handmatig opnieuw toepassen.
Het script `vscode-update.sh
We maken`~/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 ==="
Het script :
-
Download de nieuwste stabiele versie
-
Controleer of de versie verschilt van de huidige
-
Bewaar de huidige installatie (getimestamp) in`~/apps/vscode-backup/`
-
Vervang de installatiemap
-
Opnieuw aanbrengende CSS-patch van het hoofdmenu
-
Verwijder de checksums de `product.json`om de integriteitswaarschuwing te voorkomen
| Aanpassingen van het Verkenner via de Custom CSS-extensie en het bestand`~/.vscode-custom-css/custom.css`Ze overleven updates omdat ze buiten de installatiemap leven. |
Betrokken bestanden — overzicht
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
rectangle "Installatie VS Code\n(~/apps/VSCode-linux-x64/)" #LightCoral {
component "workbench.desktop\n.main.css" as css #LightCoral
component "product.json" as product #LightCoral
component "binair\nbin/code" as binary #LightCoral
}
rectangle "Gebruikersconfiguratie\n(~/.config/Code/)" #LightGreen {
component "settings.json" as settings #LightGreen
component "extensies/" as extensions #LightGreen
}
rectangle "Persistente aanpassing\n(~/.vscode-custom-css/)" #SkyBlue {
component "custom.css\n(zoom: 1.25)" as customcss #SkyBlue
}
rectangle "Automatisering\n(~/apps/)" #LightYellow {
component "vscode-update.sh" as script #LightYellow
component "vscode-backup/" as backup #LightYellow
}
script ..> css : Opnieuw patchen na MAJ
script ..> product : Verwijder checksums\nna MAJ
settings --> customcss : Verwijzing via\nvscode_custom_css.imports
extensions ..> css : Custom CSS Loader\ninjecteert custom.css
note bottom of css
Leeft niet
Opnieuw gepatcht door het script
end note
note bottom of customcss
Overleeft`aux mises à jour`
Buiten de installatiemap
end note
note bottom of settings
**Survit** aux mises à jour
Vit dans ~/.config/
end note
@enduml
| Pad | Rol | Blijft het werken na updates ? |
|---|---|---|
|
Installation van de IDE |
Nee (vervangen) |
|
CSS van de workbench (menu, vervolgkeuzelijsten) |
Nee (hersteld door het script) |
|
Integriteitschecksummen |
Nee (opnieuw schoongemaakt door het script) |
|
Script voor automatische update |
Ja |
|
Gebruikersinstellingen (fontSize, aangepaste CSS) |
Ja |
|
Aangepaste CSS voor de Explorer (zoom) |
Ja |
Geleerde lessen
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
skinparam ArrowColor #444444
rectangle "**Lokale installatie**\n in de home" as install #LightGreen {
card "Geen sudo\n om CSS/config te wijzigen" as i1
card "opencode+LLM kan\n alles wijzigen" as i2
card "Rollback = herstellen\n van de getimestampte backup" as i3
}
rectangle "**CSS-aanpassing**\n zoom vs font-size" as css #LightYellow {
card "zoom > font-size\n voor lijstcomponenten" as c1
card "Layout JS override\n height/line-height" as c2
card "Custom CSS-extensie\n vereist handmatige\n activering (Ctrl+Shift+P)" as c3
}
rectangle "**Automatisering**\n update-script" as auto #LightCoral {
card "CSS opnieuw patchen na\n elke update" as a1
card "Checksums verwijderen\n product.json" as a2
card "Getimestampte backup\n voor vervanging" as a3
}
install -right-> css : ensuite
css -right-> auto : enfin
note top of install
Volledige controle zonder privilege-escalatie
end note
note top of auto
Zonder script wist elke update
de CSS-patches
end note
@enduml
Installeren in de home geeft alles vrij
Een lokale installatie in`~/apps`geeft volledige controle over VS Code:
-
Geen`sudo`om de CSS of de configuratie aan te passen
-
De opencode+LLM-agent kan schrijven naar de configuratiebestanden en de assets van de IDE
-
Triviale rollback: terugzetten de getijdgestempelde backup
zoom` > font-size voor de lijstcomponenten
VS Code controleert de regelhoogte via JavaScript. Wijzigen`font-size`Niet kunnen aanpassen aan de door de layout-engine toegewezen hoogte levert teksten die overlopen. De eigenschap`zoom`Op de oudercontainer vergroot alles evenredig en omzeilt dit probleem.
De Custom CSS-extensie vereist een expliciete activering.
Dit is geen "set and forget"-parameter. Elke wijziging aan het aangepaste CSS-bestand vereist het opnieuw uitvoeren van "Enable Custom CSS and JS" vanaf de opdrachtpalet (Ctrl+Shift+P).
Een script voor update is onmisbaar
Zonder script verwijdert elke update van VS Code de CSS-patches van het workbench. Het script`vscode-update.sh`automatiseert het downloaden, vervangen, herpatchen en opruimen van checksums
Snelle referenties
-
VS Code downloaden: https://code.visualstudio.com/Download
-
Extensie Custom CSS and JS Loader :`be5invis.vscode-custom-css`
-
VS Code vragend een ingebouwde instelling voor het Explorer-lettertype:https://github.com/microsoft/vscode/issues/149[github.com/microsoft/vscode#149]