Работа с редактором vim — функции и команды
Содержание:
Давайте определимся с терминологией
Vim (далее Вим) — это, как многие уже знают, текстовый редактор. Конечно, изменение вами написанного является очень важным занятием, которое является бутылочным горлышком в вашей производительности, но, к сожалению, не всё в этой жизни так просто, и вам (как пользователю) зачастую необходим и другой функционал.
Рабочая среда — это набор программ для разработки ПО. Например, он может содержать компилятор, интерактивную консоль, редактор раположения GUI элементов, дебаггер и прочее. Редактор — это лишь маленький кусочек этого пазла.
IDE — это вся рабочая среда, сосредоточенная в одном месте. Конечно, есть программы наподобии Emacs (далее Емакс), где вы сами вольны вставить в неё всё, что вам угодно при должном умении, однако чаще всего это уже готовый, собранный за вас пакет.
— Зачем мне нужен тогда Вим, если за меня всё сделает IDE?
Раньше весомым аргументом была его раскладка, так как она для многих удобнее современных Емаксо-подобных многокнопочных комбинаций клавиш для навигации и редактирования текста. Однако, благодаря Neovim и другим проектам, таким как VSCodeVim, она есть буквально везде.
Однако есть ещё один более весомый аргумент — производительность. В IDE часто имеется огромное количество функциональности, которым вы не пользуетесь, и фоновых процессов, которые сильно нагружают систему. Даже если ваш Макбук не орёт как истребитель от PyCharm или у вас не лагает скроллинг в Visual Studio (что невозможно, врунишки вы мои), а однопоточность Емакса не напоминает о первом Crysis или S.T.A.L.K.E.R., то всё равно встаёт вопрос энергопотребления и, как следствие, времени жизни батареи. Такое ПО в линукс сообществе характеризуют мемом термином «bloat».
— Почему Вим?
У меня уже есть статья про все прелести этой программы. Однако она была написана человеком под впечатлением от новой игрушки с уровнем интеллекта второкурсницы (догадайтесь почему), что вылилось в настолько критично малое количество в ней смысла, что на её месте образовалась чёрная дыра. Ну хоть смешные картинки удались…
Что же я могу сказать про него сейчас, по прошествии года активного использования?
- Он очень быстрый. Ввиду особенностей его рендера, Вим имеет намного меньшую задержку, чем другие редакторы. После него другие редакторы кажутся неотзывчивыми, я уже молчу про выше упомянутые IDE.
- Его использование подобно прохождению третьего Dark Souls после первой части. Сначала сложно и непривычно, так как игра стала быстрее, и нельзя зачизить многие сложные моменты с помощью RPG составляющей, но потом приходит осознание того, что игра оказуалилась, и почти все боссы одолеваются со второй попытки.
- Он практически не тратит ресурсы и запускается даже на хлебушке, что очень хорошо сказывается на батарее.
В принципе, ничего откровенно плохого в других редакторах нет, так что оставьте этот выбор на сугубо ваше личное усмотрение. Меня не покидает уверенность, что вы сможете найти аналогичную статью для вашей любимой программы. Хотя, будем откровенными, редакторы на electron еле-еле проходят по критерию энергоэффективности.
В этой статье мы приведём Вим в удобоваримое состояние для серьёзной работы, а также научим его дружить с некоторыми сторонними программами для разработки. Учтите, что я буду рассказывать только про то, с чем мне довелось столкнуться лично, и если у вас интересные предложения, то добро пожаловать в комментарии.
Замена «Последний, Первый» на»Первый Последний»
Имеется список имен в виде:
Последний, Первый
Как привести это к виду:
Первый Последний
Осуществить это можно с помощью такой команды:
:1,$s/\(*\), \(.*$\)/\2 \1/
Двоеточие () указывает Vim что выражение являетсякомандой в стиле ex.
Диапазоном строк для этой команды является весь файл, чтозадано диапазоном 1,$.
s (замена) указывает Vim производить строчнуюзамену.
Старый текст представлен сложным регулярным выражением.Ограничители \( ... \) используются для указанияредактирору, что отмечает регулярное выражение, которое должно бытьинтерпретировано специально.
Текст в первых \( ... \) определен как \1в заменяющем тексте. Второй участок текста внутри \( ... \)определен для \2 и так далее.
В данном случае первым регулярным выражением является любаягруппа символов в которой нет запятой. обозначает «что угодно кроме запятой», * определяет набор(ноль или более символов).
Второе выражение подставляет что угодно: .* доконца строки: $.
Результатом этой подстановки в том, что первое слово в строкеопределяется как \1 и второе как \2.Эти значения используются в конце команды для перестановки слова.
Схема, приведенная ниже, показывает отношение между строкамиограниченными маркерами \( \) и \1,\2.
:1,$s/\(*\), \(.*$\)/\2 \1/^^ ^^ ^^ ^^^ ^ ^ || || || ||| | +----- Строка подставляемая|| || || ||| | первым \( \)|| || || ||| +--------- Строка подставляемая|| || || ||| вторым \( \)|| || || ||+----------- Разделение слешами|| || || || старых/новых строк|| || ++---++------------ Вторая \( \) ++-----++--------------------- Первая \( \)
Следующая схема раскрывает смысл различных частей регулярноговыражения в примере.
:1,$s/\(*\), \(.*$\)/\2 \1/^^^^^ ^^ ^^^||||| || ||+--- Конец строки||||| || |+---- Повторяется 0 или более раз||||| || +----- Любой символ||||| || +++--- Любой повторный символ||||| || до символа конца строки||||| |+-------- Символ пробела||||| +--------- Символ запятой||||+------------ Повторяется 0 или более раз|||+------------- Закрывает [] выражение||+-------------- Символ запятой|+--------------- Сравнение любого за исключением| следующего символа+---------------- Начало набора совпадений++++------------- Совпадает все кроме запятой+------------ Повторяется 0 или более раз+--------- Пока не будет встречена запятая
Поиск и замена в Vim
Довольно часто нам нужно найти определенную последовательность в тексте. Текстовый редактор Vim умеет это делать.
Во-первых, если нужно найти символ в строке, нажмите f и наберите нужный символ, курсор будет перемещен к его позиции.
Для поиска по всему файлу используйте команду /. После нее нужно ввести слово, которое нужно найти. Для поиска следующего вхождения используйте n, для предыдущего — N.
Для замены будет использоваться немного другая конструкция:
:%s/искать/заменить/g
Двоеточие запускает командную оболочку с командой s
для замены. Символ %
означает что обрабатывать нужно весь файл, а g
значит, что нужно обработать все найденные строки, а не только первую. Чтобы программа спрашивала перед каждой заменой можно добавить в конец строки опцию c
.
Красота требует настройки
Самая базовая и, вместе с тем, одна из самых важных модификаций для программы, в которой вы будете проводить более 90% своего рабочего времени — внешний вид. Если вы пользуетесь терминальным Вимом и уже настраивали консоль, то эти изменения должны отобразиться и на самом редакторе, но можно пойти и дальше. Начнём с выбора темы.
Так наш подопечный (MacVim) выглядит сейчас:
Выбор темы
Для Вима силами волонтёров было написано немеренно готовых тем. Из большинства популярных редакторов их давно уже всех портировали. Как по мне, главная отличительная особенность Sublime Text — его тема Monokai, которую мы сейчас вероломно апроприируем.
Теперь вы можете презагрузить ваш файл настроек (или сам Вим), и насладиться раскулаченным добром. Аналогично вы можете поставить себе и другие темы, такие как Darcula, Solarized Dark и.т.д.
Улучшенная строка состояния
Теперь давайте настроим наш status bar. Основная идея состоит в том, чтобы красиво показывать важную информацию по аналогии с tmux и панелями в WM на экране, касающуюся редактирования текста. Для этого давайте поставим Airline:
Про Powerline мы поговорим далее, но главное, чего мы этим добьёмся, — секции строки состояния будут выделяться не прямоугольниками, а стрелками. Про Keymap мы поговорим в секции про интеграцию русского языка, но эта комманда просто скроет его индикатор из строки статуса (аналог останется в строке команд). Символ — это красивая альтернатива «ln», но также мною был опущен процентный показатель конца файла, ибо мне он показался излишним.
Вид Airline по умолчанию:
Вид после нашего вмешательства:
Шрифт и иконки
Как видите, мы сделали только хуже. Проблема заключается в том, что вам нужно установить в ваш терминал или gui шрифты с поддержкой Powerline. Для первого воспользуйтесь настройками самой консоли, а для второго это командой:
Но не спешите сейчас ставить полюбившийся вам шрифт из того списка. Во-первых, подобных шрифтов в природе больше и их можно патчить самому. Например, мой любимый — это Fira Code, который поддерживает лигатуры (о них можете почитать там же). Во-вторых, есть ещё один отличный плагин Devicons, который добавляет в Airline и Nerdtree (файловый проводник) удобные иконочки.
Но и они не работают.
Для того, чтобы все наши красивости заработали нам нужен не просто пропатченный на поддержку Powerline шрифт, но и совместимый с , благо такая вариация Fira Code имеется. Тут от системы к системе будет отличаться, но на MacOS с brew этот шрифт ставится в два счёта:
И подключим его так (в GUI. И да, «фура» тут намеренно):
Теперь все наши элементы кастомизации должны встать на место:
Стандартные опции
Таким образом мы осветили самые важные аспекты кастомизации внешнего вида Вим. Подробнее про работу этих плагинов можно почитать либо в их мануалах (через команду ) или на их страницах на гитхабе (ищутся в Гугл по имени из списка плагинов). Далее будут указаны другие полезные команды, а после этого мы перейдём к следующей большой теме:
Блиц раздел
Как и было обещано, мы рассмотрели некоторые важные аспекты рабочей среды, которые мы успешно (относительно) смогли связать с нашим любимым редактором. Насчёт других аспектов я с полной уверенностью говорить не могу, так как у меня с ними мало опыта, но на затравочку давайте пробежимся по некоторым интересным вещам:
Комментарии про отладку
Чуда не будет. Дебаггеры — это очень важные программы для отладки ваших проектов, так как позволяют отслеживать состояние системы во время исполнения вашего кода. Однако их интеграция в редакторы всегда была очень болезненной, так как они очень платформозависимы и неповоротливы.
Это не является минусом конкретно Vim, так как в том же Sublime Text дела обстоят не лучше. Хотя вам никто не мешает просто научиться ими пользоваться из консоли. Туториалов на эту тему полно, и сам процесс несложный.
Если вы заложник яблока, то используйте гайды для gdb, но сами туда подставляйте аналогичные команды из lldb с помощью этого сайта.
Уход за проектом
В Виме есть встроенная команда , которая ведёт себя как одноимённая программа для терминала. Плюс этого подхода в том, что она вас носом проведёт по всем предупреждениям и ошибкам, указывая на то, что её беспокоит (это поведение настраивается).
Про настройку проверки синтаксиса и непосредственного написания кода уже написано много статей, но могу посоветовать установить YouCompleteMe для автодополнения по табу, отключить у него проверку синтаксиса и поставить для неё Neomake:
Прыжки по тегам
У Вима есть встроенная комбинация клавиш , который позволяет вам перейти к имплементации выделенного термина. Однако для его работы нужны те самые тэги. Сгенерировать их можно терминальной командой ctags:
Если вам нужно перейти к объявлению этого термина, то вам поможет (у вас должен быть установлен YCM):
Однако, постоянно отправлять Вим в задний фон и запускать ручками команду — не очень удобно. Также не очень удобно в больших проектах подолгу ждать выполнение индексации. Но у меня и для этой проблемы найдётся ответ…
Асинхронные команды
Одним из недавних трендов программирования является асинхронность. Она позволяет одновременно выполнять несколько разных задач, но сама программа остаётся однопоточной.
Вим — однопоточная программа (ему можно, у него амбиции ниже). Поэтому, если на него слишком много плагинов, то он поползёт со скоростью улитки. Но начиная с версии 8 (ну и в NeoVim это тоже есть) в него добавили API для асинхронных вызовов. Теперь ваш линтер, работающий в реальном времени, не будет замедлять сам процесс редактирования текста.
Давайте в качестве нашего подопечного возьмём плагин AsyncRun. Он умеет запускать асинхронно терминальные программы как в Vim 8, так и в NeoVim (ну и всех их разновидностях).
Теперь по нажатию клавиши F3 вы будете прогонять рекурсивно в директории проекта ctags. Вы всегда можете посмотреть вывод запущенной через программы в окне Quickfix. Умышленно убить программу в заднем фоне можно с помощью команды .
Соответственно, вызывать zathura можно также асинхронно:
Интеграция с Git
Человечеством ещё не было придумано более удобного способа пользоваться Git, чем через терминал. Многие IDE пытались бороться с такой тенденцией, но либо упрощали процесс настолько, что терялись важные фичи, либо усложняли до безумия. Но для фанатов делать всё из-под Вим таки нашёлся плагин Fugitive, просто оборачивающий всеми любимые команды.
Однако, по аналогии с прошлым пунктом, можно пойти и дальше, добавив немного асинхронности. и умеют пользоваться сторонними реализациями , так что для нашей затеи вам понадобится лишь добавить эту строчку в свой конфиг:
Удаление символа возврата каретки из MS-DOSфайла
Если вы когда-нибудь пытались редактировать MS-DOS файл, тозаметили что каждая линия заканчивается символом ^M.Причиной тому служит веселенький способ обращения MS-DOS к концустроки. (Для понимания некоторых аспектов этой проблемы см. ИсториюEOL.
Для удаления символов ^M из MS-DOS файла введите команду:
:1,$s/{Ctrl+V}{Ctrl+M}//{Enter}
Двоеточие в начале команды () указывает Vim войтив ex режим. Все команды ex начинаются с указания диапазона строк, вданном случае с первой (1) по последнюю ($). Слеш The slash указываетначало «заменяемого текста». {Ctrl+V}указывает Vim обращаться к следующему символу как к регулярному дажев случае если он является специфичным. Следующий символ — это{Ctrl+M}. (Он был бы обращением к {Enter}без {Ctrl+V}.) Следующий слеш заканчивает выражение»заменяемый текст». Следующее выражение является»заменяющим текстом» отграниченным слешами. В данном случаеэто пустота (//).
Как редактировать все файлы содержащиезаданное слово
Для этого потребуется fgrep и специальный консольный символобратного апостроф (`).
Чтобы редактировать все файлы програм на C в которых естьвыражение уровень_отступа выполните команду:
$ vim `fgrep -l уровень_отступа *.c`
fgrep -l уровень_отступа *.c ищет во всех файлах,чье название закачивается на .c слово и выводит их список.
Так как эта команда находится между символами (`), ее результат (список файлов) помещается в командную строку.
Затем для этих файлов запускается редактор Vim . Далее дляперемещения между файлами могут быть использованы команды :n{Enter}и :rew{Enter}.
Команды Vim
Внутренние команды Vim схожи с командами vi. В таблице 1 представлены команды для управления курсором в Vim.
Таблица 1. Команды для управления курсором в Vim
Команда | Действие |
---|---|
h | Перемещает курсор влево |
j, знак плюса (+), Enter или Return | Перемещает курсор вниз |
k, знак минуса (-) | Перемещает курсор вверх |
l | Перемещает курсор вправо |
} | Перемещает курсор в конец текущего параграфа |
{ | Перемещает курсор в начало текущего параграфа |
) | Перемещает курсор в конец текущего предложения |
( | Перемещает курсор в начало текущего предложения |
^ | Перемещает курсор к первому символу в текущей строке (за исключением символов пробела) |
$ | Перемещает курсор в конец текущей строки |
0 (zero) | Перемещает курсор в начало текущей строки |
w или W | Перемещает курсор в начало следующего слова |
b или B | Перемещает курсор в начало предыдущего слова |
e | Перемещает курсор в конец следующего слова |
H | Перемещает курсор к первой строке на экране |
M | Перемещает курсор к средней строке на экране |
L | Перемещает курсор к последней строке на экране |
G | Перемещает курсор в конец файла |
gg | Перемещает курсор в начало файла |
:n | Перемещает курсор к строке n |
В таблице 2 представлены команды Vim для удаления текста.
Таблица 2. Команды Vim для удаления текста
Команда | Действие |
---|---|
d | Удалить выделенный участок |
dd | Удалить целиком текущую строку |
10dd | Удалить 10 строк, начиная с текущей строки |
dw | Удалить слова, идущие после курсора |
db | Удалить слова, стоящие перед курсором |
dl | Удалить символ под курсором |
dh | Удалить символ слева от курсора |
d0 (zero) | Удалить текст от курсора до начала текущей строки |
D | d$ | Удалить целиком часть строки после курсора |
x | Удалить символ под курсором |
X | Удалить символ перед курсором |
В таблице 3 представлено еще несколько полезных команд.
Таблица 3. Наиболее часто применяемые команды Vim
Команда | Действие |
---|---|
ih | Перейти в режим вставки и оставить курсор в текущей позиции |
I | Перейти в режим вставки и переместить курсор в начало текущей строки |
a | Перейти в режим вставки и переместить курсор на один символ вперед |
A | Перейти в режим вставки и переместить курсор в конец текущей строки |
c | Изменить выделенный участок |
C | Изменить целиком часть строки после курсора |
o | Создать пустую строку под строкой, на которой находится курсор и переместить его в начало новой строки |
O | Создать пустую строку над строкой, на которой находится курсор, и переместить его в начало новой строки |
r | Заменить один символ под курсором |
R | Заменить символы, начиная с символа под курсором. |
<Esc> | Вернуться в режим вставки или в графический режим |
> или <Tab> | Сделать отступ вправо для выделенного фрагмента |
< | Сделать отступ влево для выделенного фрагмента |
v | Перейти к выделению символов |
V | Перейти к выделению строк |
yy | Вставить/скопировать текущую строку в память |
10yy | Вставить/скопировать 10 строк в память, начиная с текущей строки |
p | Вставить скопированные или удаленные символы после курсора. Если копировались или удалялись строки, вставить их под текущей строкой. |
P | Аналог команды , но вставляет символы перед курсором, а строки — над текущей строкой. |
u | Отменить последнее изменение |
<Ctrl> R | отмена последней команды u |
/<шаблон> | Произвести поиск по шаблону вперед и перенести курсор в начало найденного слова |
?<шаблон> | Произвести поиск по шаблону назад и перенести курсор в начало найденного слова |
n | Повторить последний поиск |
N | Повторить последний поиск, изменив его направление |
!<команда> | Выполнить операционной системы. |
Команды.
Для удобства, я поделил команды на несколько подгрупп.
Перемещение.
h,k,l,m
Влево, вниз, вверх, вправо
w
На слово вперед (курсор вначале слова)
b
На слово назад (курсор вначале слова)
e
На слово вперед (курсор в конец слова)
ge
На слово назад (курсор в конец слова)
gE, W, B, E
Те же действия, но не учитывают не алфавитных символов
$
В конец строки
^
В начало строки
0
В начало строки
%
На парную скобку
nG
Перемещаться на строку n
G
В конец строки
gg
В начало файла
50%
На 50% файла
H, M, L
Для видимой части экрана (верх, середина, низ)
Скроллинг.
CTRL +U
Вверх на пол экрана
CTRL +D
Вних на пол экрана
CTRL +E
Вверх на строку
CTRL +Y
Вниз на строку
CTRL +F
На весь экран
CTRL +B
На весь экран назад
zz
Строка с курсором в цент
zt
Строка с курсором верх
zb
Строка с курсором вниз
Ссылки.
CTRL +]
Прыжок
CTRL +T и CTRL +O
назад
Поиск.
fh
Поиск символа h в строке
Fh
Поиск в обратном направлении
th, Th
Тоже самое но курсив перед символом
;
Поиск в прямом направлении
,
Поиск в обратном направлении
/word
Поиск слова word
n
Продолжает поиск
N
В обратном направлении, поиск
?word
Поиск word в обратном направлении
:set ignorecase
Игнорирует регистр
*
Найдется слово под курсором
#
Найдется слово под курсором, но в обратном порядке
g*, g#
Частичный поиск не все слова целиком
\< и \>
Ограничение слов
:set hlsearch
Подсветка найденных слов
:set insearch
Поиск сразу при наборе слова
:set nowrapscan
Останавливает поиск в конце файла
Метки.
« (2 тильды)
Прыжок по отметке
CTRL +O и CTRL +I
Прыжок на новую и старую команду
:jumps
Количество прыжков
ma
Ставим метку a
`a
Переходим на метку a
a
Переход на метку a тоже, только курсор в начале строки с меткой
‘
Курсор до прыжка
‘ ‘
Последнее место редактирования файла
[
Начало последнего изменения
]
Конец последнего редактирования
.
Повторяет последнюю команду
Закрыть.
:q, :q!, :qa!
Выход
:wq
Сохранить и выйти
ZZ
Записать в файл и выйти
:w
Записать в файл
Отмена.
u
Отмена действий
U
Отмена действий во все строки
uu
Первоначальное состояние
CTRL +R
Отмена отмены
Инфо.
CTRL +G
Где находитесь
:help
Помощь, более детальная информация о всех командах.
Изменение.
c
Изменяет слово
cc
Изменяет все строку (S)
C=c$
S=cl
r
Изменяет символ под курсором
~ —
Изменяет регистр на противоположный
Копирование.
y
Копирует текст в регистр
ye
Копирует без пробелов после слова
yy
Копирует все строку
«*yy» и «*p»
Копирование и вставка с буфера обмена
Вставка.
a
Вставить после курсора
o
Новая строка под строкой
O
Новая строка над строкой
p
Вставить после курсора
Удаление.
X=dh
x
Удалить символ (dl)
dd
Удалить строку
J
Строка под курсором, становиться становиться продолжением текущей строки
dw
Удаляет слово
de
Удалить слово до последнего символа
d$
Удалить все до конца строки (D)
d
Можно использовать с любой командой для перемещения
3d2w
Удалит 6 слов
Режимы.
i
Режим вставки
<Esc>
Выход из режима
v
Визуальный режим
V
Визуальный режим для с целыми строками
CTRL-V
Визуальный блочный режим
o, O
В визуальном режиме изменяют начало и конец выделенного блока
R
Режим замены
I
Режим вставки после 1-го не пустого символа
A
После конца строки
Опции.
:set mouse =a
Активирует мышь.
:set showmode
Показывает текущий режим.
:set number
Показывает номера строк
:set ruler
Показывает позицию курсора в нижнем, правом углу
:scriptnames
Список скриптов vi/vim
Кому нужно, вот наглядные примеры использования на одном листе, забираем себе:
На этом все, я завершаю свою статью «Полезные команды vi/vim».
Как использовать редактор Vim
Начнем мы, как обычно с запуска программы, а также опций, которые ей можно передать. Синтаксис Vim очень прост:
$ vim
опции
имя_файла
$ vi
опции
имя_файла
Простой запуск vim без указания имени файла приведет к созданию пустого файла. А теперь давайте рассмотрим основные опции запуска:
-
+номер
— переместить курсор к указной строке после запуска. -
+/шаблон
— выполнить поиск по шаблону и переместить курсор к первому вхождению -
«+команда»
— выполнить команду после запуска программы -
-b
— двоичный режим, для редактирования исполняемых файлов. -
-d
— режим поиска различий в файлах, нужно указать несколько файлов для открытия. -
-g
— графический режим. -
-n
— не использовать автосохранение для восстановления файла при сбое. -
-R
— режим только для чтения. -
-w
— сохранить все действия в файл. -
-x
— шифровать файл при записи. -
-C
— режим совместимости с Vi.
Круто, правда? Но это только начало. Опции ничего по сравнению с командами редактора.
Выводы
Vim нельзя воспринимать как просто еще один текстовый редактор. Это нечто сродни командной строке Unix. Те, кто не умеют ее использовать, считают командную строку анахронизмом. Те, кто умеют и знают, используют ее постоянно и выполняют свои задачи намного быстрее и эффективнее людей, предпочитающих графический интерфейс.
Как и у командной строки, у Вим очень высокий порог вхождения. Его нельзя просто запустить и начать использовать. Сначала вы должны понять, как он работает, на каких принципах базируется и почему он именно такой, какой есть. Затем вам придется заучить множество команд, попрактиковаться, набить руку и только тогда Vim станет для вас действительно удобным, и вы уже не променяете его ни на какой другой редактор.
По статистике одной фирмы пользователей Vim берут на работу чаще, чем остальных
Зависит от того, насколько часто вы работаете с текстовыми данными: пишите статьи, код, редактируете HTML. Vim может сделать эту работу намного более эффективной. При этом навыки пригодятся и при работе в других программах — плагины с режимом Вим есть почти для всех популярных сред разработки. Я, к примеру, использую плагин IdeaVim в Android Studio. Он позволяет получить мощь команд Vim, не отказываясь от богатых возможностей среды Idea.