diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index f331bf5769..af8b41a592 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -7092,14 +7092,27 @@ impl Editor { } // If the language has line comments, toggle those. - if let Some(full_comment_prefix) = language + if let Some(full_comment_prefixes) = language .line_comment_prefixes() - .and_then(|prefixes| prefixes.first()) + .filter(|prefixes| !prefixes.is_empty()) { // Split the comment prefix's trailing whitespace into a separate string, // as that portion won't be used for detecting if a line is a comment. - let comment_prefix = full_comment_prefix.trim_end_matches(' '); - let comment_prefix_whitespace = &full_comment_prefix[comment_prefix.len()..]; + struct Comment { + full_prefix: Arc, + trimmed_prefix_len: usize, + } + let prefixes: SmallVec<[Comment; 4]> = full_comment_prefixes + .iter() + .map(|full_prefix| { + let trimmed_prefix_len = full_prefix.trim_end_matches(' ').len(); + Comment { + trimmed_prefix_len, + full_prefix: full_prefix.clone(), + } + }) + .collect(); + let mut all_selection_lines_are_comments = true; for row in start_row..=end_row { @@ -7107,16 +7120,28 @@ impl Editor { continue; } - let prefix_range = comment_prefix_range( - snapshot.deref(), - row, - comment_prefix, - comment_prefix_whitespace, - ); + let Some((prefix, prefix_range)) = prefixes + .iter() + .map(|prefix| { + ( + prefix, + comment_prefix_range( + snapshot.deref(), + row, + &prefix.full_prefix[..prefix.trimmed_prefix_len], + &prefix.full_prefix[prefix.trimmed_prefix_len..], + ), + ) + }) + .max_by_key(|(_, range)| range.end.column - range.start.column) + else { + // There has to be at least one prefix. + break; + }; if prefix_range.is_empty() { all_selection_lines_are_comments = false; } - selection_edit_ranges.push(prefix_range); + selection_edit_ranges.push((prefix_range, prefix.full_prefix.clone())); } if all_selection_lines_are_comments { @@ -7124,17 +7149,17 @@ impl Editor { selection_edit_ranges .iter() .cloned() - .map(|range| (range, empty_str.clone())), + .map(|(range, _)| (range, empty_str.clone())), ); } else { let min_column = selection_edit_ranges .iter() - .map(|r| r.start.column) + .map(|(range, _)| range.start.column) .min() .unwrap_or(0); - edits.extend(selection_edit_ranges.iter().map(|range| { + edits.extend(selection_edit_ranges.iter().map(|(range, prefix)| { let position = Point::new(range.start.row, min_column); - (position..position, full_comment_prefix.clone()) + (position..position, prefix.clone()) })); } } else if let Some((full_comment_prefix, comment_suffix)) = diff --git a/crates/languages/src/rust/config.toml b/crates/languages/src/rust/config.toml index d01f62e354..e05234c774 100644 --- a/crates/languages/src/rust/config.toml +++ b/crates/languages/src/rust/config.toml @@ -1,7 +1,7 @@ name = "Rust" grammar = "rust" path_suffixes = ["rs"] -line_comments = ["// ", "/// ", "//! "] +line_comments = [ "/// ", "//! ", "// "] autoclose_before = ";:.,=}])>" brackets = [ { start = "{", end = "}", close = true, newline = true },