コマンドラインにオートコンプリート機能を簡単に導入できる「inshellisense」が面白そう
こんにちは、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 の基本的な使い方は次のようになります。
inshellisense --shell <shell>
(またはis --shell <shell>
)でセッションを開始- コマンドの入力時にオートコンプリートが表示されるので、上下キーとタブで選択
- エンターでコマンドを実行
環境
$ 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
に次の行が追加されます。
[ -f ~/.inshellisense/key-bindings.zsh ] && source ~/.inshellisense/key-bindings.zsh
key-bindings.zsh
の内容は次のようになります。inshellisense の履歴をシェルの履歴に追加する関数を「ctrl + A」にキーバインディングしているようです。
__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 のキーバインディングの開始処理の行を削除します。
[ -f ~/.inshellisense/key-bindings.zsh ] && source ~/.inshellisense/key-bindings.zsh # この行を削除
最後に ~/.inshellisense
を削除します。
rm -fr ~/.inshellisense
おわりに
コマンドラインにオートコンプリート機能を簡単に導入できる「inshellisense」が面白そうだったのでご紹介しました。
RC 版ということもあり、まだまだ機能の不安定やドキュメントの未整備など至らない部分は多そうですが、今後のアップデートですごいツールに化けてくれるかも知れません。気になる方は触ってみてはいかがでしょうか。
以上