@fresh-editor/fresh-editor 0.1.71 → 0.1.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,57 @@
1
1
  # Release Notes
2
2
 
3
+ ## 0.1.75
4
+
5
+ This is mostly a bugfix release.
6
+
7
+ ### Bug Fixes
8
+
9
+ * **Prompt History**: Generic prompt history system with Up/Down navigation, now available for Go to Line and other prompts.
10
+ * **Session External Files**: Files opened from outside the project directory are now restored in sessions.
11
+ * **Fuzzy Search Exact Match Priority**: Open File dialog now prioritizes exact filename matches over fuzzy matches.
12
+ * **Horizontal Scroll**: Fixed cursor position with horizontal scroll after Open File dialog and pressing Enter on long lines.
13
+ * **Multi-Cursor Bracket Skip**: Fixed bracket skip-over with multiple cursors in bulk edit.
14
+ * **F3 Search**: Fixed F3 to allow searching more after editing and to update positions correctly after buffer modifications.
15
+ * **File Explorer**: Removed plain letter shortcuts causing accidental actions, fixed focus after rename/delete, improved new file command behavior.
16
+ * **Terminal**: Fixed scrollback colors, mouse scroll now exits to scrollback mode, fixed viewport position bugs, persist exit message.
17
+ * **Theme Editor**: Fixed reopening after closing the theme editor, allow editing builtin themes (#696), store builtin themes as json instead of hardcoded inside rust.
18
+ * **LSP Diagnostics**: Made diagnostic cache per-buffer to prevent marker position bugs.
19
+ * **Cursor Visibility**: You can see the letter under the block cursor now! Apply REVERSED style to primary cursor for better visibility.
20
+ * **Open Terminal**: Command now available in all contexts.
21
+ * **Open File Dialog**: When run while a terminal is focused, use CWD instead of the internal backing file directory.
22
+
23
+ ### Internal
24
+
25
+ * Refactored reference highlighting to use overlay system (#694).
26
+ * Built-in themes now loaded from JSON artifacts at build time instead of hardcoded Rust.
27
+ * Removed duplicate dead code from LspTask.
28
+
29
+ ---
30
+
31
+ ## 0.1.74
32
+
33
+ ### Features
34
+
35
+ * **Italian Locale**: Full Italian translation support added across the editor and all core plugins (@fdefilippo).
36
+ * **Interactive Links in Popups**: Markdown popups (such as LSP hover) now support clickable hyperlinks (OSC 8). Clicking a link opens it in your default web browser (@Asuka-Minato).
37
+ * **Sudo Save Fallback**: When saving a file fails due to insufficient permissions, the editor now offers to save using `sudo` (Linux/macOS) (#301).
38
+ * **Improved Language Features**: Improved word navigation, auto-pairs, and multi-cursor behavior.
39
+
40
+ ### Bug Fixes
41
+
42
+ * **LSP Hover Reliability**: Fixed multiple issues with hover popups, including race conditions during rapid mouse movement, incorrect positioning on empty lines, and popups triggering past the end of a line.
43
+ * **Popup Scrollbar Drag**: You can now click and drag the scrollbar in popups (like hover and completion) to scroll through long content.
44
+ * **Inlay Hint Positioning**: Corrected inlay hint placement in Rust files to prevent them from shifting line content (#626, @Asuka-Minato).
45
+ * **Theme Editor Path Resolution**: Fixed a bug where the theme editor couldn't find the correct configuration directory on some systems.
46
+
47
+ ### Internal
48
+
49
+ * **Error Handling**: Migrated to `anyhow` for more robust error tracking and backtraces.
50
+ * **Plugin API**: Added `editor.getConfigDir()` and `editor.getThemesDir()` to the plugin API.
51
+ * **Dependency Updates**: Bumped `clap` to 4.5.54.
52
+
53
+ ---
54
+
3
55
  ## 0.1.71
4
56
 
5
57
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fresh-editor/fresh-editor",
3
- "version": "0.1.71",
3
+ "version": "0.1.75",
4
4
  "description": "A modern terminal-based text editor with plugin support",
5
5
  "repository": {
6
6
  "type": "git",
@@ -314,6 +314,69 @@
314
314
  "panel.help_export_footer": "EXPORT: [E]xporter vers .review/session.md | [O]general [r]afraichir",
315
315
  "debug.loaded": "Plugin de revue des differences charge avec prise en charge des commentaires"
316
316
  },
317
+ "it": {
318
+ "cmd.review_diff": "Revisiona differenze",
319
+ "cmd.review_diff_desc": "Avvia sessione di revisione del codice",
320
+ "cmd.stop_review_diff": "Interrompi revisione",
321
+ "cmd.stop_review_diff_desc": "Interrompi la sessione di revisione",
322
+ "cmd.refresh_review_diff": "Aggiorna differenze",
323
+ "cmd.refresh_review_diff_desc": "Aggiorna l'elenco delle modifiche",
324
+ "cmd.side_by_side_diff": "Diff affiancato",
325
+ "cmd.side_by_side_diff_desc": "Mostra diff affiancato per il file corrente",
326
+ "cmd.add_comment": "Revisione: Aggiungi commento",
327
+ "cmd.add_comment_desc": "Aggiungi un commento di revisione al blocco corrente",
328
+ "cmd.approve_hunk": "Revisione: Approva blocco",
329
+ "cmd.approve_hunk_desc": "Segna il blocco come approvato",
330
+ "cmd.reject_hunk": "Revisione: Rifiuta blocco",
331
+ "cmd.reject_hunk_desc": "Segna il blocco come rifiutato",
332
+ "cmd.needs_changes": "Revisione: Richiede modifiche",
333
+ "cmd.needs_changes_desc": "Segna il blocco come richiedente modifiche",
334
+ "cmd.question": "Revisione: Domanda",
335
+ "cmd.question_desc": "Segna il blocco con una domanda",
336
+ "cmd.clear_status": "Revisione: Cancella stato",
337
+ "cmd.clear_status_desc": "Cancella lo stato di revisione del blocco",
338
+ "cmd.overall_feedback": "Revisione: Feedback generale",
339
+ "cmd.overall_feedback_desc": "Imposta il feedback generale della revisione",
340
+ "cmd.export_markdown": "Revisione: Esporta in Markdown",
341
+ "cmd.export_markdown_desc": "Esporta la revisione in .review/session.md",
342
+ "cmd.export_json": "Revisione: Esporta in JSON",
343
+ "cmd.export_json_desc": "Esporta la revisione in .review/session.json",
344
+ "status.refreshing": "Aggiornamento differenze revisione...",
345
+ "status.updated": "Differenze revisione aggiornate. Trovati %{count} blocchi.",
346
+ "status.loading_diff": "Caricamento diff affiancato...",
347
+ "status.not_git_repo": "Non in un repository git",
348
+ "status.failed_old_version": "Impossibile caricare la vecchia versione del file",
349
+ "status.failed_new_version": "Impossibile caricare la nuova versione del file",
350
+ "status.diff_summary": "Diff affiancato: +%{added} -%{removed} ~%{modified} | 'q' per tornare",
351
+ "status.no_hunk_selected": "Nessun blocco selezionato per il commento",
352
+ "status.comment_added": "Commento aggiunto a %{line}",
353
+ "status.comment_cancelled": "Commento annullato",
354
+ "status.hunk_approved": "Blocco approvato",
355
+ "status.hunk_rejected": "Blocco rifiutato",
356
+ "status.hunk_needs_changes": "Blocco segnato come richiedente modifiche",
357
+ "status.hunk_question": "Blocco segnato con domanda",
358
+ "status.hunk_status_cleared": "Stato revisione blocco cancellato",
359
+ "status.feedback_set": "Feedback generale impostato",
360
+ "status.feedback_cleared": "Feedback generale cancellato",
361
+ "status.exported": "Revisione esportata in %{path}",
362
+ "status.generating": "Generazione stream differenze revisione...",
363
+ "status.review_summary": "Differenze revisione: %{count} blocchi | [c]ommenta [a]pprova [x]rifiuta [!]modifiche [?]domanda [E]sporta",
364
+ "status.stopped": "Modalità Revisione differenze interrotta.",
365
+ "status.no_file_open": "Nessun file aperto - impossibile mostrare diff",
366
+ "status.failed_git_diff": "Impossibile ottenere il diff git per il file",
367
+ "status.no_changes": "Nessuna modifica in questo file",
368
+ "status.failed_old_new_file": "Impossibile caricare la vecchia versione (il file potrebbe essere nuovo)",
369
+ "prompt.comment": "Commento su %{line}: ",
370
+ "prompt.overall_feedback": "Feedback generale: ",
371
+ "panel.no_changes": "Nessuna modifica da revisionare.",
372
+ "panel.help_review": "REVISIONE: [c]ommenta [a]pprova [x]rifiuta [!]modifiche [?]domanda [u]ndo",
373
+ "panel.help_stage": "STAGE: [s]tage [d]iscard | NAV: [n]ext [p]rev [Enter]drill [q]uit",
374
+ "panel.help_export": "EXPORT: [E] .review/session.md | [O]verall feedback | [r]efresh",
375
+ "panel.help_review_footer": "REVISIONE: [c]ommenta [a]pprova [x]rifiuta [!]richiede-modifiche [?]domanda [u]ndo",
376
+ "panel.help_stage_footer": "STAGE: [s]tage [d]iscard | NAV: [n]ext [p]rev [Enter]drill-down [q]uit",
377
+ "panel.help_export_footer": "EXPORT: [E]sporta in .review/session.md | [O]verall feedback [r]efresh",
378
+ "debug.loaded": "Plugin Revisione differenze caricato con supporto commenti"
379
+ },
317
380
  "ja": {
318
381
  "cmd.review_diff": "差分レビュー",
319
382
  "cmd.review_diff_desc": "コードレビューセッションを開始",
@@ -24,6 +24,11 @@
24
24
  "status.initialized": "Buffer Modified: initialisé pour %{path}",
25
25
  "status.cleared_on_save": "Buffer Modified: effacé lors de la sauvegarde"
26
26
  },
27
+ "it": {
28
+ "status.loaded": "Plugin Buffer Modified caricato",
29
+ "status.initialized": "Buffer Modified: inizializzato per %{path}",
30
+ "status.cleared_on_save": "Buffer Modified: cancellato al salvataggio"
31
+ },
27
32
  "ja": {
28
33
  "status.loaded": "Buffer Modifiedプラグインを読み込みました",
29
34
  "status.initialized": "Buffer Modified: %{path}を初期化しました",
@@ -34,6 +34,13 @@
34
34
  "status.opened": "Calculatrice ouverte",
35
35
  "status.copied": "Copie: {value}"
36
36
  },
37
+ "it": {
38
+ "cmd.calculator": "Calcolatrice",
39
+ "cmd.calculator_desc": "Apri calcolatrice",
40
+ "status.loaded": "Plugin calcolatrice caricato",
41
+ "status.opened": "Calcolatrice aperta",
42
+ "status.copied": "Copiato: {value}"
43
+ },
37
44
  "ja": {
38
45
  "cmd.calculator": "電卓",
39
46
  "cmd.calculator_desc": "電卓を開く",
@@ -84,6 +84,23 @@
84
84
  "status.config_not_found": "Impossible de trouver la configuration .clangd dans l'espace de travail",
85
85
  "status.file_status": "Statut du fichier Clangd: {status}"
86
86
  },
87
+ "it": {
88
+ "cmd.project_setup": "Clangd: Configurazione progetto",
89
+ "cmd.project_setup_desc": "Analizza la disponibilità di clangd per C/C++ (compile_commands.json, .clangd)",
90
+ "cmd.switch_source_header": "Clangd: Passa a Sorgente/Header",
91
+ "cmd.switch_source_header_desc": "Passa alla coppia header/sorgente usando clangd",
92
+ "cmd.open_project_config": "Clangd: Apri configurazione progetto",
93
+ "cmd.open_project_config_desc": "Apri il file .clangd più vicino",
94
+ "status.plugin_loaded": "Plugin di supporto Clangd caricato (comandi passa a header + configurazione)",
95
+ "status.no_active_file": "Clangd: nessun file attivo per il cambio",
96
+ "status.unsupported_file_type": "Clangd: tipo di file non supportato per il cambio header",
97
+ "status.opened_corresponding_file": "Clangd: aperto file corrispondente",
98
+ "status.no_matching_found": "Clangd: nessuna corrispondenza header/sorgente trovata",
99
+ "status.switch_failed": "Cambio sorgente/header Clangd fallito: {error}",
100
+ "status.opened_config": "Configurazione .clangd aperta",
101
+ "status.config_not_found": "Impossibile trovare la configurazione .clangd nell'area di lavoro",
102
+ "status.file_status": "Stato del file Clangd: {status}"
103
+ },
87
104
  "ja": {
88
105
  "cmd.project_setup": "Clangd: プロジェクト設定",
89
106
  "cmd.project_setup_desc": "C/C++ clangdの準備状況を分析 (compile_commands.json, .clangd)",
@@ -54,6 +54,17 @@
54
54
  "status.disabled": "Surligneur de Couleurs: Desactive",
55
55
  "status.loaded": "Plugin Surligneur de Couleurs charge"
56
56
  },
57
+ "it": {
58
+ "cmd.enable": "Evidenziatore colori: Attiva",
59
+ "cmd.enable_desc": "Attiva l'evidenziazione dei codici colore con campioni",
60
+ "cmd.disable": "Evidenziatore colori: Disattiva",
61
+ "cmd.disable_desc": "Disattiva l'evidenziazione dei codici colore",
62
+ "cmd.toggle": "Evidenziatore colori: Alterna",
63
+ "cmd.toggle_desc": "Alterna l'evidenziazione dei codici colore",
64
+ "status.enabled": "Evidenziatore colori: Attivato",
65
+ "status.disabled": "Evidenziatore colori: Disattivato",
66
+ "status.loaded": "Plugin Evidenziatore colori caricato"
67
+ },
57
68
  "ja": {
58
69
  "cmd.enable": "カラーハイライター: 有効化",
59
70
  "cmd.enable_desc": "カラーコードのハイライトとスウォッチ表示を有効化",
@@ -51,7 +51,8 @@
51
51
  "auto_revert_poll_interval_ms": 2000,
52
52
  "file_tree_poll_interval_ms": 3000,
53
53
  "default_line_ending": "lf",
54
- "cursor_style": "default"
54
+ "cursor_style": "default",
55
+ "quick_suggestions": true
55
56
  }
56
57
  },
57
58
  "file_explorer": {
@@ -144,6 +145,7 @@
144
145
  "en",
145
146
  "es",
146
147
  "fr",
148
+ "it",
147
149
  "ja",
148
150
  "ko",
149
151
  "pt-BR",
@@ -290,6 +292,11 @@
290
292
  "description": "Cursor style for the terminal cursor.\nOptions: blinking_block, steady_block, blinking_bar, steady_bar, blinking_underline, steady_underline\nDefault: blinking_block",
291
293
  "$ref": "#/$defs/CursorStyle",
292
294
  "default": "default"
295
+ },
296
+ "quick_suggestions": {
297
+ "description": "Enable quick suggestions (VS Code-like behavior).\nWhen enabled, completion suggestions appear automatically while typing,\nnot just on trigger characters (like `.` or `::`).\nDefault: true",
298
+ "type": "boolean",
299
+ "default": true
293
300
  }
294
301
  }
295
302
  },
@@ -29,6 +29,12 @@
29
29
  "status.restore_failed": "Echec de la restauration NuGet: {error}",
30
30
  "status.restore_error": "Erreur de restauration NuGet: {error}"
31
31
  },
32
+ "it": {
33
+ "status.restoring_packages": "Ripristino pacchetti NuGet per {project}...",
34
+ "status.restore_completed": "Ripristino NuGet completato per {project}",
35
+ "status.restore_failed": "Ripristino NuGet fallito: {error}",
36
+ "status.restore_error": "Errore ripristino NuGet: {error}"
37
+ },
32
38
  "ja": {
33
39
  "status.restoring_packages": "{project}のNuGetパッケージを復元中...",
34
40
  "status.restore_completed": "{project}のNuGet復元が完了しました",
@@ -89,6 +89,24 @@
89
89
  "panel.all_files": "Tous les Fichiers",
90
90
  "panel.current_file": "Fichier Actuel"
91
91
  },
92
+ "it": {
93
+ "cmd.show_diagnostics_panel": "Mostra pannello diagnostica",
94
+ "cmd.show_diagnostics_panel_desc": "Apri il pannello diagnostica",
95
+ "cmd.toggle_diagnostics_panel": "Alterna pannello diagnostica",
96
+ "cmd.toggle_diagnostics_panel_desc": "Alterna la visualizzazione del pannello diagnostica",
97
+ "status.loaded": "Plugin pannello diagnostica caricato",
98
+ "status.failed_to_open": "Impossibile aprire il pannello diagnostica",
99
+ "status.closed": "Pannello diagnostica chiuso",
100
+ "status.jumped_to": "Passato a {file}:{line}",
101
+ "status.move_to_diagnostic": "Sposta il cursore su una riga di diagnostica",
102
+ "status.showing": "Visualizzazione: {label}",
103
+ "status.refreshed": "Diagnostica aggiornata",
104
+ "status.diagnostics_count": "Diagnostica: {count} elementi | a: alterna filtro | RET: vai a | q: chiudi",
105
+ "panel.header": "Diagnostica ({filter}):",
106
+ "panel.no_diagnostics": "Nessuna diagnostica",
107
+ "panel.all_files": "Tutti i file",
108
+ "panel.current_file": "File corrente"
109
+ },
92
110
  "ja": {
93
111
  "cmd.show_diagnostics_panel": "診断パネルを表示",
94
112
  "cmd.show_diagnostics_panel_desc": "診断パネルを開く",
@@ -104,6 +104,27 @@
104
104
  "panel.no_references": "Aucune reference trouvee",
105
105
  "panel.help": "[Haut/Bas] naviguer [RET] sauter [q/Esc] fermer"
106
106
  },
107
+ "it": {
108
+ "cmd.show_references": "Mostra pannello riferimenti",
109
+ "cmd.show_references_desc": "Visualizza i riferimenti correnti",
110
+ "cmd.hide_references": "Nascondi pannello riferimenti",
111
+ "cmd.hide_references_desc": "Chiudi il pannello riferimenti",
112
+ "status.ready": "Plugin Trova riferimenti caricato",
113
+ "status.no_references": "Nessun riferimento trovato per '{symbol}'",
114
+ "status.found_references": "Trovati {count} riferimenti{limit} - Su/Giù naviga, RET vai a, q chiudi",
115
+ "status.showing_first": " (visualizzati i primi {max})",
116
+ "status.reference_index": "Riferimento {current}/{total}",
117
+ "status.jumped_to": "Passato a {file}:{line}",
118
+ "status.no_references_to_jump": "Nessun riferimento a cui passare",
119
+ "status.source_split_unavailable": "Split sorgente non disponibile",
120
+ "status.move_cursor": "Sposta il cursore su una riga di riferimento",
121
+ "status.closed": "Pannello riferimenti chiuso",
122
+ "status.failed_open_panel": "Impossibile aprire il pannello riferimenti",
123
+ "panel.header": "Riferimenti a {symbol} ({count}{limit})",
124
+ "panel.limited": ", limitati a {max}",
125
+ "panel.no_references": "Nessun riferimento trovato",
126
+ "panel.help": "[Su/Giù] naviga [RET] vai a [q/Esc] chiudi"
127
+ },
107
128
  "ja": {
108
129
  "cmd.show_references": "参照パネルを表示",
109
130
  "cmd.show_references_desc": "現在の参照を表示",
@@ -189,6 +189,44 @@
189
189
  "time.years_ago": "il y a {count} an",
190
190
  "time.years_ago_plural": "il y a {count} ans"
191
191
  },
192
+ "it": {
193
+ "cmd.git_blame": "Git Blame",
194
+ "cmd.git_blame_desc": "Mostra git blame per il file corrente (stile magit)",
195
+ "cmd.git_blame_close": "Git Blame: Chiudi",
196
+ "cmd.git_blame_close_desc": "Chiudi il pannello git blame",
197
+ "cmd.git_blame_go_back": "Git Blame: Torna indietro",
198
+ "cmd.git_blame_go_back_desc": "Mostra il blame al commit genitore della riga corrente",
199
+
200
+ "status.already_open": "Git blame già aperto",
201
+ "status.loading": "Caricamento git blame...",
202
+ "status.no_file": "Nessun file aperto per il blame",
203
+ "status.no_blame_info": "Nessuna informazione di blame disponibile (non è un file git o errore)",
204
+ "status.failed_open": "Impossibile aprire il pannello git blame",
205
+ "status.closed": "Git blame chiuso",
206
+ "status.blame_ready": "Git blame: {count} blocchi | b: blame al genitore | q: chiudi",
207
+ "status.move_to_line": "Sposta prima il cursore su una riga di blame",
208
+ "status.not_committed": "Questa riga non è stata ancora committata",
209
+ "status.loading_parent": "Caricamento blame a {hash}^...",
210
+ "status.cannot_go_back": "Impossibile ottenere il blame a {hash}^ (potrebbe essere il commit iniziale o il file non esisteva)",
211
+ "status.blame_at_parent": "Git blame a {hash}^ | profondità: {depth} | b: vai più a fondo | q: chiudi",
212
+ "status.hash_copied": "Copiato: {short} ({full})",
213
+ "status.hash_display": "Hash: {hash}",
214
+ "status.git_error": "Errore git blame: {error}",
215
+
216
+ "time.just_now": "proprio ora",
217
+ "time.minutes_ago": "{count} minuto fa",
218
+ "time.minutes_ago_plural": "{count} minuti fa",
219
+ "time.hours_ago": "{count} ora fa",
220
+ "time.hours_ago_plural": "{count} ore fa",
221
+ "time.days_ago": "{count} giorno fa",
222
+ "time.days_ago_plural": "{count} giorni fa",
223
+ "time.weeks_ago": "{count} settimana fa",
224
+ "time.weeks_ago_plural": "{count} settimane fa",
225
+ "time.months_ago": "{count} mese fa",
226
+ "time.months_ago_plural": "{count} mesi fa",
227
+ "time.years_ago": "{count} anno fa",
228
+ "time.years_ago_plural": "{count} anni fa"
229
+ },
192
230
  "ja": {
193
231
  "cmd.git_blame": "Git Blame",
194
232
  "cmd.git_blame_desc": "現在のファイルのgit blameを表示(magitスタイル)",
@@ -119,6 +119,30 @@
119
119
  "status.cancelled": "Recherche annulee",
120
120
  "status.no_files_loaded": "Aucun fichier git charge. Utilisez 'Git Trouver Fichier: Recharger'."
121
121
  },
122
+ "it": {
123
+ "cmd.find": "Git: Trova file",
124
+ "cmd.find_desc": "Trova e apri un file tracciato da git",
125
+ "cmd.reload": "Git: Ricarica file",
126
+ "cmd.reload_desc": "Ricarica l'indice dei file git",
127
+ "cmd.count": "Git: Conta file",
128
+ "cmd.count_desc": "Mostra il numero di file git indicizzati",
129
+ "prompt.find_file": "Trova file: ",
130
+ "status.ready": "Plugin Trova file git pronto",
131
+ "status.loading": "Caricamento file git...",
132
+ "status.indexed": "Git: %{count} file indicizzati",
133
+ "status.error_loading": "Errore nel caricamento dei file git: %{error}",
134
+ "status.failed_load": "Caricamento file git fallito",
135
+ "status.no_files": "Nessun file tracciato da git trovato",
136
+ "status.files_available": "%{count} file disponibili - scrivi per filtrare",
137
+ "status.showing_first": "Visualizzazione dei primi %{shown} di %{total} file",
138
+ "status.found_matching": "Trovati %{count} file corrispondenti a \"%{query}\"",
139
+ "status.no_matching": "Nessun file corrispondente a \"%{query}\"",
140
+ "status.opened": "Aperto %{file}",
141
+ "status.file_not_found": "File non trovato: %{file}",
142
+ "status.no_selection": "Nessun file selezionato",
143
+ "status.cancelled": "Ricerca file annullata",
144
+ "status.no_files_loaded": "Nessun file git caricato. Usa 'Git: Ricarica file' per indicizzare i file."
145
+ },
122
146
  "ja": {
123
147
  "cmd.find": "Gitファイル検索",
124
148
  "cmd.find_desc": "Git追跡ファイルを検索して開く",
@@ -64,6 +64,19 @@
64
64
  "status.no_selection": "Aucun fichier selectionne",
65
65
  "status.cancelled": "Git grep annule"
66
66
  },
67
+ "it": {
68
+ "cmd.grep": "Git Grep",
69
+ "cmd.grep_desc": "Cerca testo nei file tracciati da git",
70
+ "prompt.grep": "Git grep: ",
71
+ "status.ready": "Plugin Git Grep pronto",
72
+ "status.type_to_search": "Scrivi per cercare...",
73
+ "status.found": "Trovate %{count} corrispondenze",
74
+ "status.no_matches": "Nessuna corrispondenza trovata",
75
+ "status.error": "Errore git grep: %{error}",
76
+ "status.opened": "Aperto %{location}",
77
+ "status.no_selection": "Nessun file selezionato",
78
+ "status.cancelled": "Git grep annullato"
79
+ },
67
80
  "ja": {
68
81
  "cmd.grep": "Git Grep",
69
82
  "cmd.grep_desc": "Git追跡ファイル内でテキストを検索",
@@ -34,6 +34,13 @@
34
34
  "status.no_file": "Git Gutter: Aucun fichier ouvert",
35
35
  "status.changes": "Git Gutter: %{count} modification(s) detectee(s)"
36
36
  },
37
+ "it": {
38
+ "cmd.refresh": "Git Gutter: Aggiorna",
39
+ "cmd.refresh_desc": "Aggiorna gli indicatori git gutter per il buffer corrente",
40
+ "status.ready": "Plugin Git Gutter pronto",
41
+ "status.no_file": "Git Gutter: Nessun file aperto",
42
+ "status.changes": "Git Gutter: rilevate %{count} modifiche"
43
+ },
37
44
  "ja": {
38
45
  "cmd.refresh": "Git Gutter: 更新",
39
46
  "cmd.refresh_desc": "現在のバッファのGit Gutterインジケーターを更新",
@@ -184,6 +184,41 @@
184
184
  "panel.log_footer": "{count} commits | Haut/Bas/j/k: naviguer | RET: afficher | y: copier hash | r: actualiser | q: quitter",
185
185
  "panel.detail_footer": "Haut/Bas/j/k: naviguer | RET: ouvrir fichier a la ligne | q: retour au journal"
186
186
  },
187
+ "it": {
188
+ "cmd.git_log": "Git Log",
189
+ "cmd.git_log_desc": "Mostra il log di git in un'interfaccia stile magit",
190
+ "cmd.git_log_close": "Git Log: Chiudi",
191
+ "cmd.git_log_close_desc": "Chiudi il pannello git log",
192
+ "cmd.git_log_refresh": "Git Log: Aggiorna",
193
+ "cmd.git_log_refresh_desc": "Aggiorna il log di git",
194
+ "status.already_open": "Git log già aperto",
195
+ "status.loading": "Caricamento git log...",
196
+ "status.no_commits": "Nessun commit trovato o non è un repository git",
197
+ "status.closed": "Git log chiuso",
198
+ "status.failed_open": "Apertura del pannello git log fallita",
199
+ "status.refreshing": "Aggiornamento git log...",
200
+ "status.refreshed": "Git log aggiornato: {count} commit",
201
+ "status.log_ready": "Git log: {count} commit | Su/Giù: naviga | RET: mostra | q: esci",
202
+ "status.commit_position": "Commit {current}/{total}",
203
+ "status.move_to_commit": "Sposta il cursore su una riga di commit",
204
+ "status.loading_commit": "Caricamento commit {hash}...",
205
+ "status.commit_ready": "Commit {hash} | Su/Giù: naviga | RET: apri file | q: indietro",
206
+ "status.failed_open_details": "Apertura dettagli commit fallita",
207
+ "status.hash_copied": "Copiato: {short} ({full})",
208
+ "status.hash_display": "Hash: {hash}",
209
+ "status.git_error": "Errore git log: {error}",
210
+ "status.error_fetching_diff": "Errore nel recupero del diff: {error}",
211
+ "status.file_loading": "Caricamento {file} a {hash}...",
212
+ "status.file_not_found": "File {file} non trovato al commit {hash}",
213
+ "status.file_view_ready": "{file} @ {hash} (sola lettura) | Destinazione: riga {line} | q: indietro",
214
+ "status.failed_open_file": "Apertura di {file} fallita",
215
+ "status.move_to_diff_with_context": "Sposta il cursore su una riga di diff con contesto file",
216
+ "status.move_to_diff": "Sposta il cursore su una riga di diff",
217
+ "panel.commits_header": "Commit:",
218
+ "panel.no_commits": " Nessun commit trovato",
219
+ "panel.log_footer": "{count} commit | Su/Giù/j/k: naviga | RET: mostra | y: copia hash | r: aggiorna | q: esci",
220
+ "panel.detail_footer": "Su/Giù/j/k: naviga | RET: apri file alla riga | q: torna al log"
221
+ },
187
222
  "ja": {
188
223
  "cmd.git_log": "Gitログ",
189
224
  "cmd.git_log_desc": "magitスタイルのインターフェースでgitログを表示",
@@ -414,6 +414,7 @@ interface EditorAPI {
414
414
  * @returns JSON Schema object
415
415
  */
416
416
  getThemeSchema(): unknown;
417
+ getBuiltinThemes(): unknown;
417
418
  /**
418
419
  * Get the current editor configuration
419
420
  *
@@ -432,6 +433,20 @@ interface EditorAPI {
432
433
  * @returns User configuration object (sparse - only explicitly set values)
433
434
  */
434
435
  getUserConfig(): unknown;
436
+ /**
437
+ * Get the user configuration directory path
438
+ *
439
+ * Returns the absolute path to the directory where user config and themes are stored.
440
+ * e.g. ~/.config/fresh/ on Linux or ~/Library/Application Support/fresh/ on macOS.
441
+ */
442
+ getConfigDir(): string;
443
+ /**
444
+ * Get the user themes directory path
445
+ *
446
+ * Returns the absolute path to the directory where user themes are stored.
447
+ * e.g. ~/.config/fresh/themes/
448
+ */
449
+ getThemesDir(): string;
435
450
  /**
436
451
  * Get the buffer ID of the focused editor pane
437
452
  *
@@ -805,6 +820,14 @@ interface EditorAPI {
805
820
  * @returns true if prompt was started successfully
806
821
  */
807
822
  startPromptWithInitial(label: string, prompt_type: string, initial_value: string): boolean;
823
+ /**
824
+ * Delete a theme file by name
825
+ *
826
+ * Only deletes files from the user's themes directory.
827
+ * This is a safe operation that prevents plugins from deleting arbitrary files.
828
+ * @param name - Theme name (without .json extension)
829
+ */
830
+ deleteTheme(name: string): Promise<[]>;
808
831
  /**
809
832
  * Create a composite buffer that displays multiple source buffers
810
833
  *
@@ -1046,10 +1069,10 @@ interface EditorAPI {
1046
1069
  */
1047
1070
  readFile(path: string): Promise<string>;
1048
1071
  /**
1049
- * Write string content to a file, creating or overwriting
1072
+ * Write string content to a NEW file (fails if file exists)
1050
1073
  *
1051
- * Creates parent directories if they don't exist (behavior may vary).
1052
- * Replaces file contents entirely; use readFile + modify + writeFile for edits.
1074
+ * Creates a new file with the given content. Fails if the file already exists
1075
+ * to prevent plugins from accidentally overwriting user data.
1053
1076
  * @param path - Destination path (absolute or relative to cwd)
1054
1077
  * @param content - UTF-8 string to write
1055
1078
  */
@@ -64,6 +64,19 @@
64
64
  "status.cancelled": "Grep en direct annule",
65
65
  "prompt.live_grep": "Grep en direct : "
66
66
  },
67
+ "it": {
68
+ "cmd.live_grep": "Live Grep (Cerca nei file)",
69
+ "cmd.live_grep_desc": "Cerca testo nel progetto con anteprima in tempo reale",
70
+ "status.ready": "Live Grep pronto - usa la tavolozza comandi o associa 'start_live_grep'",
71
+ "status.type_to_search": "Scrivi per cercare (min 2 caratteri)...",
72
+ "status.found_matches": "Trovate {count} corrispondenze",
73
+ "status.no_matches": "Nessuna corrispondenza trovata",
74
+ "status.search_error": "Errore di ricerca: {error}",
75
+ "status.opened_file": "Aperto {file}:{line}",
76
+ "status.no_file_selected": "Nessun file selezionato",
77
+ "status.cancelled": "Live grep annullato",
78
+ "prompt.live_grep": "Live grep: "
79
+ },
67
80
  "ja": {
68
81
  "cmd.live_grep": "Live Grep (ファイル内検索)",
69
82
  "cmd.live_grep_desc": "プロジェクト全体をライブプレビュー付きで検索",
@@ -84,6 +84,23 @@
84
84
  "suggestion.standard": "Standard - largeur par defaut",
85
85
  "suggestion.wide": "Large - plus de contenu par ligne"
86
86
  },
87
+ "it": {
88
+ "cmd.toggle_compose": "Markdown: Alterna Composizione",
89
+ "cmd.toggle_compose_desc": "Alterna la modalità composizione (a capo automatico, margini centrati)",
90
+ "cmd.set_compose_width": "Markdown: Imposta Larghezza Composizione",
91
+ "cmd.set_compose_width_desc": "Imposta la larghezza per l'andata a capo e i margini della modalità composizione",
92
+ "status.plugin_ready": "Plugin Markdown pronto",
93
+ "status.not_markdown_file": "Non è un file Markdown",
94
+ "status.compose_off": "Composizione Markdown: OFF",
95
+ "status.compose_on": "Composizione Markdown: ON (a capo automatico, centrato)",
96
+ "status.width_set": "Larghezza composizione Markdown impostata a {width}",
97
+ "status.invalid_width": "Larghezza non valida - deve essere compresa tra 20 e 300",
98
+ "prompt.compose_width": "Larghezza composizione: ",
99
+ "suggestion.narrow": "Stretto - ottimo per i pannelli laterali",
100
+ "suggestion.classic": "Classico - larghezza terminale tradizionale",
101
+ "suggestion.standard": "Standard - larghezza predefinita",
102
+ "suggestion.wide": "Largo - più contenuto per riga"
103
+ },
87
104
  "ja": {
88
105
  "cmd.toggle_compose": "Markdown: 作成モード切り替え",
89
106
  "cmd.toggle_compose_desc": "作成モードを切り替え (ソフトラップ、中央揃えマージン)",