Найти тему
Сделай игру

NVIM для разработчика (2)

Оглавление

Начало - тут.

С чего начинается редактор кода

Безусловно, редактор кода требует довольно много различных возможностей, но я попробовал разделить всё на несколько частей. То есть то, что именно мне нужно, чтобы начать. И я понял. Для начала мне нужно следующее:

  • Возможность восстанавливать набор открытых файлов;
  • Дерево файлов проекта с возможностью открыть любой или по выбранному файлу найти его в дереве;
  • Переключение между файлами во время редактирования;
  • Поиск текстового совпадения по файлам проекта с возможностью перейти в файл, в котором нашлось совпадение;
  • Переход по номеру строки (актуально, когда знаешь, где именно произошла ошибка);
  • Переход по названию функции (причём, нечёткий ввод с подсказками);
  • Открытие файла из глобальной папки, в том числе по нечёткому вводу пути и названия;
  • Подсветка синтаксиса;
  • Подсказка команд (автокомплит).

Это не то, чтобы прямо много, но с этого можно и начать. Далее задача - подобрать нужные плагины и установить их.

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

Чтобы включить достаточно набрать set setting

Чтобы отключить его - set nosetting

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

Восстановление текущих файлов

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

Для начала попробуем через стандартный подход - через сессии. При открытых окнах надо создать сессию (mksession или mks):

:mks session_file_name

Теперь, если запустить редактор так: nvim -S session_file_name - то все окна и их содержимое будет восстановлено.

Есть, правда, пара нюансов. Во-первых, дерево файлов (которое мы вместе установим позднее, а я его, конечно, уже опробовал) при таком открытии, если оно было отображено на момент закрытия редактора, работает не то, чтобы хорошо. Это лечится переоткрытием панели, но всё же. Во-вторых, несколько неудобно постоянно сохранять и восстанавливать сессии вручную. Однако, есть решение тут. Не самое лучшее, зато автоматизация!

Хотя можно использовать несколько дополнительных плагинов, восстанавливающих состояние, например https://github.com/mhinz/vim-startify или https://github.com/tpope/vim-obsession (до них, скорее всего, я доберусь, но несколько позже), я потестировал сохранение сессий. Должен заметить, что одним из плюсов является возможность сохранить сессию в любое удобное место и открыть откуда угодно. Нельзя сказать, что это прямо ну супер удобно, но вполне себе в рамках рабочего процесса. Если работаешь с одним проектом, можно в .bashrc можно прописать псевдоним (alias), позволяющий запустить работу над нужным проектом. Правда сессию придётся всегда сохранять вручную, или же использовать автоматизацию в настройках.

Кстати, если выполнить команду :mks, то сессия будет сохранена в текущей папке с именем Session.vim, что позволяет автоматизировать сохранения и восстановления, отвязавшись от случайных файловых имён, используя стандартные.

Дерево файлов

Для него мы будем использовать плагин NerdTree; не то, чтобы очень удобное дерево, но свою функцию выполняет. Для этого добавим в init.vim в самый конец:

call plug#begin('~/.local/shared/nvim/plugged')
" Дерево файлов
Plug 'preservim/nerdtree', {'on': 'NERDTreeToggle'}
call plug#end()

По сути, это просто описание установки плагинов. Дёшево и сердито. Обратите внимание на аргумент функции plug#begin: когда я настраивал в прошлый раз - он не потребовался; всё заработало, что называется "из коробки". Однако, в этот раз, редактор отказывался запускаться и выдавал ошибки. Вероятней всего - дело в версии. Просто имейте в виду, что аргумент (согласно документации) не обязателен, но в старых версиях без него может не работать.

Если вы ещё не установили менеджер плагинов - просто надо выполнить команду в командной строке (linux конечно же):

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

Теперь надо установить плагин. Для этого в командной строке пишем команду :PlugInstall

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

Процесс установки плагина NERDTree
Процесс установки плагина NERDTree

Теперь выполним 2 команды (первую - на всякий случай; более того, исходим из соображения, что мы находимся в папке ~/.config/nvim):

:source init.vim

Это позволит нам обновить плагины. Затем:

:NERDTreeToggle

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

Открытое дерево файлов
Открытое дерево файлов

Но этого недостаточно. Открывать и скрывать дерево, скорее всего, придётся довольно часто (экран не бесконечный), поэтому привяжем комбинации кнопок для того, чтобы показывать и прятать панель.

Для этого перед строкой call plug#begin... добавим следующие настройки (взял их из предложенных настроек, если что):

" если внутри окна дерева нажать n, то перейдём на самую верхнюю папку
nnoremap <leader>n :NERDTreeFocus<CR>
" ctrl+n для того, чтобы открыть дерево (я у себя эту настройку убрал)
nnoremap <C-n> :NERDTree<CR>
" ctrl + t для того, чтобы показать или скрыть дерево
nnoremap <C-t> :NERDTreeToggle<CR>
" ctrl+f, чтобы найти файл в дереве; я у себя заменил эту настройку на alt+f -> <A+f>
nnoremap <C-f> :NERDTreeFind<CR>

Обновим конфигурацию :source init.vim и попробуем сочетания клавиш.

Переключение между файлами во время редактирования

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

Несколько окон на экране
Несколько окон на экране

Как несложно заметить, в верхнем и правом-нижнем окнах - один и тот же файл. Притом, одинаково смещённый относительно начала. Это значит, что у нас есть 3 окна (фактически - 4, но левое - мы игнорируем, оно служебное) и 2 буфера. 1 буфер равно 1 открытый файл.

Буфер

Если набрать :h buffer - то можно увидеть справку о буфере, а если набрать :buffers, то можно увидеть список всех доступных буферов. У меня это так:

Доступные буферы
Доступные буферы

Как несложно заметить, каждому буфер соответствует номер и имя файла.

Наберите :new, чтобы создать новый буфер, поделив экран по вертикали или :vnew, чтобы поделить его по горизонтали. Это получится пустой файл, созданный в новом окне. На всякий случай напомню, как открывать и сохранять файлы:

  • :w filename? - сохранить файл с указанным или текущим именем
  • :e filename - открыть файл с указанным именем

Переключение буферов - приводит к отображению в нужном окне нужного буфера. Причём, если закрыть все (кроме одного, последнее не позволяет) окна (об этом немного позже) - все буфера останутся доступными.

Если набрать в командной строке :b и нажать tab, то (поскольку у нас включен автоподбор команд) будет выведен список доступных команд. Практически все команды, начинающиеся с маленькой b будут управлять буферами. Например:

  • :1b - то же что и :b 1 - включить буфер номер 1
  • bNext или bn - открыть в окне следующий буфер
  • bPrev или bp - открыть предыдущий буфер
  • badd - создать новый буфер

Если надо, можно очистить список доступных буферов:

  • :bd 1 - удалит первый буфер (номер по необходимости)
  • %bd - удалит все буферы (% - любой номер буфера, bd - сокращение от bDelete)
  • 1,2bd - удалит 1 и 2 буферы

Короче, буферы мы создавать, будем считать, умеем. Теперь же про окна.

Окна

Если буфер - это редактируемый файл, то окно - это то место, где мы его будем редактировать. Хоть с одного конца, хоть с двух. Очевидно, много окон у нас никогда не будет на экране, но всё же.

Если почитать справку, то вот что пишется про связку буфер-окно-вкладка (прочитать или перевести, полагаю, сможете):

  • A buffer is the in-memory text of a file.
  • A window is a viewport on a buffer.
  • A tab page is a collection of windows.

Есть несколько комбинаций клавиш, которые позволяют управлять окнами. А именно: делить окно на несколько окон, переключаться между ними, менять размеры. Если набрать :h wincmd будет выведен список комбинаций клавиш, позволяющих управляться с окнами. Я же рассмотрю лишь несколько:

  • Ctrl+w, стрелка направления- переключиться на окно в соответствующем направлении
  • Ctrl+w+n - создать новое окно
  • Ctrl+w+s - поделить окно по вертикали пополам
  • Ctrl+w+v - поделить окно по горизонтали пополам
  • Ctrl+w+c - закрыть окно
  • Ctrl+w+x - поменять окна местами
  • Ctrl+w+r - сдвинуть окна (как на карусели... это надо просто попробовать)
  • :resize 30 или :res 30 - изменить высоту окна (на 30 знакоместа)
  • :vertical resize 10 или :vertical res 10 - изменить ширину окна (на 10 знакомест)
  • ctrl+w+_ - предельная высота окна
  • ctrl+w+| - предельная ширина окна

Про окна, вроде, всё.

Вкладки

:tabs - позволит просмотреть доступные вкладки, :tabnew создаст новую вкладку, :tabNext включат следующую вкладку, а :tabprevious - предыдущую. :tabclose - закроет. Тут останавливаться не будем.

Подведём промежуточный итог: управляться с файлами внутри редактора мы уже научились. Осталось немного поупражняться. Впереди - самые интересные пункты.

Продолжение тут.