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