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

1. Введение

Вторая часть материалов о среде разработки MsiuVim, основной компонентой которой является редактор Vim с несколькими дополнительно установленными встраиваемыми модулями, продолжает знакомить вас с возможностями и особенностями этой среды.

2. Vim как файловый менеджер

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

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

Основными командами работы с файлами являются следующие:

ls (list — список)

утилита для показа списка файлов и директорий (папок);

cp (copy — копировать)

утилита для копирования файлов и директорий;

mv (move — перемещать)

утилита для перемещения или переименования файлов и директорий;

rm (remove — удалять)

утилита для удаления файлов и директорий.

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

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

При старте редактора в окне NERDTree показывается список файлов и директорий, находящихся в текущей директории. После перемещения курсора в строку с именем некоторой директории для получения списка файлов и директорий, находящихся в ней, достаточно «открыть» её с помощью команды o (open). Нажатие на клавишу Enter или двойной клик левой кнопкой мыши делает то же самое. Повторное выполнение этой команды «закрывает» директорию.

Операции создания (add — добавить), перемещения или переименования (move), удаления (delete) и копирования (copy) файлов и директорий (nodes — узлов) доступны в меню, вызываемом в окне NERDTree командой m:

./images/menu.png

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

Подсказка Клавиша Esc позволяет прервать выполнение команды.
Внимание Будьте очень осторожны, удаляя файлы с помощью NERDTree или утилитой rm: восстановить удалённые файлы невозможно!

3. Базовые команды Vim

Как правило, после открытия некоторого файла в основном окне редактора (например, с помощью команды o в окне NERDTree), Vim оказывается в нормальном режиме, когда нажатия на клавиши трактуются как команды. С некоторыми простейшими командами мы уже познакомились ранее. Продолжим…

3.1. Перемещения, операторы и повторители команд

Среди команд движения (motions) есть такие, которые требуют после себя обязательного аргумента-символа. Это означает, что после такой команды должна быть нажата ещё одна клавиша, которая и определяет, куда именно переместится курсор. Вот эти команды:

f (find char — найти символ)

на следующий указанный (введённый после f) символ в текущей строке

F

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

t (till — до, перед)

на позицию непосредственно перед следующим указанным символом в текущей строке

T

на позицию непосредственно перед предыдущим указанным символом в текущей строке

Операторами в редакторе Vim называют команды, которые требуют после себя наличия команды движения. Любая из команд движения определяет область, начинающуюся с текущей позиции курсора и продолжающуюся до той позиции, куда в результате команды движения должен переместиться курсор. Эта область и является тем множеством, к которому применяется действие, задаваемой оператором. Вот два оператора:

d (delete — удалить)

удалить текст в области действия

c (change — изменить)

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

Сочетая оператор d с различными командами движения, получаем, в частности, такие команды:

d␣ (пробел после d)

удалить текущий символ (так как пробел — это команда перемещения на следующий символ)

dw

удалить слово

d$

удалить конец строки

d0

удалить начало строки

dG

удалить строки от текущей до конца файла

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

Вот ещё две команды удаления текста:

dd

удалить текущую строку

cc

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

Чрезвычайно полезной является команда прямого действия . (точка). Она повторяет последнюю выполненную команду редактора (ввод какого-то текста, команду удаления, движения или любую иную).

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

2f3

перейти на вторую тройку после курсора в текущей строке

5dd

удалить 5 строк, начиная с текущей

d2t,

удалить в текущей строке текст от курсора до второй запятой, сохранив её саму

4i

«размножить» введённый текст в четырёх экземплярах (после возврата в нормальный режим по нажатию на Esc)

3.2. Визуальный режим

Выполнить оператор можно не только вводя после него команду движения. Другой возможностью является использование визуального режима, когда область действия оператора задаётся до его ввода. При этом она подсвечивается, что облегчает восприятие и уменьшает возможность ошибок. Простейший способ перейти в визуальный режим — это выделить некоторую область текста с помощью левой кнопки мыши. Если после этого ввести, например, оператор d, то выделенный текст будет удалён.

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

v (visual)

перейти в «обычный» визуальный режим

V

перейти в визуальный режим работы со строками

Ctrl + V

перейти в визуальный режим работы с прямоугольными блоками текста

После выделения желаемой области над ней можно выполнить произвольный оператор.

3.3. Копирование, удаление и вставка

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

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

y (yank — копировать)

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

yy

копировать текущую строку

p (paste — вставить)

вставить запомненный фрагмент после текущей позиции курсора

P

вставить запомненный фрагмент перед текущей позицией курсора

Текст, удаляемый операторами d и c, а также командами x, X и другими подобными командами, также помещается в буфер обмена редактора и может быть затем вставлен с помощью команд p или P.

Для добавления пустых строк используются команды прямого действия:

o (open — открыть)

перейти в режим вставки, переместив курсор в начало новой пустой строки, добавленной перед текущей

O

перейти в режим вставки, переместив курсор в начало новой пустой строки, добавленной после текущей

Кроме системного буфера обмена редактор Vim предоставляет возможность использовать ещё 26 буферов (с именами от a до z), в которых можно сохранять фрагменты текста. Чтобы использовать один из них в операциях копирования, удаления или вставки, необходимо перед соответствующей командой нажать клавишу " (кавычка) и затем ввести имя регистра. Если перед командой копирования или удаления после кавычки ввести один из символов от A до Z, то копируемый или удаляемый текст не будет заменять имевшийся в соответствующем регистре текст, а добавится к нему.

Для ссылок на системный буфер обмена в редакторе Vim используются имена * и +.

4. Некоторые дополнительные возможности среды MsiuVim

Перед тем, как перейти к рассмотрению того, как можно использовать среду MsiuVim для ввода текстов программ, обсудим «правильный» способ ввода русских букв и некоторых специальных символов.

4.1. Русский язык и диграфы

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

Ctrl + ^ (или Ctrl + 6)

переключение языка ввода; работает только в режимах вставки и замены

Кроме букв русского алфавита иногда возникает необходимость ввода специальных символов, таких как русские кавычки-ёлочки («»), тире (—), которое не следует путать с дефисом (-) и других. Для этих целей можно использовать так называемые диграфы, представляющие собой два обычных символа, вводимых после Ctrl + K. Вот некоторые наиболее полезные диграфы из множества существующих:

<<

открывающая русская кавычка («)

>>

закрывающая русская кавычка (»)

M-

тире (—)

Co

знак копирайта (©)

Eu

символ Евро (€)

4.2. Написание Ruby-программы «с нуля»

Как написать программу, читающую со стандартного ввода два целых числа и печатающего на стандартный вывод сумму положительных среди введённых чисел?

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

А что делать, если нам нужно написать для решения исходной задачи программу, которая содержала бы определение функции (процедуры, метода) sum, вычисляющей сумму положительных из двух имеющихся у неё аргументов? Тогда ввод данных и вывод результата должны быть отделены от содержательной части решения задачи:

def sum(a,b)
  s = 0
  if a > 0
    s += a
  end
  if b > 0
    s += b
  end
  s
end

puts "Введите два целых числа"
x = gets.to_i
y = gets.to_i
puts "Их сумма равна #{sum(x,y)}"

Обратите внимание на то, как выровнен код. Правильное выравнивание (форматирование) программного кода не является обязательным для интерпретатора языка Ruby, но человеку гораздо легче читать и понимать именно такие программы.

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

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

Начнём с создания файла sum.rb в выбранной директории, для чего в окне NERDTree наберём masum.rb↵↵ (символом принято обозначать клавишу Enter). Напомним, что это означает:

  • m — войти в меню NERDTree;

  • a — создать новый файл;

  • sum.rb — ввод имени этого файла;

  •  — завершение ввода имени;

  •  — переход в окно редактирования созданного файла.

Вот что надо делать далее:

  • i — переход в режим вставки;

  • def — ввод начала определения метода (функции);

  • Tab — запрос на выполнение автопродолжения языковой конструкции; редактор добавит следующий шаблон, имя метода в котором (method_name) нужно будет заменить на требуемое нам:

    def method_name
    
    end
  • sum — не перемещая курсора, вводим имя функции; так как редактор в этот момент находится в визуальном режиме, то выделенное имя method_name будет заменено на вводимое:

    def sum
    
    end
  • ( — вводим открывающую скобку; редактор добавляет закрывающую скобку;

  • a,b — вводим аргументы функции и перемещаемся на следующую строку; редактор разместит курсор именно там, где нужно продолжать вводить код определяемого метода;

  • s = 0↵ — вводим оператор присваивания и переходим на новую строку; редактор добавит ещё одну пустую строку;

  • if и Tab — начало ввода условного оператора; редактор добавит следующий шаблон, условие condition в котором нужно заменить на требуемое нам:

      if condition
    
      end
  • a > 0 — не перемещая курсора вводим условие и переходим на следующую строку; редактор разместит курсор в правильной позиции;

  • s +=a — вводим тело условного оператора; редактор разместит курсор в той позиции, где должен продолжаться ввод кода программы;

  • повторяем аналогичные действия для ввода второго оператора if, получая следующий код:

    def sum(a,b)
      s = 0
      if a > 0
        s += a
      end
      if b > 0
        s += b
      end
    end
  • ↵↵ — вводим пустую строку и переходим к строке, где должен начаться ввод кода основной программы;

  • puts " — вводим имя метода печати и открывающую кавычку; редактор добавляет закрывающую кавычку;

    Замечание

    Использование автопродолжения при вводе имени puts не является целесообразным так как даже после ввода первых трёх его символов остаются два возможных варианта, выбор из которых будет предложен редактором по нажатию на клавишу Tab: putc и puts. В данном случае быстрее ввести имя целиком.

  • Ctrl + ^ — переключаем язык ввода;

  • Введите два целых числа"↵ — вводим текст печатаемого сообщения и переходим на следующую строку (вместо кавычки можно ввести стрелку вправо;

  • Ctrl + ^ — переключаем язык ввода;

  • x = g и Tab — вводим начало следующего оператора и выполняем запрос на автопродолжение; редактор показывает два возможных варианта, первый из которых нам и требуется;

  • .to_i↵ — завершаем ввод оператора и переходим на следующую строку;

  • действуя аналогично, вводим оставшиеся операторы программы.

После завершения ввода кода всей программы нужно не забыть вернуться в нормальный режим с помощью Esc. Далее можно или просто сохранить файл командой :w или выполнить введённую программу командой F5, которая перед запуском интерпретатора сама сохранит сделанные изменения.

5. Базовые команды — продолжение

Важно Материал, содержащийся в этом и последующих разделах данного документа, следует считать справочным. Он, безусловно, очень полезен, но на первых порах не является необходимым. Не старайтесь понять и запомнить всё сразу — процесс овладения редактором Vim не может быть слишком быстрым!

5.1. Поиск

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

Команда / (слеш) позволяет найти ближайший следующий за курсором фрагмент текста, удовлетворяющий задаваемому в этой команде регулярному выражению. Простейшие регулярные выражения весьма похожи на строки. Например, в процессе ввода команды /abc курсор будет последовательно перемещаться сначала на следующий за курсором символ a, затем — на ближайшую комбинацию символов ab, далее — на подстроку abc (в предположении, что подобные фрагменты имеются в тексте после курсора). После нажатия на Enter курсор переместится в начало найденной комбинации символов abc.

Целый ряд символов, однако, используется в регулярных выражениях специальным образом. Вот они: ., |, (, ), [, \, ^ {, +, * и ?. Если вам потребуется включить в шаблон поиска один из них, то необходимо экранировать его, поставив перед ним символ \ (бэкслеш). Сейчас мы не будем подробно изучать регулярные выражения, ограничившись лишь несколькими простейшими примерами.

/a\+b

поиск подстроки, начинающейся с одного или более символов a и заканчивающейся символом b

/^abc

поиск комбинации символов abc в начале строки

/[0-9]

поиск любой из цифр от 0 до 9

/2.3

поиск произвольной подстроки из трёх символов, первым из которых является 2, a последним — 3

/2.*3

поиск подстроки произвольной длины (не менее двух), первым символом которой является 2, a последним — 3

/x[127]

поиск одной из подстрок x1, x2 или x7

Подсказка Использование регулярных выражений в качестве шаблона превращает поиск в редакторе Vim в чрезвычайно мощное средство.

Вот перечень основных команд поиска:

/ (find — искать)

поиск первого вхождения после курсора задаваемого далее шаблона; перемещение курсора (в случае обнаружения такого вхождения) происходит по нажатию на клавишу Enter

? (find reverse)

аналогичный поиск в обратном направлении

n (next — следующий)

повторение последней команды поиска в том же самом направлении

N

повторение последней команды поиска в противоположном направлении

*

поиск следующего слова, совпадающего со словом под (или рядом с) курсором

#

аналогичный поиск в обратном направлении

Подсказка Точные правила, описывающие работу команды * можно узнать, воспользовавшись справочной системой Vim. Следует набрать команду :help *.

5.2. Метки и макрокоманды

Метки позволяют запомнить позицию в тексте для того, чтобы затем можно было быстро вернуться в неё при необходимости. При редактировании произвольного файла можно использовать до 26 меток, имеющих имена от a до z. Вот какие команды используются для работы с метками:

m (mark — метка)

поставить метку в позиции курсора; имя метки должно следовать сразу после этой команды

` (обратный апостроф)

перейти на метку с указанным именем; имя метки должно следовать сразу после этой команды

' (апостроф)

перейти к первому не пробельному символу на строке с данной меткой; имя метки должно следовать сразу после этой команды

`. (обратный апостроф и точка)

перейти в позицию, в которой было сделано последнее изменение в тексте

Метки иногда оказываются полезными при задании макрокоманд или макросов. Так называют записанную последовательность команд редактора, которую затем можно повторить один или несколько раз. Макрокоманды так же, как и метки, имеют имена от a до z. Вот команды для работы с ними:

q

начать запись макрокоманды; имя макрокоманды должно следовать сразу после этого символа; заканчивает запись макрокоманды повторный символ q

@

выполнить («проиграть запись») макрокоманду с именем, следующим сразу за символом @

@@

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

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

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

./images/vim-chart2.png