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