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