Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--helix-core/src/selection.rs62
-rw-r--r--helix-term/src/commands.rs4
-rw-r--r--helix-term/src/ui/mod.rs4
3 files changed, 68 insertions, 2 deletions
diff --git a/helix-core/src/selection.rs b/helix-core/src/selection.rs
index 5bde08e3..6292e90e 100644
--- a/helix-core/src/selection.rs
+++ b/helix-core/src/selection.rs
@@ -1171,6 +1171,68 @@ mod test {
}
#[test]
+ fn test_select_on_matches_crlf() {
+ let r = Rope::from_str("This\r\nString\r\n\r\ncontains multiple\r\nlines");
+ let s = r.slice(..);
+
+ let start_of_line = rope::RegexBuilder::new()
+ .syntax(rope::Config::new().multi_line(true).crlf(true))
+ .build(r"^")
+ .unwrap();
+ let end_of_line = rope::RegexBuilder::new()
+ .syntax(rope::Config::new().multi_line(true).crlf(true))
+ .build(r"$")
+ .unwrap();
+
+ // line without ending
+ assert_eq!(
+ select_on_matches(s, &Selection::single(0, 4), &start_of_line),
+ Some(Selection::single(0, 0))
+ );
+ assert_eq!(
+ select_on_matches(s, &Selection::single(0, 4), &end_of_line),
+ None
+ );
+ // line with ending
+ assert_eq!(
+ select_on_matches(s, &Selection::single(0, 5), &start_of_line),
+ Some(Selection::single(0, 0))
+ );
+ assert_eq!(
+ select_on_matches(s, &Selection::single(0, 5), &end_of_line),
+ Some(Selection::single(4, 4))
+ );
+ // line with start of next line
+ assert_eq!(
+ select_on_matches(s, &Selection::single(0, 7), &start_of_line),
+ Some(Selection::new(
+ smallvec![Range::point(0), Range::point(6)],
+ 0
+ ))
+ );
+ assert_eq!(
+ select_on_matches(s, &Selection::single(0, 6), &end_of_line),
+ Some(Selection::single(4, 4))
+ );
+
+ // multiple lines
+ assert_eq!(
+ select_on_matches(
+ s,
+ &Selection::single(0, s.len_chars()),
+ &rope::RegexBuilder::new()
+ .syntax(rope::Config::new().multi_line(true).crlf(true))
+ .build(r"^[a-z ]*$")
+ .unwrap()
+ ),
+ Some(Selection::new(
+ smallvec![Range::point(14), Range::new(16, 33), Range::new(35, 40)],
+ 0
+ ))
+ );
+ }
+
+ #[test]
fn test_line_range() {
let r = Rope::from_str("\r\nHi\r\nthere!");
let s = r.slice(..);
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 5c791303..eaf5d33f 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -2409,11 +2409,13 @@ fn search_next_or_prev_impl(cx: &mut Context, movement: Movement, direction: Dir
false
};
let wrap_around = search_config.wrap_around;
+ let is_crlf = doc!(cx.editor).line_ending == LineEnding::Crlf;
if let Ok(regex) = rope::RegexBuilder::new()
.syntax(
rope::Config::new()
.case_insensitive(case_insensitive)
- .multi_line(true),
+ .multi_line(true)
+ .crlf(is_crlf),
)
.build(&query)
{
diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs
index 3aec7e85..ac5e51f1 100644
--- a/helix-term/src/ui/mod.rs
+++ b/helix-term/src/ui/mod.rs
@@ -126,11 +126,13 @@ pub fn raw_regex_prompt(
false
};
+ let is_crlf = doc!(cx.editor).line_ending == helix_core::LineEnding::Crlf;
match rope::RegexBuilder::new()
.syntax(
rope::Config::new()
.case_insensitive(case_insensitive)
- .multi_line(true),
+ .multi_line(true)
+ .crlf(is_crlf),
)
.build(input)
{