Vimではいったんファイルを開くと、開いたファイルは「バッファ」に入ったものとして扱われる。NERDTreeを使うなどして複数のファイルを開いた場合、開いたファイルはバッファに入っている。バッファに入っているファイルは、次のように「:ls」で表示させることができる。

バッファを一覧表示させる:ls

次のスクリーンショットでは、バッファ1で「logrotate.conf」が、バッファ2で「selection.txt」が、バッファ3で「typescript.xml」が編集された状態にある。

バッファとファイル

バッファ間の移動を行う方法として、次のような操作がある。

操作 内容
:bn 次のバッファへ移動
:b1 バッファ1へ移動
:b2 バッファ2へ移動
:b3 バッファ3へ移動
:b4 バッファ4へ移動
:b5 バッファ5へ移動
:b6 バッファ6へ移動
:b7 バッファ7へ移動
:b8 バッファ8へ移動
:b9 バッファ9へ移動

バッファはVimの最も基本的な機能の一つだ。しかし、どのファイルがバッファに入っているか調べる方法が少し煩雑で、バッファ間の移動も面倒な部分があるのが否めない。ここはプラグインを使って、もっと直感的にバッファ間を行ったり来たりしたいところだ。

プラグイン「minibufexpl」でバッファをタブのように表示

バッファを扱うプラグインはいくつもあるのだが、ここではバッファ一覧をタブのように常に上部に表示するプラグイン「minibufexpl」を紹介したい。このプラグインを使うと、複数のファイルを開いた場合に上部に開いているファイル(バッファ)の一覧がタブのように表示される。今どのファイルを開いているのか、何番がどのファイルなのかがひと目でわかるようになるのだ。

本連載でこれまでに作成してきたVimの設定ファイル(~/.vimrcファイル)は以下の通りだ。

"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein/.')
  call dein#begin('~/.cache/dein/.')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('preservim/nerdtree')
  call dein#add('tpope/vim-commentary')
  call dein#add('tpope/vim-fugitive')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

" seoul256
let g:seoul256_background = 233
colo seoul256

" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

"End dein Scripts-------------------------

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase

まず、設定ファイル内で次の記述を探してほしい。

  call dein#add('tpope/vim-commentary')
  call dein#add('tpope/vim-fugitive')

上記を次のように変更してminibufexplを読み込ませる。

  call dein#add('tpope/vim-commentary')
  call dein#add('tpope/vim-fugitive')
  call dein#add('fholgado/minibufexpl.vim')

「minibufexpl」は表示するだけなので、操作内容は上記表に挙げた内容となる。複数のファイルを開いて編集する作業が頻繁に発生する場合、これではちょっと面倒だ。少しでも素早くバッファを切り替えたい。

そこで、新しく設定を追加する。次のように「NERDTree」の設定の辺りを探してほしい。

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

上記を次のように編集し、バッファ移動のショートカット設定を追加する。

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

" minibufexpl
nnoremap <silent> bn :<C-u>:bnext<CR>
nnoremap <silent> b1 :<C-u>:b1<CR>
nnoremap <silent> b2 :<C-u>:b2<CR>
nnoremap <silent> b3 :<C-u>:b3<CR>
nnoremap <silent> b4 :<C-u>:b4<CR>
nnoremap <silent> b5 :<C-u>:b5<CR>
nnoremap <silent> b6 :<C-u>:b6<CR>
nnoremap <silent> b7 :<C-u>:b7<CR>
nnoremap <silent> b8 :<C-u>:b8<CR>
nnoremap <silent> b9 :<C-u>:b9<CR>

これにより、次のような操作が可能になる。

ショートカットキー 内容
bn 次のバッファへ移動
b1 バッファ1へ移動
b2 バッファ2へ移動
b3 バッファ3へ移動
b4 バッファ4へ移動
b5 バッファ5へ移動
b6 バッファ6へ移動
b7 バッファ7へ移動
b8 バッファ8へ移動
b9 バッファ9へ移動

ご覧の通り、「:」の入力分だけ操作が短くなる。ちょっとしたショートカットでしかないのだが、目線がコマンドラインモードに移動しないので、思った以上に高速化したような感覚があるはずだ。この辺りのショートカットには好みもあるので、自分の扱いやすいものに変更してもらえればと思う。

minibufexplの使用例

次のスクリーンショットは、ファイルを3つ開いた状態だ。ファイルを1つしか開いていない状態はこれまでと変わらないが、ファイルを2つ以上開くと、このように上部にタブのようにバッファ一覧が表示されるようになる。

minibufexplが動作しているところ

次のスクリーンショットは、バッファ3へ表示を移したものだ。「b3」または「bnbn」という操作でバッファ3へ表示を移動させている。

バッファ3へ表示を移動させた場合

操作がわかりやすいという理由で「1Vimあたり1ファイルだけ編集するようにする」というのは一つの手ではある。だが、Vimをファイル編集作業の中心に据え始めると、バッファを使って複数のファイルを編集するという作業は必須になってくる。minibufexplはシンプルなプラグインだが、その効果はなかなかのものだ。バッファの表示や移動にイマイチ感を感じているなら、ぜひこのプラグインを試してみていただきたい。

今回の成果物

前回も補足したように、もしプラグイン管理機能「Dein」のセットアップしていない場合は、プラグインを追加/利用する前にまず次の操作が必要だ。

mkdir -p ~/.cache/dein
cd ~/.cache/dein/
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
sh ./installer.sh .
rm ./installer.sh

Deinの詳細については、第229回を参照していただきたい。

今回のプラグイン設定を追加した設定ファイルは以下の通りだ。

"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein/.')
  call dein#begin('~/.cache/dein/.')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('preservim/nerdtree')
  call dein#add('tpope/vim-commentary')
  call dein#add('tpope/vim-fugitive')
  call dein#add('fholgado/minibufexpl.vim')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

" seoul256
let g:seoul256_background = 233
colo seoul256

" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

" minibufexpl
nnoremap <silent> bn :<C-u>:bnext<CR>
nnoremap <silent> b1 :<C-u>:b1<CR>
nnoremap <silent> b2 :<C-u>:b2<CR>
nnoremap <silent> b3 :<C-u>:b3<CR>
nnoremap <silent> b4 :<C-u>:b4<CR>
nnoremap <silent> b5 :<C-u>:b5<CR>
nnoremap <silent> b6 :<C-u>:b6<CR>
nnoremap <silent> b7 :<C-u>:b7<CR>
nnoremap <silent> b8 :<C-u>:b8<CR>
nnoremap <silent> b9 :<C-u>:b9<CR>

"End dein Scripts-------------------------

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase