@@ -3954,26 +3954,28 @@ impl Editor {
let (snapshot, range) =
buffer.buffer_line_for_row(MultiBufferRow(start_point.row))?;
- let mut index_of_first_non_whitespace = 0;
+ let num_of_whitespaces = snapshot
+ .chars_for_range(range.clone())
+ .take_while(|c| c.is_whitespace())
+ .count();
let comment_candidate = snapshot
.chars_for_range(range)
- .skip_while(|c| {
- let should_skip = c.is_whitespace();
- if should_skip {
- index_of_first_non_whitespace += 1;
- }
- should_skip
- })
+ .skip(num_of_whitespaces)
.take(max_len_of_delimiter)
.collect::<String>();
- let comment_prefix = delimiters.iter().find(|comment_prefix| {
- comment_candidate.starts_with(comment_prefix.as_ref())
- })?;
+ let (delimiter, trimmed_len) =
+ delimiters.iter().find_map(|delimiter| {
+ let trimmed = delimiter.trim_end();
+ if comment_candidate.starts_with(trimmed) {
+ Some((delimiter, trimmed.len()))
+ } else {
+ None
+ }
+ })?;
let cursor_is_placed_after_comment_marker =
- index_of_first_non_whitespace + comment_prefix.len()
- <= start_point.column as usize;
+ num_of_whitespaces + trimmed_len <= start_point.column as usize;
if cursor_is_placed_after_comment_marker {
- Some(comment_prefix.clone())
+ Some(delimiter.clone())
} else {
None
}
@@ -2755,7 +2755,7 @@ async fn test_newline_comments(cx: &mut TestAppContext) {
let language = Arc::new(Language::new(
LanguageConfig {
- line_comments: vec!["//".into()],
+ line_comments: vec!["// ".into()],
..LanguageConfig::default()
},
None,
@@ -2770,7 +2770,29 @@ async fn test_newline_comments(cx: &mut TestAppContext) {
cx.update_editor(|e, window, cx| e.newline(&Newline, window, cx));
cx.assert_editor_state(indoc! {"
// Foo
+ // ˇ
+ "});
+ // Ensure that we add comment prefix when existing line contains space
+ cx.update_editor(|e, window, cx| e.newline(&Newline, window, cx));
+ cx.assert_editor_state(
+ indoc! {"
+ // Foo
+ //s
+ // ˇ
+ "}
+ .replace("s", " ") // s is used as space placeholder to prevent format on save
+ .as_str(),
+ );
+ // Ensure that we add comment prefix when existing line does not contain space
+ cx.set_state(indoc! {"
+ // Foo
//ˇ
+ "});
+ cx.update_editor(|e, window, cx| e.newline(&Newline, window, cx));
+ cx.assert_editor_state(indoc! {"
+ // Foo
+ //
+ // ˇ
"});
// Ensure that if cursor is before the comment start, we do not actually insert a comment prefix.
cx.set_state(indoc! {"