From 129962fc5fecc28fdbaa0e62603659e07509971a Mon Sep 17 00:00:00 2001 From: tenfyzhong Date: Wed, 31 Jan 2024 00:10:59 +0800 Subject: [PATCH] support !% --- conf.d/bang.fish | 4 ++-- functions/_bang.fish | 11 +++++++---- tests/bang.fish | 27 ++++++++++++++++++++++++--- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/conf.d/bang.fish b/conf.d/bang.fish index e8adfa1..f60a49e 100644 --- a/conf.d/bang.fish +++ b/conf.d/bang.fish @@ -5,7 +5,7 @@ # !-n # !n # !string -# !?string[?] (the last ? is optional) +# !?string? # !# # # Part 2: Word Designators @@ -28,7 +28,7 @@ # ^string1^string2^ # https://regex101.com/r/gYfhPu/2 -set -gx _bang_regex '^!(?!|-?\d+|\w+|\?[^?]+\??|#)(?:?\^|:?\$|:?\*|:?-|:?%|:\d+-\d+|:\d+\*|:-\d+|:\d+-|:s\^[^^]+\^[^^]+\^?)?$' +set -gx _bang_regex '^!(?!|-?\d+|\w+|\?[^?]+\?|#)(?:?\^|:?\$|:?\*|:?-|:?%|:\d+-\d+|:\d+\*|:-\d+|:\d+-|:s\^[^^]+\^[^^]+\^?)?$' abbr -a _bang -r $_bang_regex --position anywhere --function _bang # https://regex101.com/r/V4nhLy/1 diff --git a/functions/_bang.fish b/functions/_bang.fish index 8cb9993..359c040 100644 --- a/functions/_bang.fish +++ b/functions/_bang.fish @@ -5,7 +5,8 @@ function _bang -a pattern _bang_find_word "$cmd" (string sub -s 2 $pattern) return 0 case '!%' - # TODO + set tokens (string split ' ' $_bind_last_search) + echo $tokens[1] case '^*^*' '^*^*^' set cmd $history[1] _bang_find_word "$cmd" "$pattern" @@ -45,10 +46,11 @@ function _bang_find_cmd -a cmdp return 0 end end - else if string match -q -r -- '^\?(?[^?]+)\??$' "$cmdp" - # !?string[?] + else if string match -q -r -- '^\?(?[^?]+)\?$' "$cmdp" + # !?string? for cmd in $history if string match -q -r -- "$key" "$cmd" + set -gx _bind_last_search "$key" echo $cmd return 0 end @@ -93,7 +95,8 @@ function _bang_find_word -a cmd -a wordp echo (string join ' ' $token[1..-2]) else if test "$wordmatch" = '%' # :% - # TODO + set tokens (string split ' ' $_bind_last_search) + echo $tokens[1] else if string match -q -r -- '^(?\d+)?-(?\d+)?$' "$wordmatch" # x-y # x- diff --git a/tests/bang.fish b/tests/bang.fish index e04e3ea..31be307 100644 --- a/tests/bang.fish +++ b/tests/bang.fish @@ -53,6 +53,16 @@ set output (_bang '!$') set output (_bang '!*') @test 'test !*' "$output" = 'three four five six seven' +@test 'test regex match !%' (string match -q -r $_bang_special_regex '!%') $status -eq 0 +set output (_bang '!%') +@test 'test !%' "$output" = '' +_bang '!?bar foobar?' +set output (_bang '!%') +@test 'test !%' "$output" = 'bar' +_bang '!?foo bar foobar?' +set output (_bang '!%') +@test 'test !%' "$output" = 'foo' + @test 'test regex match !!' (string match -q -r $_bang_regex '!!') $status -eq 0 set output (_bang !!) @test 'test !!' "$output" = 'cd three four five six seven' @@ -77,13 +87,14 @@ set output (_bang !-1) set output (_bang !ln) @test 'test !ln' "$output" = 'ln -s hello world1' -@test 'test regex match !?foo' (string match -q -r $_bang_regex '!?foo') $status -eq 0 -set output (_bang '!?foo') -@test 'test !?foo' "$output" = 'mv foo bar foobar barfoo foobarfoo' +# @test 'test regex match !?foo' (string match -q -r $_bang_regex '!?foo') $status -eq 0 +# set output (_bang '!?foo') +# @test 'test !?foo' "$output" = 'mv foo bar foobar barfoo foobarfoo' @test 'test regex match !?foo?' (string match -q -r $_bang_regex '!?foo?') $status -eq 0 set output (_bang '!?foo?') @test 'test !?foo?' "$output" = 'mv foo bar foobar barfoo foobarfoo' +@test 'test _bind_last_search' "$_bind_last_search" = "foo" @test 'test regex match !#' (string match -q -r $_bang_regex '!#') $status -eq 0 mock_commandline 'cd go !#' @@ -257,6 +268,16 @@ set output (_bang '!mv*') set output (_bang '!mv:-') @test 'test !mv:-' "$output" = 'mv foo bar foobar barfoo' +@test 'test regex match !mv:%' (string match -q -r $_bang_regex '!mv:%') $status -eq 0 +_bang '!?foo bar foobar?' +set output (_bang '!mv:%') +@test 'test !mv:%' "$output" = 'foo' + +@test 'test regex match !mv%' (string match -q -r $_bang_regex '!mv%') $status -eq 0 +_bang '!?foo bar foobar?' +set output (_bang '!mv%') +@test 'test !mv%' "$output" = 'foo' + @test 'test regex match !mv-' (string match -q -r $_bang_regex '!mv-') $status -eq 0 set output (_bang '!mv-') @test 'test !mv-' "$output" = 'mv foo bar foobar barfoo'