はじめに
メモ運用が続かない最大の原因は、保存ではなく取り出しにあります。メモアプリに書いたコマンドや定型文は、開いて・探して・コピーして・戻って・貼り付ける、という往復を挟まないと使えません。この距離がある限り、せっかく集めた情報は死蔵品になります。
そこで個人開発で、プレーンテキストのメモを「すぐ使える道具」にするツールを2つ作りました。
この記事では、Bash でコマンドメモをすぐ呼び出す CLI ツール bashmemo と、Windows で定型文やコマンドを即貼り付けできる常駐ランチャー TextDock を紹介します。
-
bashmemo: よく使うコマンドを Bash ヒストリに読み込み、↑キーや
Ctrl+Rで呼び出せる CLI ツール -
TextDock: Windows 常駐のテキストランチャー。
Ctrl+Spaceで呼び出して、定型文やコマンドを直前のアプリに貼り付け
どちらもメモの実体はただのテキストファイルです。CLI と GUI の両方から、同じメモ資産を使い回せるようにしています。この記事では、それぞれの技術的な仕組みを中心に紹介します。
bashmemo ─ メモを Bash ヒストリに注入する
@ docker と打つと、docker メモの中身が表示され、各行がヒストリに積まれます。あとは↑キーを押せばワンライナーが順に出てくるので、必要なら引数を書き換えて Enter するだけです。
$ @ docker
# --- docker ---
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
docker system df
docker images --format '{{.Repository}}:{{.Tag}}\t{{.Size}}'
$ # ここで ↑ キーを押すと上のコマンドが呼び出せる
なぜ「表示」ではなく「ヒストリ注入」なのか
普通にシェルスクリプトとしてメモ読み込みを実装すると、スクリプトは子プロセスで実行されます。子プロセスから親シェルのヒストリは書き換えられないので、「表示してコピペしてもらう」以上のことができません。多くのチートシートツールが「選択したコマンドを標準出力やクリップボードに出す」設計になっているのはこのためです。
bashmemo はスクリプトを source で現在のシェル内で実行します。そのうえで Bash ビルトインの history -s を使うと、コマンドを実行せずにヒストリへ積むことができます。
history -s "docker system df" # 実行はされないが ↑ で呼び出せるようになる
source 実行はシェル環境を汚しがちですが、スクリプト内で定義した関数を最後に unset して片付けるので、シェルはクリーンに保たれます。
ヒストリに入るということは、Bash のヒストリ機能がすべてそのまま使えるということです。Ctrl+R のインクリメンタル検索、HISTCONTROL による重複排除、ヒストリ展開。「メモ専用の UI」を作り込む代わりに、全員が既に指に馴染んでいるヒストリ操作をそのまま UI にする、というのが bashmemo の設計です。実装は Bash スクリプト2つだけで、依存もありません。
TextDock ─ 直前のアプリに貼り付ける Windows 常駐ランチャー
Ctrl+Space でマウスカーソルの近くにウィンドウが出て、メモの行を選ぶと直前まで使っていたアプリにそのまま貼り付きます。メモアプリとの往復がなくなり、呼び出しから貼り付けまでが一瞬で完結します。
Ctrl+V が効かないアプリと、貼り付け3方式
技術的に面白いのはここです。「アクティブなアプリにテキストを貼り付ける」というのは、Windows では見た目ほど単純ではありません。ターミナル系や IME が絡む入力欄など、クリップボード経由の貼り付けをうまく受け付けないアプリがあるのです。
そこで TextDock は3つの貼り付け方式を実装していて、アプリごとにどの方式を使うか設定できます。
| 方式 | 仕組み | 向いている場面 |
|---|---|---|
| Clipboard | クリップボードにセットして Ctrl+V を送出 |
大半のアプリ。長文でも速い |
| WM_CHAR | ウィンドウメッセージとして1文字ずつ送信 |
Ctrl+V を横取りされるアプリ |
| SendInput | キーボード入力そのものを合成 | 実際のタイプ入力しか受け付けないアプリ |
Clipboard 方式は速くて確実ですが、Ctrl+V に独自機能を割り当てているアプリでは化けます。WM_CHAR はターゲットのウィンドウに直接文字メッセージを送るので貼り付けキーに依存しませんが、メッセージを無視する実装もあります。SendInput は OS のキーボード入力として合成するため最も「本物のタイプ」に近く、頑固なアプリにも通りますが、その分だけ遅くなります。
もうひとつ地味に大事なのがクリップボード保護です。Clipboard 方式で貼り付けたあと、元のクリップボードの内容を自動で復元します。「貼り付けたらさっきコピーしたものが消えていた」というスニペットツールにありがちなストレスを避ける設計です。
CLI と GUI で同じメモ資産を使い回す
2つのツールをつなぐのが「メモの実体はただのテキストファイル」という共通の設計です。1行1コマンド(定型文)のプレーンテキストなので、grep も diff も Git 管理も同期も好きにできます。
WSL のディストリビューションにドライブ名を割り当てれば、同じメモフォルダを両方から読み書きできます。
net use W: \\wsl$\Ubuntu
あとは TextDock のメモフォルダとして W:\home\you\scripts\bashmemo\memofiles のように指定すれば、ターミナルの中では @ docker でヒストリに注入、Windows アプリへは TextDock で貼り付け、という体制になります。1つのプレーンテキスト資産を Windows / WSL 横断で、CLI と GUI の両方から使い回せる、というわけです。
おわりに
どちらも MIT ライセンスで公開しています。
インストール方法や実践的な運用パターン(@+ でヒストリからメモを育てる、チームで memofiles を Git 共有する、など)は Zenn に書いた元記事に詳しくまとめています。
フィードバックや PR も歓迎です。
まず試すなら、bashmemo では git や docker のような小さなコマンドメモを1つ作るのがおすすめです。TextDock では、メール返信・AIプロンプト・よく使うコマンドなど、毎日コピペしているものを1ファイルにまとめると効果が分かりやすいです。
「こういうメモを入れてみた」「このアプリでは貼り付け方式を変えると動いた」などの使用例があれば、Issue やコメントで教えてもらえると嬉しいです。
