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