Текстовые редакторы (Vim)
Написание слов и написание кода - очень разные активности. При программировании, вы затрачиваете значительно больше времени на переходы между файлами, чтение, перемещение и редактирование кода, в сравнении с написанием большого объема информации. Это объясняет тот факт, что существуют разные программы для написания текста и кода (к примеру: Microsoft Word и Visual Studio Code).
Как программисты, мы тратим основную часть времени на редактирование кода. Поэтому будет полезно потратить время на совершенствование навыков работы в том редакторе, который соответствует вашим требованиям.
Вот основная концепция изучения и совершенствования работы в новом редакторе:
- Ознакомьтесь с обучающими материалами (пример: эта лекция и указанные в ней дополнительные материалы);
- Начните использовать выбранный редактор для всех случаев редактирования текстовой информации (даже если скорость работы в нем значительно ниже);
- Обращайте внимание на детали при работе: если вам кажется, что есть способ сделать что-то эффективнее, скорее всего такой способ существует.
Если вы будете придерживаться данной концепции, обязуясь использовать новый редактор при любой необходимости, ваш прогресс в изучении сложных текстовых редакторов будет подобен указанному далее. В течение часа или двух, вы ознакомитесь с базовым функционалом, таким как открытие, редактирование и сохранение файлов, выход из программы, и использование буфера. Как только вы перешагнете порог в 20 часов использования - вы будете таким же быстрым в использовании нового редактора, каким были при использовании старого. После этого ваша эффективность будет возрастать: вы будете иметь достаточно знаний и мышечной памяти и использование нового редактора будет экономить ваше время. Современные текстовые редакторы - сложные, но изысканные и производительные инструменты, поэтому обучение не должно прекращаться - вы будете использовать их более эффективно при дальнейшем изучении.
Какой редактор использовать?
Программисты достаточно предубеждены в отношении выбранного текстового редактора.
Какие из редакторов популярны сегодня? Если обратиться к результатам опроса Stack Overflow survey (результаты опроса могут быть предвзяты, т.к. респонденты на одном сайте не представляют всех программистов). Visual Studio Code наиболее популярный текстовый редактор. Vim наиболее популярный консольный текстовый редактор.
Vim
Все лекторы данного курса используют Vim как редактор. Vim имеет богатую историю; он происходит от редактора Vi (1976), который поддерживается по сей день. Vim имеет несколько отличительных идей, и благодаря этому, большое количество других инструментов поддерживают эмуляцию Vim (к примеру, 1.4 миллиона пользователей установили плагин Vim emulation for VS code). Обучиться использовать Vim - стоящее дело, даже если в итоге вы будете использовать другой текстовый редактор.
Невозможно обучить вас всему функционалу Vim в течении 50 минут, поэтому мы сфокусируемся на объяснении “философии” Vim, расскажем основы, познакомим с некоторыми продвинутыми функциональностями и поделимся полезной информацией для совершенствования навыков работы.
Философия Vim
В процессе программирования, основная часть времени тратится на чтение и редактирование, а не на написание кода. В связи с этим, Vim является редактором с переключаемыми режимами : для ввода текста или манипуляций с текстом требуется переключить режим. Vim - это программируемый редактор (при использовании Vimscript и других языков, к примеру - Python), и в тоже время интерфейс Vim по своей сути - язык программирования: нажатие клавиш воспринимается как команды (по мнемоническим именам), и эти команды - комбинируемые. В Vim избегается возможность использования мыши, так как это замедляет работу; в Vim даже избегается возможность использовать “стрелки” на клавиатуре для перемещения по тексту - так как на это требуется лишнее движение.
В конечном результате скорость работы в данном редакторе может соответствовать скорости, с которой вы думаете.
Режимы работы
Принцип работы в Vim основан на идее, что основная часть времени при программировании тратится на чтение, перемещение по коду и внесение небольших правок, а не на написание больших объемов текста. В связи с этим в Vim присутствуют несколько режимов работы.
- Normal: для перемещения по файлу и внесения правок
- Insert: для ввода текста
- Replace: для замены текста
- Visual (простой, линейный или блочный): для выделения частей текста
- Command-line: для выполнения команд
Нажатия клавиш воспринимаются по-разному в разных режимах. К примеру, нажатие клавиши x
в режиме Insert приведет к вставке символа ‘x’, но в
Normal - символ, на котором находится курсор, будет удален, а в Visual - будет удален весь выделенный текст.
В своей конфигурации по-умолчанию режим работы Vim отображается внизу слева. Изначальный (стандартный) режим - Normal. Большую часть своего времени вы будете проводить в режимах Normal и Insert.
Нажатие клавиши <ESC>
используется для переключения в режим Normal из любого другого.
Из режима Normal переход в режим Insert осуществляется при нажатии i
, в Replace - R
, в Visual (простой) - v
, в Visual (линейный) - V
, Visual (блочный) - <C-v>
(Ctrl-V, иногда пишется как ^V
), и режим Command-line - :
.
Нажимать клавишу <ESC>
придется достаточно часто в Vim: подумайте над переназначением клавиши Caps Lock в
Escape (macOS
instructions).
Основы
Вставка текста (Insert)
Для перехода в режим Insert из режима Normal, требуется нажать клавишу i
.
Теперь поведение Vim будет схоже с любым другим текстовым редактором, пока клавиша <ESC>
не будет нажата для возврата в Normal режим. Этого,
с учетом основ, описанных ранее, достаточно для начала работы в Vim (хотя и не особо эффективно, если вы проводите все время при редактировании в режиме Insert).
Буферы, вкладки и окна
Vim поддерживает открытие нескольких файлов, называемых “буферами”. Сессия Vim имеет перечень вкладок, каждая из которых содержит окна (разделенные панели). Каждое окно отображает один буфер. В отличии от других программ известных вам, к примеру - веб-браузер, в Vim нет строгого соответствия (1 к 1) между буферами и окнами: окна - это просто интерфейс отображения. Выбранный буфер может быть открыт одновременно в нескольких окнах, и даже более того - в нескольких окнах одной вкладки. Это достаточно удобно, например, для одновременного просмотра двух разных частей файла.
По умолчанию Vim открывается с одной вкладкой, содержащей одно окно.
Командная строка (Command-line)
В режим Command-line можно перейти нажав :
в режиме Normal. Ваш курсор переместится в строку команд внизу экрана после нажатия :
. Этот режим имеет большое количество функций, включая открытие, сохранение, закрытие файлов и выход из Vim.
:q
quit (Закрыть окно):w
save (Сохранить изменения - от англ. “write”):wq
сохранить и выйти:e {name of file}
открыть файл для редактирования - от англ. “edit”:ls
показать открытые буферы - от англ. “list show”:help {topic}
открыть окно помощи:help :w
открыть подсказку для команды:w
:help w
открыть подсказку приw
навигации
Интерфейс Vim - язык программирования
Наиболее важная идея в Vim заключается в том, что интерфейс Vim является языком программирования. Вводимые символьные комбинации (из мнемонических имен) - команды, и эти команды можно объединять. Это позволяет эффективно перемещаться и вносить изменения, в особенности тогда, когда команды отложены в мышечной памяти.
Перемещение
Вы должны проводить основную часть времени в Normal режиме, используя команды для перемещения по буферу. Перемещения в Vim также называют “существительные”, потому что они относятся к фрагментам текста.
- Базовое перемещение:
hjkl
(влево, вниз, вверх, вправо) - Слова:
w
(следующее слово),b
(начало предыдущего слова),e
(конец следующего слова ) - Строки:
0
(начало строки),^
(первый непробельный символ строки),$
(окончание строки) - Экран:
H
(верх экрана),M
(середина экрана),L
(низ экрана) - Scroll:
Ctrl-u
(вверх),Ctrl-d
(вниз) - Файл:
gg
(начало файла),G
(конец файла) - Номер строки :
:{number}<CR>
либо{number}G
(номер строки - {number},- нажатие клавиши Enter) - Дополнительно:
%
(связанный символ - пример: переход между скобками, кавычками и т.д.) - Поиск:
f{character}
,t{character}
,F{character}
,T{character}
-
f F - поиск символа в строке (вперед назад) -
t T - переход к символу, за которым находится искомый {character} в текущей строке (вперед назад) ,
/;
для перехода между результатами поиска
-
- Поиск по файлу:
/{regex}
,n
/N
для навигации по результатам.
Выбор
Визуальный режим:
- Visual
- Visual Line
- Visual Block
После перехода в визуальный режим используйте клавиши навигации для выбора части текста.
Внесение изменений
Все, что вы раньше делали с помощью мыши, сейчас требуется делать на клавиатуре с помощью команд редактирования, которые следует объединить с командами перемещения. Вот где интерфейс Vim начинает выглядеть как язык программирования. Команды редактирования в Vim также называют глаголами “verbs”, потому что глаголы действуют на существительные.
i
переход в Insert режим- но для изменения/удаления текст желательно использовать что-то более удобное чем “backspace”
o
/O
вставка строки ниже / Вышеd{motion}
удалить {команда передвижения}- примеры:
dw
- удалить слово,d$
- удалить все до конца строки,d0
- удалить все до начала строки,d3d
- удалить 3 строки.
- примеры:
c{motion}
изменить {команда передвижения}- к примеру:
cw
- изменить слово (удалить и перейти в режим Insert)
- к примеру:
x
удалить символ (соответствует -dl
)s
заменить символ (соответствует -xi
)- Visual режим + манипуляции
- выделить текст,
d
- для удаления либоc
для его изменения
- выделить текст,
u
для отмены последнего действия,<C-r>
- повторение отмененного действияy
копированиеp
вставка- И еще большое количество для изучения, к примеру -
~
изменяет регистр символа
Счетчик
Вы можете объединять существительные и глаголы (объекты и действия) с количеством, в результате чего будет произведено выбранное действие указанное количество раз.
3w
переместиться на 3 слова вперед5j
переместиться на 5 строк вниз7dw
удалить 7 слов
Модификаторы
Вы можете использовать модификаторы для изменения значения существительных (объектов). Некоторые модификаторы - это i
,
что обозначает - внутренний, внутри (“inner”, “inside”), и a
- внешние (“around”).
ci(
изменить содержимое внутри текущей пары скобокci[
изменить содержимое внутри текущей пары квадратных скобокda'
удалить содержимое подстроки, отмеченной одинарными кавычками, включая одинарные кавычки.
Демонстрация
Ниже представлен нерабочий код для fizz buzz:
def fizz_buzz(limit):
for i in range(limit):
if i % 3 == 0:
print('fizz')
if i % 5 == 0:
print('fizz')
if i % 3 and i % 5:
print(i)
def main():
fizz_buzz(10)
Нам требуется исправить следующие проблемы:
- Функция main никогда не вызывается;
- Счет начинается с 0, а не 1;
- Слова “fizz” и “buzz” выводятся на разных строках, если число делится на 15;
- Выводится слово “fizz” для чисел, делимых на 5;
- Используется предопределенный аргумент, равный 10, вместо использования аргумента командной строки.
Посмотрите видео лекцию для ознакомления. Сравните, как вышеуказанные изменения выполняются при использовании Vim с тем, как вы выполните такие же изменения в любом другом редакторе. Заметьте, что всего лишь несколько команд в Vim позволяют вам вносить изменения на скорости ваших мыслей.
Кастомизация Vim
Vim может быть кастомизирован с помощью текстового конфигурационного файла ~/.vimrc
(содержит Vimscript команды). В нем имеется большое количество базовых настроек, которые вы, вероятно, захотите включить.
Мы предоставляем базовый конфигурационный файл, наполненный комментариями, который может быть использован вами как отправная точка. Мы рекомендуем использовать его, так как в нем исправлены некоторые причуды стандартной конфигурации Vim.
Ссылка на скачивание нашего конфигурационного файла здесь, его требуется сохранить как ~/.vimrc
.
Vim имеет большое количество настроек, и целесообразно потратить время на изучение вариантов настройки. Вы можете посмотреть на дот-файлы других преподавателей на GitHub для вдохновения, к примеру (Anish, Jon (uses neovim), Jose).
Существует большое количество хороших постов в блогах на данную тему. Старайтесь не копировать полностью конфигурации других людей, а читайте их, старайтесь разобраться и используйте лишь то, что вам действительно необходимо.
Расширения Vim
Существует огромное количество плагинов для расширения возможностей Vim. Вопреки устаревшим советам, на которые вы можете натолкнуться в интернете, вам нет необходимости использовать менеджер плагинов для
Vim (с выпуска Vim 8.0). Вместо этого, вы можете использовать встроенный пакетный менеджер. Просто создайте директорию ~/.vim/pack/vendor/start/
, и копируйте плагины туда (например с использованием git clone
).
Здесь перечислены некоторые из наших избранных плагинов:
- ctrlp.vim: поиск файлов по регулярным выражениям
- ack.vim: поиск в коде
- nerdtree: файловый навигатор
- vim-easymotion: магическая навигация
Мы стараемся избежать перечисления избыточно длинного списка плагинов. Вы можете посмотреть дот-файлы других преподавателей (Anish, Jon, Jose), чтобы узнать, какие еще плагины мы используем. Посмотрите Vim Awesome для других великолепных плагинов Vim. Существует большое количество постов в разнообразных блогах на эту тему: просто поищите “лучшие плагины Vim”.
Режим совместимости Vim в других программах
Множество инструментов поддерживают эмуляцию Vim. Качество эмуляции варьируется от хорошего до великолепного, в зависимости от инструмента; они могут не поддерживать продвинутые фичи Vim, но большинство покрывает базовый функционал действительно хорошо.
Командная оболочка
Если вы используете Bash, введите set -o vi
. При использовании Zsh, bindkey -v
. Для Fish,
fish_vi_key_bindings
. Дополнительно, вне зависимости какую оболочку вы используете, вы можете ввести
export EDITOR=vim
. Эта переменная окружения используется при определении какой редактор требуется запустить, когда программа желает запустить редактор. К примеру, git
будет использовать указанный редактор для сообщений при комите.
Readline
Множество программ используют библиотеку GNU
Readline для
их интерфейса командной строки. Readline поддерживает эмуляцию (базовую) Vim также,
которая может быть включена после добавления следующей строки в файл ~/.inputrc
:
set editing-mode vi
При включении этой опции, к примеру, Python REPL будет поддерживать сочетания клавиш Vim.
Другое
Существуют даже расширения, позволяющие использовать сочетаний клавиш vim в веб-браузерах - некоторые популярные из них Vimium для Google Chrome и Tridactyl для Firefox. Вы даже можете включить использование сочетаний клавиш Vim в Jupyter notebooks.
Продвинутый Vim
Здесь приведены несколько примеров для демонстрации всей силы этого редактора. Мы не можем обучить вас всем таким приемам, но вы обязательно их выучите самостоятельно при использовании vim. Существует эвристический метод: если при использовании своего редактора, вы задумываетесь, что должен быть лучший способ сделать что-либо – он вероятно существует: попробуйте поискать в интернете.
Поиск и замена
:s
(комбинаторная) команда (документация).
%s/foo/bar/g
- заменить foo на bar во всем файле
%s/\[.*\](\(.*\))/\1/g
- заменить поименованные Markdown ссылки на URLs
Многооконность
:sp
/:vsp
для разделения окон- Можно иметь несколько открытых “сессий” одного и того же буфера (файла).
Макросы
q{character}
для начала записи макроса в реестр{character}
q
для окончания записи@{character}
воспроизведение макроса- Выполнение макроса останавливается при ошибке
{number}@{character}
выполняет макрос {number} раз- Макросы могут быть рекурсивны
- сперва очистите макрос
q{character}q
- запишите макрос, используя
@{character}
для введения в рекурсию (не будет работать до тех пор, пока запись не будет завершена)
- сперва очистите макрос
- Пример: конвертация xml в json (файл)
- Массив объектов с ключами “name” / “email”
- Будем использовать Python скрипт?
- Можно использовать sed / regexes
g/people/d
%s/<person>/{/g
%s/<name>\(.*\)<\/name>/"name": "\1",/g
- …
- Vim команды / макрос
Gdd
,ggdd
для удаления первой и последней строк- Макрос для форматирования одного элемента (зарегистрирован как
e
)- Перейти к строке, содержащей
<name>
qe^r"f>s": "<ESC>f<C"<ESC>q
- Перейти к строке, содержащей
- Макрос для форматирования объекта
- Перейти к строке, содержащей
<person>
qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q
- Перейти к строке, содержащей
- Макрос для форматирования объекта и перехода к следующему
- Перейти к строке, содержащей
<person>
qq@pjq
- Перейти к строке, содержащей
- Запуск выполнения макроса до конца файла
999@q
- Вручную удалить последнюю
,
и добавить[
и]
разделители
Полезные ресурсы
vimtutor
который поставляется совместно с Vim - если Vim установлен, вы способны запуститьvimtutor
из оболочки командной строки- Vim Adventures игра для изучения Vim
- Vim Tips Wiki
- Vim Advent Calendar - различные советы для Vim
- Vim Golf - Код-гольфинг, но тут в роли языка программирования выступает командный интерфейс Vim
- Vi/Vim Stack Exchange
- Vim Screencasts
- Practical Vim (книга)
Упражнения
- Выполните
vimtutor
. Пометка: лучше всего выглядит в формате 80x24 (80 столбцов на 24 строки) окна терминала. - Скачайте наш базовый vimrc и сохраните его как
~/.vimrc
. Прочтите этот отлично прокомментированный файл (используя Vim!), и познакомьтесь как Vim выглядит и ведет себя немного по-другому с новым файлом конфигурации. - Установите и настройте плагин:
ctrlp.vim.
- Создайте директорию для плагина
mkdir -p ~/.vim/pack/vendor/start
- Скачайте плагин:
cd ~/.vim/pack/vendor/start; git clone https://github.com/ctrlpvim/ctrlp.vim
- Прочтите документацию
к плагину. Попробуйте использовать CtrlP для поиска файла и навигации директорию проекта, открытия Vim, и использования командной строки Vim для запуска
:CtrlP
. - Сконфигурируйте CtrlP добавлением новых параметров
конфигурация
в ваш
~/.vimrc
для открытия CtrlP при нажатии Ctrl-P.
- Создайте директорию для плагина
- Для практики в использовании Vim, повторите изменения из Демонстрация самостоятельно.
- Используйте Vim во всех случаях редактирования текста в течение месяца. В случае, когда что-либо кажется неэффективным, или когда вы думаете “должен быть более хороший способ сделать это”, пробуйте загуглить, и, вероятнее всего, найдете.
- Настройте другие ваши инструменты (программы) на использование сочетаний клавиш Vim (посмотрите на инструкции выше).
- Продолжайте кастомизировать ваш
~/.vimrc
и установите больше плагинов. - (Усложненное) Конвертируйте XML в JSON (пример файла) с использованием макросов Vim. Попробуйте самостоятельно, в крайнем случае - обратитесь к разделу Макросы.
Лицензия CC BY-NC-SA.