विम, ctags और ओवरलोडिंग


10

क्या कई परिभाषाओं के मामले में स्वचालित रूप से सही मिलान परिभाषा में विम छलांग लगाने का एक तरीका है । हमारा C ++ कोड फंक्शन ओवरलोडिंग का बहुत अधिक उपयोग करता है और ctags की vim की हैंडलिंग इसके लिए तैयार नहीं लगती है।

उदाहरण के लिए,

void abc(int a, int b) {

}

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

}

अजीब तरह से, ctrl]पर

abc(1,2,3);

1 परिभाषा पर जाता है और सही परिभाषा नहीं है जो कि 2 है। इसके अलावा, g]विकल्पों के लिए संकेत देता है , लेकिन यह वह नहीं है जिसकी मुझे तलाश है।

धन्यवाद

जवाबों:


4

प्रलेखन ( :help ctrl-]) कहता है:

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] वह नहीं हो सकता है जो आप ढूंढ रहे हैं लेकिन वह सबसे अच्छा है जिसे आप विम में प्राप्त कर सकते हैं।

मूल रूप से, आप अपने कोड को समझने के लिए ctags और Vim की उम्मीद नहीं कर सकते हैं , इसलिए आपको एक चतुर अनुक्रमणिका (जैसे cscope, GNU GLOBAL, या कुछ क्लैंग के आधार पर) की तलाश करनी होगी या एक वास्तविक IDE का उपयोग करना होगा।


1

clangd & vim-lsp

मैंने यह clangdदेखने के लिए परीक्षण किया है कि क्या ओवरलोड कार्यों को वास्तव में एक कोड लाइन से सही परिभाषा की तलाश में प्रतिष्ठित किया जाता है, जहां ओवरलोड कार्यों में से एक का उपयोग किया जाता है। मेरे न्यूनतम परीक्षण विन्यास में विम प्लगइन का उपयोग करके vim-lspकाम किया।

न्यूनतम विन्यास

$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

vim-lspजिसकी स्थापना के लिए async.vimv88 पैकटपथ की आवश्यकता होती है

$ 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/

अब आपके vim कॉन्फ़िगरेशन को देखना चाहिए (अधिक गहराई से नेस्टेड फ़ाइलों और फ़ोल्डरों को छोड़ना)

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

5 directories, 1 file

परीक्षा

अब 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;
}

पर दबा gdरहा abcहै

  • abc(1,2) पहली पंक्ति के लिए कूदता है, और
  • abc(1,2,3) पांचवीं पंक्ति के लिए कूदता है।

पर्यावरण और संस्करण:

  • vim: मैकविम 8.1.950 (155); से डीएमजी से स्थापित GitHub MacOS 10.14.3 पर
  • clangd: 7.0.0; के साथ स्थापित $ brew install llvm( $PATHडिफ़ॉल्ट रूप से नहीं, निरपेक्ष पथ का उपयोग करें)
  • vim-lsp: e3f6933 (मार्च 7, 2019) और async.vim: f301455 (13 फरवरी, 2019)

0

जैसा कि रोमनल ने कहा, ctagsवास्तव में कोड को नहीं समझा जाता है, इसलिए सबसे अच्छा यह हो सकता है कि आप उस कार्य को साझा करने के लिए इंगित करें जिसे आप खोज रहे हैं।

हालाँकि, मेरा मानना ​​है कि clang_completeप्लगइन आपको चाहने वाली कार्यक्षमता प्रदान करता है। यह clangसंकलक का उपयोग उस फ़ंक्शन को खोजने के लिए करता है जो वास्तव में आपके द्वारा खोजे जा रहे मेल से मेल खाता है, और केवल उसी नाम से शेयर नहीं करता है। यह की ctrl-]कार्यक्षमता को ओवरराइड करेगा ctags

मैं भी देखा है यह कहा गया है कि YouCompleteMeरेंडर clang_completeअप्रचलित, लेकिन जैसा कि मैंने अभी तक इसे अपने आप को उपयोग करने के लिए है, मैं इसकी उपयोगिता गारंटी नहीं दे सकते।

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


मैं clang_complete के बारे में नहीं बता सकता , हालांकि, YCM किसी अन्य अनुवाद इकाई में परिभाषित परिभाषा (एसआईसी) नहीं पा सकता है। हमारे पास (/) क्लैंग-इंडेक्सर (वास्तव में अनुरक्षित नहीं), और कुछ अन्य प्लगइन्स हैं। आजकल, मैं भाषा सर्वर प्रोटोकॉल को लागू करने वाले clangd + plugins की जाँच करने के लिए कहूँगा।
ल्यूक हरमिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.