求助org-capture跟whitespace mode冲突的解决思路

请问各位大佬提供一下解决org-capture跟whitespace mode冲突的解决思路

背景

想照着这里做一个整理代码链路的工作流,思路是通过org-mode的clock,把org-capture内容动态写入到当前的clock文件里

问题

功能倒是很快糊出来了,就是目标的org mode文件里的代码高亮不工作。而且更加神奇的是光标所在行以及往上的行显示是正确的

重新调用一次(org-mode)可以修好高亮,但是插入新内容之后还是有问题

排查

把全部配置去掉之后,写了一个最小的复现配置。只用了whitespace,which-func跟org-capture

  • 打开一个org文件,在任意标题org-clock-in
  • 打开任意程序选中一段,然后org-capture-code
最小复现代码
(require 'which-func)

(use-package whitespace
  :ensure nil
  :hook
  ((prog-mode text-mode) . whitespace-mode)
  :init
  (progn
    (setq whitespace-style '(face tabs empty trailing))))

(use-package org-capture
  :ensure nil
  :config

  (add-to-list 'org-capture-templates
               `("cl" "Link to Code Reference to Current Task"
                 plain (clock)
                 "%(format-org-capture-code-block \"%F\")"
                 :empty-lines 1 :immediate-finish t))

  ;; https://github.com/howardabrams/hamacs/blob/5182b352cd2d4e03d18b5a37505db64e1fdf1f62/ha-org-clipboard.org
  (defun format-org-capture-code-block (filename)
    (with-current-buffer (find-buffer-visiting filename)
      (let* ((org-src-mode (replace-regexp-in-string "-mode" "" (format "%s" major-mode)))
             (func-name (which-function))
             (extracted-text (buffer-substring (region-beginning) (region-end)))
             (file-name   (buffer-file-name))
             (file-base   (file-name-nondirectory file-name))
             (line-number (line-number-at-pos (region-beginning)))
             (initial-txt (if (null func-name)
                             (format "From [[file:%s::%s][%s]]:"
                                     file-name line-number file-base)
                           (format "From ~%s~ (in [[file:%s::%s][%s]]):"
                                   func-name file-name line-number
                                   file-base))))
        (format " %s
#+begin_src %s
  %s
#+end_src" initial-txt org-src-mode extracted-text)))))

(defun org-capture-code (&optional start end)
  "Send the selected code to the current clocked-in org-mode task."
  (interactive)
  (org-capture nil "cl"))


Debug

我本来想用describe-face看看当前的face是什么,但是光标到哪里哪里就正常 :melting_face:

试过font-lock-flushdelete-overlay,但是不管用。以下为录屏,求大佬们提供个解决思路。当然了报bug也是个思路(逃

repro

补充一点,这个黄的区域只会由org-capture触发。如果手打一段代码块是没有问题的

  1. 是不是选中状态?

用下 (deactivate-mark) ?

  1. (buffer-substring START END) 改用 (buffer-substring-no-properties START END) ?

应该不是选中,上面的才是选中的face

光标以及光标往上的face是正常的。此时mark了From main.tsimport $

(deactivate-mark)没有效果


也试了buffer-substring-no-properties,同样没有效果。如果把whitespace mode关掉那(buffer-substring START END)是可以正常工作的

可以在 whitespace.el 里找找 defface

M-x whitespace-toggle-options 能直接调整一些开关,或者改 whitespace-style 看是其中哪个导致的,可以先 (setopt whitespace-style nil) 确定有没有效,再二分法加回来

1 个赞

文件中有不可见的 “$"

运行你的代码后,文件行结尾就有这个 “$”.

whitespace-style 的问题,好像是 trailing。 默认值就有这个问题。和你代码没太大关系。

仔细思考一下, 人家可能就是这样设计的,有些人需要这个 style 吧。

确实只有这么设了才会出问题(setq whitespace-style '(face empty))

应该是这个face没错了

那个$是不是就是文件结尾空行?

repro2

我今天发现如果有两个标题夹着就不会出问题,不知道是不是有什么关联