内联逐字记录和带Org模式下的引号的代码


37

在组织模式下,我可以用=或包围文本,以内逐字或代码模式~放置文本。

但是,如果文本带引号,则此操作将失败,并且我在文档中找不到解释或解决方法。

例如:

  • =hello= 逐字呈现
  • ~hello~ 渲染为代码
  • =hello'= 无法逐字呈现
  • ~hello'~ 无法呈现为代码

到目前为止,我发现的唯一解决方案是插入不可见的字符,例如键入C-x 8 <RET> 200b <RET>,如本问题所述

为什么会这样(这是一个错误?),如何在不插入不可见字符的情况下避免此问题?

Answers:


47

首先:这是Emacs。这不是错误,而是设置!

其次,@ glucas正确地说您需要修改org-emphasis-regexp-components以获得所需的内容。但是,我想对他的(@Malabarba)代码提出两个修改建议,并提供更多的上下文信息:

  1. 您无需将整个值复制org-emphasis-regexp-components到init文件中即可修改单个组件。对于您的用例,以下足够了:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. 你不必须修改org-emphasis-regexp-components加载之前org-mode通过(require 'org)。修改后只需添加以下行:

    (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)

更多背景

如果您想自定义强调标记的工作方式的其他方面,请了解以下几点org-mode

的值org-emphasis-regexp-components是一个包含五个条目的列表。

  1. 第一个条目控制允许哪些字符紧接在标记字符之前。如果您希望能够why=hello=正确渲染,则需要修改该条目。

    (setcar org-emphasis-regexp-components "...")
  2. 第二个条目控制允许哪些字符立即跟随标记字符。如果您希望能够=hello=there正确渲染,则需要修改该条目。

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. 第三个条目指定字符不会允许作为边界字符,即字符紧跟开口标记字符或先关闭标记字符。您需要对其进行修改,以使诸如='hello'=渲染之类的事情能够正确进行。

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. 第四个条目列出了标记的字符串正文中允许的字符,即出现边框字符之间的字符。您几乎不需要修改它;默认情况下,任何字符都可以用作正文字符。

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. 第五项指定标记的表达式中允许多少换行符。默认情况下,org-mode允许单个换行符。因此,如果您希望能够向跨超过两行的文本添加标记,则需要修改此条目。

    (setcar (nthcdr 4 org-emphasis-regexp-components) N)

    ... N您要允许的换行数量在哪里。

相关文章

人们似乎相当频繁地遇到这个问题。除了您提到帖子外,关于StackOverflow至少还有两个问题处理非常相似的问题:


7
我支持您的答案,但也要对答案的质量表示赞赏。
Kaushal Modi

谢谢@itsjeyd,如果Emacs完全加载了我已经打开的缓冲区后我以交互方式运行这两行,那么效果很好。但是,很奇怪的是,"Symbol's value as variable is void: org-emphasis-regexp-components"即使将这两行放在.emacs文件的底部,我也碰到了。有什么想法为什么会这样呢?
Amelio Vazquez-Reina 2015年

@ AmelioVazquez-Reina欢迎您:)为了确保:(require 'org)在对以下.emacs文件进行任何自定义之前,您是否在文件中org-emphasis-regexp-components
itsjeyd 2015年

1
@ AmelioVazquez-Reina很高兴现在一切都对您正常:)您的观察是正确的-您不需要(require 'org)在init文件中就可以使用它。如果不这样做,那么在以下情况下,Emacs会自动加载它:(a).org在当前会话中首次打开文件,或(b)M-x org-mode在当前会话中首次手动通过模式启用文件,或(c )还原包含至少一个.org文件的已保存桌面时。(续)
2015年

1
@ AmelioVazquez-Reina(续)问题是:Emacs 不会org-mode自动加载,只是因为您在init文件中对其进行了一些自定义。这就是为什么(require 'org)在自定义其任何变量之前需要这样做的原因。如果不完全加载模式,Emacs将不知道如何处理诸如org-emphasis-regexp-components;之类的变量。当Emacs第一次遇到它们时,它们没有被定义,因此Symbol's value as variable is void消息。
itsjeyd 2015年

11

有一个简单得多的选项:使用内联源代码块

src_python{hello'}

这对于引号之类的字符没有问题,并且为内联代码提供了语法突出显示功能。

要在导出时包括内联源代码,您需要将此声明添加到标题中:

#+PROPERTY: header-args :exports code

1
这是一个很好的提示!非常高兴获得内联代码的语法高亮!
与Shon

这很棒!它使我想起了乳胶(:
Chris.Q,

7

您可以org-emphasis-regexp-components按照本博客文章中 @Malabarba所述删除引号字符。

该帖子中的相关代码:

;; This HAS to come before (require 'org)
(setq org-emphasis-regexp-components
      '("     ('\"{“”"
        "-   .,!?;''“”\")}/\\“”"
        "    \r\n,"
        "."
        1))

请参阅文档字符串中的org-emphasis-regexp-components:默认情况下会考虑引号字符:

border- 禁止用作边框字符的字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.