Як ви вважаєте за краще перемикатися між буферами у Vim?


92

Я спробував MiniBufExplorer , але зазвичай у мене з’являється кілька вікон, які його показують, або взагалі закриваю. Що б я хотів, це щось на зразок LustyJuggler з покроковим пошуком, способом перемикання між буферами в Emacs. Напевно, існує такий сценарій?

Відповіді:


23

Я використовую плагін Command-T vim від Вінсента Колайути вже пару місяців. Вінсент написав його частини, які повинні бути швидкими на C, і я повинен сказати, що це так! І, я думаю, логіка відповідності шаблону файлів навіть краща, ніж Textmate's Command-T. Перегляньте скринкаст .

Плагін Command-T для VIM забезпечує надзвичайно швидкий, інтуїтивно зрозумілий механізм відкриття файлів з мінімальною кількістю натискань клавіш. Він отримав назву "Command-T", оскільки натхненний вікном "Перейти до файлу", прив'язаним до Command-T у TextMate.

Файли відбираються шляхом набору символів, що з’являються на їхніх шляхах, і впорядковуються за допомогою алгоритму, який знає, що символам, які з’являються у певних місцях (наприклад, відразу після роздільника контурів), слід надати більшу вагу.

Більш просте перемикання буфера містить багато корисних порад. Я адаптував наступне до мого .vimrc, який виконує автоматичне заповнення імені буфера, відображає найкорисніші команди перемикання буферів до моїх <Leader> та лівих клавіш домашнього рядка та показує поточний номер буфера в рядку стану :

"" Tab triggers buffer-name auto-completion
set wildchar=<Tab> wildmenu wildmode=full

let mapleader = ","

map <Leader>t :CommandT<Return>
map <Leader>a :bprev<Return>
map <Leader>s :bnext<Return>
map <Leader>d :bd<Return>
map <Leader>f :b 

"" Show the buffer number in the status line.
set laststatus=2 statusline=%02n:%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

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


73

Раніше я використовував комбінацію вкладок та декілька екземплярів gvim, зберігаючи групи пов’язаних файлів як вкладки у кожному екземплярі. Поки у мене не вийшло занадто багато вкладок в одному екземплярі, панель вкладок відображає ім'я кожного файлу, який ви редагуєте з першого погляду.

Потім я прочитав пост Джейміса Бака про те, як він перейшов з TextMate назад на vim , і дізнався кілька чудових прийомів:

  • Ctrl-w s та Ctrl-w v, щоб розділити поточне вікно
  • Ctrl-6 для перемикання між двома буферами в одному вікні.
  • дивовижний fuzzyfinder.vim, який надає вам автозавершення пошуку файлів у поточному каталозі або буферів, які ви наразі відкрили
  • Власні fuzzy_file_finder і fuzzyfinder_textmate Jamis , які дещо змінюють роботу fuzzyfinder, щоб поводитись більше як подібна функція в TextMate (наскільки я можу зрозуміти, різниця полягає в тому, що вона відповідає будь-якому місці в назві файлу, а не лише з самого початку). Перегляньте це відео, щоб побачити його в дії.

Тепер я просто маю один екземпляр gvim, розгорнутий, і розділяю його на кілька вікон, щоб я міг бачити відразу кілька файлів. Я прив'язав Ctrl-F до fuzzyfinder_textmate, тому тепер, якщо я наберу (скажімо) Ctrl-F, mod/usobвін відкриє app / models / user_observer.rb. Я майже ніколи більше не турбуюся з вкладками.

Оновлення 2010/08/07

Незважаючи на те, що fuzzyfinder_textmate залишається чудовим, як зазначає Кейсі в коментарях, він більше не підтримується. Крім того, він (та / або fuzzyfinder.vim) стає трохи повільним і нестійким при роботі з великими проектами (безліччю каталогів або файлів), тому я шукав альтернативу.

До щастя, там , здається, дуже хороша альтернатива у вигляді Wincent Colaiuta «s Command-T плагін . Це має дуже подібну (якщо не трохи кращу) поведінку до fuzzyfinder_textmate, але помітно швидше; він також має приємні функції, такі як можливість відкрити знайдений файл у розділеному або вертикальному розбитті. Дякую (і підтримую!) Девіду Ріверсу, що вказав на нього.


Так, fuzzyfinder дуже підходить до того, що я хочу.
Олексій Романов

Fuzzyfinder_textmate Jamis завершує vim. Це справді має стати основною особливістю!
csexton

Схоже, Джамі припинила роботу над цим проектом. Можливо, оригінальний автор втягне ці особливості? weblog.jamisbuck.org/2009/1/28/…
cmcginty

Сем, дякую за реквізит, який ти мені подарував (на мій день народження!): D
Девід Ріверс

14
Спробуйте плагін ctrlp vim ( kien.github.com/ctrlp.vim ), він реалізує fuzzyfinder, але з ще кількома корисними функціями :)
Філіп

33

Я використовую основи - ' :ls' + ' :bn' / ' :bp' + ' :b <part-of-name>'


8
:-) Я ніколи не думав, що побачу "просте" та "': ls' + ': bn' / ': bp' + ': b <part-of-name>'" у тому ж реченні.
paxdiablo

16
Пакс, я досі цього не бачу. :-)
csexton

Це плюс :map <c-n> :bn<cr>і :map <c-p> :bp<cr>, оскільки C-nі C-pшвидко вводяться, і дозволяють циклічність між буферами, якщо ви натискаєте їх кілька разів. (Я ніколи не використовував їх для своєї первісної мети.) Це як їзда на велосипеді між вкладками браузера з C-PgUpі C-PgDnабо будь-яким ярликом вашого браузера.
Tobia

Ctrl + N є стандартом для "Новий файл" у більшості інших редакторів, а Ctrl + P - це команда вставлення, тому для більшості людей це буде справді заплутано. Тим Поуп vim-unimpaired дає вам [bпопередній буфер і ]bнаступний буфер. Плюс багато інших смаколиків, які використовують концепцію ]наступного та [попереднього.
icc97

31

Мені подобається "ctrl-w s" і "ctlr-w v", щоб розділити вікно. Потім я зіставляю клавіші переміщення (h, j, k, l), утримуючи натиснутою ctrl для переміщення між розділеними вікнами:

" Map ctrl-movement keys to window switching
map <C-k> <C-w><Up>
map <C-j> <C-w><Down>
map <C-l> <C-w><Right>
map <C-h> <C-w><Left>

Доводиться переводити руку до клавіш зі стрілками дратує.

Далі я встановив ctlr-tab для перемикання між буферами в поточному вікні (як і в багатьох інших середовищах):

" Switch to alternate file
map <C-Tab> :bnext<cr>
map <C-S-Tab> :bprevious<cr>

Вони працювали у мене досить добре за останні кілька років, хоча у vim завжди є більше секретів, ніж ви можете знати.


3
Ваш коментар "переключитися на альтернативний файл" вводить в оману, оскільки у Vim вже є альтернативний файл, це попередній файл, у якому ви були, і ви можете легко переключити поточний (%) та альтернативний (#) файли за допомогою ctrl-6.
greywh

10
Крім того, <Cw> з hjkl переключатиме вікна - клавіші зі стрілками не потрібні.
greywh

4
<CS-Tab> просить RSI. Я прив'язав <SJ> до :bpта <SK> до:bn
puk

3
Перемапування <SJ> здається поганим вибором у звичайному режимі, оскільки це зазвичай використовується (для конкатенації рядків).
Michael Percy

18
nmap <Leader>bb :ls<CR>:buffer<Space>

і ніхто не згадував приємний плагін ctrlp.vim . За допомогою цього плагіна ви можете шукати буфер за назвою.


Мені подобається це картографування! Розумний та гнучкий.
ivan


5
imap <A-1> <Esc>:tabn 1<CR>i
imap <A-2> <Esc>:tabn 2<CR>i
imap <A-3> <Esc>:tabn 3<CR>i
imap <A-4> <Esc>:tabn 4<CR>i
imap <A-5> <Esc>:tabn 5<CR>i
imap <A-6> <Esc>:tabn 6<CR>i
imap <A-7> <Esc>:tabn 7<CR>i
imap <A-8> <Esc>:tabn 8<CR>i
imap <A-9> <Esc>:tabn 9<CR>i

map <A-1> :tabn 1<CR>
map <A-2> :tabn 2<CR>
map <A-3> :tabn 3<CR>
map <A-4> :tabn 4<CR>
map <A-5> :tabn 5<CR>
map <A-6> :tabn 6<CR>
map <A-7> :tabn 7<CR>
map <A-8> :tabn 8<CR>
map <A-9> :tabn 9<CR>

1
Найцікавіше з Vim - це те, що ти можеш чогось навчитися щодня!
Luc M

Питання стосується буферів , а не вкладок ... але ви можете :tab sballспочатку, або замість використання :tabnвам слід скористатися:buffer
pera

5

Нещодавно я став більш мінімалістичним.

Для циклічного використання буферів, які я використовую ]bта [bз неушкоджених: https://github.com/tpope/vim-unimpaired

Щоб перейти прямо до відкритого буфера, просто скористайтеся заповненням вкладки Vim за допомогою :b. Досить декількох букв, щоб дістатися до будь-якого відкритого буфера з вкладкою або двома.

Подібно до відкритих буферів, які я використовую :eз відносними шляхами та вкладкою завершено.

Я також :lsіноді використовую, щоб побачити, які буфери у мене відкриті (і перевірити їх змінений статус).

Щоб позбутися буфера, я використовую його :bwдля стирання. Зазвичай я роблю тимчасовий спліт і міняю буфери, щоб зберегти свій макет, хоча :bwтакож закриває активне вікно.

Всі речі, які я пробував, просто мене дратували, і я не хочу, щоб щось розумне, що відкриває мені випадкові файли. Якщо мені дійсно потрібно щось переглянути, я використовую NERDtree ( :e .).

IDK, Останнім часом я також кинув Yankring (тому що він викручується xp) і почав використовувати регістри, і нещодавно вирішив, що f/ tруху - це найбільше, що було коли-небудь ...


Це все чудова порада. Я наніс <leader>llна карту :ls. Крім того, дійсно корисно переконатися, що у вас є set wildmenuу своєму розпорядженні, .vimrcоскільки тоді ви отримаєте невелике меню, яке пропонує всі альтернативи:b
icc97

2

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


2

Я витратив досить довгий час на створення свого .vimrc для роботи з цим проектом HTML :: Mason, у якому я працював чотири роки, тому у мене є дивна суміш вкладок та розділених вікон. Для вашого перегляду:

map ;o :Sex <CR>
map <C-J> <C-W>j
map <C-K> <C-W>k
map <C-l> <C-W>l
map <C-h> <C-W>h
map ;] :tabnext<CR>
map ;[ :tabprev<CR>
map <C-t> :tabe +"browse ."<CR>
map <C-O> :NERDTreeToggle ~/curr/trunk/<CR>

2

Я використовую tselectbuffer . Це дуже швидко, і на відміну від bufexplorer не займає місця у вашому вікні. Він також має додатковий пошук. Я спробував minibufexplorer, і навігація в буфері виявилася трохи складною.


Дякую за вказівник, тепер я використовую обидва. Значення за замовчуванням для BufExplorer є ,be, ,bs, ,bv, тому я зіставляти TSelectBuffer до ,bb.
Brady Trainor

2

Щоб скласти список і перемикатися між буферами, які я використовую:

nnoremap <Leader>l :ls<CR>:b<space>

Для перемикання між буферами:

map <Leader>n :bn<CR>
map <Leader>p :bp<CR>

2

Я зіставляти <S-J>і <S-K>до :bpі :bn, хоча я визнаю , що я не використовую його як кількість файлів більше , ніж 10. Я потім відображає <C-J>і <C-K>на попередню і наступну вкладку Gnome Terminal, і я зазвичай працюю 4 примірники Vim для кожного з 4 різні проекти, над якими я працюю. Я все ще хочу, щоб наступний та попередній буфер переходили до історії буферів, над якими я працював, а не до порядку в списку буферів.


2

Я використовую tselectbuffer. Це дуже швидко, і на відміну від bufexplorer не займає місця у вашому вікні. У ньому також є додатковий пошук. Я спробував minibufexplorer, і навігація в буфері виявилася трохи складною.


0

я використовую прості: vsplit з ^ W + w / ^ W + r і: tabnew за допомогою комбінацій клавіш Ctrl + Alt + PgUp / PgDown.


1
Я повинен погодитися з тим, що тут сказав Затрус . Вкладки у Vim (або Emacs з TabBar) просто не працюють, як у звичайних інтерфейсах з вкладками.
Олексій Романов

0

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

: nnoremap (F5): буфери (CR): буфер (пробіл)

vim.wikia.com

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