👌

Nushellのカスタムメニュー

2022/11/30に公開

Nushellのカスタムメニュー

メニュー設定とメニューを起動するためのキー設定をする必要があります。

今回はお気に入りのディレクトリを記載したファイルをからメニューを作成して、cdなどで候補一覧を出せるようにしてみます。

メニュー項目記載ファイルパス設定:config.nuの先頭あたり

let fv_list_file = "/home/kawa90/.config/nushell/favorite_dir.txt" # full path

メニュー設定:config.numenu

      {
        # メニュー名称を設定
        name: fv_menu
        # trueの場合、メニュー起動時に`source`に基づきリスト作成
        only_buffer_difference: true 
        marker: "# "
        type: {
          # メニューのレイアウト
          layout: list
          page_size: 10
        }
        style: {
            # メニューリストの通常文字色
            text: green
            # メニュー選択時の文字色
            selected_text: green_reverse
            # description(optional)があれば、その文字色で表示
            description_text: yellow
        }
        source: { |buffer, position|
            # ここでは、$fv_list_fileに記載のディレクトリストをメニュー項目としている。
            open $fv_list_file | lines
            | each { |it| {value: $it} }
        }
      }

NushellマニュアルMenus記載の下記のrecordsource:で応答するようにする。ただこのコンテキストではconfig.nuで定義した以外のグローバル変数はアクセスできないようだ($nuなどは除外のようだ)。このため、$fv_list_fileconfig.nu先頭で定義している。

{
  value:       # The value that will be inserted in the buffer
  description: # Optional. Description that will be display with the selected value
  span: {      # Optional. Span indicating what section of the string will be replaced by the value
    start:
    end:
  }
  extra: [string] # Optional. A list of strings that will be displayed with the selected value. Only works with a description menu
}

キー設定:config.nukeybindings

    {
      # 作成したメニュー名を指定
      name: fv_menu
      # キーの修飾キー(alt/ctrl/shft/control | alt/control | shift)
      modifier: control
      # キー名称(char_文字, TAB, backspace, insertなど)
      # keybindings listenコマンドで確認できる
      keycode: char_t
      # 編集モード(vi挿入モード:vi_insertなど)で使用できるか決める
      mode: [emacs, vi_normal, vi_insert] # Options: emacs vi_normal vi_insert
      # キー押下時に、menuイベント及び、メニュー名称を送信する。
      event: { send: menu name: fv_menu }
    }

cdと入力したところで、Ctrl-t押下で下記のようなメニューリストが表示され、選択項目がコマンドラインに反映された。

❯ # cd 
0: ~/work/deno/ansi_escape
1: ~/work/deno
2: ~/Documents/Zenn_Contents/
Page 1: records 0 - 2  total: 3  

Tips

keybindings listen

built-inコマンドのkeybindings listenでは押下したキー情報を表示する。終了はESCキーとなっている。

❯ keybindings listen
Type any key combination to see key details. Press ESC to abort.
char: a, code: 0x000061, modifier: NONE, flags: 0b000000
char: b, code: 0x000062, modifier: NONE, flags: 0b000000
char: c, code: 0x000063, modifier: NONE, flags: 0b000000
char: c, code: 0x000063, modifier: CONTROL, flags: 0b000010

keybindingsのキー設定

Terminalのキー設定およびnushellデフォルトのキー設定とかぶらないようにする。

デフォルトのキー設定

built-inコマンドのkeybindings defaultで確認できる。

❯ keybindings default | first 4
╭───┬───────┬──────────┬───────────┬────────────────────────╮
│ # │ mode  │ modifier │   code    │         event          │
├───┼───────┼──────────┼───────────┼────────────────────────┤
│ 0 │ emacs │ ALT      │ Backspace │ Edit([BackspaceWord])  │
│ 1 │ emacs │ ALT      │ Char('b') │ Edit([MoveWordLeft])   │
│ 2 │ emacs │ ALT      │ Char('c') │ Edit([CapitalizeChar]) │
│ 3 │ emacs │ ALT      │ Char('d') │ Edit([CutWordRight])   │
╰───┴───────┴──────────┴───────────┴────────────────────────╯

VSCodeのextension

VSCode使っているならvscode-nushell-langをインストールしたほうがいいかも。編集支援とsyntax ハイライトに対応している。

Discussion