Використання nvim як повноцінний редактор для коду. nvim 2 lecture
Tags: nvim, learning, ukrainian, textedit
Published: 2022-11-28 23:43:10

## Про що буде поточна стаття?
- Про плагіни та написання конфігурування налаштувань нвіму.
- Про буфери, вікна та split view.

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

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

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

Я розповім про варіант для налаштування використовючи `init.lua`. Мою перша рекомендація це заглядніть на [цей ресурс](https://learnxinyminutes.com/docs/lua/). Тут пояснять ази мови луа і ви дійсно за 10 хвилин можете їх осягнути.

Лук ап налаштувань відбувається за таким приорітетом.
1. `./init.lua` в корені папки `/nvim` сорситься автоматично, а вже файли із власними назвами – ні і їх потрібно імпортувати самостійно. При чому цей файл шукається в кожній піддирикторії, тобто в `/lua` також шукатиметься він.
2. `/lua`

```lua
-- це імпортує файл за локацією /lua/tima/options.lua
-- lua як директорію та як розширення писати не потрібно, воно зрозуміє
require 'tima.options'
```

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

```lua
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](https://github.com/wbthomason/packer.nvim).
1. Спочатку його потрібно інсталювати: інструкцію як це зробити ви можете знайти за посиланням в їхньому гітхабі.
2. Створюємо новий файл та імпортуємо його в основний `init.lua`
```lua
require 'tima.plugins'
```
3. В самому файлі додаємо ключову структуру:
```lua
return require('packer').startup(function(use)
	-- Packer can manage itself
	use 'wbthomason/packer.nvim'
	-- а тут ми вже будемо додавати плагіни за бажанням
end)
```
4. Шаримось по гітхабу і шукаємо що нам подобається. Коли знайшли то додаємо в список у нашому файлі викорситовуючи ключове слово `use` а далі в кавичках посилання без `github.com/`. Якщо не прибрати `github.com/` то також спрацює, але так виглядатиме акуратніше.
5. Переходимо в командний режим, тобто спочатку в нормал натискаючи `ESC`, а далі в командндий натискаючи `:`, пишемо команду `PackerSync`, натискаємо ентер і в нас все інстальовано.
6. * Також ви можете зробити так, аби щоразу при збереженні файлу `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>` при використанні [телескопу](https://github.com/nvim-telescope/telescope.nvim) відкриє знайдений файл в вертикальному спліт вʼю(Vertical)/в новій вкладці(Tab)
- `<leader>a` цей ремап використовую для [harpoon](https://github.com/ThePrimeagen/harpoon) і він додає файл в список харпуну. Харпун це геніальна тема для керування буферами і дозволяє буквально ЛІТАТИ поміж 4 файлів, над котрими ви працюєте в поточний момент. 
- `<c-u>` цей ремап відкриє список харпуну і його можна буде промодифікувати, наприклад, ви можете прибрати файл зі списку звичайним вім чином, тобто натиснути `dd`
- `<c-h>`/`<c-j>`/`<c-k>` цей ремап використовується власне для зміни топ 3 буферів. Чому саме ці букви обрані? Все просто, тому що саме ці букви розташовані під пальцями в стані спокою і це найбільш зручно для частого використання.
- `<leader>h`/`<leader>j`/`<leader>k`/`<leader>l` - перестрибнути на буфер зліва/знизу/зверху/справа

Ремапи, про котрі сказав в цій секції:
```lua
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>')
```