vim_roadmap

Будучи студентом 42, сложно быть равнодушным к редактору Vim. Увы, боюсь что основные чувства большинства прошедших бассейн - всё же резко негативные. Vim - большая и сложная программа с уникальной концепцией (normal режим сам по себе по сути является языком программирования). Его невозможно нормально освоить в режиме буткемпа, когда ты должен разбираться с поинтерами и ежедневно выполнять кучу заданий. И даже из слов администрации можно сделать вывод, что вим подсунули лишь для страданий (мол вы большие молодцы вы проплыли бассейн и писали экзамены в виме, представляем как вы с этим задолбались лол). Словом, с подсовыванием вима в рамках бассейна я в корне не согласен.

Дело в том что Vim - хоть и старая но мощная программа с кучей возможностей. Ряд опытных разработчиков сознательно отказываются от IDE в пользу вима. Так что с ним всё обстоит не совсем так, как кажется среднему бассейнисту. Лично мне в некоторой степени повезло до бассейна, во время прохождения курсов на Hexlet, узнать об утилите из их статьи https://guides.hexlet.io/vim/

Там прямо говорится: "не стоит учить вим одновременно с тем, что вы собираетесь делать внутри него. Когнитивная нагрузка при изучении вима настолько высокая, что у вас не будет оставаться никакой энергии на изучение нового языка, фреймворка или, даже, программирования в целом"

Будучи нулевым в программировании, я подумал "окей не надо так не надо". Спустя время, записавшись на бассейн и прознав, что в 42 экзамены в виме, я решил что всё же стоит начать его изучать. Безусловно, это очень помогло на бассейне. Боюсь, точно бы утонул, если ко всему прочему на басике испытывал запары с редактором.

Для тех, кто хочет попробовать сменить гнев на милость и дать редактору второй шанс, предлагаю роадмап:

  1. Прочитать статью хекслета, которую скинул выше (часть статьи про плагины, а в частности, пакетный менеджер, кажется чуть устарела).

Меняем поведение клавиши caps lock на control. На маке делается просто в базовых настройках системы. На убунту можно установить Gnome Tweak Tool, там меняем маппинг (всё супер очевидно делается прямо в графическом интерфейсе). С такой настройкой из insert мода вима удобно выходить сочетанием клавиш ctrl(капс) [

  1. Проходим вимтутор. (В консоли набрать vimtutor)

Мне не очень нравится что там предлагают листать текст тупо клавишей j. (вместо control d или control f, например)

Это плохая привычка. Ну может на первых порах ок, чтобы запомнить hjkl

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

  1. лекция на англ от ребят из Массачусетского технологического:

https://missing.csail.mit.edu/2020/editors/

  1. довольно универсальные штуки из моего конфига, думаю можно смело копипастить

(настройки вима хранятся в файлике ~/.vimrc)

надо создать новый, если его нет

https://github.com/saugustu42/newbie_vimrc/blob/master/.vimrc

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

  1. Предлагаю вашему вниманию часть сочных комбинаций, которые конспектировал для себя. Сумбурно, но всё же:

^ значит контрол

CR значит энтер

ZZ выход с сохранением

ZQ выход без сохранения

использовать для перемещения по тексту зажатые hjkl - плохая привычка

^u (up), ^d (down) (по дефолту по полэкрана но можно передать сперва цифру кол-ва строк)

H Переместить курсор к верхнему краю экрана

M Переместить курсор к середине экрана

L Переместить курсор к нижнему краю экрана

z линия с курсором становится верхней

zz линия с курсором становится средней

z- линия с курсором становится нижней

number j

курсор прыг на number сток вниз или вверх

number k

`. перескакивает на то место в файле, где произошло последнее редактирование.

% прыгает между парными элементами (скобки, дефайны)

^ (на сей раз не контрол а реально символ ^)

Переместить курсор к первому непустому символу в строке

gi to restart insert in the last insert point

gv to reselect last selection

поиск по строке f{character}, t{character}, F{character}, T{character} заглавные - искать слева от курсора

find/to forward/backward {character} on the current line

, ; for navigating matches

например зачастую нажатие ff перекинет вас в строке прямиком к началу названия функции ft_


когда открыт какой-то файл, можно в вертикальном сплите открыть второй, набрав в виме :vs filename

ресайзить размеры спличенных окон удобнее всего перетаскивая линию разделителя окон мышкой (для этого в конфиге set mouse+=a)

дефолтные комбинации перемещения между спличенными окнами в виме удивительно наркоманские. перепрыгивать между окнами можно довольно удобно через ^h/j/k/l, если в вашем конфиге (также как в конфиге из четвертого пункта) прописано:

map <C-k> <C-w><Up>

map <C-j> <C-w><Down>

map <C-l> <C-w><Right>

map <C-h> <C-w><Left>

можно сразу через консоль открыть несколько файлов

vim file1 file2 file3 ... / vim *.c вим запустится с кучей буферов (невооруженным глазом их не видно) но есть команда :ls

:n листать к следующему буферу :previous назад

:wn сохранить изменения и листать / :wprevious

:n! :previous! без сохранения

ctrl ^ скачет туда-обратно между соседними позициями next и previous

флаг -O в консоли открыть несколько файлов в своих окнах, заспличенных вертикально vim -O file1 file2

:vnew :new открытие в сплите нового пустого файла

когда есть несколько заспличенных окон, :only оставляет лишь текущее

:qa выход из всех окон

:ls список буферов в памяти

:b <уникальная субстрока одного из названий файлов в буферах>

перескакивает в соответствующий буфер.

:ju открывает jumplist , историю перемещений своего рода

^o назад

^i или удобнее tab - вперёд

Прыжками назад через ^o например можно возвращаться после поиска /

перед командой как обычно можно указать число выполнений. например если в джамплисте :ju видим, что хотим сместиться на 15 шагов назад или вперёд:

15^o 15

Автодополнение в инсерт моде

^n вперёд ^p назад

after opening vim you can press Ctrl-o o to reopen last opened file

открываем пустой вим через команду vim в консоли и просто прыгаем назад в джамплисте


. repeats last command/combo (повторяет даже комбу где мы что-то insert.)

. это одна из самых полезных команд


number>> сдвигает number строк на один таб вправо (если надо на несколько, можно повторить команду точкой сколько нужно раз)


around / inner

daw delete around word.

The effect is to delete the current word include the surrounding whitespace in the text object

diw delete inside word.

The effect is to delete the current word from anywhere within it.

diW (W считает за слово ряд символов, обрамленных пробелами)

daW

ciw

или даже ci{ переписать всю функцию например


вместо d, чаще используется c (change). удаляет и переходит в insert

C change from cursor to end of line

cfx – изменяет все до первого появления символа ‘x’

опять же, можно указывать количество. 3сс удалить 3 строки и insert


  1. у вима прекрасная понятная документация. изучать её порой эффективней чем гуглить.

в случае непоняток с командой надо вызывать :h command

можно искать и для нормал мод и для других

например в виме :h i_^n расскажет про автодополнение именно в инсерт моде из-за 'i' перед '_'

Есть прямо в хелпе хороший user-manual. (Он большой). Углублять изучение вима планирую пока просто изучая его.

В виме заходим в :help

Немного пролистываем вниз (пары ^d по идее достаточно)

Видим абзац Getting started. В нём видим ссылку на файлик usr_01.txt

Устанавливаем курсор на эту ссылку (usr_01.txt)

Перемещаемся по ссылкам мануала либо ^] либо gf. Назад прыгнуть, соответственно, можно командой ^o

  1. о плагинах для Vim

Вимеры иногда злоупотребляют костылями в виде плагинов.

Вот хорошее видео "Как сделать 90% того, что делают плагины, в чистом Vim'е": https://thoughtbot.com/blog/how-to-do-90-of-what-plugins-do-with-just-vim

Мысль о том, что основная масса плагинов для Vim лишь воспроизводит встроенные возможность самого вима, также была встречена мной в переведённой на русский статье с hackernoon:

https://proglib.io/p/vim-what-i-wish-i-knew/

Мне вообще было крайне приятно почитать эту статью, тк там озвучена целая куча идей и практик, к которым я пришёл сам, рефлексируя в процессе работы в виме "а нет ли более оптимального способа сделать то, что я только что сделал?"

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

  1. к слову, вот тут хорошая (!довольно короткая!) инструкция как через гитхаб манагерить свои конфиги как .vimrc и .zshrc. Потому что лучше сразу обретать хорошие привычки и практики, а не узнавать спустя несколько лет что ты всё делал неудобно, когда есть хорошие способы

https://www.atlassian.com/git/tutorials/dotfiles

Незнание гита поможет устранить этот курс:

https://ru.hexlet.io/courses/intro_to_git

Он на русском и займёт пару неполных дней

В целом, на тему хороших практик и эффективного использования программистских tools, есть вот этот англ курс от mit:

https://missing.csail.mit.edu/

А также его русскоязычный аналог от ВШЭ:

https://t.me/hse_msemester_2020