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