LINUX.ORG.RU

История изменений

Исправление pavlick, (текущая версия) :

В общем удалось кое как прикрутить clangd к vim. Вроде вопрос интересен многим. Я опишу свои шаги (это ни капили не эталонная конфигурация, скорее как просто работающая, которую нужно допиливать).

  1. Нужен Curl на борту, в репозитории voidlinux не было, ставил из исходников.
  2. Долго мучился с тем, что в качестве менджера использовал Vundle, юзать это https://github.com/junegunn/vim-plug.
  3. vimrc (после правки сделать :PlugInstall)
call plug#begin('~/.vim/plugged')
Plug 'autozimu/LanguageClient-neovim', {
    \ 'branch': 'next',
    \ 'do': 'bash install.sh',
    \ }
Plug 'lifepillar/vim-mucomplete'
call plug#end()

let g:LanguageClient_serverCommands = {
    \ 'cpp': ['/usr/bin/clangd'],
    \ 'c': ['/usr/bin/clangd']
    \ }

set complete=.,w,b,u,k
set completeopt=menuone,noselect
let g:mucomplete#enable_auto_at_startup = 1
let g:mucomplete#chains = {}
let g:mucomplete#chains.default = ['omni', 'c-n', 'path', 'tags', 'dict']
let s:cpp_cond = { t -> t =~# '\%(->\|::\|\.\)$' }
let g:mucomplete#can_complete = {}
let g:mucomplete#can_complete.cpp = { 'omni': s:cpp_cond }

let mapleader = ","

function SetLSPShortcuts()
  nnoremap <leader>ld :call LanguageClient#textDocument_definition()<CR>
  nnoremap <leader>lr :call LanguageClient#textDocument_rename()<CR>
  nnoremap <leader>lf :call LanguageClient#textDocument_formatting()<CR>
  nnoremap <leader>lt :call LanguageClient#textDocument_typeDefinition()<CR>
  nnoremap <leader>lx :call LanguageClient#textDocument_references()<CR>
  nnoremap <leader>la :call LanguageClient_workspace_applyEdit()<CR>
  nnoremap <leader>lc :call LanguageClient#textDocument_completion()<CR>
  nnoremap <leader>lh :call LanguageClient#textDocument_hover()<CR>
  nnoremap <leader>ls :call LanguageClient_textDocument_documentSymbol()<CR>
  nnoremap <leader>lm :call LanguageClient_contextMenu()<CR>
endfunction()

augroup LSP
  autocmd!
  autocmd FileType cpp,c call SetLSPShortcuts()
augroup END
  1. compile_commands.json гернерю этим https://github.com/rizsotto/Bear (bear make).
  2. Хотелось бы ещё подсказку при вводе аргументов функции, но хз как.
  3. Кстати clangd сохраняет кэш парсинга std в ~/.clangd, весьма разумно. Когда юзал rtags, то он создавал новую базу для каждого проекта в ~/.cache

ЗЫ: замечания, предложения приветствуются.

Исходная версия pavlick, :

В общем удалось кое как прикрутить clangd к vim. Вроде вопрос интересен многим. Я опишу свои шаги (это ни капили не эталонная конфигурация, скорее как просто работающая, которую нужно допиливать).

  1. Нужен Curl на борту, в репозитории voidlinux не было, ставил из исходников.
  2. Долго мучился с тем, что в качестве менджера использовал Vundle, юзать это https://github.com/junegunn/vim-plug.
  3. vimrc (после правки сделать :PlugInstall)
Plug 'autozimu/LanguageClient-neovim', {
    \ 'branch': 'next',
    \ 'do': 'bash install.sh',
    \ }
Plug 'lifepillar/vim-mucomplete'
call plug#end()

let g:LanguageClient_serverCommands = {
    \ 'cpp': ['/usr/bin/clangd'],
    \ 'c': ['/usr/bin/clangd']
    \ }

set complete=.,w,b,u,k
set completeopt=menuone,noselect
let g:mucomplete#enable_auto_at_startup = 1
let g:mucomplete#chains = {}
let g:mucomplete#chains.default = ['omni', 'c-n', 'path', 'tags', 'dict']
let s:cpp_cond = { t -> t =~# '\%(->\|::\|\.\)$' }
let g:mucomplete#can_complete = {}
let g:mucomplete#can_complete.cpp = { 'omni': s:cpp_cond }

let mapleader = ","

function SetLSPShortcuts()
  nnoremap <leader>ld :call LanguageClient#textDocument_definition()<CR>
  nnoremap <leader>lr :call LanguageClient#textDocument_rename()<CR>
  nnoremap <leader>lf :call LanguageClient#textDocument_formatting()<CR>
  nnoremap <leader>lt :call LanguageClient#textDocument_typeDefinition()<CR>
  nnoremap <leader>lx :call LanguageClient#textDocument_references()<CR>
  nnoremap <leader>la :call LanguageClient_workspace_applyEdit()<CR>
  nnoremap <leader>lc :call LanguageClient#textDocument_completion()<CR>
  nnoremap <leader>lh :call LanguageClient#textDocument_hover()<CR>
  nnoremap <leader>ls :call LanguageClient_textDocument_documentSymbol()<CR>
  nnoremap <leader>lm :call LanguageClient_contextMenu()<CR>
endfunction()

augroup LSP
  autocmd!
  autocmd FileType cpp,c call SetLSPShortcuts()
augroup END
  1. compile_commands.json гернерю этим https://github.com/rizsotto/Bear (bear make).
  2. Хотелось бы ещё подсказку при вводе аргументов функции, но хз как.
  3. Кстати clangd сохраняет кэш парсинга std в ~/.clangd, весьма разумно. Когда юзал rtags, то он создавал новую базу для каждого проекта в ~/.cache

ЗЫ: замечания, предложения приветствуются.