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::SectionHeader("Terminal Panel"),
2661 SettingsPageItem::SettingItem(SettingItem {
2662 title: "Terminal Dock",
2663 description: "Where to dock the terminal panel",
2664 field: Box::new(SettingField {
2665 pick: |settings_content| {
2666 if let Some(terminal) = &settings_content.terminal {
2667 &terminal.dock
2668 } else {
2669 &None
2670 }
2671 },
2672 pick_mut: |settings_content| {
2673 &mut settings_content.terminal.get_or_insert_default().dock
2674 },
2675 }),
2676 metadata: None,
2677 files: USER,
2678 }),
2679 SettingsPageItem::SectionHeader("Outline Panel"),
2680 SettingsPageItem::SettingItem(SettingItem {
2681 title: "Outline Panel Button",
2682 description: "Show the outline panel button in the status bar",
2683 field: Box::new(SettingField {
2684 pick: |settings_content| {
2685 if let Some(outline_panel) = &settings_content.outline_panel {
2686 &outline_panel.button
2687 } else {
2688 &None
2689 }
2690 },
2691 pick_mut: |settings_content| {
2692 &mut settings_content
2693 .outline_panel
2694 .get_or_insert_default()
2695 .button
2696 },
2697 }),
2698 metadata: None,
2699 files: USER,
2700 }),
2701 SettingsPageItem::SettingItem(SettingItem {
2702 title: "Outline Panel Dock",
2703 description: "Where to dock the outline panel",
2704 field: Box::new(SettingField {
2705 pick: |settings_content| {
2706 if let Some(outline_panel) = &settings_content.outline_panel {
2707 &outline_panel.dock
2708 } else {
2709 &None
2710 }
2711 },
2712 pick_mut: |settings_content| {
2713 &mut settings_content.outline_panel.get_or_insert_default().dock
2714 },
2715 }),
2716 metadata: None,
2717 files: USER,
2718 }),
2719 SettingsPageItem::SettingItem(SettingItem {
2720 title: "Outline Panel Default Width",
2721 description: "Default width of the outline panel in pixels",
2722 field: Box::new(SettingField {
2723 pick: |settings_content| {
2724 if let Some(outline_panel) = &settings_content.outline_panel {
2725 &outline_panel.default_width
2726 } else {
2727 &None
2728 }
2729 },
2730 pick_mut: |settings_content| {
2731 &mut settings_content
2732 .outline_panel
2733 .get_or_insert_default()
2734 .default_width
2735 },
2736 }),
2737 metadata: None,
2738 files: USER,
2739 }),
2740 SettingsPageItem::SettingItem(SettingItem {
2741 title: "File Icons",
2742 description: "Show file icons in the outline panel",
2743 field: Box::new(SettingField {
2744 pick: |settings_content| {
2745 if let Some(outline_panel) = &settings_content.outline_panel {
2746 &outline_panel.file_icons
2747 } else {
2748 &None
2749 }
2750 },
2751 pick_mut: |settings_content| {
2752 &mut settings_content
2753 .outline_panel
2754 .get_or_insert_default()
2755 .file_icons
2756 },
2757 }),
2758 metadata: None,
2759 files: USER,
2760 }),
2761 SettingsPageItem::SettingItem(SettingItem {
2762 title: "Folder Icons",
2763 description: "Whether to show folder icons or chevrons for directories 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.folder_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 .folder_icons
2777 },
2778 }),
2779 metadata: None,
2780 files: USER,
2781 }),
2782 SettingsPageItem::SettingItem(SettingItem {
2783 title: "Git Status",
2784 description: "Show the git status 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.git_status
2789 } else {
2790 &None
2791 }
2792 },
2793 pick_mut: |settings_content| {
2794 &mut settings_content
2795 .outline_panel
2796 .get_or_insert_default()
2797 .git_status
2798 },
2799 }),
2800 metadata: None,
2801 files: USER,
2802 }),
2803 SettingsPageItem::SettingItem(SettingItem {
2804 title: "Indent Size",
2805 description: "Amount of indentation for nested items",
2806 field: Box::new(SettingField {
2807 pick: |settings_content| {
2808 if let Some(outline_panel) = &settings_content.outline_panel {
2809 &outline_panel.indent_size
2810 } else {
2811 &None
2812 }
2813 },
2814 pick_mut: |settings_content| {
2815 &mut settings_content
2816 .outline_panel
2817 .get_or_insert_default()
2818 .indent_size
2819 },
2820 }),
2821 metadata: None,
2822 files: USER,
2823 }),
2824 SettingsPageItem::SettingItem(SettingItem {
2825 title: "Auto Reveal Entries",
2826 description: "Whether to reveal when a corresponding outline entry becomes active",
2827 field: Box::new(SettingField {
2828 pick: |settings_content| {
2829 if let Some(outline_panel) = &settings_content.outline_panel {
2830 &outline_panel.auto_reveal_entries
2831 } else {
2832 &None
2833 }
2834 },
2835 pick_mut: |settings_content| {
2836 &mut settings_content
2837 .outline_panel
2838 .get_or_insert_default()
2839 .auto_reveal_entries
2840 },
2841 }),
2842 metadata: None,
2843 files: USER,
2844 }),
2845 SettingsPageItem::SettingItem(SettingItem {
2846 title: "Auto Fold Directories",
2847 description: "Whether to fold directories automatically when a directory contains only one subdirectory",
2848 field: Box::new(SettingField {
2849 pick: |settings_content| {
2850 if let Some(outline_panel) = &settings_content.outline_panel {
2851 &outline_panel.auto_fold_dirs
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_fold_dirs
2861 },
2862 }),
2863 metadata: None,
2864 files: USER,
2865 }),
2866 SettingsPageItem::SettingItem(SettingItem {
2867 files: USER,
2868 title: "Indent Guides Show",
2869 description: "When to show indent guides in the outline panel",
2870 field: Box::new(
2871 SettingField {
2872 pick: |settings_content| {
2873 if let Some(outline_panel) = &settings_content.outline_panel {
2874 if let Some(indent_guides) = &outline_panel.indent_guides {
2875 &indent_guides.show
2876 } else {
2877 &None
2878 }
2879 } else {
2880 &None
2881 }
2882 },
2883 pick_mut: |settings_content| {
2884 &mut settings_content
2885 .outline_panel
2886 .get_or_insert_default()
2887 .indent_guides
2888 .get_or_insert_default()
2889 .show
2890 },
2891 }
2892 .unimplemented(),
2893 ),
2894 metadata: None,
2895 }),
2896 SettingsPageItem::SectionHeader("Git Panel"),
2897 SettingsPageItem::SettingItem(SettingItem {
2898 title: "Git Panel Button",
2899 description: "Show the Git panel button in the status bar",
2900 field: Box::new(SettingField {
2901 pick: |settings_content| {
2902 if let Some(git_panel) = &settings_content.git_panel {
2903 &git_panel.button
2904 } else {
2905 &None
2906 }
2907 },
2908 pick_mut: |settings_content| {
2909 &mut settings_content.git_panel.get_or_insert_default().button
2910 },
2911 }),
2912 metadata: None,
2913 files: USER,
2914 }),
2915 SettingsPageItem::SettingItem(SettingItem {
2916 title: "Git Panel Dock",
2917 description: "Where to dock the Git panel",
2918 field: Box::new(SettingField {
2919 pick: |settings_content| {
2920 if let Some(git_panel) = &settings_content.git_panel {
2921 &git_panel.dock
2922 } else {
2923 &None
2924 }
2925 },
2926 pick_mut: |settings_content| {
2927 &mut settings_content.git_panel.get_or_insert_default().dock
2928 },
2929 }),
2930 metadata: None,
2931 files: USER,
2932 }),
2933 SettingsPageItem::SettingItem(SettingItem {
2934 title: "Git Panel Default Width",
2935 description: "Default width of the Git panel in pixels",
2936 field: Box::new(SettingField {
2937 pick: |settings_content| {
2938 if let Some(git_panel) = &settings_content.git_panel {
2939 &git_panel.default_width
2940 } else {
2941 &None
2942 }
2943 },
2944 pick_mut: |settings_content| {
2945 &mut settings_content
2946 .git_panel
2947 .get_or_insert_default()
2948 .default_width
2949 },
2950 }),
2951 metadata: None,
2952 files: USER,
2953 }),
2954 SettingsPageItem::SectionHeader("Debugger Panel"),
2955 SettingsPageItem::SettingItem(SettingItem {
2956 title: "Debugger Panel Dock",
2957 description: "The dock position of the debug panel",
2958 field: Box::new(SettingField {
2959 pick: |settings_content| {
2960 if let Some(debugger) = &settings_content.debugger {
2961 &debugger.dock
2962 } else {
2963 &None
2964 }
2965 },
2966 pick_mut: |settings_content| {
2967 &mut settings_content.debugger.get_or_insert_default().dock
2968 },
2969 }),
2970 metadata: None,
2971 files: USER,
2972 }),
2973 SettingsPageItem::SectionHeader("Notification Panel"),
2974 SettingsPageItem::SettingItem(SettingItem {
2975 title: "Notification Panel Button",
2976 description: "Show the notification panel button in the status bar",
2977 field: Box::new(SettingField {
2978 pick: |settings_content| {
2979 if let Some(notification_panel) = &settings_content.notification_panel {
2980 ¬ification_panel.button
2981 } else {
2982 &None
2983 }
2984 },
2985 pick_mut: |settings_content| {
2986 &mut settings_content
2987 .notification_panel
2988 .get_or_insert_default()
2989 .button
2990 },
2991 }),
2992 metadata: None,
2993 files: USER,
2994 }),
2995 SettingsPageItem::SettingItem(SettingItem {
2996 title: "Notification Panel Dock",
2997 description: "Where to dock the notification panel",
2998 field: Box::new(SettingField {
2999 pick: |settings_content| {
3000 if let Some(notification_panel) = &settings_content.notification_panel {
3001 ¬ification_panel.dock
3002 } else {
3003 &None
3004 }
3005 },
3006 pick_mut: |settings_content| {
3007 &mut settings_content
3008 .notification_panel
3009 .get_or_insert_default()
3010 .dock
3011 },
3012 }),
3013 metadata: None,
3014 files: USER,
3015 }),
3016 SettingsPageItem::SettingItem(SettingItem {
3017 title: "Notification Panel Default Width",
3018 description: "Default width of the notification panel in pixels",
3019 field: Box::new(SettingField {
3020 pick: |settings_content| {
3021 if let Some(notification_panel) = &settings_content.notification_panel {
3022 ¬ification_panel.default_width
3023 } else {
3024 &None
3025 }
3026 },
3027 pick_mut: |settings_content| {
3028 &mut settings_content
3029 .notification_panel
3030 .get_or_insert_default()
3031 .default_width
3032 },
3033 }),
3034 metadata: None,
3035 files: USER,
3036 }),
3037 SettingsPageItem::SectionHeader("Collaboration Panel"),
3038 SettingsPageItem::SettingItem(SettingItem {
3039 title: "Collaboration Panel Button",
3040 description: "Show the collaboration panel button in the status bar",
3041 field: Box::new(SettingField {
3042 pick: |settings_content| {
3043 if let Some(collaboration_panel) = &settings_content.collaboration_panel
3044 {
3045 &collaboration_panel.button
3046 } else {
3047 &None
3048 }
3049 },
3050 pick_mut: |settings_content| {
3051 &mut settings_content
3052 .collaboration_panel
3053 .get_or_insert_default()
3054 .button
3055 },
3056 }),
3057 metadata: None,
3058 files: USER,
3059 }),
3060 SettingsPageItem::SettingItem(SettingItem {
3061 title: "Collaboration Panel Dock",
3062 description: "Where to dock the collaboration panel",
3063 field: Box::new(SettingField {
3064 pick: |settings_content| {
3065 if let Some(collaboration_panel) = &settings_content.collaboration_panel
3066 {
3067 &collaboration_panel.dock
3068 } else {
3069 &None
3070 }
3071 },
3072 pick_mut: |settings_content| {
3073 &mut settings_content
3074 .collaboration_panel
3075 .get_or_insert_default()
3076 .dock
3077 },
3078 }),
3079 metadata: None,
3080 files: USER,
3081 }),
3082 SettingsPageItem::SettingItem(SettingItem {
3083 title: "Collaboration Panel Default Width",
3084 description: "Default width of the collaboration panel in pixels",
3085 field: Box::new(SettingField {
3086 pick: |settings_content| {
3087 if let Some(collaboration_panel) = &settings_content.collaboration_panel
3088 {
3089 &collaboration_panel.default_width
3090 } else {
3091 &None
3092 }
3093 },
3094 pick_mut: |settings_content| {
3095 &mut settings_content
3096 .collaboration_panel
3097 .get_or_insert_default()
3098 .default_width
3099 },
3100 }),
3101 metadata: None,
3102 files: USER,
3103 }),
3104 ],
3105 },
3106 SettingsPage {
3107 title: "Debugger",
3108 items: vec![
3109 SettingsPageItem::SectionHeader("General"),
3110 SettingsPageItem::SettingItem(SettingItem {
3111 title: "Stepping Granularity",
3112 description: "Determines the stepping granularity for debug operations",
3113 field: Box::new(SettingField {
3114 pick: |settings_content| {
3115 if let Some(debugger) = &settings_content.debugger {
3116 &debugger.stepping_granularity
3117 } else {
3118 &None
3119 }
3120 },
3121 pick_mut: |settings_content| {
3122 &mut settings_content
3123 .debugger
3124 .get_or_insert_default()
3125 .stepping_granularity
3126 },
3127 }),
3128 metadata: None,
3129 files: USER,
3130 }),
3131 SettingsPageItem::SettingItem(SettingItem {
3132 title: "Save Breakpoints",
3133 description: "Whether breakpoints should be reused across Zed sessions",
3134 field: Box::new(SettingField {
3135 pick: |settings_content| {
3136 if let Some(debugger) = &settings_content.debugger {
3137 &debugger.save_breakpoints
3138 } else {
3139 &None
3140 }
3141 },
3142 pick_mut: |settings_content| {
3143 &mut settings_content
3144 .debugger
3145 .get_or_insert_default()
3146 .save_breakpoints
3147 },
3148 }),
3149 metadata: None,
3150 files: USER,
3151 }),
3152 SettingsPageItem::SettingItem(SettingItem {
3153 title: "Timeout",
3154 description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
3155 field: Box::new(SettingField {
3156 pick: |settings_content| {
3157 if let Some(debugger) = &settings_content.debugger {
3158 &debugger.timeout
3159 } else {
3160 &None
3161 }
3162 },
3163 pick_mut: |settings_content| {
3164 &mut settings_content.debugger.get_or_insert_default().timeout
3165 },
3166 }),
3167 metadata: None,
3168 files: USER,
3169 }),
3170 SettingsPageItem::SettingItem(SettingItem {
3171 title: "Log DAP Communications",
3172 description: "Whether to log messages between active debug adapters and Zed",
3173 field: Box::new(SettingField {
3174 pick: |settings_content| {
3175 if let Some(debugger) = &settings_content.debugger {
3176 &debugger.log_dap_communications
3177 } else {
3178 &None
3179 }
3180 },
3181 pick_mut: |settings_content| {
3182 &mut settings_content
3183 .debugger
3184 .get_or_insert_default()
3185 .log_dap_communications
3186 },
3187 }),
3188 metadata: None,
3189 files: USER,
3190 }),
3191 SettingsPageItem::SettingItem(SettingItem {
3192 title: "Format DAP Log Messages",
3193 description: "Whether to format DAP messages when adding them to debug adapter logger",
3194 field: Box::new(SettingField {
3195 pick: |settings_content| {
3196 if let Some(debugger) = &settings_content.debugger {
3197 &debugger.format_dap_log_messages
3198 } else {
3199 &None
3200 }
3201 },
3202 pick_mut: |settings_content| {
3203 &mut settings_content
3204 .debugger
3205 .get_or_insert_default()
3206 .format_dap_log_messages
3207 },
3208 }),
3209 metadata: None,
3210 files: USER,
3211 }),
3212 ],
3213 },
3214 SettingsPage {
3215 title: "Terminal",
3216 items: vec![
3217 SettingsPageItem::SectionHeader("Environment"),
3218 SettingsPageItem::SettingItem(SettingItem {
3219 title: "Shell",
3220 description: "What shell to use when opening a terminal",
3221 field: Box::new(
3222 SettingField {
3223 pick: |settings_content| {
3224 if let Some(terminal) = &settings_content.terminal {
3225 &terminal.project.shell
3226 } else {
3227 &None
3228 }
3229 },
3230 pick_mut: |settings_content| {
3231 &mut settings_content
3232 .terminal
3233 .get_or_insert_default()
3234 .project
3235 .shell
3236 },
3237 }
3238 .unimplemented(),
3239 ),
3240 metadata: None,
3241 files: USER | LOCAL,
3242 }),
3243 SettingsPageItem::SettingItem(SettingItem {
3244 title: "Working Directory",
3245 description: "What working directory to use when launching the terminal",
3246 field: Box::new(
3247 SettingField {
3248 pick: |settings_content| {
3249 if let Some(terminal) = &settings_content.terminal {
3250 &terminal.project.working_directory
3251 } else {
3252 &None
3253 }
3254 },
3255 pick_mut: |settings_content| {
3256 &mut settings_content
3257 .terminal
3258 .get_or_insert_default()
3259 .project
3260 .working_directory
3261 },
3262 }
3263 .unimplemented(),
3264 ),
3265 metadata: None,
3266 files: USER | LOCAL,
3267 }),
3268 SettingsPageItem::SettingItem(SettingItem {
3269 title: "Environment Variables",
3270 description: "Key-value pairs to add to the terminal's environment",
3271 field: Box::new(
3272 SettingField {
3273 pick: |settings_content| {
3274 if let Some(terminal) = &settings_content.terminal {
3275 &terminal.project.env
3276 } else {
3277 &None
3278 }
3279 },
3280 pick_mut: |settings_content| {
3281 &mut settings_content
3282 .terminal
3283 .get_or_insert_default()
3284 .project
3285 .env
3286 },
3287 }
3288 .unimplemented(),
3289 ),
3290 metadata: None,
3291 files: USER | LOCAL,
3292 }),
3293 SettingsPageItem::SettingItem(SettingItem {
3294 title: "Detect Virtual Environment",
3295 description: "Activates the python virtual environment, if one is found, in the terminal's working directory",
3296 field: Box::new(
3297 SettingField {
3298 pick: |settings_content| {
3299 if let Some(terminal) = &settings_content.terminal {
3300 &terminal.project.detect_venv
3301 } else {
3302 &None
3303 }
3304 },
3305 pick_mut: |settings_content| {
3306 &mut settings_content
3307 .terminal
3308 .get_or_insert_default()
3309 .project
3310 .detect_venv
3311 },
3312 }
3313 .unimplemented(),
3314 ),
3315 metadata: None,
3316 files: USER | LOCAL,
3317 }),
3318 SettingsPageItem::SectionHeader("Font"),
3319 SettingsPageItem::SettingItem(SettingItem {
3320 title: "Font Size",
3321 description: "Font size for terminal text. If not set, defaults to buffer font size",
3322 field: Box::new(SettingField {
3323 pick: |settings_content| {
3324 if let Some(terminal) = &settings_content.terminal {
3325 &terminal.font_size
3326 } else if settings_content.theme.buffer_font_size.is_some() {
3327 &settings_content.theme.buffer_font_size
3328 } else {
3329 &None
3330 }
3331 },
3332 pick_mut: |settings_content| {
3333 &mut settings_content.terminal.get_or_insert_default().font_size
3334 },
3335 }),
3336 metadata: None,
3337 files: USER,
3338 }),
3339 SettingsPageItem::SettingItem(SettingItem {
3340 title: "Font Family",
3341 description: "Font family for terminal text. If not set, defaults to buffer font family",
3342 field: Box::new(SettingField {
3343 pick: |settings_content| {
3344 if let Some(terminal) = &settings_content.terminal
3345 && terminal.font_family.is_some()
3346 {
3347 &terminal.font_family
3348 } else if settings_content.theme.buffer_font_family.is_some() {
3349 &settings_content.theme.buffer_font_family
3350 } else {
3351 &None
3352 }
3353 },
3354 pick_mut: |settings_content| {
3355 &mut settings_content
3356 .terminal
3357 .get_or_insert_default()
3358 .font_family
3359 },
3360 }),
3361 metadata: None,
3362 files: USER,
3363 }),
3364 SettingsPageItem::SettingItem(SettingItem {
3365 title: "Font Fallbacks",
3366 description: "Font fallbacks for terminal text. If not set, defaults to buffer font fallbacks",
3367 field: Box::new(
3368 SettingField {
3369 pick: |settings_content| {
3370 if let Some(terminal) = &settings_content.terminal {
3371 &terminal.font_fallbacks
3372 } else {
3373 &None
3374 }
3375 },
3376 pick_mut: |settings_content| {
3377 &mut settings_content
3378 .terminal
3379 .get_or_insert_default()
3380 .font_fallbacks
3381 },
3382 }
3383 .unimplemented(),
3384 ),
3385 metadata: None,
3386 files: USER,
3387 }),
3388 SettingsPageItem::SettingItem(SettingItem {
3389 title: "Font Weight",
3390 description: "Font weight for terminal text in CSS weight units (100-900)",
3391 field: Box::new(SettingField {
3392 pick: |settings_content| {
3393 if let Some(terminal) = &settings_content.terminal {
3394 &terminal.font_weight
3395 } else {
3396 &None
3397 }
3398 },
3399 pick_mut: |settings_content| {
3400 &mut settings_content
3401 .terminal
3402 .get_or_insert_default()
3403 .font_weight
3404 },
3405 }),
3406 metadata: None,
3407 files: USER,
3408 }),
3409 SettingsPageItem::SettingItem(SettingItem {
3410 title: "Font Features",
3411 description: "Font features for terminal text",
3412 field: Box::new(
3413 SettingField {
3414 pick: |settings_content| {
3415 if let Some(terminal) = &settings_content.terminal {
3416 &terminal.font_features
3417 } else {
3418 &None
3419 }
3420 },
3421 pick_mut: |settings_content| {
3422 &mut settings_content
3423 .terminal
3424 .get_or_insert_default()
3425 .font_features
3426 },
3427 }
3428 .unimplemented(),
3429 ),
3430 metadata: None,
3431 files: USER,
3432 }),
3433 SettingsPageItem::SectionHeader("Display Settings"),
3434 SettingsPageItem::SettingItem(SettingItem {
3435 title: "Line Height",
3436 description: "Line height for terminal text",
3437 field: Box::new(
3438 SettingField {
3439 pick: |settings_content| {
3440 if let Some(terminal) = &settings_content.terminal {
3441 &terminal.line_height
3442 } else {
3443 &None
3444 }
3445 },
3446 pick_mut: |settings_content| {
3447 &mut settings_content
3448 .terminal
3449 .get_or_insert_default()
3450 .line_height
3451 },
3452 }
3453 .unimplemented(),
3454 ),
3455 metadata: None,
3456 files: USER,
3457 }),
3458 SettingsPageItem::SettingItem(SettingItem {
3459 title: "Cursor Shape",
3460 description: "Default cursor shape for the terminal (bar, block, underline, or hollow)",
3461 field: Box::new(SettingField {
3462 pick: |settings_content| {
3463 if let Some(terminal) = &settings_content.terminal {
3464 &terminal.cursor_shape
3465 } else {
3466 &None
3467 }
3468 },
3469 pick_mut: |settings_content| {
3470 &mut settings_content
3471 .terminal
3472 .get_or_insert_default()
3473 .cursor_shape
3474 },
3475 }),
3476 metadata: None,
3477 files: USER,
3478 }),
3479 SettingsPageItem::SettingItem(SettingItem {
3480 title: "Cursor Blinking",
3481 description: "Sets the cursor blinking behavior in the terminal",
3482 field: Box::new(SettingField {
3483 pick: |settings_content| {
3484 if let Some(terminal) = &settings_content.terminal {
3485 &terminal.blinking
3486 } else {
3487 &None
3488 }
3489 },
3490 pick_mut: |settings_content| {
3491 &mut settings_content.terminal.get_or_insert_default().blinking
3492 },
3493 }),
3494 metadata: None,
3495 files: USER,
3496 }),
3497 SettingsPageItem::SettingItem(SettingItem {
3498 title: "Alternate Scroll",
3499 description: "Whether Alternate Scroll mode is active by default (converts mouse scroll to arrow keys in apps like vim)",
3500 field: Box::new(SettingField {
3501 pick: |settings_content| {
3502 if let Some(terminal) = &settings_content.terminal {
3503 &terminal.alternate_scroll
3504 } else {
3505 &None
3506 }
3507 },
3508 pick_mut: |settings_content| {
3509 &mut settings_content
3510 .terminal
3511 .get_or_insert_default()
3512 .alternate_scroll
3513 },
3514 }),
3515 metadata: None,
3516 files: USER,
3517 }),
3518 SettingsPageItem::SettingItem(SettingItem {
3519 title: "Minimum Contrast",
3520 description: "The minimum APCA perceptual contrast between foreground and background colors (0-106)",
3521 field: Box::new(SettingField {
3522 pick: |settings_content| {
3523 if let Some(terminal) = &settings_content.terminal {
3524 &terminal.minimum_contrast
3525 } else {
3526 &None
3527 }
3528 },
3529 pick_mut: |settings_content| {
3530 &mut settings_content
3531 .terminal
3532 .get_or_insert_default()
3533 .minimum_contrast
3534 },
3535 }),
3536 metadata: None,
3537 files: USER,
3538 }),
3539 SettingsPageItem::SectionHeader("Behavior Settings"),
3540 SettingsPageItem::SettingItem(SettingItem {
3541 title: "Option As Meta",
3542 description: "Whether the option key behaves as the meta key",
3543 field: Box::new(SettingField {
3544 pick: |settings_content| {
3545 if let Some(terminal) = &settings_content.terminal {
3546 &terminal.option_as_meta
3547 } else {
3548 &None
3549 }
3550 },
3551 pick_mut: |settings_content| {
3552 &mut settings_content
3553 .terminal
3554 .get_or_insert_default()
3555 .option_as_meta
3556 },
3557 }),
3558 metadata: None,
3559 files: USER,
3560 }),
3561 SettingsPageItem::SettingItem(SettingItem {
3562 title: "Copy On Select",
3563 description: "Whether selecting text in the terminal automatically copies to the system clipboard",
3564 field: Box::new(SettingField {
3565 pick: |settings_content| {
3566 if let Some(terminal) = &settings_content.terminal {
3567 &terminal.copy_on_select
3568 } else {
3569 &None
3570 }
3571 },
3572 pick_mut: |settings_content| {
3573 &mut settings_content
3574 .terminal
3575 .get_or_insert_default()
3576 .copy_on_select
3577 },
3578 }),
3579 metadata: None,
3580 files: USER,
3581 }),
3582 SettingsPageItem::SettingItem(SettingItem {
3583 title: "Keep Selection On Copy",
3584 description: "Whether to keep the text selection after copying it to the clipboard",
3585 field: Box::new(SettingField {
3586 pick: |settings_content| {
3587 if let Some(terminal) = &settings_content.terminal {
3588 &terminal.keep_selection_on_copy
3589 } else {
3590 &None
3591 }
3592 },
3593 pick_mut: |settings_content| {
3594 &mut settings_content
3595 .terminal
3596 .get_or_insert_default()
3597 .keep_selection_on_copy
3598 },
3599 }),
3600 metadata: None,
3601 files: USER,
3602 }),
3603 SettingsPageItem::SectionHeader("Layout Settings"),
3604 SettingsPageItem::SettingItem(SettingItem {
3605 title: "Default Width",
3606 description: "Default width when the terminal is docked to the left or right (in pixels)",
3607 field: Box::new(SettingField {
3608 pick: |settings_content| {
3609 if let Some(terminal) = &settings_content.terminal {
3610 &terminal.default_width
3611 } else {
3612 &None
3613 }
3614 },
3615 pick_mut: |settings_content| {
3616 &mut settings_content
3617 .terminal
3618 .get_or_insert_default()
3619 .default_width
3620 },
3621 }),
3622 metadata: None,
3623 files: USER,
3624 }),
3625 SettingsPageItem::SettingItem(SettingItem {
3626 title: "Default Height",
3627 description: "Default height when the terminal is docked to the bottom (in pixels)",
3628 field: Box::new(SettingField {
3629 pick: |settings_content| {
3630 if let Some(terminal) = &settings_content.terminal {
3631 &terminal.default_height
3632 } else {
3633 &None
3634 }
3635 },
3636 pick_mut: |settings_content| {
3637 &mut settings_content
3638 .terminal
3639 .get_or_insert_default()
3640 .default_height
3641 },
3642 }),
3643 metadata: None,
3644 files: USER,
3645 }),
3646 SettingsPageItem::SectionHeader("Advanced Settings"),
3647 SettingsPageItem::SettingItem(SettingItem {
3648 title: "Max Scroll History Lines",
3649 description: "Maximum number of lines to keep in scrollback history (max: 100,000; 0 disables scrolling)",
3650 field: Box::new(SettingField {
3651 pick: |settings_content| {
3652 if let Some(terminal) = &settings_content.terminal {
3653 &terminal.max_scroll_history_lines
3654 } else {
3655 &None
3656 }
3657 },
3658 pick_mut: |settings_content| {
3659 &mut settings_content
3660 .terminal
3661 .get_or_insert_default()
3662 .max_scroll_history_lines
3663 },
3664 }),
3665 metadata: None,
3666 files: USER,
3667 }),
3668 SettingsPageItem::SectionHeader("Toolbar"),
3669 SettingsPageItem::SettingItem(SettingItem {
3670 title: "Breadcrumbs",
3671 description: "Display the terminal title in breadcrumbs inside the terminal pane",
3672 field: Box::new(SettingField {
3673 pick: |settings_content| {
3674 if let Some(terminal) = &settings_content.terminal {
3675 if let Some(toolbar) = &terminal.toolbar {
3676 &toolbar.breadcrumbs
3677 } else {
3678 &None
3679 }
3680 } else {
3681 &None
3682 }
3683 },
3684 pick_mut: |settings_content| {
3685 &mut settings_content
3686 .terminal
3687 .get_or_insert_default()
3688 .toolbar
3689 .get_or_insert_default()
3690 .breadcrumbs
3691 },
3692 }),
3693 metadata: None,
3694 files: USER,
3695 }),
3696 SettingsPageItem::SectionHeader("Scrollbar"),
3697 SettingsPageItem::SettingItem(SettingItem {
3698 title: "Show Scrollbar",
3699 description: "When to show the scrollbar in the terminal",
3700 field: Box::new(SettingField {
3701 pick: |settings_content| {
3702 if let Some(terminal) = &settings_content.terminal
3703 && let Some(scrollbar) = &terminal.scrollbar
3704 && scrollbar.show.is_some()
3705 {
3706 &scrollbar.show
3707 } else if let Some(scrollbar) = &settings_content.editor.scrollbar {
3708 &scrollbar.show
3709 } else {
3710 &None
3711 }
3712 },
3713 pick_mut: |settings_content| {
3714 &mut settings_content
3715 .terminal
3716 .get_or_insert_default()
3717 .scrollbar
3718 .get_or_insert_default()
3719 .show
3720 },
3721 }),
3722 metadata: None,
3723 files: USER,
3724 }),
3725 ],
3726 },
3727 SettingsPage {
3728 title: "Version Control",
3729 items: vec![
3730 SettingsPageItem::SectionHeader("Git"),
3731 SettingsPageItem::SettingItem(SettingItem {
3732 title: "Git Gutter",
3733 description: "Control whether git status is shown in the editor's gutter",
3734 field: Box::new(SettingField {
3735 pick: |settings_content| {
3736 if let Some(git) = &settings_content.git {
3737 &git.git_gutter
3738 } else {
3739 &None
3740 }
3741 },
3742 pick_mut: |settings_content| {
3743 &mut settings_content.git.get_or_insert_default().git_gutter
3744 },
3745 }),
3746 metadata: None,
3747 files: USER,
3748 }),
3749 // todo(settings_ui): Figure out the right default for this value in default.json
3750 SettingsPageItem::SettingItem(SettingItem {
3751 title: "Gutter Debounce",
3752 description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
3753 field: Box::new(SettingField {
3754 pick: |settings_content| {
3755 if let Some(git) = &settings_content.git {
3756 &git.gutter_debounce
3757 } else {
3758 &None
3759 }
3760 },
3761 pick_mut: |settings_content| {
3762 &mut settings_content.git.get_or_insert_default().gutter_debounce
3763 },
3764 }),
3765 metadata: None,
3766 files: USER,
3767 }),
3768 SettingsPageItem::SettingItem(SettingItem {
3769 title: "Inline Git Blame",
3770 description: "Whether or not to show git blame data inline in the currently focused line",
3771 field: Box::new(SettingField {
3772 pick: |settings_content| {
3773 if let Some(git) = &settings_content.git {
3774 if let Some(inline_blame) = &git.inline_blame {
3775 &inline_blame.enabled
3776 } else {
3777 &None
3778 }
3779 } else {
3780 &None
3781 }
3782 },
3783 pick_mut: |settings_content| {
3784 &mut settings_content
3785 .git
3786 .get_or_insert_default()
3787 .inline_blame
3788 .get_or_insert_default()
3789 .enabled
3790 },
3791 }),
3792 metadata: None,
3793 files: USER,
3794 }),
3795 SettingsPageItem::SettingItem(SettingItem {
3796 title: "Inline Git Blame Delay",
3797 description: "The delay after which the inline blame information is shown",
3798 field: Box::new(SettingField {
3799 pick: |settings_content| {
3800 if let Some(git) = &settings_content.git {
3801 if let Some(inline_blame) = &git.inline_blame {
3802 &inline_blame.delay_ms
3803 } else {
3804 &None
3805 }
3806 } else {
3807 &None
3808 }
3809 },
3810 pick_mut: |settings_content| {
3811 &mut settings_content
3812 .git
3813 .get_or_insert_default()
3814 .inline_blame
3815 .get_or_insert_default()
3816 .delay_ms
3817 },
3818 }),
3819 metadata: None,
3820 files: USER,
3821 }),
3822 SettingsPageItem::SettingItem(SettingItem {
3823 title: "Inline Git Blame Padding",
3824 description: "Padding between the end of the source line and the start of the inline blame in columns",
3825 field: Box::new(SettingField {
3826 pick: |settings_content| {
3827 if let Some(git) = &settings_content.git {
3828 if let Some(inline_blame) = &git.inline_blame {
3829 &inline_blame.padding
3830 } else {
3831 &None
3832 }
3833 } else {
3834 &None
3835 }
3836 },
3837 pick_mut: |settings_content| {
3838 &mut settings_content
3839 .git
3840 .get_or_insert_default()
3841 .inline_blame
3842 .get_or_insert_default()
3843 .padding
3844 },
3845 }),
3846 metadata: None,
3847 files: USER,
3848 }),
3849 SettingsPageItem::SettingItem(SettingItem {
3850 title: "Inline Git Blame Min Column",
3851 description: "The minimum column number to show the inline blame information at",
3852 field: Box::new(SettingField {
3853 pick: |settings_content| {
3854 if let Some(git) = &settings_content.git {
3855 if let Some(inline_blame) = &git.inline_blame {
3856 &inline_blame.min_column
3857 } else {
3858 &None
3859 }
3860 } else {
3861 &None
3862 }
3863 },
3864 pick_mut: |settings_content| {
3865 &mut settings_content
3866 .git
3867 .get_or_insert_default()
3868 .inline_blame
3869 .get_or_insert_default()
3870 .min_column
3871 },
3872 }),
3873 metadata: None,
3874 files: USER,
3875 }),
3876 SettingsPageItem::SettingItem(SettingItem {
3877 title: "Show Commit Summary",
3878 description: "Show commit summary as part of the inline blame",
3879 field: Box::new(SettingField {
3880 pick: |settings_content| {
3881 if let Some(git) = &settings_content.git {
3882 if let Some(inline_blame) = &git.inline_blame {
3883 &inline_blame.show_commit_summary
3884 } else {
3885 &None
3886 }
3887 } else {
3888 &None
3889 }
3890 },
3891 pick_mut: |settings_content| {
3892 &mut settings_content
3893 .git
3894 .get_or_insert_default()
3895 .inline_blame
3896 .get_or_insert_default()
3897 .show_commit_summary
3898 },
3899 }),
3900 metadata: None,
3901 files: USER,
3902 }),
3903 SettingsPageItem::SettingItem(SettingItem {
3904 title: "Show Avatar",
3905 description: "Show the avatar of the author of the commit",
3906 field: Box::new(SettingField {
3907 pick: |settings_content| {
3908 if let Some(git) = &settings_content.git {
3909 if let Some(blame) = &git.blame {
3910 &blame.show_avatar
3911 } else {
3912 &None
3913 }
3914 } else {
3915 &None
3916 }
3917 },
3918 pick_mut: |settings_content| {
3919 &mut settings_content
3920 .git
3921 .get_or_insert_default()
3922 .blame
3923 .get_or_insert_default()
3924 .show_avatar
3925 },
3926 }),
3927 metadata: None,
3928 files: USER,
3929 }),
3930 SettingsPageItem::SettingItem(SettingItem {
3931 title: "Show Author Name In Branch Picker",
3932 description: "Show author name as part of the commit information in branch picker",
3933 field: Box::new(SettingField {
3934 pick: |settings_content| {
3935 if let Some(git) = &settings_content.git {
3936 if let Some(branch_picker) = &git.branch_picker {
3937 &branch_picker.show_author_name
3938 } else {
3939 &None
3940 }
3941 } else {
3942 &None
3943 }
3944 },
3945 pick_mut: |settings_content| {
3946 &mut settings_content
3947 .git
3948 .get_or_insert_default()
3949 .branch_picker
3950 .get_or_insert_default()
3951 .show_author_name
3952 },
3953 }),
3954 metadata: None,
3955 files: USER,
3956 }),
3957 SettingsPageItem::SettingItem(SettingItem {
3958 title: "Hunk Style",
3959 description: "How git hunks are displayed visually in the editor",
3960 field: Box::new(SettingField {
3961 pick: |settings_content| {
3962 if let Some(git) = &settings_content.git {
3963 &git.hunk_style
3964 } else {
3965 &None
3966 }
3967 },
3968 pick_mut: |settings_content| {
3969 &mut settings_content.git.get_or_insert_default().hunk_style
3970 },
3971 }),
3972 metadata: None,
3973 files: USER,
3974 }),
3975 ],
3976 },
3977 SettingsPage {
3978 title: "Diagnostics & Errors",
3979 items: vec![
3980 SettingsPageItem::SectionHeader("Filtering"),
3981 SettingsPageItem::SettingItem(SettingItem {
3982 title: "Max Severity",
3983 description: "Which level to use to filter out diagnostics displayed in the editor",
3984 field: Box::new(SettingField {
3985 pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
3986 pick_mut: |settings_content| {
3987 &mut settings_content.editor.diagnostics_max_severity
3988 },
3989 }),
3990 metadata: None,
3991 files: USER,
3992 }),
3993 SettingsPageItem::SettingItem(SettingItem {
3994 title: "Include Warnings",
3995 description: "Whether to show warnings or not by default",
3996 field: Box::new(SettingField {
3997 pick: |settings_content| {
3998 if let Some(diagnostics) = &settings_content.diagnostics {
3999 &diagnostics.include_warnings
4000 } else {
4001 &None
4002 }
4003 },
4004 pick_mut: |settings_content| {
4005 &mut settings_content
4006 .diagnostics
4007 .get_or_insert_default()
4008 .include_warnings
4009 },
4010 }),
4011 metadata: None,
4012 files: USER,
4013 }),
4014 SettingsPageItem::SectionHeader("Inline"),
4015 SettingsPageItem::SettingItem(SettingItem {
4016 title: "Inline Diagnostics Enabled",
4017 description: "Whether to show diagnostics inline or not",
4018 field: Box::new(SettingField {
4019 pick: |settings_content| {
4020 if let Some(diagnostics) = &settings_content.diagnostics {
4021 if let Some(inline) = &diagnostics.inline {
4022 &inline.enabled
4023 } else {
4024 &None
4025 }
4026 } else {
4027 &None
4028 }
4029 },
4030 pick_mut: |settings_content| {
4031 &mut settings_content
4032 .diagnostics
4033 .get_or_insert_default()
4034 .inline
4035 .get_or_insert_default()
4036 .enabled
4037 },
4038 }),
4039 metadata: None,
4040 files: USER,
4041 }),
4042 SettingsPageItem::SettingItem(SettingItem {
4043 title: "Inline Update Debounce",
4044 description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
4045 field: Box::new(SettingField {
4046 pick: |settings_content| {
4047 if let Some(diagnostics) = &settings_content.diagnostics {
4048 if let Some(inline) = &diagnostics.inline {
4049 &inline.update_debounce_ms
4050 } else {
4051 &None
4052 }
4053 } else {
4054 &None
4055 }
4056 },
4057 pick_mut: |settings_content| {
4058 &mut settings_content
4059 .diagnostics
4060 .get_or_insert_default()
4061 .inline
4062 .get_or_insert_default()
4063 .update_debounce_ms
4064 },
4065 }),
4066 metadata: None,
4067 files: USER,
4068 }),
4069 SettingsPageItem::SettingItem(SettingItem {
4070 title: "Inline Padding",
4071 description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
4072 field: Box::new(SettingField {
4073 pick: |settings_content| {
4074 if let Some(diagnostics) = &settings_content.diagnostics {
4075 if let Some(inline) = &diagnostics.inline {
4076 &inline.padding
4077 } else {
4078 &None
4079 }
4080 } else {
4081 &None
4082 }
4083 },
4084 pick_mut: |settings_content| {
4085 &mut settings_content
4086 .diagnostics
4087 .get_or_insert_default()
4088 .inline
4089 .get_or_insert_default()
4090 .padding
4091 },
4092 }),
4093 metadata: None,
4094 files: USER,
4095 }),
4096 SettingsPageItem::SettingItem(SettingItem {
4097 title: "Inline Min Column",
4098 description: "The minimum column to display inline diagnostics",
4099 field: Box::new(SettingField {
4100 pick: |settings_content| {
4101 if let Some(diagnostics) = &settings_content.diagnostics {
4102 if let Some(inline) = &diagnostics.inline {
4103 &inline.min_column
4104 } else {
4105 &None
4106 }
4107 } else {
4108 &None
4109 }
4110 },
4111 pick_mut: |settings_content| {
4112 &mut settings_content
4113 .diagnostics
4114 .get_or_insert_default()
4115 .inline
4116 .get_or_insert_default()
4117 .min_column
4118 },
4119 }),
4120 metadata: None,
4121 files: USER,
4122 }),
4123 SettingsPageItem::SectionHeader("Performance"),
4124 SettingsPageItem::SettingItem(SettingItem {
4125 title: "LSP Pull Diagnostics Enabled",
4126 description: "Whether to pull for language server-powered diagnostics or not",
4127 field: Box::new(SettingField {
4128 pick: |settings_content| {
4129 if let Some(diagnostics) = &settings_content.diagnostics {
4130 if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
4131 &lsp_pull.enabled
4132 } else {
4133 &None
4134 }
4135 } else {
4136 &None
4137 }
4138 },
4139 pick_mut: |settings_content| {
4140 &mut settings_content
4141 .diagnostics
4142 .get_or_insert_default()
4143 .lsp_pull_diagnostics
4144 .get_or_insert_default()
4145 .enabled
4146 },
4147 }),
4148 metadata: None,
4149 files: USER,
4150 }),
4151 // todo(settings_ui): Needs unit
4152 SettingsPageItem::SettingItem(SettingItem {
4153 title: "LSP Pull Debounce",
4154 description: "Minimum time to wait before pulling diagnostics from the language server(s)",
4155 field: Box::new(SettingField {
4156 pick: |settings_content| {
4157 if let Some(diagnostics) = &settings_content.diagnostics {
4158 if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
4159 &lsp_pull.debounce_ms
4160 } else {
4161 &None
4162 }
4163 } else {
4164 &None
4165 }
4166 },
4167 pick_mut: |settings_content| {
4168 &mut settings_content
4169 .diagnostics
4170 .get_or_insert_default()
4171 .lsp_pull_diagnostics
4172 .get_or_insert_default()
4173 .debounce_ms
4174 },
4175 }),
4176 metadata: None,
4177 files: USER,
4178 }),
4179 ],
4180 },
4181 SettingsPage {
4182 title: "Collaboration",
4183 items: vec![
4184 SettingsPageItem::SectionHeader("Calls"),
4185 SettingsPageItem::SettingItem(SettingItem {
4186 title: "Mute On Join",
4187 description: "Whether the microphone should be muted when joining a channel or a call",
4188 field: Box::new(SettingField {
4189 pick: |settings_content| {
4190 if let Some(calls) = &settings_content.calls {
4191 &calls.mute_on_join
4192 } else {
4193 &None
4194 }
4195 },
4196 pick_mut: |settings_content| {
4197 &mut settings_content.calls.get_or_insert_default().mute_on_join
4198 },
4199 }),
4200 metadata: None,
4201 files: USER,
4202 }),
4203 SettingsPageItem::SettingItem(SettingItem {
4204 title: "Share On Join",
4205 description: "Whether your current project should be shared when joining an empty channel",
4206 field: Box::new(SettingField {
4207 pick: |settings_content| {
4208 if let Some(calls) = &settings_content.calls {
4209 &calls.share_on_join
4210 } else {
4211 &None
4212 }
4213 },
4214 pick_mut: |settings_content| {
4215 &mut settings_content.calls.get_or_insert_default().share_on_join
4216 },
4217 }),
4218 metadata: None,
4219 files: USER,
4220 }),
4221 SettingsPageItem::SectionHeader("Experimental"),
4222 SettingsPageItem::SettingItem(SettingItem {
4223 title: "Rodio Audio",
4224 description: "Opt into the new audio system",
4225 field: Box::new(SettingField {
4226 pick: |settings_content| {
4227 if let Some(audio) = &settings_content.audio {
4228 &audio.rodio_audio
4229 } else {
4230 &None
4231 }
4232 },
4233 pick_mut: |settings_content| {
4234 &mut settings_content.audio.get_or_insert_default().rodio_audio
4235 },
4236 }),
4237 metadata: None,
4238 files: USER,
4239 }),
4240 SettingsPageItem::SettingItem(SettingItem {
4241 title: "Auto Microphone Volume",
4242 description: "Automatically adjust microphone volume (requires Rodio Audio)",
4243 field: Box::new(SettingField {
4244 pick: |settings_content| {
4245 if let Some(audio) = &settings_content.audio {
4246 &audio.auto_microphone_volume
4247 } else {
4248 &None
4249 }
4250 },
4251 pick_mut: |settings_content| {
4252 &mut settings_content
4253 .audio
4254 .get_or_insert_default()
4255 .auto_microphone_volume
4256 },
4257 }),
4258 metadata: None,
4259 files: USER,
4260 }),
4261 SettingsPageItem::SettingItem(SettingItem {
4262 title: "Auto Speaker Volume",
4263 description: "Automatically adjust volume of other call members (requires Rodio Audio)",
4264 field: Box::new(SettingField {
4265 pick: |settings_content| {
4266 if let Some(audio) = &settings_content.audio {
4267 &audio.auto_speaker_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_speaker_volume
4277 },
4278 }),
4279 metadata: None,
4280 files: USER,
4281 }),
4282 SettingsPageItem::SettingItem(SettingItem {
4283 title: "Denoise",
4284 description: "Remove background noises (requires Rodio Audio)",
4285 field: Box::new(SettingField {
4286 pick: |settings_content| {
4287 if let Some(audio) = &settings_content.audio {
4288 &audio.denoise
4289 } else {
4290 &None
4291 }
4292 },
4293 pick_mut: |settings_content| {
4294 &mut settings_content.audio.get_or_insert_default().denoise
4295 },
4296 }),
4297 metadata: None,
4298 files: USER,
4299 }),
4300 SettingsPageItem::SettingItem(SettingItem {
4301 title: "Legacy Audio Compatible",
4302 description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
4303 field: Box::new(SettingField {
4304 pick: |settings_content| {
4305 if let Some(audio) = &settings_content.audio {
4306 &audio.legacy_audio_compatible
4307 } else {
4308 &None
4309 }
4310 },
4311 pick_mut: |settings_content| {
4312 &mut settings_content
4313 .audio
4314 .get_or_insert_default()
4315 .legacy_audio_compatible
4316 },
4317 }),
4318 metadata: None,
4319 files: USER,
4320 }),
4321 ],
4322 },
4323 SettingsPage {
4324 title: "AI",
4325 items: vec![
4326 SettingsPageItem::SectionHeader("General"),
4327 SettingsPageItem::SettingItem(SettingItem {
4328 title: "Disable AI",
4329 description: "Whether to disable all AI features in Zed",
4330 field: Box::new(SettingField {
4331 pick: |settings_content| &settings_content.disable_ai,
4332 pick_mut: |settings_content| &mut settings_content.disable_ai,
4333 }),
4334 metadata: None,
4335 files: USER,
4336 }),
4337 ],
4338 },
4339 SettingsPage {
4340 title: "System & Network",
4341 items: vec![
4342 SettingsPageItem::SectionHeader("Network"),
4343 // todo(settings_ui): Proxy needs a default
4344 SettingsPageItem::SettingItem(SettingItem {
4345 title: "Proxy",
4346 description: "The proxy to use for network requests",
4347 field: Box::new(
4348 SettingField {
4349 pick: |settings_content| &settings_content.proxy,
4350 pick_mut: |settings_content| &mut settings_content.proxy,
4351 }
4352 .unimplemented(),
4353 ),
4354 metadata: Some(Box::new(SettingsFieldMetadata {
4355 placeholder: Some("socks5h://localhost:10808"),
4356 })),
4357 files: USER,
4358 }),
4359 SettingsPageItem::SettingItem(SettingItem {
4360 title: "Server URL",
4361 description: "The URL of the Zed server to connect to",
4362 field: Box::new(SettingField {
4363 pick: |settings_content| &settings_content.server_url,
4364 pick_mut: |settings_content| &mut settings_content.server_url,
4365 }),
4366 metadata: Some(Box::new(SettingsFieldMetadata {
4367 placeholder: Some("https://zed.dev"),
4368 })),
4369 files: USER,
4370 }),
4371 SettingsPageItem::SectionHeader("System"),
4372 SettingsPageItem::SettingItem(SettingItem {
4373 title: "Auto Update",
4374 description: "Whether or not to automatically check for updates",
4375 field: Box::new(SettingField {
4376 pick: |settings_content| &settings_content.auto_update,
4377 pick_mut: |settings_content| &mut settings_content.auto_update,
4378 }),
4379 metadata: None,
4380 files: USER,
4381 }),
4382 ],
4383 },
4384 ]
4385}
4386
4387const LANGUAGES_SECTION_HEADER: &'static str = "Languages";
4388
4389fn language_settings_data() -> Vec<SettingsPageItem> {
4390 fn current_language() -> Option<SharedString> {
4391 sub_page_stack().iter().find_map(|page| {
4392 (page.section_header == LANGUAGES_SECTION_HEADER)
4393 .then(|| SharedString::new_static(page.link.title))
4394 })
4395 }
4396
4397 fn language_settings_field<T>(
4398 settings_content: &SettingsContent,
4399 get: fn(&LanguageSettingsContent) -> &Option<T>,
4400 ) -> &Option<T> {
4401 let all_languages = &settings_content.project.all_languages;
4402 if let Some(current_language_name) = current_language() {
4403 if let Some(current_language) = all_languages.languages.0.get(¤t_language_name) {
4404 let value = get(current_language);
4405 if value.is_some() {
4406 return value;
4407 }
4408 }
4409 }
4410 let default_value = get(&all_languages.defaults);
4411 return default_value;
4412 }
4413
4414 fn language_settings_field_mut<T>(
4415 settings_content: &mut SettingsContent,
4416 get: fn(&mut LanguageSettingsContent) -> &mut Option<T>,
4417 ) -> &mut Option<T> {
4418 let all_languages = &mut settings_content.project.all_languages;
4419 let language_content = if let Some(current_language) = current_language() {
4420 all_languages
4421 .languages
4422 .0
4423 .entry(current_language)
4424 .or_default()
4425 } else {
4426 &mut all_languages.defaults
4427 };
4428 return get(language_content);
4429 }
4430
4431 vec![
4432 SettingsPageItem::SectionHeader("Indentation"),
4433 SettingsPageItem::SettingItem(SettingItem {
4434 title: "Tab Size",
4435 description: "How many columns a tab should occupy",
4436 field: Box::new(SettingField {
4437 pick: |settings_content| {
4438 language_settings_field(settings_content, |language| &language.tab_size)
4439 },
4440 pick_mut: |settings_content| {
4441 language_settings_field_mut(settings_content, |language| &mut language.tab_size)
4442 },
4443 }),
4444 metadata: None,
4445 files: USER | LOCAL,
4446 }),
4447 SettingsPageItem::SettingItem(SettingItem {
4448 title: "Hard Tabs",
4449 description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
4450 field: Box::new(SettingField {
4451 pick: |settings_content| {
4452 language_settings_field(settings_content, |language| &language.hard_tabs)
4453 },
4454 pick_mut: |settings_content| {
4455 language_settings_field_mut(settings_content, |language| {
4456 &mut language.hard_tabs
4457 })
4458 },
4459 }),
4460 metadata: None,
4461 files: USER | LOCAL,
4462 }),
4463 SettingsPageItem::SettingItem(SettingItem {
4464 title: "Auto Indent",
4465 description: "Whether indentation should be adjusted based on the context whilst typing",
4466 field: Box::new(SettingField {
4467 pick: |settings_content| {
4468 language_settings_field(settings_content, |language| &language.auto_indent)
4469 },
4470 pick_mut: |settings_content| {
4471 language_settings_field_mut(settings_content, |language| {
4472 &mut language.auto_indent
4473 })
4474 },
4475 }),
4476 metadata: None,
4477 files: USER | LOCAL,
4478 }),
4479 SettingsPageItem::SettingItem(SettingItem {
4480 title: "Auto Indent On Paste",
4481 description: "Whether indentation of pasted content should be adjusted based on the context",
4482 field: Box::new(SettingField {
4483 pick: |settings_content| {
4484 language_settings_field(settings_content, |language| {
4485 &language.auto_indent_on_paste
4486 })
4487 },
4488 pick_mut: |settings_content| {
4489 language_settings_field_mut(settings_content, |language| {
4490 &mut language.auto_indent_on_paste
4491 })
4492 },
4493 }),
4494 metadata: None,
4495 files: USER | LOCAL,
4496 }),
4497 SettingsPageItem::SectionHeader("Wrapping"),
4498 SettingsPageItem::SettingItem(SettingItem {
4499 title: "Soft Wrap",
4500 description: "How to soft-wrap long lines of text",
4501 field: Box::new(SettingField {
4502 pick: |settings_content| {
4503 language_settings_field(settings_content, |language| &language.soft_wrap)
4504 },
4505 pick_mut: |settings_content| {
4506 language_settings_field_mut(settings_content, |language| {
4507 &mut language.soft_wrap
4508 })
4509 },
4510 }),
4511 metadata: None,
4512 files: USER | LOCAL,
4513 }),
4514 SettingsPageItem::SettingItem(SettingItem {
4515 title: "Show Wrap Guides",
4516 description: "Show wrap guides in the editor",
4517 field: Box::new(SettingField {
4518 pick: |settings_content| {
4519 language_settings_field(settings_content, |language| &language.show_wrap_guides)
4520 },
4521 pick_mut: |settings_content| {
4522 language_settings_field_mut(settings_content, |language| {
4523 &mut language.show_wrap_guides
4524 })
4525 },
4526 }),
4527 metadata: None,
4528 files: USER | LOCAL,
4529 }),
4530 SettingsPageItem::SettingItem(SettingItem {
4531 title: "Preferred Line Length",
4532 description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
4533 field: Box::new(SettingField {
4534 pick: |settings_content| {
4535 language_settings_field(settings_content, |language| {
4536 &language.preferred_line_length
4537 })
4538 },
4539 pick_mut: |settings_content| {
4540 language_settings_field_mut(settings_content, |language| {
4541 &mut language.preferred_line_length
4542 })
4543 },
4544 }),
4545 metadata: None,
4546 files: USER | LOCAL,
4547 }),
4548 SettingsPageItem::SettingItem(SettingItem {
4549 title: "Wrap Guides",
4550 description: "Character counts at which to show wrap guides in the editor",
4551 field: Box::new(
4552 SettingField {
4553 pick: |settings_content| {
4554 language_settings_field(settings_content, |language| &language.wrap_guides)
4555 },
4556 pick_mut: |settings_content| {
4557 language_settings_field_mut(settings_content, |language| {
4558 &mut language.wrap_guides
4559 })
4560 },
4561 }
4562 .unimplemented(),
4563 ),
4564 metadata: None,
4565 files: USER | LOCAL,
4566 }),
4567 SettingsPageItem::SettingItem(SettingItem {
4568 title: "Allow Rewrap",
4569 description: "Controls where the `editor::Rewrap` action is allowed for this language",
4570 field: Box::new(SettingField {
4571 pick: |settings_content| {
4572 language_settings_field(settings_content, |language| &language.allow_rewrap)
4573 },
4574 pick_mut: |settings_content| {
4575 language_settings_field_mut(settings_content, |language| {
4576 &mut language.allow_rewrap
4577 })
4578 },
4579 }),
4580 metadata: None,
4581 files: USER | LOCAL,
4582 }),
4583 SettingsPageItem::SectionHeader("Indent Guides"),
4584 SettingsPageItem::SettingItem(SettingItem {
4585 title: "Enabled",
4586 description: "Display indent guides in the editor",
4587 field: Box::new(SettingField {
4588 pick: |settings_content| {
4589 language_settings_field(settings_content, |language| {
4590 if let Some(indent_guides) = &language.indent_guides {
4591 &indent_guides.enabled
4592 } else {
4593 &None
4594 }
4595 })
4596 },
4597 pick_mut: |settings_content| {
4598 language_settings_field_mut(settings_content, |language| {
4599 &mut language.indent_guides.get_or_insert_default().enabled
4600 })
4601 },
4602 }),
4603 metadata: None,
4604 files: USER | LOCAL,
4605 }),
4606 SettingsPageItem::SettingItem(SettingItem {
4607 title: "Line Width",
4608 description: "The width of the indent guides in pixels, between 1 and 10",
4609 field: Box::new(SettingField {
4610 pick: |settings_content| {
4611 language_settings_field(settings_content, |language| {
4612 if let Some(indent_guides) = &language.indent_guides {
4613 &indent_guides.line_width
4614 } else {
4615 &None
4616 }
4617 })
4618 },
4619 pick_mut: |settings_content| {
4620 language_settings_field_mut(settings_content, |language| {
4621 &mut language.indent_guides.get_or_insert_default().line_width
4622 })
4623 },
4624 }),
4625 metadata: None,
4626 files: USER | LOCAL,
4627 }),
4628 SettingsPageItem::SettingItem(SettingItem {
4629 title: "Active Line Width",
4630 description: "The width of the active indent guide in pixels, between 1 and 10",
4631 field: Box::new(SettingField {
4632 pick: |settings_content| {
4633 language_settings_field(settings_content, |language| {
4634 if let Some(indent_guides) = &language.indent_guides {
4635 &indent_guides.active_line_width
4636 } else {
4637 &None
4638 }
4639 })
4640 },
4641 pick_mut: |settings_content| {
4642 language_settings_field_mut(settings_content, |language| {
4643 &mut language
4644 .indent_guides
4645 .get_or_insert_default()
4646 .active_line_width
4647 })
4648 },
4649 }),
4650 metadata: None,
4651 files: USER | LOCAL,
4652 }),
4653 SettingsPageItem::SettingItem(SettingItem {
4654 title: "Coloring",
4655 description: "Determines how indent guides are colored",
4656 field: Box::new(SettingField {
4657 pick: |settings_content| {
4658 language_settings_field(settings_content, |language| {
4659 if let Some(indent_guides) = &language.indent_guides {
4660 &indent_guides.coloring
4661 } else {
4662 &None
4663 }
4664 })
4665 },
4666 pick_mut: |settings_content| {
4667 language_settings_field_mut(settings_content, |language| {
4668 &mut language.indent_guides.get_or_insert_default().coloring
4669 })
4670 },
4671 }),
4672 metadata: None,
4673 files: USER | LOCAL,
4674 }),
4675 SettingsPageItem::SettingItem(SettingItem {
4676 title: "Background Coloring",
4677 description: "Determines how indent guide backgrounds are colored",
4678 field: Box::new(SettingField {
4679 pick: |settings_content| {
4680 language_settings_field(settings_content, |language| {
4681 if let Some(indent_guides) = &language.indent_guides {
4682 &indent_guides.background_coloring
4683 } else {
4684 &None
4685 }
4686 })
4687 },
4688 pick_mut: |settings_content| {
4689 language_settings_field_mut(settings_content, |language| {
4690 &mut language
4691 .indent_guides
4692 .get_or_insert_default()
4693 .background_coloring
4694 })
4695 },
4696 }),
4697 metadata: None,
4698 files: USER | LOCAL,
4699 }),
4700 SettingsPageItem::SectionHeader("Formatting"),
4701 SettingsPageItem::SettingItem(SettingItem {
4702 title: "Format On Save",
4703 description: "Whether or not to perform a buffer format before saving",
4704 field: Box::new(
4705 // TODO(settings_ui): this setting should just be a bool
4706 SettingField {
4707 pick: |settings_content| {
4708 language_settings_field(settings_content, |language| {
4709 &language.format_on_save
4710 })
4711 },
4712 pick_mut: |settings_content| {
4713 language_settings_field_mut(settings_content, |language| {
4714 &mut language.format_on_save
4715 })
4716 },
4717 },
4718 ),
4719 metadata: None,
4720 files: USER | LOCAL,
4721 }),
4722 SettingsPageItem::SettingItem(SettingItem {
4723 title: "Remove Trailing Whitespace On Save",
4724 description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4725 field: Box::new(SettingField {
4726 pick: |settings_content| {
4727 language_settings_field(settings_content, |language| {
4728 &language.remove_trailing_whitespace_on_save
4729 })
4730 },
4731 pick_mut: |settings_content| {
4732 language_settings_field_mut(settings_content, |language| {
4733 &mut language.remove_trailing_whitespace_on_save
4734 })
4735 },
4736 }),
4737 metadata: None,
4738 files: USER | LOCAL,
4739 }),
4740 SettingsPageItem::SettingItem(SettingItem {
4741 title: "Ensure Final Newline On Save",
4742 description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4743 field: Box::new(SettingField {
4744 pick: |settings_content| {
4745 language_settings_field(settings_content, |language| {
4746 &language.ensure_final_newline_on_save
4747 })
4748 },
4749 pick_mut: |settings_content| {
4750 language_settings_field_mut(settings_content, |language| {
4751 &mut language.ensure_final_newline_on_save
4752 })
4753 },
4754 }),
4755 metadata: None,
4756 files: USER | LOCAL,
4757 }),
4758 SettingsPageItem::SettingItem(SettingItem {
4759 title: "Formatter",
4760 description: "How to perform a buffer format",
4761 field: Box::new(
4762 SettingField {
4763 pick: |settings_content| {
4764 language_settings_field(settings_content, |language| &language.formatter)
4765 },
4766 pick_mut: |settings_content| {
4767 language_settings_field_mut(settings_content, |language| {
4768 &mut language.formatter
4769 })
4770 },
4771 }
4772 .unimplemented(),
4773 ),
4774 metadata: None,
4775 files: USER | LOCAL,
4776 }),
4777 SettingsPageItem::SettingItem(SettingItem {
4778 title: "Use On Type Format",
4779 description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities",
4780 field: Box::new(SettingField {
4781 pick: |settings_content| {
4782 language_settings_field(settings_content, |language| {
4783 &language.use_on_type_format
4784 })
4785 },
4786 pick_mut: |settings_content| {
4787 language_settings_field_mut(settings_content, |language| {
4788 &mut language.use_on_type_format
4789 })
4790 },
4791 }),
4792 metadata: None,
4793 files: USER | LOCAL,
4794 }),
4795 SettingsPageItem::SectionHeader("Prettier"),
4796 SettingsPageItem::SettingItem(SettingItem {
4797 title: "Allowed",
4798 description: "Enables or disables formatting with Prettier for a given language",
4799 field: Box::new(SettingField {
4800 pick: |settings_content| {
4801 language_settings_field(settings_content, |language| {
4802 if let Some(prettier) = &language.prettier {
4803 &prettier.allowed
4804 } else {
4805 &None
4806 }
4807 })
4808 },
4809 pick_mut: |settings_content| {
4810 language_settings_field_mut(settings_content, |language| {
4811 &mut language.prettier.get_or_insert_default().allowed
4812 })
4813 },
4814 }),
4815 metadata: None,
4816 files: USER | LOCAL,
4817 }),
4818 SettingsPageItem::SettingItem(SettingItem {
4819 title: "Parser",
4820 description: "Forces Prettier integration to use a specific parser name when formatting files with the language",
4821 field: Box::new(SettingField {
4822 pick: |settings_content| {
4823 language_settings_field(settings_content, |language| {
4824 if let Some(prettier) = &language.prettier {
4825 &prettier.parser
4826 } else {
4827 &None
4828 }
4829 })
4830 },
4831 pick_mut: |settings_content| {
4832 language_settings_field_mut(settings_content, |language| {
4833 &mut language.prettier.get_or_insert_default().parser
4834 })
4835 },
4836 }),
4837 metadata: None,
4838 files: USER | LOCAL,
4839 }),
4840 SettingsPageItem::SettingItem(SettingItem {
4841 title: "Plugins",
4842 description: "Forces Prettier integration to use specific plugins when formatting files with the language",
4843 field: Box::new(
4844 SettingField {
4845 pick: |settings_content| {
4846 language_settings_field(settings_content, |language| {
4847 if let Some(prettier) = &language.prettier {
4848 &prettier.plugins
4849 } else {
4850 &None
4851 }
4852 })
4853 },
4854 pick_mut: |settings_content| {
4855 language_settings_field_mut(settings_content, |language| {
4856 &mut language.prettier.get_or_insert_default().plugins
4857 })
4858 },
4859 }
4860 .unimplemented(),
4861 ),
4862 metadata: None,
4863 files: USER | LOCAL,
4864 }),
4865 SettingsPageItem::SettingItem(SettingItem {
4866 title: "Options",
4867 description: "Default Prettier options, in the format as in package.json section for Prettier",
4868 field: Box::new(
4869 SettingField {
4870 pick: |settings_content| {
4871 language_settings_field(settings_content, |language| {
4872 if let Some(prettier) = &language.prettier {
4873 &prettier.options
4874 } else {
4875 &None
4876 }
4877 })
4878 },
4879 pick_mut: |settings_content| {
4880 language_settings_field_mut(settings_content, |language| {
4881 &mut language.prettier.get_or_insert_default().options
4882 })
4883 },
4884 }
4885 .unimplemented(),
4886 ),
4887 metadata: None,
4888 files: USER | LOCAL,
4889 }),
4890 SettingsPageItem::SectionHeader("Autoclose"),
4891 SettingsPageItem::SettingItem(SettingItem {
4892 title: "Use Autoclose",
4893 description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position",
4894 field: Box::new(SettingField {
4895 pick: |settings_content| {
4896 language_settings_field(settings_content, |language| &language.use_autoclose)
4897 },
4898 pick_mut: |settings_content| {
4899 language_settings_field_mut(settings_content, |language| {
4900 &mut language.use_autoclose
4901 })
4902 },
4903 }),
4904 metadata: None,
4905 files: USER | LOCAL,
4906 }),
4907 SettingsPageItem::SettingItem(SettingItem {
4908 title: "Use Auto Surround",
4909 description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()",
4910 field: Box::new(SettingField {
4911 pick: |settings_content| {
4912 language_settings_field(settings_content, |language| {
4913 &language.use_auto_surround
4914 })
4915 },
4916 pick_mut: |settings_content| {
4917 language_settings_field_mut(settings_content, |language| {
4918 &mut language.use_auto_surround
4919 })
4920 },
4921 }),
4922 metadata: None,
4923 files: USER | LOCAL,
4924 }),
4925 SettingsPageItem::SettingItem(SettingItem {
4926 title: "Always Treat Brackets As Autoclosed",
4927 description: "Controls whether the closing characters are always skipped over and auto-removed no matter how they were inserted",
4928 field: Box::new(SettingField {
4929 pick: |settings_content| {
4930 language_settings_field(settings_content, |language| {
4931 &language.always_treat_brackets_as_autoclosed
4932 })
4933 },
4934 pick_mut: |settings_content| {
4935 language_settings_field_mut(settings_content, |language| {
4936 &mut language.always_treat_brackets_as_autoclosed
4937 })
4938 },
4939 }),
4940 metadata: None,
4941 files: USER | LOCAL,
4942 }),
4943 SettingsPageItem::SettingItem(SettingItem {
4944 title: "Jsx Tag Auto Close",
4945 description: "Whether to automatically close JSX tags",
4946 field: Box::new(SettingField {
4947 // TODO(settings_ui): this setting should just be a bool
4948 pick: |settings_content| {
4949 language_settings_field(settings_content, |language| {
4950 match language.jsx_tag_auto_close.as_ref() {
4951 Some(s) => &s.enabled,
4952 None => &None,
4953 }
4954 })
4955 },
4956 pick_mut: |settings_content| {
4957 language_settings_field_mut(settings_content, |language| {
4958 &mut language.jsx_tag_auto_close.get_or_insert_default().enabled
4959 })
4960 },
4961 }),
4962 metadata: None,
4963 files: USER | LOCAL,
4964 }),
4965 SettingsPageItem::SectionHeader("LSP"),
4966 SettingsPageItem::SettingItem(SettingItem {
4967 title: "Enable Language Server",
4968 description: "Whether to use language servers to provide code intelligence",
4969 field: Box::new(SettingField {
4970 pick: |settings_content| {
4971 language_settings_field(settings_content, |language| {
4972 &language.enable_language_server
4973 })
4974 },
4975 pick_mut: |settings_content| {
4976 language_settings_field_mut(settings_content, |language| {
4977 &mut language.enable_language_server
4978 })
4979 },
4980 }),
4981 metadata: None,
4982 files: USER | LOCAL,
4983 }),
4984 SettingsPageItem::SettingItem(SettingItem {
4985 title: "Language Servers",
4986 description: "The list of language servers to use (or disable) for this language",
4987 field: Box::new(
4988 SettingField {
4989 pick: |settings_content| {
4990 language_settings_field(settings_content, |language| {
4991 &language.language_servers
4992 })
4993 },
4994 pick_mut: |settings_content| {
4995 language_settings_field_mut(settings_content, |language| {
4996 &mut language.language_servers
4997 })
4998 },
4999 }
5000 .unimplemented(),
5001 ),
5002 metadata: None,
5003 files: USER | LOCAL,
5004 }),
5005 SettingsPageItem::SettingItem(SettingItem {
5006 title: "Linked Edits",
5007 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",
5008 field: Box::new(SettingField {
5009 pick: |settings_content| {
5010 language_settings_field(settings_content, |language| &language.linked_edits)
5011 },
5012 pick_mut: |settings_content| {
5013 language_settings_field_mut(settings_content, |language| {
5014 &mut language.linked_edits
5015 })
5016 },
5017 }),
5018 metadata: None,
5019 files: USER | LOCAL,
5020 }),
5021 SettingsPageItem::SettingItem(SettingItem {
5022 title: "Go To Definition Fallback",
5023 description: "Whether to follow-up empty go to definition responses from the language server",
5024 field: Box::new(SettingField {
5025 pick: |settings_content| &settings_content.editor.go_to_definition_fallback,
5026 pick_mut: |settings_content| &mut settings_content.editor.go_to_definition_fallback,
5027 }),
5028 metadata: None,
5029 files: USER,
5030 }),
5031 SettingsPageItem::SectionHeader("Edit Predictions"),
5032 SettingsPageItem::SettingItem(SettingItem {
5033 title: "Show Edit Predictions",
5034 description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)",
5035 field: Box::new(SettingField {
5036 pick: |settings_content| {
5037 language_settings_field(settings_content, |language| {
5038 &language.show_edit_predictions
5039 })
5040 },
5041 pick_mut: |settings_content| {
5042 language_settings_field_mut(settings_content, |language| {
5043 &mut language.show_edit_predictions
5044 })
5045 },
5046 }),
5047 metadata: None,
5048 files: USER | LOCAL,
5049 }),
5050 SettingsPageItem::SettingItem(SettingItem {
5051 title: "Edit Predictions Disabled In",
5052 description: "Controls whether edit predictions are shown in the given language scopes",
5053 field: Box::new(
5054 SettingField {
5055 pick: |settings_content| {
5056 language_settings_field(settings_content, |language| {
5057 &language.edit_predictions_disabled_in
5058 })
5059 },
5060 pick_mut: |settings_content| {
5061 language_settings_field_mut(settings_content, |language| {
5062 &mut language.edit_predictions_disabled_in
5063 })
5064 },
5065 }
5066 .unimplemented(),
5067 ),
5068 metadata: None,
5069 files: USER | LOCAL,
5070 }),
5071 SettingsPageItem::SectionHeader("Whitespace"),
5072 SettingsPageItem::SettingItem(SettingItem {
5073 title: "Show Whitespaces",
5074 description: "Whether to show tabs and spaces in the editor",
5075 field: Box::new(SettingField {
5076 pick: |settings_content| {
5077 language_settings_field(settings_content, |language| &language.show_whitespaces)
5078 },
5079 pick_mut: |settings_content| {
5080 language_settings_field_mut(settings_content, |language| {
5081 &mut language.show_whitespaces
5082 })
5083 },
5084 }),
5085 metadata: None,
5086 files: USER | LOCAL,
5087 }),
5088 SettingsPageItem::SettingItem(SettingItem {
5089 title: "Space Whitespace Indicator",
5090 description: "Visible character used to render space characters when show_whitespaces is enabled (default: \"•\")",
5091 field: Box::new(
5092 SettingField {
5093 pick: |settings_content| {
5094 language_settings_field(settings_content, |language| {
5095 if let Some(whitespace_map) = &language.whitespace_map {
5096 &whitespace_map.space
5097 } else {
5098 &None
5099 }
5100 })
5101 },
5102 pick_mut: |settings_content| {
5103 language_settings_field_mut(settings_content, |language| {
5104 &mut language.whitespace_map.get_or_insert_default().space
5105 })
5106 },
5107 }
5108 .unimplemented(),
5109 ),
5110 metadata: None,
5111 files: USER | LOCAL,
5112 }),
5113 SettingsPageItem::SettingItem(SettingItem {
5114 title: "Tab Whitespace Indicator",
5115 description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"→\")",
5116 field: Box::new(
5117 SettingField {
5118 pick: |settings_content| {
5119 language_settings_field(settings_content, |language| {
5120 if let Some(whitespace_map) = &language.whitespace_map {
5121 &whitespace_map.tab
5122 } else {
5123 &None
5124 }
5125 })
5126 },
5127 pick_mut: |settings_content| {
5128 language_settings_field_mut(settings_content, |language| {
5129 &mut language.whitespace_map.get_or_insert_default().tab
5130 })
5131 },
5132 }
5133 .unimplemented(),
5134 ),
5135 metadata: None,
5136 files: USER | LOCAL,
5137 }),
5138 SettingsPageItem::SectionHeader("Completions"),
5139 SettingsPageItem::SettingItem(SettingItem {
5140 title: "Show Completions On Input",
5141 description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
5142 field: Box::new(SettingField {
5143 pick: |settings_content| {
5144 language_settings_field(settings_content, |language| {
5145 &language.show_completions_on_input
5146 })
5147 },
5148 pick_mut: |settings_content| {
5149 language_settings_field_mut(settings_content, |language| {
5150 &mut language.show_completions_on_input
5151 })
5152 },
5153 }),
5154 metadata: None,
5155 files: USER | LOCAL,
5156 }),
5157 SettingsPageItem::SettingItem(SettingItem {
5158 title: "Show Completion Documentation",
5159 description: "Whether to display inline and alongside documentation for items in the completions menu",
5160 field: Box::new(SettingField {
5161 pick: |settings_content| {
5162 language_settings_field(settings_content, |language| {
5163 &language.show_completion_documentation
5164 })
5165 },
5166 pick_mut: |settings_content| {
5167 language_settings_field_mut(settings_content, |language| {
5168 &mut language.show_completion_documentation
5169 })
5170 },
5171 }),
5172 metadata: None,
5173 files: USER | LOCAL,
5174 }),
5175 SettingsPageItem::SettingItem(SettingItem {
5176 title: "Words",
5177 description: "Controls how words are completed",
5178 field: Box::new(SettingField {
5179 pick: |settings_content| {
5180 language_settings_field(settings_content, |language| {
5181 if let Some(completions) = &language.completions {
5182 &completions.words
5183 } else {
5184 &None
5185 }
5186 })
5187 },
5188 pick_mut: |settings_content| {
5189 language_settings_field_mut(settings_content, |language| {
5190 &mut language.completions.get_or_insert_default().words
5191 })
5192 },
5193 }),
5194 metadata: None,
5195 files: USER | LOCAL,
5196 }),
5197 SettingsPageItem::SettingItem(SettingItem {
5198 title: "Words Min Length",
5199 description: "How many characters has to be in the completions query to automatically show the words-based completions",
5200 field: Box::new(SettingField {
5201 pick: |settings_content| {
5202 language_settings_field(settings_content, |language| {
5203 if let Some(completions) = &language.completions {
5204 &completions.words_min_length
5205 } else {
5206 &None
5207 }
5208 })
5209 },
5210 pick_mut: |settings_content| {
5211 language_settings_field_mut(settings_content, |language| {
5212 &mut language
5213 .completions
5214 .get_or_insert_default()
5215 .words_min_length
5216 })
5217 },
5218 }),
5219 metadata: None,
5220 files: USER | LOCAL,
5221 }),
5222 SettingsPageItem::SettingItem(SettingItem {
5223 title: "Lsp",
5224 description: "Whether to fetch LSP completions or not",
5225 field: Box::new(SettingField {
5226 pick: |settings_content| {
5227 language_settings_field(settings_content, |language| {
5228 if let Some(completions) = &language.completions {
5229 &completions.lsp
5230 } else {
5231 &None
5232 }
5233 })
5234 },
5235 pick_mut: |settings_content| {
5236 language_settings_field_mut(settings_content, |language| {
5237 &mut language.completions.get_or_insert_default().lsp
5238 })
5239 },
5240 }),
5241 metadata: None,
5242 files: USER | LOCAL,
5243 }),
5244 SettingsPageItem::SettingItem(SettingItem {
5245 title: "Lsp Fetch Timeout Ms",
5246 description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)",
5247 field: Box::new(SettingField {
5248 pick: |settings_content| {
5249 language_settings_field(settings_content, |language| {
5250 if let Some(completions) = &language.completions {
5251 &completions.lsp_fetch_timeout_ms
5252 } else {
5253 &None
5254 }
5255 })
5256 },
5257 pick_mut: |settings_content| {
5258 language_settings_field_mut(settings_content, |language| {
5259 &mut language
5260 .completions
5261 .get_or_insert_default()
5262 .lsp_fetch_timeout_ms
5263 })
5264 },
5265 }),
5266 metadata: None,
5267 files: USER | LOCAL,
5268 }),
5269 SettingsPageItem::SettingItem(SettingItem {
5270 title: "Lsp Insert Mode",
5271 description: "Controls how LSP completions are inserted",
5272 field: Box::new(SettingField {
5273 pick: |settings_content| {
5274 language_settings_field(settings_content, |language| {
5275 if let Some(completions) = &language.completions {
5276 &completions.lsp_insert_mode
5277 } else {
5278 &None
5279 }
5280 })
5281 },
5282 pick_mut: |settings_content| {
5283 language_settings_field_mut(settings_content, |language| {
5284 &mut language.completions.get_or_insert_default().lsp_insert_mode
5285 })
5286 },
5287 }),
5288 metadata: None,
5289 files: USER | LOCAL,
5290 }),
5291 SettingsPageItem::SectionHeader("Inlay Hints"),
5292 SettingsPageItem::SettingItem(SettingItem {
5293 title: "Enabled",
5294 description: "Global switch to toggle hints on and off",
5295 field: Box::new(SettingField {
5296 pick: |settings_content| {
5297 language_settings_field(settings_content, |language| {
5298 if let Some(inlay_hints) = &language.inlay_hints {
5299 &inlay_hints.enabled
5300 } else {
5301 &None
5302 }
5303 })
5304 },
5305 pick_mut: |settings_content| {
5306 language_settings_field_mut(settings_content, |language| {
5307 &mut language.inlay_hints.get_or_insert_default().enabled
5308 })
5309 },
5310 }),
5311 metadata: None,
5312 files: USER | LOCAL,
5313 }),
5314 SettingsPageItem::SettingItem(SettingItem {
5315 title: "Show Value Hints",
5316 description: "Global switch to toggle inline values on and off when debugging",
5317 field: Box::new(SettingField {
5318 pick: |settings_content| {
5319 language_settings_field(settings_content, |language| {
5320 if let Some(inlay_hints) = &language.inlay_hints {
5321 &inlay_hints.show_value_hints
5322 } else {
5323 &None
5324 }
5325 })
5326 },
5327 pick_mut: |settings_content| {
5328 language_settings_field_mut(settings_content, |language| {
5329 &mut language
5330 .inlay_hints
5331 .get_or_insert_default()
5332 .show_value_hints
5333 })
5334 },
5335 }),
5336 metadata: None,
5337 files: USER | LOCAL,
5338 }),
5339 SettingsPageItem::SettingItem(SettingItem {
5340 title: "Show Type Hints",
5341 description: "Whether type hints should be shown",
5342 field: Box::new(SettingField {
5343 pick: |settings_content| {
5344 language_settings_field(settings_content, |language| {
5345 if let Some(inlay_hints) = &language.inlay_hints {
5346 &inlay_hints.show_type_hints
5347 } else {
5348 &None
5349 }
5350 })
5351 },
5352 pick_mut: |settings_content| {
5353 language_settings_field_mut(settings_content, |language| {
5354 &mut language.inlay_hints.get_or_insert_default().show_type_hints
5355 })
5356 },
5357 }),
5358 metadata: None,
5359 files: USER | LOCAL,
5360 }),
5361 SettingsPageItem::SettingItem(SettingItem {
5362 title: "Show Parameter Hints",
5363 description: "Whether parameter hints should be shown",
5364 field: Box::new(SettingField {
5365 pick: |settings_content| {
5366 language_settings_field(settings_content, |language| {
5367 if let Some(inlay_hints) = &language.inlay_hints {
5368 &inlay_hints.show_parameter_hints
5369 } else {
5370 &None
5371 }
5372 })
5373 },
5374 pick_mut: |settings_content| {
5375 language_settings_field_mut(settings_content, |language| {
5376 &mut language
5377 .inlay_hints
5378 .get_or_insert_default()
5379 .show_parameter_hints
5380 })
5381 },
5382 }),
5383 metadata: None,
5384 files: USER | LOCAL,
5385 }),
5386 SettingsPageItem::SettingItem(SettingItem {
5387 title: "Show Other Hints",
5388 description: "Whether other hints should be shown",
5389 field: Box::new(SettingField {
5390 pick: |settings_content| {
5391 language_settings_field(settings_content, |language| {
5392 if let Some(inlay_hints) = &language.inlay_hints {
5393 &inlay_hints.show_other_hints
5394 } else {
5395 &None
5396 }
5397 })
5398 },
5399 pick_mut: |settings_content| {
5400 language_settings_field_mut(settings_content, |language| {
5401 &mut language
5402 .inlay_hints
5403 .get_or_insert_default()
5404 .show_other_hints
5405 })
5406 },
5407 }),
5408 metadata: None,
5409 files: USER | LOCAL,
5410 }),
5411 SettingsPageItem::SettingItem(SettingItem {
5412 title: "Show Background",
5413 description: "Show a background for inlay hints",
5414 field: Box::new(SettingField {
5415 pick: |settings_content| {
5416 language_settings_field(settings_content, |language| {
5417 if let Some(inlay_hints) = &language.inlay_hints {
5418 &inlay_hints.show_background
5419 } else {
5420 &None
5421 }
5422 })
5423 },
5424 pick_mut: |settings_content| {
5425 language_settings_field_mut(settings_content, |language| {
5426 &mut language.inlay_hints.get_or_insert_default().show_background
5427 })
5428 },
5429 }),
5430 metadata: None,
5431 files: USER | LOCAL,
5432 }),
5433 SettingsPageItem::SettingItem(SettingItem {
5434 title: "Edit Debounce Ms",
5435 description: "Whether or not to debounce inlay hints updates after buffer edits (set to 0 to disable debouncing)",
5436 field: Box::new(SettingField {
5437 pick: |settings_content| {
5438 language_settings_field(settings_content, |language| {
5439 if let Some(inlay_hints) = &language.inlay_hints {
5440 &inlay_hints.edit_debounce_ms
5441 } else {
5442 &None
5443 }
5444 })
5445 },
5446 pick_mut: |settings_content| {
5447 language_settings_field_mut(settings_content, |language| {
5448 &mut language
5449 .inlay_hints
5450 .get_or_insert_default()
5451 .edit_debounce_ms
5452 })
5453 },
5454 }),
5455 metadata: None,
5456 files: USER | LOCAL,
5457 }),
5458 SettingsPageItem::SettingItem(SettingItem {
5459 title: "Scroll Debounce Ms",
5460 description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)",
5461 field: Box::new(SettingField {
5462 pick: |settings_content| {
5463 language_settings_field(settings_content, |language| {
5464 if let Some(inlay_hints) = &language.inlay_hints {
5465 &inlay_hints.scroll_debounce_ms
5466 } else {
5467 &None
5468 }
5469 })
5470 },
5471 pick_mut: |settings_content| {
5472 language_settings_field_mut(settings_content, |language| {
5473 &mut language
5474 .inlay_hints
5475 .get_or_insert_default()
5476 .scroll_debounce_ms
5477 })
5478 },
5479 }),
5480 metadata: None,
5481 files: USER | LOCAL,
5482 }),
5483 SettingsPageItem::SettingItem(SettingItem {
5484 title: "Toggle On Modifiers Press",
5485 description: "Toggles inlay hints (hides or shows) when the user presses the modifiers specified",
5486 field: Box::new(
5487 SettingField {
5488 pick: |settings_content| {
5489 language_settings_field(settings_content, |language| {
5490 if let Some(inlay_hints) = &language.inlay_hints {
5491 &inlay_hints.toggle_on_modifiers_press
5492 } else {
5493 &None
5494 }
5495 })
5496 },
5497 pick_mut: |settings_content| {
5498 language_settings_field_mut(settings_content, |language| {
5499 &mut language
5500 .inlay_hints
5501 .get_or_insert_default()
5502 .toggle_on_modifiers_press
5503 })
5504 },
5505 }
5506 .unimplemented(),
5507 ),
5508 metadata: None,
5509 files: USER | LOCAL,
5510 }),
5511 SettingsPageItem::SectionHeader("Tasks"),
5512 SettingsPageItem::SettingItem(SettingItem {
5513 title: "Enabled",
5514 description: "Whether tasks are enabled for this language",
5515 field: Box::new(SettingField {
5516 pick: |settings_content| {
5517 language_settings_field(settings_content, |language| {
5518 if let Some(tasks) = &language.tasks {
5519 &tasks.enabled
5520 } else {
5521 &None
5522 }
5523 })
5524 },
5525 pick_mut: |settings_content| {
5526 language_settings_field_mut(settings_content, |language| {
5527 &mut language.tasks.get_or_insert_default().enabled
5528 })
5529 },
5530 }),
5531 metadata: None,
5532 files: USER | LOCAL,
5533 }),
5534 SettingsPageItem::SettingItem(SettingItem {
5535 title: "Variables",
5536 description: "Extra task variables to set for a particular language",
5537 field: Box::new(
5538 SettingField {
5539 pick: |settings_content| {
5540 language_settings_field(settings_content, |language| {
5541 if let Some(tasks) = &language.tasks {
5542 &tasks.variables
5543 } else {
5544 &None
5545 }
5546 })
5547 },
5548 pick_mut: |settings_content| {
5549 language_settings_field_mut(settings_content, |language| {
5550 &mut language.tasks.get_or_insert_default().variables
5551 })
5552 },
5553 }
5554 .unimplemented(),
5555 ),
5556 metadata: None,
5557 files: USER | LOCAL,
5558 }),
5559 SettingsPageItem::SettingItem(SettingItem {
5560 title: "Prefer Lsp",
5561 description: "Use LSP tasks over Zed language extension ones",
5562 field: Box::new(SettingField {
5563 pick: |settings_content| {
5564 language_settings_field(settings_content, |language| {
5565 if let Some(tasks) = &language.tasks {
5566 &tasks.prefer_lsp
5567 } else {
5568 &None
5569 }
5570 })
5571 },
5572 pick_mut: |settings_content| {
5573 language_settings_field_mut(settings_content, |language| {
5574 &mut language.tasks.get_or_insert_default().prefer_lsp
5575 })
5576 },
5577 }),
5578 metadata: None,
5579 files: USER | LOCAL,
5580 }),
5581 SettingsPageItem::SectionHeader("Miscellaneous"),
5582 SettingsPageItem::SettingItem(SettingItem {
5583 title: "Debuggers",
5584 description: "Preferred debuggers for this language",
5585 field: Box::new(
5586 SettingField {
5587 pick: |settings_content| {
5588 language_settings_field(settings_content, |language| &language.debuggers)
5589 },
5590 pick_mut: |settings_content| {
5591 language_settings_field_mut(settings_content, |language| {
5592 &mut language.debuggers
5593 })
5594 },
5595 }
5596 .unimplemented(),
5597 ),
5598 metadata: None,
5599 files: USER | LOCAL,
5600 }),
5601 SettingsPageItem::SettingItem(SettingItem {
5602 title: "Middle Click Paste",
5603 description: "Enable middle-click paste on Linux",
5604 field: Box::new(SettingField {
5605 pick: |settings_content| &settings_content.editor.middle_click_paste,
5606 pick_mut: |settings_content| &mut settings_content.editor.middle_click_paste,
5607 }),
5608 metadata: None,
5609 files: USER,
5610 }),
5611 SettingsPageItem::SettingItem(SettingItem {
5612 title: "Extend Comment On Newline",
5613 description: "Whether to start a new line with a comment when a previous line is a comment as well",
5614 field: Box::new(SettingField {
5615 pick: |settings_content| {
5616 language_settings_field(settings_content, |language| {
5617 &language.extend_comment_on_newline
5618 })
5619 },
5620 pick_mut: |settings_content| {
5621 language_settings_field_mut(settings_content, |language| {
5622 &mut language.extend_comment_on_newline
5623 })
5624 },
5625 }),
5626 metadata: None,
5627 files: USER | LOCAL,
5628 }),
5629 ]
5630}