ฉันสามารถข้ามไปยังการประกาศฟังก์ชั่นหรือคำจำกัดความในโครงการไฟล์ C ++ หลายรายการได้หรือไม่


15

ฉันสามารถข้ามไปยังการประกาศฟังก์ชั่นหรือคำจำกัดความในโครงการไฟล์ C ++ หลายรายการได้หรือไม่

ให้บอกว่าฉันมีไฟล์ส่วนหัวfoo.hpp:

int bar();

และไฟล์ต้นฉบับfoo.cpp:

#include "foo.hpp"
int bar() { return 42; }

และไฟล์หลักmain.cpp:

#include "foo.hpp"
int main() { bar(); return 0; }

กลุ่มสามารถค้นหาทั้งคำจำกัดความและการประกาศของฟังก์ชันbar()จากmainฟังก์ชันได้หรือไม่?

คำตอบ:


15

ctags ที่มีชีวิตชีวาเป็นวิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้ ภายใต้ GNU / Linux (เช่น Ubuntu หรือ Debian) คุณควรจะสามารถทำได้

sudo apt-get install exuberant-ctags

(สำหรับ OSX "$ brew install ctags" น่าจะพอเพียงสำหรับ Windows คุณอาจต้องการเยี่ยมชมhttp://ctags.sourceforge.net/และดาวน์โหลดไฟล์ปฏิบัติการแบบสแตนด์อโลน)

จากนั้นนำทางไปยังโฟลเดอร์รูทของโครงการและเรียกใช้

ctags -R --exclude=.git .

การทำเช่นนี้จะสแกนโครงการทั้งหมดของคุณและสร้างไฟล์. / tag ซึ่งเสียงเรียกเข้าจะใช้โดยอัตโนมัติเพื่อให้คุณสามารถข้ามไปยังฟังก์ชั่นต่างๆได้โดยการกดปุ่ม กล่าวคือ:

Ctrl + ]

เมื่อเคอร์เซอร์วางอยู่บนฟังก์ชันที่คุณต้องการดูการใช้งาน มีชุดค่าผสมอื่น ๆ และฟังก์ชั่นโหมดคำสั่งมากมายที่ให้คุณเลื่อนดูโค้ดของคุณด้วย ctags ด้วย (เช่นCtrl+ tเพื่อข้ามไปยังรายการสแต็กแท็กที่เก่ากว่า) ดู:help 29.1ภาพรวม

โปรดทราบว่าคุณต้องเรียกใช้ ctags ใหม่สำหรับการเปลี่ยนแปลงที่สำคัญแต่ละครั้งในรหัสและปล่อยให้ทำดัชนีโครงการของคุณอีกครั้ง คุณสามารถทำได้ด้วยตนเองหรือสอนให้เป็นกลุ่มในการใช้ปุ่มลัดหรือเขียน

คำแนะนำ:หากคุณใช้งาน ctags อย่างกว้างขวางบางทีปลั๊กอินvim-taglist ( http://vim-taglist.sourceforge.net ) ก็มีค่าเช่นกัน มันทำให้คุณมีโครงร่างสไตล์ IDE พร้อมรายการฟังก์ชันทั้งหมดสำหรับคลาส / ไฟล์นั้น


สองสิ่งที่ควรรู้: ctags สากลมีหลายวิธีแทนที่ ctags ที่มีชีวิตชีวา นอกจากนี้วิธีให้ git ซิงก์แท็กของคุณด้วย
D. Ben Knoble

4

จนถึงตอนนี้ฉันสามารถตั้งชื่อสองวิธีแก้ไขปัญหาของการค้นหาประกาศหรือคำจำกัดความของฟังก์ชั่น ฉันรู้ว่ามีวิธีแก้ปัญหาแท็กที่ใช้กันดี แต่เมื่อฉันไม่ได้ใช้ฉันจะให้คนอื่นมอบให้คุณ

หนึ่งในอินเทรนด์มากขึ้นก่อน: YouCompleteMeมี:GoToDefinitionและ:GoToDeclarationคำสั่งคู่

คนที่ฉันใช้ (มันยากที่จะเปลี่ยนนิสัยนาน 10 ปี) ปลั๊กอินlh-tagsของฉันมีวิธีในการสร้างฐานข้อมูล ctags และอัปเดตเพิ่มทีละส่วน และยังมีวิธี ( CTRL+W Meta+Down) เพื่อแสดงการประกาศและคำจำกัดความทั้งหมดที่ตรงกับสิ่งที่อยู่ภายใต้เคอร์เซอร์ (/ สิ่งที่เลือก) เนื่องจากวิธีนี้อาศัย ctags จึงไม่สามารถรู้ได้ว่าตัวใดที่เกินพิกัดของเคอร์เซอร์นั้นเกี่ยวข้องกันมากเกินไป โซลูชันที่ใช้ ctags อื่น ๆ ควรไม่ดี (/ ดี) ในหัวข้อนี้ อย่างไรก็ตาม YCM น่าจะดีกว่ามากที่นี่

Discl .: ผมไม่ใช้ :tselectLH-แท็กเป็นทางเลือกที่เหมาะกับการทำงานมากขึ้นเพื่อ

(อันที่จริงฉันจำวิธีแก้ปัญหาข้อที่สามได้: ฉันเริ่มclang-indexerและvim pluginที่เกี่ยวข้องซึ่งจะห่อหุ้มไว้ แต่ด้วย YCM รอบ ๆ ฉันจะลืมวิธีนี้)

แก้ไข: ในฐานะของ 2019 โซลูชั่นที่มีประสิทธิภาพมากที่สุดพึ่งพาเซิร์ฟเวอร์ LSP ฉันใช้COC + cclsเพื่อจัดทำดัชนีกระโดดและทำสิ่งต่าง ๆ อีกมากมาย ฉันกลับไปใช้โซลูชันที่ใช้แท็กเมื่อฉันขี้เกียจเกินไปที่จะกำหนดค่า COC สำหรับโครงการที่ฉันจะไม่ใช้เวลามากหรือที่ฉันไม่สามารถติดตั้ง clang และ ccls รุ่นล่าสุดได้


1
ขอบคุณสำหรับการป้อนข้อมูลจะทดสอบแต่ละวิธี ฉันทดสอบ YouCompleteMe และใช้GoToDeclarationงานได้กับไฟล์ต้นฉบับหลายไฟล์เท่านั้น นี่เป็นคำพูดจากเอกสารเกี่ยวกับ:GoToDefinition For C-family languages this only works ... when the definition of the symbol is in the current translation unit.นอกจากนี้คำสั่ง:YcmCompleter GoTo*ต่างๆ
Allan Hasegawa

ฉันพลาดสายนี้ นั่นหมายความว่า clang_indexer อาจยังมีประโยชน์ โซลูชันอื่น ๆ อาจติดตั้งได้ยาก อย่าลังเลที่จะส่งอีเมลถึงฉันหากต้องการ
Luc Hermitte

3

มีทางเลือกน้อย ctagsคนแรกคือ หากคุณต้องการตัวสร้างดัชนีขั้นสูงเพิ่มเติมก็cscopeเป็นทางเลือกที่ดีกว่า ตัวอย่างเช่นมันจะช่วยให้คุณสามารถแสดงรายชื่อผู้โทรทั้งหมดของฟังก์ชั่นที่กำหนด เครื่องมือเหล่านี้จะจัดทำดัชนีโค้ดของคุณโดยไม่เข้าใจอย่างถูกต้อง (มีคำจำกัดความของไวยากรณ์อย่างง่ายที่จะรู้ว่าสัญลักษณ์ที่ให้หมายถึงอะไร) นอกจากนี้ยังค่อนข้างง่ายที่จะขยายไวยากรณ์นั้น taglistปลั๊กอินจะต้องมีเหล่านี้และมันเป็นไปได้ที่จะขยายไวยากรณ์ดัชนีการแสดงผลใน taglist

หากคุณต้องการสิ่งที่มากกว่าตัวทำดัชนีแล้วเช่นการตรวจสอบไวยากรณ์YouCompleteMeอาจเป็นวิธีที่จะไป มันสร้างจากส่วนบนllvmและทำให้มีการแยกวิเคราะห์ที่เหมาะสม สิ่งนี้ช่วยให้สามารถตรวจสอบไวยากรณ์ของรหัสและซีแมนทิกส์ได้

จากนั้นถ้าคุณทำงานกับรหัสที่มีภาษาเฉพาะโดเมนหรือรหัสที่ฝังตัวคุณมักจะจบลงด้วยการพิมพ์ไฟล์ผ่าน ทางเลือกคือAckสคริปต์ Perl ที่พยายามช่วยเหลืองานนี้


0

ฉันคิดว่า ctags เป็นสิ่งที่คุณต้องการ เสียงเรียกเข้าถูกรวมเข้ากับ ctags, และสามารถข้ามไปยังฟังก์ชันคำจำกัดความและการประกาศได้อย่างง่ายดาย

ลองดูบทความนี้http://andrew.stwrt.ca/posts/vim-ctags


โปรดเพิ่มบทสรุปของโพสต์ที่ลิงก์ คำตอบสำหรับลิงก์เท่านั้นไร้ประโยชน์เมื่อลิงก์หยุดทำงาน
muru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.