Článek perfektní, o tom žádná.
Dovolím si povzdech. Co si mám myslet o textovém editoru, který po PgDn a PgUp neumístí kurzor na původní místo? (bez přeskočení konce / začátku souboru) Ano, jde to oskriptovat. A je někde skript, který opravdu funguje? Hledal jsem před lety, něco našel, ale nefungovalo to vždy a správně. Pak jsem si na toto zcestné chování zvykl a skript přestal používat. Stejně tak to je po přepnutí režimu (Esc, i) - kurzor se mi pohne o 1 znak. Zase mi nezbývalo, než si na to zvyknout. Vim používám, protože prostě nic lepšího nemám. Ne že by nebyly jiné programátorské editory, ale každý má nějakou podobně otravnou botu. A tak se sám sebe často ptám, jestli je tohle normální? A odpověď je, že ano, protože normální není to co je v pořádku, ale čeho je nejvíc. Dojímá mě snaha lidí řešit chyby editoru dodatečnými skripty. To je už dnes také normální. A tak nakonec zůstaneme u toho co známe nejvíc. Ovšem bojovat s něčím co má pomáhat je prostě proti principu. Často si připadám, jako bych tlačil kolo z kopce, místo abych na něm seděl a z kopce využil potenciální energii, kterou jsem do toho vložil na cestě do kopce. Chjo. Přitom je to "jen" editor..
Nepomůže. Ono se to totiž netrefí na správný řádek. Třeba u mě, mám zobrazeno 81 řádků najednou. Vytvořil jsem si soubor, který má 400 očíslovaných řádků a jsem na řádku 100, který je cca uprostřed obrzovky (vidím 61 až 141). PAGEDOWN mě přesune na řádek 142 zobrazený jako 3 řádek z hora. PAGEUP mě přesune na řádek 139 zobrazený jako 3 řádek zdola.
Ah jasne ok. Ja mel pocit, ze problem spociva v tom, ze PageUp/Down a podobne prikazy (H, M, L) doskakuji na prvni znak na radku - tedy ze se nepamatuje, ze kurzor byl rekneme na desatem sloupci.
Zkousel jste Ctrl+D a Ctrl+U popr. je namapovat na PageUp a PageDown? Protoze puvodni funkce PageUp a PageDown zavisi na "page", coz je dost vagne definovano.
Pak ale chceš používat značky - označ si pozici a můžeš na ni skočit odkudkoliv přímo: https://vim.fandom.com/wiki/Using_marks
Ah jasne ok. Ja mel pocit, ze problem spociva v tom, ze PageUp/Down a podobne prikazy (H, M, L) doskakuji na prvni znak na radku - tedy ze se nepamatuje, ze kurzor byl rekneme na desatem sloupci. To prave resi ta volba, o ktere jsem se zminil (tedy samozrejme to resi castecne, kdyz jste na 80 sloupci a radek, kam kurzor prejde po PageUp ma 10 sloupcu, tak smula).
Zkousel jste Ctrl+D a Ctrl+U popr. je namapovat na PageUp a PageDown? Protoze puvodni funkce PageUp a PageDown zavisi na "page", coz je dost vagne definovano.
Ctrl+D a Ctrl+U se chovaji rozumneji a da se nastavit i presny pocet radku pro strankovani.
S tim "a" "i" atd. me to kdysi taky matlo. Pomohlo mi predstavit si, jak vlastne Vim chape pojem "kurzor" a jak je to v jinych editorech. Ve Vimu v normalnim rezimu je kurzor umisten NA ZNAK, zatimco v jinych editorech MEZI ZNAKY. Proto taky prikazy "x" a "R" funguji presne podle popisu ("under cursor"), navic z toho plyne, ze neni mozne umistit kurzor za konec radku. Z tohoto duvodu existuji prikazy "A", "a", ktere dokazou po prepnuti do insert rezimu psat i za fyzicky konec radku. Ve Vimu (ne vi) to jde obejit pres 'set virtualedit=' a priblizit se tak ostatnim editorum.
Naproti tomu bezne editory maji kurzor mezi znaky (proto taky vypada jako svisla carka) a tim padem maji prikazy typu "smaz znak pred kurzorem" a "smaz znak za kurzorem" (typicky backspace a delete).
Nerikam, ze pristup Vimu je lepsi, pro mnoho lidi urcite neni, ale je to jen vysvetleni, proc se chova tak jak se chova.
(navic je nekdy matouci smysl visualnich bloku popr. vyberu-selekci) - tady pomaha prikaz "behave"
S tim "a" "i" atd. me to kdysi taky matlo. Pomohlo mi predstavit si, jak vlastne Vim chape pojem "kurzor" a jak je to v jinych editorech. Ve Vimu v normalnim rezimu je kurzor umisten NA ZNAK, zatimco v jinych editorech MEZI ZNAKY. Proto taky prikazy "x" a "R" funguji presne podle popisu v helpu ("under cursor"), navic z toho plyne, ze neni mozne umistit kurzor ZA konec radku. Z tohoto duvodu existuji prikazy "A", "a", ktere dokazou po prepnuti do insert rezimu psat i za fyzicky konec radku. Ve Vimu (ne vi) to jde obejit pres 'set virtualedit=' a priblizit se tak ostatnim editorum, ktere vlastne typicky porad jedou v insert rezimu a nic podobneho neresi (a v overwrite rezimu by spravne mely prepnout tvar kurzoru na blok/vodorovnou carku, protoze nyni pracuji tak, ze kurzor ukazuje NA znak a ne mezi).
Naproti tomu bezne (typicke) editory maji kurzor mezi znaky (proto taky vypada jako svisla carka) a tim padem maji prikazy typu "smaz znak pred kurzorem" a "smaz znak za kurzorem" (typicky backspace a delete). V GUI je to spravne, ovsem v textovem terminalu/konzoli takove editory vlastne zobrazuji kurzor spatne (nebo mene striktne receno - nesystematicky).
Nerikam, ze pristup Vimu je lepsi, pro mnoho lidi urcite neni, ale je to jen vysvetleni, proc se chova tak jak se chova.
(navic je nekdy matouci smysl visualnich bloku popr. vyberu-selekci) - tady pomaha prikaz "behave"
Kdyby nekdo vedel jak na to lepe, tak sem s tim.
Jedna se o funkci, ktera po stisku tab doplni mezery podle vzoru predchoziho radku.
function FillChar2(...) "{{{
python << EOF
import vim
try:
def fillChar2():
mode = 'up'
char = ' '
args = vim.eval('a:0')
mode = vim.eval('a:1') if args > 0 else mode
char = vim.eval('a:2') if args > 1 else char
buff = vim.current.buffer
nRowEdit = int(vim.eval("""line("'f")""")) - 1
nColMark = int(vim.eval("""col("'f")""")) - 1
nColCurs = int(vim.eval("""col(".")""")) - 1
nColEnd = int(vim.eval("""col("$")""")) - 1
# Po ukonceni insert rezimu kurzor skoci o 1 pozici zpet
# Vyjimkou je prvni sloupec, kdy kurzor zustava na miste
# Nejde pak rozeznat, zda byl kurzor na prvnim nebo druhem sloupci
# Proto mam pozici pred ukoncenim insert rezimu v f mark
# Ta y mela byt vzdy o jedna vetsi, nez akt. pozice kurzoru
# s vyjimkou kurzoru na prvnim sloupci.
# Naopak f mark nefunguje na konci radku, takze musim pozici
# kurzoru v insert modu vypocitat z akt. pozice s osetrenim
# vyjimky na prvnim sloupci.
if nColMark == 0:
nCol = 0
else:
nCol = nColCurs + 1
# pozice kursoru v insert rezimu
nCol = 0 if nColMark == 0 else nColCurs + 1
# detekce kursoru na konci radku
cEol = 1 if nColMark+1 == nColEnd else 0
# musim najit vzorovy radek podle modu, preskakuji vsechny nevyhovujici
delta = -1 if mode == 'up' else 1
nr = nRowEdit
nrs = 0
while True:
nrs += 1
nr += delta
if nr < 0 or nr >= len(buff) or nrs > 5: # hledat do 5 radku
print 'FillChar2(): model line is not found.'
return 'end'
sRowModel = buff[nr]
if len(sRowModel) <= nCol:
continue # moc kratka
nColSpace = sRowModel[nCol:].find(' ')
if nColSpace == -1:
continue # nema mezeru
sRemain = sRowModel[nCol+nColSpace:]
lFRemain = len(sRemain)
lSRemain = len(sRemain.lstrip())
if lSRemain == 0:
continue # nema znak za mezerou
nIndent = lFRemain - lSRemain + nColSpace
indent = char * nIndent
# ok, indent je vytvoren
break
# ted musim vlozit indent do radku
reg_f = vim.eval('@f')
vim.command('let @f="%s"' % indent)
if nCol == 0:
vim.command('normal "fP')
else:
vim.command('normal "fp')
vim.command('let @f="%s"' % reg_f)
print 'indent by %d row, len=%d' % (nr+1, nIndent)
if cEol:
# kdyz je kurzor na konci radku, skoci kurzor sam doleva
vim.command('exe "normal \<Right>x"')
else:
vim.command('exe "normal \<Right>x\<Left>"')
return 'done'
fillChar2()
except vim.error, e:
print 'Vim FillChar2() ERROR:', e
raise
except Exception, e:
print 'Python FillChar2() ERROR:', e
raise
EOF
return ''
endfunction
" vkladam mezeru pro usnadneni zjisteni pozice kursoru, bude odstranena
inoremap <Tab> <Space><Left><C-O>mf<Esc>:call FillChar2('up', ' ')<CR>a
"}}}