Vim の話2. 私と Vim
❖ 2011年 (新卒入社時) くらいから使ってる
❖ vimrc 1000行超え
❖ プラグイン3つくらい作った
❖ 昔、Nagoya.vim という勉強会もやっていた
❖ この資料は昔の Nagoya.vim での説明資
料に加筆修正したものです。(当時は2013
年)
5. Vim ってなんなの ...
● Vim は高機能なテキストエディタ
○ もしくは環境、VM
● モードを持つ
○ カーソル移動やテキストの編集を行うノーマルモード
○ 文字の入力を行うインサートモード
○ 様々な処理を実行するコマンドラインモード
○ などなど
○ (Wikipedia によると全部で 11 のモードがあるらしい)
6. Vim ってなんなの ...
● キーボード中心の操作
○ マウスは基本使わない (使うこともできる)
○ ホームポジションから打ちにくいキーも使わない (矢印
キー)
● カスタマイズ可能
○ Vim script というとても味わい深い言語でカスタマイズ
○ プラグインという仕組み
9. ● h, l, j, k でカーソル移動
● i でインサートモードに入る
● 適当に文字を入力
● <Esc> でノーマルモードに戻る
● :w<CR> で保存
● :q<CR> で終了
今何モードかわからない時はとりあえず、<Esc>を連
打すれば良い。
最低限これだけできれば!
11. カーソル移動(横)
❖ h, l で1文字ずつ移動
❖ w, b, e, ge
➢ 単語(word)単位の移動
※ 単語の定義は ’iskeyword’ オプ
ションで設定
hoge fuga-piyo
wb
hoge fuga-piyo
ge e
17. カーソル移動(縦)
❖ gg, G
➢ 最初(最後)の行に移動
❖ {count}G
➢ {count}行目に移動 (e.g. 100G: 100 行目に移動)
❖ {count}%
➢ ファイルの{count}%の位置に移動 (e.g. 50%: 半分の
位置)
20. ❖ x
➢ 1文字削除 (delete 的なの)
❖ dd
➢ 1行削除
hoge hoe
hoge
fuga
piyo
hoge
piyo
削除
※ 行削除した後カーソルがどこに
移動するかは 'startofline'
オプションの値に依存する
※ Vim の削除は他のエディタにおける「切り取り」に近い。
つまり、削除したテキストをあとで貼り付けられる。
本当の削除には "_d を使う。
21. 削除
❖ dw
➢ 単語を削除
➢ カーソルの位置から次の単語の先頭の一つ前まで削除
❖ d$
➢ 行末まで削除
quick brown fox quick fox
quick brown fox quick bfox
quick brown fox quick
27. オペレータコマンド
❖ d
➢ 削除
❖ y
➢ ヤンク
❖ c
➢ 削除した後インサートモードになる
❖ >, <
➢ インデントを増加/減少(行にしか作用しない:行指向)
❖ =
➢ インデントを自動調整(行指向)
28. 組み合わせ例
❖ d2w
➢ 2単語分削除(2dw と同じ)
❖ yfa
➢ 前方の最初の a までヤンク
❖ ct)
➢ 前方の ) のひとつ手前まで削除してインサートモードになる
❖ 3>>
➢ 3行分のインデントを増加(>2j でも同じ)
❖ =G
➢ 最終行までのインデントを自動調整
30. テキストオブジェクト
❖ a), i)
➢ () で囲まれた範囲
➢ a) は a( にしても同じ
➢ a は ) 自身も含める
➢ ) をいろんな括弧に変えてみよう (e.g. }, ], >)
fn main() {
let mut a = 0;
println!("{}", a)
}
di}
fn main() {
}
31. その他のテキストオブジェクト
❖ at, it
➢ HTML とかのタグ (e.g. <p></p>) に囲まれた範囲
❖ aw, iw
➢ 1単語の範囲
❖ aW, iW
➢ 1単語(WORD)の範囲(≒空白区切りの範囲)
❖ ap, ip
➢ 段落の範囲(≒空行の間の範囲)
37. ❖ インサートモードの入り方
➢ i : カーソルの前の位置
➢ a : カーソルの後ろの位置
➢ o : カーソルの下の行
➢ O : カーソルの上の行
➢ s : 1文字削除してその位置
➢ S : 行削除してその行
インサートモード
hoge ho|ge
hoge hog|e
hoge hoge
|
hoge |
hoge
hoge ho|e
hoge |
38. インサートモード
❖ インサートモードの入り方(続き)
➢ I : 行の先頭(非空白文字)から挿入
(インデントのスペースやタブより左には行かない)
➢ gI : 本当に行頭から挿入
➢ A : 行末に挿入
➢ gi : 最後に挿入された位置から挿入
➢ c{motion} : ある範囲のテキストを削除して挿入
hoge |hoge
hoge | hoge
hoge hoge|
41. ビジュアルモード
❖ 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.
44. コマンドラインモード
● :w とか :q とかを実行するためのモード
○ Ex コマンドやコロンコマンドやコマンドラインコマンドと呼
ぶ
● ファイル操作、検索、置換など割りと複雑なこと
を行うためのモード
45. ファイル操作
❖ :w[rite]
➢ 上書き保存
➢ 省略して :w
❖ :q[uit]
➢ 現在のウィンドウを閉じるコマンド
➢ Vim の終了コマンドではない!
➢ 省略して :q
❖ :sav[eas] {file}
➢ いわゆる名前を付けて保存
➢ :w {file} とは微妙に違う
❖ :e[dit] {file}
➢ ファイルを開く
46. 検索と置換
❖ /{pattern}
➢ {pattern} を前方検索
➢ 移動コマンドとしても使えるので d/hoge といったことも可能
❖ ?{pattern}
➢ / の後方検索バージョン
❖ :%s/{pattern}/{string}/g
➢ ファイル全体から{pattern}を検索して{string}に置換する
➢ 実は区切りは / でなくても良い
■ :%s#/#hoge#g → / を hoge に置換
48. 単発繰り返し
❖ . (ドット)
➢ 直前のコマンドを繰り返す
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.
53. ウィンドウ分割
❖ :split {file}
➢ {file} を水平分割で開く
❖ :vsplit {file}
➢ {file} を垂直分割で開く
❖ <C-w>w
➢ 別のウィンドウへカーソルを移動
➢ <C-w><C-w> でも良い
54. タブページ
※ 単にタブというと <Tab> 文字のことになるので注意
❖ :tabedit {file}
➢ {file} を新しいタブページで開く
❖ gt, :tabnext
➢ 次のタブページヘ
❖ gT, :tabprevious
➢ 前のタブページヘ
57. ヘルプの使い方
❖ :help
➢ ヘルプドキュメントの目次を開く
❖ :help w
➢ w というコマンドについて調べる
❖ :help ^w
➢ <C-w> というコマンドについて調べる
❖ :help :w
➢ :w という Ex コマンドについて調べる
❖ :help {topic}
➢ {topic} で検索した結果について調べる
58. 初心者におすすめの :help の記事
❖ :help usr_01
➢ ユーザマニュアル
➢ 基本から応用まで Vim について学べる
➢ usr_01 から usr_12 まで順番に読むと良い
➢ 「Vim テクニックバイブル」や「実践 Vim」よりもまずはユーザマニュアル
を読む
❖ :help quickref
➢ いわゆるチートシートのようなもの
❖ :help option-list
➢ Vim のオプションの一覧
➢ vimrc 書くときに便利
60. ❖ 置換モード r, R
❖ 数字のインクリメント、デクリメント <C-a> <C-x>
❖ quickfix
❖ grep
❖ diff
❖ シェルとの連携 w !{command}
❖ マーク m
❖ 折りたたみ
❖ 内部ターミナル
❖ 補完
❖ タグジャンプ
説明するには時間が足りない!
62. ❖ Vim は自分好みにカスタマイズしよう
➢ 行番号表示したいとか
❖ $HOME/.vimrc というファイルに Vim script と
いう言語で設定を記述する
➢ 最近は $HOME/.vim/vimrc で良くなった
➢ neovim の場合は $XDG_CONFIG_HOME/nvim/init.nvim
vimrc と Vim script
63. ❖ Vim script は分からなくてもある程度は大丈夫
❖ 基本は set コマンドでオプションを設定すると良
い
➢ set number " 行番号
➢ set ignorecase " 検索するとき大文字小文字を無視
➢ set cursorline " 現在行の色を変える
※ " 以降はコメント
vimrc の例
64. ❖ Vim 内部で動作するインタプリタ言語
➢ チューリング完全
➢ 変数、ループ、関数、リスト、辞書、ラムダ式...
➢ 例) 特に意味はないが10行目を強制的に hogefuga にし
て勝手に引数で受け取ったファイル名に保存して閉じる関
数
Vim script
function! Hoge(file) abort
normal 10GShogefuga
execute 'w ' . a:file
q
endfunction
65. ❖ 他の人が書いた Vim script を読み込むことでエディタ機
能を拡張 => プラグイン
➢ 実は python でも書けるらしい (昔はすごく不安定だっ
た)
➢ Neovim の場合は msgpack を使った RPC で任意の
言語で記述可能
■ LanguageClient-neovim
● Rust で書かれた LSP クライアントの Neovim
プラグイン
プラグイン