はじめに

Vimは、UNIX系OSで長年使われてきた伝説的なテキストエディタです。サーバー管理やプログラミングにおいて、Vimの操作スキルは必須とも言える存在です。最初は独特の操作体系に戸惑うかもしれませんが、一度習得すれば、マウスに手を伸ばすことなく高速なテキスト編集が可能になります。

本記事では、Vimの基本的なモード操作から、カーソル移動、テキスト編集、検索と置換、複数ファイルの編集、そして.vimrcによるカスタマイズまでを体系的に解説します。この記事を読み終える頃には、Vimを使ってテキストファイルを効率的に編集できるようになるでしょう。

動作確認環境

本記事のコマンドは以下の環境で動作確認しています。

項目 内容
OS Ubuntu 24.04 LTS
Vim Vim 9.1
シェル bash 5.3

WSL2、その他の主要ディストリビューション(AlmaLinux、Debian等)、macOSでも同様に動作します。

Vimのインストール確認

Vimがインストールされているか確認します。

1
vim --version
1
2
3
VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Dec 30 2025 21:35:16)
Included patches: 1-1003
...

インストールされていない場合は、パッケージマネージャでインストールします。

1
2
3
4
5
6
7
8
# Ubuntu/Debian系
sudo apt update && sudo apt install vim

# RHEL/CentOS/AlmaLinux系
sudo dnf install vim

# macOS(Homebrewを使用)
brew install vim

Vimとは何か

Viの進化形としてのVim

Vimは「Vi IMproved」の略で、1991年にBram Moolenaar氏によって開発されました。UNIX系OSに標準搭載されていたviエディタを拡張し、多くの機能を追加した高機能テキストエディタです。

timeline
    title Vimの歴史
    1976 : vi誕生(Bill Joy)
    1988 : vi clone開発活発化
    1991 : Vim 1.0リリース(Amiga版)
    1994 : Vim 3.0(UNIX版登場)
    1996 : Vim 4.0(GUI対応)
    1998 : Vim 5.0(シンタックスハイライト)
    2006 : Vim 7.0(スペルチェック、タブ)
    2016 : Vim 8.0(非同期I/O)
    2022 : Vim 9.0(Vim9 script)

Vimの特徴

特徴 説明
モーダルエディタ 操作モードを切り替えて効率的に編集
キーボード中心 マウス不要で高速な操作が可能
軽量・高速 大きなファイルでもストレスなく編集
拡張性 プラグインやスクリプトでカスタマイズ可能
ユビキタス ほぼすべてのUNIX系システムで利用可能

Vimのモードを理解する

Vimを使いこなすうえで最も重要なのが「モード」の概念です。Vimには複数のモードがあり、各モードで同じキーを押しても異なる動作をします。

stateDiagram-v2
    [*] --> ノーマルモード: vim起動
    ノーマルモード --> 挿入モード: i, a, o など
    挿入モード --> ノーマルモード: Esc
    ノーマルモード --> ビジュアルモード: v, V, Ctrl+v
    ビジュアルモード --> ノーマルモード: Esc
    ノーマルモード --> コマンドラインモード: :, /, ?
    コマンドラインモード --> ノーマルモード: Enter または Esc

ノーマルモード(Normal Mode)

Vimを起動すると最初に入るモードです。テキストの移動、コピー、削除などの操作を行います。

1
2
# Vimでファイルを開く
vim sample.txt

ノーマルモードでは、入力したキーはすべてコマンドとして解釈されます。テキストを入力するには、挿入モードに切り替える必要があります。

主な用途:

  • カーソル移動
  • テキストのコピー・削除・貼り付け
  • 検索
  • 他のモードへの切り替え

挿入モード(Insert Mode)

実際にテキストを入力するモードです。通常のテキストエディタと同様に、キーを押すとその文字が入力されます。

キー 動作
i カーソル位置の前に挿入
I 行頭に挿入
a カーソル位置の後に挿入
A 行末に挿入
o カーソル行の下に新しい行を作成して挿入
O カーソル行の上に新しい行を作成して挿入

挿入モードから抜けるには Esc キーを押します。

1
2
# 挿入モードの表示(画面下部)
-- INSERT --

ビジュアルモード(Visual Mode)

テキストを選択するモードです。選択した範囲に対してコピーや削除などの操作を適用できます。

キー 動作
v 文字単位で選択(ビジュアルモード)
V 行単位で選択(ビジュアルラインモード)
Ctrl+v 矩形(ブロック)選択(ビジュアルブロックモード)
1
2
3
4
# ビジュアルモードの表示(画面下部)
-- VISUAL --
-- VISUAL LINE --
-- VISUAL BLOCK --

コマンドラインモード(Command-line Mode)

ファイルの保存、終了、検索・置換などのコマンドを入力するモードです。ノーマルモードで : を押すと入ります。

1
2
3
4
5
:w              " ファイルを保存
:q              " Vimを終了
:wq             " 保存して終了
:q!             " 保存せずに強制終了
:help           " ヘルプを表示

基本的なVim操作

Vimの起動と終了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# ファイルを開いて起動
vim filename.txt

# 新規ファイルを作成して起動
vim newfile.txt

# 複数ファイルを開く
vim file1.txt file2.txt

# 読み取り専用で開く
vim -R filename.txt
# または
view filename.txt

Vimを終了する方法は複数あります。

コマンド 動作
:q 終了(未保存の変更があるとエラー)
:q! 強制終了(変更を破棄)
:w 保存
:wq 保存して終了
:x 保存して終了(:wqと同等)
ZZ 保存して終了(ノーマルモード)
ZQ 保存せずに終了(ノーマルモード)

カーソル移動

Vimではホームポジションから手を離さずにカーソルを移動できます。

基本移動

キー 動作
h 左に移動
j 下に移動
k 上に移動
l 右に移動
1
2
3
4
5
        k
    h ← ・ → l
        j

矢印キーも使用できますが、hjklを使うことでホームポジションを維持できます。

単語単位の移動

キー 動作
w 次の単語の先頭に移動
W 次の単語の先頭に移動(空白区切り)
b 前の単語の先頭に移動
B 前の単語の先頭に移動(空白区切り)
e 単語の末尾に移動
E 単語の末尾に移動(空白区切り)
1
2
3
This is a sample text for vim tutorial.
     ↑   ↑      ↑    ↑
     w   w      w    w  (wで順番に移動)

行内移動

キー 動作
0 行頭に移動
^ 行頭(最初の非空白文字)に移動
$ 行末に移動
f{char} 行内で次の{char}に移動
F{char} 行内で前の{char}に移動
t{char} 行内で次の{char}の手前に移動
T{char} 行内で前の{char}の後に移動
1
2
3
    function processData(data) {
    ↑       ↑                  ↑
    0       ^                  $

ファイル内移動

キー 動作
gg ファイルの先頭に移動
G ファイルの末尾に移動
{n}G n行目に移動
:{n} n行目に移動
Ctrl+f 1ページ下にスクロール
Ctrl+b 1ページ上にスクロール
Ctrl+d 半ページ下にスクロール
Ctrl+u 半ページ上にスクロール
H 画面上部に移動
M 画面中央に移動
L 画面下部に移動

テキスト編集

削除操作

Vimでは削除したテキストは自動的にレジスタ(クリップボードのようなもの)に保存されます。

キー 動作
x カーソル位置の1文字を削除
X カーソル位置の前の1文字を削除
dd 1行削除
D カーソル位置から行末まで削除
dw カーソル位置から単語末まで削除
d$ カーソル位置から行末まで削除
d0 カーソル位置から行頭まで削除
dgg カーソル位置からファイル先頭まで削除
dG カーソル位置からファイル末尾まで削除

数字を組み合わせることで、複数回の操作を一度に実行できます。

1
2
3
3dd     " 3行削除
5x      " 5文字削除
d3w     " 3単語削除

コピー(ヤンク)と貼り付け

Vimでは「コピー」を「ヤンク(yank)」と呼びます。

キー 動作
yy 1行コピー
Y 1行コピー(yyと同じ)
yw 単語をコピー
y$ カーソル位置から行末までコピー
p カーソル位置の後に貼り付け
P カーソル位置の前に貼り付け
1
2
3yy     " 3行コピー
y3w     " 3単語コピー

変更操作

変更操作は「削除して挿入モードに入る」動作です。

キー 動作
cc 行全体を変更
C カーソル位置から行末まで変更
cw 単語を変更
c$ カーソル位置から行末まで変更
s 1文字削除して挿入モードに入る
S 行全体を削除して挿入モードに入る
r{char} 1文字を{char}に置換(挿入モードに入らない)
R 置換モードに入る(上書き入力)

アンドゥとリドゥ

キー 動作
u 直前の操作を取り消し(アンドゥ)
Ctrl+r アンドゥを取り消し(リドゥ)
U 行全体への変更を取り消し

Vimはマルチレベルのアンドゥをサポートしており、何回でも操作を遡ることができます。

テキストオブジェクト

Vimの強力な機能の一つが「テキストオブジェクト」です。i(inner)やa(a/around)と組み合わせることで、文法的な単位で操作できます。

キー 動作
iw 単語の中身
aw 単語(空白を含む)
i" ダブルクォート内
a" ダブルクォート(クォートを含む)
i' シングルクォート内
i( / i) 括弧内
a( / a) 括弧(括弧を含む)
i{ / i} 波括弧内
i[ / i] 角括弧内
it HTMLタグ内
at HTMLタグ(タグを含む)
ip 段落内
is 文内
1
2
3
4
5
6
" 使用例
ciw     " 単語を変更(カーソルが単語のどこにあっても)
di"     " ダブルクォート内を削除
ya)     " 括弧全体をコピー
ci{     " 波括弧内を変更
dit     " HTMLタグの中身を削除
1
2
3
4
# 例:カーソルが "hello" の 'e' の位置にあるとき
print("hello, world")
       ciw で "hello" 全体が削除され、挿入モードに入る

検索と置換

検索

ノーマルモードで / を押すと、前方検索モードに入ります。

キー 動作
/pattern 前方検索
?pattern 後方検索
n 次の検索結果に移動
N 前の検索結果に移動
* カーソル位置の単語を前方検索
# カーソル位置の単語を後方検索
1
2
3
4
/error          " "error" を前方検索
?warning        " "warning" を後方検索
/\cerror        " 大文字小文字を無視して検索
/error\c        " 大文字小文字を無視して検索(別記法)

検索ハイライトを消すには :noh または :nohlsearch を使用します。

正規表現を使った検索

Vimは強力な正規表現をサポートしています。

1
2
3
4
5
/^function      " 行頭が "function" で始まる行
/;$             " 行末が ";" で終わる行
/\d\+           " 1つ以上の数字
/\<word\>       " 単語 "word"(単語境界/\(foo\|bar\)   " "foo" または "bar"

置換

置換は :s(substitute)コマンドを使用します。

1
2
3
4
5
:s/old/new/           " カーソル行の最初のoldをnewに置換
:s/old/new/g          " カーソル行のすべてのoldをnewに置換
:%s/old/new/g         " ファイル全体のすべてのoldをnewに置換
:%s/old/new/gc        " ファイル全体で確認しながら置換
:5,10s/old/new/g      " 5行目から10行目で置換
フラグ 動作
g 行内のすべてのマッチを置換
c 置換前に確認
i 大文字小文字を無視
I 大文字小文字を区別
1
2
3
4
" 実践例
:%s/\s\+$//g          " 行末の空白を削除
:%s/foo/bar/gi        " 大文字小文字を無視してfooをbarに置換
:%s/^\s\+//g          " 行頭の空白を削除

確認モード(cフラグ)での選択肢:

キー 動作
y 置換する
n 置換しない
a すべて置換
q 置換を終了
l 置換して終了

複数ファイルの編集

バッファ

Vimで開いたファイルは「バッファ」として管理されます。

1
2
3
4
5
6
7
8
:e filename         " 新しいファイルを開く
:ls                 " バッファ一覧を表示
:bn                 " 次のバッファに移動
:bp                 " 前のバッファに移動
:b{n}               " n番目のバッファに移動
:b filename         " 指定したファイルのバッファに移動
:bd                 " 現在のバッファを閉じる
:bd {n}             " n番目のバッファを閉じる
1
2
3
4
5
# :ls の出力例
:ls
  1 %a   "file1.txt"                   line 1
  2      "file2.txt"                   line 1
  3 #    "file3.txt"                   line 1
記号 意味
% 現在のバッファ
# 直前のバッファ
a アクティブ(ウィンドウに表示中)
+ 変更あり

ウィンドウ分割

Vimでは画面を分割して複数のファイルを同時に表示できます。

1
2
3
4
5
6
:split filename     " 水平分割してファイルを開く
:sp filename        " 水平分割(短縮形)
:vsplit filename    " 垂直分割してファイルを開く
:vsp filename       " 垂直分割(短縮形)
:new                " 水平分割して新規バッファを開く
:vnew               " 垂直分割して新規バッファを開く
キー 動作
Ctrl+w s 水平分割
Ctrl+w v 垂直分割
Ctrl+w w 次のウィンドウに移動
Ctrl+w h 左のウィンドウに移動
Ctrl+w j 下のウィンドウに移動
Ctrl+w k 上のウィンドウに移動
Ctrl+w l 右のウィンドウに移動
Ctrl+w c 現在のウィンドウを閉じる
Ctrl+w o 現在のウィンドウ以外を閉じる
Ctrl+w = ウィンドウサイズを均等にする
Ctrl+w _ 現在のウィンドウを最大化(高さ)
`Ctrl+w `
graph TD
    subgraph "Ctrl+w s(水平分割)"
        A1[ファイル1]
        A2[ファイル1]
    end
    
    subgraph "Ctrl+w v(垂直分割)"
        B1[ファイル1] --- B2[ファイル1]
    end

タブ

複数のウィンドウレイアウトをタブで管理できます。

1
2
3
4
5
6
7
8
9
:tabnew             " 新しいタブを開く
:tabnew filename    " 新しいタブでファイルを開く
:tabn               " 次のタブに移動
:tabp               " 前のタブに移動
:tabclose           " 現在のタブを閉じる
:tabonly            " 現在のタブ以外を閉じる
gt                  " 次のタブに移動(ノーマルモード)
gT                  " 前のタブに移動(ノーマルモード)
{n}gt               " n番目のタブに移動

.vimrcによるカスタマイズ

Vimの設定は ~/.vimrc ファイルで行います。このファイルに設定を記述することで、Vim起動時に自動的に読み込まれます。

基本的な設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
" ~/.vimrc

" 基本設定
set nocompatible        " Vi互換モードをオフ
set encoding=utf-8      " 文字エンコーディングをUTF-8に
set fileencodings=utf-8,cp932,euc-jp   " ファイル読み込み時の文字コード判定順
set number              " 行番号を表示
set relativenumber      " 相対行番号を表示
set cursorline          " カーソル行をハイライト
set showmatch           " 対応する括弧をハイライト
set wrap                " 長い行を折り返して表示
set linebreak           " 単語の途中で折り返さない

" インデント設定
set autoindent          " 自動インデント
set smartindent         " スマートインデント
set tabstop=4           " タブ幅を4に設定
set shiftwidth=4        " 自動インデント幅を4に設定
set expandtab           " タブをスペースに変換

" 検索設定
set hlsearch            " 検索結果をハイライト
set incsearch           " インクリメンタルサーチを有効化
set ignorecase          " 検索時に大文字小文字を区別しない
set smartcase           " 大文字を含む場合は区別する

" 表示設定
syntax on               " シンタックスハイライトを有効化
set background=dark     " 背景色を暗い色に最適化
set laststatus=2        " ステータスラインを常に表示
set showcmd             " 入力中のコマンドを表示
set wildmenu            " コマンドライン補完を強化

" その他の便利な設定
set clipboard=unnamed   " システムクリップボードと連携
set mouse=a             " マウスを有効化
set history=1000        " コマンド履歴を1000件保存
set undolevels=1000     " アンドゥ履歴を1000件保存
set backspace=indent,eol,start  " Backspaceの動作を改善

キーマッピング

よく使う操作にショートカットキーを割り当てることができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
" リーダーキーをスペースに設定
let mapleader = " "

" ノーマルモードのキーマッピング
nnoremap <Leader>w :w<CR>           " スペース+wで保存
nnoremap <Leader>q :q<CR>           " スペース+qで終了
nnoremap <Leader>e :e<Space>        " スペース+eでファイルを開く準備

" 検索ハイライトをEscで消す
nnoremap <Esc><Esc> :nohlsearch<CR>

" ウィンドウ移動を簡単に
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

" jkの同時押しでノーマルモードに戻る
inoremap jk <Esc>

" ビジュアルモードでインデント後も選択を維持
vnoremap < <gv
vnoremap > >gv

" Y で行末までヤンク(Dと一貫性を持たせる)
nnoremap Y y$

キーマッピングのコマンド:

コマンド モード
map ノーマル、ビジュアル、オペレータ待機
nmap ノーマルモード
imap 挿入モード
vmap ビジュアルモード
cmap コマンドラインモード

noremap(再帰的でないマッピング)を使うことで、マッピングの無限ループを防げます。

ファイルタイプ別の設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
" ファイルタイプの検出を有効化
filetype on
filetype plugin on
filetype indent on

" ファイルタイプ別のインデント設定
autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
autocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab
autocmd FileType html setlocal tabstop=2 shiftwidth=2 expandtab
autocmd FileType yaml setlocal tabstop=2 shiftwidth=2 expandtab
autocmd FileType go setlocal tabstop=4 shiftwidth=4 noexpandtab

実用的な.vimrc例

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
" ~/.vimrc - 実用的な設定例

" ===================
" 基本設定
" ===================
set nocompatible
set encoding=utf-8
set fileencodings=utf-8,cp932,euc-jp
set number
set relativenumber
set cursorline
set scrolloff=5             " カーソル周辺に5行の余白を確保
set sidescrolloff=5
set signcolumn=yes          " サイン列を常に表示

" ===================
" インデント
" ===================
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set expandtab
set smarttab

" ===================
" 検索
" ===================
set hlsearch
set incsearch
set ignorecase
set smartcase
set wrapscan               " 検索がファイル末尾まで進んだら先頭に戻る

" ===================
" 表示
" ===================
syntax enable
set background=dark
set laststatus=2
set showcmd
set showmode
set wildmenu
set wildmode=list:longest,full

" ===================
" 編集
" ===================
set clipboard=unnamed,unnamedplus
set mouse=a
set backspace=indent,eol,start
set whichwrap=b,s,h,l,<,>,[,]   " 行末/行頭から次の行に移動可能に

" ===================
" バックアップ・スワップ
" ===================
set nobackup
set noswapfile
set autoread               " ファイルが変更されたら自動で読み込む
set hidden                 " バッファを切り替えても undo 履歴を保持

" ===================
" キーマッピング
" ===================
let mapleader = "\<Space>"

" 保存・終了
nnoremap <Leader>w :w<CR>
nnoremap <Leader>q :q<CR>
nnoremap <Leader>Q :q!<CR>

" ウィンドウ操作
nnoremap <Leader>s :split<CR>
nnoremap <Leader>v :vsplit<CR>
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

" バッファ操作
nnoremap <Leader>n :bn<CR>
nnoremap <Leader>p :bp<CR>
nnoremap <Leader>d :bd<CR>

" 検索ハイライト解除
nnoremap <Esc><Esc> :nohlsearch<CR>

" 挿入モードでjkでEsc
inoremap jk <Esc>

" ビジュアルモードのインデント
vnoremap < <gv
vnoremap > >gv

" ===================
" ファイルタイプ設定
" ===================
filetype on
filetype plugin on
filetype indent on

autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
autocmd FileType javascript,typescript setlocal tabstop=2 shiftwidth=2 expandtab
autocmd FileType html,css setlocal tabstop=2 shiftwidth=2 expandtab
autocmd FileType yaml,json setlocal tabstop=2 shiftwidth=2 expandtab

効率的なVim操作のコツ

ドット(.)コマンドの活用

. キーは直前の操作を繰り返します。これを活用することで、繰り返し作業を効率化できます。

1
2
3
4
" 例:複数の行末にセミコロンを追加
A;<Esc>     " 1行目の末尾にセミコロンを追加
j.          " 次の行に移動して同じ操作を繰り返す
j.          " 次の行に移動して同じ操作を繰り返す

マクロの記録と再生

複雑な操作を記録して再生できます。

1
2
3
4
5
6
q{register}     " マクロの記録開始(a-zのレジスタを指定)
" 操作を実行
q               " マクロの記録終了
@{register}     " マクロを再生
@@              " 直前のマクロを再生
{n}@{register}  " マクロをn回再生
1
2
3
4
5
" 例:行頭に "- " を追加するマクロ
qa              " レジスタaに記録開始
I- <Esc>j       " 行頭に "- " を追加して次の行へ
q               " 記録終了
10@a            " 10行に対してマクロを実行

数字プレフィックス

多くのコマンドは数字を前置することで、その回数だけ実行できます。

1
2
3
5j              " 5行下に移動
3dd             " 3行削除
10i*<Esc>       " "*" を10個挿入

まとめ

Vimは最初の学習曲線こそ急ですが、一度習得すれば非常に効率的なテキスト編集が可能になります。本記事で紹介した内容をまとめます。

カテゴリ 主なポイント
モード ノーマル・挿入・ビジュアル・コマンドラインの4つのモード
移動 hjklによる基本移動、w/b/e/による単語移動、gg/Gによるファイル移動
編集 d(削除)、y(コピー)、p(貼り付け)、c(変更)
テキストオブジェクト iw(単語内)、i"(クォート内)など、文法単位での操作
検索・置換 /で検索、:s///で置換
複数ファイル バッファ、ウィンドウ分割、タブによる管理
カスタマイズ .vimrcでの設定、キーマッピング

Vimを使いこなすコツは、毎日少しずつ新しいコマンドを覚えていくことです。まずは基本的なモード操作と移動をマスターし、徐々に高度なテクニックを習得していきましょう。

参考リンク