Skip to content

Commit a65d662

Browse files
authored
Re-generate keyboard shortcuts from code. (#552)
Also updates the generating script to show usage, use built Grist code, and process shortcuts so as to match the preferred Help Center output (e.g. Del -> Delete).
1 parent c8f88e5 commit a65d662

File tree

2 files changed

+47
-12
lines changed

2 files changed

+47
-12
lines changed

build-shortcuts.js

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ const KEY_MAP_MAC = {
2626
Right: '→',
2727
Up: '↑',
2828
Down: '↓',
29+
Del: 'Delete',
30+
// For the shortcuts in use, it's more helpful not to distinguish Backspace from Delete on Mac
31+
Backspace: 'Delete',
2932
};
3033

3134
const KEY_MAP_WIN = {
@@ -34,6 +37,7 @@ const KEY_MAP_WIN = {
3437
Right: '→',
3538
Up: '↑',
3639
Down: '↓',
40+
Del: 'Delete',
3741
};
3842

3943
function getHumanKey(key, isMac) {
@@ -48,6 +52,14 @@ function getHumanKey(key, isMac) {
4852
return keys.join(isMac ? ' ' : ' + ');
4953
}
5054

55+
function unique(strings) {
56+
return [...new Set(strings)];
57+
}
58+
59+
function getMarkupForKeys(keys, isMac) {
60+
return unique(keys.map((key) => `<code class="keys">${getHumanKey(key, isMac)}</code>`)).join(',');
61+
}
62+
5163
function dumpKeys(groups) {
5264

5365
let content = '';
@@ -58,8 +70,8 @@ function dumpKeys(groups) {
5870
let tableContent = '';
5971
group.commands.forEach((cmd) => {
6072
if (!cmd.keys || !cmd.keys.length || !cmd.desc) { return; }
61-
const macHumanKeys = cmd.keys.map((key) => `<code class="keys">${getHumanKey(key, true)}</code>`).join(',');
62-
const winHumanKeys = cmd.keys.map((key) => `<code class="keys">${getHumanKey(key, false)}</code>`).join(',');
73+
const macHumanKeys = getMarkupForKeys(cmd.keys, true);
74+
const winHumanKeys = getMarkupForKeys(cmd.keys, false);
6375
tableContent += `| ${macHumanKeys} | ${winHumanKeys} | ${cmd.desc} |\n`;
6476
});
6577

@@ -80,6 +92,22 @@ function dumpKeys(groups) {
8092

8193
function main() {
8294
const argv = process.argv.slice(2);
95+
if (process.argv.length <= 2) {
96+
console.log(`\
97+
Builds the keyboard shortcuts help page.
98+
99+
node build-shortcuts.js [-i] grist-root
100+
101+
Reads the grist shortcuts from the grist source tree specified by \`grist-root\` and generates a
102+
formatted content, which is then inserted into the target file (\`help/en/docs/keyboard-shortcuts.md\`)
103+
in-between the two markers \`<!-- START -->\` and \`<!-- END -->\`. Logs the resulting page to
104+
standard output, or save to the target file if \`-i\` (the edit in place option) is passed.
105+
106+
What's actually looked up is '<grist-root>/_build/core/app/client/components/commandList', i.e.
107+
Grist should be built in that directory.
108+
`);
109+
process.exit(1);
110+
}
83111
let i = 0;
84112
let editInPlace = false;
85113
let gristAppRoot;
@@ -97,7 +125,7 @@ function main() {
97125
}
98126

99127
// loads commands from grist app source tree.
100-
const {groups} = require(path.join(gristAppRoot, 'app/client/components/commandList'));
128+
const {groups} = require(path.join(gristAppRoot, '_build/core/app/client/components/commandList'));
101129

102130
let content = '';
103131
content += dumpKeys(groups);

help/en/docs/keyboard-shortcuts.md

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ title: Keyboard shortcuts
44

55
# Grist Shortcuts
66

7+
<!-- The content below is generated from Grist code using ./build-shortcuts.js. -->
78
<!-- START -->
89
###General
910
| Key (Mac) | Key (Windows) | Description |
@@ -32,9 +33,10 @@ title: Keyboard shortcuts
3233
| <code class="keys">*End*</code> | <code class="keys">*End*</code> | Move to the last field or the end of a row |
3334
| <code class="keys">** **</code> | <code class="keys">*Alt* + **</code> | Open next page |
3435
| <code class="keys">** **</code> | <code class="keys">*Alt* + **</code> | Open previous page |
35-
| <code class="keys">** *O*</code> | <code class="keys">*Ctrl* + *O*</code> | Activate next page widget |
36-
| <code class="keys">** ** *O*</code> | <code class="keys">*Ctrl* + *Shift* + *O*</code> | Activate previous page widget |
37-
| <code class="keys">*Space*</code> | <code class="keys">*Space*</code> | Opens a record card in a table widget |
36+
| <code class="keys">** *O*</code> | <code class="keys">*Ctrl* + *O*</code> | Focus next page panel or widget |
37+
| <code class="keys">** ** *O*</code> | <code class="keys">*Ctrl* + *Shift* + *O*</code> | Focus previous page panel or widget |
38+
| <code class="keys">** ** *O*</code> | <code class="keys">*Ctrl* + *Alt* + *O*</code> | Toggle creator panel keyboard focus |
39+
| <code class="keys">*Space*</code> | <code class="keys">*Space*</code> | Show the record card widget of the selected record |
3840

3941
###Selection
4042
| Key (Mac) | Key (Windows) | Description |
@@ -43,25 +45,29 @@ title: Keyboard shortcuts
4345
| <code class="keys">** **</code> | <code class="keys">*Shift* + **</code> | Adds the element above the cursor to the selected range |
4446
| <code class="keys">** **</code> | <code class="keys">*Shift* + **</code> | Adds the element to the right of the cursor to the selected range |
4547
| <code class="keys">** **</code> | <code class="keys">*Shift* + **</code> | Adds the element to the left of the cursor to the selected range |
48+
| <code class="keys">** ** **</code> | <code class="keys">*Ctrl* + *Shift* + **</code> | Adds all elements below the cursor to the selected range |
49+
| <code class="keys">** ** **</code> | <code class="keys">*Ctrl* + *Shift* + **</code> | Adds all elements above the cursor to the selected range |
50+
| <code class="keys">** ** **</code> | <code class="keys">*Ctrl* + *Shift* + **</code> | Adds all elements to the right of the cursor to the selected range |
51+
| <code class="keys">** ** **</code> | <code class="keys">*Ctrl* + *Shift* + **</code> | Adds all elements to the left of the cursor to the selected range |
4652
| <code class="keys">** *A*</code> | <code class="keys">*Ctrl* + *A*</code> | Selects all currently displayed cells |
47-
| <code class="keys">** *Shift* **</code> | <code class="keys">*Ctrl* + *Shift* + **</code> | Selects cells above the selected cell in the same column |
48-
| <code class="keys">** *Shift* **</code> | <code class="keys">*Ctrl* + *Shift* + **</code> | Selects cells below the selected cell in the same column |
49-
| <code class="keys">** *Shift* **</code> | <code class="keys">*Ctrl* + *Shift* + **</code> | Selects cells to the right of the selected cell in the same row |
50-
| <code class="keys">** *Shift* **</code> | <code class="keys">*Ctrl* + *Shift* + **</code> | Selects cells to the left of the selected cell in the same row |
5153
| <code class="keys">** ** *A*</code> | <code class="keys">*Ctrl* + *Shift* + *A*</code> | Copy anchor link |
5254

5355
###Editing
5456
| Key (Mac) | Key (Windows) | Description |
5557
| - | - | - |
5658
| <code class="keys">*Enter*</code>,<code class="keys">*F2*</code> | <code class="keys">*Enter*</code>,<code class="keys">*F2*</code> | Start editing the currently-selected cell |
5759
| <code class="keys">*Enter*</code> | <code class="keys">*Enter*</code> | Finish editing a cell, saving the value |
60+
| <code class="keys">*Enter*</code> | <code class="keys">*Enter*</code> | Toggle the currently selected checkbox or switch cell |
5861
| <code class="keys">*Escape*</code> | <code class="keys">*Escape*</code> | Discard changes to a cell value |
62+
| <code class="keys">** *C*</code> | <code class="keys">*Ctrl* + *C*</code> | Copy current selection to clipboard |
63+
| <code class="keys">** *X*</code> | <code class="keys">*Ctrl* + *X*</code> | Cut current selection to clipboard |
64+
| <code class="keys">** *V*</code> | <code class="keys">*Ctrl* + *V*</code> | Paste clipboard contents at cursor |
5965
| <code class="keys">** *D*</code> | <code class="keys">*Ctrl* + *D*</code> | Fills current selection with the contents of the top row in the selection |
6066
| <code class="keys">*Delete*</code> | <code class="keys">*Backspace*</code>,<code class="keys">*Delete*</code> | Clears the currently selected cells |
61-
| <code class="keys">*Enter*</code> | <code class="keys">*Enter*</code> | Toggles the value of checkbox cells |
6267
| <code class="keys">*=*</code> | <code class="keys">*=*</code> | When typed at the start of a cell, make this a formula column |
6368
| <code class="keys">** *;*</code> | <code class="keys">*Ctrl* + *;*</code> | Insert the current date |
6469
| <code class="keys">** ** *;*</code> | <code class="keys">*Ctrl* + *Shift* + *;*</code> | Insert the current date and time |
70+
| <code class="keys">** ** *M*</code> | <code class="keys">*Ctrl* + *Alt* + *M*</code> | Open comment thread |
6571

6672
###Data manipulation
6773
| Key (Mac) | Key (Windows) | Description |
@@ -72,8 +78,9 @@ title: Keyboard shortcuts
7278
| <code class="keys">** *Delete*</code> | <code class="keys">*Ctrl* + *Backspace*</code>,<code class="keys">*Ctrl* + *Delete*</code> | Delete the currently selected record(s) |
7379
| <code class="keys">** ** *=*</code> | <code class="keys">*Alt* + *Shift* + *=*</code> | Insert a new column, before the currently selected one |
7480
| <code class="keys">** *=*</code> | <code class="keys">*Alt* + *=*</code> | Insert a new column, after the currently selected one |
81+
| <code class="keys">** ** *H*</code> | <code class="keys">*Ctrl* + *Shift* + *H*</code> | Use the currently selected row as table headers |
7582
| <code class="keys">** *M*</code> | <code class="keys">*Ctrl* + *M*</code> | Rename the currently selected column |
76-
| <code class="keys">** ** *-*</code> | <code class="keys">*Alt* + *Shift* + *-*</code> | Hide the currently selected column |
83+
| <code class="keys">** ** *-*</code> | <code class="keys">*Alt* + *Shift* + *-*</code> | Hide the currently selected columns |
7784
| <code class="keys">** *-*</code> | <code class="keys">*Alt* + *-*</code> | Delete the currently selected columns |
7885

7986
<!-- END -->

0 commit comments

Comments
 (0)