Apa cara yang lebih efisien untuk menggunakan buffer?

13

Akhir-akhir ini saya secara drastis mengurangi jumlah plugin yang saya gunakan jadi saya mencari jawaban hanya menggunakan fitur Vim bawaan.

Saya telah memperhatikan kekurangan dalam alur kerja saya ketika saya mengedit banyak buffer: Saya di buffer dan saya ingin beralih ke buffer lain yang saya tidak ingat namanya dan yang bukan buffer alternatif . Jadi :b#tidak mungkin menggunakan dan menggunakan penyelesaian dengan perintah :bjuga tidak nyaman.

Untuk melakukan itu saya melakukan hal berikut:

  • Pertama digunakan :buffersuntuk mendapatkan daftar buffer terbuka
  • Ingat jumlah buffer yang ingin saya gunakan
  • Tekan Enteruntuk menutup daftar buffer
  • Gunakan :bXdengan Xjumlah buffer yang digunakan.

Alur kerja ini sepertinya cukup berat bagi saya jadi saya menambahkan baris berikut ke saya .vimrc:

" Improve the navigation in the buffers 
nnoremap <Leader><S-b> :B<CR> 
command! B call Buffers() 

function! Buffers() 
    execute "buffers" 
    let buffer=input("Enter a buffer:") 
    execute "b" . buffer 
endfunction 

Ini memberi saya perintah :B(dan pemetaan) yang memanggil fungsi :buffersmenunggu input dan akhirnya panggilan :bdiikuti oleh input.

Ini bekerja dengan baik tetapi saya terkejut bahwa saya harus mengembangkan fungsi seperti itu: biasanya Vim memiliki alur kerja default yang cukup efisien jadi saya bertanya-tanya apakah ada cara yang lebih baik untuk beralih ke buffer yang saya tidak tahu apa-apa kecuali bahwa itu sudah dibuka di sesi pengeditan saya.

statox
sumber
3
Saya :lsdiikuti oleh :b#(tidak perlu menekan balik atau melarikan diri dulu, dapat langsung dari daftar buffer di 'ls'.) (Posting sebagai komentar karena sepertinya tidak cukup substansial untuk menjadi jawaban? Juga bertanya-tanya apakah saya Saya kehilangan sesuatu dan menjawab pertanyaan yang salah.)
LindaJeanne
2
@LindaJeanne: Seperti yang saya katakan :b#bukan yang saya cari tapi ya fakta bahwa Anda dapat menyimpan keystroke dengan memasukkan langsung :btanpa menekan entersebelumnya itu menarik. (Memang itu mungkin terlalu ringan untuk menjadi jawaban, tapi itu layak untuk dikomentari :-))
statox
Saya menduga LindaJeanne memaknai #karakter sebagai penopang untuk nomor (penyangga), bukan #karakter literal .
8bittree

Jawaban:

12

Saya telah memperhatikan kekurangan dalam alur kerja saya ketika saya mengedit banyak buffer: Saya di buffer dan saya ingin beralih ke buffer lain yang saya tidak ingat namanya dan yang bukan buffer alternatif . Jadi :b#tidak mungkin menggunakan dan menggunakan penyelesaian dengan perintah :bjuga tidak nyaman.

Sebaliknya, saya menemukan penyelesaian tab menjadi sangat nyaman. Menetapkan opsi yang tepat untuk nilai-nilai yang sesuai untuk Anda mungkin banyak membantu. Ini adalah baris yang relevan dari saya vimrc (mereka bekerja untuk saya tetapi mereka mungkin tidak bekerja untuk Anda jadi jangan hanya menyalinnya) :

nnoremap ,b :buffer *
set wildmenu
set wildignore+=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=*/min/*,*/vendor/*,*/node_modules/*,*/bower_components/*
set wildignore+=tags,cscope.*
set wildignore+=*.tar.*
set wildignorecase
set wildmode=full

Dengan itu, buffer kanan jarang lebih dari lima atau enam penekanan tombol:

penyelesaian tab


Ini memberi saya perintah :B(dan pemetaan) yang memanggil fungsi :buffersmenunggu input dan akhirnya panggilan :bdiikuti oleh input.

Barry Arthur datang dengan solusi yang jauh lebih sederhana bertahun-tahun lalu yang telah menjadi sangat populer sejak saat itu:

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

di mana saya mengusulkan varian yang sedikit lebih fleksibel beberapa tahun yang lalu:

nnoremap gb :ls<CR>:b

gb


Karena kita berbicara vimscript, inilah fungsi kecil yang bagus yang saya tulis bahwa "auto-populates" baris perintah dengan stub perintah yang tepat setelah daftar seperti perintah suka :lsatau :ilist. Keuntungan dari fungsi itu daripada pemetaan di atas adalah bahwa saya tidak harus mengingat pemetaan tertentu. Ini berfungsi seperti Vim, tetapi dengan sedikit twist .

" smooth listing
cnoremap <expr> <CR> <SID>CCR()

function! s:CCR()
    if getcmdtype() == ":"
        let cmdline = getcmdline()
            if cmdline =~ '\v\C^(dli|il)' | return "\<CR>:" . cmdline[0] . "jump  " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
        elseif cmdline =~ '\v\C^(cli|lli)' | return "\<CR>:silent " . repeat(cmdline[0], 2) . "\<Space>"
        elseif cmdline =~ '\C^changes' | set nomore | return "\<CR>:sil se more|norm! g;\<S-Left>"
        elseif cmdline =~ '\C^ju' | set nomore | return "\<CR>:sil se more|norm! \<C-o>\<S-Left>"
        elseif cmdline =~ '\C^ol' | set nomore | return "\<CR>:sil se more|e #<"
        elseif cmdline =~ '\C^undol' | return "\<CR>:u "
        elseif cmdline =~ '\C^ls' | return "\<CR>:b"
        elseif cmdline =~ '/#$' | return "\<CR>:"
        else | return "\<CR>" | endif
    else | return "\<CR>" | endif
endfunction

ccr


Yang mengatakan, saya pendukung besar "navigasi berbasis simbol" lebih dari "navigasi berbasis file". Bila berlaku, navigasi berbasis simbol jauh lebih cepat dan jauh lebih ekonomis daripada navigasi berbasis file.

GIF terakhir menunjukkan satu cara navigasi berbasis simbol. Contohnya konyol tapi ... oh well.

romainl
sumber
Saya kira saya belum cukup bermain dengan wild*opsi, saya akan mencoba mengubah cara saya. Tentang solusi Barry Arthur, cukup dekat dengan jawaban @ nobe4 yang menarik. Akhirnya saya harus melihat lebih dalam pada CCR()fungsi Anda untuk benar-benar mendapatkannya tetapi terlihat menjanjikan. Terima kasih atas jawaban anda.
statox
5
Lihat jawaban saya ini . Khususnya komik.
romainl
Saya pasti akan mencuri beberapa dari ini!
statox
7

Saya mengalami masalah yang sama beberapa waktu lalu dan saya menemukan solusi:

nnoremap <leader>b :buffers<CR>:buffer<space>

Ini akan membuka daftar buffer dan tanpa menyembunyikannya, memberi Anda opsi untuk beralih buffer.

Saya pikir masuk akal jika Vim tidak memiliki opsi "daftar dan pilih" di sini, ini adalah dua tindakan terpisah. Tapi Vim cukup kuat untuk menggabungkan perintah bersama.

Anggap saja sebagai filosofi Unix: Lakukan satu hal dan lakukan dengan baik.

:buffersdaftar buffer dan :buffer xxxmemungkinkan Anda untuk memilih satu.

nobe4
sumber
1
Itu cara yang baik untuk meringankan fungsi yang saya sarankan dalam pertanyaan saya, menarik!
statox
1
Jika Anda ingin membuat ruang di bagian akhir lebih terlihat, Anda dapat melakukan: nnoremap <leader> b: buffer <CR>: buffer <Space> |
Tyler Durden
1

Untuk sementara saya menggunakan teknik nobe4 seperti ini:

nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

Lalu saya mulai menggunakan Tab-completion dengan itu (seperti yang disarankan romainl)

Tetapi baru-baru ini saya telah menemukan metode tercepat dengan penekanan tombol paling sedikit adalah dengan menggunakan:

{count} CTRL-^

Ini tidak jauh berbeda dari :b#<Enter>tetapi seperti yang Anda katakan, Anda perlu tahu nomor penyangga!

Jadi untuk itu saya menjalankan plugin MiniBufExplorer , yang menampilkan daftar nama file di bagian atas (seperti hampir setiap editor lainnya). Saya yakin ada banyak alternatif.

Akhirnya, karena Ctrl-^sedikit peregangan untuk jari-jari saya, dan ini adalah operasi yang sangat umum, saya memindahkannya ke Ctrl-E. The implementasi untuk yang tidak terlalu rumit:

nnoremap <C-E> :<C-U>call SwitchToBuffer()<CR>

function! SwitchToBuffer()
  if v:count > 0
    exec v:count . "b"
    return
  endif

  " Whatever you want to do if you didn't provide a count
  " In this case, fall back to nobe4's technique:
  call feedkeys(":ls\n:b ")
endfunction

Jadi proses switching buffer saya saat ini berlangsung seperti ini:

  1. Lihatlah MiniBufExplorer
  2. Memukul 3 Ctrl-E

Sayangnya MBE dan skrip di atas bukan Vim bawaan, seperti yang Anda minta. Ketika saya menggunakan mesin jarak jauh tanpa konfigurasi, saya hanya menggunakan :b [partial]dan Tab-completion.

joeytwiddle
sumber