Vim у меня в хозяйстве используется уже больше 5 лет, иногда возвращался к другим IDE, но в итоге переходил обратно. Сегодня хочу показать, как быстро переключаться между открытыми файлами.
Внимание!
Предполагается, что читатель уже знаком с режимами работы Vim(Нормальный режим, Режим вставки и Визуальный режим). Если нет - рекомендую пройти обучение(в отдельном терминале набираем vimtutor и проходим, занимает минут 15-20).
У меня Vim сейчас выглядит примерно так: (1) дерево файлов, (2) открытый файл и (3) терминал.
Уже выглядит симпатично, правда?
Заметка
Любой файл, открытый в Vim, терминал, дерево файлов, окно ошибок или любая другая информация помещается в буфер, соответственно у каждого открытого файла есть свой, у терминала - свой. Ближе всего аналогия с вкладками в браузере, в каждой вкладке - свой сайт.
Области (1),(2) и (3) в Vim называются - окна (windows), они позволяют удобно расположить буферы.
Стоит задача быстро переключаться между открытыми файлами(буферами) в окне (2).
Получить список всех открытых буферов
Список всех открытых буферов можно получить, если ввести в нормальном режиме команду :ls
. Получиться что-то такое.
Заметка
Для ввода команды нужно войти в нормальный режим (по клавише Esc), потом просто вводим команду и нажимаем Enter. Команды появляются слева внизу.
Первая колонка - это номер буфера, вторая - тип и свойства, третья - имя буфера. Под номером 1 открыт файл .bashrc
, у файла alias.bash
номер буфера 3, а у терминала - 2.
У меня установлен плагин, который показывает сверху имена открытых буферов, как вкладки в браузере, что очень удобно. (Ссылка на плагин в конце статьи)
Переключаем с помощью номера буфера.
Быстрый и “родной”(нативный) способ для Vim - это ввести команду :b 1
. Команда :b
или полная версия :buffer
говорит Виму открыть буфер, а 1
- это номер буфера из списка. Если мы хотим открыть .vimrc
, вводим команду :b 4
. Можно вводить даже без пробела, то есть будет :b4
. Попробуем переключиться сначала в .bashrc
, потом в .vimrc
и возвращаемся в alias.bash
.
Плюсы:
- Короткая команда - быстро набирается
Минусы:
- Нужно знать номера буферов. Когда их 5 - это несложно, но когда будет 20 - уже труднее.
Переключаем с помощью имени буфера.
Этот способ не такой быстрый, как предыдущий, но очень помогает, когда открыто много файлов.
Команда :b
позволяет переключаться ещё и по имени файла, достаточно ввести уникальное имя и нажать Enter. Например, попробуем переключить на файл .bashrc
, для этого можно ввести :b bashr
и нажать Enter. Если ввести не уникальное имя, то Vim ругнётся, что имя не уникальное.
Главнейшая супер-фишка переключения через имя файла(буфера) - работает автодополнение по нажатию Tab. Попробуем ввести команду :b ui
и нажмём Tab, открылся файл vim/ui.vim
.
Если ввести не уникальное имя и нажимать Tab несколько раз, редактор начнёт предлагать по очереди все соответствующие названия буферов.
Плюсы:
- Автодополнение имён файлов
- Короткая команда
Минусы:
- Не всегда работает так, как нужно
- Нужно знать имя файла
Быстрое переключение между двумя буферами.
Когда редактируем только два файла, быстрее переключать используя сочетание клавиш Ctrl+6
.
Попробуем переключить между alias.bash
и vim/ui.vim
.
Плюсы:
- Ещё быстрее переключается
- Не нужно вводить никаких команд
Минусы:
- Переключаемся только между 2мя файлами
Переключение буферов по-кругу.
В браузере (например в Google Chrome или Mozilla Firefox) можно быстро переключаться между вкладками с помощью сочетания клавиш Ctrl+Tab и Ctrl+Shift+Tab.
Для такого же переключения на следующий/предыдущий буфер есть команды vim :bnext
/:bprevious
. Давайте назначим сочетаниям клавиш Ctrl+Tab команду :bnext
для переключения к следующему буферу, а на Ctrl+Shift+Tab - :bprevious
. Вводим команды:
:nnoremap <C-Tab> :bnext<CR>
:nnoremap <C-S-Tab> :bprevious<CR>
<CR>
- соответствует нажатию Enter
Совет
Чтобы настройки, сочитания клавишь сохранились, можно дописать их в файл ~/.vimrc
в таком виде(нужно убрать :
в начале):
nnoremap <C-Tab> :bnext<CR>
nnoremap <C-S-Tab> :bprevious<CR>
Всё хорошо работает до того момента, как переключения в буфер терминала, из которого также быстро не получиться переключиться. Как было написано выше, в Vim в буферах открываются не только файлы, но и терминал и список файлов и многое другое.
Попробуем написать несколько более “умных” функций, которая будет позволять переключаться только между файлами.
Первое что нужно сделать, это научиться определять в буфере с указанным номером(index) файл или что-то другое.
:function! IsValidBuffer(index)
return !empty(bufname(a:index)) && empty(getbufvar(a:index, '&buftype'))
endfunction
Буфер должен соответствовать следующим условиям:
!empty(bufname(a:index))
- проверяем, чтобы название буфера не было пустымempty(getbufvar(a:index, '&buftype'))
- проверяем, что переменная&buftype
в нужном буфере пустая. У терминала, например она будетterminal
.
Теперь напишем функцию, которая будет находить следующий буфер и определять, является ли буфер файлом, с помощью функции выше.
:function! NextBuffer()
let ind = bufnr()
let ind += 1
while ind != bufnr()
if ind > bufnr('$')
let ind = 1
endif
if IsValidBuffer(ind)
break
else
let ind += 1
endif
endwhile
execute "buffer" ind
endfunction
В этой функции делаем:
- В переменную
ind
задаём номер текущего буфера - Увеличиваем
ind
на 1, пока мы обратно не дойдём до изначального буфера. Если дойдём до крайнего буфера, переходим в индекс 1 - Для каждого индекса определяем, правильный ли буфер или нет. Если правильный, то выходим и переходим в него.
Точно так же добавим функцию для переключения в обратном направлении:
:function! PreviousBuffer()
let ind = bufnr()
let ind -= 1
while ind != bufnr('')
if ind < 1
let ind = bufnr('$')
endif
if IsValidBuffer(ind)
break
else
let ind -= 1
endif
endwhile
execute "buffer" ind
endfunction
Теперь назначим клавиши на эти функции:
:nnoremap <C-Tab> :call NextBuffer()<CR>
:nnoremap <C-S-Tab> :call PreviousBuffer()<CR>
Команда :call
вызывает нашу функцию.
Плюсы:
- Ещё быстрее переключается
- Не нужно вводить никаких команд
Полезные ссылки
- Плагин для отображения названий файлов сверху(как вкладки) - https://github.com/vim-airline/vim-airline
- Плагин для более глубокой работы с буферами - https://github.com/jlanzarotta/bufexplorer
Послесловие
Спасибо, что дочитали до самого конца. Надеюсь этот текст помог чуть больше разобраться с Vim.