第一次从预览模式进入编辑模式时,显示位置错乱的问题


遇到的问题

文档默认状态设置的是预览模式, 一种常见的使用场景是,需要查看某个文档, 然后滚动到对应想看的地方(可能是某个标题段落),此时可能发现需要对这部分内容进行修改, 然后进入编辑模式,此时显示的地方就和预览时的位置不一样了(可能是偏前了一点,也可能是偏后了一些). 此时可能还需要滚动找一下或者点击大纲重新定位下,才能找到目标编辑的位置.
但发现只有第一次从预览模式进入编辑模式时,会有位置错乱的问题, 当此时再次进入预览模式,并进行了滚动,然后再进入编辑模式, 就不会有位置错位的问题. 但是当关闭文档,重新打开,这个问题又会出现.
备注: 使用的软件版本: v1.0.3 (win10系统)

预期的效果

文件在任何时候,从浏览模式进入编辑模式,显示的文档位置是正确的,不需要自己再滚动寻找想要编辑的目标位置.

已尝试的解决方案

搜索到英文论坛有类似的问题:
Synchronizing cursor location between Edit and Preview modes 但没有找到解决办法.

尝试了一些记忆文件浏览位置的插件, 如 Remember cursor position, 但这个插件解决的是关闭文件后,下次打开文件,还在上次浏览的位置, 而不是进入编辑模式后位置错位的问题.

不知道大家有没有遇到类似的问题? 如果遇到是如何解决的?

个人选择是只用编辑模式. 以前没有实时预览的时候, 会在阅读模式和编辑模式之间切换, 后来有了实时预览, 就只用编辑模式了. 至于一些在阅读模式下才起效的插件, 渐渐也是都不用了.

有,但是基本不用阅读模式…

嗯. 如果总是在编辑模式,有点担心不小心把内容改乱了. 不过这是个习惯问题.

或许可以找找有没有插件能锁住文件避免编辑, 这方面还真没想过.

想到了一个用autohotkey解决的方案, 实现后满足需求了.

1 个赞

能分享下ahk的脚本么, 感谢.

具体思路是:

  1. 先判定当前的状态,如果是编辑状态,则只发送在obsidian中设置的阅读与编辑切换快捷键.

判定当前状态,是为了能和原有的使用方式一样: 即用同一个快捷键在阅读和编辑状态切换.
这里花费了一些力气,最终找到了一种比较好的解决方案,即用一个Acc库,来获取光标的状态.

  1. 如果是阅读状态,则先进行复制,获取到一个目标标的文本,然后发送设置的阅读与编辑切换快捷键, 然后发送Ctrl+F 在当前页面搜索目标标的.

对应的autohotkey代码如下(注意文件编码需要是gbk):

#Include Acc.ahk

#If WinActive("ahk_exe Obsidian.exe")
{
!x::
	Acc_Caret := Acc_ObjectFromWindow(WinExist("ahk_class Chrome_WidgetWin_1"), OBJID_CARET := 0xFFFFFFF8)
	if(Acc_State(Acc_Caret) = "正常")
	{
		send !+x
		
	}
	else{
		old_Clipboard := Clipboard
		Clipboard := ""
		send ^c
		send !+x
		If(Clipboard)
		{
			Sleep,300
			send ^f
			Sleep, 100
			send ^v
			Clipboard := old_Clipboard
			Sleep, 200
			send {Esc}
			Sleep, 1500
			send {Right}
		}
		else
		{
			Clipboard := old_Clipboard
		}	
	}
   return
}

这里使用了Acc.ahk 库, 主要是用来获取obsidian中当前文档的状态(编辑或预览). 另外我添加了一个obsidian中的阅读和编辑快捷键为Alt+Shift+x. 如果在阅读状态需要编辑某段文本, 鼠标选中一部分(有区分性的),按autohotkey中指定的快捷键(上面我指定的是Alt+x),就可以进入到对应位置的编辑状态了.

Acc.ahk 的链接: Autohotkey-scripts-.ahk/Acc.ahk at master · Drugoy/Autohotkey-scripts-.ahk · GitHub

2 个赞

但是像脚注和折叠块这样的源码只能在预览模式才能渲染出来哎 ::

注脚我以前也常用, 后来都舍弃了. 自己的笔记没必要走文献的格式, 注脚完全可以不用, 而且如果注脚内容过长既不美观编辑起来也不方便. 我现在行文的段落全都是列表, 又方便折叠, 又方便做缩进笔记, 又方便逐段引用. 另外折叠也可以用官方支持的callout.

老哥,用久了发现ob很多的设计都是依赖这个阅读模式才能渲染的,这个实时阅览模式功能砍的太厉害了,有不少语法都渲染不出来,和预览模式差太多

确实有很多插件都是只在阅读模式下工作的, 但ob自带的功能里, 好像没啥是非阅读模式不可的吧.
而对于那些插件, 我是都弃用了, 毕竟来回模式切换视域反复横跳实在太恶心了.

是的是的,我都有点不太理解ob为啥要做这个模式了,感觉和阅读模式重复了但是又比阅读模式差很多。ob自带功能里,除了脚注和html语法渲染比阅读模式差很多外,再就是白板要强制你使用阅读模式而不能选择实时阅览模式