隐藏frontmatter段的CSS代码

能出一个ii轻版本,只包括禅模式和执行javascript代码片段?把禅模式的进入和退出,加到右键菜单里。
BTW: 禅模式,似乎对移动端没有作用。

移动端目前不支持,感觉手机端的使用场景不多;ii的所有功能都可以通过设置里的开关关闭;右键菜单推荐commander插件,这个插件功能很强大,不仅仅是右键菜单,你想加到哪里都可以。

commander 我有使用。安卓端似乎调不出右键菜单。

/输入命令我在设置里禁用了,我试度开启这个看看效果。

手机端右键菜单都调不出吧,你可以加到右侧这个菜单里,在手机端就方便调用了。

image

或者加到左侧ribbon那里也可以。

看了你的代码,受到启发,是否也可以实现文档阅读位置保存到属性里,流程大概这样:
激活leaf时,若文档属性里有保存cursor位置,就调用
app.workspace.activeLeaf.setEphemeralState(cursorstate);
恢复编辑阅读位置;
若关闭leaf或离开leaf时,调用
cursorstate = app.workspace.activeLeaf.getEphemeralState();
把cursorstate保存到文档属性里。

这样,即使是用同步工具,也可以保证跨平台,恢复到阅读位置。

又,由于dataviewjs聚合时,不适合这样保存和恢复位置,加个排除列表,比如排除指定目录的文档,不保存和恢复位置。

手机端我有使用commander在page header添加命令按钮,和在file menu里添加。
但我往page header添加多几个按钮时,竖屏下那个三点按钮会不显示出来。
讨论在这里:

能通过js调整吗?

右键菜单没有快速打开和关闭禅模式的选项,配置里也没有。
每次用ctrl-p iiz不太方便。

有个问题,有时需要左右分屏,对照文档编辑。
右击一个leaf,选择左右分屏,被自动关闭了。

试取消注释也不成:
//leaf.parent.id === activeLeaf.parent.id &&

别加到header里,加到菜单里(右上角那个,点开菜单),如下:
image

这个功能还可以设置仅在手机或pc显示等,你研究下,可以不同端显示到不同的地方,方便使用。

右键菜单没有快速打开和关闭禅模式的选项,配置里也没有。
每次用ctrl-p iiz不太方便。

配合commander添加命令到你想要的地方或者设置快捷键。

如果需要左右分屏,去掉这个可以的,但你要重启下obsidian,因为这个js是匿名函数,你修改后会在内存生成一个副本,之前的代码还是会存在的,后面如果修改ii插件的话考虑通过赋值变量覆盖的方式试试。

明白了,我也试验出来了。

关于阅读位置跨平台和保存。

remember cursor position这个插件应该支持跨平台的。

你要自定义话可以参考下它的代码,保存的话,他是保存到文件中,不建议保存到文档属性中,建议按照remember cursor position的方式存储到文件中,它这个文件默认是保存到.obsidian/plugins文件目录下,如果不方便同步配置文件的话,可以在插件配置里修改保存文件路径。

排除的话应该在restoreEphemeralState()函数里,根据文件名或目录跳过即可。

插件源码:obsidian-remember-cursor-position/main.ts at master · dy-sh/obsidian-remember-cursor-position · GitHub

windows下,如何方便编辑调试,github上的项目?给个详细指引,打算以后就在obsidian平台上做些自己的个性化需求,现在在obsidian写改代码都很不方便。半甲子之人了,玩不动新事物了。

remember cursor这个插件,刚接触obsidian就用上了,也把它保存的文件改到vault root下了。
但似乎这个文件修改频繁,同步时总是冲突。所以,一直想改下,把位置保存到各个md里。

其实,我是想不要太多插件,比如ii一个插件加js片段能搞定的,就不多安装一个。

好吧,其实建议不用太纠结的,毕竟多端同步阅读位置的场景很少见,而且,不同的视窗大小下,能确保滚动条位置高度一致吗?比如同样是高度10,pc端的文本内容显示的位置肯定和移动端是不同的。

我通过你给到的实现方式,实现了把位置信息保存到frontmatter中,但感觉手机和pc同步应该不是很理想,你可以测测看,就像我上面说的那样,代码如下:

this.app.workspace.onLayoutReady(() => {
	// 不包含的文件或文件夹
	const excluding = [
		'Demo2.md',
		//'tools/',
	]
	let stTimer;
	this.app.workspace.on('active-leaf-change', async (activeLeaf) => {
		// 定时防止无效触发,只取最后一个触发
		if(stTimer) clearTimeout(stTimer)
		stTimer = setTimeout(() => {
			// 获取文件路径
			const filePath = activeLeaf?.view.getState().file
			if (!filePath) return;
			// 排除文件或文件夹
			if (excluding.some(e => filePath.includes(e))) return;
			// 排除非markdown视图类型
			const viewType = activeLeaf?.view.getViewType();
			if('markdown' !== viewType) return;
			// 获取文件对象
			const file = this.app.vault.getFileByPath(filePath);
			if(!file) return;
			// 获取frontmatter
			const frontmatter = this.app.metadataCache.getFileCache(file)?.frontmatter
			let state = ""
			if (frontmatter) {
				// 如果frontmatter有state字段,则解析并恢复阅读位置
				state = frontmatter?.state
				if (state) {
					state = JSON.parse(state)
					if (state) {
						activeLeaf?.setEphemeralState(state)
					}
				}
			}
			// 如果第一次进入,先赋值为空对象
			if(!state) state = {}
			// 定时获取阅读位置
			window.setInterval(async () => {
				// 获取当前叶子的阅读位置
				const newState = await activeLeaf?.getEphemeralState()
				// 如果当前叶子没有阅读为空,则不保存
				if (Object.getOwnPropertyNames(newState).length === 0) return
				// 如果上次阅读位置为空,则新增state字段
				if(Object.getOwnPropertyNames(state).length === 0) {
					//pass
				}
				// 如果上次阅读位置和当前叶子的阅读位置相同,则不保存
				else if (
					newState.cursor && state.cursor &&
					newState.cursor.from && state.cursor.from &&
					newState.cursor.from.line === state.cursor.from.line &&
					newState.cursor.from.ch === state.cursor.from.ch &&
					newState.cursor.to && state.cursor.to &&
					newState.cursor.to.line === state.cursor.to.line &&
					newState.cursor.to.ch === state.cursor.to.ch &&
					newState.scroll && state.scroll &&
					newState.scroll === state.scroll
				) {
					return
				}
				// 把新的位置赋值给上次的阅读位置以方便后续对比
				state = newState;
				// 如果新的阅读位置和上次的阅读位置不同,则保存
				this.app.fileManager.processFrontMatter(file, (frontmatter) => {
					frontmatter['state'] = JSON.stringify(newState);
				})
			}, 500)
		}, 42);
	})
});

windows下,如何方便编辑调试,github上的项目?给个详细指引,打算以后就在obsidian平台上做些自己的个性化需求,现在在obsidian写改代码都很不方便。

想在别人的代码上修改,建议先安装vscode和git;注册github账号;然后就可以通过git clone把别人的项目下载到本地了;然后用vscode打开目录,在vscode终端窗口中输入 npm install && npm run dev就可以开发了(有些可能用的yarn和npm类似);为了方便开发建议安装Hot Reload热加载插件。

插件开发中文文档:声明 | Obsidian 插件开发文档

插件开发英文文档:https://docs.obsidian.md/Home

其实,我是想不要太多插件,比如ii一个插件加js片段能搞定的,就不多安装一个。

我觉得工具就是辅助作用的,方便使用的时候就用,不用的时候就关闭,不用纠结太多,其实,如果执行js片段的话,runjs插件更方便。我之前也想过开发类似mysnippets的js代码片段的插件,后来想想runjs已经足够优秀了,没必要重复造轮子,而且代码片段的功能还没有runjs功能多。所以,如果你的js片段较多的话,还是建议用runjs。

有需要时我研究下runjs.

关键是国内github不好用,不知那些镜像服务是否也可以替代使用?
obsidian有个vscode插件,有无试过?有无必要使用?
vscode有无轻量化版本,推荐个版本下载。

BTW:
ii或runjs执行js片段,和插件相比,是否前者效率更高些?
我看你的ii里有css片段,是否是用来替换系统的css片段加载功能?效率更高吗?

我vscode没装obsidian插件,感觉应该是代码提示吧,但我使用当中感觉提示已经足够了,可以安装一些ai智能提示,比如通义灵码,对一些重复性高的代码,还是很方便的,vscode应该没有轻量级,它有web版,但功能有限。

github日常访问建议stream++加速,如果是npm和git命令建议使用国内镜像加速。

代码片段和插件相比性能差不多,差别可以忽略,但插件毕竟比代码片段多了一些代码理论上是多耗费点资源,但这个差别极小。插件比代码片段的api更丰富一些。但也有相关解决办法,就是较麻烦一些。

css片段和系统的css片段原理应该是一样的,就是把样式代码插入到浏览器当中,只不过ii读取的是配置文件中的内容,这个差别微乎其微,不好衡量。

runjs的好处是方便管理代码片段,看起来更清晰方便,但需要把你需要自动加载的代码加入到自动执行的配置中。