1use settings::{LanguageSettingsContent, SettingsContent};
2use std::sync::Arc;
3use ui::{IntoElement, SharedString};
4
5use crate::{
6 LOCAL, SettingField, SettingItem, SettingsFieldMetadata, SettingsPage, SettingsPageItem,
7 SubPageLink, USER, sub_page_stack,
8};
9
10pub(crate) fn settings_data() -> Vec<SettingsPage> {
11 vec![
12 SettingsPage {
13 title: "General",
14 items: vec![
15 SettingsPageItem::SectionHeader("General Settings"),
16 SettingsPageItem::SettingItem(SettingItem {
17 title: "Confirm Quit",
18 description: "Whether to confirm before quitting Zed",
19 field: Box::new(SettingField {
20 pick: |settings_content| &settings_content.workspace.confirm_quit,
21 pick_mut: |settings_content| &mut settings_content.workspace.confirm_quit,
22 }),
23 metadata: None,
24 files: USER,
25 }),
26 SettingsPageItem::SettingItem(SettingItem {
27 title: "Restore On Startup",
28 description: "Whether to restore previous session when opening Zed",
29 field: Box::new(SettingField {
30 pick: |settings_content| &settings_content.workspace.restore_on_startup,
31 pick_mut: |settings_content| {
32 &mut settings_content.workspace.restore_on_startup
33 },
34 }),
35 metadata: None,
36 files: USER,
37 }),
38 SettingsPageItem::SettingItem(SettingItem {
39 title: "Restore File State",
40 description: "Whether to restore previous file state when reopening",
41 field: Box::new(SettingField {
42 pick: |settings_content| &settings_content.workspace.restore_on_file_reopen,
43 pick_mut: |settings_content| {
44 &mut settings_content.workspace.restore_on_file_reopen
45 },
46 }),
47 metadata: None,
48 files: USER,
49 }),
50 SettingsPageItem::SettingItem(SettingItem {
51 title: "Close on File Delete",
52 description: "Whether to automatically close files that have been deleted",
53 field: Box::new(SettingField {
54 pick: |settings_content| &settings_content.workspace.close_on_file_delete,
55 pick_mut: |settings_content| {
56 &mut settings_content.workspace.close_on_file_delete
57 },
58 }),
59 metadata: None,
60 files: USER,
61 }),
62 SettingsPageItem::SettingItem(SettingItem {
63 title: "When Closing With No Tabs",
64 description: "What to do when using the 'close active item' action with no tabs",
65 field: Box::new(SettingField {
66 pick: |settings_content| {
67 &settings_content.workspace.when_closing_with_no_tabs
68 },
69 pick_mut: |settings_content| {
70 &mut settings_content.workspace.when_closing_with_no_tabs
71 },
72 }),
73 metadata: None,
74 files: USER,
75 }),
76 SettingsPageItem::SettingItem(SettingItem {
77 title: "On Last Window Closed",
78 description: "What to do when the last window is closed",
79 field: Box::new(SettingField {
80 pick: |settings_content| &settings_content.workspace.on_last_window_closed,
81 pick_mut: |settings_content| {
82 &mut settings_content.workspace.on_last_window_closed
83 },
84 }),
85 metadata: None,
86 files: USER,
87 }),
88 SettingsPageItem::SettingItem(SettingItem {
89 title: "Use System Path Prompts",
90 description: "Whether to use native OS dialogs for 'Open' and 'Save As'",
91 field: Box::new(SettingField {
92 pick: |settings_content| {
93 &settings_content.workspace.use_system_path_prompts
94 },
95 pick_mut: |settings_content| {
96 &mut settings_content.workspace.use_system_path_prompts
97 },
98 }),
99 metadata: None,
100 files: USER,
101 }),
102 SettingsPageItem::SettingItem(SettingItem {
103 title: "Use System Prompts",
104 description: "Whether to use native OS dialogs for confirmations",
105 field: Box::new(SettingField {
106 pick: |settings_content| &settings_content.workspace.use_system_prompts,
107 pick_mut: |settings_content| {
108 &mut settings_content.workspace.use_system_prompts
109 },
110 }),
111 metadata: None,
112 files: USER,
113 }),
114 SettingsPageItem::SectionHeader("Scoped Settings"),
115 SettingsPageItem::SettingItem(SettingItem {
116 // todo(settings_ui): Implement another setting item type that just shows an edit in settings.json
117 files: USER,
118 title: "Preview Channel",
119 description: "Which settings should be activated only in Preview build of Zed",
120 field: Box::new(
121 SettingField {
122 pick: |settings_content| &settings_content.workspace.use_system_prompts,
123 pick_mut: |settings_content| {
124 &mut settings_content.workspace.use_system_prompts
125 },
126 }
127 .unimplemented(),
128 ),
129 metadata: None,
130 }),
131 SettingsPageItem::SettingItem(SettingItem {
132 files: USER,
133 title: "Settings Profiles",
134 description: "Any number of settings profiles that are temporarily applied on top of your existing user settings",
135 field: Box::new(
136 SettingField {
137 pick: |settings_content| &settings_content.workspace.use_system_prompts,
138 pick_mut: |settings_content| {
139 &mut settings_content.workspace.use_system_prompts
140 },
141 }
142 .unimplemented(),
143 ),
144 metadata: None,
145 }),
146 SettingsPageItem::SectionHeader("Privacy"),
147 SettingsPageItem::SettingItem(SettingItem {
148 title: "Telemetry Diagnostics",
149 description: "Send debug information like crash reports",
150 field: Box::new(SettingField {
151 pick: |settings_content| {
152 if let Some(telemetry) = &settings_content.telemetry {
153 &telemetry.diagnostics
154 } else {
155 &None
156 }
157 },
158 pick_mut: |settings_content| {
159 &mut settings_content
160 .telemetry
161 .get_or_insert_default()
162 .diagnostics
163 },
164 }),
165 metadata: None,
166 files: USER,
167 }),
168 SettingsPageItem::SettingItem(SettingItem {
169 title: "Telemetry Metrics",
170 description: "Send anonymized usage data like what languages you're using Zed with",
171 field: Box::new(SettingField {
172 pick: |settings_content| {
173 if let Some(telemetry) = &settings_content.telemetry {
174 &telemetry.metrics
175 } else {
176 &None
177 }
178 },
179 pick_mut: |settings_content| {
180 &mut settings_content.telemetry.get_or_insert_default().metrics
181 },
182 }),
183 metadata: None,
184 files: USER,
185 }),
186 ],
187 },
188 SettingsPage {
189 title: "Appearance & Behavior",
190 items: vec![
191 SettingsPageItem::SectionHeader("Theme"),
192 // todo(settings_ui): Figure out how we want to add these
193 SettingsPageItem::SettingItem(SettingItem {
194 files: USER,
195 title: "Theme Mode",
196 description: "How to select the theme",
197 field: Box::new(
198 SettingField {
199 pick: |settings_content| &settings_content.theme.theme,
200 pick_mut: |settings_content| &mut settings_content.theme.theme,
201 }
202 .unimplemented(),
203 ),
204 metadata: None,
205 }),
206 SettingsPageItem::SettingItem(SettingItem {
207 files: USER,
208 title: "Icon Theme",
209 // todo(settings_ui)
210 // This description is misleading because the icon theme is used in more places than the file explorer)
211 description: "Choose the icon theme for file explorer",
212 field: Box::new(
213 SettingField {
214 pick: |settings_content| &settings_content.theme.icon_theme,
215 pick_mut: |settings_content| &mut settings_content.theme.icon_theme,
216 }
217 .unimplemented(),
218 ),
219 metadata: None,
220 }),
221 SettingsPageItem::SectionHeader("Fonts"),
222 SettingsPageItem::SettingItem(SettingItem {
223 title: "Buffer Font Family",
224 description: "Font family for editor text",
225 field: Box::new(SettingField {
226 pick: |settings_content| &settings_content.theme.buffer_font_family,
227 pick_mut: |settings_content| &mut settings_content.theme.buffer_font_family,
228 }),
229 metadata: None,
230 files: USER,
231 }),
232 SettingsPageItem::SettingItem(SettingItem {
233 title: "Buffer Font Size",
234 description: "Font size for editor text",
235 field: Box::new(SettingField {
236 pick: |settings_content| &settings_content.theme.buffer_font_size,
237 pick_mut: |settings_content| &mut settings_content.theme.buffer_font_size,
238 }),
239 metadata: None,
240 files: USER,
241 }),
242 SettingsPageItem::SettingItem(SettingItem {
243 title: "Buffer Font Weight",
244 description: "Font weight for editor text (100-900)",
245 field: Box::new(SettingField {
246 pick: |settings_content| &settings_content.theme.buffer_font_weight,
247 pick_mut: |settings_content| &mut settings_content.theme.buffer_font_weight,
248 }),
249 metadata: None,
250 files: USER,
251 }),
252 // todo(settings_ui): This needs custom ui
253 SettingsPageItem::SettingItem(SettingItem {
254 files: USER,
255 title: "Buffer Line Height",
256 description: "Line height for editor text",
257 field: Box::new(
258 SettingField {
259 pick: |settings_content| &settings_content.theme.buffer_line_height,
260 pick_mut: |settings_content| {
261 &mut settings_content.theme.buffer_line_height
262 },
263 }
264 .unimplemented(),
265 ),
266 metadata: None,
267 }),
268 SettingsPageItem::SettingItem(SettingItem {
269 title: "UI Font Family",
270 description: "Font family for UI elements",
271 field: Box::new(SettingField {
272 pick: |settings_content| &settings_content.theme.ui_font_family,
273 pick_mut: |settings_content| &mut settings_content.theme.ui_font_family,
274 }),
275 metadata: None,
276 files: USER,
277 }),
278 SettingsPageItem::SettingItem(SettingItem {
279 title: "UI Font Size",
280 description: "Font size for UI elements",
281 field: Box::new(SettingField {
282 pick: |settings_content| &settings_content.theme.ui_font_size,
283 pick_mut: |settings_content| &mut settings_content.theme.ui_font_size,
284 }),
285 metadata: None,
286 files: USER,
287 }),
288 SettingsPageItem::SettingItem(SettingItem {
289 title: "UI Font Weight",
290 description: "Font weight for UI elements (100-900)",
291 field: Box::new(SettingField {
292 pick: |settings_content| &settings_content.theme.ui_font_weight,
293 pick_mut: |settings_content| &mut settings_content.theme.ui_font_weight,
294 }),
295 metadata: None,
296 files: USER,
297 }),
298 SettingsPageItem::SettingItem(SettingItem {
299 title: "Agent Panel UI Font Size",
300 description: "Font size for agent response text in the agent panel. Falls back to the regular UI font size.",
301 field: Box::new(SettingField {
302 pick: |settings_content| {
303 if settings_content.theme.agent_ui_font_size.is_some() {
304 &settings_content.theme.agent_ui_font_size
305 } else {
306 &settings_content.theme.ui_font_size
307 }
308 },
309 pick_mut: |settings_content| &mut settings_content.theme.agent_ui_font_size,
310 }),
311 metadata: None,
312 files: USER,
313 }),
314 SettingsPageItem::SettingItem(SettingItem {
315 title: "Agent Panel Buffer Font Size",
316 description: "Font size for user messages text in the agent panel",
317 field: Box::new(SettingField {
318 pick: |settings_content| &settings_content.theme.agent_buffer_font_size,
319 pick_mut: |settings_content| {
320 &mut settings_content.theme.agent_buffer_font_size
321 },
322 }),
323 metadata: None,
324 files: USER,
325 }),
326 SettingsPageItem::SectionHeader("Keymap"),
327 SettingsPageItem::SettingItem(SettingItem {
328 title: "Base Keymap",
329 description: "The name of a base set of key bindings to use",
330 field: Box::new(SettingField {
331 pick: |settings_content| &settings_content.base_keymap,
332 pick_mut: |settings_content| &mut settings_content.base_keymap,
333 }),
334 metadata: None,
335 files: USER,
336 }),
337 // todo(settings_ui): Vim/Helix Mode should be apart of one type because it's undefined
338 // behavior to have them both enabled at the same time
339 SettingsPageItem::SettingItem(SettingItem {
340 title: "Vim Mode",
341 description: "Whether to enable vim modes and key bindings",
342 field: Box::new(SettingField {
343 pick: |settings_content| &settings_content.vim_mode,
344 pick_mut: |settings_content| &mut settings_content.vim_mode,
345 }),
346 metadata: None,
347 files: USER,
348 }),
349 SettingsPageItem::SettingItem(SettingItem {
350 title: "Helix Mode",
351 description: "Whether to enable helix modes and key bindings",
352 field: Box::new(SettingField {
353 pick: |settings_content| &settings_content.helix_mode,
354 pick_mut: |settings_content| &mut settings_content.helix_mode,
355 }),
356 metadata: None,
357 files: USER,
358 }),
359 SettingsPageItem::SettingItem(SettingItem {
360 title: "Multi Cursor Modifier",
361 description: "Modifier key for adding multiple cursors",
362 field: Box::new(SettingField {
363 pick: |settings_content| &settings_content.editor.multi_cursor_modifier,
364 pick_mut: |settings_content| {
365 &mut settings_content.editor.multi_cursor_modifier
366 },
367 }),
368 metadata: None,
369 files: USER,
370 }),
371 SettingsPageItem::SectionHeader("Cursor"),
372 SettingsPageItem::SettingItem(SettingItem {
373 title: "Cursor Blink",
374 description: "Whether the cursor blinks in the editor",
375 field: Box::new(SettingField {
376 pick: |settings_content| &settings_content.editor.cursor_blink,
377 pick_mut: |settings_content| &mut settings_content.editor.cursor_blink,
378 }),
379 metadata: None,
380 files: USER,
381 }),
382 SettingsPageItem::SettingItem(SettingItem {
383 title: "Cursor Shape",
384 description: "Cursor shape for the editor",
385 field: Box::new(SettingField {
386 pick: |settings_content| &settings_content.editor.cursor_shape,
387 pick_mut: |settings_content| &mut settings_content.editor.cursor_shape,
388 }),
389 metadata: None,
390 files: USER,
391 }),
392 SettingsPageItem::SettingItem(SettingItem {
393 title: "Hide Mouse",
394 description: "When to hide the mouse cursor",
395 field: Box::new(SettingField {
396 pick: |settings_content| &settings_content.editor.hide_mouse,
397 pick_mut: |settings_content| &mut settings_content.editor.hide_mouse,
398 }),
399 metadata: None,
400 files: USER,
401 }),
402 SettingsPageItem::SectionHeader("Highlighting"),
403 SettingsPageItem::SettingItem(SettingItem {
404 title: "Unnecessary Code Fade",
405 description: "How much to fade out unused code (0.0 - 0.9)",
406 field: Box::new(SettingField {
407 pick: |settings_content| &settings_content.theme.unnecessary_code_fade,
408 pick_mut: |settings_content| {
409 &mut settings_content.theme.unnecessary_code_fade
410 },
411 }),
412 metadata: None,
413 files: USER,
414 }),
415 SettingsPageItem::SettingItem(SettingItem {
416 title: "Current Line Highlight",
417 description: "How to highlight the current line",
418 field: Box::new(SettingField {
419 pick: |settings_content| &settings_content.editor.current_line_highlight,
420 pick_mut: |settings_content| {
421 &mut settings_content.editor.current_line_highlight
422 },
423 }),
424 metadata: None,
425 files: USER,
426 }),
427 SettingsPageItem::SettingItem(SettingItem {
428 title: "Selection Highlight",
429 description: "Whether to highlight all occurrences of selected text",
430 field: Box::new(SettingField {
431 pick: |settings_content| &settings_content.editor.selection_highlight,
432 pick_mut: |settings_content| {
433 &mut settings_content.editor.selection_highlight
434 },
435 }),
436 metadata: None,
437 files: USER,
438 }),
439 SettingsPageItem::SettingItem(SettingItem {
440 title: "Rounded Selection",
441 description: "Whether the text selection should have rounded corners",
442 field: Box::new(SettingField {
443 pick: |settings_content| &settings_content.editor.rounded_selection,
444 pick_mut: |settings_content| &mut settings_content.editor.rounded_selection,
445 }),
446 metadata: None,
447 files: USER,
448 }),
449 SettingsPageItem::SectionHeader("Guides"),
450 SettingsPageItem::SettingItem(SettingItem {
451 title: "Show Wrap Guides",
452 description: "Whether to show wrap guides (vertical rulers)",
453 field: Box::new(SettingField {
454 pick: |settings_content| {
455 &settings_content
456 .project
457 .all_languages
458 .defaults
459 .show_wrap_guides
460 },
461 pick_mut: |settings_content| {
462 &mut settings_content
463 .project
464 .all_languages
465 .defaults
466 .show_wrap_guides
467 },
468 }),
469 metadata: None,
470 files: USER | LOCAL,
471 }),
472 // todo(settings_ui): This needs a custom component
473 SettingsPageItem::SettingItem(SettingItem {
474 title: "Wrap Guides",
475 description: "Character counts at which to show wrap guides",
476 field: Box::new(
477 SettingField {
478 pick: |settings_content| {
479 &settings_content.project.all_languages.defaults.wrap_guides
480 },
481 pick_mut: |settings_content| {
482 &mut settings_content.project.all_languages.defaults.wrap_guides
483 },
484 }
485 .unimplemented(),
486 ),
487 metadata: None,
488 files: USER | LOCAL,
489 }),
490 SettingsPageItem::SectionHeader("Whitespace"),
491 SettingsPageItem::SettingItem(SettingItem {
492 title: "Show Whitespace",
493 description: "Whether to show tabs and spaces",
494 field: Box::new(SettingField {
495 pick: |settings_content| {
496 &settings_content
497 .project
498 .all_languages
499 .defaults
500 .show_whitespaces
501 },
502 pick_mut: |settings_content| {
503 &mut settings_content
504 .project
505 .all_languages
506 .defaults
507 .show_whitespaces
508 },
509 }),
510 metadata: None,
511 files: USER | LOCAL,
512 }),
513 SettingsPageItem::SectionHeader("Layout"),
514 SettingsPageItem::SettingItem(SettingItem {
515 title: "Bottom Dock Layout",
516 description: "Layout mode for the bottom dock",
517 field: Box::new(SettingField {
518 pick: |settings_content| &settings_content.workspace.bottom_dock_layout,
519 pick_mut: |settings_content| {
520 &mut settings_content.workspace.bottom_dock_layout
521 },
522 }),
523 metadata: None,
524 files: USER,
525 }),
526 SettingsPageItem::SettingItem(SettingItem {
527 files: USER,
528 title: "Centered Layout Left Padding",
529 description: "Left padding for centered layout",
530 field: Box::new(SettingField {
531 pick: |settings_content| {
532 if let Some(centered_layout) =
533 &settings_content.workspace.centered_layout
534 {
535 ¢ered_layout.left_padding
536 } else {
537 &None
538 }
539 },
540 pick_mut: |settings_content| {
541 &mut settings_content
542 .workspace
543 .centered_layout
544 .get_or_insert_default()
545 .left_padding
546 },
547 }),
548 metadata: None,
549 }),
550 SettingsPageItem::SettingItem(SettingItem {
551 files: USER,
552 title: "Centered Layout Right Padding",
553 description: "Right padding for centered layout",
554 field: Box::new(SettingField {
555 pick: |settings_content| {
556 if let Some(centered_layout) =
557 &settings_content.workspace.centered_layout
558 {
559 ¢ered_layout.right_padding
560 } else {
561 &None
562 }
563 },
564 pick_mut: |settings_content| {
565 &mut settings_content
566 .workspace
567 .centered_layout
568 .get_or_insert_default()
569 .right_padding
570 },
571 }),
572 metadata: None,
573 }),
574 SettingsPageItem::SettingItem(SettingItem {
575 title: "Zoomed Padding",
576 description: "Whether to show padding for zoomed panels",
577 field: Box::new(SettingField {
578 pick: |settings_content| &settings_content.workspace.zoomed_padding,
579 pick_mut: |settings_content| &mut settings_content.workspace.zoomed_padding,
580 }),
581 metadata: None,
582 files: USER,
583 }),
584 SettingsPageItem::SettingItem(SettingItem {
585 title: "Use System Window Tabs",
586 description: "(macOS-only) Whether to allow windows to merge based on the user's tabbing preference",
587 field: Box::new(SettingField {
588 pick: |settings_content| &settings_content.workspace.use_system_window_tabs,
589 pick_mut: |settings_content| {
590 &mut settings_content.workspace.use_system_window_tabs
591 },
592 }),
593 metadata: None,
594 files: USER,
595 }),
596 SettingsPageItem::SectionHeader("Window"),
597 // todo(settings_ui): Should we filter by platform?
598 SettingsPageItem::SettingItem(SettingItem {
599 title: "Use System Window Tabs",
600 description: "(macOS only) Whether to allow windows to tab together",
601 field: Box::new(SettingField {
602 pick: |settings_content| &settings_content.workspace.use_system_window_tabs,
603 pick_mut: |settings_content| {
604 &mut settings_content.workspace.use_system_window_tabs
605 },
606 }),
607 metadata: None,
608 files: USER,
609 }),
610 ],
611 },
612 SettingsPage {
613 title: "Editor",
614 items: {
615 let mut items = vec![
616 SettingsPageItem::SectionHeader("Search"),
617 SettingsPageItem::SettingItem(SettingItem {
618 title: "Search Wrap",
619 description: "Whether the editor search results will loop",
620 field: Box::new(SettingField {
621 pick: |settings_content| &settings_content.editor.search_wrap,
622 pick_mut: |settings_content| &mut settings_content.editor.search_wrap,
623 }),
624 metadata: None,
625 files: USER,
626 }),
627 SettingsPageItem::SettingItem(SettingItem {
628 title: "Seed Search Query From Cursor",
629 description: "When to populate a new search's query based on the text under the cursor",
630 field: Box::new(SettingField {
631 pick: |settings_content| {
632 &settings_content.editor.seed_search_query_from_cursor
633 },
634 pick_mut: |settings_content| {
635 &mut settings_content.editor.seed_search_query_from_cursor
636 },
637 }),
638 metadata: None,
639 files: USER,
640 }),
641 SettingsPageItem::SettingItem(SettingItem {
642 title: "Use Smartcase Search",
643 description: "Whether to use smartcase (i.e., case-sensitive) search",
644 field: Box::new(SettingField {
645 pick: |settings_content| &settings_content.editor.use_smartcase_search,
646 pick_mut: |settings_content| {
647 &mut settings_content.editor.use_smartcase_search
648 },
649 }),
650 metadata: None,
651 files: USER,
652 }),
653 SettingsPageItem::SectionHeader("Editor Behavior"),
654 SettingsPageItem::SettingItem(SettingItem {
655 title: "Redact Private Values",
656 description: "Hide the values of variables in private files",
657 field: Box::new(SettingField {
658 pick: |settings_content| &settings_content.editor.redact_private_values,
659 pick_mut: |settings_content| {
660 &mut settings_content.editor.redact_private_values
661 },
662 }),
663 metadata: None,
664 files: USER,
665 }),
666 SettingsPageItem::SettingItem(SettingItem {
667 title: "Middle Click Paste",
668 description: "Whether to enable middle-click paste on Linux",
669 field: Box::new(SettingField {
670 pick: |settings_content| &settings_content.editor.middle_click_paste,
671 pick_mut: |settings_content| {
672 &mut settings_content.editor.middle_click_paste
673 },
674 }),
675 metadata: None,
676 files: USER,
677 }),
678 SettingsPageItem::SettingItem(SettingItem {
679 title: "Double Click In Multibuffer",
680 description: "What to do when multibuffer is double-clicked in some of its excerpts",
681 field: Box::new(SettingField {
682 pick: |settings_content| {
683 &settings_content.editor.double_click_in_multibuffer
684 },
685 pick_mut: |settings_content| {
686 &mut settings_content.editor.double_click_in_multibuffer
687 },
688 }),
689 metadata: None,
690 files: USER,
691 }),
692 SettingsPageItem::SettingItem(SettingItem {
693 title: "Go To Definition Fallback",
694 description: "Whether to follow-up empty go to definition responses from the language server",
695 field: Box::new(SettingField {
696 pick: |settings_content| {
697 &settings_content.editor.go_to_definition_fallback
698 },
699 pick_mut: |settings_content| {
700 &mut settings_content.editor.go_to_definition_fallback
701 },
702 }),
703 metadata: None,
704 files: USER,
705 }),
706 SettingsPageItem::SettingItem(SettingItem {
707 title: "Expand Excerpt Lines",
708 description: "How many lines to expand the multibuffer excerpts by default",
709 field: Box::new(SettingField {
710 pick: |settings_content| &settings_content.editor.expand_excerpt_lines,
711 pick_mut: |settings_content| {
712 &mut settings_content.editor.expand_excerpt_lines
713 },
714 }),
715 metadata: None,
716 files: USER,
717 }),
718 SettingsPageItem::SettingItem(SettingItem {
719 title: "Excerpt Context Lines",
720 description: "How many lines of context to provide in multibuffer excerpts by default",
721 field: Box::new(SettingField {
722 pick: |settings_content| &settings_content.editor.excerpt_context_lines,
723 pick_mut: |settings_content| {
724 &mut settings_content.editor.excerpt_context_lines
725 },
726 }),
727 metadata: None,
728 files: USER,
729 }),
730 SettingsPageItem::SettingItem(SettingItem {
731 title: "Minimum Contrast For Highlights",
732 description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds",
733 field: Box::new(SettingField {
734 pick: |settings_content| {
735 &settings_content.editor.minimum_contrast_for_highlights
736 },
737 pick_mut: |settings_content| {
738 &mut settings_content.editor.minimum_contrast_for_highlights
739 },
740 }),
741 metadata: None,
742 files: USER,
743 }),
744 SettingsPageItem::SectionHeader("Scrolling"),
745 SettingsPageItem::SettingItem(SettingItem {
746 title: "Scroll Beyond Last Line",
747 description: "Whether the editor will scroll beyond the last line",
748 field: Box::new(SettingField {
749 pick: |settings_content| {
750 &settings_content.editor.scroll_beyond_last_line
751 },
752 pick_mut: |settings_content| {
753 &mut settings_content.editor.scroll_beyond_last_line
754 },
755 }),
756 metadata: None,
757 files: USER,
758 }),
759 SettingsPageItem::SettingItem(SettingItem {
760 title: "Vertical Scroll Margin",
761 description: "The number of lines to keep above/below the cursor when auto-scrolling",
762 field: Box::new(SettingField {
763 pick: |settings_content| {
764 &settings_content.editor.vertical_scroll_margin
765 },
766 pick_mut: |settings_content| {
767 &mut settings_content.editor.vertical_scroll_margin
768 },
769 }),
770 metadata: None,
771 files: USER,
772 }),
773 SettingsPageItem::SettingItem(SettingItem {
774 title: "Horizontal Scroll Margin",
775 description: "The number of characters to keep on either side when scrolling with the mouse",
776 field: Box::new(SettingField {
777 pick: |settings_content| {
778 &settings_content.editor.horizontal_scroll_margin
779 },
780 pick_mut: |settings_content| {
781 &mut settings_content.editor.horizontal_scroll_margin
782 },
783 }),
784 metadata: None,
785 files: USER,
786 }),
787 SettingsPageItem::SettingItem(SettingItem {
788 title: "Scroll Sensitivity",
789 description: "Scroll sensitivity multiplier for both horizontal and vertical scrolling",
790 field: Box::new(SettingField {
791 pick: |settings_content| &settings_content.editor.scroll_sensitivity,
792 pick_mut: |settings_content| {
793 &mut settings_content.editor.scroll_sensitivity
794 },
795 }),
796 metadata: None,
797 files: USER,
798 }),
799 SettingsPageItem::SettingItem(SettingItem {
800 title: "Fast Scroll Sensitivity",
801 description: "Fast Scroll sensitivity multiplier for both horizontal and vertical scrolling",
802 field: Box::new(SettingField {
803 pick: |settings_content| {
804 &settings_content.editor.fast_scroll_sensitivity
805 },
806 pick_mut: |settings_content| {
807 &mut settings_content.editor.fast_scroll_sensitivity
808 },
809 }),
810 metadata: None,
811 files: USER,
812 }),
813 SettingsPageItem::SettingItem(SettingItem {
814 title: "Autoscroll On Clicks",
815 description: "Whether to scroll when clicking near the edge of the visible text area",
816 field: Box::new(SettingField {
817 pick: |settings_content| &settings_content.editor.autoscroll_on_clicks,
818 pick_mut: |settings_content| {
819 &mut settings_content.editor.autoscroll_on_clicks
820 },
821 }),
822 metadata: None,
823 files: USER,
824 }),
825 SettingsPageItem::SectionHeader("Signature Help"),
826 SettingsPageItem::SettingItem(SettingItem {
827 title: "Auto Signature Help",
828 description: "Whether to automatically show a signature help pop-up or not",
829 field: Box::new(SettingField {
830 pick: |settings_content| &settings_content.editor.auto_signature_help,
831 pick_mut: |settings_content| {
832 &mut settings_content.editor.auto_signature_help
833 },
834 }),
835 metadata: None,
836 files: USER,
837 }),
838 SettingsPageItem::SettingItem(SettingItem {
839 title: "Show Signature Help After Edits",
840 description: "Whether to show the signature help pop-up after completions or bracket pairs inserted",
841 field: Box::new(SettingField {
842 pick: |settings_content| {
843 &settings_content.editor.show_signature_help_after_edits
844 },
845 pick_mut: |settings_content| {
846 &mut settings_content.editor.show_signature_help_after_edits
847 },
848 }),
849 metadata: None,
850 files: USER,
851 }),
852 SettingsPageItem::SettingItem(SettingItem {
853 title: "Snippet Sort Order",
854 description: "Determines how snippets are sorted relative to other completion items",
855 field: Box::new(SettingField {
856 pick: |settings_content| &settings_content.editor.snippet_sort_order,
857 pick_mut: |settings_content| {
858 &mut settings_content.editor.snippet_sort_order
859 },
860 }),
861 metadata: None,
862 files: USER,
863 }),
864 SettingsPageItem::SectionHeader("Hover"),
865 SettingsPageItem::SettingItem(SettingItem {
866 title: "Hover Popover Enabled",
867 description: "Whether to show the informational hover box when moving the mouse over symbols in the editor",
868 field: Box::new(SettingField {
869 pick: |settings_content| &settings_content.editor.hover_popover_enabled,
870 pick_mut: |settings_content| {
871 &mut settings_content.editor.hover_popover_enabled
872 },
873 }),
874 metadata: None,
875 files: USER,
876 }),
877 // todo(settings ui): add units to this number input
878 SettingsPageItem::SettingItem(SettingItem {
879 title: "Hover Popover Delay",
880 description: "Time to wait in milliseconds before showing the informational hover box",
881 field: Box::new(SettingField {
882 pick: |settings_content| &settings_content.editor.hover_popover_delay,
883 pick_mut: |settings_content| {
884 &mut settings_content.editor.hover_popover_delay
885 },
886 }),
887 metadata: None,
888 files: USER,
889 }),
890 SettingsPageItem::SectionHeader("Code Actions"),
891 SettingsPageItem::SettingItem(SettingItem {
892 title: "Inline Code Actions",
893 description: "Whether to show code action button at start of buffer line",
894 field: Box::new(SettingField {
895 pick: |settings_content| &settings_content.editor.inline_code_actions,
896 pick_mut: |settings_content| {
897 &mut settings_content.editor.inline_code_actions
898 },
899 }),
900 metadata: None,
901 files: USER,
902 }),
903 SettingsPageItem::SectionHeader("Selection"),
904 SettingsPageItem::SettingItem(SettingItem {
905 title: "Drag And Drop Selection",
906 description: "Whether to enable drag and drop selection",
907 field: Box::new(SettingField {
908 pick: |settings_content| {
909 if let Some(drag_and_drop) =
910 &settings_content.editor.drag_and_drop_selection
911 {
912 &drag_and_drop.enabled
913 } else {
914 &None
915 }
916 },
917 pick_mut: |settings_content| {
918 &mut settings_content
919 .editor
920 .drag_and_drop_selection
921 .get_or_insert_default()
922 .enabled
923 },
924 }),
925 metadata: None,
926 files: USER,
927 }),
928 SettingsPageItem::SettingItem(SettingItem {
929 title: "Drag And Drop Selection Delay",
930 description: "Delay in milliseconds before drag and drop selection starts",
931 field: Box::new(SettingField {
932 pick: |settings_content| {
933 if let Some(drag_and_drop) =
934 &settings_content.editor.drag_and_drop_selection
935 {
936 &drag_and_drop.delay
937 } else {
938 &None
939 }
940 },
941 pick_mut: |settings_content| {
942 &mut settings_content
943 .editor
944 .drag_and_drop_selection
945 .get_or_insert_default()
946 .delay
947 },
948 }),
949 metadata: None,
950 files: USER,
951 }),
952 SettingsPageItem::SectionHeader("Gutter"),
953 SettingsPageItem::SettingItem(SettingItem {
954 title: "Show Line Numbers",
955 description: "Whether to show line numbers in the gutter",
956 field: Box::new(SettingField {
957 pick: |settings_content| {
958 if let Some(gutter) = &settings_content.editor.gutter {
959 &gutter.line_numbers
960 } else {
961 &None
962 }
963 },
964 pick_mut: |settings_content| {
965 &mut settings_content
966 .editor
967 .gutter
968 .get_or_insert_default()
969 .line_numbers
970 },
971 }),
972 metadata: None,
973 files: USER,
974 }),
975 SettingsPageItem::SettingItem(SettingItem {
976 title: "Relative Line Numbers",
977 description: "Whether the line numbers on editors gutter are relative or not",
978 field: Box::new(SettingField {
979 pick: |settings_content| &settings_content.editor.relative_line_numbers,
980 pick_mut: |settings_content| {
981 &mut settings_content.editor.relative_line_numbers
982 },
983 }),
984 metadata: None,
985 files: USER,
986 }),
987 SettingsPageItem::SettingItem(SettingItem {
988 title: "Show Runnables",
989 description: "Whether to show runnable buttons in the gutter",
990 field: Box::new(SettingField {
991 pick: |settings_content| {
992 if let Some(gutter) = &settings_content.editor.gutter {
993 &gutter.runnables
994 } else {
995 &None
996 }
997 },
998 pick_mut: |settings_content| {
999 &mut settings_content
1000 .editor
1001 .gutter
1002 .get_or_insert_default()
1003 .runnables
1004 },
1005 }),
1006 metadata: None,
1007 files: USER,
1008 }),
1009 SettingsPageItem::SettingItem(SettingItem {
1010 title: "Show Breakpoints",
1011 description: "Whether to show breakpoints in the gutter",
1012 field: Box::new(SettingField {
1013 pick: |settings_content| {
1014 if let Some(gutter) = &settings_content.editor.gutter {
1015 &gutter.breakpoints
1016 } else {
1017 &None
1018 }
1019 },
1020 pick_mut: |settings_content| {
1021 &mut settings_content
1022 .editor
1023 .gutter
1024 .get_or_insert_default()
1025 .breakpoints
1026 },
1027 }),
1028 metadata: None,
1029 files: USER,
1030 }),
1031 SettingsPageItem::SettingItem(SettingItem {
1032 title: "Show Folds",
1033 description: "Whether to show code folding controls in the gutter",
1034 field: Box::new(SettingField {
1035 pick: |settings_content| {
1036 if let Some(gutter) = &settings_content.editor.gutter {
1037 &gutter.folds
1038 } else {
1039 &None
1040 }
1041 },
1042 pick_mut: |settings_content| {
1043 &mut settings_content.editor.gutter.get_or_insert_default().folds
1044 },
1045 }),
1046 metadata: None,
1047 files: USER,
1048 }),
1049 SettingsPageItem::SettingItem(SettingItem {
1050 title: "Min Line Number Digits",
1051 description: "Minimum number of characters to reserve space for in the gutter",
1052 field: Box::new(SettingField {
1053 pick: |settings_content| {
1054 if let Some(gutter) = &settings_content.editor.gutter {
1055 &gutter.min_line_number_digits
1056 } else {
1057 &None
1058 }
1059 },
1060 pick_mut: |settings_content| {
1061 &mut settings_content
1062 .editor
1063 .gutter
1064 .get_or_insert_default()
1065 .min_line_number_digits
1066 },
1067 }),
1068 metadata: None,
1069 files: USER,
1070 }),
1071 SettingsPageItem::SectionHeader("Scrollbar"),
1072 SettingsPageItem::SettingItem(SettingItem {
1073 title: "Show",
1074 description: "When to show the scrollbar in the editor",
1075 field: Box::new(SettingField {
1076 pick: |settings_content| {
1077 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1078 &scrollbar.show
1079 } else {
1080 &None
1081 }
1082 },
1083 pick_mut: |settings_content| {
1084 &mut settings_content
1085 .editor
1086 .scrollbar
1087 .get_or_insert_default()
1088 .show
1089 },
1090 }),
1091 metadata: None,
1092 files: USER,
1093 }),
1094 SettingsPageItem::SettingItem(SettingItem {
1095 title: "Cursors",
1096 description: "Whether to show cursor positions in the scrollbar",
1097 field: Box::new(SettingField {
1098 pick: |settings_content| {
1099 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1100 &scrollbar.cursors
1101 } else {
1102 &None
1103 }
1104 },
1105 pick_mut: |settings_content| {
1106 &mut settings_content
1107 .editor
1108 .scrollbar
1109 .get_or_insert_default()
1110 .cursors
1111 },
1112 }),
1113 metadata: None,
1114 files: USER,
1115 }),
1116 SettingsPageItem::SettingItem(SettingItem {
1117 title: "Git Diff",
1118 description: "Whether to show git diff indicators in the scrollbar",
1119 field: Box::new(SettingField {
1120 pick: |settings_content| {
1121 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1122 &scrollbar.git_diff
1123 } else {
1124 &None
1125 }
1126 },
1127 pick_mut: |settings_content| {
1128 &mut settings_content
1129 .editor
1130 .scrollbar
1131 .get_or_insert_default()
1132 .git_diff
1133 },
1134 }),
1135 metadata: None,
1136 files: USER,
1137 }),
1138 SettingsPageItem::SettingItem(SettingItem {
1139 title: "Search Results",
1140 description: "Whether to show buffer search result indicators in the scrollbar",
1141 field: Box::new(SettingField {
1142 pick: |settings_content| {
1143 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1144 &scrollbar.search_results
1145 } else {
1146 &None
1147 }
1148 },
1149 pick_mut: |settings_content| {
1150 &mut settings_content
1151 .editor
1152 .scrollbar
1153 .get_or_insert_default()
1154 .search_results
1155 },
1156 }),
1157 metadata: None,
1158 files: USER,
1159 }),
1160 SettingsPageItem::SettingItem(SettingItem {
1161 title: "Selected Text",
1162 description: "Whether to show selected text occurrences in the scrollbar",
1163 field: Box::new(SettingField {
1164 pick: |settings_content| {
1165 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1166 &scrollbar.selected_text
1167 } else {
1168 &None
1169 }
1170 },
1171 pick_mut: |settings_content| {
1172 &mut settings_content
1173 .editor
1174 .scrollbar
1175 .get_or_insert_default()
1176 .selected_text
1177 },
1178 }),
1179 metadata: None,
1180 files: USER,
1181 }),
1182 SettingsPageItem::SettingItem(SettingItem {
1183 title: "Selected Symbol",
1184 description: "Whether to show selected symbol occurrences in the scrollbar",
1185 field: Box::new(SettingField {
1186 pick: |settings_content| {
1187 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1188 &scrollbar.selected_symbol
1189 } else {
1190 &None
1191 }
1192 },
1193 pick_mut: |settings_content| {
1194 &mut settings_content
1195 .editor
1196 .scrollbar
1197 .get_or_insert_default()
1198 .selected_symbol
1199 },
1200 }),
1201 metadata: None,
1202 files: USER,
1203 }),
1204 SettingsPageItem::SettingItem(SettingItem {
1205 title: "Diagnostics",
1206 description: "Which diagnostic indicators to show in the scrollbar",
1207 field: Box::new(SettingField {
1208 pick: |settings_content| {
1209 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1210 &scrollbar.diagnostics
1211 } else {
1212 &None
1213 }
1214 },
1215 pick_mut: |settings_content| {
1216 &mut settings_content
1217 .editor
1218 .scrollbar
1219 .get_or_insert_default()
1220 .diagnostics
1221 },
1222 }),
1223 metadata: None,
1224 files: USER,
1225 }),
1226 SettingsPageItem::SettingItem(SettingItem {
1227 title: "Horizontal Scrollbar",
1228 description: "When false, forcefully disables the horizontal scrollbar",
1229 field: Box::new(SettingField {
1230 pick: |settings_content| {
1231 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1232 if let Some(axes) = &scrollbar.axes {
1233 &axes.horizontal
1234 } else {
1235 &None
1236 }
1237 } else {
1238 &None
1239 }
1240 },
1241 pick_mut: |settings_content| {
1242 &mut settings_content
1243 .editor
1244 .scrollbar
1245 .get_or_insert_default()
1246 .axes
1247 .get_or_insert_default()
1248 .horizontal
1249 },
1250 }),
1251 metadata: None,
1252 files: USER,
1253 }),
1254 SettingsPageItem::SettingItem(SettingItem {
1255 title: "Vertical Scrollbar",
1256 description: "When false, forcefully disables the vertical scrollbar",
1257 field: Box::new(SettingField {
1258 pick: |settings_content| {
1259 if let Some(scrollbar) = &settings_content.editor.scrollbar {
1260 if let Some(axes) = &scrollbar.axes {
1261 &axes.vertical
1262 } else {
1263 &None
1264 }
1265 } else {
1266 &None
1267 }
1268 },
1269 pick_mut: |settings_content| {
1270 &mut settings_content
1271 .editor
1272 .scrollbar
1273 .get_or_insert_default()
1274 .axes
1275 .get_or_insert_default()
1276 .vertical
1277 },
1278 }),
1279 metadata: None,
1280 files: USER,
1281 }),
1282 SettingsPageItem::SectionHeader("Minimap"),
1283 SettingsPageItem::SettingItem(SettingItem {
1284 title: "Show",
1285 description: "When to show the minimap in the editor",
1286 field: Box::new(SettingField {
1287 pick: |settings_content| {
1288 if let Some(minimap) = &settings_content.editor.minimap {
1289 &minimap.show
1290 } else {
1291 &None
1292 }
1293 },
1294 pick_mut: |settings_content| {
1295 &mut settings_content.editor.minimap.get_or_insert_default().show
1296 },
1297 }),
1298 metadata: None,
1299 files: USER,
1300 }),
1301 SettingsPageItem::SettingItem(SettingItem {
1302 title: "Display In",
1303 description: "Where to show the minimap in the editor",
1304 field: Box::new(SettingField {
1305 pick: |settings_content| {
1306 if let Some(minimap) = &settings_content.editor.minimap {
1307 &minimap.display_in
1308 } else {
1309 &None
1310 }
1311 },
1312 pick_mut: |settings_content| {
1313 &mut settings_content
1314 .editor
1315 .minimap
1316 .get_or_insert_default()
1317 .display_in
1318 },
1319 }),
1320 metadata: None,
1321 files: USER,
1322 }),
1323 SettingsPageItem::SettingItem(SettingItem {
1324 title: "Thumb",
1325 description: "When to show the minimap thumb",
1326 field: Box::new(SettingField {
1327 pick: |settings_content| {
1328 if let Some(minimap) = &settings_content.editor.minimap {
1329 &minimap.thumb
1330 } else {
1331 &None
1332 }
1333 },
1334 pick_mut: |settings_content| {
1335 &mut settings_content
1336 .editor
1337 .minimap
1338 .get_or_insert_default()
1339 .thumb
1340 },
1341 }),
1342 metadata: None,
1343 files: USER,
1344 }),
1345 SettingsPageItem::SettingItem(SettingItem {
1346 title: "Thumb Border",
1347 description: "Border style for the minimap's scrollbar thumb",
1348 field: Box::new(SettingField {
1349 pick: |settings_content| {
1350 if let Some(minimap) = &settings_content.editor.minimap {
1351 &minimap.thumb_border
1352 } else {
1353 &None
1354 }
1355 },
1356 pick_mut: |settings_content| {
1357 &mut settings_content
1358 .editor
1359 .minimap
1360 .get_or_insert_default()
1361 .thumb_border
1362 },
1363 }),
1364 metadata: None,
1365 files: USER,
1366 }),
1367 SettingsPageItem::SettingItem(SettingItem {
1368 title: "Current Line Highlight",
1369 description: "How to highlight the current line in the minimap",
1370 field: Box::new(SettingField {
1371 pick: |settings_content| {
1372 if let Some(minimap) = &settings_content.editor.minimap
1373 && minimap.current_line_highlight.is_some()
1374 {
1375 &minimap.current_line_highlight
1376 } else {
1377 &settings_content.editor.current_line_highlight
1378 }
1379 },
1380 pick_mut: |settings_content| {
1381 &mut settings_content
1382 .editor
1383 .minimap
1384 .get_or_insert_default()
1385 .current_line_highlight
1386 },
1387 }),
1388 metadata: None,
1389 files: USER,
1390 }),
1391 SettingsPageItem::SettingItem(SettingItem {
1392 title: "Max Width Columns",
1393 description: "Maximum number of columns to display in the minimap",
1394 field: Box::new(SettingField {
1395 pick: |settings_content| {
1396 if let Some(minimap) = &settings_content.editor.minimap {
1397 &minimap.max_width_columns
1398 } else {
1399 &None
1400 }
1401 },
1402 pick_mut: |settings_content| {
1403 &mut settings_content
1404 .editor
1405 .minimap
1406 .get_or_insert_default()
1407 .max_width_columns
1408 },
1409 }),
1410 metadata: None,
1411 files: USER,
1412 }),
1413 SettingsPageItem::SectionHeader("Tabs"),
1414 SettingsPageItem::SettingItem(SettingItem {
1415 title: "Show Tab Bar",
1416 description: "Whether or not to show the tab bar in the editor",
1417 field: Box::new(SettingField {
1418 pick: |settings_content| {
1419 if let Some(tab_bar) = &settings_content.tab_bar {
1420 &tab_bar.show
1421 } else {
1422 &None
1423 }
1424 },
1425 pick_mut: |settings_content| {
1426 &mut settings_content.tab_bar.get_or_insert_default().show
1427 },
1428 }),
1429 metadata: None,
1430 files: USER,
1431 }),
1432 SettingsPageItem::SettingItem(SettingItem {
1433 title: "Show Git Status In Tabs",
1434 description: "Whether to show the Git file status on a tab item",
1435 field: Box::new(SettingField {
1436 pick: |settings_content| {
1437 if let Some(tabs) = &settings_content.tabs {
1438 &tabs.git_status
1439 } else {
1440 &None
1441 }
1442 },
1443 pick_mut: |settings_content| {
1444 &mut settings_content.tabs.get_or_insert_default().git_status
1445 },
1446 }),
1447 metadata: None,
1448 files: USER,
1449 }),
1450 SettingsPageItem::SettingItem(SettingItem {
1451 title: "Show File Icons In Tabs",
1452 description: "Whether to show the file icon for a tab",
1453 field: Box::new(SettingField {
1454 pick: |settings_content| {
1455 if let Some(tabs) = &settings_content.tabs {
1456 &tabs.file_icons
1457 } else {
1458 &None
1459 }
1460 },
1461 pick_mut: |settings_content| {
1462 &mut settings_content.tabs.get_or_insert_default().file_icons
1463 },
1464 }),
1465 metadata: None,
1466 files: USER,
1467 }),
1468 SettingsPageItem::SettingItem(SettingItem {
1469 title: "Tab Close Position",
1470 description: "Position of the close button in a tab",
1471 field: Box::new(SettingField {
1472 pick: |settings_content| {
1473 if let Some(tabs) = &settings_content.tabs {
1474 &tabs.close_position
1475 } else {
1476 &None
1477 }
1478 },
1479 pick_mut: |settings_content| {
1480 &mut settings_content.tabs.get_or_insert_default().close_position
1481 },
1482 }),
1483 metadata: None,
1484 files: USER,
1485 }),
1486 SettingsPageItem::SettingItem(SettingItem {
1487 files: USER,
1488 title: "Maximum Tabs",
1489 description: "Maximum open tabs in a pane. Will not close an unsaved tab",
1490 // todo(settings_ui): The default for this value is null and it's use in code
1491 // is complex, so I'm going to come back to this later
1492 field: Box::new(
1493 SettingField {
1494 pick: |settings_content| &settings_content.workspace.max_tabs,
1495 pick_mut: |settings_content| {
1496 &mut settings_content.workspace.max_tabs
1497 },
1498 }
1499 .unimplemented(),
1500 ),
1501 metadata: None,
1502 }),
1503 SettingsPageItem::SectionHeader("Toolbar"),
1504 SettingsPageItem::SettingItem(SettingItem {
1505 title: "Breadcrumbs",
1506 description: "Whether to show breadcrumbs",
1507 field: Box::new(SettingField {
1508 pick: |settings_content| {
1509 if let Some(toolbar) = &settings_content.editor.toolbar {
1510 &toolbar.breadcrumbs
1511 } else {
1512 &None
1513 }
1514 },
1515 pick_mut: |settings_content| {
1516 &mut settings_content
1517 .editor
1518 .toolbar
1519 .get_or_insert_default()
1520 .breadcrumbs
1521 },
1522 }),
1523 metadata: None,
1524 files: USER,
1525 }),
1526 SettingsPageItem::SettingItem(SettingItem {
1527 title: "Quick Actions",
1528 description: "Whether to show quick action buttons (e.g., search, selection, editor controls, etc.)",
1529 field: Box::new(SettingField {
1530 pick: |settings_content| {
1531 if let Some(toolbar) = &settings_content.editor.toolbar {
1532 &toolbar.quick_actions
1533 } else {
1534 &None
1535 }
1536 },
1537 pick_mut: |settings_content| {
1538 &mut settings_content
1539 .editor
1540 .toolbar
1541 .get_or_insert_default()
1542 .quick_actions
1543 },
1544 }),
1545 metadata: None,
1546 files: USER,
1547 }),
1548 SettingsPageItem::SettingItem(SettingItem {
1549 title: "Selections Menu",
1550 description: "Whether to show the selections menu in the editor toolbar",
1551 field: Box::new(SettingField {
1552 pick: |settings_content| {
1553 if let Some(toolbar) = &settings_content.editor.toolbar {
1554 &toolbar.selections_menu
1555 } else {
1556 &None
1557 }
1558 },
1559 pick_mut: |settings_content| {
1560 &mut settings_content
1561 .editor
1562 .toolbar
1563 .get_or_insert_default()
1564 .selections_menu
1565 },
1566 }),
1567 metadata: None,
1568 files: USER,
1569 }),
1570 SettingsPageItem::SettingItem(SettingItem {
1571 title: "Agent Review",
1572 description: "Whether to show agent review buttons in the editor toolbar",
1573 field: Box::new(SettingField {
1574 pick: |settings_content| {
1575 if let Some(toolbar) = &settings_content.editor.toolbar {
1576 &toolbar.agent_review
1577 } else {
1578 &None
1579 }
1580 },
1581 pick_mut: |settings_content| {
1582 &mut settings_content
1583 .editor
1584 .toolbar
1585 .get_or_insert_default()
1586 .agent_review
1587 },
1588 }),
1589 metadata: None,
1590 files: USER,
1591 }),
1592 SettingsPageItem::SettingItem(SettingItem {
1593 title: "Code Actions",
1594 description: "Whether to show code action buttons in the editor toolbar",
1595 field: Box::new(SettingField {
1596 pick: |settings_content| {
1597 if let Some(toolbar) = &settings_content.editor.toolbar {
1598 &toolbar.code_actions
1599 } else {
1600 &None
1601 }
1602 },
1603 pick_mut: |settings_content| {
1604 &mut settings_content
1605 .editor
1606 .toolbar
1607 .get_or_insert_default()
1608 .code_actions
1609 },
1610 }),
1611 metadata: None,
1612 files: USER,
1613 }),
1614 ];
1615 items.extend(language_settings_data());
1616 items
1617 },
1618 },
1619 SettingsPage {
1620 title: "Languages",
1621 items: vec![
1622 SettingsPageItem::SectionHeader(LANGUAGES_SECTION_HEADER),
1623 SettingsPageItem::SubPageLink(SubPageLink {
1624 title: "JSON",
1625 files: USER | LOCAL,
1626 render: Arc::new(|this, window, cx| {
1627 this.render_page_items(
1628 language_settings_data().iter().enumerate(),
1629 None,
1630 window,
1631 cx,
1632 )
1633 .into_any_element()
1634 }),
1635 }),
1636 SettingsPageItem::SubPageLink(SubPageLink {
1637 title: "JSONC",
1638 files: USER | LOCAL,
1639 render: Arc::new(|this, window, cx| {
1640 this.render_page_items(
1641 language_settings_data().iter().enumerate(),
1642 None,
1643 window,
1644 cx,
1645 )
1646 .into_any_element()
1647 }),
1648 }),
1649 SettingsPageItem::SubPageLink(SubPageLink {
1650 title: "Rust",
1651 files: USER | LOCAL,
1652 render: Arc::new(|this, window, cx| {
1653 this.render_page_items(
1654 language_settings_data().iter().enumerate(),
1655 None,
1656 window,
1657 cx,
1658 )
1659 .into_any_element()
1660 }),
1661 }),
1662 SettingsPageItem::SubPageLink(SubPageLink {
1663 title: "Python",
1664 files: USER | LOCAL,
1665 render: Arc::new(|this, window, cx| {
1666 this.render_page_items(
1667 language_settings_data().iter().enumerate(),
1668 None,
1669 window,
1670 cx,
1671 )
1672 .into_any_element()
1673 }),
1674 }),
1675 SettingsPageItem::SubPageLink(SubPageLink {
1676 title: "TSX",
1677 files: USER | LOCAL,
1678 render: Arc::new(|this, window, cx| {
1679 this.render_page_items(
1680 language_settings_data().iter().enumerate(),
1681 None,
1682 window,
1683 cx,
1684 )
1685 .into_any_element()
1686 }),
1687 }),
1688 ],
1689 },
1690 SettingsPage {
1691 title: "Workbench & Window",
1692 items: vec![
1693 SettingsPageItem::SectionHeader("Status Bar"),
1694 SettingsPageItem::SettingItem(SettingItem {
1695 title: "Project Panel Button",
1696 description: "Whether to show the project panel button in the status bar",
1697 field: Box::new(SettingField {
1698 pick: |settings_content| {
1699 if let Some(project_panel) = &settings_content.project_panel {
1700 &project_panel.button
1701 } else {
1702 &None
1703 }
1704 },
1705 pick_mut: |settings_content| {
1706 &mut settings_content
1707 .project_panel
1708 .get_or_insert_default()
1709 .button
1710 },
1711 }),
1712 metadata: None,
1713 files: USER,
1714 }),
1715 SettingsPageItem::SettingItem(SettingItem {
1716 title: "Active Language Button",
1717 description: "Whether to show the active language button in the status bar",
1718 field: Box::new(SettingField {
1719 pick: |settings_content| {
1720 if let Some(status_bar) = &settings_content.status_bar {
1721 &status_bar.active_language_button
1722 } else {
1723 &None
1724 }
1725 },
1726 pick_mut: |settings_content| {
1727 &mut settings_content
1728 .status_bar
1729 .get_or_insert_default()
1730 .active_language_button
1731 },
1732 }),
1733 metadata: None,
1734 files: USER,
1735 }),
1736 SettingsPageItem::SettingItem(SettingItem {
1737 title: "Cursor Position Button",
1738 description: "Whether to show the cursor position button in the status bar",
1739 field: Box::new(SettingField {
1740 pick: |settings_content| {
1741 if let Some(status_bar) = &settings_content.status_bar {
1742 &status_bar.cursor_position_button
1743 } else {
1744 &None
1745 }
1746 },
1747 pick_mut: |settings_content| {
1748 &mut settings_content
1749 .status_bar
1750 .get_or_insert_default()
1751 .cursor_position_button
1752 },
1753 }),
1754 metadata: None,
1755 files: USER,
1756 }),
1757 SettingsPageItem::SettingItem(SettingItem {
1758 title: "Terminal Button",
1759 description: "Whether to show the terminal button in the status bar",
1760 field: Box::new(SettingField {
1761 pick: |settings_content| {
1762 if let Some(terminal) = &settings_content.terminal {
1763 &terminal.button
1764 } else {
1765 &None
1766 }
1767 },
1768 pick_mut: |settings_content| {
1769 &mut settings_content.terminal.get_or_insert_default().button
1770 },
1771 }),
1772 metadata: None,
1773 files: USER,
1774 }),
1775 SettingsPageItem::SettingItem(SettingItem {
1776 title: "Diagnostics Button",
1777 description: "Whether to show the project diagnostics button in the status bar",
1778 field: Box::new(SettingField {
1779 pick: |settings_content| {
1780 if let Some(diagnostics) = &settings_content.diagnostics {
1781 &diagnostics.button
1782 } else {
1783 &None
1784 }
1785 },
1786 pick_mut: |settings_content| {
1787 &mut settings_content.diagnostics.get_or_insert_default().button
1788 },
1789 }),
1790 metadata: None,
1791 files: USER,
1792 }),
1793 SettingsPageItem::SettingItem(SettingItem {
1794 title: "Project Search Button",
1795 description: "Whether to show the project search button in the status bar",
1796 field: Box::new(SettingField {
1797 pick: |settings_content| {
1798 if let Some(search) = &settings_content.editor.search {
1799 &search.button
1800 } else {
1801 &None
1802 }
1803 },
1804 pick_mut: |settings_content| {
1805 &mut settings_content
1806 .editor
1807 .search
1808 .get_or_insert_default()
1809 .button
1810 },
1811 }),
1812 metadata: None,
1813 files: USER,
1814 }),
1815 SettingsPageItem::SettingItem(SettingItem {
1816 title: "Debugger Button",
1817 description: "Whether to show the debugger button in the status bar",
1818 field: Box::new(SettingField {
1819 pick: |settings_content| {
1820 if let Some(debugger) = &settings_content.debugger {
1821 &debugger.button
1822 } else {
1823 &None
1824 }
1825 },
1826 pick_mut: |settings_content| {
1827 &mut settings_content.debugger.get_or_insert_default().button
1828 },
1829 }),
1830 metadata: None,
1831 files: USER,
1832 }),
1833 SettingsPageItem::SectionHeader("Tab Bar"),
1834 SettingsPageItem::SettingItem(SettingItem {
1835 title: "Editor Tabs",
1836 description: "Whether or not to show the tab bar in the editor",
1837 field: Box::new(SettingField {
1838 pick: |settings_content| {
1839 if let Some(tab_bar) = &settings_content.tab_bar {
1840 &tab_bar.show
1841 } else {
1842 &None
1843 }
1844 },
1845 pick_mut: |settings_content| {
1846 &mut settings_content.tab_bar.get_or_insert_default().show
1847 },
1848 }),
1849 metadata: None,
1850 files: USER,
1851 }),
1852 SettingsPageItem::SettingItem(SettingItem {
1853 title: "Show Navigation History Buttons",
1854 description: "Whether or not to show the navigation history buttons in the tab bar",
1855 field: Box::new(SettingField {
1856 pick: |settings_content| {
1857 if let Some(tab_bar) = &settings_content.tab_bar {
1858 &tab_bar.show_nav_history_buttons
1859 } else {
1860 &None
1861 }
1862 },
1863 pick_mut: |settings_content| {
1864 &mut settings_content
1865 .tab_bar
1866 .get_or_insert_default()
1867 .show_nav_history_buttons
1868 },
1869 }),
1870 metadata: None,
1871 files: USER,
1872 }),
1873 SettingsPageItem::SectionHeader("Title Bar"),
1874 SettingsPageItem::SettingItem(SettingItem {
1875 title: "Show Branch Icon",
1876 description: "Whether to show the branch icon beside branch switcher in the titlebar",
1877 field: Box::new(SettingField {
1878 pick: |settings_content| {
1879 if let Some(title_bar) = &settings_content.title_bar {
1880 &title_bar.show_branch_icon
1881 } else {
1882 &None
1883 }
1884 },
1885 pick_mut: |settings_content| {
1886 &mut settings_content
1887 .title_bar
1888 .get_or_insert_default()
1889 .show_branch_icon
1890 },
1891 }),
1892 metadata: None,
1893 files: USER,
1894 }),
1895 SettingsPageItem::SettingItem(SettingItem {
1896 title: "Show Branch Name",
1897 description: "Whether to show the branch name button in the titlebar",
1898 field: Box::new(SettingField {
1899 pick: |settings_content| {
1900 if let Some(title_bar) = &settings_content.title_bar {
1901 &title_bar.show_branch_name
1902 } else {
1903 &None
1904 }
1905 },
1906 pick_mut: |settings_content| {
1907 &mut settings_content
1908 .title_bar
1909 .get_or_insert_default()
1910 .show_branch_name
1911 },
1912 }),
1913 metadata: None,
1914 files: USER,
1915 }),
1916 SettingsPageItem::SettingItem(SettingItem {
1917 title: "Show Project Items",
1918 description: "Whether to show the project host and name in the titlebar",
1919 field: Box::new(SettingField {
1920 pick: |settings_content| {
1921 if let Some(title_bar) = &settings_content.title_bar {
1922 &title_bar.show_project_items
1923 } else {
1924 &None
1925 }
1926 },
1927 pick_mut: |settings_content| {
1928 &mut settings_content
1929 .title_bar
1930 .get_or_insert_default()
1931 .show_project_items
1932 },
1933 }),
1934 metadata: None,
1935 files: USER,
1936 }),
1937 SettingsPageItem::SettingItem(SettingItem {
1938 title: "Show Onboarding Banner",
1939 description: "Whether to show banners announcing new features in the titlebar",
1940 field: Box::new(SettingField {
1941 pick: |settings_content| {
1942 if let Some(title_bar) = &settings_content.title_bar {
1943 &title_bar.show_onboarding_banner
1944 } else {
1945 &None
1946 }
1947 },
1948 pick_mut: |settings_content| {
1949 &mut settings_content
1950 .title_bar
1951 .get_or_insert_default()
1952 .show_onboarding_banner
1953 },
1954 }),
1955 metadata: None,
1956 files: USER,
1957 }),
1958 SettingsPageItem::SettingItem(SettingItem {
1959 title: "Show User Picture",
1960 description: "Whether to show user picture in the titlebar",
1961 field: Box::new(SettingField {
1962 pick: |settings_content| {
1963 if let Some(title_bar) = &settings_content.title_bar {
1964 &title_bar.show_user_picture
1965 } else {
1966 &None
1967 }
1968 },
1969 pick_mut: |settings_content| {
1970 &mut settings_content
1971 .title_bar
1972 .get_or_insert_default()
1973 .show_user_picture
1974 },
1975 }),
1976 metadata: None,
1977 files: USER,
1978 }),
1979 SettingsPageItem::SettingItem(SettingItem {
1980 title: "Show Sign In",
1981 description: "Whether to show the sign in button in the titlebar",
1982 field: Box::new(SettingField {
1983 pick: |settings_content| {
1984 if let Some(title_bar) = &settings_content.title_bar {
1985 &title_bar.show_sign_in
1986 } else {
1987 &None
1988 }
1989 },
1990 pick_mut: |settings_content| {
1991 &mut settings_content
1992 .title_bar
1993 .get_or_insert_default()
1994 .show_sign_in
1995 },
1996 }),
1997 metadata: None,
1998 files: USER,
1999 }),
2000 SettingsPageItem::SettingItem(SettingItem {
2001 title: "Show Menus",
2002 description: "Whether to show the menus in the titlebar",
2003 field: Box::new(SettingField {
2004 pick: |settings_content| {
2005 if let Some(title_bar) = &settings_content.title_bar {
2006 &title_bar.show_menus
2007 } else {
2008 &None
2009 }
2010 },
2011 pick_mut: |settings_content| {
2012 &mut settings_content
2013 .title_bar
2014 .get_or_insert_default()
2015 .show_menus
2016 },
2017 }),
2018 metadata: None,
2019 files: USER,
2020 }),
2021 SettingsPageItem::SectionHeader("Tab Settings"),
2022 SettingsPageItem::SettingItem(SettingItem {
2023 title: "Activate On Close",
2024 description: "What to do after closing the current tab",
2025 field: Box::new(SettingField {
2026 pick: |settings_content| {
2027 if let Some(tabs) = &settings_content.tabs {
2028 &tabs.activate_on_close
2029 } else {
2030 &None
2031 }
2032 },
2033 pick_mut: |settings_content| {
2034 &mut settings_content
2035 .tabs
2036 .get_or_insert_default()
2037 .activate_on_close
2038 },
2039 }),
2040 metadata: None,
2041 files: USER,
2042 }),
2043 SettingsPageItem::SettingItem(SettingItem {
2044 title: "Tab Show Diagnostics",
2045 description: "Which files containing diagnostic errors/warnings to mark in the tabs",
2046 field: Box::new(SettingField {
2047 pick: |settings_content| {
2048 if let Some(tabs) = &settings_content.tabs {
2049 &tabs.show_diagnostics
2050 } else {
2051 &None
2052 }
2053 },
2054 pick_mut: |settings_content| {
2055 &mut settings_content
2056 .tabs
2057 .get_or_insert_default()
2058 .show_diagnostics
2059 },
2060 }),
2061 metadata: None,
2062 files: USER,
2063 }),
2064 SettingsPageItem::SettingItem(SettingItem {
2065 title: "Show Close Button",
2066 description: "Controls the appearance behavior of the tab's close button",
2067 field: Box::new(SettingField {
2068 pick: |settings_content| {
2069 if let Some(tabs) = &settings_content.tabs {
2070 &tabs.show_close_button
2071 } else {
2072 &None
2073 }
2074 },
2075 pick_mut: |settings_content| {
2076 &mut settings_content
2077 .tabs
2078 .get_or_insert_default()
2079 .show_close_button
2080 },
2081 }),
2082 metadata: None,
2083 files: USER,
2084 }),
2085 SettingsPageItem::SectionHeader("Preview Tabs"),
2086 SettingsPageItem::SettingItem(SettingItem {
2087 title: "Preview Tabs Enabled",
2088 description: "Whether to show opened editors as preview tabs",
2089 field: Box::new(SettingField {
2090 pick: |settings_content| {
2091 if let Some(preview_tabs) = &settings_content.preview_tabs {
2092 &preview_tabs.enabled
2093 } else {
2094 &None
2095 }
2096 },
2097 pick_mut: |settings_content| {
2098 &mut settings_content
2099 .preview_tabs
2100 .get_or_insert_default()
2101 .enabled
2102 },
2103 }),
2104 metadata: None,
2105 files: USER,
2106 }),
2107 SettingsPageItem::SettingItem(SettingItem {
2108 title: "Enable Preview From File Finder",
2109 description: "Whether to open tabs in preview mode when selected from the file finder",
2110 field: Box::new(SettingField {
2111 pick: |settings_content| {
2112 if let Some(preview_tabs) = &settings_content.preview_tabs {
2113 &preview_tabs.enable_preview_from_file_finder
2114 } else {
2115 &None
2116 }
2117 },
2118 pick_mut: |settings_content| {
2119 &mut settings_content
2120 .preview_tabs
2121 .get_or_insert_default()
2122 .enable_preview_from_file_finder
2123 },
2124 }),
2125 metadata: None,
2126 files: USER,
2127 }),
2128 SettingsPageItem::SettingItem(SettingItem {
2129 title: "Enable Preview From Code Navigation",
2130 description: "Whether a preview tab gets replaced when code navigation is used to navigate away from the tab",
2131 field: Box::new(SettingField {
2132 pick: |settings_content| {
2133 if let Some(preview_tabs) = &settings_content.preview_tabs {
2134 &preview_tabs.enable_preview_from_code_navigation
2135 } else {
2136 &None
2137 }
2138 },
2139 pick_mut: |settings_content| {
2140 &mut settings_content
2141 .preview_tabs
2142 .get_or_insert_default()
2143 .enable_preview_from_code_navigation
2144 },
2145 }),
2146 metadata: None,
2147 files: USER,
2148 }),
2149 SettingsPageItem::SectionHeader("Search Settings"),
2150 SettingsPageItem::SettingItem(SettingItem {
2151 title: "Whole Word",
2152 description: "Whether to search for whole words by default",
2153 field: Box::new(SettingField {
2154 pick: |settings_content| {
2155 if let Some(search) = &settings_content.editor.search {
2156 &search.whole_word
2157 } else {
2158 &None
2159 }
2160 },
2161 pick_mut: |settings_content| {
2162 &mut settings_content
2163 .editor
2164 .search
2165 .get_or_insert_default()
2166 .whole_word
2167 },
2168 }),
2169 metadata: None,
2170 files: USER,
2171 }),
2172 SettingsPageItem::SettingItem(SettingItem {
2173 title: "Case Sensitive",
2174 description: "Whether to search case-sensitively by default",
2175 field: Box::new(SettingField {
2176 pick: |settings_content| {
2177 if let Some(search) = &settings_content.editor.search {
2178 &search.case_sensitive
2179 } else {
2180 &None
2181 }
2182 },
2183 pick_mut: |settings_content| {
2184 &mut settings_content
2185 .editor
2186 .search
2187 .get_or_insert_default()
2188 .case_sensitive
2189 },
2190 }),
2191 metadata: None,
2192 files: USER,
2193 }),
2194 SettingsPageItem::SettingItem(SettingItem {
2195 title: "Include Ignored",
2196 description: "Whether to include ignored files in search results by default",
2197 field: Box::new(SettingField {
2198 pick: |settings_content| {
2199 if let Some(search) = &settings_content.editor.search {
2200 &search.include_ignored
2201 } else {
2202 &None
2203 }
2204 },
2205 pick_mut: |settings_content| {
2206 &mut settings_content
2207 .editor
2208 .search
2209 .get_or_insert_default()
2210 .include_ignored
2211 },
2212 }),
2213 metadata: None,
2214 files: USER,
2215 }),
2216 SettingsPageItem::SettingItem(SettingItem {
2217 title: "Regex",
2218 description: "Whether to use regex search by default",
2219 field: Box::new(SettingField {
2220 pick: |settings_content| {
2221 if let Some(search) = &settings_content.editor.search {
2222 &search.regex
2223 } else {
2224 &None
2225 }
2226 },
2227 pick_mut: |settings_content| {
2228 &mut settings_content.editor.search.get_or_insert_default().regex
2229 },
2230 }),
2231 metadata: None,
2232 files: USER,
2233 }),
2234 SettingsPageItem::SectionHeader("File Finder"),
2235 SettingsPageItem::SettingItem(SettingItem {
2236 title: "File Icons",
2237 description: "Whether to show file icons in the file finder",
2238 field: Box::new(SettingField {
2239 pick: |settings_content| {
2240 if let Some(file_finder) = &settings_content.file_finder {
2241 &file_finder.file_icons
2242 } else {
2243 &None
2244 }
2245 },
2246 pick_mut: |settings_content| {
2247 &mut settings_content
2248 .file_finder
2249 .get_or_insert_default()
2250 .file_icons
2251 },
2252 }),
2253 metadata: None,
2254 files: USER,
2255 }),
2256 SettingsPageItem::SettingItem(SettingItem {
2257 title: "Modal Max Width",
2258 description: "Determines how much space the file finder can take up in relation to the available window width",
2259 field: Box::new(SettingField {
2260 pick: |settings_content| {
2261 if let Some(file_finder) = &settings_content.file_finder {
2262 &file_finder.modal_max_width
2263 } else {
2264 &None
2265 }
2266 },
2267 pick_mut: |settings_content| {
2268 &mut settings_content
2269 .file_finder
2270 .get_or_insert_default()
2271 .modal_max_width
2272 },
2273 }),
2274 metadata: None,
2275 files: USER,
2276 }),
2277 SettingsPageItem::SettingItem(SettingItem {
2278 title: "Skip Focus For Active In Search",
2279 description: "Whether the file finder should skip focus for the active file in search results",
2280 field: Box::new(SettingField {
2281 pick: |settings_content| {
2282 if let Some(file_finder) = &settings_content.file_finder {
2283 &file_finder.skip_focus_for_active_in_search
2284 } else {
2285 &None
2286 }
2287 },
2288 pick_mut: |settings_content| {
2289 &mut settings_content
2290 .file_finder
2291 .get_or_insert_default()
2292 .skip_focus_for_active_in_search
2293 },
2294 }),
2295 metadata: None,
2296 files: USER,
2297 }),
2298 SettingsPageItem::SettingItem(SettingItem {
2299 title: "Git Status",
2300 description: "Whether to show the git status in the file finder",
2301 field: Box::new(SettingField {
2302 pick: |settings_content| {
2303 if let Some(file_finder) = &settings_content.file_finder {
2304 &file_finder.git_status
2305 } else {
2306 &None
2307 }
2308 },
2309 pick_mut: |settings_content| {
2310 &mut settings_content
2311 .file_finder
2312 .get_or_insert_default()
2313 .git_status
2314 },
2315 }),
2316 metadata: None,
2317 files: USER,
2318 }),
2319 // todo: null by default
2320 SettingsPageItem::SettingItem(SettingItem {
2321 title: "Include Ignored",
2322 description: "Whether to use gitignored files when searching",
2323 field: Box::new(
2324 SettingField {
2325 pick: |settings_content| {
2326 if let Some(file_finder) = &settings_content.file_finder {
2327 &file_finder.include_ignored
2328 } else {
2329 &None
2330 }
2331 },
2332 pick_mut: |settings_content| {
2333 &mut settings_content
2334 .file_finder
2335 .get_or_insert_default()
2336 .include_ignored
2337 },
2338 }
2339 .unimplemented(),
2340 ),
2341 metadata: None,
2342 files: USER,
2343 }),
2344 ],
2345 },
2346 SettingsPage {
2347 title: "Panels",
2348 items: vec![
2349 SettingsPageItem::SectionHeader("Project Panel"),
2350 SettingsPageItem::SettingItem(SettingItem {
2351 title: "Project Panel Dock",
2352 description: "Where to dock the project panel",
2353 field: Box::new(SettingField {
2354 pick: |settings_content| {
2355 if let Some(project_panel) = &settings_content.project_panel {
2356 &project_panel.dock
2357 } else {
2358 &None
2359 }
2360 },
2361 pick_mut: |settings_content| {
2362 &mut settings_content.project_panel.get_or_insert_default().dock
2363 },
2364 }),
2365 metadata: None,
2366 files: USER,
2367 }),
2368 SettingsPageItem::SettingItem(SettingItem {
2369 title: "Project Panel Default Width",
2370 description: "Default width of the project panel in pixels",
2371 field: Box::new(SettingField {
2372 pick: |settings_content| {
2373 if let Some(project_panel) = &settings_content.project_panel {
2374 &project_panel.default_width
2375 } else {
2376 &None
2377 }
2378 },
2379 pick_mut: |settings_content| {
2380 &mut settings_content
2381 .project_panel
2382 .get_or_insert_default()
2383 .default_width
2384 },
2385 }),
2386 metadata: None,
2387 files: USER,
2388 }),
2389 SettingsPageItem::SettingItem(SettingItem {
2390 title: "Hide .gitignore",
2391 description: "Whether to hide the gitignore entries in the project panel",
2392 field: Box::new(SettingField {
2393 pick: |settings_content| {
2394 if let Some(project_panel) = &settings_content.project_panel {
2395 &project_panel.hide_gitignore
2396 } else {
2397 &None
2398 }
2399 },
2400 pick_mut: |settings_content| {
2401 &mut settings_content
2402 .project_panel
2403 .get_or_insert_default()
2404 .hide_gitignore
2405 },
2406 }),
2407 metadata: None,
2408 files: USER,
2409 }),
2410 SettingsPageItem::SettingItem(SettingItem {
2411 title: "Entry Spacing",
2412 description: "Spacing between worktree entries in the project panel",
2413 field: Box::new(SettingField {
2414 pick: |settings_content| {
2415 if let Some(project_panel) = &settings_content.project_panel {
2416 &project_panel.entry_spacing
2417 } else {
2418 &None
2419 }
2420 },
2421 pick_mut: |settings_content| {
2422 &mut settings_content
2423 .project_panel
2424 .get_or_insert_default()
2425 .entry_spacing
2426 },
2427 }),
2428 metadata: None,
2429 files: USER,
2430 }),
2431 SettingsPageItem::SettingItem(SettingItem {
2432 title: "File Icons",
2433 description: "Whether to show folder icons or chevrons for directories in the project panel",
2434 field: Box::new(SettingField {
2435 pick: |settings_content| {
2436 if let Some(project_panel) = &settings_content.project_panel {
2437 &project_panel.file_icons
2438 } else {
2439 &None
2440 }
2441 },
2442 pick_mut: |settings_content| {
2443 &mut settings_content
2444 .project_panel
2445 .get_or_insert_default()
2446 .file_icons
2447 },
2448 }),
2449 metadata: None,
2450 files: USER,
2451 }),
2452 SettingsPageItem::SettingItem(SettingItem {
2453 title: "Folder Icons",
2454 description: "Whether to show folder icons or chevrons for directories in the project panel",
2455 field: Box::new(SettingField {
2456 pick: |settings_content| {
2457 if let Some(project_panel) = &settings_content.project_panel {
2458 &project_panel.folder_icons
2459 } else {
2460 &None
2461 }
2462 },
2463 pick_mut: |settings_content| {
2464 &mut settings_content
2465 .project_panel
2466 .get_or_insert_default()
2467 .folder_icons
2468 },
2469 }),
2470 metadata: None,
2471 files: USER,
2472 }),
2473 SettingsPageItem::SettingItem(SettingItem {
2474 title: "Git Status",
2475 description: "Whether to show the git status in the project panel",
2476 field: Box::new(SettingField {
2477 pick: |settings_content| {
2478 if let Some(project_panel) = &settings_content.project_panel {
2479 &project_panel.git_status
2480 } else {
2481 &None
2482 }
2483 },
2484 pick_mut: |settings_content| {
2485 &mut settings_content
2486 .project_panel
2487 .get_or_insert_default()
2488 .git_status
2489 },
2490 }),
2491 metadata: None,
2492 files: USER,
2493 }),
2494 SettingsPageItem::SettingItem(SettingItem {
2495 title: "Indent Size",
2496 description: "Amount of indentation for nested items",
2497 field: Box::new(SettingField {
2498 pick: |settings_content| {
2499 if let Some(project_panel) = &settings_content.project_panel {
2500 &project_panel.indent_size
2501 } else {
2502 &None
2503 }
2504 },
2505 pick_mut: |settings_content| {
2506 &mut settings_content
2507 .project_panel
2508 .get_or_insert_default()
2509 .indent_size
2510 },
2511 }),
2512 metadata: None,
2513 files: USER,
2514 }),
2515 SettingsPageItem::SettingItem(SettingItem {
2516 title: "Auto Reveal Entries",
2517 description: "Whether to reveal it in the project panel automatically when a corresponding project entry becomes active",
2518 field: Box::new(SettingField {
2519 pick: |settings_content| {
2520 if let Some(project_panel) = &settings_content.project_panel {
2521 &project_panel.auto_reveal_entries
2522 } else {
2523 &None
2524 }
2525 },
2526 pick_mut: |settings_content| {
2527 &mut settings_content
2528 .project_panel
2529 .get_or_insert_default()
2530 .auto_reveal_entries
2531 },
2532 }),
2533 metadata: None,
2534 files: USER,
2535 }),
2536 SettingsPageItem::SettingItem(SettingItem {
2537 title: "Starts Open",
2538 description: "Whether the project panel should open on startup",
2539 field: Box::new(SettingField {
2540 pick: |settings_content| {
2541 if let Some(project_panel) = &settings_content.project_panel {
2542 &project_panel.starts_open
2543 } else {
2544 &None
2545 }
2546 },
2547 pick_mut: |settings_content| {
2548 &mut settings_content
2549 .project_panel
2550 .get_or_insert_default()
2551 .starts_open
2552 },
2553 }),
2554 metadata: None,
2555 files: USER,
2556 }),
2557 SettingsPageItem::SettingItem(SettingItem {
2558 title: "Auto Fold Directories",
2559 description: "Whether to fold directories automatically and show compact folders when a directory has only one subdirectory inside",
2560 field: Box::new(SettingField {
2561 pick: |settings_content| {
2562 if let Some(project_panel) = &settings_content.project_panel {
2563 &project_panel.auto_fold_dirs
2564 } else {
2565 &None
2566 }
2567 },
2568 pick_mut: |settings_content| {
2569 &mut settings_content
2570 .project_panel
2571 .get_or_insert_default()
2572 .auto_fold_dirs
2573 },
2574 }),
2575 metadata: None,
2576 files: USER,
2577 }),
2578 SettingsPageItem::SettingItem(SettingItem {
2579 title: "Scrollbar Show",
2580 description: "When to show the scrollbar in the project panel",
2581 field: Box::new(SettingField {
2582 pick: |settings_content| {
2583 if let Some(project_panel) = &settings_content.project_panel
2584 && let Some(scrollbar) = &project_panel.scrollbar
2585 && scrollbar.show.is_some()
2586 {
2587 &scrollbar.show
2588 } else if let Some(scrollbar) = &settings_content.editor.scrollbar {
2589 &scrollbar.show
2590 } else {
2591 &None
2592 }
2593 },
2594 pick_mut: |settings_content| {
2595 &mut settings_content
2596 .project_panel
2597 .get_or_insert_default()
2598 .scrollbar
2599 .get_or_insert_default()
2600 .show
2601 },
2602 }),
2603 metadata: None,
2604 files: USER,
2605 }),
2606 SettingsPageItem::SettingItem(SettingItem {
2607 title: "Show Diagnostics",
2608 description: "Which files containing diagnostic errors/warnings to mark in the project panel",
2609 field: Box::new(SettingField {
2610 pick: |settings_content| {
2611 if let Some(project_panel) = &settings_content.project_panel {
2612 &project_panel.show_diagnostics
2613 } else {
2614 &None
2615 }
2616 },
2617 pick_mut: |settings_content| {
2618 &mut settings_content
2619 .project_panel
2620 .get_or_insert_default()
2621 .show_diagnostics
2622 },
2623 }),
2624 metadata: None,
2625 files: USER,
2626 }),
2627 SettingsPageItem::SettingItem(SettingItem {
2628 title: "Sticky Scroll",
2629 description: "Whether to stick parent directories at top of the project panel",
2630 field: Box::new(SettingField {
2631 pick: |settings_content| {
2632 if let Some(project_panel) = &settings_content.project_panel {
2633 &project_panel.sticky_scroll
2634 } else {
2635 &None
2636 }
2637 },
2638 pick_mut: |settings_content| {
2639 &mut settings_content
2640 .project_panel
2641 .get_or_insert_default()
2642 .sticky_scroll
2643 },
2644 }),
2645 metadata: None,
2646 files: USER,
2647 }),
2648 SettingsPageItem::SettingItem(SettingItem {
2649 files: USER,
2650 title: "Indent Guides Show",
2651 description: "When to show indent guides in the project panel",
2652 field: Box::new(
2653 SettingField {
2654 pick: |settings_content| {
2655 if let Some(project_panel) = &settings_content.project_panel {
2656 if let Some(indent_guides) = &project_panel.indent_guides {
2657 &indent_guides.show
2658 } else {
2659 &None
2660 }
2661 } else {
2662 &None
2663 }
2664 },
2665 pick_mut: |settings_content| {
2666 &mut settings_content
2667 .project_panel
2668 .get_or_insert_default()
2669 .indent_guides
2670 .get_or_insert_default()
2671 .show
2672 },
2673 }
2674 .unimplemented(),
2675 ),
2676 metadata: None,
2677 }),
2678 SettingsPageItem::SettingItem(SettingItem {
2679 title: "Drag and Drop",
2680 description: "Whether to enable drag-and-drop operations in the project panel",
2681 field: Box::new(SettingField {
2682 pick: |settings_content| {
2683 if let Some(project_panel) = &settings_content.project_panel {
2684 &project_panel.drag_and_drop
2685 } else {
2686 &None
2687 }
2688 },
2689 pick_mut: |settings_content| {
2690 &mut settings_content
2691 .project_panel
2692 .get_or_insert_default()
2693 .drag_and_drop
2694 },
2695 }),
2696 metadata: None,
2697 files: USER,
2698 }),
2699 SettingsPageItem::SettingItem(SettingItem {
2700 title: "Hide Root",
2701 description: "Whether to hide the root entry when only one folder is open in the window",
2702 field: Box::new(SettingField {
2703 pick: |settings_content| {
2704 if let Some(project_panel) = &settings_content.project_panel {
2705 &project_panel.hide_root
2706 } else {
2707 &None
2708 }
2709 },
2710 pick_mut: |settings_content| {
2711 &mut settings_content
2712 .project_panel
2713 .get_or_insert_default()
2714 .hide_root
2715 },
2716 }),
2717 metadata: None,
2718 files: USER,
2719 }),
2720 SettingsPageItem::SectionHeader("Terminal Panel"),
2721 SettingsPageItem::SettingItem(SettingItem {
2722 title: "Terminal Dock",
2723 description: "Where to dock the terminal panel",
2724 field: Box::new(SettingField {
2725 pick: |settings_content| {
2726 if let Some(terminal) = &settings_content.terminal {
2727 &terminal.dock
2728 } else {
2729 &None
2730 }
2731 },
2732 pick_mut: |settings_content| {
2733 &mut settings_content.terminal.get_or_insert_default().dock
2734 },
2735 }),
2736 metadata: None,
2737 files: USER,
2738 }),
2739 SettingsPageItem::SectionHeader("Outline Panel"),
2740 SettingsPageItem::SettingItem(SettingItem {
2741 title: "Outline Panel Button",
2742 description: "Whether to show the outline panel button in the status bar",
2743 field: Box::new(SettingField {
2744 pick: |settings_content| {
2745 if let Some(outline_panel) = &settings_content.outline_panel {
2746 &outline_panel.button
2747 } else {
2748 &None
2749 }
2750 },
2751 pick_mut: |settings_content| {
2752 &mut settings_content
2753 .outline_panel
2754 .get_or_insert_default()
2755 .button
2756 },
2757 }),
2758 metadata: None,
2759 files: USER,
2760 }),
2761 SettingsPageItem::SettingItem(SettingItem {
2762 title: "Outline Panel Dock",
2763 description: "Where to dock the outline panel",
2764 field: Box::new(SettingField {
2765 pick: |settings_content| {
2766 if let Some(outline_panel) = &settings_content.outline_panel {
2767 &outline_panel.dock
2768 } else {
2769 &None
2770 }
2771 },
2772 pick_mut: |settings_content| {
2773 &mut settings_content.outline_panel.get_or_insert_default().dock
2774 },
2775 }),
2776 metadata: None,
2777 files: USER,
2778 }),
2779 SettingsPageItem::SettingItem(SettingItem {
2780 title: "Outline Panel Default Width",
2781 description: "Default width of the outline panel in pixels",
2782 field: Box::new(SettingField {
2783 pick: |settings_content| {
2784 if let Some(outline_panel) = &settings_content.outline_panel {
2785 &outline_panel.default_width
2786 } else {
2787 &None
2788 }
2789 },
2790 pick_mut: |settings_content| {
2791 &mut settings_content
2792 .outline_panel
2793 .get_or_insert_default()
2794 .default_width
2795 },
2796 }),
2797 metadata: None,
2798 files: USER,
2799 }),
2800 SettingsPageItem::SettingItem(SettingItem {
2801 title: "File Icons",
2802 description: "Whether to show file icons in the outline panel",
2803 field: Box::new(SettingField {
2804 pick: |settings_content| {
2805 if let Some(outline_panel) = &settings_content.outline_panel {
2806 &outline_panel.file_icons
2807 } else {
2808 &None
2809 }
2810 },
2811 pick_mut: |settings_content| {
2812 &mut settings_content
2813 .outline_panel
2814 .get_or_insert_default()
2815 .file_icons
2816 },
2817 }),
2818 metadata: None,
2819 files: USER,
2820 }),
2821 SettingsPageItem::SettingItem(SettingItem {
2822 title: "Folder Icons",
2823 description: "Whether to show folder icons or chevrons for directories in the outline panel",
2824 field: Box::new(SettingField {
2825 pick: |settings_content| {
2826 if let Some(outline_panel) = &settings_content.outline_panel {
2827 &outline_panel.folder_icons
2828 } else {
2829 &None
2830 }
2831 },
2832 pick_mut: |settings_content| {
2833 &mut settings_content
2834 .outline_panel
2835 .get_or_insert_default()
2836 .folder_icons
2837 },
2838 }),
2839 metadata: None,
2840 files: USER,
2841 }),
2842 SettingsPageItem::SettingItem(SettingItem {
2843 title: "Git Status",
2844 description: "Whether to show the git status in the outline panel",
2845 field: Box::new(SettingField {
2846 pick: |settings_content| {
2847 if let Some(outline_panel) = &settings_content.outline_panel {
2848 &outline_panel.git_status
2849 } else {
2850 &None
2851 }
2852 },
2853 pick_mut: |settings_content| {
2854 &mut settings_content
2855 .outline_panel
2856 .get_or_insert_default()
2857 .git_status
2858 },
2859 }),
2860 metadata: None,
2861 files: USER,
2862 }),
2863 SettingsPageItem::SettingItem(SettingItem {
2864 title: "Indent Size",
2865 description: "Amount of indentation for nested items",
2866 field: Box::new(SettingField {
2867 pick: |settings_content| {
2868 if let Some(outline_panel) = &settings_content.outline_panel {
2869 &outline_panel.indent_size
2870 } else {
2871 &None
2872 }
2873 },
2874 pick_mut: |settings_content| {
2875 &mut settings_content
2876 .outline_panel
2877 .get_or_insert_default()
2878 .indent_size
2879 },
2880 }),
2881 metadata: None,
2882 files: USER,
2883 }),
2884 SettingsPageItem::SettingItem(SettingItem {
2885 title: "Auto Reveal Entries",
2886 description: "Whether to reveal when a corresponding outline entry becomes active",
2887 field: Box::new(SettingField {
2888 pick: |settings_content| {
2889 if let Some(outline_panel) = &settings_content.outline_panel {
2890 &outline_panel.auto_reveal_entries
2891 } else {
2892 &None
2893 }
2894 },
2895 pick_mut: |settings_content| {
2896 &mut settings_content
2897 .outline_panel
2898 .get_or_insert_default()
2899 .auto_reveal_entries
2900 },
2901 }),
2902 metadata: None,
2903 files: USER,
2904 }),
2905 SettingsPageItem::SettingItem(SettingItem {
2906 title: "Auto Fold Directories",
2907 description: "Whether to fold directories automatically when a directory has only one directory inside",
2908 field: Box::new(SettingField {
2909 pick: |settings_content| {
2910 if let Some(outline_panel) = &settings_content.outline_panel {
2911 &outline_panel.auto_fold_dirs
2912 } else {
2913 &None
2914 }
2915 },
2916 pick_mut: |settings_content| {
2917 &mut settings_content
2918 .outline_panel
2919 .get_or_insert_default()
2920 .auto_fold_dirs
2921 },
2922 }),
2923 metadata: None,
2924 files: USER,
2925 }),
2926 SettingsPageItem::SettingItem(SettingItem {
2927 files: USER,
2928 title: "Indent Guides Show",
2929 description: "When to show indent guides in the outline panel",
2930 field: Box::new(
2931 SettingField {
2932 pick: |settings_content| {
2933 if let Some(outline_panel) = &settings_content.outline_panel {
2934 if let Some(indent_guides) = &outline_panel.indent_guides {
2935 &indent_guides.show
2936 } else {
2937 &None
2938 }
2939 } else {
2940 &None
2941 }
2942 },
2943 pick_mut: |settings_content| {
2944 &mut settings_content
2945 .outline_panel
2946 .get_or_insert_default()
2947 .indent_guides
2948 .get_or_insert_default()
2949 .show
2950 },
2951 }
2952 .unimplemented(),
2953 ),
2954 metadata: None,
2955 }),
2956 SettingsPageItem::SectionHeader("Git Panel"),
2957 SettingsPageItem::SettingItem(SettingItem {
2958 title: "Git Panel Button",
2959 description: "Whether to show the Git panel button in the status bar",
2960 field: Box::new(SettingField {
2961 pick: |settings_content| {
2962 if let Some(git_panel) = &settings_content.git_panel {
2963 &git_panel.button
2964 } else {
2965 &None
2966 }
2967 },
2968 pick_mut: |settings_content| {
2969 &mut settings_content.git_panel.get_or_insert_default().button
2970 },
2971 }),
2972 metadata: None,
2973 files: USER,
2974 }),
2975 SettingsPageItem::SettingItem(SettingItem {
2976 title: "Git Panel Dock",
2977 description: "Where to dock the Git panel",
2978 field: Box::new(SettingField {
2979 pick: |settings_content| {
2980 if let Some(git_panel) = &settings_content.git_panel {
2981 &git_panel.dock
2982 } else {
2983 &None
2984 }
2985 },
2986 pick_mut: |settings_content| {
2987 &mut settings_content.git_panel.get_or_insert_default().dock
2988 },
2989 }),
2990 metadata: None,
2991 files: USER,
2992 }),
2993 SettingsPageItem::SettingItem(SettingItem {
2994 title: "Git Panel Default Width",
2995 description: "Default width of the Git panel in pixels",
2996 field: Box::new(SettingField {
2997 pick: |settings_content| {
2998 if let Some(git_panel) = &settings_content.git_panel {
2999 &git_panel.default_width
3000 } else {
3001 &None
3002 }
3003 },
3004 pick_mut: |settings_content| {
3005 &mut settings_content
3006 .git_panel
3007 .get_or_insert_default()
3008 .default_width
3009 },
3010 }),
3011 metadata: None,
3012 files: USER,
3013 }),
3014 SettingsPageItem::SectionHeader("Debugger Panel"),
3015 SettingsPageItem::SettingItem(SettingItem {
3016 title: "Debugger Panel Dock",
3017 description: "The dock position of the debug panel",
3018 field: Box::new(SettingField {
3019 pick: |settings_content| {
3020 if let Some(debugger) = &settings_content.debugger {
3021 &debugger.dock
3022 } else {
3023 &None
3024 }
3025 },
3026 pick_mut: |settings_content| {
3027 &mut settings_content.debugger.get_or_insert_default().dock
3028 },
3029 }),
3030 metadata: None,
3031 files: USER,
3032 }),
3033 SettingsPageItem::SectionHeader("Notification Panel"),
3034 SettingsPageItem::SettingItem(SettingItem {
3035 title: "Notification Panel Button",
3036 description: "Whether to show the notification panel button in the status bar",
3037 field: Box::new(SettingField {
3038 pick: |settings_content| {
3039 if let Some(notification_panel) = &settings_content.notification_panel {
3040 ¬ification_panel.button
3041 } else {
3042 &None
3043 }
3044 },
3045 pick_mut: |settings_content| {
3046 &mut settings_content
3047 .notification_panel
3048 .get_or_insert_default()
3049 .button
3050 },
3051 }),
3052 metadata: None,
3053 files: USER,
3054 }),
3055 SettingsPageItem::SettingItem(SettingItem {
3056 title: "Notification Panel Dock",
3057 description: "Where to dock the notification panel",
3058 field: Box::new(SettingField {
3059 pick: |settings_content| {
3060 if let Some(notification_panel) = &settings_content.notification_panel {
3061 ¬ification_panel.dock
3062 } else {
3063 &None
3064 }
3065 },
3066 pick_mut: |settings_content| {
3067 &mut settings_content
3068 .notification_panel
3069 .get_or_insert_default()
3070 .dock
3071 },
3072 }),
3073 metadata: None,
3074 files: USER,
3075 }),
3076 SettingsPageItem::SettingItem(SettingItem {
3077 title: "Notification Panel Default Width",
3078 description: "Default width of the notification panel in pixels",
3079 field: Box::new(SettingField {
3080 pick: |settings_content| {
3081 if let Some(notification_panel) = &settings_content.notification_panel {
3082 ¬ification_panel.default_width
3083 } else {
3084 &None
3085 }
3086 },
3087 pick_mut: |settings_content| {
3088 &mut settings_content
3089 .notification_panel
3090 .get_or_insert_default()
3091 .default_width
3092 },
3093 }),
3094 metadata: None,
3095 files: USER,
3096 }),
3097 SettingsPageItem::SectionHeader("Collaboration Panel"),
3098 SettingsPageItem::SettingItem(SettingItem {
3099 title: "Collaboration Panel Button",
3100 description: "Whether to show the collaboration panel button in the status bar",
3101 field: Box::new(SettingField {
3102 pick: |settings_content| {
3103 if let Some(collaboration_panel) = &settings_content.collaboration_panel
3104 {
3105 &collaboration_panel.button
3106 } else {
3107 &None
3108 }
3109 },
3110 pick_mut: |settings_content| {
3111 &mut settings_content
3112 .collaboration_panel
3113 .get_or_insert_default()
3114 .button
3115 },
3116 }),
3117 metadata: None,
3118 files: USER,
3119 }),
3120 SettingsPageItem::SettingItem(SettingItem {
3121 title: "Collaboration Panel Dock",
3122 description: "Where to dock the collaboration panel",
3123 field: Box::new(SettingField {
3124 pick: |settings_content| {
3125 if let Some(collaboration_panel) = &settings_content.collaboration_panel
3126 {
3127 &collaboration_panel.dock
3128 } else {
3129 &None
3130 }
3131 },
3132 pick_mut: |settings_content| {
3133 &mut settings_content
3134 .collaboration_panel
3135 .get_or_insert_default()
3136 .dock
3137 },
3138 }),
3139 metadata: None,
3140 files: USER,
3141 }),
3142 SettingsPageItem::SettingItem(SettingItem {
3143 title: "Collaboration Panel Default Width",
3144 description: "Default width of the collaboration panel in pixels",
3145 field: Box::new(SettingField {
3146 pick: |settings_content| {
3147 if let Some(collaboration_panel) = &settings_content.collaboration_panel
3148 {
3149 &collaboration_panel.default_width
3150 } else {
3151 &None
3152 }
3153 },
3154 pick_mut: |settings_content| {
3155 &mut settings_content
3156 .collaboration_panel
3157 .get_or_insert_default()
3158 .default_width
3159 },
3160 }),
3161 metadata: None,
3162 files: USER,
3163 }),
3164 ],
3165 },
3166 SettingsPage {
3167 title: "Version Control",
3168 items: vec![
3169 SettingsPageItem::SectionHeader("Git"),
3170 SettingsPageItem::SettingItem(SettingItem {
3171 title: "Git Gutter",
3172 description: "Control whether git status is shown in the editor's gutter",
3173 field: Box::new(SettingField {
3174 pick: |settings_content| {
3175 if let Some(git) = &settings_content.git {
3176 &git.git_gutter
3177 } else {
3178 &None
3179 }
3180 },
3181 pick_mut: |settings_content| {
3182 &mut settings_content.git.get_or_insert_default().git_gutter
3183 },
3184 }),
3185 metadata: None,
3186 files: USER,
3187 }),
3188 // todo(settings_ui): Figure out the right default for this value in default.json
3189 SettingsPageItem::SettingItem(SettingItem {
3190 title: "Gutter Debounce",
3191 description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
3192 field: Box::new(SettingField {
3193 pick: |settings_content| {
3194 if let Some(git) = &settings_content.git {
3195 &git.gutter_debounce
3196 } else {
3197 &None
3198 }
3199 },
3200 pick_mut: |settings_content| {
3201 &mut settings_content.git.get_or_insert_default().gutter_debounce
3202 },
3203 }),
3204 metadata: None,
3205 files: USER,
3206 }),
3207 SettingsPageItem::SettingItem(SettingItem {
3208 title: "Inline Git Blame",
3209 description: "Whether or not to show git blame data inline in the currently focused line",
3210 field: Box::new(SettingField {
3211 pick: |settings_content| {
3212 if let Some(git) = &settings_content.git {
3213 if let Some(inline_blame) = &git.inline_blame {
3214 &inline_blame.enabled
3215 } else {
3216 &None
3217 }
3218 } else {
3219 &None
3220 }
3221 },
3222 pick_mut: |settings_content| {
3223 &mut settings_content
3224 .git
3225 .get_or_insert_default()
3226 .inline_blame
3227 .get_or_insert_default()
3228 .enabled
3229 },
3230 }),
3231 metadata: None,
3232 files: USER,
3233 }),
3234 SettingsPageItem::SettingItem(SettingItem {
3235 title: "Inline Git Blame Delay",
3236 description: "The delay after which the inline blame information is shown",
3237 field: Box::new(SettingField {
3238 pick: |settings_content| {
3239 if let Some(git) = &settings_content.git {
3240 if let Some(inline_blame) = &git.inline_blame {
3241 &inline_blame.delay_ms
3242 } else {
3243 &None
3244 }
3245 } else {
3246 &None
3247 }
3248 },
3249 pick_mut: |settings_content| {
3250 &mut settings_content
3251 .git
3252 .get_or_insert_default()
3253 .inline_blame
3254 .get_or_insert_default()
3255 .delay_ms
3256 },
3257 }),
3258 metadata: None,
3259 files: USER,
3260 }),
3261 SettingsPageItem::SettingItem(SettingItem {
3262 title: "Inline Git Blame Padding",
3263 description: "Padding between the end of the source line and the start of the inline blame in columns",
3264 field: Box::new(SettingField {
3265 pick: |settings_content| {
3266 if let Some(git) = &settings_content.git {
3267 if let Some(inline_blame) = &git.inline_blame {
3268 &inline_blame.padding
3269 } else {
3270 &None
3271 }
3272 } else {
3273 &None
3274 }
3275 },
3276 pick_mut: |settings_content| {
3277 &mut settings_content
3278 .git
3279 .get_or_insert_default()
3280 .inline_blame
3281 .get_or_insert_default()
3282 .padding
3283 },
3284 }),
3285 metadata: None,
3286 files: USER,
3287 }),
3288 SettingsPageItem::SettingItem(SettingItem {
3289 title: "Inline Git Blame Min Column",
3290 description: "The minimum column number to show the inline blame information at",
3291 field: Box::new(SettingField {
3292 pick: |settings_content| {
3293 if let Some(git) = &settings_content.git {
3294 if let Some(inline_blame) = &git.inline_blame {
3295 &inline_blame.min_column
3296 } else {
3297 &None
3298 }
3299 } else {
3300 &None
3301 }
3302 },
3303 pick_mut: |settings_content| {
3304 &mut settings_content
3305 .git
3306 .get_or_insert_default()
3307 .inline_blame
3308 .get_or_insert_default()
3309 .min_column
3310 },
3311 }),
3312 metadata: None,
3313 files: USER,
3314 }),
3315 SettingsPageItem::SettingItem(SettingItem {
3316 title: "Show Commit Summary",
3317 description: "Whether to show commit summary as part of the inline blame",
3318 field: Box::new(SettingField {
3319 pick: |settings_content| {
3320 if let Some(git) = &settings_content.git {
3321 if let Some(inline_blame) = &git.inline_blame {
3322 &inline_blame.show_commit_summary
3323 } else {
3324 &None
3325 }
3326 } else {
3327 &None
3328 }
3329 },
3330 pick_mut: |settings_content| {
3331 &mut settings_content
3332 .git
3333 .get_or_insert_default()
3334 .inline_blame
3335 .get_or_insert_default()
3336 .show_commit_summary
3337 },
3338 }),
3339 metadata: None,
3340 files: USER,
3341 }),
3342 SettingsPageItem::SettingItem(SettingItem {
3343 title: "Show Avatar",
3344 description: "Whether to show the avatar of the author of the commit",
3345 field: Box::new(SettingField {
3346 pick: |settings_content| {
3347 if let Some(git) = &settings_content.git {
3348 if let Some(blame) = &git.blame {
3349 &blame.show_avatar
3350 } else {
3351 &None
3352 }
3353 } else {
3354 &None
3355 }
3356 },
3357 pick_mut: |settings_content| {
3358 &mut settings_content
3359 .git
3360 .get_or_insert_default()
3361 .blame
3362 .get_or_insert_default()
3363 .show_avatar
3364 },
3365 }),
3366 metadata: None,
3367 files: USER,
3368 }),
3369 SettingsPageItem::SettingItem(SettingItem {
3370 title: "Show Author Name In Branch Picker",
3371 description: "Whether to show author name as part of the commit information in branch picker",
3372 field: Box::new(SettingField {
3373 pick: |settings_content| {
3374 if let Some(git) = &settings_content.git {
3375 if let Some(branch_picker) = &git.branch_picker {
3376 &branch_picker.show_author_name
3377 } else {
3378 &None
3379 }
3380 } else {
3381 &None
3382 }
3383 },
3384 pick_mut: |settings_content| {
3385 &mut settings_content
3386 .git
3387 .get_or_insert_default()
3388 .branch_picker
3389 .get_or_insert_default()
3390 .show_author_name
3391 },
3392 }),
3393 metadata: None,
3394 files: USER,
3395 }),
3396 SettingsPageItem::SettingItem(SettingItem {
3397 title: "Hunk Style",
3398 description: "How git hunks are displayed visually in the editor",
3399 field: Box::new(SettingField {
3400 pick: |settings_content| {
3401 if let Some(git) = &settings_content.git {
3402 &git.hunk_style
3403 } else {
3404 &None
3405 }
3406 },
3407 pick_mut: |settings_content| {
3408 &mut settings_content.git.get_or_insert_default().hunk_style
3409 },
3410 }),
3411 metadata: None,
3412 files: USER,
3413 }),
3414 ],
3415 },
3416 SettingsPage {
3417 title: "System & Network",
3418 items: vec![
3419 SettingsPageItem::SectionHeader("Network"),
3420 // todo(settings_ui): Proxy needs a default
3421 SettingsPageItem::SettingItem(SettingItem {
3422 title: "Proxy",
3423 description: "The proxy to use for network requests",
3424 field: Box::new(
3425 SettingField {
3426 pick: |settings_content| &settings_content.proxy,
3427 pick_mut: |settings_content| &mut settings_content.proxy,
3428 }
3429 .unimplemented(),
3430 ),
3431 metadata: Some(Box::new(SettingsFieldMetadata {
3432 placeholder: Some("socks5h://localhost:10808"),
3433 })),
3434 files: USER,
3435 }),
3436 SettingsPageItem::SettingItem(SettingItem {
3437 title: "Server URL",
3438 description: "The URL of the Zed server to connect to",
3439 field: Box::new(SettingField {
3440 pick: |settings_content| &settings_content.server_url,
3441 pick_mut: |settings_content| &mut settings_content.server_url,
3442 }),
3443 metadata: Some(Box::new(SettingsFieldMetadata {
3444 placeholder: Some("https://zed.dev"),
3445 })),
3446 files: USER,
3447 }),
3448 SettingsPageItem::SectionHeader("System"),
3449 SettingsPageItem::SettingItem(SettingItem {
3450 title: "Auto Update",
3451 description: "Whether or not to automatically check for updates",
3452 field: Box::new(SettingField {
3453 pick: |settings_content| &settings_content.auto_update,
3454 pick_mut: |settings_content| &mut settings_content.auto_update,
3455 }),
3456 metadata: None,
3457 files: USER,
3458 }),
3459 ],
3460 },
3461 SettingsPage {
3462 title: "Diagnostics & Errors",
3463 items: vec![
3464 SettingsPageItem::SectionHeader("Filtering"),
3465 SettingsPageItem::SettingItem(SettingItem {
3466 title: "Max Severity",
3467 description: "Which level to use to filter out diagnostics displayed in the editor",
3468 field: Box::new(SettingField {
3469 pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
3470 pick_mut: |settings_content| {
3471 &mut settings_content.editor.diagnostics_max_severity
3472 },
3473 }),
3474 metadata: None,
3475 files: USER,
3476 }),
3477 SettingsPageItem::SettingItem(SettingItem {
3478 title: "Include Warnings",
3479 description: "Whether to show warnings or not by default",
3480 field: Box::new(SettingField {
3481 pick: |settings_content| {
3482 if let Some(diagnostics) = &settings_content.diagnostics {
3483 &diagnostics.include_warnings
3484 } else {
3485 &None
3486 }
3487 },
3488 pick_mut: |settings_content| {
3489 &mut settings_content
3490 .diagnostics
3491 .get_or_insert_default()
3492 .include_warnings
3493 },
3494 }),
3495 metadata: None,
3496 files: USER,
3497 }),
3498 SettingsPageItem::SectionHeader("Inline"),
3499 SettingsPageItem::SettingItem(SettingItem {
3500 title: "Inline Diagnostics Enabled",
3501 description: "Whether to show diagnostics inline or not",
3502 field: Box::new(SettingField {
3503 pick: |settings_content| {
3504 if let Some(diagnostics) = &settings_content.diagnostics {
3505 if let Some(inline) = &diagnostics.inline {
3506 &inline.enabled
3507 } else {
3508 &None
3509 }
3510 } else {
3511 &None
3512 }
3513 },
3514 pick_mut: |settings_content| {
3515 &mut settings_content
3516 .diagnostics
3517 .get_or_insert_default()
3518 .inline
3519 .get_or_insert_default()
3520 .enabled
3521 },
3522 }),
3523 metadata: None,
3524 files: USER,
3525 }),
3526 SettingsPageItem::SettingItem(SettingItem {
3527 title: "Inline Update Debounce",
3528 description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
3529 field: Box::new(SettingField {
3530 pick: |settings_content| {
3531 if let Some(diagnostics) = &settings_content.diagnostics {
3532 if let Some(inline) = &diagnostics.inline {
3533 &inline.update_debounce_ms
3534 } else {
3535 &None
3536 }
3537 } else {
3538 &None
3539 }
3540 },
3541 pick_mut: |settings_content| {
3542 &mut settings_content
3543 .diagnostics
3544 .get_or_insert_default()
3545 .inline
3546 .get_or_insert_default()
3547 .update_debounce_ms
3548 },
3549 }),
3550 metadata: None,
3551 files: USER,
3552 }),
3553 SettingsPageItem::SettingItem(SettingItem {
3554 title: "Inline Padding",
3555 description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
3556 field: Box::new(SettingField {
3557 pick: |settings_content| {
3558 if let Some(diagnostics) = &settings_content.diagnostics {
3559 if let Some(inline) = &diagnostics.inline {
3560 &inline.padding
3561 } else {
3562 &None
3563 }
3564 } else {
3565 &None
3566 }
3567 },
3568 pick_mut: |settings_content| {
3569 &mut settings_content
3570 .diagnostics
3571 .get_or_insert_default()
3572 .inline
3573 .get_or_insert_default()
3574 .padding
3575 },
3576 }),
3577 metadata: None,
3578 files: USER,
3579 }),
3580 SettingsPageItem::SettingItem(SettingItem {
3581 title: "Inline Min Column",
3582 description: "The minimum column to display inline diagnostics",
3583 field: Box::new(SettingField {
3584 pick: |settings_content| {
3585 if let Some(diagnostics) = &settings_content.diagnostics {
3586 if let Some(inline) = &diagnostics.inline {
3587 &inline.min_column
3588 } else {
3589 &None
3590 }
3591 } else {
3592 &None
3593 }
3594 },
3595 pick_mut: |settings_content| {
3596 &mut settings_content
3597 .diagnostics
3598 .get_or_insert_default()
3599 .inline
3600 .get_or_insert_default()
3601 .min_column
3602 },
3603 }),
3604 metadata: None,
3605 files: USER,
3606 }),
3607 SettingsPageItem::SectionHeader("Performance"),
3608 SettingsPageItem::SettingItem(SettingItem {
3609 title: "LSP Pull Diagnostics Enabled",
3610 description: "Whether to pull for language server-powered diagnostics or not",
3611 field: Box::new(SettingField {
3612 pick: |settings_content| {
3613 if let Some(diagnostics) = &settings_content.diagnostics {
3614 if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3615 &lsp_pull.enabled
3616 } else {
3617 &None
3618 }
3619 } else {
3620 &None
3621 }
3622 },
3623 pick_mut: |settings_content| {
3624 &mut settings_content
3625 .diagnostics
3626 .get_or_insert_default()
3627 .lsp_pull_diagnostics
3628 .get_or_insert_default()
3629 .enabled
3630 },
3631 }),
3632 metadata: None,
3633 files: USER,
3634 }),
3635 // todo(settings_ui): Needs unit
3636 SettingsPageItem::SettingItem(SettingItem {
3637 title: "LSP Pull Debounce",
3638 description: "Minimum time to wait before pulling diagnostics from the language server(s)",
3639 field: Box::new(SettingField {
3640 pick: |settings_content| {
3641 if let Some(diagnostics) = &settings_content.diagnostics {
3642 if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3643 &lsp_pull.debounce_ms
3644 } else {
3645 &None
3646 }
3647 } else {
3648 &None
3649 }
3650 },
3651 pick_mut: |settings_content| {
3652 &mut settings_content
3653 .diagnostics
3654 .get_or_insert_default()
3655 .lsp_pull_diagnostics
3656 .get_or_insert_default()
3657 .debounce_ms
3658 },
3659 }),
3660 metadata: None,
3661 files: USER,
3662 }),
3663 ],
3664 },
3665 SettingsPage {
3666 title: "Debugger",
3667 items: vec![
3668 SettingsPageItem::SectionHeader("General"),
3669 SettingsPageItem::SettingItem(SettingItem {
3670 title: "Stepping Granularity",
3671 description: "Determines the stepping granularity for debug operations",
3672 field: Box::new(SettingField {
3673 pick: |settings_content| {
3674 if let Some(debugger) = &settings_content.debugger {
3675 &debugger.stepping_granularity
3676 } else {
3677 &None
3678 }
3679 },
3680 pick_mut: |settings_content| {
3681 &mut settings_content
3682 .debugger
3683 .get_or_insert_default()
3684 .stepping_granularity
3685 },
3686 }),
3687 metadata: None,
3688 files: USER,
3689 }),
3690 SettingsPageItem::SettingItem(SettingItem {
3691 title: "Save Breakpoints",
3692 description: "Whether breakpoints should be reused across Zed sessions",
3693 field: Box::new(SettingField {
3694 pick: |settings_content| {
3695 if let Some(debugger) = &settings_content.debugger {
3696 &debugger.save_breakpoints
3697 } else {
3698 &None
3699 }
3700 },
3701 pick_mut: |settings_content| {
3702 &mut settings_content
3703 .debugger
3704 .get_or_insert_default()
3705 .save_breakpoints
3706 },
3707 }),
3708 metadata: None,
3709 files: USER,
3710 }),
3711 SettingsPageItem::SettingItem(SettingItem {
3712 title: "Timeout",
3713 description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
3714 field: Box::new(SettingField {
3715 pick: |settings_content| {
3716 if let Some(debugger) = &settings_content.debugger {
3717 &debugger.timeout
3718 } else {
3719 &None
3720 }
3721 },
3722 pick_mut: |settings_content| {
3723 &mut settings_content.debugger.get_or_insert_default().timeout
3724 },
3725 }),
3726 metadata: None,
3727 files: USER,
3728 }),
3729 SettingsPageItem::SettingItem(SettingItem {
3730 title: "Log DAP Communications",
3731 description: "Whether to log messages between active debug adapters and Zed",
3732 field: Box::new(SettingField {
3733 pick: |settings_content| {
3734 if let Some(debugger) = &settings_content.debugger {
3735 &debugger.log_dap_communications
3736 } else {
3737 &None
3738 }
3739 },
3740 pick_mut: |settings_content| {
3741 &mut settings_content
3742 .debugger
3743 .get_or_insert_default()
3744 .log_dap_communications
3745 },
3746 }),
3747 metadata: None,
3748 files: USER,
3749 }),
3750 SettingsPageItem::SettingItem(SettingItem {
3751 title: "Format DAP Log Messages",
3752 description: "Whether to format DAP messages when adding them to debug adapter logger",
3753 field: Box::new(SettingField {
3754 pick: |settings_content| {
3755 if let Some(debugger) = &settings_content.debugger {
3756 &debugger.format_dap_log_messages
3757 } else {
3758 &None
3759 }
3760 },
3761 pick_mut: |settings_content| {
3762 &mut settings_content
3763 .debugger
3764 .get_or_insert_default()
3765 .format_dap_log_messages
3766 },
3767 }),
3768 metadata: None,
3769 files: USER,
3770 }),
3771 ],
3772 },
3773 SettingsPage {
3774 title: "Collaboration",
3775 items: vec![
3776 SettingsPageItem::SectionHeader("Calls"),
3777 SettingsPageItem::SettingItem(SettingItem {
3778 title: "Mute On Join",
3779 description: "Whether the microphone should be muted when joining a channel or a call",
3780 field: Box::new(SettingField {
3781 pick: |settings_content| {
3782 if let Some(calls) = &settings_content.calls {
3783 &calls.mute_on_join
3784 } else {
3785 &None
3786 }
3787 },
3788 pick_mut: |settings_content| {
3789 &mut settings_content.calls.get_or_insert_default().mute_on_join
3790 },
3791 }),
3792 metadata: None,
3793 files: USER,
3794 }),
3795 SettingsPageItem::SettingItem(SettingItem {
3796 title: "Share On Join",
3797 description: "Whether your current project should be shared when joining an empty channel",
3798 field: Box::new(SettingField {
3799 pick: |settings_content| {
3800 if let Some(calls) = &settings_content.calls {
3801 &calls.share_on_join
3802 } else {
3803 &None
3804 }
3805 },
3806 pick_mut: |settings_content| {
3807 &mut settings_content.calls.get_or_insert_default().share_on_join
3808 },
3809 }),
3810 metadata: None,
3811 files: USER,
3812 }),
3813 SettingsPageItem::SectionHeader("Experimental"),
3814 SettingsPageItem::SettingItem(SettingItem {
3815 title: "Rodio Audio",
3816 description: "Opt into the new audio system",
3817 field: Box::new(SettingField {
3818 pick: |settings_content| {
3819 if let Some(audio) = &settings_content.audio {
3820 &audio.rodio_audio
3821 } else {
3822 &None
3823 }
3824 },
3825 pick_mut: |settings_content| {
3826 &mut settings_content.audio.get_or_insert_default().rodio_audio
3827 },
3828 }),
3829 metadata: None,
3830 files: USER,
3831 }),
3832 SettingsPageItem::SettingItem(SettingItem {
3833 title: "Auto Microphone Volume",
3834 description: "Automatically adjust microphone volume (requires Rodio Audio)",
3835 field: Box::new(SettingField {
3836 pick: |settings_content| {
3837 if let Some(audio) = &settings_content.audio {
3838 &audio.auto_microphone_volume
3839 } else {
3840 &None
3841 }
3842 },
3843 pick_mut: |settings_content| {
3844 &mut settings_content
3845 .audio
3846 .get_or_insert_default()
3847 .auto_microphone_volume
3848 },
3849 }),
3850 metadata: None,
3851 files: USER,
3852 }),
3853 SettingsPageItem::SettingItem(SettingItem {
3854 title: "Auto Speaker Volume",
3855 description: "Automatically adjust volume of other call members (requires Rodio Audio)",
3856 field: Box::new(SettingField {
3857 pick: |settings_content| {
3858 if let Some(audio) = &settings_content.audio {
3859 &audio.auto_speaker_volume
3860 } else {
3861 &None
3862 }
3863 },
3864 pick_mut: |settings_content| {
3865 &mut settings_content
3866 .audio
3867 .get_or_insert_default()
3868 .auto_speaker_volume
3869 },
3870 }),
3871 metadata: None,
3872 files: USER,
3873 }),
3874 SettingsPageItem::SettingItem(SettingItem {
3875 title: "Denoise",
3876 description: "Remove background noises (requires Rodio Audio)",
3877 field: Box::new(SettingField {
3878 pick: |settings_content| {
3879 if let Some(audio) = &settings_content.audio {
3880 &audio.denoise
3881 } else {
3882 &None
3883 }
3884 },
3885 pick_mut: |settings_content| {
3886 &mut settings_content.audio.get_or_insert_default().denoise
3887 },
3888 }),
3889 metadata: None,
3890 files: USER,
3891 }),
3892 SettingsPageItem::SettingItem(SettingItem {
3893 title: "Legacy Audio Compatible",
3894 description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
3895 field: Box::new(SettingField {
3896 pick: |settings_content| {
3897 if let Some(audio) = &settings_content.audio {
3898 &audio.legacy_audio_compatible
3899 } else {
3900 &None
3901 }
3902 },
3903 pick_mut: |settings_content| {
3904 &mut settings_content
3905 .audio
3906 .get_or_insert_default()
3907 .legacy_audio_compatible
3908 },
3909 }),
3910 metadata: None,
3911 files: USER,
3912 }),
3913 ],
3914 },
3915 SettingsPage {
3916 title: "AI",
3917 items: vec![
3918 SettingsPageItem::SectionHeader("General"),
3919 SettingsPageItem::SettingItem(SettingItem {
3920 title: "Disable AI",
3921 description: "Whether to disable all AI features in Zed",
3922 field: Box::new(SettingField {
3923 pick: |settings_content| &settings_content.disable_ai,
3924 pick_mut: |settings_content| &mut settings_content.disable_ai,
3925 }),
3926 metadata: None,
3927 files: USER,
3928 }),
3929 ],
3930 },
3931 ]
3932}
3933
3934const LANGUAGES_SECTION_HEADER: &'static str = "Languages";
3935
3936fn language_settings_data() -> Vec<SettingsPageItem> {
3937 fn current_language() -> Option<SharedString> {
3938 sub_page_stack().iter().find_map(|page| {
3939 (page.section_header == LANGUAGES_SECTION_HEADER)
3940 .then(|| SharedString::new_static(page.link.title))
3941 })
3942 }
3943
3944 fn language_settings_field<T>(
3945 settings_content: &SettingsContent,
3946 get: fn(&LanguageSettingsContent) -> &Option<T>,
3947 ) -> &Option<T> {
3948 let all_languages = &settings_content.project.all_languages;
3949 if let Some(current_language_name) = current_language() {
3950 if let Some(current_language) = all_languages.languages.0.get(¤t_language_name) {
3951 let value = get(current_language);
3952 if value.is_some() {
3953 return value;
3954 }
3955 }
3956 }
3957 let default_value = get(&all_languages.defaults);
3958 return default_value;
3959 }
3960
3961 fn language_settings_field_mut<T>(
3962 settings_content: &mut SettingsContent,
3963 get: fn(&mut LanguageSettingsContent) -> &mut Option<T>,
3964 ) -> &mut Option<T> {
3965 let all_languages = &mut settings_content.project.all_languages;
3966 let language_content = if let Some(current_language) = current_language() {
3967 all_languages
3968 .languages
3969 .0
3970 .entry(current_language)
3971 .or_default()
3972 } else {
3973 &mut all_languages.defaults
3974 };
3975 return get(language_content);
3976 }
3977
3978 vec![
3979 SettingsPageItem::SectionHeader("Indentation"),
3980 SettingsPageItem::SettingItem(SettingItem {
3981 title: "Tab Size",
3982 description: "How many columns a tab should occupy",
3983 field: Box::new(SettingField {
3984 pick: |settings_content| {
3985 language_settings_field(settings_content, |language| &language.tab_size)
3986 },
3987 pick_mut: |settings_content| {
3988 language_settings_field_mut(settings_content, |language| &mut language.tab_size)
3989 },
3990 }),
3991 metadata: None,
3992 files: USER | LOCAL,
3993 }),
3994 SettingsPageItem::SettingItem(SettingItem {
3995 title: "Hard Tabs",
3996 description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
3997 field: Box::new(SettingField {
3998 pick: |settings_content| {
3999 language_settings_field(settings_content, |language| &language.hard_tabs)
4000 },
4001 pick_mut: |settings_content| {
4002 language_settings_field_mut(settings_content, |language| {
4003 &mut language.hard_tabs
4004 })
4005 },
4006 }),
4007 metadata: None,
4008 files: USER | LOCAL,
4009 }),
4010 SettingsPageItem::SettingItem(SettingItem {
4011 title: "Auto Indent",
4012 description: "Whether indentation should be adjusted based on the context whilst typing",
4013 field: Box::new(SettingField {
4014 pick: |settings_content| {
4015 language_settings_field(settings_content, |language| &language.auto_indent)
4016 },
4017 pick_mut: |settings_content| {
4018 language_settings_field_mut(settings_content, |language| {
4019 &mut language.auto_indent
4020 })
4021 },
4022 }),
4023 metadata: None,
4024 files: USER | LOCAL,
4025 }),
4026 SettingsPageItem::SettingItem(SettingItem {
4027 title: "Auto Indent On Paste",
4028 description: "Whether indentation of pasted content should be adjusted based on the context",
4029 field: Box::new(SettingField {
4030 pick: |settings_content| {
4031 language_settings_field(settings_content, |language| {
4032 &language.auto_indent_on_paste
4033 })
4034 },
4035 pick_mut: |settings_content| {
4036 language_settings_field_mut(settings_content, |language| {
4037 &mut language.auto_indent_on_paste
4038 })
4039 },
4040 }),
4041 metadata: None,
4042 files: USER | LOCAL,
4043 }),
4044 SettingsPageItem::SectionHeader("Wrapping"),
4045 SettingsPageItem::SettingItem(SettingItem {
4046 title: "Soft Wrap",
4047 description: "How to soft-wrap long lines of text",
4048 field: Box::new(SettingField {
4049 pick: |settings_content| {
4050 language_settings_field(settings_content, |language| &language.soft_wrap)
4051 },
4052 pick_mut: |settings_content| {
4053 language_settings_field_mut(settings_content, |language| {
4054 &mut language.soft_wrap
4055 })
4056 },
4057 }),
4058 metadata: None,
4059 files: USER | LOCAL,
4060 }),
4061 SettingsPageItem::SettingItem(SettingItem {
4062 title: "Show Wrap Guides",
4063 description: "Whether to show wrap guides in the editor",
4064 field: Box::new(SettingField {
4065 pick: |settings_content| {
4066 language_settings_field(settings_content, |language| &language.show_wrap_guides)
4067 },
4068 pick_mut: |settings_content| {
4069 language_settings_field_mut(settings_content, |language| {
4070 &mut language.show_wrap_guides
4071 })
4072 },
4073 }),
4074 metadata: None,
4075 files: USER | LOCAL,
4076 }),
4077 SettingsPageItem::SettingItem(SettingItem {
4078 title: "Preferred Line Length",
4079 description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
4080 field: Box::new(SettingField {
4081 pick: |settings_content| {
4082 language_settings_field(settings_content, |language| {
4083 &language.preferred_line_length
4084 })
4085 },
4086 pick_mut: |settings_content| {
4087 language_settings_field_mut(settings_content, |language| {
4088 &mut language.preferred_line_length
4089 })
4090 },
4091 }),
4092 metadata: None,
4093 files: USER | LOCAL,
4094 }),
4095 SettingsPageItem::SettingItem(SettingItem {
4096 title: "Wrap Guides",
4097 description: "Character counts at which to show wrap guides in the editor",
4098 field: Box::new(
4099 SettingField {
4100 pick: |settings_content| {
4101 language_settings_field(settings_content, |language| &language.wrap_guides)
4102 },
4103 pick_mut: |settings_content| {
4104 language_settings_field_mut(settings_content, |language| {
4105 &mut language.wrap_guides
4106 })
4107 },
4108 }
4109 .unimplemented(),
4110 ),
4111 metadata: None,
4112 files: USER | LOCAL,
4113 }),
4114 SettingsPageItem::SettingItem(SettingItem {
4115 title: "Allow Rewrap",
4116 description: "Controls where the `editor::Rewrap` action is allowed for this language",
4117 field: Box::new(SettingField {
4118 pick: |settings_content| {
4119 language_settings_field(settings_content, |language| &language.allow_rewrap)
4120 },
4121 pick_mut: |settings_content| {
4122 language_settings_field_mut(settings_content, |language| {
4123 &mut language.allow_rewrap
4124 })
4125 },
4126 }),
4127 metadata: None,
4128 files: USER | LOCAL,
4129 }),
4130 SettingsPageItem::SectionHeader("Indent Guides"),
4131 SettingsPageItem::SettingItem(SettingItem {
4132 title: "Enabled",
4133 description: "Whether to display indent guides in the editor",
4134 field: Box::new(SettingField {
4135 pick: |settings_content| {
4136 language_settings_field(settings_content, |language| {
4137 if let Some(indent_guides) = &language.indent_guides {
4138 &indent_guides.enabled
4139 } else {
4140 &None
4141 }
4142 })
4143 },
4144 pick_mut: |settings_content| {
4145 language_settings_field_mut(settings_content, |language| {
4146 &mut language.indent_guides.get_or_insert_default().enabled
4147 })
4148 },
4149 }),
4150 metadata: None,
4151 files: USER | LOCAL,
4152 }),
4153 SettingsPageItem::SettingItem(SettingItem {
4154 title: "Line Width",
4155 description: "The width of the indent guides in pixels, between 1 and 10",
4156 field: Box::new(SettingField {
4157 pick: |settings_content| {
4158 language_settings_field(settings_content, |language| {
4159 if let Some(indent_guides) = &language.indent_guides {
4160 &indent_guides.line_width
4161 } else {
4162 &None
4163 }
4164 })
4165 },
4166 pick_mut: |settings_content| {
4167 language_settings_field_mut(settings_content, |language| {
4168 &mut language.indent_guides.get_or_insert_default().line_width
4169 })
4170 },
4171 }),
4172 metadata: None,
4173 files: USER | LOCAL,
4174 }),
4175 SettingsPageItem::SettingItem(SettingItem {
4176 title: "Active Line Width",
4177 description: "The width of the active indent guide in pixels, between 1 and 10",
4178 field: Box::new(SettingField {
4179 pick: |settings_content| {
4180 language_settings_field(settings_content, |language| {
4181 if let Some(indent_guides) = &language.indent_guides {
4182 &indent_guides.active_line_width
4183 } else {
4184 &None
4185 }
4186 })
4187 },
4188 pick_mut: |settings_content| {
4189 language_settings_field_mut(settings_content, |language| {
4190 &mut language
4191 .indent_guides
4192 .get_or_insert_default()
4193 .active_line_width
4194 })
4195 },
4196 }),
4197 metadata: None,
4198 files: USER | LOCAL,
4199 }),
4200 SettingsPageItem::SettingItem(SettingItem {
4201 title: "Coloring",
4202 description: "Determines how indent guides are colored",
4203 field: Box::new(SettingField {
4204 pick: |settings_content| {
4205 language_settings_field(settings_content, |language| {
4206 if let Some(indent_guides) = &language.indent_guides {
4207 &indent_guides.coloring
4208 } else {
4209 &None
4210 }
4211 })
4212 },
4213 pick_mut: |settings_content| {
4214 language_settings_field_mut(settings_content, |language| {
4215 &mut language.indent_guides.get_or_insert_default().coloring
4216 })
4217 },
4218 }),
4219 metadata: None,
4220 files: USER | LOCAL,
4221 }),
4222 SettingsPageItem::SettingItem(SettingItem {
4223 title: "Background Coloring",
4224 description: "Determines how indent guide backgrounds are colored",
4225 field: Box::new(SettingField {
4226 pick: |settings_content| {
4227 language_settings_field(settings_content, |language| {
4228 if let Some(indent_guides) = &language.indent_guides {
4229 &indent_guides.background_coloring
4230 } else {
4231 &None
4232 }
4233 })
4234 },
4235 pick_mut: |settings_content| {
4236 language_settings_field_mut(settings_content, |language| {
4237 &mut language
4238 .indent_guides
4239 .get_or_insert_default()
4240 .background_coloring
4241 })
4242 },
4243 }),
4244 metadata: None,
4245 files: USER | LOCAL,
4246 }),
4247 SettingsPageItem::SectionHeader("Formatting"),
4248 SettingsPageItem::SettingItem(SettingItem {
4249 title: "Format On Save",
4250 description: "Whether or not to perform a buffer format before saving",
4251 field: Box::new(
4252 // TODO(settings_ui): this setting should just be a bool
4253 SettingField {
4254 pick: |settings_content| {
4255 language_settings_field(settings_content, |language| {
4256 &language.format_on_save
4257 })
4258 },
4259 pick_mut: |settings_content| {
4260 language_settings_field_mut(settings_content, |language| {
4261 &mut language.format_on_save
4262 })
4263 },
4264 },
4265 ),
4266 metadata: None,
4267 files: USER | LOCAL,
4268 }),
4269 SettingsPageItem::SettingItem(SettingItem {
4270 title: "Remove Trailing Whitespace On Save",
4271 description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4272 field: Box::new(SettingField {
4273 pick: |settings_content| {
4274 language_settings_field(settings_content, |language| {
4275 &language.remove_trailing_whitespace_on_save
4276 })
4277 },
4278 pick_mut: |settings_content| {
4279 language_settings_field_mut(settings_content, |language| {
4280 &mut language.remove_trailing_whitespace_on_save
4281 })
4282 },
4283 }),
4284 metadata: None,
4285 files: USER | LOCAL,
4286 }),
4287 SettingsPageItem::SettingItem(SettingItem {
4288 title: "Ensure Final Newline On Save",
4289 description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4290 field: Box::new(SettingField {
4291 pick: |settings_content| {
4292 language_settings_field(settings_content, |language| {
4293 &language.ensure_final_newline_on_save
4294 })
4295 },
4296 pick_mut: |settings_content| {
4297 language_settings_field_mut(settings_content, |language| {
4298 &mut language.ensure_final_newline_on_save
4299 })
4300 },
4301 }),
4302 metadata: None,
4303 files: USER | LOCAL,
4304 }),
4305 SettingsPageItem::SettingItem(SettingItem {
4306 title: "Formatter",
4307 description: "How to perform a buffer format",
4308 field: Box::new(
4309 SettingField {
4310 pick: |settings_content| {
4311 language_settings_field(settings_content, |language| &language.formatter)
4312 },
4313 pick_mut: |settings_content| {
4314 language_settings_field_mut(settings_content, |language| {
4315 &mut language.formatter
4316 })
4317 },
4318 }
4319 .unimplemented(),
4320 ),
4321 metadata: None,
4322 files: USER | LOCAL,
4323 }),
4324 SettingsPageItem::SettingItem(SettingItem {
4325 title: "Use On Type Format",
4326 description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities",
4327 field: Box::new(SettingField {
4328 pick: |settings_content| {
4329 language_settings_field(settings_content, |language| {
4330 &language.use_on_type_format
4331 })
4332 },
4333 pick_mut: |settings_content| {
4334 language_settings_field_mut(settings_content, |language| {
4335 &mut language.use_on_type_format
4336 })
4337 },
4338 }),
4339 metadata: None,
4340 files: USER | LOCAL,
4341 }),
4342 SettingsPageItem::SettingItem(SettingItem {
4343 title: "Code Actions On Format",
4344 description: "Which code actions to run on save after the formatter. These are not run if formatting is off",
4345 field: Box::new(
4346 SettingField {
4347 pick: |settings_content| {
4348 language_settings_field(settings_content, |language| {
4349 &language.code_actions_on_format
4350 })
4351 },
4352 pick_mut: |settings_content| {
4353 language_settings_field_mut(settings_content, |language| {
4354 &mut language.code_actions_on_format
4355 })
4356 },
4357 }
4358 .unimplemented(),
4359 ),
4360 metadata: None,
4361 files: USER | LOCAL,
4362 }),
4363 SettingsPageItem::SectionHeader("Prettier"),
4364 SettingsPageItem::SettingItem(SettingItem {
4365 title: "Allowed",
4366 description: "Enables or disables formatting with Prettier for a given language",
4367 field: Box::new(SettingField {
4368 pick: |settings_content| {
4369 language_settings_field(settings_content, |language| {
4370 if let Some(prettier) = &language.prettier {
4371 &prettier.allowed
4372 } else {
4373 &None
4374 }
4375 })
4376 },
4377 pick_mut: |settings_content| {
4378 language_settings_field_mut(settings_content, |language| {
4379 &mut language.prettier.get_or_insert_default().allowed
4380 })
4381 },
4382 }),
4383 metadata: None,
4384 files: USER | LOCAL,
4385 }),
4386 SettingsPageItem::SettingItem(SettingItem {
4387 title: "Parser",
4388 description: "Forces Prettier integration to use a specific parser name when formatting files with the language",
4389 field: Box::new(SettingField {
4390 pick: |settings_content| {
4391 language_settings_field(settings_content, |language| {
4392 if let Some(prettier) = &language.prettier {
4393 &prettier.parser
4394 } else {
4395 &None
4396 }
4397 })
4398 },
4399 pick_mut: |settings_content| {
4400 language_settings_field_mut(settings_content, |language| {
4401 &mut language.prettier.get_or_insert_default().parser
4402 })
4403 },
4404 }),
4405 metadata: None,
4406 files: USER | LOCAL,
4407 }),
4408 SettingsPageItem::SettingItem(SettingItem {
4409 title: "Plugins",
4410 description: "Forces Prettier integration to use specific plugins when formatting files with the language",
4411 field: Box::new(
4412 SettingField {
4413 pick: |settings_content| {
4414 language_settings_field(settings_content, |language| {
4415 if let Some(prettier) = &language.prettier {
4416 &prettier.plugins
4417 } else {
4418 &None
4419 }
4420 })
4421 },
4422 pick_mut: |settings_content| {
4423 language_settings_field_mut(settings_content, |language| {
4424 &mut language.prettier.get_or_insert_default().plugins
4425 })
4426 },
4427 }
4428 .unimplemented(),
4429 ),
4430 metadata: None,
4431 files: USER | LOCAL,
4432 }),
4433 SettingsPageItem::SettingItem(SettingItem {
4434 title: "Options",
4435 description: "Default Prettier options, in the format as in package.json section for Prettier",
4436 field: Box::new(
4437 SettingField {
4438 pick: |settings_content| {
4439 language_settings_field(settings_content, |language| {
4440 if let Some(prettier) = &language.prettier {
4441 &prettier.options
4442 } else {
4443 &None
4444 }
4445 })
4446 },
4447 pick_mut: |settings_content| {
4448 language_settings_field_mut(settings_content, |language| {
4449 &mut language.prettier.get_or_insert_default().options
4450 })
4451 },
4452 }
4453 .unimplemented(),
4454 ),
4455 metadata: None,
4456 files: USER | LOCAL,
4457 }),
4458 SettingsPageItem::SectionHeader("Autoclose"),
4459 SettingsPageItem::SettingItem(SettingItem {
4460 title: "Use Autoclose",
4461 description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position",
4462 field: Box::new(SettingField {
4463 pick: |settings_content| {
4464 language_settings_field(settings_content, |language| &language.use_autoclose)
4465 },
4466 pick_mut: |settings_content| {
4467 language_settings_field_mut(settings_content, |language| {
4468 &mut language.use_autoclose
4469 })
4470 },
4471 }),
4472 metadata: None,
4473 files: USER | LOCAL,
4474 }),
4475 SettingsPageItem::SettingItem(SettingItem {
4476 title: "Use Auto Surround",
4477 description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()",
4478 field: Box::new(SettingField {
4479 pick: |settings_content| {
4480 language_settings_field(settings_content, |language| {
4481 &language.use_auto_surround
4482 })
4483 },
4484 pick_mut: |settings_content| {
4485 language_settings_field_mut(settings_content, |language| {
4486 &mut language.use_auto_surround
4487 })
4488 },
4489 }),
4490 metadata: None,
4491 files: USER | LOCAL,
4492 }),
4493 SettingsPageItem::SettingItem(SettingItem {
4494 title: "Always Treat Brackets As Autoclosed",
4495 description: "Controls whether the closing characters are always skipped over and auto-removed no matter how they were inserted",
4496 field: Box::new(SettingField {
4497 pick: |settings_content| {
4498 language_settings_field(settings_content, |language| {
4499 &language.always_treat_brackets_as_autoclosed
4500 })
4501 },
4502 pick_mut: |settings_content| {
4503 language_settings_field_mut(settings_content, |language| {
4504 &mut language.always_treat_brackets_as_autoclosed
4505 })
4506 },
4507 }),
4508 metadata: None,
4509 files: USER | LOCAL,
4510 }),
4511 SettingsPageItem::SettingItem(SettingItem {
4512 title: "Jsx Tag Auto Close",
4513 description: "Whether to automatically close JSX tags",
4514 field: Box::new(SettingField {
4515 // TODO(settings_ui): this setting should just be a bool
4516 pick: |settings_content| {
4517 language_settings_field(settings_content, |language| {
4518 match language.jsx_tag_auto_close.as_ref() {
4519 Some(s) => &s.enabled,
4520 None => &None,
4521 }
4522 })
4523 },
4524 pick_mut: |settings_content| {
4525 language_settings_field_mut(settings_content, |language| {
4526 &mut language.jsx_tag_auto_close.get_or_insert_default().enabled
4527 })
4528 },
4529 }),
4530 metadata: None,
4531 files: USER | LOCAL,
4532 }),
4533 SettingsPageItem::SectionHeader("LSP"),
4534 SettingsPageItem::SettingItem(SettingItem {
4535 title: "Enable Language Server",
4536 description: "Whether to use language servers to provide code intelligence",
4537 field: Box::new(SettingField {
4538 pick: |settings_content| {
4539 language_settings_field(settings_content, |language| {
4540 &language.enable_language_server
4541 })
4542 },
4543 pick_mut: |settings_content| {
4544 language_settings_field_mut(settings_content, |language| {
4545 &mut language.enable_language_server
4546 })
4547 },
4548 }),
4549 metadata: None,
4550 files: USER | LOCAL,
4551 }),
4552 SettingsPageItem::SettingItem(SettingItem {
4553 title: "Language Servers",
4554 description: "The list of language servers to use (or disable) for this language",
4555 field: Box::new(
4556 SettingField {
4557 pick: |settings_content| {
4558 language_settings_field(settings_content, |language| {
4559 &language.language_servers
4560 })
4561 },
4562 pick_mut: |settings_content| {
4563 language_settings_field_mut(settings_content, |language| {
4564 &mut language.language_servers
4565 })
4566 },
4567 }
4568 .unimplemented(),
4569 ),
4570 metadata: None,
4571 files: USER | LOCAL,
4572 }),
4573 SettingsPageItem::SettingItem(SettingItem {
4574 title: "Linked Edits",
4575 description: "Whether to perform linked edits of associated ranges, if the LS supports it. For example, when editing opening <html> tag, the contents of the closing </html> tag will be edited as well",
4576 field: Box::new(SettingField {
4577 pick: |settings_content| {
4578 language_settings_field(settings_content, |language| &language.linked_edits)
4579 },
4580 pick_mut: |settings_content| {
4581 language_settings_field_mut(settings_content, |language| {
4582 &mut language.linked_edits
4583 })
4584 },
4585 }),
4586 metadata: None,
4587 files: USER | LOCAL,
4588 }),
4589 SettingsPageItem::SectionHeader("Edit Predictions"),
4590 SettingsPageItem::SettingItem(SettingItem {
4591 title: "Show Edit Predictions",
4592 description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)",
4593 field: Box::new(SettingField {
4594 pick: |settings_content| {
4595 language_settings_field(settings_content, |language| {
4596 &language.show_edit_predictions
4597 })
4598 },
4599 pick_mut: |settings_content| {
4600 language_settings_field_mut(settings_content, |language| {
4601 &mut language.show_edit_predictions
4602 })
4603 },
4604 }),
4605 metadata: None,
4606 files: USER | LOCAL,
4607 }),
4608 SettingsPageItem::SettingItem(SettingItem {
4609 title: "Edit Predictions Disabled In",
4610 description: "Controls whether edit predictions are shown in the given language scopes",
4611 field: Box::new(
4612 SettingField {
4613 pick: |settings_content| {
4614 language_settings_field(settings_content, |language| {
4615 &language.edit_predictions_disabled_in
4616 })
4617 },
4618 pick_mut: |settings_content| {
4619 language_settings_field_mut(settings_content, |language| {
4620 &mut language.edit_predictions_disabled_in
4621 })
4622 },
4623 }
4624 .unimplemented(),
4625 ),
4626 metadata: None,
4627 files: USER | LOCAL,
4628 }),
4629 SettingsPageItem::SectionHeader("Whitespace"),
4630 SettingsPageItem::SettingItem(SettingItem {
4631 title: "Show Whitespaces",
4632 description: "Whether to show tabs and spaces in the editor",
4633 field: Box::new(SettingField {
4634 pick: |settings_content| {
4635 language_settings_field(settings_content, |language| &language.show_whitespaces)
4636 },
4637 pick_mut: |settings_content| {
4638 language_settings_field_mut(settings_content, |language| {
4639 &mut language.show_whitespaces
4640 })
4641 },
4642 }),
4643 metadata: None,
4644 files: USER | LOCAL,
4645 }),
4646 SettingsPageItem::SettingItem(SettingItem {
4647 title: "Space Whitespace Indicator",
4648 description: "Visible character used to render space characters when show_whitespaces is enabled (default: \"•\")",
4649 field: Box::new(
4650 SettingField {
4651 pick: |settings_content| {
4652 language_settings_field(settings_content, |language| {
4653 if let Some(whitespace_map) = &language.whitespace_map {
4654 &whitespace_map.space
4655 } else {
4656 &None
4657 }
4658 })
4659 },
4660 pick_mut: |settings_content| {
4661 language_settings_field_mut(settings_content, |language| {
4662 &mut language.whitespace_map.get_or_insert_default().space
4663 })
4664 },
4665 }
4666 .unimplemented(),
4667 ),
4668 metadata: None,
4669 files: USER | LOCAL,
4670 }),
4671 SettingsPageItem::SettingItem(SettingItem {
4672 title: "Tab Whitespace Indicator",
4673 description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"→\")",
4674 field: Box::new(
4675 SettingField {
4676 pick: |settings_content| {
4677 language_settings_field(settings_content, |language| {
4678 if let Some(whitespace_map) = &language.whitespace_map {
4679 &whitespace_map.tab
4680 } else {
4681 &None
4682 }
4683 })
4684 },
4685 pick_mut: |settings_content| {
4686 language_settings_field_mut(settings_content, |language| {
4687 &mut language.whitespace_map.get_or_insert_default().tab
4688 })
4689 },
4690 }
4691 .unimplemented(),
4692 ),
4693 metadata: None,
4694 files: USER | LOCAL,
4695 }),
4696 SettingsPageItem::SectionHeader("Completions"),
4697 SettingsPageItem::SettingItem(SettingItem {
4698 title: "Show Completions On Input",
4699 description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
4700 field: Box::new(SettingField {
4701 pick: |settings_content| {
4702 language_settings_field(settings_content, |language| {
4703 &language.show_completions_on_input
4704 })
4705 },
4706 pick_mut: |settings_content| {
4707 language_settings_field_mut(settings_content, |language| {
4708 &mut language.show_completions_on_input
4709 })
4710 },
4711 }),
4712 metadata: None,
4713 files: USER | LOCAL,
4714 }),
4715 SettingsPageItem::SettingItem(SettingItem {
4716 title: "Show Completion Documentation",
4717 description: "Whether to display inline and alongside documentation for items in the completions menu",
4718 field: Box::new(SettingField {
4719 pick: |settings_content| {
4720 language_settings_field(settings_content, |language| {
4721 &language.show_completion_documentation
4722 })
4723 },
4724 pick_mut: |settings_content| {
4725 language_settings_field_mut(settings_content, |language| {
4726 &mut language.show_completion_documentation
4727 })
4728 },
4729 }),
4730 metadata: None,
4731 files: USER | LOCAL,
4732 }),
4733 SettingsPageItem::SettingItem(SettingItem {
4734 title: "Words",
4735 description: "Controls how words are completed",
4736 field: Box::new(SettingField {
4737 pick: |settings_content| {
4738 language_settings_field(settings_content, |language| {
4739 if let Some(completions) = &language.completions {
4740 &completions.words
4741 } else {
4742 &None
4743 }
4744 })
4745 },
4746 pick_mut: |settings_content| {
4747 language_settings_field_mut(settings_content, |language| {
4748 &mut language.completions.get_or_insert_default().words
4749 })
4750 },
4751 }),
4752 metadata: None,
4753 files: USER | LOCAL,
4754 }),
4755 SettingsPageItem::SettingItem(SettingItem {
4756 title: "Words Min Length",
4757 description: "How many characters has to be in the completions query to automatically show the words-based completions",
4758 field: Box::new(SettingField {
4759 pick: |settings_content| {
4760 language_settings_field(settings_content, |language| {
4761 if let Some(completions) = &language.completions {
4762 &completions.words_min_length
4763 } else {
4764 &None
4765 }
4766 })
4767 },
4768 pick_mut: |settings_content| {
4769 language_settings_field_mut(settings_content, |language| {
4770 &mut language
4771 .completions
4772 .get_or_insert_default()
4773 .words_min_length
4774 })
4775 },
4776 }),
4777 metadata: None,
4778 files: USER | LOCAL,
4779 }),
4780 SettingsPageItem::SettingItem(SettingItem {
4781 title: "Lsp",
4782 description: "Whether to fetch LSP completions or not",
4783 field: Box::new(SettingField {
4784 pick: |settings_content| {
4785 language_settings_field(settings_content, |language| {
4786 if let Some(completions) = &language.completions {
4787 &completions.lsp
4788 } else {
4789 &None
4790 }
4791 })
4792 },
4793 pick_mut: |settings_content| {
4794 language_settings_field_mut(settings_content, |language| {
4795 &mut language.completions.get_or_insert_default().lsp
4796 })
4797 },
4798 }),
4799 metadata: None,
4800 files: USER | LOCAL,
4801 }),
4802 SettingsPageItem::SettingItem(SettingItem {
4803 title: "Lsp Fetch Timeout Ms",
4804 description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)",
4805 field: Box::new(SettingField {
4806 pick: |settings_content| {
4807 language_settings_field(settings_content, |language| {
4808 if let Some(completions) = &language.completions {
4809 &completions.lsp_fetch_timeout_ms
4810 } else {
4811 &None
4812 }
4813 })
4814 },
4815 pick_mut: |settings_content| {
4816 language_settings_field_mut(settings_content, |language| {
4817 &mut language
4818 .completions
4819 .get_or_insert_default()
4820 .lsp_fetch_timeout_ms
4821 })
4822 },
4823 }),
4824 metadata: None,
4825 files: USER | LOCAL,
4826 }),
4827 SettingsPageItem::SettingItem(SettingItem {
4828 title: "Lsp Insert Mode",
4829 description: "Controls how LSP completions are inserted",
4830 field: Box::new(SettingField {
4831 pick: |settings_content| {
4832 language_settings_field(settings_content, |language| {
4833 if let Some(completions) = &language.completions {
4834 &completions.lsp_insert_mode
4835 } else {
4836 &None
4837 }
4838 })
4839 },
4840 pick_mut: |settings_content| {
4841 language_settings_field_mut(settings_content, |language| {
4842 &mut language.completions.get_or_insert_default().lsp_insert_mode
4843 })
4844 },
4845 }),
4846 metadata: None,
4847 files: USER | LOCAL,
4848 }),
4849 SettingsPageItem::SectionHeader("Inlay Hints"),
4850 SettingsPageItem::SettingItem(SettingItem {
4851 title: "Enabled",
4852 description: "Global switch to toggle hints on and off",
4853 field: Box::new(SettingField {
4854 pick: |settings_content| {
4855 language_settings_field(settings_content, |language| {
4856 if let Some(inlay_hints) = &language.inlay_hints {
4857 &inlay_hints.enabled
4858 } else {
4859 &None
4860 }
4861 })
4862 },
4863 pick_mut: |settings_content| {
4864 language_settings_field_mut(settings_content, |language| {
4865 &mut language.inlay_hints.get_or_insert_default().enabled
4866 })
4867 },
4868 }),
4869 metadata: None,
4870 files: USER | LOCAL,
4871 }),
4872 SettingsPageItem::SettingItem(SettingItem {
4873 title: "Show Value Hints",
4874 description: "Global switch to toggle inline values on and off when debugging",
4875 field: Box::new(SettingField {
4876 pick: |settings_content| {
4877 language_settings_field(settings_content, |language| {
4878 if let Some(inlay_hints) = &language.inlay_hints {
4879 &inlay_hints.show_value_hints
4880 } else {
4881 &None
4882 }
4883 })
4884 },
4885 pick_mut: |settings_content| {
4886 language_settings_field_mut(settings_content, |language| {
4887 &mut language
4888 .inlay_hints
4889 .get_or_insert_default()
4890 .show_value_hints
4891 })
4892 },
4893 }),
4894 metadata: None,
4895 files: USER | LOCAL,
4896 }),
4897 SettingsPageItem::SettingItem(SettingItem {
4898 title: "Show Type Hints",
4899 description: "Whether type hints should be shown",
4900 field: Box::new(SettingField {
4901 pick: |settings_content| {
4902 language_settings_field(settings_content, |language| {
4903 if let Some(inlay_hints) = &language.inlay_hints {
4904 &inlay_hints.show_type_hints
4905 } else {
4906 &None
4907 }
4908 })
4909 },
4910 pick_mut: |settings_content| {
4911 language_settings_field_mut(settings_content, |language| {
4912 &mut language.inlay_hints.get_or_insert_default().show_type_hints
4913 })
4914 },
4915 }),
4916 metadata: None,
4917 files: USER | LOCAL,
4918 }),
4919 SettingsPageItem::SettingItem(SettingItem {
4920 title: "Show Parameter Hints",
4921 description: "Whether parameter hints should be shown",
4922 field: Box::new(SettingField {
4923 pick: |settings_content| {
4924 language_settings_field(settings_content, |language| {
4925 if let Some(inlay_hints) = &language.inlay_hints {
4926 &inlay_hints.show_parameter_hints
4927 } else {
4928 &None
4929 }
4930 })
4931 },
4932 pick_mut: |settings_content| {
4933 language_settings_field_mut(settings_content, |language| {
4934 &mut language
4935 .inlay_hints
4936 .get_or_insert_default()
4937 .show_parameter_hints
4938 })
4939 },
4940 }),
4941 metadata: None,
4942 files: USER | LOCAL,
4943 }),
4944 SettingsPageItem::SettingItem(SettingItem {
4945 title: "Show Other Hints",
4946 description: "Whether other hints should be shown",
4947 field: Box::new(SettingField {
4948 pick: |settings_content| {
4949 language_settings_field(settings_content, |language| {
4950 if let Some(inlay_hints) = &language.inlay_hints {
4951 &inlay_hints.show_other_hints
4952 } else {
4953 &None
4954 }
4955 })
4956 },
4957 pick_mut: |settings_content| {
4958 language_settings_field_mut(settings_content, |language| {
4959 &mut language
4960 .inlay_hints
4961 .get_or_insert_default()
4962 .show_other_hints
4963 })
4964 },
4965 }),
4966 metadata: None,
4967 files: USER | LOCAL,
4968 }),
4969 SettingsPageItem::SettingItem(SettingItem {
4970 title: "Show Background",
4971 description: "Whether to show a background for inlay hints",
4972 field: Box::new(SettingField {
4973 pick: |settings_content| {
4974 language_settings_field(settings_content, |language| {
4975 if let Some(inlay_hints) = &language.inlay_hints {
4976 &inlay_hints.show_background
4977 } else {
4978 &None
4979 }
4980 })
4981 },
4982 pick_mut: |settings_content| {
4983 language_settings_field_mut(settings_content, |language| {
4984 &mut language.inlay_hints.get_or_insert_default().show_background
4985 })
4986 },
4987 }),
4988 metadata: None,
4989 files: USER | LOCAL,
4990 }),
4991 SettingsPageItem::SettingItem(SettingItem {
4992 title: "Edit Debounce Ms",
4993 description: "Whether or not to debounce inlay hints updates after buffer edits (set to 0 to disable debouncing)",
4994 field: Box::new(SettingField {
4995 pick: |settings_content| {
4996 language_settings_field(settings_content, |language| {
4997 if let Some(inlay_hints) = &language.inlay_hints {
4998 &inlay_hints.edit_debounce_ms
4999 } else {
5000 &None
5001 }
5002 })
5003 },
5004 pick_mut: |settings_content| {
5005 language_settings_field_mut(settings_content, |language| {
5006 &mut language
5007 .inlay_hints
5008 .get_or_insert_default()
5009 .edit_debounce_ms
5010 })
5011 },
5012 }),
5013 metadata: None,
5014 files: USER | LOCAL,
5015 }),
5016 SettingsPageItem::SettingItem(SettingItem {
5017 title: "Scroll Debounce Ms",
5018 description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)",
5019 field: Box::new(SettingField {
5020 pick: |settings_content| {
5021 language_settings_field(settings_content, |language| {
5022 if let Some(inlay_hints) = &language.inlay_hints {
5023 &inlay_hints.scroll_debounce_ms
5024 } else {
5025 &None
5026 }
5027 })
5028 },
5029 pick_mut: |settings_content| {
5030 language_settings_field_mut(settings_content, |language| {
5031 &mut language
5032 .inlay_hints
5033 .get_or_insert_default()
5034 .scroll_debounce_ms
5035 })
5036 },
5037 }),
5038 metadata: None,
5039 files: USER | LOCAL,
5040 }),
5041 SettingsPageItem::SettingItem(SettingItem {
5042 title: "Toggle On Modifiers Press",
5043 description: "Toggles inlay hints (hides or shows) when the user presses the modifiers specified",
5044 field: Box::new(
5045 SettingField {
5046 pick: |settings_content| {
5047 language_settings_field(settings_content, |language| {
5048 if let Some(inlay_hints) = &language.inlay_hints {
5049 &inlay_hints.toggle_on_modifiers_press
5050 } else {
5051 &None
5052 }
5053 })
5054 },
5055 pick_mut: |settings_content| {
5056 language_settings_field_mut(settings_content, |language| {
5057 &mut language
5058 .inlay_hints
5059 .get_or_insert_default()
5060 .toggle_on_modifiers_press
5061 })
5062 },
5063 }
5064 .unimplemented(),
5065 ),
5066 metadata: None,
5067 files: USER | LOCAL,
5068 }),
5069 SettingsPageItem::SectionHeader("Tasks"),
5070 SettingsPageItem::SettingItem(SettingItem {
5071 title: "Enabled",
5072 description: "Whether tasks are enabled for this language",
5073 field: Box::new(SettingField {
5074 pick: |settings_content| {
5075 language_settings_field(settings_content, |language| {
5076 if let Some(tasks) = &language.tasks {
5077 &tasks.enabled
5078 } else {
5079 &None
5080 }
5081 })
5082 },
5083 pick_mut: |settings_content| {
5084 language_settings_field_mut(settings_content, |language| {
5085 &mut language.tasks.get_or_insert_default().enabled
5086 })
5087 },
5088 }),
5089 metadata: None,
5090 files: USER | LOCAL,
5091 }),
5092 SettingsPageItem::SettingItem(SettingItem {
5093 title: "Variables",
5094 description: "Extra task variables to set for a particular language",
5095 field: Box::new(
5096 SettingField {
5097 pick: |settings_content| {
5098 language_settings_field(settings_content, |language| {
5099 if let Some(tasks) = &language.tasks {
5100 &tasks.variables
5101 } else {
5102 &None
5103 }
5104 })
5105 },
5106 pick_mut: |settings_content| {
5107 language_settings_field_mut(settings_content, |language| {
5108 &mut language.tasks.get_or_insert_default().variables
5109 })
5110 },
5111 }
5112 .unimplemented(),
5113 ),
5114 metadata: None,
5115 files: USER | LOCAL,
5116 }),
5117 SettingsPageItem::SettingItem(SettingItem {
5118 title: "Prefer Lsp",
5119 description: "Use LSP tasks over Zed language extension ones",
5120 field: Box::new(SettingField {
5121 pick: |settings_content| {
5122 language_settings_field(settings_content, |language| {
5123 if let Some(tasks) = &language.tasks {
5124 &tasks.prefer_lsp
5125 } else {
5126 &None
5127 }
5128 })
5129 },
5130 pick_mut: |settings_content| {
5131 language_settings_field_mut(settings_content, |language| {
5132 &mut language.tasks.get_or_insert_default().prefer_lsp
5133 })
5134 },
5135 }),
5136 metadata: None,
5137 files: USER | LOCAL,
5138 }),
5139 SettingsPageItem::SectionHeader("Miscellaneous"),
5140 SettingsPageItem::SettingItem(SettingItem {
5141 title: "Debuggers",
5142 description: "Preferred debuggers for this language",
5143 field: Box::new(
5144 SettingField {
5145 pick: |settings_content| {
5146 language_settings_field(settings_content, |language| &language.debuggers)
5147 },
5148 pick_mut: |settings_content| {
5149 language_settings_field_mut(settings_content, |language| {
5150 &mut language.debuggers
5151 })
5152 },
5153 }
5154 .unimplemented(),
5155 ),
5156 metadata: None,
5157 files: USER | LOCAL,
5158 }),
5159 SettingsPageItem::SettingItem(SettingItem {
5160 title: "Extend Comment On Newline",
5161 description: "Whether to start a new line with a comment when a previous line is a comment as well",
5162 field: Box::new(SettingField {
5163 pick: |settings_content| {
5164 language_settings_field(settings_content, |language| {
5165 &language.extend_comment_on_newline
5166 })
5167 },
5168 pick_mut: |settings_content| {
5169 language_settings_field_mut(settings_content, |language| {
5170 &mut language.extend_comment_on_newline
5171 })
5172 },
5173 }),
5174 metadata: None,
5175 files: USER | LOCAL,
5176 }),
5177 ]
5178}