diff --git a/PSReadLine/KeyBindings.vi.cs b/PSReadLine/KeyBindings.vi.cs index 46cdc6068..e7498c166 100644 --- a/PSReadLine/KeyBindings.vi.cs +++ b/PSReadLine/KeyBindings.vi.cs @@ -86,8 +86,9 @@ private void SetDefaultViBindings() { Keys.F3, MakeKeyHandler(CharacterSearch, "CharacterSearch") }, { Keys.ShiftF3, MakeKeyHandler(CharacterSearchBackward,"CharacterSearchBackward") }, { Keys.CtrlAltQuestion, MakeKeyHandler(ShowKeyBindings, "ShowKeyBindings") }, - { Keys.CtrlR, MakeKeyHandler(ViSearchHistoryBackward,"ViSearchHistoryBackward") }, - { Keys.CtrlS, MakeKeyHandler(SearchForward, "SearchForward") }, + { Keys.CtrlR, MakeKeyHandler(ReverseSearchHistory, "ReverseSearchHistory") }, + { Keys.CtrlS, MakeKeyHandler(ForwardSearchHistory, "ForwardSearchHistory") }, + { Keys.CtrlG, MakeKeyHandler(Abort, "Abort") }, { Keys.AltH, MakeKeyHandler(ShowParameterHelp, "ShowParameterHelp") }, { Keys.F1, MakeKeyHandler(ShowCommandHelp, "ShowCommandHelp") }, }; @@ -201,10 +202,11 @@ private void SetDefaultViBindings() { Keys.Uphat, MakeKeyHandler(GotoFirstNonBlankOfLine, "GotoFirstNonBlankOfLine") }, { Keys.Underbar, MakeKeyHandler(GotoFirstNonBlankOfLine, "GotoFirstNonBlankOfLine") }, { Keys.Tilde, MakeKeyHandler(InvertCase, "InvertCase") }, - { Keys.Slash, MakeKeyHandler(ViSearchHistoryBackward, "ViSearchHistoryBackward") }, - { Keys.CtrlR, MakeKeyHandler(ViSearchHistoryBackward, "ViSearchHistoryBackward") }, + { Keys.Slash, MakeKeyHandler(ViSearchHistoryBackward, "ViSearchHistoryBackward") }, { Keys.Question, MakeKeyHandler(SearchForward, "SearchForward") }, - { Keys.CtrlS, MakeKeyHandler(SearchForward, "SearchForward") }, + { Keys.CtrlR, MakeKeyHandler(ReverseSearchHistory, "ReverseSearchHistory") }, + { Keys.CtrlS, MakeKeyHandler(ForwardSearchHistory, "ForwardSearchHistory") }, + { Keys.CtrlG, MakeKeyHandler(Abort, "Abort") }, { Keys.Plus, MakeKeyHandler(NextHistory, "NextHistory") }, { Keys.Minus, MakeKeyHandler(PreviousHistory, "PreviousHistory") }, { Keys.Period, MakeKeyHandler(RepeatLastCommand, "RepeatLastCommand") }, diff --git a/test/HistoryTest.VI.cs b/test/HistoryTest.VI.cs index 4ec4657e1..5927ab9da 100644 --- a/test/HistoryTest.VI.cs +++ b/test/HistoryTest.VI.cs @@ -1,4 +1,5 @@ -using Microsoft.PowerShell; +using System; +using Microsoft.PowerShell; using Xunit; namespace Test @@ -56,31 +57,114 @@ public void ViSearchHistory() // Clear history in case the above added some history (but it shouldn't) SetHistory(); - Test( " ", Keys( ' ', _.UpArrow, _.DownArrow ) ); - - SetHistory( "dosomething", "this way", "that way", "anyway", "no way", "yah way" ); + Test(" ", Keys(' ', _.UpArrow, _.DownArrow)); - Test( "dosomething", Keys( - _.Escape, _.Slash, "some", _.Enter, CheckThat( () => AssertLineIs( "dosomething" ) ), - _.Question, "yah", _.Enter, CheckThat( () => AssertLineIs( "yah way" ) ), - _.Slash, "some", _.Enter, 'h' // need 'h' here to avoid bogus failure - ) ); + var emphasisColors = Tuple.Create(PSConsoleReadLineOptions.DefaultEmphasisColor, _console.BackgroundColor); + var statusColors = Tuple.Create(_console.ForegroundColor, _console.BackgroundColor); SetHistory("dosomething", "this way", "that way", "anyway", "no way", "yah way"); Test("dosomething", Keys( - _.Escape, _.Ctrl_r, "some", _.Enter, CheckThat(() => AssertLineIs("dosomething")), - _.Ctrl_s, "yah", _.Enter, CheckThat(() => AssertLineIs("yah way")), - _.Ctrl_r, "some", _.Enter, 'h' // need 'h' here to avoid bogus failure + _.Escape, _.Slash, "some", _.Enter, CheckThat(() => AssertLineIs("dosomething")), + _.Question, "yah", _.Enter, CheckThat(() => AssertLineIs("yah way")), + _.Slash, "some", _.Enter, 'h' // need 'h' here to avoid bogus failure )); - SetHistory("dosomething", "this way", "that way", "anyway", "no way", "yah way"); - - Test("dosomething", Keys( - _.Ctrl_r, "some", _.Enter, CheckThat(() => AssertLineIs("dosomething")), - _.Ctrl_s, "yah", _.Enter, CheckThat(() => AssertLineIs("yah way")), - _.Ctrl_r, "some", _.Enter, _.Escape // new esc here to avoid bogus failure - )); + SetHistory("someway", "noway", "yahway"); + + Test("yahway", Keys( + // Change to Command mode. + _.Escape, + _.Ctrl_r, "way", + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "yah", + emphasisColors, "way", + NextLine, + statusColors, "bck-i-search: way_")), + _.Ctrl_r, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "no", + emphasisColors, "way", + NextLine, + statusColors, "bck-i-search: way_")), + _.Ctrl_r, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "some", + emphasisColors, "way", + NextLine, + statusColors, "bck-i-search: way_")), + _.Ctrl_s, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "no", + emphasisColors, "way", + NextLine, + statusColors, "fwd-i-search: way_")), + _.Ctrl_s, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "yah", + emphasisColors, "way", + NextLine, + statusColors, "fwd-i-search: way_")), + _.Ctrl_s, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "yahway", + NextLine, + statusColors, "failed-fwd-i-search: way_")), + + // Abort the history search. + _.Ctrl_g, CheckThat(() => AssertLineIs(string.Empty)), + // Search again and escape from the search. + _.Ctrl_r, "yah", + _.Escape, CheckThat(() => AssertScreenIs(1, TokenClassification.Command, "yahway")), + // We should not be able to edit the line, because we are in Command mode. + "nnn")); + + SetHistory("someway", "noway", "yahway"); + + Test("nnnyahway", Keys( + _.Ctrl_r, "way", + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "yah", + emphasisColors, "way", + NextLine, + statusColors, "bck-i-search: way_")), + _.Ctrl_r, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "no", + emphasisColors, "way", + NextLine, + statusColors, "bck-i-search: way_")), + _.Ctrl_r, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "some", + emphasisColors, "way", + NextLine, + statusColors, "bck-i-search: way_")), + _.Ctrl_s, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "no", + emphasisColors, "way", + NextLine, + statusColors, "fwd-i-search: way_")), + _.Ctrl_s, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "yah", + emphasisColors, "way", + NextLine, + statusColors, "fwd-i-search: way_")), + _.Ctrl_s, + CheckThat(() => AssertScreenIs(2, + TokenClassification.Command, "yahway", + NextLine, + statusColors, "failed-fwd-i-search: way_")), + + // Abort the history search. + _.Ctrl_g, CheckThat(() => AssertLineIs(string.Empty)), + // Search again and escape from the search. + _.Ctrl_r, "yah", + _.Escape, CheckThat(() => AssertScreenIs(1, TokenClassification.Command, "yahway")), + // We should be able to edit the line, because we are in Edit mode. + "nnn")); } [SkippableFact]