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