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