Làm cách nào để đóng bộ đệm mà không cần đóng cửa sổ?


120

Chế độ xem nhiều lớp của Vim (Windows, Bộ đệm và Tab) khiến tôi hơi bối rối. Giả sử tôi chia màn hình (: sp) và sau đó chọn một vùng đệm khác nhau để hiển thị trong mỗi cửa sổ. Bây giờ tôi muốn đóng một trong các bộ đệm, nhưng tôi không muốn cửa sổ đóng lại (Sau khi đóng, nó có thể hiển thị bộ đệm tiếp theo trong danh sách hoặc bộ đệm trống, điều đó không quan trọng). Tôi có thể làm cái này như thế nào?

Cảm ơn.


Có lý do gì bạn muốn đóng bộ đệm hơn là không thấy nó ở đó nữa không?
rapter

9
Tôi thực sự cũng đã tự hỏi về điều này. Việc xóa bộ đệm và sau đó phải xây dựng lại bất kỳ phần nào của các phần tách của tôi đã bị phá hủy trong quá trình này thật khó chịu.
brettkelly

3
29 phiếu bầu cho đến nay. Tôi nghĩ đây là một trường hợp sử dụng khá phổ biến. Tôi cần điều này khi tôi đang làm việc với rất nhiều bộ đệm. Đôi khi tôi đang sử dụng 2 cửa sổ và muốn đóng một bộ đệm. Tôi không muốn cửa sổ đó biến mất. Tôi chỉ muốn bộ đệm tiếp theo được hiển thị ở đó.
Wilson Freitas


Câu trả lời:



145

Tôi đã nhầm lẫn với điều này một chút và cuối cùng đã nghĩ ra:

:bp | sp | bn | bd

Đây là phiên bản sao chép / dán cho ánh xạ khóa:

:bp<bar>sp<bar>bn<bar>bd<CR>

Tôi đã thử nghiệm nó một chút và nó hoạt động nhất quán trong các điều kiện khác nhau. Khi được sử dụng trên bộ đệm cuối cùng, nó sẽ để lại cho bạn một bộ đệm trống mới.

Ném cái này vào .vimrc của bạn:

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

Khởi động lại Vim hoặc chỉ :source ~/.vimrcđể các thay đổi có hiệu lực. Lần tới khi bạn muốn đóng bộ đệm, chỉ cần nhập: \q(nếu \là khóa lãnh đạo của bạn)


1
Cảm ơn bạn! Đẹp và đơn giản, không giống như mọi giải pháp khác mà tôi đã thấy.
jwd vào

16
Đối với người mới bắt đầu, ném này trong vimrc : map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>. Khởi động lại VIM, lần sau bạn muốn đóng bộ đệm chỉ cần nhập:\q
EasyCo

5
Điều này sẽ có kết quả không mong muốn nếu bạn có một cửa sổ được chia theo chiều dọc. Trên thực tế, bất kỳ cấu hình chia nhỏ cửa sổ nào khác với tiêu chuẩn (được tạo bởi sp).
hitzg

2
Tôi nghĩ rằng đoạn mã của những gì cần đặt trong .vimrc không nên bao gồm dấu chấm ở cuối. Ngoài ra, tuyệt vời! Đây phải là câu trả lời được chấp nhận.
Ernesto

3
điều này là thanh lịch. như những người khác đã nói, nếu bạn chủ yếu sử dụng tách dọc, hãy chuyển đổi spvới vsp. mục nhập .vimrc của tôi trông giống như sau:cnoremap bd bp<bar>vsp<bar>bn<bar>bd
Connor

38

Tôi đã tìm kiếm cái này hôm nay và nghĩ ra

:b#|bd#

sẽ thay đổi cửa sổ hiện tại thành vùng đệm đã mở trước đó và xóa / ẩn vùng đệm mà bạn vừa chuyển khỏi đó.

Điều này yêu cầu ít nhất hai bộ đệm đã biết.

Nếu một cửa sổ khác nhưng hiện tại hiển thị cùng một bộ đệm, điều này vẫn sẽ phá hủy quá trình tách. Bạn có thể thay đổi tất cả các cửa sổ thành vùng đệm đã mở trước đó với

:windo b#

Tôi đã thêm chi tiết về lệnh cũ thảo luận về cách lập bản đồ cho nó (và một số cạm bẫy) trong câu trả lời cho một câu hỏi tương tự .


Ngoài ra điều này có thể được thực hiện ... :#b|#bdChỉ cần thay đổi lệnh đệm và số bộ đệm ở trên.
Ashish

Tôi đã sử dụng điều này một chút nhưng tôi vẫn thấy khó chịu vì nó mở lại một bộ đệm đã đóng trước đó.
Pean

@pean Đó là những gì tôi đã đề cập trong câu trả lời được liên kết - xem "Các ghi chú quan trọng". Vâng, sẽ đẹp hơn nếu điều này chuyển sang một bộ đệm mở khác.
hợp lệ

1
Bạn cũng có thể thực hiện :bn|bd#hoặc :bp|bd#chuyển sang bộ đệm mở trước đó hoặc tiếp theo, thay vì bộ đệm bạn đã truy cập gần đây nhất (b #).
pavon

12
nmap <leader>d :bprevious<CR>:bdelete #<CR>

Hoạt động như bình thường cho đến khi một bộ đệm được mở trong nhiều cửa sổ. Đủ tốt trừ khi bạn muốn sử dụng các tập lệnh lớn hơn ngoài kia.

Chỉnh sửa: đây là những gì tôi sử dụng ngay bây giờ:

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction

1
Tôi đã thử cách này nhưng nó không hoạt động tốt lắm khi sử dụng nhiều cửa sổ chia nhỏ. Đây là giải pháp của tôi nếu có ai đó đang gặp vấn đề tương tự:nmap <leader>d :ene<CR>:bd #<CR>
Caio

7

Tôi nghĩ đây là những gì bạn đang tìm kiếm

http://www.vim.org/htmldoc/windows.html#window-moving

Thử cái này:

Xem lại id bộ đệm của bạn bằng cách sử dụng

:buffers

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

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

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

:2bw

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

:1,3bw

1
Tôi không muốn di chuyển cửa sổ. Tôi muốn đóng bộ đệm mà không cần chạm vào vị trí, kích thước hoặc sự tồn tại của cửa sổ.
Mosh

5

Đối với những người sử dụng NERDTree.

Tôi sửa lỗi này bằng cách sử dụng plugin này https://github.com/jistr/vim-nerdtree-tabs và bây giờ tôi có thể đóng buff / tệp / tab duy nhất mà không cần đóng cửa sổ.

Sau khi cài đặt plugin ở trên, hãy đặt mã sau vào .vimrc của tôi:

let g:nerdtree_tabs_autoclose=0

Mô tả cho biến ở trên là: Đóng tab hiện tại nếu chỉ có một cửa sổ trong đó và đó là NERDTree (mặc định 1)

Thông tin thêm tại đây: https://github.com/jistr/vim-nerdtree-tabs#configuration


2

Tôi không nghĩ rằng có một cách duy nhất để làm điều này, nhưng bạn có thể làm :enewhoặc :lsliệt kê các bộ đệm của mình và hoán đổi sang bộ đệm khác bằng cách sử dụng :b [number].

Khi bạn đã có một bộ đệm khác trong cửa sổ :bd #sẽ xóa bộ đệm trước đó trong cửa sổ và vì bộ đệm hiện tại vẫn tồn tại nên cửa sổ sẽ không bị đóng.


2

Tôi đã từng sử dụng:

:bp<bar>sp<bar>bn<bar>bd<CR>

Nhưng tôi đã tìm thấy một số dịp nhất định nơi nó đóng cửa sổ của tôi.

Gần đây, tôi nhận thấy rằng tôi luôn sử dụng công cụ này khi tôi đang làm việc trong một dự án và cần nhanh chóng mở .tmux.conf .zshrc trước khi quay lại làm việc.

Đối với cách sử dụng này, tôi thấy tốt hơn nên:

  • quay lại bộ đệm mà tôi đã làm việc trước đó C-6
  • :bd#để xóa bộ đệm trước đó (tôi đã ánh xạ nó như thế này nnoremap <leader>d :bd#<CR>:)

Nó cho phép tôi kiểm soát bộ đệm mà tôi đang quay lại và cảm thấy tự nhiên hơn.


1

Sẽ

:enew

làm những gì bạn muốn nó sẽ chỉnh sửa một bộ đệm mới, chưa được đặt tên trong cửa sổ hiện tại, để mở tệp hiện có trong bất kỳ cửa sổ nào khác.


Thao tác này sẽ mở ra một bộ đệm trống mới. Tôi muốn đóng bộ đệm hiện tại mà không cần đóng cửa sổ.
Mosh

1

Giải pháp yêu thích của tôi cho việc này là plugin bufkill.vim ( GitHub ). Nó cung cấp các phiên bản thay thế của các:b lệnh-tiền tố hoạt động giống như các lệnh đối tác của chúng, nhưng vẫn để cửa sổ mở. Chúng hiển thị bất kỳ bộ đệm nào có thể nhìn thấy cuối cùng được chứa hoặc bộ đệm trống / mới nếu không có bộ đệm trước đó.

Từ tài liệu:

Khi bạn muốn dỡ / xóa / xóa bộ đệm, hãy sử dụng:
  : bun /: bd /: bw để đóng cửa sổ (lệnh vim), hoặc
  : BUN /: BD /: BW để giữ nguyên (các) cửa sổ (tập lệnh này).

1

Để 'đóng' một chế độ xem, hãy sử dụng :hid[e] . Hoạt động nếu bạn đã quản lý để chia nhỏ chế độ xem hoặc mở nhiều tệp. Bạn không thể ẩn vùng đệm cuối cùng trên màn hình.

1 Mẹo khác đã giúp tôi: sử dụng :e ./path/to/file.workđể mở tệp trong chế độ xem mà không cần chia nhỏ cửa sổ.

Tái bút Sau hai ngày sử dụng vim, tôi vẫn gặp khó khăn khi tìm các lệnh trợ giúp chính xác. Hy vọng rằng điều này sẽ giúp ai đó tiếp tục làm việc cho đến khi họ thực sự có thời gian để hiểu về vim.


1

Đây là một hàm vimscript rất dễ đọc, xử lý tốt mọi trường hợp ,

  • hoạt động tương tự như tích hợp sẵn :bd(nếu chỉ có một cửa sổ, chỉ cần gọi nó!),
    • đưa ra cảnh báo và không làm gì nếu bộ đệm được sửa đổi.
    • nếu không có bộ đệm nào khác, hãy tạo một bộ đệm thông qua :enew.
    • nếu bộ đệm thay thế tồn tại và trong buffer-list, hãy chuyển sang bộ đệm đó, nếu không, hãy chuyển sang phần tiếp theo :bn.
  • hành vi hợp lý hơn cho bố cục nhiều cửa sổ
    • không đóng bất kỳ cửa sổ nào,
    • luôn ở trên cửa sổ ban đầu.
    • đối với mỗi cửa sổ hiển thị bộ đệm hiện tại, hãy thực hiện như liệt kê ở trên, sau đó xóa bộ đệm cũ hiện tại.
nnoremap <Leader> b: gọi DeleteCurBufferNotCloseWindow () <CR>

func! Hủy bỏ DeleteCurBufferNotCloseWindow ()
    nếu & sửa đổi
        echohl ErrorMsg
        echom "E89: không ghi kể từ lần thay đổi cuối cùng"
        echohl Không có
    elseif winnr ('$') == 1
        bd
    khác "nhiều cửa sổ
        let oldbuf = bufnr ('%')
        let oldwin = winnr ()
        trong khi 1 "tất cả các cửa sổ hiển thị oldbuf sẽ vẫn mở
            nếu buflisted (bufnr ('#'))
                b #
            khác
                bn
                let curbuf = bufnr ('%')
                nếu curbuf == oldbuf
                    thụt vào "oldbuf là bộ đệm duy nhất, hãy tạo một
                endif
            endif
            let win = bufwinnr (oldbuf)
            nếu thắng == -1
                phá vỡ
            khác "có cửa sổ khác hiển thị oldbuf
                thực thi chiến thắng 'wincmd w'
            endif
        cuối cùng
        "xóa oldbuf và khôi phục cửa sổ về oldwin
        executive oldbuf 'bd'
        executive oldwin 'wincmd w'
    endif
endfunc

0

Nếu bạn giống tôi và bạn đến đây cố gắng làm điều ngược lại , đóng cửa sổ mà không đóng bộ đệm, bạn có thể làm điều đó thông qua:

:close


0

Một phiên bản đơn giản mà tôi sử dụng cá nhân là

:bp|bd#

Nó đi đến bộ đệm trước đó và xóa bộ đệm khác (thực sự là bộ đệm ban đầu mà chúng tôi đã nhảy từ đó). Điều này thực hiện những gì bạn mong đợi trong 99% trường hợp mà không cần bất kỳ tập lệnh phức tạp nào.

Làm phím tắt, tôi sử dụng như sau

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>

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.