Vim Color Editor HOW-TO (Vi Improved met syntax color highlighting)

Al Dev (Alavoor Vasudevan) alavoor@yahoo.com
Vertaald door: Ellen Bokhorst bokkie@nl.linux.org

v5.0, 04 maart 2000


Dit document is een leidraad voor het snel instellen van de Vim-kleuren editor onder Linux- of Unix-systemen. De informatie hierin zal de productiviteit van een programmeur verhogen aangezien de Vim-editor ondersteuning biedt voor syntax color highlighting en bold fonts die de "leesbaarheid" van programmeercode verbetert. De productiviteit van programmeurs wordt met 2 tot 3 keer verbeterd door gebruik te maken van een kleureneditor zoals Vim. De informatie in dit document geldt voor alle besturingssystemen waaronder Vim werkt, dat zijn - Windows 95/NT en alle soorten Unix zoals Linux, Solaris, HPUX, AIX, SCO, Sinix, BSD, SCO, enz..

1. Introductie

Vim editor staat voor 'Vi IMproved'. Vi is de populairste en krachtigste editor in de Unix-wereld. De Vi is een afkorting voor "Visueel" editor. Vroeger was de eerste editor op deze planeet een regeleditor genaamd 'ed' (en 'ex'). De Visuele editor zoals Vi was een reusachtige verbetering in vergelijking met regeleditors als 'ed' (of 'ex'). De editors 'ed' en 'ex' zijn nog steeds beschikbaar onder Linux, zie 'man ed' en 'man ex'.

Een goede editor zal de productiviteit van de programmeur verbeteren. Vim biedt ondersteuning voor color syntax highlighting van programma-code en tevens benadrukking door gebruik te maken van verschillende fonts als normaal, vet of cursief. Een kleureneditor als Vim zal de productiviteit bij het programmeren met een factor 2 tot 3 verhogen!! Programmeurs kunnen de code veel sneller lezen aangezien de syntax van de code in kleur en opgelicht wordt weergegeven.

1.1 Installatie van Vim onder Redhat Linux

Installeer de volgende RPM-packages om Vim onder Redhat Linux te installeren -


        rpm -i vim*.rpm

OF gebruik dit -
        rpm -i vim-enhanced*.rpm
        rpm -i vim-X11*.rpm
        rpm -i vim-common*.rpm
        rpm -i vim-minimal*.rpm

Je kan een lijst te zien krijgen van de bestanden die het rpm-package van vim installeert met -
 
        rpm -qa | grep ^vim | awk '{print "rpm -ql " $1 }' | /bin/sh | less

en hier doorheen bladeren met j,k, CTRL+f, CTRL+D, CTRL+B, CTRL+U of door gebruik te maken van de pijltjestoetsen, page up/down toetsen. Zie 'man less'.

1.2 Installatie van Vim onder GNU Debian Linux

Voor de installatie van Vim onder Debian Linux (GNU Linux) log je in als root en wanneer je bent verbonden met het internet type je:


apt-get install vim vim-rt

Hiermee zal de laatste versie van vim worden gedownload, geïnstalleerd en geconfigureerd en zal het 't .deb bestand dat werd gedowload, worden verwijderd. Het eerst opgesomde package is vim, de standaard editor, gecompileerd met X11-ondersteuning, vim-rt is de vim runtime, het bevat alle syntax- en helpbestanden.

1.3 Vim onder diverse Unix-en installeren

Download voor andere varianten van unix, zoals Solaris, HPUX, AIX, Sinix, SCO het broncode bestand


 
        zcat vim.tar.gz | tar -xvf -
        cd vim-5.5/src
        ./configure --enable-gui=motif
        make
        make install

1.4 Vim installeren onder Microsoft Windows 95/NT

Voor Windows 95/NT moet je TWEE zip-bestanden downloaden.

Haald deze twee zipbestanden op vanaf - Pak de zip-bestanden uit met behulp van Winzip http://www.winzip.com. Beide zip-bestanden (vim*rt.zip en vim*56.zip) moeten in dezelfde directory, bv in c:\vim worden uitgepakt.

Stel de omgeving VIM in in autoexec.bat en plaats daarin deze regel -


set VIM=c:\vim\vim56

Vim zou daarnaar moeten verwijzen daar waar je de vim56 directory installeerde. Je kunt je PATH ook zo instellen dat het pad naar gvim.exe erin voorkomt.

Mogelijk moet je uitloggen en weer inloggen om je omgeving in te stellen. Typ achter de MS-DOS prompt -


set vim

En je zou moeten zien: VIM=c:\vim\vim56

Maakt een snelkoppeling aan op je desktop door te klikken en slepen vanuit c:\vim\vim56\gvim.exe. Kopieer het bestand gvimrc_example naar $VIM\_gvimrc. In mijn geval is dit c:\vim\vim56\_gvimrc.

2. Stel de init-bestanden van gvim in

Je MOET het bestand gvimrc naar je homedirectory kopiëren om de syntax color highlighting te activeren. Hierdoor zal ook het "Syntax" Menu met de gvim-opdracht worden geplaatst. Je kunt op het Syntax-Menu klikken en de van toepassing zijnde talen selecteren, zoals C++, Perl, Java, SQL, ESQL enz..


cd $HOME
cp /usr/doc/vim-common-5.3/gvimrc_example  ~/.gvimrc

Commentaarregels beginnen in .gvimrc met dubbele aanhalingstekens ("). Je kunt gvim aanpassen door het wijzigen van het bestand $HOME/.gvimrc en daar de volgende regels in plaatsen -
"Deze regel is commentaar .... één die met dubbele aanhalingstekens begint
" Het beste is het bold-font, probeer ze allemaal en kies er één uit....
set guifont=9x15bold
"set guifont=8x13bold
"set guifont=7x14bold
"set guifont=7x13bold
"
"Beslist aan te raden de tabtoetsen op 4 in te stellen.
set tabstop=4
set shiftwidth=4
"Het tegengestelde is 'set wrapscan' bij het zoeken naar strings....
set nowrapscan
"
"Het tegengestelde is noignorecase
set ignorecase

Het word je ten zeerste aanbevolen de tabstop en shiftwidth op 4 in te stellen.

De tabstop is het aantal spaties dat door TAB zal worden geplaatst als je met gvim aan het werken bent. De shiftwidth is het aantal spaties waarmee de regels zullen worden verschoven bij gebruik van de ">>" of "<<" opdrachten van vi. Raadpleeg de tutorials van Vi Vim Tutorial voor meer details.

Zie de opdracht xlsfonts voor een lijst met beschikbare fonts onder Linux/Unix. Typ


        bash$ xlsfonts | less
        bash$ xlsfonts | grep -i bold | grep x
        bash$ man xlsfonts

2.1 Voorbeeld gvimrc bestand

Je kunt de instellingen, zoals kleuren, bold/normale fonts in het $HOME/.gvimrc bestand wijzigen. Het wordt ten zeerste aanbevolen dat je de achtergrondkleur op lichtgeel of wit met een zwarte voorgrond instelt. Ergonomen zeggen dat de beste achtergrondkleur lichtgeel of wit met een zwarte voorgrond is. Wijzig daarom als volgt de variabele 'guibg':


        highlight Normal guibg=lightyellow

Het voorbeeld gvimrc vanuit /usr/doc/vim-common-5.3/gvimrc_example luidt als volgt (vertaalde versie):


" Vim
" Een voorbeeld gvimrc bestand.
" De opdrachten hierin worden uitgevoerd wanneer de GUI wordt opgestart.
"
" Kopieer het voor gebruik naar
"     voor Unix en OS/2:  ~/.gvimrc
"            voor Amiga:  s:.gvimrc
"  voor MS-DOS en Win32:  $VIM\_gvimrc

" Zorg dat externe opdrachten via een pipe in plaats van een pseudo-tty werken
"set noguipty

" stel het te gebruiken X11-font in. Zie onder unix/linux 'man xlsfonts'.
" set guifont=-misc-fixed-medium-r-normal--14-130-75-75-c-70-iso8859-1
set guifont=8x13bold
"set guifont=9x15bold
"set guifont=7x14bold
"set guifont=7x13bold
"
"Beslist aan te raden de tabtoetsen op 4 in te stellen.
set tabstop=4
set shiftwidth=4
"Het tegengestelde is 'set wrapscan' bij het zoeken naar strings....
set nowrapscan
"
"Het tegengestelde is noignorecase
set ignorecase

" Stel de opdrachtregel in op 2 regels
set ch=2

" shift-insert werkt net als in Xterm
map <S-Insert> <MiddleMouse>
map! <S-Insert> <MiddleMouse>

" Doe dit alleen voor Vim versie 5.0 en later.
if version >= 500

  " Ik vind 't prettig als strings in C commentaar wordt opgelicht
  let c_comment_strings=1

  " Schakel syntax highlighting in.
  syntax on

" Schakel zoekpatroon highlighting in.
set hlsearch

" Voor Win32 versie, "K" zoekt het sleutelwoord in een helpbestand
"if has("win32")
"  let winhelpfile='windows.hlp'
"  map K :execute "!start winhlp32 -k <cword> " . winhelpfile <CR>
"endif

" Verberg de muisaanwijzer tijdens het typen
set mousehide

" Stel fraaie kleuren in
" achtergrond voor normale tekst is lichtgrijs
" Tekst onder de laatste regel is donkergrijs
" Cursor is groen
" Constanten worden niet onderstreept maar hebben een iets lichtere achtergrond
  highlight Normal guibg=grey90
  highlight Cursor guibg=Green guifg=NONE
  highlight NonText guibg=grey80
  highlight Constant gui=NONE guibg=grey95
  highlight Special gui=NONE guibg=grey95

endif

Zie ook het voorbeelbestand vimrc in /usr/doc/vim-common-5.3/vimrc_example dat voor onder de console wordt gebruikt

2.2 Xdefaults parameters

Je kunt een aantal eigenschappen van Vim in het bestand Xdefaults plaatsen.

WAARSCHUWING!! WAARSCHUWING: Plaats hierin niet de Vim*geometry; het zal het menu van gvim opbreken, gebruik hier voor in de plaats Vim.geometry.

Wijzig het bestand $HOME/.Xdefaults en plaats hierin de volgende regels:


! GVim great Colors.
Vim*useSchemes:         all
Vim*sgiMode:            true
Vim*useEnhancedFSB:     true
Vim.foreground:         Black
!Vim.background:        lightyellow2
Vim*background:         white
! Gebruik GEEN Vim*geometry, dit zal de menu's opbreken, gebruik in plaats
! daarvan Vim.geometry. Een asteriks tussen Vim en geometry is niet toegestaan.
! Vim.geometry: widthxheight
Vim.geometry:           88x40
!Vim*font:              -misc-fixed-medium-r-normal--20-200-75-75-c-100-iso8859-15-*5
Vim*menuBackground: yellow
Vim*menuForeground: black

Dit heeft effect na het intikken van -
        xrdb -merge $HOME/.Xdefaults
        man xrdb

Je kunt ook het bestand ~/.gvimrc wijzigen om de achtergrondkleuren te veranderen.


        gvim $HOME/.gvimrc
De beste achtergrondkleur is lichtgeel of wit.
highlight Normal guibg=lightyellow

3. Kleuren Syntax init bestanden

In plaats van gebruik te maken van het "Syntax" menu kun je het syntax-bestand ook handmatig bewerken. Wijzig het bestand met gvim en achter de : (dubbele punt) opdracht geef je de 'so' opdracht. Bijvoorbeeld -


        gvim foo.pc
        :so $VIM/syntax/esqlc.vim

De syntax source-bestanden staan in /usr/share/vim/syntax/*.vim. Vim ondersteunt meer dan 120 verschillende syntax-bestanden voor verschillende talen zoals C++, PERL, VHDL, Javascript,... enzovoort!!

Ieder syntaxbestand ondersteunt een standaardnaam voor de bestandsextensie, het syntaxbestand voor Javascript bijvoorbeeld, ondersteunt de extensie *.js. Mocht het je gebeuren dat je een andere extensie gebruikt die een conflict veroorzaakt met een ander standaard syntaxbestand zoals bij het plaatsen van Javascript in een *.html bestand, dan MOET je de opdracht :so $VIM/syntax/javascript.vim gebruiken. De beste methode is een softlink aan te maken zoals


ln -s $VIM/syntax/javascript.vim js
gvim foo.html (... dit bestand bevat javascript functies en HTML)
:so js

4. VIM Gebruik

Je kunt Vim in twee modi gebruiken - één met GUI en de andere zonder GUI. Om de GUI te gebruiken geef je de volgende opdracht -


        gvim foo.cpp

Om de niet-gui modus te gebruiken tik je in -
        vim foo.cpp
OF plain vanilla modus
        vi foo.cpp

Het is ten zeerste aan te raden dat je altijd gebruik maakt van gvim in plaats van vim, aangezien de GUI mode met kleuren je productiviteit beslist zal verbeteren.

De GUI mode voorziet in het volgende -

5. Vi bondgenoten

In het algemeen wordt Vim in samenwerking met andere krachtige tools zoals ctags en gdb gebruikt. De ctags is voor zeer snelle navigatie door miljoenen regels "C/C++" code en gdb voor het debuggen van de "C/C++" code. Een beknopte introductie van deze twee onmisbare opdrachten zal in dit hoofdstuk worden gegeven.

De ctags is de krachtigste beschikbare opdracht voor het coderen in C, C++, Java, Perl, Korn/Bourne shell scripts of Fortran. Ontwikkelaars gebruiken ctags zeer uitgebreid om "naar en vanuit" duizende functies C/C++ programma's te navigeren. Zie onder Unix 'man ctags'. Het is zeer belangrijk dat je MOET leren hoe deze ctags te gebruiken om programma's in C of C++, Java, enz.. te ontwikkelen. Navigatie is de belangrijkste taak tijdens het ontwikkelen in C of C++ code. Met behulp van ctags kun je de code zeer snel lezen door te springen van de aanroepende regel naar de functie en dieper in geneste functie-aanroepen gaan en naar het begin teruggaan. Je kunt zeer snel heen en weer van functie naar functie gaan.

Zonder NAVIGATIE zal je waarschijnlijk verloren zijn! ctags is als de magnetische KOMPAS naald voor de programmeurs.

Gebruik van ctags :


        ctags *.cpp
        gvim -t foo_function
        gvim -t main

Hiermee zal het C++ programmabestand met daarin de functie foo_funtion() worden gewijzigd en zal de cursor automatisch op de eerste regel van de funtie foo_funtion() worden geplaatst. De tweede opdracht brengt je naar de regel met de main() functie definitie.

Binnen de Vim editor, kun je naar een functie springen door het intikken van een : (dubbele punt) tag < functie naam > als hieronder -


        :tag voorbeeld_functie

Hiermee zal de cursor op de eerste regel van voorbeeld_functie() worden geplaatst.

Als je binnen de functie naar een regel met de naam van de functie wilt springen, plaats je de cursor direct voor de naam van de functie en druk je op CTRL+] (druk tegelijkertijd op de control-toets en linker blokhaak), hierdoor zal je automatisch direct rechts van de regel terechtkomen waar de functie begint!!


                // voorbeeldcode
                switch(id_number) {
                        Case 1:
                                if ( foo_function( 22, "abcef") == 3 )
                                    ^
                                    |
                                    |
                                    |
                  Plaats de cursor hier (direct voor foo_function) en druk op CTRL+]
                  Hierdoor zal je naar de functie met de naam "foo_function" gaan. 
                  Druk op CTRL+t om naar deze regel terug te keren.

Druk op CTRL+t (Control-toets en letter 't' samen) om terug te gaan naar de aanroepende regel. Je blijft de CTRL+t indrukken om terug te gaan en naar de eerste regel te gaan vanwaar je de navigatie begon. Dat wil zeggen dat je de CTRL+] in kan blijven drukken en dan de CTRL+t om terug te gaan. Je kunt dit zovaak herhalen als je wilt voor volledige navigatie door de C of C++ functies.

5.1 Ctags voor ESQL

Aangezien ctags de Embedded SQL/C (ESQL) taal niet direct ondersteunt, kan het volgende script worden gebruikt om tags voor esql aan te maken. ESQL/C zijn database SQL opdrachten embedded binnen de "C" programma's. Oracle's ESQL/C wordt Pro*C genoemd en Sybase, Informix heeft ESQL/C en PostgreSQL heeft het produkt "ecpg".

Bewaar dit bestand als "sqltags.sh" en pas een a+rx tags_gen.sh toe.


#!/bin/sh

# Programma om ctags voor ESQL, C++ en C bestanden aan te maken
ESQL_EXTN=pc
tag_file1=tags_file.1
tag_file2=tags_file.2

which_tag=ctags

rm -f $tag_file1 $tag_file2 tags

aa=`ls *.$ESQL_EXTN`
#echo $aa
for ii in $aa 
do
        #echo $ii
        jj=`echo $ii | cut -d'.' -f1`
        #echo $jj

        if [ ! -f $jj.cpp ]; then
                echo " "
                echo " "
                echo "***********************************************"
                echo "ESQL *.cpp bestanden bestaan niet.. "
                echo "Je moet de *.cpp vanuit het *.pc bestand genereren"
                echo "met behulp van de Oracle Pro*C pre-compiler of Sybase"
                echo "of Informix esql/c pre-compiler."
                echo "En vervolgens deze opdracht weer opnieuw uitvoeren"
                echo "***********************************************"
                echo " "
                exit
        fi

        rm -f tags
        $which_tag $jj.cpp
        kk=s/$jj\.cpp/$jj\.pc/g

        #echo $kk > sed.tmp
        #sed -f sed.tmp tags >> $tag_file1

        #sed -e's/sample\.cpp/sample\.pc/g' tags >> $tag_file1
        sed -e $kk tags >> $tag_file1
done

# Handel nu alle C++/C bestanden af - sluit de ESQL *.cpp bestanden uit
rm -f tags $tag_file2
bb=`ls *.cpp *.c`
aa=`ls *.$ESQL_EXTN`
for mm in $bb 
do
        ee=`echo $mm | cut -d'.' -f1`
        file_type="NOT_ESQL"
        # Sluit de ESQL *.cpp en *.c bestanden uit
        for nn in $aa 
        do
                dd=`echo $nn | cut -d'.' -f1`
                if [ "$dd" = "$ee" ]; then
                        file_type="ESQL"
                        break
                fi
        done

        if [ "$file_type" = "ESQL" ]; then
                continue
        fi

        rm -f tags
        $which_tag $mm
        cat tags >> $tag_file2
done

mv -f $tag_file2 tags
cat  $tag_file1 >> tags
rm -f $tag_file1

# Moet tags bestand sorteren wil het juist werken ....
sort tags > $tag_file1
mv $tag_file1 tags

5.2 Ctags voor Javascript programma's, Korn, Bourne shells

Het hieronder gegeven shell-script kan worden gebruikt om tags voor een zeer grote variëteit aan programma's geschreven in variety of programs written in JavasScript, PHP/FI scripts, Korn shell, C shell, Bourne shell en vele anderen te genereren. Dit is een zeer algemene module.

Bewaar dit bestand als tags_gen.sh en pas een chmod a+rx tags_gen.sh toe.


#!/bin/sh

tmp_tag=tags_file
tmp_tag2=tags_file2

echo " "
echo " "
echo " "
echo " "
echo " "
echo "Genereer tags voor ...."
while :
do
        echo "    Voer de bestandsextensie in waarvoor je tags wilt genereren."
        echo -n "  Bestandsextensie zou iets moeten zijn als sh, js, ksh, enz... : "
        read ans

        if [ "$ans" == "" ]; then
                echo " "
                echo "Onjuiste invoer. Probeer opnieuw!"
        else
                break
        fi
done

\rm -f $tmp_tag

aa=`ls *.$ans`

for ii in $aa
do
        jj=`echo $ii | cut -d'.' -f1`
        #echo $jj
        cp $ii $jj.c
        ctags $jj.c
        echo "s/$jj.c/$ii/g" > $tmp_tag2
        sed -f $tmp_tag2 tags >> $tmp_tag
        \rm -f tags $jj.c
done

sort $tmp_tag > tags

\rm -f $tmp_tag $tmp_tag2

5.3 Debugger gdb

Je zou samen met Vi uitgebreid gebruik moeten maken van gdb. Debuggen is het belangrijkste aspect van programmeren aangezien de belangrijkste kosten van een softwareproject in het debuggen en testen gaan zitten.

Gebruik de too 'gdb' voor het debuggen van C++/C programma's. Zie 'man gdb'. Je moet je programma's met de optie -g3 compileren als

        gcc -g3 foo.c foo_another.c sample.c

Voor het eenvoudig instellen van aliassen -

  Stel een alias in in je ~/.bash_profile
        alias gdb='gdb -directory=/home/src -directory=/usr/myname/src '
  Give -
        gdb foo.cpp
        gdb> dir /hom2/another_src
        Dit zal aan het bestandszoekpad worden toegevoegd
        gdb> break 'some_class::func<TAB><TAB>
  Hiermee zal de functienaam worden aangevuld om je tijd te sparen bij het typen... en zal uitvoer produceren als -
        gdb> break 'some_class::function_foo_some_where(int aa, float bb)'

Het tweemaal indrukken van de TAB-toets is de voltooiïng van de opdrachtregel, wat je heel veel tijd zal besparen bij het typen. Dit is één van de belangrijkste technieken bij het gebruik van gdb.

Voor online hulp -

        gdb> help
  Geeft online hulp
        gdb> help breakpoints
  Geeft meer details over breakpoints.

Het instellen van breakpoints en het debuggen

        unixprompt> gdb exe_filename 
        gdb> b main
Hiermee zal een breakpoint in de main() functie worden geplaatst
        gdb> b 123
Hiermee zal een breakpoint in regel 123 van het huidige bestand worden geplaatst.
        gdb> help breakpoints
Geeft meer details over breakpoints.

Voor het analyseren van de core dumps

        unixprompt> gdb exe_filename  core
        gdb> bt
  Geeft backtrace van functies en regelnummers waar het programma in gebreke bleef
        gdb> help backtrace
  Geeft meer details over backtrace.

Je kunt ook de GUI-versie van gdb, genaamd xxgdb gebruiken.

Memory leak tools -

6. Online VIM help

Zie de online man pages. Typ achter de unix shell-prompt man vim en man gvim.

Of in de gvim sessie tik je :help in voor de helppagina. Zie ook de Vim Tutorial Vim Tutiorial.

                        VIM - hoofd helpbestand

     Manoeuvreren:  Gebruik de cursortoetsen, of "h" om naar links te gaan,
                    "j" om naar beneden te gaan, "k" om naar boven te gaan,
                    "l" om naar rechts te gaan.
                    ":1" ga naar 1e regel van pagina
                    ":n" ga naar de n-de regel van pagina
                    "<SHIFT>g" ga naar de onderkant van pagina
                    ":/eenwoord/ zoek naar "eenwoord" in doc

Sluit dit venster:  Gebruik ":q<Enter>".

Ga naar onderwerp:  Positioneer de cursor op een tag tussen |<tag>| en druk op
                    CTRL-].

      Met de muis:  ":set mouse=a" om de muis te activeren (in xterm of GUI).
                    Dubbelklik met de linkermuisknop op een tag tussen |<tag>|.

         ga terug:  Typ CTRL-T of CTRL-O.

  Specifieke hulp:  Het is mogelijk direct naar een bepaald hulponderwerp
                    te gaan, door een argument aan de ":help" opdracht
                    |:help| op te geven.
                    Het is mogelijk de context verder te specificeren:
                          WAT                   ERVOOR     VOORBEELD    ~
                    Normale modus opdrachten    (niets)    :help x
                    Visual modus opdrachten       v_       :help v_u
                    Insert modus opdrachten       i_       :help i_<Esc>
                    command-line opdrachten       :        :help :quit
                    command-line editing          c_       :help c_<Del>
                    Vim opdrachtargumenten        -        :help -r
                    opties                        '        :help 'textwidth'

lijst met documentatie-bestanden:

|howto.txt|     hoe het meest algemene te doen
|intro.txt|     introductie Vim
|index.txt|     alfabetische index voor iedere mode
|autocmd.txt|   automatisch uitvoeren van opdrachten bij een actie
|change.txt|    verwijderen en vervangen van tekst

7. Vim Home page en Vim links

De homepage van vim is te vinden bij http://www.vim.org en de mirror-site in de US http://www.us.vim.org

Vim FAQ is bij http://www.grafnetix.com/~laurent/vim/faq.html en bij http://www.vim.org/faq

Eli's Vim Page op http://www.netusa.net/~eli/src/vim.html

De Vi Lovers Home Page http://www.cs.vu.nl/~tmgil/vi.html

Vim Reference Guide op http://scisun.sci.ccny.cuny.edu/~olrcc/vim/

Vim mailing list op http://www.findmail.com/listsaver/vimannounce.html en http://www.vim.org/mail.html

Mailing list archieven worden bewaard op:

Vim macro's http://www.grafnetix.com/~laurent/vim/macros.html

8. Vim Tutorial

8.1 Vim Hands-on Tutorial

Kijk voor de tutorial op een Linux-systeem in /usr/doc/vim-common-5.*/tutor, ga onder andere unix-systemen naar de directory waarin vim is geïnstalleerd en zoek naar de doc directory.


        bash$ cd /usr/doc/vim-common*/tutor
        bash$ less README.txt
        bash$ cp tutor $HOME
        bash$ cd $HOME
        bash$ less tutor

8.2 Vi Tutorials op het Internet

9. Vi Tutorial

In deze tutorial beschrijven we een aantal "gevorderde" vi concepten en opdrachten, zodat je de kracht van vi kunt leren waarderen en dus beslissen hoe je je kennis van vi opdrachten kunt uitbreiden. Bijna alle vi referenties sommen de beschikbare opdrachten op, maar veel gaan er niet op in hoe de opdrachten met elkaar in verband staan; dit onderwerp is het hoofddoel van deze tutorial.

9.1 Cursor verplaatsingsopdrachten

De vi cursorverplaatsingsopdrachten maken het mogelijk de cursor met een minimum aantal toetsaanslagen efficiënt in het bestand en/of op het scherm te positioneren. Er zijn heel veel cursorverplaatsingsopdrachten - probeer ze niet allemaal tegelijkertijd te onthouden! Later zullen we zien dat veel van de kracht van vi komt door het mixen van cursorverplaatsingsopdrachten met andere opdrachten om tekst te verwijderen, wijzigen, yanken (kopiëren), en filteren.

Wijzig alsjeblieft een groot tekstbestand (zoals bijvoorbeeld wknight) zodat je met iedere opdracht kunt experimenteren op 't moment dat 't wordt beschreven. Houd in gedachten dat deze opdrachten alleen in de Commando-modus werken, niet in de Insert Modus; als je "opdrachten" in je tekst krijgt, druk dan op de ESC-toets om naar de Commando-modus terug te keren.

9.2 Herhalingen

Veel van de verplaatsingsopdrachten die hiervoor werden besproken kunnen worden voorafgegaan door een getal waarmee wordt aangegeven hoeveel maal de erna volgende opdracht moet worden herhaald; de verplaatsing wordt gewoon het gegeven aantal malen herhaald:

Voor een aantal opdrachten hebben de herhalingen een speciale betekenis: Bij een aantal opdrachten (b.v., ^) wordt de herhaling genegeerd; bij anderen (b.v., / en ? ) is het niet toegestaan

9.3 Verwijderen van Tekst

We hebben gezien dat dd de huidige regel verwijdert. Dit kan met een herhaling worden gebruikt: 3dd verwijdert drie regels, de huidige regel en de 2 daarop volgende regels.

De d opdracht kan als een "voorvoegsel" worden gebruikt met de meeste verplaatsingsopdrachten hierboven om bijna willekeurige stukken tekst te verwijderen. De verplaatsingsopdrachten worden "target specifiers" genoemd, als ze in combinatie met d worden gebruikt. Aan d kan een herhaling worden opgegeven. (Als je hiermee gaat experimenteren, denk er dan aan na iedere opdracht de u in te tikken om de verwijdering ongedaan te maken).

Gebruik x om enkele tekens te verwijderen. aan x kan een herhaling worden opgegeven: x is in feite gewoon een afkorting van d1; dat wil zeggen, verwijder één teken rechts.

9.4 Wijzigen van Tekst

De c opdracht is vergelijkbaar met d, behalve dat het vi naar Insert mode laat schakelen, waarbij het mogelijk wordt de oorspronkelijke (ongewenste) tekst in iets anders te veranderen.

Plaats bijvoorbeeld de cursor aan het begin van een woord (druk op w om naar het begin van het volgende woord te gaan). Druk dan op cw om dat woord te wijzigen. Op het scherm zal het laatste teken in het woord dat wordt gewijzigd, worden vervangen door een $-symbool om de grens van de wijziging aan te geven; typ een nieuw woord in (je zult het oorspronkelijke woord op het scherm overschrijven) en druk de ESC-toets in als je klaar bent. Wat je invoert mag langer of korter zijn dan het woord dat wordt gewijzigd.

Plaats de cursor aan het begin van een regel bestaande uit op z'n minst drie woorden, en probeer c3w om drie woorden te wijzigen. Probeer c$ om tot het einde van de huidige regel te wijzigen. In alle gevallen wordt de grens aangegeven met $ daar waar de wijziging alleen effect heeft op de huidige regel.

Als een wijziging op meer dan alleen de huidige regel effect heeft, verwijdert vi de oorspronkelijke tekst van het scherm en schakelt over naar Insert-mode. Probeer bijvoorbeeld eens met c3+ de huidige en 3 volgende regels te wijzigen; vi verwijdert de vier oorspronkelijke regels van het scherm en schakelt over naar Insert-mode op een nieuwe blanco regel. Druk zoals gewoonlijk op de ESC-toets wanneer je klaar bent met het invoeren van je nieuwe tekst.

Een aantal andere wijzigingsopdrachten:

9.5 Yanken (kopiëren) van Tekst

De y opdracht kopieert een kopie van tekst naar een buffer; de gekopieerde tekst kan dan met p of P elders in het bestand worden geplaatst (of geplakt).

De eenvoudigste vorm van yank is yy om de huidige regel te kopiëren; probeer na een yy een kopie van de gekopieerde regel na de cursor te plaatsen. Na een yy, kun je zoveel kopieën van de gekopieerde regel maken als je wilt door naar boven en naar beneden in het bestand te gaan en op p te drukken.

Probeer voor het kopiëren van meerdere regels bijvoorbeeld 5yy (kopieer de huidige en de volgende vier regels). p plaatst een kopie van de gekopieerde regels na de cursor; de reeks 5yyp "werkt" maar het is waarschijnlijk niet wat je wilt. De P opdracht is vergelijkbaar met p, maar het plaatst een kopie van de gekopieerde tekst voor de cursor; probeer de reeks 5yyP.

Andere kopieer-opdrachten:

9.6 Filteren van tekst

De filteropdracht !, verwacht de naam van een UNIX-opdracht (wat een filter zou moeten zijn), en geeft de geselecteerde regels dan door aan het filter, waarbij de geselecteerde regels in de vi-buffer dan worden vervangen door de uitvoer van het filteropdracht. vi's vermogen om bijna willekeurige stukken tekst via iedere UNIX-filter door te geven voegt, zonder "extra kosten" aan vi een ongelofelijke flexibliteit toe.

Ter illustratie zal een aantal voorbeelden van hulp zijn. Maak in het bestand een regel met slechts het woord 'who' en absoluut geen andere tekst. Plaats de cursor op deze regel, en druk op !!. Deze opdracht is analoog aan dd, cc, of yy, maar in plaats van het verwijderen, wijzigen of kopiëren van de huidige regel, filtert het de huidige regel. Als je de tweede ! indrukt, gaat de cursor naar de linkerhoek aan de onderkant van het scherm en wordt een enkele ! getoond, daarbij wachtend totdat je de naam van een filter opgeeft. Typ als filternaam sh en druk op de Return-toets. sh (de Bourne shell) is een filter! Het leest van standaarinvoer, verwerkt zijn invoer (dat wil zeggen, voert opdrachten uit) en stuurt de uitvoer (de uitvoer van die opdrachten) naar standaarduitvoer. Het filteren van de regel met who via sh zorgt ervoor dat de regel met who wordt vervangen door een lijst met de huidige gebruikers op het systeem - direct in je bestand!

Probeer dit proces te herhalen met date. Dat wil zeggen, maak een regel met niets anders dan het woord date, plaats de cursor dan op deze regel, druk op !!sh en de Return-toets. De regel met date wordt vervangen door de uitvoer van de date opdracht.

Plaats de cursor op de eerste regel van de uitvoer van who. Tel het aantal regels. Stel bijvoorbeeld dat het aantal zes is. Selecteer dan deze zes regels om via sort te laten filteren; druk op 6!!sort en vervolgens de Return-toets. De zes regels zullen aan sort worden doorgegeven, en de zes oorspronkelijke regels worden door de uitvoer van sort vervangen.

De filteropdracht kan alleen op gehele regels worden toegepast, niet op tekens of woorden.

Nog wat andere filter-opdrachten (hier betekent, < CR > een druk op de Return-toets):

9.7 Markeren van Regels en Tekens

Je kunt regels en tekens markeren om te worden gebruikt als doel voor verplaatsing, verwijdering, wijziging, ze te kopiëren, of filteren met behulp van de opdracht mc, waar c staat voor een kleine letter.

Plaats de cursor bijvoorbeeld in het midden van een woord en druk op ma. Hiermee wordt het teken onder de cursor met a gemarkeerd.

Verplaats de cursor nu naar elders, weg van het gemarkeerde teken en naar een andere regel (gebruik de cursorpijlen, CTRL-u of iets dergelijks). Om naar de gemarkeerde regel terug te keren, tik je 'a in. (dat wil zeggen, een enkel aanhalingsteken en dan een a). Hierdoor wordt de cursor naar het eerste niet-blanco teken in de regel gemarkeerd met a verplaatst.

Ga weer weg van deze regel. Druk op `a (dat wil zeggen, een aanhalingsteken achterwaarts en dan een a) om naar het gemarkeerde teken terug te keren. Hierdoor wordt de cursor naar het teken gemarkeerd met a verplaatst.

Markeringen worden meestal gebruikt in combinatie met verwijderingen, wijzigingen, kopieer- of filteropdrachten. Verplaats de cursor bijvoorbeeld naar een andere regel dan die met de markering a en druk dan op d'a (d, een enkel aanhalingsteken en een a). Hiermee wordt de huidige regel tot en met de regel gemarkeerd met a verwijderd.

Plaats de cursor in het midden van een ander woord en druk op mb om de markering b in te stellen. Verplaats de cursor nu, weg van dat woord (maar slechts een paar regels, zodat je makkelijk kunt zien wat we aan het doen zijn), en druk dan op d`b (d, aanhalingsteken achterwaarts, b). Hierdoor wordt het huidige teken tot en met het teken gemarkeerd met b verwijderd.

Een ander voorbeeld is om de uitvoer van who te sorteren, markeer de eerste regel (ma), verplaats de cursor dan naar de laatste regel en druk op !'asort en dan de Return-toets.

Als je naar een markering springt en besluit terug te gaan naar waar je vandaan sprong, kun je '' intikken (ga terug naar regel ..) of `` (ga terug naar het teken ..).

9.8 Benoemen van Buffers

Als je tekst verwijdert, wijzigt of kopieert, wordt de oorspronkelijke tekst (tot de volgende verwijdering, wijziging of kopieeropdracht) in een onbenoemde buffer opgeslagen van waaruit het kan worden opgehaald met p of P. Door gebruik te maken van de onbenoemde buffer, kan alleen de meest recente verwijderde, gewijzigde of gekopieerde tekst worden hersteld.

Als je meerdere delen van je tekst wilt verwijderen, wijzigen of kopiëren en je wilt ze allemaal onthouden (tot aan een maximum van 26), kun je voor de wijzigings- of kopieeropdracht aan een buffer een naam toekennen. De naam van een buffer heeft de vorm "c (dubbel aanhalingsteken, kleine letter c).

Tik bijvoorbeeld "ayy in om de huidige regel naar buffer a te kopiëren. Verplaats je vervolgens naar een andere regel en druk op "byy om die regel naar buffer b te kopiëren. Verplaats de cursor nu naar elders in het bestand en tik in "ap en "bp om kopieën van de tekst te plaatsen die in de buffers a en b zijn geplaatst.

Nog wat andere benoemde bufferopdrachten:

9.9 Substituties

Gebruik de :s opdracht om een stuk tekst door een ander stuk tekst in regels door je hele bestand te vervangen. Wat substitueer voorbeelden:

9.10 Diverse "Commando's beginnend met een dubbele punt"

Alle volgende opdrachten beginnen met een dubbele punt; als je de dubbele punt intikt, gaat de cursor naar de linkeronderkant van het scherm en wordt er een prompt, bestaande uit een dubbele punt, weergegeven, die wacht totdat je gereed bent met het invoeren van je opdracht.

Een aantal belangrijke voorbeelden:

9.11 Opties Instellen

Diverse opties hebben effect op de "feel" van vi. Je kunt alle diverse opties die kunnen worden ingesteld tonen met de opdracht :set all. Je kunt set ook gebruiken om opties te wijzigen.

Als je bijvoorbeeld regelnummers wilt zien voor de regel in het bestand wat je aan het wijzigen bent, gebruik je de opdracht :set number. Voor het uitzetten van de regelnummering, gebruik je de opdracht :set nonumber. De meeste opties kunnen worden afgekort. :set nu zet de regelnummering aan en :set nonu zet de regelnummering uit.

Met een :set nomagic, wordt de speciale betekenis van de reguliere expressie tekens (punt, asterisk, blokhaak, enz.) uitgeschakeld. Gebruik :set magic om de speciale betekenissen weer te herstellen.

Een aantal opties verwacht een waarde. :set tabstop=4 bijvoorbeeld zorgt ervoor dat tabs als vier spatie-tekens worden weergegeven in plaats van de gebruikelijke acht.

Als je bemerkt dat je bepaalde opties altijd op een bepaalde manier instelt, kun je de set opdrachten die je wilt in een bestand met de naam .exrc plaatsen, of je kunt de omgevingsvariabele EXINIT instellen om de gewenste opties in te stellen.

Als je login-shell bijvoorbeeld de Bourne-shell is, zou deze regel in je .profile bestand geplaatst kunnen worden:


        EXINIT='set nomagic nu tabstop=4'; export EXINIT

Als je login-shell een C-shell is, zou deze regel in je .login bestand geplaatst kunnen worden:
        setenv EXINIT 'set nomagic nu tabstop=4'

9.12 Key Mappings

Als je bemerkt dat je keer op keer een serie eenvoudige opdrachten aanroept, kun je met de opdracht :map de serie opdrachten aan een ongebruikte opdrachttoets toekennen. Als in de toekenning controle-tekens zoals de Return-toets (CTRL-M in ASCII) of de ESC (CTRL-[ in ASCII), moeten worden opgenomen, laat dergelijke tekens dan voorafgaan door een CTRL-v om hun speciale betekenis te onderdrukken.

In bijvoorbeeld de hierna volgende opdracht wordt aan de opdracht CTRL-A toegekend dat de cursor 55 regels verder wordt geplaatst, dan weer terug wordt gegaan naar de regel met de minste tekens, waarbij die blanco regel wordt gewijzigd in een formfeed (CTRL-L) gevolgd door drie blanco regels. Dat wil zeggen dat iedere CTRL-A de volgende pagina zal pagineren, zonder dat paragrafen op meerdere pagina's worden gesplitst.

Noot: In deze opdracht wordt ieder controle-teken getoond als ^C, C is hierbij een hoofdletter. CTRL-M wordt bijvoorbeeld getoond als ^M. Wanneer je deze opdracht invoert, zul je ook de CTRL-v tekens zoals getoond, niet zien: iedere CTRL-v onderdrukt louter de gebruikelijke speciale betekenis van het volgende controle-teken, dus als je de reeks ^V^M intikt, zul je op het scherm slechts ^M zien. In deze opdracht, is ^M de Return-toets en ^[ is de ESC-toets.


        :map ^A  55+?^$^V^Mcc^V^L^V^M^V^M^V^M^V^[

9.13 Wijzigen van Meerdere Bestanden

Je kunt met vi meerdere bestanden wijzigen, door als argumenten op de opdrachtregel, meerdere bestandsnamen op te geven:


        vi croc fatherw  wknight

Twee opdrachten beginnend met een dubbele punt worden gebruikt om je tussen de meerdere bestanden te verplaatsen: De :n en :rew opdrachten zijn wat onhandig, maar er zijn een aantal belangrijke voordelen: de inhoud van benoemde buffers ("a, "b, "c, etc.) worden door de bestanden heen onthouden, dus je kunt :n en :rew met p en P gebruiken om tekst heen en weer tussen bestanden te kopiëren. Ook wordt de meest recente zoekstring voor de / en ? opdrachten door de bestanden heen onthouden, dus je kunt nogal makkelijk herhalende zoekopdrachten in meerdere bestanden gebruiken.

Probeer bijvoorbeeld het volgende experiment: Ga eerst uit vi, start vi dan op met croc en wknight als argumenten:


        $ vi croc wknight

Zoek in croc naar `de'

/de < CR >

Kopieer deze regel naar buffer a:

"ayy

Ga nu naar het volgende bestand (je hebt geen wijzigingen aangebracht aan croc, dus dit werkt):

:n < CR >

Zoek naar de volgende regel met `de', zonder het opnieuw intikken van de zoekstring:

n

Plaats een kopie van buffer a na de huidige regel in wknight:

"ap

Ga twee regels naar beneden, en kopieer de huidige regel naar buffer b:

jj"byy

Sla de wijzigingen in wknight op

:w < CR >

Ga nu terug naar croc

:rew < CR >

Zoek nogmaals, en plaats een kopie van buffer b na de gevonden regel:

n"bp

Sla de wijzigingen op en beëindig vi

ZZ

9.14 Laatste Opmerkingen

Deze tutorial was bedoeld om wat van de mogelijkheden van vi te introduceren waar je in het systeemhandboek van vi misschien overheen zou kijken of die wellicht niet in het handboek worden vermeld (op de verschillende systemen zijn de handboeken van zeer verschillende kwaliteit).

Je zult na het lezen van deze tutorial geen vi-expert zijn, maar je kunt de mogelijkheden van vi dan wel juist inschatten. Slechts tijd en moeite kunnen een vi-expert van je maken. Maar de efficiëntie en alomvattenheid betalen dit op de lange termijn terug.

Mogelijk heb je besloten dat je vi haat. Het zij zo! Maar wees je er bewust van dat vi de standaard UNIX teksteditor blijft - de enige editor waar je op kunt rekenen dat het op ieder UNIX-systeem beschikbaar is - dus zelfs als je de voorkeur geeft om dagelijks iets anders te gebruiken, wordt je geadviseerd om bekend te zijn met het absolute minimum aan het vi-materiaal dat in deze tutorial is behandeld.

10. Vim Referentiekaart

10.1 Vi status

Vi heeft 3 modi:

  1. opdrachtenmodus - Normale en initiële status; anderen keren hier naar terug (gebruik ESC om een gedeeltelijk getypte opdracht af te breken)
  2. invoer modus - ingegaan door specieke opdrachten a i A I o O c C s S R en beëindigd door ESC of abnormaal door een interrupt
  3. regel modus - d.w.z. het wachten op invoer na een : , / , ? of een ! opdracht (beëindigd met CR, af te breken met CTRL-c). CTRL is de control-toets: CTRL-c betekent "control c"

10.2 Shell Commando's

  1. TERM= code Plaatst een code-naam voor je terminal in de variabele TERM
  2. export TERM Draagt de waarde van TERM over (de terminal code) naar ieder UNIX-systeemprogramma dat terminal afhankelijk is.
  3. tput init Initialiseert de terminal zodat het juist zal functioneren met diverse UNIX-systeemprogramma's.
  4. vi filename Geeft toegang tot de schermeditor vi zodat je een specifiek bestand kunt wijzigen.
  5. vi file1 file2 file3 Laadt drie bestanden in de vi buffer om te worden gewijzigd. Die bestanden zijn file1, file2, en file3.
  6. view file Roep de vi-editor aan met het bestand file in read-only modus
  7. vi -R file Roep de vi-editor aan met het bestand file in read-only mode
  8. vi -r file Herstel het bestand file en recente wijzigingen na een systeemcrash
  9. vi -r file Herstel het bestand file en recente wijzigingen na een systeemcrash

10.3 Opties Instellen

  1. :set optie Activeer optie
  2. :set optie=waarde Wijs waarde toe aan optie
  3. :set no optie Deactiveer optie
  4. :set Toon door gebruiker ingestelde opties
  5. :set all Toon lijst met alle huidige opties, zowel standaard als die zijn ingesteld door de gebruiker
  6. :set optie? Toon waarden van optie

10.4 Gebruikte Notaties

Notaties:

  1. CTRL-c CTRL is de control-toets: CTRL-c betekent "control c"
  2. CR is een Carriage return (ENTER toets)

10.5 Onderbreken, annuleren

10.6 Bestandsmanipulatie

10.7 Verplaatsen

10.8 Regel positionering

10.9 Positioneren van de cursor

10.10 Woorden, zinnen, paragrafen

10.11 Markeren en terugkeren

10.12 Correcties tijdens het invoegen

10.13 Aanpassen van het scherm

10.14 Verwijderen

10.15 Invoegen, wijzigen

10.16 Kopiëren en Plakken

De "yank buffer" wordt met IEDERE delete opdracht gevuld, of expliciet door Y en yy.

10.17 Operators (gebruik dubbel om effect te hebben op regels)

10.18 Zoeken en vervangen

10.19 Algemeen

10.20 Regeleditor-opdrachten

10.21 Andere opdrachten

11. Gerelateerde URL's

Aan VIM gerelateerde URL's zijn te vinden bij -

12. Andere Formaten van dit Document

Dit document is in 10 verschillende formaten gepubliceerd, te weten - DVI, Postscript, Latex, LyX, GNU-info, HTML, RTF(Rich Text Format), Plain-text, Unix man pages en SGML.

Het document is geschreven door gebruik te maken van een tool genaamd "SGML tool" welke kan worden opgehaald vanaf - http://www.xs4all.nl/~cg/sgmltools/ Bij het compileren van de source krijg je met de volgende opdrachten

Dit document is te vinden op -

Je kunt dit document ook vinden op de volgende mirror-sites -

Gebruik het xdvi-programma om dit document in het dvi-formaat te bekijken. Het xdvi-programma is te vinden in het tetex-xdvi*.rpm package in Redhat Linux wat kan worden gevonden via de ControlPanel | Applications | Publishing | TeX menu buttons.

        Geef de volgende opdracht om het dvi-document te lezen -
                xdvi -geometry 80x90 howto.dvi
        En pas de grootte van het scherm met de muis aan. 
        Zie de manpage over xdvi. 
        Gebruik de pijltjestoetsen, Page Up, Page Down keys, om door
        het document te manoeuvreren, je kunt ook de
        'f', 'd', 'u', 'c', 'l', 'r', 'p', 'n' letter
        toetsen gebruiken om naar boven, onder, het midden, de volgende
        pagina, vorige pagina, enz te gaan.
        Druk op 'x' om het expert-menu uit te schakelen.
Je kunt het postscript-bestand lezen met behulp van het programma 'gv' (ghostview) of 'ghostscript'. Het ghostscript programma is te vinden in het ghostscript*.rpm package en het gv programma is te vinden in het gv*.rpm package in Redhat Linux welke kan worden gelokaliseerd via de ControlPanel | Applications | Graphics menu buttons. Het gv programma is veel gebruikersvriendelijker dan ghostscript. Ghostscript en gv zijn ook voor andere platformen beschikbaar zoals OS/2, Windows 95 en NT.
        Geef de volgende opdracht om het postscript document te lezen -
                gv howto.ps

        Met gebruik van ghostscript geef je op -
                ghostscript howto.ps

Je kunt het HTML-formaat document lezen met Netscape Navigator, Microsoft Internet explorer, Redhat Baron Web browser of enige andere webbrowsers.

Je kunt de latex, LyX uitvoer lezen met LyX een "X-Windows" front end naar latex.

13. Copyright Notice

Copyright policy is GNU/GPL as per LDP (Linux Documentation project). LDP is a GNU/GPL project. Additional restrictions are - you must retain the author's name, email address and this copyright notice on all the copies. If you make any changes or additions to this document than you should intimate all the authors of this document.