LINUX.ORG.RU

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

 


0

2

Добрый день.

У кого-нибудь есть опыт внедрения 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 (посредством получения дескриптора окна запущенного процесса и дальнейшего изменения стилей окна и т.д.), но не хотелось бы прибегать к такому подходу, так как придется вести сразу несколько реализаций для разных ОС.



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

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

А почему это нельзя сделать через ImGui?

в качестве MDI или всплывающего (Popup) окна … окно vim должно отображаться без заголовка и рамки

Почему это так важно? Хозяин, конечно, барин, но может оно не стоит того? Идти против абстракций системы всегда сложно.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 2)
Ответ на: комментарий от kaldeon

А почему это нельзя сделать через ImGui? Можно но все равно придется использовать API определенной ОС для переопределения стиля окна.

Почему это так важно? Хозяин, конечно, барин, но может оно не стоит того? Идти против абстракций системы всегда сложно. Это не то чтобы важно, просто в vim очень много полезных фич автодополнение в виде отдельно плагина, навигация по тексту + функции ex. В ручную все это реализовывать с нуля геморрой, особенно когда есть готовое решение в виде отдельного приложения, которое можно расширять при помощи дополнительных плагинов и настраивать под себя.

Идея была следующей, что по нажатию определенной клавиши запускается vim на отдельном –servername и создает файл в определенной папке (некий буферный файл который будет хранить всю информацию по вводу). По окончанию ввода выполнить команду :wq чтобы файл появился в папке. Приложение обнаруживает файл, считывает ввод, а после удаляет его.

p.s. хочется сделать popup или mdi окно для офисных приложений по типу Excel и LibreCalc, заменив тем самым стандартный ввод формул. При нажатии = офисный скрипт считывает ввод и передает в модуль на c++ данные. Модуль отображает всплывающее окно и после завершения ввода записывает формулу в ячейку.

Как-то так

mr_maldigo
() автор топика

Если что, neovim создавался в т.ч. с целью, чтобы его максимально безболезненно можно было встроить в любое приложение.

Но как это планировалось достичь и достигнуто ли было - я не знаю.

В любом случае, мотивация была такая, что сделать это в традиционном vim сложно.

Поэтому может стоить начать копать с neovim.

Chiffchaff
()
Ответ на: комментарий от moonmadness

Да, посмотреть как это реализовано в vscode-neovim или neovide, например

Почитал по поводу neovim и не раз встречал комментарии о том, что он страшно глбчный и что vim не особо отстаёт от своего конкурента в плане обновлений.

Нашёл ещё одну функцию Tohtml в vim - сохранение буфера в html.

Интересно на сколько тормозить будет если после каждого нажатие генерить html текст и передавать его в свою программу?

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

Почитал по поводу neovim и не раз встречал комментарии о том, что он страшно глбчный и что vim не особо отстаёт от своего конкурента в плане обновлений.

Можно хотя бы один пример? Пользуюсь neovim уже лет 6-7, ни разу не встречал ни одного глюка.

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

Можно хотя бы один пример? Пользуюсь neovim уже лет 6-7, ни разу не встречал ни одного глюка.

Ну например здесь встречал некоторые придирки к nvim:

nvim или vim

Я то не не против просто не особо хотелось бы пересаживаться с одного на другое, если в конечном итоге встраивание vim-а и там и там идентично и различается только описанием и количеством команд, т.е. запуск vim-а, удалённое подключение к нему и передача сообщений (возможно в формате html разметки, чтобы на клиенте отображать корректно подсветку синтаксиса и т.п.)

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

В этом топике куча какого-то нытья вида «понапридумывали нового, нас и старый vim устраивает». Реальных проблем я чё-т там не увидел. Только какое-то дедовское ворчание.

neovim лучше не потому, что он «neo», и типа стильный-молодежный, а потому что vim отстал от жизни, и автор при жизни не хотел никаких уже изменений, которые нужны в современной разработке.

Конфиги редактировать используя ограниченный набор hjkl - это одно дело. Конкурировать с IDE - требует уже поддержки многих вещей, которых нет в обычном vim.

Но дедам это не нравится, их всё новое раздражает просто по факту того, что оно новое.

Спроси на ЛОРе, например, зачем нужен докер, если хочешь, чтобы на тебя вылили ведро помоев. Хотя докер - это даже не новое, это технология, которой уже больше декады, а cgroups, на которых она основана, уже лет 20, не менее. Но для дедов недостаточно старая.

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

Сейчас вим ничем не хуже, кроме того, что экосистема плагинов стагнирует. Но с вездесущим LSP она и не нужна. Сейчас такие времена, когда редактор снова просто редактор, от него никаких чудес не требуется. Так что бурная деятельность авторов неовим ушла в песок, а вим просто работает и не требует никаких фреймворков для конфигурации с безумными портянками на луа.

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

neovim лучше не потому, что он «neo», и типа стильный-молодежный, а потому что vim отстал от жизни

И vim и neovim – прежде всего инструменты, решающие конкретные задачи. Есть задачи, при которых все улучшения и фичи neovim попросту не нужны. Точно так же, есть задачи, при которых фич vim-а не достаточно. Если человеку нужно по ssh поправить пару конфигов или отредактировать исходник на сишке, то ему нафиг не нужен новомодный neovim. Следовательно, то что ты считаешь отставшим от жизни, для некоторых является легковестностью и простотой. А то, что ты считаешь современными фичами – ненужным и неоправданным переусложнением.

Так что, каждому свое…

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

Ну например здесь встречал некоторые придирки к nvim:

nvim или vim

4 года назад. За это время там все очень сильно допилили. И в любом случае, если тебе нужен только базовый функционал, то он там и тогда работал без проблем.

Lrrr ★★★★★
()

Создавай файл заранее, например с mktemp. Потом стартуй процесс (n)vim, передав ему этот файл на редактирование. Основной интерфейс блокируй, пока жив запущенный процесс. При смерти процесса выгребай содержимое файла и разблокируй основной интерфейс. Управление окнами оставь системе. Железобетонно(1) и работать будет единообразно в любой ОС.

(1) на самом деле нет, так как редактируемый файл может быть подменён дважды - до запуска (n)vim и после его завершения. Это потенциальная проблема с безопасностью, если в твоём приложении это важно.

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

Перечитал ещё раз тему.

Из типа объективного:

  1. vim собирается на большем количестве платформ, чем neovim (возможно, да, что такое есть, и аффектит, наверняка, целых 0.0001% пользователей того и другого).
  2. Есть какие-то (не перечисленные конкретно) баги. Допустим, хотя это было 4 года назад, и автор баги не перечислил.
  3. Есть изменённое поведение :! команд, которое не всем нравится.
  4. Есть какие-то проблемы с запуском интерактивного терминала, к тому же, связанные со сторонним плагином. Ну… Даже не знаю, насколько я могу судить, пользователей, которые на 100% довольны функциональностью запуска терминала в консольном редакторе, нет. К тому же, здесь речь идёт о состоянии на 4 года назад, и о каком-то конфликте со сторонним плагином. Скорее всего, давно уже починено. Я редко пользуюсь терминалом в nvim, и ни разу глюков не видел.

Можно сказать, целая куча объективной критики (нет).

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

Решил все таки убить пару вечеров на настройку неовим. И мне очень понравился подход с lua. Все находится на своих местах, а не в одном файле, это прям очень круто.

Только столкнулся с проблемой настройки lsp сервера. У меня на ноуте стоит mint и он заканчивал старую версию 0.95 на что мне выдавало ошибку обновления до 0.10. Решил путем запуска команд:

  • sudo add-apt-repository ppa:neovim-ppa/unstable
  • sudo apt update
  • sudo apt install neovim

После встал неовим 0.13 помоему. В первой команде unstable потому что со стабильной версией по прежнему ставил 0.95.

Но потом начал выдавать такую ошибку:

  • neovim attempt to index global lspconfig (a nil value)

Вот код настройки lsp сервера и trersitter-а:

local kmap = require("keys/plugs")

return {

  { -- ПЛАГИН: Парсинг исходных файлов
    "nvim-treesitter/nvim-treesitter",
    build = ":TSUpdate",

    -- Описание
    --   * ensure_installed - проверить установленные парсеры
    --                        каждый парсер ставится отдельно
    config = function()
      local cfg = require("nvim-treesitter.configs")

      cfg.setup({
        esure_installed = { 
          "c", "cpp", "cmake",
          "lua", "vim", "vimdoc", 
          "css", "html", "javascript", "json", "xml"
        },

        sync_install = false,
        auto_install = true,
        highlight    = { enable = true },
        indent       = { enable = true},
      })
    end
  },
  
  { -- ПЛАГИН: LSP-сервер + автодополнение
    "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 }),
        })
      })

      local cfg = require("lspconfig")
      local cap = require("cmp_nvim_lsp").default_capabilities()
      local srvs = {
        "clangd",
        "lua_ls",
      }

      for _, lsp in ipairs(srvs) do 
        lspconfig[lsp].setup {
          on_attach    = kmap,
          capabilities = cap,
        }
      end 
    end 
  },
}

Что я делаю не так? Есть ли какой-нибудь гайд по настройке lsp сервера? cland точно стоит потому что в виме работает с coc-nvim. Если закоментить то все стартует нормально.

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

А что в «keys/plugs»?

Так-то сложно диагностировать. Теоретически всё выглядит ok, притом, что я не эксперт в lua.

Ещё надо смотреть на совместимость всех установленных пакетов с конкретной версией vim. М.б. там где-то несовместимость закралась. И заодно изучить, как диагностировать ошибки, чтобы посмотреть, где именно она происходит.

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

что по нажатию определенной клавиши запускается vim на отдельном –servername и создает файл в определенной папке

Так просто выполни команду $EDITOR path/to/file. Дальше два варианта:

  1. Ждать завершения команды, потом чекать path/to/file
  2. Повесить inotify на «path/to» и если есть «path/to/file» и по событиям проверяй через flock или fcntl, что больше нигде файл не открыт на запись.

И не надо лохматить бабушку.

bdrbt
()