Chociaż nie mogę zaprzeczyć, że ja też na początku miałem problemy z vi, myślę, że można postawić argument, że vi jest bardzo łatwy do nauczenia. (Kiedy zacząłem używać Uniksa, wybór padał na vi lub emacs, więc w tamtym czasie wybrałem ed, ed był bardzo prostym edytorem liniowym, którego nauczyłem się już podczas czytania wczesnych podręczników Uniksa.) Używam vi codziennie, ale prawdopodobnie używaj tylko bardzo małego podzbioru jego funkcji.
Oto pierwszy argument przemawiający za użyciem vi: vi istnieje na wszystkich systemach, zużywa bardzo mało zasobów i może być użyteczny przy niestabilnych i wolnych połączeniach, gdzie inne edytory mogą zawieść lub mogą być wolne i nieużyteczne. Lub w sytuacjach, w których system jest zepsuty, więc klawisze strzałek nie są interpretowane poprawnie (na przykład złe ustawienia terminfo). Więc vi można użyć do naprawy plików konfiguracyjnych prowadzących do problemu, bez wpływu na problem.
A oto jak nauczyć się przydatnego podzbioru vi: Po pierwsze: przestań myśleć o vi jako interaktywnym „edytorze” GUI terminala i postrzegaj go jako język programowania do manipulowania plikami tekstowymi. Na początku „vi” oznaczało tryb VIsual, a vi ma niewidzialny odpowiednik ex, który jest dobrym miejscem do rozpoczęcia. Wpisz ex w wierszu poleceń powłoki (użyję ¬ do przedstawienia return):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
Teraz naciśnij enter.
:¬
E749: empty buffer
:
Więc włóżmy w to coś. Wpisz „a¬” i wpisz wiersz tekstu, a następnie kropkę w wierszu:
:a¬
Hello World¬
.¬
:
To było polecenie dołączania. Łatwy, krótki i mnemoniczny. Ale fajnie byłoby zobaczyć, co znajduje się w buforze:
:%p¬
Hello World
:
To było oczywiście polecenie drukowania, p, oczywiście. % Jest skrótem zakresu linii. Każde polecenie może być poprzedzone numerem linii lub zakresem, do którego polecenie powinno się stosować. % oznacza „wszystkie linie”. $ oznacza ostatnią linię, a kropka oznacza bieżącą linię. Liczba oznacza tę konkretną linię. Zakres jest zapisywany n, m, a liczba może być dodana lub odjęta, więc. + 1, $ - 1 średnia od następnego wiersza do drugiego przedostatniego wiersza. Polecenie składające się tylko z numeru linii przechodzi do tej linii. Oto pozostały mały podzbiór poleceń, których używam:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w zapisuje wszystkie (lub wybrany zakres) wierszy do pliku.
:1d¬
usuwa wiersz 1.
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s zastępuje wyrażenie regularne. Dobrze jest znać wyrażenia regularne!
:q¬
E37: No write since last change (add ! to override)
q wychodzi. wq pisze i wychodzi. q! odchodzi bez pisania iw podobnym tonie, w! wymusza zapis do pliku, jeśli to możliwe.
Teraz fajny:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! jako polecenie filtruje wiersze do polecenia powłoki.
I w końcu:
:vi¬
wchodzi w tryb VISUAL. Nie daj się zwieść. Wygląda jak edytor, ale nadal jest tylko interaktywną powłoką programistyczną. Wystarczy spojrzeć cały czas na bufor i jeszcze kilka poleceń. W trybie wizualnym a: wyświetla monit: z trybu ex. Klawisze strzałek (jeśli działają) poruszają się, a jeśli nie, to hjkl! h w lewo, j w dół, k w górę, a ja w prawo. 0 przesuwa się do pierwszego znaku, a ^ (pomyśl regex tutaj!) Do pierwszego niebędącego spacją znaku w linii. $ (regex ponownie!) przesuwa się na koniec linii. Wpisanie: 999¬ przechodzi oczywiście do wiersza 999, podobnie jak w trybie ex.
„i” wchodzi w tryb wstawiania, który teraz wstawia znaki zamiast wierszy i kończy się naciśnięciem klawisza Escape zamiast „.¬”. „I” wstawia na początku, „a” po znaku pod kursorem, a „A” po końcu bieżącego wiersza. Zawsze wpisuj tekst, naciskając klawisz Escape. „x” usuwa znak pod kursorem, a „D” usuwa kursor z końca linii. „Y” pociąga (kopiuje) bieżący wiersz, a „P” wkleja go z powrotem. „: pu” robi to samo, ale może być poprzedzone numerem linii. „: ya” jest ekwiwalentem „Y” i ponownie, przydatne do zastosowania do zakresu linii. Wydaje mi się, że istnieje również polecenie mark, ale przyznam, że go nie pamiętam. Nie tęsknię za tym.
Powyższe jest tym, czego używam i wiem, że prawdopodobnie nie jestem bardzo „wydajnym” użytkownikiem vi. Z drugiej strony używam wszechstronności ex, na przykład do edytowania skryptów plików konfiguracyjnych. Chcesz zmienić nazwę hosta foo.bar.com na www.foobar.com w wielu plikach conf?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
Próbuję powiedzieć, że myślę, że problem z vi polega na tym, że ludzie myślą o tym jako o trudnym edytorze. Wystarczy trochę zmienić sposób myślenia i postrzegać go jako bardzo prosty, ale również bardzo wydajny interaktywny język programowania. Jest tak potężny, że nawet przy podzbiorze dostępnych poleceń możesz go używać z wielkim efektem - nie tylko jako edytora, ale jako ogólnego, skryptowalnego narzędzia dobrze zintegrowanego z resztą Uniksa. Wątpię, by nano zrobił to wszystko - emacs ... może.