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::SectionHeader("Outline Panel"),
2642 SettingsPageItem::SettingItem(SettingItem {
2643 title: "Outline Panel Button",
2644 description: "Whether to show the outline panel button in the status bar",
2645 field: Box::new(SettingField {
2646 pick: |settings_content| {
2647 if let Some(outline_panel) = &settings_content.outline_panel {
2648 &outline_panel.button
2649 } else {
2650 &None
2651 }
2652 },
2653 pick_mut: |settings_content| {
2654 &mut settings_content
2655 .outline_panel
2656 .get_or_insert_default()
2657 .button
2658 },
2659 }),
2660 metadata: None,
2661 files: USER,
2662 }),
2663 SettingsPageItem::SettingItem(SettingItem {
2664 title: "Outline Panel Dock",
2665 description: "Where to dock the outline panel",
2666 field: Box::new(SettingField {
2667 pick: |settings_content| {
2668 if let Some(outline_panel) = &settings_content.outline_panel {
2669 &outline_panel.dock
2670 } else {
2671 &None
2672 }
2673 },
2674 pick_mut: |settings_content| {
2675 &mut settings_content.outline_panel.get_or_insert_default().dock
2676 },
2677 }),
2678 metadata: None,
2679 files: USER,
2680 }),
2681 SettingsPageItem::SettingItem(SettingItem {
2682 title: "Outline Panel Default Width",
2683 description: "Default width of the outline panel in pixels",
2684 field: Box::new(SettingField {
2685 pick: |settings_content| {
2686 if let Some(outline_panel) = &settings_content.outline_panel {
2687 &outline_panel.default_width
2688 } else {
2689 &None
2690 }
2691 },
2692 pick_mut: |settings_content| {
2693 &mut settings_content
2694 .outline_panel
2695 .get_or_insert_default()
2696 .default_width
2697 },
2698 }),
2699 metadata: None,
2700 files: USER,
2701 }),
2702 SettingsPageItem::SettingItem(SettingItem {
2703 title: "File Icons",
2704 description: "Whether to show file icons in the outline panel",
2705 field: Box::new(SettingField {
2706 pick: |settings_content| {
2707 if let Some(outline_panel) = &settings_content.outline_panel {
2708 &outline_panel.file_icons
2709 } else {
2710 &None
2711 }
2712 },
2713 pick_mut: |settings_content| {
2714 &mut settings_content
2715 .outline_panel
2716 .get_or_insert_default()
2717 .file_icons
2718 },
2719 }),
2720 metadata: None,
2721 files: USER,
2722 }),
2723 SettingsPageItem::SettingItem(SettingItem {
2724 title: "Folder Icons",
2725 description: "Whether to show folder icons or chevrons for directories in the outline panel",
2726 field: Box::new(SettingField {
2727 pick: |settings_content| {
2728 if let Some(outline_panel) = &settings_content.outline_panel {
2729 &outline_panel.folder_icons
2730 } else {
2731 &None
2732 }
2733 },
2734 pick_mut: |settings_content| {
2735 &mut settings_content
2736 .outline_panel
2737 .get_or_insert_default()
2738 .folder_icons
2739 },
2740 }),
2741 metadata: None,
2742 files: USER,
2743 }),
2744 SettingsPageItem::SettingItem(SettingItem {
2745 title: "Git Status",
2746 description: "Whether to show the git status in the outline panel",
2747 field: Box::new(SettingField {
2748 pick: |settings_content| {
2749 if let Some(outline_panel) = &settings_content.outline_panel {
2750 &outline_panel.git_status
2751 } else {
2752 &None
2753 }
2754 },
2755 pick_mut: |settings_content| {
2756 &mut settings_content
2757 .outline_panel
2758 .get_or_insert_default()
2759 .git_status
2760 },
2761 }),
2762 metadata: None,
2763 files: USER,
2764 }),
2765 SettingsPageItem::SettingItem(SettingItem {
2766 title: "Indent Size",
2767 description: "Amount of indentation for nested items",
2768 field: Box::new(SettingField {
2769 pick: |settings_content| {
2770 if let Some(outline_panel) = &settings_content.outline_panel {
2771 &outline_panel.indent_size
2772 } else {
2773 &None
2774 }
2775 },
2776 pick_mut: |settings_content| {
2777 &mut settings_content
2778 .outline_panel
2779 .get_or_insert_default()
2780 .indent_size
2781 },
2782 }),
2783 metadata: None,
2784 files: USER,
2785 }),
2786 SettingsPageItem::SettingItem(SettingItem {
2787 title: "Auto Reveal Entries",
2788 description: "Whether to reveal when a corresponding outline entry becomes active",
2789 field: Box::new(SettingField {
2790 pick: |settings_content| {
2791 if let Some(outline_panel) = &settings_content.outline_panel {
2792 &outline_panel.auto_reveal_entries
2793 } else {
2794 &None
2795 }
2796 },
2797 pick_mut: |settings_content| {
2798 &mut settings_content
2799 .outline_panel
2800 .get_or_insert_default()
2801 .auto_reveal_entries
2802 },
2803 }),
2804 metadata: None,
2805 files: USER,
2806 }),
2807 SettingsPageItem::SettingItem(SettingItem {
2808 title: "Auto Fold Directories",
2809 description: "Whether to fold directories automatically when a directory has only one directory inside",
2810 field: Box::new(SettingField {
2811 pick: |settings_content| {
2812 if let Some(outline_panel) = &settings_content.outline_panel {
2813 &outline_panel.auto_fold_dirs
2814 } else {
2815 &None
2816 }
2817 },
2818 pick_mut: |settings_content| {
2819 &mut settings_content
2820 .outline_panel
2821 .get_or_insert_default()
2822 .auto_fold_dirs
2823 },
2824 }),
2825 metadata: None,
2826 files: USER,
2827 }),
2828 // files: USER,
2829 // SettingsPageItem::SettingItem(SettingItem {
2830 // title: "Indent Guides Show",
2831 // description: "When to show indent guides in the outline panel",
2832 // field: Box::new(SettingField {
2833 // pick: |settings_content| {
2834 // if let Some(outline_panel) = &settings_content.outline_panel {
2835 // if let Some(indent_guides) = &outline_panel.indent_guides {
2836 // &indent_guides.show
2837 // } else {
2838 // &None
2839 // }
2840 // } else {
2841 // &None
2842 // }
2843 // },
2844 // pick_mut: |settings_content| {
2845 // &mut settings_content
2846 // .outline_panel
2847 // .get_or_insert_default()
2848 // .indent_guides
2849 // .get_or_insert_default()
2850 // .show
2851 // },
2852 // }),
2853 // metadata: None,
2854 // }),
2855 SettingsPageItem::SectionHeader("Git Panel"),
2856 SettingsPageItem::SettingItem(SettingItem {
2857 title: "Button",
2858 description: "Whether to show the git panel button in the status bar",
2859 field: Box::new(SettingField {
2860 pick: |settings_content| {
2861 if let Some(git_panel) = &settings_content.git_panel {
2862 &git_panel.button
2863 } else {
2864 &None
2865 }
2866 },
2867 pick_mut: |settings_content| {
2868 &mut settings_content.git_panel.get_or_insert_default().button
2869 },
2870 }),
2871 metadata: None,
2872 files: USER,
2873 }),
2874 SettingsPageItem::SettingItem(SettingItem {
2875 title: "Dock",
2876 description: "Where to dock the git panel",
2877 field: Box::new(SettingField {
2878 pick: |settings_content| {
2879 if let Some(git_panel) = &settings_content.git_panel {
2880 &git_panel.dock
2881 } else {
2882 &None
2883 }
2884 },
2885 pick_mut: |settings_content| {
2886 &mut settings_content.git_panel.get_or_insert_default().dock
2887 },
2888 }),
2889 metadata: None,
2890 files: USER,
2891 }),
2892 SettingsPageItem::SettingItem(SettingItem {
2893 title: "Default Width",
2894 description: "Default width of the git panel in pixels",
2895 field: Box::new(SettingField {
2896 pick: |settings_content| {
2897 if let Some(git_panel) = &settings_content.git_panel {
2898 &git_panel.default_width
2899 } else {
2900 &None
2901 }
2902 },
2903 pick_mut: |settings_content| {
2904 &mut settings_content
2905 .git_panel
2906 .get_or_insert_default()
2907 .default_width
2908 },
2909 }),
2910 metadata: None,
2911 files: USER,
2912 }),
2913 SettingsPageItem::SectionHeader("Notification Panel"),
2914 SettingsPageItem::SettingItem(SettingItem {
2915 title: "Notification Panel Button",
2916 description: "Whether to show the notification panel button in the status bar",
2917 field: Box::new(SettingField {
2918 pick: |settings_content| {
2919 if let Some(notification_panel) = &settings_content.notification_panel {
2920 ¬ification_panel.button
2921 } else {
2922 &None
2923 }
2924 },
2925 pick_mut: |settings_content| {
2926 &mut settings_content
2927 .notification_panel
2928 .get_or_insert_default()
2929 .button
2930 },
2931 }),
2932 metadata: None,
2933 files: USER,
2934 }),
2935 SettingsPageItem::SettingItem(SettingItem {
2936 title: "Notification Panel Dock",
2937 description: "Where to dock the notification panel",
2938 field: Box::new(SettingField {
2939 pick: |settings_content| {
2940 if let Some(notification_panel) = &settings_content.notification_panel {
2941 ¬ification_panel.dock
2942 } else {
2943 &None
2944 }
2945 },
2946 pick_mut: |settings_content| {
2947 &mut settings_content
2948 .notification_panel
2949 .get_or_insert_default()
2950 .dock
2951 },
2952 }),
2953 metadata: None,
2954 files: USER,
2955 }),
2956 SettingsPageItem::SettingItem(SettingItem {
2957 title: "Notification Panel Default Width",
2958 description: "Default width of the notification panel in pixels",
2959 field: Box::new(SettingField {
2960 pick: |settings_content| {
2961 if let Some(notification_panel) = &settings_content.notification_panel {
2962 ¬ification_panel.default_width
2963 } else {
2964 &None
2965 }
2966 },
2967 pick_mut: |settings_content| {
2968 &mut settings_content
2969 .notification_panel
2970 .get_or_insert_default()
2971 .default_width
2972 },
2973 }),
2974 metadata: None,
2975 files: USER,
2976 }),
2977 SettingsPageItem::SectionHeader("Collaboration Panel"),
2978 SettingsPageItem::SettingItem(SettingItem {
2979 title: "Collaboration Panel Button",
2980 description: "Whether to show the collaboration panel button in the status bar",
2981 field: Box::new(SettingField {
2982 pick: |settings_content| {
2983 if let Some(collaboration_panel) = &settings_content.collaboration_panel
2984 {
2985 &collaboration_panel.button
2986 } else {
2987 &None
2988 }
2989 },
2990 pick_mut: |settings_content| {
2991 &mut settings_content
2992 .collaboration_panel
2993 .get_or_insert_default()
2994 .button
2995 },
2996 }),
2997 metadata: None,
2998 files: USER,
2999 }),
3000 SettingsPageItem::SettingItem(SettingItem {
3001 title: "Collaboration Panel Dock",
3002 description: "Where to dock the collaboration panel",
3003 field: Box::new(SettingField {
3004 pick: |settings_content| {
3005 if let Some(collaboration_panel) = &settings_content.collaboration_panel
3006 {
3007 &collaboration_panel.dock
3008 } else {
3009 &None
3010 }
3011 },
3012 pick_mut: |settings_content| {
3013 &mut settings_content
3014 .collaboration_panel
3015 .get_or_insert_default()
3016 .dock
3017 },
3018 }),
3019 metadata: None,
3020 files: USER,
3021 }),
3022 SettingsPageItem::SettingItem(SettingItem {
3023 title: "Collaboration Panel Default Width",
3024 description: "Default width of the collaboration panel in pixels",
3025 field: Box::new(SettingField {
3026 pick: |settings_content| {
3027 if let Some(collaboration_panel) = &settings_content.collaboration_panel
3028 {
3029 &collaboration_panel.default_width
3030 } else {
3031 &None
3032 }
3033 },
3034 pick_mut: |settings_content| {
3035 &mut settings_content
3036 .collaboration_panel
3037 .get_or_insert_default()
3038 .default_width
3039 },
3040 }),
3041 metadata: None,
3042 files: USER,
3043 }),
3044 ],
3045 },
3046 SettingsPage {
3047 title: "Version Control",
3048 items: vec![
3049 SettingsPageItem::SectionHeader("Git"),
3050 SettingsPageItem::SettingItem(SettingItem {
3051 title: "Git Gutter",
3052 description: "Control whether git status is shown in the editor's gutter",
3053 field: Box::new(SettingField {
3054 pick: |settings_content| {
3055 if let Some(git) = &settings_content.git {
3056 &git.git_gutter
3057 } else {
3058 &None
3059 }
3060 },
3061 pick_mut: |settings_content| {
3062 &mut settings_content.git.get_or_insert_default().git_gutter
3063 },
3064 }),
3065 metadata: None,
3066 files: USER,
3067 }),
3068 // todo(settings_ui): Figure out the right default for this value in default.json
3069 SettingsPageItem::SettingItem(SettingItem {
3070 title: "Gutter Debounce",
3071 description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
3072 field: Box::new(SettingField {
3073 pick: |settings_content| {
3074 if let Some(git) = &settings_content.git {
3075 &git.gutter_debounce
3076 } else {
3077 &None
3078 }
3079 },
3080 pick_mut: |settings_content| {
3081 &mut settings_content.git.get_or_insert_default().gutter_debounce
3082 },
3083 }),
3084 metadata: None,
3085 files: USER,
3086 }),
3087 SettingsPageItem::SettingItem(SettingItem {
3088 title: "Inline Git Blame",
3089 description: "Whether or not to show git blame data inline in the currently focused line",
3090 field: Box::new(SettingField {
3091 pick: |settings_content| {
3092 if let Some(git) = &settings_content.git {
3093 if let Some(inline_blame) = &git.inline_blame {
3094 &inline_blame.enabled
3095 } else {
3096 &None
3097 }
3098 } else {
3099 &None
3100 }
3101 },
3102 pick_mut: |settings_content| {
3103 &mut settings_content
3104 .git
3105 .get_or_insert_default()
3106 .inline_blame
3107 .get_or_insert_default()
3108 .enabled
3109 },
3110 }),
3111 metadata: None,
3112 files: USER,
3113 }),
3114 SettingsPageItem::SettingItem(SettingItem {
3115 title: "Inline Git Blame Delay",
3116 description: "The delay after which the inline blame information is shown",
3117 field: Box::new(SettingField {
3118 pick: |settings_content| {
3119 if let Some(git) = &settings_content.git {
3120 if let Some(inline_blame) = &git.inline_blame {
3121 &inline_blame.delay_ms
3122 } else {
3123 &None
3124 }
3125 } else {
3126 &None
3127 }
3128 },
3129 pick_mut: |settings_content| {
3130 &mut settings_content
3131 .git
3132 .get_or_insert_default()
3133 .inline_blame
3134 .get_or_insert_default()
3135 .delay_ms
3136 },
3137 }),
3138 metadata: None,
3139 files: USER,
3140 }),
3141 SettingsPageItem::SettingItem(SettingItem {
3142 title: "Inline Git Blame Padding",
3143 description: "Padding between the end of the source line and the start of the inline blame in columns",
3144 field: Box::new(SettingField {
3145 pick: |settings_content| {
3146 if let Some(git) = &settings_content.git {
3147 if let Some(inline_blame) = &git.inline_blame {
3148 &inline_blame.padding
3149 } else {
3150 &None
3151 }
3152 } else {
3153 &None
3154 }
3155 },
3156 pick_mut: |settings_content| {
3157 &mut settings_content
3158 .git
3159 .get_or_insert_default()
3160 .inline_blame
3161 .get_or_insert_default()
3162 .padding
3163 },
3164 }),
3165 metadata: None,
3166 files: USER,
3167 }),
3168 SettingsPageItem::SettingItem(SettingItem {
3169 title: "Inline Git Blame Min Column",
3170 description: "The minimum column number to show the inline blame information at",
3171 field: Box::new(SettingField {
3172 pick: |settings_content| {
3173 if let Some(git) = &settings_content.git {
3174 if let Some(inline_blame) = &git.inline_blame {
3175 &inline_blame.min_column
3176 } else {
3177 &None
3178 }
3179 } else {
3180 &None
3181 }
3182 },
3183 pick_mut: |settings_content| {
3184 &mut settings_content
3185 .git
3186 .get_or_insert_default()
3187 .inline_blame
3188 .get_or_insert_default()
3189 .min_column
3190 },
3191 }),
3192 metadata: None,
3193 files: USER,
3194 }),
3195 SettingsPageItem::SettingItem(SettingItem {
3196 title: "Show Commit Summary",
3197 description: "Whether to show commit summary as part of the inline blame",
3198 field: Box::new(SettingField {
3199 pick: |settings_content| {
3200 if let Some(git) = &settings_content.git {
3201 if let Some(inline_blame) = &git.inline_blame {
3202 &inline_blame.show_commit_summary
3203 } else {
3204 &None
3205 }
3206 } else {
3207 &None
3208 }
3209 },
3210 pick_mut: |settings_content| {
3211 &mut settings_content
3212 .git
3213 .get_or_insert_default()
3214 .inline_blame
3215 .get_or_insert_default()
3216 .show_commit_summary
3217 },
3218 }),
3219 metadata: None,
3220 files: USER,
3221 }),
3222 SettingsPageItem::SettingItem(SettingItem {
3223 title: "Show Avatar",
3224 description: "Whether to show the avatar of the author of the commit",
3225 field: Box::new(SettingField {
3226 pick: |settings_content| {
3227 if let Some(git) = &settings_content.git {
3228 if let Some(blame) = &git.blame {
3229 &blame.show_avatar
3230 } else {
3231 &None
3232 }
3233 } else {
3234 &None
3235 }
3236 },
3237 pick_mut: |settings_content| {
3238 &mut settings_content
3239 .git
3240 .get_or_insert_default()
3241 .blame
3242 .get_or_insert_default()
3243 .show_avatar
3244 },
3245 }),
3246 metadata: None,
3247 files: USER,
3248 }),
3249 SettingsPageItem::SettingItem(SettingItem {
3250 title: "Show Author Name In Branch Picker",
3251 description: "Whether to show author name as part of the commit information in branch picker",
3252 field: Box::new(SettingField {
3253 pick: |settings_content| {
3254 if let Some(git) = &settings_content.git {
3255 if let Some(branch_picker) = &git.branch_picker {
3256 &branch_picker.show_author_name
3257 } else {
3258 &None
3259 }
3260 } else {
3261 &None
3262 }
3263 },
3264 pick_mut: |settings_content| {
3265 &mut settings_content
3266 .git
3267 .get_or_insert_default()
3268 .branch_picker
3269 .get_or_insert_default()
3270 .show_author_name
3271 },
3272 }),
3273 metadata: None,
3274 files: USER,
3275 }),
3276 SettingsPageItem::SettingItem(SettingItem {
3277 title: "Hunk Style",
3278 description: "How git hunks are displayed visually in the editor",
3279 field: Box::new(SettingField {
3280 pick: |settings_content| {
3281 if let Some(git) = &settings_content.git {
3282 &git.hunk_style
3283 } else {
3284 &None
3285 }
3286 },
3287 pick_mut: |settings_content| {
3288 &mut settings_content.git.get_or_insert_default().hunk_style
3289 },
3290 }),
3291 metadata: None,
3292 files: USER,
3293 }),
3294 ],
3295 },
3296 SettingsPage {
3297 title: "System & Network",
3298 items: vec![
3299 SettingsPageItem::SectionHeader("Network"),
3300 // todo(settings_ui): Proxy needs a default
3301 // files: USER,
3302 // SettingsPageItem::SettingItem(SettingItem {
3303 // title: "Proxy",
3304 // description: "The proxy to use for network requests",
3305 // field: Box::new(SettingField {
3306 // pick: |settings_content| &settings_content.proxy,
3307 // pick_mut: |settings_content| &mut settings_content.proxy,
3308 // }),
3309 // metadata: Some(Box::new(SettingsFieldMetadata {
3310 // placeholder: Some("socks5h://localhost:10808"),
3311 // })),
3312 // }),
3313 SettingsPageItem::SettingItem(SettingItem {
3314 title: "Server URL",
3315 description: "The URL of the Zed server to connect to",
3316 field: Box::new(SettingField {
3317 pick: |settings_content| &settings_content.server_url,
3318 pick_mut: |settings_content| &mut settings_content.server_url,
3319 }),
3320 metadata: Some(Box::new(SettingsFieldMetadata {
3321 placeholder: Some("https://zed.dev"),
3322 })),
3323 files: USER,
3324 }),
3325 SettingsPageItem::SectionHeader("System"),
3326 SettingsPageItem::SettingItem(SettingItem {
3327 title: "Auto Update",
3328 description: "Whether or not to automatically check for updates",
3329 field: Box::new(SettingField {
3330 pick: |settings_content| &settings_content.auto_update,
3331 pick_mut: |settings_content| &mut settings_content.auto_update,
3332 }),
3333 metadata: None,
3334 files: USER,
3335 }),
3336 ],
3337 },
3338 SettingsPage {
3339 title: "Diagnostics & Errors",
3340 items: vec![
3341 SettingsPageItem::SectionHeader("Filtering"),
3342 SettingsPageItem::SettingItem(SettingItem {
3343 title: "Max Severity",
3344 description: "Which level to use to filter out diagnostics displayed in the editor",
3345 field: Box::new(SettingField {
3346 pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
3347 pick_mut: |settings_content| {
3348 &mut settings_content.editor.diagnostics_max_severity
3349 },
3350 }),
3351 metadata: None,
3352 files: USER,
3353 }),
3354 SettingsPageItem::SettingItem(SettingItem {
3355 title: "Include Warnings",
3356 description: "Whether to show warnings or not by default",
3357 field: Box::new(SettingField {
3358 pick: |settings_content| {
3359 if let Some(diagnostics) = &settings_content.diagnostics {
3360 &diagnostics.include_warnings
3361 } else {
3362 &None
3363 }
3364 },
3365 pick_mut: |settings_content| {
3366 &mut settings_content
3367 .diagnostics
3368 .get_or_insert_default()
3369 .include_warnings
3370 },
3371 }),
3372 metadata: None,
3373 files: USER,
3374 }),
3375 SettingsPageItem::SectionHeader("Inline"),
3376 SettingsPageItem::SettingItem(SettingItem {
3377 title: "Inline Diagnostics Enabled",
3378 description: "Whether to show diagnostics inline or not",
3379 field: Box::new(SettingField {
3380 pick: |settings_content| {
3381 if let Some(diagnostics) = &settings_content.diagnostics {
3382 if let Some(inline) = &diagnostics.inline {
3383 &inline.enabled
3384 } else {
3385 &None
3386 }
3387 } else {
3388 &None
3389 }
3390 },
3391 pick_mut: |settings_content| {
3392 &mut settings_content
3393 .diagnostics
3394 .get_or_insert_default()
3395 .inline
3396 .get_or_insert_default()
3397 .enabled
3398 },
3399 }),
3400 metadata: None,
3401 files: USER,
3402 }),
3403 SettingsPageItem::SettingItem(SettingItem {
3404 title: "Inline Update Debounce",
3405 description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
3406 field: Box::new(SettingField {
3407 pick: |settings_content| {
3408 if let Some(diagnostics) = &settings_content.diagnostics {
3409 if let Some(inline) = &diagnostics.inline {
3410 &inline.update_debounce_ms
3411 } else {
3412 &None
3413 }
3414 } else {
3415 &None
3416 }
3417 },
3418 pick_mut: |settings_content| {
3419 &mut settings_content
3420 .diagnostics
3421 .get_or_insert_default()
3422 .inline
3423 .get_or_insert_default()
3424 .update_debounce_ms
3425 },
3426 }),
3427 metadata: None,
3428 files: USER,
3429 }),
3430 SettingsPageItem::SettingItem(SettingItem {
3431 title: "Inline Padding",
3432 description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
3433 field: Box::new(SettingField {
3434 pick: |settings_content| {
3435 if let Some(diagnostics) = &settings_content.diagnostics {
3436 if let Some(inline) = &diagnostics.inline {
3437 &inline.padding
3438 } else {
3439 &None
3440 }
3441 } else {
3442 &None
3443 }
3444 },
3445 pick_mut: |settings_content| {
3446 &mut settings_content
3447 .diagnostics
3448 .get_or_insert_default()
3449 .inline
3450 .get_or_insert_default()
3451 .padding
3452 },
3453 }),
3454 metadata: None,
3455 files: USER,
3456 }),
3457 SettingsPageItem::SettingItem(SettingItem {
3458 title: "Inline Min Column",
3459 description: "The minimum column to display inline diagnostics",
3460 field: Box::new(SettingField {
3461 pick: |settings_content| {
3462 if let Some(diagnostics) = &settings_content.diagnostics {
3463 if let Some(inline) = &diagnostics.inline {
3464 &inline.min_column
3465 } else {
3466 &None
3467 }
3468 } else {
3469 &None
3470 }
3471 },
3472 pick_mut: |settings_content| {
3473 &mut settings_content
3474 .diagnostics
3475 .get_or_insert_default()
3476 .inline
3477 .get_or_insert_default()
3478 .min_column
3479 },
3480 }),
3481 metadata: None,
3482 files: USER,
3483 }),
3484 SettingsPageItem::SectionHeader("Performance"),
3485 SettingsPageItem::SettingItem(SettingItem {
3486 title: "LSP Pull Diagnostics Enabled",
3487 description: "Whether to pull for language server-powered diagnostics or not",
3488 field: Box::new(SettingField {
3489 pick: |settings_content| {
3490 if let Some(diagnostics) = &settings_content.diagnostics {
3491 if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3492 &lsp_pull.enabled
3493 } else {
3494 &None
3495 }
3496 } else {
3497 &None
3498 }
3499 },
3500 pick_mut: |settings_content| {
3501 &mut settings_content
3502 .diagnostics
3503 .get_or_insert_default()
3504 .lsp_pull_diagnostics
3505 .get_or_insert_default()
3506 .enabled
3507 },
3508 }),
3509 metadata: None,
3510 files: USER,
3511 }),
3512 // todo(settings_ui): Needs unit
3513 SettingsPageItem::SettingItem(SettingItem {
3514 title: "LSP Pull Debounce",
3515 description: "Minimum time to wait before pulling diagnostics from the language server(s)",
3516 field: Box::new(SettingField {
3517 pick: |settings_content| {
3518 if let Some(diagnostics) = &settings_content.diagnostics {
3519 if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3520 &lsp_pull.debounce_ms
3521 } else {
3522 &None
3523 }
3524 } else {
3525 &None
3526 }
3527 },
3528 pick_mut: |settings_content| {
3529 &mut settings_content
3530 .diagnostics
3531 .get_or_insert_default()
3532 .lsp_pull_diagnostics
3533 .get_or_insert_default()
3534 .debounce_ms
3535 },
3536 }),
3537 metadata: None,
3538 files: USER,
3539 }),
3540 ],
3541 },
3542 SettingsPage {
3543 title: "Debugger",
3544 items: vec![
3545 SettingsPageItem::SectionHeader("General"),
3546 SettingsPageItem::SettingItem(SettingItem {
3547 title: "Stepping Granularity",
3548 description: "Determines the stepping granularity for debug operations",
3549 field: Box::new(SettingField {
3550 pick: |settings_content| {
3551 if let Some(debugger) = &settings_content.debugger {
3552 &debugger.stepping_granularity
3553 } else {
3554 &None
3555 }
3556 },
3557 pick_mut: |settings_content| {
3558 &mut settings_content
3559 .debugger
3560 .get_or_insert_default()
3561 .stepping_granularity
3562 },
3563 }),
3564 metadata: None,
3565 files: USER,
3566 }),
3567 SettingsPageItem::SettingItem(SettingItem {
3568 title: "Save Breakpoints",
3569 description: "Whether breakpoints should be reused across Zed sessions",
3570 field: Box::new(SettingField {
3571 pick: |settings_content| {
3572 if let Some(debugger) = &settings_content.debugger {
3573 &debugger.save_breakpoints
3574 } else {
3575 &None
3576 }
3577 },
3578 pick_mut: |settings_content| {
3579 &mut settings_content
3580 .debugger
3581 .get_or_insert_default()
3582 .save_breakpoints
3583 },
3584 }),
3585 metadata: None,
3586 files: USER,
3587 }),
3588 SettingsPageItem::SettingItem(SettingItem {
3589 title: "Timeout",
3590 description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
3591 field: Box::new(SettingField {
3592 pick: |settings_content| {
3593 if let Some(debugger) = &settings_content.debugger {
3594 &debugger.timeout
3595 } else {
3596 &None
3597 }
3598 },
3599 pick_mut: |settings_content| {
3600 &mut settings_content.debugger.get_or_insert_default().timeout
3601 },
3602 }),
3603 metadata: None,
3604 files: USER,
3605 }),
3606 SettingsPageItem::SettingItem(SettingItem {
3607 title: "Dock",
3608 description: "The dock position of the debug panel",
3609 field: Box::new(SettingField {
3610 pick: |settings_content| {
3611 if let Some(debugger) = &settings_content.debugger {
3612 &debugger.dock
3613 } else {
3614 &None
3615 }
3616 },
3617 pick_mut: |settings_content| {
3618 &mut settings_content.debugger.get_or_insert_default().dock
3619 },
3620 }),
3621 metadata: None,
3622 files: USER,
3623 }),
3624 SettingsPageItem::SettingItem(SettingItem {
3625 title: "Log DAP Communications",
3626 description: "Whether to log messages between active debug adapters and Zed",
3627 field: Box::new(SettingField {
3628 pick: |settings_content| {
3629 if let Some(debugger) = &settings_content.debugger {
3630 &debugger.log_dap_communications
3631 } else {
3632 &None
3633 }
3634 },
3635 pick_mut: |settings_content| {
3636 &mut settings_content
3637 .debugger
3638 .get_or_insert_default()
3639 .log_dap_communications
3640 },
3641 }),
3642 metadata: None,
3643 files: USER,
3644 }),
3645 SettingsPageItem::SettingItem(SettingItem {
3646 title: "Format DAP Log Messages",
3647 description: "Whether to format DAP messages when adding them to debug adapter logger",
3648 field: Box::new(SettingField {
3649 pick: |settings_content| {
3650 if let Some(debugger) = &settings_content.debugger {
3651 &debugger.format_dap_log_messages
3652 } else {
3653 &None
3654 }
3655 },
3656 pick_mut: |settings_content| {
3657 &mut settings_content
3658 .debugger
3659 .get_or_insert_default()
3660 .format_dap_log_messages
3661 },
3662 }),
3663 metadata: None,
3664 files: USER,
3665 }),
3666 SettingsPageItem::SettingItem(SettingItem {
3667 title: "Button",
3668 description: "Whether to show the debug button in the status bar",
3669 field: Box::new(SettingField {
3670 pick: |settings_content| {
3671 if let Some(debugger) = &settings_content.debugger {
3672 &debugger.button
3673 } else {
3674 &None
3675 }
3676 },
3677 pick_mut: |settings_content| {
3678 &mut settings_content.debugger.get_or_insert_default().button
3679 },
3680 }),
3681 metadata: None,
3682 files: USER,
3683 }),
3684 ],
3685 },
3686 SettingsPage {
3687 title: "Collaboration",
3688 items: vec![
3689 SettingsPageItem::SectionHeader("Calls"),
3690 SettingsPageItem::SettingItem(SettingItem {
3691 title: "Mute On Join",
3692 description: "Whether the microphone should be muted when joining a channel or a call",
3693 field: Box::new(SettingField {
3694 pick: |settings_content| {
3695 if let Some(calls) = &settings_content.calls {
3696 &calls.mute_on_join
3697 } else {
3698 &None
3699 }
3700 },
3701 pick_mut: |settings_content| {
3702 &mut settings_content.calls.get_or_insert_default().mute_on_join
3703 },
3704 }),
3705 metadata: None,
3706 files: USER,
3707 }),
3708 SettingsPageItem::SettingItem(SettingItem {
3709 title: "Share On Join",
3710 description: "Whether your current project should be shared when joining an empty channel",
3711 field: Box::new(SettingField {
3712 pick: |settings_content| {
3713 if let Some(calls) = &settings_content.calls {
3714 &calls.share_on_join
3715 } else {
3716 &None
3717 }
3718 },
3719 pick_mut: |settings_content| {
3720 &mut settings_content.calls.get_or_insert_default().share_on_join
3721 },
3722 }),
3723 metadata: None,
3724 files: USER,
3725 }),
3726 SettingsPageItem::SectionHeader("Experimental"),
3727 SettingsPageItem::SettingItem(SettingItem {
3728 title: "Rodio Audio",
3729 description: "Opt into the new audio system",
3730 field: Box::new(SettingField {
3731 pick: |settings_content| {
3732 if let Some(audio) = &settings_content.audio {
3733 &audio.rodio_audio
3734 } else {
3735 &None
3736 }
3737 },
3738 pick_mut: |settings_content| {
3739 &mut settings_content.audio.get_or_insert_default().rodio_audio
3740 },
3741 }),
3742 metadata: None,
3743 files: USER,
3744 }),
3745 SettingsPageItem::SettingItem(SettingItem {
3746 title: "Auto Microphone Volume",
3747 description: "Automatically adjust microphone volume (requires Rodio Audio)",
3748 field: Box::new(SettingField {
3749 pick: |settings_content| {
3750 if let Some(audio) = &settings_content.audio {
3751 &audio.auto_microphone_volume
3752 } else {
3753 &None
3754 }
3755 },
3756 pick_mut: |settings_content| {
3757 &mut settings_content
3758 .audio
3759 .get_or_insert_default()
3760 .auto_microphone_volume
3761 },
3762 }),
3763 metadata: None,
3764 files: USER,
3765 }),
3766 SettingsPageItem::SettingItem(SettingItem {
3767 title: "Auto Speaker Volume",
3768 description: "Automatically adjust volume of other call members (requires Rodio Audio)",
3769 field: Box::new(SettingField {
3770 pick: |settings_content| {
3771 if let Some(audio) = &settings_content.audio {
3772 &audio.auto_speaker_volume
3773 } else {
3774 &None
3775 }
3776 },
3777 pick_mut: |settings_content| {
3778 &mut settings_content
3779 .audio
3780 .get_or_insert_default()
3781 .auto_speaker_volume
3782 },
3783 }),
3784 metadata: None,
3785 files: USER,
3786 }),
3787 SettingsPageItem::SettingItem(SettingItem {
3788 title: "Denoise",
3789 description: "Remove background noises (requires Rodio Audio)",
3790 field: Box::new(SettingField {
3791 pick: |settings_content| {
3792 if let Some(audio) = &settings_content.audio {
3793 &audio.denoise
3794 } else {
3795 &None
3796 }
3797 },
3798 pick_mut: |settings_content| {
3799 &mut settings_content.audio.get_or_insert_default().denoise
3800 },
3801 }),
3802 metadata: None,
3803 files: USER,
3804 }),
3805 SettingsPageItem::SettingItem(SettingItem {
3806 title: "Legacy Audio Compatible",
3807 description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
3808 field: Box::new(SettingField {
3809 pick: |settings_content| {
3810 if let Some(audio) = &settings_content.audio {
3811 &audio.legacy_audio_compatible
3812 } else {
3813 &None
3814 }
3815 },
3816 pick_mut: |settings_content| {
3817 &mut settings_content
3818 .audio
3819 .get_or_insert_default()
3820 .legacy_audio_compatible
3821 },
3822 }),
3823 metadata: None,
3824 files: USER,
3825 }),
3826 ],
3827 },
3828 SettingsPage {
3829 title: "AI",
3830 items: vec![
3831 SettingsPageItem::SectionHeader("General"),
3832 SettingsPageItem::SettingItem(SettingItem {
3833 title: "Disable AI",
3834 description: "Whether to disable all AI features in Zed",
3835 field: Box::new(SettingField {
3836 pick: |settings_content| &settings_content.disable_ai,
3837 pick_mut: |settings_content| &mut settings_content.disable_ai,
3838 }),
3839 metadata: None,
3840 files: USER,
3841 }),
3842 ],
3843 },
3844 ]
3845}
3846
3847const LANGUAGES_SECTION_HEADER: &'static str = "Languages";
3848
3849fn language_settings_data() -> Vec<SettingsPageItem> {
3850 fn current_language() -> Option<SharedString> {
3851 sub_page_stack().iter().find_map(|page| {
3852 (page.section_header == LANGUAGES_SECTION_HEADER)
3853 .then(|| SharedString::new_static(page.link.title))
3854 })
3855 }
3856
3857 fn language_settings_field<T>(
3858 settings_content: &SettingsContent,
3859 get: fn(&LanguageSettingsContent) -> &Option<T>,
3860 ) -> &Option<T> {
3861 let all_languages = &settings_content.project.all_languages;
3862 if let Some(current_language_name) = current_language() {
3863 if let Some(current_language) = all_languages.languages.0.get(¤t_language_name) {
3864 let value = get(current_language);
3865 if value.is_some() {
3866 return value;
3867 }
3868 }
3869 }
3870 let default_value = get(&all_languages.defaults);
3871 return default_value;
3872 }
3873
3874 fn language_settings_field_mut<T>(
3875 settings_content: &mut SettingsContent,
3876 get: fn(&mut LanguageSettingsContent) -> &mut Option<T>,
3877 ) -> &mut Option<T> {
3878 let all_languages = &mut settings_content.project.all_languages;
3879 let language_content = if let Some(current_language) = current_language() {
3880 all_languages
3881 .languages
3882 .0
3883 .entry(current_language)
3884 .or_default()
3885 } else {
3886 &mut all_languages.defaults
3887 };
3888 return get(language_content);
3889 }
3890
3891 vec![
3892 SettingsPageItem::SectionHeader("Indentation"),
3893 SettingsPageItem::SettingItem(SettingItem {
3894 title: "Tab Size",
3895 description: "How many columns a tab should occupy",
3896 field: Box::new(SettingField {
3897 pick: |settings_content| {
3898 language_settings_field(settings_content, |language| &language.tab_size)
3899 },
3900 pick_mut: |settings_content| {
3901 language_settings_field_mut(settings_content, |language| &mut language.tab_size)
3902 },
3903 }),
3904 metadata: None,
3905 files: USER | LOCAL,
3906 }),
3907 SettingsPageItem::SettingItem(SettingItem {
3908 title: "Hard Tabs",
3909 description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
3910 field: Box::new(SettingField {
3911 pick: |settings_content| {
3912 language_settings_field(settings_content, |language| &language.hard_tabs)
3913 },
3914 pick_mut: |settings_content| {
3915 language_settings_field_mut(settings_content, |language| {
3916 &mut language.hard_tabs
3917 })
3918 },
3919 }),
3920 metadata: None,
3921 files: USER | LOCAL,
3922 }),
3923 SettingsPageItem::SettingItem(SettingItem {
3924 title: "Auto Indent",
3925 description: "Whether indentation should be adjusted based on the context whilst typing",
3926 field: Box::new(SettingField {
3927 pick: |settings_content| {
3928 language_settings_field(settings_content, |language| &language.auto_indent)
3929 },
3930 pick_mut: |settings_content| {
3931 language_settings_field_mut(settings_content, |language| {
3932 &mut language.auto_indent
3933 })
3934 },
3935 }),
3936 metadata: None,
3937 files: USER | LOCAL,
3938 }),
3939 SettingsPageItem::SettingItem(SettingItem {
3940 title: "Auto Indent On Paste",
3941 description: "Whether indentation of pasted content should be adjusted based on the context",
3942 field: Box::new(SettingField {
3943 pick: |settings_content| {
3944 language_settings_field(settings_content, |language| {
3945 &language.auto_indent_on_paste
3946 })
3947 },
3948 pick_mut: |settings_content| {
3949 language_settings_field_mut(settings_content, |language| {
3950 &mut language.auto_indent_on_paste
3951 })
3952 },
3953 }),
3954 metadata: None,
3955 files: USER | LOCAL,
3956 }),
3957 SettingsPageItem::SectionHeader("Wrapping"),
3958 SettingsPageItem::SettingItem(SettingItem {
3959 title: "Soft Wrap",
3960 description: "How to soft-wrap long lines of text",
3961 field: Box::new(SettingField {
3962 pick: |settings_content| {
3963 language_settings_field(settings_content, |language| &language.soft_wrap)
3964 },
3965 pick_mut: |settings_content| {
3966 language_settings_field_mut(settings_content, |language| {
3967 &mut language.soft_wrap
3968 })
3969 },
3970 }),
3971 metadata: None,
3972 files: USER | LOCAL,
3973 }),
3974 SettingsPageItem::SettingItem(SettingItem {
3975 title: "Show Wrap Guides",
3976 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",
3977 field: Box::new(SettingField {
3978 pick: |settings_content| {
3979 language_settings_field(settings_content, |language| &language.show_wrap_guides)
3980 },
3981 pick_mut: |settings_content| {
3982 language_settings_field_mut(settings_content, |language| {
3983 &mut language.show_wrap_guides
3984 })
3985 },
3986 }),
3987 metadata: None,
3988 files: USER | LOCAL,
3989 }),
3990 SettingsPageItem::SettingItem(SettingItem {
3991 title: "Preferred Line Length",
3992 description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
3993 field: Box::new(SettingField {
3994 pick: |settings_content| {
3995 language_settings_field(settings_content, |language| {
3996 &language.preferred_line_length
3997 })
3998 },
3999 pick_mut: |settings_content| {
4000 language_settings_field_mut(settings_content, |language| {
4001 &mut language.preferred_line_length
4002 })
4003 },
4004 }),
4005 metadata: None,
4006 files: USER | LOCAL,
4007 }),
4008 SettingsPageItem::SettingItem(SettingItem {
4009 title: "Wrap Guides",
4010 description: "Character counts at which to show wrap guides in the editor",
4011 field: Box::new(
4012 SettingField {
4013 pick: |settings_content| {
4014 language_settings_field(settings_content, |language| &language.wrap_guides)
4015 },
4016 pick_mut: |settings_content| {
4017 language_settings_field_mut(settings_content, |language| {
4018 &mut language.wrap_guides
4019 })
4020 },
4021 }
4022 .unimplemented(),
4023 ),
4024 metadata: None,
4025 files: USER | LOCAL,
4026 }),
4027 SettingsPageItem::SettingItem(SettingItem {
4028 title: "Allow Rewrap",
4029 description: "Controls where the `editor::Rewrap` action is allowed for this language",
4030 field: Box::new(SettingField {
4031 pick: |settings_content| {
4032 language_settings_field(settings_content, |language| &language.allow_rewrap)
4033 },
4034 pick_mut: |settings_content| {
4035 language_settings_field_mut(settings_content, |language| {
4036 &mut language.allow_rewrap
4037 })
4038 },
4039 }),
4040 metadata: None,
4041 files: USER | LOCAL,
4042 }),
4043 SettingsPageItem::SectionHeader("Indent Guides"),
4044 SettingsPageItem::SettingItem(SettingItem {
4045 title: "Enabled",
4046 description: "Whether to display indent guides in the editor",
4047 field: Box::new(SettingField {
4048 pick: |settings_content| {
4049 language_settings_field(settings_content, |language| {
4050 if let Some(indent_guides) = &language.indent_guides {
4051 &indent_guides.enabled
4052 } else {
4053 &None
4054 }
4055 })
4056 },
4057 pick_mut: |settings_content| {
4058 language_settings_field_mut(settings_content, |language| {
4059 &mut language.indent_guides.get_or_insert_default().enabled
4060 })
4061 },
4062 }),
4063 metadata: None,
4064 files: USER | LOCAL,
4065 }),
4066 SettingsPageItem::SettingItem(SettingItem {
4067 title: "Line Width",
4068 description: "The width of the indent guides in pixels, between 1 and 10",
4069 field: Box::new(SettingField {
4070 pick: |settings_content| {
4071 language_settings_field(settings_content, |language| {
4072 if let Some(indent_guides) = &language.indent_guides {
4073 &indent_guides.line_width
4074 } else {
4075 &None
4076 }
4077 })
4078 },
4079 pick_mut: |settings_content| {
4080 language_settings_field_mut(settings_content, |language| {
4081 &mut language.indent_guides.get_or_insert_default().line_width
4082 })
4083 },
4084 }),
4085 metadata: None,
4086 files: USER | LOCAL,
4087 }),
4088 SettingsPageItem::SettingItem(SettingItem {
4089 title: "Active Line Width",
4090 description: "The width of the active indent guide in pixels, between 1 and 10",
4091 field: Box::new(SettingField {
4092 pick: |settings_content| {
4093 language_settings_field(settings_content, |language| {
4094 if let Some(indent_guides) = &language.indent_guides {
4095 &indent_guides.active_line_width
4096 } else {
4097 &None
4098 }
4099 })
4100 },
4101 pick_mut: |settings_content| {
4102 language_settings_field_mut(settings_content, |language| {
4103 &mut language
4104 .indent_guides
4105 .get_or_insert_default()
4106 .active_line_width
4107 })
4108 },
4109 }),
4110 metadata: None,
4111 files: USER | LOCAL,
4112 }),
4113 SettingsPageItem::SettingItem(SettingItem {
4114 title: "Coloring",
4115 description: "Determines how indent guides are colored",
4116 field: Box::new(SettingField {
4117 pick: |settings_content| {
4118 language_settings_field(settings_content, |language| {
4119 if let Some(indent_guides) = &language.indent_guides {
4120 &indent_guides.coloring
4121 } else {
4122 &None
4123 }
4124 })
4125 },
4126 pick_mut: |settings_content| {
4127 language_settings_field_mut(settings_content, |language| {
4128 &mut language.indent_guides.get_or_insert_default().coloring
4129 })
4130 },
4131 }),
4132 metadata: None,
4133 files: USER | LOCAL,
4134 }),
4135 SettingsPageItem::SettingItem(SettingItem {
4136 title: "Background Coloring",
4137 description: "Determines how indent guide backgrounds are colored",
4138 field: Box::new(SettingField {
4139 pick: |settings_content| {
4140 language_settings_field(settings_content, |language| {
4141 if let Some(indent_guides) = &language.indent_guides {
4142 &indent_guides.background_coloring
4143 } else {
4144 &None
4145 }
4146 })
4147 },
4148 pick_mut: |settings_content| {
4149 language_settings_field_mut(settings_content, |language| {
4150 &mut language
4151 .indent_guides
4152 .get_or_insert_default()
4153 .background_coloring
4154 })
4155 },
4156 }),
4157 metadata: None,
4158 files: USER | LOCAL,
4159 }),
4160 SettingsPageItem::SectionHeader("Formatting"),
4161 SettingsPageItem::SettingItem(SettingItem {
4162 title: "Format On Save",
4163 description: "Whether or not to perform a buffer format before saving",
4164 field: Box::new(
4165 // TODO(settings_ui): this setting should just be a bool
4166 SettingField {
4167 pick: |settings_content| {
4168 language_settings_field(settings_content, |language| {
4169 &language.format_on_save
4170 })
4171 },
4172 pick_mut: |settings_content| {
4173 language_settings_field_mut(settings_content, |language| {
4174 &mut language.format_on_save
4175 })
4176 },
4177 },
4178 ),
4179 metadata: None,
4180 files: USER | LOCAL,
4181 }),
4182 SettingsPageItem::SettingItem(SettingItem {
4183 title: "Remove Trailing Whitespace On Save",
4184 description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4185 field: Box::new(SettingField {
4186 pick: |settings_content| {
4187 language_settings_field(settings_content, |language| {
4188 &language.remove_trailing_whitespace_on_save
4189 })
4190 },
4191 pick_mut: |settings_content| {
4192 language_settings_field_mut(settings_content, |language| {
4193 &mut language.remove_trailing_whitespace_on_save
4194 })
4195 },
4196 }),
4197 metadata: None,
4198 files: USER | LOCAL,
4199 }),
4200 SettingsPageItem::SettingItem(SettingItem {
4201 title: "Ensure Final Newline On Save",
4202 description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4203 field: Box::new(SettingField {
4204 pick: |settings_content| {
4205 language_settings_field(settings_content, |language| {
4206 &language.ensure_final_newline_on_save
4207 })
4208 },
4209 pick_mut: |settings_content| {
4210 language_settings_field_mut(settings_content, |language| {
4211 &mut language.ensure_final_newline_on_save
4212 })
4213 },
4214 }),
4215 metadata: None,
4216 files: USER | LOCAL,
4217 }),
4218 SettingsPageItem::SettingItem(SettingItem {
4219 title: "Formatter",
4220 description: "How to perform a buffer format",
4221 field: Box::new(
4222 SettingField {
4223 pick: |settings_content| {
4224 language_settings_field(settings_content, |language| &language.formatter)
4225 },
4226 pick_mut: |settings_content| {
4227 language_settings_field_mut(settings_content, |language| {
4228 &mut language.formatter
4229 })
4230 },
4231 }
4232 .unimplemented(),
4233 ),
4234 metadata: None,
4235 files: USER | LOCAL,
4236 }),
4237 SettingsPageItem::SettingItem(SettingItem {
4238 title: "Use On Type Format",
4239 description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities",
4240 field: Box::new(SettingField {
4241 pick: |settings_content| {
4242 language_settings_field(settings_content, |language| {
4243 &language.use_on_type_format
4244 })
4245 },
4246 pick_mut: |settings_content| {
4247 language_settings_field_mut(settings_content, |language| {
4248 &mut language.use_on_type_format
4249 })
4250 },
4251 }),
4252 metadata: None,
4253 files: USER | LOCAL,
4254 }),
4255 SettingsPageItem::SettingItem(SettingItem {
4256 title: "Code Actions On Format",
4257 description: "Which code actions to run on save after the formatter. These are not run if formatting is off",
4258 field: Box::new(
4259 SettingField {
4260 pick: |settings_content| {
4261 language_settings_field(settings_content, |language| {
4262 &language.code_actions_on_format
4263 })
4264 },
4265 pick_mut: |settings_content| {
4266 language_settings_field_mut(settings_content, |language| {
4267 &mut language.code_actions_on_format
4268 })
4269 },
4270 }
4271 .unimplemented(),
4272 ),
4273 metadata: None,
4274 files: USER | LOCAL,
4275 }),
4276 SettingsPageItem::SectionHeader("Prettier"),
4277 SettingsPageItem::SettingItem(SettingItem {
4278 title: "Allowed",
4279 description: "Enables or disables formatting with Prettier for a given language",
4280 field: Box::new(SettingField {
4281 pick: |settings_content| {
4282 language_settings_field(settings_content, |language| {
4283 if let Some(prettier) = &language.prettier {
4284 &prettier.allowed
4285 } else {
4286 &None
4287 }
4288 })
4289 },
4290 pick_mut: |settings_content| {
4291 language_settings_field_mut(settings_content, |language| {
4292 &mut language.prettier.get_or_insert_default().allowed
4293 })
4294 },
4295 }),
4296 metadata: None,
4297 files: USER | LOCAL,
4298 }),
4299 SettingsPageItem::SettingItem(SettingItem {
4300 title: "Parser",
4301 description: "Forces Prettier integration to use a specific parser name when formatting files with the language",
4302 field: Box::new(SettingField {
4303 pick: |settings_content| {
4304 language_settings_field(settings_content, |language| {
4305 if let Some(prettier) = &language.prettier {
4306 &prettier.parser
4307 } else {
4308 &None
4309 }
4310 })
4311 },
4312 pick_mut: |settings_content| {
4313 language_settings_field_mut(settings_content, |language| {
4314 &mut language.prettier.get_or_insert_default().parser
4315 })
4316 },
4317 }),
4318 metadata: None,
4319 files: USER | LOCAL,
4320 }),
4321 SettingsPageItem::SettingItem(SettingItem {
4322 title: "Plugins",
4323 description: "Forces Prettier integration to use specific plugins when formatting files with the language",
4324 field: Box::new(
4325 SettingField {
4326 pick: |settings_content| {
4327 language_settings_field(settings_content, |language| {
4328 if let Some(prettier) = &language.prettier {
4329 &prettier.plugins
4330 } else {
4331 &None
4332 }
4333 })
4334 },
4335 pick_mut: |settings_content| {
4336 language_settings_field_mut(settings_content, |language| {
4337 &mut language.prettier.get_or_insert_default().plugins
4338 })
4339 },
4340 }
4341 .unimplemented(),
4342 ),
4343 metadata: None,
4344 files: USER | LOCAL,
4345 }),
4346 SettingsPageItem::SettingItem(SettingItem {
4347 title: "Options",
4348 description: "Default Prettier options, in the format as in package.json section for Prettier",
4349 field: Box::new(
4350 SettingField {
4351 pick: |settings_content| {
4352 language_settings_field(settings_content, |language| {
4353 if let Some(prettier) = &language.prettier {
4354 &prettier.options
4355 } else {
4356 &None
4357 }
4358 })
4359 },
4360 pick_mut: |settings_content| {
4361 language_settings_field_mut(settings_content, |language| {
4362 &mut language.prettier.get_or_insert_default().options
4363 })
4364 },
4365 }
4366 .unimplemented(),
4367 ),
4368 metadata: None,
4369 files: USER | LOCAL,
4370 }),
4371 SettingsPageItem::SectionHeader("Autoclose"),
4372 SettingsPageItem::SettingItem(SettingItem {
4373 title: "Use Autoclose",
4374 description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position",
4375 field: Box::new(SettingField {
4376 pick: |settings_content| {
4377 language_settings_field(settings_content, |language| &language.use_autoclose)
4378 },
4379 pick_mut: |settings_content| {
4380 language_settings_field_mut(settings_content, |language| {
4381 &mut language.use_autoclose
4382 })
4383 },
4384 }),
4385 metadata: None,
4386 files: USER | LOCAL,
4387 }),
4388 SettingsPageItem::SettingItem(SettingItem {
4389 title: "Use Auto Surround",
4390 description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()",
4391 field: Box::new(SettingField {
4392 pick: |settings_content| {
4393 language_settings_field(settings_content, |language| {
4394 &language.use_auto_surround
4395 })
4396 },
4397 pick_mut: |settings_content| {
4398 language_settings_field_mut(settings_content, |language| {
4399 &mut language.use_auto_surround
4400 })
4401 },
4402 }),
4403 metadata: None,
4404 files: USER | LOCAL,
4405 }),
4406 SettingsPageItem::SettingItem(SettingItem {
4407 title: "Always Treat Brackets As Autoclosed",
4408 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",
4409 field: Box::new(SettingField {
4410 pick: |settings_content| {
4411 language_settings_field(settings_content, |language| {
4412 &language.always_treat_brackets_as_autoclosed
4413 })
4414 },
4415 pick_mut: |settings_content| {
4416 language_settings_field_mut(settings_content, |language| {
4417 &mut language.always_treat_brackets_as_autoclosed
4418 })
4419 },
4420 }),
4421 metadata: None,
4422 files: USER | LOCAL,
4423 }),
4424 SettingsPageItem::SettingItem(SettingItem {
4425 title: "Jsx Tag Auto Close",
4426 description: "Whether to automatically close JSX tags",
4427 field: Box::new(SettingField {
4428 // TODO(settings_ui): this setting should just be a bool
4429 pick: |settings_content| {
4430 language_settings_field(settings_content, |language| {
4431 match language.jsx_tag_auto_close.as_ref() {
4432 Some(s) => &s.enabled,
4433 None => &None,
4434 }
4435 })
4436 },
4437 pick_mut: |settings_content| {
4438 language_settings_field_mut(settings_content, |language| {
4439 &mut language.jsx_tag_auto_close.get_or_insert_default().enabled
4440 })
4441 },
4442 }),
4443 metadata: None,
4444 files: USER | LOCAL,
4445 }),
4446 SettingsPageItem::SectionHeader("LSP"),
4447 SettingsPageItem::SettingItem(SettingItem {
4448 title: "Enable Language Server",
4449 description: "Whether to use language servers to provide code intelligence",
4450 field: Box::new(SettingField {
4451 pick: |settings_content| {
4452 language_settings_field(settings_content, |language| {
4453 &language.enable_language_server
4454 })
4455 },
4456 pick_mut: |settings_content| {
4457 language_settings_field_mut(settings_content, |language| {
4458 &mut language.enable_language_server
4459 })
4460 },
4461 }),
4462 metadata: None,
4463 files: USER | LOCAL,
4464 }),
4465 SettingsPageItem::SettingItem(SettingItem {
4466 title: "Language Servers",
4467 description: "The list of language servers to use (or disable) for this language",
4468 field: Box::new(
4469 SettingField {
4470 pick: |settings_content| {
4471 language_settings_field(settings_content, |language| {
4472 &language.language_servers
4473 })
4474 },
4475 pick_mut: |settings_content| {
4476 language_settings_field_mut(settings_content, |language| {
4477 &mut language.language_servers
4478 })
4479 },
4480 }
4481 .unimplemented(),
4482 ),
4483 metadata: None,
4484 files: USER | LOCAL,
4485 }),
4486 SettingsPageItem::SettingItem(SettingItem {
4487 title: "Linked Edits",
4488 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",
4489 field: Box::new(SettingField {
4490 pick: |settings_content| {
4491 language_settings_field(settings_content, |language| &language.linked_edits)
4492 },
4493 pick_mut: |settings_content| {
4494 language_settings_field_mut(settings_content, |language| {
4495 &mut language.linked_edits
4496 })
4497 },
4498 }),
4499 metadata: None,
4500 files: USER | LOCAL,
4501 }),
4502 SettingsPageItem::SectionHeader("Edit Predictions"),
4503 SettingsPageItem::SettingItem(SettingItem {
4504 title: "Show Edit Predictions",
4505 description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)",
4506 field: Box::new(SettingField {
4507 pick: |settings_content| {
4508 language_settings_field(settings_content, |language| {
4509 &language.show_edit_predictions
4510 })
4511 },
4512 pick_mut: |settings_content| {
4513 language_settings_field_mut(settings_content, |language| {
4514 &mut language.show_edit_predictions
4515 })
4516 },
4517 }),
4518 metadata: None,
4519 files: USER | LOCAL,
4520 }),
4521 SettingsPageItem::SettingItem(SettingItem {
4522 title: "Edit Predictions Disabled In",
4523 description: "Controls whether edit predictions are shown in the given language scopes",
4524 field: Box::new(
4525 SettingField {
4526 pick: |settings_content| {
4527 language_settings_field(settings_content, |language| {
4528 &language.edit_predictions_disabled_in
4529 })
4530 },
4531 pick_mut: |settings_content| {
4532 language_settings_field_mut(settings_content, |language| {
4533 &mut language.edit_predictions_disabled_in
4534 })
4535 },
4536 }
4537 .unimplemented(),
4538 ),
4539 metadata: None,
4540 files: USER | LOCAL,
4541 }),
4542 SettingsPageItem::SectionHeader("Whitespace"),
4543 SettingsPageItem::SettingItem(SettingItem {
4544 title: "Show Whitespaces",
4545 description: "Whether to show tabs and spaces in the editor",
4546 field: Box::new(SettingField {
4547 pick: |settings_content| {
4548 language_settings_field(settings_content, |language| &language.show_whitespaces)
4549 },
4550 pick_mut: |settings_content| {
4551 language_settings_field_mut(settings_content, |language| {
4552 &mut language.show_whitespaces
4553 })
4554 },
4555 }),
4556 metadata: None,
4557 files: USER | LOCAL,
4558 }),
4559 SettingsPageItem::SettingItem(SettingItem {
4560 title: "Space Whitespace Indicator",
4561 description: "Visible character used to render space characters when show_whitespaces is enabled (default: \"•\")",
4562 field: Box::new(
4563 SettingField {
4564 pick: |settings_content| {
4565 language_settings_field(settings_content, |language| {
4566 if let Some(whitespace_map) = &language.whitespace_map {
4567 &whitespace_map.space
4568 } else {
4569 &None
4570 }
4571 })
4572 },
4573 pick_mut: |settings_content| {
4574 language_settings_field_mut(settings_content, |language| {
4575 &mut language.whitespace_map.get_or_insert_default().space
4576 })
4577 },
4578 }
4579 .unimplemented(),
4580 ),
4581 metadata: None,
4582 files: USER | LOCAL,
4583 }),
4584 SettingsPageItem::SettingItem(SettingItem {
4585 title: "Tab Whitespace Indicator",
4586 description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"→\")",
4587 field: Box::new(
4588 SettingField {
4589 pick: |settings_content| {
4590 language_settings_field(settings_content, |language| {
4591 if let Some(whitespace_map) = &language.whitespace_map {
4592 &whitespace_map.tab
4593 } else {
4594 &None
4595 }
4596 })
4597 },
4598 pick_mut: |settings_content| {
4599 language_settings_field_mut(settings_content, |language| {
4600 &mut language.whitespace_map.get_or_insert_default().tab
4601 })
4602 },
4603 }
4604 .unimplemented(),
4605 ),
4606 metadata: None,
4607 files: USER | LOCAL,
4608 }),
4609 SettingsPageItem::SectionHeader("Completions"),
4610 SettingsPageItem::SettingItem(SettingItem {
4611 title: "Show Completions On Input",
4612 description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
4613 field: Box::new(SettingField {
4614 pick: |settings_content| {
4615 language_settings_field(settings_content, |language| {
4616 &language.show_completions_on_input
4617 })
4618 },
4619 pick_mut: |settings_content| {
4620 language_settings_field_mut(settings_content, |language| {
4621 &mut language.show_completions_on_input
4622 })
4623 },
4624 }),
4625 metadata: None,
4626 files: USER | LOCAL,
4627 }),
4628 SettingsPageItem::SettingItem(SettingItem {
4629 title: "Show Completion Documentation",
4630 description: "Whether to display inline and alongside documentation for items in the completions menu",
4631 field: Box::new(SettingField {
4632 pick: |settings_content| {
4633 language_settings_field(settings_content, |language| {
4634 &language.show_completion_documentation
4635 })
4636 },
4637 pick_mut: |settings_content| {
4638 language_settings_field_mut(settings_content, |language| {
4639 &mut language.show_completion_documentation
4640 })
4641 },
4642 }),
4643 metadata: None,
4644 files: USER | LOCAL,
4645 }),
4646 SettingsPageItem::SettingItem(SettingItem {
4647 title: "Words",
4648 description: "Controls how words are completed",
4649 field: Box::new(SettingField {
4650 pick: |settings_content| {
4651 language_settings_field(settings_content, |language| {
4652 if let Some(completions) = &language.completions {
4653 &completions.words
4654 } else {
4655 &None
4656 }
4657 })
4658 },
4659 pick_mut: |settings_content| {
4660 language_settings_field_mut(settings_content, |language| {
4661 &mut language.completions.get_or_insert_default().words
4662 })
4663 },
4664 }),
4665 metadata: None,
4666 files: USER | LOCAL,
4667 }),
4668 SettingsPageItem::SettingItem(SettingItem {
4669 title: "Words Min Length",
4670 description: "How many characters has to be in the completions query to automatically show the words-based completions",
4671 field: Box::new(SettingField {
4672 pick: |settings_content| {
4673 language_settings_field(settings_content, |language| {
4674 if let Some(completions) = &language.completions {
4675 &completions.words_min_length
4676 } else {
4677 &None
4678 }
4679 })
4680 },
4681 pick_mut: |settings_content| {
4682 language_settings_field_mut(settings_content, |language| {
4683 &mut language
4684 .completions
4685 .get_or_insert_default()
4686 .words_min_length
4687 })
4688 },
4689 }),
4690 metadata: None,
4691 files: USER | LOCAL,
4692 }),
4693 SettingsPageItem::SettingItem(SettingItem {
4694 title: "Lsp",
4695 description: "Whether to fetch LSP completions or not",
4696 field: Box::new(SettingField {
4697 pick: |settings_content| {
4698 language_settings_field(settings_content, |language| {
4699 if let Some(completions) = &language.completions {
4700 &completions.lsp
4701 } else {
4702 &None
4703 }
4704 })
4705 },
4706 pick_mut: |settings_content| {
4707 language_settings_field_mut(settings_content, |language| {
4708 &mut language.completions.get_or_insert_default().lsp
4709 })
4710 },
4711 }),
4712 metadata: None,
4713 files: USER | LOCAL,
4714 }),
4715 SettingsPageItem::SettingItem(SettingItem {
4716 title: "Lsp Fetch Timeout Ms",
4717 description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)",
4718 field: Box::new(SettingField {
4719 pick: |settings_content| {
4720 language_settings_field(settings_content, |language| {
4721 if let Some(completions) = &language.completions {
4722 &completions.lsp_fetch_timeout_ms
4723 } else {
4724 &None
4725 }
4726 })
4727 },
4728 pick_mut: |settings_content| {
4729 language_settings_field_mut(settings_content, |language| {
4730 &mut language
4731 .completions
4732 .get_or_insert_default()
4733 .lsp_fetch_timeout_ms
4734 })
4735 },
4736 }),
4737 metadata: None,
4738 files: USER | LOCAL,
4739 }),
4740 SettingsPageItem::SettingItem(SettingItem {
4741 title: "Lsp Insert Mode",
4742 description: "Controls how LSP completions are inserted",
4743 field: Box::new(SettingField {
4744 pick: |settings_content| {
4745 language_settings_field(settings_content, |language| {
4746 if let Some(completions) = &language.completions {
4747 &completions.lsp_insert_mode
4748 } else {
4749 &None
4750 }
4751 })
4752 },
4753 pick_mut: |settings_content| {
4754 language_settings_field_mut(settings_content, |language| {
4755 &mut language.completions.get_or_insert_default().lsp_insert_mode
4756 })
4757 },
4758 }),
4759 metadata: None,
4760 files: USER | LOCAL,
4761 }),
4762 SettingsPageItem::SectionHeader("Inlay Hints"),
4763 SettingsPageItem::SettingItem(SettingItem {
4764 title: "Enabled",
4765 description: "Global switch to toggle hints on and off",
4766 field: Box::new(SettingField {
4767 pick: |settings_content| {
4768 language_settings_field(settings_content, |language| {
4769 if let Some(inlay_hints) = &language.inlay_hints {
4770 &inlay_hints.enabled
4771 } else {
4772 &None
4773 }
4774 })
4775 },
4776 pick_mut: |settings_content| {
4777 language_settings_field_mut(settings_content, |language| {
4778 &mut language.inlay_hints.get_or_insert_default().enabled
4779 })
4780 },
4781 }),
4782 metadata: None,
4783 files: USER | LOCAL,
4784 }),
4785 SettingsPageItem::SettingItem(SettingItem {
4786 title: "Show Value Hints",
4787 description: "Global switch to toggle inline values on and off when debugging",
4788 field: Box::new(SettingField {
4789 pick: |settings_content| {
4790 language_settings_field(settings_content, |language| {
4791 if let Some(inlay_hints) = &language.inlay_hints {
4792 &inlay_hints.show_value_hints
4793 } else {
4794 &None
4795 }
4796 })
4797 },
4798 pick_mut: |settings_content| {
4799 language_settings_field_mut(settings_content, |language| {
4800 &mut language
4801 .inlay_hints
4802 .get_or_insert_default()
4803 .show_value_hints
4804 })
4805 },
4806 }),
4807 metadata: None,
4808 files: USER | LOCAL,
4809 }),
4810 SettingsPageItem::SettingItem(SettingItem {
4811 title: "Show Type Hints",
4812 description: "Whether type hints should be shown",
4813 field: Box::new(SettingField {
4814 pick: |settings_content| {
4815 language_settings_field(settings_content, |language| {
4816 if let Some(inlay_hints) = &language.inlay_hints {
4817 &inlay_hints.show_type_hints
4818 } else {
4819 &None
4820 }
4821 })
4822 },
4823 pick_mut: |settings_content| {
4824 language_settings_field_mut(settings_content, |language| {
4825 &mut language.inlay_hints.get_or_insert_default().show_type_hints
4826 })
4827 },
4828 }),
4829 metadata: None,
4830 files: USER | LOCAL,
4831 }),
4832 SettingsPageItem::SettingItem(SettingItem {
4833 title: "Show Parameter Hints",
4834 description: "Whether parameter hints should be shown",
4835 field: Box::new(SettingField {
4836 pick: |settings_content| {
4837 language_settings_field(settings_content, |language| {
4838 if let Some(inlay_hints) = &language.inlay_hints {
4839 &inlay_hints.show_parameter_hints
4840 } else {
4841 &None
4842 }
4843 })
4844 },
4845 pick_mut: |settings_content| {
4846 language_settings_field_mut(settings_content, |language| {
4847 &mut language
4848 .inlay_hints
4849 .get_or_insert_default()
4850 .show_parameter_hints
4851 })
4852 },
4853 }),
4854 metadata: None,
4855 files: USER | LOCAL,
4856 }),
4857 SettingsPageItem::SettingItem(SettingItem {
4858 title: "Show Other Hints",
4859 description: "Whether other hints should be shown",
4860 field: Box::new(SettingField {
4861 pick: |settings_content| {
4862 language_settings_field(settings_content, |language| {
4863 if let Some(inlay_hints) = &language.inlay_hints {
4864 &inlay_hints.show_other_hints
4865 } else {
4866 &None
4867 }
4868 })
4869 },
4870 pick_mut: |settings_content| {
4871 language_settings_field_mut(settings_content, |language| {
4872 &mut language
4873 .inlay_hints
4874 .get_or_insert_default()
4875 .show_other_hints
4876 })
4877 },
4878 }),
4879 metadata: None,
4880 files: USER | LOCAL,
4881 }),
4882 SettingsPageItem::SettingItem(SettingItem {
4883 title: "Show Background",
4884 description: "Whether to show a background for inlay hints",
4885 field: Box::new(SettingField {
4886 pick: |settings_content| {
4887 language_settings_field(settings_content, |language| {
4888 if let Some(inlay_hints) = &language.inlay_hints {
4889 &inlay_hints.show_background
4890 } else {
4891 &None
4892 }
4893 })
4894 },
4895 pick_mut: |settings_content| {
4896 language_settings_field_mut(settings_content, |language| {
4897 &mut language.inlay_hints.get_or_insert_default().show_background
4898 })
4899 },
4900 }),
4901 metadata: None,
4902 files: USER | LOCAL,
4903 }),
4904 SettingsPageItem::SettingItem(SettingItem {
4905 title: "Edit Debounce Ms",
4906 description: "Whether or not to debounce inlay hints updates after buffer edits (set to 0 to disable debouncing)",
4907 field: Box::new(SettingField {
4908 pick: |settings_content| {
4909 language_settings_field(settings_content, |language| {
4910 if let Some(inlay_hints) = &language.inlay_hints {
4911 &inlay_hints.edit_debounce_ms
4912 } else {
4913 &None
4914 }
4915 })
4916 },
4917 pick_mut: |settings_content| {
4918 language_settings_field_mut(settings_content, |language| {
4919 &mut language
4920 .inlay_hints
4921 .get_or_insert_default()
4922 .edit_debounce_ms
4923 })
4924 },
4925 }),
4926 metadata: None,
4927 files: USER | LOCAL,
4928 }),
4929 SettingsPageItem::SettingItem(SettingItem {
4930 title: "Scroll Debounce Ms",
4931 description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)",
4932 field: Box::new(SettingField {
4933 pick: |settings_content| {
4934 language_settings_field(settings_content, |language| {
4935 if let Some(inlay_hints) = &language.inlay_hints {
4936 &inlay_hints.scroll_debounce_ms
4937 } else {
4938 &None
4939 }
4940 })
4941 },
4942 pick_mut: |settings_content| {
4943 language_settings_field_mut(settings_content, |language| {
4944 &mut language
4945 .inlay_hints
4946 .get_or_insert_default()
4947 .scroll_debounce_ms
4948 })
4949 },
4950 }),
4951 metadata: None,
4952 files: USER | LOCAL,
4953 }),
4954 SettingsPageItem::SettingItem(SettingItem {
4955 title: "Toggle On Modifiers Press",
4956 description: "Toggles inlay hints (hides or shows) when the user | LOCAL presses the modifiers specified",
4957 field: Box::new(
4958 SettingField {
4959 pick: |settings_content| {
4960 language_settings_field(settings_content, |language| {
4961 if let Some(inlay_hints) = &language.inlay_hints {
4962 &inlay_hints.toggle_on_modifiers_press
4963 } else {
4964 &None
4965 }
4966 })
4967 },
4968 pick_mut: |settings_content| {
4969 language_settings_field_mut(settings_content, |language| {
4970 &mut language
4971 .inlay_hints
4972 .get_or_insert_default()
4973 .toggle_on_modifiers_press
4974 })
4975 },
4976 }
4977 .unimplemented(),
4978 ),
4979 metadata: None,
4980 files: USER | LOCAL,
4981 }),
4982 SettingsPageItem::SectionHeader("Tasks"),
4983 SettingsPageItem::SettingItem(SettingItem {
4984 title: "Enabled",
4985 description: "Whether tasks are enabled for this language",
4986 field: Box::new(SettingField {
4987 pick: |settings_content| {
4988 language_settings_field(settings_content, |language| {
4989 if let Some(tasks) = &language.tasks {
4990 &tasks.enabled
4991 } else {
4992 &None
4993 }
4994 })
4995 },
4996 pick_mut: |settings_content| {
4997 language_settings_field_mut(settings_content, |language| {
4998 &mut language.tasks.get_or_insert_default().enabled
4999 })
5000 },
5001 }),
5002 metadata: None,
5003 files: USER | LOCAL,
5004 }),
5005 SettingsPageItem::SettingItem(SettingItem {
5006 title: "Variables",
5007 description: "Extra task variables to set for a particular language",
5008 field: Box::new(
5009 SettingField {
5010 pick: |settings_content| {
5011 language_settings_field(settings_content, |language| {
5012 if let Some(tasks) = &language.tasks {
5013 &tasks.variables
5014 } else {
5015 &None
5016 }
5017 })
5018 },
5019 pick_mut: |settings_content| {
5020 language_settings_field_mut(settings_content, |language| {
5021 &mut language.tasks.get_or_insert_default().variables
5022 })
5023 },
5024 }
5025 .unimplemented(),
5026 ),
5027 metadata: None,
5028 files: USER | LOCAL,
5029 }),
5030 SettingsPageItem::SettingItem(SettingItem {
5031 title: "Prefer Lsp",
5032 description: "Use LSP tasks over Zed language extension ones",
5033 field: Box::new(SettingField {
5034 pick: |settings_content| {
5035 language_settings_field(settings_content, |language| {
5036 if let Some(tasks) = &language.tasks {
5037 &tasks.prefer_lsp
5038 } else {
5039 &None
5040 }
5041 })
5042 },
5043 pick_mut: |settings_content| {
5044 language_settings_field_mut(settings_content, |language| {
5045 &mut language.tasks.get_or_insert_default().prefer_lsp
5046 })
5047 },
5048 }),
5049 metadata: None,
5050 files: USER | LOCAL,
5051 }),
5052 SettingsPageItem::SectionHeader("Miscellaneous"),
5053 SettingsPageItem::SettingItem(SettingItem {
5054 title: "Debuggers",
5055 description: "Preferred debuggers for this language",
5056 field: Box::new(
5057 SettingField {
5058 pick: |settings_content| {
5059 language_settings_field(settings_content, |language| &language.debuggers)
5060 },
5061 pick_mut: |settings_content| {
5062 language_settings_field_mut(settings_content, |language| {
5063 &mut language.debuggers
5064 })
5065 },
5066 }
5067 .unimplemented(),
5068 ),
5069 metadata: None,
5070 files: USER | LOCAL,
5071 }),
5072 SettingsPageItem::SettingItem(SettingItem {
5073 title: "Extend Comment On Newline",
5074 description: "Whether to start a new line with a comment when a previous line is a comment as well",
5075 field: Box::new(SettingField {
5076 pick: |settings_content| {
5077 language_settings_field(settings_content, |language| {
5078 &language.extend_comment_on_newline
5079 })
5080 },
5081 pick_mut: |settings_content| {
5082 language_settings_field_mut(settings_content, |language| {
5083 &mut language.extend_comment_on_newline
5084 })
5085 },
5086 }),
5087 metadata: None,
5088 files: USER | LOCAL,
5089 }),
5090 ]
5091}