Vimについて学んできたこと

これまでかなり長期に渡ってVimエディタについて取り上げてきた。Vimエディタの基本的な使い方からプラグインの導入方法、いくつか有名どころのプラグインの使い方までを取り上げ、さらに自分でカーソルの移動やビジュアル選択をカスタマイズする方法について解説した。紹介してきた内容をざっとまとめると、次のようになる。

  1. Vimの基本的な使い方と基本的な設定
  2. プラグインマネージャとよく使われている代表的なプラグインとその使い方および設定方法
  3. カーソル移動とビジュアル選択をカスタマイズする方法
  4. そのほか各種便利機能や便利設定


これほど長くVimについて取り上げたのは、Vimのスキル向上がそのままLinux運用管理のスキルに直結しやすいためだ。Vimはエディタだが、その多機能ぶりは目をみはるものがあり、データ分析やデータ解析にも使えるし、データを加工するツールとしても利用できる。Vim関連のスキル向上は、努力を注いだ分だけ見返りが得られるのだ。

本連載では、説明をしながらVimの設定ファイルを作成してきたので、最後にこの設定ファイルをベースにざっと復習してまとめとしたい。

プラグインマネージャ「Dein」

Vimにはもともとプラグインで機能を拡張する方法が用意されている。この機能を使ってもよいのだが、もっと便利な方法が用意されているので、通常はサードパーティが提供しているそうしたもっと便利なプラグインマネージャを使うことが多い。

どれを使ってもよいのだが、本連載ではVimのプラグインマネージャとして「Dein」を使う方法を取り上げた。この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

なお、上記処理ではインストールスクリプト内でgitコマンドが使われるので、gitはあらかじめインストールしておく必要がある。

プラグインのインストールと設定

次にプラグインのインストールだが、これは使用するプラグインを設定ファイル(~/.vimrc)に記載しておくことで、Vim起動時に自動的にインストールが行われるようになる。具体的には次のような設定ファイルを作成した。

"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')
  call dein#add('dense-analysis/ale')
  call dein#add('junegunn/fzf', {'build': './install --all'})
  call dein#add('junegunn/fzf.vim')
  call dein#add('sheerun/vim-polyglot')
  call dein#add('junegunn/vim-easy-align')

  " 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>

" fzf
nnoremap <silent> fzf :Files<CR>
nnoremap <silent> ls :Buffers<CR>

" vim-easy-align
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)

"End dein Scripts=========================

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase
nnoremap k gk
nnoremap gk k
nnoremap j gj
nnoremap gj j
nnoremap q b
vnoremap q b
nnoremap <Tab> 15<Right>
nnoremap <S-Tab> 15<Left>
nnoremap vis h?>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[.?!][ \t\n]<CR>lv/>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[,?!][ \t\n]<CR>
vnoremap vis <ESC>h?>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[.?!][ \t\n]<CR>lv/>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[,?!][ \t\n]<CR>
nnoremap >< /<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap <> ?<<CR>h?<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap ( h?>[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
vnoremap ( h?>[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
nnoremap ) />[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
vnoremap ) />[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
nnoremap "" /""<CR>l
nnoremap '' /''<CR>l
nnoremap :: hh?""<CR>l
nnoremap ;; hh?''<CR>l
nnoremap <C-a> <Home>
inoremap <C-a> <Home>
cnoremap <C-a> <Home>
vnoremap <C-a> <Home>
nnoremap <C-e> <End>
inoremap <C-e> <End>
cnoremap <C-e> <End>
vnoremap <C-e> <End>

上記設定ファイルにはプラグインを使うための設定も含まれている。本連載では次のプラグインを取り上げ、それぞれの使い方を説明した。

プラグイン 内容
junegunn/seoul256 カラーテーマ。いくつものカラーテーマが用意されている(ここではseoul256を使用)
vim-airline/vim-airline vim-airline/vim-airline-themes Powerlineに対応した拡張ステータスバー(ここではmolokaiを使用)
preservim/nerdtree ファイルシステムツリー表示によるディレクトリ移動やファイルオープン
tpope/vim-commentary コメントイン/コメントアウトプラグイン
tpope/vim-fugitive Git操作用Vimプラグイン
fholgado/minibufexpl.vim タブ風表示およびバッファ操作プラグイン
dense-analysis/ale 非同期Lintエンジン(文法チェックおよびセマンティックエラー機能)
junegunn/fzf junegunn/fzf.vim ファイルオープンやディレクトリ移動などにfzfを使用
sheerun/vim-polyglot プログラミング言語シンタックスプラグイン
junegunn/vim-easy-align 表形式整形プラグイン

ユーザーが求める内容によって必要なプラグインは異なるため、全てのニーズに対応することはできないのだが、Linuxを管理する上で利用できる有名どころのプラグインは取り上げることができたのではないかと思う。

カーソル移動とビジュアル選択のカスタマイズ

カーソル移動とビジュアル選択をニーズに合わせてカスタマイズして作業を高速化する方法も説明した。上記設定ファイルのうち、次の部分がそれに該当する部分となる。

nnoremap k gk
nnoremap gk k
nnoremap j gj
nnoremap gj j
nnoremap q b
vnoremap q b
nnoremap <Tab> 15<Right>
nnoremap <S-Tab> 15<Left>
nnoremap vis h?>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[.?!][ \t\n]<CR>lv/>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[,?!][ \t\n]<CR>
vnoremap vis <ESC>h?>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[.?!][ \t\n]<CR>lv/>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[,?!][ \t\n]<CR>
nnoremap >< /<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap <> ?<<CR>h?<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap ( h?>[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
vnoremap ( h?>[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
nnoremap ) />[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
vnoremap ) />[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
nnoremap "" /""<CR>l
nnoremap '' /''<CR>l
nnoremap :: hh?""<CR>l
nnoremap ;; hh?''<CR>l
nnoremap <C-a> <Home>
inoremap <C-a> <Home>
cnoremap <C-a> <Home>
vnoremap <C-a> <Home>
nnoremap <C-e> <End>
inoremap <C-e> <End>
cnoremap <C-e> <End>
vnoremap <C-e> <End>

カーソルを狙った場所へ簡単に移動させることができるかどうかは、Vimの作業時間を大きく左右する。連載ではその一例としてXMLファイルやHTMLファイルを編集するシナリオを想定し、その場合にどのようなカスタマイズができるかを示してきた。紹介したカスタム設定を駆使すれば、HTMLファイルやXMLファイル内の移動を高速にできるようになっているはずだ。

Vimはデフォルト機能のスキルも磨こう

Vimの基本的な機能を説明した後は、プラグインや設定による機能のカスタマイズなど、デフォルトではない機能に的を絞って解説してきた。しかし、そもそもVimは提供されているデフォルトの機能が多い。それらの機能を使いこなせるようになるだけでもかなり高度なことができる。確かに便利なプラグインやカスタマイズ設定は多いが、時折基本に立ち返ってVimのデフォルト機能だけを使うスキルを磨いておくことも大切だ。

Vimは主にUNIX系OSでデフォルトで使用されているエディタだが、このエディタはWindowsでも使用できる。ここで身に付けたスキルはそのままWindowsでも使えるというのは大きな強みだ。WindowsだからといってVSCodeやVisual Studioを使わなければならないというわけではない。軽量で高速、多機能なVimはどのプラットフォームにおいても魅力的なエディタである。

Linuxの操作となると、コマンドやLinuxの仕組みに目が行きがちだが、こうした基本的なツールの使い方にも目を向けるとよいと思う。特にエディタのように絶対に使うツールは初期の段階で触っておき、長期的にスキルアップの対象にしていただきたい。ここに費やした努力は、高速な編集力というかたちで生涯の力になってくれるはずだ。

付録: 使っている設定ファイルとセットアップ方法

プラグインを使うために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

本連載で使っている~/.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')
  call dein#add('fholgado/minibufexpl.vim')
  call dein#add('dense-analysis/ale')
  call dein#add('junegunn/fzf', {'build': './install --all'})
  call dein#add('junegunn/fzf.vim')
  call dein#add('sheerun/vim-polyglot')
  call dein#add('junegunn/vim-easy-align')

  " 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>

" fzf
nnoremap <silent> fzf :Files<CR>
nnoremap <silent> ls :Buffers<CR>

" vim-easy-align
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)

"End dein Scripts=========================

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase
nnoremap k gk
nnoremap gk k
nnoremap j gj
nnoremap gj j
nnoremap q b
vnoremap q b
nnoremap <Tab> 15<Right>
nnoremap <S-Tab> 15<Left>
nnoremap vis h?>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[.?!][ \t\n]<CR>lv/>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[,?!][ \t\n]<CR>
vnoremap vis <ESC>h?>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[.?!][ \t\n]<CR>lv/>[^\n]\\|.[^ 。?!.?!\t>]<\\|[:。?!]\\|[,?!][ \t\n]<CR>
nnoremap >< /<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap <> ?<<CR>h?<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap ( h?>[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
vnoremap ( h?>[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
nnoremap ) />[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
vnoremap ) />[^\n]\\|.[^ 。、?!.,?!\t>]<\\|[:。、?!]\\|[.,?!][ \t\n]<CR>l
nnoremap "" /""<CR>l
nnoremap '' /''<CR>l
nnoremap :: hh?""<CR>l
nnoremap ;; hh?''<CR>l
nnoremap <C-a> <Home>
inoremap <C-a> <Home>
cnoremap <C-a> <Home>
vnoremap <C-a> <Home>
nnoremap <C-e> <End>
inoremap <C-e> <End>
cnoremap <C-e> <End>
vnoremap <C-e> <End>