From 5b5889dcf765f7f5725217f362e9d19713a51f04 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 19 Jan 2023 22:48:46 +0200 Subject: [PATCH] feature: client: user-menu: navigate: add support of \D + [JK] to speed up vim navigation --- client/modules/user-menu/navigate.js | 47 +++++++++---- client/modules/user-menu/navigate.spec.js | 84 +++++++++++++++++++---- 2 files changed, 105 insertions(+), 26 deletions(-) diff --git a/client/modules/user-menu/navigate.js b/client/modules/user-menu/navigate.js index 67c12e0a..eaaac9dc 100644 --- a/client/modules/user-menu/navigate.js +++ b/client/modules/user-menu/navigate.js @@ -1,5 +1,7 @@ 'use strict'; +const fullstore = require('fullstore'); + const { J, K, @@ -7,29 +9,50 @@ const { DOWN, } = require('../../key/key.js'); -module.exports = (el, {keyCode}) => { - if (keyCode === DOWN || keyCode === J) - return down(el); - - if (keyCode === UP || keyCode === K) - return up(el); +const store = fullstore(1); +const isDigit = (a) => /^\d+$/.test(a); + +module.exports = (el, {key, keyCode}) => { + if (isDigit(key)) { + store(Number(key)); + } + + if (keyCode === DOWN || keyCode === J) { + const count = store(); + store(1); + + return down(el, count); + } + + if (keyCode === UP || keyCode === K) { + const count = store(); + store(1); + + return up(el, count); + } }; -function down(el) { +function down(el, count) { const {length} = el; - + if (el.selectedIndex === length - 1) el.selectedIndex = 0; else - ++el.selectedIndex; + el.selectedIndex += count; + + if (el.selectedIndex < 0) + el.selectedIndex = length - 1; } -function up(el) { +function up(el, count) { const {length} = el; - + if (!el.selectedIndex) el.selectedIndex = length - 1; else - --el.selectedIndex; + el.selectedIndex -= count; + + if (el.selectedIndex < 0) + el.selectedIndex = 0; } diff --git a/client/modules/user-menu/navigate.spec.js b/client/modules/user-menu/navigate.spec.js index 7a5ba70b..28ebb73d 100644 --- a/client/modules/user-menu/navigate.spec.js +++ b/client/modules/user-menu/navigate.spec.js @@ -15,11 +15,11 @@ test('cloudcmd: user-menu: navigate: DOWN', (t) => { length: 3, selectedIndex: 0, }; - + navigate(el, { keyCode: DOWN, }); - + t.equal(el.selectedIndex, 1); t.end(); }); @@ -29,11 +29,11 @@ test('cloudcmd: user-menu: navigate: J', (t) => { length: 3, selectedIndex: 0, }; - + navigate(el, { keyCode: J, }); - + t.equal(el.selectedIndex, 1); t.end(); }); @@ -43,11 +43,11 @@ test('cloudcmd: user-menu: navigate: DOWN: bottom', (t) => { length: 3, selectedIndex: 2, }; - + navigate(el, { keyCode: DOWN, }); - + t.equal(el.selectedIndex, 0); t.end(); }); @@ -57,11 +57,11 @@ test('cloudcmd: user-menu: navigate: K', (t) => { length: 3, selectedIndex: 2, }; - + navigate(el, { keyCode: K, }); - + t.equal(el.selectedIndex, 1); t.end(); }); @@ -71,11 +71,11 @@ test('cloudcmd: user-menu: navigate: UP', (t) => { length: 3, selectedIndex: 2, }; - + navigate(el, { keyCode: UP, }); - + t.equal(el.selectedIndex, 1); t.end(); }); @@ -85,11 +85,11 @@ test('cloudcmd: user-menu: navigate: UP: top', (t) => { length: 3, selectedIndex: 0, }; - + navigate(el, { keyCode: UP, }); - + t.equal(el.selectedIndex, 2); t.end(); }); @@ -99,12 +99,68 @@ test('cloudcmd: user-menu: navigate', (t) => { length: 3, selectedIndex: 0, }; - + navigate(el, { keyCode: 0, }); - + t.equal(el.selectedIndex, 0, 'should not change'); t.end(); }); +test('cloudcmd: user-menu: navigate: DOWN: count', (t) => { + const el = { + length: 3, + selectedIndex: 0, + }; + + navigate(el, { + keyCode: 53, + key: '5', + }); + + navigate(el, { + keyCode: DOWN, + }); + + t.equal(el.selectedIndex, 5); + t.end(); +}); + +test('cloudcmd: user-menu: navigate: J: count: to big', (t) => { + const el = { + length: 3, + selectedIndex: -Infinity, + }; + + navigate(el, { + keyCode: 53, + key: '5', + }); + + navigate(el, { + keyCode: J, + }); + + t.equal(el.selectedIndex, 2); + t.end(); +}); + +test('cloudcmd: user-menu: navigate: K: count: to small', (t) => { + const el = { + length: 3, + selectedIndex: -Infinity, + }; + + navigate(el, { + keyCode: 53, + key: '5', + }); + + navigate(el, { + keyCode: K, + }); + + t.equal(el.selectedIndex, 0); + t.end(); +});