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);
}