editor: Fix auto-indent cases in Markdown (#44616)

Builds on https://github.com/zed-industries/zed/pull/40794 and
https://github.com/zed-industries/zed/pull/44381

- Fixes the case where creating a new line inside a nested list puts the
cursor correctly under that nested list item.
- Fixes the case where typing a new list item at the expected indent no
longer auto-indents or outdents incorrectly.

Release Notes:

- Fixed an issue in Markdown where new list items weren’t respecting the
expected indentation on type.
This commit is contained in:
Smit Barmase
2025-12-11 21:14:15 +05:30
committed by GitHub
parent ecb8d3d4dd
commit f4378672b8
3 changed files with 56 additions and 23 deletions
+49 -22
View File
@@ -27701,6 +27701,7 @@ async fn test_markdown_indents(cx: &mut gpui::TestAppContext) {
cx.update_editor(|editor, window, cx| {
editor.handle_input("x", window, cx);
});
cx.run_until_parked();
cx.assert_editor_state(indoc! {"
- [ ] Item 1
- [ ] Item 1.a
@@ -27716,8 +27717,7 @@ async fn test_markdown_indents(cx: &mut gpui::TestAppContext) {
- [ ] Item 1.a
- [x] Item 2
- [x] Item 2.a
- [x] Item 2.
"
- [x] Item 2."
});
cx.update_editor(|editor, window, cx| {
editor.newline(&Newline, window, cx);
@@ -27728,34 +27728,41 @@ async fn test_markdown_indents(cx: &mut gpui::TestAppContext) {
- [x] Item 2
- [x] Item 2.a
- [x] Item 2.b
ˇ
"
ˇ"
});
// Case 3: Test adding a new nested list item preserves indent
cx.set_state(&indoc! {"
- [ ] Item 1
- [ ] Item 1.a
- [x] Item 2
- [x] Item 2.a
- [x] Item 2.b
ˇ"
});
cx.update_editor(|editor, window, cx| {
editor.handle_input("-", window, cx);
});
cx.run_until_parked();
cx.assert_editor_state(indoc! {"
- [ ] Item 1
- [ ] Item 1.a
- [x] Item 2
- [x] Item 2.a
- [x] Item 2.b
-ˇ
"
-ˇ"
});
cx.update_editor(|editor, window, cx| {
editor.handle_input(" [x] Item 2.c", window, cx);
});
cx.run_until_parked();
cx.assert_editor_state(indoc! {"
- [ ] Item 1
- [ ] Item 1.a
- [x] Item 2
- [x] Item 2.a
- [x] Item 2.b
- [x] Item 2.
"
- [x] Item 2."
});
// Case 4: Test adding new line after nested ordered list preserves indent of previous line
@@ -27764,8 +27771,7 @@ async fn test_markdown_indents(cx: &mut gpui::TestAppContext) {
1. Item 1.a
2. Item 2
1. Item 2.a
2. Item 2.
"
2. Item 2."
});
cx.update_editor(|editor, window, cx| {
editor.newline(&Newline, window, cx);
@@ -27776,60 +27782,81 @@ async fn test_markdown_indents(cx: &mut gpui::TestAppContext) {
2. Item 2
1. Item 2.a
2. Item 2.b
ˇ
"
ˇ"
});
// Case 5: Adding new ordered list item preserves indent
cx.set_state(indoc! {"
1. Item 1
1. Item 1.a
2. Item 2
1. Item 2.a
2. Item 2.b
ˇ"
});
cx.update_editor(|editor, window, cx| {
editor.handle_input("3", window, cx);
});
cx.run_until_parked();
cx.assert_editor_state(indoc! {"
1. Item 1
1. Item 1.a
2. Item 2
1. Item 2.a
2. Item 2.b
3ˇ
"
3ˇ"
});
cx.update_editor(|editor, window, cx| {
editor.handle_input(".", window, cx);
});
cx.run_until_parked();
cx.assert_editor_state(indoc! {"
1. Item 1
1. Item 1.a
2. Item 2
1. Item 2.a
2. Item 2.b
3.ˇ
"
3.ˇ"
});
cx.update_editor(|editor, window, cx| {
editor.handle_input(" Item 2.c", window, cx);
});
cx.run_until_parked();
cx.assert_editor_state(indoc! {"
1. Item 1
1. Item 1.a
2. Item 2
1. Item 2.a
2. Item 2.b
3. Item 2.
"
3. Item 2."
});
// Case 6: Test adding new line after nested ordered list preserves indent of previous line
cx.set_state(indoc! {"
- Item 1
- Item 1.a
- Item 1.a
ˇ"});
cx.update_editor(|editor, window, cx| {
editor.handle_input("-", window, cx);
});
cx.run_until_parked();
cx.assert_editor_state(indoc! {"
- Item 1
- Item 1.a
- Item 1.a
-ˇ"});
// Case 7: Test blockquote newline preserves something
cx.set_state(indoc! {"
> Item 1ˇ
"
> Item 1ˇ"
});
cx.update_editor(|editor, window, cx| {
editor.newline(&Newline, window, cx);
});
cx.assert_editor_state(indoc! {"
> Item 1
ˇ
"
ˇ"
});
}
+5 -1
View File
@@ -24,5 +24,9 @@ rewrap_prefixes = [
auto_indent_on_paste = false
auto_indent_using_last_non_empty_line = false
tab_size = 2
decrease_indent_pattern = "^.*$"
decrease_indent_patterns = [
{ pattern = "^\\s*-", valid_after = ["list_item"] },
{ pattern = "^\\s*\\d", valid_after = ["list_item"] },
{ pattern = "^\\s*", valid_after = ["list_item"] },
]
prettier_parser_name = "markdown"
@@ -1 +1,3 @@
(list (list_item) @indent)
(list_item) @start.list_item