Cách nhanh nhất để chuyển sang bộ đệm trong vim?


43

Một cách để chọn bộ đệm trong vim có thể là duyệt danh sách bộ đệm, sử dụng các lệnh tiêu chuẩn như :lshoặc với một số mã plugin / vimscript bên ngoài để duyệt danh sách trong cửa sổ .

Giả sử tôi muốn chuyển sang bộ đệm trực tiếp, nhanh nhất có thể.

Để duyệt qua danh sách bộ đệm trong chế độ tuần tự, bây giờ tôi sử dụng các <C-J> <C-K>phím tắt, đã đặt trong .vimrc:

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

Một cách khác (truy cập trực tiếp) có thể chuyển đổi theo số : biết số bộ đệm, có thể chuyển trực tiếp bằng cách nhập số bộ đệm theo sau <C-^>. Vì vậy, nếu tôi muốn chuyển sang bộ đệm số 5, tôi sẽ nhấn 5<C-^>.

Nhưng điều này dường như không hoạt động đối với tôi (tôi sử dụng vim 7.4 trên hộp ubfox, từ một khách Windows, với bàn phím tiếng Ý ). Tôi nghi ngờ đó là vì ^ký tự nằm ở phím chữ hoa trong bàn phím tiếng Ý, vì vậy trên thực tế để có được ^tôi cần nhấnSHIFT-^

Có ý kiến ​​gì không?


2
Bạn có thể nhấn <c-6>thay vì <c-^>?
Peter Rincker 23/2/2015

bạn có nghĩa là Ctrl-1 để đi đến bộ đệm số 1? Thật không may, không làm việc. không có gì xảy ra
Giorgio Robino

1
Không. Một số thiết bị đầu cuối có thể hiểu Ctrl-6 giống với Ctrl- ^ trên bàn phím Hoa Kỳ.
Peter Rincker 23/2/2015

2
+1 Tuyệt vời, Nó hoạt động! Tôi sử dụng một bố trí bàn phím tiếng Ý (sử dụng trình giả lập thiết bị đầu cuối putty). Vì vậy: 1<C-6>chuyển sang bộ đệm số 1. Cảm ơn!
Giorgio Robino 24/2/2015

Bạn có thể thử sử dụng CtrlSpace .
Hongbo Liu

Câu trả lời:


51

Các :blệnh cũng có thể tham gia một chuỗi con của tên của tập tin của bộ đệm mà bạn muốn đi đến, mà là rất thuận tiện.

Ví dụ, nếu bạn có ba bộ đệm foo, barbaz, sau đó

  • :b barsẽ chuyển sang bartập tin.

  • :b osẽ chuyển sang footập tin.

  • :b asẽ cung cấp cho bạn một lỗi vì nó có thể có nghĩa barhoặc baz, nhưng bạn có thể sửa tên để cụ thể hơn với, ví dụ , : r Enter.

Điều này có thể rất hữu ích, bởi vì nó có nghĩa là thay vì

:buffer very/very/long/path/to/a/veryVeryLongFileName.txt

bạn có thể làm một cái gì đó như

:b LongFileName

đó là ngắn hơn nhiều và dễ dàng hơn.

Lệnh này cũng có thể lấy một số, nếu bạn muốn sử dụng:

:b 5

8
Thông báo trước về việc sử dụng tên bộ đệm một phần: nếu tên bộ đệm một phần xuất hiện ở đầu một ranh giới từ trong đường dẫn của bộ đệm, thì không có bộ đệm nào có tên một phần ở giữa một từ sẽ được truy cập bằng :blệnh. Ví dụ: nếu bạn có hai bộ đệm path/to/foopath/to/tofu, lệnh :b f<Tab>sẽ không bao giờ khớp path/to/tofu, vì nó khớp với phần đầu của một từ path/to/foo.
tommcdo 23/2/2015

2
:5bsau đó ngắn hơn một chút :b 5 ;-)
joeytwiddle

16

Đây là những gì tôi sử dụng:

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

Bây giờ nhấn \bsẽ liệt kê các bộ đệm có sẵn và chuẩn bị :bcho bạn.

Sau đó, bạn có thể chỉ cần nhập số bộ đệm và nhấn Enter.

Hoặc bạn có thể nhập một phần của tên tệp và nhấn Enter. (Tuy nhiên, tôi thường nhấn Tab trước khi nhấn Enter, để kiểm tra tôi có đúng bộ đệm hay không. Nếu không, tôi tiếp tục đạp xe với Tab cho đến khi tôi có được cái tôi muốn.)


Trong thực tế, tôi sử dụng một phiên bản hơi tinh chỉnh ở trên:

nnoremap <C-e> :set nomore <Bar> :ls <Bar> :set more <CR>:b<Space>

Điều này sẽ ngăn -- More --lời nhắc xuất hiện khi bạn có nhiều bộ đệm hơn các dòng có sẵn để hiển thị chúng.

Nhưng nếu bạn thường có 'more'tùy chọn bị vô hiệu hóa, ánh xạ này sẽ thực sự làm bạn khó chịu, bởi vì nó kích hoạt lại 'more'tùy chọn sau khi thực hiện ls!


1
Sự thật mà nói, tôi không thực sự sử dụng một trong hai thứ đó, tôi sử dụng plugin nhỏ của riêng mình , nhưng chức năng rất giống nhau. Với plugin, tôi cũng có thể thực hiện Tab-Complete trên tên tệp của bộ đệm chưa mở.
joeytwiddle

1
Mặc dù kỹ thuật này không nhanh như sử dụng [count]<C-^>khi bạn biết số bộ đệm, nhưng nó khá hữu ích khi bạn không biết.
joeytwiddle

2
cảm ơn joeytwiddle cho ghi chú của bạn. Tôi sẽ kiểm tra plugin của bạn càng sớm càng tốt. Trong trường hợp của tôi (xem vấn đề bàn phím ở trên) [count]<C-6>xuất hiện với tôi cách nhanh nhất để chuyển sang bộ đệm đã biết
Giorgio Robino

Vâng tôi cũng đang sử dụng [count]<C-^>những ngày này. Nhưng điều đó có nghĩa là tôi cần chạy MiniBufExplorer hoặc một cái gì đó tương tự, để biết số bộ đệm là gì!
joeytwiddle

tại sao bạn cần <CR> và <SPACE>? Lúc đầu, nó xuất hiện với tôi, như thể nó hoạt động tốt mà không có họ ...
Felix Crazzolara

9

:CtrlPBuffertừ plugin CtrlP (4k ★)

Tính năng chính của plugin này là cung cấp một kết hợp mờ để thuận tiện mở một bộ đệm khác với phản hồi trực quan.

Mở danh sách bộ đệm mờ bằng :CtrlPBufferhoặc nhấn <C-p>theo sau <C-b>để thay đổi chế độ thành buffer.

Nhập đủ số lượng ký tự để chỉ định bộ đệm bạn muốn mở.
Bạn cũng có thể sử dụng <C-j><C-k>chuyển qua danh sách và chọn thủ công bộ đệm.

nhập mô tả hình ảnh ở đây

Tùy biến

Nếu bạn muốn mở danh sách bộ đệm ngay lập tức <C-p>, hãy thêm dòng sau vào vimrc của bạn:

let g:ctrlp_cmd = 'CtrlPBuffer'

Bạn có thể sử dụng <C-f/b>để chuyển đổi chế độ của cửa sổ ctrlp.

Cá nhân tôi sử dụng let g:ctrlp_cmd = 'CtrlPMRU'. Danh sách được sử dụng gần đây nhất (mru) cũng chứa các bộ đệm đã mở. Nếu bạn sử dụng các chế độ ctrlp khác nhau và muốn giữ nguyên chế độ cuối cùng của mình, bạn có thể đặt let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Các plugin tương tự

Có nhiều plugin cung cấp danh sách bộ đệm với dấu nhắc tương tác với kết hợp mờ, ví dụ:

Mặt tối so với mặt sáng

(tức là cài đặt vim plugin nặng so với cách vim)

Trước khi bạn quyết định sử dụng các plugin phức tạp hơn này, hãy nghiên cứu các câu trả lời của @Doorknob@joeytwiddle . Cụ thể, hãy kiểm tra một lớp lót nếu một trong số chúng đã đáp ứng nhu cầu của bạn.

  1. nnoremap <Leader>b :b <C-d>
  2. nnoremap <Leader>b :ls<Cr>:b<Space>

Cài đặt các plugin chỉ để chuyển đổi bộ đệm có thể là quá mức cần thiết. Xem thêm các nhận xét trên https://www.vi-improved.org/recommendations và bài viết của Drew Neil 'Về mài lưỡi cưa' .


vâng Hotschke, tôi thú nhận tôi thường sử dụng: CtrlPBuffer
Giorgio Robino

Tôi đang sử dụng map <leader>a <ESC>:CtrlPBuffer<CR><CR>để chuyển sang bộ đệm đã mở trước đó <leader>a(trong khi <leader>bchỉ mở danh sách bộ đệm cho tôi)
Rolf

@Rolf: bạn có biết <C-^>(= <C-6>) không? thấy :h CTRL-^. Afaik, đây chỉ là những gì bản đồ của bạn <leader>adường như làm. Do đó, tôi nghĩ rằng bạn vừa đưa ra một ví dụ tại sao mọi người nói sử dụng plugin có thể dẫn đến người dùng vim không biết vim đã có thể tự làm gì.
Hotschke

@ Hotschke: Không, tôi không biết điều đó. Đã học được điều gì đó, cảm ơn! Tôi sẽ sắp xếp lại <C - ^> mặc dù.
Rolf

Tham chiếu tuyệt vời đến <Cd> với vani vim. Tôi chưa thấy tài liệu tham khảo đó ở bất cứ nơi nào khác.
radke

8

Ngoài các câu trả lời thực sự hữu ích của joeytwiddle và Doorknob đừng quên :b#, chuyển sang bộ đệm được sử dụng gần đây nhất. Nó cũng có thể được thực hiện với chỉ <C-^>. Khi bạn có rất nhiều bộ đệm và bạn liên tục chuyển đổi giữa chúng, bộ đệm gần đây nhất thường là đích đến phổ biến nhất.

Cá nhân tôi sử dụng kết hợp nhiều phương pháp. Khi tôi làm việc với chủ yếu là hai bộ đệm và phần còn lại được mở chỉ để tham khảo, tôi có xu hướng chuyển đổi giữa chúng với :b#hoặc <C-^>. Khi tôi phải làm việc với nhiều người trong số họ và chuyển đổi thường xuyên hơn, tôi sử dụng một trong hai số (như trong mẹo joeytwiddle) hoặc một phần tên (như trong mẹo Doorknob) với TAB để hoàn thành chúng. Khi tên khó hiểu và có nhiều bộ đệm được mở (thường là trên 10), tôi sử dụng plugin Ctrl-P thường xuyên hơn ( https://github.com/kien/ctrlp.vim ) Với hai lần nhấn phím nhanh tôi đã nhận được danh sách tất cả chúng và tôi có thể sử dụng tìm kiếm mờ mạnh mẽ trên chúng để tìm nhanh những gì tôi muốn.


2
<C - ^> một mình (<C-6> trong trường hợp của tôi, như Peter Rincker đã đề xuất) là một mẹo hay trong trường hợp chỉ có 2 bộ đệm :-)
Giorgio Robino

5

[b]btừ plugin vim-unimpaired(> 2k ★)

Nếu bạn đã cài đặt vim-unimpaired, bạn có thể sử dụng

  • [b( :bp[revious])
  • ]b( :bn[ext])

cho đi xe đạp thông qua bộ đệm mở. Không cần xác định ánh xạ quý giá hơn cho cùng một lệnh. Hơn nữa, nhảy đến bộ đệm đầu tiên và cuối cùng có thể được thực hiện bằng cách

  • [B( :bf[irst]) và
  • ]B( :bl[ast]).

rất nhiều ánh xạ khung chứa trong vim-unimpairedđó bạn có thể thấy hữu ích. Tất cả đều theo cùng một sơ đồ giúp bạn dễ dàng ghi nhớ chúng.

Mặt tối so với mặt sáng

Plugin này có thể được coi là nhẹ và 'vimish'. Nó được cộng đồng #vim biểu thị là plugin "không gây hại".


+1 Cũng đáng lưu ý rằng bạn có thể cung cấp số đếm. 3[bđể nhảy ba bộ đệm trở lại.
joeytwiddle

1

Hiện tại tôi đang sử dụng phím <Leader>+ numberđể chuyển đổi. Chìa khóa lãnh đạo là <space>chìa khóa của tôi . Tôi cũng sử dụng vim-air để hiển thị bộ đệm nr trên đầu cửa sổ.

" airline settings
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#enabled = 1

Mặc dù bufnr thường vượt quá 10, vì vậy tôi điều chỉnh ánh xạ của riêng mình, nếu numberphù hợp duy nhất, hãy chuyển bộ đệm ngay lập tức, nếu không, hãy đợi thêm đầu vào số hoặc <space>khóa để xác nhận:

nnoremap <expr> <Leader>1 tweak#wtb_switch#key_leader_bufnum(1)
nnoremap <expr> <Leader>2 tweak#wtb_switch#key_leader_bufnum(2)
nnoremap <expr> <Leader>3 tweak#wtb_switch#key_leader_bufnum(3)
nnoremap <expr> <Leader>4 tweak#wtb_switch#key_leader_bufnum(4)
nnoremap <expr> <Leader>5 tweak#wtb_switch#key_leader_bufnum(5)
nnoremap <expr> <Leader>6 tweak#wtb_switch#key_leader_bufnum(6)
nnoremap <expr> <Leader>7 tweak#wtb_switch#key_leader_bufnum(7)
nnoremap <expr> <Leader>8 tweak#wtb_switch#key_leader_bufnum(8)
nnoremap <expr> <Leader>9 tweak#wtb_switch#key_leader_bufnum(9)




func! tweak#wtb_switch#key_leader_bufnum(num)
    let l:buffers = tweak#wtb_switch#buflisted()
    let l:input = a:num . ""

    while 1

        let l:cnt = 0
        let l:i=0
        " count matches
        while l:i<len(l:buffers)
            let l:bn = l:buffers[l:i] . ""
            if l:input==l:bn[0:len(l:input)-1]
                let l:cnt+=1
            endif
            let l:i+=1
        endwhile

        " no matches
        if l:cnt==0 && len(l:input)>0
            echo "no buffer [" . l:input . "]"
            return ''
        elseif l:cnt==1
            return ":b " . l:input . "\<CR>"
        endif

        echo ":b " . l:input

        let l:n = getchar()

        if l:n==char2nr("\<BS>") ||  l:n==char2nr("\<C-h>")
            " delete one word
            if len(l:input)>=2
                let l:input = l:input[0:len(l:input)-2]
            else
                let l:input = ""
            endif
        elseif l:n==char2nr("\<CR>") || (l:n<char2nr('0') || l:n>char2nr('9'))
            return ":b " . l:input . "\<CR>"
        else
            let l:input = l:input . nr2char(l:n)
        endif

        let g:n = l:n

    endwhile
endfunc

func! tweak#wtb_switch#buflisted()
  return filter(range(1, bufnr('$')), 'buflisted(v:val)')
endfunc

Mã được dán từ đây

Bằng cách này, tôi cũng sử dụng <S-h><S-l>cho :bp:bn, hay :tabp:tabnnếu có nhiều hơn một tabpage hiện đang mở. Nó khá trực quan đối với tôi.


1

Những ngày này tôi đang sử dụng [buffer_number]<Ctrl-^>để chuyển đổi bộ đệm vì nó rất nhanh.

Nhưng làm thế nào để biết số đệm? Tôi sử dụng MiniBufExplorer để tôi luôn có thể thấy các số bộ đệm ở đầu Vim.

Tôi cũng sử dụng ánh xạ sau, vì <C-^>hơi khó với một tay.

:nmap <C-E> <C-^>

Trên một máy mới không có cấu hình, tôi quay lại :b [part_of_filename]<Tab><Enter>

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.