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