Який більш ефективний спосіб використання буферів?


13

Останнім часом я різко зменшив кількість плагінів, які використовую, тому шукаю відповіді, використовуючи лише вбудовані функції Vim.

Я помічав недолік у своєму робочому процесі, коли редагую безліч буферів: я перебуваю на буфері і хочу переключитися на інший, з якого не пам’ятаю ім'я, і ​​який не є альтернативним буфером . Тому використання :b#неможливо, а також використання завершення з командою :bтакож не зручно.

Для цього я робив наступне:

  • Спочатку скористайтеся :buffersдля отримання списку відкритих буферів
  • Запам’ятайте номер буфера, який я хочу використовувати
  • Натисніть, Enterщоб закрити список буферів
  • Використовуйте :bXразом Xз номером буфера, який потрібно використовувати.

Цей робочий процес здався мені досить важким, тому я додав наступні рядки до свого .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 

Це дає мені команду :B(і відображення), яка викликає функцію :buffersчекати введення і, нарешті, дзвінки, :bа потім введення.

Це добре працює, але я здивований, що мені довелося розробити таку функцію: зазвичай Vim має досить ефективний робочий процес за замовчуванням, тому мені цікаво, чи є кращий спосіб переключитися на буфер, з якого я не знаю нічого виняткового що це вже було відкрито в моїй сесії редагування.


3
Мені :lsслідує :b#(не потрібно спочатку повертатись або бігти, можу перейти безпосередньо зі списку буфера в "ls".) (Публікація як коментар, оскільки це не здається достатньо істотним, щоб бути відповіддю? Також цікаво, чи я щось пропускаю і відповідаю на неправильне запитання.)
LindaJeanne

2
@LindaJeanne: Як я вже сказав, :b#це не те, що я шукаю, але так, цікаво те, що ви можете зберегти натискання клавіші, ввівши безпосередньо, :bне натискаючи enterраніше. (Дійсно, це може бути занадто легким, щоб відповісти, але варто було прокоментувати :-))
statox

Я здогадуюсь, що LindaJeanne мав на увазі #персонаж як резервний номер для (буферного) числа, а не буквального #символу.
8bittree

Відповіді:


12

Я помічав недолік у своєму робочому процесі, коли редагую безліч буферів: я перебуваю на буфері і хочу переключитися на інший, з якого не пам’ятаю ім'я, і ​​який не є альтернативним буфером . Тому використання :b#неможливо, а також використання завершення з командою :bтакож не зручно.

Навпаки, я вважаю, що заповнення вкладок є надзвичайно зручним. Встановлення правильних параметрів для значень, які працюють для вас, може допомогти дуже багато. Це відповідні рядки з моєї vimrc (вони працюють для мене, але вони можуть не працювати для вас, тому не просто копіюйте їх) :

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

При цьому правого буфера рідко буває більше ніж п’ять-шість натискань клавіш:

вкладка заповнення


Це дає мені команду :B(і відображення), яка викликає функцію :buffersчекати введення і, нарешті, дзвінки, :bа потім введення.

Баррі Артур запропонував набагато простіше рішення років тому, яке стало досить популярним з тих пір:

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

з яких я запропонував трохи більш універсальний варіант пару років тому:

nnoremap gb :ls<CR>:b

гб


Оскільки ми говоримо про vimscript, тут є приємна маленька функція, яку я написав, що "автоматично заповнює" командний рядок правою командною заглушкою після спископодібних команд, як :lsабо :ilist. Перевага цієї функції над відображеннями вище в тому, що мені не потрібно пам’ятати конкретні відображення. Це працює так само, як Вім, але з невеликим поворотом .

" 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


Це означає, що я великий прихильник "навігації на основі символів" над "навігацією на основі файлів". Якщо застосовно, навігація на основі символів набагато швидша та значно економічніша, ніж навігація на основі файлів.

Останній GIF , до речі, показує одне середнє значення на основі символів. Приклад нерозумний, але… о добре.


Я думаю, що я недостатньо грав з wild*варіантами, спробую виправити це по-своєму. Щодо рішення Баррі Артура, це досить близько до відповіді @ nobe4, що цікаво. Нарешті, мені доведеться глибше придивитись до вашої CCR()функції, щоб дійсно її отримати, але вона виглядає перспективною. Дякую за вашу відповідь.
statox

5
Дивіться цю мою відповідь . Особливо комічний.
romainl

Я обов'язково вкраду деякі з них!
statox

7

Нещодавно я зіткнувся з тією ж проблемою і знайшов рішення:

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

Це відкриє список буфера і, не приховуючи його, дасть вам можливість перемикати буфер.

Я думаю, що має сенс, що у Vim немає опції "список і вибір", це дві окремі дії. Але Vim досить потужний, щоб поєднати команду разом.

Подумайте про це як філософію Unix: Робіть одне і робіть це добре.

:buffersперелічує буфери та :buffer xxxдозволяє вибрати один з них.


1
Це хороший спосіб полегшити функцію, яку я запропонував у своєму питанні, цікаво!
statox

1
Якщо ви хочете зробити пробіл в кінці більш видимим, ви можете зробити: nnoremap <leader> b: буфери <CR>: буфер <Простір> |
Тайлер Дюрден

1

Деякий час я користувався такою технікою nobe4:

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

Тоді я почав використовувати табл-доповнення з цим (як пропонує Ромен)

Але нещодавно я виявив, що найшвидшим методом з найменшими натисканнями клавіш є використання:

{count} CTRL-^

Це не так відрізняється від, :b#<Enter>але, як ви кажете, вам потрібно знати номер буфера!

Тож для цього я запускаю плагін MiniBufExplorer , який відображає список імен файлів вгорі (як майже кожен інший редактор). Я впевнений, що існує чимало альтернатив.

Нарешті, оскільки Ctrl-^це трохи розтягнення моїх пальців, і це дуже поширена операція, я перемістив її на Ctrl-E. Реалізація для цього не надто складна:

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

Тож мій поточний процес перемикання буфера відбувається приблизно так:

  1. Подивіться на MiniBufExplorer
  2. Удар 3 Ctrl-E

На жаль, MBE та сценарій вище не є Vim buildins, як ви просили. Коли я перебуваю на віддаленій машині без конфігурації, я просто використовую :b [partial]та Tab-завершення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.