Skip to content

Commit c1baf12

Browse files
committed
Adding 'f', 'F', 't', 'T' movements to 'd' and 'c' command.
1 parent 827cebb commit c1baf12

File tree

3 files changed

+245
-28
lines changed

3 files changed

+245
-28
lines changed

PSReadLine/KeyBindings.vi.cs

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -209,37 +209,45 @@ private static KeyHandler MakeViKeyHandler(Action<ConsoleKeyInfo?, object> actio
209209

210210
private static readonly Dictionary<ConsoleKeyInfo, KeyHandler> _viChordDTable = new Dictionary<ConsoleKeyInfo, KeyHandler>(new ConsoleKeyInfoComparer())
211211
{
212-
{ Keys.D, MakeViKeyHandler( DeleteLine, "DeleteLine") },
213-
{ Keys.Dollar, MakeViKeyHandler( DeleteToEnd, "DeleteToEnd") },
214-
{ Keys.B, MakeViKeyHandler( BackwardDeleteWord, "BackwardDeleteWord") },
215-
{ Keys.ucB, MakeViKeyHandler( ViBackwardDeleteGlob, "ViBackwardDeleteGlob") },
216-
{ Keys.W, MakeViKeyHandler( DeleteWord, "DeleteWord") },
217-
{ Keys.ucW, MakeViKeyHandler( ViDeleteGlob, "ViDeleteGlob") },
218-
{ Keys.E, MakeViKeyHandler( DeleteEndOfWord, "DeleteEndOfWord") },
219-
{ Keys.ucE, MakeViKeyHandler( ViDeleteEndOfGlob, "ViDeleteEndOfGlob") },
220-
{ Keys.H, MakeViKeyHandler( BackwardDeleteChar, "BackwardDeleteChar") },
221-
{ Keys.L, MakeViKeyHandler( DeleteChar, "DeleteChar") },
222-
{ Keys.Space, MakeViKeyHandler( DeleteChar, "DeleteChar") },
223-
{ Keys._0, MakeViKeyHandler( BackwardDeleteLine, "BackwardDeleteLine") },
224-
{ Keys.Uphat, MakeViKeyHandler( DeleteLineToFirstChar,"DeleteLineToFirstChar") },
225-
{ Keys.Percent, MakeViKeyHandler( ViDeleteBrace, "DeleteBrace") },
212+
{ Keys.D, MakeViKeyHandler( DeleteLine, "DeleteLine") },
213+
{ Keys.Dollar, MakeViKeyHandler( DeleteToEnd, "DeleteToEnd") },
214+
{ Keys.B, MakeViKeyHandler( BackwardDeleteWord, "BackwardDeleteWord") },
215+
{ Keys.ucB, MakeViKeyHandler( ViBackwardDeleteGlob, "ViBackwardDeleteGlob") },
216+
{ Keys.W, MakeViKeyHandler( DeleteWord, "DeleteWord") },
217+
{ Keys.ucW, MakeViKeyHandler( ViDeleteGlob, "ViDeleteGlob") },
218+
{ Keys.E, MakeViKeyHandler( DeleteEndOfWord, "DeleteEndOfWord") },
219+
{ Keys.ucE, MakeViKeyHandler( ViDeleteEndOfGlob, "ViDeleteEndOfGlob") },
220+
{ Keys.H, MakeViKeyHandler( BackwardDeleteChar, "BackwardDeleteChar") },
221+
{ Keys.L, MakeViKeyHandler( DeleteChar, "DeleteChar") },
222+
{ Keys.Space, MakeViKeyHandler( DeleteChar, "DeleteChar") },
223+
{ Keys._0, MakeViKeyHandler( BackwardDeleteLine, "BackwardDeleteLine") },
224+
{ Keys.Uphat, MakeViKeyHandler( DeleteLineToFirstChar, "DeleteLineToFirstChar") },
225+
{ Keys.Percent, MakeViKeyHandler( ViDeleteBrace, "DeleteBrace") },
226+
{ Keys.F, MakeViKeyHandler( ViDeleteToChar, "ViDeleteToChar") },
227+
{ Keys.ucF, MakeViKeyHandler( ViDeleteToCharBackward, "ViDeleteToCharBackward") },
228+
{ Keys.T, MakeViKeyHandler( ViDeleteToBeforeChar, "ViDeleteToBeforeChar") },
229+
{ Keys.ucT, MakeViKeyHandler( ViDeleteToBeforeCharBackward, "ViDeleteToBeforeCharBackward") },
226230
};
227231
private static readonly Dictionary<ConsoleKeyInfo, KeyHandler> _viChordCTable = new Dictionary<ConsoleKeyInfo, KeyHandler>(new ConsoleKeyInfoComparer())
228232
{
229-
{ Keys.C, MakeViKeyHandler( ViReplaceLine, "ViReplaceLine") },
230-
{ Keys.Dollar, MakeViKeyHandler( ViReplaceToEnd, "ViReplaceToEnd") },
231-
{ Keys.B, MakeViKeyHandler( ViBackwardReplaceWord, "ViBackwardReplaceWord") },
232-
{ Keys.ucB, MakeViKeyHandler( ViBackwardReplaceGlob, "ViBackwardReplaceGlob") },
233-
{ Keys.W, MakeViKeyHandler( ViReplaceWord, "ViReplaceWord") },
234-
{ Keys.ucW, MakeViKeyHandler( ViReplaceGlob, "ViReplaceGlob") },
235-
{ Keys.E, MakeViKeyHandler( ViReplaceEndOfWord, "ViReplaceEndOfWord") },
236-
{ Keys.ucE, MakeViKeyHandler( ViReplaceEndOfGlob, "ViReplaceEndOfGlob") },
237-
{ Keys.H, MakeViKeyHandler( BackwardReplaceChar, "BackwardReplaceChar") },
238-
{ Keys.L, MakeViKeyHandler( ReplaceChar, "ReplaceChar") },
239-
{ Keys.Space, MakeViKeyHandler( ReplaceChar, "ReplaceChar") },
240-
{ Keys._0, MakeViKeyHandler( ViBackwardReplaceLine, "ViBackwardReplaceLine") },
233+
{ Keys.C, MakeViKeyHandler( ViReplaceLine, "ViReplaceLine") },
234+
{ Keys.Dollar, MakeViKeyHandler( ViReplaceToEnd, "ViReplaceToEnd") },
235+
{ Keys.B, MakeViKeyHandler( ViBackwardReplaceWord, "ViBackwardReplaceWord") },
236+
{ Keys.ucB, MakeViKeyHandler( ViBackwardReplaceGlob, "ViBackwardReplaceGlob") },
237+
{ Keys.W, MakeViKeyHandler( ViReplaceWord, "ViReplaceWord") },
238+
{ Keys.ucW, MakeViKeyHandler( ViReplaceGlob, "ViReplaceGlob") },
239+
{ Keys.E, MakeViKeyHandler( ViReplaceEndOfWord, "ViReplaceEndOfWord") },
240+
{ Keys.ucE, MakeViKeyHandler( ViReplaceEndOfGlob, "ViReplaceEndOfGlob") },
241+
{ Keys.H, MakeViKeyHandler( BackwardReplaceChar, "BackwardReplaceChar") },
242+
{ Keys.L, MakeViKeyHandler( ReplaceChar, "ReplaceChar") },
243+
{ Keys.Space, MakeViKeyHandler( ReplaceChar, "ReplaceChar") },
244+
{ Keys._0, MakeViKeyHandler( ViBackwardReplaceLine, "ViBackwardReplaceLine") },
241245
{ Keys.Uphat, MakeViKeyHandler( ViBackwardReplaceLineToFirstChar, "ViBackwardReplaceLineToFirstChar") },
242-
{ Keys.Percent, MakeViKeyHandler( ViReplaceBrace, "ViReplaceBrace") },
246+
{ Keys.Percent, MakeViKeyHandler( ViReplaceBrace, "ViReplaceBrace") },
247+
{ Keys.F, MakeViKeyHandler( ViReplaceToChar, "ViReplaceToChar") },
248+
{ Keys.ucF, MakeViKeyHandler( ViReplaceToCharBackward, "ViReplaceToCharBackward") },
249+
{ Keys.T, MakeViKeyHandler( ViReplaceToBeforeChar, "ViReplaceToBeforeChar") },
250+
{ Keys.ucT, MakeViKeyHandler( ViReplaceToBeforeCharBackward, "ViReplaceToBeforeCharBackward") },
243251
};
244252
private static readonly Dictionary<ConsoleKeyInfo, KeyHandler> _viChordYTable = new Dictionary<ConsoleKeyInfo, KeyHandler>(new ConsoleKeyInfoComparer())
245253
{

PSReadLine/ReadLine.vi.cs

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,25 @@ public static void Search(char keyChar, object arg, bool backoff)
7676
Ding();
7777
}
7878

79+
public static void SearchDelete(char keyChar, object arg, bool backoff, Action<ConsoleKeyInfo?, object> instigator)
80+
{
81+
int qty = (arg is int) ? (int) arg : 1;
82+
83+
for (int i = _singleton._current + 1; i < _singleton._buffer.Length; i++)
84+
{
85+
if (_singleton._buffer[i] == keyChar)
86+
{
87+
qty -= 1;
88+
if (qty == 0)
89+
{
90+
DeleteToEndPoint(arg, backoff ? i : i + 1, instigator);
91+
return;
92+
}
93+
}
94+
}
95+
Ding();
96+
}
97+
7998
public static void SearchBackward(char keyChar, object arg, bool backoff)
8099
{
81100
Set(keyChar, isBackward: true, isBackoff: backoff);
@@ -96,6 +115,26 @@ public static void SearchBackward(char keyChar, object arg, bool backoff)
96115
}
97116
Ding();
98117
}
118+
119+
public static void SearchBackwardDelete(char keyChar, object arg, bool backoff, Action<ConsoleKeyInfo?, object> instigator)
120+
{
121+
Set(keyChar, isBackward: true, isBackoff: backoff);
122+
int qty = (arg is int) ? (int) arg : 1;
123+
124+
for (int i = _singleton._current - 1; i >= 0; i--)
125+
{
126+
if (_singleton._buffer[i] == keyChar)
127+
{
128+
qty -= 1;
129+
if (qty == 0)
130+
{
131+
DeleteBackwardToEndPoint(arg, backoff ? i + 1 : i, instigator);
132+
return;
133+
}
134+
}
135+
}
136+
Ding();
137+
}
99138
}
100139

101140
/// <summary>
@@ -241,11 +280,17 @@ public static void DeleteWord(ConsoleKeyInfo? key = null, object arg = null)
241280
Ding();
242281
return;
243282
}
283+
284+
DeleteToEndPoint(arg, endPoint, DeleteWord);
285+
}
286+
287+
private static void DeleteToEndPoint(object arg, int endPoint, Action<ConsoleKeyInfo?, object> instigator)
288+
{
244289
_singleton.SaveToClipboard(_singleton._current, endPoint - _singleton._current);
245290
_singleton.SaveEditItem(EditItemDelete.Create(
246291
_singleton._clipboard,
247292
_singleton._current,
248-
DeleteWord,
293+
instigator,
249294
arg
250295
));
251296
_singleton._buffer.Remove(_singleton._current, endPoint - _singleton._current);
@@ -256,6 +301,20 @@ public static void DeleteWord(ConsoleKeyInfo? key = null, object arg = null)
256301
_singleton.Render();
257302
}
258303

304+
private static void DeleteBackwardToEndPoint(object arg, int endPoint, Action<ConsoleKeyInfo?, object> instigator)
305+
{
306+
_singleton.SaveToClipboard(endPoint, _singleton._current - endPoint);
307+
_singleton.SaveEditItem(EditItemDelete.Create(
308+
_singleton._clipboard,
309+
endPoint,
310+
instigator,
311+
arg
312+
));
313+
_singleton._buffer.Remove(endPoint, _singleton._current - endPoint);
314+
_singleton._current = endPoint;
315+
_singleton.Render();
316+
}
317+
259318
/// <summary>
260319
/// Delete the next glob (white space delimited word).
261320
/// </summary>
@@ -343,6 +402,78 @@ public static void ViDeleteEndOfGlob(ConsoleKeyInfo? key = null, object arg = nu
343402
_singleton.Render();
344403
}
345404

405+
/// <summary>
406+
/// Deletes until given character
407+
/// </summary>
408+
/// <param name="key"></param>
409+
/// <param name="arg"></param>
410+
[SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")]
411+
private static void ViDeleteToChar(ConsoleKeyInfo? key = null, object arg = null)
412+
{
413+
var keyChar = ReadKey().KeyChar;
414+
ViDeleteToChar(keyChar, key, arg);
415+
}
416+
417+
private static void ViDeleteToChar(char keyChar, ConsoleKeyInfo? key = null, object arg = null)
418+
{
419+
ViCharacterSearcher.Set(keyChar, isBackward: false, isBackoff: false);
420+
ViCharacterSearcher.SearchDelete(keyChar, arg, backoff: false, instigator: (_key, _arg) => ViDeleteToChar(keyChar, _key, _arg));
421+
}
422+
423+
/// <summary>
424+
/// Deletes until given character
425+
/// </summary>
426+
/// <param name="key"></param>
427+
/// <param name="arg"></param>
428+
[SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")]
429+
private static void ViDeleteToCharBackward(ConsoleKeyInfo? key = null, object arg = null)
430+
{
431+
var keyChar = ReadKey().KeyChar;
432+
ViDeleteToCharBack(keyChar, key, arg);
433+
}
434+
435+
private static void ViDeleteToCharBack(char keyChar, ConsoleKeyInfo? key = null, object arg = null)
436+
{
437+
ViCharacterSearcher.Set(keyChar, isBackward: true, isBackoff: false);
438+
ViCharacterSearcher.SearchBackwardDelete(keyChar, arg, backoff: false, instigator: (_key, _arg) => ViDeleteToCharBack(keyChar, _key, _arg));
439+
}
440+
441+
/// <summary>
442+
/// Deletes until given character
443+
/// </summary>
444+
/// <param name="key"></param>
445+
/// <param name="arg"></param>
446+
[SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")]
447+
private static void ViDeleteToBeforeChar(ConsoleKeyInfo? key = null, object arg = null)
448+
{
449+
var keyChar = ReadKey().KeyChar;
450+
ViDeleteToBeforeChar(keyChar, key, arg);
451+
}
452+
453+
private static void ViDeleteToBeforeChar(char keyChar, ConsoleKeyInfo? key = null, object arg = null)
454+
{
455+
ViCharacterSearcher.Set(keyChar, isBackward: false, isBackoff: true);
456+
ViCharacterSearcher.SearchDelete(keyChar, arg, backoff: true, instigator: (_key, _arg) => ViDeleteToBeforeChar(keyChar, _key, _arg));
457+
}
458+
459+
/// <summary>
460+
/// Deletes until given character
461+
/// </summary>
462+
/// <param name="key"></param>
463+
/// <param name="arg"></param>
464+
[SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")]
465+
private static void ViDeleteToBeforeCharBackward(ConsoleKeyInfo? key = null, object arg = null)
466+
{
467+
var keyChar = ReadKey().KeyChar;
468+
ViDeleteToBeforeCharBack(keyChar, key, arg);
469+
}
470+
471+
private static void ViDeleteToBeforeCharBack(char keyChar, ConsoleKeyInfo? key = null, object arg = null)
472+
{
473+
ViCharacterSearcher.Set(keyChar, isBackward: true, isBackoff: true);
474+
ViCharacterSearcher.SearchBackwardDelete(keyChar, arg, backoff: true, instigator: (_key, _arg) => ViDeleteToBeforeCharBack(keyChar, _key, _arg));
475+
}
476+
346477
/// <summary>
347478
/// Ring the bell.
348479
/// </summary>

PSReadLine/Replace.vi.cs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,5 +245,83 @@ private static void ReplaceCharInPlace(ConsoleKeyInfo? key, object arg)
245245
Ding();
246246
}
247247
}
248+
249+
/// <summary>
250+
/// Deletes until given character
251+
/// </summary>
252+
/// <param name="key"></param>
253+
/// <param name="arg"></param>
254+
[SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")]
255+
private static void ViReplaceToChar(ConsoleKeyInfo? key = null, object arg = null)
256+
{
257+
var keyChar = ReadKey().KeyChar;
258+
ViReplaceToChar(keyChar, key, arg);
259+
}
260+
261+
private static void ViReplaceToChar(char keyChar, ConsoleKeyInfo? key = null, object arg = null)
262+
{
263+
ViCharacterSearcher.Set(keyChar, isBackward: false, isBackoff: false);
264+
ViCharacterSearcher.SearchDelete(keyChar, arg, backoff: false, instigator: (_key, _arg) => ViReplaceToChar(keyChar, _key, _arg));
265+
ViInsertMode(key, arg);
266+
}
267+
268+
/// <summary>
269+
/// Replaces until given character
270+
/// </summary>
271+
/// <param name="key"></param>
272+
/// <param name="arg"></param>
273+
[SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")]
274+
private static void ViReplaceToCharBackward(ConsoleKeyInfo? key = null, object arg = null)
275+
{
276+
var keyChar = ReadKey().KeyChar;
277+
ViReplaceToCharBack(keyChar, key, arg);
278+
}
279+
280+
private static void ViReplaceToCharBack(char keyChar, ConsoleKeyInfo? key = null, object arg = null)
281+
{
282+
ViCharacterSearcher.Set(keyChar, isBackward: true, isBackoff: false);
283+
ViCharacterSearcher.SearchBackwardDelete(keyChar, arg, backoff: false, instigator: (_key, _arg) => ViReplaceToCharBack(keyChar, _key, _arg));
284+
ViInsertMode(key, arg);
285+
}
286+
287+
/// <summary>
288+
/// Replaces until given character
289+
/// </summary>
290+
/// <param name="key"></param>
291+
/// <param name="arg"></param>
292+
[SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")]
293+
private static void ViReplaceToBeforeChar(ConsoleKeyInfo? key = null, object arg = null)
294+
{
295+
var keyChar = ReadKey().KeyChar;
296+
ViReplaceToBeforeChar(keyChar, key, arg);
297+
}
298+
299+
private static void ViReplaceToBeforeChar(char keyChar, ConsoleKeyInfo? key = null, object arg = null)
300+
{
301+
ViCharacterSearcher.Set(keyChar, isBackward: false, isBackoff: true);
302+
ViCharacterSearcher.SearchDelete(keyChar, arg, backoff: true, instigator: (_key, _arg) => ViReplaceToBeforeChar(keyChar, _key, _arg));
303+
ViInsertMode(key, arg);
304+
}
305+
306+
/// <summary>
307+
/// Replaces until given character
308+
/// </summary>
309+
/// <param name="key"></param>
310+
/// <param name="arg"></param>
311+
[SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")]
312+
private static void ViReplaceToBeforeCharBackward(ConsoleKeyInfo? key = null, object arg = null)
313+
{
314+
var keyChar = ReadKey().KeyChar;
315+
ViReplaceToBeforeCharBack(keyChar, key, arg);
316+
}
317+
318+
private static void ViReplaceToBeforeCharBack(char keyChar, ConsoleKeyInfo? key = null, object arg = null)
319+
{
320+
ViCharacterSearcher.Set(keyChar, isBackward: true, isBackoff: true);
321+
ViCharacterSearcher.SearchBackwardDelete(keyChar, arg, backoff: true, instigator: (_key, _arg) => ViReplaceToBeforeCharBack(keyChar, _key, _arg));
322+
ViInsertMode(key, arg);
323+
}
324+
325+
248326
}
249327
}

0 commit comments

Comments
 (0)