ikuma-t.

登壇 登壇 検索

VSCodeVimで使えるインデントオブジェクト

IMAGE: https://cdn-ak.f.st-hatena.com/images/fotolife/i/ikmbear/20200807/20200807101559.gif

Vimではiiコマンドで全選択できる?

Google検索で「vim 全選択」と検索すれば、こんな感じのコマンドが出てきます。

  1. gg
  2. Shift + v(行選択ビジュアルモードにしないと、最後の一行がうまく選択されないので注意)
  3. G

f:id:ikmbear:20200807101559g:plain

この方法が正攻法なのですが、へっぽこvimmerである私はキーボーvimmerチャコンの末に別の方法で全選択する方法を見つけました(注意:結論としてはこれは全選択のコマンドではありません)!

f:id:ikmbear:20200807102024g:plain

ビジュアルモードにした後、コマンドiiを入力すると、上図のような結果(全選択)になります。

「テキストオブジェクト「ii」を入力すると全選択できる? 」
「いやちょっと待てよ、テキストオブジェクトで「i」なんて聞いたことないぞ」
そこで今回はiiすなわち「inner i?」の「i」とはなんぞやを調べてみました。

iは「インデントオブジェクト」(VScodeVim)

まず同じテキストファイルに対して、シェル上で同じコマンドを入力しても全選択にはなりません(無効なキーを押した時のあの音がなります)。

ということは、この機能はVSCodeのVSCode「VSCodeVim」特有の機能ということになります。

そこでvimのページを確認してみると、「vim-indent-object」なるものが。

f:id:ikmbear:20200807102402p:plain

Based on vim-indent-object, it allows for treating blocks of code at the current indentation level as text objects. Useful in languages that don’t use braces around statements(e.g Python)

要はカーソルの現在位置と同じインデントを、テキストオブジェクトとして扱うことができるということです(以降インデントオブジェクトと呼ぶ)。

(私はPython触ったことないので初めて知りましたが)Pythonのようにインデントでブロックを構成する言語には、このインデントオブジェクトはめちゃ便利ということらしいです。

a = 3if a == 5: print "AAA" # if文の対象 print "BBB" # if文の対象print "CCC" # if文の対象ではない

引用:とほほのPython入門 - 構文 - とほほのWWW入門

実践!インデントオブジェクト

VSCodeVimの概要ページにはコマンドの説明もあるので、実際に試してみます(ビジュアルモードで試すので、オペレーターは指定しません)。

<operator> ii :カーソルの位置と同じインデントを指定

f:id:ikmbear:20200807102640g:plain

冒頭でのべた「iiで全選択」は**「一番外側のインデントにカーソルをおいて、インデントオブジェクトiiを指定すれば、実質全選択」**ということでした。

(サンプルのアニメで上下移動も怪しいへっぽこvimmerだということがばれましたね…)

<operator> ai :カーソルの位置と同じインデント+そのインデントの一行上を指定

f:id:ikmbear:20200807102838g:plain

<operator> aI :カーソルの位置と同じインデント+そのインデントの一行上と下を指定

f:id:ikmbear:20200807103642g:plain

テキストで再確認

テキストで各コマンドの範囲を確認すると、以下のようになります。

<div> <p>vimvimvimvimvimvimvimvimvimvimvimvimvim</p> <div> <!--aiと、aIの上方向はここまで--> <p>vimvimvimvimvimvimvimvimvimvimvimvimvim</p> <!--iiだとここまで--> <p>vimvimvimvimvimvimvimvimvimvimvimvimvim</p> <p>vimvimvimvimvimvimvimvimvimvimvimvimvim</p> <p>vimvimvimvimvimvimvimvimvimvimvimvimvim</p> <!--ここでコマンドを実行--> </div> <!--aIの下方向はここまで--></div>

まとめ

  • VSCodeVimでは、標準で「インデントオブジェクト」がサポートされている。
  • 「インデントオブジェクト」:現在のカーソル位置のインデントを基準として、同じインデントの範囲を指定する。
  • 一番外側のインデントにカーソルをおいてインデントオブジェクトを指定すると、実質全選択をすることができる。

感想

vimの世界だけでも広かったのに、VscodeVimの世界も広がってしまいました(vimの説明をみた限りでは、なんか他にもいろいろ独自のvimがありそうな感じでした)。
困ったら都度都度覚えるしかないですね〜😭

参考

ikuma-t

ikuma-t

about

9割笑顔、1割 (´・ω・)