diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index dcb78240..49864abb 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -1928,24 +1928,6 @@ fn set_option( Ok(()) } -fn toggle_diagnostics( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - ensure!(args.is_empty(), ":toggle-diagnostics takes no arguments"); - - let (view, _) = current!(cx.editor); - view.diagnostics_handler.toggle_active(); - cx.editor.toggle_diagnostics(); - - Ok(()) -} - /// Toggle boolean config option at runtime. Access nested values by dot /// syntax, for example to toggle smart case search, use `:toggle search.smart- /// case`. @@ -3167,13 +3149,6 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[ fun: read, signature: CommandSignature::positional(&[completers::filename]), }, - TypableCommand { - name: "toggle-diagnostics", - aliases: &["td"], - doc: "Toggle Diagnostics", - fun: toggle_diagnostics, - signature: CommandSignature::all(completers::register) - } ]; pub static TYPABLE_COMMAND_MAP: Lazy> = diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index fd86fe4e..b6a56caf 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -191,8 +191,7 @@ impl EditorView { } let config = doc.config.load(); - if editor.show_diagnostics { - log::error!("{:#?}", editor.show_diagnostics); + if editor.config().enable_diagnostics { let width = view.inner_width(doc); let enable_cursor_line = view .diagnostics_handler @@ -236,7 +235,7 @@ impl EditorView { if config.inline_diagnostics.disabled() && config.end_of_line_diagnostics == DiagnosticFilter::Disable - && editor.show_diagnostics + && editor.config().enable_diagnostics { Self::render_diagnostics(doc, view, inner, surface, theme); } diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index e3e21c06..74558daa 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -350,6 +350,7 @@ pub struct Config { deserialize_with = "deserialize_alphabet" )] pub jump_label_alphabet: Vec, + pub enable_diagnostics: bool, /// Display diagnostic below the line they occur. pub inline_diagnostics: InlineDiagnosticsConfig, pub end_of_line_diagnostics: DiagnosticFilter, @@ -992,6 +993,7 @@ impl Default for Config { popup_border: PopupBorderConfig::None, indent_heuristic: IndentationHeuristic::default(), jump_label_alphabet: ('a'..='z').collect(), + enable_diagnostics: true, inline_diagnostics: InlineDiagnosticsConfig::default(), end_of_line_diagnostics: DiagnosticFilter::Disable, clipboard_provider: ClipboardProvider::default(), @@ -1049,8 +1051,6 @@ pub struct Editor { pub debugger_events: SelectAll>, pub breakpoints: HashMap>, - pub show_diagnostics: bool, - pub syn_loader: Arc>, pub theme_loader: Arc, /// last_theme is used for theme previews. We store the current theme here, @@ -1197,7 +1197,6 @@ impl Editor { breakpoints: HashMap::new(), syn_loader, theme_loader, - show_diagnostics: true, last_theme: None, last_selection: None, registers: Registers::new(Box::new(arc_swap::access::Map::new( @@ -1331,10 +1330,6 @@ impl Editor { self.set_theme_impl(theme, ThemeAction::Set); } - pub fn toggle_diagnostics(&mut self) { - self.show_diagnostics = !self.show_diagnostics; - } - fn set_theme_impl(&mut self, theme: Theme, preview: ThemeAction) { // `ui.selection` is the only scope required to be able to render a theme. if theme.find_scope_index_exact("ui.selection").is_none() { @@ -1659,7 +1654,13 @@ impl Editor { .try_get(self.tree.focus) .filter(|v| id == v.doc) // Different Document .cloned() - .unwrap_or_else(|| View::new(id, self.config().gutters.clone())); + .unwrap_or_else(|| { + View::new( + id, + self.config().gutters.clone(), + self.config().enable_diagnostics, + ) + }); let view_id = self.tree.split( view, match action { @@ -1833,7 +1834,11 @@ impl Editor { .map(|(&doc_id, _)| doc_id) .next() .unwrap_or_else(|| self.new_document(Document::default(self.config.clone()))); - let view = View::new(doc_id, self.config().gutters.clone()); + let view = View::new( + doc_id, + self.config().gutters.clone(), + self.config().enable_diagnostics, + ); let view_id = self.tree.insert(view); let doc = doc_mut!(self, &doc_id); doc.ensure_view_init(view_id); diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs index 36f719f7..3466f868 100644 --- a/helix-view/src/gutter.rs +++ b/helix-view/src/gutter.rs @@ -346,7 +346,7 @@ mod tests { #[test] fn test_default_gutter_widths() { - let mut view = View::new(DocumentId::default(), GutterConfig::default()); + let mut view = View::new(DocumentId::default(), GutterConfig::default(), true); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("abc\n\tdef"); @@ -371,7 +371,7 @@ mod tests { ..Default::default() }; - let mut view = View::new(DocumentId::default(), gutters); + let mut view = View::new(DocumentId::default(), gutters, true); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("abc\n\tdef"); @@ -389,7 +389,7 @@ mod tests { line_numbers: GutterLineNumbersConfig { min_width: 10 }, }; - let mut view = View::new(DocumentId::default(), gutters); + let mut view = View::new(DocumentId::default(), gutters, true); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("abc\n\tdef"); @@ -411,7 +411,7 @@ mod tests { line_numbers: GutterLineNumbersConfig { min_width: 1 }, }; - let mut view = View::new(DocumentId::default(), gutters); + let mut view = View::new(DocumentId::default(), gutters, true); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("a\nb"); diff --git a/helix-view/src/handlers/diagnostics.rs b/helix-view/src/handlers/diagnostics.rs index cb743b44..d749b592 100644 --- a/helix-view/src/handlers/diagnostics.rs +++ b/helix-view/src/handlers/diagnostics.rs @@ -69,13 +69,13 @@ pub struct DiagnosticsHandler { // but to fix that larger architecutre changes are needed impl Clone for DiagnosticsHandler { fn clone(&self) -> Self { - Self::new() + Self::new(self.active) } } impl DiagnosticsHandler { #[allow(clippy::new_without_default)] - pub fn new() -> Self { + pub fn new(enable_diagnostics: bool) -> Self { let active_generation = Arc::new(AtomicUsize::new(0)); let events = DiagnosticTimeout { active_generation: active_generation.clone(), @@ -88,7 +88,7 @@ impl DiagnosticsHandler { events, last_doc: Cell::new(DocumentId(NonZeroUsize::new(usize::MAX).unwrap())), last_cursor_line: Cell::new(usize::MAX), - active: true, + active: enable_diagnostics, } } } @@ -105,10 +105,6 @@ impl DiagnosticsHandler { .store(self.generation.get(), atomic::Ordering::Relaxed); } - pub fn toggle_active(&mut self) { - self.active = !self.active; - } - pub fn show_cursorline_diagnostics(&self, doc: &Document, view: ViewId) -> bool { if !self.active { return false; diff --git a/helix-view/src/tree.rs b/helix-view/src/tree.rs index aba947a2..5b1ee567 100644 --- a/helix-view/src/tree.rs +++ b/helix-view/src/tree.rs @@ -736,22 +736,22 @@ mod test { width: 180, height: 80, }); - let mut view = View::new(DocumentId::default(), GutterConfig::default()); + let mut view = View::new(DocumentId::default(), GutterConfig::default(), true); view.area = Rect::new(0, 0, 180, 80); tree.insert(view); let l0 = tree.focus; - let view = View::new(DocumentId::default(), GutterConfig::default()); + let view = View::new(DocumentId::default(), GutterConfig::default(), true); tree.split(view, Layout::Vertical); let r0 = tree.focus; tree.focus = l0; - let view = View::new(DocumentId::default(), GutterConfig::default()); + let view = View::new(DocumentId::default(), GutterConfig::default(), true); tree.split(view, Layout::Horizontal); let l1 = tree.focus; tree.focus = l0; - let view = View::new(DocumentId::default(), GutterConfig::default()); + let view = View::new(DocumentId::default(), GutterConfig::default(), true); tree.split(view, Layout::Vertical); // Tree in test @@ -792,28 +792,28 @@ mod test { }); let doc_l0 = DocumentId::default(); - let mut view = View::new(doc_l0, GutterConfig::default()); + let mut view = View::new(doc_l0, GutterConfig::default(), true); view.area = Rect::new(0, 0, 180, 80); tree.insert(view); let l0 = tree.focus; let doc_r0 = DocumentId::default(); - let view = View::new(doc_r0, GutterConfig::default()); + let view = View::new(doc_r0, GutterConfig::default(), true); tree.split(view, Layout::Vertical); let r0 = tree.focus; tree.focus = l0; let doc_l1 = DocumentId::default(); - let view = View::new(doc_l1, GutterConfig::default()); + let view = View::new(doc_l1, GutterConfig::default(), true); tree.split(view, Layout::Horizontal); let l1 = tree.focus; tree.focus = l0; let doc_l2 = DocumentId::default(); - let view = View::new(doc_l2, GutterConfig::default()); + let view = View::new(doc_l2, GutterConfig::default(), true); tree.split(view, Layout::Vertical); let l2 = tree.focus; @@ -908,19 +908,19 @@ mod test { width: tree_area_width, height: 80, }); - let mut view = View::new(DocumentId::default(), GutterConfig::default()); + let mut view = View::new(DocumentId::default(), GutterConfig::default(), true); view.area = Rect::new(0, 0, 180, 80); tree.insert(view); - let view = View::new(DocumentId::default(), GutterConfig::default()); + let view = View::new(DocumentId::default(), GutterConfig::default(), true); tree.split(view, Layout::Vertical); - let view = View::new(DocumentId::default(), GutterConfig::default()); + let view = View::new(DocumentId::default(), GutterConfig::default(), true); tree.split(view, Layout::Horizontal); tree.remove(tree.focus); - let view = View::new(DocumentId::default(), GutterConfig::default()); + let view = View::new(DocumentId::default(), GutterConfig::default(), true); tree.split(view, Layout::Vertical); // Make sure that we only have one level in the tree. @@ -946,12 +946,12 @@ mod test { width: tree_area_width, height: tree_area_height, }); - let mut view = View::new(DocumentId::default(), GutterConfig::default()); + let mut view = View::new(DocumentId::default(), GutterConfig::default(), true); view.area = Rect::new(0, 0, tree_area_width, tree_area_height); tree.insert(view); for _ in 0..9 { - let view = View::new(DocumentId::default(), GutterConfig::default()); + let view = View::new(DocumentId::default(), GutterConfig::default(), true); tree.split(view, Layout::Vertical); } diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs index a229f01e..98c05c5f 100644 --- a/helix-view/src/view.rs +++ b/helix-view/src/view.rs @@ -168,7 +168,7 @@ impl fmt::Debug for View { } impl View { - pub fn new(doc: DocumentId, gutters: GutterConfig) -> Self { + pub fn new(doc: DocumentId, gutters: GutterConfig, enable_diagnostics: bool) -> Self { Self { id: ViewId::default(), doc, @@ -179,7 +179,7 @@ impl View { object_selections: Vec::new(), gutters, doc_revisions: HashMap::new(), - diagnostics_handler: DiagnosticsHandler::new(), + diagnostics_handler: DiagnosticsHandler::new(enable_diagnostics), } } @@ -695,7 +695,7 @@ mod tests { #[test] fn test_text_pos_at_screen_coords() { - let mut view = View::new(DocumentId::default(), GutterConfig::default()); + let mut view = View::new(DocumentId::default(), GutterConfig::default(), true); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("abc\n\tdef"); let mut doc = Document::from( @@ -870,6 +870,7 @@ mod tests { layout: vec![GutterType::Diagnostics], line_numbers: GutterLineNumbersConfig::default(), }, + true, ); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("abc\n\tdef"); @@ -900,6 +901,7 @@ mod tests { layout: vec![], line_numbers: GutterLineNumbersConfig::default(), }, + true, ); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("abc\n\tdef"); @@ -924,7 +926,7 @@ mod tests { #[test] fn test_text_pos_at_screen_coords_cjk() { - let mut view = View::new(DocumentId::default(), GutterConfig::default()); + let mut view = View::new(DocumentId::default(), GutterConfig::default(), true); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("Hi! こんにちは皆さん"); let mut doc = Document::from( @@ -1008,7 +1010,7 @@ mod tests { #[test] fn test_text_pos_at_screen_coords_graphemes() { - let mut view = View::new(DocumentId::default(), GutterConfig::default()); + let mut view = View::new(DocumentId::default(), GutterConfig::default(), true); view.area = Rect::new(40, 40, 40, 40); let rope = Rope::from_str("Hèl̀l̀ò world!"); let mut doc = Document::from(