Cara tercepat untuk beralih ke buffer di vim?

43

Salah satu cara untuk memilih buffer dalam vim bisa dengan menelusuri daftar buffer, menggunakan perintah standar sebagai :ls, atau dengan beberapa plugin / kode vimscript eksternal untuk menelusuri daftar di jendela .

Katakanlah saya ingin melompat ke buffer secara langsung, secepat mungkin.

Untuk melintasi daftar buffer dalam mode berurutan, saya sekarang menggunakan <C-J> <C-K>cara pintas, setelah mengatur di .vimrc saya:

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

Cara lain (akses langsung) dapat beralih dengan nomor : mengetahui nomor buffer, dimungkinkan untuk beralih secara langsung dengan memasukkan nomor buffer diikuti oleh <C-^>. Jadi jika saya ingin beralih ke buffer nomor 5, saya akan menekan 5<C-^>.

Tapi ini sepertinya tidak berfungsi untuk saya (saya menggunakan vim 7.4 pada kotak ubuntu, dari tamu Windows, dengan keyboard Italia ). Saya menduga itu karena ^karakternya ada pada huruf besar di keyboard Italia, jadi sebenarnya untuk mendapatkannya ^saya perlu menekanSHIFT-^

Ada ide?

Giorgio Robino
sumber
2
Bisakah Anda menekan <c-6>bukan <c-^>?
Peter Rincker
maksud Anda Ctrl-1 untuk menuju ke buffer nomor 1? Sayangnya tidak berhasil. tidak ada yang terjadi
Giorgio Robino
1
Tidak. Beberapa terminal dapat memahami Ctrl-6 yang sama dengan Ctrl- ^ pada keyboard AS.
Peter Rincker
2
+1 Hebat, Berhasil! Saya menggunakan tata letak keyboard Italia (menggunakan emulator terminal dempul). Jadi: 1<C-6>beralih ke nomor penyangga 1. Terima kasih!
Giorgio Robino
Anda dapat mencoba menggunakan CtrlSpace .
Hongbo Liu

Jawaban:

52

The :bperintah juga dapat mengambil substring dari nama file dari buffer yang Anda ingin perjalanan ke, yang sangat nyaman.

Misalnya, jika Anda memiliki tiga buffer foo, bardan baz, kemudian

  • :b barakan beralih ke barfile.

  • :b oakan beralih ke foofile.

  • :b aakan memberikan Anda sebuah kesalahan karena bisa berarti baik baratau baz, tetapi Anda dapat memperbaiki nama untuk menjadi lebih spesifik dengan, misalnya, : r Enter.

Ini bisa sangat berguna, karena itu berarti bukan

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

Anda dapat melakukan sesuatu seperti

:b LongFileName

yang jauh lebih pendek dan lebih mudah.

Perintah ini juga dapat mengambil nomor, jika Anda ingin menggunakannya:

:b 5
Gagang pintu
sumber
8
Peringatan tentang menggunakan nama penyangga parsial: jika nama penyangga parsial muncul di awal batas kata di jalur beberapa penyangga, tidak ada penyangga dengan nama parsial di tengah kata yang dapat diakses oleh :bperintah. Misalnya, jika Anda memiliki dua buffer path/to/foodan path/to/tofu, perintah :b f<Tab>tidak akan pernah cocok path/to/tofu, karena cocok di awal kata path/to/foo.
tommcdo
2
:5bsedikit lebih pendek dari :b 5 ;-)
joeytwiddle
16

Inilah yang saya gunakan:

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

Sekarang menekan \bakan mendaftar buffer yang tersedia dan mempersiapkan :buntuk Anda.

Kemudian Anda bisa mengetikkan nomor buffer , dan tekan Enter.

Atau Anda dapat mengetik bagian dari nama file , dan tekan Enter. (Namun saya biasanya menekan Tab sebelum menekan Enter, untuk memeriksa saya mendapat buffer yang tepat. Jika tidak, saya melanjutkan bersepeda dengan Tab sampai saya mendapatkan yang saya inginkan.)


Bahkan, saya menggunakan versi yang sedikit tweak di atas:

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

Ini akan mencegah -- More --muncul dari ketika Anda memiliki lebih banyak buffer daripada garis yang tersedia untuk menampilkannya.

Tetapi jika Anda biasanya tetap memiliki 'more'opsi yang dinonaktifkan, pemetaan ini akan sangat mengganggu Anda, karena itu mengaktifkan kembali 'more'opsi setelah melakukannya ls!

joeytwiddle
sumber
1
Sejujurnya, saya tidak benar-benar menggunakan salah satu dari mereka, saya menggunakan plugin kecil saya sendiri , tetapi fungsinya sangat mirip. Dengan plugin tersebut, saya juga dapat melakukan Tab-complete pada nama file buffer yang tidak dibuka.
joeytwiddle
1
Meskipun teknik ini tidak secepat menggunakan [count]<C-^>ketika Anda tahu nomor buffer, itu cukup berguna ketika Anda tidak tahu.
joeytwiddle
2
terima kasih joeytwiddle untuk catatan Anda. Saya akan memeriksa plugin Anda secepatnya. Dalam kasus saya (lihat masalah keyboard di atas) [count]<C-6>bagi saya tampak cara tercepat untuk beralih ke buffer yang dikenal
Giorgio Robino
Ya saya juga menggunakan [count]<C-^>hari ini. Tapi itu berarti saya harus menjalankan MiniBufExplorer atau yang serupa, untuk mengetahui apa nomor buffer!
joeytwiddle
mengapa Anda membutuhkan <CR> dan <SPACE>? Pada awalnya itu tampak oleh saya, seolah-olah itu berfungsi dengan baik tanpa mereka ...
Felix Crazzolara
9

:CtrlPBufferdari plugin CtrlP (4k ★)

Fitur utama dari plugin ini adalah untuk menyediakan pencocokan fuzzy untuk dengan mudah membuka buffer berbeda dengan umpan balik visual.

Buka daftar buffer fuzzy dengan :CtrlPBufferatau tekan <C-p>diikuti oleh <C-b>untuk mengubah mode ke buffer.

Masukkan jumlah karakter yang cukup untuk menentukan buffer yang ingin Anda buka.
Anda juga dapat menggunakan <C-j>dan <C-k>untuk menelusuri daftar dan memilih buffer secara manual.

masukkan deskripsi gambar di sini

Kustomisasi

Jika Anda ingin segera membuka daftar buffer <C-p>, tambahkan baris berikut ke vimrc Anda:

let g:ctrlp_cmd = 'CtrlPBuffer'

Anda dapat menggunakan <C-f/b>untuk mengganti mode dari jendela ctrlp.

Saya pribadi menggunakan let g:ctrlp_cmd = 'CtrlPMRU'. Daftar (mru) yang terakhir digunakan juga berisi buffer yang dibuka. Jika Anda menggunakan berbagai mode ctrlp dan ingin tetap menggunakan mode terakhir Anda, Anda dapat mengatur let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Plugin serupa

Ada lebih banyak plugin yang menyediakan daftar buffer dengan prompt interaktif dengan pencocokan fuzzy, misalnya

  • fzf.vim (4k ★) oleh Junegunn (+ terminal, buka)
  • command-t oleh Wincent (+ ruby)
  • denite.nvim oleh Shougo (+ python3, vim8 or neovim)

Sisi gelap vs. sisi terang

(yaitu pengaturan vim plugin-berat vs cara vim)

Sebelum Anda memutuskan untuk menggunakan plugin yang lebih kompleks ini, pelajari jawabannya dengan @Doorknob dan @joeytwiddle . Secara khusus, periksa one-liner jika salah satu dari mereka sudah memenuhi kebutuhan Anda.

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

Menginstal plugin hanya untuk switching buffer mungkin merupakan kerja keras. Lihat juga komentar di https://www.vi-improved.org/recomendations dan artikel oleh Drew Neil 'Tentang mengasah gergaji' .

Hotschke
sumber
ya Hotschke, saya akui saya sering menggunakan: CtrlPBuffer
Giorgio Robino
Saya menggunakan map <leader>a <ESC>:CtrlPBuffer<CR><CR>untuk melompat ke buffer yang sebelumnya dibuka dengan <leader>a(sementara <leader>bhanya membuka daftar buffer untuk saya)
Rolf
@Rolf: Anda tahu <C-^>(= <C-6>)? lihat :h CTRL-^. Afaik, ini hanya melakukan apa yang <leader>atampaknya pemetaan Anda lakukan. Karena itu saya pikir Anda baru saja memberikan contoh mengapa orang mengatakan menggunakan plugin dapat menyebabkan pengguna vim yang tidak tahu apa yang sudah dapat dilakukan vim sendiri.
Hotschke
@ Hotschke: Tidak, saya tidak tahu itu. Belajar sesuatu yang diketahui, terima kasih! Aku akan memetakan kembali <C - ^>.
Rolf
1
Referensi yang sangat baik untuk <Cd> dengan vanilla vim. Saya belum melihat referensi itu di tempat lain.
Radke
8

Selain jawaban yang sangat berguna oleh joeytwiddle dan Doorknob jangan lupa :b#, yang beralih ke buffer yang terakhir digunakan. Itu juga bisa dilakukan dengan adil <C-^>. Ketika Anda memiliki banyak buffer dan Anda terus-menerus beralih di antara mereka, buffer terbaru biasanya merupakan tujuan paling umum.

Secara pribadi saya menggunakan kombinasi banyak metode. Ketika saya bekerja dengan terutama dua buffer dan sisanya dibuka hanya untuk referensi sesekali, saya cenderung beralih di antara mereka dengan :b#atau <C-^>. Ketika saya harus bekerja dengan lebih banyak dari mereka dan berganti lebih sering, saya menggunakan salah satu nomor (seperti pada ujung joeytwiddle), atau bagian dari nama (seperti pada ujung Doorknob) dengan TAB untuk menyelesaikannya. Ketika nama-nama membingungkan, dan ada banyak buffer dibuka (biasanya lebih dari 10), saya lebih sering menggunakan Ctrl-P plugin ( https://github.com/kien/ctrlp.vim ) Dengan dua penekanan tombol cepat saya mendapat daftar semuanya dan saya dapat menggunakan pencarian fuzzy yang kuat untuk menemukan apa yang saya inginkan dengan cepat.

qiubix
sumber
2
<C - ^> sendirian (<C-6> dalam kasus saya, seperti yang disarankan Peter Rincker) adalah trik yang bagus jika hanya ada 2 buffer :-)
Giorgio Robino
5

[bdan ]bdari plugin vim-unimpaired(> 2k ★)

Jika Anda telah menginstal vim-unimpaired, Anda dapat menggunakan

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

untuk bersepeda melalui buffer terbuka. Tidak perlu mendefinisikan pemetaan yang lebih berharga untuk perintah yang sama. Selanjutnya, melompat ke buffer pertama dan terakhir dapat dilakukan oleh

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

Ada lebih banyak pemetaan-braket yang terkandung di vim-unimpairedmana Anda mungkin menemukan berguna. Mereka semua mengikuti skema yang sama yang membuatnya mudah menghafal mereka.

Sisi gelap vs. sisi terang

Plugin ini dapat dianggap ringan dan 'vimish'. Itu dilambangkan oleh komunitas #vim sebagai plugin "tidak berbahaya".

Hotschke
sumber
+1 Juga perlu dicatat bahwa Anda dapat memberikan hitungan. 3[buntuk melompat tiga buffer kembali.
joeytwiddle
1

Saat ini saya menggunakan tombol <Leader>+ numberuntuk beralih. Kunci pemimpin adalah <space>kunci saya . Saya juga menggunakan vim-airline untuk menunjukkan buffer nr di atas jendela.

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

Sementara bufnr sering melebihi 10, jadi saya men-tweak pemetaan saya sendiri, jika numberini satu-satunya yang cocok, segera ganti buffer, jika tidak, tunggu lebih banyak input angka atau <space>kunci untuk konfirmasi:

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

Kode disisipkan dari sini

Ngomong-ngomong, saya juga menggunakan <S-h>dan <S-l>untuk :bpdan :bn, atau :tabpdan :tabnjika lebih dari satu tabpage dibuka saat ini. Ini cukup intuitif bagi saya.

rox
sumber
1

Hari-hari ini saya gunakan [buffer_number]<Ctrl-^>untuk mengganti buffer karena sangat cepat.

Tetapi bagaimana cara mengetahui nomor buffer? Saya menggunakan MiniBufExplorer sehingga saya selalu dapat melihat nomor buffer di bagian atas Vim.

Saya juga menggunakan pemetaan berikut, karena <C-^>agak sulit dijangkau dengan satu tangan.

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

Pada mesin baru tanpa konfigurasi, saya kembali ke :b [part_of_filename]<Tab><Enter>

joeytwiddle
sumber