Найти тему
Одиночная палата

/GNUser/Linux для программиста/04-Vim

Оглавление

Есть же Midnight Commander!

Для пущей достоверности я буду набирать эту часть серии заметок прямо в рассматриваемых редакторах. А начну я с 'vi' (Vi Improved) .

$ vi linuxprogervi.txt

И вот почему.

Во-первых 'mc' (Midnight Commander) у меня на локальной машине оказывается отсутствует. Это не из-за того что я его не люблю или типа пытаюсь корчить из себя фанатика командной строки. Просто в качестве файлового менеджера я поставил себе, не побоюсь этого слова, гениальный Far Manager. Вернее его линуксовый порт far2l. Который закрывает собой вообще все возможные потребности по управлению файлами. Да и в общем очень неплохо справляется и с редактированием текстовых файлов, в том числе и исходников.

Во-вторых, 'vi', как и все что я разбирал до этого, относится к стандарту POSIX и по идее обязан присутствовать в любой системе реализующей стандарт. В отличии, например, от 'mc' или 'nano'. Другое дело, что говоря 'vi' в данном случае я, конечно, имею ввиду 'vim' - improved версию. А он уже скорее стандарт де-факто, чем де-юре.

В-третьих, 'vi' все-таки первичен по отношению и к 'nano', и к 'mc', да и вообще практически ко всем текстовым редакторам как таковым. Есть и более олдскульные варианты типа 'emacs', но именно в таком специализированном и мощном виде 'vi' где-то с середины 90-х стал практически единоличным законодателем мод и верным спутником программиста. Для многих он и сейчас таковым является не смотря на свой архаичный вид. До сих пор существует довольно широкий круг поклонников и контрибьюторов, участвующих в развитии проекта. Что и не удивительно, учитывая то, что он до сих пор может потягаться по возможностям с лучшими современными образцами типа 'atom', 'sublime', 'ultraedit' и прочими.

С другой стороны, ну редактор и редактор. Что в нем такого особенного? Что умеет 'vi' из того что нельзя сделать в редакторе 'mc'? Или даже так: Что 'vi' умеет лучше остальных? Давайте попробуем разобраться.

Режимы

Начнем с того, что 'vi' полностью консольный, для него не требуется наличие каких-либо навороченных библиотек и посему работает он начиная с режима init 1. Т.е. запустить его и отредактировать конфигурацию загрузчика получится в любой нештатной ситуации. У редактора могут отвалиться какие-то настройки и часть функций, но принципиально он запустится и будет выполнять минимальные задачи.

Так как изначально редактор создавался как всегда доступный минималистский вариант, то в нем были реализованы разнообразные ключи и варианты использования совместно с ранее упомянутыми утилитами и возможностями оболочки. Примерно как и в программах просмотра 'more', 'less', 'man' работают в 'vi' горячие клавиши. Редактор от рождения умеет работать с регулярными выражениями. Команды поиска и замены в точности совпадают с таковыми от 'sed'.

:s/sed/awk/g

Если говорить о командах доступных в vim подробно можно написать довольно объемную книгу. А может даже и не одну. Все эти команды доступны в так называемом командном (нормальном) режиме, в котором редактор запускается по умолчанию. Это, кстати, то свойство, которое зачастую отпугивает большинство людей от его использования при первом знакомстве. Однако, если набраться совсем немного терпения и прочитать какой-нибудь пятиминутный туториал, то по минимуму редактором можно пользоваться точно так же как и любым другим.

Вот вам и один из них.

Элементарный набор за 5 минут

Если после того как вы запустили редактор вам стало не комфортно от того, что курсор двигается, а вместо набираемого текста происходит какая-то непонятная дичь, то сразу нажмите несколько раз на клавишу 'u' - это отмена.

-2

Теперь, когда все сделанные вами неловкие движения отменены, можно нажать на INSERT. В левом нижнем углу должна появиться похожая надпись.

-3

Нижняя строка в редакторе отвeчает за текущее состояние и за вводимую команду. Если нажать INSERT несколько раз, то режим вставки должен меняться на режим замены и обратно. В этом режиме уже можно печатать, вставлять буфер и проделывать все что обычно делается в редакторе. Все специальные действия здесь производятся при нажатой клавише CTRL. Надо понимать, что это не те горячие клавиши, которые используются в Windows, никаких CTRL+C и CRTL+V здесь нет. Вернее есть, но работают они по-другому. Если нет возможности воспользоваться мышью, то для того что бы выделить и скопировать кусочек текста проще всего покинуть режим вставки и вернуться в командный.

Что бы выйти в любой момент в командный режим достаточно нажать ESC. Здесь, например, по нажатию 'v' можно выделить текст посимвольно, 'V' - построчно. 'd' - удаляет выделенный блок, 'p' - вставляет выделение в новое место, выбранное стрелками. Для выделенного блока или строки можно поменять отступ клавишами '<' '>' (SHIFT+, SHIFT+.).

В командном режиме доступны и другие команды. Например двойное 'd' удалит строку под курсором. Или можно воспользоваться поиском при помощи клавиши '/'. Строка введенная после слэша будет найдена от начала файла. Если применить строку поиска нажатием 'ENTER'то при помощи 'n' и 'N' можно перемещаться вперед и назад к другим совпадениям. Вернуть отмененное действие - CTRL+R. Ну и так далее. Запоминать весь набор доступных команд не интересно и лично мне никогда приходилось. Собственно, это все что я смог вспомнить навскидку.

Довольно скучно и в режиме вставки. Наверное, стоит отметить лишь автодополнение путей относительно рабочей директории - довольно полезная фича особенно для редактирования разного рода конфигурационных файлов с кучей всяких путей. Очень просто. Зажимаем CTRL и жмем последовательно 'x' и 'f'.

-4

Навигация по найденным совпадениям выполняется при помощи CTRL+N и CTRL+P. Если предварительно ввести символ '~', можно начать от домашней директории, '/' - соответственно от корня файловой системы. Работает в точности как в самой оболочке. Есть там и всякое другое полезное, но используется оно настолько редко, что в общем особенно и не нужно.

-5

Чуть более интересно дела обстоят еще с одним режимом. Командный режим переключается еще и в режим командной строки. Жмем ':' (SHIFT + ;) и попадаем в бездну всякой всячины. Главные команды этого режима это ':w' - запись и ':q' - выход, ':q!' - позволяет выйти из редактора без сохранения, ':wq' - соответственно записать и выйти. На самом деле кроме них особенно ничего и не надо на постоянной основе. Ну, разве что упомянутые ранее поиск и замена.

-6

А вот не на постоянной основе возможностей открывается море. Тут знакомая нам клавиша TAB раскрывается полностью, предлагая все варианты команд. Есть команда ':help' - внутренний 'man'. Есть команда ':pwd' - показать рабочую директорию, есть ':cd' - поменять директорию, но их мы знаем. А вот, пожалуй, самая волшебная команда среди всех это ':set'.

Конфигурация

C командой ':set' можно играться бесконечно. Все что можно прописать в конфигурации 'vi' доступно и из командного режима. Это и всяческие умолчания, дополнения, параметры и много много всякого. Мы рассмотрим одну из них - ':set spell'. Как понятно из названия это команда отвечающая за орфографию. Почему-то в стандартной поставке 'vi' не умеет проверять русский язык - нужен соответствующий словарь. Давайте же научим его это делать. В режиме командной строки выведем и ответим на все вопросы утвердительно.

:set spell spelllang=en_us,ru_ru

Моя версия 8.1.2269 умеет сама скачивать и настраивать словарь из репозитория проекта.

-7

В результате должно получиться нечто такое, чего для большинства случаев вполне достаточно.

-8

Тут же можно воспользоваться сокращенными командами ']s', '[s' для поиска ошибок, 'z=' для выбора из словаря подсказок или 'zg' для добавления слова в словарь.

-9

Репозиторий - нормальное слово.

-10

Для программистов могут оказаться полезными функции автоматического дополнения ключевых слов CTRL+F CTRL+P, переход на открывающую или закрывающую скобку '%'. Так же современный vim из коробки умеет подсвечивать синтаксис популярных языков программирования и разметки. Более того, есть возможность выбрать одну из схем на свой вкус.

':colorsheme' TAB покажет список вариантов, которые тут же можно применить. Мне приглянулся вариант 'murphy'.

-11

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

$ vi ~/.vimrc
INSERT
:set spell spelllang=en_us,ru_ru
:colorsheme murphy
ESC
:wq

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

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

С другой стороны, острой необходимости переучиваться нынче и нет, а вся эта скрытая мощь иногда приходится не очень кстати. Например, когда надо много копировать, вставлять, передвигать ну и вообще выполнять какие-то совсем нехитрые действия. А особенно на некоем количестве разных файлов. В таких случаях сподручнее могут оказаться как-раз mc и/или nano.

Своеобразие

Nano, как следует из названия, это нечто очень маленькое. Так в общем и есть. Тем не менее, хоть он и не хватает звезд с неба, но и умеет вполне себе взрослые вещи. Так же как 'vi' умеет использовать регулярные выражения, подсвечивать синтаксис, проверять орфографию. С русским языком правда тоже придется повозиться, но он там в общем и не особенно нужен. Все-таки для написания эссэ он подходит не очень. Скорее для редактирования разных конфигурационных файлов, наскоро составленной разметки и ввода каких-нибудь данных.

В отличии от 'vi' здесь уже нет никакого командного режима и редактирование текста происходит чуть более наглядно и прямолинейно. Есть определенная особенность - так как утилита не относится к стандарту, горячие клавиши там по умолчанию другие. К ним привыкать придется как пользователям Windows, так и тем, кто до этого пользовался графическим режимом Linux. Как по мне, так они довольно странные, наверное взяты с какого-то другого языка. Видимо, надо просто один раз сесть и зазубрить наизусть. Есть возможность и перенастроить горячие клавиши под себя, но лучше все-таки запомнить. Когда появляется необходимость в использовании 'nano', то это как правило чужая машина и хорошо, если там все стоит по умолчанию. Зато тут работают сочетания SHIFT + UP, DOWN и CTRL + SHIFT + <arrow keys>, что куда приятнее чем в 'vi'.

Более интуитивно и понятно работает в 'nano' и мягкий перенос строк. Если он у вас отключен можете нажать ESC, отпустить, и нажать SHIFT + 4. Это тоже одна из особенностей 'nano' - после ESC может следовать одна из нескольких десятков доступных команд, которые так же можно использовать совместно с клавишей ALT. Но вот ALT + SHIFT + 4 мне почему-то одновременно нажать не удалось. Такое поведение усугубляется на удаленных терминалах, когда ALT работает совсем не так как на локальной консоли.

Эта же болячка, впрочем, имеется и у 'mc'. Встроенный редактор 'mcedit' еще проще чем 'nano' и снова имеет собственный набор горячих клавиш. Чуть более мнемонический и понятный, но тоже со своими тараканами. Благо, что 'mc' легко перенастроить так, что бы вместо встроенного редактора файл открывался в другом редакторе. Например, в том же 'nano'. В командной строке менеджера для этого достаточно ввести 'select-editor', который сам обнаружит доступные редакторы. Встретить нынче дистрибутив с 'mc', но без 'nano' довольно сложно.

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

К сожалению, все это работает только тогда, когда кодировка текстового файла совпадает с системной. Если у вас по умолчанию стоит utf-8, в чем можно убедиться набрав в консоли 'locale', то открыть старый html файл в cp1251 у вас не получится ни тем, ни другим, ни третьим.

-12

Но об этом в следующий раз.

CTRL + X, y, ENTER