WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 1c7b0e6

Browse files
Mac: Fixes #13214: Markdown editor: Don't open links on ctrl-click (#13792)
1 parent 4589670 commit 1c7b0e6

File tree

10 files changed

+51
-7
lines changed

10 files changed

+51
-7
lines changed

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,7 @@ packages/editor/CodeMirror/editorCommands/supportsCommand.js
10281028
packages/editor/CodeMirror/extensions/biDirectionalTextExtension.js
10291029
packages/editor/CodeMirror/extensions/ctrlClickActionExtension.js
10301030
packages/editor/CodeMirror/extensions/ctrlClickCheckboxExtension.js
1031+
packages/editor/CodeMirror/extensions/editorSettingsExtension.js
10311032
packages/editor/CodeMirror/extensions/highlightActiveLineExtension.js
10321033
packages/editor/CodeMirror/extensions/keyUpHandlerExtension.js
10331034
packages/editor/CodeMirror/extensions/links/ctrlClickLinksExtension.js

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,7 @@ packages/editor/CodeMirror/editorCommands/supportsCommand.js
10001000
packages/editor/CodeMirror/extensions/biDirectionalTextExtension.js
10011001
packages/editor/CodeMirror/extensions/ctrlClickActionExtension.js
10021002
packages/editor/CodeMirror/extensions/ctrlClickCheckboxExtension.js
1003+
packages/editor/CodeMirror/extensions/editorSettingsExtension.js
10031004
packages/editor/CodeMirror/extensions/highlightActiveLineExtension.js
10041005
packages/editor/CodeMirror/extensions/keyUpHandlerExtension.js
10051006
packages/editor/CodeMirror/extensions/links/ctrlClickLinksExtension.js

packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/CodeMirror.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ const CodeMirror = (props: NoteBodyEditorProps, ref: ForwardedRef<NoteBodyEditor
366366
ignoreModifiers: true,
367367
spellcheckEnabled: Setting.value('editor.spellcheckBeta'),
368368
keymap: keyboardMode,
369+
preferMacShortcuts: shim.isMac(),
369370
indentWithTabs: true,
370371
tabMovesFocus: props.tabMovesFocus,
371372
editorLabel: _('Markdown editor'),

packages/app-mobile/components/NoteEditor/NoteEditor.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ function NoteEditor(props: Props) {
274274
highlightActiveLine,
275275

276276
keymap: EditorKeymap.Default,
277+
preferMacShortcuts: shim.mobilePlatform() === 'ios',
277278

278279
automatchBraces: false,
279280
ignoreModifiers: false,

packages/editor/CodeMirror/createEditor.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import ctrlKeyStateClassExtension from './extensions/modifierKeyCssExtension';
4040
import ctrlClickLinksExtension from './extensions/links/ctrlClickLinksExtension';
4141
import { RenderedContentContext } from './extensions/rendering/types';
4242
import ctrlClickCheckboxExtension from './extensions/ctrlClickCheckboxExtension';
43+
import editorSettingsExtension, { setEditorSettingsEffect } from './extensions/editorSettingsExtension';
4344

4445
// Newer versions of CodeMirror by default use Chrome's EditContext API.
4546
// While this might be stable enough for desktop use, it causes significant
@@ -300,6 +301,7 @@ const createEditor = (
300301
biDirectionalTextExtension,
301302
overwriteModeExtension,
302303
ctrlKeyStateClassExtension,
304+
editorSettingsExtension(settings),
303305

304306
selectedNoteIdExtension,
305307

@@ -345,9 +347,12 @@ const createEditor = (
345347
onSettingsChange: (newSettings: EditorSettings) => {
346348
settings = newSettings;
347349
editor.dispatch({
348-
effects: dynamicConfig.reconfigure(
349-
configFromSettings(newSettings, context),
350-
),
350+
effects: [
351+
dynamicConfig.reconfigure(
352+
configFromSettings(newSettings, context),
353+
),
354+
setEditorSettingsEffect.of(newSettings),
355+
],
351356
});
352357
},
353358
onUndoRedo: () => {

packages/editor/CodeMirror/extensions/ctrlClickActionExtension.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { EditorView } from '@codemirror/view';
22
import { Prec } from '@codemirror/state';
3+
import { editorSettingsFacet } from './editorSettingsExtension';
34

45
const hasMultipleCursors = (view: EditorView) => {
56
return view.state.selection.ranges.length > 1;
@@ -12,7 +13,9 @@ const ctrlClickActionExtension = (onCtrlClick: OnCtrlClick) => {
1213
Prec.high([
1314
EditorView.domEventHandlers({
1415
mousedown: (event: MouseEvent, view: EditorView) => {
15-
const hasModifier = event.ctrlKey || event.metaKey;
16+
const editorSettings = view.state.facet(editorSettingsFacet);
17+
const hasModifier = editorSettings.preferMacShortcuts ? event.metaKey : event.ctrlKey;
18+
1619
// The default CodeMirror action for ctrl-click is to add another cursor
1720
// to the document. If the user already has multiple cursors, assume that
1821
// the ctrl-click action is intended to add another.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Facet, StateEffect, StateField } from '@codemirror/state';
2+
import { EditorSettings } from '../../types';
3+
4+
export const setEditorSettingsEffect = StateEffect.define<EditorSettings>();
5+
6+
export const editorSettingsFacet = Facet.define<EditorSettings|null, EditorSettings|null>({
7+
combine: (possibleValues) => {
8+
return possibleValues.filter(value => !!value)[0] ?? null;
9+
},
10+
});
11+
12+
export default (initialSettings: EditorSettings) => [
13+
StateField.define<EditorSettings|null>({
14+
create: () => initialSettings,
15+
update: (oldValue, transaction) => {
16+
for (const e of transaction.effects) {
17+
if (e.is(setEditorSettingsEffect)) {
18+
return e.value;
19+
}
20+
}
21+
return oldValue;
22+
},
23+
provide: (field) => editorSettingsFacet.from(field),
24+
}),
25+
];

packages/editor/CodeMirror/extensions/modifierKeyCssExtension.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { StateEffect, StateField, Transaction } from '@codemirror/state';
22
import { EditorView } from '@codemirror/view';
3+
import { editorSettingsFacet } from './editorSettingsExtension';
34

5+
// On MacOS: Tracks the meta key
6+
// On other platforms: Tracks the ctrl key.
47
const ctrlOrMetaChangedEffect = StateEffect.define<boolean>();
58

69
const ctrlOrMetaPressedField = StateField.define<boolean>({
@@ -18,11 +21,13 @@ const ctrlOrMetaPressedField = StateField.define<boolean>({
1821
})),
1922
...(() => {
2023
const onEvent = (event: KeyboardEvent|MouseEvent, view: EditorView) => {
21-
const ctrlOrCmdPressed = event.ctrlKey || event.metaKey;
22-
if (ctrlOrCmdPressed !== view.state.field(ctrlOrMetaPressedField)) {
24+
const editorSettings = view.state.facet(editorSettingsFacet);
25+
const hasModifier = editorSettings.preferMacShortcuts ? event.metaKey : event.ctrlKey;
26+
27+
if (hasModifier !== view.state.field(ctrlOrMetaPressedField)) {
2328
view.dispatch({
2429
effects: [
25-
ctrlOrMetaChangedEffect.of(ctrlOrCmdPressed),
30+
ctrlOrMetaChangedEffect.of(hasModifier),
2631
],
2732
});
2833
}

packages/editor/testing/createEditorSettings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const createEditorSettings = (themeId: number) => {
1717
highlightActiveLine: false,
1818

1919
keymap: EditorKeymap.Default,
20+
preferMacShortcuts: false,
2021
language: EditorLanguageType.Markdown,
2122
themeData,
2223

packages/editor/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ export interface EditorSettings {
180180
language: EditorLanguageType;
181181

182182
keymap: EditorKeymap;
183+
preferMacShortcuts: boolean;
183184
tabMovesFocus: boolean;
184185

185186
markdownMarkEnabled: boolean;

0 commit comments

Comments
 (0)