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