LINUX.ORG.RU

Code completion

 ,


1

4

Приветствую. В общем пользовался я емаксом+ртагс, вся эта конструкция показалась мне слишком тяжелой и тормозной. Уйду на vim, подумал я, поставлю YouCompleteMe. И что я увидел? YouCompleteMe == 257 метров !!! чего-то там на питоне.
Ребята, как получить что-то достойное на виме? Хочется сэкономить время на установке кучи г**** с последующим сносом. Чем сами пользуетесь?

Есть плагин для rtags для vim’a. Я даже какое-то время им пользовался. А вообще берёшь vim-lsp, coc и прочие lsp ориентированные вещи и получаешь результат ощутимо легче(в качестве lsp сервера я использую в порядке приоритета: clangd->ccls). YCM - это один из первопроходцев в ide as server, так же как и rtags, поэтому оба два немного архитектурно неуклюжие и довольно толстые.

pon4ik ★★★★★ ()

C++ быстро сканировать в принципе невозможно. clang-code-model в QtC запросто пару гигов отъедает. А вы о каких-то жалких 250-и метрах переживаете.

RazrFalcon ★★★★★ ()

Использую VIM + YCM. Но YCM действительно монстр, зато достаточно просто настраивается под каждый проект и сразу начинает работать.

С другими подобными плагинами у меня не срослось, поэтому терплю монструозность YCM.

andreyu ★★★★★ ()

Спасибо за ответы.
Пока остановился на связке clangd<—>LanguageClient-neovim<—>{deoplete|omnifunc}? . Если кто покажет свой vimrc с этими плагинами, буду признателен.

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

из релевантного [code] let g:deoplete#enable_at_startup = 1 set completeopt=menuone let g:LanguageClient_serverCommands = { … \ ‘cpp’: [‘clangd’], … \ } nnoremap :call LanguageClient_contextMenu() [/code] и еще всякое неважное по мелочи. Но, как тут уже говорили, на больших проектах оно может отожрать очень много ресурсов. Если имеешь дело с такими проектами, то лучше сразу привыкнуть обходиться без подобных плагинов, ничего не поделаешь.

anonymous ()

В общем удалось кое как прикрутить 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 ★★ ()
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от pavlick

Нужен Curl на борту, в репозитории voidlinux не было, ставил из исходников.

Не очень понял, при чём тут Curl, но в репозитории voidlinux он есть.

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

ИМХО, зря вы выкинули emacs. У меня установлены пакеты lsp-mode, emacs-ccls (ну и сам ccls в системе), company, company-lsp. Для автокомплита и прочих фишек lsp (поиск объявлений и т.д.) этого вполне хватает. Вот часть конфига, относящаяся к этому:

(require 'lsp-mode)
(require 'ccls)
(setq ccls-executable "/usr/bin/ccls")
(setq
   ccls-initialization-options
   `(:cache
     (:directory "/tmp/ccls-cache")))
(add-hook 'c-mode-hook #'lsp)
(add-hook 'c++-mode-hook #'lsp)
(setq lsp-prefer-flymake :none)
(require 'company-lsp)
(push 'company-lsp company-backends)

А если добавить к этому projectile, helm, magit и прочие мелочи вроде neotree и highlight-symbol - emacs практически все мои хотелки в плане IDE удовлетворяет.

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

Не очень понял, при чём тут Curl, но в репозитории voidlinux он есть.

Точно, есть. Сильно запарился вчера, видимо. Там сам менеджер пакетов вима использует Curl.

emacs выкидывать не очень то и хотелось, но что делать, если на более менее большой портянке кода (строк 500) начинаются тормоза (элементарное перемещение курсора лагает). Думаю, дело в подсветке ключевых слов с++mode, там наверное всё на лиспе. Вим всё же значительно шустрее, у меня он летает.

pavlick ★★ ()