เป็นกลุ่ม: ปิดบัฟเฟอร์ทั้งหมด แต่อันนี้


คำตอบ:


62

คุณสามารถใช้สคริปต์นี้จาก vim.org:

http://www.vim.org/scripts/script.php?script_id=1071

เพียงแค่นำไปไว้ใน.vim/pluginไดเรกทอรีของคุณแล้วใช้:BufOnlyคำสั่งเพื่อปิดบัฟเฟอร์ทั้งหมดยกเว้นบัฟเฟอร์ที่ใช้งานอยู่ นอกจากนี้คุณยังสามารถ map .vimrcที่อื่นคุณชอบในของคุณ

แหล่งที่มาบน Github (ผ่านมิเรอร์ vim-สคริปต์): https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim


171

ลองสิ่งนี้

bufdo bd

bufdo ทำงานคำสั่งสำหรับบัฟเฟอร์ทั้งหมด

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers


สิ่งนี้ไม่ปิดบัฟเฟอร์ NERDTree
Uri

2
คุณอาจต้องการปิด NERDTree ก่อนทำสิ่งนี้เพื่อป้องกันbdคำสั่งปิดเสียงเรียกเข้าเอง nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut

11
เอกสารเตือนว่าอาร์กิวเมนต์:bufdo'ต้องไม่ลบบัฟเฟอร์หรือเพิ่มบัฟเฟอร์ในรายการบัฟเฟอร์' ดังนั้นหากวิธีนี้ใช้งานได้ก็จะทำงานโดยไม่ตั้งใจ…และบ่อยครั้งที่มันไม่ได้ผลสำหรับฉัน (เปลี่ยนไปใช้บัฟเฟอร์แบบอื่น)
glts

10
นี่เป็นการปิดบัฟเฟอร์ทั้งหมดสำหรับฉันซึ่งไม่ใช่คำถามที่ถาม (MacVim เวอร์ชั่น 8.0.1207)
Michael Leonard

1
คำสั่งนี้ปิดบัฟเฟอร์ทั้งหมด ฉันจะเปิดปัจจุบันค้างไว้ได้อย่างไร
h-

145

ฉันสามารถทำสิ่งนี้ได้อย่างง่ายดายเช่นนี้:

:%bd|e#

4
นี่เป็นคำตอบที่ดี มันทำให้ BufOnly รู้สึกเกินความจริงเล็กน้อย (ฉันหมายถึงเป็นปลั๊กอินทั้งหมด) เว้นแต่คุณจะใช้คุณสมบัติการส่งผ่านการโต้แย้งของ BufOnly สิ่งที่ฉันต้องการทำจริงๆคือ:%bd|e#
shmup

42
@jorgeh %bd= ลบบัฟเฟอร์ทั้งหมด e#= เปิดบัฟเฟอร์สุดท้ายสำหรับการแก้ไข ไปป์ในระหว่างเพียงแค่หนึ่งคำสั่งหลังจากนั้นอีก
OldTimeGuitarGuy

20
@Jared คุณสามารถใช้%bd|e#|bd#เพื่อลบ[No Name]บัฟเฟอร์ที่สร้างขึ้น
kshenoy

12
ยอดเยี่ยม จากนั้นที่นี่คุณมีสิ่งเดียวที่ฉันเคยใช้ปลั๊กอิน BufOnly สำหรับกลั่นเป็นคำสั่งเดียว:command! BufOnly silent! execute "%bd|e#|bd#"
shmup

4
@Finn คุณต้องหลบหนี|:map <leader>o :%bd\|e#<cr>
Halil Özgür

57

หากคุณไม่สนใจสิ่งที่เป็นอยู่ในปัจจุบันคุณสามารถทำสิ่งต่าง ๆ ได้ง่ายกว่า (ไม่จำเป็นต้องใช้สคริปต์):

1,100bd

4
มันจะปิดบัฟเฟอร์ nerdtree เช่นกัน
Afshin Mehrabani

ฉันประสบปัญหาในการใช้คำสั่งนี้เมื่อเปิดใช้งาน NERDTree ฉันขอแนะนำให้ใช้ปลั๊กอิน BufOnly.vim ตามที่ระบุไว้โดย @VoY
moeabdol

1
ฉันได้ทำการแมปต่อไปนี้ซึ่งบัญชีสำหรับการลบบัฟเฟอร์ NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri

5
ฉันใช้สิ่งนี้มาเป็นเวลานาน แต่ตอนนี้ฉันได้รับแล้วE16: Invalid rangeเพราะบัฟเฟอร์บางตัวในช่วงนั้นไม่มีอยู่จริง มันไม่สนใจสิ่งนั้นจนกระทั่งเมื่อไม่นานมานี้
Jon

3
@ จอนตรวจสอบ:lsเพื่อดูบัฟเฟอร์ที่ใหญ่ที่สุดที่คุณได้เปิดจริงและตั้งค่าช่วงของคุณที่ (เช่นถ้าบัฟเฟอร์สูงสุดของคุณคือ 22 แล้ว:1,22bd) ฉันได้รับข้อผิดพลาดเดียวกันจนกระทั่งฉันทำอย่างนั้น
Nairou

51

ฉันทำนี่

:w | %bd | e#

รายการโปรดของฉันถ้าฉันต้องการเปิดบัฟเฟอร์ปัจจุบันของฉันและปิดอื่น ๆ ทั้งหมด

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


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

@JinyoungKim (จาก [1]) ในคำสั่ง ":% bd" ช่วง '%' จะถูกแทนที่ด้วยหมายเลขบรรทัดเริ่มต้นและสิ้นสุดในบัฟเฟอร์ปัจจุบัน แทนที่จะใช้ '%' เป็นช่วงคุณควรระบุตัวเลขสำหรับช่วง ตัวอย่างเช่นในการลบบัฟเฟอร์ทั้งหมดคุณสามารถใช้คำสั่ง ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam

ฉันเพิ่งตรวจสอบเอกสาร ดังนั้นช่วง '%' จึงขึ้นอยู่กับจำนวนบรรทัดไฟล์ปัจจุบัน
จินยองคิม

2
ฉันพบฟังก์ชันในตัวbufnr("$")ที่ส่งคืนหมายเลขบัฟเฟอร์ล่าสุด :1,bufnr("$")bdแต่ผมไม่มีความคิดที่จะสอดแทรกสตริงเมื่อฉันใช้เช่นนี้ บางที .. :1,9999bdทางออกที่ดีที่สุดจะเป็น
จินยองคิม

2
:help :bd:%bdelete " delete all buffersแสดงให้เห็นว่า ดังนั้น%เป็นสิ่งที่คุณต้องการ ฉันใช้ชุดตัวเลือกการแก้ไขของคุณ: วิธี:%bd<CR><C-O>:bd#<CR>นี้จะลบบัฟเฟอร์ทั้งหมดจากนั้นใช้<C-O>เพื่อเรียกคืนตำแหน่งในไฟล์ปัจจุบันจากนั้นจึง:bd#ลบบัฟเฟอร์ที่ไม่ได้ระบุ สิ่งนี้จะปิดบัฟเฟอร์ทั้งหมดและทำให้คุณอยู่ในตำแหน่งเดียวกันในไฟล์
Alejandro

26

สร้างคำตอบของ juananruiz

ทำการเปลี่ยนแปลงเล็กน้อยในบัฟเฟอร์ที่คุณต้องการเก็บไว้แล้ว

:1,1000bd

คำสั่งbd(ลบบัฟเฟอร์) จะไม่ลบบัฟเฟอร์ใด ๆ ที่มีการเปลี่ยนแปลงที่ไม่ได้บันทึก วิธีนี้คุณสามารถเก็บไฟล์ปัจจุบัน (เปลี่ยน) ในรายการบัฟเฟอร์

แก้ไข: โปรดสังเกตว่าสิ่งนี้จะลบ NERDTreeBuffer ของคุณด้วย คุณสามารถรับมันคืนด้วย: NERDTree


สมบูรณ์แบบสั้นและเรียบง่าย! :)
arkod

50
:% bd แท้จริงแล้วคือ "all" แทน 1-1000
John Tyree

สิ่งนี้ขึ้นอยู่กับset nohiddenการตั้งค่าหรือไม่?
เฟลิเป้อัลวาเรซ

15

โดยใช้

:on[ly][!]

และ

:h only

29
นี่เป็นการปิดหน้าต่างไม่ใช่ตัวบัฟเฟอร์
ZyX

13
ยังมีประโยชน์เนื่องจากผู้คนอาจใช้ Google ในระยะที่ผิดและจะพบสิ่งนี้ ขอบคุณทั้งคู่ :)
archgoon

1
@archgoon ใช่ แต่ควรระบุไว้ในคำตอบ
andho

10

การปิดบัฟเฟอร์ที่เปิดอยู่ทั้งหมด:

silent! execute "1,".bufnr("$")."bd"

การปิดบัฟเฟอร์ที่เปิดอยู่ทั้งหมดยกเว้นบัฟเฟอร์ปัจจุบัน :

function! CloseAllBuffersButCurrent()
  let curr = bufnr("%")
  let last = bufnr("$")

  if curr > 1    | silent! execute "1,".(curr-1)."bd"     | endif
  if curr < last | silent! execute (curr+1).",".last."bd" | endif
endfunction

เพิ่มฟังก์ชั่นนี้และเรียกว่าใช้.vimrc:call CloseAllBuffersButCurrent()

แผนที่ความสะดวก:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>

ฉันสังเกตเห็นว่าเมื่อกลับมาใช้งานเซสชัน vim ซึ่งจะคืนค่าบัฟเฟอร์ฉันไม่สามารถลบบัฟเฟอร์อีกต่อไปโดยใช้ข้อมูลด้านบน แต่ฉันต้องใช้:%bd|e#|bd#
shmup

ทางออกที่ดีที่สุด ฉันได้เพิ่มคำสั่งเพื่อเปิด NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa

6

ฉันใส่สิ่งนี้ลงในไฟล์. vimrc ของฉัน

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>

จากนั้นleader + caปิด (ทั้งหมด) ของคุณปิดบัฟเฟอร์ทั้งหมดยกเว้นบัฟเฟอร์ปัจจุบัน

มันคืออะไร

: w - บันทึกบัฟเฟอร์ปัจจุบัน

% bd - ปิดบัฟเฟอร์ทั้งหมด

e # - เปิดไฟล์ที่แก้ไขล่าสุด

bd # - ปิดบัฟเฟอร์ที่ไม่มีชื่อ



1

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

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"

%bd = ลบบัฟเฟอร์ทั้งหมด

e# = เปิดบัฟเฟอร์สุดท้ายสำหรับการแก้ไข (ซึ่งเป็นบัฟเฟอร์ที่ฉันทำงานอยู่)

bd#ลบ [ไม่มีชื่อ] buffer %bdที่ได้รับการสร้างขึ้นเมื่อคุณใช้

ไปป์ในระหว่างเพียงแค่หนึ่งคำสั่งหลังจากนั้นอีก คุณต้องหนีจากมันแม้ว่าจะใช้\|

'" = รักษาตำแหน่งเคอร์เซอร์ของฉัน


0

ฉันชอบ1,100bd( แนะนำโดย juananruiz ) ซึ่งดูเหมือนว่าจะทำงานให้ฉัน

ฉันเพิ่มquit!แผนที่ของฉันเพื่อมอบให้ฉัน

nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>

สิ่งนี้ฆ่าบัฟเฟอร์ทั้งหมดและปิด Vim ซึ่งเป็นสิ่งที่ฉันกำลังมองหาเป็นส่วนใหญ่


1
ไม่มีเหตุผลจริงๆที่คุณจะมีการbdqแมปที่ปิดบัฟเฟอร์ทั้งหมดและออกเป็นกลุ่มด้วย:q!เมื่อคุณสามารถใช้:qa!แทนได้ ยกเว้นกรณีที่ฉันมองเห็นบางสิ่งบางอย่าง
SHMUP

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