Goal: Replace the current single cut/yank slot with a small Emacs-shaped kill ring.
Context: Cortex already has mark, region cut, C-k, and C-y in the local editor surface.
The PRD calls for a real ring with yank-pop behavior.
This is core editing feel, not a broad feature expansion.
Proposed approach:
- Store killed text in a bounded ring instead of one optional string.
- Push region kills and line kills onto the ring.
- Keep
C-y yanking the most recent entry.
- Add yank-pop with
M-y only immediately after a yank.
- Keep behavior simple when there is no prior yank: show a status message and leave the buffer unchanged.
- Preserve dirty state and point behavior across kill, yank, undo, and redo.
Acceptance criteria:
- Multiple kills are retained in newest-first ring order.
C-y inserts the newest kill at point.
M-y after C-y replaces the just-yanked text with the previous ring entry.
M-y without a preceding yank reports a clear no-op status.
- Undo cleanly reverses kill, yank, and yank-pop edits.
- Region state is cleared after edits that should clear it.
- Existing kill line, kill region, save, search, picker, and quit behavior still works.
Verification:
- Run
cargo test.
- Manually kill two different chunks, yank, yank-pop, undo, redo, save, and quit.
- Manually confirm terminal cleanup after exit.
Out of scope:
- System clipboard integration.
- Persistent kill history.
- Emacs-compatible kill coalescing across every edge case.
- Visual kill ring browser.
Goal: Replace the current single cut/yank slot with a small Emacs-shaped kill ring.
Context: Cortex already has mark, region cut,
C-k, andC-yin the local editor surface.The PRD calls for a real ring with yank-pop behavior.
This is core editing feel, not a broad feature expansion.
Proposed approach:
C-yyanking the most recent entry.M-yonly immediately after a yank.Acceptance criteria:
C-yinserts the newest kill at point.M-yafterC-yreplaces the just-yanked text with the previous ring entry.M-ywithout a preceding yank reports a clear no-op status.Verification:
cargo test.Out of scope: