DEV Community

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

Posted on • Edited on

Використання 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

Top comments (0)