はじめに
仕事ではWindowsをメインに作業しているため、ターミナルを使用することは稀でした。
ただ、最近はRaspberry Piという便利な制御端末が出てきたり、自前のブログの管理にLinuxを触ったりという機会が増えてきたので、せっかくだからVimを覚えようと思い立ちました。
備忘録的な意味で、覚えたコマンドをメモしていこうと思います。
表記の補足
※ コマンドは基本ノーマルモードでの入力です
※ 「,」区切りで記載しているキーは、対応する複数のキーを示しています
※ 「Shift+v」などは、Shiftを押しながらvを押下することを示しています
初めから知っていたコマンド
これまでもたまにターミナルを使う機会はあったので、最低限以下のようなコマンドは知っていました。
でも、正直これだけだと使いにくいので、最低限の編集に使うだけでした。
Vimはすごい!という話も聞きますが、上達すれば、本当に早く編集できるんでしょうか…と思っていたのが正直なところ。
| キー | 内容 |
|---|---|
| h, j, k, l | キー移動 |
| i | 文字の手前で入力モード切り替え |
| a | 文字の後ろで入力モード切り替え |
| gg | 先頭の行にカーソル移動 |
| G | 末尾の行にカーソル移動 |
| yy | 行コピー |
| dd | 行削除 |
| p | 貼り付け |
| :w | 上書き |
| :wq | 上書き保存して終了 |
| :q | 終了 |
| :q! | 保存せずに強制終了 |
少し調べてみて、覚えたコマンド
ググればたくさんvimのコマンドを紹介しているサイトが出てきます。
ひとまず簡単に使えそうなコマンドを覚えて、できることを増やしていきます。
| キー | 内容 |
|---|---|
| I | 行の先頭で入力モード切り替え |
| A | 行の末尾で入力モード切り替え |
| s | カーソル位置の文字を削除して入力モード切り替え |
| o | 下に1行追加して入力モード切り替え |
| O | 上に1行追加して入力モード切り替え |
| w | 次の単語へ移動 |
| b | 前の単語へ移動 |
| f(指定文字) | 行内の指定文字の位置にカーソル移動 |
| /(指定文字) | 指定文字を検索。nを押すとさらに次の文字を検索。Shift+nで上方向へ検索 |
| $ | 行末尾にカーソル移動 |
| ^ | 行先頭にカーソル移動 |
| % | 対応するカッコに移動 |
| (行番号)G | 指定行番号の行にカーソル移動 |
| u | アンドゥ |
| Ctrl+r | リドゥ |
| J | 次の行と連結する |
一文字だけ置き換えたい時はs、先頭に移動して編集したい時はI、末尾に移動して編集したい時はAなど、バリエーションが少し増えてきたので、多少編集しやすくなってきました。
ビジュアルモードを知る
これまで、コマンドを実行するノーマルモードと、文字を直接編集する入力モードは知っていましたが、範囲選択ができるビジュアルモードもあることを知りました。
イメージとしては、マウスで特定の範囲を選択するような感じです。
vキーを押下して、キー移動をすると、vキーを押した位置を始点として、移動した位置までの範囲が選択状態になります。
選択した範囲に対して、編集、削除等の操作が行えます。
vキーに続けていろんなコマンドを押下することで、選択の方法もかなりバリエーションがあります。
| キー | 内容 |
|---|---|
| v | 文字単位選択のビジュアルモードに切り替え |
| Shift+v | 行単位選択のビジュアルモードに切り替え |
| Ctrl+v | ビジュアルモードに切り替え、矩形選択ができる |
| v$ | vキーを押下した位置から行末尾まで選択 |
| v^ | vキーを押下した位置から行先頭まで選択 |
| vw | vキーを押下した位置から、次の単語までを選択 |
| viw | vキーを押下した位置の単語を選択 |
| vaw | vキーを押下した位置の単語と後の空白を選択 |
| va" | vキーを押下した位置の単語を前後の"を含めて選択 |
また、同様にdやyコマンドも、同じように使えることを知りました。
例えば、yiwでyキーを押下した位置の単語をコピー、dawでdキーを押下した位置の単語を削除など。
思った通りに編集できると、少し楽しくなってきました。
コマンドに繰り返しの数値を組み合わせる
いくつかのコマンドは、コマンドの前に数値を入れることで繰り返しの回数を指定できます。
| キー | 内容 |
|---|---|
| 2h,2j,2k,2l | 各方向に2文字移動 |
| 3yy | 3行コピー |
| 4dd | 4行削除 |
| 5J | 5行連結 |
数値をインクリメント、デクリメントする
数値の上で、以下のコマンドを打つと、数値のインクリメント、デクリメントができます。
プログラムを作っていると、1足したい、1引きたいという場面があるので、地味に便利です。
これまで使用していたテキストエディタではありえなかった機能なので、最初知った時は面白く思いました。
インクリメントしていって、9になると、次は0に戻るのかと思っていたら、ちゃんと桁が繰り上がります。
| キー | 内容 |
|---|---|
| Ctrl+a | 数値をインクリメント |
| Ctrl+x | 数値をデクリメント |
コピーした文字列の連続貼り付け
ある文字列をコピーして、複数の場所で貼り付けたいと思うことがよくあるのですが、以下のような場合にうまくいきません。
var test = "エラーメッセージ"
MessageBox.Show("エラー1");
Log.Output("エラー2");
このようなコードで、2行目、3行目の"エラー"の部分を、1行目の変数testで置き換えたいとします。
① 1行目のtestの部分でyiwコマンドで文字列「test」をコピー
② 2行目の"エラー"の部分でva"コマンドで「"エラー1"」を選択
③ pコマンドで、選択した文字列を削除して、「test」を貼り付け
④ 3行目の"エラー"の部分でva"コマンドで「"エラー2"」を選択
⑤ pコマンドで、選択した文字列を削除して、「test」を貼り付けたいが、③で削除した"エラー1"が貼り付いてしまう
vimの動作として、文字列を削除した時は切り取りと同じ動作になるようですので、連続でコピーした文字を貼り付けようとするとうまくいきません。
いろいろと調べていると、ひとまず以下の方法で連続コピーができました。
③の操作の際に、ca"コマンドで対象文字列を削除して入力モードに切り替え、その上でCtrl+rを押してから0を押下します。
vimでコピーした時はレジスタ0という場所にコピーされるそうで、
Ctrl+rを押してから0を押すと、このレジスタ0の文字列を貼り付けるという意味になるそうです。
削除した時は、別のレジスタに保管されるため、このような動作になるようです。
ちょっと回りくどいですが、ひとまず連続コピーが実現できました。
ただ、もう少し簡単な方法があればいいんですが...
また新しいコマンドを覚えたら追記予定です。