ja pouzivam vi , kedze je to default na hp-ux. len velmi malo kedy sa mi stane, ze by som potreboval nieco z vim (vacsinou vertical select).
na freebsd mam tiez len vi. na debiane mam vim, ale musim si povypinat vsetky tie farbicky aby som sa necitil ako v skolke.
ed je super hlavne pri skriptovani pripadne ked potrebujem spravit zmeny vo vela suboroch naraz (typicke /rdisk/disk, ^#// a pod. ).
zacinal som ako joe user, postupne som presiel na vi.
:) to bolo na freebsd, ale neskor potom aj na slacku. ale keby bolo niekomu luto existuje 3rd party depot aj na joe na hpux :)
ked clovek pride na to aky je vi(m) dobry tak sa bude sam sebe divit, ze ako to, ze to nepouzival skor. a krasa vi je aj v tom, ze sa to clovek uci cely zivot :-)
v hp-ux, hlavne single mode sa vela krat ale treba spoliehat aj na ed, kedze nie vzdy je terminal OK. (pripadne vi je /usr/bin/vi, a /usr nemusi byt v mtw mode mountnute, pripadne cela VG moze byt deaktivovana).
Já jsem se kdysi snažil vi použít (na SGI :-) a dalo se s tím žít, ovšem na psaní textů mi chyběly volby wrap a linebreak. Klasické vi má jen wrapmargin, což je dobré jen při psaní nového textu, ale méně při úpravách. Na druhou stranu toto je už vlastnost wordprocesorů a vi dokáže volat "fmt", takže to nějak šlo obejít.
no compatible nebyl nikdy myšlen jako option pro regulérní práci, ale pouze jako původni vi compatible, tedy aby mohl nahradit vi distribuovaný s UNIX systémy a tvrdit o sobě, že je stále POSIX/UNIX compatible.
Jinak díky za článek, undotree jsem nikdy nepoužil. Asi budu muset projít release notes od 7.0 :-)
Podle me to Bram napsal uz v dobe, kdy byl Vim pro Amigu a znamenal "Vi iMitation" a ne "Vi iMproved". Ale musel bych se mrknout na changelogy.
Btw je *velmi* poucne si vzit zdrojaky Vimu 3.x, zkompilovat a pouzivat - clovek si uvedomi, kolik prace se od te doby udelalo a jak skvely nastroj Vim dneska je.
Chtělo by to uvést někde :help usr_32, když už je část nadpisu stejná, jako nadpis v manuálu -- 'Time trevelling': v první části je 90% obsahu z tohoto Vim manuálu. Jinak chvála těm zbylým deseti procentům, které to v článku trochu víc osvětlují i méně zasvěceným. Pluginy jsou zajímavé zpestření. Sice pochybuju, že je někdy budu potřebovat. Ale kdo vi....
Tedy asi mi to někdo nebude věřit, ale to jsem ani nevěděl, že je v manuálu stejný nadpis, dokonce jsem si říkal, jak budou lidi řvát, že je nadpis článku silně zavádějící. Nicméně je pravda, že odkazy na integrovanou nápovědu můžu uvádět, je to stále nejpřesnější zdroj informací.
Ad pluginy - z těch si zkuste Gundo, podle mě je dost návykový a není divu, že je ve Vim komunitě velmi populární.
je to stále nejpřesnější zdroj informací
Hlavně je vždy po ruce.
Ok, plugin vyzkouším.
Jinak, když koukám na ten dlouhý seznam odkazů, napadá mi jedna zajímavá stránka, která byla pro mne dobrým starterem. Je to takové chytlavé počtení s několika hodně dobrými tipy a příklady:
http://learnvimscriptthehardway.stevelosh.com
Možná ji tu někdo uvítá
Asi tim nereknu nic noveho ale autorem Gundo je prave Steve Losh, ktery napsal Learn VimScript the Hard Way.
ad pluginy: Pluginy od Tima Popea (nejenom Fugitive) a scrooloose (krome NERDTree napriklad syntastic) jsou dost navykove.
ad zdroje: Pro me byla naprosto neocenitelnym zdrojem pro Vim obecne stranka http://vimcasts.org.
Asi tim nereknu nic noveho
Řekneš :). Sice jsem jeho pluginy v gitu kdysi letmo prošel, ale nevybavilo se mi to. Já jsem obecně pluginovej ignorant; vnitřní důvody, které mne k tomu vedou přesně neznám :). Asi to bude tím, že nedělám na žádném větším projektu, a pro normální psaní a krátké skripty nepotřebuju kanón. Pokud už něco potřebuju, pak to udělám s pomocí :map :cmd :abbrev přesně podle své představy. Je to pro mne zábava, nad těmi výrazy chvilku zapřemýšlet a odladit si je.
...sou dost navykove
Návykových věcí já se bojím :)).
Z http://vimcasts.org jsem zatím zhlédl jen nějaká videa. Ale přijde mi to tam až moc zjednodušené. Třeba video s kalkulátorem na expression registr je hodně mimo. Skutečný přínos expression registru je někde jinde. Člověk si pak musí všechny ty znalosti sám zkorigovat podle manuálu a jiných zdrojů, a konkrétně v případě expression registru to nebylo zas tak snadné. (Ono, o expression registru kolují po internetu všelijaké bludy, co jsou zcela mimo: od kalkulátorů až po spouštění externích programů.)
Za články o Vim a informace pluginech zde jsem rád, Rád se vždy něco nového přiučím. Moje znalosti nejsou nějak moc velké.
ad Steve Losh: Krome zmineneho ma zajimavy blog nejenom o vimu a jeho videa "A Whirlwind Tour of my Vimrc" stoji za shlednuti.
Muzes se trochu rozepsat o tom expressions registru, nebo me odkazat na zdroj (myslim nejaky "nebludny" :)). Docela by me to zajimalo.
Na vimcasts.org se koukam selektivne, treba ta posledni videa o UltiSnips me moc neberou a uz davno nebyl novy update. Kdyz jsme u vimcastu, znas knizku Practival Vim?
Dalsim vybornym zdrojem o Vimu jsou videa Damiana Conwaya (a ne neprogramuju v Perlu :)) napr. "More Instantly Better Vim" nebo serie "Mastering Vim"
Zdroje prozkoumám, díky.
O tom že @= není nic víc než spouštění záznamu, stejné jako třeba @a jsem už napsal. Kdo používá záznamník, ví, že se prostě jen přehrají všechny příkazy uvnitř registru. Ten, kdo ví, jak se takový výraz ve výsledku rozvine, nemusí ani záznamník spouštět pro uložení záznamu a používá jej jen tak, že si do registru výraz zapíše a pak jej spustí pomocí @x (je dobré studovat výraz v registru po uložení záznamníkem). V tomhle expression registr není jinej. Takže si třeba zapíšu do registru příkaz :normal a za něj příkaz normal módu pro nalezení # a vložení >
:let @a=":normal /^#\<cr>I>\<esc>"
nebo zkušený mazák už použije rozvinutý výraz rovnou:
let @a=':normal /^#^V^MI>^V^[^M'
(^V^M vytvoříme CTRL-V ENTER a ^V^[ vytvoříme CTRL-V ESC)
čímž vimu trochu ulehčíme práci a svůj výtvor trochu zašifrujeme :)
Pokud stiskneš v normal módu @a tak se záznam z registru přehraje -- najdou se řádky začínající # a vloží se před ně >
Expression registr není nic jiného, až na to, že má něco jako vlastní mód (takže nepoužiješ příkaz :let. Takže CTRL-R = v řádku a pak zadat to samé:
=":normal /^#\<cr>I>\<esc>"
a pak to přehraješ @= a výsledek by měl bejt stejnej. úspora tedy jedno :let :))). Malé plus je, že pro :map je extra příkaz @='.....' , který zajistí zapsání do registru i spuštění. Přičemž s normálním registrem se to musí provést odděleně.
Ukázku na vimcasts.org považuju za slabou :)). Musí tam totiž nejprve blok označit a pak do příkazového řádku zadat příkaz za normal, už vidím jak to někdo takhle dělá. Já bych to udělal tak:
:noremap <F3> :normal 0yt=A<c-v><c-r>=<c-v><c-r>"<c-v><cr><c-v><esc>j<cr>
čímž mi stačí jen tupě mačkat nad řádky F3 a ono to počítá a dosazuje výsledek :). Navíc :normal funguje také pro celou označenou oblast ve visual módu a podporuje také zadané číslo před tím (já tomu říkám multiplikátor) , který vše provede pro N řádek.
ještě pro porovnání. To samé se nechá provést také s expr registrem:
:nnoremap Q @='0yt=A<c-v><c-r>=<c-v><c-r>"<c-v><cr><c-v><esc>j'<cr>
ten multiplikátor také podporuje, ale nefunguje pro označenou oblast ve visual módu. Pro ni musíme tedy udělat ještě namapování extra využijeme vlastností příkazu :normal tak::
:vnoremap Q :normal Q<cr>
Výsledek bude tedy stejný (jen jsem zde použíl místo F3 Q, protože namapovat F3 se mi nějak nedařilo za vnoremap za příkazem :normal. Možností je tedy často víc a používat expression registr bývá často výhodné, ač ne vždy. Losh ještě celý namapovaný výraz s :normal obaluje do execute, což má zas některé jiné výhody, ale také nevýhody; použitím :execute ztratíme vlastnost multiplikátoru u příkazu :normal, ač i to se dá obejít proměnnou :count ....
Ještě jsem udělal výraz, který dělá to samé (obdoba prvního s :normal, tem mi v tomto případě přijde vhodnější než spouštět záznam z registru).
Předchozí výrazy byly postavené na rozvinutí výrazu pomocí expr. registru přesně tak, jak to ukazovalo video. Nyní jsem si (vzdorovitě) řekl, že expr reg. pro tento případ vůbec nepoužiji a zde je výsledek:
:noremap <F3> :normal 0yt=<cr>:let @@=eval(@@)<cr>:normal f=""p<cr> <cr>
:normal 0yt= .... zkopíruje vše od začátku řádky až po = do unnamed registru
:let @@=eval(@@) .... do stejného reg. si zapíšeme výsledek, který vytvoří funkce eval() ( musíme použít funkci eval, protože kopírováním registru k rozvoji nedojde)
:normal f=""p ... přesune kurzor za = a vloží výsledek z unnamed reg.
Tady ještě to video, o kterém zde píši:
http://vimcasts.org/episodes/simple-calculations-with-vims-expression-register/
Celé video je dost nevhodně udělané. Dalo by se totiž předvést i víc. Třeba se nechá počítat s reálnými čísly a nebo použít třeba sqrt(3)= (většinou s podporou reálných čísel bude vim přeložen). Totiž až v těchto případech se zde ukáže výhoda expr. registru. Pokud bychom použili funkci sqrt nebo reálná čísla, pak tento namapovaný výraz s eval nebude fungovat (eval zahlásí chybu, že string je float a funkci také nezvládne). Výsledek z eval (reálné číslo) totiž nejde zapsat do registru přímo, ale je třeba jej převést na string. Můžeme si ale snadnno pomoct funkcí string().
:noremap <F3> :normal 0yt=<cr>:let @@=string(eval(@@))<cr>:normal f=""p<cr> <cr>
Takže už to i počítá reálná čísla. Nelze pouze počítat s funkcí (sqrt), kterou bychom museli volat pomocí :call namísto :eval. Zde vidím třeba drobnou výhodu expr. registru; ale kdy až takovou specialitu potřebujeme.
Já jinak nic proti expression registru nemám :), jen mi přijde že jeho používání je až příliš adorované. Přičemž bez něj to jde také.
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 :).
No, možná jsem si udělal nesprávný závěr na základě těch několika dotazů a odpovědí na fórech, které vesměs dělaly z expr. registru zázrak století. Přišlo mi, že nikdo neměl tušení o tom, že rozvinutí výrazu se provede zápisem do registru nebo proměnné stejně:
:let @a=1+1
nebo
:let @a=getcwd()
nebo
:let @a=system("ls")
a pak už jen jen CTRL-R ap pro vložení z insert módu nebo z normal móud "ap ... a je to tam.
Podtrženo sečteno, je rozdíl nepatrný -- pouze v tom, že při použití expr. registru se nejprve v insert módu (nebo ex módu) stiskne CTRL-R, který vyvolá řádek pro výraz, kam se zapíše a po stisknutí ENTER se rozvinutý výraz vloží na původní místo, odkud byl vyvolán (tj. insert nebo ex mód) -- pod kurzor.
V případě použití normálního registru je jen potřeba navíc napsat :let, přičemž do do ex módu je třeba se přepnout stiskem dvojtečky (před tím asi ještě vystoupit z insert módu ESC). Přičemž CTRL-R ap nebo "ap (z normal módu) se použije až po té.
Tam kde je expression registr k něčemu víc užitečnej jsou až příkazy :map ( také :cmd nebo :apprev). Příkaz @='....', který se umisťuje jen za :map (a další dva uvedené) umožňuje snadno do registru příkaz zapsat a hned obsah registru přehrát. (navíc podporuje multiplikátor (číslo udávající počet opakování zadané před tím)). -- Bez toho by se nám ale taky nežilo špatně ;). Stačilo by :let @a='.....' @a . Takže jen o trochu práce navíc. Nicméně za :map už je těch specialit (v případě syslení výrazu na jeden řádek) většinou dost a tak každé takové zjednodušení se šikne:
nmap Q @='/^#<c-v><cr>I><c-v><esc>:let i+=1 \| echo i<c-v><cr>'<cr>
a s normálním registrem o něco delší a ne tak hezké:
nmap Q let @a='/^#<c-v><cr>I><c-v><esc>:let i+=1 \| echo i<c-v><cr>'<cr> @a
Uvedený namapovaný výraz je extrémně hloupý, jinej mi nenapad :). před řádky začínající # se vloží > a zároveň se inkrementuje proměnná i a zobrazuje v příkazovéme řádku (byl to jen takový test) (je třeba před tím nastavit :let i=1 extra, to jsem neošetřil)
Snad je z toho jasné, že bez registru = a příkazu pro přehrávání záznamu z něj @= a jeho modifikace pro :map ... @='.....'<cr> bychom se také obešli. Je to dobrá pomoc, ale rozhodně ne až tak velká, jak se někde píše. Můžete mi ale někdo přesvědčit o opaku :)... Třeba umí ještě něco...
jen pro zajímavost. Do expr. registru se nechá zapsat i klasicky pomocí příkazu :let také:
:let @==1+1
a pak se ten obsah registru může vložit třeba v insert módu -- CTRL-R "= ENTER (bez zadání výrazu). Tak se vloží hodnota z registru dříve uložená. (jinak kontrolu obsahu registrů prevodeme pomocí :reg, uvádím jen pro úplnost)
Dá se použít tečka, čárka, apod., věta by mohla stačit. Třeba pisatel románu by to možná ocenil. Já ale stejně vystupuju z insert módu tak často, že to zřejmě nebudu potřebovat. Fakt je, že když píši delší texty a dělám odstavec jako jedno odřádkování, pak by se něco takového občas mohlo i hodit.
Určitě by se to nějak nechalo vyřešit, ještě jsem nenarazil na nic, co by ve Vimu nešlo vyřešit :). Je tu třeba možnost undolist mazat (set undoreload=0 | edit) vždy po nějaké době (třeba po stránce textu), nejspíš by se také nechalo nějak operovat se souborem změn a ukládat před mazáním verze tohoto souboru spolu s rozpracovanou verzí. ... Nebudu to teď zkoumat, ale mám dojem, že bych se takového problému dokázal nějak zbavit, pokud by na to došlo.
Díky ale za upozornění na limit undolevels.
to si brzo zaplnis undolevels
Jen pro upřesnění, to že se zaplní kapacita zásobníku zadaná v 'undolevels' (výchozí hodnota 1000 položek) znamená jen to, že už se nebude možné vrátít ke změnám, které byly provedeny tisící prvý krok nazpět. Nic víc se nedějě a posledních 1000 slov (a změn v nich) jsem vždy schopen vrátit zpět (pokud nastavím ukládání v každé mezeře). Tedy žádná křeč.
Na genialitě tohoto řešení si netrvám; ač už jsem jej začal používat :) -- pro mail po slovech a pro zápisky do blogu po větách. Stále mi udivují ty možnosti, co všechno se dá změnit. Když to nebude vyhovovat, jednoduše to předělám zas jinak.