Хотя я не могу отрицать, что я слишком боролся с vi вначале, я думаю, что можно привести аргумент, что vi на самом деле очень легко изучить. (Когда я начал использовать Unix, выбор был либо vi, либо emacs, поэтому в то время я выбрал ed, ed был очень простым редактором строк, который я узнал уже из чтения ранних учебников по Unix.) Я использую vi ежедневно, но, вероятно, использовать только очень маленькое подмножество его функций.
Вот первый аргумент для использования vi: vi существует во всех системах, использует очень мало ресурсов и может использоваться при нестабильных и медленных соединениях, где другие редакторы могут выходить из строя или быть медленными и непригодными для использования. Или в ситуациях, когда система не работает, поэтому клавиши со стрелками интерпретируются неправильно (например, неверные настройки terminfo). Поэтому 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
:
Это была команда печати, p, очевидно. % - это сокращение диапазона строк. Каждой команде может предшествовать номер строки или диапазон, к которому должна применяться команда. % означает «все строки». $ означает последнюю строку, а точка означает текущую строку. Число означает эту конкретную строку. Диапазон записывается как 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)
д выходит wq пишет и выходит. д! выходит без записи, и в том же духе, ш! форсирует запись в файл, если это возможно.
Теперь классный:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! как команда фильтрует строки в команду оболочки.
И наконец:
:vi¬
входит в ВИЗУАЛЬНЫЙ режим. Не обманывайтесь. Это похоже на редактор, но это все еще просто оболочка для интерактивного программирования. Вы просто все время просматриваете буфер и еще несколько команд. В визуальном режиме a: показывает подсказку: из режима ex. Клавиши со стрелками (если они работают) перемещаются, а если нет, то hjkl делает! h влево, j вниз, k вверх и l вправо. 0 перемещается к первому символу и ^ (подумайте здесь о регулярном выражении!) К первому непробельному символу в строке. $ (снова regex!) перемещается в конец строки. Ввод: 999¬ переходит к строке 999, естественно, как в режиме ex.
«i» входит в режим вставки, который теперь вставляет символы вместо строк, и заканчивается нажатием клавиши escape вместо «.¬». «I» вставляет в начале, «a» после символа под курсором и «A» после конца текущей строки. Всегда нажимайте escape, когда закончите ввод текста. «x» удаляет символ под курсором, а «D» удаляет курсор от конца строки. «Y» возвращает (копирует) текущую строку, а «P» вставляет ее обратно. ": pu" делает то же самое, но перед ним может стоять номер строки. «: ya» является бывшим эквивалентом «Y», и снова полезно применять к диапазону строк. Я думаю, что есть команда mark, но я признаю, что не помню ее. Я не скучаю по этому.
Это то, что я использую, и я знаю, что я, вероятно, не очень «эффективный» пользователь vi. С другой стороны, я использую универсальность ex, например, для редактирования скриптов в файлах конфигурации. Нужно изменить имя хоста foo.bar.com на www.foobar.com в нескольких файлах conf?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
Я пытаюсь сказать, что проблема с vi заключается в том, что люди думают, что это сложный редактор. Все, что вам нужно, это немного изменить свое мышление и вместо этого рассматривать его как очень простой, но также очень мощный интерактивный язык программирования. Настолько мощный, что даже с подмножеством доступных команд, вы можете использовать его с большим эффектом - не только как редактор, но и как общий инструмент с возможностью написания сценариев, хорошо интегрированный с остальной частью Unix. Я сомневаюсь, что nano сделает все это - emacs ... возможно.