Repository: sinelaw/fresh (2026-04-20T13:59:40Z)

Issue:
Add command to tool palette to unconditionally repaint the whole console display?
While using Fresh on MacOS in an iTerm2 console window, I was browsing several files, and after finding what I was looking for, I selected the text and typed CTRL-C to copy the text into the clipboard.  This caused iTerm2 to print some diagnostic to the screen that caused some minor amount of screen corruption.  I was dumb and didn't capture what it wrote; and as it happens, I can't seem to reproduce it now, unfortunately, so I can't take a screenshot or cut-n-paste the results.  I did try to use CTRL-L to refresh the console, since that is a common key combination for such a feature; however, this did not alter the state of the display.

I should note that the text files I'm editing were not altered; the contents of the buffers remained intact.  This is purely a cosmetic concern.

I could get Fresh to individually redraw bits and pieces of the screen, by scrolling or resizing panels.  However, because Fresh only redraws _exactly_ what it has to on the console, assuming all other character cells are blank, it would be convenient for these rare cases to provide a "clear and redraw the whole screen" command accessible via the command palette.

Apologies if this feature already exists; however, I couldn't find it.  Thanks!

**EDIT:** Ah ha!  I finally got a reproduction of what happened to my display!

```
     ) -> Result<RegisterTask> {
│          > policy                                   │  548 │ 2026-02-19 13:31:00.449 fresh[74816:120644898] -[NSPasteboard _setData:forType:index:usesPboardTypes:] returns false. Type: public.utf8-plain-tex , index: 0, object class: __NSCFString.
│              filter.rs                              │  550 │
```

Despite the ominous sounding warning, the text does successfully copy into the clipboard.  But that diagnostic will remain on the display until I do something which forces Fresh to repaint its display.



Discussion:
Added



Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 42b8b7e4e..b3c2b7f56 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@
 
 ### Improvements
 
+* **Redraw Screen command** (#1070): Added a "Redraw Screen" entry to the command palette (action `redraw_screen`) that clears the terminal and fully repaints the UI. Useful when an external program (e.g. a macOS pasteboard diagnostic leaked by the host terminal on Ctrl+C) scribbles over the TUI and leaves ghost text behind.
+
 * **PageUp/PageDown in wrapped buffers**: Page motion is now view-row-aware, so paging through heavily wrapped text no longer stalls mid-buffer and the cursor stays visible after every press. Each page also keeps 3 rows of overlap with the previous page (matching vim / less) so you don't lose context across the jump.
 
 * **Smarter char-wrapping of long tokens**: When a token has to be split mid-word because it doesn't fit on a fresh line, the break now prefers a UAX #29 word boundary within a lookback window instead of an arbitrary grapheme position — e.g. `dialog.getButton(DialogInterface.BUTTON_NEUTRAL).setOnClickListener` now wraps after `BUTTON_NEUTRAL` rather than mid-identifier.
diff --git a/crates/fresh-editor/locales/cs.json b/crates/fresh-editor/locales/cs.json
index e9ed6a527..d7b70f6a1 100644
--- a/crates/fresh-editor/locales/cs.json
+++ b/crates/fresh-editor/locales/cs.json
@@ -169,6 +169,7 @@
   "action.quit": "Ukončit editor",
   "action.recenter": "Vycentrovat pohled na kurzor",
   "action.redo": "Znovu",
+  "action.redraw_screen": "Překreslit obrazovku",
   "action.reload_with_encoding": "Znovu načíst soubor s konkrétním kódováním",
   "action.remove_ruler": "Odstranit pravítko",
   "action.remove_secondary_cursors": "Odstranit sekundární kurzory",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Přepnout nahrávání makra pro registr (0-9)",
   "cmd.redo": "Znovu",
   "cmd.redo_desc": "Znovu provést poslední odvolanou úpravu",
+  "cmd.redraw_screen": "Překreslit obrazovku",
+  "cmd.redraw_screen_desc": "Vymazat a plně překreslit obrazovku pro opravu poškozeného zobrazení",
   "cmd.reload_with_encoding": "Znovu načíst s kódováním...",
   "cmd.reload_with_encoding_desc": "Znovu načíst soubor s jiným kódováním",
   "cmd.remove_ruler": "Odstranit pravítko",
diff --git a/crates/fresh-editor/locales/de.json b/crates/fresh-editor/locales/de.json
index 658852c2b..5061a95c4 100644
--- a/crates/fresh-editor/locales/de.json
+++ b/crates/fresh-editor/locales/de.json
@@ -169,6 +169,7 @@
   "action.quit": "Editor beenden",
   "action.recenter": "Ansicht auf Cursor zentrieren",
   "action.redo": "Wiederholen",
+  "action.redraw_screen": "Bildschirm neu zeichnen",
   "action.reload_with_encoding": "Datei mit bestimmter Kodierung neu laden",
   "action.remove_ruler": "Lineal entfernen",
   "action.remove_secondary_cursors": "Sekundäre Cursor entfernen",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Makroaufzeichnung für ein Register umschalten (0-9)",
   "cmd.redo": "Wiederholen",
   "cmd.redo_desc": "Die letzte rückgängig gemachte Bearbeitung wiederholen",
+  "cmd.redraw_screen": "Bildschirm neu zeichnen",
+  "cmd.redraw_screen_desc": "Bildschirm löschen und vollständig neu zeichnen, um Anzeigefehler zu beheben",
   "cmd.reload_with_encoding": "Mit Kodierung neu laden...",
   "cmd.reload_with_encoding_desc": "Die Datei mit einer anderen Kodierung neu laden",
   "cmd.remove_ruler": "Lineal entfernen",
diff --git a/crates/fresh-editor/locales/en.json b/crates/fresh-editor/locales/en.json
index 6fab756ab..5c5dbee31 100644
--- a/crates/fresh-editor/locales/en.json
+++ b/crates/fresh-editor/locales/en.json
@@ -167,6 +167,7 @@
   "action.force_quit": "Quit editor (discard unsaved changes)",
   "action.recenter": "Recenter view on cursor",
   "action.redo": "Redo",
+  "action.redraw_screen": "Redraw screen",
   "action.remove_ruler": "Remove ruler",
   "action.remove_secondary_cursors": "Remove secondary cursors",
   "action.replace": "Replace text in buffer",
@@ -535,6 +536,8 @@
   "cmd.record_macro_desc": "Toggle macro recording for a register (0-9)",
   "cmd.redo": "Redo",
   "cmd.redo_desc": "Redo the last undone edit",
+  "cmd.redraw_screen": "Redraw Screen",
+  "cmd.redraw_screen_desc": "Clear and fully repaint the screen to fix display corruption",
   "cmd.remove_ruler": "Remove Ruler",
   "cmd.remove_ruler_desc": "Remove a vertical ruler line",
   "cmd.remove_secondary_cursors": "Remove Secondary Cursors",
diff --git a/crates/fresh-editor/locales/es.json b/crates/fresh-editor/locales/es.json
index 6aed5b48f..56d238688 100644
--- a/crates/fresh-editor/locales/es.json
+++ b/crates/fresh-editor/locales/es.json
@@ -169,6 +169,7 @@
   "action.quit": "Salir del editor",
   "action.recenter": "Recentrar vista en cursor",
   "action.redo": "Rehacer",
+  "action.redraw_screen": "Redibujar pantalla",
   "action.reload_with_encoding": "Recargar archivo con codificación específica",
   "action.remove_ruler": "Eliminar guía",
   "action.remove_secondary_cursors": "Eliminar cursores secundarios",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Alternar grabación de macro para un registro (0-9)",
   "cmd.redo": "Rehacer",
   "cmd.redo_desc": "Rehacer la última edición deshecha",
+  "cmd.redraw_screen": "Redibujar pantalla",
+  "cmd.redraw_screen_desc": "Borrar y repintar por completo la pantalla para corregir errores de visualización",
   "cmd.reload_with_encoding": "Recargar con codificación...",
   "cmd.reload_with_encoding_desc": "Recargar el archivo con una codificación diferente",
   "cmd.remove_ruler": "Eliminar guía",
diff --git a/crates/fresh-editor/locales/fr.json b/crates/fresh-editor/locales/fr.json
index b87d6e551..d8f21cd76 100644
--- a/crates/fresh-editor/locales/fr.json
+++ b/crates/fresh-editor/locales/fr.json
@@ -169,6 +169,7 @@
   "action.quit": "Quitter l'éditeur",
   "action.recenter": "Recentrer la vue sur le curseur",
   "action.redo": "Refaire",
+  "action.redraw_screen": "Redessiner l'écran",
   "action.reload_with_encoding": "Recharger le fichier avec un encodage spécifique",
   "action.remove_ruler": "Supprimer un repère",
   "action.remove_secondary_cursors": "Supprimer les curseurs secondaires",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Basculer l'enregistrement de macro pour un registre (0-9)",
   "cmd.redo": "Refaire",
   "cmd.redo_desc": "Refaire la dernière modification annulée",
+  "cmd.redraw_screen": "Redessiner l'écran",
+  "cmd.redraw_screen_desc": "Effacer et repeindre entièrement l'écran pour corriger les problèmes d'affichage",
   "cmd.reload_with_encoding": "Recharger avec un encodage...",
   "cmd.reload_with_encoding_desc": "Recharger le fichier avec un encodage différent",
   "cmd.remove_ruler": "Supprimer un repère",
diff --git a/crates/fresh-editor/locales/it.json b/crates/fresh-editor/locales/it.json
index c563003b6..ec14703b8 100644
--- a/crates/fresh-editor/locales/it.json
+++ b/crates/fresh-editor/locales/it.json
@@ -169,6 +169,7 @@
   "action.quit": "Esci dall'editor",
   "action.recenter": "Ricentra vista sul cursore",
   "action.redo": "Ripristina",
+  "action.redraw_screen": "Ridisegna schermo",
   "action.reload_with_encoding": "Reload file with specific encoding",
   "action.remove_ruler": "Rimuovi righello",
   "action.remove_secondary_cursors": "Rimuovi cursori secondari",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Attiva/disattiva la registrazione macro per un registro (0-9)",
   "cmd.redo": "Ripristina",
   "cmd.redo_desc": "Ripristina l'ultima modifica annullata",
+  "cmd.redraw_screen": "Ridisegna schermo",
+  "cmd.redraw_screen_desc": "Cancella e ridisegna completamente lo schermo per correggere errori di visualizzazione",
   "cmd.reload_with_encoding": "Ricarica con codifica...",
   "cmd.reload_with_encoding_desc": "Ricarica il file con una codifica diversa",
   "cmd.remove_ruler": "Rimuovi righello",
diff --git a/crates/fresh-editor/locales/ja.json b/crates/fresh-editor/locales/ja.json
index c7b04087b..d6ef59951 100644
--- a/crates/fresh-editor/locales/ja.json
+++ b/crates/fresh-editor/locales/ja.json
@@ -169,6 +169,7 @@
   "action.quit": "エディタを終了",
   "action.recenter": "カーソルを中央に表示",
   "action.redo": "やり直し",
+  "action.redraw_screen": "画面を再描画",
   "action.reload_with_encoding": "Reload file with specific encoding",
   "action.remove_ruler": "ルーラーを削除",
   "action.remove_secondary_cursors": "セカンダリカーソルを削除",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "レジスタ（0-9）のマクロ記録を切り替えます",
   "cmd.redo": "やり直し",
   "cmd.redo_desc": "最後の編集をやり直します",
+  "cmd.redraw_screen": "画面を再描画",
+  "cmd.redraw_screen_desc": "画面をクリアして完全に再描画し、表示の崩れを修正します",
   "cmd.reload_with_encoding": "エンコーディングを指定して再読み込み...",
   "cmd.reload_with_encoding_desc": "別のエンコーディングでファイルを再読み込みします",
   "cmd.remove_ruler": "ルーラーを削除",
diff --git a/crates/fresh-editor/locales/ko.json b/crates/fresh-editor/locales/ko.json
index c3b7a09f9..30369e4e3 100644
--- a/crates/fresh-editor/locales/ko.json
+++ b/crates/fresh-editor/locales/ko.json
@@ -169,6 +169,7 @@
   "action.quit": "편집기 종료",
   "action.recenter": "커서에 화면 중앙 맞추기",
   "action.redo": "다시 실행",
+  "action.redraw_screen": "화면 다시 그리기",
   "action.reload_with_encoding": "Reload file with specific encoding",
   "action.remove_ruler": "눈금자 제거",
   "action.remove_secondary_cursors": "보조 커서 제거",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "레지스터의 매크로 녹화 전환 (0-9)",
   "cmd.redo": "다시 실행",
   "cmd.redo_desc": "마지막으로 취소한 편집 다시 실행",
+  "cmd.redraw_screen": "화면 다시 그리기",
+  "cmd.redraw_screen_desc": "화면을 지우고 완전히 다시 그려 표시 오류를 복구합니다",
   "cmd.reload_with_encoding": "인코딩으로 다시 불러오기...",
   "cmd.reload_with_encoding_desc": "다른 인코딩으로 파일을 다시 불러옵니다",
   "cmd.remove_ruler": "눈금자 제거",
diff --git a/crates/fresh-editor/locales/pt-BR.json b/crates/fresh-editor/locales/pt-BR.json
index 49c41fdad..c33e2b7cc 100644
--- a/crates/fresh-editor/locales/pt-BR.json
+++ b/crates/fresh-editor/locales/pt-BR.json
@@ -169,6 +169,7 @@
   "action.quit": "Sair do editor",
   "action.recenter": "Recentralizar visualização no cursor",
   "action.redo": "Refazer",
+  "action.redraw_screen": "Redesenhar tela",
   "action.reload_with_encoding": "Reload file with specific encoding",
   "action.remove_ruler": "Remover régua",
   "action.remove_secondary_cursors": "Remover cursores secundários",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Alternar gravação de macro para um registrador (0-9)",
   "cmd.redo": "Refazer",
   "cmd.redo_desc": "Refazer a última edição desfeita",
+  "cmd.redraw_screen": "Redesenhar tela",
+  "cmd.redraw_screen_desc": "Limpar e repintar totalmente a tela para corrigir problemas de exibição",
   "cmd.reload_with_encoding": "Recarregar com Codificação...",
   "cmd.reload_with_encoding_desc": "Recarregar o arquivo com uma codificação diferente",
   "cmd.remove_ruler": "Remover Régua",
diff --git a/crates/fresh-editor/locales/ru.json b/crates/fresh-editor/locales/ru.json
index 21ab6d582..12156588d 100644
--- a/crates/fresh-editor/locales/ru.json
+++ b/crates/fresh-editor/locales/ru.json
@@ -169,6 +169,7 @@
   "action.quit": "Выйти из редактора",
   "action.recenter": "Центрировать вид на курсоре",
   "action.redo": "Повторить",
+  "action.redraw_screen": "Перерисовать экран",
   "action.reload_with_encoding": "Reload file with specific encoding",
   "action.remove_ruler": "Удалить линейку",
   "action.remove_secondary_cursors": "Удалить дополнительные курсоры",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Переключить запись макроса для регистра (0-9)",
   "cmd.redo": "Повторить",
   "cmd.redo_desc": "Повторить последнее отменённое действие",
+  "cmd.redraw_screen": "Перерисовать экран",
+  "cmd.redraw_screen_desc": "Очистить и полностью перерисовать экран, чтобы исправить искажения отображения",
   "cmd.reload_with_encoding": "Перезагрузить с кодировкой...",
   "cmd.reload_with_encoding_desc": "Перезагрузить файл с другой кодировкой",
   "cmd.remove_ruler": "Удалить линейку",
diff --git a/crates/fresh-editor/locales/th.json b/crates/fresh-editor/locales/th.json
index 9b5554c8b..07b1eba15 100644
--- a/crates/fresh-editor/locales/th.json
+++ b/crates/fresh-editor/locales/th.json
@@ -169,6 +169,7 @@
   "action.quit": "ออกจากโปรแกรม",
   "action.recenter": "จัดมุมมองให้เคอร์เซอร์อยู่ตรงกลาง",
   "action.redo": "ทำซ้ำ",
+  "action.redraw_screen": "วาดหน้าจอใหม่",
   "action.reload_with_encoding": "Reload file with specific encoding",
   "action.remove_ruler": "ลบเส้นบรรทัด",
   "action.remove_secondary_cursors": "เอาเคอร์เซอร์รองออก",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "สลับการบันทึกมาโครสำหรับเรจิสเตอร์ (0-9)",
   "cmd.redo": "ทำซ้ำ",
   "cmd.redo_desc": "ทำซ้ำการแก้ไขที่เลิกทำไปล่าสุด",
+  "cmd.redraw_screen": "วาดหน้าจอใหม่",
+  "cmd.redraw_screen_desc": "ล้างและวาดหน้าจอใหม่ทั้งหมดเพื่อแก้ไขการแสดงผลที่เสียหาย",
   "cmd.reload_with_encoding": "โหลดใหม่ด้วยการเข้ารหัส...",
   "cmd.reload_with_encoding_desc": "โหลดไฟล์ใหม่ด้วยการเข้ารหัสอื่น",
   "cmd.remove_ruler": "ลบเส้นบรรทัด",
diff --git a/crates/fresh-editor/locales/uk.json b/crates/fresh-editor/locales/uk.json
index 21cf9733b..89cb6900f 100644
--- a/crates/fresh-editor/locales/uk.json
+++ b/crates/fresh-editor/locales/uk.json
@@ -169,6 +169,7 @@
   "action.quit": "Вийти з редактора",
   "action.recenter": "Центрувати вигляд на курсорі",
   "action.redo": "Повторити",
+  "action.redraw_screen": "Перемалювати екран",
   "action.reload_with_encoding": "Reload file with specific encoding",
   "action.remove_ruler": "Видалити лінійку",
   "action.remove_secondary_cursors": "Видалити додаткові курсори",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Перемкнути запис макросу для регістра (0-9)",
   "cmd.redo": "Повторити",
   "cmd.redo_desc": "Повторити останню скасовану дію",
+  "cmd.redraw_screen": "Перемалювати екран",
+  "cmd.redraw_screen_desc": "Очистити та повністю перемалювати екран, щоб виправити спотворення зображення",
   "cmd.reload_with_encoding": "Перезавантажити з кодуванням...",
   "cmd.reload_with_encoding_desc": "Перезавантажити файл з іншим кодуванням",
   "cmd.remove_ruler": "Видалити лінійку",
diff --git a/crates/fresh-editor/locales/vi.json b/crates/fresh-editor/locales/vi.json
index b7d1e2596..d103650c1 100644
--- a/crates/fresh-editor/locales/vi.json
+++ b/crates/fresh-editor/locales/vi.json
@@ -169,6 +169,7 @@
   "action.quit": "Thoát trình soạn thảo",
   "action.recenter": "Căn giữa hiển thị theo con trỏ",
   "action.redo": "Làm lại",
+  "action.redraw_screen": "Vẽ lại màn hình",
   "action.reload_with_encoding": "Tải lại tệp với mã hóa cụ thể",
   "action.remove_ruler": "Xóa thước kẻ",
   "action.remove_secondary_cursors": "Xóa con trỏ phụ",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "Bật/tắt ghi macro cho thanh ghi (0-9)",
   "cmd.redo": "Làm lại",
   "cmd.redo_desc": "Làm lại chỉnh sửa vừa hoàn tác",
+  "cmd.redraw_screen": "Vẽ lại màn hình",
+  "cmd.redraw_screen_desc": "Xóa và vẽ lại toàn bộ màn hình để khắc phục lỗi hiển thị",
   "cmd.reload_with_encoding": "Tải lại với mã hóa...",
   "cmd.reload_with_encoding_desc": "Tải lại tệp với mã hóa khác",
   "cmd.remove_ruler": "Xóa thước kẻ",
diff --git a/crates/fresh-editor/locales/zh-CN.json b/crates/fresh-editor/locales/zh-CN.json
index 1465a5b45..ff528be9d 100644
--- a/crates/fresh-editor/locales/zh-CN.json
+++ b/crates/fresh-editor/locales/zh-CN.json
@@ -169,6 +169,7 @@
   "action.quit": "退出编辑器",
   "action.recenter": "重新居中视图到光标",
   "action.redo": "重做",
+  "action.redraw_screen": "重绘屏幕",
   "action.reload_with_encoding": "Reload file with specific encoding",
   "action.remove_ruler": "移除标尺",
   "action.remove_secondary_cursors": "移除次要光标",
@@ -523,6 +524,8 @@
   "cmd.record_macro_desc": "切换寄存器的宏录制（0-9）",
   "cmd.redo": "重做",
   "cmd.redo_desc": "重做上次撤销的编辑",
+  "cmd.redraw_screen": "重绘屏幕",
+  "cmd.redraw_screen_desc": "清除并完全重绘屏幕以修复显示错乱",
   "cmd.reload_with_encoding": "以指定编码重新加载...",
   "cmd.reload_with_encoding_desc": "使用不同的编码重新加载文件",
   "cmd.remove_ruler": "移除标尺",
diff --git a/crates/fresh-editor/src/app/input.rs b/crates/fresh-editor/src/app/input.rs
index f10e470d2..9a8b65889 100644
--- a/crates/fresh-editor/src/app/input.rs
+++ b/crates/fresh-editor/src/app/input.rs
@@ -675,6 +675,9 @@ impl Editor {
             Action::DumpConfig => {
                 self.dump_config();
             }
+            Action::RedrawScreen => {
+                self.request_full_redraw();
+            }
             Action::SelectTheme => {
                 self.start_select_theme_prompt();
             }
diff --git a/crates/fresh-editor/src/input/actions.rs b/crates/fresh-editor/src/input/actions.rs
index d8b2aa6df..6bb466c37 100644
--- a/crates/fresh-editor/src/input/actions.rs
+++ b/crates/fresh-editor/src/input/actions.rs
@@ -3009,6 +3009,7 @@ pub fn action_to_events(
         | Action::ToggleScrollSync
         | Action::ToggleMouseCapture
         | Action::DumpConfig
+        | Action::RedrawScreen
         | Action::Search
         | Action::FindInSelection
         | Action::FindNext
diff --git a/crates/fresh-editor/src/input/commands.rs b/crates/fresh-editor/src/input/commands.rs
index 643f81bfc..8c62fd006 100644
--- a/crates/fresh-editor/src/input/commands.rs
+++ b/crates/fresh-editor/src/input/commands.rs
@@ -1132,6 +1132,13 @@ static COMMAND_DEFS: &[CommandDef] = &[
         contexts: &[],
         custom_contexts: &[],
     },
+    CommandDef {
+        name_key: "cmd.redraw_screen",
+        desc_key: "cmd.redraw_screen_desc",
+        action: || Action::RedrawScreen,
+        contexts: &[],
+        custom_contexts: &[],
+    },
     CommandDef {
         name_key: "cmd.toggle_inlay_hints",
         desc_key: "cmd.toggle_inlay_hints_desc",
diff --git a/crates/fresh-editor/src/input/keybindings.rs b/crates/fresh-editor/src/input/keybindings.rs
index 560fc3be3..5c6a383ff 100644
--- a/crates/fresh-editor/src/input/keybindings.rs
+++ b/crates/fresh-editor/src/input/keybindings.rs
@@ -613,6 +613,9 @@ pub enum Action {
     // Config operations
     DumpConfig,
 
+    // Force a full terminal clear + redraw (fixes display corruption from external output)
+    RedrawScreen,
+
     // Search and replace
     Search,
     FindInSelection,
@@ -1030,6 +1033,7 @@ impl Action {
             "remove_ruler" => RemoveRuler,
 
             "dump_config" => DumpConfig,
+            "redraw_screen" => RedrawScreen,
 
             "search" => Search,
             "find_in_selection" => FindInSelection,
@@ -2238,6 +2242,7 @@ impl KeybindingResolver {
             Action::ToggleWhitespaceIndicators => t!("action.toggle_whitespace_indicators"),
             Action::ResetBufferSettings => t!("action.reset_buffer_settings"),
             Action::DumpConfig => t!("action.dump_config"),
+            Action::RedrawScreen => t!("action.redraw_screen"),
             Action::Search => t!("action.search"),
             Action::FindInSelection => t!("action.find_in_selection"),
             Action::FindNext => t!("action.find_next"),


Test patch:
diff --git a/crates/fresh-editor/tests/e2e/mod.rs b/crates/fresh-editor/tests/e2e/mod.rs
index 02e349c9b..44c823549 100644
--- a/crates/fresh-editor/tests/e2e/mod.rs
+++ b/crates/fresh-editor/tests/e2e/mod.rs
@@ -53,6 +53,7 @@ pub mod issue_1574_wrapped_down_scroll;
 pub mod issue_1577_unicode_width;
 pub mod issue_1598_shebang_detection;
 pub mod issue_1620_split_terminal_click_panic;
+pub mod redraw_screen;
 
 pub mod keybinding_editor;
 pub mod language_features_e2e;
diff --git a/crates/fresh-editor/tests/e2e/redraw_screen.rs b/crates/fresh-editor/tests/e2e/redraw_screen.rs
new file mode 100644
index 000000000..2cab9edb5
--- /dev/null
+++ b/crates/fresh-editor/tests/e2e/redraw_screen.rs
@@ -0,0 +1,44 @@
+//! Tests for the "Redraw Screen" action (issue #1070).
+//!
+//! The action allows users to request a full terminal clear + repaint from
+//! the command palette, which is useful after external programs (or the
+//! host terminal) scribble over the TUI and leave ghost text behind.
+
+use crate::common::harness::EditorTestHarness;
+use fresh::input::keybindings::Action;
+
+/// Dispatching `Action::RedrawScreen` must set the editor's full-redraw
+/// flag so that the main loop clears the terminal on the next tick.
+#[test]
+fn test_redraw_screen_action_requests_full_redraw() {
+    let mut harness = EditorTestHarness::new(80, 24).unwrap();
+
+    // Sanity: no redraw pending on a fresh editor.
+    assert!(!harness.editor_mut().take_full_redraw_request());
+
+    harness
+        .editor_mut()
+        .dispatch_action_for_tests(Action::RedrawScreen);
+
+    // The action should have flipped the flag so the event loop can
+    // clear and repaint the terminal on the next tick.
+    assert!(
+        harness.editor_mut().take_full_redraw_request(),
+        "RedrawScreen action should request a full terminal redraw"
+    );
+}
+
+/// The "Redraw Screen" entry must be discoverable from the command palette.
+#[test]
+fn test_redraw_screen_visible_in_command_palette() {
+    use crossterm::event::{KeyCode, KeyModifiers};
+    let mut harness = EditorTestHarness::new(100, 24).unwrap();
+
+    harness
+        .send_key(KeyCode::Char('p'), KeyModifiers::CONTROL)
+        .unwrap();
+    harness.type_text("redraw").unwrap();
+    harness.render().unwrap();
+
+    harness.assert_screen_contains("Redraw Screen");
+}