@fresh-editor/fresh-editor 0.1.86 → 0.1.88

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +4 -0
  3. package/package.json +1 -1
  4. package/plugins/README.md +1 -0
  5. package/plugins/audit_mode.ts +38 -34
  6. package/plugins/calculator.i18n.json +13 -13
  7. package/plugins/calculator.ts +6 -6
  8. package/plugins/clangd_support.i18n.json +26 -26
  9. package/plugins/config-schema.json +180 -116
  10. package/plugins/csharp_support.i18n.json +52 -52
  11. package/plugins/csharp_support.ts +214 -41
  12. package/plugins/examples/virtual_buffer_demo.ts +4 -4
  13. package/plugins/find_references.i18n.json +91 -91
  14. package/plugins/git_blame.ts +3 -3
  15. package/plugins/git_explorer.ts +3 -2
  16. package/plugins/git_log.i18n.json +182 -182
  17. package/plugins/git_log.ts +10 -10
  18. package/plugins/java-lsp.ts +65 -0
  19. package/plugins/latex-lsp.ts +65 -0
  20. package/plugins/lib/finder.ts +32 -32
  21. package/plugins/lib/fresh.d.ts +432 -17
  22. package/plugins/lib/panel-manager.ts +7 -7
  23. package/plugins/lib/search-utils.ts +13 -13
  24. package/plugins/lib/virtual-buffer-factory.ts +16 -14
  25. package/plugins/live_grep.i18n.json +39 -39
  26. package/plugins/markdown_compose.i18n.json +13 -13
  27. package/plugins/markdown_compose.ts +4 -4
  28. package/plugins/marksman-lsp.ts +65 -0
  29. package/plugins/merge_conflict.i18n.json +143 -143
  30. package/plugins/merge_conflict.ts +21 -21
  31. package/plugins/search_replace.i18n.json +143 -143
  32. package/plugins/search_replace.ts +6 -6
  33. package/plugins/templ-lsp.ts +65 -0
  34. package/plugins/theme_editor.i18n.json +3797 -3745
  35. package/plugins/theme_editor.ts +6 -5
  36. package/plugins/vi_mode.ts +2 -2
  37. package/plugins/zig-lsp.ts +65 -0
  38. package/themes/dracula.json +26 -5
  39. package/plugins/csharp-lsp.ts +0 -147
package/CHANGELOG.md CHANGED
@@ -1,5 +1,52 @@
1
1
  # Release Notes
2
2
 
3
+ ## 0.1.88
4
+
5
+ ### Features
6
+
7
+ * **Status Bar Language Indicator**: Click the language name in the status bar to change syntax highlighting. Supports mouse wheel scrolling and type-to-filter.
8
+ * **VS Code-like Completion UX**: Debounced completion triggers, Tab accepts completion, uppercase letters work in type-to-filter.
9
+ * **Per-Language LSP Root URI**: LSP servers can now have per-language root URI detection. Includes automatic C# project root detection via `.csproj` files.
10
+ * **Settings UI Improvements**: Settings organized by topic sections, improved focus colors, search navigates to setting, better Map control navigation.
11
+
12
+ ### Bug Fixes
13
+
14
+ * **Tab Bar Mouse Events**: Fixed clicks on tabs not working when menu bar is hidden (#832).
15
+ * **LSP Deadlock**: Fixed deadlock when LSP server sends requests while client is awaiting a response.
16
+ * **LSP Root URI**: Include `root_uri` in LSP initialize params for server compatibility.
17
+ * **Terminal Scrollback**: Fixed race condition truncating terminal backing file when PTY already wrote content.
18
+ * **Plugin i18n**: Fixed placeholder format to use `%{variable}` syntax.
19
+ * **Settings UI**: Fixed confirm dialog mouse clicks/Tab navigation, dropdown option selection, search result navigation, and content bleeding into footer.
20
+
21
+ ### Packaging
22
+
23
+ * **Winget**: Added Windows Package Manager (winget) publishing to release pipeline.
24
+
25
+ ### Internal
26
+
27
+ * **FileSystem Trait**: New IO abstraction layer enabling different backends (local, remote, WASM). All filesystem operations now use injectable `FileSystem` trait.
28
+
29
+ ---
30
+
31
+ ## 0.1.87
32
+
33
+ ### Features
34
+
35
+ * **Language Support**: Added LSP configurations and syntax highlighting for Zig, Java, LaTeX, Markdown, and Templ.
36
+ * **Git File Highlighting**: Syntax highlighting for git-related files (.gitignore, .gitattributes, .gitmodules).
37
+ * **Plugin Type Safety**: TypeScript type definitions for plugin API with compile-time validation.
38
+
39
+ ### Bug Fixes
40
+
41
+ * **Hover Popup**: Fixed scrolling to bottom, dismiss on click outside, block clicks inside popup.
42
+ * **Settings UI**: Fixed overwriting manual config.json edits when saving from Settings UI (#806).
43
+ * **Windows Terminal**: Fixed truecolor detection and 256-color grayscale conversion overflow.
44
+ * **Composite Buffers**: Fixed mouse click sync, deserialization errors, and cursor positioning.
45
+ * **Plugin Stability**: Plugin thread panics now propagate to main thread for proper error handling.
46
+ * **Review Diff Plugin**: Fixed side-by-side diff commands not appearing in command palette.
47
+
48
+ ---
49
+
3
50
  ## 0.1.86
4
51
 
5
52
  ### Features
package/README.md CHANGED
@@ -241,6 +241,10 @@ Thanks for contributing!
241
241
 
242
242
  7. **LSP**: Ensure LSP interactions follow the correct lifecycle (e.g., `didOpen` must always precede other requests to avoid server-side errors). Use the appropriate existing helpers for this pattern.
243
243
 
244
+ 8. **Regenerate plugin types**: After modifying the plugin API, run `cargo test -p fresh-plugin-runtime write_fresh_dts_file -- --ignored`
245
+
246
+ 9. **Type check plugins**: Run `crates/fresh-editor/plugins/check-types.sh` (requires `tsc`)
247
+
244
248
  **Tip**: You can use tmux + send-keys + render-pane to script ad-hoc tests on the UI, for example when trying to reproduce an issue.
245
249
 
246
250
  ## Privacy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fresh-editor/fresh-editor",
3
- "version": "0.1.86",
3
+ "version": "0.1.88",
4
4
  "description": "A modern terminal-based text editor with plugin support",
5
5
  "repository": {
6
6
  "type": "git",
package/plugins/README.md CHANGED
@@ -69,3 +69,4 @@ For plugin development guides, see:
69
69
  - **API Reference:** [`docs/plugin-api.md`](../docs/plugin-api.md)
70
70
  - **Examples:** [`examples/README.md`](examples/README.md)
71
71
  - **Clangd Plugin:** [`clangd_support.md`](clangd_support.md)
72
+
@@ -551,7 +551,7 @@ async function renderReviewStream(): Promise<{ entries: TextPropertyEntry[], hig
551
551
  * Updates the buffer UI (text and highlights) based on current state.hunks
552
552
  */
553
553
  async function updateReviewUI() {
554
- if (state.reviewBufferId !== null) {
554
+ if (state.reviewBufferId != null) {
555
555
  const { entries, highlights } = await renderReviewStream();
556
556
  editor.setVirtualBufferContent(state.reviewBufferId, entries);
557
557
 
@@ -677,12 +677,12 @@ globalThis.on_viewport_changed = (data: any) => {
677
677
 
678
678
  const { oldSplitId, newSplitId, oldLineByteOffsets, newLineByteOffsets } = activeSideBySideState;
679
679
 
680
- if (data.split_id === oldSplitId && newLineByteOffsets.length > 0) {
680
+ if (data.splitId === oldSplitId && newLineByteOffsets.length > 0) {
681
681
  // OLD pane scrolled - find which line it's on and sync NEW pane to same line
682
682
  const lineNum = findLineForByte(oldLineByteOffsets, data.top_byte);
683
683
  const targetByte = newLineByteOffsets[Math.min(lineNum, newLineByteOffsets.length - 1)];
684
684
  (editor as any).setSplitScroll(newSplitId, targetByte);
685
- } else if (data.split_id === newSplitId && oldLineByteOffsets.length > 0) {
685
+ } else if (data.splitId === newSplitId && oldLineByteOffsets.length > 0) {
686
686
  // NEW pane scrolled - find which line it's on and sync OLD pane to same line
687
687
  const lineNum = findLineForByte(newLineByteOffsets, data.top_byte);
688
688
  const targetByte = oldLineByteOffsets[Math.min(lineNum, oldLineByteOffsets.length - 1)];
@@ -1100,7 +1100,7 @@ globalThis.review_drill_down = async () => {
1100
1100
  }));
1101
1101
 
1102
1102
  // Create source buffers (hidden from tabs, used by composite)
1103
- const oldBufferId = await editor.createVirtualBuffer({
1103
+ const oldResult = await editor.createVirtualBuffer({
1104
1104
  name: `*OLD:${h.file}*`,
1105
1105
  mode: "normal",
1106
1106
  readOnly: true,
@@ -1109,8 +1109,9 @@ globalThis.review_drill_down = async () => {
1109
1109
  editingDisabled: true,
1110
1110
  hiddenFromTabs: true
1111
1111
  });
1112
+ const oldBufferId = oldResult.bufferId;
1112
1113
 
1113
- const newBufferId = await editor.createVirtualBuffer({
1114
+ const newResult = await editor.createVirtualBuffer({
1114
1115
  name: `*NEW:${h.file}*`,
1115
1116
  mode: "normal",
1116
1117
  readOnly: true,
@@ -1119,6 +1120,7 @@ globalThis.review_drill_down = async () => {
1119
1120
  editingDisabled: true,
1120
1121
  hiddenFromTabs: true
1121
1122
  });
1123
+ const newBufferId = newResult.bufferId;
1122
1124
 
1123
1125
  // Convert hunks to composite buffer format (parse counts from git diff)
1124
1126
  const compositeHunks: TsCompositeHunk[] = fileHunks.map(fh => {
@@ -1130,10 +1132,10 @@ globalThis.review_drill_down = async () => {
1130
1132
  else if (line.startsWith(' ')) { oldCount++; newCount++; }
1131
1133
  }
1132
1134
  return {
1133
- old_start: fh.oldRange.start - 1, // Convert to 0-indexed
1134
- old_count: oldCount || 1,
1135
- new_start: fh.range.start - 1, // Convert to 0-indexed
1136
- new_count: newCount || 1
1135
+ oldStart: fh.oldRange.start - 1, // Convert to 0-indexed
1136
+ oldCount: oldCount || 1,
1137
+ newStart: fh.range.start - 1, // Convert to 0-indexed
1138
+ newCount: newCount || 1
1137
1139
  };
1138
1140
  });
1139
1141
 
@@ -1142,27 +1144,27 @@ globalThis.review_drill_down = async () => {
1142
1144
  name: `*Diff: ${h.file}*`,
1143
1145
  mode: "diff-view",
1144
1146
  layout: {
1145
- layout_type: "side-by-side",
1147
+ type: "side-by-side",
1146
1148
  ratios: [0.5, 0.5],
1147
- show_separator: true
1149
+ showSeparator: true
1148
1150
  },
1149
1151
  sources: [
1150
1152
  {
1151
- buffer_id: oldBufferId,
1153
+ bufferId: oldBufferId,
1152
1154
  label: "OLD (HEAD)",
1153
1155
  editable: false,
1154
1156
  style: {
1155
- remove_bg: [80, 40, 40],
1156
- gutter_style: "diff-markers"
1157
+ removeBg: [80, 40, 40],
1158
+ gutterStyle: "diff-markers"
1157
1159
  }
1158
1160
  },
1159
1161
  {
1160
- buffer_id: newBufferId,
1162
+ bufferId: newBufferId,
1161
1163
  label: "NEW (Working)",
1162
1164
  editable: false,
1163
1165
  style: {
1164
- add_bg: [40, 80, 40],
1165
- gutter_style: "diff-markers"
1166
+ addBg: [40, 80, 40],
1167
+ gutterStyle: "diff-markers"
1166
1168
  }
1167
1169
  }
1168
1170
  ],
@@ -1518,7 +1520,7 @@ globalThis.on_review_buffer_activated = (data: any) => {
1518
1520
  };
1519
1521
 
1520
1522
  globalThis.on_review_buffer_closed = (data: any) => {
1521
- if (data.buffer_id === state.reviewBufferId) stop_review_diff();
1523
+ if (data.buffer_id === state.reviewBufferId) globalThis.stop_review_diff();
1522
1524
  };
1523
1525
 
1524
1526
  // Side-by-side diff for current file using composite buffers
@@ -1663,7 +1665,7 @@ globalThis.side_by_side_diff_current_file = async () => {
1663
1665
  }));
1664
1666
 
1665
1667
  // Create source buffers (hidden from tabs, used by composite)
1666
- const oldBufferId = await editor.createVirtualBuffer({
1668
+ const oldResult = await editor.createVirtualBuffer({
1667
1669
  name: `*OLD:${filePath}*`,
1668
1670
  mode: "normal",
1669
1671
  readOnly: true,
@@ -1672,8 +1674,9 @@ globalThis.side_by_side_diff_current_file = async () => {
1672
1674
  editingDisabled: true,
1673
1675
  hiddenFromTabs: true
1674
1676
  });
1677
+ const oldBufferId = oldResult.bufferId;
1675
1678
 
1676
- const newBufferId = await editor.createVirtualBuffer({
1679
+ const newResult = await editor.createVirtualBuffer({
1677
1680
  name: `*NEW:${filePath}*`,
1678
1681
  mode: "normal",
1679
1682
  readOnly: true,
@@ -1682,13 +1685,14 @@ globalThis.side_by_side_diff_current_file = async () => {
1682
1685
  editingDisabled: true,
1683
1686
  hiddenFromTabs: true
1684
1687
  });
1688
+ const newBufferId = newResult.bufferId;
1685
1689
 
1686
1690
  // Convert hunks to composite buffer format
1687
1691
  const compositeHunks: TsCompositeHunk[] = fileHunks.map(h => ({
1688
- old_start: h.oldRange.start - 1, // Convert to 0-indexed
1689
- old_count: h.oldRange.end - h.oldRange.start + 1,
1690
- new_start: h.range.start - 1, // Convert to 0-indexed
1691
- new_count: h.range.end - h.range.start + 1
1692
+ oldStart: h.oldRange.start - 1, // Convert to 0-indexed
1693
+ oldCount: h.oldRange.end - h.oldRange.start + 1,
1694
+ newStart: h.range.start - 1, // Convert to 0-indexed
1695
+ newCount: h.range.end - h.range.start + 1
1692
1696
  }));
1693
1697
 
1694
1698
  // Create composite buffer with side-by-side layout
@@ -1696,27 +1700,27 @@ globalThis.side_by_side_diff_current_file = async () => {
1696
1700
  name: `*Diff: ${filePath}*`,
1697
1701
  mode: "diff-view",
1698
1702
  layout: {
1699
- layout_type: "side-by-side",
1703
+ type: "side-by-side",
1700
1704
  ratios: [0.5, 0.5],
1701
- show_separator: true
1705
+ showSeparator: true
1702
1706
  },
1703
1707
  sources: [
1704
1708
  {
1705
- buffer_id: oldBufferId,
1709
+ bufferId: oldBufferId,
1706
1710
  label: "OLD (HEAD)",
1707
1711
  editable: false,
1708
1712
  style: {
1709
- remove_bg: [80, 40, 40],
1710
- gutter_style: "diff-markers"
1713
+ removeBg: [80, 40, 40],
1714
+ gutterStyle: "diff-markers"
1711
1715
  }
1712
1716
  },
1713
1717
  {
1714
- buffer_id: newBufferId,
1718
+ bufferId: newBufferId,
1715
1719
  label: "NEW (Working)",
1716
1720
  editable: false,
1717
1721
  style: {
1718
- add_bg: [40, 80, 40],
1719
- gutter_style: "diff-markers"
1722
+ addBg: [40, 80, 40],
1723
+ gutterStyle: "diff-markers"
1720
1724
  }
1721
1725
  }
1722
1726
  ],
@@ -1746,10 +1750,10 @@ globalThis.side_by_side_diff_current_file = async () => {
1746
1750
  };
1747
1751
 
1748
1752
  // Register Modes and Commands
1749
- editor.registerCommand("%cmd.review_diff", "%cmd.review_diff_desc", "start_review_diff", "global");
1753
+ editor.registerCommand("%cmd.review_diff", "%cmd.review_diff_desc", "start_review_diff", null);
1750
1754
  editor.registerCommand("%cmd.stop_review_diff", "%cmd.stop_review_diff_desc", "stop_review_diff", "review-mode");
1751
1755
  editor.registerCommand("%cmd.refresh_review_diff", "%cmd.refresh_review_diff_desc", "review_refresh", "review-mode");
1752
- editor.registerCommand("%cmd.side_by_side_diff", "%cmd.side_by_side_diff_desc", "side_by_side_diff_current_file", "global");
1756
+ editor.registerCommand("%cmd.side_by_side_diff", "%cmd.side_by_side_diff_desc", "side_by_side_diff_current_file", null);
1753
1757
 
1754
1758
  // Review Comment Commands
1755
1759
  editor.registerCommand("%cmd.add_comment", "%cmd.add_comment_desc", "review_add_comment", "review-mode");
@@ -4,90 +4,90 @@
4
4
  "cmd.calculator_desc": "Open calculator",
5
5
  "status.loaded": "Calculator plugin loaded",
6
6
  "status.opened": "Calculator opened",
7
- "status.copied": "Copied: {value}"
7
+ "status.copied": "Copied: %{value}"
8
8
  },
9
9
  "cs": {
10
10
  "cmd.calculator": "Kalkulacka",
11
11
  "cmd.calculator_desc": "Otevrit kalkulacku",
12
12
  "status.loaded": "Plugin kalkulacky nacten",
13
13
  "status.opened": "Kalkulacka otevrena",
14
- "status.copied": "Zkopirovano: {value}"
14
+ "status.copied": "Zkopirovano: %{value}"
15
15
  },
16
16
  "de": {
17
17
  "cmd.calculator": "Taschenrechner",
18
18
  "cmd.calculator_desc": "Taschenrechner offnen",
19
19
  "status.loaded": "Taschenrechner-Plugin geladen",
20
20
  "status.opened": "Taschenrechner geoffnet",
21
- "status.copied": "Kopiert: {value}"
21
+ "status.copied": "Kopiert: %{value}"
22
22
  },
23
23
  "es": {
24
24
  "cmd.calculator": "Calculadora",
25
25
  "cmd.calculator_desc": "Abrir calculadora",
26
26
  "status.loaded": "Plugin de calculadora cargado",
27
27
  "status.opened": "Calculadora abierta",
28
- "status.copied": "Copiado: {value}"
28
+ "status.copied": "Copiado: %{value}"
29
29
  },
30
30
  "fr": {
31
31
  "cmd.calculator": "Calculatrice",
32
32
  "cmd.calculator_desc": "Ouvrir la calculatrice",
33
33
  "status.loaded": "Plugin calculatrice charge",
34
34
  "status.opened": "Calculatrice ouverte",
35
- "status.copied": "Copie: {value}"
35
+ "status.copied": "Copie: %{value}"
36
36
  },
37
37
  "it": {
38
38
  "cmd.calculator": "Calcolatrice",
39
39
  "cmd.calculator_desc": "Apri calcolatrice",
40
40
  "status.loaded": "Plugin calcolatrice caricato",
41
41
  "status.opened": "Calcolatrice aperta",
42
- "status.copied": "Copiato: {value}"
42
+ "status.copied": "Copiato: %{value}"
43
43
  },
44
44
  "ja": {
45
45
  "cmd.calculator": "電卓",
46
46
  "cmd.calculator_desc": "電卓を開く",
47
47
  "status.loaded": "電卓プラグインが読み込まれました",
48
48
  "status.opened": "電卓を開きました",
49
- "status.copied": "コピーしました: {value}"
49
+ "status.copied": "コピーしました: %{value}"
50
50
  },
51
51
  "ko": {
52
52
  "cmd.calculator": "계산기",
53
53
  "cmd.calculator_desc": "계산기 열기",
54
54
  "status.loaded": "계산기 플러그인이 로드되었습니다",
55
55
  "status.opened": "계산기가 열렸습니다",
56
- "status.copied": "복사됨: {value}"
56
+ "status.copied": "복사됨: %{value}"
57
57
  },
58
58
  "pt-BR": {
59
59
  "cmd.calculator": "Calculadora",
60
60
  "cmd.calculator_desc": "Abrir calculadora",
61
61
  "status.loaded": "Plugin de calculadora carregado",
62
62
  "status.opened": "Calculadora aberta",
63
- "status.copied": "Copiado: {value}"
63
+ "status.copied": "Copiado: %{value}"
64
64
  },
65
65
  "ru": {
66
66
  "cmd.calculator": "Калькулятор",
67
67
  "cmd.calculator_desc": "Открыть калькулятор",
68
68
  "status.loaded": "Плагин калькулятора загружен",
69
69
  "status.opened": "Калькулятор открыт",
70
- "status.copied": "Скопировано: {value}"
70
+ "status.copied": "Скопировано: %{value}"
71
71
  },
72
72
  "th": {
73
73
  "cmd.calculator": "เครื่องคิดเลข",
74
74
  "cmd.calculator_desc": "เปิดเครื่องคิดเลข",
75
75
  "status.loaded": "โหลดปลั๊กอินเครื่องคิดเลขแล้ว",
76
76
  "status.opened": "เปิดเครื่องคิดเลขแล้ว",
77
- "status.copied": "คัดลอกแล้ว: {value}"
77
+ "status.copied": "คัดลอกแล้ว: %{value}"
78
78
  },
79
79
  "uk": {
80
80
  "cmd.calculator": "Калькулятор",
81
81
  "cmd.calculator_desc": "Відкрити калькулятор",
82
82
  "status.loaded": "Плагін калькулятора завантажено",
83
83
  "status.opened": "Калькулятор відкрито",
84
- "status.copied": "Скопійовано: {value}"
84
+ "status.copied": "Скопійовано: %{value}"
85
85
  },
86
86
  "zh-CN": {
87
87
  "cmd.calculator": "计算器",
88
88
  "cmd.calculator_desc": "打开计算器",
89
89
  "status.loaded": "计算器插件已加载",
90
90
  "status.opened": "计算器已打开",
91
- "status.copied": "已复制: {value}"
91
+ "status.copied": "已复制: %{value}"
92
92
  }
93
93
  }
@@ -711,16 +711,16 @@ globalThis.calculator_open = async function (): Promise<void> {
711
711
 
712
712
  const entries = renderCalculator();
713
713
 
714
- state.bufferId = await editor.createVirtualBuffer({
714
+ const result = await editor.createVirtualBuffer({
715
715
  name: "*Calculator*",
716
716
  mode: "calculator",
717
- read_only: true,
717
+ readOnly: true,
718
718
  entries,
719
- show_line_numbers: false,
720
- show_cursors: false,
721
- editing_disabled: true,
719
+ showLineNumbers: false,
720
+ showCursors: false,
721
+ editingDisabled: true,
722
722
  });
723
-
723
+ state.bufferId = result.bufferId;
724
724
  state.splitId = editor.getActiveSplitId();
725
725
 
726
726
  editor.setStatus(editor.t("status.opened"));
@@ -11,10 +11,10 @@
11
11
  "status.unsupported_file_type": "Clangd: unsupported file type for switch header",
12
12
  "status.opened_corresponding_file": "Clangd: opened corresponding file",
13
13
  "status.no_matching_found": "Clangd: no matching header/source found",
14
- "status.switch_failed": "Clangd switch source/header failed: {error}",
14
+ "status.switch_failed": "Clangd switch source/header failed: %{error}",
15
15
  "status.opened_config": "Opened .clangd configuration",
16
16
  "status.config_not_found": "Could not find .clangd configuration in workspace",
17
- "status.file_status": "Clangd file status: {status}"
17
+ "status.file_status": "Clangd file status: %{status}"
18
18
  },
19
19
  "cs": {
20
20
  "cmd.project_setup": "Clangd: Nastaveni projektu",
@@ -28,10 +28,10 @@
28
28
  "status.unsupported_file_type": "Clangd: nepodporovany typ souboru pro prepnuti hlavicky",
29
29
  "status.opened_corresponding_file": "Clangd: odpovidajici soubor otevren",
30
30
  "status.no_matching_found": "Clangd: nenalezena odpovidajici hlavicka/zdroj",
31
- "status.switch_failed": "Clangd prepnuti zdroj/hlavicka selhalo: {error}",
31
+ "status.switch_failed": "Clangd prepnuti zdroj/hlavicka selhalo: %{error}",
32
32
  "status.opened_config": "Konfigurace .clangd otevrena",
33
33
  "status.config_not_found": "Nelze najit konfiguraci .clangd v pracovnim prostoru",
34
- "status.file_status": "Clangd stav souboru: {status}"
34
+ "status.file_status": "Clangd stav souboru: %{status}"
35
35
  },
36
36
  "de": {
37
37
  "cmd.project_setup": "Clangd: Projekteinrichtung",
@@ -45,10 +45,10 @@
45
45
  "status.unsupported_file_type": "Clangd: nicht unterstutzter Dateityp fur Header-Wechsel",
46
46
  "status.opened_corresponding_file": "Clangd: entsprechende Datei geoffnet",
47
47
  "status.no_matching_found": "Clangd: kein passendes Header/Quelle gefunden",
48
- "status.switch_failed": "Clangd Quelle/Header-Wechsel fehlgeschlagen: {error}",
48
+ "status.switch_failed": "Clangd Quelle/Header-Wechsel fehlgeschlagen: %{error}",
49
49
  "status.opened_config": ".clangd-Konfiguration geoffnet",
50
50
  "status.config_not_found": "Konnte .clangd-Konfiguration im Arbeitsbereich nicht finden",
51
- "status.file_status": "Clangd Dateistatus: {status}"
51
+ "status.file_status": "Clangd Dateistatus: %{status}"
52
52
  },
53
53
  "es": {
54
54
  "cmd.project_setup": "Clangd: Configuracion del Proyecto",
@@ -62,10 +62,10 @@
62
62
  "status.unsupported_file_type": "Clangd: tipo de archivo no soportado para alternar cabecera",
63
63
  "status.opened_corresponding_file": "Clangd: archivo correspondiente abierto",
64
64
  "status.no_matching_found": "Clangd: no se encontro cabecera/fuente coincidente",
65
- "status.switch_failed": "Clangd alternar fuente/cabecera fallo: {error}",
65
+ "status.switch_failed": "Clangd alternar fuente/cabecera fallo: %{error}",
66
66
  "status.opened_config": "Configuracion .clangd abierta",
67
67
  "status.config_not_found": "No se pudo encontrar configuracion .clangd en el espacio de trabajo",
68
- "status.file_status": "Estado del archivo Clangd: {status}"
68
+ "status.file_status": "Estado del archivo Clangd: %{status}"
69
69
  },
70
70
  "fr": {
71
71
  "cmd.project_setup": "Clangd: Configuration du Projet",
@@ -79,10 +79,10 @@
79
79
  "status.unsupported_file_type": "Clangd: type de fichier non supporte pour la bascule d'en-tete",
80
80
  "status.opened_corresponding_file": "Clangd: fichier correspondant ouvert",
81
81
  "status.no_matching_found": "Clangd: aucun en-tete/source correspondant trouve",
82
- "status.switch_failed": "Clangd bascule source/en-tete echouee: {error}",
82
+ "status.switch_failed": "Clangd bascule source/en-tete echouee: %{error}",
83
83
  "status.opened_config": "Configuration .clangd ouverte",
84
84
  "status.config_not_found": "Impossible de trouver la configuration .clangd dans l'espace de travail",
85
- "status.file_status": "Statut du fichier Clangd: {status}"
85
+ "status.file_status": "Statut du fichier Clangd: %{status}"
86
86
  },
87
87
  "it": {
88
88
  "cmd.project_setup": "Clangd: Configurazione progetto",
@@ -96,10 +96,10 @@
96
96
  "status.unsupported_file_type": "Clangd: tipo di file non supportato per il cambio header",
97
97
  "status.opened_corresponding_file": "Clangd: aperto file corrispondente",
98
98
  "status.no_matching_found": "Clangd: nessuna corrispondenza header/sorgente trovata",
99
- "status.switch_failed": "Cambio sorgente/header Clangd fallito: {error}",
99
+ "status.switch_failed": "Cambio sorgente/header Clangd fallito: %{error}",
100
100
  "status.opened_config": "Configurazione .clangd aperta",
101
101
  "status.config_not_found": "Impossibile trovare la configurazione .clangd nell'area di lavoro",
102
- "status.file_status": "Stato del file Clangd: {status}"
102
+ "status.file_status": "Stato del file Clangd: %{status}"
103
103
  },
104
104
  "ja": {
105
105
  "cmd.project_setup": "Clangd: プロジェクト設定",
@@ -113,10 +113,10 @@
113
113
  "status.unsupported_file_type": "Clangd: ヘッダー切り替えに対応していないファイル形式です",
114
114
  "status.opened_corresponding_file": "Clangd: 対応するファイルを開きました",
115
115
  "status.no_matching_found": "Clangd: 一致するヘッダー/ソースが見つかりません",
116
- "status.switch_failed": "Clangdソース/ヘッダー切り替えに失敗しました: {error}",
116
+ "status.switch_failed": "Clangdソース/ヘッダー切り替えに失敗しました: %{error}",
117
117
  "status.opened_config": ".clangd設定を開きました",
118
118
  "status.config_not_found": "ワークスペース内に.clangd設定が見つかりません",
119
- "status.file_status": "Clangdファイルステータス: {status}"
119
+ "status.file_status": "Clangdファイルステータス: %{status}"
120
120
  },
121
121
  "ko": {
122
122
  "cmd.project_setup": "Clangd: 프로젝트 설정",
@@ -130,10 +130,10 @@
130
130
  "status.unsupported_file_type": "Clangd: 헤더 전환에 지원되지 않는 파일 형식",
131
131
  "status.opened_corresponding_file": "Clangd: 해당 파일을 열었습니다",
132
132
  "status.no_matching_found": "Clangd: 일치하는 헤더/소스를 찾을 수 없습니다",
133
- "status.switch_failed": "Clangd 소스/헤더 전환 실패: {error}",
133
+ "status.switch_failed": "Clangd 소스/헤더 전환 실패: %{error}",
134
134
  "status.opened_config": ".clangd 설정을 열었습니다",
135
135
  "status.config_not_found": "작업 공간에서 .clangd 설정을 찾을 수 없습니다",
136
- "status.file_status": "Clangd 파일 상태: {status}"
136
+ "status.file_status": "Clangd 파일 상태: %{status}"
137
137
  },
138
138
  "pt-BR": {
139
139
  "cmd.project_setup": "Clangd: Configuracao do Projeto",
@@ -147,10 +147,10 @@
147
147
  "status.unsupported_file_type": "Clangd: tipo de arquivo nao suportado para alternar cabecalho",
148
148
  "status.opened_corresponding_file": "Clangd: arquivo correspondente aberto",
149
149
  "status.no_matching_found": "Clangd: nenhum cabecalho/fonte correspondente encontrado",
150
- "status.switch_failed": "Clangd alternar fonte/cabecalho falhou: {error}",
150
+ "status.switch_failed": "Clangd alternar fonte/cabecalho falhou: %{error}",
151
151
  "status.opened_config": "Configuracao .clangd aberta",
152
152
  "status.config_not_found": "Nao foi possivel encontrar configuracao .clangd no espaco de trabalho",
153
- "status.file_status": "Status do arquivo Clangd: {status}"
153
+ "status.file_status": "Status do arquivo Clangd: %{status}"
154
154
  },
155
155
  "ru": {
156
156
  "cmd.project_setup": "Clangd: Настройка проекта",
@@ -164,10 +164,10 @@
164
164
  "status.unsupported_file_type": "Clangd: неподдерживаемый тип файла для переключения заголовка",
165
165
  "status.opened_corresponding_file": "Clangd: соответствующий файл открыт",
166
166
  "status.no_matching_found": "Clangd: соответствующий заголовок/исходник не найден",
167
- "status.switch_failed": "Clangd переключение исходник/заголовок не удалось: {error}",
167
+ "status.switch_failed": "Clangd переключение исходник/заголовок не удалось: %{error}",
168
168
  "status.opened_config": "Конфигурация .clangd открыта",
169
169
  "status.config_not_found": "Не удалось найти конфигурацию .clangd в рабочем пространстве",
170
- "status.file_status": "Статус файла Clangd: {status}"
170
+ "status.file_status": "Статус файла Clangd: %{status}"
171
171
  },
172
172
  "th": {
173
173
  "cmd.project_setup": "Clangd: ตั้งค่าโปรเจกต์",
@@ -181,10 +181,10 @@
181
181
  "status.unsupported_file_type": "Clangd: ไม่รองรับประเภทไฟล์สำหรับสลับเฮดเดอร์",
182
182
  "status.opened_corresponding_file": "Clangd: เปิดไฟล์ที่เกี่ยวข้องแล้ว",
183
183
  "status.no_matching_found": "Clangd: ไม่พบเฮดเดอร์/ซอร์สที่ตรงกัน",
184
- "status.switch_failed": "Clangd สลับซอร์ส/เฮดเดอร์ล้มเหลว: {error}",
184
+ "status.switch_failed": "Clangd สลับซอร์ส/เฮดเดอร์ล้มเหลว: %{error}",
185
185
  "status.opened_config": "เปิดการตั้งค่า .clangd แล้ว",
186
186
  "status.config_not_found": "ไม่พบการตั้งค่า .clangd ในพื้นที่ทำงาน",
187
- "status.file_status": "สถานะไฟล์ Clangd: {status}"
187
+ "status.file_status": "สถานะไฟล์ Clangd: %{status}"
188
188
  },
189
189
  "uk": {
190
190
  "cmd.project_setup": "Clangd: Налаштування проекту",
@@ -198,10 +198,10 @@
198
198
  "status.unsupported_file_type": "Clangd: непідтримуваний тип файлу для перемикання заголовка",
199
199
  "status.opened_corresponding_file": "Clangd: відповідний файл відкрито",
200
200
  "status.no_matching_found": "Clangd: відповідний заголовок/вихідний файл не знайдено",
201
- "status.switch_failed": "Clangd перемикання вихідний/заголовний файл не вдалося: {error}",
201
+ "status.switch_failed": "Clangd перемикання вихідний/заголовний файл не вдалося: %{error}",
202
202
  "status.opened_config": "Конфігурацію .clangd відкрито",
203
203
  "status.config_not_found": "Не вдалося знайти конфігурацію .clangd у робочому просторі",
204
- "status.file_status": "Статус файлу Clangd: {status}"
204
+ "status.file_status": "Статус файлу Clangd: %{status}"
205
205
  },
206
206
  "zh-CN": {
207
207
  "cmd.project_setup": "Clangd: 项目设置",
@@ -215,9 +215,9 @@
215
215
  "status.unsupported_file_type": "Clangd: 不支持的文件类型,无法切换头文件",
216
216
  "status.opened_corresponding_file": "Clangd: 已打开对应文件",
217
217
  "status.no_matching_found": "Clangd: 未找到匹配的头文件/源文件",
218
- "status.switch_failed": "Clangd切换源文件/头文件失败: {error}",
218
+ "status.switch_failed": "Clangd切换源文件/头文件失败: %{error}",
219
219
  "status.opened_config": "已打开.clangd配置",
220
220
  "status.config_not_found": "在工作区中找不到.clangd配置",
221
- "status.file_status": "Clangd文件状态: {status}"
221
+ "status.file_status": "Clangd文件状态: %{status}"
222
222
  }
223
223
  }