Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在.custom文件中,patch项如何实现路径用法的'/'转义? #207

Closed
TylerGeorge opened this issue Feb 22, 2018 · 2 comments
Closed
Labels

Comments

@TylerGeorge
Copy link

问题的原因

根据定制指南里的说明:

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

然而对于这样的一个文件:

key1:
  subkey1: 1
  subkey2: 2

两个.custom补丁

#Patch1
patch:
  key1/subkey1: 3
#Patch2
patch:
  key1:
    subkey1: 3

的行为是不一样的:Patch1只会更新subkey1的值;但是Patch2会让最后生成的文件的 key1 中只剩下 subkey1 (也就是说替换了key1树)。

原本的问题

我遇到的问题是:
我想用 symbols.custom.yaml 来扩充 symbols.yamlpunctuator/symbols
于是我写了这样的:

patch:
#  NO EFFECT:  punctuator/import_preset: symbols
    punctuator/symbols:
      /tq: [ 晴, 阴, 多云, 霾, 雨 ]

显然的结果是:symbols.yamlpunctuator/symbols 的其他项目被替换掉了。
当然,这样也是不行的:

patch:
    punctuator/symbols//tq: [ 晴, 阴, 多云, 霾, 雨 ]

结果是symbols增加了一个空项,/tq变成了空项的子Hash array.

我也不知道在解析patch的时候是怎么转义 / 的。试了很多办法也没达到想要的效果。

P.S. 当然解决我的这个问题的方法有很多,比如复制 symbols.yaml 作为 symbols.custom.yaml 的模板,或者在 luna_pinyin.schema.yamlimport_preset 后修正。

但是我就是想知道能不能用优雅的方法解决这个问题 ,不改动所有的输入方案的配置文件就能达到效果。或者这个问题可能会出现在其他的 .custom 文件里。

@lotem lotem changed the title 在.custom文件中,patch项如何实现路径用法的'\'转义? patch中将路径写在key中和key:value行为并不一致。 在.custom文件中,patch项如何实现路径用法的'/'转义? Feb 22, 2018
@lotem lotem added the question label Feb 22, 2018
@lotem
Copy link
Member

lotem commented Feb 22, 2018

首先解釋一下 #Patch2 的效果是符合設計的。因爲「替換整個 map」也是一項要滿足的需求。patch 的語義就是替換 value 而不是合併節點樹,只有 patch 下一層的 key 纔是要替換的節點路徑。

rime/librime#138 之前(http://rime.im/download 的當前版本),只用 symbols.yaml:/patch 做不到替換/增加部份包含 / 的 key。但是在輸入方案裏可以,因爲 punctuator 自己實現了以方案文件中定義的 punctuator/symbols 與 preset 合併。於是我能想到的最優雅(最少重複)的辦法是:

  1. 不考慮升級,直接編輯用戶文件夾下 symbols.yaml
  2. 避免被升級覆蓋,複製 symbols.yaml 另存修改後的副本爲 more_symbols.yaml
    爲輸入方案打補丁 patch: { punctuator/import_preset: more_symbols }
  3. 不想直接編輯又不願複製 symbols.yaml 的全部內容,那只好把「于是我写了这样的:」補靪用作方案補靪。

最新的 librime 1.2.10 有好辦法。我會把用法在這篇文章裏介紹:
https://github.com/rime/home/wiki/Configuration

@lotem
Copy link
Member

lotem commented Apr 21, 2018

已更新文檔: https://github.com/rime/home/wiki/Configuration

用 librime>=1.3,原題的解法是:

# symbols.custom.yaml
patch:
  punctuator/symbols/+:
    /tq: [ 晴, 阴, 多云, 霾, 雨 ]

@lotem lotem closed this as completed Apr 21, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants