前書き
Vimについてずっと勉強したかったのですが、
最近にやっと勇気を出てキャッチアップして、
VSCとIdea両方にVimのプラグイン・エクステンションを入れて、
一ヶ月Vimのみのプログラミングを挑戦してみました。
結論を先に言いますと、
最初は確かにいろいろ苦労したけど、
でも使えば使えるほど手ごたえを感じていて、
「めっちゃ便利だ!」というレベルほど上手にはなってないだけど、
これからずっとVimを利用して開発してもそんなに抵抗感がないなぐらいの実感です。
今回の記事では、
自分がこの一ヶ月間でVimを使ってみて、
どんなコマンドを一番使っているか、
統計的にな意味合いで「どんなコマンドからVimを勉強すればよいか?」、
のヒントやアドバイスになれればいいなと思います。
カーソル動く系
使用頻度(高):hjkl
- h:←
- j:↓
- k:↑
- l:→
最初はちょっと「どれがどれだっけ」を考えながらやってたんですが、
一ヶ月も経ったので、
今は思わず自由自在に←↓↑→をコントロールできます。
使用頻度(高):w
l
で文字ごとに一個一個右に移動させるのはだるいので、
w
が方が早いですね。
単語毎にカーソルを右方向に移動させる。
使用頻度(中):e
基本的にw
を使う場合が多いのですが、
w
で行き過ぎた場合に、e
を使います。
単語ごとに単語の最後の文字に移動させる。
使用頻度(やや高):b
w
の逆ですが、h
で一個一個移動させるのもだるいので、
だるいと感じたらb
を使い始めるイメージです。
単語ごとに前の単語に移動させる。
使用頻度(中):gg と G
ログを見るときとか、一番下の行に何かを追加した場合に、gg/Gを利用する場合がありますね。
- gg: 一番上に
- G:一番下に
使用頻度(中):数字G
特定の行に行きたい場合にこれを使います。
でも大体のIDEはCtrl + G
で同じ機能をサポートしているので、
Ctrl + G
を使った方が便利の気がします。
でもVimのエクステンションやプラグインを入れる場合に、元の
Ctrl + G
が使えなくなるので、
手動でVim側のCtrl + G
を外す必要があります。
使用頻度(中):{ と }
jjjjjjj
をずっと打つことも面倒くさいし、10j
とか42j
とかもあるけど、
{
と}
はやはりたまに使います。
段落ごとにカーソルを移動させる。
- {:上の段落
- }:下の段落
使用頻度(中):N / n
前・次の検索結果に移動させる。.
と併用する場合が多いです。
- N:前に
- n:次に
使用頻度(中):0w
これは便利かもしれませんが、ちょっと0
が若干遠いので
行の先頭の単語に移動させる。
もし先頭に空白が存在していない場合に、
0
だけで十分です。
if (a) {
const b = 42;
// ↑ cursor is here
}
// 0wを押した後
if (a) {
const b = 42;
//↑ cursor will go to here
}
I
+ Esc
+ l
と一緒。
使用頻度(中):-
一個上の行の先頭(空白を全部飛ばす)に移動させる。
if (a) {
const b = 42;
// ↑ cursor is here
}
// -を押した後
if (a) {
↑ // cursor will go to here
const b = 42;
}
if (a) {
const b = 42;
const c = b + 1;
// ↑ cursor is here
}
// -を押した後
if (a) {
//↓ cursor will go to here
const b = 42;
const c = b + 1;
}
使用頻度(高):*
カーソル下の文字を検索できます。
特に関数や変数に遷移したい場合に結構便利ですね。
// ↓ cursor is here
const foo = () => {};
foo();
// *を押した後
const foo = () => {};
foo();
↑ // cursor will go to here
-
と*
は@Pseudonymさんの提供です、ありがとうございます!
使用頻度(中):$
行の最後に移動する場合に、基本的に何かを挿入したいケースが多いので、
A
を使う方がおおですね。
また$
を使いたい場合でも、A
Esc
を使う場合が多いです。
カーソルを行の最後に移動させる。
使用頻度(中):t文字 / f文字
- t文字:文字の一個前のポジションにカーソルを移動させる。
- f文字:文字のポジションにカーソルを移動させる。
const a ='hello world'
// ↑ cursor is here
// tlを押した後
const a = 'hello world'
// ↑ cursor will go to here
const a ='hello world'
// ↑ cursor is here
// foを押した後
const a = 'hello world'
// ↑ cursor will go to here
// もう一回fo
const a = 'hello world'
// ↑ cursor will go to here
ヒント: なるべく頻度の低い文字でジャンプ。これで操作の回数を減らせます。
モード切り替え
使用頻度(高):Esc
なるべくINSERTモードを入らないように、
何かをインプットした後に、すぐESC
を押す習慣ができました。
基本的にNORMALモードにするべきです。
使用頻度(高):i
それはそうだね、何かを挿入したいときに、i
でINSERTモードに入るわけですね。
使用頻度(中):I
カーソルを行の先頭に移動させ、INSERTモードに入る。
0i
と一緒。
使用頻度(やや高):a
i
とちょっと似ているのですが、たまにはa
とi
を使い分けられると気持ちが良くなります。
カーソルの一個後ろの文字にINSERTモードに入る。
i→
と一緒。
使用頻度(中):A
これはあまり目立たないだけど、以外と高い頻度で利用しています。
行の最後にカーソルを移動させ、INSERTモードに入る。
$a
と一緒。
使用頻度(高):o
改行したいときに、新しい行を追加したい場合とか結構あるので、
よく活用しています。
A
+Enter
と一緒。
使用頻度(中):O
たまには前の行に何かを挿入したい場合にこれを使いますね。
kA
+Enter
と一緒。
NORMALモードのままの操作
使用頻度(高):dd
行を削除することが結構あるので、めっちゃ使っています。
現在行を削除する。
使用頻度(やや高):D
これも以外と使っています。
特に=
にカーソルを移動させて、D
で=
の右側を全部削除するとかのケースの場合。
const a = 'some string here';
// ↑ cursor is here
// Dを押した後
const a = '
// 上記になる
現在のカーソルの右側全てを削除する。
d$
と一緒。
使用頻度(高):dw
これは一番使われるケースなので、当然:高です。
単語一個削除する。
使用頻度(高):dt文字 と df文字
やっぱりdwdwdwdw
は面倒くさいと思う時があるので、
例えば:
const greeting = 'Hello World!!';
// cursor is here ↑
// dwdwdwを押した後
const greeting = '
const greeting = 'Hello World!!';
// cursor is here ↑
// dt'を押した後
const greeting = '';
const greeting = 'Hello World!!';
// cursor is here ↑
// df!を押した後
const greeting = '!';
ちょっと練習が必要ですが、
慣れてしまうと意外と使いやすいです。
- dt + 文字: それぞれ特定の文字まで
- df + 文字:特定の文字(含む)まで
を全部削除する。
使用頻度(やや高):C
D
と似ていますが、現在のカーソルの右側全てを削除する。また、INSERTモードに入る。
Da
と一緒。
使用頻度(高):cw
特に変数の名前を変更したい場合によく利用してます。
dw
と似ていますが、現在の単語を削除して、INSERTモードに入る。
dwi
と一緒。
使用頻度(やや高):ct文字 と cf文字
dt
とdf
と似ているのですが、該当の単語を削除してINSERTモードに入る。
使用頻度(中):v
まあこれが便利ですが、何かを選択して次にコピーとか、削除とか、修正とかしたい場合に利用することが多いですが、
私はあまり利用していないですね。
VISUALモードに入る。
使用頻度(高):V
意外とこれがよく使っています。
行ごとに選択する。
例えば複数行を削除したい場合に、
私はdddddd
で三行を削除するのではなく、
Vjjd
を利用することが多いですね。
なんか何かを選択してから操作するのほうが安心ですね。
使用頻度(高):.
よくある利用例としては、cw
で単語を変更しました、
別のところの同じ単語があれば、それにフォーカスして.
を押すと、
その単語も同じように変更できます。
一個前の操作をリピートする。
dddddd
= dd..
使用頻度(中):~
変数名のcamelCaseがちゃんとなっていない場合にこれを使います。
わざわざINSERTモードに入って、削除して、新しい文字を入力して、とかの操作をしなくても済むので。
大文字・小文字に変更するコマンドです。
使用頻度(中):/キーワード
Ctrl + F
と同じイメージですね。
IDEのCtrl + F
は便利なので、あまり/
を利用していないですが、.
と併せて利用すると以外と便利です。
例えば:
n
-> .
-> n
-> .
。
というイメージで、次にマッチした文字列に行って操作をリピートする、また次に行って操作をリピートするとかです。
使用頻度(高):x
dw
でうまく意図通りに削除してくれない場合に、xxxx
を連打します。
連打にストレスを感じたら、v
でVISUALモードに入って削除したい文字列をw
とl
を併せて選択して削除しましょう。
使用頻度(高):u
誰だってミスするのでこれは高でしょう。
一個前の操作を取り消すコマンドです。
使用頻度(高):Ctrl + r
誰だってミスをさらにミスするのでこれも高でしょう。
u
の操作を取り消すコマンド?たぶんそういうイメージです。
使用頻度(中):s
cw
を使うケースが多いので、s
をあまりって感じですね。
カーソルの文字or選択した文字列を削除してINSERTモードに入る。
使用頻度(中):yw
たまには単語をコピーしたいですが、
でもちょうど単語にフォーカスしていないと、わざわざ単語にカーソルを移動させるのも面倒くさいので、
あまり利用していないですね。
単語をコピーする。
使用頻度(高):yy
これは結構利用しています。
一行をコピーする。
使用頻度(高):p
正しくペーストするためにカーソルのポジションを正しくなってないと、
ペーストが意図通りにならないことをさんざん経験しました。(単語の最後の文字以前にペーストしてしまったとか)
皆様同じような悩みがありますかね?
コピーしたものをペーストする。
// コピーした文字列:world
const a ='hello'
// ↑ cursor is here
const a = 'hello'world
//pを押した後
const a ='hello'
// ↑ cursor is here
const a = 'helloworld'