こんな感じになる予定です。
(1)cd,pushd とその補完で、bash のような %CDPATH% をサポート
Go開発者の人ならば
nyagos.envadd("CDPATH", "~\\go\\src\\github.com\\zetamatta", "~\\go\\src\\bitbucket.org\\zetamatta")
とかやっておくと、自分のレポジトリに cd nyagos
みたいに一発で移動できるようになるので便利です。envadd は環境変数にセミコロンで区切ったリストを登録する時に、重複をしないように要素を追加する関数です(4.4.5 で追加)
なお、cd nyagos\
のように \ をパス中に含めると CDPATH が無効になるので注意が必要です。補完はそのあたり配慮はしてますので、そんなに困ることはないと思いますが。
(2) %APPDATA%\NYAOS_ORG\nyagos.d
のスクリプトも読むようにした
これは現在作成中の .msi 形式のインストーラーで C:\Program Files 以下へインストールした時、nyagos.d が編集できなくなるための配慮です。
(3)WindowsTerminal上では、サロゲートペアな Unicodeを <nnnnn> のようにエスケープしないようにした
普通のコマンドプロンプトではサロゲートペアは Unicode は文字化けするだけでなく、文字幅の計算が狂って、編集が困難な状態になるので
ですが、WindowsTerminal ではサロゲートペアな Unicode が表示可能になったので、その処理の解除をするようにしました。解除のスイッチは WindowsTerminal 使用中にセットされる環境変数 WT_PROFILE_ID , WT_SESSION の有無です。
(4)バイナリファイルを置くディレクトリを Cmd から bin へ変更した
これはソースツリーだけの話です。Go言語の開発作法としては「Cmd/コマンド名」ディレクトリの下にはそのコマンドの main パッケージソースが置かれます。nyagos では OS やアーキテクチャごとのバイナリの置き場所にしていて、これはよろしくないので bin に変えました。
(5)catalog\subcomplete.lua , git.lua の改善
本スクリプトは git や svn などのサブコマンド名を持つコマンドに対する補完機能を実現するものです。少し起動に時間がかかるので、標準組み込みではなく、use "subcomplete.lua"
と設定した時だけ有効になるオプションとしています。
今回、これにいろいろ手を入れました。(もらいもんなので、おそるおそる…)
(5-1) 新補完API nyagos.complete_for
を使うようにした
補完APIは長らく nyagos.completion_hook
というフックで提供されていましたが、API が細かすぎて、何でも出来る反面、利用する Lua コードが長くなりがちになるという問題がありました。
そこで bash を参考に 4.4.1 で nyagos.complete_for
という新APIを用意しました。これはコマンドごとに関数を定義でき、かつ、与えられる引数が加工済みで、戻り値は候補一覧を雑に返せばよいだけとなっています。
今回、subcomplete.lua 、git.lua をこちらの API 用に書き換えることで、Lua 側コードを簡潔にしました。
(5-2) 起動を早くするため、補完するサブコマンド名をファイルにキャッシング
起動に時間がかかる原因は、起動時にヘルプを出力させるために補完対象のコマンドを呼び出すためです。これを %LOCALAPPDATA%\nyagos\***-subcommands.txt
というファイルにキャッシングさせました。これで、起動が遅いのはそのPCで初めて起動させた時だけになります。
なお、%LOCALAPPDATA%
は通常は %USERPROFILE%\AppData\local
と同値で、アプリケーション独自のユーザごとのデータで、かつ、別のPCに移行などする必要のないデータをおくべきフォルダーらしいです。まぁ、普通はキャッシュ置き場とかそういう奴ですよね。
(別のPCに移行する必要があるデータなどは %APPDATA%
= %USERPROFILE%\AppData\Roaming
におくらしい)
(5-3) キャッシュクリアコマンド clear_subcommands_cache
を実装
git や svn などをバージョンアップして、サブコマンドが増えた時など、キャッシュを作りなさなくてはいけません。そういった時、clear_subcommands_cache
を実行して、キャッシュを消しましょう。
(5-4) fsutil
と go
のサブコマンド補完
ついでに
(5-5) catalog/git.lua
で、 subcomplete.lua
を自動でロードするようにした
subcomplete.lua 側で何回読み込まれても1回だけ初期化するように修正してから、git.lua 側で subcomplete.lua を自動で読み込むようにしました。
また、何か追加で盛り込むかもしれませんが、今のところは以上です。