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