はじめに
この記事は「実践Vim」を読んで得られた気付きや考え方を書籍の内容に沿ってまとめています。
何度かに分けて書いていますので関連記事も是非!
- 「実践Vim」を読んで得られた考えをまとめてみた1(ドットコマンド・ノーマルモード)
- 「実践Vim」を読んで得られた考えをまとめてみた2(挿入モード・ビジュアルモード)
- 「実践Vim」を読んで得られた考えをまとめてみた3(コマンドラインモード)
各TIPのまとめ
第5章 コマンドラインモード
TIP27: Vimのコマンドラインモード
→Exコマンドは一度に大量の行を処理できる。
:でコマンドラインモードになります。
コマンドラインモードで使えるコマンドは実は非常に多いのです。
以下はバッファ内のテキストに作用するExコマンドですが、ノーマルモードのコマンドに対応するものもあります。
コマンド | 内容 | ノーマルモードで対応するコマンド |
---|---|---|
:delete(:d) | 指定行を削除 | d |
:yank(:y) | 指定行をヤンク | y |
:put(:p) | 指定行の下にプット | p |
:join(:j) | 指定行を連結 | J |
:copy {address}(:co {address}, :t {address}) | 指定行を{address}で示される行の下にコピー | |
:move {address}(:m {address}) | 指定行を{address}で示される行の下に移動 |
コマンドラインモードのコマンドでよく知られているのは
- :substitute(:s)
- :write(:w)
- :quit(:q)
でしょう。
:%s/検索文字列/置換文字列/g
で一括置換はよくやりますし、当然保存や終了もやるでしょう。
ですが、今挙げたコマンドも覚えておくと便利です。
ノーマルモードのコマンドでやれることがコマンドラインモードでも実現できるのは理由があります。
現在のカーソルから離れたところを広範囲に編集できるのです。(多くのコマンドは範囲指定ができます。)
:%sも全行に対して置換をかけていることから、同様の考え方で成り立っていることがわかります。
TIP28: 連続する行に対してコマンドを実行する
→範囲指定のやり方もいろいろ。パターンマッチ、オフセットも使える /search/+1,/search/-1 仮想的な先頭行「0」も指定できる
コマンドラインモードはアドレスを入力することで編集範囲を指定します。
編集範囲は開始行,終了行というような指定方法ですが、
- 仮想的な先頭行(0)を指定できます。
- パターンマッチを指定できます。(パターンにマッチする行だけ編集対象にできます。)
- オフセットも使えます。
/<html>/+1,/<\/html>/-1d
での1行下からの1行上までを削除できます。コマンドラインモードの範囲指定は柔軟です。
以下はアドレスに使える記号ですが、これらを組み合わせて指定します。
記号 | 意味 |
---|---|
1 | 1行目 |
$ | 最終行 |
0 | 1行目の前にある仮想的な行 |
. | 現在行 |
% | 全行(1,$) と同じ |
,で範囲指定ができる(2,6 → 2行目から6行目) |
TIP29: 「:t」/「:m」コマンドで行をコピー/移動
→Exコマンドのコピー、移動も有効。カーソルから遠くの行もすぐに操作でき、レジスタに保存されないようにもできる。
yypやddpなどでもできることですが、コマンドラインモードでも複製や移動が用意されています。
もちろんカーソルから離れたところに編集をかけることができる特長を持ちます。
:tや:mを使うとレジスタに保存されないようにもできます。
globalコマンドと組み合わせて使いこなせれば強力です。
TIP30: 選択範囲に対してノーマルモードのコマンドを実行する
→normalコマンドは@と組み合わせるとさらに強力
同じ編集が50行も100行も必要になることがあります。
こんなときは、ビジュアルモードで範囲指定をしてからnormalコマンドでマクロを指定すると何度も繰り返す必要はありません。
normalコマンドはコマンドラインモードからノーマルモードのキーストロークを実行させるコマンドです。
このとき、「挿入モードに入ってキーを入力して、抜けて;まで飛んで...」などをそのまま指定しようとすると間違いやすいです。
normal @qなどとしてキーストロークをマクロで指定するとよいでしょう。
TIP33: カーソル位置にある単語をコマンドプロンプトに挿入
→コマンドラインモードでは、C-r C-wでカーソル位置にある単語を入力
コマンドラインモードではカーソル位置の単語をで入力できます。
私はマウスも使うので普通に貼り付けてしまいますが、キーボードオンリーだと便利かもしれません。
TIP34: 履歴からコマンドを呼び戻す
→コマンドラインウィンドウで、Exコマンド履歴を編集して実行できる
q:(:qではない)でコマンドラインウィンドウを開き、コマンド履歴を参照できます。
コマンド履歴でもVimの操作ができるのです。
つまり、前回のコマンドをノーマルモードのコマンドで修正したり、
2つのコマンドをJでくっつけて調整して、1行のコマンドラインにできます。
TIP35: シェルでコマンドを実行
→外部コマンドやプログラムで編集できる。
:read !{cmd}
で外部プログラムを実行して、標準出力を現在行の下に挿入できます。
範囲指定した箇所は標準入力になります。
外部プログラムはシェルのコマンドでもawkでもPHPでもRubyでも何でもOKです。
どんなやりかたでもテキストの編集ができるわけです。