xung
(cx)
1
遇到的问题
文档默认状态设置的是预览模式, 一种常见的使用场景是,需要查看某个文档, 然后滚动到对应想看的地方(可能是某个标题段落),此时可能发现需要对这部分内容进行修改, 然后进入编辑模式,此时显示的地方就和预览时的位置不一样了(可能是偏前了一点,也可能是偏后了一些). 此时可能还需要滚动找一下或者点击大纲重新定位下,才能找到目标编辑的位置.
但发现只有第一次从预览模式进入编辑模式时,会有位置错乱的问题, 当此时再次进入预览模式,并进行了滚动,然后再进入编辑模式, 就不会有位置错位的问题. 但是当关闭文档,重新打开,这个问题又会出现.
备注: 使用的软件版本: v1.0.3 (win10系统)
预期的效果
文件在任何时候,从浏览模式进入编辑模式,显示的文档位置是正确的,不需要自己再滚动寻找想要编辑的目标位置.
已尝试的解决方案
搜索到英文论坛有类似的问题:
Synchronizing cursor location between Edit and Preview modes 但没有找到解决办法.
尝试了一些记忆文件浏览位置的插件, 如 Remember cursor position, 但这个插件解决的是关闭文件后,下次打开文件,还在上次浏览的位置, 而不是进入编辑模式后位置错位的问题.
不知道大家有没有遇到类似的问题? 如果遇到是如何解决的?
个人选择是只用编辑模式. 以前没有实时预览的时候, 会在阅读模式和编辑模式之间切换, 后来有了实时预览, 就只用编辑模式了. 至于一些在阅读模式下才起效的插件, 渐渐也是都不用了.
xung
(cx)
4
嗯. 如果总是在编辑模式,有点担心不小心把内容改乱了. 不过这是个习惯问题.
或许可以找找有没有插件能锁住文件避免编辑, 这方面还真没想过.
xung
(cx)
6
想到了一个用autohotkey解决的方案, 实现后满足需求了.
xung
(cx)
8
具体思路是:
- 先判定当前的状态,如果是编辑状态,则只发送在obsidian中设置的阅读与编辑切换快捷键.
判定当前状态,是为了能和原有的使用方式一样: 即用同一个快捷键在阅读和编辑状态切换.
这里花费了一些力气,最终找到了一种比较好的解决方案,即用一个Acc库,来获取光标的状态.
- 如果是阅读状态,则先进行复制,获取到一个目标标的文本,然后发送设置的阅读与编辑切换快捷键, 然后发送
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
1 个赞
yylicon
(nelbor)
9
但是像脚注和折叠块这样的源码只能在预览模式才能渲染出来哎 ::
注脚我以前也常用, 后来都舍弃了. 自己的笔记没必要走文献的格式, 注脚完全可以不用, 而且如果注脚内容过长既不美观编辑起来也不方便. 我现在行文的段落全都是列表, 又方便折叠, 又方便做缩进笔记, 又方便逐段引用. 另外折叠也可以用官方支持的callout.