5

我正在编写一个片段(用于 Go),并且希望在移动到下一个字段时有条件地转换一个字段。具体来说,如果我不对其进行编辑,我希望该字段为空,如果我不对其进行编辑,则将其括在括号中。

我不成功的片段,表达了我想要的但未能转换已编辑的字段:

func ${1:$$(when (and yas-modified-p yas-moving-away-p) 
             (concat "(" yas-text ")"))} FuncName

我想要的是,t Type在该字段中输入时,该片段将扩展为:

func (t Type) FuncName

当跳过未经编辑的字段时,它会像这样扩展:

func FuncName

我知道条件按预期执行,因为如果我更改(concat ...)(message "XXX"),我会看到打印在迷你缓冲区中的跟踪,但我无法弄清楚为什么我的转换不起作用。

4

3 回答 3

3

在您的示例中,在我看来,您的连接字符串的结果被丢弃了。我认为您需要将新字符串实际插入缓冲区。

我对 yasnippet 语法不是很熟悉,所以这可能不是最干净的解决方案,但以下似乎对我有用:

func ${1:$$(when (and yas-modified-p 
                      yas-moving-away-p) 
              (insert ")" )
              (backward-char (+ 1 (length yas-text)))
              (insert "("))} ${2:funcName} {
    $0
}
于 2013-10-25T02:19:02.170 回答
1

让片段开始不是更容易吗

func () FuncName

如果它们为空,则删除括号?

于 2013-10-26T02:07:41.323 回答
1

文档建议您需要将 elisp 表单包装在 `backticks` 中以将返回值合并到代码段中(很像 shell 脚本中的命令替换)。

资源

于 2013-10-25T02:43:03.107 回答