This commit is contained in:
Vanessa 2023-11-12 12:28:20 +08:00
parent 2c71478d83
commit 4f263b31cc
19 changed files with 110 additions and 88 deletions

View file

@ -1,4 +1,4 @@
import {isCtrl, isMac, updateHotkeyTip, writeText} from "../../protyle/util/compatibility"; import {isMac, isNotCtrl, isOnlyMeta, updateHotkeyTip, writeText} from "../../protyle/util/compatibility";
import {matchHotKey} from "../../protyle/util/hotKey"; import {matchHotKey} from "../../protyle/util/hotKey";
import {openSearch} from "../../search/spread"; import {openSearch} from "../../search/spread";
import { import {
@ -439,7 +439,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
const liElements = Array.from(files.element.querySelectorAll(".b3-list-item--focus")); const liElements = Array.from(files.element.querySelectorAll(".b3-list-item--focus"));
if (liElements.length === 0) { if (liElements.length === 0) {
if (event.key.startsWith("Arrow") && !isCtrl(event)) { if (event.key.startsWith("Arrow") && isNotCtrl(event)) {
const liElement = files.element.querySelector(".b3-list-item"); const liElement = files.element.querySelector(".b3-list-item");
if (liElement) { if (liElement) {
liElement.classList.add("b3-list-item--focus"); liElement.classList.add("b3-list-item--focus");
@ -572,7 +572,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
} }
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") && if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
(event.code.startsWith("Arrow") || event.code === "Enter") && (event.code.startsWith("Arrow") || event.code === "Enter") &&
!event.altKey && !event.shiftKey && !isCtrl(event)) { !event.altKey && !event.shiftKey && isNotCtrl(event)) {
event.preventDefault(); event.preventDefault();
return true; return true;
} }
@ -629,7 +629,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
} }
} }
return; return;
} else if (!isCtrl(event)) { } else if (isNotCtrl(event)) {
files.element.querySelector('[select-end="true"]')?.removeAttribute("select-end"); files.element.querySelector('[select-end="true"]')?.removeAttribute("select-end");
files.element.querySelector('[select-start="true"]')?.removeAttribute("select-start"); files.element.querySelector('[select-start="true"]')?.removeAttribute("select-start");
if ((event.key === "ArrowRight" && !liElements[0].querySelector(".b3-list-item__arrow--open") && !liElements[0].querySelector(".b3-list-item__toggle").classList.contains("fn__hidden")) || if ((event.key === "ArrowRight" && !liElements[0].querySelector(".b3-list-item__arrow--open") && !liElements[0].querySelector(".b3-list-item__toggle").classList.contains("fn__hidden")) ||
@ -957,7 +957,7 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
return; return;
} }
const target = event.target as HTMLElement; const target = event.target as HTMLElement;
if (!event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey && if (isNotCtrl(event) && !event.shiftKey && !event.altKey &&
!["INPUT", "TEXTAREA"].includes(target.tagName) && !["INPUT", "TEXTAREA"].includes(target.tagName) &&
["0", "1", "2", "3", "4", "j", "k", "l", ";", "s", " ", "p"].includes(event.key.toLowerCase())) { ["0", "1", "2", "3", "4", "j", "k", "l", ";", "s", " ", "p"].includes(event.key.toLowerCase())) {
let cardElement: Element; let cardElement: Element;
@ -978,15 +978,15 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
} }
// 仅处理以下快捷键操作 // 仅处理以下快捷键操作
if (!event.ctrlKey && !isCtrl(event) && event.key !== "Escape" && !event.shiftKey && !event.altKey && if (isNotCtrl(event) && event.key !== "Escape" && !event.shiftKey && !event.altKey &&
Constants.KEYCODELIST[event.keyCode] !== "PageUp" && Constants.KEYCODELIST[event.keyCode] !== "PageUp" &&
Constants.KEYCODELIST[event.keyCode] !== "PageDown" && Constants.KEYCODELIST[event.keyCode] !== "PageDown" &&
!/^F\d{1,2}$/.test(event.key) && event.key.indexOf("Arrow") === -1 && event.key !== "Enter" && event.key !== "Backspace" && event.key !== "Delete") { !/^F\d{1,2}$/.test(event.key) && event.key.indexOf("Arrow") === -1 && event.key !== "Enter" && event.key !== "Backspace" && event.key !== "Delete") {
return; return;
} }
if (!event.altKey && !event.shiftKey && isCtrl(event)) { if (!event.altKey && !event.shiftKey && isOnlyMeta(event)) {
if (event.key === "Meta" || event.key === "Control" || event.ctrlKey || event.metaKey) { if ((isMac() ? event.key === "Meta" : event.key === "Control") || isOnlyMeta(event)) {
window.siyuan.ctrlIsPressed = true; window.siyuan.ctrlIsPressed = true;
if ((event.key === "Meta" || event.key === "Control") && if ((event.key === "Meta" || event.key === "Control") &&
window.siyuan.config.editor.floatWindowMode === 1 && !event.repeat) { window.siyuan.config.editor.floatWindowMode === 1 && !event.repeat) {
@ -997,7 +997,7 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
} }
} }
if (!event.altKey && event.shiftKey && !isCtrl(event)) { if (!event.altKey && event.shiftKey && isNotCtrl(event)) {
if (event.key === "Shift") { if (event.key === "Shift") {
window.siyuan.shiftIsPressed = true; window.siyuan.shiftIsPressed = true;
if (!event.repeat) { if (!event.repeat) {
@ -1008,7 +1008,7 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
} }
} }
if (event.altKey && !event.shiftKey && !isCtrl(event)) { if (event.altKey && !event.shiftKey && isNotCtrl(event)) {
if (event.key === "Alt") { if (event.key === "Alt") {
window.siyuan.altIsPressed = true; window.siyuan.altIsPressed = true;
} else { } else {
@ -1016,6 +1016,7 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
} }
} }
// mac 中只能使用 ⌃
if (switchDialog && event.ctrlKey && !event.metaKey && event.key.startsWith("Arrow")) { if (switchDialog && event.ctrlKey && !event.metaKey && event.key.startsWith("Arrow")) {
dialogArrow(app, switchDialog.element, event); dialogArrow(app, switchDialog.element, event);
return; return;
@ -1100,7 +1101,7 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
return; return;
} }
if (!event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey && if (isNotCtrl(event) && !event.shiftKey && !event.altKey &&
(event.key.startsWith("Arrow") || event.key === "Enter")) { (event.key.startsWith("Arrow") || event.key === "Enter")) {
const openRecentDocsDialog = window.siyuan.dialogs.find(item => { const openRecentDocsDialog = window.siyuan.dialogs.find(item => {
if (item.element.getAttribute("data-key") === window.siyuan.config.keymap.general.recentDocs.custom) { if (item.element.getAttribute("data-key") === window.siyuan.config.keymap.general.recentDocs.custom) {

View file

@ -1,4 +1,4 @@
import {isCtrl, isMac, updateHotkeyTip} from "../protyle/util/compatibility"; import {isMac, updateHotkeyTip} from "../protyle/util/compatibility";
import {Constants} from "../constants"; import {Constants} from "../constants";
import {hideMessage, showMessage} from "../dialog/message"; import {hideMessage, showMessage} from "../dialog/message";
import {fetchPost} from "../util/fetch"; import {fetchPost} from "../util/fetch";
@ -429,7 +429,7 @@ export const keymap = {
}, },
_getKeymapString(event: KeyboardEvent) { _getKeymapString(event: KeyboardEvent) {
let keymapStr = ""; let keymapStr = "";
if (event.ctrlKey && !event.metaKey && isMac()) { if (event.ctrlKey && isMac()) {
keymapStr += "⌃"; keymapStr += "⌃";
} }
if (event.altKey) { if (event.altKey) {
@ -438,7 +438,7 @@ export const keymap = {
if (event.shiftKey) { if (event.shiftKey) {
keymapStr += "⇧"; keymapStr += "⇧";
} }
if (isCtrl(event)) { if (event.metaKey || (!isMac() && event.ctrlKey)) {
keymapStr += "⌘"; keymapStr += "⌘";
} }
if (event.key !== "Shift" && event.key !== "Alt" && event.key !== "Meta" && event.key !== "Control" && event.key !== "Unidentified") { if (event.key !== "Shift" && event.key !== "Alt" && event.key !== "Meta" && event.key !== "Control" && event.key !== "Unidentified") {

View file

@ -120,7 +120,7 @@ export abstract class Constants {
9: "⇥", 9: "⇥",
13: "↩", 13: "↩",
16: "⇧", 16: "⇧",
17: "", 17: "",
18: "⌥", 18: "⌥",
19: "Pause", 19: "Pause",
20: "CapsLock", 20: "CapsLock",

View file

@ -3,7 +3,7 @@ import {genUUID} from "../util/genID";
import {moveResize} from "./moveResize"; import {moveResize} from "./moveResize";
/// #endif /// #endif
import {isMobile} from "../util/functions"; import {isMobile} from "../util/functions";
import {isCtrl} from "../protyle/util/compatibility"; import {isNotCtrl} from "../protyle/util/compatibility";
import {Protyle} from "../protyle"; import {Protyle} from "../protyle";
export class Dialog { export class Dialog {
@ -104,7 +104,7 @@ export class Dialog {
event.stopPropagation(); event.stopPropagation();
return; return;
} }
if (!event.shiftKey && !isCtrl(event) && event.key === "Enter" && enterEvent) { if (!event.shiftKey && isNotCtrl(event) && event.key === "Enter" && enterEvent) {
if (confirmElement) { if (confirmElement) {
confirmElement.dispatchEvent(new CustomEvent("click")); confirmElement.dispatchEvent(new CustomEvent("click"));
} else { } else {

View file

@ -14,7 +14,7 @@ import {fetchPost, fetchSyncPost} from "../../util/fetch";
import {openEmojiPanel, unicode2Emoji} from "../../emoji"; import {openEmojiPanel, unicode2Emoji} from "../../emoji";
import {mountHelp, newNotebook} from "../../util/mount"; import {mountHelp, newNotebook} from "../../util/mount";
import {confirmDialog} from "../../dialog/confirmDialog"; import {confirmDialog} from "../../dialog/confirmDialog";
import {updateHotkeyTip} from "../../protyle/util/compatibility"; import {isNotCtrl, isOnlyMeta, updateHotkeyTip} from "../../protyle/util/compatibility";
import {openFileById} from "../../editor/util"; import {openFileById} from "../../editor/util";
import {hasClosestByAttribute, hasClosestByTag, hasTopClosestByTag} from "../../protyle/util/hasClosest"; import {hasClosestByAttribute, hasClosestByTag, hasTopClosestByTag} from "../../protyle/util/hasClosest";
import {isTouchDevice} from "../../util/functions"; import {isTouchDevice} from "../../util/functions";
@ -243,7 +243,7 @@ export class Files extends Model {
if (ulElement) { if (ulElement) {
const notebookId = ulElement.getAttribute("data-url"); const notebookId = ulElement.getAttribute("data-url");
while (target && !target.isEqualNode(this.element)) { while (target && !target.isEqualNode(this.element)) {
if (!event.metaKey && !event.ctrlKey && target.classList.contains("b3-list-item__icon") && window.siyuan.config.system.container !== "ios") { if (isNotCtrl(event) && target.classList.contains("b3-list-item__icon") && window.siyuan.config.system.container !== "ios") {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
const rect = target.getBoundingClientRect(); const rect = target.getBoundingClientRect();
@ -263,14 +263,14 @@ export class Files extends Model {
}); });
} }
break; break;
} else if (!event.metaKey && !event.ctrlKey && target.classList.contains("b3-list-item__toggle")) { } else if (isNotCtrl(event) && target.classList.contains("b3-list-item__toggle")) {
this.getLeaf(target.parentElement, notebookId); this.getLeaf(target.parentElement, notebookId);
this.setCurrent(target.parentElement); this.setCurrent(target.parentElement);
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
window.siyuan.menus.menu.remove(); window.siyuan.menus.menu.remove();
break; break;
} else if (!event.metaKey && !event.ctrlKey && target.classList.contains("b3-list-item__action")) { } else if (isNotCtrl(event) && target.classList.contains("b3-list-item__action")) {
const type = target.getAttribute("data-type"); const type = target.getAttribute("data-type");
const pathString = target.parentElement.getAttribute("data-path"); const pathString = target.parentElement.getAttribute("data-path");
if (!window.siyuan.config.readonly) { if (!window.siyuan.config.readonly) {
@ -298,7 +298,7 @@ export class Files extends Model {
event.stopPropagation(); event.stopPropagation();
break; break;
} else if (target.tagName === "LI") { } else if (target.tagName === "LI") {
if ((event.metaKey || event.ctrlKey) && !event.altKey && !event.shiftKey) { if (isOnlyMeta(event) && !event.altKey && !event.shiftKey) {
target.classList.toggle("b3-list-item--focus"); target.classList.toggle("b3-list-item--focus");
} else { } else {
this.setCurrent(target, false); this.setCurrent(target, false);
@ -308,7 +308,7 @@ export class Files extends Model {
return; return;
} }
target.setAttribute("data-opening", "true"); target.setAttribute("data-opening", "true");
if (event.altKey && !event.metaKey && !event.ctrlKey && !event.shiftKey) { if (event.altKey && isNotCtrl(event) && !event.shiftKey) {
openFileById({ openFileById({
app: options.app, app: options.app,
id: target.getAttribute("data-node-id"), id: target.getAttribute("data-node-id"),
@ -318,7 +318,7 @@ export class Files extends Model {
target.removeAttribute("data-opening"); target.removeAttribute("data-opening");
} }
}); });
} else if (!event.altKey && !event.metaKey && !event.ctrlKey && event.shiftKey) { } else if (!event.altKey && isNotCtrl(event) && event.shiftKey) {
openFileById({ openFileById({
app: options.app, app: options.app,
id: target.getAttribute("data-node-id"), id: target.getAttribute("data-node-id"),
@ -329,7 +329,7 @@ export class Files extends Model {
} }
}); });
} else if (window.siyuan.config.fileTree.openFilesUseCurrentTab && } else if (window.siyuan.config.fileTree.openFilesUseCurrentTab &&
event.altKey && (event.metaKey || event.ctrlKey) && !event.shiftKey) { event.altKey && isOnlyMeta(event) && !event.shiftKey) {
openFileById({ openFileById({
app: options.app, app: options.app,
removeCurrentTab: false, removeCurrentTab: false,

View file

@ -248,7 +248,7 @@ const getActionMenu = (element: Element, next: boolean) => {
export const bindMenuKeydown = (event: KeyboardEvent) => { export const bindMenuKeydown = (event: KeyboardEvent) => {
if (window.siyuan.menus.menu.element.classList.contains("fn__none") if (window.siyuan.menus.menu.element.classList.contains("fn__none")
|| event.altKey || event.shiftKey || isCtrl(event)) { || event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {
return false; return false;
} }
const target = event.target as HTMLElement; const target = event.target as HTMLElement;

View file

@ -3,7 +3,7 @@ import {getIconByType} from "../../editor/getIcon";
import {enterBack, iframeMenu, setFold, tableMenu, videoMenu, zoomOut} from "../../menus/protyle"; import {enterBack, iframeMenu, setFold, tableMenu, videoMenu, zoomOut} from "../../menus/protyle";
import {MenuItem} from "../../menus/Menu"; import {MenuItem} from "../../menus/Menu";
import {copySubMenu, openAttr, openWechatNotify} from "../../menus/commonMenuItem"; import {copySubMenu, openAttr, openWechatNotify} from "../../menus/commonMenuItem";
import {copyPlainText, isMac, updateHotkeyTip, writeText} from "../util/compatibility"; import {copyPlainText, isMac, isOnlyMeta, updateHotkeyTip, writeText} from "../util/compatibility";
import { import {
transaction, transaction,
turnsIntoOneTransaction, turnsIntoOneTransaction,
@ -170,7 +170,7 @@ export class Gutter {
window.siyuan.menus.menu.remove(); window.siyuan.menus.menu.remove();
return; return;
} }
if (event.ctrlKey || event.metaKey) { if (isOnlyMeta(event)) {
zoomOut({protyle, id}); zoomOut({protyle, id});
} else if (event.altKey) { } else if (event.altKey) {
let foldElement: Element; let foldElement: Element;

View file

@ -30,7 +30,7 @@ import {openMobileFileById} from "../../mobile/editor";
import {processRender} from "../util/processCode"; import {processRender} from "../util/processCode";
import {AIChat} from "../../ai/chat"; import {AIChat} from "../../ai/chat";
import {isMobile} from "../../util/functions"; import {isMobile} from "../../util/functions";
import {isCtrl, isIPhone} from "../util/compatibility"; import {isIPhone, isNotCtrl, isOnlyMeta} from "../util/compatibility";
import {avRender} from "../render/av/render"; import {avRender} from "../render/av/render";
import {genIconHTML} from "../render/util"; import {genIconHTML} from "../render/util";
@ -59,10 +59,10 @@ export class Hint {
const btnElement = hasClosestByMatchTag(eventTarget, "BUTTON"); const btnElement = hasClosestByMatchTag(eventTarget, "BUTTON");
if (btnElement && !btnElement.classList.contains("emojis__item") && !btnElement.classList.contains("emojis__type")) { if (btnElement && !btnElement.classList.contains("emojis__item") && !btnElement.classList.contains("emojis__type")) {
if (this.source !== "search") { if (this.source !== "search") {
this.fill(decodeURIComponent(btnElement.getAttribute("data-value")), protyle, true, isCtrl(event)); this.fill(decodeURIComponent(btnElement.getAttribute("data-value")), protyle, true, isOnlyMeta(event));
} else { } else {
setTimeout(() => { setTimeout(() => {
this.fill(decodeURIComponent(btnElement.getAttribute("data-value")), protyle, true, !isCtrl(event)); this.fill(decodeURIComponent(btnElement.getAttribute("data-value")), protyle, true, isNotCtrl(event));
}, 148); // 划选引用点击,需先重置 range }, 148); // 划选引用点击,需先重置 range
} }
focusByRange(protyle.toolbar.range); focusByRange(protyle.toolbar.range);
@ -302,7 +302,7 @@ ${unicode2Emoji(emoji.unicode)}</button>`;
upDownHint(this.element.lastElementChild, event); upDownHint(this.element.lastElementChild, event);
if (event.key === "Enter") { if (event.key === "Enter") {
setTimeout(() => { setTimeout(() => {
this.fill(decodeURIComponent(this.element.querySelector(".b3-list-item--focus").getAttribute("data-value")), protyle, true, !isCtrl(event)); this.fill(decodeURIComponent(this.element.querySelector(".b3-list-item--focus").getAttribute("data-value")), protyle, true, isNotCtrl(event));
}, 148); // 划选引用点击,需先重置 range }, 148); // 划选引用点击,需先重置 range
focusByRange(protyle.toolbar.range); focusByRange(protyle.toolbar.range);
event.preventDefault(); event.preventDefault();
@ -826,7 +826,7 @@ ${genHintItemHTML(item)}
if (mark === Constants.ZWSP + 3) { if (mark === Constants.ZWSP + 3) {
(this.element.querySelector(".b3-list-item--focus input") as HTMLElement).click(); (this.element.querySelector(".b3-list-item--focus input") as HTMLElement).click();
} else { } else {
this.fill(mark, protyle, true, isCtrl(event)); this.fill(mark, protyle, true, isOnlyMeta(event));
} }
} }
event.preventDefault(); event.preventDefault();

View file

@ -1,4 +1,4 @@
import {openByMobile, writeText} from "../util/compatibility"; import {isOnlyMeta, openByMobile, writeText} from "../util/compatibility";
import {focusByRange} from "../util/selection"; import {focusByRange} from "../util/selection";
import {showMessage} from "../../dialog/message"; import {showMessage} from "../../dialog/message";
import {isLocalPath, pathPosix} from "../../util/pathName"; import {isLocalPath, pathPosix} from "../../util/pathName";
@ -98,7 +98,7 @@ export class Preview {
event.preventDefault(); event.preventDefault();
if (isLocalPath(linkAddress)) { if (isLocalPath(linkAddress)) {
/// #if !MOBILE /// #if !MOBILE
if (event.metaKey || event.ctrlKey) { if (isOnlyMeta(event)) {
openBy(linkAddress, "folder"); openBy(linkAddress, "folder");
} else if (event.shiftKey) { } else if (event.shiftKey) {
openBy(linkAddress, "app"); openBy(linkAddress, "app");

View file

@ -3,7 +3,7 @@ import {hasClosestBlock, hasClosestByClassName} from "../../util/hasClosest";
import {openMenuPanel} from "./openMenuPanel"; import {openMenuPanel} from "./openMenuPanel";
import {Menu} from "../../../plugin/Menu"; import {Menu} from "../../../plugin/Menu";
import {updateAttrViewCellAnimation} from "./action"; import {updateAttrViewCellAnimation} from "./action";
import {isCtrl} from "../../util/compatibility"; import {isNotCtrl} from "../../util/compatibility";
import {objEquals} from "../../../util/functions"; import {objEquals} from "../../../util/functions";
import {fetchPost} from "../../../util/fetch"; import {fetchPost} from "../../../util/fetch";
import {focusBlock} from "../../util/selection"; import {focusBlock} from "../../util/selection";
@ -444,7 +444,7 @@ export const popTextCell = (protyle: IProtyle, cellElements: HTMLElement[], type
return; return;
} }
if (event.key === "Escape" || if (event.key === "Escape" ||
(event.key === "Enter" && !event.shiftKey && !isCtrl(event))) { (event.key === "Enter" && !event.shiftKey && isNotCtrl(event))) {
updateCellValue(protyle, type, cellElements); updateCellValue(protyle, type, cellElements);
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();

View file

@ -73,8 +73,7 @@ export const getEventName = () => {
} }
}; };
// 区别 mac 上的 ctrl 和 meta export const isOnlyMeta = (event: KeyboardEvent | MouseEvent) => {
export const isCtrl = (event: KeyboardEvent | MouseEvent) => {
if (isMac()) { if (isMac()) {
// mac // mac
if (event.metaKey && !event.ctrlKey) { if (event.metaKey && !event.ctrlKey) {
@ -89,6 +88,13 @@ export const isCtrl = (event: KeyboardEvent | MouseEvent) => {
} }
}; };
export const isNotCtrl = (event: KeyboardEvent | MouseEvent) => {
if (!event.metaKey && !event.ctrlKey) {
return true;
}
return false
}
export const isHuawei = () => { export const isHuawei = () => {
return window.siyuan.config.system.osPlatform.toLowerCase().indexOf("huawei") > -1; return window.siyuan.config.system.osPlatform.toLowerCase().indexOf("huawei") > -1;
}; };

View file

@ -914,6 +914,7 @@ export const dropEvent = (protyle: IProtyle, editorElement: HTMLElement) => {
if (targetElement.parentElement.getAttribute("data-type") === "NodeSuperBlock" && if (targetElement.parentElement.getAttribute("data-type") === "NodeSuperBlock" &&
targetElement.parentElement.getAttribute("data-sb-layout") === "col") { targetElement.parentElement.getAttribute("data-sb-layout") === "col") {
if (targetClass.includes("dragover__left") || targetClass.includes("dragover__right")) { if (targetClass.includes("dragover__left") || targetClass.includes("dragover__right")) {
// Mac 上 ⌘ 无法进行拖拽
dragSame(protyle, sourceElements, targetElement, targetClass.includes("dragover__right"), event.ctrlKey); dragSame(protyle, sourceElements, targetElement, targetClass.includes("dragover__right"), event.ctrlKey);
} else { } else {
dragSb(protyle, sourceElements, targetElement, targetClass.includes("dragover__bottom"), "row", event.ctrlKey); dragSb(protyle, sourceElements, targetElement, targetClass.includes("dragover__bottom"), "row", event.ctrlKey);

View file

@ -1,4 +1,4 @@
import {isCtrl} from "./compatibility"; import {isNotCtrl, isOnlyMeta} from "./compatibility";
import {Constants} from "../../constants"; import {Constants} from "../../constants";
// 是否匹配 ⇧⌘[] / ⌘[] / ⌥[] / ⌥⌘[] / ⌥⇧[] / ⌥⇧⌘[] / ⇧[] / [] // 是否匹配 ⇧⌘[] / ⌘[] / ⌥[] / ⌥⌘[] / ⌥⇧[] / ⌥⇧⌘[] / ⇧[] / []
@ -9,7 +9,7 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
// [] // []
if (hotKey.indexOf("⇧") === -1 && hotKey.indexOf("⌘") === -1 && hotKey.indexOf("⌥") === -1 && hotKey.indexOf("⌃") === -1) { if (hotKey.indexOf("⇧") === -1 && hotKey.indexOf("⌘") === -1 && hotKey.indexOf("⌥") === -1 && hotKey.indexOf("⌃") === -1) {
if (!event.ctrlKey && !isCtrl(event) && !event.altKey && !event.shiftKey && hotKey === Constants.KEYCODELIST[event.keyCode]) { if (isNotCtrl(event) && !event.altKey && !event.shiftKey && hotKey === Constants.KEYCODELIST[event.keyCode]) {
return true; return true;
} }
return false; return false;
@ -30,7 +30,7 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
// 是否匹配 ⇧[] // 是否匹配 ⇧[]
if (hotKey.startsWith("⇧") && hotKeys.length === 2) { if (hotKey.startsWith("⇧") && hotKeys.length === 2) {
if (!event.ctrlKey && !isCtrl(event) && !event.altKey && event.shiftKey && hotKeys[1] === Constants.KEYCODELIST[event.keyCode]) { if (isNotCtrl(event) && !event.altKey && event.shiftKey && hotKeys[1] === Constants.KEYCODELIST[event.keyCode]) {
return true; return true;
} }
return false; return false;
@ -45,33 +45,35 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
const isMatchKey = keyCode === Constants.KEYCODELIST[event.keyCode]; const isMatchKey = keyCode === Constants.KEYCODELIST[event.keyCode];
// 是否匹配 ⌥[] / ⌥⌘[] // 是否匹配 ⌥[] / ⌥⌘[]
if (isMatchKey && event.altKey && !event.shiftKey && if (isMatchKey && event.altKey && !event.shiftKey &&
(hotKeys.length === 3 ? (isCtrl(event) && hotKey.startsWith("⌥⌘")) : !isCtrl(event))) { (hotKeys.length === 3 ? (isOnlyMeta(event) && hotKey.startsWith("⌥⌘")) : isNotCtrl(event))) {
return true; return true;
} }
// ⌥⇧⌘[] // ⌥⇧⌘[]
if (isMatchKey && hotKey.startsWith("⌥⇧⌘") && hotKeys.length === 4 && if (isMatchKey && hotKey.startsWith("⌥⇧⌘") && hotKeys.length === 4 &&
event.altKey && event.shiftKey && isCtrl(event)) { event.altKey && event.shiftKey && isOnlyMeta(event)) {
return true; return true;
} }
// ⌥⇧[] // ⌥⇧[]
if (isMatchKey && hotKey.startsWith("⌥⇧") && hotKeys.length === 3 && if (isMatchKey && hotKey.startsWith("⌥⇧") && hotKeys.length === 3 &&
event.altKey && event.shiftKey && !isCtrl(event)) { event.altKey && event.shiftKey && isNotCtrl(event)) {
return true; return true;
} }
return false; return false;
} }
// 是否匹配 ⌃[] / ⌃⌥[] / ⌃⇧[]/ ⌃⌥⇧[] // 是否匹配 ⌃[] / ⌃⌘[] / ⌃⌥[] / ⌃⇧[]/ ⌃⌥⇧[]
if (hotKey.startsWith("⌃")) { if (hotKey.startsWith("⌃")) {
let keyCode = hotKeys.length === 3 ? hotKeys[2] : hotKeys[1]; let keyCode = hotKeys.length === 3 ? hotKeys[2] : hotKeys[1];
if (hotKeys.length === 4) { if (hotKeys.length === 4) {
keyCode = hotKeys[3]; keyCode = hotKeys[3];
} else if (hotKeys.length === 5) {
keyCode = hotKeys[4];
} }
const isMatchKey = keyCode === Constants.KEYCODELIST[event.keyCode]; const isMatchKey = keyCode === Constants.KEYCODELIST[event.keyCode];
// 是否匹配 ⌃[] // 是否匹配 ⌃[] / ⌃⌘[]
if (isMatchKey && hotKeys.length === 2 && if (isMatchKey && event.ctrlKey && !event.altKey && !event.shiftKey && hotKeys.length < 4 &&
event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) { (hotKeys.length === 3 ? (event.metaKey && hotKey.startsWith("⌃⌘")) : !event.metaKey)) {
return true; return true;
} }
// ⌃⇧[] // ⌃⇧[]
@ -84,9 +86,19 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
event.ctrlKey && event.altKey && !event.shiftKey && !event.metaKey) { event.ctrlKey && event.altKey && !event.shiftKey && !event.metaKey) {
return true; return true;
} }
// ⌃⌥⇧[] // ⌃⌥⇧[] / ⌃⌥⌘[] / ⌃⇧⌘[]
if (isMatchKey && hotKey.startsWith("⌃⌥⇧") && hotKeys.length === 4 && if (isMatchKey && hotKeys.length === 4 && event.ctrlKey &&
event.ctrlKey && event.altKey && event.shiftKey && !event.metaKey) { (
(hotKey.startsWith("⌃⌥⇧") && event.shiftKey && !event.metaKey && event.altKey) ||
(hotKey.startsWith("⌃⌥⌘") && !event.shiftKey && event.metaKey && event.altKey) ||
(hotKey.startsWith("⌃⇧⌘") && event.shiftKey && event.metaKey && !event.altKey)
)
) {
return true;
}
// ⌃⌥⇧⌘[]
if (isMatchKey && hotKeys.length === 5 && event.ctrlKey && event.shiftKey && event.metaKey && event.altKey) {
return true; return true;
} }
return false; return false;
@ -94,7 +106,7 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
// 是否匹配 ⇧⌘[] / ⌘[] // 是否匹配 ⇧⌘[] / ⌘[]
const hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧"); const hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧");
if (isCtrl(event) && !event.altKey && ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) { if (isOnlyMeta(event) && !event.altKey && ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) {
return (hasShift ? hotKeys[2] : hotKeys[1]) === Constants.KEYCODELIST[event.keyCode]; return (hasShift ? hotKeys[2] : hotKeys[1]) === Constants.KEYCODELIST[event.keyCode];
} }
return false; return false;

View file

@ -2,7 +2,7 @@ import {updateTransaction} from "../wysiwyg/transaction";
import {getSelectionOffset, focusByWbr, focusByRange, focusBlock} from "./selection"; import {getSelectionOffset, focusByWbr, focusByRange, focusBlock} from "./selection";
import {hasClosestBlock, hasClosestByMatchTag} from "./hasClosest"; import {hasClosestBlock, hasClosestByMatchTag} from "./hasClosest";
import {matchHotKey} from "./hotKey"; import {matchHotKey} from "./hotKey";
import {isCtrl} from "./compatibility"; import {isNotCtrl} from "./compatibility";
import {scrollCenter} from "../../util/highlightById"; import {scrollCenter} from "../../util/highlightById";
import {insertEmptyBlock} from "../../block/util"; import {insertEmptyBlock} from "../../block/util";
@ -369,7 +369,7 @@ export const fixTable = (protyle: IProtyle, event: KeyboardEvent, range: Range)
} }
// shift+enter 软换行 // shift+enter 软换行
if (event.key === "Enter" && event.shiftKey && !isCtrl(event) && !event.altKey) { if (event.key === "Enter" && event.shiftKey && isNotCtrl(event) && !event.altKey) {
const wbrElement = document.createElement("wbr"); const wbrElement = document.createElement("wbr");
range.insertNode(wbrElement); range.insertNode(wbrElement);
const oldHTML = nodeElement.outerHTML; const oldHTML = nodeElement.outerHTML;
@ -394,7 +394,7 @@ export const fixTable = (protyle: IProtyle, event: KeyboardEvent, range: Range)
return true; return true;
} }
// enter 光标跳转到下一行同列 // enter 光标跳转到下一行同列
if (!isCtrl(event) && !event.shiftKey && !event.altKey && event.key === "Enter") { if (isNotCtrl(event) && !event.shiftKey && !event.altKey && event.key === "Enter") {
event.preventDefault(); event.preventDefault();
const trElement = cellElement.parentElement as HTMLTableRowElement; const trElement = cellElement.parentElement as HTMLTableRowElement;
if ((!trElement.nextElementSibling && trElement.parentElement.tagName === "TBODY") || if ((!trElement.nextElementSibling && trElement.parentElement.tagName === "TBODY") ||
@ -423,7 +423,7 @@ export const fixTable = (protyle: IProtyle, event: KeyboardEvent, range: Range)
return true; return true;
} }
// tab光标移向下一个 cell // tab光标移向下一个 cell
if (event.key === "Tab" && !event.ctrlKey) { if (event.key === "Tab" && isNotCtrl(event)) {
if (event.shiftKey) { if (event.shiftKey) {
// shift + tab 光标移动到前一个 cell // shift + tab 光标移动到前一个 cell
goPreviousCell(cellElement, range); goPreviousCell(cellElement, range);
@ -453,7 +453,7 @@ export const fixTable = (protyle: IProtyle, event: KeyboardEvent, range: Range)
return true; return true;
} }
if (event.key === "ArrowUp" && !isCtrl(event) && !event.shiftKey && !event.altKey) { if (event.key === "ArrowUp" && isNotCtrl(event) && !event.shiftKey && !event.altKey) {
const startContainer = range.startContainer as HTMLElement; const startContainer = range.startContainer as HTMLElement;
let previousBrElement; let previousBrElement;
if (startContainer.nodeType !== 3 && (startContainer.tagName === "TH" || startContainer.tagName === "TD")) { if (startContainer.nodeType !== 3 && (startContainer.tagName === "TH" || startContainer.tagName === "TD")) {
@ -484,7 +484,7 @@ export const fixTable = (protyle: IProtyle, event: KeyboardEvent, range: Range)
return true; return true;
} }
if (event.key === "ArrowDown" && !isCtrl(event) && !event.shiftKey && !event.altKey) { if (event.key === "ArrowDown" && isNotCtrl(event) && !event.shiftKey && !event.altKey) {
const endContainer = range.endContainer as HTMLElement; const endContainer = range.endContainer as HTMLElement;
let nextBrElement; let nextBrElement;
if (endContainer.nodeType !== 3 && (endContainer.tagName === "TH" || endContainer.tagName === "TD")) { if (endContainer.nodeType !== 3 && (endContainer.tagName === "TH" || endContainer.tagName === "TD")) {
@ -520,7 +520,7 @@ export const fixTable = (protyle: IProtyle, event: KeyboardEvent, range: Range)
} }
// Backspace光标移动到前一个 cell // Backspace光标移动到前一个 cell
if (!isCtrl(event) && !event.shiftKey && !event.altKey && event.key === "Backspace" if (isNotCtrl(event) && !event.shiftKey && !event.altKey && event.key === "Backspace"
&& getSelectionOffset(cellElement, protyle.wysiwyg.element, range).start === 0 && range.toString() === "" && && getSelectionOffset(cellElement, protyle.wysiwyg.element, range).start === 0 && range.toString() === "" &&
// 空换行无法删除 https://github.com/siyuan-note/siyuan/issues/2732 // 空换行无法删除 https://github.com/siyuan-note/siyuan/issues/2732
(range.startOffset === 0 || (range.startOffset === 1 && cellElement.querySelectorAll("br").length === 1))) { (range.startOffset === 0 || (range.startOffset === 1 && cellElement.querySelectorAll("br").length === 1))) {

View file

@ -4,6 +4,7 @@ import {openAttr, openFileAttr} from "../../menus/commonMenuItem";
import {openGlobalSearch} from "../../search/util"; import {openGlobalSearch} from "../../search/util";
/// #endif /// #endif
import {isMobile} from "../../util/functions"; import {isMobile} from "../../util/functions";
import {isOnlyMeta} from "../util/compatibility";
export const commonClick = (event: MouseEvent & { export const commonClick = (event: MouseEvent & {
target: HTMLElement target: HTMLElement
@ -11,7 +12,7 @@ export const commonClick = (event: MouseEvent & {
const isM = isMobile(); const isM = isMobile();
const attrBookmarkElement = hasClosestByClassName(event.target, "protyle-attr--bookmark"); const attrBookmarkElement = hasClosestByClassName(event.target, "protyle-attr--bookmark");
if (attrBookmarkElement) { if (attrBookmarkElement) {
if (!isM && (event.ctrlKey || event.metaKey)) { if (!isM && isOnlyMeta(event)) {
/// #if !MOBILE /// #if !MOBILE
openGlobalSearch(protyle.app, attrBookmarkElement.textContent.trim(), true); openGlobalSearch(protyle.app, attrBookmarkElement.textContent.trim(), true);
/// #endif /// #endif
@ -28,7 +29,7 @@ export const commonClick = (event: MouseEvent & {
const attrNameElement = hasClosestByClassName(event.target, "protyle-attr--name"); const attrNameElement = hasClosestByClassName(event.target, "protyle-attr--name");
if (attrNameElement) { if (attrNameElement) {
if (!isM && (event.ctrlKey || event.metaKey)) { if (!isM && isOnlyMeta(event)) {
/// #if !MOBILE /// #if !MOBILE
openGlobalSearch(protyle.app, attrNameElement.textContent.trim(), true); openGlobalSearch(protyle.app, attrNameElement.textContent.trim(), true);
/// #endif /// #endif
@ -56,7 +57,7 @@ export const commonClick = (event: MouseEvent & {
const attrAliasElement = hasClosestByClassName(event.target, "protyle-attr--alias"); const attrAliasElement = hasClosestByClassName(event.target, "protyle-attr--alias");
if (attrAliasElement) { if (attrAliasElement) {
if (!isM && (event.ctrlKey || event.metaKey)) { if (!isM && isOnlyMeta(event)) {
/// #if !MOBILE /// #if !MOBILE
openGlobalSearch(protyle.app, attrAliasElement.textContent.trim(), true); openGlobalSearch(protyle.app, attrAliasElement.textContent.trim(), true);
/// #endif /// #endif
@ -73,7 +74,7 @@ export const commonClick = (event: MouseEvent & {
const attrMemoElement = hasClosestByClassName(event.target, "protyle-attr--memo"); const attrMemoElement = hasClosestByClassName(event.target, "protyle-attr--memo");
if (attrMemoElement) { if (attrMemoElement) {
if (!isM && (event.ctrlKey || event.metaKey)) { if (!isM && isOnlyMeta(event)) {
/// #if !MOBILE /// #if !MOBILE
openGlobalSearch(protyle.app, attrMemoElement.getAttribute("aria-label").trim(), true); openGlobalSearch(protyle.app, attrMemoElement.getAttribute("aria-label").trim(), true);
/// #endif /// #endif

View file

@ -64,7 +64,7 @@ import {openGlobalSearch} from "../../search/util";
import {popSearch} from "../../mobile/menu/search"; import {popSearch} from "../../mobile/menu/search";
/// #endif /// #endif
import {BlockPanel} from "../../block/Panel"; import {BlockPanel} from "../../block/Panel";
import {isCtrl, isInIOS, openByMobile} from "../util/compatibility"; import {isInIOS, isOnlyMeta, openByMobile} from "../util/compatibility";
import {MenuItem} from "../../menus/Menu"; import {MenuItem} from "../../menus/Menu";
import {fetchPost} from "../../util/fetch"; import {fetchPost} from "../../util/fetch";
import {onGet} from "../util/onGet"; import {onGet} from "../util/onGet";
@ -1582,7 +1582,7 @@ export class WYSIWYG {
return; return;
} }
if ((event.shiftKey || isCtrl(event)) && !event.isComposing && range.toString() !== "") { if ((event.shiftKey || isOnlyMeta(event)) && !event.isComposing && range.toString() !== "") {
// 工具栏 // 工具栏
protyle.toolbar.render(protyle, range, event); protyle.toolbar.render(protyle, range, event);
countSelectWord(range); countSelectWord(range);
@ -1634,7 +1634,7 @@ export class WYSIWYG {
}); });
}); });
hideElements(["hint", "util"], protyle); hideElements(["hint", "util"], protyle);
const ctrlIsPressed = event.metaKey || event.ctrlKey; const ctrlIsPressed = isOnlyMeta(event);
/// #if !MOBILE /// #if !MOBILE
const backlinkBreadcrumbItemElement = hasClosestByClassName(event.target, "protyle-breadcrumb__item"); const backlinkBreadcrumbItemElement = hasClosestByClassName(event.target, "protyle-breadcrumb__item");
if (backlinkBreadcrumbItemElement) { if (backlinkBreadcrumbItemElement) {

View file

@ -1,5 +1,5 @@
import {hideElements} from "../ui/hideElements"; import {hideElements} from "../ui/hideElements";
import {copyPlainText, isCtrl, isMac, writeText} from "../util/compatibility"; import {copyPlainText, isMac, isNotCtrl, isOnlyMeta, writeText} from "../util/compatibility";
import { import {
focusBlock, focusBlock,
focusByRange, focusByRange,
@ -121,7 +121,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
return; return;
} }
if (nodeElement.classList.contains("protyle-wysiwyg--select") && !isCtrl(event) && !event.shiftKey && !event.altKey) { if (nodeElement.classList.contains("protyle-wysiwyg--select") && isNotCtrl(event) && !event.shiftKey && !event.altKey) {
if (event.key.toLowerCase() === "a") { if (event.key.toLowerCase() === "a") {
event.stopPropagation(); event.stopPropagation();
event.preventDefault(); event.preventDefault();
@ -146,7 +146,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
return; return;
} }
// https://github.com/siyuan-note/siyuan/issues/2261 // https://github.com/siyuan-note/siyuan/issues/2261
if (!isCtrl(event) && !event.shiftKey && !event.altKey) { if (isNotCtrl(event) && !event.shiftKey && !event.altKey) {
if (event.code === "Slash") { if (event.code === "Slash") {
protyle.hint.enableSlash = true; protyle.hint.enableSlash = true;
} else if (event.code === "Backslash") { } else if (event.code === "Backslash") {
@ -171,7 +171,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") && if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
(event.code.startsWith("Arrow") || event.code === "Enter") && (event.code.startsWith("Arrow") || event.code === "Enter") &&
!event.altKey && !event.shiftKey && !isCtrl(event)) { !event.altKey && !event.shiftKey && isNotCtrl(event)) {
event.preventDefault(); event.preventDefault();
return; return;
} else if (event.key !== "Escape") { } else if (event.key !== "Escape") {
@ -182,7 +182,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
protyle.breadcrumb.hide(); protyle.breadcrumb.hide();
} }
if (!event.altKey && !event.shiftKey && !isCtrl(event) && (event.key === "ArrowDown" || event.key === "ArrowUp")) { if (!event.altKey && !event.shiftKey && isNotCtrl(event) && (event.key === "ArrowDown" || event.key === "ArrowUp")) {
const selectElements = protyle.wysiwyg.element.querySelectorAll(".protyle-wysiwyg--select"); const selectElements = protyle.wysiwyg.element.querySelectorAll(".protyle-wysiwyg--select");
if (selectElements.length > 0) { if (selectElements.length > 0) {
event.preventDefault(); event.preventDefault();
@ -268,7 +268,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
// 仅处理以下快捷键操作 // 仅处理以下快捷键操作
if (event.key !== "PageUp" && event.key !== "PageDown" && event.key !== "Home" && event.key !== "End" && event.key.indexOf("Arrow") === -1 && if (event.key !== "PageUp" && event.key !== "PageDown" && event.key !== "Home" && event.key !== "End" && event.key.indexOf("Arrow") === -1 &&
!isCtrl(event) && event.key !== "Escape" && !event.shiftKey && !event.altKey && !/^F\d{1,2}$/.test(event.key) && isNotCtrl(event) && event.key !== "Escape" && !event.shiftKey && !event.altKey && !/^F\d{1,2}$/.test(event.key) &&
event.key !== "Enter" && event.key !== "Tab" && event.key !== "Backspace" && event.key !== "Delete" && event.key !== "ContextMenu") { event.key !== "Enter" && event.key !== "Tab" && event.key !== "Backspace" && event.key !== "Delete" && event.key !== "ContextMenu") {
event.stopPropagation(); event.stopPropagation();
hideElements(["select"], protyle); hideElements(["select"], protyle);
@ -470,8 +470,8 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
return; return;
} }
if ((event.shiftKey && !event.altKey && !isCtrl(event) && (event.key === "Home" || event.key === "End") && isMac()) || if ((event.shiftKey && !event.altKey && isNotCtrl(event) && (event.key === "Home" || event.key === "End") && isMac()) ||
(event.shiftKey && !event.altKey && isCtrl(event) && (event.key === "Home" || event.key === "End") && !isMac())) { (event.shiftKey && !event.altKey && isOnlyMeta(event) && (event.key === "Home" || event.key === "End") && !isMac())) {
const topElement = hasTopClosestByAttribute(nodeElement, "data-node-id", null); const topElement = hasTopClosestByAttribute(nodeElement, "data-node-id", null);
if (topElement) { if (topElement) {
// 超级块内已选中某个块 // 超级块内已选中某个块
@ -495,7 +495,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
return; return;
} }
// ctrl+home 光标移动到顶 // ctrl+home 光标移动到顶
if (!event.altKey && !event.shiftKey && isCtrl(event) && event.key === "Home") { if (!event.altKey && !event.shiftKey && isOnlyMeta(event) && event.key === "Home") {
goHome(protyle); goHome(protyle);
hideElements(["select"], protyle); hideElements(["select"], protyle);
event.stopPropagation(); event.stopPropagation();
@ -503,7 +503,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
return; return;
} }
// ctrl+end 光标移动到尾 // ctrl+end 光标移动到尾
if (!event.altKey && !event.shiftKey && isCtrl(event) && event.key === "End") { if (!event.altKey && !event.shiftKey && isOnlyMeta(event) && event.key === "End") {
goEnd(protyle); goEnd(protyle);
hideElements(["select"], protyle); hideElements(["select"], protyle);
event.stopPropagation(); event.stopPropagation();
@ -511,7 +511,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
return; return;
} }
// 向上/下滚动一屏 // 向上/下滚动一屏
if (!event.altKey && !event.shiftKey && !isCtrl(event) && (event.key === "PageUp" || event.key === "PageDown")) { if (!event.altKey && !event.shiftKey && isNotCtrl(event) && (event.key === "PageUp" || event.key === "PageDown")) {
if (event.key === "PageUp") { if (event.key === "PageUp") {
protyle.contentElement.scrollTop = protyle.contentElement.scrollTop - protyle.contentElement.clientHeight; protyle.contentElement.scrollTop = protyle.contentElement.scrollTop - protyle.contentElement.clientHeight;
protyle.scroll.lastScrollTop = protyle.contentElement.scrollTop + 1; protyle.scroll.lastScrollTop = protyle.contentElement.scrollTop + 1;
@ -534,7 +534,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
} }
// hint: 上下、回车选择 // hint: 上下、回车选择
if (!event.altKey && !event.shiftKey && if (!event.altKey && !event.shiftKey &&
((event.key.indexOf("Arrow") > -1 && !isCtrl(event)) || event.key === "Enter") && ((event.key.indexOf("Arrow") > -1 && isNotCtrl(event)) || event.key === "Enter") &&
!protyle.hint.element.classList.contains("fn__none") && protyle.hint.select(event, protyle)) { !protyle.hint.element.classList.contains("fn__none") && protyle.hint.select(event, protyle)) {
event.stopPropagation(); event.stopPropagation();
event.preventDefault(); event.preventDefault();
@ -607,7 +607,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
} }
const selectText = range.toString(); const selectText = range.toString();
// 上下左右光标移动 // 上下左右光标移动
if (!event.altKey && !event.shiftKey && !isCtrl(event) && !event.isComposing && (event.key.indexOf("Arrow") > -1)) { if (!event.altKey && !event.shiftKey && isNotCtrl(event) && !event.isComposing && (event.key.indexOf("Arrow") > -1)) {
// 需使用 editabled否则代码块会把语言字数算入 // 需使用 editabled否则代码块会把语言字数算入
const nodeEditableElement = getContenteditableElement(nodeElement) || nodeElement; const nodeEditableElement = getContenteditableElement(nodeElement) || nodeElement;
const position = getSelectionOffset(nodeEditableElement, protyle.wysiwyg.element, range); const position = getSelectionOffset(nodeEditableElement, protyle.wysiwyg.element, range);
@ -716,7 +716,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
return; return;
} }
// 删除,不可使用 !isCtrl(event),否则软删除回导致 https://github.com/siyuan-note/siyuan/issues/5607 // 删除,不可使用 isNotCtrl(event),否则软删除回导致 https://github.com/siyuan-note/siyuan/issues/5607
// 不可使用 !event.shiftKey否则 https://ld246.com/article/1666434796806 // 不可使用 !event.shiftKey否则 https://ld246.com/article/1666434796806
if (!event.altKey && (event.key === "Backspace" || event.key === "Delete")) { if (!event.altKey && (event.key === "Backspace" || event.key === "Delete")) {
if (protyle.wysiwyg.element.querySelector(".protyle-wysiwyg--select")) { if (protyle.wysiwyg.element.querySelector(".protyle-wysiwyg--select")) {
@ -853,7 +853,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
return; return;
} }
// 代码块中空行 ⌘+Del 异常 https://ld246.com/article/1663166544901 // 代码块中空行 ⌘+Del 异常 https://ld246.com/article/1663166544901
if (nodeElement.classList.contains("code-block") && isCtrl(event) && if (nodeElement.classList.contains("code-block") && isOnlyMeta(event) &&
range.startContainer.nodeType === 3 && range.startContainer.textContent.substring(range.startOffset - 1, range.startOffset) === "\n") { range.startContainer.nodeType === 3 && range.startContainer.textContent.substring(range.startOffset - 1, range.startOffset) === "\n") {
event.stopPropagation(); event.stopPropagation();
event.preventDefault(); event.preventDefault();
@ -939,7 +939,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
} }
// 回车 // 回车
if (!event.altKey && !event.shiftKey && !isCtrl(event) && event.key === "Enter") { if (!event.altKey && !event.shiftKey && isNotCtrl(event) && event.key === "Enter") {
event.stopPropagation(); event.stopPropagation();
event.preventDefault(); event.preventDefault();
enter(nodeElement, range, protyle); enter(nodeElement, range, protyle);
@ -1535,7 +1535,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
} }
// tab 需等待 list 和 table 处理完成 // tab 需等待 list 和 table 处理完成
if (event.key === "Tab" && !event.ctrlKey && !isCtrl(event) && !event.altKey) { if (event.key === "Tab" && isNotCtrl(event) && !event.altKey) {
event.preventDefault(); event.preventDefault();
const tabSpace = window.siyuan.config.editor.codeTabSpaces === 0 ? "\t" : "".padStart(window.siyuan.config.editor.codeTabSpaces, " "); const tabSpace = window.siyuan.config.editor.codeTabSpaces === 0 ? "\t" : "".padStart(window.siyuan.config.editor.codeTabSpaces, " ");
if (nodeElement.getAttribute("data-type") === "NodeCodeBlock" && selectText !== "") { if (nodeElement.getAttribute("data-type") === "NodeCodeBlock" && selectText !== "") {
@ -1698,7 +1698,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
/// #endif /// #endif
// 置于最后,太多快捷键会使用到选中元素 // 置于最后,太多快捷键会使用到选中元素
if (!isCtrl(event) && event.key !== "Backspace" && event.key !== "Escape" && event.key !== "Delete" && !event.shiftKey && !event.altKey && event.key !== "Enter") { if (isNotCtrl(event) && event.key !== "Backspace" && event.key !== "Escape" && event.key !== "Delete" && !event.shiftKey && !event.altKey && event.key !== "Enter") {
hideElements(["select"], protyle); hideElements(["select"], protyle);
} }
}); });

View file

@ -23,7 +23,7 @@ import {addLoading} from "../protyle/ui/initUI";
import {getIconByType} from "../editor/getIcon"; import {getIconByType} from "../editor/getIcon";
import {unicode2Emoji} from "../emoji"; import {unicode2Emoji} from "../emoji";
import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {hasClosestByClassName} from "../protyle/util/hasClosest";
import {setStorageVal, updateHotkeyTip} from "../protyle/util/compatibility"; import {isNotCtrl, setStorageVal, updateHotkeyTip} from "../protyle/util/compatibility";
import {newFileByName} from "../util/newFile"; import {newFileByName} from "../util/newFile";
import {filterMenu, getKeyByLiElement, initCriteriaMenu, moreMenu, queryMenu, saveCriterion} from "./menu"; import {filterMenu, getKeyByLiElement, initCriteriaMenu, moreMenu, queryMenu, saveCriterion} from "./menu";
import {App} from "../index"; import {App} from "../index";
@ -810,7 +810,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
} }
} }
}, Constants.TIMEOUT_DBLCLICK); }, Constants.TIMEOUT_DBLCLICK);
} else if (isDblClick && !event.ctrlKey) { } else if (isDblClick && isNotCtrl(event)) {
clearTimeout(clickTimeout); clearTimeout(clickTimeout);
if (isAsset) { if (isAsset) {
/// #if !BROWSER /// #if !BROWSER

View file

@ -10,6 +10,7 @@ import {Constants} from "../constants";
import {ipcRenderer} from "electron"; import {ipcRenderer} from "electron";
/// #endif /// #endif
import {showMessage} from "../dialog/message"; import {showMessage} from "../dialog/message";
import {isOnlyMeta} from "../protyle/util/compatibility";
export const showFileInFolder = (filePath: string) => { export const showFileInFolder = (filePath: string) => {
/// #if !BROWSER /// #if !BROWSER
@ -448,7 +449,7 @@ export const movePathTo = (cb: (toPath: string[], toNotebook: string[]) => void,
if (currentItemElements.length === 0) { if (currentItemElements.length === 0) {
return; return;
} }
if (title === window.siyuan.languages.specifyPath && (event.ctrlKey || event.metaKey)) { if (title === window.siyuan.languages.specifyPath && isOnlyMeta(event)) {
if (currentItemElements.length === 1 && currentItemElements[0].isSameNode(target)) { if (currentItemElements.length === 1 && currentItemElements[0].isSameNode(target)) {
// 至少需选中一个 // 至少需选中一个
} else { } else {