Найшвидший спосіб перейти на буфер vim?


43

Одним із способів вибору буфера vim може бути перегляд списку буферів, використовуючи стандартні команди як :lsабо за допомогою зовнішнього коду плагіна / vimscript для перегляду списку у вікні .

Скажімо, я хочу перейти до буфера безпосередньо, як можна швидше.

Для переходу до списку буферів у послідовному режимі я тепер використовую <C-J> <C-K>ярлики, встановивши у своєму .vimrc:

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

Іншим способом (прямий доступ) може бути перемикання за номером : знаючи номер буфера, можна переключитися безпосередньо, ввівши номер буфера, за яким слід <C-^>. Тож якщо я хочу перейти на буфер №5, я б натиснув 5<C-^>.

Але це, здається, не працює для мене (я використовую vim 7.4 у вікні ubuntu, від гостя Windows, з італійською клавіатурою ). Я підозрюю, що це ^символ у верхній регістровій клавіші на італійській клавіатурі, тому насправді, щоб отримати, ^мені потрібно натиснутиSHIFT-^

Будь-які ідеї?


2
Чи можете натиснути <c-6>замість <c-^>?
Пітер Рінкер

ти маєш на увазі Ctrl-1 для переходу до буфера №1? На жаль, не працює. нічого не трапляється
Джорджіо Робіно

1
Ні. Деякі термінали можуть зрозуміти Ctrl-6, що таке саме, як Ctrl- ^ на клавіатурі США.
Пітер Рінкер

2
+1 Чудово, це працює! Я використовую італійську розкладку клавіатури (використовуючи емулятор кінцевого терміналу). Отже: 1<C-6>переходить на буфер № 1. Дякую!
Джорджіо Робіно

Ви можете спробувати використовувати CtrlSpace .
Гонко Лю

Відповіді:


51

:bКоманда може також взяти подстроку імені файлу буфера , який ви хочете подорожувати в, що дуже зручно.

Наприклад, якщо у вас є три буфера foo, barі baz, потім

  • :b barперейде у barфайл.

  • :b oперейде у fooфайл.

  • :b aдасть вам помилку, оскільки це може означати або, barабо baz, але ви можете виправити ім'я, щоб бути більш конкретним, наприклад, з : r Enter.

Це може бути дуже корисно, адже це означає замість

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

ви можете зробити щось подібне

:b LongFileName

що набагато коротше і простіше.

Ця команда також може приймати число, якщо ви хочете використовувати це:

:b 5

8
Застереження про використання часткових імен буфера: якщо ім'я часткового буфера з’являється на початку межі слова в шляху деякого буфера, жоден буфер з частковою назвою в середині слова не буде доступний :bкомандою. Наприклад, якщо у вас є два буфери path/to/fooі path/to/tofu, команда :b f<Tab>ніколи не збігатиметься path/to/tofu, оскільки вона відповідає на початку слова в path/to/foo.
tommcdo

2
:5bтрохи коротше :b 5 ;-)
joeytwiddle

15

Це те, що я використовую:

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

Тепер натискання \bвідобразить список доступних буферів і підготується :bдо вас.

Потім можна просто ввести номер буфера та натиснути Enter.

Або ви можете ввести частину імені файлу та натисніть Enter. (Однак я зазвичай натискаю Tab перед натисканням клавіші Enter, щоб перевірити, чи отримав правильний буфер. Якщо ні, я продовжую їздити за допомогою Tab, поки не отримаю потрібного.)


Насправді я використовую трохи перероблену версію вищезазначеного:

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

Це запобіжить появі -- More --підказки, коли для відображення їх більше буферів, ніж доступних рядків.

Але якщо у вас зазвичай 'more'варіант заборонений в будь-якому випадку, це відображення вас дійсно роздратує, оскільки воно знову вмикає 'more'варіант після виконання ls!


1
Правду кажучи, я фактично не використовую жодного з них, я використовую власний маленький плагін , але функціональність дуже схожа. За допомогою плагіна я також можу виконувати Tab-Complete на імена файлів невідкритих буферів.
joeytwiddle

1
Хоча ця методика не така швидка, як використання, [count]<C-^>коли ви знаєте номер буфера, він дуже корисний, коли ви не знаєте.
joeytwiddle

2
дякую joeytwiddle за ваші нотатки. Я перевірю ваш плагін як можна швидше. У моєму випадку (див. Проблему з клавіатурою вище) [count]<C-6>мені здається найшвидший спосіб перейти на відомий буфер
Джорджіо Робіно

Так, я теж зараз користуюся [count]<C-^>. Але це означає, що мені потрібно запустити MiniBufExplorer або щось подібне, щоб знати, які буферні номери!
joeytwiddle

навіщо вам потрібні <CR> і <SPACE>? Спочатку мені здається, ніби це прекрасно працює і без них ...
Фелікс Краццолара

9

:CtrlPBufferіз плагіна CtrlP (4k ★)

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

Відкрийте список нечіткого буфера за допомогою :CtrlPBufferабо натисніть, <C-p>після чого <C-b>змініть режим на buffer.

Введіть достатню кількість символів, щоб вказати буфер, який потрібно відкрити.
Ви також можете використовувати <C-j>та <C-k>переходити через список та вибирати буфер вручну.

введіть тут опис зображення

Настроювання

Якщо ви хочете негайно відкрити список буфера <C-p>, додайте наступний рядок до свого vimrc:

let g:ctrlp_cmd = 'CtrlPBuffer'

Ви можете використовувати <C-f/b>для перемикання режиму вікна ctrlp.

Я особисто використовую let g:ctrlp_cmd = 'CtrlPMRU'. Останній використовуваний (mru) список також містить відкриті буфери. Якщо ви використовуєте різні режими ctrlp і хочете дотримуватися останнього режиму, ви можете встановити його let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Подібні плагіни

Є більше плагінів, які забезпечують список буфера з інтерактивною підказкою з нечітким узгодженням, наприклад

  • fzf.vim (4k ★) від Junegunn (+ термінал, перейти)
  • команда-t від Вінсента (+ рубін)
  • denite.nvim від Shougo (+ python3, vim8 або neovim)

Темна сторона проти світла сторона

(наприклад, налаштування vim-тяжких модулів та способів vim)

Перш ніж вирішити використовувати ці більш складні плагіни, вивчіть відповіді від @Doorknob та @joeytwiddle . Зокрема, перевірте однолінійку, чи одна з них вже відповідає вашим потребам.

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

Установка плагінів лише для перемикання буфера може бути надмірною. Дивіться також зауваження до https://www.vi-improved.org/recommendations та статтю Дрю Ніла "Про заточування пили" .


так, Хоцке, зізнаюся, я часто використовую: CtrlPBuffer
Джорджіо Робіно

Я використовую map <leader>a <ESC>:CtrlPBuffer<CR><CR>для переходу до раніше відкритого буфера за допомогою <leader>a(поки <leader>bякраз відкриває список буфера для мене)
Rolf,

@Rolf: ти знаєш <C-^>(= <C-6>)? див :h CTRL-^. Афаїк, це саме те, що, <leader>aздається, робить твоє картографування . Тому я думаю, що ви щойно привели приклад, чому люди, які кажуть, що використання плагінів може призвести до користувача vim, який не знає, що вже може зробити vim самостійно.
Хоцке

@Hotschke: Ні, я цього не знав. Навчився чогось знав, дякую! Я все-таки перероблю <C - ^> хоч.
Рольф

Відмінна посилання на <Cd> з ванільним вимом. Я ніде не бачив цього посилання.
радке

8

Окрім дійсно корисних відповідей, не забудьте Joeytwiddle та Doorknob :b#, який переходить на останній використовуваний буфер. Це також можна зробити просто <C-^>. Якщо у вас є багато буферів і ви постійно перемикаєтесь між ними, останній буфер зазвичай є найпоширенішим пунктом призначення.

Особисто я використовую комбінацію багатьох методів. Коли я працюю в основному з двома буферами, а решта відкривається лише для випадкових посилань, я схильний перемикатися між ними за допомогою :b#або <C-^>. Коли мені доводиться працювати з більшою частиною з них і переключатися частіше, я використовую або цифри (як у підказці joeytwiddle), або частину імен (як у підказці Doorknob) з TAB, щоб завершити їх. Коли імена плутають, і відкривається багато буферів (зазвичай це більше 10), я частіше використовую плагін Ctrl-P ( https://github.com/kien/ctrlp.vim ). За допомогою двох швидких натискань клавіш я отримав список всі вони, і я можу використовувати потужний нечіткий пошук над ними, щоб швидко знайти те, що я хочу.


2
<C - ^> поодинці (<C-6> в моєму випадку, як запропонував Пітер Рінкер) - це хороший трюк у випадку лише 2 буферів :-)
Джорджіо Робіно,

5

[bі ]bз плагіна vim-unimpaired(> 2k ★)

Якщо у вас випадково встановлено vim-unimpaired, ви можете використовувати

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

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

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

Існує набагато більше дужок-відображень, які містяться в vim-unimpairedних. Всі вони дотримуються тієї ж схеми, яка дозволяє легко запам'ятовувати їх.

Темна сторона проти світла сторона

Цей плагін можна вважати легким і «зловмисним». Він позначається спільнотою #vim як плагін "не шкодить".


+1 Також варто зазначити, що ви можете надати рахунок. 3[bщоб стрибнути три буфери назад.
joeytwiddle

1

В даний час я використовую клавішу <Leader>+ numberдля переключення. Ключ лідера - мій <space>ключ. Я також використовую vim-airline для показу буфера nr у верхній частині вікна.

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

Хоча bufnr часто перевищує 10, тому я налаштовую власне відображення, якщо numberце єдиний збіг, негайно перемикайте буфер, інакше чекайте на введення більшої кількості чи <space>ключа для підтвердження:

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

Код вставляється звідси

До речі, я також використовую <S-h>і <S-l>для, :bpі :bnабо, :tabpі :tabnякщо зараз відкрито більше однієї вкладки. Для мене це досить інтуїтивно.


1

Ці дні я використовую [buffer_number]<Ctrl-^>для перемикання буферів, оскільки це дуже швидко.

Але як знати номер буфера? Я використовую MiniBufExplorer, щоб я завжди міг бачити буферні номери у верхній частині Vim.

Я також використовую наступне картографування, тому <C-^>що трохи важко досягти однією рукою.

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

На свіжій машині без конфігурації я повертаюся до :b [part_of_filename]<Tab><Enter>

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