Путь конфигурации
Чтобы узнать путь до папки с конфигурацией nvim, можно ввести команду :echo stdpath('config')
NeoVim при инициализации смотрит на свой путь конфигурации. По этому пути он ищет файл init.lua
, который является точной входа в свою конфигурацию.
Сам по себе конфиг представляет из себя программу, на которую вим выполняет внутри себя.
.config > init.lua
print('Привет!')
Структура конфигурации
Структура конфигурации выглядит следующим образом:
init.lua
- наш стартовый bootstrap файлlua
- общая папка для всех конфигурацийlua/core
- ключевые вещи (цвета, маппинги, конфигурации)lua/plugins
- отдельные файлы для каждого плагина
Далее нам нужно создать файл с нашими базовыми конфигами в следующей папке:
lua / core / configs.lua
print("Configs!")
И теперь остаётся только импортировать модуль. Папка lua
будет установлена по дефолту
init.lua
require("core.configs")
Базовые настройки
Для изменения базовых настроек вима, нам нужно обращаться к таблице vim
. Все базовые настройки мы храним в configs.lua
.
lua / core / configs.lua
-- настройка номеров колонок
vim.wo.number = true
vim.wo.relativenumber = true
-- настройка поведения мыши
vim.opt.mouse = "a"
vim.opt.mousefocus = true
-- подключение к системному клиборду
vim.opt.clipboard = "unnamedplus"
-- описание табуляции
vim.opt.shiftwidth = 4
vim.opt.tabstop = 4
vim.opt.softtabstop = 4
-- другие настройки
vim.opt.scrolloff = 8
vim.opt.wrap = false
vim.opt.termguicolors = true -- поддержка полноцветного терминала
-- заполнение символов вима
vim.opt.fillchars = {
vert = "│",
fold = "⠀",
eob = " ", -- suppress ~ at EndOfBuffer
-- diff = "⣿", -- alternatives = ⣿ ░ ─ ╱
msgsep = "‾",
foldopen = "▾",
foldsep = "│",
foldclose = "▸",
}
Последнее поле fillchars
нужно для того нам, чтобы перезатереть дефолтные символы, которые рисует вим - в частности:
- чтобы перезатереть пустые строки
- чтобы нарисовать
Сочетания клавиш
Далее добавим альтернативные сочетания клавиш
leader
- это главная клавиша, которую мы используем для ключевых действий
<leader>
- вызов главной клавиши<CR>
- это обозначение завершения командыc
- этоctrl
s
- этоshift
Tab
- этоTab
Через =
мы перезаписываем сочетание, а через set
мы добавляем новое без перезаписывания старого
В set
мы передаём первым аругментом режим, вторым наше сочетание, а третьим то, какое мы дополняем
lua / core / mappings.lua
-- установка leader-клавиши в пробел
vim.g.mapleader = " "
-- биндим выход из режим на jj
vim.keymap.set("i", "jj", "<Esc>")
-- Устанавливаем сохранение файла с :w на leader+w
vim.keymap.set("n", "<leader>w", ":w<CR>")
Каждый наш записанный биндинг, мы сможем отследить в строке команды
Дальше нужно установить маппинги в инициализирующий файл
init.lua
-- Basic Config
require("core.configs")
require("core.mappings")
Split окон
Сплит окон позволяет нам расположить другое рабочее окно прямо в нашем
Для горизонтального разделения экрана, нужно воспользоваться :split
(или коротко :sp
). Для вертикального :vsplit
(или коротко :vsp
).
Перемещение между окнами: ctrl + w
+ j
(вниз), k
(вверх), h
(влево), l
(вправо).
Для упрощения навигации между окнами, можно забиндить возможность перемещения по ctrl + направление
. Чтобы забиндить перемещение, нужно обратиться к :wincmd
, через который можно так же переместиться на другое окно.
Деление экрана забиндим на |
и \
.
lua / core / mappings.lua
-- Навигация
vim.keymap.set("n", "<c-k>", ":wincmd k<CR>")
vim.keymap.set("n", "<c-j>", ":wincmd j<CR>")
vim.keymap.set("n", "<c-h>", ":wincmd h<CR>")
vim.keymap.set("n", "<c-l>", ":wincmd l<CR>")
-- Настройка деления экрана
vim.keymap.set("n", "|", ":vsplit<CR>")
vim.keymap.set("n", "\\", ":split<CR>")
Менеджер плагинов
Для того, чтобы у нас появилась возможность прокачивать наш конфиг более удобными методами и наполнять его плагинами сообщества, есть удобный инструмент для установки пакетов - lazy.nvim
lua / core / configs.lua
-- Bootstrap lazy.nvim
-- вся эта конструкция, при отсутствии на компьютере lazy.nvim, склонирует репозиторий с пакетом и установит его
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\nPress any key to exit..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)
-- Setup lazy.nvim
-- тут находится базовая настройка lazy.nvim
require("lazy").setup({
spec = {
{ import = "plugins" },
},
checker = { enabled = true },
})
Сразу после перезахода в вим, мы встретим ошибку, что плагины не были найдены. Сейчас нам нужно будет установить какой-нибудь плагин.
Располагать все плагины мы можем по документации lazy
в папке plugins
либо в init.lua
, либо в каждом отдельном .lua
файле
Теперь подтянем плагин gitsigns, который будет отображать нам изменения файла относительно того, что есть в git
Описать плагин мы должны по схеме lazy
, где:
- первый параметр - репозиторий плагина
- второй параметр - инициализация запуска, которую мы заносим в
function()
Как запускается каждый плагин, можно посмотреть в документации. У данного плагина установка описана тут (+ там указаны возможные параметры для конфиграции, которые мы можем передать в метод инициализации)
Так будет выглядеть финальный результат:
lua / plugins / gitsigns.lua
return {
{
"lewis6991/gitsigns.nvim",
config = function()
require('gitsigns').setup()
end
}
}
Плагин должен автоматически установиться после перезахода. Если это не произошло, то можно сделать это самостоятельно через вызов :Lazy
, где вверху будут отображаться команды установки, обновления, синхронизации и так далее.
Все установленные нами плагины записываются в файл lazy-lock.json
, который фиксирует определённые версии плагинов, занося название пакета, ветку и коммит
Тема
Далее попробуем установить тему.
lua / plugins / onedark.lua
return {
"navarasu/onedark.nvim",
config = function()
require('onedark').setup({
transparent = true
})
require('onedark').load()
end
}
Теперь у нас есть тема с такой подсветкой
За более продвинутую подсветку синтаксиса уже будет отвечать Treesitter
Иногда для подключения других тем нужно воспользоваться командой :colorscheme <тема>
, чтобы подключить тему