とにかくやるブログ

とにかくやるブログ

プログラムの備忘録とその他雑記を適当にやるブログ

【プログラミング】Vimについて簡単に備忘録

f:id:tewow:20190622224044j:plain


前回告知したとおり、Vimについて簡単に書いていきます。


今のこの記事もVimで書いています。

なんともcommand + 矢印キーで行の端に飛べないし、行の左端で←キー押しても上の行に行けないしでなんとも慣れない。。。





Vimにはモードがある


vimには通常のノーマルモードと編集用のインサートモードの二つのモードがあり
インサートモードでの操作中は原則としてカーソル移動をしない(マジか・・・)

入力漏れなどを見つけて書いたテキストを変更したい場合は
一旦ESCキーを押してノーマルモードに戻った上でカーソルを移動するとか、、、





カーソルの移動

k → 上
j → 下
h → 左
l → 右

軽く操作してみると、まあ慣れてないのでやりにくい
このキーバインドにした必然性も見えてこないし
ゲームやってる身としてはwasdの方がよいのでは?と思ってしまう。

とはいえ、もう何十年も使われているであろうキー配置なんだし
使っているうちに必然性も見えてくるだろうと思っておく。





基本的な操作

x で文字の削除
i でインサートモードへの変更ができる。
o で次行を新規行として挿入してインサートモードへ(今の行の下に追加)
O で現在行に新しい行を追加してインサートモードへ(今の行の上に追加)

日本語で文章書いてるからなんでしょうが
ノーマルモードになった後には必ず"英数"キーを押さないとコマンドが効かないのがめんどい





ファイルの操作を行うコマンド

:w で上書き保存
:w "name" で"name"というファイル名で保存
:q で編集終了
:wq で保村して終了
:e でファイルを開く


ちなみにvimでは上書き保存していない編集中のファイルを閉じようとすると怒られる
編集したけど保存しないで閉じる場合は":q!"のように最後に"!"をつける事で強制的に操作を行える。
Swiftとかkotlinの強制アンラップみたいですね。





移動に関するチートシート

w で次の単語の先頭へ
e で単語の最後へ
b で前の単語の先頭へ
0 で行頭へ
$ で行末へ
gg でファイルの先頭へ
G でファイルの最終行へ
% でマッチする文字へ移動(対応するカッコへの移動)
control + f で次のページへ
control + b で前のページへ

"w"とか”e”の単語関係のコマンド使った時に日本語の単語にもしっかり対応しててちょっと感動
"%"は()とか[]みたいなカッコ内での移動に便利だけど、この括弧は半角じゃないとコマンドは機能しないので注意





操作に関するチートシート

y でヤンク(コピー)
Y で行をヤンク
p でペースト(プット)
P で現在位置にペースト(プット)
x でカーソル下の1文字を削除
d で削除
D で行内のカーソル以降を削除
dd で行を削除
u で元に戻す
control + R で操作を進める
r で1文字変更
R で入力したもの全て変更
c で1文字消してインサートモードへ
C で一行消してインサートモードへ
A で行末に移動してインサートモードへ
a でカーソルの一つ右からインサートモードへ
I で行の始まりからインサートへ
> で右へインデント< で左へインデント
gu で小文字へ
gU で大文字へ
. で事前の操作を繰り返す


ヤンクについてですが、ただ"y"を押しただけだと一行丸々コピーされたり、一文字だけコピーされたりと挙動がちょっとよくわからない。
基本的には"Y"または”yy”で一行丸々コピーの形か、範囲選択して使った方がよさそう。

範囲選択の方法については、カーソルを選択開始位置に持って行って"v"で選択開始
選択を終了させたいところで"y"でOKだそうです。


ヤンクについてもう少し話します。
"y"でコピー(ヤンク)された文字列は無名レジスタに蓄えられる。
"c"とか"d"で削除された文字も同様
そのため、"y"で文字をコピペしようとしても、そのあとの操作で文字を削除すると上書きされてしまう。

また、"ayy"とか"bdw"とやってやることで、明示的に書き込むレジスタをしてしてやることも可能で
ペースト(プット)する際も"ap""bp"とすることで明示的に文字列を選ぶことができる。

ちなみに、さきほど上書きされてしまうと書いたが
実はヤンクを行なった際には"0"というレジスタにも自動的に書き込まれるため
"0p"でヤンクした値を貼り付けることができる。

あと、PCのクリップボードから貼り付けを行いたい場合は""*p"


"d"とか"gu"の処理はそのままだとヤンクと同様によくわからない挙動を示しているので
"v"を使って範囲指定してやるのがよさそう。

"x"と"r"は1文字に対しての挙動を示していそう。





検索に関するチートシート

f[アルファベット] で行内のアルファベットへ飛ぶ
/[word] でファイル内での単語検索


アルファベット検索は行内のカーソルより右側に対してのみ有効な模様
単語検索は単語打込み後エンターで検索し、次の候補がある場合は"n"で次に飛ぶ、前の候補に戻るときは"N"



以上の操作と移動のコマンドは組み合わせて使うことができます。
例えば"dw" で次の単語の先頭までの削除。

また、操作やモーションは回数指定が可能で
"10dd" で10行削除できる。





テキストオブジェクトのチートシート

iw は単語を指す
is は文を指す
it はタグを指す
i] はカッコを指す


テキストオブジェクトとは例えば
diw と入力するとカーソルの示す単語を消すことが可能。
dis なら示す文単位での削除が可能。
という風に使えます。










とりあえずはこのくらいでしょうか、全て使いこなせれば便利ですが
覚えるのは大変そう・・・

しばらくは横にカンペでも用意して使ってみようと思います。
以上。




今回参考にしたサイト
qiita.com
vi.chin3.net
cohama.hateblo.jp