org 的 inline src block 退出编辑模式后光标位置错误

使用行内 src_latex{test} 时,如果用 C-c '打开编辑 buffer,那么用 C-c '关闭编辑 buffer 时,光标会移动到 src_latex{test} 的范围以外(正常情况下应该在范围内),不知道大家是不是这种情况?

org 使用的是最新版本的 org plus contrib (Org mode version 9.0.5 (9.0.5-elpaplus @ /home/neoarch/.emacs.d/elpa/org-plus-contrib-20170210/))

希望大家帮我测试一下,我的包 org-edit-latex 因为这个 bug 导致行内 latex 无法正确处理,谢谢!

活捉一条 orgmode 的 bug

orgmode 要是托管到 github 就好了,提交 issue 也不用那么麻烦

我现在可以完整的重现这个 issue,并且也大致了解造成此种情况的原因,但是无法修复,因为 org 的代码太复杂,牵一发而动全身。

重现步骤:

1 在 orgmode 中单独另起一行输入如下:

src_latex{test}mmmmmmmmmmmmmmmmmmmm

后面的字母 m 是用来占位的。

2 将光标置于 inline src block 之上,比如放在 “test” 的字母 “e” 上面,按 C-c ’ 进入编辑模式 3 按 C-c ’ 退出编辑模式,然后发现光标位于到数第四个 “m” 上面。

提交bug,直接发邮件到 orgmode-devel 邮件列表就可以了

1 个赞

只能如此了,我只能暂时地在 readme里加上一条:因为上游bug,暂时不要用它来编辑行内公式。

我没有向 org 提交 issue,因为我觉得那样太慢了。

而是自己做了临时修复。解决方法非常简单,但是花费我一下午的时间才找到。利用 advice,在调用 org-edit-src-exit 时,令变量 org-src--remote 的值为 t 就行了!这样的话退出 edit buffer 时光标会直接回到起点。然后加一个判断语句令它只对 inline-src-block 生效就好了。

我现在把它推送到 github,估计过两三个小时就可以从 melpa 上下到了,happy hacking!

所以用我这个包的一个额外效果,就是自动修复了 org 的一个 bug!哈哈!

你这样随便用advice会被怼的。 你应该先提issue,然后在README里面说明,提供你的修复,不该直接在包里上advice。

1 个赞

没有什么负面效果的,可以用 minor mode 开启关闭,关闭时没有任何效果。

BTW,那个minor mode 开启关闭是 purcell 大神亲自发的PR :smile:

不用担心,我没有做任何实质性的修改,只是利用了 orgmode 里的一个机制,即 org-src--remote 变量值为 t 的时候,退出编辑模式光标会移动回起点。而且我只对会出现问题的 inline src block 的退出做了修改。

现在的效果终于让我满意了,现在不管是不是 Inline 都可以打开 buffer 编辑,很爽。

虽然过程比较 hacky,但是学了不少东西。

只是对于这个现象是否属于bug,然后如果是bug被修复以后应该如何处理的一个建议。毕竟考虑到Org的更新问题,可能有些用户还是用原先的版本。不过到那个时候再考虑也不迟。

看起来这的确是个很有趣的包。虽然我对TeX没有什么需求,我还是准备弄一个玩玩。

1 个赞

这个应该是 bug 无疑,你可以用我上面的重现步骤试一下就知道了。 @tumashu 大神按照我的步骤也重现了这个 bug 。

而且我为了 debug 看了 org 的内部函数,出现这个问题的原因就是其中的座标函数出了问题,返回的座标不能令光标回到正确的位置(只针对 Inline Source Block)。

你这属于走歪路,和自己过不去,org master 修复后,就不需要你操心这个 bug 了, 你如果在自己的包里面用 advice 修复bug, 你的不停的检测。。。。。

我已经把影响降到最低了,即使 bug 被修复,我这个 patch 的唯一影响就是: inline src block 的光标不管退出 edit buffer 之前的光标位置在哪里,都回到 src block的起点,如果你不留意的话,这点影响是可以忽略不计的。

附上我的 patch:

真正的核心部分只有两行:

另外,我感觉短时间内这个 bug 不会被修复,先凑合一下吧:hugging: 。等它被修复的那一天,说不定编辑 embedded latex 这个功能也已经被 org 官方支持了,也就不需要我这个包了 :joy:

你可以临时hack,处理这个bug,但同时应该给 orgmode-devel 发邮件,描述这个bug,估计不出1周,这个bug就修复了,等过一年半载,你在去除hack的代码,emacs社区需要合作,为什么 org 主社区国人很少,可能就是因为国人大多数都有嫌麻烦吧。。。。

org-mode 要是托管在 github 上,肯定不是现在这种情况。跟它的 logo 一样,它真的是一只独角兽。

我以前给 org 发过邮件,然后。。。然后就没有然后了,石沉大海,所以我觉得 org 这种方式不利于 issue tracking.

当然,也可能是我自己的问题,我再发一个试试吧。

各个社区都有各个社区的传统和习俗,org-mode 既然是 gnu 项目,就不可能托管到 github