diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index d85cebf06..bd9ce4e44 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -90,7 +90,7 @@ | hocon | ✓ | ✓ | ✓ | | | hoon | ✓ | | | | | hosts | ✓ | | | | -| html | ✓ | | | `vscode-html-language-server`, `superhtml` | +| html | ✓ | ✓ | | `vscode-html-language-server`, `superhtml` | | hurl | ✓ | ✓ | ✓ | | | hyprlang | ✓ | | ✓ | `hyprls` | | idris | | | | `idris2-lsp` | @@ -235,7 +235,7 @@ | wit | ✓ | | ✓ | | | wren | ✓ | ✓ | ✓ | | | xit | ✓ | | | | -| xml | ✓ | | ✓ | | +| xml | ✓ | ✓ | ✓ | | | xtc | ✓ | | | | | yaml | ✓ | ✓ | ✓ | `yaml-language-server`, `ansible-language-server` | | yuck | ✓ | | | | diff --git a/book/src/keymap.md b/book/src/keymap.md index 28113ea0b..014b11a5a 100644 --- a/book/src/keymap.md +++ b/book/src/keymap.md @@ -346,30 +346,32 @@ #### Unimpaired These mappings are in the style of [vim-unimpaired](https://github.com/tpope/vim-unimpaired). -| Key | Description | Command | -| ----- | ----------- | ------- | -| `]d` | Go to next diagnostic (**LSP**) | `goto_next_diag` | -| `[d` | Go to previous diagnostic (**LSP**) | `goto_prev_diag` | -| `]D` | Go to last diagnostic in document (**LSP**) | `goto_last_diag` | -| `[D` | Go to first diagnostic in document (**LSP**) | `goto_first_diag` | -| `]f` | Go to next function (**TS**) | `goto_next_function` | -| `[f` | Go to previous function (**TS**) | `goto_prev_function` | -| `]t` | Go to next type definition (**TS**) | `goto_next_class` | -| `[t` | Go to previous type definition (**TS**) | `goto_prev_class` | -| `]a` | Go to next argument/parameter (**TS**) | `goto_next_parameter` | -| `[a` | Go to previous argument/parameter (**TS**) | `goto_prev_parameter` | -| `]c` | Go to next comment (**TS**) | `goto_next_comment` | -| `[c` | Go to previous comment (**TS**) | `goto_prev_comment` | -| `]T` | Go to next test (**TS**) | `goto_next_test` | -| `[T` | Go to previous test (**TS**) | `goto_prev_test` | -| `]p` | Go to next paragraph | `goto_next_paragraph` | -| `[p` | Go to previous paragraph | `goto_prev_paragraph` | -| `]g` | Go to next change | `goto_next_change` | -| `[g` | Go to previous change | `goto_prev_change` | -| `]G` | Go to last change | `goto_last_change` | -| `[G` | Go to first change | `goto_first_change` | -| `]Space` | Add newline below | `add_newline_below` | -| `[Space` | Add newline above | `add_newline_above` | +| Key | Description | Command | +| ----- | ----------- | ------- | +| `]d` | Go to next diagnostic (**LSP**) | `goto_next_diag` | +| `[d` | Go to previous diagnostic (**LSP**) | `goto_prev_diag` | +| `]D` | Go to last diagnostic in document (**LSP**) | `goto_last_diag` | +| `[D` | Go to first diagnostic in document (**LSP**) | `goto_first_diag` | +| `]f` | Go to next function (**TS**) | `goto_next_function` | +| `[f` | Go to previous function (**TS**) | `goto_prev_function` | +| `]t` | Go to next type definition (**TS**) | `goto_next_class` | +| `[t` | Go to previous type definition (**TS**) | `goto_prev_class` | +| `]a` | Go to next argument/parameter (**TS**) | `goto_next_parameter` | +| `[a` | Go to previous argument/parameter (**TS**) | `goto_prev_parameter` | +| `]c` | Go to next comment (**TS**) | `goto_next_comment` | +| `[c` | Go to previous comment (**TS**) | `goto_prev_comment` | +| `]T` | Go to next test (**TS**) | `goto_next_test` | +| `[T` | Go to previous test (**TS**) | `goto_prev_test` | +| `]p` | Go to next paragraph | `goto_next_paragraph` | +| `[p` | Go to previous paragraph | `goto_prev_paragraph` | +| `]g` | Go to next change | `goto_next_change` | +| `[g` | Go to previous change | `goto_prev_change` | +| `]G` | Go to last change | `goto_last_change` | +| `[G` | Go to first change | `goto_first_change` | +| `[x` | Go to next (X)HTML element | `goto_next_xml_element` | +| `]x` | Go to previous (X)HTML element | `goto_prev_xml_element` | +| `]Space` | Add newline below | `add_newline_below` | +| `[Space` | Add newline above | `add_newline_above` | ## Insert mode diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 61855d356..3cb81c33d 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -533,6 +533,8 @@ pub fn doc(&self) -> &str { goto_prev_comment, "Goto previous comment", goto_next_test, "Goto next test", goto_prev_test, "Goto previous test", + goto_next_xml_element, "Goto next (X)HTML element", + goto_prev_xml_element, "Goto previous (X)HTML element", goto_next_entry, "Goto next pairing", goto_prev_entry, "Goto previous pairing", goto_next_paragraph, "Goto next paragraph", @@ -5525,6 +5527,14 @@ fn goto_prev_test(cx: &mut Context) { goto_ts_object_impl(cx, "test", Direction::Backward) } +fn goto_next_xml_element(cx: &mut Context) { + goto_ts_object_impl(cx, "xml_element", Direction::Forward) +} + +fn goto_prev_xml_element(cx: &mut Context) { + goto_ts_object_impl(cx, "xml_element", Direction::Backward) +} + fn goto_next_entry(cx: &mut Context) { goto_ts_object_impl(cx, "entry", Direction::Forward) } @@ -5598,6 +5608,7 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) { 'c' => textobject_treesitter("comment", range), 'T' => textobject_treesitter("test", range), 'e' => textobject_treesitter("entry", range), + 'x' => textobject_treesitter("xml_element", range), 'p' => textobject::textobject_paragraph(text, range, objtype, count), 'm' => textobject::textobject_pair_surround_closest( doc.syntax(), @@ -5642,6 +5653,7 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) { ("e", "Data structure entry (tree-sitter)"), ("m", "Closest surrounding pair (tree-sitter)"), ("g", "Change"), + ("x", "X(HTML) element (tree-sitter)"), (" ", "... or any character acting as a pair"), ]; diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 5a3e8eed4..f1e67173a 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -119,6 +119,7 @@ pub fn default() -> HashMap { "e" => goto_prev_entry, "T" => goto_prev_test, "p" => goto_prev_paragraph, + "x" => goto_prev_xml_element, "space" => add_newline_above, }, "]" => { "Right bracket" @@ -133,6 +134,7 @@ pub fn default() -> HashMap { "e" => goto_next_entry, "T" => goto_next_test, "p" => goto_next_paragraph, + "x" => goto_next_xml_element, "space" => add_newline_below, }, diff --git a/runtime/queries/_jsx/textobjects.scm b/runtime/queries/_jsx/textobjects.scm new file mode 100644 index 000000000..9f7c3a6d7 --- /dev/null +++ b/runtime/queries/_jsx/textobjects.scm @@ -0,0 +1,7 @@ +; See runtime/queries/ecma/README.md for more info. + +(jsx_self_closing_element) @xml_element.around @xml_element.inside + +(jsx_element (jsx_opening_element) (_)* @xml_element.inside (jsx_closing_element)) + +(jsx_element) @xml_element.around diff --git a/runtime/queries/html/textobjects.scm b/runtime/queries/html/textobjects.scm new file mode 100644 index 000000000..cef3770f9 --- /dev/null +++ b/runtime/queries/html/textobjects.scm @@ -0,0 +1,9 @@ +(script_element (start_tag) (_) @xml_element.inside (end_tag)) @xml_element.around + +(style_element (start_tag) (_) @xml_element.inside (end_tag)) @xml_element.around + +(element (start_tag) (_)* @xml_element.inside (end_tag)) + +(element) @xml_element.around + +(comment) @comment.around diff --git a/runtime/queries/xml/textobjects.scm b/runtime/queries/xml/textobjects.scm new file mode 100644 index 000000000..6bed83516 --- /dev/null +++ b/runtime/queries/xml/textobjects.scm @@ -0,0 +1,5 @@ +(element (start_tag) (_)* @xml_element.inside (end_tag)) + +(element) @xml_element.around + +(comment) @comment.around