LINUX.ORG.RU

neovim + clangd

 , , ,


1

3

Привет. Решил посмотреть как там дела с данной связкой (ранне снес clangd из-за глючности, моет сейчас лучше). Слышал, что neovim начал нативно поддерживать LSP клиента. Ну ок, переписал свой конфиг на луа (боже, насколько же луа приятней vimscripta). Сначала настроил клиента напряму - вроде все норм, но нет signature help’a (подсказка с доступными перегрузками при написании вызова функции). Ладно думаю, что-то не докрутил. Настроил через рекомендованный самим clang’ом nvim-lspconfig - к моему удивлению опять нет нет signature help’a.

Что нужно для его появления? Нужно вкрутить еще это костыль? Может другой? А может я вообще зря взял nvim-lspconfig?

Как сейчас нынче модно получить нормально работающий nvim + clangd? Чтобы сходить туда, сюда, к определению, сигнатур хелп, больше в общем ничего и не требуется



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

Ответ на: комментарий от ox55ff

Ну vim далеко не блокнот, и иничего особенного я перетаскивать не собираюсь, это все есть у меня и сейчас с простым ctags. Но он слишком туп для плюсов, он все же сишный.

Шланг я раннее прикручивал к виму другим плагином (coc’ом), но эта дрянь тянет целый nodejs. Но все хотелки работали. Но вновь тянуть весь этот зоопарк костылей я не хочу

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

Использую: neovim/nvim-lspconfig, williamboman/mason.nvim, williamboman/mason-lspconfig.nvim

Для отображения контекста (особого смысла нет, но не мешает): ray-x/lsp_signature.nvim

andreyu ★★★★★
()

У меня работает.

Конфиг:

[...]

local lspconfig = require('lspconfig')

lspconfig.clangd.setup({
  root_dir = function(fname)
    local root_files = { 'compile_commands.json', '*/compile_commands.json' }
    return lspconfig.util.root_pattern(root_files)(fname)
  end,
  single_file_support = false
})

[...]

Генерация:

intercept-build make
nvim

или

meson setup build
meson compile -C build
nvim
cumvillain
()

Базовый конфиг

require("lsp_signature").setup({})

Подключение при подсоединении сервера языка данного буфера

vim.api.nvim_create_autocmd('LspAttach', {
    group = vim.api.nvim_create_augroup('UserLspConfig', {}),
    callback = function(ev)
       require("lsp_signature").on_attach({}, ev.buf)
    end,
})
ac130kz ★★
()

Благодарю за ответы. Заюзал встроенный LSP клиент nvim’a + ray-x/lsp_signature.nvim.

Ужас, сколько люди наворачивают какого-то дерьма ненужного, какие-то менеджеры зачем-то, свистелки. Если вдруг кто будет страдать, то примерный алгоритм моих действий:

  1. клонируем lsp_signature в ~/.config/nvim/pack/nvim/start, никаких менеджеров не надо, nvim найдет там плагин. Пути поиска :echo &runtimepath
  2. конфиг ~.config/nvim/init.lua (корнем проекта у меня здесь считается директория, которая содержит build, в ней ожидается compile_commands.json:
vim.api.nvim_create_autocmd("LspAttach", {
  callback = function(args)
    local bufnr = args.buf
    local client = vim.lsp.get_client_by_id(args.data.client_id)
    if vim.tbl_contains({ 'null-ls' }, client.name) then  -- blacklist lsp
      return
    end
  cfg = {...} -- see https://github.com/ray-x/lsp_signature.nvim
    require("lsp_signature").on_attach(cfg , bufnr)
  end,
})

function my_clangd()
   local search = vim.fs.find({ 'build' }, { upward = true })
   if search[1] == nil then
      return
   end
   config = {
      name = 'clangd',
      cmd = {'clangd'},
      root_dir = vim.fs.dirname(search[1]),
   }
   local client = vim.lsp.start(config)
   vim.lsp.buf_attach_client(0, client)
end

vim.api.nvim_create_autocmd('FileType', {
   pattern = {'c', 'cpp'},
   callback = function(event)
      vim.opt_local.cindent = true
      my_clangd()
   end
})
  1. всякие сочетания по вкусу
  2. дока по встроенному LSP клиенту https://neovim.io/doc/user/lsp.html#lsp

Столько дерьма перелопатил, никто не может четко сказать 1, 2, 3. Вместо этого часовые видики, где авторы обмазывает себя тонной плагинов и вообще не факт, что в итоге будет signature help. Не, это не эталон, конечно, но как начальная точка, которую можно дальше шлифовать, для меня вот, например, это магия if vim.tbl_contains({ 'null-ls' }, client.name) then -- blacklist lsp может вообще не надо, хз

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

для меня вот, например, это магия

Проверка коряво написана, там ведь всего одно значение — таблица не нужна. Почему не так?:

if client.name == "null-ls" then

может вообще не надо, хз

Смотря что попадёт в args.data.client_id. Это событие, которое, похоже, вызывается для всех LSP, в том числе дефолтного null-ls. Так что проверка-фильтр всё же нужна.

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

Менеджер плагинов позволяет:

  1. Обновлять все установленные плагины разом. Никаких «вспомнил адрес, зашел на сайт, скачал обновление, скопировал его в нужную директорию».

  2. Загружать плагины по событию - тип файла, команда, хоткей. Например, нет необходимости загружать плагин для работы с git, если работа с ним не предполагается.

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

Плагин Mason позволяет легко подключать и обновлять необходимое для LSP.

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

Обновлять все установленные плагины разом. Никаких «вспомнил адрес, зашел на сайт, скачал обновление, скопировал его в нужную директорию».

Так ~/.config/nvim/pack/nvim/start клонируешь git репозитории, потом тупо делаешь git pull, можно даже скрипт на пару строчек сохранить там, который будет делать это для всех плагинов сразу

Загружать плагины по событию - тип файла, команда, хоткей. Например, нет необходимости загружать плагин для работы с git, если работа с ним не предполагается.

Ну какая-то здравая логика есть, но я вообще не уверен, что менеджеры (во всяком случае все) не будут подгружать плагины на старте и делать это при необходимости в процессе (во всяком случае менеджер, которым я пользовался раньше этого не умел). У меня этих плагинов 2-3 штуки, в моем случае и смысла нет. Куда приятней выкинуть какие-то лишние сущности, которые решают непонятные задачи. Редактор - инструмент, он должен быть максимально простым (не в ущерб функциональности, конечно), мне код писать, а не разбираться во всем этом зоопарке менеджеров и «помогаторов». Во многом поэтому мне зашло Lua api, простой и интуитивно понятный си подобный язык, в отличии от vimscript’a, каждый раз с которым начинаешь все заново с его самобытным синтаксисом (а как иначе, когда сталкиваешься с ним раз в квартал)

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

В 2024 пора перестать есть кактус и сразу накатывать NvChad или AstroNvim. Всё равно самостоятельная сборка приведёт примерно к такому же списку плагинов, только они будут коряво настроены.

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

Так ~/.config/nvim/pack/nvim/start клонируешь git репозитории, потом тупо делаешь git pull, можно даже скрипт на пару строчек сохранить там, который будет делать это для всех плагинов сразу

зачем заниматься мазохизмом, если это давно автоматизировано?

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

В 2024 пора перестать есть кактус и сразу накатывать NvChad или AstroNvim.

Тупиковый путь. Через некоторое время вы поймете, что авторы этих сборок втихаря что-то покуривают и вам с ними не по пути.

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

с чего это тупиковый? Пользуюсь nvchad наверно года 2 с лишним, все отлично работает. За все это время приходилось менять конфиг наверно раза 2 - когда они перешли с packer на lazy, и когда в версии 2.5 вынесли nvchad в отдельный плагин (т.ч. в ~/.config остались только пользовательские настройки). Это все оправданные изменения.

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

Ну значит ваши взгляды совпадают со взглядами автора сборки.

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

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

конфиг ~.config/nvim/init.lua

Ужас какой. Неужели без императивных портянок никак не настроить плагины для невима? Ну и глядя на этот код я прозреваю как в следующей версии очумелые ручки авторов слегонца подправляют API, и все ваши портянки отваливаются. А потом еще и авторы lua что-то опять покурят и поменяют синтаксис. Не заскучаешь.

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

Неужели без императивных портянок никак не настроить плагины для невима?

Нет. Почему-то всем норм, но меня лично коробит этого говна, особенно когда надо копипастить из документации бойлерплейт на десятки строк, который потом…

в следующей версии очумелые ручки авторов слегонца подправляют API, и все ваши портянки отваливаются

Вот.

А потом еще и авторы lua что-то опять покурят и поменяют синтаксис

Это вряд ли. При встраивании Lua обычно никто без веских причин не меняет версию языка.

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

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

function! ...

Ну вот элементарщина, помню читал про этот восклицательный знак, разобрался, понял, использовал и быстренько забыл, нужно повторять цикл заново при необходимости что-то писать вновь. А это хрень:

augroup Mode_hooks_group
	autocmd!
	autocmd ...
	autocmd ...
augroup End

Опять же помню, что изучал вопрос, что-то там про удаление хуков в группе предварительно через !, а зачем это нужно? Что за группа? Вообще из памяти вылетело.

Прикладной язык должен быть простым, этого точно не скажешь про vimscript

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