· · 8 min leestijd Beginner

Leer de defaults: waarom portabiliteit belangrijker is dan customization

Waarom het leren van standaard vim, tmux en CLI tool configuraties je effectiever maakt dan eindeloos customizen. Portabiliteit doet ertoe.

Zij werkt op de kale terminal van een vreemde terwijl een pauw-wezen een koffer dotfiles sleept en niet kan inloggen

TL;DR Jaren heb ik een vim- en tmux-setup zitten poetsen, en toen zat ik nutteloos voor een kale vim op een productieserver. Dus heb ik de defaults die ik al die tijd overschreef alsnog geleerd, en m’n aanpassingen erbovenop gezet in plaats van ervoor in de plaats. Hoe dat eruitziet voor vim, tmux en de shell-tools, en de vier checks waarmee ik de gaten opspoor.

Jarenlang was mijn setup het ding waar ik het trotst op was. Een dotfiles-repo met commits die verder teruggaan dan sommige banen, een vim-config die dertig plugins binnentrok, de tmux-prefix verhuisd naar iets wat lekkerder lag, een prompt waar een weekend in is gaan zitten. Tot aan de laatste keybinding van mij. Op m’n eigen laptop was ik snel, en over de tools zelf dacht ik amper nog na. Dat deed het spiergeheugen.

Tot ik op een avond naar een productieserver SSH’de om iets te debuggen, en daar nutteloos zat.

Geen mappings, geen plugins, geen aliassen. Gewoon vim zoals hij uit de doos komt, met de standaardtoetsen die ik in al die jaren overschrijven stilletjes vergeten was. Ik zat te struikelen over de basisnavigatie alsof het m’n eerste week was, terwijl er een echt probleem op me wachtte. Alles wat ik zo mooi had opgepoetst stond op een machine driehonderd kilometer verderop, en daar had ik niks aan.

De setup werkte alleen waar de setup geïnstalleerd stond. Dat had ik dus pas door op een productieserver.

Wat ik had weggegeven

Er bestaat een versie van mij die vim leerde zoals hij geleverd wordt, voordat hij ooit een plugin aanraakte. Zelfde skills, zelfde brein. Die SSH’t naar diezelfde server, opent hetzelfde bestand, en niks voelt vreemd, want de toetsen zijn de toetsen die er vanaf het begin al waren.

Die versie kan achter elke machine met vim gaan zitten en aan het werk. De laptop van een collega tijdens het pairen. Een dichtgetimmerde klantlaptop. Een verse VM die nú gedebugd moet worden. De tooling hoeft niet mee, want de vaardigheid zit in z’n handen. Er valt geen repo te clonen.

Dat is het idee van portabiliteit boven personalisatie, maar dan gericht op mijn eigen workflow. Je infrastructuur bezitten betekent dat je hem kunt bedienen vanaf elke stoel waar je toevallig zit. Voor vaardigheden geldt hetzelfde. Een vaardigheid die maar op één machine werkt is een dependency, en die ene machine krijg ik niet nagebouwd op de server van een klant.

Waar de kosten zich verstoppen

Het konijnenhol is zo ingedoken. Je leest over iemands vim-config op Reddit. Je vindt een dotfiles-repo met 3000 sterren op GitHub. Nog één plugin en je bent zoveel sneller. En dat ben je ook. Op jouw machine. Met jouw config.

De kosten zie je op die machine niet. Elke default die je remapt zonder hem eerst te leren is een stukje draagbare kennis ingeruild voor lokaal gemak, en die ruil is onzichtbaar tot het moment dat je op de bak van iemand anders zit met een deadline.

Twee mensen kunnen er identiek uitzien zolang alles werkt. De een kent de defaults en heeft ervoor gekozen ze te overschrijven. De ander heeft ze nooit geleerd en kent alleen z’n eigen setup. Zet ze allebei op een kaal systeem en het verschil is er meteen. Ik was de tweede.

De defaults waren beter dan ik me herinnerde

Dus ben ik ze alsnog gaan leren. Trager dan me lief was, op mijn eigen laptop, waar niks me ertoe dwong. En ze hebben één eigenschap die geen plugin kan evenaren. Ze zijn overal, en dat zijn ze al decennia.

Vim: leer voordat je remapt

De standaardtoetsen van vim zijn raar. Daar ga ik niet over in discussie. Ze zijn ook consistent, en de kern ervan gaat terug tot vi in de jaren ‘70, dus elke vim op elke Unix-bak luistert naar dezelfde toetsen. Die consistentie was precies wat ik aan het weggooien was.

Voordat je jk naar escape remapt, leer Ctrl+[. Werkt in vim, in bash, in alles wat op readline is gebouwd. Voordat je een fuzzy finder installeert, leer :find en :edit **/*. Voordat je eigen text objects toevoegt, krijg eerst de ingebouwde in je vingers. Remappen kan later nog steeds. Je weet dan alleen wat je opgeeft.

DefaultWat het doetWaarom het uitmaakt
Ctrl+[EscapeWerkt in elke terminal, niet alleen vim
Ctrl+o / Ctrl+iJump list navigatieGeen plugin nodig
:!commandShell commando uitvoerenBeschikbaar op elke vim
* / #Zoek woord onder cursorDirect, geen config
%Spring naar matchende bracketIngebouwd sinds altijd
gfGa naar bestand onder cursorWerkt out of the box
Ctrl+a / Ctrl+xVerhoog/verlaag nummersOnderschatte default

Ik draai nog steeds plugins en ik heb nog steeds een paar eigen mappings. Maar ik kan achter elke vim gaan zitten en meteen wat, omdat ik weet wat hij me gratis geeft.

Tmux: de prefix maakt minder uit dan je denkt

Het eerste wat iedereen in tmux verandert is de prefix, van Ctrl+b naar Ctrl+a. Ik ook. Ctrl+b ligt onhandig, en screen gebruikte Ctrl+a, dus het voelde als de logische fix.

Maar kijk even naar wat een prefix is. Je drukt hem één keer, dan een andere toets. Het onhandige aan Ctrl+b is één toetsaanslag, en na een paar duizend keer merken je vingers het niet meer. Ctrl+a botst ondertussen met “naar het begin van de regel” in bash, en daar grijp ik constant naar. En elke server met tmux erop gebruikt Ctrl+b. Train jezelf op Ctrl+a en je vecht tegen de verkeerde prefix zodra je van huis bent.

DefaultWat het doet
Ctrl+b %Verticale split
Ctrl+b "Horizontale split
Ctrl+b oCycle door panes
Ctrl+b zZoom pane
Ctrl+b [Copy mode
Ctrl+b dDetach
Ctrl+b ?Toon alle keybindings

Die laatste, Ctrl+b ?, is de reddingsboei op elke tmux. Je hoeft de bindings niet uit je hoofd te kennen als de hele lijst één toetsaanslag ver weg is.

Shell-tools: kennis die meereist

Dezelfde logica voor grep, awk, sed, find en de rest van de Unix-toolkit. Ik zie mensen ripgrep installeren en vergeten dat grep bestaat. Ze pakken fd en weten de find-syntax niet meer. Alles gaat via een alias naar de moderne vervanger tot het origineel een vreemde is geworden.

Die moderne tools zijn goed en ik gebruik ze elke dag. Maar grep staat op elk Unix-systeem. Find ook. Awk en sed staan voorgeïnstalleerd op elke server die je ooit aanraakt. Midden in een incident ga je niet eerst ripgrep installeren. Je werkt met wat er staat.

# grep basics die overal werken
grep -r "pattern" .           # recursief zoeken
grep -l "pattern" *.log       # bestanden met pattern
grep -v "exclude"             # inverse match
grep -E "regex|pattern"       # extended regex

# find basics
find . -name "*.py"           # vind op naam
find . -mtime -1              # gewijzigd in laatste dag
find . -type f -exec cmd {} \; # voer uit op resultaten

# awk one-liners
awk '{print $2}' file         # print tweede kolom
awk -F: '{print $1}' /etc/passwd  # custom delimiter
awk 'NR==5' file              # print regel 5

Ripgrep is sneller en fd leest prettiger. Grep en find staan er. Op een server die je niet beheert, krijg je wat er geïnstalleerd is.

Waarom ik het zo lang heb uitgesteld

Dus waarom had ik een productieserver nodig om dit te doen? Omdat de defaults opnieuw leren voelde als expres trager gaan. Ik had een config die werkte. Gaan zitten om vim op de saaie manier te leren, op mijn eigen machine, voor een opbrengst die alleen op de machine van een ander opduikt, verkoopt slecht aan een brein dat nu resultaat wil.

Er zat ook sunk cost in. In die dotfiles zitten echte uren, en toegeven dat een deel daarvan me een fragiel lokaal optimum had opgeleverd, deed best een beetje pijn. De repo heeft commits van jaren terug en ik ben op elke commit gesteld.

En de meeste dagen zit ik gewoon op m’n eigen machine. Het hele punt van een comfortabele setup is dat je erin woont. De rekening voor portabiliteit komt maar af en toe, en dat maakte het makkelijk om hem te blijven laten liggen.

Erbovenop, niet ervoor in de plaats

De setup is gebleven. Wat veranderde is de regel voor wat erin mag.

Toevoegen mag, vervangen niet. M’n aanpassingen zitten bovenop de defaults in plaats van eroverheen. Ctrl+b remap ik niet. Ik voeg bindings toe, en de originele werken nog. Kleurenschema’s, een nette prompt en een paar mappings die nergens ingebouwds mee botsen blijven allemaal. De ene vraag voordat ik een default overschrijf is of hij me laat stranden op een vers systeem. Zo ja, dan gaat hij er niet in. Hoe ik de repo beheer met chezmoi en mise heb ik apart opgeschreven, en ook daar voegt de config toe en vervangt hij niks.

De gaten verstoppen zich tot je gaat zoeken, dus ik test erop. Vier checks:

  1. SSH naar een server en bewerk een configbestand in vim, zonder plugins en zonder vimrc. Kun je navigeren, zoeken, vervangen en opslaan?
  2. Start een kale tmux-sessie. Splits, tussen panes bewegen, nieuwe windows, allemaal op de standaardbindings.
  3. Debug iets met alleen grep en find. Geen ripgrep, geen fd, geen aliassen. Kun je vinden wat je nodig hebt?
  4. Schrijf een awk-one-liner die een kolom uit een logbestand trekt, zonder te googelen.

Waar je struikelt, daar zit een default die het leren waard is, en dat kom je nu een stuk goedkoper te weten dan tijdens een incident.

Drie uitzonderingen, en die zijn terecht. Heb je RSI of een andere fysieke beperking, remap dan wat je nodig hebt. Je gezondheid gaat boven portabiliteit. Standaardiseert je hele team op één config, dan is die config vanaf nu je default. En verlaat je nooit je eigen machine, pair je nooit en SSH je nergens naartoe, ga dan je gang. Die luxe heb ik niet.

De dotfiles-repo staat er nog en groeit nog steeds. Wat veranderd is, is dat ik hem morgen kwijt kan raken en m’n werk toch gewoon doe. De volgende keer dat ik in een minimale container beland met niks dan een kale vim en een deadline, ben ik wat trager dan thuis. Meer is het dan niet.