Использование редакторов vi/vim и компиляция С++ программы

В статье рассматриваются базовые приемы для работы в редакторах vi/vim с примером компиляции простейшего консольного приложения из репозитория.

Поскольку основная трудность состоит в специфике процесса правки исходника (шутка про самый частый вопрос как выйти из редактора vi возникла неспроста), упор делается на объяснение способов добавления, удаления, поиска, вставки и копирования, сохранения исходника.

Подготовка окружения
Установим компилятор g++, для этого нужен пакет gcc sudo pacman -Sy gcc Если vi/vim не установлен, то добавляем редактор sudo pacman -Sy vi vim Создадим новую папку для проекта mkdir hello_world Перейдем в этот каталог cd hello_world Создадим новый файл hello.cpp vi hello.cpp
Режимы vi/vim
vi в начале находится в нормальном режиме. В нем нажатия на клавиши означают вовсе не ввод текста, а определенные команды. Переключите редактор в режим редактирования с помощью клавиши i (insert mode - режим вставки) Набираем код простейшей программы #include <iostream> using namespace std; int main(){ cout << "Hello, world"; exit(0); } Чтобы разобраться, умышленно допустите пару опечаток.

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

У vi следующая философия работы с текстом - так как мы хотим осуществить действие - это команда редактирования, то чтобы ее выполнить, стало быть, надо выйти из режима вставки и перейти в нормальный (редакторский) режим, поэтому нажимаем esc (перешли в нормальный режим), перемещаем стрелки к символу, который нужно стереть и нажимаем x, повторяем столько, сколько нужно, затем снова нажимаем i, чтобы вернуться в режим вставки текста. Нормальный начальный режим предназначен не для набора текста, а для редактирования и навигации по файлу.

У vi/vim есть и третий режим - режим интерператора (командный)

В нормальном режиме нажмите двоеточие : - внизу экрана появится приглашение для ввода команды. Нажмите enter и команда будет выполнена и vi вернется к нормальный режим.

Если нужно удалить текущую строку целиком, выходим в нормальный режим esc, затем жмем dd

Другие удобные команды для быстрой правки в нормальном режиме
nx удалить n символов, например 6x - сотрет 6 букв
d5w удалить 5 слов
d$ удалить все от курсора и до конца строки (справа)
d^ удалить все от начала строки и до курсора (слева)
Навигация
Для перемещения (навигации) в нормальном режиме доступны следующие возможности Стрелки - перемещение по тексту
j, k, h, l вниз, вверх, лево и вправо (аналог стрелок)
^ (каретка) курсор на начало текущей строки
$ курсор на конец текущей строки
nG поставить на линию с заданным номером ( 4G переведет на 4 строку).Удобная команда, если нужно исправить опечатку, когда вы знаете в какой строке ошибка.
:номер перейти к строке с заданным номером, аналог nG
G перевести на последнюю строку
w к началу следующего слова
nw вперед на n слов ( 4w на 4 слова вперед)
b - к началу предыдущего слова
nb на n слов назад ( 4b на 4 слова назад )
{ назад на один параграф
} вперед на один параграф
Отмена действий
u отмена последнего действия (можно удерживать)
10u отменить 10 последних действий
U (заглавная) убрать все изменения в текущей строке
Повторение действий
ctrl+r ( в нормальном режиме, r от слова redo) Однократный повтор
10 ctrl+r вернуть 10 действий
Поиск образца
Частой является задача перейти к фрагменту текста путем сопоставления с образцом. Перейдем в нормальный режим, нажав esc Нажимаем / Вводим образец, например ; Нажимаем enter навигация - n - следующее вхождение N - предыдущее вхождение

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

В vi/vim поддерживаются регулярные выражения (regular expressions) при сопоставлении с образцом.

Например, \<\(void\|main\|exit\)\> будет искать вхождения или первого, или второго или третьего слова

История поиска
Введите / или ?, находясь в нормальном режиме. Используйте стрелки, чтобы пролистать сохраненные образцы Нажмите enter, чтобы повторить поиск Примечание - поиск в vi чувствителен к регистру Перейдите из нормального в командный :set ignorecase для поиска без учета регистра (:set ic) :set noignorecase для поиска с учетом регистра (:set noic) В файле /home/artem/.vimrc можно задать эти настройки редактору. Также чувствительность к регистру можно задать ключами \c или \С после образца соответственно.
Сохранение исходника.

Чтобы сохранить текст, переводим редактор из нормального в командный режим Esc, нажимаем клавишу : двоточие. Вводим wq - чтобы записать (write) и выйти (quit), enter

q! - выйти без сохранения
Компиляция проекта.
И так, мы вышли из редактора, сохранив исходный текст. Вводим команду g++ -Wall hello.cpp -o hello

Параметр -Wall - ключ для компилятора, выставляющий настройки. О флагах компиляции кратко по ссылке

Если текст набран верно, то будет собран исполняемый файл. Если в тексте ошибки, компилятор напишет, в каком участке искать ошибку, и нужно вернуться к файлу в vi, чтобы внести исправления. Команда терминала vi hello.cpp как создает файл, так и позволяет открыть на чтение существующий. Для перемещения к строке с ошибкой используйте комбинацию :номер
Запуск программы
./hello
Работа с терминалом в редакторе vim
Теперь откроем редактор vim. Редактирование, поиск и навигация в целом идентичны редактору vi. Редактор vim добавляет новые возможности. Откроем файл исходника vim hello.cpp Введем команду :terminal

Увидим, что окно vim разделил на две панели - в одной можно править текст - в другой можно запускать из командной строки компилятор.

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

Переключаться между окнами можно с помощью мыши. Потянув за заголовок окна, можно изменить его размер :below terminal - открыть окно терминала внизу
Выделение текста и понятие о регистрах
Достаточно часто приходится работать с буфером обмена Перейдем в нормальный режим (esc) Чтобы начать выделение посимвольно, можно нажать v (стрелки для того, чтобы тянуть маркер выделения). Клавиша V заглавная нужна, чтобы выделить строку целиком, Ctrl-v (также Ctrl-q) - выбрать прямогольный блок Подтверить выбор фрагмента, т.е. скопировать (yank) в стандартный регистр - клавиша y Вырезать текст - нажимаем d С помощью навигации перемещаемся к точке вставки Нажимаем заглавную P, чтобы вставить перед курсором, или p чтобы вставить после. Вставить пустую строку после курсора - клавиша o При работе с регистрами для копирования и вставки, можно применять модификаторы навигации
yy or Y скопировать текущюю строку, включая перевод строки
3yy скопировать три строки
y^ - скопировать влево (от начала до текущей)
y$ скопировать до конца текущей строки, но без перевода каретки
yiw скопировать текущее слово (без обрамляющих пробелов)
yaw скопировать текущее слово (включая пробелы)
ytx взять между курсором и заданным символом
yfx взять между курсором и заданным символом, включая его
Вставка
gp вставить текст после курсором и перейти к позиции после вставки
gP вставить текст перед курсором и перейти к позиции после вставки.
Понятие о регистрах vim
Регистры - это области памяти, к которым может обращаться редактор. Их 9 типов Регистр по умолчанию, он же безымянный, стандартный "" Нумерованные регистры - от "0 до "9 Регистр малого удаления "- Именнованные буквенные "a до "z или "A до "Z Регистры только на чтение ":, "., "% и "# Регистр для выражения "= Регистры выделения "*, "+ и "/home/artem Регистр черной дыры "_ Регистр истории поиска (хранит последний образец) "/

Перед командой копирования - вставки можно указать регистр. Таким образом, в отличие от стандартных редакторов, vi/vim имеет много буферов обмена, что способствует более продуктивной правке.

Например, скопировать текст из vim в буфер операционной системы "*y, вставить из буфера операционной системы "*p
Работа с репозиторием
Делаем новую папку mkdir hello-github, переходим в нее cd hello-github Клонируем (скачиваем исходный код) git clone https://github.com/jsanelli/cpp-HelloWorld Переходим в каталог cpp-HelloWorld - cd cpp-HelloWorld ls чтобы просмотреть список файлов, можем открыть в vi и что-то подредактировать. Выполняем mkdir build для создания каталога для сборки Выполняем cmake . -B build/ для подготовки Окончательно линкуем и компилируем cd build, затем make Пробуем запустить - ./demo test, выведет Hello, test С помощью make можно детально настроить процесс сборки исходного кода в исполняемый. Рассмотрение make и git в деталях выходит за рамки статьи.
На пути к AUR

Отметим для полноты картины, что для написания установочного пакета в рамках ArchLinux необходимо также написать PKGBUILD файл, в котором детализирован процесс сборки и установки, там и применяется утилита make. Затем с помощью утилиты makepkg создается установочный pkg файл. Имея PKGBUILD файл, пользователь может установить программу с помощью команды makepkg -si из исходников или путем вызова pacman -U имя_пакетного_файла После сборки пакета становится возможным распространять программу через AUR или другую пакетную систему.

Теги документа