功能:
- 按下后可在当前行后面插入一个软回车(等价于电脑端的 shift+Enter)
- 适用于 平板端的思源笔记,电脑端也可用
原理:
- 发送 shift+Enter 键盘事件
注意:
- 本代码由 AI 工具辅助生成,目前在我的 iPad 上工作良好,但稳定性未知,故在此抛砖引玉。
- 如想让这个按钮一直显示,请配合 「工具栏 Plus」插件一起使用。
效果:

代码:
// 软回车按钮(适配桌面 + iPad 移动端)
(() => {
const BTN_ID = "snippet-soft-break-btn";
// 插入软回车:优先用 insertLineBreak,失败就模拟 Shift+Enter
function insertSoftBreak() {
// 当前有光标的编辑区域
let active =
document.querySelector(
".protyle-wysiwyg[contenteditable='true']:focus"
) ||
document.activeElement?.closest?.(".protyle-wysiwyg[contenteditable='true']") ||
document.querySelector(".protyle-wysiwyg[contenteditable='true']");
if (!active) return;
// 先尝试原生命令
const ok = document.queryCommandSupported("insertLineBreak");
if (ok) {
document.execCommand("insertLineBreak");
} else {
// 退而求其次,模拟 Shift+Enter 按键
const evt = new KeyboardEvent("keydown", {
key: "Enter",
code: "Enter",
keyCode: 13,
which: 13,
shiftKey: true,
bubbles: true,
cancelable: true,
});
active.dispatchEvent(evt);
}
active.focus();
}
function createButton() {
const btn = document.createElement("button");
btn.id = BTN_ID;
btn.className = "toolbar__item b3-tooltips b3-tooltips__n"; // 和原生图标风格一致
btn.setAttribute("aria-label", "软回车 (Shift+Enter)");
btn.type = "button";
// 你也可以放 SVG 图标,这里简化为 ↵
btn.innerHTML = "⬇️";
btn.addEventListener("click", (ev) => {
ev.preventDefault();
ev.stopPropagation();
insertSoftBreak();
});
return btn;
}
function injectToToolbar(toolbar) {
if (!toolbar || toolbar.querySelector(`#${BTN_ID}`)) return;
const btn = createButton();
// 放在靠右的位置,你也可以改成 toolbar.firstElementChild 前面
toolbar.appendChild(btn);
}
function scanToolbars() {
// 桌面 + iPad 都会有 .protyle-toolbar
document
.querySelectorAll(".protyle-toolbar")
.forEach((tb) => injectToToolbar(tb));
}
// 初次延时扫描一次(避免编辑器还没初始化好)
setTimeout(scanToolbars, 1500);
// 监听布局变化,后开的页签/浮窗也自动加按钮
const obs = new MutationObserver(() => scanToolbars());
obs.observe(document.body, { childList: true, subtree: true });
})();
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于