我正在编写一个片段(对于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")
,我会看到在迷你缓冲区中打印的跟踪,但我无法弄清楚为什么我的转换不起作用。
答案 0 :(得分:2)
在您的示例中,在我看来,您的连接字符串的结果将被丢弃。我认为你需要实际将新字符串插入缓冲区。
我对yasnippet语法并不是很熟悉,所以这可能不是最干净的解决方案,但以下似乎对我有用:
func ${1:$$(when (and yas-modified-p
yas-moving-away-p)
(insert ")" )
(backward-char (+ 1 (length yas-text)))
(insert "("))} ${2:funcName} {
$0
}
答案 1 :(得分:1)
将代码段启动为
会不会更容易func () FuncName
并删除括号(如果它们为空)?
答案 2 :(得分:0)
文档建议你需要在`backticks`中包装elisp表单,以将返回值合并到代码片段中(很像shell脚本中的命令替换)。
http://capitaomorte.github.io/yasnippet/snippet-development.html#embedded-emacs-lisp-code