@@ -52,6 +52,12 @@ public enum ViModeStyle
5252 Prompt ,
5353 Cursor
5454 }
55+
56+ public enum ViMode
57+ {
58+ Insert ,
59+ Command
60+ }
5561 #endregion vi
5662
5763 public enum HistorySaveStyle
@@ -590,15 +596,48 @@ protected override void EndProcessing()
590596 }
591597 }
592598
593- [ Cmdlet ( "Set" , "PSReadlineKeyHandler" , HelpUri = "http://go.microsoft.com/fwlink/?LinkId=528810" ) ]
594- public class SetPSReadlineKeyHandlerCommand : PSCmdlet , IDynamicParameters
599+ public class ChangePSReadlineKeyHandlerCommand : PSCmdlet
595600 {
596601 [ Parameter ( Position = 0 , Mandatory = true ) ]
597602 [ Alias ( "Key" ) ]
598603 [ ValidateNotNullOrEmpty ]
599604 [ SuppressMessage ( "Microsoft.Performance" , "CA1819:PropertiesShouldNotReturnArrays" ) ]
600605 public string [ ] Chord { get ; set ; }
601606
607+ [ Parameter ]
608+ public ViMode ViMode { get ; set ; }
609+
610+ [ ExcludeFromCodeCoverage ]
611+ protected IDisposable UseRequestedDispatchTables ( )
612+ {
613+ bool inViMode = PSConsoleReadLine . GetOptions ( ) . EditMode == EditMode . Vi ;
614+ bool viModeParamPresent = MyInvocation . BoundParameters . ContainsKey ( "ViMode" ) ;
615+
616+ if ( inViMode || viModeParamPresent )
617+ {
618+ if ( ! inViMode )
619+ {
620+ // "-ViMode" must have been specified explicitly. Well, okay... we can
621+ // modify the Vi tables... but isn't that an odd thing to do from
622+ // not-vi mode?
623+ WriteWarning ( PSReadLineResources . NotInViMode ) ;
624+ }
625+
626+ if ( ViMode == ViMode . Insert ) // default if -ViMode not specified
627+ return PSConsoleReadLine . UseViInsertModeTables ( ) ;
628+ else if ( ViMode == ViMode . Command )
629+ return PSConsoleReadLine . UseViCommandModeTables ( ) ;
630+ else
631+ System . Diagnostics . Debug . Fail ( "unexpected ViMode" ) ;
632+ }
633+
634+ return null ;
635+ }
636+ }
637+
638+ [ Cmdlet ( "Set" , "PSReadlineKeyHandler" , HelpUri = "http://go.microsoft.com/fwlink/?LinkId=528810" ) ]
639+ public class SetPSReadlineKeyHandlerCommand : ChangePSReadlineKeyHandlerCommand , IDynamicParameters
640+ {
602641 [ Parameter ( Position = 1 , Mandatory = true , ParameterSetName = "ScriptBlock" ) ]
603642 [ ValidateNotNull ]
604643 public ScriptBlock ScriptBlock { get ; set ; }
@@ -616,18 +655,21 @@ public class SetPSReadlineKeyHandlerCommand : PSCmdlet, IDynamicParameters
616655 [ ExcludeFromCodeCoverage ]
617656 protected override void EndProcessing ( )
618657 {
619- if ( ParameterSetName . Equals ( FunctionParameterSet ) )
620- {
621- var function = ( string ) _dynamicParameters . Value [ FunctionParameter ] . Value ;
622- var keyHandler = ( Action < ConsoleKeyInfo ? , object > )
623- Delegate . CreateDelegate ( typeof ( Action < ConsoleKeyInfo ? , object > ) ,
624- typeof ( PSConsoleReadLine ) . GetMethod ( function ) ) ;
625- BriefDescription = function ;
626- PSConsoleReadLine . SetKeyHandler ( Chord , keyHandler , BriefDescription , Description ) ;
627- }
628- else
658+ using ( UseRequestedDispatchTables ( ) )
629659 {
630- PSConsoleReadLine . SetKeyHandler ( Chord , ScriptBlock , BriefDescription , Description ) ;
660+ if ( ParameterSetName . Equals ( FunctionParameterSet ) )
661+ {
662+ var function = ( string ) _dynamicParameters . Value [ FunctionParameter ] . Value ;
663+ var keyHandler = ( Action < ConsoleKeyInfo ? , object > )
664+ Delegate . CreateDelegate ( typeof ( Action < ConsoleKeyInfo ? , object > ) ,
665+ typeof ( PSConsoleReadLine ) . GetMethod ( function ) ) ;
666+ BriefDescription = function ;
667+ PSConsoleReadLine . SetKeyHandler ( Chord , keyHandler , BriefDescription , Description ) ;
668+ }
669+ else
670+ {
671+ PSConsoleReadLine . SetKeyHandler ( Chord , ScriptBlock , BriefDescription , Description ) ;
672+ }
631673 }
632674 }
633675
@@ -713,18 +755,15 @@ protected override void EndProcessing()
713755 }
714756
715757 [ Cmdlet ( "Remove" , "PSReadlineKeyHandler" , HelpUri = "http://go.microsoft.com/fwlink/?LinkId=528809" ) ]
716- public class RemoveKeyHandlerCommand : PSCmdlet
758+ public class RemoveKeyHandlerCommand : ChangePSReadlineKeyHandlerCommand
717759 {
718- [ Parameter ( Position = 0 , Mandatory = true ) ]
719- [ Alias ( "Key" ) ]
720- [ ValidateNotNullOrEmpty ]
721- [ SuppressMessage ( "Microsoft.Performance" , "CA1819:PropertiesShouldNotReturnArrays" ) ]
722- public string [ ] Chord { get ; set ; }
723-
724760 [ ExcludeFromCodeCoverage ]
725761 protected override void EndProcessing ( )
726762 {
727- PSConsoleReadLine . RemoveKeyHandler ( Chord ) ;
763+ using ( UseRequestedDispatchTables ( ) )
764+ {
765+ PSConsoleReadLine . RemoveKeyHandler ( Chord ) ;
766+ }
728767 }
729768 }
730769
0 commit comments