Tôi có một loạt các bộ đệm mở trong vim, chỉ có một vài trong số chúng mở trong cửa sổ phân tách hoặc trên các tab khác. Có cách nào để đóng tất cả nhưng những cái hiện có thể nhìn thấy trong một trong các phần tách hoặc tab đó không?Làm cách nào để đóng tất cả các bộ đệm không được hiển thị trong cửa sổ trong vim?
Trả lời
Dưới đây là một giải pháp thay thế, bạn có thể thả trong .vimrc
của bạn:
function! Wipeout()
" list of *all* buffer numbers
let l:buffers = range(1, bufnr('$'))
" what tab page are we in?
let l:currentTab = tabpagenr()
try
" go through all tab pages
let l:tab = 0
while l:tab < tabpagenr('$')
let l:tab += 1
" go through all windows
let l:win = 0
while l:win < winnr('$')
let l:win += 1
" whatever buffer is in this window in this tab, remove it from
" l:buffers list
let l:thisbuf = winbufnr(l:win)
call remove(l:buffers, index(l:buffers, l:thisbuf))
endwhile
endwhile
" if there are any buffers left, delete them
if len(l:buffers)
execute 'bwipeout' join(l:buffers)
endif
finally
" go back to our original tab page
execute 'tabnext' l:currentTab
endtry
endfunction
Sử dụng :call Wipeout()
.
Thao tác này có xóa bộ đệm đã sửa đổi không? –
câu trả lời bằng các atomicules hoạt động, cái này xóa các bộ đệm trong các tab và có vẻ có hành vi kỳ quặc. –
Cẩn thận - 'Wipeout()' xem xét các cửa sổ trong các tab khác (các tab không phải là tab hiện có) để ẩn. – emallove
Thêm này để vimrc của bạn:
function! CloseHiddenBuffers()
let i = 0
let n = bufnr('$')
while i < n
let i = i + 1
if bufloaded(i) && bufwinnr(i) < 0
exe 'bd ' . i
endif
endwhile
endfun
Sau đó, bạn có thể làm điều này để đóng bộ đệm ẩn:
:call CloseHiddenBuffers()
(Bạn có thể sẽ muốn để ràng buộc một phím hoặc một lệnh để nó .)
cập nhật:
đây' Một phiên bản được cập nhật để hỗ trợ các trang tab. (Tôi không sử dụng các trang tab mình, vì vậy tôi đã không nhận ra rằng bufwinnr chỉ hoạt động cho các cửa sổ trên trang hiện tại).
function! CloseHiddenBuffers()
" figure out which buffers are visible in any tab
let visible = {}
for t in range(1, tabpagenr('$'))
for b in tabpagebuflist(t)
let visible[b] = 1
endfor
endfor
" close any buffer that's loaded and not visible
for b in range(1, bufnr('$'))
if bufloaded(b) && !has_key(visible, b)
exe 'bd ' . b
endif
endfor
endfun
Tôi có thể đã đặt sai câu hỏi của tôi không chính xác — tôi ' m cố gắng để làm sạch đầu ra của ': ls' và chức năng này dường như không làm điều đó. –
Đó có phải là sự thiếu hỗ trợ tab-page, hay cái gì khác? Tôi đã thêm một phiên bản hỗ trợ các trang tab, ở trên. –
Điều này vẫn không hiệu quả đối với tôi. –
Tôi biết lý do tập lệnh thứ hai không hoạt động chính xác.
Điều này là do hàm bufloaded() phải là bufexits()!
Thật vậy, bộ đệm cần xóa không được tải! Chỉ cần loại bỏ tình trạng này là okay nhưng nó đang làm một số cảnh báo khi chúng tôi đang cố gắng để quét sạch một bộ đệm không được sử dụng vì vậy chúng tôi phải sử dụng bufexists (b).
Giải pháp cuối cùng là như sau:
function! CloseHiddenBuffers()
" Tableau pour memoriser la visibilite des buffers
let visible = {}
" Pour chaque onglet...
for t in range(1, tabpagenr('$'))
" Et pour chacune de ses fenetres...
for b in tabpagebuflist(t)
" On indique que le buffer est visible.
let visible[b] = 1
endfor
endfor
" Pour chaque numero de buffer possible...
for b in range(1, bufnr('$'))
" Si b est un numero de buffer valide et qu'il n'est pas visible, on le
" supprime.
if bufexists(b) && !has_key(visible, b)
" On ferme donc tous les buffers qui ne valent pas 1 dans le tableau et qui
" sont pourtant charges en memoire.
execute 'bwipeout' b
endif
endfor
endfun
Nhờ bạn.
Nếu "bufloaded (b)" là sai cho chính xác các bộ đệm chúng tôi muốn đóng, tại sao không chỉ "nếu! Bufloaded (b)"? – derenio
Điều này đã làm các trick, và tôi khá giống như: Wipeout rất hấp dẫn 'lệnh! -nargs =? Cuộc gọi Wipeout CloseHiddenBuffers() ' – expelledboy
Một tính năng khác nữa. Sử dụng ví dụ được đưa ra trong trợ giúp Vim cho tabpagebuflist()
để có danh sách các bộ đệm xuất hiện trong tab hoặc cửa sổ. Tôi có dưới đây trong tôi .vimrc
function! DeleteInactiveBufs()
"From tabpagebuflist() help, get a list of all buffers in all tabs
let tablist = []
for i in range(tabpagenr('$'))
call extend(tablist, tabpagebuflist(i + 1))
endfor
"Below originally inspired by Hara Krishna Dara and Keith Roberts
"http://tech.groups.yahoo.com/group/vim/message/56425
let nWipeouts = 0
for i in range(1, bufnr('$'))
if bufexists(i) && !getbufvar(i,"&mod") && index(tablist, i) == -1
"bufno exists AND isn't modified AND isn't in the list of buffers open in windows and tabs
silent exec 'bwipeout' i
let nWipeouts = nWipeouts + 1
endif
endfor
echomsg nWipeouts . ' buffer(s) wiped out'
endfunction
command! Bdi :call DeleteInactiveBufs()
Điều này ngắt CommandT. Tôi nhận được "Vim :: DeletedBufferError: cố gắng để tham khảo bộ đệm đã xóa" lần đầu tiên tôi kích hoạt CommandT sau khi chạy Bdi. Lần sau, tôi thử keybinding CommandTs, không có gì xảy ra cả và một số keybindings khác của tôi cũng ngừng hoạt động. – bobpaul
@bobpaul Tôi không sử dụng CommandT, nhưng bạn có thể thử sử dụng 'bdelete' thay vì' bwipeout' trong hàm. Điều đó có thể làm giảm CommandT ít hơn. – atomicules
Hi nguyên tử, tôi đang thử chức năng của bạn, và tôi nhận được một loạt các lỗi như thế này: http://trusktr.io:7777/isowiyirid.rb. Bất kỳ ý tưởng? – trusktr
Có một plugin thực hiện chính xác này và thêm một chút!
Check-out close-buffers.vim
- 1. Làm cách nào để đóng tất cả các cửa sổ trong tab hiện tại của vim
- 2. Chạy macro trong tất cả các bộ đệm trong vim
- 3. vim - hoàn tác trên tất cả bộ đệm/cửa sổ/tệp mở vv
- 4. Làm thế nào để bạn tải lại tất cả các cửa sổ vim cùng một lúc?
- 5. Hiển thị bộ đệm trong cửa sổ khác trong các Emacs gần đây
- 6. Xóa tất cả bộ đệm trống trong VIM
- 7. làm thế nào để hiển thị JOptionPane trên đầu trang của tất cả các cửa sổ
- 8. Đóng cửa sổ chia nhỏ trong Vim mà không thay đổi kích thước cửa sổ khác
- 9. Làm cách nào để mở tệp trợ giúp trong Vim trên bộ đệm mới trong cửa sổ hiện tại?
- 10. Làm thế nào để hiển thị lại cửa sổ chính sau khi đóng cửa trong Cocoa?
- 11. Lệnh Vim để thoát khỏi tất cả các cửa sổ đang mở là gì?
- 12. Làm thế nào để buộc Emacs không hiển thị bộ đệm trong một cửa sổ cụ thể?
- 13. VIM và cây NERD - đóng bộ đệm đúng
- 14. Làm mới tất cả các file trong bộ đệm từ đĩa trong vim
- 15. Các cửa sổ khác nhau trong vim
- 16. kết quả tìm kiếm đường ống đến các tab/cửa sổ/bộ đệm khác trong VIM
- 17. Làm cách nào để tìm kiếm bộ đệm mở trong Vim?
- 18. Linux: cách nhận danh sách tất cả các cửa sổ hiển thị
- 19. OpenCV - đóng cửa sổ hiển thị hình ảnh
- 20. Làm thế nào để mở lại bộ đệm trong vim?
- 21. Làm thế nào để hiển thị một cửa sổ trong Qt và xóa nó ngay sau khi nó đóng cửa?
- 22. làm cách nào để ẩn tất cả các bảng ở dạng cửa sổ?
- 23. WPF: Làm cách nào để lặp qua tất cả các điều khiển trong cửa sổ?
- 24. Cách giữ cửa sổ đầu ra lệnh trong vim
- 25. Xử lý WM_NCACTIVATE trong cửa sổ khởi động chặn tất cả các cửa sổ khác
- 26. Làm cách nào để hiển thị số dòng trong tất cả các tệp trong AppCode?
- 27. Làm nhiều bộ đệm có thể nhìn thấy được trong cửa sổ thay vì hiển thị vùng trống sau bộ đệm
- 28. Làm cách nào để đóng tất cả các giai đoạn khi giai đoạn chính bị đóng?
- 29. Ẩn tất cả các dòng phù hợp (không) trong Vim
- 30. Cuộn cửa sổ kia trong VIM Split
Để tham khảo, tôi thấy điều này [Yahoo Vim Nhóm thread] (http://tech.groups.yahoo.com/group/vim/message/56425) trước khi tôi đi qua này SO Q & A. Câu trả lời ở đây là tốt hơn vì chúng xử lý các trang tab. – atomicules
Artem Nezvigin đã điều chỉnh các giải pháp vô số dưới đây thành một plugin, [wipeout.vim] (http://www.vim.org/scripts/script.php?script_id=4882) –