🙌

NushellのHook(フック)について

2022/12/04に公開

フック設定

フックを使用すると、規定のタイミングでコードを実行できます。フックははインタラクティブモードでのみ使用できます。
現在、次のタイプのフックをサポートしています。

  • pre_prompt : コマンドプロンプトが表示される前の時。
  • pre_execution : 入力されたコマンドが実行される前の時。
  • env_change : 環境変数が変更された時。
  • display_output : 標準出力に出力されて、表示される時。

コマンド行を評価する手順は次のとおりです。

  1. pre_prompt フックを確認して実行する
  2. env_change フックを確認して実行する
  3. プロンプトを表示してユーザー入力を待つ
  4. ユーザーが何かを入力して「Enter」を押した後: pre_execution フックを確認して実行します。
  5. ユーザー入力の解析と評価
  6. display_output が定義されている場合は、それを使用してコマンド出力を出力します
  7. 1に戻ります。

デフォルト設定は以下の通り。

hooks: {
    pre_prompt: [{
      $nothing  # replace with source code to run before the prompt is shown
    }]
    pre_execution: [{
      $nothing  # replace with source code to run before the repl input is run
    }]
    env_change: {
      PWD: [{|before, after|
        $nothing  # replace with source code to run if the PWD environment is different since the last repl input
      }]
    }
    display_output: {
      if (term size).columns >= 100 { table -e } else { table }
    }
  }

hooks設定は動的に変更可能です。例えば、表示内容のログを取得したい場合は、次のように変更します。ただし、1コマンドずつのログとなります。追記したい場合はsaveコマンドに-aオプションをつけます。

❯ let-env config = ($env.config | upsert hooks {
∙ pre_prompt: [{$nothing}]
∙ pre_execution: [{$nothing }]
∙ env_change: {PWD: [{|before, after|$nothing}]}
∙ display_output: { to html --partial --no-color | save --raw /tmp/nu-output.html }
∙ })

なおこの内容ではコマンドの結果はターミナル上には表示されません。hooksをもとに戻すか、一旦nushellを再起動させてください。

Discussion