我正在编写一个代码段(用于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"),我会看到在迷你缓冲区中打印了跟踪,但是我无法弄清楚为什么我的转换不起作用。

最佳答案

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

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

func ${1:$$(when (and yas-modified-p
                      yas-moving-away-p)
              (insert ")" )
              (backward-char (+ 1 (length yas-text)))
              (insert "("))} ${2:funcName} {
    $0
}

09-13 10:44