Skip to content

Commit a5082c0

Browse files
authored
fix(@inquirer/core): Remove vim/emacs easter eggs conflicting with type-to-search. Fix #1819 (#1822)
1 parent 82bcbac commit a5082c0

File tree

6 files changed

+29
-32
lines changed

6 files changed

+29
-32
lines changed

packages/confirm/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
useState,
44
useKeypress,
55
isEnterKey,
6+
isTabKey,
67
usePrefix,
78
makeTheme,
89
type Theme,
@@ -43,7 +44,7 @@ export default createPrompt<boolean, ConfirmConfig>((config, done) => {
4344
setValue(transformer(answer));
4445
setStatus('done');
4546
done(answer);
46-
} else if (key.name === 'tab') {
47+
} else if (isTabKey(key)) {
4748
const answer = boolToString(!getBooleanValue(value, config.default));
4849
rl.clearLine(0); // Remove the tab character.
4950
rl.write(answer);

packages/core/src/lib/key.ts

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,16 @@ export type KeypressEvent = {
33
ctrl: boolean;
44
};
55

6-
export const isUpKey = (key: KeypressEvent): boolean =>
7-
// The up key
8-
key.name === 'up' ||
9-
// Vim keybinding
10-
key.name === 'k' ||
11-
// Emacs keybinding
12-
(key.ctrl && key.name === 'p');
6+
export const isUpKey = (key: KeypressEvent): boolean => key.name === 'up';
137

14-
export const isDownKey = (key: KeypressEvent): boolean =>
15-
// The down key
16-
key.name === 'down' ||
17-
// Vim keybinding
18-
key.name === 'j' ||
19-
// Emacs keybinding
20-
(key.ctrl && key.name === 'n');
8+
export const isDownKey = (key: KeypressEvent): boolean => key.name === 'down';
219

2210
export const isSpaceKey = (key: KeypressEvent): boolean => key.name === 'space';
2311

2412
export const isBackspaceKey = (key: KeypressEvent): boolean => key.name === 'backspace';
2513

14+
export const isTabKey = (key: KeypressEvent): boolean => key.name === 'tab';
15+
2616
export const isNumberKey = (key: KeypressEvent): boolean =>
2717
'1234567890'.includes(key.name);
2818

packages/input/src/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import {
44
useKeypress,
55
useEffect,
66
usePrefix,
7-
isEnterKey,
87
isBackspaceKey,
8+
isEnterKey,
9+
isTabKey,
910
makeTheme,
1011
type Theme,
1112
type Status,
@@ -69,7 +70,7 @@ export default createPrompt<string, InputConfig>((config, done) => {
6970
}
7071
} else if (isBackspaceKey(key) && !value) {
7172
setDefaultValue(undefined);
72-
} else if (key.name === 'tab' && !value) {
73+
} else if (isTabKey(key) && !value) {
7374
setDefaultValue(undefined);
7475
rl.clearLine(0); // Remove the tab character.
7576
rl.write(defaultValue);

packages/number/src/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import {
33
useState,
44
useKeypress,
55
usePrefix,
6-
isEnterKey,
76
isBackspaceKey,
7+
isEnterKey,
8+
isTabKey,
89
makeTheme,
910
type Theme,
1011
type Status,
@@ -113,7 +114,7 @@ export default createPrompt(
113114
}
114115
} else if (isBackspaceKey(key) && !value) {
115116
setDefaultValue(undefined);
116-
} else if (key.name === 'tab' && !value) {
117+
} else if (isTabKey(key) && !value) {
117118
setDefaultValue(undefined);
118119
rl.clearLine(0); // Remove the tab character.
119120
rl.write(defaultValue);

packages/rawlist/src/index.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import {
44
useState,
55
useKeypress,
66
usePrefix,
7+
isDownKey,
78
isEnterKey,
9+
isUpKey,
810
Separator,
911
makeTheme,
1012
type Theme,
@@ -131,22 +133,21 @@ export default createPrompt(
131133
} else {
132134
setError(`"${colors.red(value)}" isn't an available option`);
133135
}
134-
} else if (key.name === 'up' || key.name === 'down') {
136+
} else if (isUpKey(key) || isDownKey(key)) {
135137
rl.clearLine(0);
136138

137139
const [selectedChoice, active] = getSelectedChoice(value, choices);
138140
if (!selectedChoice) {
139-
const firstChoice =
140-
key.name === 'down'
141-
? choices.find(isSelectableChoice)!
142-
: choices.findLast(isSelectableChoice)!;
141+
const firstChoice = isDownKey(key)
142+
? choices.find(isSelectableChoice)!
143+
: choices.findLast(isSelectableChoice)!;
143144
setValue(firstChoice.key);
144145
} else if (
145146
loop ||
146-
(key.name === 'up' && active !== bounds.first) ||
147-
(key.name === 'down' && active !== bounds.last)
147+
(isUpKey(key) && active !== bounds.first) ||
148+
(isDownKey(key) && active !== bounds.last)
148149
) {
149-
const offset = key.name === 'up' ? -1 : 1;
150+
const offset = isUpKey(key) ? -1 : 1;
150151
let next = active;
151152
do {
152153
next = (next + offset + choices.length) % choices.length;

packages/search/src/index.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import {
77
useRef,
88
useEffect,
99
useMemo,
10+
isDownKey,
1011
isEnterKey,
12+
isTabKey,
13+
isUpKey,
1114
Separator,
1215
makeTheme,
1316
type Theme,
@@ -195,17 +198,17 @@ export default createPrompt(
195198
// get cleared, forcing the user to re-enter the value instead of fixing it.
196199
rl.write(searchTerm);
197200
}
198-
} else if (key.name === 'tab' && selectedChoice) {
201+
} else if (isTabKey(key) && selectedChoice) {
199202
rl.clearLine(0); // Remove the tab character.
200203
rl.write(selectedChoice.name);
201204
setSearchTerm(selectedChoice.name);
202-
} else if (status !== 'loading' && (key.name === 'up' || key.name === 'down')) {
205+
} else if (status !== 'loading' && (isUpKey(key) || isDownKey(key))) {
203206
rl.clearLine(0);
204207
if (
205-
(key.name === 'up' && active !== bounds.first) ||
206-
(key.name === 'down' && active !== bounds.last)
208+
(isUpKey(key) && active !== bounds.first) ||
209+
(isDownKey(key) && active !== bounds.last)
207210
) {
208-
const offset = key.name === 'up' ? -1 : 1;
211+
const offset = isUpKey(key) ? -1 : 1;
209212
let next = active;
210213
do {
211214
next = (next + offset + searchResults.length) % searchResults.length;

0 commit comments

Comments
 (0)