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