IMAGE: https://cdn-ak.f.st-hatena.com/images/fotolife/i/ikmbear/20200807/20200807101559.gif
ii
コマンドで全選択できる?
VimではGoogle検索で「vim 全選択」と検索すれば、こんな感じのコマンドが出てきます。
- gg
- Shift + v(行選択ビジュアルモードにしないと、最後の一行がうまく選択されないので注意)
- G
この方法が正攻法なのですが、へっぽこvimmerである私はキーボーvimmerチャコンの末に別の方法で全選択する方法を見つけました(注意:結論としてはこれは全選択のコマンドではありません)!
ビジュアルモードにした後、コマンドii
を入力すると、上図のような結果(全選択)になります。
「テキストオブジェクト「ii」を入力すると全選択できる? 」
「いやちょっと待てよ、テキストオブジェクトで「i」なんて聞いたことないぞ」
そこで今回はii
すなわち「inner i?」の「i」とはなんぞやを調べてみました。
i
は「インデントオブジェクト」(VScodeVim)
まず同じテキストファイルに対して、シェル上で同じコマンドを入力しても全選択にはなりません(無効なキーを押した時のあの音がなります)。
ということは、この機能はVSCodeのVSCode「VSCodeVim」特有の機能ということになります。
そこでvimのページを確認してみると、「vim-indent-object」なるものが。
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のようにインデントでブロックを構成する言語には、このインデントオブジェクトはめちゃ便利ということらしいです。
引用:とほほのPython入門 - 構文 - とほほのWWW入門
実践!インデントオブジェクト
VSCodeVimの概要ページにはコマンドの説明もあるので、実際に試してみます(ビジュアルモードで試すので、オペレーターは指定しません)。
<operator> ii
:カーソルの位置と同じインデントを指定
冒頭でのべた「iiで全選択」は**「一番外側のインデントにカーソルをおいて、インデントオブジェクトii
を指定すれば、実質全選択」**ということでした。
(サンプルのアニメで上下移動も怪しいへっぽこvimmerだということがばれましたね…)
<operator> ai
:カーソルの位置と同じインデント+そのインデントの一行上を指定
<operator> aI
:カーソルの位置と同じインデント+そのインデントの一行上と下を指定
テキストで再確認
テキストで各コマンドの範囲を確認すると、以下のようになります。
まとめ
- VSCodeVimでは、標準で「インデントオブジェクト」がサポートされている。
- 「インデントオブジェクト」:現在のカーソル位置のインデントを基準として、同じインデントの範囲を指定する。
- 一番外側のインデントにカーソルをおいてインデントオブジェクトを指定すると、実質全選択をすることができる。
感想
vimの世界だけでも広かったのに、VscodeVimの世界も広がってしまいました(vimの説明をみた限りでは、なんか他にもいろいろ独自のvimがありそうな感じでした)。
困ったら都度都度覚えるしかないですね〜😭