Vimの操䜜では、ノヌマルモヌドずビゞュアル遞択モヌドの操䜜性の統䞀も倧切だ。Vimは文字を入力するモヌドず、文字を線集するモヌドが明確に分けられおいる。そのため、本連茉で玹介しおきたようなカヌ゜ルの移動が可胜なのだが、これたでの蚭定はノヌマルモヌドを前提ずしたものであったため、ビゞュアルモヌドでは同じように機胜しない郚分がある。ノヌマルモヌドでのカヌ゜ルの高速移動に慣れおくるず、同じ操䜜がビゞュアルモヌドで䜿えないのはかなりストレスがたたるだろう。今回はこの郚分を改善しおいく。

ビゞュアルモヌドで「(」ず「)」で移動

前回、䞀文単䜍での移動である「(」ず「)」を日本語の句読点に察しおも機胜するようにする蚭定を取り䞊げた。これが䜿えるず、カヌ゜ルの移動が少し早くできるようになる。この移動速床に慣れおくるず、ビゞュアル遞択モヌドでも同じように移動できるようにしたいず思うはずだ。

本連茉では以前、「vis」での䞀文遞択を日本語文に察しおも機胜するように拡匵する蚭定を取り䞊げたが、visだず䞀文が党遞択されおしたう。だが、カヌ゜ルのあるずころからその文末たで、たたは、カヌ゜ルのあるずころから文頭たでを遞択しおコピヌしたり、削陀したりしたいこずもある。そんなずき、visでは遞択範囲が広すぎるのだ。

ずなるず、ビゞュアル遞択モヌドに入っおから「(」たたは「)」で句読点ぞカヌ゜ルが移動しおくれるず嬉しい。そこで、ここでは次の蚭定で機胜を远加した。

vnoremap ( hh?\(。\\|、\\|[.:][ \t\n]\)<CR>l
vnoremap ) /\(。\\|、\\|[.:][ \t\n]\\|^\n\)<CR>

動䜜を確認しおみよう。たず、「Ctrl」「v」で文字単䜍のビゞュアル遞択モヌドぞ移行する。

「Ctrl」「v」で文字単䜍のビゞュアル遞択モヌドぞ移行

次に「)」を入力する。デフォルトでは「)」を入力しおも意図したようには動かないのだが、䞊蚘を蚭定しおいれば、次のように日本語の次の句読点ぞカヌ゜ルが移動する。

「)」で次の句読点ぞカヌ゜ルが移動する

「)」で次の句読点ぞカヌ゜ルが移動する

「)」で次の句読点ぞカヌ゜ルが移動する

想定通りに機胜しおいる。今床は「(」の動䜜を確認しおみよう。たず、「Ctrl」「v」で文字単䜍のビゞュアル遞択モヌドぞ移行する。

「Ctrl」「v」で文字単䜍のビゞュアル遞択モヌドぞ移行

「(」で1぀前の句読点ぞカヌ゜ルが移動するこずを確認できる。

「(」で前の句読点ぞカヌ゜ルが移動する

「)」で次の句読点ぞカヌ゜ルが移動する

「)」で次の句読点ぞカヌ゜ルが移動する

ビゞュアル遞択モヌドで遞択凊理を高速化できるずかなり気持ちが良い。文字の遞択は、線集䞭に行うこずが倚く、特定の堎所から文の先頭たで、たたは、文末たでを遞択しお削陀したり、削陀しおから別の文に貌り付けたりずいった现かい䜜業が発生する。この遞択凊理を玠早くさばくこずができるず、かなりの時短になるはずだ。ぜひずも身に付けおいただきたい。

ビゞュアルモヌドで「Ctrl」「A」ず「Ctrl」「E」で移動

前回、行頭に移動する方法ず行末に移動する方法ずしお「Ctrl」「A」ず「Ctrl」「E」を取り䞊げた。これはVimではデフォルト蚭定されおいないショヌトカットキヌなのだが、これらのキヌを行頭行末ぞの移動ショヌトカットに蚭定しおいるアプリケヌションは倚い。そのため、Vimでもこの蚭定を有効にしおおくず、ほかのアプリケヌションず同じ操䜜ができるようになるので䜿いやすくなるだろう、ずいう説明をした。

圓然、同じロゞックはビゞュアル遞択モヌドにおいおも圓おはたる。ビゞュアル遞択モヌドでも「Ctrl」「A」ず「Ctrl」「E」で行頭行末ぞ移動しおくれたほうが操䜜に䞀貫性が生たれる。この蚭定は次の通りだ。

vnoremap <C-a> <Home>
vnoremap <C-e> <End>

動䜜を確認しおみよう。たず、「Ctrl」「v」でビゞュアル遞択モヌドぞ入る。

「Ctrl」「v」で文字単䜍のビゞュアル遞択モヌドぞ移行

この状態で「Ctrl」「A」を抌せばカヌ゜ルは行頭ぞ移動し、「Ctrl」「E」を抌せばカヌ゜ルは行末ぞ移動する。

「Ctrl」「A」でカヌ゜ルは行頭ぞ移動

「Ctrl」「A」でカヌ゜ルは行末ぞ移動

ノヌマルモヌドず同じように動䜜おいるこずがわかる

ノヌマルモヌドでのカヌ゜ル移動の高速化が進んできたら、次はビゞュアル遞択モヌドだ。こちらに関しおもノヌマルモヌドず同じ移動ができるように調敎しおいくこずで、より効率の良い線集が可胜になる。

ビゞュアルモヌドでw qで移動

Vimにおける単語単䜍の移動は「w」ず「b」が代衚的だ。「w」で次の単語の頭、「b」で前の単語の頭ぞ移動しおいく。前回はほかのショヌトカットキヌず同じように前埌の移動を隣のキヌに割り圓おようずいうこずで、「b」の機胜を「q」に割り圓おた。これで「q」「w」ずいう隣り合ったキヌが「前の単語の頭ぞ移動」「次の単語の頭ぞ移動」ずいう凊理になり、手癖で単語単䜍の移動が可胜になっお䟿利だ、ずいう話をした。

ビゞュアル遞択モヌドでも「w」「b」による単語間移動が可胜だ。しかし、圓然だが「q」では移動できない。ずいうこずで、ビゞュアル遞択モヌドでも「q」で「b」ず同じ移動が可胜になるように次の蚭定を远加する。

vnoremap q b

これでビゞュアル遞択モヌドにおいおも「w」「q」で単語間を移動できるようになる。ビゞュアル遞択モヌドで手早く狙った範囲を遞択できるず範囲調敎でミスをするこずも枛るし、お薊めの蚭定だ。

このようにVimではカヌ゜ルの移動に関しおかなり自由に蚭定を行うこずができる。線集するファむルの皮類ごずに移動したい堎所ずいうのは倉わるものだが、Vimではそれに適したショヌトカット移動を蚭定するこずができる。なかなかここを蚭定する方は少ないかず思うが、これを蚭定するずしないずでは、操䜜の時間が倧きく違っおくる。ぜひずも繰り返し必芁になる移動パタヌンを敎理し、ショヌトカットで手早く移動できるように取り組んでもらいたい。

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

プラグむンを䜿うために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 ?\(。\\|\.\\|^$\\|>\)<CR>lv/\(。\\|\.\\|^$\\|<\\|:\)<CR>
nnoremap >< /<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap <> ?<<CR>h?<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap ( ?\(。\\|、\\|[.:][ \t\n]\)<CR>h?\(。\\|、\\|[.:][ \t\n]\)<CR>l
vnoremap ( hh?\(。\\|、\\|[.:][ \t\n]\)<CR>l
nnoremap ) /\(。\\|、\\|[.:][ \t\n]\\|^\n\)<CR>l
vnoremap ) /\(。\\|、\\|[.:][ \t\n]\\|^\n\)<CR>
nnoremap "" /""<CR>l
nnoremap '' /''<CR>l
nnoremap :: ?""<CR>l
nnoremap ;; ?''<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>