home icon indicating copy to clipboard operation
home copied to clipboard

关于yaml的patch补丁语法问题

Open qq420100523 opened this issue 1 year ago • 6 comments

首先我只在wiki里找到了关于patch的一些语法介绍:

patch:
  "一級設定項/二級設定項/三級設定項": 新的設定值
  "另一個設定項": 新的設定值
  "再一個設定項": 新的設定值
  "含列表的設定項/@0": 列表第一個元素新的設定值
  "含列表的設定項/@last": 列表最後一個元素新的設定值
  "含列表的設定項/@before 0": 在列表第一個元素之前插入新的設定值(不建議在補靪中使用)
  "含列表的設定項/@after last": 在列表最後一個元素之後插入新的設定值(不建議在補靪中使用)
  "含列表的設定項/@next": 在列表最後一個元素之後插入新的設定值(不建議在補靪中使用)

其次我根据https://github.com/rime/rime-emoji这个编写了一份相似的patch配置,非常开心,发现了特别的打开方式。这两份patch配置单独使用都没问题,但当我将两份patch配置同时应用到一个输入法方案时,发现会冲突,然后我检查build目录里生成的schema.yaml,确定了使用上述的patch语法会有问题,比如: rime-emoji这份patch配置里的emoji_suggestion.yaml:

patch:
  switches/@next:
    name: emoji_suggestion
    reset: 1
    states: [ "🈚️️\uFE0E", "🈶️️\uFE0F" ]
  'engine/filters/@before 0':
    simplifier@emoji_suggestion
  emoji_suggestion:
    opencc_config: emoji.json
    option_name: emoji_suggestion
    tips: all

switches/@next和我编写的switches/@next:相互覆盖,同样ngine/filters/@before 0也是,谁覆盖谁,取决于打到输入法方案里的顺序,也就是相同配置项,只能最后一个生效。 因为没有更多的文档说明,所以我不太清楚这是特性还是bug,对此语法有了解的同学,请多多指教

qq420100523 avatar Aug 15 '22 02:08 qq420100523

是特性,所以「不建议在补丁中使用」。可以改用 /+ 操作符在列表末尾添加任意多个项目,且不会覆盖。 https://github.com/rime/home/wiki/Configuration

patch:
  foo/+:
    - ...
    - ...

Ace-Who avatar Aug 16 '22 02:08 Ace-Who

@next 向列表末尾追加一項。可以向一個列表多次追加,每次追加之後,@next 都指向下一個位置。

不過 patch: 節點是個YAML map,而YAML語法中,map的key不能重複。樓主遇到的應該是這個問題。

lotem avatar Aug 16 '22 02:08 lotem

是特性,所以「不建议在补丁中使用」。可以改用 /+ 操作符在列表末尾添加任意多个项目,且不会覆盖。 https://github.com/rime/home/wiki/Configuration

patch:
  foo/+:
    - ...
    - ...

我觉得「不建议在补丁中使用」不应该是阻止用户使用的理由,毕竟这种语法很方便制作通用配置,而且rime-emoji这份配置方案是官方demo,值得学习借鉴。回归主题,请问/+可以实现@next语义,那@before 0之类的有相关的操作符可以替换吗,有相关的wiki吗?谢谢 ........... 我看到你给的链接了,谢谢

qq420100523 avatar Aug 16 '22 07:08 qq420100523

@next 向列表末尾追加一項。可以向一個列表多次追加,每次追加之後,@next 都指向下一個位置。

不過 patch: 節點是個YAML map,而YAML語法中,map的key不能重複。樓主遇到的應該是這個問題。

确实,请问这个问题有解吗

qq420100523 avatar Aug 16 '22 07:08 qq420100523

确实,请问这个问题有解吗

樓上不是給出了嘛。續寫列表。

或者在方案裏用 __patch 命令,可以指定補丁組成的列表。

lotem avatar Aug 16 '22 12:08 lotem

确实,请问这个问题有解吗

樓上不是給出了嘛。續寫列表。

或者在方案裏用 __patch 命令,可以指定補丁組成的列表。

具体怎么写?

比方上下文有两个 switches/@next

patch:
  switches/@next:
    111
  switches/@next: (新添加)
    222

同时不方便合并成

patch:
  switches/+
    - 111
    - 222

@lotem

LawssssCat avatar Aug 25 '22 00:08 LawssssCat