Skip to content

存在しないファイルを指定したときに新規バッファとして開けない #88

Description

@goofmint

症状

存在しないパスを指定して起動すると、編集画面が出ず No editor open. になる。

./dist/tecode-darwin-arm64 README2.md

期待する挙動は、メモリ上の空バッファとして開いて編集でき、保存した時点でファイルが作成されること。

原因

保存側は既に対応済みで、欠けているのは開く側だけ。

buffer/documentManager.tssaveNow は、書き込み先の statENOENT を返す場合を「新規ファイルの初回保存」として明示的に許容している(それ以外の stat 失敗のみ中断する)。つまり save() はファイルを作成できる。

不足しているのは次の 2 点。

1. cli/argv.tsresolveStartupTarget — 存在しないパスを警告して捨て、initialFilePath を付けずに { workspaceRoot: cwd } を返す。

}catch(cause){log.append("warning",{message: `Startup path "${resolved}" does not exist or could not be read (...); starting with no workspace.`,path: resolved,});return{workspaceRoot: cwd};}

2. buffer/documentManager.tsopenDocumentreadFile の失敗を一律にエラー報告して throw する。ENOENT も他の失敗と区別していない。

try{conststat=awaitfs.stat(path);readonly=stat.size>=LARGE_FILE_THRESHOLD_BYTES;text=awaitfs.readFile(path,"utf8");}catch(cause){// ENOENT も EACCES/EIO と同じ扱いになっているthrowcause;}

対応方針

ENOENT だけを「まだ存在しない新規ファイル」として分岐させ、空テキストの文書を作る。EACCES / EIO など他の失敗は現状どおりエラーとして報告し throw する — 権限エラーを空バッファとして黙って開くと、保存時に上書き扱いで混乱を招く。

argv.ts 側も同様に、ENOENT のときだけ新規ファイルとして扱う。

設計上の判断が要る点

  • 親ディレクトリが存在しない場合a/b/c.txta/b がない)。安全側に倒すなら、親が存在するときのみ新規ファイルとして開き、そうでなければ現状どおり警告する。深いパスのタイプミスで黙ってエディタが開く方が分かりにくい。
  • 新規バッファを dirty にするか。しない方が良い。未編集の新規バッファで終了時に保存確認が出るのは不自然。結果として、一度も編集せずに保存してもファイルは作られないが、それは妥当な挙動。
  • ディレクトリとして解釈すべきパスとの区別。現状 statisDirectory() で分岐しているが、存在しないパスではその情報がない。末尾スラッシュの扱いを決める必要がある。

回帰防止

存在しないファイルを指定して起動 → 編集 → 保存 → 実ファイルがディスク上に作成され、内容が一致することを、実 fs を通して検証するテストが必要。documentManager 単体だけでなく、argv の解決を含めた経路で確認したい。

EACCES が空バッファとして開かれてしまわないことも、併せて固定しておきたい。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions