diff --git a/copyrat.tmux b/copyrat.tmux index 134ee92..b07d1be 100755 --- a/copyrat.tmux +++ b/copyrat.tmux @@ -81,8 +81,10 @@ setup_pattern_binding "p" "--pattern-name path" setup_pattern_binding "u" "--pattern-name url" # prefix + t + m searches for Markdown URLs [...](matched.url) setup_pattern_binding "m" "--pattern-name markdown-url" -# prefix + t + h searches for SHA1/2 (hashes) +# prefix + t + h searches for SHA1/2 short or long hashes setup_pattern_binding "h" "--pattern-name sha" +# prefix + t + d searches for dates or datetimes +setup_pattern_binding "d" "--pattern-name datetime" # prefix + t + e searches for email addresses (see https://www.regular-expressions.info/email.html) setup_pattern_binding "e" "--pattern-name email" # prefix + t + D searches for docker shas @@ -93,7 +95,7 @@ setup_pattern_binding "c" "--pattern-name hexcolor" setup_pattern_binding "U" "--pattern-name uuid" # prefix + t + v searches for version numbers setup_pattern_binding "v" "--pattern-name version" -# prefix + t + d searches for any string of 4+ digits +# prefix + t + G searches for any string of 4+ digits setup_pattern_binding "G" "--pattern-name digits" # prefix + t + m searches for hex numbers: 0xbedead setup_pattern_binding "P" "--pattern-name pointer-address" diff --git a/src/textbuf/mod.rs b/src/textbuf/mod.rs index 60c9031..25a0295 100644 --- a/src/textbuf/mod.rs +++ b/src/textbuf/mod.rs @@ -547,6 +547,32 @@ mod tests { assert_eq!(spans.get(0).unwrap().text, "src/main.rs"); } + #[test] + fn match_datetime() { + let buffer = "12 days ago = 2021-03-04T12:23:34 text"; + let lines = buffer.split('\n').collect::>(); + let use_all_patterns = true; + let named_pat = vec![]; + let custom = vec![]; + let alphabet = Alphabet("abcd".to_string()); + let reverse = false; + let unique_hint = false; + let spans = Model::new( + &lines, + &alphabet, + use_all_patterns, + &named_pat, + &custom, + reverse, + unique_hint, + ) + .spans; + + assert_eq!(spans.len(), 1); + assert_eq!(spans.get(0).unwrap().pattern, "datetime"); + assert_eq!(spans.get(0).unwrap().text, "2021-03-04T12:23:34"); + } + #[test] fn priority_between_regexes() { let buffer = "Lorem [link](http://foo.bar) ipsum CUSTOM-52463 lorem ISSUE-123 lorem\nLorem /var/fd70b569/9999.log 52463 lorem\n Lorem 973113 lorem 123e4567-e89b-12d3-a456-426655440000 lorem 8888 lorem\n https://crates.io/23456/fd70b569 lorem"; diff --git a/src/textbuf/regexes.rs b/src/textbuf/regexes.rs index 5f57914..31603ea 100644 --- a/src/textbuf/regexes.rs +++ b/src/textbuf/regexes.rs @@ -7,7 +7,7 @@ pub(super) const EXCLUDE_PATTERNS: [(&str, &str); 1] = /// /// The email address was obtained at https://www.regular-expressions.info/email.html. /// Others were obtained from Ferran Basora. -pub(super) const PATTERNS: [(&str, &str); 16] = [ +pub(super) const PATTERNS: [(&str, &str); 17] = [ ("markdown-url", r"\[[^]]*\]\(([^)]+)\)"), ( "url", @@ -32,6 +32,10 @@ pub(super) const PATTERNS: [(&str, &str); 16] = [ ("ipv4", r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"), ("ipv6", r"[A-f0-9:]+:+[A-f0-9:]+[%\w\d]+"), ("pointer-address", r"0x[0-9a-fA-F]+"), + ( + "datetime", + r"(\d{4}-?\d{2}-?\d{2}([ T]\d{2}:\d{2}:\d{2}(\.\d{3,9})?)?)", + ), ("digits", r"[0-9]{4,}"), ];