【问题标题】:yasnippet conditional transformation on leaving fieldyasnippet 离场条件转换
【发布时间】:2020-10-26 19:08:47
【问题描述】:

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

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

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

我想要的是,当在字段中输入t Type 时,sn-p 会这样扩展:

func (t Type) FuncName

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

func FuncName

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

【问题讨论】:

    标签: emacs yasnippet


    【解决方案1】:

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

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

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

    【讨论】:

    • 这几乎成功了,但是由于backward-word只需要一个单词,所以输入t Type在sn-p扩展后变成t (Type)
    • 好点,我确实错过了。幸运的是,您可以简单地使用 yas-text 的长度而不是单个单词。我已经更新了我的示例来证明这一点。
    【解决方案2】:

    让sn-p开始不是更容易

    func () FuncName
    

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

    【讨论】:

    • 确实,这似乎是首选解决方案。如果字段的值不是空字符串,您可以在第一个字段周围使用两个镜像,它们分别有条件地返回“(”和“)”字符串。这是执行此操作的首选方式。
    • 对 emacs lisp 不太满意,我不得不在达到此之前进行一些试验和错误:func ${1:$(when (> (length yas-text) 0) "(")}$1${1:$(when (> (length yas-text) 0) ")")} FuncName。有没有更紧凑的方法来实现这一点?
    【解决方案3】:

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

    Source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多