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