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