msiu_logo
Кафедра информационных систем и технологий
http://edu.msiu.ru

1. Введение

«Для того чтобы уверенно работать в Vim, придётся потратить около 50 часов. Не каждый может себе это позволить, но в целом затраты окупаются…»

— Сообщение на форуме

Данные материалы описывают интегрированную среду разработки программ на основе редактора Vim в операционной системе Linux. О том, как создать аналогичную среду на своём домашнем компьютере, речь пойдёт позже, а в компьютерных классах МГИУ всё необходимое программное обеспечение уже установлено и настроено.

Замечание В сети Интернет имеется огромное количество различных материалов, описывающих редактор Vim. Материалов на русском языке тоже очень много. Можно, например, ознакомиться с соответствующей страницей Википедии.

Основным отличием редактора Vim от многих других является его мультирежимность (mode-based editing). Неподготовленный пользователь, случайно запустив этот редактор, обычно пугается и не понимает, как из него выйти. После нескольких минут беспорядочного нажимания различных клавиш он даёт себе слово «никогда больше не связываться с этим чудовищем».

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

Чтобы понять, зачем это нужно, давайте ответим на такой вопрос: «Что приходится делать в редакторе чаще — создавать новые тексты или модифицировать уже существующие?».

Правильный ответ, конечно же, модифицировать. Особенно это должно быть очевидно в случае текстов программ. Во-первых, мало кто способен написать большую программу без ошибок, и, следовательно, её код придётся исправлять. Во-вторых, если эта программа хоть кому-то нужна, то её функциональность (а, значит, и код) наверняка придётся изменять в процессе эксплуатации.

В процессе модификации текста необходимо:

  • перемещаться по нему (желательно сразу в нужное место);

  • находить требуемые фрагменты (образцы) и, возможно, заменять их на другие;

  • удалять и заменять отдельные символы, слова и строки;

  • повторять определённые действия многократно;

  • копировать и вставлять фрагменты текста;

  • запоминать текущую позицию в тексте с тем, чтобы затем быстро туда возвратиться;

  • разрезать и склеивать строки; …

Действий, которые полезно уметь выполнять, очень много. Поэтому для ускорения работы целесообразно использовать нажатия на все доступные клавиши в качестве команд, так как это быстрее иных вариантов (применения клавиш-модификаторов Ctrl и Alt, клавиш расширенной клавиатуры, мыши и системы меню). Именно это и делает Vim в нормальном режиме, что превращает его в удобный и быстрый для одних и «кривой и ужасный» для других.

Замечание

Для достижения максимальной скорости работы в Vim не рекомендуется использовать ни мышь, ни клавиши со стрелками. Перемещения влево / вниз / вверх / вправо в нормальном режиме выполняются при нажатии на клавиши h / j / k / l соответственно.

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

2. Компоненты среды разработки

Среда предполагает использование следующих основных компонент:

  • терминал, в котором можно выполнять команды оболочки shell:

    Терминал
  • терминал с запущенным в нём интерактивным интерпретатором Ruby-кода:

    Pry
  • терминал с работающим в нём редактором Vim, который обеспечивает просмотр, создание, редактирование и выполнение Ruby-программ:

    Vim
  • браузер, с помощью которого можно читать различные учебные материалы:

    Firefox

Размер шрифта во всех этих компонентах среды разработки можно изменить с помощью клавиш Ctrl + + и Ctrl + -.

2.1. Терминал

После входа в систему оконный менеджер предоставляет пользователю несколько виртуальных экранов, переключаться между которыми можно с помощью клавиш Ctrl + стрелка. На одном из этих экранов в самом начале сеанса работы необходимо открыть терминал (это может быть сделано несколькими разными способами), позволяющий выполнять разнообразные команды.

Подсказка

В отличие от сколь угодно сложного и обширного меню возможности командной строки ограничены лишь квалификацией программиста.

Количество доступных команд (оно зависит от пользователя, от его текущей директории и от иных причин) легко узнать, нажав в терминале дважды на клавишу Tab. Эта клавиша, называемая клавишей табуляции, предназначена прежде всего для автоматического продолжения частично набранной команды. В том случае, когда возможно несколько различных продолжений, они показываются по повторному нажатию на Tab. Если, однако, возможных продолжений слишком много, то перед их выводом задаётся вопрос о целесообразности их показа.

Двойное нажатие на клавишу Tab, таким образом, является запросом на вывод всех возможных продолжений пустой команды, что эквивалентно запросу на вывод всех возможных команд:

$
Display all 6342 possibilities? (y or n)
Замечание Другой способ получить список всех возможных команд — двойное нажатие на Alt + Shift + 1.
Подсказка Программа, обрабатывающая команды пользователя, набираемые в терминале, называется shell — «оболочка», а её используемая в МГИУ конкретная реализация — bash. Следует знать, что бо́льшую часть команд выполняет не сам shell. Чаще он лишь запускает указанные в командной строке программы, часто называемые утилитами, обеспечивая при необходимости передачу данных между ними.

Ясно, что невозможно быстро научиться использовать несколько тысяч команд, большинство из которых допускает указание многочисленных опций (ключей). Это и не требуется, хотя подобные знания многократно увеличивают возможности пользователя. Вот пример далеко не самой сложной команды, которая позволяет быстро обнаружить в gem-пакете thor файл, содержащий определение метода insert_into_file:

find $(dirname `gem which thor`) -type f -exec grep -l "def insert_into_file"  {} \;

В ближайшее время вы познакомитесь с несколькими десятками утилит, среди которых будет и grep — утилита с огромными возможностями, предназначенная для поиска удовлетворяющих заданному шаблону (образцу) строк. Образец чаще всего представляет собой регулярное выражение.

Подсказка

Регулярные выражения используются многими утилитами и редакторами (включая Vim); без них невозможно представить современные языки программирования.

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

Подробное описание возможностей оболочки bash и утилит, имеющихся в ОС Linux, выходит за рамки данных материалов.

2.2. Интерактивный Ruby

Для начального знакомства с языком Ruby нет необходимости использовать редактор и с его помощью создавать файлы с программами. Вполне достаточно применения какой-либо из REPL-сред.

REPL (Read-eval-print loop) — простая интерактивная среда программирования. В такой среде пользователь может вводить выражения, которые среда тут же будет вычислять, а результат вычисления отображать пользователю.

Замечание

REPL-среда выполняет в бесконечном цикле (loop) следующие действия:

  • read читает выражение и преобразует его в некоторую структуру данных в памяти;

  • eval берёт эту структуру данных и вычисляет соответствующее выражение;

  • print получает результат вычисления и печатает его пользователю.

Классической REPL-средой для Ruby является irb, устанавливаемая вместе с интерпретатором языка. Мы, впрочем, будем использовать современную и обладающую многочисленными дополнительными возможностями среду pry (читается «прай»), которая легко может быть установлена, как gem-пакет. Для запуска pry-сессии достаточно в терминале выполнить команду pry (для завершения сессии можно использовать команды quit или exit):

$ pry
[1] pry(main)> 2+2
=> 4
[2] pry(main)> 'Работает!'
=> "Работает!"
[3] pry(main)> 1/0
ZeroDivisionError: divided by 0
from (pry):3:in `/'
[4] pry(main)> quit
$

Подробное описание возможностей среды pry и языка программирования Ruby выходит за рамки данных материалов.

2.3. Редактор Vim

Замечание

В данных материалах описывается не редактор Vim, а среда MsiuVim — Vim с набором специально подобранных встраиваемых модулей (plugins) и конфигурационным файлом, максимально «нацеленным на нужды» первокурсников-программистов.

MsiuVim предполагает использование консольной (то есть запускаемой в терминале) версии редактора Vim.

Так как Vim позволяет выполнять команды shell без выхода из редактора, а некоторые особенно полезные действия просто «привязаны» к определённым клавишам (например, F5 — выполнить Ruby-программу), то рекомендуется запускать редактор в уже открытом на первом виртуальном экране терминале. При необходимости ещё один терминал можно будет открыть на виртуальном экране справа от первого.

Замечание Кроме установки желаемого размера шрифта после старта редактора Vim целесообразно максимизировать его окно с помощью клавиши F11 — «распахнуть» его на весь экран. Можно также убрать полосу прокрутки с правой стороны окна, используя меню терминала «Параметры профиля | Прокрутка».

2.4. Браузер

Для просмотра учебных материалов, размещённых на образовательном и информационном порталах МГИУ, необходим браузер, который рекомендуется открывать на виртуальном экране, расположенном ниже того, где размещено окно терминала. Работать с браузером сейчас умеют практически все, поэтому данный раздел материалов является весьма кратким.

Замечание В ближайшее время для нас не будет существенен тип браузера, хотя в дальнейшем вы узнаете, что для программиста Firefox — «правильный выбор», ибо именно для этого браузера существуют чрезвычайно полезные встраиваемые модули (plugins).

3. Подробнее о Vim

Команды редактора Vim подразделяются на несколько категорий, среди которых:

  • движения (motions),

  • команды прямого действия (direct action commands),

  • операторы (operators) и

  • особые команды (extra commands).

Количество команд огромно — файл со справочной информацией по ним содержит более 1600 строк. Все их знать, конечно же, не требуется.

Команды, описанные в следующем разделе, однако, знать необходимо.

Внимание Перед тем, как перейти к экспериментам с Vim, рекомендуется ознaкомиться со следующими двумя разделами данного документа.

3.1. Некоторые важнейшие команды

i (insert — вставить)

переключение из нормального режима в режим вставки

Подсказка В режиме вставки Vim ведёт себя подобно «обычным» редакторам.
Esc (escape — убегать)

возврат в нормальный режим

R (replace — заменить)

переключение из нормального режима в режим замены (это подрежим режима вставки)

A (append at eol (end of line) — добавить в конец строки)

переключение из нормального режима в режим вставки с перемещением курсора за последний символ текущей строки

u (undo — аннулировать, уничтожить сделанное)

отменить последнее выполненное действие

Подсказка u — очень полезная команда, часто называемая откаткой, многократное выполнение которой позволяет отменить ошибочно сделанные изменения.
Ctrl + R (redo — переделать)

отменить последнее отменённое действие (откатка откатки)

x («поставить крест»)

удалить текущий символ (символ под курсором);

X («поставить крест»)

удалить символ перед курсором (слева от курсора);

:

переход в режим командной строки (command line mode)

Подсказка Режим командной строки позволяет ввести и выполнить после нажатия на клавишу Enter ровно одну особую команду, после чего происходит возврат в нормальный режим. Примеры нескольких таких команд приведены ниже.
:w (write — записать)

сохранить сделанные изменения, записав файл

:q (quit — выйти)

закрыть текущее окно

:wq (write — записать, quit — выйти)

сохранить сделанные изменения и закрыть текущее окно редактирования

:qa! (quit — выйти, all — отовсюду)

закрыть все окна, завершая работу в редакторе без сохранения возможно сделанных изменений

:h (help — помогать)

открыть окно с документацией по Vim

Подсказка

Последнюю команду чаще используют, указывая дополнительный параметр, например, :h index или :h user-manual.

При просмотре документации полезно уметь переходить по «ссылкам», что осуществляется с помощью клавиши Ctrl + [ или двойного клика мышки по ней, и возвращаться обратно с помощью Ctrl + T или Ctrl + O. Закрыть окно со справочной информацией, как и любое другое, позволяет команда :q.

3.2. Vim как средство просмотра файлов

Среди других встраиваемых модулей, входящих в состав среды MsiuVim, — модуль (plugin) NERDTree, превращающий редактор в файловый менеджер. При старте редактора в левом окне отображается дерево директорий и файлов (tree — дерево), находящихся в текущей директории, вместе с комментариями или пометками (bookmarks), которыми они были предварительно снабжены. В окне NERDTree многим клавишам соответствуют свои, особые для файлового менеджера, действия. Для просмотра содержимого файлов достаточно знать следующие команды NERDTree:

o (open — открыть)
  • для директории, имя которой указано в текущей строке, раскрыть в окне NERDTree её содержимое; если содержимое уже было раскрыто, то закрыть его

  • для файла, имя которого указано в текущей строке, открыть его содержимое для просмотра или редактирования в правом окне и сделать его активным (переместить в него курсор)

    Подсказка Нажатие на клавишу Enter или двойной клик левой кнопкой мыши выполняют те же самые действия.
i (split — расщепить)

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

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

h

на символ влево

j

на символ вниз

k

на символ вверх

l

на символ вправо

0 ("hard" bol (begin if line) — «жёсткое» или «физическое» начало строки)

в начало (нулевую позицию) текущей строки

Подсказка 0 — это цифра ноль, а не буква O!
^ ("soft" bol — «мягкое» или «логическое» начало строки)

к первому не пробельному символу текущей строки

$ (eol (end of line) — конец строки)

к последнему символу текущей строки

Подсказка Символы ^ и $ используются в регулярных выражениях и обозначают там то же самое: начало и конец строки.
G (go — перейти)

в конец файла

1G

в начало файла

w (next word — следующее слово)

в начало следующего слова

W (next Word — следующее Слово)

в начало следующего Слова

Подсказка Две последние команды отличаются лишь трактовкой того, что называется словом. В первой из них слово — это последовательность букв, цифр и символов пунктуации. Во второй команде Словом считается последовательность любых не пробельных символов.
b (begin — начало)

в начало текущего или предыдущего слова

B

в начало текущего или предыдущего Слова

e (end — конец)

в конец текущего или следующего слова

E

в конец текущего или следующего Слова

Внимание Если вы ещё не приступили к освоению редактора, то теперь уже это пора сделать. Читайте описание команд и экспериментируйте!

3.3. Копирование и запуск Ruby-программ

Замечание В данном разделе описывается только то, как можно скопировать Ruby-программу из браузера в уже существующий файл, и выполнить её. Способы создания новых файлов с помощью Vim будут рассмотрены позже.
Подсказка Для проведения экспериментов вам предоставлены файлы, содержимое которых не представляет большой ценности. Все они находятся в директории programming/tmp.

Предположим, что нам нужно скопировать следующую программу в один из файлов с расширением rb:

print 'k -> '
k = gets.to_i
i = 2
while k%i != 0
  i += 1
end
puts i

Вот требуемая последовательность действий.

  1. Открываем выбранный файл (например, 1.rb), используя команду o NerdTree.

  2. Выделяем мышкой всё содержимое файла.

  3. Нажимаем d для его удаления.

  4. Нажимаем i для переключения в режим вставки.

  5. Переходим (Ctrl + стрелка вниз) на другой виртуальный экран, где открыт браузер.

  6. Выделяем мышкой нужный текст в окне браузера.

  7. Возвращаемся на тот виртуальный экран, где открыт редактор (Ctrl + стрелка вверх).

  8. С помощью средней кнопки мыши вставляем запомненный текст.

  9. Возвращаемся в нормальный режим, нажимая Esc.

  10. Нажимаем F5, что записывает файл на диск и запускает программу.

Замечание Некоторые из описанных действий можно выполнить более удобным способом, но об этом вы узнаете чуть позже.

3.4. «Шпаргалка» по командам Vim

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

На приведённом ниже рисунке помечены все те клавиши основной клавиатуры, действия которых мы уже обсудили. Для всех встречающихся на нём терминов были даны переводы и комментарии.

./images/vim1.1.png

В последующих материалах мы постепенно разберёмся с назначением остальных клавиш основной клавиатуры, научимся применять операторы (operators) и многие особые команды (extra commands).