%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % Rychla reference k nekterym prikazum programu ViM % % http://vim.org % % % % Martin Bruchanov -- bruxy at regnet dot cz % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \mainlanguage[cz] \language[cz] \enableregime[utf] % latin2 \setupoutput[pdftex] % dvips, acrobat %\setupoutput[dvips,acrobat] % dvips, acrobat \pdfminorversion=4 \setupbodyfont[10.5pt] % \setuppapersize[A4, portrait][A3, landscape] % A3, A4, A5, A6; landscape %\setuppapersize[A4, portrait] % A3, A4, A5, A6; landscape \setuparranging[2SIDE] % zmena stranek pro vyrobu knizky, % 2SIDE -- dve stranky na jeden list vis setuppapersize %\pdfinfo{ % /Title (Rychla reference k nekterym prikazum programu ViM) % /Author (Martin Bruchanov) % /Subject (ukazka) % /CreationDate (10.06.2007) % /ModDate (\currentdate) % /Producer (ConTeXt) %} % Rozmery stranky \setuplayout[% width=200mm,% height=286mm,% header=0mm, % footer=0mm, % topspace=5mm, % leftmargin=0mm, % rightmargin=0mm, % leftedge=0mm, backspace=5mm, ] \setuppagenumbering[% alternative=singlesided, % doublesided location={footer, right}, % header, middle, inleft, inmargin style=bold, % % conversion=numbers, % characters Characters romannumerals % left={--~}, % znak pred % right={~--}, % znak za ] \definefont[TitleFont][RegularBold sa 2.5] \def\ShadowOffset{-2.5pt} \def\TitleShadow#1{\rlap{% \color[lightgray]{#1}}\kern\ShadowOffset\lower\ShadowOffset\hbox{#1}% } % Nastaevni nadpisu \setuphead[title][before={\blank[4*small]}, textcommand=\TitleShadow, % style=\TitleFont, % alternative=middle, % after=\nowhitespace] \definefont[SectionFont][RegularBold sa 1.2] \def\Cislovani#1{{#1}.} % tecka za cislem kapitoly %\def\SectionLook#1{#1~\vline$\rightarrow$} \setuphead[section][style=\SectionFont, % textcommand=\SectionLook, numbercommand=\Cislovani, before={\blank[small]}, after=\nowhitespace] % after={\blank[1*small]}] \definefont[SubsectionFont][RegularBold sa 1.1] \setuphead[subsection][ % style=\SubsectionFont, % numbercommand=\Cislovani,% before={\blank[none]},% % after={\blank[1*small]}] after=\nowhitespace] % mezery mezi odstavci \setupwhitespace[none] % velikost odsazeni \setupindenting[none] % none, small, medium, bix, next, first, [rozmer] % vicesloupcova sazba %\setupcolumns[n=, ] % Nastaveni hlavicky %\setupheadertexts[][][] % Nastaveni paticky %\setupfootertexts[][][] % Pouziti barev \setupcolors[state=start] \setupcolor[rgb] % Nastaveni seznamu s odrazkami %\setupinterlinespace[line=3ex] \setupitemize[1][standard,packed,joinedup] % joinedup -- zadne mezery pred a za \setuplines[indenting=always,% before=\nowhitespace] %beforehead={\nowhitespace}] % Vypnuti popisku \setupcaptions[location=none] % nezery pred a za plovoucimi objekty \setupfloats[spacebefore=,spaceafter=] % vlastnosti verbatim \setuptyping[typing][before={\blank[-.5mm]},after={\blank[2mm]}] % Nastaveni oramovaneho textu pro zobrazeni klavesy \defineframed[keyframe][% strut=yes, % background=color,% backgroundcolor=lightgray, % corner=round, % radius=2.5pt, % height=1.1em, % % offset=2pt % odsazeni po stranach ] \def\key{\inframed[frame=on, corner=round, background=color, bottomframe=on, radius=2.5pt, % offset=-1pt, % height=1.1em, % % height=\lineheight, % backgroundcolor=gray, backgroundoffset=0pt]} %%%%%%%%%% Prikazy \def\dd{{\tt ..}} \def\bod{{\it bod}} \def\ods{\hskip2em{}} \def\pods{\hskip1em{}} \def\ES{{\sc Esc}{}} \def\DEL{{\sc Del}{}} \def\BS{{\sc BackSpace}{}} \def\IN{{\sc Ins}{}} \def\TT{{\sc Tab}{}} \def\PD{{\sc PageDown}{}} \def\PU{{\sc PageUp}{}} \def\EN{{\sc Enter}{}} \def\SH{{\sc Shift}{}} \def\CT{{\sc Ctrl}{}} \def\AT{{\sc Alt}{}} % v dolnim indexu bude nazev rezimu jako Sans-Serif \def\sssymbol#1{\hbox{\switchtoformulabodyfont[ss,script] #1}} \definehspace[odsaz][.15em] %\definehspace[odsaz][0pt] % Command % #1 keyboard imput % #2 editation mode \def\mez{\hspace[odsaz]} %\def\COMMAND#1#2{\keyframe{\mez{\tt #1}\color[darkgray]{$_{\sssymbol{#2}}$}\mez}} \def\COMMAND#1#2{\key{\mez{\tt #1}\color[darkgray]{\tfx\ss \low{#2}}\mez}} %\def\C#1{\keyframe{\mez{\tt #1}\mez}} \def\C#1{\key{\mez{\tt #1}\mez}} \def\CC#1{\COMMAND{#1}{C}} % prikazovy \def\CV#1{\COMMAND{#1}{V}} % visualni \def\CE#1{\COMMAND{#1}{E}} % editacni \def\CSK#1{\COMMAND{#1}{ex}} % editacni %\def\CS#1{{\tt :#1}} % %\defineframed[grayframe][ %% location=depth, % % background=color,% % backgroundcolor=lightgray, % % frameoffset=0.5pt, % % framecolor=lightgray, % % height=broad, % % strut=yes, % %% depth=1pt, % offset=none, % odsazeni po stranach %] \def\grayframe{\inframed[frame=off, background=color, frameoffset=0.5pt, % % radius=2.5pt, % % height=broad, % % strut=yes, % offset=none, offset=-1pt, backgroundcolor=gray, backgroundoffset=0pt ]} \def\CS#1{\grayframe{\,\tt :#1\,}} % \def\a{$\approx$ {}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \starttext \startcolumns[n=2] \title{Vi IMproved} \framed[frame=off,bottomframe=on,width=\textwidth,frameoffset=1mm]{ \startalignment[middle] {\tfx \copyright{} \date[][year] Martin Bruchanov, {\tt bruxy@regnet.cz}} \stopalignment } \section{Základní ovládání ViMu} \startitemize[1] \item Kombinace kláves~-- několik kláves stisknutých současně, např. \CE{\CT+A} ve skutečnosti znamená \CE{\CT+\SH+a}. \item Sekvence kláves~-- několik kláves či kombinací stisknutých po sobě, např. \CE{\CT+WW} znamená stisk kombinace \C{\CT+W} a poté ještě klávesy \C{W}. \item Pracovní režim~-- u kláves je zobrazen vlevo dole: \startlines {\ss C}~-- normální, vkládání příkazů \CE{\ES} {\ss E}~-- editační, pro psaní textu \CC{\IN}, \CC{i}, přepis $2\times$ \CC{\IN} {\ss V}~-- visuální, označování bloků textu \CC{v} {\ss :}, {\ss ex}~-- ovládání na příkazovém řádku ({\em ex}-mode). \stoplines \item Příkaz lze $n\times$ zopakovat pokud napíšete číslo před příkazem, např. \CC{5x} vymaže 5 znaků od pozice kurzoru dále. Při \CS{set showcmd} se příkazová sekvence zobrazuje vpravo dole. \item Vynutit si příkaz je možné pomocí {\tt !}, např. \CS{w!} si vynutí uložení souboru, \CS{q!} ukončení ViMu. \item Nápověda: \CS{help {\em téma}}, doplňování příkazů pomocí \C{Tab}. \item Podobné příkazy používají stejné klávesy, např. \CC{f}\,/\,\CC{F}, \CC{t}\,/\,\CC{T} (viz dále). Liší se směrem nebo rozsahem působení. \item Opakování posledního příkazu \CC{.}, makra \CC{\type{@@}}. \item O krok zpět \CC{u}, vrátit \CC{\CT+r}. \item Zapínání a vypínání určité volby umožňuje \CS{set {\em volba}} a \CS{set no{\em{}volba}}. Samotný příkaz \CS{set} zobrazí aktuální volby. \item Rozsah působnosti {\em ex}-příkazů lze nastavit pomocí: \startlines -- \CS{$x$příkaz} provede na řádku $x$ -- \CS{$x$,$y$příkaz} od řádku $x$ do řádku $y$ -- \CS{.,\$příkaz} od aktuální pozice do konce -- \CS{\%příkaz} \a \CS{1,\$příkaz} pro celý soubor -- \CS{.,+$x$přík} \a $x$\CS{přík} od akt. pozice po dalších $x$ řádek -- \CS{.,\$$-x$} od aktuální pozice do $x.$ řádku od konce \stoplines \stopitemize \section{Editování a ukládání} \startlines Editovat: \CS{e {\em soubor}}. Vložit soubor na pozici kurzoru: \CS{r {\em soubor}}. Vlož výpis systémového {\em příkazu}: \CS{r !{\em příkaz}}. Uložit soubor: \CS{w {\em jméno}}. Uložení a odchod: \CC{ZZ}, \CS{wq}. Odchod a uložení pokud byla změna: \CS{x}. Změnit jméno právě editovaného souboru: \CS{f {\em jméno}}. Psát před/za: znak \CC{i}\,/\,\CC{a}, řádek \CC{I}\,/\,\CC{A}. Začni nový řádek před/za: \CC{O}\,/\,\CC{o}. Přepiš: jeden znak \CC{r}, text \CC{R} \a \CC{\IN\IN}. \stoplines \subsection{Pohyb v souboru} \startlines Kurzor: \CC{$\rightarrow$} $\approx$ \CC{h}, \CC{$\leftarrow$} $\approx$ \CC{l}, \CC{$\uparrow$} $\approx$ \CC{k}, \CC{$\downarrow$} $\approx$ \CC{j}. Délkový registr umístění: \CS{set scrolloff={\em řádků}}. Skok na $n$-tý řádek: \CS{$n$} \a \CC{$n$G} , na poslední \CS{\$} \a \CC{G}. Skok na Bytovou pozici: \CS{go $n$}. Skoč před znak {\em a}: \CC{t\em{a}} vpřed, \CC{T\em{a}} vzad. Skoč na znak {\em a}: \CC{f\em{a}} vpřed, \CC{F\em{a}} vzad. Jdi na začátek dalšího/předchozího slova: \CC{w}\,/\,\CC{b}. Jdi na konec slova: \CC{e}, zahrne interpunkce \CC{E}. Jdi na deklaraci: \CC{gd}. Jdi na začátek/konec: odstavce \CC{\{}\,/\,\CC{\}}, bloku: \CC{[\{}\,/\,\CC{]\}}. Jdi na první/poslední znak řádku: \CC{\type{^}}\,/\,\CC{\$} Skoč na další/předchozí větu: \CC{)}\,/\,\CC{(}. Jdi na další/předchozí řádek: \CC{\EN},\CC{+}\,/\,\CC{-} Jdi na sloupec: první \CC{0},\CC{\type{|}}; {\em n}-tý \CC{{\em n}\type{|}} Skoč na párovou závorku: \CC{\%}. Vypiš pozici a celkové počty řádků, znaků, atd.: \CC{g\CT+g}. \stoplines \subsubsection{Značky} \startlines Vlož neviditelnou značku {\em a}: \CC{ma}. Skoč na značku {\em a}: \CC{'a}. Vypiš značky: \CS{marks}. Vymaž značku {\em a}: \CS{delmarks {\em a}}. Zpracuj text od značky {\em a} do {\em b}: \CS{'a,'b {\em příkaz}}, např. \CS{'a,'b !sort} setřídí text. \stoplines \subsection{Mazání, přesuny a kopírování textu} \startlines Mazání ukládá automaticky do schránky (vhodné pro přesun). Vymaž: znak \CC{x} \a \CC{\DEL}; předchozí znak \CC{X}, \CE{\CT+h} \a \CE{\BS}; slovo \CC{dw}, \CE{\CT+w}; řádek \CC{dd}. Vymaž až k párové závorce: \CC{d\%}. Vymaž do konce/začátku věty: \CC{d)}/\CC{d(}. Vymaž zbytek řádku: \CC{D} \a \CC{d\type{$}}. Kopíruj řádek do schránky: \CC{Y} \a \CC{yy}. Více schránek: stisk \CC{"{\em k}\ldots} před příkazem uloží text do schránky {\em k}. Např. \CC{"kyy} uloží řádek do \type{k}. Vlož obsah poslední použité schránky nebo poslední vymazaný text: za \CC{p}, před \CC{P} kurzor, \CC{"kpp} vloží obsah schránky \type{k}. Speciální schránky: \type{"%} -- právě editovaný soubor, \type{"/} -- poslední hledaný text,\ldots Prohoď dva následující znaky/řádky: \CC{xp}\,/\,\CC{ddp}. \stoplines \subsection{Formátování} \startlines Nastavení šířky řádku: \CS{set tw=$n$}. Nastavení zalamování: \CS{set wrap}. Zarovnání: \CS{ce} střed, \CS{ri} pravo, \CS{le} levo. Zformátuj řádek: \CC{gqq}. Zformátuj odstavec: \CC{gqap} (kurzor skočí na konec), \CC{gwap} (kurzor stojí). Obrátí velikost písmene: \CC{\type{~}}, celé řádky \CC{g\type{~}\type{~}}. Celý řádek na velká/malá písmena: \CC{gUU}\,/\,\CC{Vu} \a \CC{guu}\,/\,\CC{VU}. Celý soubor na velká/malá pismena: \CC{gggUG}\,/\,\CC{ggguG} Celý řádek zakóduje {\em rot13}: \CC{g??}. \stoplines \subsubsection{Odsazování} \startlines Odsaď řádek: \CC{>>}, \CE{\TT} \a \CE{\CT+i} o \CS{set shiftwidth=$n$}. Zmenši odsazení o jednu úroveň: \CE{\CT+d}. Odsaď řádek jako předchozí: \CC{==}. Odsaď blok relativně k umístění: \CC{=a\{}. Předělej odsazení celého souboru: \CC{gg=G}. \stoplines \subsection{Doplňování} \startlines Slovo před \CE{\CT+p}, za \CE{\CT+n} kurzorem. Název souboru v pracovním adresáři: \CE{\CT+x \CT+f}. Název adresáře: \CE{\CT+x \CT+d}. Celý řádek: \CE{\CT+x \CT+l}. Slovo ze slovníku: \CE{\CT+x \CT+k}. Příkaz shellu: \CE{\CT+x \CT+v}. Zvětší/zmenší číslo pod kurzorem: \CC{\CT+a}\,/\,\CC{\CT+x}. Jméno právě editovaného souboru: \CE{\CT+r\%}. \stoplines \subsubsection{Doplňování na {\em ex}-příkazový řádek} \startlines Vlož obsah schránky {\em a}: \CSK{\CT+r {\em a}}. Vlož slovo pod kurzorem: \CSK{\CT+r \CT+a}. Zruš příkaz: \CSK{\CT+u}. \stoplines \subsection{Vkládání zvláštních znaků} Vložení nenapsatelného ASCII znaku, např. \TT: \CE{\CT+v\TT}, objeví se dvojznak \type{^I}, kombinace \CE{\CT+v{\em číslo}\EN} vloží znak s daným ASCII kódem. Některé nenapsatelné znaky v kódování UTF-8 je možné psát pomocí {\em digraphs}, dvojznakové kombinace, tabulku zobrazí \CS{digraphs}, znak se vkládá \CE{\CT+k $K_1$ $K_2$}. Zobraz kód znaku pod kurzorem: ASCII \CC{ga}, UTF-8 \CC{g8}. \subsection{Zkratky a mapování kláves} Definice zkratek, které se po napsání expandují: \startlines Editační režim \CS{iabbrev {\em zkratka} text, který se vloží} {\em Ex}-režim: \CS{cabbrev {\em zkratka} příkazy pro provedení} Mapování klávesy F11: \CS{map \type{} {\em příkaz}}. Působnost přemapování: {\tt map, imap, cmap, nmap, vmap}. \stoplines \section{Hledání a nahrazení} \startlines Ignorovat velikost písmen: \CS{set ignorecase}, opak {\tt noic}. Hledat vpřed: \CC{/{\em slovo}}. Samotné \CC{/} opakuje poslední. Hledat vzad: \CC{?{\em slovo}}. Ignoruje velikost písmen: \CC{/\backslash{}c{\em slovo}}. Skok na další výskyt nálezu: \CC{n} vpřed, \CC{N} vzad. Nalezení slova pod kurzorem: \CC{\#} vzad, \CC{*} vpřed. Nahrazení: \CS{substitute/from/to/{\em příznaky}}, zkráceně \CS{s}. Na řádcích s výskytem {\em text} proveď {\em ex-příkaz}: \CS{g/{\em text}/{\em příkaz}} Příznaky: {\em žádný}~-- nahrazuje první výskyt, \type{g}~-- na celém řádku, \type{c}~-- potvrzovat.Zruší zvýraznění: \CS{nohlsearch}. Prohledání více souborů: \CS{vimgrep /{\em vzorek}/g {\em s}$_1$ {\em s}$_2$ \ldots {\em s}$_n$}. \stoplines \subsection{Regulární výrazy} \startlines Začátek/konec: řádku \type{^}\,/\,\type{$}, slova \type{\<}\,/\,\type{\>} Zástupný symbol za jeden znak: \type{.} Vypnutí speciálních symbolů: \type{\.} (znak tečka) Atom: \type{\(}vzorek\type{\)} $N$-tý podvýraz: první \type{\(}vzorek\type{\)} = \type{\1} Rozsah znaků: \type{[abcd]} \a \type{[a-d]}, \type{[a-zA-Z]} \a \type{\a}, \type{[0-9]} \a \type{\d} Rozsah ignorovaných znaků: \type{[^abc]} Žádný nebo násobný výskyt {\em z}: {\em z}\type{*} Opakování: \type{z\{n\}} $n\times$ znak {\em z}, \type{z\{n,\}} minimálně $n$ výskytů {\em z}, \type{z\{n,m\}} min. $n$ a max. $m$ výskytů {\em z} %Třídy znaků: \type{[:alnum:]} %[:alpha:] [:ascii:] [:blank:] [:digit:] %{\bf Příklady:} \stoplines \section{Sbalování částí textu (\CS{help folding})} \startlines Jdi na začátek/konec foldu: \CC{[z}\,/\,\CC{]z}. Sbal text: \CC{zf}, označený \CV{zf}. Rozbal pod kurzorem: \CC{zo}, rekurzivně \CC{zO}. Rozbal/zavři všechny: \CC{zR}\,/\,\CC{zM}. Přepínání sbal-rozbal: \CC{za}, rekurzivně \CC{zA}. \stoplines \section{Editace více souborů, okna a záložky} \subsection{Více souborů (editačních bufferů)} Spustit ViM, kde parametrem jsou názvy několika souborů. \startlines Vypiš buffery: \CS{ls} \a \CS{files} (jsou označeny čísly). Přepni na další soubor: \CS{next} \a \CS{n}. Přepni na předchozí soubor: \CS{prev}. Přepni na první soubor: \CS{rew} \a \CS{first}. Přepni na poslední soubor: \CS{la}. Proveď hromadně {\em příkaz} pro všechny soubory: \CS{bufdo {\em příkaz}} \stoplines \subsection{Okna} \startlines Nové okno: \CS{new} \a \CC{\CT+w n}. Rozpůlí okno: \CS{split} \a \CC{\CT+w s}. Rozpůlí okno vertikálně: \CS{vsplit} \a \CC{\CT+w v}. Zavře okno: \CS{close} \a \CC{\CT+wc}. Zavře vše až na aktivní: \CS{only} \a \CC{\CT+wo}. Přeskočí do dalšího okna: \CC{\CT+ww}. Zmenší/zvětší okno o $n$ řádků: \CC{\CT+w$n$-}\,/\,\CC{\CT+w$n$+}. Zmenší/zvětší okno o $n$ sloupců: \CC{\CT+w$n$\type{<}}\,/\,\CC{\CT+w$n$\type{>}}. Srovná rozměr všech oken: \CC{\CT+w=}. Hromadné operace: zápis \CS{wall}, odchod \CS{qall}, \CS{wqall}. Proveď hromadně {\em příkaz} pro všechna okna: \CS{windo {\em příkaz}}. \stoplines \subsubsection{Pohyb v okně} \startlines Skok na řádek okna: horní \CC{H}, střed \CC{M}, dolní\CC{L}. Nastav aktuální řádek: nahoru \CC{z\EN}, střed \CC{z.}, dolu \CC{z-}. Posuň okno nahoru/dolu: o řádek \CC{\CT+e}\,/\,\CC{\CT+y}, stránku \CC{\CT+b}\,/\,\CC{\CT+f}, půlstránku \CC{\CT+u}\,/\,\CC{\CT+d}. Překresli okno: \CC{\CT+l} \stoplines \subsection{Záložky} \startlines Příkaz: {\tt vim -p $s_1$, $s_2$ \ldots} otevře dané soubory v záložkách. Vytvoř/zavři záložku: \CS{tabnew}\,/\,\CS{tabc}. Zavři vše, kromě aktivní: \CS{tabo}. Přepni na další/předchozí: \CS{tabn} \a \CE{\CT+\PD}\,/\,\CS{tabp} \a \CE{\CT+\PU}. Přesuň za záložku $n$: \CS{tabm $n$}. Proveď hromadný {\em příkaz}: \CS{tabdo {\em příkaz}}. Vzhled záložek: \CS{set tabline}. \stoplines \section{Vizuální režim} \startlines Výběr: znaků \CC{v}, řádky \CC{V}, pohyb kurzoru se označí rozsah. Blokový výběr textu: \CC{\CT+V}. Převod na velká/malá písmena: \CV{U}\,/\,\CC{u}. Proveď {\em příkaz} v označeném rozsahu: \CS{'<,'> {\em příkaz}}. \stoplines \section{Makra} \startlines Ulož makro do registru {\em a}: \CC{q{\em a}}. Ukončení definice makra: \CC{q}. Proveď makro v registru {\em a}: \CC{\type{@}{\em a}}. Proveď poslední volané makro: \CC{\type{@@}} \stoplines \section{Kontrola pravopisu (ViM$^{7+}$)} ViM umí zvýraznit překlepy, je nutné mu dodat slovník (např. z {\em OpenOffice.org} [\type{cz_CZ.aff}, \type{cs_CZ.dic}]), ze kterého si vygeneruje vnitřní binární reprezentaci slovníku. % http://ftp.linux.cz/pub/localization/OpenOffice.org/devel/Czech/spell_checking/cs_CZ.zip % unzip -x cs_CZ.zip cs_CZ.aff cs_CZ.dic % vim -e -s << EOF % :mkspell cs cs_CZ % :!cp cs.utf-8.spl $VIMRUNTIME/spell   % EOF \startlines Vytvoření slovníku: \CS{mkspell cs cs\_CZ}. Zapnutí slovníku: \CS{set spell spelllang=cs,en}. Najdi další/předchozí překlep: \CC{]s}\,/\,\CC{[s}. Přidej do slovníku slov pod kurzorem: \CC{zg}. Přidej dočasně do slovníku: \CC{zG}. Označ slovo jako špatné: \CC{zw}, dočasně \CC{zW}. Nabídne slovo k překlepu: \CC{z=}, nahradí první variantou \CC{1z=}. \stoplines \section{Podpora programátorů} \startlines Spustí {\tt make}: \CS{make}. Skoč na další/předchozí chybu: \CS{cp}\,/\,\CS{cn}. Vypiš všechny chyby: \CS{cl}. Zobrazení čísel řádků: \CS{set number}. %Obarvení syntaxe: \CS{set syntax}. \stoplines \section{Ostatní} \startlines Spusť shell: \CS{shell}. Otevřít man. stránku slova pod kurzorem: \CC{K}. Otevři soubor pod kurzorem: \CC{gf}. %Překreslit obsah okna: \CC{z}. Zástupný znak editovaného souboru \type{%}, např. \CS{!cslatex \%} přeloží právě editovaný soubor \LaTeX{}em. \stoplines %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \stopcolumns \stoptext