-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Kitty graphics: Implement remaining delete selectors and case-sensitive layer distinction #5710
Description
Context
The Kitty graphics protocol a=d (delete) action supports many selectors for targeting specific images. Currently only a/A (delete all) and i/I (delete by image ID) are implemented. All other selectors are silently ignored (see _handleDelete() default branch).
Additionally, the spec distinguishes lowercase selectors (delete placements only, keep stored data) from uppercase (delete placements AND free stored image data). The current implementation treats both the same — it always frees everything. There is a TODO at line 277 of KittyGraphicsHandler.ts noting this.
Note: The current d=a implementation also deletes ALL images including offscreen stored data. Per spec, d=a should only delete "all placements visible on screen" — offscreen/stored-but-not-placed images should be preserved. This needs to be fixed as part of this issue.
What needs to happen
-
Fix
d=ascope:d=ashould only delete placements visible on screen, not all stored image data. Offscreen images (stored viaa=tbut never placed, or scrolled out of view) should be preserved.d=Ashould delete visible placements AND free their stored image data. -
Implement missing delete selectors in
KittyGraphicsHandler._handleDelete():c/C— delete image at cursor positionn/N— delete images with ID >= the specified IDp/P— delete image by placement ID (requirespkey + optionallyikey)q/Q— delete images whose placement intersects the cursor cellr/R— delete images intersecting a row range (usesx/ykeys for row bounds)x/X— delete images intersecting a column rangey/Y— delete images at a specific cell positionz/Z— delete images at a specific z-indexf/F— delete animation frames (depends on animation support)
-
Implement case distinction:
- Lowercase selector → delete the on-screen placement only, keep the stored image data in
_imagesmap soa=pcan re-place it later - Uppercase selector → delete placement AND free stored image data from
_images
- Lowercase selector → delete the on-screen placement only, keep the stored image data in
-
Add positional query support to
KittyImageStorage:- Currently only has
deleteById()anddeleteAll()— no way to query "which images intersect row 5?" or "which images are at cursor position?" - Needs methods like
deleteAtCursorPosition(),deleteByRowRange(),deleteByColumnRange(),deleteByZIndex(), etc.
- Currently only has
Spec reference
https://sw.kovidgoyal.net/kitty/graphics-protocol/#deleting-images
Key files
addons/addon-image/src/kitty/KittyGraphicsHandler.ts—_handleDelete()(line ~270)addons/addon-image/src/kitty/KittyImageStorage.ts— needs new positional delete methodsaddons/addon-image/test/KittyGraphics.test.ts— integration tests
Acceptance criteria
d=aonly deletes placements visible on screen, not all stored datad=Adeletes visible placements AND frees stored image data- Each selector (
c,n,p,q,r,x,y,z) correctly deletes matching images - Lowercase selectors preserve stored image data; uppercase selectors free it
d=p,i=3,p=5deletes only placement 5 of image 3d=r,x=2,y=8deletes images intersecting rows 2–8- Integration tests verify each selector
Discussion
See feature inventory §9.3–9.13 in #5683