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