เป็นกลุ่ม 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 และไม่ใช่นิยามที่ถูกต้องซึ่งก็คือ 2nd นอกจากนี้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] อาจไม่ใช่สิ่งที่คุณกำลังมองหา แต่นั่นคือสิ่งที่ดีที่สุดที่คุณจะได้รับจาก Vim

โดยทั่วไปคุณไม่สามารถคาดหวังว่า 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.vimใน 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/

ตอนนี้การกำหนดค่า 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: MacVim 8.1.950 (155); ติดตั้งจาก DMG จาก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 ไม่สามารถค้นหานิยามฟังก์ชันที่กำหนดไว้ (sic) ในหน่วยการแปลอื่น เรามี (/ มี) clang-indexer (ไม่ได้รับการบำรุงรักษาจริงๆ) และปลั๊กอินอื่น ๆ ทุกวันนี้ฉันจะบอกให้ตรวจสอบปลั๊กอิน clangd + ที่ใช้โปรโตคอลเซิร์ฟเวอร์ภาษา
Luc Hermitte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.