VIM の使い方

2021年2月14日

はじめに

VIM(Vi IMproved) は UNIX 標準エディタ VI (VIsual editor) のクローンです。このページでは VIM の使い方を説明します。

  • バージョンは VIM 8 を想定しています。
  • [ ... ] は省略可能を意味します。

目次

  1. 基本の操作
  2. 便利な操作
  3. 細かい操作
  4. もっと細かい操作
  5. 設定

基本の操作

モード
VIM にはいくつかのモードがあります。
  • ノーマルモード(起動時のモード)
  • コマンドモード
  • 挿入モード
  • 置換モード
  • ビジュアルモード
ここでは基本的にノーマルモードでの操作を説明しています。
起動
vim [ファイル名]
カーソル移動
h (左)
j (下)
k (上)
l (右)
文字の挿入
i (カーソル位置から挿入モードに入る)
操作の取消 (ノーマルモードに戻る)
ESC または Ctrl-C
文字の削除
x (カーソル位置の文字を削除)
X (カーソル左の文字を削除)
文字の削除 (挿入モード)
Backspace または Ctrl-H (カーソル左の文字を削除)
保存
:w [ファイル名]
終了
:q
:q! (強制終了)
保存して終了
:wq
変更されていれば保存して、終了
:x または ZZ
元に戻す
u
Ctrl-R (やり直し)
ヘルプの表示
:h [キーワード]

便利な操作

移動
gg (ファイルの先頭に移動)
G (ファイルの末尾に移動)
行移動
行番号 G (指定した行番号に移動)
文字の挿入
I (行頭の非空白文字から挿入モードに入る)
文字の追加
a (カーソルの右から挿入モードに入る)
A (カーソル行の末尾から挿入モードに入る)
文字の置換
r を押して、置換する文字を入力する
R (置換モードに入る)
行の挿入
o (カーソルの下に行を挿入して挿入モードに入る)
O (カーソルの上に行を挿入して挿入モードに入る)
行の連結
J (カーソル行と下の行を連結する)
行の分割
空白文字で r を押して Enter (空白文字を改行に置き換える)
行の削除
dd
行の削除と挿入
cc または S (カーソル行の内容を削除して挿入モードに入る)
行のコピー
yy または Y
行のペースト (ヤンク)
p (削除またはコピーされた行をカーソル下に挿入)
P (削除またはコピーされた行をカーソル上に挿入)
検索
/文字列 (文字列を前に検索)
?文字列 (文字列を後ろに検索)
/文字列\c, ?文字列\c (大文字小文字区別しないで検索)
/文字列\C, ?文字列\C (大文字小文字区別して検索)
* (カーソル位置の単語を前に検索)
# (カーソル位置の単語を後ろに検索)
:g 文字列 (文字列を含む行を表示する)
再検索
n (前に再検索)
N (後ろに再検索)
操作の繰り返し
. (前の操作を繰り返す)
回数 操作 (回数分操作を繰り返す)

細かい操作

新規作成
:enew (現在の窓で開く)
ファイルを開く
:e [ファイル]
:e Ctrl-D (ファイルの一覧を表示)
行内の移動
0 (ゼロ) (行頭へ移動)
$ (行末へ移動)
^ (行頭の非空白文字へ移動)
w または W (次にある単語の先頭へ移動)
e または E (次にある単語の末尾へ移動)
b または B (後ろにある単語の先頭へ移動)

※a, e, b はアンダースコア以外の区切り文字 (/ や - など) でも止まるが、W, E, B はもっと大雑把に移動する。

行内の文字の位置へ移動
f文字 (行の文字がある位置まで前に移動)
; (繰り返し)
F文字 (行の文字がある位置まで後ろに移動)
, (繰り返し)
行の移動
+ (次の行の先頭に移動)
- (前の行の先頭に移動)
画面上の移動
H (画面一番上への移動)
M (画面中央への移動)
L (画面一番下への移動)
ページスクロール
Ctrl-E (1 行下にスクロール)
Ctrl-Y (1 行上にスクロール)
Ctrl-D (半ページ下にスクロール)
Ctrl-U (半ページ上にスクロール)
Ctrl-F (1 ページ下にスクロール)
Ctrl-B (1 ページ上にスクロール)
ファイル内移動
数字% (ファイル内の割合位置に移動)
削除
D または d$ (カーソル位置から行末まで削除)
d0 (カーソル位置の左から行頭まで削除)
d^ (カーソル位置の左から行頭の非空白文字まで削除)
dw (カーソル位置から次の単語位置まで削除)
削除と挿入
s (カーソル位置の文字を削除して挿入モードに入る)
C または c$ (カーソル位置から行末まで削除して挿入モードに入る)
c0 (カーソル位置の左から行頭まで削除して挿入モードに入る)
c^ (カーソル位置の左から行頭の非空白文字まで削除して挿入モードに入る)
cw (カーソル位置から次の単語位置まで削除して挿入モードに入る)
文字の選択 (ビジュアルモードに入る)
v (文字ごとの選択)
V (行ごとの選択)
カーソル移動で選択範囲の指定、y でコピー、x または d で削除
文字のペースト (ヤンク)
p (削除またはコピーされた内容をカーソル右に挿入)
P (削除またはコピーされた内容をカーソル左に挿入)
文字列の置換
:s/文字列/置換文字列/g (行や選択範囲での置換)
:s/文字列/置換文字列/gi (大文字小文字を区別しないで置換)
:s/文字列/置換文字列/gI (大文字の i) (大文字小文字を区別して置換)
:%s/文字列/置換文字列/g (ファイル内の指定した文字列すべてを置換)
情報の表示
Ctrl-G (ファイル名やカーソル位置の情報を表示
g Ctrl-G (カーソル位置の細かい情報を表示)

もっと細かい操作

括弧の対応
% (カーソル位置の括弧の対応位置に移動)
ブロック間の移動
(, ) (文単位の移動)
{, } (空行間の移動)
[m, ]m (Java 風言語のクラス定義の先頭間の移動)
[M, ]M (Java 風言語のクラス定義の末尾間の移動)
]], [[ (行頭の "{" へ移動)
][, [] (行頭の "}" へ移動)
行のインデント
>> (インデントを右に移動)
<< (インデントを左に移動)
== (適切なインデントを行う)
インデント (ビジュアルモード)
> (選択範囲のインデントを右に移動)
< (選択範囲のインデントを左に移動)
= (選択範囲の適切なインデントを行う)
単語の補完 (挿入モード)
Ctrl-P (単語入力中、前に出てくる単語から補完)
Ctrl-N (単語入力中、後に出てくる単語から補完)
前の位置に戻る
``
マーク
mアルファベット (カーソル位置にマークを付ける)
`アルファベット (マークを付けた位置に移動)
操作の記録
qアルファベット (操作の記録開始)
q (操作の記録終了)
@アルファベット (操作の再生)
ファイルの挿入
:r [ファイル] (カーソル位置の下にファイルを挿入)
外部プログラムの結果の挿入
:r! プログラム (カーソル位置の下に結果を挿入)
外部プログラムの実行
:! プログラム
外部プログラムの適用(ビジュアルモード)
:! プログラム (選択範囲に sort などのプログラムを適用)
シェルの起動
:sh
バッファ
一度開いたファイルはバッファとして管理されます。
:ls (バッファリストの表示)
:b 番号 (バッファを表示)
:bn (次のバッファを表示)
:bp (前のバッファを表示)
:bd (現在のバッファを削除)
:bd 番号 (指定のバッファを削除)
:bd! (現在のバッファを強制削除)
ウインドウの分割
:sp [ファイル] (ウインドウを横に分割)
:vs [ファイル] (ウインドウを縦に分割)
:new (空の横ウインドウを開く)
:vnew (空の縦ウインドウを開く)
Ctrl-W w (次のウインドウに移動)
Ctrl-W p (前のウインドウに移動)
Ctrl-W h, j, k, l (別のウインドウに移動)
Ctrl-W H, J, K, L (ウインドウを移動)
Ctrl-W +, - (ウインドウの高さを変更)
Ctrl-W >, < (ウインドウの幅を変更)
Ctrl-W = (全てのウインドウを同じ高さにする)
Ctrl-W o (現在のウインドウ以外を閉じる)
:wa (全て保存)
:qa (全て閉じる)
:wqa (全て保存して終了)
タグジャンプ
ctags などで作った tags ファイルをもとにタグジャンプを行います。
(コマンドラインで) vim -t タグ (タグから VIM を起動)
:tag タグ (タグに移動)
Ctrl-] (カーソル位置のタグに移動)
Ctrl-T (元の位置に戻る)
Ctrl-W ] (ウインドウを分割してカーソル位置のタグに移動)
Ctrl-W } (プレビューウインドウでカーソル位置のタグを表示)
リンク先を開く
gf (C言語の include ファイルなどリンク先を開く)
Ctrl-W f (リンク先を分割ウインドウで開く)
Ctrl-O (前に戻る)
:set path+=パス (リンク先のパスを追加)

設定

オプション
:set [all] (設定状況の表示)
:set オプション (オプションの設定)
:set オプション? (オプションの設定状況を表示)
:set noオプション (オプションの設定解除)
:setlocal (:set と同じだが、現在のバッファでのみ設定が有効)
:options (オプションの説明の表示)
シンタックスハイライト
:syntax on (キーワードをハイライト表示する)
ファイルタイププラグイン
:filetype plugin indent on (ファイルタイプを判別して設定を変える)
キーマッピング
imap [キー列] (挿入モードでのキーマッピングの定義内容の表示)
imap キー列1 キー列2 (挿入モード用にキー列1をキー列2と定義)
iunmap キー列 (定義の解除)
※ビジュアルモードでは vmap

設定例

設定ファイル ~/.vimrc

set nocompatible " VI 互換でない
set nobackup " バックアップはとらない
set laststatus=2 " 常にステータスを表示
set showmode " モードを表示
set ruler " ルーラーを表示
set showcmd " 打ったキーを表示
set backspace=indent,eol,start " 挿入開始以前の文字や改行も削除
set whichwrap=b " カーソル移動で行を越えて移動させるか
set showmatch " 括弧の対応の表示
set ignorecase " 検索時大文字と小文字を区別しない
set incsearch " インクリメンタルサーチ
set smartindent " 賢いオートインデント
set number " 行番号を表示
set visualbell " ビープ音を鳴らさない

syntax on " シンタックスハイライト
filetype plugin indent on " ファイルタイププラグインを有効にする

" エンコーディング
set encoding=utf-8 " VIM の文字コード
set fileencoding=utf-8 " ファイルの文字コード
set fileencodings=utf-8,iso-2022-jp,shift-jis,euc-jp,utf-16

" カーソル位置の記憶
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

ダブルクウォート (") から行末まではコメント。

Tab の設定

Tab の幅を変えたい場合

set tabstop=4 " Tab の幅
set shiftwidth=4 " 自動インデントで挿入される幅

Tab で空白を使いたい場合

set expandtab " Tab で空白を挿入する
set shiftwidth=4 " 自動インデントで挿入される空白数
set softtabstop=4 " Tab で挿入される空白数

ファイルタイプで設定を変える

ファイルタイプに応じて設定を変えたい場合は、簡単には次のようにする。

autocmd FileType html setlocal shiftwidth=2 softtabstop=2 nosmartindent indentexpr=
autocmd FileType javascript setlocal shiftwidth=2 softtabstop=2
autocmd FileType tex setlocal shiftwidth=2 softtabstop=2 nosmartindent indentexpr=

任意の列に色付けする

たとえば、80 文字以下で改行する方針の場合に、わかりやすく 80 文字で線を表示するには、次のようにする。

set colorcolumn=81

コメントアウト用設定

vmap #  :s/^/#/<CR>
vmap .# :s/^#//<CR>
vmap //  :s%^%//%<CR>
vmap .// :s%^//%%<CR>

ビジュアルモードで行を選択して "#" と打つと行頭に "#" がつき、".#" と打つと行頭の "#" が消える。

map !< O<!--<Esc>
map !> o--><Esc>

HTML 用のコメントアウト設定。ノーマルモードで "!<" と打つと上の行に "<!--" と挿入され、"!>" と打つと下の行に "-->" と挿入される。

ここで、map はノーマルモードのキーマッピングで、vmap はビジュアルモードの、imap だと挿入モードのマッピングになる。

ほんとうはファイルタイプに応じて設定すべきだが、マッピングがかぶらない限りは大丈夫だろう。

関数間移動の設定

]], [[ などによる行頭の "{", "}" への移動は、C 言語風の関数間移動に使えるが、"{" を行頭に置かないスタイルもある。その場合に対応するには、設定で次のようにする。

map [[ ?{w99[{
map ][ /}b99]}
map ]] j0[[%/{
map [] k$][%?}

HTML の "<"、">" の変換

HTML の "<"、">" を "&lt;"、"&gt;" に変換する

vmap &< :s/</\</g<CR>:s/>/\>/g<CR>

空白の表示

空白を表示するには、まず空白文字などを設定する。

set listchars=eol:¬,space:␣,tab:>·

次のようにすると空白文字が表示される。

:set list

コピー & ペースト

オートインデントが有効な状態で他のアプリケーションから vim にコピー & ペーストすると、インデントが崩れてしまう。これを避けるためには、":set paste" と設定してペーストする。ただし、このままだとオートインデントが効かなくなるので、":set nopaste" で元に戻す必要がある。

.vimrc で次のように設定しておけば、挿入モードを抜けるときに自動的に ":set nopaste" される。

autocmd InsertLeave * set nopaste

あるいは、次のように設定しておくと、":set pasete"、":set nopaste" が自動的に設定される (設定の意味はわからない)。

if &term =~ "xterm"
    let &t_ti .= "\e[?2004h"
    let &t_te .= "\e[?2004l"
    let &pastetoggle = "\e[201~"

    function XTermPasteBegin(ret)
        set paste
        return a:ret
    endfunction

    noremap <special> <expr> <Esc>[200~ XTermPasteBegin("0i")
    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
    cnoremap <special> <Esc>[200~ <nop>
    cnoremap <special> <Esc>[201~ <nop>
endif

参考

文字コードの変更

たとえば、Shift-JIS の文書を UTF-8 に変換したい場合などは、次のようにする。

:set fenc=utf-8

改行コードの変更

たとえば、DOS の改行コード (CR-LF) を UNIX 形式 (LF) に変えて保存するには、次のようにする。

:w ++ff=unix

入力補完辞書の設定

同じファイル内のキーワードから入力補完を行うには Ctrl-P、Ctrl-N を使えばよいが、ファイル内にないキーワードを入力補完したい場合は、辞書を用意する。

たとえば、~/.vim/words/ あたりに general.txt とか適当な単語リストファイルを作る。このファイルを設定で追加する。

set dictionary+=~/.vim/words/general.txt

入力中に Ctrl-X、Ctrl-K と押すと、補完候補が出てくるので、Ctrl-P、Ctrl-N で選択する。

もし、Ctrl-X、Ctrl-K を押さずに Ctrl-P、Ctrl-N だけで辞書の候補を選べるようにしてよいのであれば、次のように設定する。

set complete+=k

ファイルタイプごとに辞書を設定したい場合は、たとえば、次のようにすればよい。

autocmd FileType fortran setlocal dictionary+=~/.vim/words/fortran.txt

ただ、この場合はシンタックスのキーワードの入力補完になると思われるので、それについては別の方法がある (それでは足りない場合もあるが)。

参考

シンタックスキーワードの入力補完の設定

シンタックスのキーワードの入力補完をする場合は、(おそらくファイルタイプごとに) 次のように設定しておく。

setlocal omnifunc=syntaxcomplete#Complete

入力中に Ctrl-X、Ctrl-O と押すと、補完候補が出てくるので、Ctrl-P、Ctrl-N で選択する。

Ctrl-X、Ctrl-O がめんどくさい場合は、Ctrl-@ にでも割り当てておけばよいかもしれない。

imap <C-@> <C-X><C-O>

参考

ファイルタイプごとの設定

ファイルタイプごとにまとまった設定をしたい場合は、~/.vim/ftplugin/ に "ファイルタイプ名.vim" のファイルを置く。たとえば、fortran 用の設定であれば fortran.vim を置けばよい。

Fortran 用の設定

Fortran 用のファイルを新規作成したとき、拡張子が .f90 でも固定フォーマットになるらしい。一度保存して起動しなおせばフリーフォーマットになるが、めんどくさいので、~/.vimrc (プラグインのほうではなく) に次のように設定しておく。

let fortran_free_source=1

.inc ファイルを Frotran ファイルとみなしたい場合は、~/.vim/filetype.vim を用意する。

if exists("did_load_filetypes")
    finish
endif

augroup filetypedetect
    au! BufRead,BufNewFile *.inc setfiletype fortran
augroup end

その他の設定

~/.vim/ftplugin/fortran.vim

setlocal shiftwidth=2
setlocal softtabstop=2

vmap !  :s/^/!/<CR>
vmap .! :s/^!//<CR>