LINUX.ORG.RU

Сообщения mr_maldigo

 

NVim сочетания клавиш

Форум — Development

Добрый день, Как наиболее компактно разместить сочетания клавиш в одном файле, где будут указаны базовые команды (перемещение, работа с окнами и т.д), а также отдельно команды для всех плагинов.

Дополнительно поставил плагин which-key, чтобы отображать доступные команды и попробовал запихнуть все в один файл с вызовом require(«имя_плагина») для доступа к его функциональности, но при запуске получил куча ошибок.

Как у меня выглядит файл настройки привязок клавиш:

local which_key = require("which-key")

local operators = {
  mode = { 'n', 'x' },
  { "g",  desc = "Другое (G)" },
  { "z",  desc = "Другое (Z)" },
  { "!",  desc = "Выполнить" },
  { "<",  desc = "Сдвинуть влево" },
  { ">",  desc = "Сдвинуть вправо" },
  { "v",  desc = "Выбрать" },
  { "V",  desc = "Выбрать строки" },
  { "c",  desc = "Изменить" },
  { "d",  desc = "Удалить" },
  { "gU", desc = "Регистр (верх.)" },
  { "gu", desc = "Регистр (нижн.)" },
  { "g~", desc = "Регистр (обрт.)" },
  { "gw", desc = "Форматировать" },
  { "r",  desc = "Заменить" },
  { "y",  desc = "Копировать" },
  { "~",  desc = "Изменить регистр" }, 
  { "]",  desc = "Область (вперед)" },
  { "[",  desc = "Область (назад)" },
  { "zf", desc = "Создать вкладку" },
}

-- Далее определяю базовые команды для перемещения и т.д.

-- Для плагинов получается только так, соот. сочетания специфичные для работы внутри плагина приходится определять в его спеке
local filesys = {
  preset = true, 
  mode = { 'n', 'x' },
  { "<c-f>",  group = "Файлы" }, 

  { "<c-f>t", "<CMD>NvimTreeToggle<CR>",       desc = "Показать проводник" },
  { "<c-f>f", "<CMD>Telescope find_files<CR>", desc = "Выполнить поиск по файлам" },
  { "<c-f>g", "<CMD>Telescope live_grep<CR>",  desc = "Выполнить поиск по содержимому файлов" },
  { "<c-f>b", "<CMD>Telescope buffers<CR>",    desc = "Выполнить поиск по буферу" },
  { "<c-f>?", "<CMD>Telescope help_tags<CR>",  desc = "Выполнить поиск в справочных материалах" },
} 


-- Добавляю их в which-key
which_key.add(operators)
which_key.add(navigation)
which_key.add(motions)
which_key.add(other_g)
which_key.add(other_z)
which_key.add(windows)
which_key.add(filesys)

Ну и в init.lua после загруки lazy добавляю require("keymaps").

Было бы конечно круто если можно было для привязки вообще не вызывать функции which-key, а создать только имена для групп, а он в свою очередь распростронял бы их на уже существующие сочетания клавиш.

Может у кого есть готовые конфиги, покидайте плиз.

 

mr_maldigo
()

Настройка Nvim

Форум — Development

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

Vim: интеграция в собственное приложение

Форум — Development

Добрый день.

У кого-нибудь есть опыт внедрения vim в собственное приложение в качестве MDI или всплывающего (Popup) окна?

На просторах интернета нашел описание для флага -P: vim.exe -P "Заголовок окна" --servername MDIVIM

Однако у меня на Linux-е выдает ошибку, что в данной версии vim такая функция отсутствует.

Пробовал при помощи запуска vim с флагом --servername и последующим вызовом --remote-send [input], но здесь другая проблема - vim виден как полноценное окно с рамкой, заголовком и кнопками закрыть, свернуть и перейти в полноэкранный режим.

Соответственно хотелось бы достичь следующего результата:

  • выполнить запуск vim
  • перевести его на отдельный --servername, чтобы не засорять эфир
  • окно vim должно отображаться без заголовка и рамки

Собственное приложение пишется на C/C++ с использованием ImGui + GLFW + OpenGL / Vulkan.

p.s. Работать с окнами при помощи API системы умею только в Windows (посредством получения дескриптора окна запущенного процесса и дальнейшего изменения стилей окна и т.д.), но не хотелось бы прибегать к такому подходу, так как придется вести сразу несколько реализаций для разных ОС.

 

mr_maldigo
()

RSS подписка на новые темы