マイナビニュースマイナビ

Vimを使う - 便利ジャンプ(""、''、NN、MM)

【連載】

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

【第260回】Vimを使う - 便利ジャンプ(""、''、NN、MM)

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

Vimでカーソルの位置を移動させる方法はいくつかある。汎用的で扱いやすいのは後方検索である「/」と前方検索の「?」だ。この2つの方法では、ある程度正規表現を指定することができるため、使いこなすと比較的自由にカーソルを移動させられるようになる。

これだけでもよいのだが、今回はこの機能をもっと短縮化して使う方法を紹介しよう。ちょっとした設定なのだが、これが編集作業の効率化にてきめんに効くのでぜひ試してもらいたい。

「”“」や「”」で空のクォーテーションへジャンプ

Webページや専用アプリケーションで業務データの入力を行う、といった作業はよくあるものだろう。入力の手間を省くために、入力フィールドの移動は自動、またはタブキーを押すことで実行される仕組みになっていることが多い。いちいちマウスへ手を伸ばす手間をなくし、キーボードに手を置いたまま次の入力フィールドへ移動したいからだ。

これは、Vimでテキストファイルを編集する場合も同じだ。次に入力する場所へは最速で移動したい。

CSVファイルやJSONファイル、XMLファイルといったテキストファイルの場合、テンプレートとなるファイルを用意しておき、空いている場所へ特定のデータを入力するといったような作業がある。ある程度の骨組みは用意してあって、値や文章を入力する部分だけが空になっているケースだ。

この空になっている部分が「”“」や「”」といった空のダブル/シングルクォーテーションだったとしよう。その場合、クォーテーションの間(入力する場所)にカーソルが移動してほしい。これまで連載で解説してきた方法でやるならば、「/”“↩️l」と入力すれば、カーソルから後方にある空のダブルクォーテーションの間にカーソルがジャンプする。シングルクォーテーションで同じことをするなら「/”↩️l」となる。

しかし、こうした指定を入力するのには結構頭を使う。できれば、もっと簡単な指定でカーソルを移動させたい。そこで次の設定だ。

nnoremap "" /""<CR>l
nnoremap '' /''<CR>l

上記の設定で、「”“」でダブルクォーテーションの間にカーソルがジャンプ、「”」でシングルクォーテーションでカーソルの間へカーソルがジャンプするようになる。

同じ文字を2回連続して入力するというのは覚えやすく入力しやすい。しかも「”“」は「”“」の間へのジャンプの指定であり、「”」は「”」の間へのジャンプとなる。とても覚えやすい。例えば、次のようなテキストファイルを編入している状態で、「”“」と入力する。

設定したダブルクォーテーションの2連続入力

すると、次のように空のダブルクォーテーション間へカーソルが移動する。

空のダブルクォーテーションの間へカーソルが移動

シングルクォーテーションの2連続入力も同じだ。

設定したシングルクォーテーションの2連続入力

次のようにシングルクォーテーションの間へカーソルが移動する。

空のシングルクォーテーションの間へカーソルが移動

簡単な設定だが、効果は大きい。入力作業が多いほど、任意の場所へ素早くカーソルを移動できることが効いてくる。「”“」と「”」の設定は、覚えやすいのも利点だ。

「NN」と「MM」で空のタグへジャンプ

同じような設定だが、今度は空のタグの間へジャンプする設定を見てみよう。先に答えを書いておくと、次のように設定すれば「NN」で後方の空タグの間へ、「MM」で前方の空タグの間へカーソルがジャンプするようになる。

nnoremap NN /<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap MM ?<<CR>h?<\([^>/]\+\)><\/\1><CR>/<<CR>

HTMLファイルやXMLファイルのテンプレートを用意しておき、空のタグの間にデータやテキストを書いていくというのもよくある作業だろう。効率化するには、空のタグの間へカーソルを移動させる部分を、先ほどと同じように設定すればよい。

上記の設定は多少わかりにくいが、要するに「<タグ>

動作例を見てみよう。次のような状態で「NN」と入力する。

「NN」と入力

次のように空のタグの間へカーソルが移動したことを確認できる。この状態でさらに「NN」と入力してみる。

さらに「NN」と入力

カーソルはさらに次の空タグの間へ移動している。今度はここで「MM」と入力してみる。

今度は「MM」と入力

今度は一つ前の空タグの間へカーソルがジャンプした。「NN」で次の空タグ、「MM」で前の空タグ、という移動設定になっている。

「NN」と「MM」でそれぞれ次/前の空タグの間へのジャンプになっている

このように、対になる操作を隣り合うキーに割り当てるというのも重要だ。それは頭文字による意味ではなく「場所的に隣り合っていて覚えやすいから」「使いやすいから」という理由での割当となる。

これまで本連載でも何度が触れてきたが、こうした使われ方をすることを踏まえると、日本語キーボードよりも英語キーボードのほうが何かと都合が良いことが多い。デフォルトのショートカットキー設定が英語キーボードを想定していることが多く、英語キーボードでは覚えやすいショートカットキーが、日本語キーボードだとすごく覚えにくい(使いにくい)ケースがあるからだ。英語キーボードならば、そうしたストレスが少なくて済む。日本語キーボードを使っている場合は、使いにくいショートカットキーは隣り合うショートカットキーへ設定を変更してしまうほうが良いこともある。

些細なことに思えるかもしれないが、大きな効果が得られることもある。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 vis ?\(。\\|\.\\|^$\\|>\)<CR>lv/\(。\\|\.\\|^$\\|<\\|:\)<CR>
nnoremap "" /""<CR>l
nnoremap '' /''<CR>l
nnoremap NN /<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap MM ?<<CR>h?<\([^>/]\+\)><\/\1><CR>/<<CR>

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

一覧はこちら

連載目次

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で TECH+ の人気記事をお届けします
注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
Slackで始める新しいオフィス様式
Google Workspaceをビジネスで活用する
ニューノーマル時代のオウンドメディア戦略
ミッションステートメント
次世代YouTubeクリエイターの成長戦略
IoTでできることを見つけるための発想トレーニング
教えてカナコさん! これならわかるAI入門
AWSではじめる機械学習 ~サービスを知り、実装を学ぶ~
Kubernetes入門
SAFeでつくる「DXに強い組織」~企業の課題を解決する13のアプローチ~
マイクロサービス時代に活きるフレームワーク Spring WebFlux入門
AWSで作るマイクロサービス
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

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

一覧はこちら

会員登録(無料)

ページの先頭に戻る