Názor k článku Užitečné skripty a pluginy pro textový editor Vim (6.část – cestování v čase) od RM - jo a před posledním <cr> nemá být mezera,...

  • Článek je starý, nové názory již nelze přidávat.
  • 24. 4. 2015 13:46

    RM (neregistrovaný)

    jo a před posledním <cr> nemá být mezera, takže tak:

    :noremap <silent> <F3> :normal 0yt=<cr>:let @@=string(eval(@@))<cr>­:normal f=""p<cr><cr>

    ale... nebude tu fungovat s multiplikátorem ani ve visual módu to nepůjde, což jsem nějak nedomyslel, protože obě vlastnosti se použijí pouze pro první :normal .

    Takže přece bude potřeba spustit z registru (použiju expression reg):

    nnoremap <silent> <F3> @=':normal 0yt=<c-v><cr>:let @@=string(eval(@@))<c-v><cr>:normal f=""pj<c-v><cr>'<cr>

    Jen jsem zabalil výraz do @='....' a <cr> jsem nahradil <c-v><cr>. Parser příkazu :map si je převede na znaky ^M, které se jinak vytvoří pomocí CTRL-V a ENTER a šly by také použít místo <c-v><cr>
    Tím máme funkční multiplikátor, ale nebude to fungovat pro rozsah označené oblasti, protože @= (obecně spouštění z registru) nepodporuje na vstupu něco jako rozsah '<,'> Musíme tedy namapovat extra vnoremap a použít :normal, což už bylo ukázáno, a není to žádná velká práce.

    Stejně jsem tedy skončil u expr. registru, abych měl funkční vše. Jenže v tomto případě, jak jsem psal, kdy potřebujeme zabalit výraz pro spuštění záznamu, má expr. registr opodstatnění. Šlo by to uložit i do obyčejného registru, ale opět bychom narazili na problém, protože spuštění obsahu z registru by bylo až na konci (@a), čímž by nám nefungoval multiplikátor, který se přilepí vždy jen k prvnímu příkazu! Což bychom museli pak řešit proměnnou v:count . Ale to už zacházím do příliš hlubokých vod :)). Ale přesto ukážu analogické řešení k @='...' bez použití expr registru :):

    nnoremap <silent> <F3> :<c-u>let @a=':normal 0yt=<c-v><cr>:let @@=string(eval(@@))<c-v><cr>:normal f=""p<c-v><cr>' \| let @b=v:count1 . '@a'<cr>@b

    Není toho tam zas o tolik víc, ale s multiplikátorem a proměnnou v: count1 jsou přecejen nějaké ty starosti navíc :).

    Jinak, pokud jsem někoho vyděsil, pak to bude asi tím, že všechno systím na řádek. Vytvořením funkce ve skriptu a zavoláním za :map pomocí :call (podporuje rozsah i multiplikátor) se zbavíme mnoha zvláštností. Ne všechno musí být one-liner.

    Možná jsem se do toho včera neměl pouštět, je to trochu mimo topic. Ale zas bych nerad zanechal nějaké chyby. Myslím ,že teď už mám zameteno :).