Vimを使う - カーソル移動の便利設定(単語、行頭行末)

【連載】

にわか管理者のためのLinux運用入門

【第263回】Vimを使う - カーソル移動の便利設定(単語、行頭行末)

[2021/01/12 08:00]後藤大地 ブックマーク ブックマーク

今回は、Vimのカーソル移動をさらに極めていこう。テキストエディタにおいてカーソルを自由自在に動かせることは、編集効率の向上につながる。そして、Vimは高速カーソル移動を実現するのに適した仕組みを持っているのだ。仕組みへの理解を深め、より高速な編集を実現していただきたい。

単語ベースの移動「w」「b」

Vimはもともと英語圏のテキストエディタとして発展してきた。そのため、根底となる機能のいくつかは分かち書き(語の区切りに空白を入れる書き方)を行うことが前提になっている。カーソル移動においては、単語単位で移動を行う機能がそれに当たる。

Vimは単語単位(分かち書きを想定するとわかりやすい)でカーソルを移動させるショートカットキーをデフォルトでいくつか提供している。とりあえず「w」と「b」を覚えておけばよいだろう。「w」は次の単語の先頭へ、「b」は前の単語の先頭へカーソルを移動させるショートカットキーだ。「w」は「word(単語)」、「b」は「back」または「backword(後方)」と覚えておくとよい。

これらのショートカットキーを実行すると次のようになる。

「w」で次の単語の先頭へ移動

「w」で次の単語の先頭へ移動

「w」で次の単語の先頭へ移動

日本語は漢字、ひらがな、カタカナ、Alphabetなど文字の種類に応じて単語の区切りを認識することができるので、特定のユースケースを除いて分かち書きが行われることがない。そのため、「w」や「b」でカーソルがどこへ移動するのか、分かち書きのケースと比べるとちょっとわかりにくい。ただし、何となく、それっぽいところへは移動してくれる。

「b」で逆方向への移動が行われる。

「b」で前の単語の先頭へ移動

「b」で前の単語の先頭へ移動

「b」で前の単語の先頭へ移動

日本語だと単語ベースでの移動には癖があるので、使いやすいと感じるかどうかは人によって分かれるかもしれない。ただ、慣れると便利ではある。

単語ベースの移動「w」「q」

ここでちょっとしたカスタマイズをしてみよう。「w」と「b」が前後の単語の先頭へと移動していくショートカットキーであることはわかったかと思うが、キーの配列が隣り合っていないので使いにくい。できれば隣り合ったキーを押すことでサクサクと単語の先頭を渡り歩いていきたい。

そこで、次のように「q」を「b」と同じ動きにするような設定をしてはどうだろうか。

nnoremap q b

この設定で、「q」を押すことで前の単語の先頭へ移動するようになる。なぜ「q」に割り当てたのかといえば、「w」の左隣りが「q」だからだ。「q」と「w」というキーがそのまま「←」と「→」方向への単語先頭移動という動きになる。「q」にはほかの機能が割り当てられているので、そちらを使っている場合にはこの設定は使えないと思うが、「q」を使ってないならこの設定はそれほど悪くない。

当然だが、設定した状態で「q」を使うと次のようになる。

「q」で前の単語の先頭へ移動

「q」で前の単語の先頭へ移動

「q」で前の単語の先頭へ移動

隣り合うキーで前後への移動ができるのでなかなか便利だ。

行頭と行末へ移動する「Ctrl」+「A」、「Ctrl」+「E」

多くのテキストエディタやワープロアプリケーション、テキストエリアでは、行頭/行末への移動に「Ctrl」+「A」と「Ctrl」+「E」というショートカットキーが割り当てられている。だが、Vimではこれらを移動用のショートカットキーとして使っていない。例えば、「Ctrl」+「A」は数字を加算するという機能がデフォルトで割り当てられている。

しかし、である。数字の加算をすることが多いのであればそれでよいのだが、そうではないのなら、「Ctrl」+「A」と「Ctrl」+「E」の挙動はほかのアプリケーションに合わせておいたほうが便利なことが多い。次の設定で、「Ctrl」+「A」で行頭へ、「Ctrl」+「E」で行末へ移動するようにできる。

nnoremap <C-a> <Home>
inoremap <C-a> <Home>
cnoremap <C-a> <Home>
nnoremap <C-e> <End>
inoremap <C-e> <End>
cnoremap <C-e> <End>

実行すると次のようになる。

「Ctrl」+「E」で行末へ移動

これでほかのアプリケーションと動作が同じになる

Vimだけで全てが完結しているのならよいのだが、実際にはWebブラウザやターミナルアプリケーション、ワープロアプリケーション、統合開発環境、テキストエリアを持ったアプリケーション……とさまざまなソフトウエアを使うだろう。だとすれば、Vimに限らず、全てのアプリケーションのショートカットキーを共通化しておくことには意味がある。別のアプリケーションを使ったときに使えないショートカットキーがあると結構ストレスがたまるものだ。

Vimを使い始めたばかりの頃は「h」「j」「k」「l」やカーソルキーを連打してカーソルを移動させると思うが、徐々に意識してショートカットキーによるカーソル移動を訓練するとよい。そのうち自然に、自分が扱いやすいショートカットキーを使う頻度が増えてくる。そうなると、以前よりもカーソル移動が高速になっていくことに気づくはずだ。何も考えずとも自然と手がそのキーを押すところまで訓練していきたい。

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

プラグインを使うために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
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
nnoremap ) /\(。\\|、\\|[.:][ \t\n]\\|^\n\)<CR>l
nnoremap "" /""<CR>l
nnoremap '' /''<CR>l
nnoremap :: ?""<CR>l
nnoremap ;; ?''<CR>l
nnoremap <C-a> <Home>
inoremap <C-a> <Home>
cnoremap <C-a> <Home>
nnoremap <C-e> <End>
inoremap <C-e> <End>
cnoremap <C-e> <End>

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で IT Search+ の人気記事をお届けします
注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
[解説動画] 個人の業務効率化術 - 短時間集中はこうして作る
ミッションステートメント
教えてカナコさん! これならわかるAI入門
AWSではじめる機械学習 ~サービスを知り、実装を学ぶ~
対話システムをつくろう! Python超入門
Kubernetes入門
SAFeでつくる「DXに強い組織」~企業の課題を解決する13のアプローチ~
PowerShell Core入門
AWSで作るマイクロサービス
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

会員登録(無料)

ページの先頭に戻る