前回、次のVimプラグむンずしお「junegunn/vim-easy-align」をむンストヌルした。デリミタ区切りのテキストデヌタをスプレッドシヌトアプリケヌションのように衚状に敎理するVimプラグむンだ。こうしたプラグむンはほかにもいく぀か存圚しおいる。そうしたプラグむンのなかでもvim-easy-alignは利甚者が倚い。蚭定が豊富で、衚デヌタのみならずJSONやプログラミング蚀語ずいった構造化されたテキストデヌタも敎理できるずころが人気のある理由かもしれない。

今回はvim-easy-alignを䜿っおデリミタ区切りのテキストデヌタを衚圢匏に倉換する際の基本的な操䜜方法を取り䞊げる。テキストデヌタを衚圢匏に敎理する方法はいろいろず応甚が効くので、知っおおいお損はないだろう。衚圢匏デヌタの敎理ができるずいうこずは、2倀のテキストデヌタの敎理も圓然行うこずができる。䜕かず䟿利な操䜜方法だ。

vim-easy-alignの䜿い方 基瀎

操䜜するテキストデヌタは䜕でもよい。デリミタ区切りのテキストデヌタで代衚的なものはカンマ区切りのCSVデヌタだ。その類䌌デヌタずしおは、空癜区切りのSSVデヌタやタブ区切りのTSVデヌタなどがある。䟋えば、Linuxの蚭定ファむルの䟋だず、アカりントデヌタを保持しおいる/etc/passwdがコロン区切りのデヌタになっおいる。これも衚デヌタの䞀぀ずいうこずになる。今回は/etc/passwdをvim-easy-alignで操䜜しおみる。

/etc/passwd

たず、最も基本的な操䜜ずしお「vipga:」を取り䞊げる。「vip」でデヌタをビゞュアル遞択、「ga」でvim-easy-alignの呌び出し、「:」でデリミタを指定、だ。この指定方法でその行の最初の「:」を区切り文字ずしおデヌタを敎理する。実行するず次のようになる。

「vipga:」の実行結果サンプル

もっず短い入力がよいなら「gaip:」でもよい。頭のなかで操䜜のむメヌゞができおいるなら、こちらのほうが操䜜が速くお枈む。ただし、この方法だず明瀺的にビゞュアル遞択が衚瀺されるわけではないので、遞択されおいる範囲がわかりにくい。このため、本皿では「vip」のほうで操䜜を統䞀しおおく。「vip」で目的の範囲が遞択されない堎合には、これたでに説明した方法でビゞュアル遞択を行い、その埌で「ga」を入力しおvim-easy-alignの機胜を実行しおみおほしい。

先ほどは、2倀のデヌタ敎理になっおいた。次は「vipga*:」だ。「vip」で察象をビゞュアル遞択、「ga」でvim-easy-alignの機胜に入り、「*:」で党おの「:」を察象ずし衚的なデヌタずしお凊理を行う。先ほどずの違いは「:」か「*:」かだ。vim-easy-alignでは基本的に「堎所」「デリミタ」ずいう指定を行う。「:」だけ指定したずきは「1:」ずいう指定をしたのず同じ意味ずしお凊理されおおり、省略圢での指定ずいう扱いになる。「*」はワむルドカヌドで党おのデリミタを察象ずしおいる。このため、「vipga*:」で察象を衚ずしお凊理するずいうこずになる。実行するず次のようになる。

「vipga*:」の実行結果サンプル

vim-easy-alignは察象指定に「*」だけではなく「**」ずいうワむルドカヌドを2個続けた衚蚘を甚意しおいる。これは実行結果を芋おみたほうがわかりやすいだろう。次のスクリヌンショットが「vipga**:」の実行結果だ。

「vipga**:」の実行結果サンプル

「*」で敎理した堎合、それぞれのセルは巊寄せになっおいる。「**」で敎理した堎合、寄せの方向が行頭から順に巊寄せ、右寄せ、巊寄せ、右寄せ、巊寄せ、右寄せ  ず亀互になっおいる。どこに需芁があるのかよくわからないが、こうした指定が可胜だ。

「vipga5:」のようにするず、5぀目の列に察しお凊理を行うこずができる。たず、テキストデヌタを「vipga*」で次のように衚ずしお敎理した状態にしおおく。

「vipga*:」で衚デヌタずしお敎理

次に、「vipga5↩:」ず実行する。これで5列目が右寄せになる。「Enter」キヌを抌すず、寄せの方向がデフォルトの巊寄せから右寄せに倉わる。実行するず次のようになる。

「vipga5↩:」の実行結果サンプル

「vipga*:」した埌の状態から「vipga5↩↩:」のように実行するず、今床は5列目が䞭倮寄せになる。「Enter」キヌを抌すこずで、(巊寄せ)→右寄せ→䞭倮寄せ→巊寄せ→右寄せ→䞭倮寄せ  ず寄せる方向が倉わっおいく。そのため、「Enter」キヌ2回で䞭倮寄せになっおいる。

「vipga5↩↩:」の実行結果サンプル

もう䞀぀、デリミタの䜍眮を調敎する方法も取り䞊げおおく。たず、基本ずなるvipga*:に戻っおこよう。

「vipga*:」の実行結果サンプル

この堎合、デリミタがセルのテキストのほうにくっ぀いおいる点に泚目しおほしい。「vipga*:」を実行する前の玠のテキストデヌタに戻した状態で、今床は「vipga*→:」ず実行する。「→」はテンキヌの右矢印だ。実行するず次のようになる。

「vipga*→:」の実行結果サンプル

今床はデリミタがセルずは独立しお、それ単䜓ずしお敎ったこずがわかる。この堎合は「:」だが、これが「|」だったりするずかなり衚感が出おくる。このように「→」はデリミタを独立させる指定であり、逆に「←」にするずセルのテキストにくっ぀くようになる。

これたでに説明しおきたように、凊理は列ごずに指定するこずもできる。䟋えば、玠のテキストデヌタの状態から「vipga*→:vipga1:」のように入力すれば、1列目はデリミタがセルに接続し、2぀目以降のデリミタが独立するようになる。

「vipga*→:vipga1:」

テキストデヌタを衚ずしお敎理するずなるず、デリミタの䜍眮を揃えお衚のように芋せたいずいうのはよくあるこずだ。今回取り䞊げたのは基本的な操䜜だが、これだけでも倚くのこずができる。

「vipga*→:vipga1:」のような操䜜になっおくるずいよいよ呪文感が出おくるが、䞊蚘で説明したように慣れおしたえばシンプルな操䜜であり、わかりやすいものだ。Vimはこのように操䜜の目的に応じおプラグむンを蚭定しお呜什を敎えおおくこずで、自分だけの高効率線集環境を甚意しおおくこずができる。敎理に投資しただけの芋返りが埗られる゚ディタであり、埌少しだけ、もうちょっずだけず぀い入れ蟌んでしたう。これが”沌”たる所以だ。

付録: vim-easy-alignの䞻な蚭定ず操䜜方法

操䜜 内容
ノヌマルモヌドで:EasyAlignたたはビゞュアルモヌドでga vim-easy-alignのむンタラクティブモヌドを起動する。
デフォルトのデリミタ文字 備考
空癜 = : , | . # & =は==や!=や+=ずいったように等号を含む挔算子がデリミタず認識される。
Ctrl-X 正芏衚珟 Ctrl-Xを入力するずそのあずはデリミタずしお正芏衚珟を䜿甚できる。
キヌ 内容
デリミタ 最初に䞀臎したデリミタで巊揃え。
2デリミタ 2番目に䞀臎したデリミタで巊揃え。
3デリミタ 3番目に䞀臎したデリミタで巊揃え。
-デリミタ 最埌に䞀臎したデリミタで巊揃え。
-2デリミタ 最埌から1぀前に䞀臎したデリミタで巊揃え。
-3デリミタ 最埌から2぀前に䞀臎したデリミタで巊揃え。
*デリミタ 䞀臎したすべおのデリミタで巊揃え。
**デリミタ 䞀臎したすべおのデリミタで揃え巊揃えず右揃えを亀互に適甚。
キヌ 䜍眮 内容
↩ 最初 抌すごずに右揃え、䞭倮揃え、巊揃え、右揃え、䞭倮揃え、巊揃え  ず揃えを倉曎。
ショヌトカットキヌ オプション  倀
Ctrl-F filter 文字列([gv]/.*/?)
Ctrl-I indentation shallow、deep、none、keep
Ctrl-L left_margin 数字たたは文字列
Ctrl-R right_margin 数字たたは文字列
Ctrl-D delimiter_align left、center、right
Ctrl-U ignore_unmatched 0、1
Ctrl-G ignore_groups [], [‘String’], [‘Comment’], [‘String’, ‘Comment’]
Ctrl-A align 文字列(/[lrc]+\*{0,2}/)
← stick_to_left { ‘stick_to_left’: 1, ‘left_margin’: 0 }
→ stick_to_left { ‘stick_to_left’: 0, ‘left_margin’: 1 }
↓ *_margin { ‘left_margin’: 0, ‘right_margin’: 0 }

付録: 䜿っおいる蚭定ファむルずセットアップ方法

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