DEV Community

Cover image for Використання nvim як повноцінний редактор для коду. nvim 2 lecture
Tymofij
Tymofij

Posted on • Edited on

4 1

Використання nvim як повноцінний редактор для коду. nvim 2 lecture

Про що буде поточна стаття?

  • Про плагіни та написання конфігурування налаштувань нвіму.
  • Про буфери, вікна та split view.

Плагіни та налаштування

Налаштування

Є 2 основних способи налаштувань нвіму:

  1. За шляхом ~/.config/nvim/init.vim створюєте файл init.vim. Отже конфігурація відбувається за допомогою вімскрипту. В такому випадку, все зберігається в одному файлі. Переваги: оскільки цей спосіб початково був єдиним то в гітхабі є більше прикладів і це може бути корисно для натхнення. Недоліки: вімскрипт є своєрідною мовою і він не схожий на ті, що ви вже знаєте.
  2. За шляхом ~/.config/nvim/init.lua створюєте файл init.lua. В такому випадку конфігурація відбуватиметься мовою луа, що є досить схожою на сучасні мови програмування і має функціонал по типу імпорту файлів. Переваги: більш чистий вигляд файлу; більші можливості по налаштуванню, оскільки саме цю мову використовують для налаштувань плагінів. Недоліки: менше контенту із прикладами таких налаштувань.

Я розповім про варіант для налаштування використовючи init.lua. Мою перша рекомендація це заглядніть на цей ресурс. Тут пояснять ази мови луа і ви дійсно за 10 хвилин можете їх осягнути.

Лук ап налаштувань відбувається за таким приорітетом.

  1. ./init.lua в корені папки /nvim сорситься автоматично, а вже файли із власними назвами – ні і їх потрібно імпортувати самостійно. При чому цей файл шукається в кожній піддирикторії, тобто в /lua також шукатиметься він.
  2. /lua
-- це імпортує файл за локацією /lua/tima/options.lua
-- lua як директорію та як розширення писати не потрібно, воно зрозуміє
require 'tima.options'
Enter fullscreen mode Exit fullscreen mode

Мої налаштування вставлю в наступному абзаці у вигляді коду, аби було зручно копіювати. Кожен параметер має короткий опис за коментарем.

local options = {
  backup = false,                          -- creates a backup file
  clipboard = 'unnamedplus',               -- allows neovim to access the system clipboard
  cmdheight = 1,                           -- more space in the neovim command line for displaying messages
  colorcolumn = '80',
  completeopt = { 'menuone', 'noselect' }, -- mostly just for cmp
  conceallevel = 0,                        -- so that `` is visible in markdown files
  fileencoding = 'utf-8',                  -- the encoding written to a file
  hlsearch = false,                        -- highlight all matches on previous search pattern
  ignorecase = true,                       -- ignore case in search patterns
  pumheight = 10,                          -- pop up menu height
  -- showmode = false,                        -- we don't need to see things like -- INSERT -- anymore
  smartcase = true,                        -- smart case
  smartindent = true,                      -- make indenting smarter again
  splitbelow = true,                       -- force all horizontal splits to go below current window
  splitright = true,                       -- force all vertical splits to go to the right of current window
  swapfile = false,                        -- creates a swapfile
  termguicolors = true,                    -- set term gui colors (most terminals support this)
  timeoutlen = 750,                        -- time to wait for a mapped sequence to complete (in milliseconds)
  undofile = true,                         -- enable persistent undo
  updatetime = 3000,                        -- faster completion (4000ms default)
  writebackup = false,                     -- if a file is being edited by another program (or was written to file while editing with another program), it is not allowed to be edited
  expandtab = true,                        -- convert tabs to spaces
  shiftwidth = 2,                          -- the number of spaces inserted for each indentation
  tabstop = 2,                             -- insert 2 spaces for a tab
  cursorline = true,                       -- highlight the current line
  number = true,                           -- set numbered lines
  relativenumber = true,                   -- set relative numbered lines
  numberwidth = 4,                         -- set number column width to 2 {default 4}
  -- signcolumn = "yes",                      -- always show the sign column, otherwise it would shift the text each time
  wrap = false,                            -- display lines as one long line
  scrolloff = 10,                           -- is one of my fav
  -- sidescrolloff = 8,
  -- guifont = "monospace:h17",               -- the font used in graphical neovim applications
}

vim.opt.shortmess:append 'c'

for k, v in pairs(options) do
  vim.opt[k] = v
end
Enter fullscreen mode Exit fullscreen mode

Плагіни:

Для зручності використовують менеджер плагінів, наприклад, packer.

  1. Спочатку його потрібно інсталювати: інструкцію як це зробити ви можете знайти за посиланням в їхньому гітхабі.
  2. Створюємо новий файл та імпортуємо його в основний init.lua
require 'tima.plugins'
Enter fullscreen mode Exit fullscreen mode
  1. В самому файлі додаємо ключову структуру:
return require('packer').startup(function(use)
    -- Packer can manage itself
    use 'wbthomason/packer.nvim'
    -- а тут ми вже будемо додавати плагіни за бажанням
end)
Enter fullscreen mode Exit fullscreen mode
  1. Шаримось по гітхабу і шукаємо що нам подобається. Коли знайшли то додаємо в список у нашому файлі викорситовуючи ключове слово use а далі в кавичках посилання без github.com/. Якщо не прибрати github.com/ то також спрацює, але так виглядатиме акуратніше.
  2. Переходимо в командний режим, тобто спочатку в нормал натискаючи ESC, а далі в командндий натискаючи :, пишемо команду PackerSync, натискаємо ентер і в нас все інстальовано.
  3. * Також ви можете зробити так, аби щоразу при збереженні файлу plugins.lua виконувалась інсталяція. Інструкція як це зробити доступна на їхньому гітхабі

Буфери/вкладки/split view

  • Буфер це будь який файл завантажений до оперативної памʼяті.
  • Вкладки це колекції буферів
  • Вкладки можуть мати split view

Йтимемо послідовно від найменшого до найбільшого:

Буфери

  • :ls це скорочення від :buffers і це покаже список всіх відкритих буферів
  • В цьому списку %a означає, що цей файл ми зараз переглядаємо. + означає, що ми маємо не збережені зміни. h показує, що файл прихований
  • :bp - buffer previous. Відкрити попередній буфер
  • :bn - buffer next. Відкрити наступний буфер
  • :bd - buffer delete. Видалити буфер
  • :b<num> відкриє буфер під обраним номером
  • :e! аби повернути буфер до стану, в котрому ви його відкрили в цій сесії нвіму.
  • :q - закриває всі буфери
  • ZZ - зберегти та закрити буфер

Split view

  • <c-w>v - спочатку затиснути контрол+w і згодом швидко натиснути на v відкриє вертикальний спліт із поточним файлом.
  • <c-w>s - спочатку затиснути контрол+w і згодом швидко натиснути на s відкриє горизонтальний спліт із поточним файлом
  • ZZ - оскільки спліт вʼю це просто відкритий поруч ще один буфер то його можна закрити використовуючи цю саму комбінацію.

Вкладки

  • :tabnew - відкрити нову вкладку
  • :tabclose - закрити обране вкладку
  • gt - go to next tab. Перейти до наступної вкладки
  • gT - go to previous tab. Перейти до попередньої вкладки
  • 0tabnew - відркити нову вкладку в позиції 0
  • tabmove - пересунути вкладку в останню позицію
  • tabmove -/+<num> - пересунути назад/вперед вкладку
  • tabmove <num> - пересунути на конкретну позицію під номером
  • :tabs - покаже назви файлів, що відкриті в різних вкладках
  • tabonly - закриє всі вкладки окрім поточної

ЩО із цього всього розмаїття Я ДІЙСНО ВИКОРИСТОВУЮ?

  • :tabnew
  • :tabclose
  • gt/tg
  • <c-v>/<c-t> при використанні телескопу відкриє знайдений файл в вертикальному спліт вʼю(Vertical)/в новій вкладці(Tab)
  • <leader>a цей ремап використовую для harpoon і він додає файл в список харпуну. Харпун це геніальна тема для керування буферами і дозволяє буквально ЛІТАТИ поміж 4 файлів, над котрими ви працюєте в поточний момент.
  • <c-u> цей ремап відкриє список харпуну і його можна буде промодифікувати, наприклад, ви можете прибрати файл зі списку звичайним вім чином, тобто натиснути dd
  • <c-h>/<c-j>/<c-k> цей ремап використовується власне для зміни топ 3 буферів. Чому саме ці букви обрані? Все просто, тому що саме ці букви розташовані під пальцями в стані спокою і це найбільш зручно для частого використання.
  • <leader>h/<leader>j/<leader>k/<leader>l - перестрибнути на буфер зліва/знизу/зверху/справа

Ремапи, про котрі сказав в цій секції:

vim.api.nvim_set_keymap("", "<Space>", "<Nop>", opts)
vim.g.mapleader = ' '  -- 'vim.g' sets global variables

local function map(mode, shortcut, command)
  vim.api.nvim_set_keymap(mode, shortcut, command, opts)
end

local function nmap(shortcut, command)
  map('n', shortcut, command)
end

-- for tabs
nmap('tn', ':tabnew<cr>')
nmap('tc', ':tabclose<cr>')
nmap('tg', ':tabprev<cr>')

-- better moving management:
nmap('<leader>h', ':wincmd h <cr>')
nmap('<leader>j', ':wincmd j <cr>')
nmap('<leader>k', ':wincmd k <cr>')
nmap('<leader>l', ':wincmd l <cr>')

-- harpoon:
nmap('<leader>a', ':lua require("harpoon.mark").add_file()<cr>')
nmap('<c-l>',':lua require("harpoon.ui").toggle_quick_menu()<cr>')

nmap('<c-n>',':lua require("harpoon.ui").nav_file(1)<cr>')
nmap('<c-e>',':lua require("harpoon.ui").nav_file(2)<cr>')
nmap('<c-i>',':lua require("harpoon.ui").nav_file(3)<cr>')
Enter fullscreen mode Exit fullscreen mode

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)