วิธีทำงานอย่างมีประสิทธิภาพกับไฟล์หลายไฟล์ใน Vim


1098

ฉันเริ่มใช้ Vim เพื่อพัฒนาสคริปต์ Perl และเริ่มพบว่ามันมีประสิทธิภาพมาก

สิ่งหนึ่งที่ฉันชอบคือสามารถเปิดไฟล์หลายไฟล์พร้อมกันด้วย:

vi main.pl maintenance.pl

แล้วกระโดดระหว่างพวกเขาด้วย:

:n
:prev

และดูไฟล์ที่เปิดด้วย:

:args

และเพื่อเพิ่มไฟล์ฉันสามารถพูดได้:

:n test.pl

ซึ่งฉันคาดว่าจะถูกเพิ่มลงในรายการไฟล์ของฉัน แต่จะลบรายการไฟล์ปัจจุบันของฉันและเมื่อฉันพิมพ์:argsฉันจะtest.plเปิดเท่านั้น

ดังนั้นฉันจะเพิ่มและลบไฟล์ในรายการ args ของฉันได้อย่างไร


5
tmux ... ใช้เป็นกลุ่มในแต่ละบาน
Tommy

4
@Tommy: วิธีนี้คุณไม่สามารถวางเนื้อหาที่ถูกดึง / ลบในระหว่างไฟล์ (บัฟเฟอร์ vims) หากมีเพียงคลิปบอร์ดเท่านั้นที่สามารถช่วยได้ (ดูคำตอบที่ยอมรับได้: stackoverflow.com/questions/5532878/… )
ChristophS

1
:Nดูเหมือนว่าเป็นวิธีที่ง่ายที่จะไปแฟ้มก่อนหน้านี้ ...
รถตู้เกิร์ต Den Berg

vimcasts.org/categories/the-argument-list ? VimCasts ขอแนะนำอย่างยิ่งเมื่อเรียนรู้เป็นกลุ่ม
mcepl

คำตอบ:


1171

ทำไมไม่ใช้แท็บ (แนะนำใน Vim 7) คุณสามารถสลับระหว่างแท็บด้วย:tabnและ:tabpด้วย:tabe <filepath>คุณสามารถเพิ่มแท็บใหม่ได้ และด้วยปกติ:qหรือ:wqคุณปิดแท็บ หากคุณ map :tabnและ:tabpที่คุณF7/ F8คีย์ที่คุณสามารถสลับระหว่างไฟล์

ถ้ามีไม่ว่าไฟล์จำนวนมากหรือคุณไม่ได้เป็นกลุ่มที่ 7 นอกจากนี้คุณยังสามารถแบ่งหน้าจอของคุณในหลาย ๆ :sp <filepath>ไฟล์: จากนั้นคุณสามารถสลับระหว่าง splitscreens ด้วยCtrl+ Wและปุ่มลูกศรในทิศทางที่คุณต้องการย้าย (หรือแทนปุ่มลูกศรwสำหรับถัดไปและWสำหรับ splitscreen ก่อนหน้า)


72
เพื่อบันทึกและปิดแท็บคุณยังสามารถใช้ZZแทน:wq(เช่นเดียวกับตามปกติจะบันทึกและปิด)
Andreas Grech

40
ฉันใช้แพ็คเกจ vim-gnome ใน Ubuntu 10.10 และฉันสามารถสลับระหว่างแท็บต่างๆโดยใช้ Ctrl + PageUp และ Ctrl + PageDown ฉันไม่ต้องกำหนดค่าอะไรเลย มันเป็นค่าเริ่มต้น
Joey Adams

268
นอกจากนี้ในโหมดแก้ไขgtจะไปที่แท็บถัดไปและgTไปที่แท็บก่อนหน้า
คณบดี

40
คุณสามารถข้ามไปที่แท็บใดก็ได้โดยใช้ ngt โดยที่ n คือดัชนีของแท็บ (ขึ้นต้นด้วยหนึ่ง) ฉันคิดว่ามีตัวเลือกที่แสดงดัชนีของแต่ละแท็บใกล้กับชื่อไฟล์ แต่ฉันไม่รู้ว่ามันคืออะไร หากใครรู้ว่าฉันชอบที่จะได้ยินมัน
void-pointer

81
โปรดทราบว่าคุณสามารถใช้การ-pตั้งค่าสถานะเพื่อเปิดหลายไฟล์ในแท็บจากบรรทัดคำสั่ง ตัวอย่างเช่นgvim -p main.pl maintenance.plจะเปิดสองไฟล์เหล่านี้ในแท็บ
Matthew Strawbridge

554

รายการ

หากต้องการดูรายการบัฟเฟอร์ปัจจุบันฉันใช้:

:ls

การเปิด

ในการเปิดไฟล์ใหม่ฉันใช้

:e ../myFile.pl

ด้วยความสมบูรณ์ของแท็บขั้นสูง (ใส่set wildmenuในของคุณ.vimrc)

หมายเหตุ: คุณสามารถใช้:findซึ่งจะค้นหาชุดของเส้นทางให้คุณ แต่คุณต้องกำหนดเส้นทางเหล่านั้นก่อน


สวิทช์

ในการสลับระหว่างไฟล์ที่เปิดทั้งหมดฉันใช้

:b myfile

ด้วยความสมบูรณ์ของแท็บขั้นสูง (ยังset wildmenu)

หมายเหตุ: :b#เลือกไฟล์ที่เยี่ยมชมล่าสุดดังนั้นคุณสามารถใช้เพื่อสลับระหว่างสองไฟล์ได้อย่างรวดเร็ว


ใช้หน้าต่าง

Ctrl-W sและCtrl-W vเพื่อแยกหน้าต่างปัจจุบันในแนวนอนและแนวตั้ง คุณยังสามารถใช้:splitและ:vertical split( :spและ:vs)

Ctrl-W wเพื่อสลับระหว่างหน้าต่างที่เปิดอยู่และCtrl-W h(หรือjหรือkหรือl) เพื่อเลื่อนดูหน้าต่างที่เปิดอยู่

Ctrl-W cเพื่อปิดหน้าต่างปัจจุบันและCtrl-W oปิดหน้าต่างทั้งหมดยกเว้นหน้าต่างปัจจุบัน

การเริ่มเป็นกลุ่มด้วย a -oหรือ-Oตั้งค่าสถานะจะเปิดแต่ละไฟล์ในการแยกของตัวเอง


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

หมายเหตุ: หากคุณต้องการให้ไฟล์ทั้งหมดไปที่อินสแตนซ์เดียวกันของ Vim ให้เริ่ม Vim ด้วย--remote-silentตัวเลือก


4
ในกรณีที่คุณกำลังเล่นกับบัฟเฟอร์หลายฉันจะแนะนำLustyJuggler
อรุณม

1
ขอบคุณที่ทำการอ้างอิงด่วนอย่างดีมากสำหรับคำสั่ง vim ที่ใช้บ่อยที่สุดเมื่อทำงานกับหลายไฟล์
วอนตั้ม

9
:bเป็นคำสั่งที่มีประสิทธิภาพมากเพราะสามารถยอมรับทั้งหมายเลขบัฟเฟอร์และชื่อบัฟเฟอร์เป็นอาร์กิวเมนต์ มีอะไรอีกบ้าง? นอกจากนี้ยังรองรับการเติมแท็บในส่วนใด ๆ ของชื่อไฟล์ สมมติว่าคุณมี foo.txt เปิดอยู่ในบัฟเฟอร์ 2 คุณสามารถพิมพ์:b 2<Enter>หรือ:b foo.txtหรือ:b oo<Tab><Enter>แก้ไขไฟล์นั้น ใช่ตัวสุดท้ายจะทำ 'oo' เป็น 'foo.txt' เมื่อคุณกด <Tab>
Susam Pal

21
ฉันมีบรรทัดนี้ใน .vimrc nnoremap gb :ls<cr>:b<space>ฉัน: เมื่อฉันพิมพ์gbในโหมดคำสั่งมันจะแสดงรายการบัฟเฟอร์และประเภทที่เปิดของฉัน:b พร้อมให้ฉันเริ่มพิมพ์ชื่อ / หมายเลขบัฟเฟอร์
nkorth

5
นอกจากนี้ยังเป็นมูลค่าการกล่าวขวัญว่า:bจะยอมรับการจับคู่สตริงย่อยตราบใดที่มันไม่ชัดเจน ดังนั้นถ้าคุณมีไฟล์ที่เปิดfoo, barและbazเพียง:b zก็เพียงพอที่จะเปลี่ยนไปbazบัฟเฟอร์และ:b ooหรือ:b oจะพาคุณไปยังfooบัฟเฟอร์
Soren Bjornstad

233
:ls

สำหรับรายการบัฟเฟอร์ที่เปิด

  • :bp บัฟเฟอร์ก่อนหน้า
  • :bn บัฟเฟอร์ถัดไป
  • :bn( nตัวเลข) เลื่อนไปที่บัฟเฟอร์ n'th
  • :b <filename-part> ด้วยแท็บคีย์ให้การเติมอัตโนมัติ (ยอดเยี่ยม !!)

ในบางรุ่นของเสียงเรียกเข้าbnและbpเป็นจริงbnextและbpreviousตามลำดับ การป้อนอัตโนมัติของแท็บมีประโยชน์ในกรณีนี้

หรือเมื่อคุณอยู่ในโหมดปกติให้ใช้^เพื่อสลับไปยังไฟล์ล่าสุดที่คุณใช้งานอยู่

นอกจากนี้คุณสามารถบันทึกเซสชันของเสียงเรียกเข้า

:mksession! ~/today.ses

~/today.sesคำสั่งดังกล่าวจะช่วยประหยัดบัฟเฟอร์เปิดแฟ้มปัจจุบันและการตั้งค่า คุณสามารถโหลดเซสชันนั้นโดยใช้

vim -S ~/today.ses

ไม่ยุ่งยากที่จะจำที่คุณค้างไว้เมื่อวานนี้ ;)


ไปที่บัฟเฟอร์เฉพาะ: N CTRL- ^
Tom Yang

8
@shyam ฉันคิดว่าฉันรักคุณ! อย่างใดฉันไม่เคยรู้แน่นอนเกี่ยวกับคำสั่ง mksession แต่วันนี้ออกมาจากสีฟ้าฉันตัดสินใจว่าจะต้องมีวิธีการบันทึกรายการของไฟล์เพื่อเปิดได้อย่างง่ายดาย นี่เป็นสิ่งที่ดียิ่งขึ้นเพราะมันดูเหมือนว่าจะเก็บสถานะที่สมบูรณ์ของสิ่งต่าง ๆ (แยกหน้าต่างตำแหน่งบัฟเฟอร์ ฯลฯ ) ดังนั้นขอบคุณ!
Kasapo

และใช้"เครื่องหมายเพื่อข้ามไปยังตำแหน่งที่คุณอยู่ในไฟล์ครั้งล่าสุด
Chromium

113

วิธีเพิ่มในargsรายการ:

:argadd

หากต้องการลบออกจากargsรายการ:

:argdelete

ในตัวอย่างของคุณคุณสามารถใช้:argedittest.pl เพื่อเพิ่ม test.pl ลงในargsรายการและแก้ไขไฟล์ในขั้นตอนเดียว

:help args ให้รายละเอียดมากขึ้นและการใช้งานขั้นสูง


4
นี่เป็นคำตอบสำหรับคำถามที่ถามจริงๆแม้ว่าจะได้รับชื่อ แต่คำตอบอื่น ๆ นั้นยุติธรรมอย่างสมบูรณ์แบบ
Soren Bjornstad

48

ฉันใช้คำสั่งบัฟเฟอร์ - :bn(บัฟเฟอร์ถัดไป), :bp(บัฟเฟอร์ก่อนหน้า) :buffers(รายการบัฟเฟอร์เปิด) :b<n>(บัฟเฟอร์เปิด n) :bd(ลบบัฟเฟอร์) :e <filename>จะเพิ่งเปิดเป็นบัฟเฟอร์ใหม่


18
: เร็วกว่า: บัฟเฟอร์
aehlke

42

ฉันคิดว่าคุณอาจใช้คำสั่งที่ไม่ถูกต้องในการดูรายการไฟล์ที่คุณเปิด

ลองทำ:lsเพื่อดูรายการไฟล์ที่คุณเปิดและคุณจะเห็น:

   1 %a   "./checkin.pl"            line 1
  2 #    "./grabakamailogs.pl"     line 1
  3      "./grabwmlogs.pl"         line 0
  etc.

จากนั้นคุณสามารถตีกลับไฟล์ต่างๆโดยอ้างอิงจากหมายเลขที่แสดงรายการเช่น: 3b

หรือคุณสามารถแบ่งหน้าจอของคุณโดยป้อนหมายเลข แต่ใช้ sb แทนเพียงแค่ b

ในฐานะที่เป็นกัน% หมายถึงไฟล์ที่มองเห็นในปัจจุบันและ # หมายถึงไฟล์ทางเลือก

คุณสามารถสลับระหว่างสองไฟล์เหล่านี้ได้อย่างง่ายดายโดยการกด Ctrl Shift 6

แก้ไข: เช่น:lsคุณสามารถใช้:regเพื่อดูเนื้อหาปัจจุบันของการลงทะเบียนของคุณรวมถึงการลงทะเบียน 0-9 ที่มีสิ่งที่คุณลบไป สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณต้องการนำข้อความที่คุณลบไปก่อนหน้านี้มาใช้ซ้ำ


2
ยินดีที่ได้ดูข้อมูลที่เกี่ยวข้องเช่น% และ # +1
Ashish

35

Vim (แต่ไม่ใช่ Vi ดั้งเดิม) มีแท็บที่ฉันพบ (ในบริบทจำนวนมาก) ที่เหนือกว่าบัฟเฟอร์ คุณสามารถพูด:tabe [filename]เพื่อเปิดไฟล์ในแท็บใหม่ ขี่จักรยานระหว่างแท็บจะกระทำโดยการคลิกที่แท็บหรือโดยการคีย์ผสม [ n ] และgt gTGraphim Vim มีแท็บแบบกราฟิก


1
ขอขอบคุณฟังดูดี แต่เราโชคไม่ดีที่ติดตั้ง VIM 6.1 บนเซิร์ฟเวอร์เท่านั้น
Edward Tanguay

1
vim -p dir/*แท็บจะมีประโยชน์มากกับสัญลักษณ์แทน: ขนาดแท็บสูงสุดคือ 10 แต่คุณสามารถเปลี่ยนได้ใน~/.vimrcการตั้งค่าเป็นค่าtabpagemaxอื่น
Campa

27

มีคำตอบมากมายที่นี่! สิ่งที่ฉันใช้โดยไม่ต้องปรับแต่งล้อ - ปลั๊กอินที่โด่งดังที่สุด (ที่จะไม่ตายตลอดเวลาเร็ว ๆ นี้และถูกใช้โดยคนจำนวนมาก) เพื่อให้เร็วและเฉียบคม

  • ctrlpvim / ctrlp.vim - เพื่อค้นหาไฟล์ตามชื่อค้นหาคลุมเครือตามที่ตั้งหรือเพียงแค่ชื่อ
  • jlanzarotta / bufexplorer - เพื่อเรียกดูบัฟเฟอร์ที่เปิด (เมื่อคุณจำไม่ได้ว่ามีกี่ไฟล์ที่คุณเปิดและแก้ไขเมื่อเร็ว ๆ นี้และคุณจำไม่ได้ว่าพวกเขาอยู่ที่ไหนอาจเป็นเพราะคุณค้นหาด้วย Ag)
  • rking / ag.vimเพื่อค้นหาไฟล์ด้วยความเคารพ gitignore
  • scrooloose / nerdtreeเพื่อดูโครงสร้างไดเรกทอรี, lookaround, เพิ่ม / ลบ / แก้ไขไฟล์

แก้ไข:เร็ว ๆ นี้ผมได้ใช้dyng / ctrlsf.vim การค้นหาที่มีมุมมองตามบริบท (เช่นการค้นหาประเสริฐ) และฉันเปลี่ยนเครื่องยนต์จากagเพื่อripgrep ประสิทธิภาพที่โดดเด่น

แก้ไข 2:พร้อมกับCtrlSFคุณสามารถใช้mg979 / vim-visual-multiทำการเปลี่ยนแปลงหลายไฟล์ในครั้งเดียวและในตอนท้ายเมื่อบันทึกไว้ในครั้งเดียว


2
ctrlpได้ย้ายแล้วและสามารถพบได้ที่ctrlpvim / ctrlp.vim
เดฟ

1
นี่คือคำตอบที่ถูกต้อง! ทำไมมันไม่มี upvotes มากกว่านี้?
Thomas Möbius

2
แต่ไม่ได้มี upvotes มากขึ้นเพราะคำถามที่ถูกถามในปี 2008 :)
burnettk

อย่างแน่นอน ฉันไม่สามารถจินตนาการได้เป็นกลุ่มในการตั้งค่า dev โดยไม่ต้องมีปลั๊กอินเหล่านั้น
Edgar Alloro

25

สิ่งที่ชอบ:eและ:baddจะยอมรับเพียงหนึ่งอาร์กิวเมนต์เท่านั้นดังนั้นสิ่งต่อไปนี้จะล้มเหลว

:e foo.txt bar.txt
:e /foo/bar/*.txt
:badd /foo/bar/*

หากคุณต้องการเพิ่มไฟล์หลายไฟล์จากภายในกลุ่มให้ใช้ arga[dd]

:arga foo.txt bar.txt
:arga /foo/bar/*.txt
:argadd /foo/bar/*

21

บางคำตอบในกระทู้นี้แนะนำให้ใช้แท็บและคำตอบอื่น ๆ แนะนำให้ใช้บัฟเฟอร์เพื่อทำสิ่งเดียวกัน แท็บและบัฟเฟอร์ต่างกัน ฉันขอแนะนำให้คุณอ่านบทความนี้ " ความบ้าคลั่ง Vim Tab - Buffers vs Tabs "

นี่เป็นบทสรุปที่ดีที่ฉันดึงมาจากบทความ:

สรุป:

  • บัฟเฟอร์คือข้อความในหน่วยความจำของไฟล์
  • หน้าต่างคือวิวพอร์ตของบัฟเฟอร์
  • หน้าแท็บคือชุดของหน้าต่าง

2
คุณจะได้รับข้อมูลสรุปนั้นโดยการพิมพ์:help windowใน Vim
icc97

19

เมื่อใช้หลายไฟล์ในกลุ่มฉันใช้คำสั่งเหล่านี้เป็นส่วนใหญ่ (เปิดไฟล์ ~ 350):

  • :b <partial filename><tab> (ข้ามไปที่บัฟเฟอร์)
  • :bw (การลบบัฟเฟอร์ลบบัฟเฟอร์)
  • :e <file path> (แก้ไขเปิดบัฟเฟอร์ใหม่>
  • pltags - เปิดใช้งานการข้ามไปที่รูทีนย่อย / นิยามเมธอด

2
350 ไฟล์ !!! นั่นเป็นสิ่งที่น่าประทับใจ คุณจะพบบัฟเฟอร์ที่ถูกต้องเพื่อข้ามไปได้อย่างไร คุณเคยแยกไหม
Brian O'Dell

3
@ BrianO'Dell :b <partial filename><tab>บวกset wildmenuในของคุณ.vimrcทำงานได้ดีเมื่อคุณได้มีตันของบัฟเฟอร์เปิด จากนั้นคุณเพียงแค่จับคู่บางส่วนและเลื่อนดูสิ่งที่พบ ในบรรณาธิการที่ดีคนอื่น ๆ คุณมีการค้นพบแบบฟัซซี่ แต่โดยปกติแล้วคุณไม่สามารถ จำกัด การค้นหาแบบฟัซซี่เพียงไฟล์ที่คุณเปิด
icc97

17

การเพิ่มคำตอบอื่น ๆ เนื่องจากไม่ได้ครอบคลุมคำตอบใด ๆ

หากต้องการเปลี่ยนบัฟเฟอร์ทั้งหมดเพื่อtabดู

 :tab sball

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

gt or :tabn           "    go to next tab
gT or :tabp or :tabN  "    go to previous tab

:help tab-page-commandsรายละเอียดได้ที่

vim -p file1 file2เราสามารถสั่งเป็นกลุ่มที่จะเปิดมุมมองแท็บหลายไฟล์โดย alias vim='vim -p'จะเป็นประโยชน์
สิ่งเดียวกันนี้สามารถทำได้โดยการทำตามคำแนะนำอัตโนมัติ~/.vimrc

 au VimEnter * if !&diff | tab all | tabfirst | endif

ยังไงก็ตามที่จะตอบคำถาม: เพื่อเพิ่มในรายการหาเรื่อง: arga file,

หากต้องการลบออกจากรายการหาเรื่อง: argd pattern

เพิ่มเติมที่ :help arglist


16

คุณอาจต้องการที่จะใช้เครื่องหมายทั่วโลกที่เป็นกลุ่ม

วิธีนี้คุณสามารถเด้งกลับอย่างรวดเร็วระหว่างไฟล์และแม้แต่ตำแหน่งที่ทำเครื่องหมายไว้ในไฟล์ นอกจากนี้คำสั่งที่สำคัญยังสั้น: 'C พาฉันไปที่รหัสที่ฉันทำงานด้วย 'T พาฉันไปที่บททดสอบที่ฉันทำงานด้วย

เมื่อคุณเปลี่ยนสถานที่การรีเซ็ตเครื่องหมายก็รวดเร็วเช่นกัน: mC ทำเครื่องหมายจุดรหัสใหม่ mT ทำเครื่องหมายจุดทดสอบใหม่


12

ฉันใช้ไฟล์. vimrc เดียวกันสำหรับ gVim และ command line Vim ฉันมักจะใช้แท็บใน gVim และบัฟเฟอร์ในบรรทัดคำสั่ง Vim ดังนั้นฉันได้ตั้งค่า. vimrc ของฉันให้ทำงานกับทั้งสองได้ง่ายขึ้น:

" Movement between tabs OR buffers
nnoremap L :call MyNext()<CR>
nnoremap H :call MyPrev()<CR>

" MyNext() and MyPrev(): Movement between tabs OR buffers
function! MyNext()
    if exists( '*tabpagenr' ) && tabpagenr('$') != 1
        " Tab support && tabs open
        normal gt
    else
        " No tab support, or no tabs open
        execute ":bnext"
    endif
endfunction
function! MyPrev()
    if exists( '*tabpagenr' ) && tabpagenr('$') != '1'
        " Tab support && tabs open
        normal gT
    else
        " No tab support, or no tabs open
        execute ":bprev"
    endif
endfunction

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


1
ฉันชอบการแมปเหล่านี้ ลอง Ctrl-H, Ctrl-L ด้วย ฉันตั้งค่า Firefox และเทอร์มินอล gnome ด้วยการแมปเดียวกัน มีความสุขมากที่จะมีคีย์ลัดแท็บที่สอดคล้องกัน
cmcginty

4
ใช้คีย์ผู้นำของคุณแทน Ctrl เพื่อหลีกเลี่ยงการ clobbering แมปที่มีอยู่
aehlke

10

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


9

หากใช้คำสั่งในตัวเฉพาะกลุ่มคำสั่งที่ดีที่สุดที่ฉันเคยเห็นเพื่อสลับไปมาระหว่างหลายบัฟเฟอร์คือ:

nnoremap <Leader>f :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

มันสมบูรณ์แบบผสมผสานทั้งสอง:lsและ:bคำสั่ง - รายชื่อบัฟเฟอร์ที่เปิดอยู่ทั้งหมดและรอให้คุณใส่คำสั่งสลับบัฟเฟอร์

ดังกล่าวข้างต้นการทำแผนที่ใน vimrc เมื่อคุณพิมพ์<Leader>f,

  • บัฟเฟอร์เปิดทั้งหมดแสดง
  • คุณสามารถ:
    • พิมพ์23เพื่อไปที่บัฟเฟอร์ 23
    • พิมพ์#เพื่อไปที่ทางเลือก / บัฟเฟอร์ MRU
    • พิมพ์ชื่อบางส่วนของไฟล์จากนั้นพิมพ์<Tab>หรือ<C-i>เติมข้อความอัตโนมัติ
    • หรือเพียงแค่<CR>หรือ<Esc>จะอยู่ในบัฟเฟอร์ปัจจุบัน

สแน็ปช็อตของเอาต์พุตสำหรับการจับคู่คีย์ด้านบนคือ:

:set nomore|:ls|:set more
  1  h    "script.py"    line 1
  2 #h  + "file1.txt"    line 6  -- '#' for alternative buffer
  3 %a    "README.md"    line 17 -- '%' for current buffer
  4       "file3.txt"    line 0  -- line 0 for hasn't switched to
  5     + "/etc/passwd"  line 42 -- '+' for modified
:b '<Cursor> here'

ในภาพรวมด้านบน:

  • คอลัมน์ที่สอง: %aสำหรับปัจจุบัน, hซ่อน, #สำหรับก่อนหน้า, ว่างเปล่าสำหรับยังไม่ได้เปลี่ยนเป็น
  • คอลัมน์ที่สาม: +สำหรับการแก้ไข

set hiddenนอกจากนี้ผมขอแนะนำให้ :help 'hidden'ดู


นี่เป็นความคิดที่ยอดเยี่ยม! ผมเคยใช้:bและ:lsเป็นจำนวนมาก แต่เป็นอิสระ ฉันคิดว่าสิ่งนี้มีประโยชน์น้อยกว่าเมื่อคุณมีบัฟเฟอร์มากกว่าหนึ่งหน้า แต่จากนั้นคุณก็ยังสามารถย้อนกลับไปที่:b
icc97

ดีใจที่เห็นมันช่วย ไชโย! :)
qeatzy

จากVim wikiaนี้คุณสามารถย่อให้สั้นลงได้nnoremap <leader>f :ls<cr>:b<space>ซึ่งอาจทำให้เกิดปัญหากับคำสั่ง 'more'
icc97

ใช่ทางที่ทำงานอย่างสมบูรณ์หากไฟล์น้อยลงจะเปิด (กรณีใช้งานปกติ) set moreสิ่งต่าง ๆ สร้างความแตกต่างเมื่อมีไฟล์จำนวนมากเปิด (มากกว่าหนึ่งหน้า) เช่นvim /usr/include/*แม้ว่าจะมีประโยชน์น้อยกว่า
qeatzy

8

ฉันใช้สิ่งต่อไปนี้สิ่งนี้ให้คุณสมบัติมากมายที่คุณคาดหวังว่าจะมีในบรรณาธิการอื่น ๆ เช่น Sublime Text / Textmate

  1. ใช้บัฟเฟอร์ไม่ใช่ 'หน้าแท็บ' บัฟเฟอร์ที่มีแนวคิดเดียวกันเป็นแท็บในเกือบทุกบรรณาธิการอื่น ๆ
  2. หากคุณต้องการลักษณะเดียวกันของการมีแท็บคุณสามารถใช้เป็นกลุ่มสายการบินปลั๊กอินกับการตั้งค่าต่อไปนี้ในของคุณ:.vimrc let g:airline#extensions#tabline#enabled = 1สิ่งนี้จะแสดงบัฟเฟอร์ทั้งหมดโดยอัตโนมัติเป็นส่วนหัวของแท็บเมื่อคุณไม่ได้เปิดหน้าแท็บ
  3. ใช้vim-unimpairedของ Tim Pope ที่ให้[bและ]bย้ายไปยังบัฟเฟอร์ก่อนหน้า / ถัดไปตามลำดับ (บวกโฮสต์ของสินค้าอื่นทั้งหมด)
  4. มีset wildmenuในของคุณ.vimrcแล้วเมื่อคุณพิมพ์:b <file part>+ Tabสำหรับบัฟเฟอร์คุณจะได้รับรายการของบัฟเฟอร์ที่เป็นไปได้ที่คุณสามารถใช้ลูกศรซ้าย / ขวาเพื่อเลื่อนดู
  5. ใช้ปลั๊กอินvim-obsessionของ Tim Pope เพื่อจัดเก็บเซสชันที่เล่นได้ดีกับสายการบิน (ฉันมีอาการปวดมากกับเซสชันและปลั๊กอิน )
  6. ใช้ปลั๊กอินvim-vinegarของ Tim Pope สิ่งนี้ใช้ได้กับชาวพื้นเมือง:Exploreแต่ทำให้การทำงานกับมันง่ายขึ้นมาก คุณเพียงแค่พิมพ์-เพื่อเปิด explorer ซึ่งเป็นคีย์เดียวกับที่จะไปยังไดเรกทอรีใน explorer ทำให้การนำทางเร็วขึ้น (แต่ด้วย fzf ฉันไม่ค่อยใช้สิ่งนี้)
  7. fzf (ซึ่งสามารถติดตั้งเป็นเสียงเรียกปลั๊กอิน) นอกจากนี้ยังเป็นโปรแกรมค้นหาเลือนมีประสิทธิภาพจริงๆที่คุณสามารถใช้สำหรับการค้นหาไฟล์ (และบัฟเฟอร์เกินไป) fzf ยังเล่นอย่างมากกับ FD (รุ่นที่เร็วขึ้นของการค้นหา)
  8. ใช้Ripgrepกับvim-ripgrepเพื่อค้นหาฐานรหัสของคุณจากนั้นคุณสามารถใช้:cdoผลลัพธ์เพื่อทำการค้นหาและแทนที่

fzf และ fzf-vim เปลี่ยนชีวิตของฉันไม่สามารถแนะนำได้พอ นอกจากนี้ยังใช้งานได้ดีบน windows แม้ในคอนโซลเพื่อค้นหาไฟล์ที่คลุมเครือ บน windows ใช้แบ็กเอนด์ ripgrep (rg) ซึ่งในประสบการณ์ของฉันมีประสิทธิภาพสูงกว่าเครื่องมือ find / grep อื่น ๆ (เช่น silversearcher หรือเด Windows เริ่มต้นพบว่า fzf ใช้ iirc) คุณสามารถใช้มันเพื่อค้นหารายการใด ๆ : ไฟล์ที่ใช้ล่าสุด, บัฟเฟอร์ที่เปิดในปัจจุบัน, บรรทัดในบัฟเฟอร์ปัจจุบัน, บรรทัดใน codebase (cwd), แท็ก, .. คุณสามารถตั้งโปรแกรมการค้นหารายการของคุณเองได้อย่างง่ายดาย ดีมาก! (ฉันมาจาก ctrl-p และไม่เคยมองย้อนกลับไป)
Emile Vrijdags

7

วิธีที่ฉันจะทำงานกับไฟล์หลาย ๆ ไฟล์ได้อย่างมีประสิทธิภาพคือการใช้ tmux

ช่วยให้คุณสามารถแบ่ง windows ตามแนวตั้งและแนวนอนได้ตามที่:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันใช้วิธีนี้กับทั้งเครื่อง mac และเครื่อง linux ของฉันและฉันพบว่าดีกว่ากลไกการสลับบานหน้าต่างหน้าต่างดั้งเดิมที่มีให้ (ใน Macs) ฉันพบว่าการสลับง่ายขึ้นและมีเฉพาะกับ tmux เท่านั้นที่ฉันสามารถรับ 'หน้าใหม่ที่ไดเรกทอรีปัจจุบันเดียวกัน' ที่ทำงานบน mac ของฉัน (แม้ว่าจะมีตัวเลือกในการเปิดบานหน้าต่างใหม่ในไดเรกทอรีเดียวกัน) ซึ่งเป็น ชิ้นส่วนที่สำคัญอย่างน่าประหลาดใจ บานหน้าต่างใหม่ทันทีที่ตำแหน่งปัจจุบันมีประโยชน์อย่างน่าอัศจรรย์ วิธีการที่ทำให้บานหน้าต่างใหม่ที่มีคอมโบคีย์เดียวกันสำหรับทั้งสองระบบปฏิบัติการมีความสำคัญสำหรับฉันและโบนัสสำหรับทุกคนเพื่อความเข้ากันได้ส่วนบุคคลในอนาคต นอกเหนือจากบานหน้าต่าง tmux หลายบานฉันได้ลองใช้หลายแท็บเช่นป้อนคำอธิบายรูปภาพที่นี่และหลายหน้าต่างใหม่เช่นป้อนคำอธิบายรูปภาพที่นี่และในที่สุดฉันก็ได้พบว่าหลาย tmux panes นั้นมีประโยชน์มากที่สุดสำหรับฉัน ฉันเป็น 'ภาพ' และชอบที่จะทำให้บริบทต่าง ๆ ของฉันอยู่ตรงหน้าฉันเชื่อมต่อกันเป็นบานหน้าต่าง

tmux ยังสนับสนุนบานหน้าต่างแนวนอนและแนวตั้งที่เก่ากว่าscreenไม่ได้ (แม้ว่า iterm2 ของ mac ดูเหมือนว่าจะสนับสนุน แต่อีกครั้งการตั้งค่าไดเรกทอรีปัจจุบันไม่ทำงานสำหรับฉัน) tmux 1.8


1
ฉันได้ไปครับเมื่อผมเห็นตัวอย่างของเทียมของ "หน้าต่างหลาย" ฉันหวังว่าไม่มีใครทำงานเช่นนั้น :-) อย่างไรก็ตามฉันใช้การปูกระเบื้อง wm ซึ่งดียิ่งขึ้น (ฉันเปลี่ยนจาก tmux เป็น i3wm) เพียงเพื่อตอบคำถามของคุณ
lzap

1
Tmux นั้นยอดเยี่ยมและฉันใช้วิธีนี้มานาน แต่มันทำให้การนำทางและการคัดลอกและวางระหว่างสองไฟล์ยากขึ้น
neallred

1
ฉันเคยทำเช่นนี้ แต่การมีบัฟเฟอร์เป็นกลุ่มหลายอย่างนั้นยอดเยี่ยมกว่าเมื่อคุณต้องดึง / วาง
Titou

3

ผมใช้บรรทัดคำสั่งและคอมไพล์มากดังนั้นผมมีนามแฝงนี้ใน bashrc ฉัน:

alias gvim="gvim --servername \$(git rev-parse --show-toplevel || echo 'default') --remote-tab"

นี่จะเปิดแต่ละไฟล์ใหม่ในแท็บใหม่บนหน้าต่างที่มีอยู่และจะสร้างหนึ่งหน้าต่างสำหรับที่เก็บ git แต่ละอัน ดังนั้นถ้าคุณเปิดไฟล์สองไฟล์จาก repo A และ 3 ไฟล์จาก repo B คุณจะจบด้วยสองหน้าต่างหนึ่งสำหรับ repo A ที่มีสองแท็บและอีกอันสำหรับ repo B ที่มีสามแท็บ

หากไฟล์ที่คุณกำลังเปิดไม่มีอยู่ใน git repo ไฟล์นั้นจะไปที่หน้าต่างเริ่มต้น

หากต้องการข้ามไปมาระหว่างแท็บต่างๆฉันใช้การจับคู่เหล่านี้:

nmap <C-p> :tabprevious<CR>
nmap <C-n> :tabnext<CR>

หากต้องการเปิดหลายไฟล์พร้อมกันคุณควรรวมเข้ากับโซลูชันอื่น


3

ฉันใช้บัฟเฟอร์หลายชุดที่ซ่อนอยู่ใน~/.vimrcไฟล์ของฉัน

สคริปต์ mini-buffer explorer นั้นดีเหมือนกันที่จะได้รายชื่อบัฟเฟอร์ที่กะทัดรัดของคุณ จากนั้น:b1หรือ:b2... เพื่อไปที่บัฟเฟอร์ที่เหมาะสมหรือใช้ mini-buffer explorer และแท็บผ่านบัฟเฟอร์


2

ลองทำแผนที่ต่อไปนี้เพื่อความสะดวกในการแก้ไขหลายไฟล์

"หน้าต่างแยก

nmap <leader>sh :leftabove vnew<CR>

nmap <leader>sl :rightbelow vnew<CR>

nmap <leader>sk :leftabove new<CR>

nmap <leader>sj :rightbelow new<CR>

" เคลื่อนที่ไปรอบ ๆ

nmap <C-j> <C-w>j

nmap <C-k> <C-w>k

nmap <C-l> <C-w>l

nmap <C-h> <C-w>h


2

ฉันทำวิดีโอง่าย ๆ ที่แสดงขั้นตอนการทำงานที่ฉันใช้ โดยทั่วไปฉันใช้ปลั๊กอินCtrl-P Vim และฉันแมปการนำทางบัฟเฟอร์กับคีย์ Enter

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

ฉันไม่ได้เปิดไฟล์หลายไฟล์ในวิดีโอ แต่มันมีประโยชน์อย่างเหลือเชื่อเมื่อคุณเริ่มมีไฟล์จำนวนมาก

เนื่องจากปลั๊กอินเรียงลำดับบัฟเฟอร์โดยใช้การสั่งซื้อ MRU คุณสามารถกด Enter สองครั้งแล้วข้ามไปยังไฟล์ล่าสุดที่คุณกำลังแก้ไข

หลังจากติดตั้งปลั๊กอินแล้วการกำหนดค่าเดียวที่คุณต้องการคือ:

nmap <CR> :CtrlPBuffer<CR>

แน่นอนคุณสามารถแมปไปยังคีย์อื่นได้ แต่ฉันพบว่าการแม็พเพื่อป้อนนั้นมีประโยชน์มาก



2

ในผู้ใช้ที่เป็นกลุ่มของฉันและอื่น ๆ ตัวเลือกที่ดีที่สุดคือ

  • เปิดไฟล์โดยใช้

: e file_name.extension

จากนั้นเพียงกด Ctrl + 6 เพื่อเปลี่ยนเป็นบัฟเฟอร์สุดท้าย หรือคุณสามารถกด

: ls เพื่อแสดงรายการบัฟเฟอร์แล้วเปลี่ยนบัฟเฟอร์โดยใช้ b ตามด้วยหมายเลขบัฟเฟอร์

  • เราทำการแบ่งตามแนวตั้งหรือแนวนอนโดยใช้

: vsp สำหรับการแบ่งตามแนวตั้ง

: sp สำหรับการแยก horizantal

และจากนั้น<C-W><C-H/K/L/j>ให้เปลี่ยนการแยกการทำงาน

คุณสามารถ ofcourse แก้ไขไฟล์ใด ๆ ในจำนวนของการแยกใด ๆ


โปรดแก้ไขคำตอบของคุณเพื่อให้แน่ใจว่าจะได้รับการปรับปรุงตามคำตอบอื่น ๆ ที่มีอยู่แล้วในคำถามนี้
hongsy

1

เมื่อฉันเริ่มใช้ VIM ฉันไม่ทราบว่าควรใช้แท็บเป็นเลย์เอาต์หน้าต่างที่แตกต่างกันและบัฟเฟอร์มีหน้าที่สำหรับการแก้ไข / สลับไฟล์หลายไฟล์ระหว่างกัน ที่จริงแล้วในแท็บเริ่มต้นไม่ได้อยู่ตรงนั้นก่อนหน้า v7.0 และฉันเพิ่งเปิด VIM หนึ่งอันในแท็บเทอร์มินัล (ตอนนี้ฉันใช้ gnome-terminal ในเวลานั้น) และสลับระหว่างแท็บที่ใช้ alt + numbers เนื่องจากฉันคิดว่าใช้คำสั่งเช่น : บัฟเฟอร์,: bn และ: bp มากเกินไปสำหรับฉัน เมื่อ VIM 7.0 เปิดตัวฉันพบว่ามันง่ายกว่าในการจัดการไฟล์จำนวนมากและเปลี่ยนไปใช้มัน แต่เมื่อเร็ว ๆ นี้ฉันเพิ่งรู้ว่าบัฟเฟอร์ควรเป็นทางที่จะไปเว้นแต่ว่ามีสิ่งหนึ่งที่คุณต้องกำหนดค่าเพื่อให้ทำงานได้ถูกต้อง

ดังนั้นฉันจึงพยายามเป็นกลุ่มสายการบินและเปิดใช้งานแถบบัฟเฟอร์แบบแท็บบนภาพ แต่กราฟิกนั้นมีปัญหากับ iTerm2 ของฉันดังนั้นฉันจึงลองใช้คู่อื่นและดูเหมือนว่า MBE จะทำงานได้ดีที่สุดสำหรับฉัน ฉันยังตั้งค่า Shift + h / l เป็นทางลัดเนื่องจากปุ่มดั้งเดิม (การเลื่อนไปที่ส่วนหัว / ส่วนท้ายของหน้าปัจจุบัน) ไม่มีประโยชน์สำหรับฉัน

map <S-h> :bprev<Return>
map <S-l> :bnext<Return>

ดูเหมือนว่าจะง่ายกว่า gt และ gT และ: e ก็ง่ายกว่า: แท็บใหม่ด้วย ฉันค้นหา: bd ไม่สะดวกเท่ากับ: q แม้ว่า (MBE กำลังมีปัญหากับมัน) แต่ฉันสามารถอยู่กับไฟล์ทั้งหมดในบัฟเฟอร์ได้ฉันคิดว่า



0

ที่สุดของคำตอบในหัวข้อนี้จะใช้คำสั่งเสียงเรียกธรรมดาซึ่งเป็นหลักสูตรที่ดี แต่ผมคิดว่าผมจะให้คำตอบที่กว้างขวางโดยใช้การรวมกันของปลั๊กอินและฟังก์ชั่นที่ผมพบว่ามีประโยชน์โดยเฉพาะอย่างยิ่ง (อย่างน้อยบางส่วนของเคล็ดลับเหล่านี้มาจากไฟล์แกรี่แบร์นฮาร์ดของ เคล็ดลับการนำทาง ):

  1. หากต้องการสลับระหว่างสองไฟล์สุดท้ายให้กด<leader>สองครั้ง ฉันขอแนะนำให้กำหนด<leader>ให้กับ spacebar:

    nnoremap <leader><leader> <c-^>
    
  2. ได้อย่างรวดเร็วย้ายไปรอบ ๆ โครงการคำตอบคือการแก้ปัญหาการจับคู่คลุมเครือเช่นCtrlP ฉันผูกมันเพื่อ<leader>aการเข้าถึงที่รวดเร็ว

  3. ในกรณีที่ผมต้องการที่จะเห็นการแสดงออกของบัฟเฟอร์เปิดอยู่ในปัจจุบันผมใช้ปลั๊กอิน BufExplorer เรียบง่าย แต่มีประสิทธิภาพ

  4. ถ้าฉันต้องการเรียกดูรอบ ๆ ระบบไฟล์ฉันจะใช้บรรทัดคำสั่งหรือยูทิลิตี้ภายนอก (Quicklsilver, Afred ฯลฯ ) แต่เพื่อดูโครงสร้างโครงการปัจจุบันNERD Treeเป็นแบบคลาสสิก อย่าใช้2วิธีนี้แทนวิธีหลักในการค้นหาไฟล์ของคุณ มันจะทำให้คุณช้าลงจริงๆ <leader>ffผมใช้ที่มีผลผูกพัน

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

  1. เปิดตัวแยกใหม่ในพื้นที่ที่เล็กลงเมื่อมีที่ว่างไม่เพียงพอและขยายในการนำทาง อ้างอิงที่นี่สำหรับความคิดเห็นเกี่ยวกับสิ่งเหล่านี้:

    set winwidth=84
    set winheight=5
    set winminheight=5
    set winheight=999
    
    nnoremap <C-w>v :111vs<CR>
    nnoremap <C-w>s :rightbelow split<CR>
    set splitright
    
  2. ย้ายจากการแยกเป็นการแบ่งได้อย่างง่ายดาย:

    nnoremap <C-J> <C-W><C-J>
    nnoremap <C-K> <C-W><C-K>
    nnoremap <C-L> <C-W><C-L>
    nnoremap <C-H> <C-W><C-H>
    

0

คุณสามารถเป็นคนบ้าแน่นอนและนามแฝงvimไปvim -pโดยการเพิ่มในของคุณ.bashrc:

alias vim="vim -p"

ซึ่งจะส่งผลให้เปิดหลายไฟล์จากเชลล์ในแท็บโดยไม่ต้องเรียกใช้:tab ballจากภายในกลุ่มหลังจากนั้น

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