25. heinäkuu 2010, 14:12

Kovista tabeista eroon

Otin itselleni uuden mission: päästä eroon kovista tabeista ja siirtyä ns. pehmeisiin tabeihin, jotka ovat siis pelkkää välilyöntiä yhden \t-merkin sijaan. Tavoitteenani on universaalimpi ote maailmasta ja muista.

Ensin pahoittelen. Olen kovin, kovin väsynyt. Eilen vietin kovasti aikaa lukien tyylikästä opastani, From Bash to Z Shell, jossa esiintyy sivu toisensa perään uutta tietoa shelleistä, joita luulin osanneeni. Tänään on päivä lähtenyt kanssa aika huonosti käyntiin. Teksti voi siis olla epäselvää.

Eli mitä nämä tabulaattorimerkit, ^I:t ovat sitten tehneet, kun minä niistä haluan niin kovasti eroon? No, eivät ne paljoa. Yleinen konsensus on kuitenkin niitä vastaan, ja syyt on helppo löytää ilman lunttaamistakin:

  • Koodin sisentäminen tabilla johtaa ulkoasun hallitsemattomuuteen. Käytän editorissani tabin leveytenä nelosta, ja yritän luonnollisesti pitää koodin 80 merkin rivipituuden rajoissa, kuten kunnon unix-parran kuuluu tehdä. Toisaalta jos ajan samaa tekstiä vaikka cat-komennolla, rivit ovat luultavasti jostain kohden nousseet yli 80 merkin mittaisiksi. Standardi on aina standardi, eli 8 merkkiä pitkä tabulaattori on voimissaan.
  • Toisaalta välien käyttäminen sisentämiseen on joustavaa. If-lohkon voi sisentää vaikka kahdella välilyönnillä ja tavallisen funktiolohkon neljällä. Editorisi antaa luultavasti kaikki eväät tehdä tämänkaltaista joustavasti, ellei peräti automaattisesti (vimin cindent -toiminto hoitaa tätä automaattisesti). Tabi on aina sen, mitä editori määrää. Ja vaikka se osaisikin kontekstiriippuvaisesti vaihdella tabin pituutta, taatusti mikä tahansa editori ei sitä tee
  • Sopivalla editorilla eroa välien ja tabien välillä on tasan ei-mitään. Toisin sanoen, saat saman käytettävyyden kuin tabien kanssa toimiessa, mutta lisää joustavuutta. Rutkasti lisää sitä.

Vim

Vim toimii about identtisesti kummassakin asetuksessa. Käydään läpi, mitä kaikkea tämä siis tarkoittaa. Ensimmäinen asetus on tietysti expandtab, joka aivan nimensämukaisesti laajentaa tabulaattoripainalluksen sopivaksi määräksi välilyöntejä. Sopiva määrä asetetaan softtabstop-asetuksella. Minulla on systeemin oletusarvona 4, mutta erityisesti asetin python-tiedostoille arvon 2.

Jos painan näillä asetuksilla tabia, saan neljä välilyöntiä. Hankalaa pyyhkiä? Ei ollenkaan: backspacen painaminen pyyhkii myös neljä väliä pois. Samalla tavalla se toimii, vaikka välit olisin lisännyt tekstiin pitämällä välilyöntiä pohjassa kotvasen aikaa.

Ja entäpä jos minulla on rivillä yksi välilyönti, ja painan tabia? Onko rivillä nyt viisi väliä? Ei minulla, sillä olen asettanut asetuksen shiftround päälle. Silloin väliä lisätään siten, että pysähdyspaikat ovat kuten tabeilla.

Erikseen on syytä lisätä vielä asetukselle shiftwidth sopiva arvo. Kyseinen määre kertoo, paljonko automaattinen sisennys antaa väliä. Jos käytät manuaalista sisennystä tai autoindenttiä, asetuksella ei ole paljoa merkitystä. Se kuitenkin toimii myös, kun sisentelet kappaleita komennoilla << ja >>. Lisäksi jos kirjoitat C-sukuisia kieliä, tutustu komentoon cindent, jolle voi määrätä tarkkaan, montako väliä sisennetään minkäkin merkin jälkeen. En itse välttämättä nauti moisesta ratkaisusta, mutta moni tekee.

Pientä herkkua tekisi mieli myös konffailla. Tätä tuntuu Emacs-käyttäjien piirissä esiintyvän paljon, joten miksei vimissäkin. Tämänlaisessa koodissa olisi oikein mojova:

printf("Hello dear, don\'t give a damn? "
       "Let's continue this discussion in another line.\n");

Eli jos ja kun rivin katkoo toiselle, voisi ideaalisti joko automaattisesti tai yhdellä tabinpainalluksella päästä samaan sarakkeeseen kuin mihin ylemmällä rivillä jäätiin. Näyttää kivalta ja varmasti onkin sitä.

Ja piti vielä mainita: tabeja vaativissa formaateissa, kuten Makefileissä, voi taas suoraan Vim ottaa suoraan expandtabin pois päältä, tai vaihtoehtoisesti pitää uhrautua, ja kirjailla peräti yksi ylimääräinen näppäinyhdistelmä lisää. Nimittäin autoindent käyttää samaa sisennystä kuin edeltävällä rivillä, joten yksi raaka-tabi (lisäysmoodissa <C-v><Tab>) riittää. Riviä vaihdettaessa sisennykset ovat tabeina, kuten pitääkin.

Git

Tuli paha tilanne eteen, kun käänsin tekeillä olleen projektini tabeista välilyöntilöiksi. Miten git siihen suhtautuu? Moisen teon jälkeen miltei jokainen rivi koodistani tulisi muuttumaan gitin silmissä, ja se tekisi vertailusta aika hankalaa. Gitin diff -komento toki tukee asetusta -w, joka pyrkii olemaan välittämättä tyhjeistä. Mutta committi on nyt silti ruma. Joudun nyt elämään tämän asian kanssa. Jatkossa sitten helpottaa, kun pysyn suosiolla alusta loppuun saman sisennyksen kanssa.

Tageja: ,

---
---

---

Aiheen vierestä