cscope หรือ ctags ทำไมถึงเลือกอันอื่น [ปิด]


131

ฉันใช้ vim / gvim เป็นตัวแก้ไขเป็นหลักและฉันกำลังมองหาการใช้lxr (Linux Cross Reference)และcscopeหรือctagsสำหรับการสำรวจแหล่งเคอร์เนล อย่างไรก็ตามฉันไม่เคยใช้cscopeหรือctags มาก่อนและอยากทราบว่าเหตุใดจึงอาจเลือกหนึ่งรายการมากกว่าอีกรายการหนึ่งโดยคำนึงถึงการใช้กลุ่มเป็นเครื่องมือแก้ไขหลัก

คำตอบ:


157

ctags เปิดใช้งานคุณลักษณะสองอย่าง: ช่วยให้คุณสามารถข้ามจากการเรียกใช้ฟังก์ชันไปยังคำจำกัดความและการทำให้สมบูรณ์ได้ วิธีแรกหมายความว่าเมื่อคุณอยู่เหนือการเรียกใช้เมธอดการกดปุ่มg]หรือCTRL-]จะข้ามไปยังตำแหน่งที่กำหนดหรือใช้วิธีการนั้น คุณลักษณะที่สองหมายความว่าเมื่อคุณพิมพ์foo.หรือfoo->และถ้า foo เป็นโครงสร้างเมนูป๊อปอัปพร้อมการกรอกฟิลด์จะปรากฏขึ้น

cscope ยังมีคุณสมบัติแรก - โดยใช้set cscopetag- แต่ไม่ใช่คุณสมบัติสุดท้าย อย่างไรก็ตามกล้องจุลทรรศน์ยังเพิ่มความสามารถในการข้ามไปยังสถานที่ใด ๆ ที่มีการเรียกใช้ฟังก์ชันด้วย

ตราบเท่าที่การกระโดดไปรอบ ๆ ฐานรหัสนั้นเกี่ยวข้อง ctags จะนำคุณไปสู่สถานที่ที่มีการนำฟังก์ชันไปใช้งานเท่านั้นในขณะที่ cscope สามารถแสดงให้คุณเห็นว่ามีการเรียกใช้ฟังก์ชันใดเช่นกัน

ทำไมคุณถึงเลือกอย่างใดอย่างหนึ่ง? ฉันใช้ทั้งสองอย่าง ctags นั้นง่ายต่อการตั้งค่าวิ่งเร็วขึ้นและหากคุณสนใจแค่การกระโดดเพียงวิธีเดียวมันจะแสดงเส้นน้อยลง คุณสามารถเรียกใช้:!ctags -R .และใช้g]งานได้ นอกจากนี้ยังช่วยให้ทุกสิ่งที่สมบูรณ์

Cscope เหมาะสำหรับฐานรหัสที่ใหญ่กว่าและไม่รู้จัก การตั้งค่าเป็นความเจ็บปวดเนื่องจาก cscope ต้องการไฟล์ที่มีรายชื่อไฟล์ที่จะแยกวิเคราะห์ นอกจากนี้ในกลุ่มโดยค่าเริ่มต้นจะไม่มีการตั้งค่าการผูกคีย์ - คุณต้องเรียกใช้:cscope blah blahด้วยตนเอง

เพื่อแก้ปัญหากำปั้นฉันมีสคริปต์ทุบตีcscope_gen.shที่มีลักษณะดังนี้:

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

สิ่งนี้ค้นหารหัสที่ฉันสนใจสร้างรายการ cscope.files และสร้างฐานข้อมูล ด้วยวิธีนี้ฉันสามารถเรียกใช้ ":! cscope_gen.sh" แทนที่จะต้องจำขั้นตอนการตั้งค่าทั้งหมด

ฉันจับคู่การค้นหาด้วยกล้องจุลทรรศน์กับ ctrl-space x 2 ด้วยตัวอย่างข้อมูลนี้ซึ่งจะช่วยลดส่วนอื่น ๆ ของกล้องจุลทรรศน์:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

มีปลั๊กอิน cscope_maps.vimที่ตั้งค่าการเชื่อมโยงที่คล้ายกัน ฉันจำไม่ได้ว่าตัวเลือกทั้งหมดหมายถึงอะไรจึงมักจะยึดติดกับ ctrl-space

ดังนั้นเพื่อสรุป: ctags นั้นง่ายต่อการตั้งค่าและส่วนใหญ่ใช้งานได้โดยไม่ต้องทำอะไรมากมายมันมีความสำคัญสำหรับ omni-complete ด้วย cscope ให้คุณสมบัติเพิ่มเติมหากคุณต้องรักษาฐานรหัสขนาดใหญ่และส่วนใหญ่ไม่รู้จัก แต่ต้องใช้ขาทำงานมากขึ้น


2
มีวิธีใดที่จะทำให้ ctags แม่นยำยิ่งขึ้น? ฉันทำmake tagsในเคอร์เนลรูท dir และเล่นกับการกระโดดไปมาและเวลาส่วนใหญ่ลงเอยผิดที่ ฉันอ่านว่า ctags มีปัญหากับ c พรีโปรเซสเซอร์ แต่การพิจารณาว่า ctags ถูกใช้ใน lxr เห็นได้ชัดว่าต้องเป็นสิ่งที่สามารถทำได้
Robert S.Barnes

2
หากมีวูดูมาโครลึก ctags ก็น่าจะล้มเหลว :-( ฉันใช้มันเป็นส่วนใหญ่สำหรับสิ่งที่ C ++ ซึ่งอาศัยสิ่งนั้นน้อยกว่า (แม้ว่าจะมีปัญหาในตัวเอง
ก็ตาม

12
set cscopetag( cst) เพื่อให้:tagและCTRL-]คำสั่งค้นหาผ่าน cscope ก่อนจากนั้นแท็ก
Hasturkun

1
นอกจากนี้ ctags ค่อนข้างช้าในการค้นหาซ้ำการใช้ "ctags -L cscope.files" จะช่วยเร่งการสร้างแท็กของคุณได้อย่างมาก
Aaron H.

1
@ RobertS.Barnes ใช้วิธีแก้ปัญหาบางอย่างg C-]กลุ่มจะแสดงรายการแท็กที่ตรงกับชื่อ คุณยังต้องหาคำจำกัดความที่เหมาะสมที่คุณต้องการด้วยตนเอง
Hubert Kario

15

ฉันตกอยู่ในสถานการณ์เดียวกันเมื่อหลายเดือนก่อน ...

การขาดความแม่นยำของ ctags เป็นความเจ็บปวดใน .. และฉันพบว่า cscope ดีกว่ามากสำหรับทุกสิ่งที่เกี่ยวข้องกับมาโคร (และมีมาโครจำนวนมากในเคอร์เนลลินุกซ์) ..

เกี่ยวกับการใช้งานนั้นตรงไปตรงมาจริงๆ ... คุณเพียงแค่พิมพ์ cscope -R ที่รากของเคอร์เนลของคุณจากนั้นคุณก็ไม่มีอะไรต้องกังวล .. (ฉันหมายถึงถ้าคุณต้องการสำรวจว่าสมบูรณ์แบบ ... )

จากนั้นการผูกคีย์ทั้งหมดจะขึ้นอยู่กับ Ctrl- \ (คุณสามารถทำการแมปใหม่ได้หากคุณแพ้ Ctrl) คุณใช้ s และ g เป็นหลัก .... ,

การพัฒนาเคอร์เนลฉันไม่ต้องการความสมบูรณ์มากนัก ....

ยังไงก็ตามไปหา cscope มันสะดวกและแม่นยำกว่ามาก


4
<< คุณเพียงแค่พิมพ์ cscope -R ที่รากของเคอร์เนลของคุณ .... ดีกว่าที่จะพิมพ์ "make cscope" ภายใต้เคอร์เนลมิฉะนั้นคุณจะจบลงด้วยสถาปัตยกรรมทั้งหมดที่มีอยู่ในเคอร์เนลลินุกซ์และด้วยเหตุนี้คำจำกัดความหลายคำถึงสัญลักษณ์ C เดียวกัน
kumar

4

อืม ... คุณน่าจะใช้ etags แทน ctags ...

ถ้าคุณใช้ cscope คุณจะเห็นสายโซ่นั่นคือใครเรียกฟังก์ชันนี้และฟังก์ชันนี้เรียกใช้ฟังก์ชันใด

ฉันไม่แน่ใจว่าสามารถทำได้โดยใช้ etags / ctags ...

นั่นเป็นเพียงคุณสมบัติเดียว ... แล้วจะหาไฟล์ที่มีนิยามฟังก์ชันเฉพาะได้อย่างไร? สิ่งนี้คุณจะได้รับเฉพาะใน cscope

ฉันใช้ทั้ง cscope และ etags พวกมันทั้งสองดีสำหรับสิ่งต่าง ๆ โดยเฉพาะเมื่อทำงานกับ codebase ขนาดใหญ่เช่น Linux Kernel อันที่จริงฉันเริ่มใช้ cscope และ etags เมื่อฉันเริ่มทำงานกับ Linux Kernel / Xen

LXR นั้นไม่ดีนักเพราะคุณต้องคลิกไปที่เครือข่าย ฯลฯ ในขณะที่คุณสามารถสร้างฐานข้อมูล cscope และแท็กบนรหัสเคอร์เนลของคุณและไม่ต้องผ่านเครือข่าย (ไม่เหมือนกับ lxr)


etags ไม่ใช่แค่สำหรับ emacs? ฉันใช้ g / vim โดยเฉพาะ
Robert S.Barnes

ใช่คุณถูก. จากหน้าคน: โปรแกรม etags ใช้ในการสร้างไฟล์ตารางแท็กในรูปแบบที่ emacs เข้าใจ (1); โปรแกรม ctags ใช้เพื่อสร้างตารางที่คล้ายกันในรูปแบบที่เข้าใจโดย vi (1)
rmk

1
มีสองรสชาติของ etags และ ctags ที่ฉันเชื่อ หนึ่งคืออีแมคอีกตัวหนึ่งคือซีแท็กที่เจริญงอกงาม ครั้งแรกถูกเขียนขึ้นเป็นครั้งแรกสำหรับ emacs แต่สามารถใช้กับ vi ได้เช่นกัน ตัวที่สองเขียนขึ้นเป็นครั้งแรกสำหรับ vi แต่สามารถใช้กับ emac ได้เช่นกัน ฉันพบว่าอันที่สอง (ctags ที่อุดมสมบูรณ์) ใช้ง่ายกว่าแม้ว่าฉันจะเป็นผู้ใช้ emacs ก็ตาม หากคุณติดตั้งแพ็คเกจ ctags ที่อุดมสมบูรณ์ลิงก์ไปยังไบนารี etags / ctags จะเปลี่ยนไปและชี้ไปที่ไบนารีอื่น
ustun

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