@fresh-editor/fresh-editor 0.1.99 → 0.2.2

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,75 @@
1
1
  # Release Notes
2
2
 
3
+ ## 0.2.2
4
+
5
+ ### Bug Fixes
6
+
7
+ * **Regex Find-and-Replace**: Fixed regex mode not working. Added capture group support (`$1`, `$2`, `${name}`) and a toolbar hint when regex mode is active.
8
+
9
+ * **Keybinding Editor**: Fixed actions with no default keybinding missing from the editor; all actions are now listed. Fixed inability to delete built-in keymap bindings. Fixed deleted bindings reappearing after save.
10
+
11
+ * **LSP Completion Popup**: Fixed completion popup blocking typing when not working in non-English locales.
12
+
13
+ * **Revised in-editor help**: Rewrote the in-memory help manual, should be a bit more useful.
14
+
15
+ ### Internal
16
+
17
+ * Refactored keybinding editor into multi-file module.
18
+ * Locked Cargo.toml dependency versions to minor; docs recommend `--locked`. Dependency updates.
19
+ * ~53 documentation clarity fixes.
20
+
21
+ ---
22
+
23
+ ## 0.2.0
24
+
25
+ ### Features
26
+
27
+ * Experimental **Session Persistence**: Detach from and reattach to editor sessions with full state preservation. Start with `fresh -a <name>` or `fresh -a` (directory-based), detach via File menu or command palette. Sessions persist across terminal disconnections. Use `fresh --cmd session list/kill/attach` and `fresh --cmd session open-file NAME FILES` to manage sessions from the command line. Allows using Fresh across other applications, e.g. yazi edit action triggers a file open in Fresh.
28
+
29
+ * **Keybinding Editor**: Full-featured editor for customizing keybindings. Search by text or record key, filter by context/source, add/edit/delete bindings with conflict detection and autocomplete. Try menus: Edit..Keybinding Editor, or command palette. Changes are saved in config.json
30
+
31
+ ### Improvements
32
+
33
+ * **Line Editing**: Move lines up/down and duplicate lines, matching modern editor behavior. Multi-cursor support (@Asuka-Minato).
34
+
35
+ * **Triple-Click Selection**: Triple-click selects entire line (#597).
36
+
37
+ * **Vietnamese Localization**: Full Vietnamese (Tiếng Việt) language support.
38
+
39
+ * **Typst Language Support**: Syntax highlighting and tinymist LSP configuration for `.typ` files (#944).
40
+
41
+ * **LSP Improvements**:
42
+ - Per-buffer LSP toggle command to enable/disable LSP for individual files
43
+ - Default LSP configs for bash, lua, ruby, php, yaml, toml (#946)
44
+
45
+ ### Bug Fixes
46
+
47
+ * **LSP Document Sync**: Fixed document corruption when LSP servers received didChange after didOpen, and when bulk edits (selection replacement, multi-cursor) bypassed LSP notifications.
48
+
49
+ * **LSP Completion Popup**: Fixed popup swallowing non-word characters, arrow keys, and other keys. Popup now dismisses correctly allowing keystrokes to pass through (#931)
50
+
51
+ * **LSP Diagnostics**: Fixed diagnostic gutter markers not appearing on implicit trailing lines with zero-width ranges (clangd-style diagnostics).
52
+
53
+ * **Line Wrapping**: End/Home keys now navigate by visual line when wrapping is enabled, matching VS Code/Notepad behavior (#979).
54
+
55
+ * **Syntax Highlighting**: Fixed highlighting lost when saving files without extension (shebang detection) outside working directory (#978).
56
+
57
+ * **Buffer Settings**: User-configured tab size, indentation, and line numbers now preserved across auto-revert.
58
+
59
+ * **Terminal Scrollback**: Any character key exits scrollback mode instead of just 'q' (#863).
60
+
61
+ * **32-bit ARM Build**: Fixed setrlimit type mismatch on ARMv7l platforms (#957).
62
+
63
+ ### Configuration
64
+
65
+ * Added C++20 module extensions (.cppm, .ixx) for C++ syntax highlighting (#955).
66
+
67
+ ### Documentation
68
+
69
+ * Added FreeBSD installation note (@lwhsu).
70
+
71
+ ---
72
+
3
73
  ## 0.1.99
4
74
 
5
75
  ### Features
package/README.md CHANGED
@@ -6,6 +6,8 @@ A terminal-based text editor. [Official Website →](https://sinelaw.github.io/f
6
6
 
7
7
  **[Contributing](#contributing)**
8
8
 
9
+ **[Discord](https://discord.gg/qUutBj9t)**
10
+
9
11
  ## Why?
10
12
 
11
13
  Why another text editor? Fresh brings the intuitive, conventional UX of editors like VS Code and Sublime Text to the terminal.
@@ -57,9 +59,11 @@ Or, pick your preferred method:
57
59
  |----------|--------|
58
60
  | macOS | [brew](#brew) |
59
61
  | Bazzite/Bluefin/Aurora Linux | [brew](#brew) |
62
+ | Windows | [winget](#windows-winget) |
60
63
  | Arch Linux | [AUR](#arch-linux-aur) |
61
64
  | Debian/Ubuntu | [.deb](#debianubuntu-deb) |
62
65
  | Fedora/RHEL | [.rpm](#fedorarhelopensuse-rpm), [Terra](https://terra.fyralabs.com/) |
66
+ | FreeBSD | [ports / pkg](https://www.freshports.org/editors/fresh) |
63
67
  | Linux (any distro) | [AppImage](#appimage), [Flatpak](#flatpak) |
64
68
  | All platforms | [Pre-built binaries](#pre-built-binaries) |
65
69
  | npm | [npm / npx](#npm) |
@@ -79,6 +83,14 @@ brew tap sinelaw/fresh
79
83
  brew install fresh-editor
80
84
  ```
81
85
 
86
+ ### Windows (winget)
87
+
88
+ ```bash
89
+ winget install fresh-editor
90
+ ```
91
+
92
+ Alternatively, Windows users can use [npm](#npm).
93
+
82
94
  ### Arch Linux ([AUR](https://aur.archlinux.org/packages/fresh-editor-bin))
83
95
 
84
96
  **Binary package (recommended, faster install):**
@@ -205,7 +217,7 @@ nix profile add github:sinelaw/fresh
205
217
  ### From crates.io
206
218
 
207
219
  ```bash
208
- cargo install fresh-editor
220
+ cargo install --locked fresh-editor
209
221
  ```
210
222
 
211
223
  ### From source
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fresh-editor/fresh-editor",
3
- "version": "0.1.99",
3
+ "version": "0.2.2",
4
4
  "description": "A modern terminal-based text editor with plugin support",
5
5
  "repository": {
6
6
  "type": "git",
@@ -755,6 +755,69 @@
755
755
  "panel.help_export_footer": "ЕКСПОРТ: [E]кспорт до .review/session.md | [O]загальний [r]оновити",
756
756
  "debug.loaded": "Плагін рев'ю змін завантажено з підтримкою коментарів"
757
757
  },
758
+ "vi": {
759
+ "cmd.review_diff": "Xem xét khác biệt",
760
+ "cmd.review_diff_desc": "Bắt đầu phiên xem xét mã",
761
+ "cmd.stop_review_diff": "Dừng xem xét",
762
+ "cmd.stop_review_diff_desc": "Dừng phiên xem xét",
763
+ "cmd.refresh_review_diff": "Làm mới khác biệt",
764
+ "cmd.refresh_review_diff_desc": "Làm mới danh sách thay đổi",
765
+ "cmd.side_by_side_diff": "So sánh song song",
766
+ "cmd.side_by_side_diff_desc": "Hiển thị khác biệt song song cho tệp hiện tại",
767
+ "cmd.add_comment": "Xem xét: Thêm nhận xét",
768
+ "cmd.add_comment_desc": "Thêm nhận xét xem xét cho khối hiện tại",
769
+ "cmd.approve_hunk": "Xem xét: Duyệt khối",
770
+ "cmd.approve_hunk_desc": "Đánh dấu khối đã duyệt",
771
+ "cmd.reject_hunk": "Xem xét: Từ chối khối",
772
+ "cmd.reject_hunk_desc": "Đánh dấu khối bị từ chối",
773
+ "cmd.needs_changes": "Xem xét: Cần thay đổi",
774
+ "cmd.needs_changes_desc": "Đánh dấu khối cần thay đổi",
775
+ "cmd.question": "Xem xét: Câu hỏi",
776
+ "cmd.question_desc": "Đánh dấu khối với câu hỏi",
777
+ "cmd.clear_status": "Xem xét: Xóa trạng thái",
778
+ "cmd.clear_status_desc": "Xóa trạng thái xem xét của khối",
779
+ "cmd.overall_feedback": "Xem xét: Phản hồi tổng thể",
780
+ "cmd.overall_feedback_desc": "Đặt phản hồi tổng thể cho xem xét",
781
+ "cmd.export_markdown": "Xem xét: Xuất ra Markdown",
782
+ "cmd.export_markdown_desc": "Xuất xem xét ra .review/session.md",
783
+ "cmd.export_json": "Xem xét: Xuất ra JSON",
784
+ "cmd.export_json_desc": "Xuất xem xét ra .review/session.json",
785
+ "status.refreshing": "Đang làm mới khác biệt xem xét...",
786
+ "status.updated": "Đã cập nhật khác biệt xem xét. Tìm thấy %{count} khối.",
787
+ "status.loading_diff": "Đang tải so sánh song song...",
788
+ "status.not_git_repo": "Không trong kho git",
789
+ "status.failed_old_version": "Không thể tải phiên bản cũ của tệp",
790
+ "status.failed_new_version": "Không thể tải phiên bản mới của tệp",
791
+ "status.diff_summary": "So sánh song song: +%{added} -%{removed} ~%{modified} | 'q' để quay lại",
792
+ "status.no_hunk_selected": "Chưa chọn khối để nhận xét",
793
+ "status.comment_added": "Đã thêm nhận xét vào %{line}",
794
+ "status.comment_cancelled": "Đã hủy nhận xét",
795
+ "status.hunk_approved": "Đã duyệt khối",
796
+ "status.hunk_rejected": "Đã từ chối khối",
797
+ "status.hunk_needs_changes": "Đã đánh dấu khối cần thay đổi",
798
+ "status.hunk_question": "Đã đánh dấu khối với câu hỏi",
799
+ "status.hunk_status_cleared": "Đã xóa trạng thái xem xét của khối",
800
+ "status.feedback_set": "Đã đặt phản hồi tổng thể",
801
+ "status.feedback_cleared": "Đã xóa phản hồi tổng thể",
802
+ "status.exported": "Đã xuất xem xét ra %{path}",
803
+ "status.generating": "Đang tạo luồng khác biệt xem xét...",
804
+ "status.review_summary": "Xem xét: %{count} khối | [c]nhận xét [a]duyệt [x]từ chối [!]thay đổi [?]câu hỏi [E]xuất",
805
+ "status.stopped": "Đã dừng chế độ xem xét khác biệt.",
806
+ "status.no_file_open": "Không có tệp mở - không thể hiển thị khác biệt",
807
+ "status.failed_git_diff": "Không thể lấy git diff cho tệp",
808
+ "status.no_changes": "Không có thay đổi trong tệp này",
809
+ "status.failed_old_new_file": "Không thể tải phiên bản cũ của tệp (tệp có thể là mới)",
810
+ "prompt.comment": "Nhận xét trên %{line}: ",
811
+ "prompt.overall_feedback": "Phản hồi tổng thể: ",
812
+ "panel.no_changes": "Không có thay đổi để xem xét.",
813
+ "panel.help_review": "XEM XÉT: [c]nhận xét [a]duyệt [x]từ chối [!]thay đổi [?]câu hỏi [u]hoàn tác",
814
+ "panel.help_stage": "STAGE: [s]tage [d]bỏ | NAV: [n]tiếp [p]trước [Enter]chi tiết [q]thoát",
815
+ "panel.help_export": "XUẤT: [E] .review/session.md | [O]tổng thể | [r]làm mới",
816
+ "panel.help_review_footer": "XEM XÉT: [c]nhận xét [a]duyệt [x]từ chối [!]cần thay đổi [?]câu hỏi [u]hoàn tác",
817
+ "panel.help_stage_footer": "STAGE: [s]tage [d]bỏ | NAV: [n]tiếp [p]trước [Enter]chi tiết [q]thoát",
818
+ "panel.help_export_footer": "XUẤT: [E]xuất ra .review/session.md | [O]tổng thể [r]làm mới",
819
+ "debug.loaded": "Plugin xem xét khác biệt đã tải với hỗ trợ nhận xét"
820
+ },
758
821
  "zh-CN": {
759
822
  "cmd.review_diff": "审查差异",
760
823
  "cmd.review_diff_desc": "开始代码审查会话",
@@ -59,6 +59,11 @@
59
59
  "status.initialized": "Buffer Modified: ініціалізовано для %{path}",
60
60
  "status.cleared_on_save": "Buffer Modified: очищено при збереженні"
61
61
  },
62
+ "vi": {
63
+ "status.loaded": "Đã tải plugin Buffer Modified",
64
+ "status.initialized": "Buffer Modified: đã khởi tạo cho %{path}",
65
+ "status.cleared_on_save": "Buffer Modified: đã xóa khi lưu"
66
+ },
62
67
  "zh-CN": {
63
68
  "status.loaded": "Buffer Modified插件已加载",
64
69
  "status.initialized": "Buffer Modified: 已为%{path}初始化",
@@ -203,6 +203,23 @@
203
203
  "status.config_not_found": "Не вдалося знайти конфігурацію .clangd у робочому просторі",
204
204
  "status.file_status": "Статус файлу Clangd: %{status}"
205
205
  },
206
+ "vi": {
207
+ "cmd.project_setup": "Clangd: Thiết lập Dự án",
208
+ "cmd.project_setup_desc": "Phân tích trạng thái sẵn sàng clangd C/C++ (compile_commands.json, .clangd)",
209
+ "cmd.switch_source_header": "Clangd: Chuyển đổi Nguồn/Header",
210
+ "cmd.switch_source_header_desc": "Nhảy đến cặp header/nguồn sử dụng clangd",
211
+ "cmd.open_project_config": "Clangd: Mở Cấu hình Dự án",
212
+ "cmd.open_project_config_desc": "Mở tệp .clangd gần nhất",
213
+ "status.plugin_loaded": "Đã tải plugin hỗ trợ Clangd (chuyển đổi header + lệnh cấu hình)",
214
+ "status.no_active_file": "Clangd: không có tệp đang hoạt động để chuyển đổi",
215
+ "status.unsupported_file_type": "Clangd: loại tệp không được hỗ trợ để chuyển đổi header",
216
+ "status.opened_corresponding_file": "Clangd: đã mở tệp tương ứng",
217
+ "status.no_matching_found": "Clangd: không tìm thấy header/nguồn phù hợp",
218
+ "status.switch_failed": "Clangd chuyển đổi nguồn/header thất bại: %{error}",
219
+ "status.opened_config": "Đã mở cấu hình .clangd",
220
+ "status.config_not_found": "Không tìm thấy cấu hình .clangd trong không gian làm việc",
221
+ "status.file_status": "Trạng thái tệp Clangd: %{status}"
222
+ },
206
223
  "zh-CN": {
207
224
  "cmd.project_setup": "Clangd: 项目设置",
208
225
  "cmd.project_setup_desc": "分析C/C++ clangd就绪状态 (compile_commands.json, .clangd)",
@@ -145,9 +145,9 @@
145
145
  "additionalProperties": {
146
146
  "$ref": "#/$defs/PluginConfig"
147
147
  },
148
+ "default": {},
148
149
  "x-standalone-category": true,
149
- "x-no-add": true,
150
- "default": {}
150
+ "x-no-add": true
151
151
  },
152
152
  "packages": {
153
153
  "description": "Package manager settings for plugin/theme installation",
@@ -186,6 +186,7 @@
186
186
  "ru",
187
187
  "th",
188
188
  "uk",
189
+ "vi",
189
190
  "zh-CN"
190
191
  ]
191
192
  },
@@ -196,256 +197,256 @@
196
197
  "line_numbers": {
197
198
  "description": "Show line numbers in the gutter (default for new buffers)",
198
199
  "type": "boolean",
199
- "x-section": "Display",
200
- "default": true
200
+ "default": true,
201
+ "x-section": "Display"
201
202
  },
202
203
  "relative_line_numbers": {
203
204
  "description": "Show line numbers relative to cursor position",
204
205
  "type": "boolean",
205
- "x-section": "Display",
206
- "default": false
206
+ "default": false,
207
+ "x-section": "Display"
207
208
  },
208
209
  "line_wrap": {
209
210
  "description": "Wrap long lines to fit the window width (default for new views)",
210
211
  "type": "boolean",
211
- "x-section": "Display",
212
- "default": true
212
+ "default": true,
213
+ "x-section": "Display"
213
214
  },
214
215
  "syntax_highlighting": {
215
216
  "description": "Enable syntax highlighting for code files",
216
217
  "type": "boolean",
217
- "x-section": "Display",
218
- "default": true
218
+ "default": true,
219
+ "x-section": "Display"
219
220
  },
220
221
  "show_menu_bar": {
221
222
  "description": "Whether the menu bar is visible by default.\nThe menu bar provides access to menus (File, Edit, View, etc.) at the top of the screen.\nCan be toggled at runtime via command palette or keybinding.\nDefault: true",
222
223
  "type": "boolean",
223
- "x-section": "Display",
224
- "default": true
224
+ "default": true,
225
+ "x-section": "Display"
225
226
  },
226
227
  "show_tab_bar": {
227
228
  "description": "Whether the tab bar is visible by default.\nThe tab bar shows open files in each split pane.\nCan be toggled at runtime via command palette or keybinding.\nDefault: true",
228
229
  "type": "boolean",
229
- "x-section": "Display",
230
- "default": true
230
+ "default": true,
231
+ "x-section": "Display"
231
232
  },
232
233
  "use_terminal_bg": {
233
234
  "description": "Use the terminal's default background color instead of the theme's editor background.\nWhen enabled, the editor background inherits from the terminal emulator,\nallowing transparency or custom terminal backgrounds to show through.\nDefault: false",
234
235
  "type": "boolean",
235
- "x-section": "Display",
236
- "default": false
236
+ "default": false,
237
+ "x-section": "Display"
237
238
  },
238
239
  "cursor_style": {
239
240
  "description": "Cursor style for the terminal cursor.\nOptions: blinking_block, steady_block, blinking_bar, steady_bar, blinking_underline, steady_underline\nDefault: blinking_block",
240
241
  "$ref": "#/$defs/CursorStyle",
241
- "x-section": "Display",
242
- "default": "default"
242
+ "default": "default",
243
+ "x-section": "Display"
243
244
  },
244
245
  "tab_size": {
245
246
  "description": "Number of spaces per tab character",
246
247
  "type": "integer",
247
248
  "format": "uint",
248
249
  "minimum": 0,
249
- "x-section": "Editing",
250
- "default": 4
250
+ "default": 4,
251
+ "x-section": "Editing"
251
252
  },
252
253
  "auto_indent": {
253
254
  "description": "Automatically indent new lines based on the previous line",
254
255
  "type": "boolean",
255
- "x-section": "Editing",
256
- "default": true
256
+ "default": true,
257
+ "x-section": "Editing"
257
258
  },
258
259
  "scroll_offset": {
259
260
  "description": "Minimum lines to keep visible above/below cursor when scrolling",
260
261
  "type": "integer",
261
262
  "format": "uint",
262
263
  "minimum": 0,
263
- "x-section": "Editing",
264
- "default": 3
264
+ "default": 3,
265
+ "x-section": "Editing"
265
266
  },
266
267
  "default_line_ending": {
267
268
  "description": "Default line ending format for new files.\nFiles loaded from disk will use their detected line ending format.\nOptions: \"lf\" (Unix/Linux/macOS), \"crlf\" (Windows), \"cr\" (Classic Mac)\nDefault: \"lf\"",
268
269
  "$ref": "#/$defs/LineEndingOption",
269
- "x-section": "Editing",
270
- "default": "lf"
270
+ "default": "lf",
271
+ "x-section": "Editing"
271
272
  },
272
273
  "trim_trailing_whitespace_on_save": {
273
274
  "description": "Remove trailing whitespace from lines when saving.\nDefault: false",
274
275
  "type": "boolean",
275
- "x-section": "Editing",
276
- "default": false
276
+ "default": false,
277
+ "x-section": "Editing"
277
278
  },
278
279
  "ensure_final_newline_on_save": {
279
280
  "description": "Ensure files end with a newline when saving.\nDefault: false",
280
281
  "type": "boolean",
281
- "x-section": "Editing",
282
- "default": false
282
+ "default": false,
283
+ "x-section": "Editing"
283
284
  },
284
285
  "highlight_matching_brackets": {
285
286
  "description": "Highlight matching bracket pairs when cursor is on a bracket.\nDefault: true",
286
287
  "type": "boolean",
287
- "x-section": "Bracket Matching",
288
- "default": true
288
+ "default": true,
289
+ "x-section": "Bracket Matching"
289
290
  },
290
291
  "rainbow_brackets": {
291
292
  "description": "Use rainbow colors for nested brackets based on nesting depth.\nRequires highlight_matching_brackets to be enabled.\nDefault: true",
292
293
  "type": "boolean",
293
- "x-section": "Bracket Matching",
294
- "default": true
294
+ "default": true,
295
+ "x-section": "Bracket Matching"
295
296
  },
296
297
  "quick_suggestions": {
297
298
  "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
299
  "type": "boolean",
299
- "x-section": "Completion",
300
- "default": true
300
+ "default": true,
301
+ "x-section": "Completion"
301
302
  },
302
303
  "quick_suggestions_delay_ms": {
303
304
  "description": "Delay in milliseconds before showing completion suggestions.\nLower values (10-50ms) feel more responsive but may be distracting.\nHigher values (100-500ms) reduce noise while typing.\nTrigger characters (like `.`) bypass this delay.\nDefault: 10 (matches VS Code)",
304
305
  "type": "integer",
305
306
  "format": "uint64",
306
307
  "minimum": 0,
307
- "x-section": "Completion",
308
- "default": 10
308
+ "default": 10,
309
+ "x-section": "Completion"
309
310
  },
310
311
  "suggest_on_trigger_characters": {
311
312
  "description": "Whether trigger characters (like `.`, `::`, `->`) immediately show completions.\nWhen true, typing a trigger character bypasses quick_suggestions_delay_ms.\nDefault: true",
312
313
  "type": "boolean",
313
- "x-section": "Completion",
314
- "default": true
314
+ "default": true,
315
+ "x-section": "Completion"
315
316
  },
316
317
  "accept_suggestion_on_enter": {
317
318
  "description": "Controls whether pressing Enter accepts the selected completion.\n- \"on\": Enter always accepts the completion\n- \"off\": Enter inserts a newline (use Tab to accept)\n- \"smart\": Enter accepts only if the completion text differs from typed text\nDefault: \"on\"",
318
319
  "$ref": "#/$defs/AcceptSuggestionOnEnter",
319
- "x-section": "Completion",
320
- "default": "on"
320
+ "default": "on",
321
+ "x-section": "Completion"
321
322
  },
322
323
  "enable_inlay_hints": {
323
324
  "description": "Whether to enable LSP inlay hints (type hints, parameter hints, etc.)",
324
325
  "type": "boolean",
325
- "x-section": "LSP",
326
- "default": true
326
+ "default": true,
327
+ "x-section": "LSP"
327
328
  },
328
329
  "enable_semantic_tokens_full": {
329
330
  "description": "Whether to request full-document LSP semantic tokens.\nRange requests are still used when supported.\nDefault: false (range-only to avoid heavy full refreshes).",
330
331
  "type": "boolean",
331
- "x-section": "LSP",
332
- "default": false
332
+ "default": false,
333
+ "x-section": "LSP"
333
334
  },
334
335
  "mouse_hover_enabled": {
335
336
  "description": "Whether mouse hover triggers LSP hover requests.\nWhen enabled, hovering over code with the mouse will show documentation.\nDefault: true",
336
337
  "type": "boolean",
337
- "x-section": "Mouse",
338
- "default": true
338
+ "default": true,
339
+ "x-section": "Mouse"
339
340
  },
340
341
  "mouse_hover_delay_ms": {
341
342
  "description": "Delay in milliseconds before a mouse hover triggers an LSP hover request.\nLower values show hover info faster but may cause more LSP server load.\nDefault: 500ms",
342
343
  "type": "integer",
343
344
  "format": "uint64",
344
345
  "minimum": 0,
345
- "x-section": "Mouse",
346
- "default": 500
346
+ "default": 500,
347
+ "x-section": "Mouse"
347
348
  },
348
349
  "double_click_time_ms": {
349
350
  "description": "Time window in milliseconds for detecting double-clicks.\nTwo clicks within this time are treated as a double-click (word selection).\nDefault: 500ms",
350
351
  "type": "integer",
351
352
  "format": "uint64",
352
353
  "minimum": 0,
353
- "x-section": "Mouse",
354
- "default": 500
354
+ "default": 500,
355
+ "x-section": "Mouse"
355
356
  },
356
357
  "recovery_enabled": {
357
358
  "description": "Whether to enable file recovery (Emacs-style auto-save)\nWhen enabled, buffers are periodically saved to recovery files\nso they can be recovered if the editor crashes.",
358
359
  "type": "boolean",
359
- "x-section": "Recovery",
360
- "default": true
360
+ "default": true,
361
+ "x-section": "Recovery"
361
362
  },
362
363
  "auto_save_interval_secs": {
363
364
  "description": "Auto-save interval in seconds for file recovery\nModified buffers are saved to recovery files at this interval.\nDefault: 2 seconds for fast recovery with minimal data loss.\nSet to 0 to disable periodic auto-save (manual recovery only).",
364
365
  "type": "integer",
365
366
  "format": "uint32",
366
367
  "minimum": 0,
367
- "x-section": "Recovery",
368
- "default": 2
368
+ "default": 2,
369
+ "x-section": "Recovery"
369
370
  },
370
371
  "auto_revert_poll_interval_ms": {
371
372
  "description": "Poll interval in milliseconds for auto-reverting open buffers.\nWhen auto-revert is enabled, file modification times are checked at this interval.\nLower values detect external changes faster but use more CPU.\nDefault: 2000ms (2 seconds)",
372
373
  "type": "integer",
373
374
  "format": "uint64",
374
375
  "minimum": 0,
375
- "x-section": "Recovery",
376
- "default": 2000
376
+ "default": 2000,
377
+ "x-section": "Recovery"
377
378
  },
378
379
  "keyboard_disambiguate_escape_codes": {
379
380
  "description": "Enable keyboard enhancement: disambiguate escape codes using CSI-u sequences.\nThis allows unambiguous reading of Escape and modified keys.\nRequires terminal support (kitty keyboard protocol).\nDefault: true",
380
381
  "type": "boolean",
381
- "x-section": "Keyboard",
382
- "default": true
382
+ "default": true,
383
+ "x-section": "Keyboard"
383
384
  },
384
385
  "keyboard_report_event_types": {
385
386
  "description": "Enable keyboard enhancement: report key event types (repeat/release).\nAdds extra events when keys are autorepeated or released.\nRequires terminal support (kitty keyboard protocol).\nDefault: false",
386
387
  "type": "boolean",
387
- "x-section": "Keyboard",
388
- "default": false
388
+ "default": false,
389
+ "x-section": "Keyboard"
389
390
  },
390
391
  "keyboard_report_alternate_keys": {
391
392
  "description": "Enable keyboard enhancement: report alternate keycodes.\nSends alternate keycodes in addition to the base keycode.\nRequires terminal support (kitty keyboard protocol).\nDefault: true",
392
393
  "type": "boolean",
393
- "x-section": "Keyboard",
394
- "default": true
394
+ "default": true,
395
+ "x-section": "Keyboard"
395
396
  },
396
397
  "keyboard_report_all_keys_as_escape_codes": {
397
398
  "description": "Enable keyboard enhancement: report all keys as escape codes.\nRepresents all keyboard events as CSI-u sequences.\nRequired for repeat/release events on plain-text keys.\nRequires terminal support (kitty keyboard protocol).\nDefault: false",
398
399
  "type": "boolean",
399
- "x-section": "Keyboard",
400
- "default": false
400
+ "default": false,
401
+ "x-section": "Keyboard"
401
402
  },
402
403
  "highlight_timeout_ms": {
403
404
  "description": "Maximum time in milliseconds for syntax highlighting per frame",
404
405
  "type": "integer",
405
406
  "format": "uint64",
406
407
  "minimum": 0,
407
- "x-section": "Performance",
408
- "default": 5
408
+ "default": 5,
409
+ "x-section": "Performance"
409
410
  },
410
411
  "snapshot_interval": {
411
412
  "description": "Undo history snapshot interval (number of edits between snapshots)",
412
413
  "type": "integer",
413
414
  "format": "uint",
414
415
  "minimum": 0,
415
- "x-section": "Performance",
416
- "default": 100
416
+ "default": 100,
417
+ "x-section": "Performance"
417
418
  },
418
419
  "highlight_context_bytes": {
419
420
  "description": "Number of bytes to look back/forward from the viewport for syntax highlighting context.\nLarger values improve accuracy for multi-line constructs (strings, comments, nested blocks)\nbut may slow down highlighting for very large files.\nDefault: 10KB (10000 bytes)",
420
421
  "type": "integer",
421
422
  "format": "uint",
422
423
  "minimum": 0,
423
- "x-section": "Performance",
424
- "default": 10000
424
+ "default": 10000,
425
+ "x-section": "Performance"
425
426
  },
426
427
  "large_file_threshold_bytes": {
427
428
  "description": "File size threshold in bytes for \"large file\" behavior\nFiles larger than this will:\n- Skip LSP features\n- Use constant-size scrollbar thumb (1 char)\n\nFiles smaller will count actual lines for accurate scrollbar rendering",
428
429
  "type": "integer",
429
430
  "format": "uint64",
430
431
  "minimum": 0,
431
- "x-section": "Performance",
432
- "default": 1048576
432
+ "default": 1048576,
433
+ "x-section": "Performance"
433
434
  },
434
435
  "estimated_line_length": {
435
436
  "description": "Estimated average line length in bytes (used for large file line estimation)\nThis is used by LineIterator to estimate line positions in large files\nwithout line metadata. Typical values: 80-120 bytes.",
436
437
  "type": "integer",
437
438
  "format": "uint",
438
439
  "minimum": 0,
439
- "x-section": "Performance",
440
- "default": 80
440
+ "default": 80,
441
+ "x-section": "Performance"
441
442
  },
442
443
  "file_tree_poll_interval_ms": {
443
444
  "description": "Poll interval in milliseconds for refreshing expanded directories in the file explorer.\nDirectory modification times are checked at this interval to detect new/deleted files.\nLower values detect changes faster but use more CPU.\nDefault: 3000ms (3 seconds)",
444
445
  "type": "integer",
445
446
  "format": "uint64",
446
447
  "minimum": 0,
447
- "x-section": "Performance",
448
- "default": 3000
448
+ "default": 3000,
449
+ "x-section": "Performance"
449
450
  }
450
451
  }
451
452
  },
@@ -71,6 +71,12 @@
71
71
  "status.restore_failed": "Помилка відновлення NuGet: %{error}",
72
72
  "status.restore_error": "Помилка відновлення NuGet: %{error}"
73
73
  },
74
+ "vi": {
75
+ "status.restoring_packages": "Đang khôi phục gói NuGet cho %{project}...",
76
+ "status.restore_completed": "Hoàn tất khôi phục NuGet cho %{project}",
77
+ "status.restore_failed": "Khôi phục NuGet thất bại: %{error}",
78
+ "status.restore_error": "Lỗi khôi phục NuGet: %{error}"
79
+ },
74
80
  "zh-CN": {
75
81
  "status.restoring_packages": "正在为%{project}恢复NuGet包...",
76
82
  "status.restore_completed": "%{project}的NuGet恢复已完成",
@@ -215,6 +215,24 @@
215
215
  "panel.all_files": "Усі файли",
216
216
  "panel.current_file": "Поточний файл"
217
217
  },
218
+ "vi": {
219
+ "cmd.show_diagnostics_panel": "Hiển thị bảng chẩn đoán",
220
+ "cmd.show_diagnostics_panel_desc": "Mở bảng chẩn đoán",
221
+ "cmd.toggle_diagnostics_panel": "Bật/tắt bảng chẩn đoán",
222
+ "cmd.toggle_diagnostics_panel_desc": "Bật/tắt bảng chẩn đoán",
223
+ "status.loaded": "Plugin bảng chẩn đoán đã tải",
224
+ "status.failed_to_open": "Không thể mở bảng chẩn đoán",
225
+ "status.closed": "Đã đóng bảng chẩn đoán",
226
+ "status.jumped_to": "Đã nhảy đến %{file}:%{line}",
227
+ "status.move_to_diagnostic": "Di chuyển con trỏ đến dòng chẩn đoán",
228
+ "status.showing": "Đang hiển thị: %{label}",
229
+ "status.refreshed": "Đã làm mới chẩn đoán",
230
+ "status.diagnostics_count": "Chẩn đoán: %{count} mục | a: bật/tắt bộ lọc | RET: đi đến | q: đóng",
231
+ "panel.header": "Chẩn đoán (%{filter}):",
232
+ "panel.no_diagnostics": "Không có chẩn đoán",
233
+ "panel.all_files": "Tất cả tệp",
234
+ "panel.current_file": "Tệp hiện tại"
235
+ },
218
236
  "zh-CN": {
219
237
  "cmd.show_diagnostics_panel": "显示诊断面板",
220
238
  "cmd.show_diagnostics_panel_desc": "打开诊断面板",