見出し画像

視覚ベースの補完 Hippie completion

こんにちは、みみぞうです。
ナビタイムジャパンで『システムや開発環境、チームの改善』を担当しています。

今回はJetBrains IDEの機能である Hippie completionについて紹介します。

VSCodeでもプラグインを使えば似たようなことができますので最後にあわせて紹介します

Hippie completionとは

Hippie completionは視覚をベースに現在のファイルから入力を補完する機能です。

原文の説明は以下のようになっています。

Hippie completion is a completion engine that analyses your text in the visible scope and generates suggestions from the current context. It helps you complete any word from any of the currently opened files.

Code completion | IntelliJ IDEA

カーソル位置の直前/直後で前方一致する単語へ瞬時に変換できます。

なぜHippie completionか

Code completion(オートコンプリート)といえば、ほとんどの方が使っているのはBasic completionだと思います。

Basic completion

JetBrains IDEに精通している方はPostfix code completionも使われているでしょう。ブログなどで紹介されることの多い機能です。

一方、Hippie completionを使われている方はあまり見かけない気がします。私がHippie completionを愛用しているのもあり、この機会に紹介させていただくことにしました。

Basic completionに不向きなケース

Basic completionは非常に優れた機能です。視界に入っていない曖昧なものを補完するには非常に便利だと思います。しかし、視界に入っていて明確なものを補完する場合はどうでしょうか。少し煩わしく感じる場合があります。

たとえば、以下のような println!() でnumberを出力したいケースです。目では直前にnumberを認識していますが、Basic completionの一番上に表示されるとは限りません。

Basic completionに不向きなケース1

そのため、『候補の一覧を確認するコスト』『対象の候補を選択して決定するコスト』が発生します。

他にも、クォーテーションで囲まれたリテラルを補完することができない制限があります。

Basic completionに不向きなケース2

Hippie completionのメリット

Hippie completionを使うメリットは2つあります。これらが先ほどの課題を解決します。

  • 変換結果を予測しやすい

  • 目に見えさえすれば補完できる

変換結果を予測しやすい

Hippie completion入力されたクエリと前方一致する単語を、現在のカーソルから近い順に補完します。そのため、変換結果が予測しやすくなります。また、『候補から選択して決定するコスト』も削減できます。

Hippie completion

複数回実行すると、カーソルから遠いモノへと変換されます。できれば一発で確定できるような入力をしておく方がスムーズでしょう。

Hippie completionを複数回実行

目に見えさえすれば補完できる

Hippie completion視界に入るものをすべて補完対象とします。そのため、Basic completionでは補完できなかったダブルクォーテーションに囲まれたリテラルも補完できます。

Hippie completion

もちろん、コメントに含まれるワードでも補完できます。

VSCodeの場合

Simple Autocompleteというプラグインを入れると似たようなことができます。

まとめ

視覚をベースに現在のファイルから入力を補完する機能、Hippie completionを紹介しました。

文字入力の理想系は『脳で考えたことをそのまま入力してくれること』でしょう。次点で『目に入ったものを入力してくれる』ことだと思います。Hippie completionにそこまでのポテンシャルはありませんが、Basic completionに比べれば、それに近づいているのではないでしょうか。

人によってあう/あわないがあるとは思いますが、試したことがなければ是非一度お試しください。最後までお読みいただきありがとうございました!