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