emacs - 在 Emacs 中使用悬挂缩进填充 Markdown 样式的列表项

标签 emacs elisp markdown

我希望 Emacs 用悬挂缩进包装 Markdown 样式的列表项。事实上,即使在基本模式下,这种方法也能很好地工作。考虑以下三个列表项:

* Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

当使用M-q(fill-paragraph)填充时,结果为

* Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
  eiusmod tempor incididunt ut labore et dolore magna aliqua.

- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
  nisi ut aliquip ex ea commodo consequat.

+ Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur.

请注意,前两个已按我的意愿填写,但最后一个未填写。我无法理解为什么最后一种情况的行为不同,以及如何适本地修改它。

fill-paragraph 源代码中的注释表明尝试了以下步骤:

  1. Fill the region if it is active when called interactively.
  2. Try fill-paragraph-function.
  3. Try our syntax-aware filling code.
  4. If it all fails, default to the good ol' text paragraph filling.

当我按 M-q 填充这些列表项时,没有事件区域,因此 应跳过步骤 1。我还没有定义fill-paragraph-function (我验证了 fill-paragraph-functionfundamental-mode 中为 nil)。

这意味着我们进入了第三步。在基本模式中,所有三个 列表标记具有相同的语法(通过 describe-char 验证):

character: * (displayed as *) (codepoint 42, #o52, #x2a)
   syntax: _    which means: symbol

character: - (displayed as -) (codepoint 45, #o55, #x2d)
   syntax: _    which means: symbol

character: + (displayed as +) (codepoint 43, #o53, #x2b)
   syntax: _    which means: symbol

因此,我不明白为什么这一步会处理这些 段落有任何不同。从源码来看,似乎是这样的 只是试图处理评论,所以我认为相信三个被跳过 以上案例。

所以,看来我们进入第四步,这利用了 段落开始。我尝试将 paragraph-start 设置为以下内容 (允许标记前有空格):

"\f\\|[ \t]*$\\|^[ \t]*[*+-] "

这也不起作用,所以我不知道如何使其工作。

我需要编写一个自定义填充段落函数吗?或者是否有一个 更简单的方法?

最佳答案

一个简单的解决方案是使用adaptive-fill-regexp。该变量是一个正则表达式,它匹配构成缩进的行开头的文本。在上述情况下,我们希望将列表标记计入缩进。

在前两种情况下,这些标记已经在 adaptive-fill-regexp 的默认值中,如 fill.el 中所定义:

"[ \t]*\\([-–!|#%;>*·•‣⁃◦]+[ \t]*\\)*"

请注意,虽然第一组字符集中有很多不同的项目符号字符,但加号 (+) 却不是。对于上述三种情况,以下方法可以解决问题:

"[ \t]*\\([*+-][ \t]*\\)*"

关于emacs - 在 Emacs 中使用悬挂缩进填充 Markdown 样式的列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15176496/

相关文章:

variables - '作为变量的符号值为 void :' when using parameter on defun inside lambda

ubuntu - Emacs 无法找到主题引擎

ruby-on-rails - Emacs 中的 Ruby 导航

emacs - 是否有为自定义命令保留的任何 emacs 组合键?

xml - 使用 elisp 解析 xml 文件

emacs - 有没有办法从elisp回到键盘宏?

regex - 使用python正则表达式转义无效的 Markdown

javascript - 将自定义 Markdown 转换为 HTML?

macos - 如何在 Mac Emacs 中运行 Scheme? - "process scheme exited abnormally with code 1/126"

r - 在 R Markdown 中合并表格