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