คุณต้องการสลับระหว่างบัฟเฟอร์ใน Vim อย่างไร


92

ฉันได้ลองใช้MiniBufExplorerแล้ว แต่โดยปกติแล้วฉันมักจะมีหน้าต่างหลายบานแสดงหรือปิดไปพร้อมกัน สิ่งที่ฉันต้องการคือบางอย่างเช่นLustyJugglerพร้อมการค้นหาที่เพิ่มขึ้นวิธีที่ฉันสลับระหว่างบัฟเฟอร์ใน Emacs มีสคริปต์แบบนี้แน่ ๆ ?

คำตอบ:


23

ฉันใช้ปลั๊กอิน Command-T vimของ Wincent Colaiuta มาสองสามเดือนแล้ว Wincent เขียนส่วนของมันที่ต้องเร็วเป็น C และต้องบอกว่ามัน! และฉันคิดว่าตรรกะการจับคู่รูปแบบไฟล์นั้นดีกว่า Command-T ของ Textmate ตรวจสอบscreencast

ปลั๊กอิน Command-T สำหรับ VIM มีกลไกที่รวดเร็วและใช้งานง่ายสำหรับการเปิดไฟล์ด้วยการกดแป้นพิมพ์จำนวนน้อยที่สุด มีชื่อว่า "Command-T" เนื่องจากได้รับแรงบันดาลใจจากหน้าต่าง "ไปที่ไฟล์" ที่ผูกไว้กับ Command-T ใน TextMate

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

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

"" Tab triggers buffer-name auto-completion
set wildchar=<Tab> wildmenu wildmode=full

let mapleader = ","

map <Leader>t :CommandT<Return>
map <Leader>a :bprev<Return>
map <Leader>s :bnext<Return>
map <Leader>d :bd<Return>
map <Leader>f :b 

"" Show the buffer number in the status line.
set laststatus=2 statusline=%02n:%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

ฉันยังใช้MiniBufExplorerซึ่งมีรายการขนาดกะทัดรัดของบัฟเฟอร์ที่ระบุไว้ในแต่ละรายการในแนวนอนแยกด้านบน


73

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

จากนั้นฉันอ่านโพสต์ของ Jamis Buck เกี่ยวกับวิธีที่เขาเปลี่ยนจาก TextMate กลับไปเป็นกลุ่มและเรียนรู้เทคนิคที่ยอดเยี่ยม:

  • Ctrl-w s และ Ctrl-w v เพื่อแบ่งหน้าต่างปัจจุบัน
  • Ctrl-6 เพื่อสลับไปมาระหว่างสองบัฟเฟอร์ในหน้าต่างเดียวกัน
  • น่ากลัวfuzzyfinder.vimที่ช่วยให้คุณสามารถเติมข้อความอัตโนมัติค้นหาไฟล์ในไดเรกทอรีปัจจุบันของคุณหรือของบัฟเฟอร์คุณขณะนี้มีการเปิด
  • Jamis เองfuzzy_file_finderและfuzzyfinder_textmateซึ่งเล็กน้อยปรับเปลี่ยนวิธีการทำงานของ fuzzyfinder การทำงานมากขึ้นเช่นคุณลักษณะที่คล้ายกันใน TextMate (เท่าที่ผมสามารถบอกความแตกต่างก็คือว่ามันตรงกับที่ใดก็ได้ในชื่อไฟล์แทนเฉพาะตั้งแต่เริ่มต้น) ดูวิดีโอนี้เพื่อดูการใช้งานจริง

ตอนนี้ฉันมีอินสแตนซ์ gvim เพียงตัวเดียวขยายใหญ่สุดและแยกออกเป็นหลาย ๆ หน้าต่างเพื่อที่ฉันจะได้เห็นไฟล์หลาย ๆ ไฟล์พร้อมกัน ฉันผูก Ctrl-F กับ fuzzyfinder_textmate ดังนั้นตอนนี้ถ้าฉันพิมพ์ (พูด) Ctrl-F mod/usobมันจะเปิดแอพ / รุ่น / user_observer.rb ฉันแทบไม่เคยรำคาญกับแท็บอีกต่อไป

อัปเดต 2010/08/07

ในขณะที่ fuzzyfinder_textmate ยังคงยอดเยี่ยมดังที่ Casey ชี้ให้เห็นในความคิดเห็น แต่ก็ไม่ได้รับการดูแลอีกต่อไป นอกจากนี้ (และ / หรือ fuzzyfinder.vim) ทำงานช้าและไม่เสถียรเล็กน้อยเมื่อทำงานกับโครงการขนาดใหญ่ (ไดเรกทอรีหรือไฟล์จำนวนมาก) ดังนั้นฉันจึงมองหาทางเลือกอื่น

โชคดีที่มีน่าจะเป็นทางเลือกที่ดีมากในรูปแบบของWincent Colaiuta 's คำสั่ง T ปลั๊กอิน สิ่งนี้มีลักษณะการทำงานที่คล้ายกันมาก (ถ้าไม่ดีกว่าเล็กน้อย) กับ fuzzyfinder_textmate แต่เร็วกว่าอย่างเห็นได้ชัด นอกจากนี้ยังมีคุณสมบัติที่ดีเช่นความสามารถในการเปิดไฟล์ที่พบในแบบแยกหรือแนวตั้ง ขอขอบคุณ (และคะแนนโหวต!) ถึง David Rivers ที่ชี้ให้เห็น


ใช่ fuzzyfinder เป็นสิ่งที่ใกล้เคียงกับสิ่งที่ฉันต้องการ
Alexey Romanov

fuzzyfinder_textmate ของ Jamis สร้างกลุ่มเสร็จสมบูรณ์ มันควรจะกลายเป็นคุณสมบัติหลักจริงๆ!
csexton

ดูเหมือนว่า Jami จะหยุดทำโปรเจ็กต์นี้แล้ว บางทีผู้เขียนต้นฉบับจะดึงคุณสมบัติเหล่านี้เข้ามา? weblog.jamisbuck.org/2009/1/28/…
cmcginty

แซมขอบคุณสำหรับอุปกรณ์ประกอบฉากที่คุณให้ฉัน (ในวันเกิดของฉัน!): D
David Rivers

14
ลองใช้ปลั๊กอิน ctrlp vim ( kien.github.com/ctrlp.vim ) มันใช้ fuzzyfinder แต่มีคุณสมบัติที่มีประโยชน์มากกว่านี้ :)
Philip

33

ฉันใช้พื้นฐาน - ' :ls' + ' :bn' / ' :bp' + ' :b <part-of-name>'


8
:-) ฉันไม่เคยคิดว่าจะเห็น "ง่าย" และ "': ls' + ': bn' / ': bp' + ': b <part-of-name>'" ในประโยคเดียวกัน
paxdiablo

16
Pax ผมยังไม่เห็น :-)
csexton

สิ่งนี้บวก:map <c-n> :bn<cr>และ:map <c-p> :bp<cr>ตั้งแต่C-nและC-pเร็วในการพิมพ์และอนุญาตให้มีการหมุนเวียนระหว่างบัฟเฟอร์หากคุณกดซ้ำ ๆ (ฉันไม่เคยใช้มันเพื่อจุดประสงค์เดิม) มันเหมือนกับการหมุนเวียนระหว่างแท็บเบราว์เซอร์กับC-PgUpและC-PgDnหรือทางลัดใด ๆ ที่เบราว์เซอร์ของคุณมี
Tobia

Ctrl + N เป็นมาตรฐานสำหรับ 'ไฟล์ใหม่' ในโปรแกรมแก้ไขอื่น ๆ ส่วนใหญ่และ Ctrl + P เป็นคำสั่งวางดังนั้นสำหรับคนส่วนใหญ่สิ่งเหล่านี้จะสับสนมาก vim-unimpairedของ Tim Pope ให้คุณ[bสำหรับบัฟเฟอร์ก่อนหน้าและ]bสำหรับบัฟเฟอร์ถัดไป รวมถึงสินค้าอื่น ๆ อีกมากมายที่ใช้แนวคิด]สำหรับถัดไปและ[ก่อนหน้า
icc97

31

ฉันชอบ "ctrl-w s" และ "ctlr-w v" เพื่อแบ่งหน้าต่าง จากนั้นฉันแมปปุ่มการเคลื่อนไหว (h, j, k, l) โดยกด ctrl ค้างไว้เพื่อเลื่อนไปมาระหว่างหน้าต่างแยก:

" Map ctrl-movement keys to window switching
map <C-k> <C-w><Up>
map <C-j> <C-w><Down>
map <C-l> <C-w><Right>
map <C-h> <C-w><Left>

การต้องขยับมือไปที่ปุ่มลูกศรนั้นน่ารำคาญ

ต่อไปฉันตั้งค่า ctlr-tab เพื่อสลับระหว่างบัฟเฟอร์ในหน้าต่างปัจจุบัน (เช่นสภาพแวดล้อมอื่น ๆ ):

" Switch to alternate file
map <C-Tab> :bnext<cr>
map <C-S-Tab> :bprevious<cr>

สิ่งเหล่านี้ทำงานได้ดีสำหรับฉันในช่วงหลายปีที่ผ่านมาแม้ว่ากลุ่มคนจะมีความลับมากกว่าที่คุณจะรู้ก็ตาม


3
ความคิดเห็นของคุณ "เปลี่ยนเป็นไฟล์อื่น" ทำให้เข้าใจผิดเนื่องจาก Vim มีไฟล์สำรองอยู่แล้วเป็นไฟล์ก่อนหน้านี้ที่คุณเปิดอยู่และคุณสามารถสลับไฟล์ปัจจุบัน (%) และไฟล์สำรอง (#) ได้อย่างง่ายดายโดยใช้ ctrl-6
graywh

10
นอกจากนี้ <Cw> ด้วย hjkl จะสลับหน้าต่าง - ไม่จำเป็นต้องใช้ปุ่มลูกศร
graywh

4
<CS-Tab> กำลังขอ RSI ฉันได้แมป <SJ> ถึง:bpและ <SK> ถึง:bn
puk

3
การรีแมป <SJ> ดูเหมือนจะเป็นทางเลือกที่ไม่ดีในโหมดปกติเนื่องจากมักใช้กัน (สำหรับการต่อสาย)
Michael Percy

18
nmap <Leader>bb :ls<CR>:buffer<Space>

และไม่มีใครกล่าวถึงปลั๊กอินที่ดีctrlp.vim การใช้ปลั๊กอินนี้คุณสามารถค้นหาบัฟเฟอร์ตามชื่อ


ฉันชอบการทำแผนที่! ฉลาดและยืดหยุ่น
ivan

14

ฉันใช้

CTRL- Jสำหรับบัฟเฟอร์ถัดไป

CTRL- Kสำหรับบัฟเฟอร์ก่อนหน้า

CTRL- Lสำหรับแท็บถัดไป

CTRL- Hสำหรับแท็บก่อนหน้า

นี่คือการ.vimrcกำหนดค่า:

map <C-J> :bnext<CR>
map <C-K> :bprev<CR>
map <C-L> :tabn<CR>
map <C-H> :tabp<CR>

ดูhttp://syskall.com/my-biggest-vim-productivity-boost/


5
imap <A-1> <Esc>:tabn 1<CR>i
imap <A-2> <Esc>:tabn 2<CR>i
imap <A-3> <Esc>:tabn 3<CR>i
imap <A-4> <Esc>:tabn 4<CR>i
imap <A-5> <Esc>:tabn 5<CR>i
imap <A-6> <Esc>:tabn 6<CR>i
imap <A-7> <Esc>:tabn 7<CR>i
imap <A-8> <Esc>:tabn 8<CR>i
imap <A-9> <Esc>:tabn 9<CR>i

map <A-1> :tabn 1<CR>
map <A-2> :tabn 2<CR>
map <A-3> :tabn 3<CR>
map <A-4> :tabn 4<CR>
map <A-5> :tabn 5<CR>
map <A-6> :tabn 6<CR>
map <A-7> :tabn 7<CR>
map <A-8> :tabn 8<CR>
map <A-9> :tabn 9<CR>

1
สิ่งที่น่าสนใจที่สุดของ Vim คือคุณสามารถเรียนรู้บางสิ่งได้ทุกวัน!
Luc M

คำถามเกี่ยวกับบัฟเฟอร์ไม่ใช่แท็บ ... แต่ก่อนอื่นคุณสามารถใช้:tab sballหรือแทนที่จะใช้:tabnคุณควรใช้:buffer
pera

5

ฉันเพิ่งไปดูมินิมอลมากขึ้น

ในการวนบัฟเฟอร์ที่ฉันใช้]bและ[bจากที่ไม่ได้จับคู่: https://github.com/tpope/vim-unimpaired

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

ในทำนองเดียวกันกับเปิดบัฟเฟอร์ฉันใช้:eกับเส้นทางสัมพัทธ์และแท็บเสร็จสมบูรณ์

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

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

ทุกสิ่งที่มินิบัฟที่ฉันลองจบลงทำให้ฉันรำคาญและฉันไม่ต้องการให้สิ่งที่จับคู่อัจฉริยะเปิดไฟล์แบบสุ่มให้ฉัน หากฉันต้องการค้นหาบางสิ่งจริงๆฉันใช้ NERDtree ( :e .)

IDK เมื่อเร็ว ๆ นี้ฉันก็ทิ้งแยงกริง (เพราะมันสกรูขึ้นxp) และเริ่มใช้รีจิสเตอร์และฉันเพิ่งตัดสินใจว่าf/ tการเคลื่อนไหวเป็นสิ่งที่ยิ่งใหญ่ที่สุดที่เคยมีมา ...


ทั้งหมดนี้เป็นคำแนะนำที่ดี ฉันแมป<leader>llกับ:ls. นอกจากนี้ยังมีประโยชน์มากในการตรวจสอบให้แน่ใจว่าคุณมีset wildmenuอยู่ใน.vimrcขณะนั้นคุณจะได้รับเมนูเล็ก ๆ ที่มาพร้อมกับทางเลือกทั้งหมดสำหรับ:b
icc97

2

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


2

ฉันใช้เวลาค่อนข้างนานในการสร้าง. vimrc เพื่อทำงานกับโครงการ HTML :: Mason นี้ที่ฉันทำมาสี่ปีแล้วดังนั้นฉันจึงมีแท็บและหน้าต่างแยกที่แปลก ๆ เพื่อความเพลิดเพลินในการรับชมของคุณ:

map ;o :Sex <CR>
map <C-J> <C-W>j
map <C-K> <C-W>k
map <C-l> <C-W>l
map <C-h> <C-W>h
map ;] :tabnext<CR>
map ;[ :tabprev<CR>
map <C-t> :tabe +"browse ."<CR>
map <C-O> :NERDTreeToggle ~/curr/trunk/<CR>

2

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


ขอบคุณสำหรับตัวชี้ตอนนี้ฉันใช้ทั้งสองอย่าง ค่าเริ่มต้นสำหรับ BufExplorer มี,be, ,bs, ,bvดังนั้นฉันแมป TSelectBuffer ,bbไป
Brady Trainor

2

ในการแสดงรายการและสลับระหว่างบัฟเฟอร์ที่ฉันใช้:

nnoremap <Leader>l :ls<CR>:b<space>

ในการสลับระหว่างบัฟเฟอร์:

map <Leader>n :bn<CR>
map <Leader>p :bp<CR>

2

ฉันได้แมป<S-J>และ<S-K>ถึง:bpและ:bnแม้ว่าฉันจะยอมรับว่าฉันไม่ได้ใช้มันเนื่องจากจำนวนไฟล์มากกว่า 10 ฉันได้ทำการแมป<C-J>และ<C-K>กับแท็บก่อนหน้าและแท็บถัดไปของ Gnome Terminal แล้วและฉันมักจะเรียกใช้กลุ่ม 4 อินสแตนซ์สำหรับแต่ละกลุ่ม 4 โครงการที่แตกต่างกันที่ฉันทำ ฉันยังคงหวังว่าบัฟเฟอร์ถัดไปและก่อนหน้านี้จะไปที่ประวัติของบัฟเฟอร์ที่ฉันกำลังดำเนินการอยู่ไม่ใช่รายการบัฟเฟอร์ลำดับที่เขาต้องการ


2

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


0

ฉันใช้แบบง่าย: vsplit กับ ^ W + w / ^ W + r และ: tabnew ด้วยคีย์ผสม Ctrl + Alt + PgUp / PgDown


1
ฉันต้องยอมรับกับสิ่งที่Zathrusกล่าวว่าที่นี่ แท็บใน Vim (หรือ Emacs ที่มี TabBar สำหรับเรื่องนั้น) ไม่ทำงานเหมือนในอินเทอร์เฟซแบบแท็บทั่วไป
Alexey Romanov

0

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

: nnoremap (F5): บัฟเฟอร์ (CR): บัฟเฟอร์ (Space)

vim.wikia.com

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