【问题标题】:Match one backlash; match two backslashes; match tilde + two backslashes匹配一个反弹;匹配两个反斜杠;匹配波浪号 + 两个反斜杠
【发布时间】:2013-05-09 13:32:42
【问题描述】:

我很想知道是否可以只匹配 1 个反斜杠、2 个反斜杠和一个波浪号加两个反斜杠。我在乳胶模式下使用 Emacs 并为字体锁定设置关键字。将单个反斜杠定义为关键字会对各种其他定义造成严重破坏。我希望一个反斜杠是红色的;两个反斜杠为蓝色;和一个波浪号+两个反斜杠是绿色的。我不认为波浪号会造成问题,但我希望它本身就是红色的。我有 font-lock-add-keywords 格式,但没有这种情况的特殊正则表达式。这类似于我们在之前和之后使用 \b 的情况,但据我所知,这不适用于反斜杠。

~ -- 红色

\ -- 红色,except 触摸字母数字字符时。

\\ -- 蓝色

~\\ -- 绿色

(defvar lawlist-face-a (make-face 'lawlist-face-a))
(set-face-attribute 'lawlist-face-a nil :foreground "red" :bold t)

(defvar lawlist-face-b (make-face 'lawlist-face-b))
(set-face-attribute 'lawlist-face-b nil :foreground "blue" :bold t)

(defvar lawlist-face-c (make-face 'lawlist-face-c))
(set-face-attribute 'lawlist-face-c nil :foreground "green" :bold t)

(font-lock-add-keywords 'latex-mode '(

("~\\|\\\\" 0 lawlist-face-a prepend)

("\\\\\\\\" 0 lawlist-face-b prepend)

("~\\\\\\\\" 0 lawlist-face-c prepend)

))

在上述示例的上下文中,定义单个反斜杠会使第 280-285 行 auctex-11.86 内的 font-latex.el 的预定义警告无效。从第四行代码中删除"\\" 并不能解决问题。例如,键入\newpage 不再与font-latex-warning-face 关联——相反,它显示为未定义,分配给font-latex-sedate-face

(defvar font-latex-built-in-keyword-classes
  '(("warning"
     ("nopagebreak" "pagebreak" "newpage" "clearpage" "cleardoublepage"
      "enlargethispage" "nolinebreak" "linebreak" "newline" "-" "\\*" "\\"
      "appendix" "displaybreak" "allowdisplaybreaks" "include")
     'font-latex-warning-face 1 noarg)

缓冲区示例——乳胶模式:

\newpage -- 字体应该是font-latex-warning-face

\newpage -- 如上所述定义单个反斜杠时,字体错误地显示为 font-latex-sedate-face


编辑 -- 故障排除 -- 测试 -- re-builder 和 LaTeX 文档的屏幕截图:

\\(\\\\\\)[^a-zA-Z@]


(来源:lawlist.com


(来源:lawlist.com

(defvar lawlist-face-a (make-face 'lawlist-face-a))
(set-face-attribute 'lawlist-face-a nil :background "black" :foreground "red" :bold t)

(defvar lawlist-face-b (make-face 'lawlist-face-b))
(set-face-attribute 'lawlist-face-b nil :foreground "blue" :bold t)

(defvar lawlist-face-c (make-face 'lawlist-face-c))
(set-face-attribute 'lawlist-face-c nil :foreground "green" :bold t)

(font-lock-add-keywords 'latex-mode
   '(("~\\|\\(\\\\\\)[^a-zA-Z@]" 0 lawlist-face-a prepend)
     ("\\\\\\\\" 0 lawlist-face-b prepend)
     ("~\\\\\\\\" 0 lawlist-face-c prepend)))


(来源:lawlist.com

【问题讨论】:

  • 我运行你的代码,它给了我从你的描述中预期的结果。您能否举一个文本示例,说明您的期望和问题所在。
  • 我添加了一个由定义单个反斜杠导致的错误的具体示例。昨天,我遇到了单反斜杠使双反斜杠的定义无效的情况——我会看看是否可以重新创建它并将其作为第二个示例发布。
  • 请添加一个框,其中包含您在缓冲区中的文本并解释您想要的输出。更容易复制。
  • 如果有一种方法可以为exclude 定义一个反斜杠,在touching alphanumeric characters 的情况下可以解决问题。我将对上面的错误示例进行一些说明。
  • 目标是能够单独使用单个红色反斜杠在 LaTeX 文档中插入空格(如果无意插入,请提醒我注意);并且还提醒注意反斜杠数量不均匀的情况 - 例如,三个反斜杠应该显示为两个蓝色,然后是一个红色。 Excluding 单个反斜杠为 touching alphanumeric characters 的情况可以避免与我能想到的几乎所有 LaTeX 定义发生冲突——例如,\begin... \end... \1234

标签: regex emacs elisp emacs-faces


【解决方案1】:

LaTeX 命令只能由字母组成(以及库中的@ 符号)。因此,执行以下操作就足以区分单个斜杠和命令的开头:

(defvar lawlist-face-a (make-face 'lawlist-face-a))
(set-face-attribute 'lawlist-face-a nil :foreground "red" :bold t)

(defvar lawlist-face-b (make-face 'lawlist-face-b))
(set-face-attribute 'lawlist-face-b nil :foreground "blue" :bold t)

(defvar lawlist-face-c (make-face 'lawlist-face-c))
(set-face-attribute 'lawlist-face-c nil :foreground "green" :bold t)

(font-lock-add-keywords 'latex-mode
                        '(("~" 0 lawlist-face-a prepend)
                          ("\\(\\\\\\)[^a-zA-Z@]" 1 lawlist-face-a prepend)
                          ("\\\\\\\\" 0 lawlist-face-b prepend)
                          ("~\\\\\\\\" 0 lawlist-face-c prepend)))

【讨论】:

  • 我认为这成功了——内置警告类再次起作用,而其他 \commands 不再被击败。我今天将使用新配置并报告最终确认(以及答案的绿色复选标记):)。非常感谢您帮助我隔离问题并提出解决方案 - 非常感谢!!!!
  • 如果单反斜杠的背景是nil,一切正常。如果单个反斜杠的背景包含颜色(例如黑色)and,则单个反斜杠位于行尾,则背景从行尾一直突出显示到右侧窗口边缘。我尝试在您的代码中在不同的地方插入一些句点和美元符号,但这并没有完全解决问题。这不是一个大问题,但如果有美元符号或可以解决它的东西,那就太好了。
  • 反斜杠什么时候有背景色?是什么原因造成的?
  • 您可以通过在另一个缓冲区中以文本模式运行re-builder(使用"\\\\[^a-zA-Z@]")和几个反斜杠来看到相同的效果。要使用 lawlist-face-a 复制问题,请插入 :background "black"
  • 基本上,\\\\[^a-zA-Z@] 似乎匹配反斜杠右侧的空格和行尾。它还匹配反斜杠右侧的下划线和连字符以及其他一些特殊字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多