yasnippet对离场的条件转换

时间:2013-10-24 21:28:31

标签: emacs yasnippet

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

3 个答案:

答案 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