コマンドラインにオートコンプリート機能を簡単に導入できる「inshellisense」が面白そう

2023.11.20

こんにちは、CX 事業本部 Delivery 部の若槻です。

2 週間ほど前に、Microsoft が inshellisense(インシェリセンス) というツールを公開しました。

inshellisense は、コマンドラインの入力時にインテリセンスを表示してくれる オートコンプリート機能 をシェルに簡単に導入できるツールです。600 以上のコマンドに対するオートコンプリートをサポートしており、現在は RC(Release Candidate)バージョンとして公開されています。

基本情報

サポートしている OS 環境

  • macOS
  • Linux
  • Windows

サポートしているシェル

  • bash
  • zsh
  • fish
  • pwsh
  • powershell

前提条件

  • node >= 16.x

導入方法

npm install -g @microsoft/inshellisense

導入がとても簡単なのも inshellisense の特徴です。

エイリアス

  • is

試してみた

inshellisense の基本的な使い方は次のようになります。

  1. inshellisense --shell <shell>(または is --shell <shell>)でセッションを開始
  2. コマンドの入力時にオートコンプリートが表示されるので、上下キーとタブで選択
  3. エンターでコマンドを実行

環境

$ sw_vers
ProductName:            macOS
ProductVersion:         13.6.1
BuildVersion:           22G313

$ node -v
v20.9.0

$ inshellisense --version
0.0.1-rc.4

セッション開始

inshellisense のオートコンプリートセッションを inshellisense --shell <shell> で開始します。

$ inshellisense --shell zsh
>

これでオートコンプリートを使用しながらコマンド入力ができるようになります。

オートコンプリート

inshellisense がサポートしているいくつかのコマンドでオートコンプリートを試してみます。

Git コマンド

Git コマンドはオートコンプリートの対象となっています。

git と入力すると、サブコマンドの一覧がオートコンプリートに表示されます。上下キーで選択中のサブコマンドの説明も右側に表示されます。

> git  
      ┌──────────────────────────────────────┐┌────────────────────────────┐
      │📦 add                                ││Add file contents to the    │
      │📦 stage                              ││index                       │
      │📦 status                             │└────────────────────────────┘
      │📦 clean                              │
      │📦 revert                             │
      └──────────────────────────────────────┘

上記で add を選択してタブをクリックすると、次は add 対象のファイルがオートコンプリートで表示されます。

> git add
          ┌──────────────────────────────────────┐
          │📀 .git                               │
          │📀 .github                            │
          │📀 .vscode                            │
          │📀 node_modules                       │
          │📀 posts                              │
          └──────────────────────────────────────┘

AWS CLI コマンド

AWS CLI もオートコンプリートの対象となっています。

同様にサブコマンドがオートコンプリートされます。

> aws s3
         ┌──────────────────────────────────────┐┌────────────────────────────┐
         │📦 ls                                 ││List S3 objects and common  │
         │📦 website                            ││prefixes under a prefix or  │
         │📦 cp                                 ││all S3 buckets. Note that   │
         │📦 mv                                 ││the --output and            │
         │📦 rm                                 ││--no-paginate arguments are │
         └──────────────────────────────────────┘│ignored for this command    │
                                                 └────────────────────────────┘

オプションもオートコンプリートされます。

> aws s3 ls
            ┌──────────────────────────────────────┐┌────────────────────────────┐
            │🔗 --recursive                        ││Command is performed on all │
            │🔗 --page-size                        ││files or objects under the  │
            │🔗 --human-readable                   ││specified directory or      │
            │🔗 --summarize                        ││prefix                      │
            │🔗 --request-payer                    │└────────────────────────────┘
            └──────────────────────────────────────┘

このようにサブコマンドやオプション、引数となるファイル名などが説明付きでオートコンプリートされるので、うろ覚えでもガシガシとコマンドを打ててしまいます。

気になった部分

inshellisense を触っていて気になった部分がいくつかありました。

コマンド種類によってサポートの濃淡がある

AWS CDK コマンドも inshellisense でサポートされています。次のようにサブコマンドまではオートコンプリートされます。

> cdk  
      ┌──────────────────────────────────────┐┌────────────────────────────┐
      │📦 init                               ││Create a new, empty CDK     │
      │📦 metadata                           ││project from a template     │
      │📦 doctor                             │└────────────────────────────┘
      │📦 diff                               │
      │📦 destroy                            │
      └──────────────────────────────────────┘

しかしそれ以降のオプションはオートコンプリートが表示されません。

> cdk deploy

コマンドの種類によって、オプションまで含む場合や、サブコマンドのみの場合など、オートコンプリートのサポートの濃淡があるようです。

クリップボードからの貼り付けの挙動がおかしくなる

私は AWS で AssumeRole する際に、次の記事で紹介しているようなワンライナーを貼り付けて使用しています。

しかし、inshellisense のセッションのプロンプトにクリップボードから貼り付けをしようとすると、次のように崩れてしまう場合があります。

>
  --role-arn $(aws configure get ${AWS_PROFILE}.role_arn) \
  --serial-number $(aws configure get ${AWS_PROFILE}.mfa_serial) \
export AWS_ACCESS_KEY_ID=`echo{AWS_OP_ITEM_ID} --otp)`
export AWS_SECRET_ACCESS_KEY=`echo "${AWS_STS_CREDENTIALS}" | jq -r
export AWS_SESSION_TOKEN=`echo "${AWS_STS_CREDENTIALS}" | jq -r
unset AWS_PROFILE ionToken'`

おそらく複数行の文字列を貼り付ける際に挙動がおかしくなっているのだと思われます。

バインド機能がよく分からない

Quickstart には inshellisense bind によりキーバインドが行われ、コマンドがシェルの履歴に挿入できるとあります。確かに inshellisense のセッション内で実行したコマンドを元のセッションの履歴では使用できないため、自動で履歴を挿入してくれるのは便利です。

そこで次のようにバインドを試してみました。

$ inshellisense bind
Select your desired shell for keybinding creation
  bash
> zsh
  fish
  pwsh

しかし特にバインド前と挙動に変化が無く、結果として何ができるのかよく分かりませんでした。もう少しドキュメントが充実してくれると嬉しいですね。

上記の実行により、~/.inshellisense/key-bindings.zsh が作成され、~/.zshrc に次の行が追加されます。

~/.zshrc

[ -f ~/.inshellisense/key-bindings.zsh ] && source ~/.inshellisense/key-bindings.zsh

key-bindings.zsh の内容は次のようになります。inshellisense の履歴をシェルの履歴に追加する関数を「ctrl + A」にキーバインディングしているようです。

~/.inshellisense/key-bindings.zsh

__inshellisense__() {
    input=$LBUFFER
    LBUFFER=
    inshellisense -c "$input" -s zsh < $TTY
    print -s $(inshellisense --history)
    zle reset-prompt
}

zle     -N   __inshellisense __inshellisense__
bindkey '^A' __inshellisense

シェルで下記まで入力して「ctrl + A」を押します。

$  echo "Hello"

すると入力中のコマンドが inshellisense のセッションに移行されました。

$  
> echo "Hello"

タブによるオートコンプリート機能も効きます。

> echo "Hello"  
               ┌──────────────────────────────────────┐┌────────────────────────────┐
               │💲 $MallocNanoZone                    ││Environment Variable        │
               │💲 $USER                              │└────────────────────────────┘
               │💲 $SECURITYSESSIONID                 │
               │💲 $COMMAND_MODE                      │
               │💲 $__CFBundleIdentifier              │
               └──────────────────────────────────────┘

しかしコマンドの実行後に元のシェルのセッションに戻っても、シェルの履歴にコマンドが追加されていませんでした。

$  
> echo "Hello"
Hello
>
$

今回はこれ以上踏み込みませんでしたが、挙動の把握のためにもう少し調査が必要そうです。

inshellisense の後片付け

最後に inshellisense が不要となった場合の後片付け方法を紹介します。

まず inshellisense をアンインストールします。

npm uninstall -g @microsoft/inshellisense

次に ~/.zshrc から inshellisense のキーバインディングの開始処理の行を削除します。

~/.zshrc

[ -f ~/.inshellisense/key-bindings.zsh ] && source ~/.inshellisense/key-bindings.zsh # この行を削除

最後に ~/.inshellisense を削除します。

rm -fr ~/.inshellisense

おわりに

コマンドラインにオートコンプリート機能を簡単に導入できる「inshellisense」が面白そうだったのでご紹介しました。

RC 版ということもあり、まだまだ機能の不安定やドキュメントの未整備など至らない部分は多そうですが、今後のアップデートですごいツールに化けてくれるかも知れません。気になる方は触ってみてはいかがでしょうか。

以上