cmdnote は、セキュリティ系コマンドや日常的な CLI コマンドをカテゴリ単位で参照し、選択したコマンド文字列を標準出力へ返せる Rust 製 TUI アプリです。入力欄への挿入は zsh / bash の shell integration で行います。TUI 内でコマンドを追加・編集・削除できます。
MVP では以下を提供します。
ratatui + crosstermによる 3 ペイン UI~/.config/cmdnote/commands.tomlの TOML 読み書き- カテゴリ絞り込み
- 全文検索
aによる TUI 内追加フォームeによる編集dによる削除確認Enterで選択コマンドを標準出力へ返して終了cmdnote initによる初期設定ファイルの自動生成cmdnote install-shell zsh|bashによる shell 設定の自動追記cmdnote shell-init zsh|bashによる入力欄連携cmdnote insertによる実験的な入力欄挿入モード- プレースホルダがある場合の簡易入力フォーム
yでクリップボードへコピーfavoriteフラグ- 将来のプレースホルダ置換に備えた構造
src/main.rs: 初期化、ターミナル制御、イベントループsrc/app.rs: アプリケーション状態の更新とキー操作src/model.rs: データモデルとAppStatesrc/store.rs: TOML の読み込み・保存src/ui.rs: 画面描画src/event.rs: crossterm イベントラッパーsrc/clipboard.rs: クリップボード連携src/filter.rs: カテゴリ絞り込みと検索src/form.rs: add/edit/placeholder のフォーム状態src/validate.rs: 入力バリデーションassets/sample_commands.toml: サンプル設定
通常利用では、次の 2 つに固定して使う想定です。
- 実行コマンド:
cmdnote - 設定ファイル:
~/.config/cmdnote/commands.toml
まず cmdnote コマンドを使えるようにします。
GitHub から入れる場合:
cargo install --git https://github.com/KASAHARA-Kyohei/cmdnote.gitローカルリポジトリから入れる場合:
cargo install --path .cargo install の後に cmdnote が見つからない場合は、~/.cargo/bin に PATH が通っているか確認してください。
初回セットアップ:
cmdnote init
cmdnote install-shell zsh
exec zshこれで以後は Ctrl-g で cmdnote を開けます。選択して Enter を押すと、コマンド文字列がシェルの入力欄に入ります。
既存ファイルをサンプルで上書きしたい場合:
cmdnote init --force通常の起動:
cmdnotecmdnote init
cmdnote install-shell zsh
exec zshその後は Ctrl-g で cmdnote を開き、選択したコマンドを入力欄へ入れられます。
cmdnote init
cmdnote install-shell bash
exec bash内部的には source <(cmdnote shell-init zsh|bash) を使っていますが、通常は install-shell が rc ファイルへ自動設定するため意識しなくて大丈夫です。
Tab,h,l: ペイン移動j,k,↑,↓: 選択移動/: 検索モードに入るa: 追加フォームを開くe: 選択中コマンドを編集d: 選択中コマンドを削除Backspace: 検索文字を削除Enter: 検索モード終了、フォーム保存、または選択中コマンドを標準出力へ返して終了y: 選択中コマンドをクリップボードへコピーq: 終了PgUp,PgDn: details ペインをスクロール
a で add フォーム、e で edit フォームを開きます。
- 入力項目:
category,title,command,description,memo,tags,favorite Tab,Shift-Tab: 項目移動Enter: 保存Esc: キャンセルfavorite:Spaceで切り替えtags: カンマ区切りで入力
id は title から自動生成され、重複時は連番サフィックスを付けて一意化します。
保存時には最低限以下を検証します。
category必須title必須command必須
保存は ~/.config/cmdnote/commands.toml へ行われ、親ディレクトリが無ければ自動作成されます。
command に {target} や {url} のようなプレースホルダが含まれている場合、Enter 時に簡易入力フォームを開きます。入力値で置換した結果を標準出力へ返して終了します。
cmdnote 本体は標準出力へ返すツールとして使います。
selected="$(cmdnote)"
printf '%s\n' "$selected"開発中だけ、cargo run と CMDNOTE_CONFIG を使います。通常利用では不要です。
別パスの設定ファイルで試す例:
CMDNOTE_CONFIG=./tmp/commands.toml cargo run -- init
CMDNOTE_CONFIG=./tmp/commands.toml cargo run開発中に shell 連携をその場だけ読み込む例:
source <(CMDNOTE_CONFIG=assets/sample_commands.toml cargo run -- shell-init zsh)cargo run で通常起動する例:
cargo run -- init
cargo run実験的な入力欄挿入モード:
cargo run -- insert生成される zsh widget は次のとおりです。
cmdinsert() {
local selected
selected="$(cmdnote </dev/tty)" || return
[[ -n "$selected" ]] || return
LBUFFER+="$selected"
zle reset-prompt
}
zle -N cmdinsert
bindkey '^g' cmdinsertcmdnote insert は TIOCSTI を使った実験的な補助モードです。環境によっては動かないため、配布用途では shell-init を推奨します。
より実用的なカテゴリ別サンプルは assets/sample_commands.toml を参照してください。
version = 1
[[commands]]
id = "nmap_tcp_syn"
category = "network"
title = "Nmap SYN scan"
command = "nmap -sS -T4 {target}"
description = "基本的なTCP SYNスキャンを実行します。"
memo = "自分用メモ"
tags = ["nmap", "scan"]
favorite = truefavoriteの切り替え操作- ソート順の切り替え
- プレビュー内でのシンタックスハイライト
- シェル補完や
zsh/fish連携 tmuxやクリップボード周りの追加連携- よりリッチなプレースホルダ入力 UI
- 入力履歴やテンプレート管理
- Linux で
yを使う場合、実行環境によってはクリップボード機能に GUI セッション依存の制約があります。 - 初回起動時に設定ファイルが無くても、
aで追加して保存すれば自動作成されます。