diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json
index 41a035290..8be1ae783 100644
--- a/app/appearance/langs/en_US.json
+++ b/app/appearance/langs/en_US.json
@@ -456,7 +456,8 @@
"fontSize": "Font Size",
"fontSizeTip": "The default font size is 16px, this setting only affects the font size display in the editor",
"font1": "This setting only affects the font family display in the editor, choose Default to use the theme's font family",
- "newNameFile": "The name of the new document is",
+ "newNameFile": "The name of the new subdocument is",
+ "newNameSettingFile": "The name of the new document is",
"newContentFile": "The content of the new document is",
"exporting": "Exporting, please wait...",
"exported": "Export complete",
diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json
index 137a02e4c..47650401a 100644
--- a/app/appearance/langs/es_ES.json
+++ b/app/appearance/langs/es_ES.json
@@ -455,7 +455,8 @@
"fontSize": "Tamaño de la fuente",
"fontSizeTip": "El tamaño de la fuente por defecto es de 16px, este ajuste sólo afecta a la visualización del tamaño de la fuente en el editor",
"font1": "Este ajuste sólo afecta a la visualización de la familia de fuentes en el editor, elija Por defecto para utilizar la familia de fuentes del tema",
- "newNameFile": "El nombre del nuevo documento es",
+ "newNameFile": "El nombre del nuevo subdocumento es",
+ "newNameSettingFile": "El nombre del nuevo documento es",
"newContentFile": "El contenido del nuevo documento es",
"exporting": "Exportando, por favor espere...",
"exported": "Exportación completada",
diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json
index d881cc0b6..4b1af4445 100644
--- a/app/appearance/langs/fr_FR.json
+++ b/app/appearance/langs/fr_FR.json
@@ -456,7 +456,8 @@
"fontSize": "Taille de la police",
"fontSizeTip": "La taille de la police par défaut est de 16px, ce paramètre n'affecte que la taille de la police affichée dans l'éditeur.",
"font1": "Ce paramètre n'affecte que l'affichage de la famille de polices dans l'éditeur, choisissez Default pour utiliser la famille de polices du thème.",
- "newNameFile": "Le nom du nouveau document est",
+ "newNameFile": "Le nom du nouveau sous-document est",
+ "newNameSettingFile": "Le nom du nouveau document est",
"newContentFile": "Le contenu du nouveau document est",
"exporting": "En cours d'exportation, veuillez patienter...",
"exported": "Exportation terminée",
diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json
index 4d2ff6d99..ef9b679a5 100644
--- a/app/appearance/langs/zh_CHT.json
+++ b/app/appearance/langs/zh_CHT.json
@@ -456,7 +456,8 @@
"fontSize": "字型大小",
"fontSizeTip": "字型大小預設為 16px,該設置僅影響編輯器內字體大小顯示",
"font1": "該設置僅影響編輯器內字體顯示,選擇 預設 則使用主題自帶字體",
- "newNameFile": "新建文檔名為",
+ "newNameFile": "新建子文檔名為",
+ "newNameSettingFile": "新建文檔名為",
"newContentFile": "新建文檔內容為",
"exporting": "正在匯出,請稍等...",
"exported": "匯出完成",
diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json
index 36cc7ccab..44f678932 100644
--- a/app/appearance/langs/zh_CN.json
+++ b/app/appearance/langs/zh_CN.json
@@ -456,7 +456,8 @@
"fontSize": "字号",
"fontSizeTip": "字号默认为 16px,该设置仅影响编辑器内字体大小显示",
"font1": "该设置仅影响编辑器内字体显示,选择 默认 则使用主题自带字体",
- "newNameFile": "新建文档名为",
+ "newNameFile": "新建子文档名为",
+ "newNameSettingFile": "新建文档名为",
"newContentFile": "新建文档内容为",
"exporting": "正在导出,请稍等...",
"exported": "导出完成",
diff --git a/app/src/constants.ts b/app/src/constants.ts
index 72b20e5ae..d691d5054 100644
--- a/app/src/constants.ts
+++ b/app/src/constants.ts
@@ -164,6 +164,7 @@ export abstract class Constants {
rename: {default: "F2", custom: "F2"},
newNameFile: {default: "F3", custom: "F3"},
newContentFile: {default: "F4", custom: "F4"},
+ newNameSettingFile: {default: "⌘F3", custom: "⌘F3"},
showInFolder: {default: "⌥A", custom: "⌥A"},
outline: {default: "⌥O", custom: "⌥O"},
backlinks: {default: "⌥B", custom: "⌥B"},
diff --git a/app/src/editor/rename.ts b/app/src/editor/rename.ts
index 70a6c0df6..d1e63e966 100644
--- a/app/src/editor/rename.ts
+++ b/app/src/editor/rename.ts
@@ -3,11 +3,9 @@ import {Dialog} from "../dialog";
import {focusByRange} from "../protyle/util/selection";
import {hasClosestBlock} from "../protyle/util/hasClosest";
import {removeEmbed} from "../protyle/wysiwyg/removeEmbed";
-import {insertHTML} from "../protyle/util/insertHTML";
import {isMobile} from "../util/functions";
import {getAssetName, getDisplayName, pathPosix, setNotebookName} from "../util/pathName";
import {fetchPost} from "../util/fetch";
-import {escapeHtml} from "../util/escape";
import {Constants} from "../constants";
import {showTooltip} from "../dialog/tooltip";
@@ -175,16 +173,3 @@ export const newFileContentBySelect = (protyle: IProtyle) => {
md: protyle.lute.BlockDOM2StdMd(html)
});
};
-
-export const newFileBySelect = (fileName: string, protyle: IProtyle) => {
- const newName = replaceFileName(fileName) || "Untitled";
- const id = Lute.NewNodeID();
- fetchPost("/api/filetree/createDoc", {
- notebook: protyle.notebookId,
- path: pathPosix().join(getDisplayName(protyle.path, false, true), id + ".sy"),
- title: newName,
- md: ""
- }, () => {
- insertHTML(`${escapeHtml(newName.substring(0, window.siyuan.config.editor.blockRefDynamicAnchorTextMaxLen))}`, protyle);
- });
-};
diff --git a/app/src/protyle/wysiwyg/keydown.ts b/app/src/protyle/wysiwyg/keydown.ts
index a7d4e4460..1039e49b5 100644
--- a/app/src/protyle/wysiwyg/keydown.ts
+++ b/app/src/protyle/wysiwyg/keydown.ts
@@ -36,9 +36,9 @@ import {
} from "./transaction";
import {fontEvent} from "../toolbar/Font";
import {listIndent, listOutdent} from "./list";
-import {newFileBySelect, newFileContentBySelect, rename, replaceFileName} from "../../editor/rename";
+import {newFileContentBySelect, rename, replaceFileName} from "../../editor/rename";
import {insertEmptyBlock, jumpToParentNext} from "../../block/util";
-import {isLocalPath} from "../../util/pathName";
+import {getDisplayName, isLocalPath, pathPosix} from "../../util/pathName";
/// #if !MOBILE
import {openBy, openFileById} from "../../editor/util";
/// #endif
@@ -67,6 +67,9 @@ import {openMobileFileById} from "../../mobile/editor";
import {moveToDown, moveToUp} from "./move";
import {pasteAsPlainText} from "../util/paste";
import {preventScroll} from "../scroll/preventScroll";
+import {getSavePath} from "../../util/newFile";
+import {escapeHtml} from "../../util/escape";
+import {insertHTML} from "../util/insertHTML";
export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
editorElement.addEventListener("keydown", (event: KeyboardEvent & { target: HTMLElement }) => {
@@ -690,7 +693,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
const previousSibling = hasPreviousSibling(range.startContainer) as HTMLElement;
if (range.toString() === "" && event.key === "Backspace" &&
range.startOffset === range.startContainer.textContent.length &&
- range.startContainer.textContent.endsWith("\n"+Constants.ZWSP)) {
+ range.startContainer.textContent.endsWith("\n" + Constants.ZWSP)) {
range.setStart(range.startContainer, range.startOffset - 1);
range.collapse(true);
event.stopPropagation();
@@ -1044,7 +1047,41 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
if (!selectText.trim()) {
selectAll(protyle, nodeElement, range);
}
- newFileBySelect(selectText.trim() ? selectText.trim() : protyle.lute.BlockDOM2Content(nodeElement.outerHTML), protyle);
+ const newName = replaceFileName(selectText.trim() ? selectText.trim() : protyle.lute.BlockDOM2Content(nodeElement.outerHTML)) || "Untitled";
+ const id = Lute.NewNodeID();
+ fetchPost("/api/filetree/createDoc", {
+ notebook: protyle.notebookId,
+ path: pathPosix().join(getDisplayName(protyle.path, false, true), id + ".sy"),
+ title: newName,
+ md: ""
+ }, () => {
+ insertHTML(`${escapeHtml(newName.substring(0, window.siyuan.config.editor.blockRefDynamicAnchorTextMaxLen))}`, protyle);
+ hideElements(["toolbar"], protyle)
+ });
+ }
+ event.preventDefault();
+ event.stopPropagation();
+ return;
+ }
+
+ if (matchHotKey(window.siyuan.config.keymap.editor.general.newNameSettingFile.custom, event)) {
+ if (!selectText.trim() && (nodeElement.querySelector("tr") || nodeElement.querySelector("span"))) {
+ // 没选中时,都是纯文本就创建子文档 https://ld246.com/article/1663073488381/comment/1664804353295#comments
+ } else {
+ if (!selectText.trim()) {
+ selectAll(protyle, nodeElement, range);
+ }
+ const newFileName = replaceFileName(selectText.trim() ? selectText.trim() : protyle.lute.BlockDOM2Content(nodeElement.outerHTML));
+ getSavePath(protyle.path, protyle.notebookId, (pathString) => {
+ fetchPost("/api/filetree/createDocWithMd", {
+ notebook: protyle.notebookId,
+ path: pathPosix().join(pathString, newFileName),
+ markdown: ""
+ }, response => {
+ insertHTML(`${escapeHtml(newFileName.substring(0, window.siyuan.config.editor.blockRefDynamicAnchorTextMaxLen))}`, protyle);
+ hideElements(["toolbar"], protyle)
+ });
+ });
}
event.preventDefault();
event.stopPropagation();