29. tammikuu 2011, 16:10

Vaihtele arvoja Vimissä

Aika harva tietää, että Vimissä on kaksi hauskaa pikanäppäintä numeroarvojen muuttelemiseen: <C-a> kasvattaa kursorin alla olevaa lukua yhdellä. Vastaavasti <C-x> vähentää. Se on melko ok, mutta enemmän käyttöä näen, jos samalla yhdistelmällä voisi vaihtaa boolean-arvoja koodin seasta! Let’s do it!

Okei, minua laiskottaa. Otetaan hyvin toimiva valmis skripti pohjalle, ja lisätään siihen puuttuvat palaset. Ehkä sinulle riittää jo se, jos <C-a> ei ollut tuttu entuudestaan. Saattaa olla helpompaa opiskella sitten joku uusi yhdistelmä. Mutta minä haluan yhdistää lukujen kasvattelua booleanin kasvattelun kanssa. Ehkä se ei kuulosta fiksulta, mutta jos booleaneja ajattelee kokonaislukuina “modulo 2”, saattaa käydä järkeen, että 1+1 = 0. No, ainakin minulla on näin.

Totta kai haluan säilyttää vanhan toiminnallisuuden! Eli jos kursori on luvun päällä, <C-a> toimii kuten aiemminkin. Mutta jos kursori onkin tekstin true tai false päällä, silloin ryhdytään käyttämään uutta skriptiä.

Ja se skripti on upeasti toimiva (nopeasti kokeilin) ToggleWords. Saamme sen kautta uuden ex-komennon :ToggleWord, jota voimme bindailla mielinmäärin. Nyt tämä skripti tukee paljon muitakin vaihtoja, mutta minulle riittää alustavasti pelkkä true <> false -vaihdos. Siispä käymme toimeen:

fun! NewCA()
    let cw = tolower(expand("<cword>"))
    if cw == "true" || cw == "false"
        ToggleWord
    else
        " run the built-in <C-a>
        execute "normal! \<C-a>"
    endif
endfun
nnoremap <C-a> :call NewCA()<cr>

Ahh. Olisimme jo perillä, mutta tämä ei toimi. Ongelmaksi tulee, että rekursiota estävä nnoremap ei tee syväluotaavaa katsausta, mitä kaikkea pinnan alla tehdään. Minun pitäisi toisin sanoen löytää synonyymi tuolle kutsulle <C-a>, mutta sellaista ei näy olevan! Muilta osin tuo toimii, eli jos kursori on joko sanan true tai sanan false päällä, se vaihtuu peilikuvakseen. Muuten vim kääntyy tekemään ikirekursiota, joskaan ei kaatumiseen saakka.

Edit: ratkaisu oli lähempänä kuin älysin etsiä. Ex-komennon normal huutomerkkiversio normal! takaa sen, että komennoista sen jälkeen käytetään sisäänrakennettuja versioita. Korjasin niin pienen virheen suoraan ylempään koodiliuskaan, joten siinäpä olette.

Tässä kohtaa Emacsin lähestymistapa olisi superässä. Kaikki löytyy lisp-funktioina, joten pikanäppäimet ovat merkityksettömiä. Se olisi upeaa, mutta nyt joudun elämään ilman sitä.

Tageja:

---
---

---

Aiheen vierestä