Я пишу это 20 апреля, и прошло ровно 300 дней с тех пор, как я отказался от VS Code ради Vim! На самом деле я искал не временную веху, а скорее совпадение с тем днем, когда мне снова захотелось появиться в моем Медиуме.

На самом деле я не придерживался Vim. Через месяц я перешел на NeoVim, который по сути является более элегантной вилкой Vim.

От неудобной мыши к «ограниченной» клавиатуре

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

При использовании VS Code, хотя у меня была вся эта визуализация контуров, вкладки, базовые операции Git, приятные расширения вроде GitLens; просто назвать чувство. Но я никогда не чувствовал, что мне удается делать то, что я хочу.

Я уверен, что у вас тоже есть несколько воспоминаний. Это происходит все время, когда вы редактируете свои файлы. Конечно, вы могли бы сделать это намного быстрее с помощью обычных сочетаний клавиш — Ctrl-Стрелка влево, пока не дойдете до слова, Ctrl-Shift-Стрелка влево, чтобы выделить текст и снова начать печатать — но давайте будем честными, когда у вас есть возможность просто использовать мышь, которая находится прямо рядом с вами, это будет вашим первым инстинктом.

Для меня это казалось неуклюжим. Мне всегда было неловко, когда я это делал, и я не знал почему, потому что думал, что это просто то, что есть… Пока это не так!

Добровольное ограничение

Когда вы впервые запускаете сеанс Vim, вы будете работать очень медленно. Вы не можете использовать мышь, привязки клавиш странные, нужно отслеживать, в каком режиме вы находитесь и что вы можете делать в каждом из них…

Там еще многому предстоит научиться, так что давайте постараемся. Как только вы поймете семантику действий, которые вы можете предпринять, все начнет казаться естественным.

Видишь, что я там сделал? Я подскочил к нужному слову и заменил его на другое, которое показывает больше волнения! Ради любопытства, это шаги, которые он предпринял после ввода всей строки:

  • <C-[> — Перейти в НОРМАЛЬНЫЙ режим;
  • Fb — Найти символ (b) перед курсором в текущей строке;
  • ciw — Изменить внутреннее слово (фактически стирая его и переходя в INSERT);
  • amazing — То, что я хотел напечатать.

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

Учиться усваивать знания

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

Делай это правильно, затем делай это быстро

Еще в 2020 году я печатал со скоростью 38 слов в минуту (слов в минуту), что немного ниже среднего — 40 слов в минуту. Меня это очень беспокоило. Я хотел печатать быстро… Просто чтобы печатать быстро.

Помня об этом, я начал практиковаться в keybr.com.

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

Своего рода улучшение для тех, кто был ниже среднего, верно? Но это было не так быстро, как вы думаете, на самом деле мне потребовалось более 4300 занятий за два месяца последовательных тренировок.

И как я туда попал? Секрет был в том, чтобы делать это медленно намеренно.

Но ты хотел ехать быстро! Зачем специально тормозить???

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

Анализируя приведенный выше график, вы можете видеть, что моя скорость набора текста быстро увеличивается в течение первых 500 или около того сеансов, а затем медленно улучшается в течение оставшихся ~ 3800 последующих сеансов.

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

Я бы не приблизился к этому, если бы не следил за своими шагами — я бы сгорел, пытаясь улучшить неправильные практики. Но к чему я вам все это рассказываю, когда эта статья о Vi-подобных редакторах?

Давайте посмотрим, что это за Vim…

Доверьтесь процессу, и вас не подведут

Когда я взял Vim, я проделал те же самые практики. Я прочитал кучу статей вроде Руководство для начинающих по FreeCodeCamp и имел под рукой всевозможные шпаргалки.

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

Эта фаза была заполнена учебными пособиями, экспериментами с плагинами, переназначениями и всякими вещами. Я узнал, что мне в нем понравилось!

Уважайте кривую обучения

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

Вместо этого я интегрировал его в свой рабочий процесс, когда делал небольшие изменения в файлах или около того. Изменение версии пакета? Без проблем!

Для нас, которые уже застряли на Vim в прошлом: я принял эти ситуации и начал писать свои сообщения о коммитах таким образом.

Эти шаги помогут вам освоиться в системе Vim Mode.

Может ли быть что-то лучше, чем Vim?

Как вы могли догадаться, Vim стал моим основным текстовым редактором в то время. VS Code был второстепенным, когда мне действительно была нужна скорость — к тому времени я еще не получал этих баффов скорости.

Vim — действительно старый текстовый редактор, что является еще одной проблемой для многих людей, которые думают о его внедрении. У меня всегда возникали странные проблемы с пробелами. Реализация подсветки синтаксиса Vim не так современна, как могла бы быть.

Ну, я немного испортил эту часть в начале, но… Давайте поговорим о NeoVim!

Гораздо лучшая отправная точка

NeoVim исправила все проблемы с Vim, не потеряв при этом своего очарования. Он имеет Treesitter для подсветки синтаксиса, конфигурации и плагины, написанные на Lua, и имеет более открытый подход по сравнению с обслуживанием Vim, что привело к гораздо более ускоренному общему улучшению.

Раздувание против минимума

У NeoVim есть много дистрибутивов, таких как LunarVim или LazyVim. Для многих это отличная отправная точка, поскольку она призвана ощущаться как полнофункциональная IDE или загруженный расширениями VS Code.

Я не знаю, круто это или нет, но я думаю, что начинать с них — плохая идея. Обычно они включают мышь из коробки и назначают общие привязки, такие как <C-s>, для сохранения. Звучит здорово в теории, но, в конце концов, вы просто снова застряли со старыми привычками.

Мы ожидаем, что новые вещи будут работать так, как мы привыкли. По сути, это то, что эти дистрибутивы пытаются сделать для вас. Это то, что делает большинство людей, переходящих с VS Code или IDE, при настройке конфигурации NeoVim.

Я не говорю, что я был свободен от этого. Несмотря на то, что мне никогда не нравились эти полнофункциональные дистрибутивы, при первой настройке конфигурации NeoVim я поместил NvimTree слева, а экземпляр терминала был закреплен внизу.

Мне не потребовалось много времени, чтобы избавиться от обеих этих постоянных панелей. Совсем недавно — после примерно 6 месяцев использования Neovim — это щелкнуло: я хотел избавиться от всего лишнего на своем экране.

Спуститесь в минималистскую конфигурацию NeoVim

Есть несколько веских причин для выбора более минималистского подхода к вашим конфигурациям.

Если вы заглянете в мою Историю Git конфигураций Neovim, то увидите две вещи:

  1. Я много настраиваю;
  2. Я удалял тонны плагинов.

За 300 дней мне пришлось использовать огромное количество плагинов. Barbar, nvim-tree, FTerm, nvim-autopairs — вот некоторые из них, которые попали в этот список.

Даже мои пользовательские ремапы сильно изменились. Раньше у меня были jk и kj в картах режима вставки, чтобы сбежать. Мне также нравились <A-<> и <A->> для перехода между вкладками. Я удалил все это. Но почему?

Использование NeoVim как (Vim)

Удобство воспроизведения уже известного опыта мешало мне по-настоящему познакомиться с привязками Vim.

Я старался максимально приблизить свои настройки к поведению Vim по умолчанию. Экранирование с помощью Esc или <C-[ надежно. Вкладки — когда я их использую — отлично подходят для навигации с помощью gt и gT.

Все те плагины, которые я упомянул — замечательные, кстати, — тоже были удалены. Мне действительно нужно было, чтобы все мои открытые буферы были на вкладках в верхней части экрана? Действительно ли мне нужно закрепленное файловое дерево?

Мы все научились любить эти вещи. Но они бесполезны. Для меня имеет смысл избегать их только сейчас. Я знакомлюсь с Netrw — встроенным файловым менеджером Vim — и мне это нравится. Вкладки стали моим способом одновременно отслеживать разные рабочие пространства.

Очевидно, что не все должно быть по умолчанию. Взгляните на мой файл упаковщика:

return require('packer').startup(function(use)
  -- Packer manages itself
  use 'wbthomason/packer.nvim'

  use 'nvim-lua/plenary.nvim'

  use 'nvim-lua/popup.nvim'
  use 'kyazdani42/nvim-web-devicons'

  -- Indentation markers
  use 'lukas-reineke/indent-blankline.nvim'

  -- Git wrapper
  use 'tpope/vim-fugitive'
  -- Git changes on sign column
  use 'lewis6991/gitsigns.nvim'

  -- Treesitter language parser
  use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' }
  -- Shows the context of the currently visible buffer contents
  use 'nvim-treesitter/nvim-treesitter-context'

  use 'ThePrimeagen/harpoon'

  -- Undo history tree
  use 'mbbill/undotree'

  -- Fuzzy finder
  use { 'nvim-telescope/telescope.nvim', tag = '0.1.x' }
  use { 'nvim-telescope/telescope-fzf-native.nvim', run = 'make' }

  -- Status line
  use 'nvim-lualine/lualine.nvim'

  -- Omni theme
  use { 'getomni/neovim', as = 'omni' }

  -- LSP
  use {
    'VonHeikemen/lsp-zero.nvim',
    branch = 'v2.x',
    requires = {
      -- LSP Support
      { 'neovim/nvim-lspconfig' }, -- Required
      {
        'williamboman/mason.nvim',
        run = function()
          pcall(vim.cmd, 'MasonUpdate')
        end,
      },
      { 'williamboman/mason-lspconfig.nvim' },
      { 'jose-elias-alvarez/null-ls.nvim' }, -- For ESLint
      { 'simrat39/rust-tools.nvim' }, -- For Rust
      { 'simrat39/symbols-outline.nvim' },

      -- Autocompletion
      { 'hrsh7th/nvim-cmp' },
      { 'hrsh7th/cmp-nvim-lsp' },
      { 'L3MON4D3/LuaSnip' },
    },
  }
end)

У меня есть своя доля плагинов. Для навигации между буферами я не хочу теряться, Гарпун — мой спутник. Телескоп для поиска очень специфических файлов просто великолепен. LSP Zero объединяет все мои языковые плагины в одном месте.

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

Еще одна вещь, которая мне нравится в моей настройке, это то, что я держу настройки NeoVim и Vim очень близко друг к другу. Я имею в виду, что .vimrc — это место, где я фактически делаю свои основные настройки и переназначения для них обоих, и просто получаю их из файла nvim/init.vim.

Почему все так просто?

До сих пор я показывал вам только свои настройки Vim и Neovim. У меня даже не был установлен VS Code на моей личной машине. Хотя на моей основной работе все немного по-другому.

Представьте, что вы младший разработчик, который только что устроился на свою первую работу, и ваш начальник открывает Vim, чтобы научить вас чему-то. Моя работа требует, чтобы я преподавал концепции и реализации своим коллегам. Часто для этого требуется показать им примеры кода.

Вы пропустите все, что он говорит, пока не поймете, что происходит, потому что это сбивает с толку тех, кто к этому не привык. Для этого я использую VS Code.

Но вот в чем загвоздка: я использую расширение VSCodeVim, так что я действительно могу чувствовать себя комфортно в своих привязках к Vim. Эти расширения являются довольно простыми реализациями Vim, но в основном они выполняют свою работу. Если бы у меня были все сумасшедшие переназначения в моей настройке, я бы потерялся при входе в VS Code.

Сначала я не подумал об этом настолько, что потерял счет тому, сколько раз я набирал jk для выхода из режима вставки, просто чтобы понять, что у меня здесь нет этой привязки.

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

Новый способ мышления

Я бразилец, поэтому английский — мой второй язык. Изучение Vim похоже на изучение нового языка. На начальном уровне вы пытаетесь связать значение слов нового языка со своим.

Итак, «привет» означает «ола», а «ты» означает «воче»…

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

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

  • ci< — Изменить внутренние угловые скобки (<>);
  • va{V — Выбор целой функции;
  • f(;di( — удалить все содержимое второго () в текущей строке.

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

Это не сильно отличается от обучения программированию. Когда вы начинаете изучать JavaScript, вы копируете все эти сложные слова, просто чтобы потом понять, что они делают.

После некоторой борьбы это становится естественным. Вы не будете искать «Как вставить элемент в массив». Вы уже делали это раньше, знаете, как работают массивы, и естественно приходит на ум метод .push.

Последние мысли

В итоге я больше говорил о Vim в целом, чем о NeoVim, которым я действительно пользуюсь. Я просто хотел рассказать вам о Vim в целом. Если вы собираетесь использовать Vim, NeoVim или даже IDE JetBrains с расширением Vim, решать вам.

Изучение Vim сделало кодирование экспоненциально приятным для меня. Мне нравится находить новые эффективные способы делать что-то — это похоже на изучение новых комбо в файтинге. Удовлетворение бесценно.

Если вы хотите присоединиться к культу Vim, я настоятельно рекомендую начать с таких руководств, как Learn Vim The Smart Way. Читайте, практикуйтесь, ищите больше контента. Это было очень ценно для меня, и я думаю, что это может быть и для вас.

Не стесняйтесь видеть конфигурации, которые я также использую:



Спасибо, что прошли мимо, и удачного кодирования!