From 0182d98e2cc781ca55f8460adf8d5c1b42f75a6e Mon Sep 17 00:00:00 2001 From: Maksim Vorobiev Date: Tue, 13 Jun 2017 11:59:51 +0300 Subject: [PATCH] Multi-adornment support Use multi-character adornments when ran out of single-character --- .../EasyMotionAdornmentController.cs | 35 +++++++++++++++++-- .../KeyProcessing/EasyMotionKeyProcessor.cs | 6 +++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/EasyMotion/Implementation/Adornment/EasyMotionAdornmentController.cs b/EasyMotion/Implementation/Adornment/EasyMotionAdornmentController.cs index 4a786a2..53c5c8f 100644 --- a/EasyMotion/Implementation/Adornment/EasyMotionAdornmentController.cs +++ b/EasyMotion/Implementation/Adornment/EasyMotionAdornmentController.cs @@ -15,8 +15,26 @@ namespace EasyMotion.Implementation.Adornment { internal sealed class EasyMotionAdornmentController : IEasyMotionNavigator { - private static readonly string[] NavigationKeys = - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + private static string[] GenerateNavigationMultiKeys() + { + const string alphabet = "abcdefghijklmnopqrstuvwxyz"; + string[] s = new string[alphabet.Length * alphabet.Length]; + int k = 0; + for (int i = 0; i < alphabet.Length; i++) + { + for (int j = 0; j < alphabet.Length; j++) + { + char[] letters = { alphabet[i], alphabet[j] }; + s[k] = new string(letters); + k++; + } + } + return s; + } + + private static readonly string[] NavigationMultiKeys = GenerateNavigationMultiKeys(); + private static readonly string[] NavigationSingleKeys = + "abcdefghijklmnopqrstuvwxyz" .Select(x => x.ToString()) .ToArray(); @@ -102,6 +120,19 @@ private void AddAdornments() var endPoint = textViewLines.LastVisibleLine.End; var snapshot = startPoint.Snapshot; int navigateIndex = 0; + + for (int i = startPoint.Position; i < endPoint.Position; i++) + { + var point = new SnapshotPoint(snapshot, i); + if (Char.ToLower(point.GetChar()) == Char.ToLower(_easyMotionUtil.TargetChar)) + { + navigateIndex++; + } + } + + string[] NavigationKeys = navigateIndex < NavigationSingleKeys.Length ? NavigationSingleKeys : NavigationMultiKeys; + navigateIndex = 0; + for (int i = startPoint.Position; i < endPoint.Position; i++) { var point = new SnapshotPoint(snapshot, i); diff --git a/EasyMotion/Implementation/KeyProcessing/EasyMotionKeyProcessor.cs b/EasyMotion/Implementation/KeyProcessing/EasyMotionKeyProcessor.cs index 6ed3f4f..2e5fec6 100644 --- a/EasyMotion/Implementation/KeyProcessing/EasyMotionKeyProcessor.cs +++ b/EasyMotion/Implementation/KeyProcessing/EasyMotionKeyProcessor.cs @@ -14,6 +14,7 @@ internal sealed class EasyMotionKeyProcessor : KeyProcessor { private readonly IEasyMotionUtil _easyMotionUtil; private readonly IEasyMotionNavigator _easyMotionNavigator; + private System.Text.StringBuilder _easyMotionLettersAccumulator = new System.Text.StringBuilder(); internal EasyMotionKeyProcessor(IEasyMotionUtil easyMotionUtil, IEasyMotionNavigator easyMotionNavigator) { @@ -49,6 +50,7 @@ public override void KeyUp(KeyEventArgs args) if (args.Key == Key.Escape && _easyMotionUtil.State != EasyMotionState.Disabled) { + //_userInput = string.Empty; _easyMotionUtil.ChangeToDisabled(); } } @@ -58,6 +60,7 @@ private void TextInputLookingForChar(TextCompositionEventArgs args) if (args.Text.Length == 1) { _easyMotionUtil.ChangeToLookingForDecision(args.Text[0]); + _easyMotionLettersAccumulator.Clear(); args.Handled = true; } } @@ -66,7 +69,8 @@ private void TextInputLookingForDecision(TextCompositionEventArgs args) { if (args.Text.Length > 0) { - if (_easyMotionNavigator.NavigateTo(args.Text)) + _easyMotionLettersAccumulator.Append(args.Text); + if (_easyMotionNavigator.NavigateTo(_easyMotionLettersAccumulator.ToString())) { _easyMotionUtil.ChangeToDisabled(); }