Vim, ctags e sobrecarga


10

Existe uma maneira de fazer o vim pular para a definição de correspondência correta automaticamente no caso de várias definições. Nosso código C ++ usa muito a sobrecarga de funções e o manuseio de ctags pelo vim não parece estar pronto para isso.

Por exemplo,

void abc(int a, int b) {

}

void abc(int a, int b, int c) {

}

Estranhamente, ctrl]em

abc(1,2,3);

leva para a 1ª definição e não a definição correta, que é a 2ª. Além disso, g]solicita opções, mas não é isso que estou procurando.

obrigado

Respostas:


4

A documentação ( :help ctrl-]) diz:

When there are several matching tags for {ident}, jump
to the [count] one.  When no [count] is given the
first one is jumped to.

g] pode não ser o que você está procurando, mas é o melhor que você pode obter no Vim.

Basicamente, você não pode esperar que ctags e Vim entendam seu código, portanto, você precisará procurar um indexador mais inteligente (como cscope, GNU GLOBAL ou algo baseado em clang) ou usar um IDE real.


1

clangd & vim-lsp

Eu testei clangdpara ver se as funções sobrecarregadas são realmente diferenciadas ao procurar a definição correta de uma linha de código onde uma das funções sobrecarregadas é usada. Na minha configuração mínima de teste, usando o plugin vim vim-lsp, funcionou.

Configuração mínima

$MYVIMRC é

source $VIMRUNTIME/defaults.vim
if executable('/usr/local/Cellar/llvm/7.0.0/bin/clangd')
    augroup Clangd
        autocmd User lsp_setup call lsp#register_server({
            \ 'name': 'clangd',
            \ 'cmd': {server_info->['/usr/local/Cellar/llvm/7.0.0/bin/clangd']},
            \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'],
            \ })
        autocmd FileType c,cpp,objc,objcpp nmap <buffer> gd <plug>(lsp-definition)
        autocmd FileType c,cpp,objc,objcpp setlocal omnifunc=lsp#complete
    augroup END
endif

Instalação vim-lspque requer async.vimno vim8 packpath

$ cd ~/.vim
$ git clone https://github.com/prabirshrestha/async.vim pack/prabirshrestha/start/async.vim/
$ git clone https://github.com/prabirshrestha/vim-lsp   pack/prabirshrestha/start/vim-lsp/

Agora, sua configuração do vim deve se parecer (omitindo arquivos e pastas mais profundamente aninhados)

~/.vim
❯ tree -L 4 -F
.
├── pack/
│   └── prabirshrestha/
│       └── start/
│           ├── async.vim/
│           └── vim-lsp/
└── vimrc

5 directories, 1 file

Teste

Agora considere o arquivo cpp

void abc(int a, int b) {

}

void abc(int a, int b, int c) {

}

int main(int argc, char const *argv[])
{
    abc(1,2);
    abc(1,2,3);
    return 0;
}

Pressionando gdem abcde

  • abc(1,2) salta para a primeira linha e de
  • abc(1,2,3) pula para a quinta linha.

Ambiente e versões:

  • vim: MacVim 8.1.950 (155); instalado a partir do DMG do github no macOS 10.14.3
  • clangd: 7.0.0; instalado com $ brew install llvm(não $PATHpor padrão, use caminho absoluto)
  • vim-lsp: e3f6933 (7 de março de 2019) e async.vim: f301455 (13 de fevereiro de 2019)

0

Como romanl afirmou, ctagsrealmente não entende o código, então o melhor que pode fazer é apontar para as funções que compartilham o nome que você está pesquisando.

No entanto, acredito que o clang_completeplugin fornece a funcionalidade que você procura. Utiliza o clangcompilador para encontrar a função que realmente corresponde à que você está procurando, e não apenas uma que compartilhe o mesmo nome. Ele substituirá a ctrl-]funcionalidade de ctags.

Eu também vi que ele se YouCompleteMetorna clang_completeobsoleto, mas como eu ainda não o usei, não posso garantir sua utilidade.

clang_complete repo do git: https://github.com/Rip-Rip/clang_complete


Não posso contar sobre clang_complete , no entanto, o YCM não pode encontrar uma definição de função definida (sic) em outra unidade de tradução. Temos (/ tivemos) clang-indexer (não realmente mantido) e alguns outros plugins. Atualmente, eu diria para verificar clangd + plugins implementando o Language Server Protocol.
Luc Hermitte 11/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.