Вы уже писали код на первом курсе. И, вероятно, писали тексты на русском и/или английском. Скорее всего, процесс отличается в этих двух случаях.
Как программисты, мы проводим очень много времени, читая и редактируя код, поэтому стоит потратить время на тот или иной редактор, лучше понимания, как можно повысить свою продуктивность. В этой лекции мы рассмотрим два редактора, которыми я с периодичностью пользуюсь, у которых разная философия и которые могут оказаться удобными Вам во многих случаях.
Но в целом помните несколько правил, когда Вы встречаете новый редактор:
- Они несложные, у них просто разная философия.
- За час-два Вы худо-бедно сможете писать текст. После 20 часов практики Вы поймётё, как пользоваться любым из vim, emacs, VSC, sublime text на очень приличном уровне.
- Читайте туториалы, делайте cheat sheet, находите классные трюки и хаки.
- В большинстве случаев это удовольствие для себя.
- Текстовые редакторы могут дать Вам 90+% функциональности IDE и быть в 10 раз быстрее. Поверьте, быстрая навигация, поиск, замена текста, кастомизация — одни из немногих вещей, по которым я видел, что программисты действительно счастливы.
- Если Вы тратите на какое-то текстовое действие много времени, скорее всего есть способ сделать это быстрее. Обращайтесь к поисковикам, они действительно много знают.
Да что угодно, Вы будете продолжать спорить, какие редакторы самые крутые, но поверьте, все популярные из них крутые.
По опросу программистов со stackoverflow одни из самых популярных не IDE сред разработки — это Neovim(vim), Visual Studio Code, Rider. Я расскажу про vim и Sublime Text, остальные очень похожи по философии с кем-то из этих двух.
Я иногда пользуюсь Vim в качестве редактора, особенно когда я хочу работать с кодом удалённо или не могу сохранить код локально. У Vim богатая история: он был последователем редактора Vi (1976) (откуда и название Vi iMproved), и его разработка продолжается до сих пор. У Vim есть несколько действительно крутых идей, и по этой причине многие инструменты поддерживают плагины Vim (например, 1,4 миллиона человек установили плагин Vim для VSC). Vim, вероятно, стоит изучить, даже если Вы перейдете на какой-нибудь другой текстовый редактор.
Невозможно обучить всем особенностям Vim за одну лекцию, поэтому я собираюсь сосредоточиться на объяснении философии Vim, обучить Вас основам, показать Вам некоторые из более продвинутых функций и дать Вам ресурсы для освоения инструмента.
Когда Вы программируете, скорее всего Вы больше читаете и редактируете код, чем пишете с нуля. Даже если в университете не так, поверьте, в компаниях на десятках миллионов строк кода Вы будете его много читать. Поэтому Vim это модальный редактор и есть различные моды, например, редактирование и написание кода отличаются по своей логике.
Vim — это отдельный язык программирования, где Вы задаёте команды, комбинируйте их в "скрипты", которые автоматически исполняются. Большинство команд однобуквенные, чтобы сэкономить время для их написания, но их комбинации порой поражают. Есть сайт VimGolf, где люди соревнуются по тому, какое минимальное количество команд надо для выполнения того или иного действия, некоторые результаты там просто поражают своей красотой, элегантностью и эффективностью, всё как в настоящих языках программирования. Vim не любит движения мышкой, потому что это медленно. Да Vim даже не любит использовать стрелки, потому что они находятся далеко от обычных текстовых клавиш клавиатуры. Есть даже расширение vimium в Chrome, которое позволяет пользоваться браузером без мышки.
У vim есть несколько модов:
- Normal: ходим по файлу и что-то меняем (по умолчанию)
- Insert: наконец-то пишем код
- Replace: заменяем текст
- Visual (plain, text, block): выбираем блоки текста, копируем и вставляем потом
- Cmd: исполняем команды из командной строки
По умолчанию в Vim мод написан слева снизу, Вы можете входить в какие-то моды
i
для Insert, R
для Replace, v
для Visual (ещё можно Ctrl+V для блокового,
Visual), :
для Cmd мода. Выйти из мода на нормальный можно при помощи <ESC>
.
Нажимаем i
, пишем текст который надо, как в обычном редакторе. Можно хорошо
настроить так, чтобы не отличалось от написания кода в любом другом редакторе —
нормальный TAB, нормальное понимание табуляции, скобок и т.д.
Vim поддерживает набор открытых файлов, называемых "буферами". Vim сессия имеет несколько вкладок, каждая из которых имеет несколько окон (разделенных панелей). Каждое окно показывает единственный буфер. В отличие от других программ, с которыми Вы знакомы, таких как веб-браузеры, между буферами и окнами не существует однозначного соответствия. Буфер может быть открыт в нескольких окнах, даже в пределах одной вкладки. Это может быть очень удобно, например, для одновременного просмотра двух разных частей файла. Не напоминает немного tmux из прошлой лекции?
По умолчанию Vim открывается с одной вкладкой, содержащей одно окно.
В vim есть мод Cmd, в котором Вы пишете команды для самих окон, панелей и
вкладок. Чтобы войти в мод, надо написать :
. Самые популярные из них:
:q
выйти (закрыть ровно одно окно), чтобы закрыть всё —:qa
, выйти без сохранения —:q!
:w
сохранить ("write"):wq
сохранить и выйти, также часто используют:x
:e
открыть файл в новом окне:ls
открыть все буферы (файлы):help
{topic} открыть help:help
:w
открыть help для команды:w
:help
w открыть help для команды простоw
Вы должны проводить большую часть своего времени в нормальном режиме, используя команды движения для навигации по буферу. Движения в Vim также называются "существительными" (nouns), потому что они относятся к фрагментам текста.
- Базовое движение:
hjkl
(влево, вниз, вверх, вправо) - Слова:
w
(следующее слово),b
(начало слова),e
(конец слова) - Строки:
0
(начало строки),^
(первый непустой символ),$
(конец строки) - Экран:
H
(верх экрана),M
(середина экрана),L
(нижняя часть экрана) - Прокрутка:
Ctrl-u
(вверх),Ctrl-d
(вниз) - Файл:
gg
(начало файла),G
(конец файла) - Номера строк:
:
{number} или {number}G
(строка {номер}) %
(соответствующий элемент)- Поиск:
f
{символ},t
{символ},F
{символ},T
{символ}- найти / для перехода вперед / назад {символ} в текущей строке
,
/;
для навигации по матчам
- Поиск: / {regex}, n / N для поиска совпадений
v
или Ctrl+v
для входа, дальше просто навигация, выбор строк. y
(yank)
для копирования, p
для вставки (уже в Normal mode).
Все, что Вы раньше делали с помощью мыши, теперь должны делать с помощью клавиатуры, используя команды редактирования, которые объединяются с командами движения. Интерфейс Vim уже начинает выглядеть как язык программирования, правда? Команды редактирования Vim также называются "глаголами" (verbs), потому что глаголы действуют на существительные.
i
— вход в режим Insert- но для управления / удаления текста нужно использовать что-то большее, чем backspace
- o / O вставить строку ниже / выше
d
{движение} удалить {движение}- например
dw
— слово удаления,d$
— удаление до конца строки,d0
— удаление до начала строки
- например
c
{движение} изменить {движение}- например
cw
- изменить слово- как d{движение}, за которым следует i
x
удалить символ (равноdl
)s
замещающий символ (равноxi
)- Визуальный режим + манипуляция
- выделите текст,
d
, чтобы удалить его, илиc
, чтобы изменить
- выделите текст,
u
, чтобы отменить,Ctrl+r
, чтобы повторитьy
для копирования (некоторые другие команды, такие какd
, также копируют)p
вставить после курсора,P
до курсора
- Еще многое предстоит узнать: например,
~
переворачивает регистр символа
Например, чтобы поменять строку с нижней, стоит написать ddp
.
Также перед многими "глаголами" можно писать числа, например:
3dw
— удалить 3 слова3w
— переместиться на 3 слова10j
— переместить курсов на 10 строки вниз2u
— 2 undo
Также есть модификаторы, i
inside, a
around, например:
ci[
— поменять контент внутри квадратных скобокda'
— удалить всё внутри одинарной кавычки и её саму
:s
, а дальше всё как в sed с некоторыми особенностями:
:.,+2s/a/b/g
— заменить всё от текущей строки на +2 ниже:10,15s/a/b/gс
— заменить всё на строках 10-15 и спросить confirmation для каждого.:%s/abc/abcd/gci
— заменить везде с подтверждением и не обращать внимание на регистр: опцияi
Так как vim — это всегда про discoverability, нежели про написание кода, то здесь можно работать с панелями, которые можно открывать:
:sp
— горизонтальный split панелей того же файла, если есть аргумент, откроет другой файл:vsp
— вертикальныйCtrl+w h/j/k/l
— навигация по панелямCtrl+w +/-
— увеличение или уменьшение панели на 1 строку, перед знаком может быть числоCtrl+w </>
— увеличение или уменьшение панели на вертикальные столбцы соответственноCtrl+w _
— установка высоты, число пишется черезCtrl+w |
— установка ширины, число пишется черезCtrl+w =
— подстроить все панели равномерно под ширину дисплея
Это уже более продвинутая возможность, которая позволяет делать некоторые действия через набор команд. Почитайте о них здесь.
Vim можно кастомизировать через ~/.vimrc
. Можете скачать
дефолтный конфиг, который в разы лучше, чем стандартный с огромным количеством
комментариев.
Это ещё одна очень сильная точка для Vim. Очень много плагинов под разные языки, автодополнения, goto definition, pony plugins, code search, magic motions, и т.д.
set -o vi
для bash, bindkye -v
для zsh, для fish fish_vi_key_bindings
.
- Пройдите vimtutor
- Vim Adventures
- Vim Tips Wiki
- Vim Advent Calendar
- Vi/Vim Stack Exchange
- Vim Screencasts
- Practical Vim (книжка)
Этот редактор отличается от vim тем, что он имеет достаточно лёгкую навигацию, но всегда находится в Insert моде. Он славен тем, что имеет особенность множества курсоров — Вы можете выделить несколько строк и одновременно их менять.
Sublime Text также нацелен на очень высокую производительность, он умеет обрабатывать миллионы строк кода, делать достаточно неплохую goto definition по регулярным выражениям. Sublime Text имеет огромную кастомизацию. Все действия, которые делаются с vim возможны и здесь, просто чуть больше клавиш надо нажимать.
-
Ctrl+d
, чтобы выбрать строку по выделению и найти следующую,Ctrl+k
, чтобы пропустить -
Alt+F3
, чтобы найти все строки в файле и их заменить -
Ctrl+Shift+M
— выделить всё в скобках -
Ctrl+z
— undo,Ctrl+y
— redo -
Ctrl+shift+up arrow
— поменять строку с верхней местами -
Ctrl+k + Ctrl+u
— поменять выделенные символы в верхний регистр -
Ctrl+k + Ctrl+l
— поменять выделенные символы в нижний регистр -
Ctrl+left,rigght arr
— выделение налево или направо -
Ctrl+l
— выделить всю строку -
Ctrl+d
— выбор слова -
Ctrl+Alt+Space
— пометить строку для будущего прыжка по помеченным -
Ctrl+/
— комментирование выделенных строк в зависимости от языка и раскомментирование, если оно закомментировано -
Ctrl+[
— выделенные строки сместить вправо -
Ctrl+]
— выделенные строки сместить влево -
F9
— сортировка выбранных строк -
Alt+num
— прыгаем на num вкладку слева. И никакая мышка не нужна -
ctrl+BACKSPACE
— удаление слова назад -
ctrl+DEL
— удаление слова вперёд
И так далее и так далее. sublime нацелен на работу с блоками и похожими строками. Я лично заметил, что при работе с sublime мой код получается чище из-за того, что легко что-то поменять, какой-то блок закомментировать (что в Vim как минимум 6-7 команд). Код чище, так как я уже задумываюсь о том, как буду его менять в будущем и по регулярным выражениям или просто по уникальным именам его очень просто менять.
Sublime из коробки поддерживает индексацию кода и goto definition по регулярным выражениям. Умеет скрывать куски кода, которые Вам неинтересны и т.д.
В Sublime Text есть два console mode, один глобальный, другой на открытые папки и файлы:
Ctrl+P
— открыть консольный мод и можно выбрать файл по названию, умная сортировка sublime сама подскажет какой файл открывать. Также можно в текущем файле набрать:123
и это прыгнет на 123 строку текущего файла.Ctrl+Shift+P
— открытие глобальной консоли, где можно установить плагины и т.д.
В Preferences->Settings можно настроить конфиг. Вот несколько опций, которые мне сильно помогли в работе, увеличили продуктивность и убрали странные баги:
"rulers": # Линейки для отслеживания Вашего кода, превышают ли они определённый лимит
[
80,
120
],
"save_on_focus_lost": true, # Если теряем фокус на файл, он автоматически сохраняется
"trim_trailing_white_space_on_save": true # Убираем все пробелы в конце строк при сохранении
Sublime поддерживает очень удобную интеграцию с git, позволяет коммитить прямо из редактора, смотреть на диффы, ветки, визуализировать граф коммитов, но о git мы поговорим в следующей лекции.
(Моя личная рекомендация)Я встречаю много программистов, но более-менее стиль написания кода можно разделить на две примерные категории:
- Программисты, которые не будут писать код, пока у них в голове не сложится вся картина происходящего, все контракты функций будут соблюдены и т.д. Такие люди получают наибольший профит от Vim-подобных редакторов. Они действительно читают, правят какие-то комментарии, опечатки, пишут сигнатуры и только потом уже саму имплементацию. Я называю такой подход "снизу вверх" — смотрим на всё, делаем сразу хорошо.
- Программисты (как я), которые пишут прототип без понимания явных гарантий всех функций. У них workflow устроен так: написать код, посмотреть что не хватает, дописать, добавить параметр функции, добавить наследование, переименовать функции и повторить так десятки раз. Я такой подход называют "сверху вниз", пока не поймём зачем какая-то гарантия, не написав кода, мы её не напишем. Эти программисты получают от sublime text-подобных наиболее много профита в своей продуктивности из-за лёгкости переименования, пробования всяких разных экспериментов и легкого форматирования.
В целом, выбирайте что удобно, разобранные редакторы лишь показывают разницу в философии.
На лекции было много примеров, как что-то делать с помощью редакторов, смотрите запись.