-
取消标签搜索的自动分屏
2025-08-02 19:18通过 [js] 连续点击 openAny,小代码,大作用,让一切触手可达 可以实现。
缺点:已有左右分屏的情况下其他左右分屏也会被取消(思源设计如此,已提改进 issue)
效果

代码
// 利用openAny取消标签搜索分屏(点击标签生效) // 缺点:已有左右分屏的情况下其他分屏也会被取消(思源设计如此,已提issue) // issue https://github.com/siyuan-note/siyuan/issues/15416 document.addEventListener('click', async (event) => { const target = event.target; if (target instanceof HTMLSpanElement && target.dataset.type === 'tag') { const searchTab = await openAny.fn.whenElementExistOrNull(()=>{ const focusTab = openAny.queryEl(`.layout__wnd--active .layout-tab-bar [data-type="tab-header"].item--focus`); if(focusTab && focusTab.textContent.trim() === window.siyuan.languages.search) return focusTab; }); if(!searchTab) return; openAny.press('mouseright', searchTab).click('#commonMenu [data-id="unsplit"]'); } }); -
求助复制图片时获取“提示文本”的内容
2025-08-01 21:32综上所述,你可以在 quicker 获取选中文本内容时选择 html,然后解析出
<img>标签的 title 即可quicker 步骤如下


最终获取结果

把这个结果复制给 ai,分分钟钟给你提取想要的数据,js,c#各种语言都可以。
或者也可以让 quicker 模拟先按 Esc,再模拟按 ctrl+c,看个人喜好。
-
[js] 好玩:模仿 obsidian 自滚动菜单,丝滑!
2025-08-01 20:38我的分辨率比较高,可能用不上了
还是有机会的,比如
分屏时,窗口缩小时,开启控制台时,各种情况引起的可视区域变小等就显得菜单多了,这时需要

-
在使用 [[ 或者【【的时候想引用本文档的可能会引用到外部文档
2025-08-01 19:33效果如下,样式和排序可在代码开头的参数里按说明修改

代码
// 自定义引用列表排序和样式 // see https://ld246.com/article/1754037296210 (()=>{ // 是否优先显示当前文档的块 const isShowCurrDocBlocksFirst = true; // 这里设置列表样式👇 addStyle(` /* 设置列表文本样式 */ .protyle-hint .b3-list-item:has(.search-ref-curr-doc-item) .b3-list-item__text{ color: green; font-weight: bold; } /* 设置列表path等样式 */ .protyle-hint .b3-list-item:has(.search-ref-curr-doc-item) .b3-list-item__meta{ color: red; } `); // 获取引用列表 searchRefBlockSortBy(isShowCurrDocBlocksFirst); // isSortByCurrDocId 是否按当前文档id优先排序 function searchRefBlockSortBy(isSortByCurrDocId = true) { const originalFetch = window.fetch; window.fetch = async function (url, init) { // 真正发请求 const response = await originalFetch(url, init); // 只处理目标接口 if (url.toString().toLowerCase().endsWith('/api/search/searchrefblock')) { const docId = (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title')?.dataset?.nodeId; const docIds = docId ? [docId] : []; try { // 克隆一份 response,用来读 body const cloned = response.clone(); const bodyJson = await cloned.json(); const blocks = bodyJson?.data?.blocks; if (Array.isArray(blocks) && blocks.length > 0) { // 设置颜色 blocks.forEach(block => { // 设置样式标记 if(docIds.includes(block.rootID)) block.content = `<span class="search-ref-curr-doc-item">${block.content}</span>`; }); // 排序返回结果 let sortedBlocks = []; if(isSortByCurrDocId && docIds.length) sortedBlocks = sortByDocIds(blocks, docIds); if(sortedBlocks.length) bodyJson.data.blocks = sortedBlocks; // 把修改后的数据串回去,构造一个新的 Response const newBody = JSON.stringify(bodyJson); const { status, statusText, headers } = response; return new Response(newBody, { status, statusText, headers }); } } catch (e) { // 如果不是 JSON,直接返回原始 response console.log(e); return response; } } // 默认返回原始 response return response; }; // 按id列表顺序排序,相同的按原序不动 function sortByDocIds(blocks, docIds) { const orderMap = new Map(docIds.map((id, idx) => [id, idx])); return blocks.sort((a, b) => { const orderA = orderMap.has(a.rootID) ? orderMap.get(a.rootID) : Infinity; const orderB = orderMap.has(b.rootID) ? orderMap.get(b.rootID) : Infinity; return orderA - orderB; }); } } function addStyle(css) { const style = document.createElement('style'); style.textContent = css; document.head.appendChild(style); } })(); -
[js] 好玩:模仿 obsidian 自滚动菜单,丝滑!
2025-08-01 07:47@alanelminster @queguaiya @chenshinshi @qiancang @HugZephyr @PearlLin @XuanJoy
@1ssss @Ganymede @leolee @5kyfkr @Mustakshif @ACai @nightstars @8V9q7V @Sonsy
@Silva @mecoren @wucunwei @mm-o @shawnkurt @openAI @siyuan100861186
@suxiang999 @att88 @gcdjbr @JeffreyChen @heiyi0.0.7 迎来重大更新!建议升级!
⚠️ 风险提醒:0.0.6 版,当窗口拖动后,子菜单显示可能会乱,需要重新打开菜单才行。
更新内容:
- 从根本上解决子菜单跳动问题
- 修复视窗变化时菜单可能错乱问题;
- 修复鸿蒙手机版,菜单不可滑动问题,感谢 @5kyfkr 反馈
-
[js][css] 请问有没有 CSS/JS 代码可以控制文档树和大纲等栏目的最低宽度?
2025-07-30 18:18js 方案
@JeffreyChen 我测试下来发现 css 版不够稳定,经常不生效,我用 js 写了一版
// 自定义侧边栏最小宽度限制 setTimeout(() => { // 设置侧边栏最小宽度 const minWidth = 100; if (!!document.getElementById("sidebar")) return; // 手机版返回 const dockl = document.querySelector('.layout__dockl'); const resizerl = getNextResizeLr(dockl); const dockr = document.querySelector('.layout__dockr'); const resizerr = getPreviousResizeLr(dockr); let isDragging = false, dockType = ''; // 鼠标按下开始拖动 resizerl.addEventListener('mousedown', (e) => { isDragging = true; dockType = 'l'; }); resizerr.addEventListener('mousedown', (e) => { isDragging = true; dockType = 'r'; }); // 鼠标移动,调整宽度 document.addEventListener('mousemove', (e) => { if (!isDragging || !dockType) return; const dockEl = dockType === 'l' ? dockl : dockr; // 计算鼠标相对于页面左侧的位置 const newWidth = dockType === 'l' ? e.clientX - dockEl.getBoundingClientRect().left : dockEl.getBoundingClientRect().right - e.clientX; // 设置最小和最大宽度限制(可选)240之外用思源自带拖动即可 if (newWidth >= minWidth && newWidth < 240) { dockEl.style.width = `${newWidth}px`; } }); // 鼠标释放,结束拖动 document.addEventListener('mouseup', () => { if (isDragging) { isDragging = false; dockType = ''; } }); function getNextResizeLr(el) { let sibling = el.nextElementSibling; while (sibling) { if (sibling.matches('.layout__resize--lr')) { return sibling; } sibling = sibling.nextElementSibling; } return null; } function getPreviousResizeLr(el) { let sibling = el.previousElementSibling; while (sibling) { if (sibling.matches('.layout__resize--lr')) { return sibling; } sibling = sibling.previousElementSibling; } return null; // 没找到 } }, 2000); -
[js] 好玩:模仿 obsidian 自滚动菜单,丝滑!
2025-07-30 18:08if(("ontouchstart" in window) && navigator.maxTouchPoints > 1) return; // 触碰设备跳过这个限制不起作用?
你试试这个,手机版都跳过
if(!!document.getElementById("sidebar")) return; // 手机版跳过 -
[js] 属性引用:彻底解决引用丢失问题
2025-07-30 17:05@lianhenhei @Finnsmoge @wucunwei @sunrain @hg124848 @FlyingY @EonWen
@ACai @8V9q7V @PearlLin @shaoxia @TaxolNorth @sweesalt @leeyaunlong
0.0.6 重大更新!
彻底解决全局搜索时,可能导致的搜索框失去焦点问题(0.0.6 之前虽然也解决了搜索失焦问题,但治标不治本,0.0.6 从根源抓起,彻底解决了该问题)
⚠️ 风险提醒:0.0.6 之前可能会导致全局搜索时,搜索输入框失去焦点,而预览窗口获得焦点,从而导致误输问题,建议立刻马上更新!
-
[js] 好玩:模仿 obsidian 自滚动菜单,丝滑!
2025-07-29 14:45比如插件自己实现的菜单,不是思源的 #commonMenu,就不能自动滚动。
如果作者不用插件提供的方法,自己实现,谁都没办法。这个无法避免。即使思源原生方式,如果用户不设置 overflow:auto,甚至不能滚动,这得作者自己负责。
然后就是如果插件用了 #commonMenu,但添加百十来个选项,自动滚动就会太快
这个我感觉还可以,且这种情况极少,另外 0.0.3 版我加了 maxMenuItems 参数,可设置最大菜单项数,超过指定的数目将不使用该效果。
改进后:
改进前:
-
[js] 好玩:模仿 obsidian 自滚动菜单,丝滑!
2025-07-29 14:00有的菜单自动滚动,有的又不行。
如果菜单选项多了,动一下鼠标就会越过很多选项,反而很难点中。
这两个问题什么意思?可否录屏看看?
目前和 ob 体验一致,在 ob 社区也没看到有反馈你说的问题,我相信还是可靠的。
唯一不同的是,思源无法从主菜单斜移到子菜单,但这是思源本身实现机制的原因,不用这个效果也不支持。
-
[js] 窗口宽度自适应变化(自动显示 / 隐藏侧边栏)
2025-07-28 18:40其实我觉得不用这么麻烦,即无需这么多判断,只需判断窗口宽度即可。
根据你的描述,大概有 3 种状态,1 两侧固定 2 仅左侧固定 3 两侧都不固定(隐藏)
那么只需要判断 1 和 2 即可,且仅需判断窗口宽度即可,临界值根据自己需要修改。
比如以下代码,经测试我觉得可以满足需求。
// 窗口宽度自适应变化(自动显示/隐藏侧边栏) window.addEventListener('resize', () => { // 两侧固定阈值,当窗口大于这个值时两侧固定(可根据自己需要修改) const bothFixedBreakpoint = 1100; // 左侧固定阈值,当窗口大于这个值时左侧固定(可根据自己需要修改) const leftSideFixedBreakpoint = 800; if(!!document.getElementById("sidebar")) return; // 手机版跳过 const leftPin = document.querySelector('#dockLeft .dock__item--pin'); const rightPin = document.querySelector('#dockRight .dock__item--pin'); const isPin = (pin) => !!pin.querySelector('svg use[*|href="#iconUnpin"]'); const hideDock = (dock) => { let sign = '', dockEl; if(dock === 'left') { sign = '-'; dockEl = document.querySelector('#layouts .layout__dockl.layout--float'); } else { dockEl = document.querySelector('#layouts .layout__dockr.layout--float'); } if(dockEl && !dockEl.style.transform) { // https://github.com/siyuan-note/siyuan/blob/5f0f4e3ba6aabd5af26f9879695e5b9b796b5fb9/app/src/layout/dock/index.ts#L478 dockEl.style.transform = `translateX(${sign}${dockEl.clientWidth + 8}px)`; dockEl.style.opacity = "0"; } } if(window.innerWidth > bothFixedBreakpoint) { // 两侧固定 if(!isPin(leftPin)) leftPin.click(); if(!isPin(rightPin)) rightPin.click(); } else if(window.innerWidth > leftSideFixedBreakpoint) { // 左侧固定 if(!isPin(leftPin)) leftPin.click(); if(isPin(rightPin)) {rightPin.click();hideDock('right');} } else { // 两侧都不固定(隐藏) if(isPin(leftPin)) {leftPin.click();hideDock('left')} if(isPin(rightPin)) {rightPin.click();hideDock('right');} } });
版本 2,可能这个版本更符合你的需求
// 窗口宽度自适应变化(自动显示/隐藏侧边栏) window.addEventListener('resize', () => { // 编辑器最小宽度,当窗口宽度大于编辑器最小宽度+两侧宽度时全固定,当仅容纳一个侧栏时左侧固定,否则全隐藏 const minEditorWidth = 600; if(!!document.getElementById("sidebar")) return; // 手机版跳过 const leftPin = document.querySelector('#dockLeft .dock__item--pin'); const rightPin = document.querySelector('#dockRight .dock__item--pin'); const isPin = (pin) => !!pin.querySelector('svg use[*|href="#iconUnpin"]'); const hideDock = (dock) => { let sign = '', dockEl; if(dock === 'left') { sign = '-'; dockEl = document.querySelector('#layouts .layout__dockl.layout--float'); } else { dockEl = document.querySelector('#layouts .layout__dockr.layout--float'); } if(dockEl && !dockEl.style.transform) { // https://github.com/siyuan-note/siyuan/blob/5f0f4e3ba6aabd5af26f9879695e5b9b796b5fb9/app/src/layout/dock/index.ts#L478 dockEl.style.transform = `translateX(${sign}${dockEl.clientWidth + 8}px)`; dockEl.style.opacity = "0"; } } const leftSideWdith = document.querySelector('#layouts .layout__dockl')?.offsetWidth || 0; const rightSideWidth = document.querySelector('#layouts .layout__dockr')?.offsetWidth || 0; if((window.innerWidth - minEditorWidth) > (leftSideWdith + rightSideWidth)) { // 两侧固定 if(!isPin(leftPin)) leftPin.click(); if(!isPin(rightPin)) rightPin.click(); } else if((window.innerWidth - minEditorWidth) > leftSideWdith) { // 左侧固定 if(!isPin(leftPin)) leftPin.click(); if(isPin(rightPin)) {rightPin.click();hideDock('right');} } else { // 两侧都不固定(隐藏) if(isPin(leftPin)) {leftPin.click();hideDock('left')} if(isPin(rightPin)) {rightPin.click();hideDock('right');} } });
版本 3,兼容性更好,兼容直接拖动侧边栏的情况
// 窗口宽度自适应变化(自动显示/隐藏侧边栏) setTimeout(() => { // 编辑器最小宽度,当窗口宽度大于编辑器最小宽度+两侧宽度时全固定,当仅容纳一个侧栏时左侧固定,否则全隐藏 const minEditorWidth = 600; const layoutCenter = document.querySelector('.layout__center'); if(!layoutCenter) return; new ResizeObserver((entries) => { const leftPin = document.querySelector('#dockLeft .dock__item--pin'); const rightPin = document.querySelector('#dockRight .dock__item--pin'); const isPin = (pin) => !!pin.querySelector('svg use[*|href="#iconUnpin"]'); const hideDock = (dock) => { let sign = '', dockEl; if(dock === 'left') { sign = '-'; dockEl = document.querySelector('#layouts .layout__dockl.layout--float'); } else { dockEl = document.querySelector('#layouts .layout__dockr.layout--float'); } if(dockEl && !dockEl.style.transform) { // https://github.com/siyuan-note/siyuan/blob/5f0f4e3ba6aabd5af26f9879695e5b9b796b5fb9/app/src/layout/dock/index.ts#L478 dockEl.style.transform = `translateX(${sign}${dockEl.clientWidth + 8}px)`; dockEl.style.opacity = "0"; } } const leftSideWdith = document.querySelector('#layouts .layout__dockl')?.offsetWidth || 0; const rightSideWidth = document.querySelector('#layouts .layout__dockr')?.offsetWidth || 0; if((window.innerWidth - minEditorWidth) > (leftSideWdith + rightSideWidth)) { // 两侧固定 if(!isPin(leftPin)) leftPin.click(); if(!isPin(rightPin)) rightPin.click(); } else if((window.innerWidth - minEditorWidth) > leftSideWdith) { // 左侧固定 if(!isPin(leftPin)) leftPin.click(); if(isPin(rightPin)) {rightPin.click();hideDock('right');} } else { // 两侧都不固定(隐藏) if(isPin(leftPin)) {leftPin.click();hideDock('left')} if(isPin(rightPin)) {rightPin.click();hideDock('right');} } }).observe(layoutCenter); }, 2000); -
关于 ob 和思源的界面区别的想法
2025-07-28 14:16按你的说法反而思源更好,不用打开侧边栏就可以找了,obsidian 多一步。
我觉得 ob 在于细腻,空间布局利用率高。思源界面太浪费空间了。






