Vim のブログ

テキストエディター Vim の魅力、使い方のコツを初心者にも分かりやすく伝えていきたいと思います。

Vim のスクロールコマンド

スクロール関連のコマンドを紹介します。すべて、ノーマルモードもしくはビジュアルモードで有効です。

上下スクロール

スクロールのコマンドは上下3組で6個ありますが、半画面単位のスクロールを行う <C-u><C-d> を覚えたら他のコマンドは不要かもしれません。
<C-f><C-b> はキーボード上のキーの位置関係がスクロール方向と逆なので要注意です。

コマンドスクロール方向スクロール量覚え方
<C-u> 上方向 半画面分 up
<C-d> 下方向 半画面分 down
<C-b> 上方向 一画面分 back
<C-f> 下方向 一画面分 forward
<C-e> 上方向 一行分  
<C-y> 下方向 一行分  

Vim では、スクロールによってカーソルが画面外に出てしまう場合、画面に収まるようにカーソルがはみ出た分だけ自動的に移動します。

これは、一般的なGUIテキストエディターとは異なる挙動なのでご注意ください。

スクロール位置の調整コマンド

バッファ上のカーソル位置を変えないで、スクロール位置だけを調整するコマンドです。例えばテキスト上にじっくり読みたい部分があったときに、その部分の先頭で zt コマンドを使ったりすると便利です。

コマンド内容
zt カーソルのある行が画面の上端に来るようにスクロールします。
zz カーソルのある行が画面の中央に来るようにスクロールします。
zb カーソルのある行が画面の下端に来るようにスクロールします。

Vim の文字検索移動コマンド

Vim にはカーソル行の中だけに限って、一文字だけを検索して前後に移動する機能があります。他のエディターではあまり見たことがない機能ですが、削除や変更コマンドと組み合わせて使うと非常に便利です。

検索対象となる文字は、ASCII文字であれば何でも良いのですが、日本語の文字は受け付けないようです。
また、小文字のアルファベットは、意外とどれも出現頻度が高いので、目当ての場所より手前に重複があることを見逃していて思うように移動できないということがよくあります。
; コマンドで検索を繰り返してもいいのですが、大文字のアルファベットや、記号など出現頻度の低い文字を目印に、 t コマンドで手前まで移動するようにすると、重複の見落としに悩まされることが少なくなります。

コマンド検索方向説明覚え方
f{文字} 行末へ(→) 同じ行を行末方向に検索して、最初に見つかった指定された文字の場所にカーソルを移動させます find
F{文字} 行頭へ(←) 同じ行で行頭方向に検索して、最初に見つかった指定された文字の場所にカーソルを移動させます f の逆方向
t{文字} 行末へ(→) 同じ行を行末方向に検索して、最初に見つかった指定された文字の一つ手前にカーソルを移動させます until
T{文字} 行頭へ(←) 同じ行で行頭方向に検索して、最初に見つかった指定された文字の一つ手前にカーソルを移動させます t の逆方向
; 最後の一文字検索コマンドに準じる 最後に行われた f, F, t, T コマンドを繰り返して、次に見つかった文字に移ります 右手ホームポジションの小指位置
, 最後の一文字検索コマンドの逆方向 最後に行われた f, F, t, T コマンドの逆方向検索を行う 出番が少ないので別の機能に割り当てられることもしばしば…

Vim のキーワード検索コマンド

Vim はキーワード検索が非常に手軽に行えるので、日常的に移動のコマンドとして活用できます。すべてノーマルモードで有効なコマンドです。

コマンド検索方向説明覚え方
/キーワード<enter> 右下(ファイル末尾に向かう) カーソル位置からファイル末尾方向に向かって指定されたキーワードを検索し、最初に見つかったところまで移動します。 右手ホームポジションの「小指」の右下
* 右下(ファイル末尾に向かう) カーソル位置の単語をファイル末尾方向に向かって検索し、最初に見つかったところまで移動します。  
?キーワード<enter> 左上(ファイル先頭に向かう) カーソル位置からファイル先頭方向に向かって指定されたキーワードを検索し、最初に見つかったところまで移動します。 / の逆方向なのでシフトキーを押下
# 左上(ファイル先頭に向かう) カーソル位置にある単語をファイル先頭方向に向かって検索し、最初に見つかったところまで移動します。  
n 最後に実行されたキーワード検索コマンド 最後に実行された /, *, ?, # によるキーワード検索コマンドを繰り返します。 next
右手ホームポジションの「人差し指」の左下
N 最後に実行されたキーワード検索コマンドの逆方向 最後に実行された /, *, ?, # によるキーワード検索コマンドに対して戻り検索を行います。 n の逆方向なのでシフトキーを押下

このブログでの Vim コマンドの凡例

以下にこのブログでの Vim コマンドの凡例を示します。基本的には一般的な作法に準じているはずです。

コマンド説明
ciw c, i, w の順にキーを押す
{数字}G 数字(2桁以上も可)を入力したあと、
SHIFT キーを押しながら g キーを押す
f{文字} f キーを押したあと、ASCII の任意の文字を入力
<C-u> Ctrl(Control)キーを押しながら u キーを押す
<tab><enter> TAB キーを押してから ENTER キーを押す
N SHIFT キーを押しながら n キーを押す
:w : を押してコマンドラインモードに入ったあと、
w<Enter>を押してコマンドを実行。
(コマンドラインモードのコマンドについては
暗黙にENTERキーが押されるものとします。)

Vim のプラグイン紹介 〜 surround.vim でカッコつける 〜

surround.vim は、[], (), {} といった括弧や、'' や "" などの引用符、HTMLタグなど、「テキストを囲うもの」を編集するプラグインです。
「囲われているテキスト」には変更を加えず、「テキストを囲うもの」だけを追加、削除、変更することが出来ます。
Vim 本体にはプラグインを入れなくても「囲われているテキスト」だけ、もしくは「囲われているテキスト」と「テキストを囲うもの」の両方を編集する「テキストオブジェクト」という機能もあります。)

インストール方法

NeoBundleを使うと下の一行で簡単にインストールできます。

NeoBundle 'tpope/vim-surround'

選択中のテキストを括弧 / 引用符 / HTMLタグで囲う

個人的には surround.vim で一番よく使う機能です。例えば、ビジュアルモード

This is a selected text.

という選択状態の時に S (小文字ではなくて大文字であることに注意!)と「テキストを囲うもの」を入力することで、選択されたテキストを囲うことが出来ます。

元のテキストコマンド結果
This is a selected text. S' This is 'a selected text'.
This is a selected text. S" This is "a selected text".
This is a selected text. S[ This is [ a selected text ].
This is a selected text. S( This is ( a selected text ).
This is a selected text. S{ This is { a selected text }.
This is a selected text. S<b> This is <b>a selected text</b>.

「テキストを囲うもの」だけを削除もしくは変更する

例えば、ノーマルモードで

This is 'a surrounded text'.

というように、引用符で囲まれた区間にカーソルがあるとします。この前後の引用符のみを編集対象にするためのコマンドは s' (今回は大文字ではなくて小文字)となります。
d (削除)、 もしくは c (変更) コマンドに続いてこの s' を入力することで、引用符のみを削除、変更することが出来ます。
c (変更) コマンドの場合は、その後に変更後の「テキストを囲うもの」を指定してください。

元のテキストコマンド結果
This is 'a surrounded text'. ds' This is a surrounded text.
This is (a surrounded text). ds( This is a surrounded text.
This is <b>a surrounded text</b>. dst This is a surrounded text.
This is 'a surrounded text'. cs'" This is "a surrounded text".
This is 'a surrounded text'. cs'( This is ( a surrounded text ).
This is 'a surrounded text'. cs'<b> This is <b>a surrounded text</b>.

「囲われるテキスト」の選択と「テキストを囲う」操作を同時に行う

ビジュアルモードを経由せず、ノーマルモードから直接「テキストを囲う」ことも出来ます。
ys のあとに「囲われるテキスト」と「テキストを囲うもの」を続けて指定します。
はもともと、コピー(Yank)のコマンドなので ys というのは最初は違和感があって覚えにくいと思います。

「囲われるテキスト」はテキストオブジェクトを用いて指定します。

元のテキストコマンド結果
This is 'a surrounded text'. ysaw( This is 'a ( surrounded ) text'.
This is 'a surrounded text'. ysi'( This is '( a surrounded text )'.
This is 'a surrounded text'. ysa'( This is( 'a surrounded text' ).

このコマンドが surround.vim で一番難易度が高いです。最初に紹介したビジュアルモードを使う方法で代替できるので、覚えるのは後回しでもよいと思います。

Vim のカスタマイズ 〜autocmd で自動処理の実例〜

autocmd による自動処理 の便利な実例を幾つか紹介したいと思います。利用したいスクリプトを.vimrc に書き加えてください。

ファイルを開いた時に、前回のセッション終了時のカーソル位置を復元する

function! s:RestoreCursorPostion()
  if line("'\"") <= line("$")
    normal! g`"
    return 1
  endif
endfunction
" ファイルを開いた時に、以前のカーソル位置を復元する
augroup vimrc_restore_cursor_position
  autocmd!
  autocmd BufWinEnter * call s:RestoreCursorPostion()
augroup END

複数ウィンドウを開いているときにアクティブなウィンドウに限りカーソル行を強調する

" アクティブウィンドウに限りカーソル行(列)を強調する
augroup vimrc_set_cursorline_only_active_window
  autocmd!
  autocmd VimEnter,BufWinEnter,WinEnter * setlocal cursorline
  autocmd WinLeave * setlocal nocursorline
augroup END

インサートモードに入った時にカーソル行の色を変更する

色は、vim-powerline というプラグインのステータスバーの色に合わせています。お好みの色に合わせて ctermbg と guibg の値をカスタマイズしてください。

" インサートモードに入った時にカーソル行(列)の色を変更する
augroup vimrc_change_cursorline_color
  autocmd!
  " インサートモードに入った時にカーソル行の色をブルーグリーンにする
  autocmd InsertEnter * highlight CursorLine ctermbg=24 guibg=#005f87 | highlight CursorColumn ctermbg=24 guibg=#005f87
  " インサートモードを抜けた時にカーソル行の色を黒に近いダークグレーにする
  autocmd InsertLeave * highlight CursorLine ctermbg=236 guibg=#303030 | highlight CursorColumn ctermbg=236 guibg=#303030
augroup END

参考にしたページ

Vim のカスタマイズ 〜キー割り当て変更の実例〜

こちらのページでは、 Vim のカスタマイズ 〜キー割り当て変更方法〜 に従ってキー割り当て変更の実例を幾つかご紹介したいと思います。.vimrcに追記して下さい。

なるべく個人の好みによらず無難に役立ちそうなものをチョイスしてみました。

ビジュアルモードで < > キーによるインデント後にビジュアルモードが解除されないようにする

vnoremap < <gv
vnoremap > >gv

行が折り返されている時(set wrap) j k キーによる上下移動が論理行単位ではなく表示行単位で行われるようにする

nnoremap j gj
nnoremap k gk
nnoremap gj j
nnoremap gk k

(逆に論理行単位で移動したい場合は、gj, gk を使います。)

nN キーで「次の(前の)検索候補」を画面の中心に表示する

nnoremap n nzz
nnoremap N Nzz

コマンドラインモードで %% を入力すると現在編集中のファイルのフォルダのパスが展開されるようにする

cnoremap %% <C-R>=expand('%:p:h').'/'<cr>

こちらのページで紹介されていたのを参考にしました。

キーで「カーソルから行末までコピー(Yank)」

以下 Vim のデフォルトのキー配置の一部です。

cc 行全体を変更
C カーソル位置から行末までを変更
dd 行全体を削除
D カーソル位置から行末までを削除
yy 行全体をコピー
Y 行全体をコピー

ご覧のとおり、CD といった大文字の編集コマンドは「カーソル位置から行末まで」作用するのに対して、Yyy と同じく「行全体」に採用します

vi との互換のためにこのような仕様になっているそうですが、あまり直感的ではありません。YCD と同様にカーソル位置から行末までに作用するように変更したい場合は下のように設定します。

nnoremap Y y$