[求助] 怎么配置whitespace包显示零宽空格?

主要还是用于在org文件中标记中文,论坛中提供了一些方法,比如

不过过滤空格的正则不太容易写,有些情况容易考虑不到。还有

使用org-extra-emphsis包,我用的时候好像有个什么warning,每次导出都提示‘org-odt-extra-styles’ and ‘org-ods-automatic-styles’ is updated for this session

我想重回零宽空格方案,但不想用org-extra-emphsis。我用的是doom-emacs,对whitepsace包的配置是

(setq whitespace-display-mappings
      '((tab-mark ?\t [?› ?\t])
        (newline-mark ?\n [?¬ ?\n])
        (space-mark ?\  [?·] [?.])
        (space-mark ?\u200B [?\u2423])))

在org-mode中查看whitespace-display-mappings这个变量,显示为

((tab-mark 9
           [8250 9])
 (newline-mark 10
               [172 10])
 (space-mark 32
             [183]
             [46])
 (space-mark 8203
             [9251]))

但好像不工作,无法显示零宽空格。

(setq whitespace-space-regexp "\\( +\\|\u200b\\)")
(add-to-list 'whitespace-display-mappings '(space-mark #x200b [?▾]))
1 个赞

好像还是不能显示,不知道doom-emacs有什么特别的处理。复制你的代码,设置后变量的值为

((space-mark 8203
             [9662])
 (tab-mark 9
           [8250 9])
 (newline-mark 10
               [172 10])
 (space-mark 32
             [183]
             [46]))

whitespace-space-regexp值为"\\( +\\|​\\)",好像又被override了。doom-emacs中没有搜到配置这个变量,不知道又是在什么地方配置的,原来helpful可以显示变量在哪里被引用了,不过还是没有找到:

虽然,贴子中具体问题没有解决,但我把org-extra-emphsis中intraword emphasis相关代码单独提取出来了,够我用了。

下结论之前最好先验证。作为一名 Emacser,会用 Emacs -Q 并编写最小测试代码是基本要求。

image

$ emacs -Q --eval "\
(progn
  (require 'whitespace)
  (setq whitespace-space-regexp \"\\( +\\|\u200b\\)\")
  (add-to-list 'whitespace-display-mappings '(space-mark #x200b [?▾]))
  (let ((zero-width-space \"\u200b\"))
    (insert \"foo\" zero-width-space \"bar\"))
  (whitespace-mode))"

没有人有义务/能力帮你解决你配置中的问题。

我的意思不是你的代码不对,我原帖中也说了,可能是doom-emacs哪里设置了。我以后弄个空白的配置,专门测试用。

我又看了一下,其实没有被override,值显示就是零宽空格,不是显示\u200b,误导了我以为被override了。

我同意你,也不会认为谁有义务帮助谁,大家都是空闲时间友情帮忙,所以我也自己找问题,原先我以为whitespace-space-regexp被override了,在.emacs.d和.doom.d文件搜索这个变量,没有发现除 这两个地方以外对这个变量赋值的,所以问题就暂时搁下了。

主要还是因为没有用emacs -Q测试的习惯/意识。我之前基本最多用纯净版的doom-emacs测试,这次也是doom-emacs配置的问题。我的想法是,如果有谁之前正好遇到过这种问题,或者凭借经验指点一下可能的问题,比一点点查找要快的多(很大可能我就找不到问题源头,doom-emacs 的module问题还可以一点注释掉,写在doom-emacs core里面的代码就不知道怎么排查)。感谢建议。

我也用doom一段时间了,doom确实很好用,主要是它其实并不只是一个configuration framework,doom实际上基于各个包自己实现了很多的额外的函数功能。比如 org 的折叠, za,zm,zr 这些 对应 vim 的折叠功能的 keybinding, 我查了一下发现对应的命令实际上都是 doom 自己实现的,而不是我以为只是帮你把 evil-collection,evil-org 之类的东西简单的做一下配置。

但是问题也是很明显的,如果要overriding doom的配置很麻烦,主要是很多常用的 with-eval-after-load 之类的东西都不能用,因为可能会和doom自己的配置打架,有的时候也心累。

等过段时间稍微有点精力,以及对 elisp 更熟悉一些了,打算从头搞自己的配置了,准备把自己使用的doom的modules的内容都看情况搬过来,至于core核心,启动优化的那些部分就太复杂了,打算找一些别人的自用的,不是按照框架标准来配置的抄一抄 (比如purcell,redguardtoo等自用配置的),doom的elisp代码有4万多行,真的复杂度有点太大了 (作为对比,prucell的emacs的配置是2000多行elisp)。