Vim: Đóng tất cả bộ đệm nhưng cái này


196

Làm cách nào tôi có thể đóng tất cả bộ đệm trong Vim ngoại trừ bộ đệm tôi hiện đang chỉnh sửa?


Câu trả lời:


61

Bạn có thể sử dụng tập lệnh này từ vim.org:

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

Chỉ cần đặt nó vào .vim/pluginthư mục của bạn và sau đó sử dụng :BufOnlylệnh để đóng tất cả các bộ đệm nhưng hoạt động. Bạn cũng có thể ánh xạ nó ở nơi khác mà bạn thích .vimrc.

Nguồn trên Github (thông qua nhân bản vim-scripts): https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim


171

Thử cái này

bufdo bd

bufdo chạy lệnh cho tất cả các bộ đệm

http://vim.wikia.com/wiki/Run_a_command_in_mult Môn_buffers


Điều này không đóng bộ đệm NERDTree.
Uri

NERDTree bị đóng nếu tiêu điểm nằm trong bảng điều khiển cây mọt
gayavat

2
Bạn có thể muốn đóng NERDTree trước khi thực hiện việc này để ngăn bdlệnh đóng chính vim; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut

11
Tài liệu cảnh báo rằng đối số :bufdo'không được xóa bộ đệm hoặc thêm bộ đệm vào danh sách bộ đệm'. Vì vậy, nếu giải pháp này hoạt động, nó hoạt động một cách tình cờ và nó thường không hoạt động đối với tôi (chuyển sang một bộ đệm khác).
chiếu

10
Điều này đóng tất cả các bộ đệm cho tôi, đó không phải là những gì các câu hỏi yêu cầu. (Phiên bản MacVim 8.0.1207)
Michael Leonard

143

Tôi đã có thể làm điều này khá dễ dàng như thế này:

:%bd|e#

4
Đây là một câu trả lời tốt đẹp. Nó làm cho BufOnly cảm thấy hơi quá mức (ý tôi là, toàn bộ plugin?) Trừ khi bạn đang sử dụng tính năng chuyển đối số của BufOnly. Tất cả những gì tôi muốn thực sự là:%bd|e#
shmup

41
@jorgeh %bd= xóa tất cả bộ đệm. e#= mở bộ đệm cuối cùng để chỉnh sửa. Các ống ở giữa chỉ thực hiện một lệnh khác.
OldTimeideosGuy

20
@Jared Bạn có thể sử dụng %bd|e#|bd#để xóa [No Name]bộ đệm được tạo.
kshenoy

12
Tuyệt vời. Sau đó, ở đây bạn có điều duy nhất tôi từng sử dụng plugin BufOnly cho, được chắt lọc theo một lệnh duy nhất:command! BufOnly silent! execute "%bd|e#|bd#"
shmup

4
@Finn bạn cần thoát |:map <leader>o :%bd\|e#<cr>
Halil zgür

57

Nếu bạn không quan tâm đến cái hiện tại, thì đơn giản hơn để làm một cái gì đó như (không cần kịch bản):

1,100bd

4
Nó cũng sẽ đóng bộ đệm nerdtree.
Afshin Mehrabani

Tôi đã gặp một số vấn đề khi sử dụng lệnh này khi NERDTree được bật. Tôi giới thiệu bằng cách sử dụng plugin BufOnly.vim như được đề cập bởi @VoY.
moeabdol

1
Tôi đã thực hiện ánh xạ sau đây để xóa bộ đệm NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri

5
Tôi đã sử dụng nó trong một thời gian dài, nhưng bây giờ tôi nhận được E16: Invalid rangevì một số bộ đệm trong phạm vi không thực sự tồn tại. Nó đã bỏ qua điều đó cho đến gần đây.
Jon

3
@Jon Kiểm tra :lsđể xem bộ đệm lớn nhất mà bạn thực sự đã mở và đặt phạm vi của bạn thành đó (tức là nếu bộ đệm cao nhất của bạn là 22, thì :1,22bd). Tôi đã nhận được cùng một lỗi cho đến khi tôi làm điều đó.
Nairou

51

tôi làm việc này

:w | %bd | e#

Yêu thích của tôi nếu tôi chỉ muốn bộ đệm hiện tại của tôi mở và đóng tất cả những người khác.

Cách thức hoạt động: đầu tiên viết các thay đổi của bộ đệm hiện tại, sau đó đóng tất cả các bộ đệm đang mở, sau đó mở lại bộ đệm tôi hiện đang sử dụng. Trong Vim, |chuỗi thực thi các lệnh với nhau. Nếu bộ đệm của bạn được cập nhật, có thể rút ngắn ở trên:%bd | e#


Nó chủ yếu hoạt động tốt. nhưng đôi khi %không thể làm việc như tất cả các bộ chọn. Bạn có đoán được gì không?
Jinyoung Kim

@JinyoungKim (từ [1]) Trong lệnh ":% bd", phạm vi '%' sẽ được thay thế bằng số dòng bắt đầu và kết thúc trong bộ đệm hiện tại. Thay vì sử dụng '%' làm phạm vi, bạn nên chỉ định số cho phạm vi. Ví dụ: để xóa tất cả các bộ đệm, bạn có thể sử dụng lệnh ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam

Tôi vừa kiểm tra tài liệu. Vậy thì, phạm vi '%' dựa vào một số dòng tệp hiện tại?
Jinyoung Kim

2
Tôi tìm thấy hàm dựng sẵn bufnr("$")trả về số bộ đệm cuối cùng. nhưng tôi không có ý tưởng để nội suy chuỗi khi tôi sử dụng như thế này :1,bufnr("$")bd. Có lẽ .. giải pháp tốt nhất sẽ là :1,9999bd.
Jinyoung Kim

2
:help :bdcho thấy :%bdelete " delete all buffers. Vì vậy, %chính xác là những gì bạn muốn. Tôi sử dụng một biến thể của giải pháp của bạn: :%bd<CR><C-O>:bd#<CR>Điều này sẽ xóa tất cả các bộ đệm, sau đó sử dụng <C-O>để khôi phục vị trí trong tệp hiện tại, sau đó :bd#để xóa bộ đệm chưa được đặt tên. Điều này sẽ đóng tất cả các bộ đệm và để bạn ở cùng một vị trí trong tệp.
Alejandro

25

Dựa trên câu trả lời của juananruiz.

Thực hiện một thay đổi nhỏ trong bộ đệm bạn muốn giữ, sau đó

:1,1000bd

Lệnh bd (xóa bộ đệm) sẽ không xóa bất kỳ bộ đệm nào với các thay đổi chưa được lưu. Bằng cách này bạn có thể giữ tệp hiện tại (đã thay đổi) trong danh sách bộ đệm.

Chỉnh sửa: Xin lưu ý rằng điều này cũng sẽ xóa NERDTreeBuffer của bạn. Bạn có thể lấy lại bằng: NERDTree


Hoàn hảo, ngắn gọn và đơn giản! :)
arkod

49
:% bd thực sự là "tất cả" thay vì 1-1000.
John Tyree

Điều này dựa vào set nohiddenđể được thiết lập?
Felipe Alvarez

15

Bằng cách sử dụng

:on[ly][!]

:h only

27
Điều này đóng cửa sổ, không phải bộ đệm.
ZyX

13
Vẫn hữu ích, vì mọi người có thể Googling cho thuật ngữ sai, và sẽ tìm thấy điều này. Vì vậy, cảm ơn cả hai bạn. :)
Archgoon

1
@archgoon yeah, nhưng nên được chỉ định trong câu trả lời.
andho

10

Đóng tất cả các bộ đệm mở:

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

Đóng tất cả các bộ đệm mở ngoại trừ bộ đệm hiện tại :

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

Thêm chức năng này .vimrcvà gọi nó bằng cách sử dụng :call CloseAllBuffersButCurrent().

Bản đồ tiện lợi:

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

Tôi nhận thấy rằng khi tiếp tục các phiên vim, trong đó khôi phục bộ đệm, tôi không thể xóa bộ đệm nữa bằng cách sử dụng ở trên. Thay vào đó, tôi đã phải sử dụng:%bd|e#|bd#
shmup

Giải pháp tốt nhất. Tôi đã thêm một lệnh để mở lại NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa

5

Tôi đặt cái này trong tập tin .vimrc của tôi

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

sau đó leader + ca(đóng tất cả) của bạn đóng tất cả các bộ đệm trừ cái hiện tại.

Những gì nó làm là

: w - lưu bộ đệm hiện tại

% bd - đóng tất cả các bộ đệm

e # - mở tập tin chỉnh sửa cuối cùng

bd # - đóng bộ đệm không tên



1

Đây là những gì tôi làm. Vì vậy, tôi muốn giữ vị trí con trỏ của mình sau khi xóa tất cả các bộ đệm và hầu hết các giải pháp ở trên chỉ bỏ qua thực tế này. Tôi cũng nghĩ rằng ánh xạ lại lệnh tốt hơn là gõ nó vì vậy ở đây tôi sử dụng <leader>bdđể loại bỏ tất cả các bộ đệm và quay trở lại vị trí con trỏ ban đầu của tôi.

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

%bd = xóa tất cả bộ đệm.

e# = mở bộ đệm cuối cùng để chỉnh sửa (Bộ đệm nào tôi đang làm việc).

bd#để xóa bộ đệm [Không Tên] được tạo khi bạn sử dụng %bd.

Các ống ở giữa chỉ thực hiện một lệnh khác. Bạn đã thoát khỏi nó mặc dù sử dụng\|

'" = giữ vị trí con trỏ của tôi.


0

Tôi thích 1,100bd(được đề xuất bởi juananruiz ) dường như làm việc cho tôi.

Tôi đã thêm một quit!bản đồ để cung cấp cho tôi

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

Điều này giết chết tất cả các bộ đệm và tắt Vim, đó là điều mà tôi đang tìm kiếm chủ yếu.


1
Thực sự không có lý do gì để bạn có bdqánh xạ đóng tất cả các bộ đệm và thoát vim với :q!, khi thay vào đó bạn chỉ có thể sử dụng :qa!. Trừ khi tôi đang xem xét một cái gì đó
shmup

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.