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:
-
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
-
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
-
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
-
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.