(初心者向け)
Vim の機能とか紹介
2020/08/28 バータイム
cohama
私と Vim
❖ 2011年 (新卒入社時) くらいから使ってる
❖ vimrc 1000行超え
❖ プラグイン3つくらい作った
❖ 昔、Nagoya.vim という勉強会もやっていた
❖ この資料は昔の Nagoya.vim での説明資
料に加筆修正したものです。(当時は2013
年)
今日話すこと
❖ Vim の良さ、機能をざっと説明
❖ Vim のカスタマイズについて
❖ 私の Vim
1. Vim とは?
Vim ってなんなの ...
● Vim は高機能なテキストエディタ
○ もしくは環境、VM
● モードを持つ
○ カーソル移動やテキストの編集を行うノーマルモード
○ 文字の入力を行うインサートモード
○ 様々な処理を実行するコマンドラインモード
○ などなど
○ (Wikipedia によると全部で 11 のモードがあるらしい)
Vim ってなんなの ...
● キーボード中心の操作
○ マウスは基本使わない (使うこともできる)
○ ホームポジションから打ちにくいキーも使わない (矢印
キー)
● カスタマイズ可能
○ Vim script というとても味わい深い言語でカスタマイズ
○ プラグインという仕組み
他のエディタに対してどうなの
● 圧倒的なまでの編集効率
○ 豊富なカーソル移動手段
○ オペレータ×モーションの組み合わせによる編集
○ 繰り返し操作
○ キーバインド
● 軽量で高速に動作
○ 自分の (Neo)Vim の起動時間は 56 msec でした
CTRLや他の修飾子の使用は最小限に留めよ、
これらはタイプしにくい。
Vim 公式ヘルプドキュメント develop.txt より
他のエディタに対してどうなの
● ターミナルでも動作する
○ SSH 先や Docker コンテナ内でも使える
○ が、最近 VSCode は上記も普通にできるらしいのでメ
リットと言えない状況か
● h, l, j, k でカーソル移動
● i でインサートモードに入る
● 適当に文字を入力
● <Esc> でノーマルモードに戻る
● :w<CR> で保存
● :q<CR> で終了
今何モードかわからない時はとりあえず、<Esc>を連
打すれば良い。
最低限これだけできれば!
2. 基本的なカーソル移動
カーソル移動(横)
❖ h, l で1文字ずつ移動
❖ w, b, e, ge
➢ 単語(word)単位の移動
※ 単語の定義は ’iskeyword’ オプ
ションで設定
hoge fuga-piyo
wb
hoge fuga-piyo
ge e
カーソル移動(横)
❖ W, E, B, gE
➢ 空白区切り(WORD)の単位の移動
➢ 空白以外の文字の塊が単語(WORD)とみなされます。
カーソル移動(横)
❖ f{char}, F{char}
hoge fuga-piyo hogera
fhFe
faFh
カーソル移動(横)
❖ t{char}, T{char}
➢ f,F と同様。ただしカーソルがひとつ手前に来る
❖ ;
➢ 直前の f,F,t,T を繰り返し
❖ ,
➢ 直前の f,F,t,T を逆方向に繰り返し
カーソル移動(横)
❖ ^
➢ 行の先頭の非空白文字へ移動
❖ 0 (ゼロ)
➢ 行の先頭へ移動
❖ $
➢ 行の最後へ移動
  hoge fuga-piyo hogera
$^
0
カーソル移動(縦)
❖ j, k
➢ 1行上(下)に移動
❖ {, }
➢ 上(下)の空行に移動 (本当はちょっと違う)
カーソル移動(縦)
❖ gg, G
➢ 最初(最後)の行に移動
❖ {count}G
➢ {count}行目に移動 (e.g. 100G: 100 行目に移動)
❖ {count}%
➢ ファイルの{count}%の位置に移動 (e.g. 50%: 半分の
位置)
数字との組み合わせ
コマンドの前に数字を前置すると、その回数分の
繰り返しになる
❖ 3h
➢ 3文字左へ移動
❖ 10j
➢ 10行下へ移動
❖ 2w
➢ 2単語分前方へ移動
3. 基本的な編集
❖ x
➢ 1文字削除 (delete 的なの)
❖ dd
➢ 1行削除
hoge hoe
hoge
fuga
piyo
hoge
piyo
削除
※ 行削除した後カーソルがどこに
移動するかは 'startofline'
オプションの値に依存する
※ Vim の削除は他のエディタにおける「切り取り」に近い。
つまり、削除したテキストをあとで貼り付けられる。
本当の削除には "_d を使う。
削除
❖ dw
➢ 単語を削除
➢ カーソルの位置から次の単語の先頭の一つ前まで削除
❖ d$
➢ 行末まで削除
quick brown fox quick fox
quick brown fox quick bfox
quick brown fox quick  
ヤンク(コピーのこと)、貼り付け
Vim ではいわゆるコピーのことを「ヤンク」といいま
す。
❖ yy
➢ 現在の行をヤンク
❖ yw
➢ 単語をヤンク
❖ y$
➢ 行末までヤンク
❖ p
➢ カーソルの後ろに貼り付け
❖ P
hoge
piyo
hoge
piyo
piyo
yyp
数字との組み合わせ その2
編集のためのコマンドも数字との組み合わせ可能
❖ 4x
➢ 4文字削除
❖ 3dd
➢ 3行分削除
❖ 2p
➢ 2回分貼り付け
hoge
fuga
hoge
fuga
hoge
fuga
hoge
fuga
2yyj2p
4. オペレータとモーション
復習
❖ w
➢ 1単語分前方へ移動
❖ dw
➢ 1単語削除
❖ yw
➢ 1単語ヤンク
❖ $
➢ 行末まで移動
❖ d$
➢ 行末まで削除
❖ y$
➢ 行末までヤンク
法則性がある!
オペレータとモーション
オペレータコマンドのあとに移動コマンドを入力す
ると、移動した範囲のテキストを処理できる
数字との組み合わせも可能
オペレータコマンドを2回押すと現在行に作用
d w
オペレータ モーション
オペレータコマンド
❖ d
➢ 削除
❖ y
➢ ヤンク
❖ c
➢ 削除した後インサートモードになる
❖ >, <
➢ インデントを増加/減少(行にしか作用しない:行指向)
❖ =
➢ インデントを自動調整(行指向)
組み合わせ例
❖ d2w
➢ 2単語分削除(2dw と同じ)
❖ yfa
➢ 前方の最初の a までヤンク
❖ ct)
➢ 前方の ) のひとつ手前まで削除してインサートモードになる
❖ 3>>
➢ 3行分のインデントを増加(>2j でも同じ)
❖ =G
➢ 最終行までのインデントを自動調整
テキストオブジェクト
オペレータとの組み合わせの時に使用できる特殊
なモーション
特定の範囲をまとめて操作対象にできる
❖ a", i"
➢ ""(double quote) で囲まれた範囲
➢ a" は " も含めるが i" はその中だけ
"Hello, world"
di"
""
テキストオブジェクト
❖ a), i)
➢ () で囲まれた範囲
➢ a) は a( にしても同じ
➢ a は ) 自身も含める
➢ ) をいろんな括弧に変えてみよう (e.g. }, ], >)
fn main() {
let mut a = 0;
println!("{}", a)
}
di}
fn main() {
}
その他のテキストオブジェクト
❖ at, it
➢ HTML とかのタグ (e.g. <p></p>) に囲まれた範囲
❖ aw, iw
➢ 1単語の範囲
❖ aW, iW
➢ 1単語(WORD)の範囲(≒空白区切りの範囲)
❖ ap, ip
➢ 段落の範囲(≒空行の間の範囲)
オペレータとモーションの拡張
オペレータとモーション(テキストオブジェクト含む)は拡張
可能。
たいていはプラグインを入れて拡張する
例)
❖ tpope/vim-commentary
➢ gc で範囲をコメントアウト
❖ kana/vim-textobj-indent
➢ ai, ii でインデントが同じものをテキストオブジェクトとして扱う
オペレータとモーションの拡張の例
commentary と textobj-indent の組み合わせ
def hello():
a = 1
print(a)
gcai
def hello():
# a = 1
# print(a)
5. モード
❖ ノーマルモード
❖ インサートモード
❖ ビジュアルモード
❖ コマンドラインモード
Vim のモード
インサートモード
❖ 文字を入力するためのモード
❖ インサートモードに入るための手段は豊富に用
意されている
❖ インサートモードの入り方
➢ i : カーソルの前の位置
➢ a : カーソルの後ろの位置
➢ o : カーソルの下の行
➢ O : カーソルの上の行
➢ s : 1文字削除してその位置
➢ S : 行削除してその行
インサートモード
hoge ho|ge
hoge hog|e
hoge hoge
|
hoge |
hoge
hoge ho|e
hoge |
インサートモード
❖ インサートモードの入り方(続き)
➢ I : 行の先頭(非空白文字)から挿入
(インデントのスペースやタブより左には行かない)
➢ gI : 本当に行頭から挿入
➢ A : 行末に挿入
➢ gi : 最後に挿入された位置から挿入
➢ c{motion} : ある範囲のテキストを削除して挿入
hoge |hoge
hoge | hoge
hoge hoge|
インサートモード
❖ インサートモードで使える便利なコマンド
➢ <C-t> : 現在行のインデントを増加
➢ <C-d> : 現在行のインデントを減少
➢ <C-w> : カーソル前の単語を削除
(ただし挿入位置で一旦止まる)
➢ <C-u> : 現在行を削除
           (ただし挿入位置で一旦止まる)
➢ <C-r>" : ヤンク(コピー)した文字列を挿入
ビジュアルモード
ブラウザとか他のエディタにあるようなマウスで
ドラッグするとハイライトされるアレのこと
❖ v
➢ ビジュアルモードになる
The quick brown fox
jumps the lazy dog.
vjhh The quick brown fox
jumps the lazy dog.
The quick brown dog.
d
ビジュアルモード
❖ V (大文字)
➢ 行ビジュアルモード
❖ <C-v>
➢ 矩形ビジュアルモード
The quick brown fox
jumps the lazy dog.
V The quick brown fox
jumps the lazy dog.
The quick
brown fox
jumps the
lazy dog.
ビジュアルモード
❖ ビジュアルモードでオペレータコマンドを入力す
ることで、選択範囲に対して処理を実行できる
The quick brown fox
jumps the lazy dog.
d The quick brown dog.
ビジュアルモード
❖ 矩形ビジュアルモードを使った列編集
a = 1;
b = 2;
c = 4;
Ilet<Space><Esc> let a = 1;
let b = 2;
let c = 4;
コマンドラインモード
● :w とか :q とかを実行するためのモード
○ Ex コマンドやコロンコマンドやコマンドラインコマンドと呼
ぶ
● ファイル操作、検索、置換など割りと複雑なこと
を行うためのモード
ファイル操作
❖ :w[rite]
➢ 上書き保存
➢ 省略して :w
❖ :q[uit]
➢ 現在のウィンドウを閉じるコマンド
➢ Vim の終了コマンドではない!
➢ 省略して :q
❖ :sav[eas] {file}
➢ いわゆる名前を付けて保存
➢ :w {file} とは微妙に違う
❖ :e[dit] {file}
➢ ファイルを開く
検索と置換
❖ /{pattern}
➢ {pattern} を前方検索
➢ 移動コマンドとしても使えるので d/hoge といったことも可能
❖ ?{pattern}
➢ / の後方検索バージョン
❖ :%s/{pattern}/{string}/g
➢ ファイル全体から{pattern}を検索して{string}に置換する
➢ 実は区切りは / でなくても良い
■ :%s#/#hoge#g → / を hoge に置換
6. 繰り返し
単発繰り返し
❖ . (ドット)
➢ 直前のコマンドを繰り返す
hoge fuga piyo
dw
fuga piyo
.
piyo
println(msg)
println("hoge fuga")
println(obj.toString())
println()
println("hoge fuga")
println(obj.toString())
di)
println()
println()
println()
j.j.
マクロ
Excel とかにある操作を記録するやつ
❖ q{a-z}
➢ 操作の記録を開始する
➢ マクロの保存場所は a ~ z までの 26 個
❖ q
➢ 記録を終了
❖ @{a-z}
➢ 記録したマクロを再生する
マクロの例
println(msg)
println("hoge fuga")
println(obj.toString())
qa$ println(msg)
println("hoge fuga")
println(obj.toString())
println(msg + "!")
println("hoge fuga")
println(obj.toString())
i+ "!"<Esc>jq
記録開始
記録終了
println(msg + "!")
println("hoge fuga" + "!")
println(obj.toString() + "!")
@a@a
7. ウィンドウ・タブページ
ウィンドウ分割やタブページを使うことで一度に複
数のファイルを開くことができます
複数のファイルを編集したい
ウィンドウ分割
❖ :split {file}
➢ {file} を水平分割で開く
❖ :vsplit {file}
➢ {file} を垂直分割で開く
❖ <C-w>w
➢ 別のウィンドウへカーソルを移動
➢ <C-w><C-w> でも良い
タブページ
※ 単にタブというと <Tab> 文字のことになるので注意
❖ :tabedit {file}
➢ {file} を新しいタブページで開く
❖ gt, :tabnext
➢ 次のタブページヘ
❖ gT, :tabprevious
➢ 前のタブページヘ
8. ヘルプ
ヘルプドキュメント
Vim には最初からかなりの量のヘルプドキュメント
が用意されている。
Vim の基本的な使い方やコマンドの一覧などにつ
いて調べることが可能
ヘルプの使い方
❖ :help
➢ ヘルプドキュメントの目次を開く
❖ :help w
➢ w というコマンドについて調べる
❖ :help ^w
➢ <C-w> というコマンドについて調べる
❖ :help :w
➢ :w という Ex コマンドについて調べる
❖ :help {topic}
➢ {topic} で検索した結果について調べる
初心者におすすめの :help の記事
❖ :help usr_01
➢ ユーザマニュアル
➢ 基本から応用まで Vim について学べる
➢ usr_01 から usr_12 まで順番に読むと良い
➢ 「Vim テクニックバイブル」や「実践 Vim」よりもまずはユーザマニュアル
を読む
❖ :help quickref
➢ いわゆるチートシートのようなもの
❖ :help option-list
➢ Vim のオプションの一覧
➢ vimrc 書くときに便利
9. その他の機能
❖ 置換モード r, R
❖ 数字のインクリメント、デクリメント <C-a> <C-x>
❖ quickfix
❖ grep
❖ diff
❖ シェルとの連携 w !{command}
❖ マーク m
❖ 折りたたみ
❖ 内部ターミナル
❖ 補完
❖ タグジャンプ
説明するには時間が足りない!
9. カスタマイズ
❖ Vim は自分好みにカスタマイズしよう
➢ 行番号表示したいとか
❖ $HOME/.vimrc というファイルに Vim script と
いう言語で設定を記述する
➢ 最近は $HOME/.vim/vimrc で良くなった
➢ neovim の場合は $XDG_CONFIG_HOME/nvim/init.nvim
vimrc と Vim script
❖ Vim script は分からなくてもある程度は大丈夫
❖ 基本は set コマンドでオプションを設定すると良
い
➢ set number " 行番号
➢ set ignorecase " 検索するとき大文字小文字を無視
➢ set cursorline " 現在行の色を変える
※ " 以降はコメント
vimrc の例
❖ Vim 内部で動作するインタプリタ言語
➢ チューリング完全
➢ 変数、ループ、関数、リスト、辞書、ラムダ式...
➢ 例) 特に意味はないが10行目を強制的に hogefuga にし
て勝手に引数で受け取ったファイル名に保存して閉じる関
数
Vim script
function! Hoge(file) abort
normal 10GShogefuga
execute 'w ' . a:file
q
endfunction
❖ 他の人が書いた Vim script を読み込むことでエディタ機
能を拡張 => プラグイン
➢ 実は python でも書けるらしい (昔はすごく不安定だっ
た)
➢ Neovim の場合は msgpack を使った RPC で任意の
言語で記述可能
■ LanguageClient-neovim
● Rust で書かれた LSP クライアントの Neovim
プラグイン
プラグイン
プラグインの読み込み
❖ プラグインマネージャを別途導入する必要あり
➢ junegunn/vim-plug
■ シンプルで簡単
➢ Shougo/dein.vim
■ 高いカスタマイズ性。上級者向け
■ アップデートで互換性がなくなり動かなくなるときがあ
る
❖ GitHub のリポジトリを直接読み込む
➢ 公式のパッケージリポジトリのようなものはない
10. 私の Vim
❖ いろいろ検索
❖ ディレクトリツリー
❖ 自動補完
❖ エラーチェック
❖ 定義ジャンプ
❖ Git 連携
私の Vim
まとめ
Vim すごい
わからないことは :help で調べる
時間があれば :help を読みましょう
おわり

Vim の話