VimはViの機能を拡張していったものであり、特に注目したい機能にビジュアル選択がある。同機能は、ビジュアルにテキストを選択することができるというもので、Viには存在しない。自在にテキストを選択できると、編集効率が著しく向上する。
ビジュル選択の基礎についてはすでに本連載で説明してきた通りだ。今回は、短縮コマンド的に用意されているビジュアル選択の方法を取り上げる。これらの方法を知っておくと、ビジュアル選択が楽しくなると思う。
これまでに紹介したビジュアル選択では、範囲を指定するにはカーソルを移動させる必要があった。今回紹介する方法では、選択する範囲がすでに決まっており、カーソルの移動は発生しない。このやり方を身に付けると編集速度を高速化することができるので、ぜひとも練習して習得していただきたい。
段落選択「vip」
文章は、段落ごとにひとまとまりに書いておくことが多いだろう。Vimでは「vip」で段落を選択することができる。
「vip」は、「v」は「ビジュアル選択」、「i」は「内側を」、「p」は「パラグラフ(段落)の」という意味だ。ビジュアル選択した後に「d」や「x」を押せば削除になるし、「y」を押せばコピーになる。
一文選択「vis」
段落ごと選択することはないかもしれないが、一文を選択したい、ということは結構ある。Vimでは「vis」が一文の選択になっている。しかし、前回も説明したようにこれは日本語の文章では思ったように機能してくれない。そこで、前回作成した次の設定を有効にしておく。
nnoremap vis ?\(。\\|\.\\|^$\\|>\)<CR>lv/\(。\\|\.\\|^$\\|<\\|:\)<CR>
この状態で実行すると次のようになる。
これで「vis」で一文が選択できる。「vis」の「s」はセクション(一文)という意味だ。
段落末尾まで選択「v}」
段落選択の派生として、カーソルから段落の末尾までを選択する、という方法がある。「v}」だ。
「v}」であり「vi}」ではないことに注意しよう。「vi}」では波括弧内を選択、という命令になってしまう。
単語を選択「viw」
日本語をベースとしたテキストの場合、このコマンドがどこまで使われるかは謎ではあるが、「viw」で単語を選択することができる。
漢字に不慣れな幼年者や日本語学習を始めたばかりの日本語以外を母国語とする方に対しては、空白区切りの「わかち書き」された日本語が使われるが、通常日本語は単語の間に空白を入れるような書き方をしない。単語が空白で区切られている場合には「viw」のような操作は直感的でわかりやすいのだが、日本語のように膠着語であり「わかち書き」をしない言語だと、「viw」は逆に結果がわかりにくく頭を使うハメになる。
逆に英文から単語を選択してコピーするといった操作をする場合、「viw」は直感的で利用しやすい。
タグ内選択「vit」
時にはHTMLを書くこともあるだろう。そんなとき、「vit」を知っておくと便利だ。タグの内側を選択することができる。
タグの選択は括弧内選択とは括弧の方向が逆なので、個別に「vit」といった指定方法が用意されているのではないかと思う。
クォーテーション内選択 vi” vi’
ダブルクォーテーションやシングルクォーテーション内のテキストは「vi”」や「vi’」で選択できる。
ダブルクォーテーションやシングルクォーテーションの内側を選択して削除し、新しい値を入力するというのは結構ある作業だ(以前のテキストをコピペして内容を書き換える場合など)。手動で削除すると誤ってクォーテーションまで削除してしまうことがあるが、「vi”」や「vi’」で選択してから削除すればそうしたミスを避けることができる。
括弧内選択「vi)」「vi]」「vi}」「vi>」
括弧内の選択は「vi)」「vi]」「vi}」だ。「vi(」「vi[」「vi{」でもよい。それぞれ該当する括弧内のテキストを選択、という意味になる。「>」や「<」を指定すれば、その括弧内のテキストを選択ということになる。
括弧内を選択というのも知っておくと便利だろう。
ビジュアル選択スキルは練習しても身に付けよう
ここで取り上げたビジュアル選択の方法は命令に規則性があるので、その規則のほうを覚えてしまえば、指定自体を忘れてしまってもすぐに思い出せるのではないかと思う。自由自在にビジュアル選択できるようになったときの快感はいかんともし難い。操作の効率が上がり、一発でやりたい操作ができる。サクサクとテキスト編集が進むのは、気持ちが良いものだ。
今回取り上げた方法はテキスト編集のみならずプログラミングやコーディングにおいても役立つ。ぜひ身に付けていただきたい。
付録: 使っている設定ファイルとセットアップ方法
プラグインを使うために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 vis ?\(。\\|\.\\|^$\\|>\)<CR>lv/\(。\\|\.\\|^$\\|<\\|:\)<CR>