LINUX.ORG.RU

Настройка Nvim

 


0

1

Добрый день, Пытаюсь выполнить настройку 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



Последнее исправление: mr_maldigo (всего исправлений: 1)

что и является ключевой фишкой NVim - гибкая настройка конфигурации, в отличии от Vim

Нет, ключевой фишкой nvim являются тонны бойлерплейт-говнокода на Lua. А модульная конфигурация точно так же возможна и в Vim.

anonymous
()

гибкая настройка конфигурации

А в чём проблема сделать такое же в VIM? Например, мой vimrc:

function! s:loadConfigFiles()
  let path = $HOME . '/.vim/conf.d'
  let file_list = split(globpath(path, '*.vim'), '\n')
  for file in file_list
    execute 'source' fnameescape(file)
  endfor
endfunction


call s:loadConfigFiles()

И «фишка» NVIM исчезает, остаются мегатонны lua кода, который ещё и отваливается от версии к версии, вот как lspconfig пришлось переделывать, чтобы он не срал «blah-blah will be deprecated in the next version blah-blah» на весь экран при каждом запуске.

anonymous
()
Ответ на: комментарий от rtxtxtrx

Ну у меня <leader> задается до импорта плагинов, а точнее до загрузки lazy:

--lua/init.lua
  require("config")   -- <<<<<<< тут назначается <leader>
  require("keymaps")  -- <<<<<<< определение системных сочетаний клавиш (без учета плагинов)

  --[[
    
    ... установка lazy

  ]]

    -- Загрузка плагинов
  require("lazy").setup({
    { import = "plugs/nvim-tree"},  -- <<<<<<< тут загружаются сочетания клавиш для конкретного плагина 
    
    -- ПРОЧИЕ плагины
  })

Или я что-то делаю не так?

mr_maldigo
() автор топика
Ответ на: комментарий от rtxtxtrx

это то о чем я писал:

Если искать советы в интернете, то везде конфигурация сваливается в один или в лучшем случае четыре файла с тонной кода без какого-либо разделения на отдельные модули (что и является ключевой фишкой NVim - гибкая настройка конфигурации, в отличии от Vim).

А хотелось бы разделить базовые настройки на более мелкие подсистемы по типу «работа с текстом», «работа с окнами», «настройки поиск» и т.д. и отдельные файлы с настройками для плагинов. Причем отделить конфигурацию от привязки клавиш, так как в случае сваливания все в один файл получается каша и тогда не понятно зачем вообще их разделять на файлы и отдельные подмодули.

Соответственно я пытался выносить отдельно <leader> прямо в lua/init.lua и все равно <leader> не работает, если я делаю привязку клавиш для nvim-tree:

  -- config/plugs/nvim-tree.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

Соответственно require("keymaps/plugs/nvim-tree") возвращает функцию:

  -- keymaps/plugs/nvim-tree.lua
  
  return function(bufnr)  
    require("utils")
    local api = require("nvim-tree.api")

    --[[ Назначение собственных привязок для клавиш ]]

  end
mr_maldigo
() автор топика
Ответ на: комментарий от rtxtxtrx

К продолжению пред. сообщения. Например, возьмем твой гайд по настройке NVim Настройка Neovim/Nvim. Там представлена следующая структура каталога:

~/.config/nvim
├── init.lua
└── lua
    ├── configs
    │   ├── autocmds.lua
    │   ├── keymaps.lua
    │   ├── options.lua
    │   └── plugins.lua
    └── utils.lua

Как мне казалось, если в проекте определен файл с наименованием keymaps.lua он говорит о том, что в нем находятся настройки по управлению клавишами в NVim. А на самом деле он содержит часть сочетания клавиш, а другая часть располагается внутри plugs.lua, например тут параметр mapping:

  {
    "hrsh7th/nvim-cmp",
    dependencies = {
      'neovim/nvim-lspconfig',
      'hrsh7th/cmp-nvim-lsp',
      'hrsh7th/cmp-buffer',
      'hrsh7th/cmp-path',
      'hrsh7th/cmp-cmdline'
    },
    config = function()
      local cmp = require('cmp')
      cmp.setup({
        sources = {
          { name = 'nvim_lsp' },
          { name = 'buffer' },
        },
        mapping = cmp.mapping.preset.insert({
          ['<C-b>'] = cmp.mapping.scroll_docs(4),
          ['<C-f>'] = cmp.mapping.scroll_docs(-4),
          ['<C-Space>'] = cmp.mapping.complete(),
          ['<C-e>'] = cmp.mapping.abort(),
          ['<CR>'] = cmp.mapping.confirm({ select = true }),
        })
      })

      --[[ ПРОЧИЕ НАСТРОЙКИ ]]
  }

Соответственно получается некая двойственность у нас часть сочетаний лежит в keymaps.lua, а часть внутри плагинов, зачем тогда выделять отдельный файл keymaps.lua?

mr_maldigo
() автор топика
Ответ на: комментарий от mr_maldigo

да. ну там основные лежат. в плагинах тоже сочетания задаются тебя этот вопрос как-то не волнует… все формально, все условно, а разбивать большие файлы на кучу маленьких - чисто программистский подход, вырабатываемый годами

rtxtxtrx ★★★
()
Ответ на: комментарий от rtxtxtrx

Оказывается <leader> работал. Не работал вызов nvim-tree через <leader> так как он находился внутри функции on_attach и соответственно не был доступен глобально. Исправил немного файл для сочетания клавиш и все заработало.

Файл определения сочетаний клавиш:

-- keymaps/plugs/nvim-tree.lua

normal_mode("<leader>tt", ":NvimTreeToggle<CR>") -- <<<<< 
определить сочетание для вызова через <leader>

return {
  on_attach = function(bufnr)
  [[-- Переопределяем привязки клавиш ]]
}

Файл с настройками плагина:

-- config/plugs/nvim-tree.lua

local kmaps = require("keymaps/plugs/nvim-tree") -- <<<<<< подгружаем сочетания клавиш
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 = kmaps.on_attach, -- <<<<<< добавляем локальные привязки клавиш 
  })
end

Файл для импорта плагина в lazy:

-- plugs/nvim-tree.lua

return {
  "nvim-tree/nvim-tree.lua",
  
  dependencies = {
    "nvim-tree/nvim-web-devicons"
  },
  config = require("config/plugs/nvim-tree"),
}

Основной файл конфигурации nvim:

--  nvim/init.lua

-- [[ здесь загружаем Lazy ]]

-- Загрузка системных настроек
require("config")
require("keymaps")

-- Загрузка плагинов
require("lazy").setup({
  spec = {
    { import = "plugs/nvim-tree"},
  },
})

mr_maldigo
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.