💭

nushellのコマンド補完などはnu_scriptsにあるよという話

2024/12/04に公開

自己紹介と導入

nushellを1年ほど前に知り、それ以来ずっと普段使いしているtsukimikazeと申します。
事あるごとに周囲の人間にも布教をしているのですが、その際によく指摘されるのが、gitなどの一般的なコマンドの補完がデフォルトで効かない点です。

これについて、大抵のものは https://github.com/nushell/nu_scripts にあるということの紹介と自作した簡単なインストーラーの説明をしようと思います。

nu_scriptsについて

https://github.com/nushell/nu_scripts/tree/main/custom-completions にgitやnpmやmakeやjustなど、大抵のコマンドの補完が揃っています。
私はあまりちゃんと見ていませんが補完の他にもcustom-menuやaliasesなどにも定義例がたくさんあり、そのまま使うなり参考にするなりできそうです。

自作のパーケージインストーラーくんについて

nu_scriptsの補完などを利用するにはnushellの設定ディレクトリにファイルを配置してconfig.nuなどでsourceで読み込む必要があります。
これを簡単にするために単純なパーケージインストーラーモジュールを作りました。

module plug {
  def plugins_file [] {
    $nu.default-config-dir | path join 'plugins.nu'
  }

  def gc [] {
    open (plugins_file)
      | lines
      | uniq
      | filter {|l| $l != ""}
      | to text
      | save (plugins_file) -f
  }

  export def install [file_url : string] {
    let plugin_file = (curl $file_url)

    let plugin_name = $file_url 
            | path split 
            | last

    let plugin_path = $nu.default-config-dir 
            | path join 'plugins' 
            | path join $plugin_name

    $plugin_file | save $plugin_path -f

    $'source "($plugin_path)"' 
      | save (plugins_file) --append
    
    gc
  }
}

plugモジュールのインストール方法

  1. このスクリプトをconfig.nuに貼り付けてその下で use plug を呼ぶか、ファイルに保存して source plug.nu のように読み込みその下で use plug します。
  2. $nu.default-config-dirplugins.nu という空ファイルを作成します。
  3. $nu.default-config-dirplugins という空ディレクトリを作成します。

これでセットアップが完了します。簡単ですね。

実装に関する余談

コードを書いていて地味に感動したのが gc 関数です。これは plugins.nu 内の空行や被っている行を削除する関数ですが、全く同じようにbashで書こうとするとplugins_fileが書き込みモードで開かれることになりファイル内容が消えるバグが発生してしまいます。nushellではそのあたりもよろしくやってくれているようで発生しません。(注: 最初にこのコードを書いた当時は collect {|| save (plugins_file) -f}) のように書く必要があったのですがいつのまにか仕様が変わったようです。)

ただ型が付いているというだけではなく、ちゃんと安全性や直感的な動作を追い求める姿勢が感じられます。

使い方

nu_scriptsの好きなファイルのRawボタンから遷移してURLをコピーして

plug install https://raw.githubusercontent.com/nushell/nu_scripts/refs/heads/main/custom-completions/git/git-completions.nu 

のように plug install でインストールできます。

あとがきとnupmについて

nu_scriptsと自作のパーケージインストーラーくんを紹介しました。

現在nupmというパッケージマネージャーが開発中だそうです。
そのうちこちらを使う方が良くなるのかもしれません。

Discussion