Edytor vi


Edytor vi cieszy się wśród wielu użytkowników niezasłużoną sławą edytora trudnego, nieporęcznego w użyciu i dysponującego małym zestawem możliwości operowania na tekście. A jednak pomimo tego vi nadal pozostaje standardem w systemie UNIX. Dlaczego? Składa się na to kilka przyczyn:
  1. vi jest edytorem, który może pracować na każdym typie terminala; nawet na terminalach, które nie umożliwiają realizacji edycji pełnoekranowej - w takim przypadku vi pracuje jako edytor liniowy
  2. vi jest dostarczane wraz z systemem operacyjnym UNIX (LINUX); oznacza to, że na jakimkolwiek sprzęcie UNIX'owym byśmy nie pracowali vi jest zawsze dostępne
  3. niezależność edytora vi od klawiszy funkcyjnych powoduje, że użytkownik nie napotyka na żadne kłopoty jeżeli kiedyś zmuszony będzie korzystać z jakiejś "egzotycznej" klawiatury
  4. wielu użytkowników ceni vi za rozbudowany system wyszukiwania wyrażeń regularnych , makr klawiszowych i buforów tekstu

Organizacja pracy

Edycja tekstu za pomocą edytora vi odbywa się na dwóch płaszczyznach. Płaszczyzna wyższa zwana płaszczyzną komend to ten poziom edycji , na którym znajdujemy się zaraz po uruchomieniu edytora. Na płaszczyźnie tej klawisze literowe mają swoje znaczenia funkcyjne, a nie są po prostu literami. Aby przejść do płaszczyzny niższej zwanej płaszczyzną wprowadzania należy wcisnąć na poziomie komend jedna z liter powodujących przejście do wprowadzania. Klawisze te to a,i,o,O, a ich znaczenie zostanie omówione za moment. Powrót z płaszczyzny wprowadzania na płaszczyznę edycji następuje poprzez wciśnięcie klawisza ESC.
Dobrym sposobem przetestowania na której płaszczyźnie jesteśmy jest wciśnięcie klawisza ESC. W przypadku gdybyśmy znajdowali się na płaszczyźnie komend rozlegnie się brzęczyk.

Za pomocą vi można edytować jednocześnie wiele plików. Jednakże jednorazowo na ekranie przetwarzany jest tylko jeden. Aby po wywołaniu vi file1 file2 file3 przejść z edycji pliku file1 do edycji pliku file2 należy z płaszczyzny komend użyć polecenia :n . W przypadku gdy chcemy dołączyć do listy przetwarzanych plików nowy plik używamy komendy :e . Informacje o tym jakie pliki są aktualnie edytowane uzyskamy poprzez komendę :args.

Przenoszenie tekstu pomiędzy plikami odbywa się poprzez bufory robocze (może ich być do 26-ciu).

Szybkie poruszanie się po tekście umożliwiają znaczniki tekstu (w jednym pliku do 20 znaczników).

Często używaną sekwencje klawiszy możemy zdefiniować jako makro klawiszowe. Sekwencji takich w vi może być dowolna ilość.

Podział pliku na zdania, ustępy i sekcje pozwala na bardzo efektywne przetwarzania tekstu.

Przegląd podstawowych poleceń vi dla początkującego użytkownika

  WYWOŁANIE vi :                          vi <NAZWA pliku> (ENTER)
  
  OPUSZCZENIE vi: 
    z zapamiętaniem zmian                 ZZ  
    bez zapamiętania zmian                :q! (ENTER)
                                          
  ZAPAMIĘTANIE ZMIAN W TRAKCIE EDYCJI:    :w (ENTER)
  
  WYKONANIE KOMENDY SHELLA:               :!<KOMENDA>

  STRONICOWE PRZEGLĄDANIE EKRANU:                    
    do przodu                              <CTRL>d
    do tyłu                                <CTRL>u

  PORUSZANIE SIĘ PO PLIKU:
    w lewo                                h
    w prawo                               j
    do góry                               k
    na doł                                l
    na początek linii                     0,^
    na koniec linii                       $
    do linii o numerze #                  #G  (np 1G 20G 25G itd..)

  DOPISYWANIE TEKSTU:
    na prawo od kursora                   a<SŁOWO>
    na lewo od kursora                    i<SŁOWO>
    poniżej linii z kursorem              o<SŁOWO>
    powyżej linii z kursorem              O<SŁOWO>

  KASOWANIE TEKSTU:
    pojedynczego znaku                    x
    pojedynczego słowa                    dw
    całej linii                           dd
    do końca linii                        d$
    do początku linii                     d0

  POPRAWIANIE TEKSTU:
    pojedynczego znaku                    r<ZNAK>
    pojedynczego słowa                    cw<SŁOWO>
    całej linii                           cc<SŁOWO>
   
ODWOŁYWANIE ZMIAN (UNDO):
    odwołanie ostatniego polecenia        u
    wszystkich  poleceń                   :e!

SZUKANIE ŁAŃCUCHA ZNAKÓW:         
    do przodu                             /<SŁOWO> (ENTER)
    do tylu                               ?<SŁOWO> (ENTER)

ZNACZNIKI TEKSTU: 
    postaw znacznik # na bieżącej         m# (# = a..m np ma,mb itd.)
    pozycji kursora                       
    ustaw kursor na znaczniku #           '# (# = a..m np 'a,'b itd.)

ZAPAMIĘTYWANIE TEKSTU DO OBSZARU POMOCNICZEGO (YANK):
    pojedynczego słowa                    yw
    całej linii                           yy
    do końca linii                        y$

DOPISYWANIE TEKSTU Z OBSZARU POMOCNICZEGO (PUT):
    po kursorze                           p
    przed kursorem                        P

WŁĄCZENIE NUMERACJI LINII:               :set number
                                         
WYŁĄCZENIE NUMERACJI LINII:              :set nonumber

WYSZUKANIE I ZAMIANA TEKSTU:        
    wszystkich wystąpień w linii          :s/stary_ciag/nowy_ciag/g
    pierwszego wystąpienia w linii        :s/stary_ciag/nowy_ciag
    wszystkich wystąpień od linii 2 do 9  :2,9s/stary_ciag/nowy_ciag/g
    wszystkich wystąpień w pliku          :1,$s/stary_ciag/nowy_ciag/g

Składnia komend edytora vi

Składnia ogólna poleceń edytora vi wygląda następująco:

(bufor) (licznik) (operator) obiekt
   
        obiekty:

        początek linii       0,^(jeżeli używamy liczników)
        koniec linii         $
        słowo                w
        linia                (nie ma oznaczenia; powtarza się operator)
        znacznik  #          '#
        ruchy kursora        h,j,k,l  
Wywołanie samego obiektu powoduje przestawienie się kursora na ten obiekt, np.: 'a powoduje przesuniecie się kursora na znacznik a, a $ powoduje przejście kursora na koniec bieżącej linii
    
        operatory:

        d - kasuj
        c - zmień
        y - zapamiętaj (yank)
        > - przesuń w prawo
        < - przesuń w lewo
Dopuszczalne są komendy typu operator / obiekt np.:
       d'a - skasuj wszystko od bieżącej pozycji kursora do
             znacznika a         
       yw  - zapamiętaj słowo
       yy  - zapamiętaj aktualna linie
       >'a - przesuwa linie od bieżącej pozycji kursora do
             znacznika a o znacznika a o jedna tabulacje w prawo
            (wielkość tabulacji ustalamy poprzez ":set shiftwidth")
wykorzystanie liczników: W celu wielokrotnego wykonania komendy używa się przed jej oznaczeniem licznika: jak np. w komendach typu licznik / operator / obiekt:
  
      4dw  - skasuj 4 słowa
      7yy  - zapamiętaj 7 linii począwszy od aktualnej

lub w komendach typu licznik / operator:

      7h  - przesuń kursor o 7 pozycji w lewo
wykorzystanie buforów roboczych: Wyniki niektórych komend można strumieniować do lub pobierać z buforów roboczych. Bufory robocze oznaczane są literami od a do z, a ich wykorzystanie sygnalizuje się znakiem cudzysłowu (").

Na przykład komenda:

"f17yy

powoduje skopiowanie 17 linii do bufora roboczego f, bez ich kasowania, a komenda:

"h6dw

kopiuje do bufora h 6 słów, kasując je z pliku.

Do odtworzenia zawartości tych buforów roboczych w innym miejscu piku, bądź w innym pliku należy użyć odpowiednio:

"fp i "hp ( lub "fP oraz "hP )

Makra klawiszowe

W celu przyspieszenia pisania programów można używać w vi makr klawiszowych. Definiuje się je instrukcją :map.

Składnia instrukcji :map wygląda następująco:

:map <NAZWA makra> <CIĄG komend>

Nazwa makra składa się z maksymalnie 10 znaków. Jeżeli użytkownik wpisze (także na płaszczyźnie wprowadzania !) nazwę makra zostanie ono zastąpione ciągiem komend. Przykład:

W celu przyspieszenia pisania programów w języku C tworzymy makra:

 
      :map! ii if();
      :map! ff for(;;);
      :map! ww while();
Po wciśnięciu sekwencji ii do pliku zostania zapisany ciąg "if();". UWAGA: Jeżeli ustawimy opcje :set timeout, to nazwę makra musimy wpisać w przeciągu 1 sekundy. W przeciwnym wypadku będzie ona potraktowana jak zwykły napis. Opcja odwrotna jest :set notimeout.

Możemy wszystkie własne makra umieścić w kartotece HOME w pliku .exrc . Wtedy będą one automatycznie rozumiane przez vi zaraz po jego uruchomieniu. Dzięki temu można samemu skonfigurować sobie np. klawisze funkcyjne ( o ile istnieją na klawiaturze ) np.:

:map #2 :w

przypisuje klawiszowi F2 funkcje zapisywania pliku.

Valid XHTML 1.0 Transitional Valid CSS!