25. tammikuu 2010, 18:39

Näytöt ja Vim

Unohdin tässä mainita, kuinka lauantainen operaationi sujui. Lisäksi lisää rakkaudenosoituksia Vimiä kohtaan. Ja lopuksi käydään läpi paranneltu MPD-skriptini, joka esiteltiin aiemmin.

Perjantaina tuli hieno korttini postiin, lauantaina virittelin kortin emolevylle sopivaksi. Ja eihän siitä mitään tullut. Hajosi kai, täysin mykkänä se on koneelle päin; virta ei kulje sisällä. Kuvia operaatiosta (kuten oheinen kuva) täällä.

Foorumeita tutkittuani kovin moni muukaan ei ole NVIDIA:n korteilla onnistunut tässä menetelmässä. Mitä minulle sitten jää jäljelle? PCI-kortti ja PCIe 1x -kortti. Molemmat huonoja vaihtoehtoja. Jälkimmäisen hinnalla saisi SLI-emolevyjä ja isoja kortteja päälle. PCI-kortilla ei taasen juhlita. Jätän asian toistaiseksi hautumaan. Yksi ajatus voisi olla ihan sellainenkin, että myyn molemmat 17-tuumaiset pois ja ostan yhden 22-tuumaisen laajakuvan lisäksi tähän. Tai ehkä jopa 16×9 -näytön fullhd-resoluutiolla. Miettiä pitää.

Vim

Vim on taas kaikkein ihanin ja hehkein. Tällä kertaa minun riemuni kohdistuu sille seikalle, että Vim tekee mistä tahansa selkeätä, kunhan tietää niksit. Ajatellaan tavallisia tekstitiedostoja, ehkä jotain muistioita tai todo-listoja tai sen sellaisia. Niissä on yleensä melko puhdasta tekstitietoa, mutta ainakin minä tykkään välillä tabitella ja muotoilla selkeäksi sitä ulostuloa. Ainakin silloin, kun aikeissa ei ole kirjoittaa puhtaaksi sitä sitten missään muodossa esimerkiksi OpenOfficella tai muulla vastaavalla. Otetaan pari esimerkkiä suoraan omasta viimeaikaisesta käytöstäni.

Pienimuotoinen kuuntelupäiväkirja. Voisi olla käytännössä minkälainen hakuteos tahansa, tai jotain sen suuntaista. Sen sisältö oli minulla tämänsuuntainen:

Päivä 1
-------
Albumi foo: ihan kiva, rummut napakat
Kappale n: blabla
Albumi bar: diudau

Ja niin edespäin. Ensimmäisen päivän aikana otin sen tiedoston käyttööni, ja alkuperäinen idea oli tehdä siitä selkeä laittamalla riittävästi tabulaattoria erottimeksi. Huonoja puolia keksii kun syynäilee. Esimerkiksi jos about kaikki kappaleet ja albumit mahtuvat 16 merkin sisään, mutta joku yksi tai kaksi ei mene, ne nostavat rumasti selitettä erilleen muista. Se tabimuoto syö myös tilaa. No, tässä voisi nopsaan ajatella, että kuten ohjelmakoodeissa syntaksi väritetään käyttäjän haluamalla tavalla, voisi tuon kappaleen nimen vaikka korostaa erilleen. Tähän tapaan:

Päivä 1
-------
Albumi foo: ihan kiva, rummut napakat
Kappale n: blabla
Albumi bar: diudau

Tämä onnistuu vielä sangen helposti. Vimin match-komento nimittäin hoitaa homman kotiin nätillä säännöllisellä lausekkeella. Lisädetaljit jätän teille opeteltavaksi help-komennon avulla, mutta pääpiirteittäin homma voisi mennä niin, että etsitään nätti väriyhdistelmä highlight-komennon tuoman listan kautta (värit riippuvat sitten käytetystä väriteemasta!) ja kirjoitetaan match-komento mukaillen seuraavaa syntaksia:

:match Korostusnimi /regexp/

Niin simppeliä se on. En opeta myöskään säännöllisiä lausekkeita teille, koska se on hatara osaamisalue itsellenikin. Kuitenkin tämän esimerkin match-lauseke oli tämännäköinen:

match HelpDefine /^.\{-1,}:/

Säännöllistä lauseketta voisi purkaa osiin sen verran, että ^ tarkoittaa rivin alkua, . tarkoittaa mitä tahansa merkkiä ja \{-1,} tarkoittaa, että sitä mitä tahansa merkkiä voi esiintyä 1 tai useamman kerran perätysten. Ja korostus lopetetaan, kun vastaan tulee :-merkki. Miinus tuolla lukumäärässä tarkoittaa vimin tapauksessa sitä, että vim lopettaa etsimisen heti ensimmäisen osuman kohdalla. Muuten jos rivillä olisi kaksi kappaletta :-merkkejä, korostus jatkuisi siihen viimeiseen merkkiin saakka. Muissa regexp-murteissa voi olla omat menetelmänsä tämän epäahneudeksi kutsutun toiminnallisuuden saattamiseksi.

Tämä on ihan kiva jo sellaisenaan, koska käytännössä mistä tahansa kaavasta missä tahansa tekstissä voi saada itselleen käytettävää ja erottelevaa rakennetta esille ilman, että itse tekstiin kajotaan. Mutta vielä kivempi olisi, jos match-komentoa ei tarvitsisi komentaa joka kerta, kun tiedoston avaa. Tätä komentoa ei voi laittaa myöskään modelineksi (googlatkaa, jos ette tiedä. Se on edelleen yksi vim-rakkautta nostava toiminto) koska se ei ole asetus. Lisäksi matcheja voi helposti lisätä vain yhden (tämän lisäksi on tökeröt komennot :2match ja :3match, ja sitten joustavahko :matchadd) istuntoa kohden. Alkuperäinen idea tällä komennolla on toimia käyttäjän käyttöä helpottamaan. Otetaan toinen esimerkki, jossa ei ole näitä ongelmia. Lisäksi se ladataan automaattisesti modelinen ansiosta.

Tämä on pieni saldotiedosto, johon saatan heittää tarvittaessa käyttötilini euromäärän ylös, ettei sitä tarvitse käydä vahtaamassa verkkopankin kautta. Toisaalta kun päivitysinto on mitä on, pitää se oikea lukema joka tapauksessa käydä tarkastamassa. No, oppipa tässä sentään lisää Vimiä. Ensin lyhyt esimerkki käyttämästäni muodosta:

Saldo          Pvm            Viimeisin
-------------------------------------------------
184,73 EUR     22.1.          Amica

vim: ts=15 syntax=temp_saldo

Tavallinen tekstitiedosto, ei tämä saldo sisällä mitään erikoisia jippoja. Paitsi viimeisenä olevan modeline-rivin, jonka pitää sisältää tekstin vim:, jotta se tunnistetaan vim-komentolitaniaksi. Kuten aiemmin sanoin, se ei saa sisältää muita kuin harmittomia asetuksia. Esimerkiksi mikään "vim: rm -rf /" ei toimi. Ja olisikin perin ilkeätä, jos toimisi. Määrittelen tuossa tabin leveydeksi 15 merkkiä (tab stop) ja sitten otan syntaksin nimeltä temp_saldo käyttööni.

Sinänsä kun on näin taulukkomuotoinen, ei edes värikorostusta tarvitsisi. Mutta lisäsinpä kuitenkin, kun asia on triviaali osaajalle. Jotta väritys otettaisiin automaattisesti käyttöön avausvaiheessa, pitää modelinejen olla käytössä (.vimrc:ssä set modeline riittää, muistathan tutkia, mistä on kyse: help modeline) ja pitää olla pieni oma syntaksitiedosto. Vimin syntaksitiedosto tarkoittaa tiedostoa, jossa on liuta match-komentoja. Nämä kaikki komennot, joita voi olla vaikka satoja, ajetaan sisään kun sopiva tiedosto tulee, tai kun syntaksia vaihdetaan komennolla set syntax. Koska kyseessä on asetus, sen voi määritellä modelinellä, joka on yo. esimerkin viimeinen rivi.

Omia syntaksitiedostoja on yhtä helppo kirjoittaa kuin match-komentoja. Kieliasu hieman eroaa matchista, mutta toiminnallista eroa on hyvin vähän. Omat syntaksit voi heittää $VIMHOME -hakemistoon tai globaalisti /usr-hakemistoon (tai Program Filesiin) kaikkien käytettäväksi. Tarkka hakemisto on $VIMHOME/syntax. Linuxissa siis useimmiten ~/.vim/syntax. Tässä on temp_saldo.vim:

" Vim syntax file for my small saldo.txt file
if &compatible || v:version < 603
 finish
endif

syn match Statement /\(^.* EUR\)/

Kopioin mallia eräästä toisesta syntaksimäärittelystä, ja tottapuhuen omaan käyttöön kirjoitettu syntaksitiedosto voisi sisältää tasalleen yhden rivin, tuon viimeisen. Jos vertaat tätä viimeistä riviä aiemmassa esimerkissä käytettyyn match-komentoon, on tässä vain se ero, että käytetään komentoa "syn" (lyhenne syntax:sta) ja match on sen jälkeen kuten ei mitään. Tässä on käytetty Statement-värimääritystä, mutta niitäkin voi itse kirjoittaa, jos haluaa. (Sille on esimerkkikomento vaikka näin: :highlight rahamaara ctermfg=yellow. Tekisi väriä tukevalle terminaalille keltaisen tekstin. GVim-käyttäjät voivat käyttää suoraa määrittelyä näinkin: guifg=#rrggbb. Help highlight auttaa taas.)

Tuon ylläolevan syntaksitiedoston avulla saldotiedostoni aukeaa aina tämännäköiseksi (teillä voi tietty värit vaihdella):

Saldo          Pvm            Viimeisin
-------------------------------------------------
184,73 EUR     22.1.          Amica

vim: ts=15 syntax=temp_saldo

En voi kylliksi ajatella, kuinka mukavaa elämä oikeasti on vimin kanssa. Miten ihmeessä osaisin tulla toimeen ilman? Ehkä olisi mukavata myös, että modelineihin lisättäisiin mahdollisuus tukea match- ja syn match -komentoja sellaisenaan. Ei tarvitsisi tehdä pieniä pikkutiedostoja jokaista varten.

Paranneltu MPD-skriptini

Kirjoitin tänään myös loppuunsa auttavaisen bash-skriptini, joka siis odottelee ja vahtaa, kun kappale vaihtuu MPD:ssä. Alkuperäinen koodi on nähtävissä tuolla edellisessä artikkelissa, jossa puin sitä. Nyt lisäsin siihen mahdollisuuden stopata ja tyhjentää listat soiton päätteeksi. Oletus on edelleen asettaa tauko. Tein myös näppärällä bash-kikalla koodista tausta-ajajan. Pistetään koodi näkyville, se taitaa selittää itse itsensä suurimmalti osin:

#!/bin/bash
# pause, stop or clear at the track change
#### Now to the action. First, we check if music is playing at all
if [[ `mpc | wc -l` -eq 1 ]] ; then
 exit
fi
# Check the type of the thing
pausecommand=""
if [[ "$1" == "stop" ]] ; then
 pausecommand="mpc stop"
 echo "Stopping..."
elif [[ "$1" == "clear" ]] ; then
 pausecommand="mpc clear"
 echo "Clearing..."
else
 pausecommand="mpc pause"
 echo "Pausing..."
fi
# Now, fork the rest
(
# get remaining time in seconds
remainingtime=`mpc | awk 'BEGIN { FS="[ /]" } /playing/
{ split($6, curTime, ":"); split($7, wholeTime, ":");
ct = (curTime[1] *   60)  + curTime[2]; wt = (wholeTime[1]*60)
 + wholeTime[2]; print wt-ct; }'`
# 2 seconds off
(( remainingtime -= 2 ))
sleep $remainingtime
# Now let's poll more frequently for the track change (the song is at its end now)
# and compare the track numbers for accurate change point

track=`mpc|awk '/playing/{print $2}'`
newtrack=`mpc|awk '/playing/{print $2}'`
while [ "$track" == "$newtrack" ]
do
 sleep 0.1
 newtrack=`mpc|awk '/playing/{print $2}'`
done
$pausecommand > /dev/null
) &

Kyllä. ( )-merkkeihin käärityt komennot ajetaan alishellissä, ja heittämällä &-merkki perään se ajetaan rinnakkain, kuten voisi kuvitella. Ohjelman alussa varmistetaan, mitä tapahtuu, ja vasta sitten forkkaudutaan hiljaiseen aliohjelmaan. Käyttäjä pääsee toimittamaan muita tehtäviään välittömästi komennon jälkeen. Näin sen kuuluukin olla. Alussa tarkistetaan tapaus, että mitään ei soi. Eihän tämä tietenkään ole täydellinen, mutta nyt se on siinä kunnossa, että minulle riittää. Toivottavasti siitä on jollekulle iloa. Palautettakin saa antaa.

Tageja: , ,

---
---

---

Aiheen vierestä