Làm cách nào để tôi có bộ đệm được liệt kê trong cửa sổ quickfix trong Vim?


13

Sử dụng trình soạn thảo vim, một tác vụ phổ biến là duyệt bộ đệm. Bây giờ tôi sử dụng các lệnh tiêu chuẩn như :lshoặc a :bnext. Trong thực tế, tôi đặt trong .vimrc của mình:

"move amongs buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

Tôi muốn duyệt bộ đệm dưới dạng danh sách trong cửa sổ quickfix, theo cách đơn giản (= xuất sắc) plugin MRU thực hiện.

Có một plugin đơn giản như MRU nhưng hoạt động trên bộ đệm?

OK, một giải pháp khả thi có thể là sử dụng :CtrlpBufferslệnh, một phần của plugin Ctrlp nhưng tôi không phải là một fan hâm mộ lớn của Ctrlp, bởi vì đôi khi có những điều lạ lùng mà tôi không hiểu hết (các lựa chọn chế độ mờ ...); vì vậy tôi đang tìm kiếm thứ gì đó thực sự đơn giản như plugin MRU.

BTW, tôi đã nói đùa với :cexpr {expr}lệnh, cố gắng điền vào các cửa sổ quickfix với nội dung của :buffersdanh sách, nhưng không thành công (có thể vì vimscripts lập trình thiếu hiểu biết của tôi)

Bất kì lời đề nghị nào ?


Ý bạn là :bnextthay vì :cnext?
tommcdo 23/2/2015

Bạn có đặc biệt cần nó là cửa sổ quickfix không? Hay bạn chỉ muốn có thể nhìn thấy bộ đệm đang mở trong một cửa sổ? (Bởi vì có một số bổ sung để làm sau).
Giàu

Tôi muốn có thể duyệt bộ đệm mở trong một cửa sổ. Thật vậy, quickfix không được sử dụng lại
Giorgio Robino 23/2/2015

@tommcdo: vâng xin lỗi, lỗi chính tả thông thường của tôi. Ý tôi là: bnext và tôi đã cập nhật câu hỏi
Giorgio Robino 23/2/2015

Câu trả lời:


18

Bạn có thể điền danh sách quickfix với mỗi bộ đệm như thế này:

:call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr": v:val}'))
  • setqflist()lấy một danh sách các mục từ điển mô tả từng lỗi (tên tệp, số dòng, vị trí, v.v.). Trong trường hợp này, chúng tôi chỉ định một bộ thông tin tối thiểu: số bộ đệm
  • map()nhận một Danh sách và một biểu thức (một chuỗi) và trả về một Danh sách mới của biểu thức được áp dụng cho từng mục của Danh sách đầu vào. Ở đây, chúng tôi đang lấy Danh sách các số bộ đệm được liệt kê và định dạng chúng để sử dụng trong setqflist()( '{"bufnr": v:val}', v:valgiá trị của mục trong danh sách)
  • filter()lọc một Danh sách, loại bỏ các phần tử không thỏa mãn một biểu thức đã cho. Ở đây biểu thức là buflisted(v:val)số bộ đệm tồn tại và được liệt kê, tức là xuất hiện trong :lsđầu ra
  • range(a, b)tạo Danh sách các số từ ađếnb
  • bufnr()trả về số lượng của một tên bộ đệm cho trước. Nếu đối số là '$', nó trả về số bộ đệm cao nhất

Đó là rất nhiều để gõ, và không đáng nhớ lắm, vì vậy bạn có thể gói nó trong một lệnh trong vimrc của bạn:

command! Qbuffers call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr":v:val}'))

Bây giờ bạn chỉ có thể sử dụng :Qbuffersđể điền vào danh sách quickfix.


Nếu bạn muốn điều này được cập nhật tự động khi bộ đệm mới được thêm vào, bạn có thể làm một cái gì đó như thế này:

autocmd BufAdd * Qbuffers

Tuy nhiên, tôi không khuyến nghị điều này vì nó sẽ hiển thị danh sách quickfix khá không sử dụng được cho những thứ như :makehoặc :grep.


1
cảm ơn đã giải thích, tommcdo. Qbuffers thật đẹp! Có thể tôi sẽ thêm: copen vào cuối cuộc gọi của bạn để ngay lập tức mở cửa sổ quickfix và có thể hữu ích khi báo cáo vị trí con trỏ. Tôi phải nghiên cứu một chút về vimscript :-)
Giorgio Robino 23/2/2015

9

Bạn nên thử ánh xạ này:

nnoremap gb :ls<CR>:b<Space>

Tại dấu nhắc, nhập số bộ đệm mong muốn và nhấn Enter.

gb


q đốt trong đó về danh sách bộ đệm trong cửa sổ quickfind.
VeXii

Vâng, và câu trả lời của tôi cung cấp một sự thay thế nhẹ.
romainl

1
OP nói rằng anh ta biết về danh sách đệm nhưng muốn có nó trong cửa sổ quickfix. và giải pháp của bạn chỉ là sử dụng danh sách đệm?
VeXii

1

Hãy xem plugin bufexplorer . Nó mở ra một danh sách có thể duyệt được của tất cả các bộ đệm trong một thanh bên, tương tự như plugin MRU đã đề cập. Ngoài ra, có một số plugin như vậy trên vim.org .

PS: Bạn đã hỏi cùng một câu hỏi về Stack Overflow ; xin vui lòng không gửi cùng một câu hỏi cho nhiều trang web!


Tks Ingo, tôi đã thử nghiệm một chút bufexplorer và tôi thích nó. Tôi cũng đăng ở đây vì một
luồng

1
Có tôi đã thấy. Tôi muốn bạn sau đó đã xóa bài viết SO ban đầu, hoặc ít nhất là liên kết với bài đăng chéo.
Ingo Karkat 23/2/2015
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.