test('delete with option (Mac) or control (Win) key deletes full word', (assert) => { assert.expect(1); if (!Browser.isMac() && !Browser.isWin()) { assert.ok(true, 'SKIP on non-mac non-win'); return; } let done = assert.async(); let { post } = Helpers.postAbstract.buildFromText("abc def"); let { post: expected } = Helpers.postAbstract.buildFromText("abc "); editor = Helpers.mobiledoc.renderPostInto(editorElement, post); editor.selectRange(new Range(editor.post.tailPosition())); let altKey, ctrlKey; if (Browser.isMac()) { /* Mac key codes for navigation by word */ altKey = true; ctrlKey = false; } else { /* PC key codes for navigation by word */ altKey = false; ctrlKey = true; } Helpers.wait(() => { Helpers.dom.triggerDelete(editor, DIRECTION.BACKWARD, {altKey, ctrlKey}); Helpers.wait(() => { assert.postIsSimilar(editor.post, expected); done(); }); }); });
keydown(event) { let { editor } = this; if (!editor.hasCursor()) { return; } if (!editor.isEditable) { return; } let key = Key.fromEvent(event); this._updateModifiersFromKey(key, {isDown:true}); if (editor.handleKeyCommand(event)) { return; } if (editor.post.isBlank) { editor._insertEmptyMarkupSectionAtCursor(); } let range = editor.range; switch(true) { // FIXME This should be restricted to only card/atom boundaries case key.isHorizontalArrowWithoutModifiersOtherThanShift(): let newRange; if (key.isShift()) { newRange = range.extend(key.direction * 1); } else { newRange = range.move(key.direction); } editor.selectRange(newRange); event.preventDefault(); break; case key.isDelete(): let { direction } = key; let unit = 'char'; if (this.modifierKeys.alt && Browser.isMac()) { unit = 'word'; } else if (this.modifierKeys.ctrl && Browser.isWin()) { unit = 'word'; } editor.performDelete({direction, unit}); event.preventDefault(); break; case key.isEnter(): editor.handleNewline(event); break; case key.isTab(): // Handle tab here because it does not fire a `keypress` event event.preventDefault(); this._textInputHandler.handle(key.toString()); break; } }
precondition: () => Browser.isWin(),
}, { // CMD+ENTER is our keyboard shortcut for putting a selected card into edit mode str: 'META+ENTER', run(editor, koenig) { if (koenig.selectedCard) { koenig.editCard(koenig.selectedCard); return; } return false; } }, { // CTRL+ENTER is our keyboard shortcut for putting a selected card into edit mode str: 'CTRL+ENTER', run(editor, koenig) { if (Browser.isWin() && koenig.selectedCard) { koenig.editCard(koenig.selectedCard); return; } return false; } }, { str: 'SHIFT+ENTER', run(editor) { if (!editor.range.headSection.isMarkerable) { return; } editor.run((postEditor) => { let softReturn = postEditor.builder.createAtom('soft-return');