Как вы предпочитаете переключаться между буферами в Vim?


92

Я пробовал MiniBufExplorer , но обычно в нескольких окнах он отображается или вообще закрывается. Я бы хотел что-то вроде LustyJuggler с инкрементным поиском, как я переключаюсь между буферами в Emacs. Неужто есть такой сценарий?

Ответы:


23

Я использую плагин Wincent Colaiuta Command-T vim уже пару месяцев. Винсент написал на C те части, которые должны быть быстрыми, и я должен сказать, что это так! И я думаю, что его логика сопоставления шаблонов файлов даже лучше, чем Command-T Textmate. Посмотрите скринкаст .

Подключаемый модуль 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 Джамиса , которые немного изменяют принцип работы 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 Джеймиса завершает работу с 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.
graywh

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

4
<CS-Tab> запрашивает RSI. Я сопоставил <SJ> :bpи <SK> с:bn
puk

3
Переназначение <SJ> кажется плохим выбором в нормальном режиме, поскольку он обычно используется (для объединения строк).
Майкл Перси

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 - это то, что вы можете чему-то учиться каждый день!
Люк М.

Речь идет о буферах , а не о вкладках ... но вы можете :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

Превосходный Buffer Explorer , у него такая сильная мышечная память, что мне хочется использовать его в других приложениях. Я считаю, что это очень быстро при активном редактировании более двух файлов.


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.