Добрый день,
Пытаюсь выполнить настройку NVim и не могу понять, где допускаю ошибку. Если искать советы в интернете, то везде конфигурация сваливается в один или в лучшем случае четыре файла с тонной кода без какого-либо разделения на отдельные модули (что и является ключевой фишкой NVim - гибкая настройка конфигурации, в отличии от Vim). При попытке разложить все по полочкам у меня почему-то блокируется <leader>
, происходит это во время привязки клавиш для «nvim-tree».
Ниже будут показаны ключевые моменты настройки конфигурации.
Структура директории .config/nvim:
lua/
config/
plugs/
nvim-tree.lua
system/
editor.lua
general.lua
themes.lua
ui.lua
init.lua
keymaps/
plugs/
nvim-tree.lua
system/
editor.lua
filesys.lua
window.lua
init.lua
plugs/
nvim-tree.lua
utils.lua
init.lua
config - системные настройки(system) назначенные через vim.opt
и отдельные для каждого плагина (plugs). Файл init.lua создан для удобства добавления всех настроек (кроме плагинов, так как они подгружаются в lazynvim
):
-- config/init.lua
require("config/system/general")
require("config/system/editor")
require("config/system/themes")
require("config/system/ui")
keymaps - аналогично предыдущему только исключительно для сочетаний клавиш
utils.lua - вспомогательные функции, на данный момент там только определение для 4 режимов привязки клавиш:
-- utils.lua
function normal_mode(key, cmd, opts)
opts = opts or { noremap = true }
kmap('n', key, cmd, opts)
end
function insert_mode(key, cmd, opts)
opts = opts or { noremap = true }
kmap('i', key, cmd, { noremap = true })
end
function visual_mode(key, cmd, opts)
opts = opts or { noremap = true }
kmap('v', key, cmd, { noremap = true })
end
function term_mode(key, cmd, opts)
opts = opts or { noremap = true }
kmap('t', key, cmd, { noremap = true })
end
init.lua - содержит включение базовых настроек и загрузку lazynvim
с импортом используемых плагинов:
--lua/init.lua
require("config")
require("keymaps")
-- Установка менеджера для плагинов - LazyNVim
local root_dir = vim.fn.stdpath("data") .. "lazy/lazy.nvim"
if not(vim.uv or vim.loop).fs_stat(root_dir) then
local src = "https://github.com/folke/lazy.nvim.git"
local dest = vim.fn.system({
"git", "clone",
"--filter=blob:none", "--branch=stable",
src, root_dir
})
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo(
{
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ dest, "WarningMsg" },
{ "\nPress any key to exit..."},
}, true, {}
)
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(root_dir)
-- Загрузка плагинов
require("lazy").setup({
{ import = "plugs/nvim-tree"},
})
<leader>
указывается в config:
-- config/system/general.lua
local g = vim.g
local opt = vim.opt
g.mapleader = " "
g.maplocalleader = "\\"
opt.clipboard = "unnamedplus"
opt.ignorecase = true
opt.smartcase = true
opt.incsearch = true
opt.hlsearch = true
opt.wrapscan = true
opt.inccommand = "split"
Спеки плагинов лежат в соот. папке plugs/[имя_плагина]
:
-- plugs/nvim-tree.lua
return {
"nvim-tree/nvim-tree.lua",
dependencies = {
"nvim-tree/nvim-web-devicons"
},
config = require("config/plugs/nvim-tree"),
}
Настройки плагина лежат в соот. папке в разделе config/plugs/[имя_плагина]
:
-- config/plugs/nvim-tree.lua
--я в lua не спец, но ошибку на возврат функции без имени не выдает
return function()
require("nvim-tree").setup({
view = { width = 30 },
filters = { dotfiles = false },
git = { enable = true },
actions = {
open_file = { quit_on_open = true },
},
hijack_netrw = true,
on_attach = require("keymaps/plugs/nvim-tree"),
})
end
Настройки сочетания для плагина лежат в соот. папке в разделе keymaps/plugs/[имя_плагина]
:
-- keymaps/plugs/nvim-tree.lua
return function(bufnr)
require("utils")
local api = require("nvim-tree.api")
local help = api.tree.toggle_help
local open = api.node.open.edit
local collapse = api.node.collapse
local collapse_all = api.tree.collapse_all
local node_root = api.tree.change_root_to_node
local parent_root = api.tree.change_root_to_parent
local info = api.node.show_info_popup
local refresh = api.tree.reload
local function opts(desc)
return {
desc = "nvim-tree: " .. desc,
buffer = bufnr,
noremap = true,
silent = true,
nowait = true
}
end
local function vsplit()
api.node.open.vertical()
api.tree.focus()
end
local function hsplit()
api.node.open.horizontal()
api.tree.focus()
end
normal_mode("<leader>tt", ":NvimTreeToggle<CR>")
normal_mode("?", help, opts("Show help"))
normal_mode("l", open, opts("Open node/file"))
normal_mode("h", collapse, opts("Collapse node"))
normal_mode("<C-l>", vsplit, opts("Open vertical split file"))
normal_mode("<S-l>", hsplit, opts("Open horizontal split file"))
normal_mode("<C-h>", collapse_all, opts("Collapse all node"))
normal_mode("<C-j>", node_root, opts("Change root to node"))
normal_mode("<C-k>", parent_root, opts("Change root to parent"))
normal_mode("<F1>", info, opts("Show info"))
normal_mode("<F5>", refresh, opts("Refresh tree"))
end