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