Làm cách nào để tôi đóng một bộ đệm duy nhất (trong số nhiều) trong Vim?


445

Tôi mở một số tệp trong Vim, ví dụ, đang chạy

vim a/*.php

trong đó mở 23 tập tin.

Sau đó tôi thực hiện chỉnh sửa của mình và chạy hai lần sau

:q

trong đó đóng tất cả các bộ đệm của tôi.

Làm thế nào bạn có thể đóng chỉ một bộ đệm trong Vim?


8
Lưu ý rằng bạn có thể mở các tệp trong các cửa sổ Vim riêng bằng cách sử dụng vim -o a/*.php(hoặc -Osử dụng cửa sổ dọc) và tránh điều hướng bộ đệm - đây là một phương pháp tuyệt vời chỉ cho một vài tệp, nhưng với 23 tệp, chúng sẽ chỉ có một vài dòng / cột mỗi.
Cascabel

1
@Jefromi: Cảm ơn bạn đã chỉ ra điều đó! Tôi chưa bao giờ sử dụng tùy chọn -o trước đây.
Léo Léopold Hertz

Về chủ đề chia tách cửa sổ. Nếu bạn đã ở trong Vim và muốn mở một tệp khác trong phần tách: đặc biệt cho chiều ngang: evsp cho ngành dọc.
Lanzafame

Câu trả lời:


557

Một lời cảnh báo: "w in bw không có nghĩa là viết mà là xóa sổ!"

Thêm từ hướng dẫn sử dụng:

: bd

Dỡ bỏ bộ đệm [N] (mặc định: bộ đệm hiện tại) và xóa nó khỏi danh sách bộ đệm. Nếu bộ đệm bị thay đổi, điều này sẽ thất bại, trừ khi [!] Được chỉ định, trong trường hợp đó thay đổi sẽ bị mất. Các tập tin vẫn không bị ảnh hưởng.

Nếu bạn biết bạn đang làm gì, bạn cũng có thể sử dụng: bw

: bw

Giống như |: bdelete |, nhưng thực sự xóa bộ đệm.


4
Ngoài ra khả năng thực hiện ': M, Nbd' để đóng số bộ đệm M thành N. Hoặc ': bd N1 N2 ...' trong đó N # là số bộ đệm
trượt tuyết

61
Hướng dẫn nói chỉ sử dụng :bwnếu "bạn biết bạn đang làm gì" mà tôi không biết, vì vậy tôi đoán tôi sẽ sử dụng :bd.
jberryman

1
Lúc đầu tôi đã bối rối - tôi đang mở một tab mới để đóng bộ đệm ... nhưng đóng bộ đệm trong tab (sử dụng một đường thẳng :bd) cũng đóng tab. Những gì bạn có thể muốn là :bd n .. [m]hoặc :n,mbdcho các số hoặc phạm vi số cụ thể đóng, điều bạn có thể làm mà không cần nhìn vào bộ đệm
JonnyRaa

5
wlà viết tắt của writelệnh theo hướng dẫn sử dụng Vim, ngoài ra không có đề cập đến bất kỳ "xóa sổ" nào. Mô tả của lệnh ( help write) bắt đầu bằng "Ghi toàn bộ bộ đệm vào tệp hiện tại."
amn

3
@amn Tôi cũng bối rối, nhưng ý anh ấy là wtrong bwlệnh nghĩa là xóa sạch anh ấy không nói về wlệnh. Anh ta đặt cảnh báo này ở đó để mọi người không nghĩ rằng bwlệnh có nghĩa là ghi đệm (mà nó không có nghĩa là xóa bộ đệm.)
John

350

Nếu điều này không được làm rõ bởi các câu trả lời trước:

: bd sẽ đóng bộ đệm hiện tại. Nếu bạn không muốn lấy danh sách bộ đệm.


4
Trước khi tìm: bd tôi không bao giờ có ý nghĩa gì với tôi rằng mọi người không gặp vấn đề gì khi thực hiện: ls -> quét số doc -> hủy bộ đệm theo số. Mọi người có thực sự tìm thấy điều này hiệu quả?
Svend

3
@svend cho một loạt các bộ đệm chắc chắn, nhưng đối với một người đơn độc a: bd có lẽ hiệu quả hơn.
Pharaun


10
:bdchỉ đóng bộ đệm trong khi (bất kể điều đó có nghĩa là gì) trong khi đó :bwcũng sẽ xóa tất cả các biến và THỰC SỰ loại bỏ nó khỏi lsbộ đệm.
RedX

1
Câu trả lời của hhh bên dưới có nhiều chi tiết hơn

103

Kiểm tra id bộ đệm của bạn bằng cách sử dụng: bộ đệm

bạn sẽ thấy danh sách các bộ đệm ở đó như

1  a.php
2  b.php
3  c.php

nếu bạn muốn xóa b.php khỏi bộ đệm

:2bw

nếu bạn muốn xóa / đóng tất cả khỏi bộ đệm

:1,3bw

4
Bạn cũng có thể xóa tất cả các bộ đệm với:% bw
cdleonard

7
cắt ngắn để kiểm tra id bộ đệm: 2 CTRL-G
trượt tuyết

43

Thay vì duyệt thông số của lệnh: ls và xóa (unload, lau ..) một bộ đệm bằng cách chỉ định số của nó, tôi thấy rằng sử dụng tên tệp thường hiệu quả hơn.

Chẳng hạn, sau khi tôi mở một vài tệp .txt để làm mới ký ức của mình về một số điểm tốt .. sao chép và dán một vài dòng văn bản để sử dụng làm mẫu sắp xếp .. vv Tôi sẽ gõ như sau:

:bd txt <Tab>

Lưu ý rằng chuỗi phù hợp không phải ở đầu tên tệp.

Ở trên hiển thị danh sách các tên tệp khớp với 'txt' ở dưới cùng của màn hình và giữ lệnh: bd ban đầu tôi đã gõ không chạm, sẵn sàng để hoàn thành.

Đây là một ví dụ:

doc1.txt doc2.txt
:bd txt 

Tôi có thể sao lưu lại bit 'txt' và nhập tên tệp tôi muốn xóa, nhưng điều này trở nên thực sự tiện lợi là tôi không phải: nếu tôi nhấn phím Tab lần thứ hai, Vim sẽ tự động hoàn thành lệnh của tôi với trận đấu đầu tiên:

:bd doc1.txt

Nếu tôi muốn thoát khỏi bộ đệm đặc biệt này, tôi chỉ cần nhấn Enter.

Và nếu bộ đệm tôi muốn xóa xảy ra là khớp thứ hai (thứ ba .. v.v.), tôi chỉ cần tiếp tục nhấn phím Tab để thực hiện chu trình lệnh: bd của mình thông qua danh sách khớp.

Đương nhiên, phương pháp này cũng có thể được sử dụng để chuyển sang một bộ đệm nhất định thông qua các lệnh như: b ..: sb .. vv

Cách tiếp cận này đặc biệt hữu ích khi tùy chọn Vim 'ẩn' được đặt, vì danh sách bộ đệm có thể nhanh chóng trở nên khá lớn, bao phủ nhiều màn hình và gây khó khăn cho việc phát hiện bộ đệm cụ thể mà tôi đang tìm kiếm.

Để tận dụng tối đa tính năng này, có lẽ tốt nhất là đọc tệp trợ giúp Vim sau đây và điều chỉnh hành vi hoàn thành dòng lệnh Tab sao cho phù hợp nhất với quy trình làm việc của bạn:

:help wildmode

Hành vi tôi đã mô tả kết quả ở trên từ cài đặt sau, mà tôi đã chọn vì mục đích nhất quán để mô phỏng hoàn thành bash:

:set wildmode=list:longest,full

Trái ngược với việc sử dụng số bộ đệm, ưu điểm của phương pháp này là tôi thường nhớ ít nhất một phần của tên tệp đã cho phép tôi nhắm mục tiêu bộ đệm trực tiếp thay vì phải tìm số trước thông qua lệnh: ls.


40

Sử dụng:

  • :ls - để liệt kê bộ đệm
  • :bd#n- để đóng bộ đệm trong đó #n là số bộ đệm (sử dụng lsđể lấy nó)

Ví dụ:

  • để xóa bộ đệm 2:

    :bd2
    

16

Bạn cũng có thể ánh xạ các phím chức năng tiếp theo và trước đó, làm cho việc đạp xe qua bộ đệm trở nên dễ dàng

map <F2> :bprevious<CR>
map <F3> :bnext<CR>

từ vimrc của tôi


2

Làm thế nào về

vim -O a a

Bằng cách đó, bạn có thể chỉnh sửa một tệp duy nhất ở bên trái và điều hướng toàn bộ thư mục bên phải của bạn ... Chỉ là một suy nghĩ, không phải là giải pháp ...


2

[EDIT: đây là một đề nghị ngu ngốc từ thời tôi không biết rõ về Vim. Vui lòng không sử dụng các tab thay vì bộ đệm; các tab là "bố cục cửa sổ" của Vim

Có thể chuyển sang sử dụng các tab?

vim -p a/*.php mở cùng một tệp trong tab

gtgTchuyển đổi tab qua lại

:q chỉ đóng tab hiện tại

:qa đóng tất cả mọi thứ và thoát

:tabo đóng tất cả mọi thứ trừ tab hiện tại


2
Tại sao bạn nói rằng sử dụng các tab là một gợi ý ngu ngốc? Tôi chỉ hỏi vì tôi sử dụng các tab mọi lúc ...: ^ /
Nate

2
@Nate: Tôi quyết định giải thích về leonid.shevtsov.me/en/iêu
Leonid Shevtsov

1
Đó là một bài viết tuyệt vời - nó truyền cảm hứng cho tôi để đào sâu hơn nữa - bạn đã xem wildmenuchưa? Nó tương tự như lustyjuggler (tuy đơn giản hơn) nhưng nó được tích hợp (điều này tốt cho tôi, bởi vì lustyjuggler cần +ruby, và vim mặc định cho các tàu một chiều của Ubuntu -ruby).
Nate

@Nate: vâng, tôi đang sử dụng wildmenu để mở tệp, nhưng khi bạn có nhiều tệp trong dự án, nó không mở rộng được. Ngoài ra, vim-noxgói từ Ubuntu có hỗ trợ Ruby.
Leonid Shevtsov

1

Những người sử dụng plugin điều hướng bộ đệm hoặc cây, như Buffergator hoặc NERDTree, sẽ cần phải chuyển đổi các phần tách này trước khi phá hủy bộ đệm hiện tại - nếu không bạn sẽ gửi phần chia của mình vào wonkyville

Tôi sử dụng:

"" Buffer Navigation                                                                                                                                                                                        
" Toggle left sidebar: NERDTree and BufferGator                                                                                                                                                             
fu! UiToggle()                                                                                                                                                                                              
  let b = bufnr("%")                                                                                                                                                                                        
  execute "NERDTreeToggle | BuffergatorToggle"                                                                                                                                                              
  execute ( bufwinnr(b) . "wincmd w" )                                                                                                                                                                      
  execute ":set number!"                                                                                                                                                                                    
endf                                                                                                                                                                                                        
map  <silent> <Leader>w  <esc>:call UiToggle()<cr>   

Trong đó " NERDTreeToggle" trong danh sách đó giống như gõ :NERDTreeToggle. Bạn có thể sửa đổi chức năng này để tích hợp với cấu hình của riêng bạn.


Đối với điều này, plugin bbye là hoàn hảo giúp duy trì bố cục cửa sổ của bạn khi sử dụng :bdeletehoặc :bwipeout. Xem câu trả lời của tôi .
Wolfson

0

Đóng bộ đệm mà không đóng cửa sổ

Nếu bạn muốn đóng bộ đệm mà không phá hủy bố cục cửa sổ của mình (bố cục hiện tại dựa trên các phần tách), bạn có thể sử dụng Plugin như bbye . Dựa trên điều này, bạn chỉ có thể sử dụng

:Bdelete (instead of :bdelete)
:Bwipeout (instead of :bwipeout)

Hoặc chỉ cần tạo một bản đồ trong của bạn .vimrcđể truy cập dễ dàng hơn như

:nnoremap <Leader>q :Bdelete<CR>

Lợi thế so với vim's: bdelete và: bwipeout

Từ tài liệu của plugin :

  • Đóng và loại bỏ bộ đệm.
  • Hiển thị một tập tin khác trong cửa sổ đó.
  • Hiển thị một tệp trống nếu bạn không có tệp nào khác mở.
  • Đừng để bộ đệm [không có tệp] vô dụng nếu bạn quyết định chỉnh sửa tệp khác trong cửa sổ đó.
  • Hoạt động ngay cả khi một tệp đang mở trong nhiều cửa sổ.
  • Làm việc ổn với các trình thám hiểm đệm và tabbars khác nhau.

: bdelete vs: bwipeout

Từ tài liệu của plugin :

Vim có hai lệnh để đóng bộ đệm: :bdelete:bwipeout. Cái trước loại bỏ tệp khỏi danh sách bộ đệm, xóa các tùy chọn, biến và ánh xạ của nó. Tuy nhiên, nó vẫn còn trong jumplist, vì vậy Ctrl-osẽ đưa bạn trở lại và mở lại tệp. Nếu đó không phải là những gì bạn muốn, hãy sử dụng :bwipeouthoặc tương đương với Bbye :Bwipeoutnơi bạn đã sử dụng :bdelete.

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.