「vis」で日本文も英文も選択できるようにしたい

前回、一文をビジュアル選択する方法として「vis」と入力する方法を紹介した。ただし、この機能は英文に対しては機能するものの、日本文に対しては期待通りに動作しない。これを解消するために「viS」というちょっともじったショートカットキーで動作する日本文向けの設定を作成して見せた。

しかし、である。Vimはそもそもショートカットキーがたくさんある。にもかかわらず、独自のショートカットキーを導入していくと、どんどんわけがわからなくなってくるのだ。できれば「vis」が英文に対しても日本文に対しても機能してくれることが望ましい。ショートカットキーの数は最低限にしておかないと、人間のほうが忘れてしまうのである。

アプローチはいくつかあるのだが、シンプルでかつ効果的な設定方法で済ませたい。複雑な設定にすると後で書き換えようとしたときに苦労するのは目に見えている。ここで、状況を整理してみよう。

  • 「vis」で英文も日本文も良い具合に選択してほしい
  • 優先度は日本文のほうが高い
  • 英文での利用頻度は低い


上記条件を考慮すると、前回作った「viS」を英文に対しても機能するように拡張した後、「vis」として上書きしてやればよい、という感じになってくる。「nnoremap」で比較的影響範囲を減らしておけばよいだろう。場合によっては適用する範囲をさらに絞り込むなどすれば現実的に利用できるはずだ。

ということで、先に今回の設定の完成形をお見せしておこう。

nnoremap vis ?\(。\\|\.\\|^$\\|>\)<CR>lv/\(。\\|\.\\|^$\\|<\\|:\)<CR>

「『?』で1つ前の一文の末尾へ移動し、1文字進めて(l)ビジュアル選択(v)を開始し、『/』で対象文の末尾へ移動する」、という内容になっている。前方検索と後方検索がわかりにくいので、次にそれぞれを整理しておく。

文字 正規表現
. .
空行 ^$
タグ >
文字 正規表現
. .
空行 ^$
タグ <
コロン :

ここで紹介した方法は、これまで連載で説明してきた方法を使っているだけなので、ゆっくり読めば意味はわかるはずだ。この設定はデフォルトの「vis」の動きを正確には再現していない。あくまでも「似た」動作をさせているだけだ。不備があれば、それに合わせて書き換えてもらえればと思う。ただし、あまりこだわり過ぎないことをお薦めしたい。まずはそれなりに動けばよいだろう。

動作確認

では動作確認を行ってみよう。次に日本文で試した例を掲載しておく。それぞれカーソルのある一文が選択対象として選択されていることを確認できる。

「vis」を実行

実行結果

visを実行

実行結果

「vis」を実行

実行結果

次に英文で同じことを確認してみよう。Vimがデフォルトで提供している「vis」に比べるとちょっとばかり選択範囲が甘くなるのだが、これくらい動いてくれればよいだろう。

「vis」を実行

実行結果

「vis」を実行

実行結果

「viS」のようなオリジナルショートカットは、作ったばかりのときはよいのだが、時間が経つと忘れて「vis」と入力していたりする。やはり、デフォルトのコマンドで日本文もカバーしてくれるほうが助かるのだ。

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

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