Статьи

Путь к лучшему Vi Skills

605px-Vimlogo.svg

Среди разработчиков программного обеспечения нет ни одного предмета, который бы вызывал больше мнений, противоречий или дискуссий, чем «Редактор избранного кода». Кажется, у всех нас есть определенное предпочтение, и мы решительно настроены в пользу этого выбора.

В то же время, сегодня не существует системы * nix, к которой вы можете подключиться, кроме версии Vi. Это самый распространенный редактор на планете!

Каждый из нас в той или иной степени владеет Vi. Набор команд кажется больше, чем любое другое приложение. Большинство команд очень загадочные, своеобразные и, как следствие, трудные для запоминания.
Различные чит-листы, доступные в Интернете, удобны в качестве справочного материала, но в них нет серьезного руководства.

В преднамеренных усилиях по расширению моего кода для редактирования кода , я провел несколько недель, явно используя Vi на регулярной основе.

Как вы можете догадаться из моих других статей , я большой поклонник Nitrous.IO, и у меня есть linux-бокс, доступный для меня с любого компьютера, и любое место очень помогло мне в этом.

Я с радостью приглашаю вас вместе, предлагая сокращенное («ускоренное», может быть, более точное описание) повторение моего приключения.

И я хочу представить миру мой собственный набор мнемоник, которые уменьшают крутую кривую обучения, связанную (реальную или воспринимаемую) с Vi.

Немного истории

Vi (для «Visual») ведет свое происхождение от происхождения Unix (в AT & T). Будучи «ориентированной на экран» версией редактора (редакторов), используемого с телетайпами, она представляет собой шаг в современные вычисления. Название ‘vi’ происходит от команды, которая переводит редактор строк ‘ex’ (редактор Билла Джоя, выпущенный как часть первого выпуска BSD Unix в марте 1978 года) в визуальный режим.

Брэм Муленаар выпустил VIM публично примерно в 1991 году, хотя он начал писать его для своей Amiga в конце 1980-х. Первоначально он назывался VI iMitation, а позже — VI iMproved .

Ради общности, следующий набор обучающих шагов предполагает, что у вас очень и очень мало опыта работы с Vi. Я бы рискнул сказать, однако, независимо от вашего опыта, в этом многофункциональном программном приложении всегда есть чему поучиться.

Кроме того, все здесь основано на моем личном опыте. Терминология и описания мои и я несу полную ответственность за них.

Режимы работы

Я наблюдал несколько четко определенных рабочих режимов при работе с Vi.

  • Командный режим
  • Режим редактирования
  • Оконный режим

Переключение между этими режимами обычно требует нажатия ESC .

Альтернативой ESC является Ctrl [.
Я нахожу это намного проще и быстрее, хотя мне трудно сменить давнюю привычку тянуться к ключу ESCape.

Командный режим

Здесь вы можете подавать команды редактору для выполнения других задач, которые я считаю, кроме редактирования.

В командном режиме двоеточие (:) используется для приема ввода для команд, которые не редактируются и не связаны с навигацией.

близко

Когда я был страстным любителем летающих самолетов, в моем местном клубе был очень популярный «мем»: «Взлеты не обязательны, посадка обязательна»

Я бы перефразировал это в отношении Vi и сказал бы, что хотя ОТКРЫТИЕ редактор не является обязательным, ЗАКРЫТИЕ это обязательно.

Как это верно для Vi, существует множество способов закрыть и выйти из редактора.

zz — самый быстрый способ сохранить и выйти. Я думаю об этом как о том, что усыпляю Vi (сродни карикатурному представлению сна как ряда Zs)

:wq является наиболее распространенным. Это представляет несколько отдельных команд, которые объединены (что является полезной функцией командного режима):

  • w — это (w) обращение к текущему открытому файлу
  • q это (q) uit

Мне также нравится 😡 как ярлык для сохранения и закрытия vi

Если вы хотите выйти и отменить все внесенные изменения, используйте команду (q) uit, а затем shebang :q! Это проигнорирует любые изменения и закроет редактор.

Вы можете дополнительно :w Gemfile имя файла после команды (w) rite, например :w Gemfile . Это запишет вывод в этот файл (создав его при необходимости на большинстве систем).

навигация

Навигация по документу является одной из важнейших функций любого редактора.
Я обнаружил, что проще, чем ожидалось, освоить основные команды для перехода по моему коду в Vi с помощью нескольких мнемонических приемов.

Переместите курсор влево, вправо, вниз, вверх на один символ / строку с помощью h , l , j , k соответственно. Я обнаружил, что это намного , гораздо быстрее, чем пытаться добраться до клавиш со стрелками (которые, кстати, также работают как положено)

При нажатии b в режиме редактирования курсор переместится на B ack к началу текущего слова. Аналогично, e переместит курсор на конец текущего слова.
Аналогичным образом w переходит к следующему W ord.

Вы можете переместить курсор в любое место в текущей строке с номером столбца, за которым следует символ трубы. Я думаю о 15| как «переместите курсор в положение 15».
Аналогичным образом, только символ «труба» переместится на первый символ / столбец в строке. На самом деле | и 0| эквивалентны. «Ничто» здесь интерпретируется как НОЛЬ.

Прежде чем оставить команды для перемещения курсора, давайте добавим эти два:

  • + перемещает курсор в начало следующей строки. Я думаю об этом, как Inc, изменяя положение линии
  • - перемещает курсор в начало предыдущей строки, например, Dec, изменяя положение строки

Прокрутка экрана с помощью Ctrl u (я думаю о Up ) и Ctrl d (я помню Down ). Они только перемещают экран примерно на половину ширины. Полный «следующий» экран — это Ctrl f ( F или вперед). И, как вы уже догадались, Ctrl B (для B ack) поднимается на один экран вверх.

Вы можете перейти к любой строке в файле с 32G . «G» для GO предшествует номер строки.

Поскольку 8G перейдет к строке № 8, очевидно, что 1G перейдет к первой строке в файле. Что НЕ очевидно, но весьма полезно, так это то, что один G переместится на последнюю строку в файле. В отличие от команды для перемещения курсора в начало строки, «Ничего» в этом случае представляет собой Конец

Удобная, но немного непонятная команда — это z а затем RETURN, который устанавливает редактор так, чтобы текущая строка была верхней строкой на экране.

Редактирование Команды

Теперь, когда мы можем свободно перемещать курсор по экрану и прокручивать текущий открытый файл, давайте посмотрим, как вносить реальные изменения в текст.

Я должен признать, что мнемоника для них не так проста, как другие. Но довольно часто думать о «Х» как о «вычеркивании» или «удалении». Итак, имея это в виду, мы имеем

  • x чтобы удалить следующий символ
  • X удалит предыдущий символ
  • dd удалить всю строку

Им может предшествовать число, чтобы указать, что много символов. Например, 7x удалит 7 символов после курсора, а 5X удалит 5 символов слева от курсора.

Комбинируя то, что мы видели сверху, относительно перемещения курсора между словами, если вы используете db или dw (с предшествующим числом), то будет удалено много слов (перед курсором или после курсора, соответственно)

Есть аномалия, своего рода «ярлык», который я использую довольно часто. По этой причине я не буду жаловаться на мою неспособность придумать правильную мнемонику. Это D , который удаляет весь текст справа от курсора — до конца строки. {Вы, возможно, могли бы помнить это как БОЛЬШУЮ D, которая выполняет БОЛЬШОЕ Удаление, или вообразить форму, ведущую направо; конец строки}

Вы создаете экземпляр I nsert Mode вместе с i . Конечно, вы теряете простоту перемещения курсора с помощью h / j / k / l — и я иногда забываю этот факт.

Другая команда, которую я чаще всего использую, — это A , которая также создает режим вставки, но переносит вас в самый конец строки. Я думаю, что это «вставить после» последний символ в строке.

Выделения и блоки текста

В Vi есть еще один «режим» (представьте себе подрежим), который эмулирует работу графического интерфейса для выделения больших блоков текста.
Доступ к режиму V осуществляется с помощью v и вы можете продолжать использовать навигационные клавиши (поэтому я считаю, что он подчинен навигации) для выбора.

Это удобно для

  • Д эле с dd
  • Y ank (термин для копирования) с y
  • Вставьте с помощью P для вставки после текущей позиции курсора и p для вставки непосредственно перед курсором

Вы можете сделать отступ для выбранного блока кода с помощью > и отступить с помощью <

Объединяя их для чего-то полезного, перейдите к строке с большим количеством текста (кода) и попробуйте это
wwwhvbcREPLACED


И каждый раз, когда вы ловите себя на крике «OOOPS!» (Или что-то похожее, но менее «дружелюбное для семьи»), не забывайте использовать u для U ndo.

Иногда я немного переусердствовал с «и», когда внес несколько изменений, которые хочу отменить. В этих случаях я могу отменить свою отмену, применив команду для R edo, Ctrl r.


Открытие нескольких файлов

:e <path and filename>

Если вы не уверены в точном пути и / или имени файла, просто используйте спецификацию файла.

:e . отображает подобный меню список файлов в текущем каталоге (например, если вы использовали ‘точку’). Вы можете перемещаться по файловой системе (используйте стандартные j , k и Enter

Shell Shell

Вы можете выпрыгнуть из Vi и в оболочку с помощью :sh

Это удобно для быстрого выполнения chmod над файлом или запуска irb.
Когда вы exit из оболочки, вы возвращаетесь в Vi, где вы оставили.


Поиск и замена

Каждый редактор (любого типа) должен включать в себя необходимую возможность поиска и замены текста. И Ви совсем не сомневается в том, чтобы быть сильным в этой области.
Любой поиск начинается в командном режиме.
Самым простым является слэш, за которым следует слово. Этот /flower найдет первое вхождение слова «цветок». Используя :n вы можете перейти к следующему событию.

Чтобы заменить текст, есть несколько ключевых опций:

  • :s/SearchFor/ReplaceWith/g {«g» означает « Глобальный» . Без этого поиск ограничен текущей строкой}
  • ?Find/Replace/gi будет выполнять ту же операцию в обратном порядке {модификатор ‘i’ учитывает регистр символов)

Здесь странно, что буква «s» используется, когда вы хотите найти и заменить. Мнемоника, которую я использую для этого, состоит в том, чтобы помнить S earch-and-Replace против F ind просто с косой чертой.

Если вы предпочитаете подтверждение для каждого действия замены, просто добавьте модификатор ‘c’, например :s/Find with Confirmation/Each one/gc

Вы можете заметить знакомые модификаторы регулярных выражений (g, i). И фактически, команды Search и Replace принимают [много] символов оценки регулярного выражения.
В Vim Regular Expressions 101 приведено подробное описание всех параметров.

Я никогда не знал, что это существует в Vi, пока случайно не наткнулся на него.
Переход к соответствующим скобкам (фигурные скобки, квадратные скобки или стандартные скобки) — это просто % когда курсор находится на одной из скобок. Какая экономия времени!


Редактор Windows

Буферы

Vi охватывает концепцию буферов и применяет ее для управления несколькими файлами. Я был свидетелем того, как эксперт Vi подпрыгивал на многочисленных экранах и в нескольких файлах и был совершенно поражен.
Вы можете быть этим Vi Wizard после некоторой практики с этими несколькими ключевыми командами буфера

Каждый раз, когда вы открываете новый файл с :e filename , он загружается в новый (последовательно пронумерованный) буфер.

Все команды буфера начинаются с буквы b в командном режиме

  • :b# следующий буфер
  • :bf первый буфер
  • :bl последний буфер
  • :b4 переключается на другой буфер по его номеру (см. выноску)

Прежде чем спросить: «Как узнать номер нужного буфера?», Перечислить все используемые буферы очень просто. Это :ls . Так же, как команда * nix для списка файлов.


Работа с расколотой личностью

Работа с разделенным экраном — лишь небольшая модификация работы с буферами. Это удобно в Rails, например, для одновременной работы с контроллером и его представлениями.

Вы можете открыть другой файл на разделенном экране с помощью :split filename

Если вы открываете редактор, вы можете указать несколько файлов — которые будут загружены в разделенные экраны — с помощью vi -o file1 file2...

Вы можете изменить расположение окон на экране; но это немного выходит за рамки этой статьи.

Переключение окон — это вопрос Ctrl w, а затем Ctrl w для перехода из окна в окно. Если вы помните навигационные клавиши (h, j, k, l), используйте их для перехода к определенному окну в зависимости от его расположения на экране относительно текущего окна.

Использование Ctrl w и q закрывает ( q uit) текущее окно.
Текущее окно может быть отображено с помощью Ctrl w и s .

Если вы когда-нибудь потеряете информацию о том, какой файл вы редактируете, Ctrl g отобразит подробную информацию о файле, включая его имя.

Вывод

Этого достаточно, чтобы понять введение в это чрезвычайно многофункциональное приложение. Если вы были запуганы Ви, я действительно надеюсь, что это помогло сделать его более доступным. Если у вас есть небольшой опыт работы с Vi, я надеюсь, что это высветило некоторые новые области, в которых вы можете расширить свой опыт.
Это не займет много времени, прежде чем эти команды станут «мышечной памятью».

Я надеюсь, что вы будете регулярно прилагать серьезные усилия для отработки этих нескольких команд, и я ожидаю, что вы увидите улучшения в разработке кода как следствие этих усилий.

РАССМОТРЕНИЕ

Применяя мнемонику, которую я представил здесь, попрактикуйтесь в каждом из них.

  • Просто ESCape редактор (и начинайте вводить команды), затем введите команду C с помощью двоеточия (:)
  • На странице вы можете прыгать High, L ow и M idway
  • Чтобы удалить один символ, просто перечеркните его ( x )
  • Чтобы открыть (другой) файл, вы должны его изменить (: e). Если я не знаю точное имя файла, вы можете использовать спецификацию файла
  • Когда мне нужно вставить какой-нибудь текст, если я не хочу начать A после последнего символа в строке.
  • Если я хочу удалить следующее слово или добавить слово
  • Вы можете удалить следующие 12 строк с 12dd
  • Любой выделенный текст можно повесить с помощью
  • Выделить текст легко в обычном режиме, нажав v
  • Вы должны Y ank текст ( y ), чтобы позже вставить его ( p , или P )
  • Выпрыгнуть из Vi в Шелл так же просто, как :sh
  • Когда вам нужно разделить работу между окнами, переключение между окнами
  • Отскок вокруг буфера с помощью :b# ,: bf,: bl or : b3`
  • Получить список всех текущих буферов с помощью :ls
  • Когда закончите, запомните, что это (x). Или просто подумайте о сне ( ZZ ) и ключе ZZ

Я призываю вас поделиться в комментариях любыми трюками или мнемоникой, которые вы считаете полезными.