どこまで知ってる?使いこなせてる?よく使う便利なVimコマンドまとめ

今日は基本的なところから、僕が普段よく使う便利なコマンドをまとめてみました。
ここまで知っててかつ使いこなせてれば「Vimでコーディングしてます」と胸を張って言えるのではないでしょうか。

基本的な動作編(初心者向け)

超超基本

実践的なコマンドに行く前にとりあえず基本的なところから。

入力モードに切り替え

(コマンドモード中に)
i
もしくは
a

iはカーソル上の前から入力モードになり、
aはカーソル上の後ろから入力モードになります。
※慣れるまではiだけ使っておけばよいかと。

コマンドモードに切り替え

(入力モードモード中に)
[esc]ボタン

※他にも

  • ctrl + c
  • ctrl + [

でも入力モードからコマンドには切り替えられますが、
vim初心者な方はescボタンで抜けられるということを覚えておけば問題ないです。僕もほぼescで抜けてます。

カーソルの移動

※もちろんテンキーでも移動は可能ですが・・・

左に移動

h

下に移動

j

上に移動

k

右に移動

l

実用編

さて、ここから僕がコーディング中によく使う便利なコマンドの紹介です
※指定がない場合はすべてコマンドモード中に入力するという前提で書いていきます。

行の先頭から入力したい

I(大文字のi)

カーソルを先頭に移動させた上で自動的に入力モードになります。
ケースとしては、
カーソルが行の真ん中ぐらいにあるところから一気に行の先頭に何か文字を打ちたいときに使えます。

行の末尾から入力したい

A

カーソルを末尾に移動させた上で自動的に入力モードになります。
これも行の真ん中から一気に末尾に入力したいときですね。

カーソル上の文字を1文字を削除して入力モードに移りたい

s
たまに使います。
1文字だけ書き換えたいときとか使えたりしますが、
1文字置換するだけなら、rコマンドのほうが有能です。次に紹介します。

カーソル上の1文字を置換したい

r (を押して置換後の文字を入力)
地味ですがかなりの頻度で使います。

カーソル上の文字に続く文字をどんどん置換していきたい

R (を押して置換後の文字を続けて入力。終わったらescを押す)
REPLACEモードに移り、入力した文字にどんどん置換していきます。
「便利じゃん」と思われそうですが、僕はあまり使いません。
なぜなら別のコマンドのほうが個人的には便利なのです。
応用編として後ほど紹介しますが、
ciw
ciW
といったコマンドのほうが便利だったりします。

文字を削除したい

x
よく使いますね。(もちろん入力モードであればバックスペースが使えます)

改行したい

o
もしくは、
O
小文字のほうはカーソルがある行の下に空白行を入れて入力モードに、
大文字のほうはカーソルがある行の上に空白行を入れて入力モードになります。
※改行だけをするコマンド(入力モードにならない)は実は知らなかったりします。誰か知ってたら教えてください。

【tips】

  • 小文字のiのときはカーソルのすぐ手前、大文字のIのときは先頭から
  • 小文字のaのときはカーソルのすぐ後ろ、大文字のAのときは末尾から

といった形で大文字と小文字でできることは同じなんだけど微妙に動きが違うコマンドがある
というのを覚えておくとこれから書いていくコマンドも結構覚えやすいかと思います。

行を一気に削除したい

dd
行を丸っと消したいときに使えます。
deleteのdと覚えてます。

行をコピーしたい

yy
こちらは行を丸っとコピーしたいときですね。
yankのyと覚えてます。
※yank(ヤンクについては後述します)

行を一気に削除してそのまま入力モードに移りたい

cc
もしくは、
S(大文字)
基本的にはccのほうを使ってます。
両者の違いについてですが、
・ccは削除した行がヤンクされる
・Sはヤンクされない
です。

コピー(ヤンク)した行を貼り付けたい

p (カーソルの下の行に貼り付け)

P (カーソルの上の行に貼り付け)
yyでヤンクした行はもちろん、ddで削除した内容もヤンクされていますので、
「この行を消して別の行に移動させたい」
といったときはddで消してpで貼り付けるといった形でよく使います。

【tips】

上記で言っているコピーは、厳密にはヤンクするという表現が正しいです。
何が言いたいかというと、ctrl + cでコピーした場合とは違うという意味です。
ヤンクはvimのメモリ上に保管しているといった理解で良いかと。

間違えた操作をやり直したい

u
間違えてddで行を消してしまったときや、入力モードにならずにソースコードを貼り付けてわけがわからなくなったときに使えます。
いわゆるテキストエディタとかで使う、ctrl + zと同じです。
undoのuと覚えるといいですね。

ちょこっとソースを書き換えて保存して(ファイルは閉じず)に別窓でプログラムを実行して動作を確認して、またもとに戻す。みたいなことするときによく使います。

やり直しをやり直したい

ctrl + r
uでやり直したけど、やっぱり前ののほうがよかったなってときに使います。
redoのrと覚えましょう。
またこれはctrlと合わせて押すということに注意を。
テキストエディタとかだとctrl + yにあたるのかな?(エディタによってはできたりできなかったり)

行の先頭にカーソルを移動したい

0(数字のゼロ)

^

でいけます。割りと使います。両方共覚えておきましょう。

行の末尾にカーソルを移動したい

$

です。先頭に移動するやつもそうですが正規表現を触ったこと方であればしっくりきますね。

ファイルの先頭行に飛びたい

gg
割りと使います。
覚え方は微妙ですが、よく使うので覚えておきましょうw

ファイルの末尾に飛びたい

G
これも割りと使います。

【tips】

正直僕もggとGどっちがどういう意味かは覚えていません。
コーディングとかしてて先頭行きたいなって思った時とりあえずggがGを押してみて確認することがほとんどです。
何が言いたいかって細かくは覚える必要はないんやでってことです。
カーソル移動のhjklだってファイル開いたら適当にキーボードのhjklあたりを叩いて、
確認してるぐらいです。(っていうかvimmerはみんなそうだと信じてます)

今編集してるファイル名が知りたい

ctrl + g
意外と使います。

ビジュアルモードに移る

v
ビジュアルモードに移った後に、カーソル移動させることでいわゆる「選択」ができます。
これ単体でどうこう便利ということは無いのですがここまで紹介したコマンドと合わせて便利です。
選択した後に、xを押すことで文字が削除されたり、sであれば削除して入力モードに移ります。
また、
V
でカーソル上の行を一気に選択できます
この状態でカーソルを上下に移動させれば複数行を一気に選択できて、
dで消したりできます。(ビジュアルモード中だとddではなくdでいけるんですよね)
yとかcとも組み合わせるとわりと便利です。

また、僕はソースを人に見せたり、
「ここがコードがよろしくなさそうなんですけど」
とか言うときに、
V
で選択して見えやすいようにしたりします。
地味に便利。

単語単位でカーソル移動したい

w(右側に移動)
b(左側に移動)
単語単位で移動が可能です。

単語単位でがつんとカーソル移動したい

W(右側に移動)
B(左側に移動)
大文字の場合は単語単位というよりは次のスペースまで一気に移動するって表現が正しいのかな?

次に登場するとある文字まで移動したい

f(を押してから移動したい文字を入力)

例えば、

「my name is chat」

という文があってnのところカーソルがある状態で、

f h

と押すと一気にchatのhの位置まで移動ができます。月に一回ぐらい使うかもです。

実用編(スクロール系)

表示されているページ分、下にスクロールしたい

ctrl + f
ちまちまとjを連打してスクロールするより格段に早いです。
forwardのfで覚えてます。

え?一気にスクロールされてしまうのはちょっと嫌?じゃあ次のコマンドです。

ページ半分だけ下にスクロールしたい

ctrl + d
これは半分ずつ下にスクロールしてくれます。
downのdですかね。

fもdも結構使うので覚えておくと便利です。

1行ずつ下にスクロールしたい

ctrl + e
普通にjを押すとカーソルを下まで移動させないとスクロールできませんが、
これを使うとカーソルがどこにいてもその場で下にスクロールできます。
使用頻度としてはあまり多くないです。思い出したら使うぐらい^^;

表示されているページ分、上にスクロールしたい

ctrl + b
ちまちまとkを連打してスクロールするより格段に早いです。
backのbで覚えてます。

ページ半分だけ上にスクロールしたい

ctrl + u
これは半分ずつ下にスクロールしてくれます。
upのuですかね。

これらも割りと使いますね。

1行ずつ上にスクロールしたい

ctrl + y
ほぼ使わないです^^;
理由は多分ctrlとyが離れているからだと思います。
まあお好みで

【tips】

ここで紹介したスクロールコマンドの他にも、
zt
zz
zb
とかあるんですけどほぼ使うことはないので興味があったら調べてみてください。

保存してファイルを閉じる

ZZ

でいけるのです。

:wq

だと両手を使う必要がありますがZZだと左手だけでいけます。

windowsとかにVM PlayerでCentosとか入れてvimでファイル編集して保存しようとすると、コロンの入力の仕方がわからなくてググるのもめんどくさいときはZZで済ませることができて便利かもです。

ここまでのことが使えれば初心者卒業?

結構な数紹介してきましたがようやく脱初心者といったところです。
(vimは奥が深い・・・)

というわけで
ここから更に便利な使い方を紹介していきます。

応用編

ファイルの中身をまるっと消したい

gg → d → G

という順番でキーボードを押すとファイルを空っぽにできます。
つまり、
gg でファイルの先頭行に移動
d で行の削除モード
G で最下行に移動 (削除モードになっているため全行が削除される)

もちろんこの作業の後に、
u
を押せば一瞬で元通りです。

【どうでもいい話】

僕はWebアプリ開発とかの経験があまりなく、どのファイルがどのページを表示させてるのかがイマイチわからないので、「このページを表示してるファイルはこれかな?」って確認するときに、いったんgg → d → Gで削除してブラウザをリロードさせて画面が白くなったりしたらuでもとに戻して作業に入るってことたまにします。

単語を丸っと削除したい

ここはvimでコーディングしていく中でかなり重要なところです。
少し文字数多めで書いていきます。

単語の先頭にカーソルが置かれているなら、
d → w
で消せます。
ただし、
12345 abcdefg
という文字列があり、
eのしたにカーソルがあって、abcdefgだけを消したい場合ちょっと面倒ですよね。
でも大丈夫です、そういうときは、
d → i → w
と押します。
するといい感じで単語を消してくれます。

感がいい人は、
c → i → w
とかもいけるんじゃない?
と気付くんじゃないでしょうか。その通りです。
dではなくcでやれば、消した後に入力モードになります。

でも、
abcde.fghijk
という単語があるときにeの上で上のコマンドを実施しても、
.fghijk
という状態になってしまいます。

そんなときは、
c → i → W
です。最後のダブリューを大文字にすることでガツンといけます。
なかなか便利ですよね。

この次に紹介するやつもかなりいけてます。

カッコやダブルコート、シングルコートで囲われた文字列を消したい

“genmaitya,mintia,iphone”
という文字列があったとして、中身をごそっと消したいときや編集したいときありますよね。
そんなときは、
d → i → ”
でダブルコーテーションの中身を削除できます。
もちろんcであれば削除して入力モードになります。

(genmaitya,mintia,iphone)
であれば、
d → i → (
で削除ができます。
※d → i → ) でも構いません。

【ちょっとコーヒータイム】

vimの使い方について紹介してきましたがとても便利ですよね。
ここまで使いこなしてると普通のエディタには戻れなくなってきます。
xcodeやEclipseでなんか書くときもまずはvim風にコーディングできるプラグインとかないか探しちゃいます。
はたまた、ただのメモをするようのエディタさえvimライクにしたくなります。

ただ、
したくなるってだけであって実際はしてませんw
どのツールもvimライクにできるんですけどどこか微妙なところがあったりします。
あれができなかったりとかこれができなかったりとか。
本気でカスタマイズする気になればどうにかなるんでしょうけども。
余談でした。

複数行に対して一気に同じ文字列を挿入したい

複数行を一気にコメントアウトしたいときとかに使えます。

0なり^で、カーソルを行の先頭に移動させた状態で、
ctrl + v
を押します。
すると短形選択というモードに移ります。(ブロックモードとか言われたりしてるみたいです)
この状態で挿入したい行を選択します。
その後、
I(大文字のi)
を押して挿入モードになり、
コメントアウトの文字列である#なりを入力します。
そして、
esc
を押すと。あら素敵。

更なるvimmerへの高みを目指して

いったん紹介するコマンドについては以上です。
(適宜思い出したら増えていくかもしれませんがw)

ここまで使えるだけでもかなり開発効率は高くなってると思います。
本当は
:vs

ファイル内の文字列置換の仕方
などの使い方については紹介していきたかったのですがそれはまた別に記事にしたいと思います。

そんな感じです。

今日の一言

すごい6000文字も書いてる!!

この、「思考のスピードで編集しよう」って本当に天才的なタイトルだと思うんですよね笑

技術系

Posted by chat