@@ -16,6 +16,7 @@ import {
16
16
} from '../vimscript/expression' ;
17
17
import {
18
18
Dot ,
19
+ ExecuteNormalTransformation ,
19
20
InsertTextVSCodeTransformation ,
20
21
TextTransformations ,
21
22
Transformation ,
@@ -238,42 +239,7 @@ export async function executeTransformations(
238
239
break ;
239
240
240
241
case 'executeNormal' :
241
- const { keystroke, startLineNumber, endLineNumber, withRange } = transformation ;
242
- const stroke = keystrokesExpressionParser . parse ( keystroke ) ;
243
- if ( ! stroke . status ) {
244
- throw new Error ( `Failed to execute normal command: ${ keystroke } ` ) ;
245
- }
246
-
247
- const resultLineNumbers : number [ ] = [ ] ;
248
- if ( withRange ) {
249
- for ( let i = startLineNumber ; i <= endLineNumber ; i ++ ) {
250
- resultLineNumbers . push ( i ) ;
251
- }
252
- } else {
253
- const selectionList = vimState . editor . selections ;
254
- for ( const selection of selectionList ) {
255
- const { start, end } = selection ;
256
-
257
- for ( let i = start . line ; i <= end . line ; i ++ ) {
258
- resultLineNumbers . push ( i ) ;
259
- }
260
- }
261
- }
262
-
263
- vimState . normalCommandState = NormalCommandState . Executing ;
264
- vimState . recordedState = new RecordedState ( ) ;
265
- await vimState . setCurrentMode ( Mode . Normal ) ;
266
- for ( const lineNumber of resultLineNumbers ) {
267
- if ( withRange ) {
268
- vimState . cursorStopPosition = vimState . cursorStartPosition =
269
- TextEditor . getFirstNonWhitespaceCharOnLine ( vimState . document , lineNumber ) ;
270
- }
271
- await modeHandler . handleMultipleKeyEvents ( stroke . value ) ;
272
- if ( vimState . currentMode === Mode . Insert ) {
273
- await modeHandler . handleKeyEvent ( '<Esc>' ) ;
274
- }
275
- }
276
- vimState . normalCommandState = NormalCommandState . Finished ;
242
+ await doExecuteNormal ( modeHandler , transformation ) ;
277
243
break ;
278
244
279
245
case 'vscodeCommand' :
@@ -335,3 +301,46 @@ export async function executeTransformations(
335
301
336
302
vimState . recordedState . transformer = new Transformer ( ) ;
337
303
}
304
+
305
+ const doExecuteNormal = async (
306
+ modeHandler : IModeHandler ,
307
+ transformation : ExecuteNormalTransformation ,
308
+ ) => {
309
+ const vimState = modeHandler . vimState ;
310
+ const { keystrokes, startLineNumber, endLineNumber, withRange } = transformation ;
311
+ const strokes = keystrokesExpressionParser . parse ( keystrokes ) ;
312
+ if ( ! strokes . status ) {
313
+ throw new Error ( `Failed to execute normal command: ${ keystrokes } ` ) ;
314
+ }
315
+
316
+ const resultLineNumbers : number [ ] = [ ] ;
317
+ if ( withRange ) {
318
+ for ( let i = startLineNumber ; i <= endLineNumber ; i ++ ) {
319
+ resultLineNumbers . push ( i ) ;
320
+ }
321
+ } else {
322
+ const selectionList = vimState . editor . selections ;
323
+ for ( const selection of selectionList ) {
324
+ const { start, end } = selection ;
325
+
326
+ for ( let i = start . line ; i <= end . line ; i ++ ) {
327
+ resultLineNumbers . push ( i ) ;
328
+ }
329
+ }
330
+ }
331
+
332
+ vimState . normalCommandState = NormalCommandState . Executing ;
333
+ vimState . recordedState = new RecordedState ( ) ;
334
+ await vimState . setCurrentMode ( Mode . Normal ) ;
335
+ for ( const lineNumber of resultLineNumbers ) {
336
+ if ( withRange ) {
337
+ vimState . cursorStopPosition = vimState . cursorStartPosition =
338
+ TextEditor . getFirstNonWhitespaceCharOnLine ( vimState . document , lineNumber ) ;
339
+ }
340
+ await modeHandler . handleMultipleKeyEvents ( strokes . value ) ;
341
+ if ( vimState . currentMode === Mode . Insert ) {
342
+ await modeHandler . handleKeyEvent ( '<Esc>' ) ;
343
+ }
344
+ }
345
+ vimState . normalCommandState = NormalCommandState . Finished ;
346
+ } ;
0 commit comments