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