使用 lisp 命令在 yasnippet 中编辑模板时无法形成带有反斜杠的字符串

使用 lisp 命令在 yasnippet 中编辑模板时无法形成带有反斜杠的字符串

我正在用 yasnippet 编写模板。

使用 {eqnarray} 在 latex 中编写方程式意味着我将在某处引用它,因此我将为其添加标签。使用 {eqnarray*} 时,不需要标签。

我是 lisp 和 yasnippet 的新手,因此我遵循 c 模式的现有模板:

# -*- mode: snippet -*-
# name : printf 
# contributor : joaotavora
# --
printf ("${1:%s}\\n"${1:$(if (string-match "%" text) "," "\);")
}$2${1:$(if (string-match "%" text) "\);" "")}

效果很好。请注意,此模板中有反斜杠。我的模板是:

# -*- mode: snippet -*-
# name: eqnarray
# key: eq
# --
\begin{eqnarray$1}
${1:$(if (string-match "*" text) "\\label{eq:" "")}$2${1:$(if (string-match "*" text) "}" "")}
$0\end{eqnrrary$1}

其结果将是:

\begin{eqnarray*}label{eq:xxx}
XXX\end{eqnarrary*}

“标签”前面缺少预期的反斜杠!当我用\\\"替换时\(,我可以得到预期的结果,这意味着“标签”前面将分别有“ 或 ( 。

这真的让我很困惑...

此外,我发现我的代码中有一个逻辑错误... if 命令应该是(if (string-match "*" text) "" "\\label{eq:")。由于这个错误误导了那些回答我问题的人,我认为我必须将我的错误保留在这里:)

而且我昨天才开始使用 yasnippet,我发现这个模板距离实际用途还差得很远,正如下面的评论所指出的那样……

答案1

您需要更多反斜杠!有两个级别的引用。正如您在第一个示例中注意到的那样,\n必须放入\\n源代码。对于您的情况,您需要编写\\\\label

# -*- mode: snippet -*-
# name: eqnarray
# key: eq
# --
\begin{eqnarray$1}
${1:$(if (string-match "*" yas-text) "\\\\label{eq:" "")}$2${1:$(if (string-match "*" yas-text) "}" "")}
$0\end{eqnrrary$1}

[我有一个相对较新的版本,yassnippet其中旧变量text已被较新的变量取代yas-text。]

答案2

解决方案骨架模式

将此代码放入您的.emacs

(define-skeleton eqnstar
  "Doc string"
  nil
  "\\begin{eqnarray*}\n"
  "  " _ " \n"
  "\\end{eqnarray*}")

与 一起使用M-x eqnstar

相关内容