วิธีการนำทางในโครงการขนาดใหญ่ใน VIM


87

คุณจัดการโปรเจ็กต์ขนาดใหญ่ (หลายร้อยไฟล์) โดยใช้ VIM เพียงอย่างเดียวได้อย่างไร

ฉันเองเริ่มมีปัญหาในโครงการที่ใหญ่กว่าขนาดเล็ก

  • มีวิธีใดบ้างที่จะ "ไปที่ไฟล์" ได้อย่างรวดเร็วโดยเฉพาะการกรอกชื่อ
  • เหมือนกันสำหรับ 'go to class definition' เมื่ออยู่ในไฟล์อื่น

ฉันรู้พื้นฐานเกี่ยวกับ VIM ทั้งหมดดังนั้นฉันจึงไม่มีปัญหาในการใช้มันในการเขียนสคริปต์หรือแก้ไขซอร์สโค้ดอย่างรวดเร็ว แต่มันยุ่งมากสำหรับฉันเมื่อฉันต้องนำทางไปมาระหว่างไฟล์ต่างๆ


คุณใช้ภาษาอะไร
LB40

ฉันต้องการวิธีแก้ปัญหาแบบไม่เข้าใจภาษา แต่ฉันต้องการการสนับสนุนสำหรับ C ++, PHP และ Rails
Jakub Arnold

คุณยอมรับคำตอบใด @JakubArnold

@xetrasu ฉันลงเอยด้วยการใช้NERDTree
Jakub Arnold

คำตอบ:


33

เป็นกลุ่มมีการสนับสนุนที่ดีเยี่ยมสำหรับแท็ก เมื่อคุณสร้างไฟล์แท็กสำหรับโปรเจ็กต์ของคุณแล้วคุณสามารถข้ามไปที่คำจำกัดความหรือการประกาศเมธอดคลาส ฯลฯ รวมถึงการข้ามไฟล์ทั้งหมดภายในเซสชันการแก้ไขเดียวกัน

ลอง

:help tags

ในการสร้างไฟล์แท็กสำหรับ C / C ++ ให้ไปที่พร้อมท์เชลล์ของคุณ (ฉันสมมติว่าระบบของคุณคือ * nix / Cygwin) และพิมพ์

info ctags

หรือ

ctags --help

2
Vim ยังรองรับ cscope ซึ่งจะช่วยให้คุณทำสิ่งต่างๆเช่นค้นหาสิ่งที่ฟังก์ชันเรียกใช้ฟังก์ชันที่กำหนดโปรดดู:help cscopeข้อมูล มีรายการคุณลักษณะที่ดีในบทนำ (ภายใต้ "ออกแบบมาเพื่อตอบคำถามเช่น")
Cascabel

1
น่าเสียดายที่ cscope มีความเข้าใจที่ จำกัด มากเกี่ยวกับ C ++
Luc Hermitte

28

ฉันชอบวิธีแก้ปัญหาง่ายๆวิธีที่ฉันชอบที่สุดในการนำทางในขณะนี้คือ:

เพิ่ม ~/.vimrc.local

set path=$PWD/**

จากนั้นพิมพ์สิ่งนี้ในตัวแก้ไขเพื่อค้นหาไฟล์ที่ใดก็ได้ในไดเร็กทอรีการทำงานปัจจุบัน (pwd)

:find user_spec.rb

คุณสามารถใช้การเติมแท็บในชื่อไฟล์เพื่อค้นหาตัวเลือกต่างๆได้เช่นกันทำให้การแปลง TextMate นี้มีความสุขมาก


1
วิธีนี้ง่ายกว่ามาก: ไม่จำเป็นต้องแคช FC และปลั๊กอินและ ... คุณทำอะโวเคดวันของฉัน! ขอบคุณ!
Srikumar

1
กลุ่มไม่อ่าน wd เป็นไดเร็กทอรีเริ่มต้น ฉันได้รีสตาร์ทเชลล์แล้ว แต่ก็ยังใช้งานไม่ได้ ลองvim .ก่อนดำเนินการคำสั่ง: /
Adam Grant

13

ฉันใช้การรวมกันของ NERDTree (แถบด้านข้างไดเรกทอรี), FuzzyFinder Textmate (go-to-file เช่น CMD + T ของ TextMate) และ Sessions (: h sessions) เพื่อช่วยฉันจัดการกับโครงการขนาดใหญ่

ฉันขอแนะนำให้ใช้ปลั๊กอินตัวช่วยเซสชัน ฉันจะพูดถึงสิ่งที่ฉันใช้ แต่ฉันยังไม่พอใจกับมัน "เซสชันกลุ่ม" ของ Google เท่านั้น

สิ่งหนึ่งที่ควรทราบในการทำให้ FuzzyFinder Textmate ทำงานก็คือมันขึ้นอยู่กับปลั๊กอิน FuzzyFinder เวอร์ชันเก่าโดยเฉพาะ v2.16 สิ่งที่สูงกว่าและคุณจะได้รับข้อผิดพลาด แต่แน่นอนว่าคุ้มค่ากับปัญหา แม้ว่าจะไม่มีการเติมชื่อ แต่การค้นหาก็ฉลาดดังนั้นถ้าฉันค้นหาfro/time/actionsphpมันจะดึงไฟล์ขึ้นมาapps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(วงเล็บแสดงว่ามันตรงกัน) ทำให้ง่ายมากในการเลือกไฟล์ที่ไม่ซ้ำกันตามชื่อโฟลเดอร์เท่านั้น


2
ฉันได้พบปลั๊กอินใหม่ที่ฉันชอบดีกว่าและง่ายต่อการติดตั้ง (อย่างน้อยในกรณีของฉัน): CommandT เร็วขึ้นมาก
donut

6
เครื่องมือใหม่ที่มีประสิทธิภาพมากขึ้น writter ใน vim script ดังนั้นจึงไม่มีการอ้างอิงภายนอกที่ctrlpใช้โดยโครงการ janus
alexandru.topliceanu

7

ตลอดจน ctags อันล้ำค่าและคำสั่งที่เกี่ยวข้องต่างๆ ฉันไม่สามารถอยู่ได้หากไม่มีปลั๊กอินโปรเจ็กต์ซึ่งช่วยให้คุณมีไฟล์ที่น่าสนใจที่เชื่อมโยงกับโปรเจ็กต์ในบานหน้าต่างแยกต่างหาก ฉันจำไม่ได้ว่าการตั้งค่าของฉันได้รับการปรับแต่งเท่าไร แต่ถ้าฉันต้องการเปิดไฟล์ต้นฉบับชื่อ Debug.c ฉันกด

<F12>     " Opens the project pane
/De       " Searches for "De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>   " Opens the selected file and closes the project pane

ฉันมักจะทำ:

:vsp      " Vertically split the window
<F12>     " Reopen project pane
#         " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>   " Open the header file in the other window and close the project window.

ด้วยลำดับที่ค่อนข้างสั้นนี้ฉันสามารถเปิดไฟล์ใดก็ได้และส่วนหัวเป็นแบบแยกแนวตั้ง เนื่องจากหน้าต่างปลั๊กอินของโปรเจ็กต์เป็นเพียงไฟล์ข้อความการทำให้เสร็จสมบูรณ์ทำได้โดยใช้ความสามารถในการค้นหาของ Vim


4

เริ่มต้นใน Vim 7.3 :findคำสั่งมีการเติมแท็บชื่อไฟล์

ดังนั้นถ้าคุณตั้งค่าของคุณ'path'เลือกที่จะมีโครงการทั้งหมดของคุณ (อาจจะใช้**สัญลักษณ์แทนเพื่อช่วยให้ไดเรกทอรีย่อยซ้ำการค้นหา) แล้วคุณสามารถใช้:find, :sfind, :tabfindฯลฯ คำสั่งกับความสำเร็จที่จะได้รับไฟล์ใด ๆ ในโครงการของคุณ นอกจากนี้ยังอนุญาตให้ข้ามไปยังไฟล์โดยตรงกับgfเพื่อน ๆ หากชื่อไฟล์อยู่ในข้อความของคุณตัวอย่างเช่นในคำสั่ง include

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


3

หากคุณใช้ ctags ตามที่ผู้โพสต์อื่นแนะนำให้ตรวจสอบว่าคุณได้ดูปลั๊กอินtaglistแล้ว

ตรวจสอบให้แน่ใจว่าคุณใช้เวลาในการอ่านเอกสารและเรียนรู้การผูกคีย์ นี่คือบางส่วนที่จะช่วยให้คุณเริ่มต้น (จากหน้าต่าง TList):

  • o - เปิดไฟล์ในหน้าต่างใหม่
  • t - เปิดไฟล์ในแท็บใหม่
  • [[หรือ backspace - ไฟล์ก่อนหน้าในรายการ
  • ]] หรือแท็บ - ไฟล์ถัดไปในรายการ

3

แท็กที่อุดมสมบูรณ์

ใช้ Ctrl-] เพื่อข้ามไปที่แท็กใต้เคอร์เซอร์


2

ผมใช้FindFile หากคุณเปิด vim ที่รูทของโปรเจ็กต์ของคุณและเรียกใช้:FC .ปลั๊กอินจะแคชชื่อไฟล์ทั้งหมดที่อยู่ใต้ cwd ของคุณ จากนั้นคุณสามารถทำได้:FFเพื่อเปิดเมนูเสร็จสิ้นและพิมพ์ชื่อไฟล์ที่คุณต้องการ (หรือแทนตัวอักษรสองสามตัวแรก)


ว้าวนี่เป็นเหมือนปลั๊กอินที่ใช้ง่ายที่สุด ไม่มีการตั้งค่าที่เกี่ยวข้อง .. FC .ใน root dir ของคุณจากนั้น:FFป้อนเริ่มพิมพ์ชื่อไฟล์ที่คุณต้องการเท่านี้ก็เสร็จแล้ว ฉันกำลังพยายามหาวิธีเปิดตัวในแท็บใหม่แม้ว่า ..
ผู้ทดสอบ

นอกจากนี้ที่น่าสังเกตว่าหากคุณใช้สิ่งนี้ทุกครั้งที่คุณเปิดเป็นกลุ่มคุณจะต้องทำซ้ำ:FC .เพื่อแคชไฟล์ในไดเรกทอรีนั้น
ผู้ทดสอบ

นี่คือ FindFile.vim เวอร์ชันอัปเดตที่มี:FTหรือ:FindTabNew gist.github.com/1104884
ผู้ทดสอบ

2

การเปิดvimจากรูทของไฟล์ต้นฉบับของคุณและpathตัวเลือกการขยายเพื่อรวมไดเร็กทอรีย่อยทั้งหมดไว้ในนั้น
ตัวอย่างเช่นset path+=/usr/include/c++/**สำหรับส่วนหัว C ++ และset path+=**สำหรับไดเรกทอรีต้นทางของคุณ

จากนั้นสิ่งนี้จะเปิดโอกาสมากมายเหลือเฟือต่อไปนี้

1) เปิดไฟล์ตามชื่อหรือบางส่วน

:find file_name

คุณสามารถใช้การเติมข้อความอัตโนมัติและการขยายสัญลักษณ์ตัวแทน:findได้อย่างน่าเชื่อถือ คุณพิมพ์ชื่อมันจะค้นหาชื่อ ใช้งานได้โดยไม่เชื่อเรื่องพระเจ้าภาษาฉันแน่ใจว่าคุณจะชอบมัน

2) การนำทางไปยังไฟล์ภายใต้ cusror:
หากคุณต้องการไปยังเส้นทางไฟล์เช่น#include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- เพื่อกลับไปที่ตำแหน่งเคอร์เซอร์สุดท้ายหลังจากgfหรือgF

3) การค้นหา API และการนำทางไปยังตำแหน่ง API

[iหรือ[Iสามารถใช้เพื่อค้นหาลายเซ็นฟังก์ชันของคุณสำหรับคำที่อยู่ใต้เคอร์เซอร์โดยไม่ต้องออกจากพื้นที่ทำงานของคุณ [<Tab>เพื่อไปสู่การประกาศ ใช้Ctrl- 6เพื่อกลับไปยังตำแหน่งสุดท้าย


โดยไม่ต้องขยายpathคุณสามารถเริ่มการนำทางไฟล์ตาม:Exคำสั่งและนำทางและเปิดไฟล์ของคุณ ฉันชอบNerdTreeมากกว่านี้มากกว่า


1

แม้ว่าฉันจะหวังว่าจะมีคนชี้ทางออกที่ดีกว่าเพื่อที่ฉันจะได้เรียนรู้บางสิ่งบางอย่าง NERDTree ก็เป็นประโยชน์สำหรับฉันในการเข้าถึงไฟล์เฉพาะที่มีการเติมชื่อตราบเท่าที่ฉันยังขยายต้นไม้ คำสั่งเมื่อฉันต้องการเข้าถึงไฟล์มีดังนี้:

, d / foo.pyo (โดยที่ foo.py เป็นชื่อไฟล์)

, d เพื่อเปิดทรี, / เพื่อเข้าสู่โหมดการค้นหา, ชื่อ (หรือชื่อบางส่วน, หรือ regex หรืออะไรก็ตาม) ของไฟล์จากนั้น o เพื่อเปิด

แน่นอนคุณอาจต้องกด 'n' สองสามครั้งหากคุณพิมพ์ชื่อไฟล์ไม่เพียงพอหรือมีรายการที่ซ้ำกัน

ฉันยอมรับว่ามันรู้สึกเหมือนเป็นการแฮ็คเล็กน้อยโดยใช้ NERDTree แบบนี้แม้ว่ามันจะเข้าสู่ความทรงจำของกล้ามเนื้อของฉันไปไกลแล้วโดยที่ฉันไม่ได้คิดถึงมัน

แน่นอนฉันใช้ ctags ด้วย แต่จะมีประโยชน์ก็ต่อเมื่อคุณมีฟังก์ชั่นใกล้เคอร์เซอร์และต้องไปที่คำจำกัดความในไฟล์อื่นหรืออะไรบางอย่าง หลายครั้งที่ฉันพูดว่า "ตกลงฉันต้องทำงานกับฟีเจอร์ x เดี๋ยวนี้" และต้องไปที่ไฟล์อื่นโดยไม่มีการอ้างอิงใด ๆ ในบริเวณใกล้เคียงที่ ctags จะช่วยได้จริงๆ


3
ฉันดูเพิ่มเติมแล้ว fuzzyfinder ดูเหมือนเป็นความคิดที่ดีสำหรับการค้นหาโครงการ
ความโน้มถ่วง

1

ฉันใช้สองปลั๊กอินของฉัน:

  • searchInRuntimeที่กรอกชื่อไฟล์ในบรรทัดคำสั่ง มันคล้ายกับ fuzzyfinder และ lookupfile
  • lh-tagsซึ่งเป็นการทดลองและไม่มีเอกสาร มีคุณสมบัติสองอย่างคือการอัปเดต tagfile โดยอัตโนมัติและรวดเร็วในการบันทึกไฟล์ (ing?) และตัวเลือกแท็กที่เสียบเข้ากับ<c-w><m-down>ค่าเริ่มต้น คุณอาจต้องการตรวจสอบปลั๊กอินแท็กลิสต์ที่มีชื่อเสียงแทน

ทั้งสองต้องการไลบรารี viml ของฉัน lh-vim-lib


0

ลองSourceCodeObedinece อันนี้ฉันพัฒนาขึ้นเพื่อจัดการโครงการซอร์สไฟล์ C ++ 1Gb
ฉันจะใช้มันในคู่กับ0scan

สองคนนี้เป็นปลั๊กอินห่อรอบที่นิยมมากที่สุดเครื่องมือการเรียกดูกลุ่ม: ctagsและcscope

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