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

Tip: Постарайтесь не торопиться, не получится взять всё и сразу, мы рабы своих привычек. Выработка или избавление от привычек — крайне сложный процесс, поэтому меняйте привычки — этот процесс проще. Меняйте вредные привычки на полезные. Получайте профит. Эта мысль будет проходить тонкой нитью через весь изложенный далее материал.

Prepare your tools

Давайте собирать всё необходимое! Хм, думаю мы возьмём даже чуть больше, чем нужно для просто выживания, будем выживать со вкусом :wink: Постарайтесь ничего не пропускать, так как ниже описываются тонкие моменты, которые будут сильно влиять на ваши дальнейшие отношения с vim.

Пост достаточно интерактивный, прочтение отдельно от запущенного vim особой пользы не нанесёт.

Install Vim

Для начала нужно как минимум установить vim. Даже если вы считаете, что у вас уже всё стоит — не стоит пропускать эту секцию. Скорее всего у вас стоит не vim, а vi, vim-minimal, ex, vim-tiny, да что угодно, только не полноценный, свежий vim. Поэтом найдите как установить свежую huge-версию с поддержкой большинства фичей для вашего дистрибутива. На ubuntu нужно ставить vim-nox, на мак нужно ставить vim или macvim из brew.

Можно юзать и то, что стоит по дефолту, но там будет работать далеко не всё из того, что мы будем использовать, лучше иметь версию посвежее и как минимум с поддержкой +python, +clipboard и прочими прелестями.

ubuntu$sudo apt-get install vim-nox

os-x$brew install vim --override-system-vim

Обладатели других дистрибутивов и операционных систем надеюсь справятся сами. А не справятся — значит, не очень-то и хотелось или рано ещё такими вещами заниматься.

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

Install Fonts

Поставьте хорошие моноширинные шрифты с поддержкой powerline-symbols. У меня нет каких-то конкретных предпочтений, но с недавнего времени я использую Ubuntu Mono, шрифт хорош тем, что он весьма компактен в плане ширины и его удобно использовать на 13” мониторе ноута.

Могу порекомендовать Anonymous Pro, Inconsolata. Но выбирайте на свой вкус, даже не обязательно из этого списка. Powerline-symbols дадут нам немного красоты в перспективе, поэтому было бы неплохо, чтобы они были. Не оставляйте дефолтный шрифт, он скорее всего будет ужасно убог, уважайте свои глаза и чувство прекрасного.

Vim использует шрифты терминала. Сразу оговорюсь, что под gvim я буду обобщённо подразумевать GUI-версию(MacVim, GVim, …). gvim использует переменную guifont, её обычно можно выставить через графическую менюшку или написать set guifont=Ubuntu\ Mono\ derivative\ Powerline:h14 в ~/.gvimrc

Configure Keyboard

Как же не поговорить о клавиатуре? Это же основной инструмент при работе с текстом. Меньше движений — больше действий. Руки должны оставаться всегда в удобном положении и минимально покидать home row. Это не только увеличивает эффективность, но и положительно сказывается на здоровье ваших запястий. Не подстраивайтесь под инструменты и “стандарты”, подстраивайте их под себя! Гните свою линию.

Layout

Не тяните legacy из девятнадцатого века, выбирайте что-нибудь более продуманное и удобное, нежели qwerty. Стоит ещё раз упомянуть, что я использую dvorak for programmers и вам советую, хотя и не настаиваю, в местах, где раскладка имеет значение я буду отдельно упоминать некоторые особенности. Почему дворак хорош можно почитать тут. Почему dvp, а не ANSI dvorak — там. Если будет много желающих узнать о моем опыте перехода, то напишу отдельный постик. Также из-за нестандартного расположения hjkl новaя раскладка сподвигла меня к изучению более мощных возможностей перемещения по тексту.

Caps Lock

Крайне настоятельно рекомендую разумно использовать Caps Lock: одиночное нажатие — Escape, удержание — Control. По жизни(а в vim и подавно) Esc и Control используются чаще Caps Lock, но при этом находятся на очень неудобных позициях, от слова совсем. Такой мапинг позволит переместить две очень важные клавиши на home row и сильно облегчит жизнь вам и вашим рукам.

Tip: Чтобы это сделать вам понадобится xcape и xmodmap или Karabiner под макось. Это будет полезно и в повседневной жизни, так что не пожалейте времени.

Prepare your mind

Помните, что with great flexibility comes great responsibility. Хочу заранее предостеречь вас от соблазна поставить сразу супермега конфиг с кучей плагинов — это wrong way. Не торопитесь — спешка ни к чему. Освоение должно происходить медленно, поэтапно, с набиванием шишек и осознанием того, что происходит на самом деле. Как в любой хорошей RPG с низкими рейтами, да и просто в жизни — нельзя получить всё и сразу.

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

Давайте для начала разберёмся с основами.

vimtutor

vimtutor — это простая утилита, поставляемая с vim, она позволяет скопировать один текстовый файл (учебник по основам vim на 20-30 минут, может чуть больше) и открыть этот файл непосредственно в редакторе. Если у вас всё более-менее с английским, то лучше запускать vimtutor en, там нет ошибок перевода :smirk: Настоятельно рекомендую пройти этот учебник, даже если вы его уже проходили. Именно пройти, а не прочитать. Не пытайтесь выучить всё, что там есть, со временем и при должном количестве усилий всё само придет.

Пропускать этот важный шаг ни в коем случае не стоит, даже если вы когда-то и проходили этот учебник, так как без основ далеко не уйдёшь. Мне важно, чтобы вы ознакомились со всей информацией, которая содержится там, мы начнем её использовать с минуты на минуту. Поэтому идем в терминал и вбиваем vimtutor, внимательно изучаем и осваиваем, а потом возвращаемся и дочитываем пост.

Write your own ~/.vimrc

Теперь мы знаем для чего нужен файл ~/.vimrc. У пользователей более экзотических операционных систем (например M$ Windows) этот файл может находиться в другом месте, но если они выбрали столь сложную ОС, то достаточно квалифицированы, чтобы самостоятельно разобраться с этим вопросом. Сейчас мы постараемся написать максимально независимый от окружения конфиг и выработаем некоторые принципы его написания. Вопросы управления плагинами, контроля версий конфига и его деплоя мы пока рассматривать не будем.

Ближайшая цель будет выглядеть примерно так (конечно, по скриншоту можно оценить только внешний вид, но и им не стоит пренебрегать): vim

Но в рамках данного поста мы не успеем её достичь. Сейчас мы будем закладывать основные принципы.

Copy-paste

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

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

Ладно, что я опять занудствую, давайте уже что-нибудь наконец-то напишем. Открываем файл на редактирование $vim ~/.vimrc, а если vim уже запущен, то просто пишем :e ~/.vimrc, переходим в режим INSERT и копируем туда следующий код:

"""""""""""""""""""""""
" MY MICRO VIMRC v0.1 "
"""""""""""""""""""""""
set nocompatible
set wildmenu
set keywordprg=:help
set ruler
colorscheme industry
" alternatives: slate desert
syntax on

:wq, вуаля. Вроде бы я сам себе противоречу, сначала говорю “ничего не копируй”, потом копируй. А всё дело в том, что в притче про рыбу и удочку предполагается, что голодный в состоянии ловить рыбу(не смертельно голоден). Так вот этот небольшой кусочек был нужен для того, чтобы дать сил на обучение рыбной ловле. Для интереса, через некоторое время закомментируйте все строчки в ~/.vimrc, а потом поделитесь впечатлениями и ощущениями :smiley:

Tip: На данном этапе - это самый большой кусок конфига, который вам можно скопировать или лучше перепечатать. Дальнейшее наполнение стоит осуществлять с помощью встроенной документации и только по мере необходимости. С опытом можно будет начать заимствовать решение ваших задач из конфигов других людей или с vim tips например. Но не поддавайтесь соблазну решить фантомные проблемы, пока вы реально с ними не столкнулись.

К слову о фантомных проблемах и преждевременной оптимизации, ну вот с чего вы взяли, что вам обязательно нужно дерево файлов? Потому что оно есть во всех крутых IDE? Вам нужна удобная навигация по файлам? С этой проблемой дерево файлов справляется плохо. Вам нужно видеть структуру проекта? Да, кажется, для этой задачи инструмент подходит, но возникает другой вопрос, а вы уже работаете над django-проектом в 20 приложений в vim и вам необходимо видеть его все его файлы и каталоги или всё-таки пока еще только пробуете редактировать простенькие скрипты на python или ruby?

Help me, plz!

Даже самым крутым парням из мира vim приходится просить о помощи. В одиночку, к сожалению, не выжить. Но прежде чем тратить драгоценное время более опытных собратьев, постарайтесь найти решение самостоятельно. Ваши товарищи, прежде чем отправить вас в это суровое путешествие, изложили многолетний опыт лучших из лучших в книге под названием :help. Только избранные могут прочесть книгу целиком. Простым же смертным книга открывает лишь малую часть знаний. Но и этого многим более чем достаточно.

Use the Help, Luke

Множество раз слышал, что в vim великолепная документация. Но до некоторого момента практически ею не пользовался и не ощущал всей её прелестности. А ведь даже просто её полистать, не вчитываясь — это крайне приятно. Как качественно она оформлена, как легко по ней передвигаться.

Some words about structure

На первой же странице :help рассказано, как получить конкретную страницу с тем самым содержимым, что вы ищете, как перейти к подробной информации об элементе под курсором, как вернуться обратно. Чуть ниже список самых базовых страниц, которые стоит посмотреть (quickref, tutor, …). Чуть ниже USER MANUAL, после идёт REFERENCE MANUAL, а там ещё одна секция для демонстрации функции перехода к элементу под курсором.

Обычно в блогах про вим автор постит здоровый кусок конфига, а потом комментирует его, либо говорит, что там все и так понятно. Но мы пойдём другим путём. Мы возьмём очень маленький, прям крохотный кусочек и попытаемся качественно расшарить его без гугления и прочих прелестей интернета.

Первый дельный совет за сегодня — откройте :help и просто походите по нему, не вчитывайтесь в что-то конкретное, просто “оглядитесь вокруг”. Это поможет сформировать в голове некоторое представление о структуре документации. Стоит потратить час, два, три, даже десять. Немного жалею о том, что не сделал этого, когда только начинал пользоваться vim. Рекомендую также почитать :h help, очень настоятельно рекомендую.

Теперь вы немного ориентируетесь в том, как устроена документация vim, можете открыть доку :h ^U, можете закрыть окно с помощью :q и перейти по “ссылке” и обратно (CTRL-], CTRL-O). Можете перемещаться вверх-вниз с помощью ^U, ^D, ^B, ^F. Прекрасно!

Case #1 /:help {subject}/

Давайте теперь попробуем вкурить, а зачем нам нужен set nocompatible первой же строчкой после комментариев. Самый простой способ — просто делаем :h set, читаем. Кажется всё просто. :set показать все опции отличающиеся от дефолтных, :set {option} включить опцию, :set no{option} — отключить, :set [no]{option}? — получить текущее значение, :set {option}={value} — выставить значение опции, если оно ожидается. С этим разобрались.

Теперь разузнаем про nocompatible. Абсолютно аналогичным образом делаем открываем страницу документации. Открывается страница о compatible, оно и логично, ведь no{option} имеет парную опцию и логично писать документацию про {option}. Читаем что-то там про обратную совместимость с vi. Видим портянку опций, которые выставляются в странные значения для максимальной похожести на vi, понимаем, что нам это вряд ли нужно. С чувством выполненного долга закрываем документацию.

Case #2 /K/

Открываем на редактирование ~/.vimrc. Если ещё не написано, то пишем set noco, нажимаем последовательно CTRL-X, CTRL-V. Магия! Сработало автодополнение, эта штука будет полезна при написании конфига. А что за странное сочетание и что оно делает? Давайте искать: :h i_^X. Ого, нам говорят куда посмотреть. Перемещаем курсор на ins-completion и жмём CTRL-] или K. Автодополнение — это отдельная большая тема, которой мы сейчас не будет касаться.

Tip: Используйте :h compl-vim при написани вашего конфига. Автодополнение работает как для команд, так и для аргументов. Это поможет избежать нелепых опечаток или подсказать какой аргумент вам нужен. Не стесняйтесь делать :h ^x^v.

Кстати говоря, а почему K? Хотя их поведение в данном случае совпадают, но эти хоткеи имеют разное значение. Опять же, в той же самой документации говорится про то, что при нажатии K выполняется программа, которая задаётся опцией keywordprg, которую мы выставили в ~/.vimrc(set keywordprg=:help). Обратите внимание, что режиме VISUAL поведение немного отличается. В качестве ключевого слова используется выделенный участок текста, а не строка удовлетворяющая паттерну iskeyword.

Теперь вернёмся

Case #3 /:helpgrep {pattern}[\c]/

А с чего мы вообще решили, что нам нужно писать set nocompatible? Честно? В своё время я просто у кого-то слямзил эту строчку из конфига. Но давайте копнём немного вглубь и поймём, откуда она появилась у первоисточника. А давайте покурим доки :smile: Давайте начнём со странного :copen. Что это? Думаю, вы уже в состоянии ответить на этот вопрос. А мы идём искать первоисточник :helpgrep set nocompatible. Откроется привычное окно помощи, но в окошке ниже появится несколько строчек в окне [QuickFix List].

Переключить фокус в это окно можно так: :copen и по Enter переходить в файл в то самое место, где нашёлся этот паттерн. Чтобы каждый раз не прыгать в это окошко, к следующему вхождению можно переходить по :cnext. Хочется заметить что в режиме команд(все что начинается с :) работает автодополнение по <Tab> и вызов предыдущих команд по ^P.

Шёл по коридору и услышал вопрос: а как сделать так, чтобы отображались непечатные символы, а точнее табы в vim. Не смог пройти мимо и ответил :set list. Что бы я делал, если бы забыл название опции? :helpgrep show tabs\c.

Case #4 /{pattern}/

А что там про set nocompatible спросите вы, мы так и не выяснили откуда мы это взяли. В предыдущем кейсе читатель с пытким умом наверняка получил ответ. Но мы ответим ещё раз на этот вопрос.

Собственно всё просто: :help /settings 0 K 3^F. Не забудьте посмотреть :h /, поиск используется в повседневной жизни очень часто.

Conclusion

Не торопитесь, то, что вас не устраивает, оптимизируйте, а решение обкатывайте и плавно переводите в привычку. Преждевременно не закладывайте на будущее, будьте ленивы, не стоит брать то, что вы вряд ли будете использовать. Это как заказывать вещи из Китая: всё такое необходимое, прям жить без этого нельзя, а потом валяется по квартире и пылится. И да, боксёрские перчатки в шкафу не делают вас сильнее, если регулярно не впахивать в зале.

За время написания поста накопилось много материала, следующий пост планирую посвятить структуризации конфига, а так же теме хранения, контроля версий и деплоя. Хотя с уверенностью сказать не могу, зависит от фидбека и будет точнее понятно уже по ходу написания.

Some sweets

Чуть-чуть расширенный ~/.vimrc:

"""""""""""""""""""""""
" MY MICRO VIMRC v0.2 "
"""""""""""""""""""""""
set nocompatible

set wildmenu
set wildmode=longest:full,full
set keywordprg=:help
set ruler

colorscheme industry
" alternatives: slate desert

set autoindent
set smartindent
set smarttab
set shiftround
set shiftwidth=4

syntax on
filetype plugin indent on