稲枝の押入れ

いなえが適当なことを書いては、しまっておく場所

VsVimのすゝめ (3) : Vim説明編

記事の一覧

VsVimの導入

Vimの説明に入る前に、VsVimを取り敢えず導入してみましょう。やっぱり手を動かせると実感できるからね。大丈夫、みんなやってるよ。いつでもやめられるよ。

  • まず上のメニューから[ツール]->[拡張機能と更新プログラム]を選択する
  • 左カラムでオンラインを選択する
  • 右上のVisual Stuio ギャラリーの検索の窓にvimと入力する
  • 中央のカラムにVsVimと表示されたら選択してダウンロードをおす
  • インストールの確認ウィンドウがひらくので、ライセンスを確認して内容に問題がなければインストールを押す
  • ウィンドウ右下の今すぐ再起動を押すなどしてVSを再起動する

ようこそ!!以上で君はVimの世界に足を踏み入れました。

VsVimは、VSの機能との共存の関係などで通常のVimとは少し違うところがあります。ぶっちゃけ機能に制限があったりします。というわけで、特にVsVimで使用可能なVimの機能を優先的に紹介しつつや個人的なオススメ設定も含めて後で紹介していこうと思っています。

ですがその前に、まずはVimについて簡単に説明します。

Vim

じゃあ次は神…じゃなくてVimについて紹介していきましょう。

Vimテキストエディタの一種で、とても多くのファンを持つ人気高性能エディタのうちの1つです。統合開発環境ではありませんが、デフォルトの機能に加えて、多くのプラグインが有志によって開発されているため、不便はほとんどないかと思います。ただし、VsVimではプラグインを(おそらく)使えないので、ここではプラグインの話はしません。Vimのスタンダードな機能について紹介します(いわゆる「バニラ」と呼ばれる状態で使えるものがメインです)。

モード

Vimにはモードという概念があります。そんなに難しいものではないのですが、見慣れない人の方が多いものなので最初は面食らうかもしれません。簡単に言うと、Vimには移動用モード・編集用モード・入力用モード・選択用モードといった風にモードがあり、これらを切り替えてテキストを編集します。

例を見てみましょう。

この世の至高はVisual Studio!!

と書き込まれたテキストファイルを編集して

この世の至高はVim!!

と書き換えることを考えます。最初は行頭にカーソルがあると考えます。つまり

|この世の至高はVisual Studio!!

という状態から始めます。(ここでは仮に|をカーソルとして扱います((Vimのカーソルは文字間ではなく文字上にあるのですがここでは簡単のため文字の間にカーソルがあるとして考えます)))

まず、「移動用モード」で

この世の至高は|Visual Studio!!

の位置まで移動します。

そして、「選択用モード」で

この世の至高は[Visual Studio]!!

と選択します([]で囲まれた範囲を選択範囲とします)。

そして、選択範囲を

この世の至高は|!!

と削除します(|がカーソル位置です)

そして、入力用モードにして、「Vim」と入力することで

この世の至高はVim|!!

と目的のテキストに無事書き換えられました(もちろん、以上の文章の修正は何らかの意図を含むものではありません!!!!!!!!!!!!!!!)

ノリとしてはこういう感じですが、もう少しだけ厳密に見ていきましょう

実際にはモードは

  • ノーマルモード
  • インサートモード
  • ビジュアルモード
  • コマンドラインモード

などがあります。基本的にはこの4つを使うのがほとんどなのでまずはこれを覚えておけば大丈夫です。では、これらについて見ていきましょう。

ノーマルモード

ノーマルモードはその名前の通り通常時のモードです。移動に加えて操作処理を行うことが出来ます。基本的にノーマルモードを基準に他のモードと行き来をします。

ノーマルモードでは、

  • 移動(motion)
  • 削除やペーストなどのテキスト操作処理(operator)
  • 他のモードへの移行

などが出来ます

インサートモード

インサートモードは、いわゆる通常のテキストエディタと同様に、入力をそのままファイルに書き込むモードです。Vimに慣れていない間は最悪このモードにして矢印を使って移動すれば通常のテキストエディタと同様の使い方もできます。

インサートモードでは、

などが出来ます

ビジュアルモード

ビジュアルモードは範囲選択をするモードです。基本的には、ビジュアルモード開始時の位置から、動かしたカーソルの位置までを選択範囲とします。様々な操作をすることも可能で、その場合基本的に操作は選択範囲に対して行われます

ビジュアルモードでは、

  • 移動(motion)
  • 削除やペーストなどのテキスト操作処理(選択範囲に対して)(operator)
  • ノーマルモードに戻る

などが出来ます

コマンドラインモード

コマンドラインモードはコマンドを実行できるモードです。検索や置換、その他様々な機能をコマンドによって実行できます。入力は全てコマンドラインへの入力として判断されます

コマンドラインモードでは、

などが出来ます。

モード間遷移まとめ

各モード間の遷移については、親子関係のように

という感じになっていて、各モードは自分の親もしくは子にのみ遷移できると覚えておけばいいです。よって、例えばインサートモードからビジュアルモードに変えたいときは

インサートモード->ノーマルモード->ビジュアルモード

といった感じに遷移することになります。つまり、ノーマルモードは全てのモードの拠点のような役割も持つことになります。

モード切替のキー(基本)

では実際にどうやってモードを切替えるのか、という話ですが、モード切り替えは以下のキーで行います。実は他にもあるのですが、これだけあれば困ることはないので、まずはこれを覚えましょう。(C-hogeというのはCtrlを押しながらhogeというキーを押すという意味です)

C-[については、ホームポジションから離れないためにも覚えておくと幸せです

Vimのカーソルの位置

通常のテキストエディタや、Vimの「インサートモード」時は、カーソルは文字間にあるのに対して、Vimの「ノーマルモード」時のカーソルでは文字間ではなく文字そのものにあるということを頭に入れておいてください。例えば

Vim最高

というテキストがあるとき、カーソルを行頭に移動した場合は

[V]im最高

という風にV上にカーソルがある状態になります([]がカーソルのある位置)

モード切替のキー(発展)

もしあなたがVimをこれからどんどん使っていこうと思っているとしたら(なんと素晴らしいことでしょう!マスターして是非僕に教えてください!)、モード切替キーについて、より詳細に以下も覚えると良いでしょう。これが使えるだけでも大分便利になります。

  • ノーマルモード
    • インサートモードへの切り替え
      • i : 現在位置の左側にカーソルがある状態にしてインサートモードに切り替える
      • I : その行の先頭からみて最初の(空白ではない)文字の左側にカーソルがある状態にしてインサートモードに切り替える
      • a : 現在位置の右側にカーソルがある状態にしてインサートモードに切り替える
      • A : 行末にカーソルがある状態にしてインサートモードに切り替える
      • o : 現在位置の下に行を追加してその行にカーソルがある状態にしてインサートモードに切り替える
      • O : 現在位置の上に行を追加してその行にカーソルがある状態にしてインサートモードに切り替える
      • gi : 最後に入力があった位置にカーソルがある状態にしてインサートモードに切り替える
    • ビジュアルモードへの切り替え
      • v : ビジュアルモードに切り替える
      • V : 行単位選択のビジュアルモードに切り替える
      • C-v : 矩形範囲選択のビジュアルモードに切り替える

インサートモードについて例を出すと、

上の行
適当[]文章
下の行

があった時に、それぞれのキーを押した際にインサートモードになる位置については

上の行
O
I適当i[]a文章A
o
下の行

となります

モーション(基本)

モーション(motion)とは簡単に言うと移動操作のことです。Vimではモーションを用いて移動ができます。モーションは基本的にノーマルモードとビジュアルモードでのみ使えます。

上下左右の移動

移動のためのモーションのキーは以下の通りです
h : 左
j : 下
k : 上
l : 右

一見分かりづらいかもしれませんが、これらのキーはキーボード上でhjklという順に配置されています。つまりその位置が←↓↑→という矢印キーに置き換わったように移動操作が出来ます。

そのため慣れると直感的な操作が可能になります。その位置もホームポジションからほとんど動かさずに打てる位置なので使いやすいです。

はい、これで移動のための矢印キーを押すためにホームポジションから手を離す日々とはオサラバ。常にホームポジション引きこもりの完成ですね。最高!!!

単語単位の移動

ついでに単語単位で左右に移動するモーションのキーも紹介しておきます w : 単語単位で右に移動 b : 単語単位で左に移動 e : 右側にある単語の末尾に移動 ge : 左側にある単語の末尾に移動

これはVSでいうCtrl + 左右矢印に相当します。矢印の呪縛からまた一つ解き放たれますね。

モーションの組み合わせ

モーションの前に数字をつけることでその回数分押したのと同じ動きをします。例えば

zero one two three four five six seven

の最初のzにカーソルがある時に、4回wを押すとfourfまでカーソルが動くが、4wと押した場合も同様にカーソルが動く

モーション(発展)

その他のモーションについて自分が便利だと思うものについて書いておきます。最悪覚えてなくてもそれほど不便でもないかな?他にもモーションは結構あるので気になったら調べてみてください

ここで特に断りなく順方向、逆方向と書かれていた場合、カーソル位置からみた時にそれより後ろを順方向、それより手前を逆方向として考えます。

その行の該当する文字の位置に移動する

f : 次に押した文字を、順方向に検索した場所に移動する
F : 次に押した文字を、逆方向に検索した場所に移動する
t : fの移動箇所が一文字分手前版
T : Fの移動箇所が一文字分手前版
; : 検索後、順方向に繰り返し検索
, : 検索後、逆方向に繰り返し検索

これ何気に便利。例えば

[z]ero one two three four five six seven

の先頭にカーソルがある時にfsと押すと

zero one two three four five [s]ix seven

と、カーソル位置より後ろで最初にsが出てくる位置であるsixsに移動します。

この状態で;と押すと

zero one two three four five six [s]even

と、再度fsを押したのと同じ動作をして(つまりカーソル位置より後ろで最初にsが出てくる位置に移動して)、sevensに移動します。

さらにこの状態からFoと押すと

zero one two three f[o]ur five six seven

カーソル位置より手前で最初にoが出てくるfouroに移動します。

この状態で;と押すと

zero one tw[o] three four five six seven

と、再度Foを押したのと同じ動作をして(つまりカーソル位置より手前で最初にoの出てくる位置に移動して)、twooに移動します。

ファイル内で検索する

/ : 順方向に文字列検索 ? : 逆方向に文字列検索 * : カーソルのある位置の単語を完全一致で順方向に文字列検索 # : カーソルのある位置の単語を完全一致で逆方向に文字列検索 g* : カーソルのある位置の単語を順方向に文字列検索 g# : カーソルのある位置の単語を逆方向に文字列検索 n : 検索後、順方向に繰り返し検索 N : 検索後、逆方向に繰り返し検索

VSでいうCtrl + Fに相当する。

対応する括弧に移動する

% : 対となる括弧へ移動

意外と使い勝手が良い。VSでいうCtrl + [に相当する

ただし、プリプロセッサ命令ガリガリのクソコードだったりするとテキストベースで判断してるからか正確に対応する括弧に飛ばなかったりする。クソコードを読まざるを得ないときはVSの方を使おう

今いる関数の始点/終点に移動する

[[ : 逆方向に見ていき、1桁目が{で始まる最初の位置に移動
]] : 順方向に見ていき、1桁目が{で始まる最初の位置に移動
[] : 逆方向に見ていき、1桁目が}で始まる最初の位置に移動
][ : 順方向に見ていき、1桁目が}で始まる最初の位置に移動

1文字目は「検索の方向」を指定し、2文字目は「1文字目と同じ文字なら{、1文字目と違う文字なら}を検索する」ことを指定すると覚えるといいです。

何故かチートシートとかにも書かれてないことがあったりする子。

{を最後に書く宗教の方には残念ですが、もし行頭に書くようなら、例えば関数の頭や関数の終わりに飛べるので便利。今いる関数のはじめに飛びたいときや最後に飛びたい時に使えます。

仮に{を行末に書く宗教だとしても、関数の最後に飛んで%で対応する括弧に飛べば関数の始点に飛べるので完全に使えない子ではないです

namespaceがある?はい、あきらめましょう。

これ類似する機能とかでもVSにあるのだろうか?(知らないのであったら教えてください)

ファイルの先頭/末尾に移動する

gg : ファイルの先頭に移動する
G : ファイルの末尾に移動する

行頭/行末に移動する

0 : 行頭に移動する
^ : 行頭(空白ではない文字の最初)に移動する
$ : 行末に移動する

画面単位でスクロールする

C-b : 画面分上にスクロールする
C-f : 画面分下にスクロールする
C-u : 画面半分分上にスクロールする
C-d : 画面半分分下にスクロールする

キーはback,forword,up,downで覚えると良い。画面分スクロールか画面半分分スクロールかのどちらか覚えとけば十分だと思う

オペレータ(基本)

次にオペレータを紹介します。オペレータ(operator)とは、削除やコピー、貼り付け等といった操作のことを言います。

ここを見れば取り敢えずVimを使えはするようになるはず。モーションと同じくオペレータも基本的にノーマルモードとビジュアルモードでのみ使えます。

1文字削除

x : カーソルの位置の文字を消す

ペーストするとこの時消した文字が貼り付けられるので切り取りといったほうが近い?この辺はレジスタとか調べると分かるけど多分最初は知らなくて平気。

ビジュアルモード中は選択範囲が削除されます。

削除

d : 削除する

ビジュアルモード中に押した場合はその選択範囲が削除されます。

ノーマルモード中はdの次に何を押すかによって削除できるものが決まる。例えばdの次にモーションを入力するとそのモーションによって移動した場所までを削除する。その他少し特殊でよく使うものは以下。

dd : 一行削除する
D : 行末までを削除する

このへんでVSのCtrl + XCtrl + Lは代用できる

ヤンク

y : ヤンクする

ヤンクとはまあ簡単に言うとコピーのこと。

dと同様にビジュアルモード中に押した場合はその選択範囲がヤンクされる。

ノーマルモード中もdと同様にyの次に何を押すかによって何をヤンク出来るかが決まる。d同様モーションを追記すればその範囲をヤンク出来る。またも特殊でよく使うのは以下

yy : 一行ヤンクする

ここで注意すべきなのは設定しないとヤンクされたものとコピーされてクリップボードに入っているものは別ということです。

ペースト

p : ヤンクされたものが範囲の場合はカーソルの後ろに、行の場合は下に貼り付けする
P : ヤンクされたものが範囲の場合はカーソルの前に、行の場合は上に貼り付けする

ヤンクした範囲(または切り取りや削除した範囲)を貼り付ける。クリップボードの内容が貼り付けられるわけではないので注意

やり直す

u : やり直す(undo)
C-r : やり直す(redo)

Ctrl + ZCtrl + Yと同じ。

オペレータ(発展)

最悪後は使いながらこういう機能欲しいなあと思うたびググって覚えていけば良いと思うのですが、一応おすすめのものを適当に紹介しておきます

マクロ

これはオペレータ枠でいいのか微妙にわからないけど書いておく。定型的処理に使うと便利

q : マクロの記録開始/解除
@ : マクロの実行

qを押した後アルファベット1字を押すことでその後の操作をそのアルファベットに紐づけて記憶する。記憶した操作は、@の後にそのアルファベット1字を押すことで再現できる。

例えば

void update();
void draw();
void initialize();
void finalize();

という風にあったとして、すべての行のvoidの前にvirtualを、();の間に= 0を入れたいとき(つまり純粋仮想関数にしたい時)を考える。この時、

  • updateの行でqaと押す(aにマクロを記録)
  • Iを入力(行頭に移動して入力(インサートモード)を開始)
  • virtualと入力
  • C-[を押す(ノーマルモードに切替える)
  • f;と押す(その行の;がある位置に移動する)
  • iと押す(;の前にカーソルを移動して入力を開始)
  • = 0と入力する
  • C-[を押す(ノーマルモードに切替える)
  • qを押す(マクロの記録を終了する)
  • jを押す(drawの行に移動する)
  • @aと押す(aに記録されたマクロを実行する)
  • initializefinalizeの行でもマクロを実行する

とすることで実現できます。

ちなみにVSの補完をマクロ中の入力で使った場合補完されていない実際にキーボードで打たれた文字のみが入力されてしまうので注意しましょう。上の例でvirtualと入力するところでvirまで打ってからVSの補完機能で入力を完了した場合、マクロ使用時に入力されるのはvirのみとなります。

大文字小文字の変換

~ : 大文字小文字を変換する

hoge[f]unction();

という文章があった時にこのカーソル位置のまま~を押すと

hogeF[u]nction();

となる

再度実行

. : 最後の変更を繰り返す

ちょっと癖があって難しいが、使えると強力。使い方だけ知りたいならこことか見とけばいいかな?

コマンド

ここまでコマンドラインモードでできることに触れていなかったので簡単に説明しておこうかとおもいます。

コマンドラインモードはその名前の通りコマンド入力ができるモードです。このモードの状態で特定のコマンドを入力してEnterを押すことでそのコマンドに応じた機能を使うことが出来ます。

コマンドラインモードには:で遷移するため、それぞれのコマンドには先頭に:がついて表記される事が多いです。Vimについて調べて:から始まる操作が出てきたら、それはコマンド入力なのだと思っておくと良いでしょう。

以下、簡単なコマンドについて幾らか列挙しておきます。コマンドラインモードは特にVsVimでは制約の多いところになるので、調べたものが使えないことは多々あります(例えばコマンドラインウィンドウが使えない)。ここではVsVimで使えるものだけを書いておきますが、色々試してみて、使える便利なコマンドがあったら教えてください。

ファイルを閉じる/保存

:q : ファイルを閉じる
:!q : 変更を破棄してファイルを閉じる
:w : ファイルを保存
:wq : ファイルを保存して閉じる

ファイルを閉じたい時、そのファイルに変更がある場合は、単純にファイルを保存して閉じるか、変更を破棄してファイルを閉じる必要があります。

ハイライト

:set hlsearch : 検索文字列のハイライトを表示するようにする
:set nohlsearch : 検索文字列のハイライトを表示するようにする
:noh : 検索文字列のハイライトを表示しないようにする(次回検索時からは設定準拠)。nohかそれ以上長ければnohlsearchの途中のどこで止めてもいけるっぽい

検索した時のハイライト表示のオンオフが出来る。

置換

:s/hoge/bar/ : 現在の行の行頭から見て最初のhogeという文字列をbarに置換する :%s/hoge/bar/ : ファイル内の行頭から見て最初のhogeという文字列をbarに置換する :s/hoge/bar/g : 現在の行のhogeという文字列を全てbarに置換する :%s/hoge/bar/g : ファイル内のhogeという文字列を全てbarに置換する

以上の通り、sは置換、sの前に%をつけるとファイル全体が対象になる、最後にgをつけると全てを置換するがつけないと行頭から見て最初のものだけが置換される、くらい覚えとけば取り敢えず置換を機能としては使えると思います。

実は置換正規表現が使えたりとか便利な機能が色々あったりしますそのへんは必要になり次第ググってください。

VsVim向けのオススメ設定

疲れてきたのでこのへんでVimの説明はやめてVsVimの設定について書いておこうと思います

個人の好みもあると思うので個人的なオススメだけ紹介しておきます

C-[

ノーマルモードに戻るのにEscキーを使うのではなくC-[を使いたいが、VsVimではデフォルトではC-[は使えない(もしかするとインストール言語が日本語でなければ使えるかも)。HHKB使ってるとかでなければ有効化はほぼ必須かと思います

方法は以下の通り

  1. ツール>オプションを開く
  2. 環境>キーボードを開く
  3. 「以下の文字列を含むコマンドを表示」の欄に 「編集.選択解除」といれて、下の一覧に出てきた「 編集.選択解除」を選ぶ
  4. 「ショートカットキー」の枠内で「C-[」を押す
  5. 割り当てボタンを押す

参考 : VsVimのC-[を使えるようにする

highlight

検索等した時のハイライトがデフォルトのがあまりイケてない。VsVimの設定から変えられるオススメは以下

  • Highlight Incremental Search = Sienna (検索時のハイライトもいい感じに)

コマンド部

下のコマンドモード時に使う部分がVSのテーマがDark?だったりすると浮いてて少しダサい。CUI風にするには以下のようにすればいい

  • Command margin Background Color = Black (下のコマンド部の背景色を変えたければ)
  • Command margin Foreground Color = White (下のコマンド部の文字色を変えたければ)

vsとvimどっちのキーを優先するか

VsVimではVSのキーとVimのキーとがあるためどちらを優先するかを設定できる(というかしておかないと思ったように行かない場面が多い)

デフォルトでは全てVS優先になっていると思うのでここではVsVim優先にするかという観点で書く

VsVim優先にしたやつ

VsVimを優先にしておいたほうがよさそうなやつら

  • C-[ : 上記C-[の設定をしていれば設定しなくても大丈夫かも
  • C-d : 半分下に移動(down)
  • C-u : 半分上に移動(up)
  • C-n : 次に移動(next),補完
  • C-p : 前に移動(previous)
  • C-v : 矩形VisualMode

難しいやつ

  • C-r : VSでC-r,C-rがリネーム。意外と使いたくなったりする。Vimではredo。なお、redoも使用頻度が高い
  • C-f : VSの検索のほうが右のスクロールバーに位置が表示されたりと嬉しいことがあったりもする。Vimでは画面分のスクロール

.vimrcの設定

Vimには.vimrcという設定ファイルがあって、ここに色々書くことで簡単に設定を出来る

VsVimでは%userprofile%\.vsvimrcに書くことで自動で起動時に設定してくれるらしい
%userprofile%は、C:\Users\usernameのこと。エクスプローラ%userprofile%と打てばいいと思う

以下簡単な例

"検索時にハイライトする
set hlsearch 
"大文字小文字を区別しない
set ignorecase    
" エラーメッセージの表示時にビープを鳴らさない
set noerrorbells
" vim の矩形選択で文字が無くても右へ進める
set virtualedit=block    

突然の死

なんか疲れて雑になってきたので終わりにします

参考