Хоча я не можу заперечувати, що я занадто боровся з vi на початку, я думаю, що можна зробити аргумент, що vi насправді дуже просто вивчити. (Коли я почав використовувати Unix, вибір був або vi, або emacs, тому в той час я вибрав редактор, що був дуже простим редактором рядків, про який я вже навчився читати ранні підручники Unix.) Я використовую vi щодня, але, мабуть, використовувати лише дуже невеликий підмножина його особливостей.
Ось перший аргумент щодо використання vi: vi існує у всіх системах, використовує дуже мало ресурсів і може бути корисним для нестабільних та повільних з'єднань, де інші редактори можуть вийти з ладу або бути повільними та непридатними. Або в ситуаціях, коли система зламана, тому клавіші зі стрілками не інтерпретуються правильно (наприклад, неправильні параметри термінала). Таким чином, vi можна використовувати для виправлення файлів конфігурації, що призводять до проблеми, не впливаючи на проблему.
Ось як дізнатися корисну підмножину vi: По-перше: перестаньте думати про vi як про інтерактивний термінал-редактор графічного інтерфейсу (GUI) та розгляньте це як мову програмування для управління текстовими файлами. На початку "vi" виступав за VIsual режим, а vi має невізуальний аналог ex, який є хорошим місцем для початку. Введіть ex у запиті оболонки (я буду використовувати ¬, щоб представити повернення):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
Тепер натисніть Enter.
:¬
E749: empty buffer
:
Отже, давайте щось покладемо в це. Введіть "a" і введіть рядок тексту, а потім період на рядку сам по собі:
:a¬
Hello World¬
.¬
:
Це була команда додавання. Легкий, короткий і мнемічний. Але було б непогано подивитися, що є в буфері:
:%p¬
Hello World
:
Очевидно, це була команда друку. % - це стенограма. Кожній команді може передувати номер рядка або діапазон, до якого повинна застосовуватися команда. % означає "всі рядки". $ означає останній рядок, а крапка означає поточний рядок. Цифра означає цей конкретний рядок. Діапазон записується n, m і число можна додавати або віднімати, так що + 1, $ - 1 означає від наступного рядка до другого-останнього рядка. Команда, що складається з простого рядка, переходить до цього рядка. Ось залишився невеликий підмножина команд, які я використовую:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w записує всі (або обраний діапазон) рядків у файл.
:1d¬
видаляє рядок 1.
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s замінює регулярний вираз. Добре знати регулярні вирази!
:q¬
E37: No write since last change (add ! to override)
q кидає. wq пише і виходить. q! кидає без написання, і в подібному ключі, ш! примушує записувати у файл, якщо можливо.
Тепер класний:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! як команда фільтрує рядки в команду оболонки.
І, нарешті:
:vi¬
переходить у режим ВІЗУАЛЬНОГО. Не обманюйте. Це схоже на редактор, але це все ще просто інтерактивна оболонка програмування. Вам просто доведеться весь час дивитися на буфер і ще кілька команд. У візуальному режимі a: відображає підказку: з колишнього режиму. Клавіші зі стрілками (якщо вони працюють) рухаються навколо, а якщо їх немає, то hjkl робити! h вліво, j вниз, k вгору і l вправо. 0 переміщується до першого символу, а ^ (подумайте тут, регулярний вираз!) До першого непробільного символу на рядку. $ (повторний вираз!) переміщується до кінця рядка. Введення тексту: 999¬ переходить до рядка 999, природно, як і в колишньому режимі.
"i" переходить у режим вставки, який тепер вставляється на символи замість ліній, і закінчується натисканням клавіші escape замість ".¬". "Я" вставляється на початку, "а" після символу під курсором, а "А" після закінчення поточного рядка. Завжди натискайте клавішу Escape, коли закінчите вводити текст. "x" видаляє символ під курсором, а "D" - видаляє курсор до кінця рядка. "Y" перетягує поточний рядок, а "P" вставляє його назад. ": pu" робить те саме, але йому може передувати номер рядка. ": ya" - це попередній еквівалент "Y", і знову корисно застосувати до діапазону рядків. Я думаю, що є і команда позначки, але я визнаю, що не пам’ятаю її. Я цього не сумую.
Наведене вище - це те, що я використовую, і я знаю, що я, мабуть, не дуже "ефективний" користувач VI. З іншого боку, я використовую універсальність ex, наприклад, для редагування файлів конфігурації. Потрібно змінити ім'я хоста foo.bar.com на www.foobar.com у кількох файлах конф?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
Я намагаюся сказати, що я думаю, що проблема vi полягає в тому, що люди думають про це як про важкого редактора. Все, що потрібно, - це трохи змінити свій розум і розглянути його як дуже просту, але також дуже потужну інтерактивну мову програмування. Настільки потужний, що навіть маючи підмножину доступних команд, ви можете використовувати його з великим ефектом - не лише як редактор, а як загальний, прозаїчний інструмент, добре інтегрований з рештою Unix. Я сумніваюся, що Нано зробив би все це - emacs ... можливо.