From aeebbfe79ebfafbef633047df6356b62eadb5783 Mon Sep 17 00:00:00 2001 From: Thomaz Moura Date: Thu, 25 Jan 2024 00:08:08 -0300 Subject: [PATCH] Ignore keys with no valid KeyChar for vi movements (#3795) --- PSReadLine/ReadLine.cs | 18 ++++++++++++++++++ PSReadLine/ReadLine.vi.cs | 16 ++++++++-------- PSReadLine/Replace.vi.cs | 8 ++++---- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/PSReadLine/ReadLine.cs b/PSReadLine/ReadLine.cs index c06120db..3c6e6dc8 100644 --- a/PSReadLine/ReadLine.cs +++ b/PSReadLine/ReadLine.cs @@ -289,6 +289,24 @@ internal static PSKeyInfo ReadKey() return key; } + /// + /// Reads a key, discarding the key if the PSKeyInfo returned does not + /// have a valid character. Will loop until a valid character is read. + /// The purpose of this method is to handle cases such as dead keys on + /// Windows on layouts such as US-International. + /// + /// The valid character read. + internal static char ReadKeyChar() + { + PSKeyInfo key; + do + { + key = ReadKey(); + } + while (key.KeyChar == '\0'); + return key.KeyChar; + } + private void PrependQueuedKeys(PSKeyInfo key) { if (_queuedKeys.Count > 0) diff --git a/PSReadLine/ReadLine.vi.cs b/PSReadLine/ReadLine.vi.cs index 571f06f5..1f3cf701 100644 --- a/PSReadLine/ReadLine.vi.cs +++ b/PSReadLine/ReadLine.vi.cs @@ -163,7 +163,7 @@ public static void RepeatLastCharSearchBackwards(ConsoleKeyInfo? key = null, obj /// public static void SearchChar(ConsoleKeyInfo? key = null, object arg = null) { - char keyChar = ReadKey().KeyChar; + char keyChar = ReadKeyChar(); ViCharacterSearcher.Set(keyChar, isBackward: false, isBackoff: false); ViCharacterSearcher.Search(keyChar, arg, backoff: false); } @@ -174,7 +174,7 @@ public static void SearchChar(ConsoleKeyInfo? key = null, object arg = null) /// public static void SearchCharBackward(ConsoleKeyInfo? key = null, object arg = null) { - char keyChar = ReadKey().KeyChar; + char keyChar = ReadKeyChar(); ViCharacterSearcher.Set(keyChar, isBackward: true, isBackoff: false); ViCharacterSearcher.SearchBackward(keyChar, arg, backoff: false); } @@ -185,7 +185,7 @@ public static void SearchCharBackward(ConsoleKeyInfo? key = null, object arg = n /// public static void SearchCharWithBackoff(ConsoleKeyInfo? key = null, object arg = null) { - char keyChar = ReadKey().KeyChar; + char keyChar = ReadKeyChar(); ViCharacterSearcher.Set(keyChar, isBackward: false, isBackoff: true); ViCharacterSearcher.Search(keyChar, arg, backoff: true); } @@ -196,7 +196,7 @@ public static void SearchCharWithBackoff(ConsoleKeyInfo? key = null, object arg /// public static void SearchCharBackwardWithBackoff(ConsoleKeyInfo? key = null, object arg = null) { - char keyChar = ReadKey().KeyChar; + char keyChar = ReadKeyChar(); ViCharacterSearcher.Set(keyChar, isBackward: true, isBackoff: true); ViCharacterSearcher.SearchBackward(keyChar, arg, backoff: true); } @@ -362,7 +362,7 @@ public static void ViDeleteEndOfGlob(ConsoleKeyInfo? key = null, object arg = nu /// public static void ViDeleteToChar(ConsoleKeyInfo? key = null, object arg = null) { - var keyChar = ReadKey().KeyChar; + var keyChar = ReadKeyChar(); ViDeleteToChar(keyChar, key, arg); } @@ -380,7 +380,7 @@ public static void ViDeleteToChar(char keyChar, ConsoleKeyInfo? key = null, obje /// public static void ViDeleteToCharBackward(ConsoleKeyInfo? key = null, object arg = null) { - var keyChar = ReadKey().KeyChar; + var keyChar = ReadKeyChar(); ViDeleteToCharBack(keyChar, key, arg); } @@ -397,7 +397,7 @@ public static void ViDeleteToCharBack(char keyChar, ConsoleKeyInfo? key = null, /// public static void ViDeleteToBeforeChar(ConsoleKeyInfo? key = null, object arg = null) { - var keyChar = ReadKey().KeyChar; + var keyChar = ReadKeyChar(); ViDeleteToBeforeChar(keyChar, key, arg); } @@ -415,7 +415,7 @@ public static void ViDeleteToBeforeChar(char keyChar, ConsoleKeyInfo? key = null /// public static void ViDeleteToBeforeCharBackward(ConsoleKeyInfo? key = null, object arg = null) { - var keyChar = ReadKey().KeyChar; + var keyChar = ReadKeyChar(); ViDeleteToBeforeCharBack(keyChar, key, arg); } diff --git a/PSReadLine/Replace.vi.cs b/PSReadLine/Replace.vi.cs index 8617f79c..12baff7d 100644 --- a/PSReadLine/Replace.vi.cs +++ b/PSReadLine/Replace.vi.cs @@ -256,7 +256,7 @@ private static void ReplaceCharInPlace(ConsoleKeyInfo? key, object arg) /// public static void ViReplaceToChar(ConsoleKeyInfo? key = null, object arg = null) { - var keyChar = ReadKey().KeyChar; + var keyChar = ReadKeyChar(); ViReplaceToChar(keyChar, key, arg); } @@ -288,7 +288,7 @@ private static void ViReplaceToChar(char keyChar, ConsoleKeyInfo? key = null, ob /// public static void ViReplaceToCharBackward(ConsoleKeyInfo? key = null, object arg = null) { - var keyChar = ReadKey().KeyChar; + var keyChar = ReadKeyChar(); ViReplaceToCharBack(keyChar, key, arg); } @@ -310,7 +310,7 @@ private static void ViReplaceToCharBack(char keyChar, ConsoleKeyInfo? key = null /// public static void ViReplaceToBeforeChar(ConsoleKeyInfo? key = null, object arg = null) { - var keyChar = ReadKey().KeyChar; + var keyChar = ReadKeyChar(); ViReplaceToBeforeChar(keyChar, key, arg); } @@ -333,7 +333,7 @@ private static void ViReplaceToBeforeChar(char keyChar, ConsoleKeyInfo? key = nu /// public static void ViReplaceToBeforeCharBackward(ConsoleKeyInfo? key = null, object arg = null) { - var keyChar = ReadKey().KeyChar; + var keyChar = ReadKeyChar(); ViReplaceToBeforeCharBack(keyChar, key, arg); }