Org-mode 中文行内格式化的问题

我也是使用的spacemacs,把上面的配置放在自己layer/config.el里面是没有问题的。然后再是eval after load,没有出现问题。

还好导出html是正常的,只是在org里渲染不正常。

另外还有一个无法解决的问题:行内代码。 org-mode用 =代码= ~代码~ 来表示行内代码。但是代码经常有等号,即使用 ~代码~ 这种格式来表示,代码里有个单引号也会挂掉。

如果只是想用orgmode输出HTML作为博客,那我找到一种方案: 用HTML引用。 就是用@@HTML:开标签/闭标签@@ 来包裹标签。

另外有一个问题就是链接格式化的问题,为什么链接的格式化会往后延?如上图,只有第一个“豆瓣FM”是链接,结果链接的样式延生到后续的所有文本。我找了org-mode手册里的链接相关的资料,没有讲到这方面的问题。

因为 Org 没有考虑到中文的习惯,需要在 [[]]后面加个空格。

加空格我知道,我现在就是加空格。不过,有点丑。

好在导出html的时候,不会有这种“延伸”。

除此之外还有什么方法吗?

那就只能 hack on Org。不然就用 Markdown 之类的别的。 我记得 melpa 上面有个 org-chniese,集成了一些针对中文的 hack,里面就有解决导出 html 的问题。

可以问问 Org 方面,感觉可以当作一个 Bug(?),因为链接后面的文字,即便没用空格隔开也完全没有必要高亮。

[[link][description]]FOOBAR
                     ^^^^^^

org-submit-bug-report中

link 的问题要是能解决真是造福广大中文用户了,我都是自己 hack 解决的。

找到一个org-chinese-utils,在导出html的时候,会替换标记前后的空格。还不错!but,不会替换链接之后的空格。

关于 “Org 链接后面不加空格高亮有问题”,Org 的邮件列表上 Kaushal Modi 给出了一个 work-around

(setq org-highlight-links (delete 'plain org-highlight-links))

我试了下能解决问题,但是副作用是会把 plain link 的高亮取消掉。

/cc @et2010 @LdBeth

3 个赞

在org-mode中,有下标的时候会改变行高,这个可以设置吗?如何才能等高?

改变行高看着就不舒服了。

最新版的 org-mode 通过设置变量 org-emphasis-regexp-components 来支持中文行内格式化的方法貌似已经没用了。

Org mode version 9.2.3 (9.2.3-17-g4df705-elpaplus @ /home/james/.emacs.d/elpa/26.2/develop/org-plus-contrib-20190513/)

有同学碰到相同的问题吗?

org-chinese-utils 感觉好像是我写的,后来删库了,现在还能找到?

1 个赞

偶然在 Org-mode 的手册里发现了一个 zero width space,可以解决中文两边必须有空格的问题,同时不会影响展示效果(Spacemacs)。

使用方法:在需要插入空格的地方输入

C-x 8 <RET> zero width space <RET>

链接:Escape Character (The Org Manual)

4 个赞

在orgmode里开启goto-address-mode就可以高亮URL了

5年过去了……有更好的解决方案了吗?:joy:

我也想知道现在有没有更好的办法解决org-mode中文行内格式化的问题。

最近有了新思路:

先 selection 要 markup 的字段,然后键入相应的 markup 符号,自动在其前后插入 zero width space. 副作用是光标经过 zero width space 时会变细,不过不影响整体美观,操作也比较方便。

;;;###autoload
(defmacro org-surround-markup (&rest keys)
  "Define and bind interactive commands for each of KEYS that surround the region or insert text.
Commands are bound in `org-mode-map' to each of KEYS.  If the
region is active, commands surround it with the key character,
otherwise call `org-self-insert-command'."
  `(progn
     ,@(cl-loop for key in keys
                for name = (intern (concat "unpackaged/org-maybe-surround-" key))
                for docstring = (format "If region is active, surround it with \"%s\", otherwise call `org-self-insert-command'." key)
                collect `(defun ,name ()
                           ,docstring
                           (interactive)
                           (if (region-active-p)
                               (let ((beg (region-beginning))
                                     (end (region-end)))
                                 (save-excursion
                                   (goto-char end)
                                   (insert ,key)
                                   (insert-char #x200b) ;; Insert zero width space to make inline markup work.
                                   (goto-char beg)
                                   (insert-char #x200b)
                                   (insert ,key)))
                             (call-interactively #'org-self-insert-command)))
                collect `(define-key org-mode-map (kbd ,key) #',name))))

(org-surround-markup "~" "=" "*" "/" "_" "+" "$")

Evil 用户可以用 evil surround 来搞定。

(use-package evil-surround
  :after evil
  :config
  (global-evil-surround-mode 1)
  ;; Use non-spaced pairs when surrounding with an opening brace.
  ;; Insert zero width space for org inline markup.
  (evil-add-to-alist 'evil-surround-pairs-alist
                      ?\* '("\x200B*" . "*\x200B")
                      ?\+ '("\x200B+" . "+\x200B")
                      ?\/ '("\x200B/" . "/\x200B")
                      ?\~ '("\x200B~" . "~\x200B")
                      ?\= '("\x200B=" . "=\x200B")
                      ?\$ '("\x200B$" . "$\x200B")
                      ?\_ '("\x200B_" . "_\x200B")))

参考:

  1. GitHub - alphapapa/unpackaged.el: A collection of useful Emacs Lisp code that isn't substantial enough to be packaged
  2. org mode - Mark up only part of a word - Emacs Stack Exchange
3 个赞