Skip to content

feat: ファイルペインのツリーを修飾キー付きでクリックしたら、そのパスをターミナルに挿入してほしい #1859

Description

@Taka499

既存 issue は検索済みで、同じことを扱っているものはありませんでした。関連は上記のクローズ済み 4 件と、逆方向の
#778(ターミナル出力中のパスをクリックしてペインで開く)、#1610(CLI から GUI 側でファイルを開く)です。

現状の確認(4.10.1 のソースを読んだ範囲)

  • src/components/FilesPane.vue のツリー行は @click="openFile(node)" を持つだけの <button> で、
    修飾キーの判定もコンテキストメニューもドラッグもありません。Cmd を押しながら押しても、ただ普通に
    ファイルが開くだけです。
  • 一番近い既存機能はヘッダーの既定ボタン pick-file(クリップのアイコン、"Insert a file path"、
    server/config/header-config.ts)で、選んだパスを実際にセッションへ打鍵します
    src/composables/useHeaderAction.tspickPathsinsertText)。ただし入口が
    サーバー機の OS ファイルダイアログなので、目の前に開いているツリーからは選べず、ブラウザと
    サーバーが別マシンだと使えません。

触ることになりそうなところ

  • src/components/FilesPane.vue — ツリー行のクリックハンドラで event.metaKey / ctrlKey を見て分岐。
    Node.path は root からの相対パスなので、絶対パスは props.cwd と結合すれば作れます
    src/composables/canvasOpenFile.tsabsoluteUnder が既にあります)。
  • 挿入するテキストの組み立てとクォートは src/components/dropPaths.tstoShellArg /
    toInsertText がそのまま使えます(空白や特殊文字を単一引用符で包み、末尾に区切りの空白を足す)。
    打鍵は insertText(slotKey, text)src/composables/useTerminalConnections.ts)。
  • 宛先のターミナルをどう受け取るかが唯一の設計上の穴です。 ペインは 2 箇所からマウントされます。
    TerminalGrid.vue(拡大セルの隣)は宛先のセルが決まりますが、FilesOverlay.vue(全画面の Files)
    には隣のターミナルがありません。ペイン自身は宛先を知らないので、
    「挿入先があるときだけ渡される callback を prop で受け取り、無ければこの挙動を出さない」形に
    なると思います(canvasTarget prop が既に同じ形で「隣にセルがあるときだけ Canvas ボタンを出す」
    ことをやっているので、それに倣う想定です)。

決めていただきたい点

  1. 挿入するのは相対パスか絶対パスか。 ツリーの root は拡大セルのディレクトリなので、そのセルの
    エージェントに渡すぶんには相対パスで足ります。ただし cd した後だと壊れるので、絶対パスのほうが
    安全という判断もあると思います(pick-file と D&D はどちらも絶対パスを入れています)。
  2. 修飾キーで良いか。 VS Code に合わせると Cmd+クリックですが、発見しづらく、keymap の既存
    バインドとも衝突しえます。ホバー時の小さなアイコン、あるいはコンテキストメニューのほうが
    この repo の流儀に合うなら、そちらでも目的は達せられます。
  3. ディレクトリでも同じ挙動にするか(末尾スラッシュを付けるかどうかを含めて)。
  4. 全画面の Files ビューでは、この操作は出さない(宛先が無いため)という割り切りで良いか。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions