Використання nvim як повноцінний редактор для коду. nvim 2 lecture
Tymofij
Posted on November 28, 2022
Про що буде поточна стаття?
- Про плагіни та написання конфігурування налаштувань нвіму.
- Про буфери, вікна та split view.
Плагіни та налаштування
Налаштування
Є 2 основних способи налаштувань нвіму:
- За шляхом
~/.config/nvim/init.vim
створюєте файлinit.vim
. Отже конфігурація відбувається за допомогою вімскрипту. В такому випадку, все зберігається в одному файлі. Переваги: оскільки цей спосіб початково був єдиним то в гітхабі є більше прикладів і це може бути корисно для натхнення. Недоліки: вімскрипт є своєрідною мовою і він не схожий на ті, що ви вже знаєте. - За шляхом
~/.config/nvim/init.lua
створюєте файлinit.lua
. В такому випадку конфігурація відбуватиметься мовою луа, що є досить схожою на сучасні мови програмування і має функціонал по типу імпорту файлів. Переваги: більш чистий вигляд файлу; більші можливості по налаштуванню, оскільки саме цю мову використовують для налаштувань плагінів. Недоліки: менше контенту із прикладами таких налаштувань.
Я розповім про варіант для налаштування використовючи init.lua
. Мою перша рекомендація це заглядніть на цей ресурс. Тут пояснять ази мови луа і ви дійсно за 10 хвилин можете їх осягнути.
Лук ап налаштувань відбувається за таким приорітетом.
-
./init.lua
в корені папки/nvim
сорситься автоматично, а вже файли із власними назвами – ні і їх потрібно імпортувати самостійно. При чому цей файл шукається в кожній піддирикторії, тобто в/lua
також шукатиметься він. -
/lua
-- це імпортує файл за локацією /lua/tima/options.lua
-- lua як директорію та як розширення писати не потрібно, воно зрозуміє
require 'tima.options'
Мої налаштування вставлю в наступному абзаці у вигляді коду, аби було зручно копіювати. Кожен параметер має короткий опис за коментарем.
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
Плагіни:
Для зручності використовують менеджер плагінів, наприклад, packer.
- Спочатку його потрібно інсталювати: інструкцію як це зробити ви можете знайти за посиланням в їхньому гітхабі.
- Створюємо новий файл та імпортуємо його в основний
init.lua
require 'tima.plugins'
- В самому файлі додаємо ключову структуру:
return require('packer').startup(function(use)
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- а тут ми вже будемо додавати плагіни за бажанням
end)
- Шаримось по гітхабу і шукаємо що нам подобається. Коли знайшли то додаємо в список у нашому файлі викорситовуючи ключове слово
use
а далі в кавичках посилання безgithub.com/
. Якщо не прибратиgithub.com/
то також спрацює, але так виглядатиме акуратніше. - Переходимо в командний режим, тобто спочатку в нормал натискаючи
ESC
, а далі в командндий натискаючи:
, пишемо командуPackerSync
, натискаємо ентер і в нас все інстальовано. - * Також ви можете зробити так, аби щоразу при збереженні файлу
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>')
💖 💪 🙅 🚩
Tymofij
Posted on November 28, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.