Một cách hiệu quả hơn để sử dụng bộ đệm là gì?


13

Gần đây tôi đã giảm đáng kể số lượng plugin tôi đang sử dụng vì vậy tôi đang tìm kiếm câu trả lời chỉ bằng các tính năng Vim tích hợp.

Tôi đã nhận thấy một lỗ hổng trong quy trình làm việc của mình khi tôi chỉnh sửa rất nhiều bộ đệm: Tôi đang sử dụng bộ đệm và tôi muốn chuyển sang một bộ đệm khác mà tôi không nhớ tên và đó không phải là bộ đệm thay thế . Vì vậy, việc sử dụng :b#là không thể và sử dụng hoàn thành với lệnh :bcũng không thuận tiện.

Để làm điều đó tôi đã làm như sau:

  • Sử dụng đầu tiên :buffersđể có được danh sách các bộ đệm mở
  • Ghi nhớ số lượng bộ đệm tôi muốn sử dụng
  • Nhấn Enterđể đóng danh sách bộ đệm
  • Sử dụng :bXvới Xsố lượng bộ đệm để sử dụng.

Quy trình này có vẻ khá nặng đối với tôi vì vậy tôi đã thêm các dòng sau vào .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 

Điều này cho tôi một lệnh :B(và ánh xạ) gọi hàm :bufferschờ đầu vào và cuối cùng gọi :btheo sau là đầu vào.

Nó hoạt động tốt nhưng tôi ngạc nhiên khi tôi phải phát triển một chức năng như vậy: thông thường Vim có quy trình làm việc mặc định khá hiệu quả nên tôi tự hỏi liệu có cách nào tốt hơn để chuyển sang bộ đệm mà tôi không biết gì ngoại trừ rằng nó đã được mở trong phiên chỉnh sửa của tôi.


3
Tôi làm :lstheo sau :b#(không cần phải quay lại hoặc thoát trước, có thể truy cập trực tiếp từ danh sách bộ đệm trong 'ls'.) (Đăng dưới dạng nhận xét vì có vẻ không đủ để trả lời? Cũng tự hỏi nếu tôi Tôi đang thiếu một cái gì đó và trả lời sai câu hỏi.)
LindaJeanne

2
@LindaJeanne: Như tôi đã nói :b#không phải là điều tôi đang tìm kiếm nhưng vâng, thực tế là bạn có thể lưu một tổ hợp phím bằng cách nhập trực tiếp :bmà không cần nhấn entertrước đó là điều thú vị. (Quả thực đó có thể là quá nhẹ để có thể trả lời, nhưng nó đáng để nhận xét :-))
statox

Tôi đoán rằng LindaJeanne có nghĩa là #nhân vật thay thế cho một số (bộ đệm), chứ không phải là #nhân vật theo nghĩa đen .
8bittree

Câu trả lời:


12

Tôi đã nhận thấy một lỗ hổng trong quy trình làm việc của mình khi tôi chỉnh sửa rất nhiều bộ đệm: Tôi đang sử dụng bộ đệm và tôi muốn chuyển sang một bộ đệm khác mà tôi không nhớ tên và đó không phải là bộ đệm thay thế . Vì vậy, việc sử dụng :b#là không thể và sử dụng hoàn thành với lệnh :bcũng không thuận tiện.

Ngược lại, tôi thấy việc hoàn thành tab cực kỳ thuận tiện. Đặt các tùy chọn phù hợp cho các giá trị phù hợp với bạn có thể giúp ích rất nhiều. Đây là những dòng có liên quan từ tôi vimrc (chúng hoạt động cho tôi nhưng chúng có thể không hoạt động cho bạn vì vậy đừng sao chép chúng) :

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

Cùng với đó, bộ đệm bên phải hiếm khi cách xa hơn năm hoặc sáu lần nhấn phím:

hoàn thành tab


Điều này cho tôi một lệnh :B(và ánh xạ) gọi hàm :bufferschờ đầu vào và cuối cùng gọi :btheo sau là đầu vào.

Barry Arthur đã đưa ra một giải pháp đơn giản hơn nhiều năm trước và đã trở nên khá phổ biến kể từ đó:

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

trong đó tôi đã đề xuất một biến thể linh hoạt hơn một chút vài năm trước:

nnoremap gb :ls<CR>:b

gb


Vì chúng ta đang nói vimscript, đây là một chức năng nhỏ mà tôi đã viết rằng "tự động điền" dòng lệnh với lệnh bên phải sau các lệnh giống như danh sách như :lshoặc :ilist. Ưu điểm của chức năng đó so với các ánh xạ ở trên là tôi không phải nhớ các ánh xạ cụ thể. Nó hoạt động giống như Vim, nhưng với một chút thay đổi .

" 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


Điều đó nói rằng, tôi là một người ủng hộ lớn cho "điều hướng dựa trên biểu tượng" trên "điều hướng dựa trên tệp". Khi áp dụng, điều hướng dựa trên biểu tượng sẽ nhanh hơn và kinh tế hơn nhiều so với điều hướng dựa trên tệp.

Nhân tiện, GIF cuối cùng cho thấy một ý nghĩa của điều hướng dựa trên biểu tượng. Ví dụ là ngớ ngẩn, nhưng oh oh tốt.


Tôi đoán tôi đã không chơi đủ với các wild*tùy chọn, tôi sẽ cố gắng điều chỉnh theo cách của mình. Về giải pháp Barry Arthur, nó khá gần với câu trả lời của @ nobe4 thật thú vị. Cuối cùng tôi sẽ phải xem xét sâu hơn về CCR()chức năng của bạn để thực sự có được nó nhưng nó có triển vọng. Cảm ơn câu trả lời của bạn.
statox

5
Xem câu trả lời này của tôi . Đặc biệt là truyện tranh.
romainl

Tôi chắc chắn sẽ ăn cắp một số trong số này!
statox

7

Tôi đã gặp vấn đề tương tự một thời gian trước đây và tôi đã tìm thấy một giải pháp:

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

Điều này sẽ mở danh sách bộ đệm và không ẩn nó, cung cấp cho bạn tùy chọn để chuyển đổi bộ đệm.

Tôi nghĩ rằng điều đó có ý nghĩa rằng Vim không có tùy chọn "liệt kê và chọn" ở đây, đây là hai hành động riêng biệt. Nhưng Vim đủ mạnh để kết hợp mệnh lệnh với nhau.

Hãy nghĩ về nó như triết lý Unix: Làm một việc và làm tốt.

:buffersliệt kê các bộ đệm và :buffer xxxcho phép bạn chọn một.


1
Đó là một cách tốt để làm sáng chức năng mà tôi đề xuất trong câu hỏi của tôi, thật thú vị!
statox

1
Nếu bạn muốn làm cho không gian ở cuối hiển thị rõ hơn, bạn có thể làm: nnoremap <leader> b: bộ đệm <CR>: bộ đệm <Space> |
Tyler Durden

1

Trong một thời gian, tôi đã sử dụng kỹ thuật của nobe4 như thế này:

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

Sau đó, tôi bắt đầu sử dụng hoàn thành Tab với điều đó (như romainl gợi ý)

Nhưng gần đây tôi đã tìm thấy phương pháp nhanh nhất với số lần nhấn phím ít nhất là sử dụng:

{count} CTRL-^

Điều này không quá khác biệt :b#<Enter>nhưng như bạn nói, bạn cần biết số bộ đệm!

Vì vậy, tôi chạy plugin MiniBufExplorer , hiển thị danh sách tên tệp trên đầu trang (giống như hầu hết các trình soạn thảo khác). Tôi chắc chắn có nhiều lựa chọn thay thế.

Cuối cùng, vì Ctrl-^một chút căng cho ngón tay của tôi, và đây là một hoạt động rất phổ biến, tôi chuyển nó sang Ctrl-E. Việc thực hiện cho điều đó không quá phức tạp:

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

Vì vậy, quá trình chuyển đổi bộ đệm hiện tại của tôi diễn ra như sau:

  1. Nhìn vào MiniBufExplorer
  2. Đánh 3 Ctrl-E

Đáng buồn là MBE và tập lệnh ở trên không phải là nội dung Vim, như bạn yêu cầu. Khi tôi ở trên một máy từ xa không có cấu hình, tôi chỉ sử dụng :b [partial]và hoàn thành Tab.

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.