Skip to content

Commit aeebbfe

Browse files
committed
Ignore keys with no valid KeyChar for vi movements (PowerShell#3795)
1 parent e57f7d6 commit aeebbfe

File tree

3 files changed

+30
-12
lines changed

3 files changed

+30
-12
lines changed

PSReadLine/ReadLine.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,24 @@ internal static PSKeyInfo ReadKey()
289289
return key;
290290
}
291291

292+
/// <summary>
293+
/// Reads a key, discarding the key if the PSKeyInfo returned does not
294+
/// have a valid character. Will loop until a valid character is read.
295+
/// The purpose of this method is to handle cases such as dead keys on
296+
/// Windows on layouts such as US-International.
297+
/// </summary>
298+
/// <returns> The valid character read. </returns>
299+
internal static char ReadKeyChar()
300+
{
301+
PSKeyInfo key;
302+
do
303+
{
304+
key = ReadKey();
305+
}
306+
while (key.KeyChar == '\0');
307+
return key.KeyChar;
308+
}
309+
292310
private void PrependQueuedKeys(PSKeyInfo key)
293311
{
294312
if (_queuedKeys.Count > 0)

PSReadLine/ReadLine.vi.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public static void RepeatLastCharSearchBackwards(ConsoleKeyInfo? key = null, obj
163163
/// </summary>
164164
public static void SearchChar(ConsoleKeyInfo? key = null, object arg = null)
165165
{
166-
char keyChar = ReadKey().KeyChar;
166+
char keyChar = ReadKeyChar();
167167
ViCharacterSearcher.Set(keyChar, isBackward: false, isBackoff: false);
168168
ViCharacterSearcher.Search(keyChar, arg, backoff: false);
169169
}
@@ -174,7 +174,7 @@ public static void SearchChar(ConsoleKeyInfo? key = null, object arg = null)
174174
/// </summary>
175175
public static void SearchCharBackward(ConsoleKeyInfo? key = null, object arg = null)
176176
{
177-
char keyChar = ReadKey().KeyChar;
177+
char keyChar = ReadKeyChar();
178178
ViCharacterSearcher.Set(keyChar, isBackward: true, isBackoff: false);
179179
ViCharacterSearcher.SearchBackward(keyChar, arg, backoff: false);
180180
}
@@ -185,7 +185,7 @@ public static void SearchCharBackward(ConsoleKeyInfo? key = null, object arg = n
185185
/// </summary>
186186
public static void SearchCharWithBackoff(ConsoleKeyInfo? key = null, object arg = null)
187187
{
188-
char keyChar = ReadKey().KeyChar;
188+
char keyChar = ReadKeyChar();
189189
ViCharacterSearcher.Set(keyChar, isBackward: false, isBackoff: true);
190190
ViCharacterSearcher.Search(keyChar, arg, backoff: true);
191191
}
@@ -196,7 +196,7 @@ public static void SearchCharWithBackoff(ConsoleKeyInfo? key = null, object arg
196196
/// </summary>
197197
public static void SearchCharBackwardWithBackoff(ConsoleKeyInfo? key = null, object arg = null)
198198
{
199-
char keyChar = ReadKey().KeyChar;
199+
char keyChar = ReadKeyChar();
200200
ViCharacterSearcher.Set(keyChar, isBackward: true, isBackoff: true);
201201
ViCharacterSearcher.SearchBackward(keyChar, arg, backoff: true);
202202
}
@@ -362,7 +362,7 @@ public static void ViDeleteEndOfGlob(ConsoleKeyInfo? key = null, object arg = nu
362362
/// </summary>
363363
public static void ViDeleteToChar(ConsoleKeyInfo? key = null, object arg = null)
364364
{
365-
var keyChar = ReadKey().KeyChar;
365+
var keyChar = ReadKeyChar();
366366
ViDeleteToChar(keyChar, key, arg);
367367
}
368368

@@ -380,7 +380,7 @@ public static void ViDeleteToChar(char keyChar, ConsoleKeyInfo? key = null, obje
380380
/// </summary>
381381
public static void ViDeleteToCharBackward(ConsoleKeyInfo? key = null, object arg = null)
382382
{
383-
var keyChar = ReadKey().KeyChar;
383+
var keyChar = ReadKeyChar();
384384
ViDeleteToCharBack(keyChar, key, arg);
385385
}
386386

@@ -397,7 +397,7 @@ public static void ViDeleteToCharBack(char keyChar, ConsoleKeyInfo? key = null,
397397
/// </summary>
398398
public static void ViDeleteToBeforeChar(ConsoleKeyInfo? key = null, object arg = null)
399399
{
400-
var keyChar = ReadKey().KeyChar;
400+
var keyChar = ReadKeyChar();
401401
ViDeleteToBeforeChar(keyChar, key, arg);
402402
}
403403

@@ -415,7 +415,7 @@ public static void ViDeleteToBeforeChar(char keyChar, ConsoleKeyInfo? key = null
415415
/// </summary>
416416
public static void ViDeleteToBeforeCharBackward(ConsoleKeyInfo? key = null, object arg = null)
417417
{
418-
var keyChar = ReadKey().KeyChar;
418+
var keyChar = ReadKeyChar();
419419
ViDeleteToBeforeCharBack(keyChar, key, arg);
420420
}
421421

PSReadLine/Replace.vi.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ private static void ReplaceCharInPlace(ConsoleKeyInfo? key, object arg)
256256
/// </summary>
257257
public static void ViReplaceToChar(ConsoleKeyInfo? key = null, object arg = null)
258258
{
259-
var keyChar = ReadKey().KeyChar;
259+
var keyChar = ReadKeyChar();
260260
ViReplaceToChar(keyChar, key, arg);
261261
}
262262

@@ -288,7 +288,7 @@ private static void ViReplaceToChar(char keyChar, ConsoleKeyInfo? key = null, ob
288288
/// </summary>
289289
public static void ViReplaceToCharBackward(ConsoleKeyInfo? key = null, object arg = null)
290290
{
291-
var keyChar = ReadKey().KeyChar;
291+
var keyChar = ReadKeyChar();
292292
ViReplaceToCharBack(keyChar, key, arg);
293293
}
294294

@@ -310,7 +310,7 @@ private static void ViReplaceToCharBack(char keyChar, ConsoleKeyInfo? key = null
310310
/// </summary>
311311
public static void ViReplaceToBeforeChar(ConsoleKeyInfo? key = null, object arg = null)
312312
{
313-
var keyChar = ReadKey().KeyChar;
313+
var keyChar = ReadKeyChar();
314314
ViReplaceToBeforeChar(keyChar, key, arg);
315315
}
316316

@@ -333,7 +333,7 @@ private static void ViReplaceToBeforeChar(char keyChar, ConsoleKeyInfo? key = nu
333333
/// </summary>
334334
public static void ViReplaceToBeforeCharBackward(ConsoleKeyInfo? key = null, object arg = null)
335335
{
336-
var keyChar = ReadKey().KeyChar;
336+
var keyChar = ReadKeyChar();
337337
ViReplaceToBeforeCharBack(keyChar, key, arg);
338338
}
339339

0 commit comments

Comments
 (0)