神級輸入法小狼豪輸入法設置

從新佈署的操做方法html

 

  【中州韻】點擊輸入法狀態欄上的 ⟲ (Deploy) 按鈕正則表達式

  •【小狼毫】在托盤圖標上右鍵選擇「從新佈署」算法

  •【鼠鬚管】在系統語言文字選單中選擇「從新佈署」express

  對設置的修改於從新佈署後生效。編譯新的輸入方案須要一段時間,此間若沒法輸出中文,請稍等片刻。app

  若部署完畢後,能夠經過 Ctrl+` 喚出方案選單,輸入方案卻仍沒法正常使用,請查看日誌文件定位錯誤。composer

 

  查閱 DIY 處方集框架

 

  已將一些定製 Rime 的常見問題、解法及定製檔連接收錄於此〔DIY 處方集〕編輯器

 

  定製指南工具

 

  Rime 輸入方案,將 Rime 輸入法的設定整理成完善的、可分發的形式。 但並不是必定要創做新的輸入方案,才能夠改變 Rime 的行爲。學習

  當用戶須要對 Rime 中的各類設定作小幅的調節,最直接、但不徹底正確的作法是:編輯用戶資料夾中那些 .yaml 文檔。

  這一方法有弊端:

  •當 Rime 軟件升級時,也會升級各類設定檔、預設輸入方案。用戶編輯過的文檔會被覆寫爲更高版本,所作調整也便丟失了。

  •即便在軟件升級後再手動恢復通過編輯的文件,也會因設定檔的其餘部分未獲得更新而失去本次升級新增和修復的功能。

  所以,對於隨 Rime 發行的設定檔及預設輸入方案,推薦的定製方法是:

  建立一個文件名的主體部份(「.」以前)與要定製的文件相同、次級擴展名(「.yaml」以前)爲 .custom 的定製文檔:

  patch: "一級設定項/二級設定項/三級設定項": 新的設定值 "另外一個設定項": 新的設定值 "再一個設定項": 新的設定值就是這樣:patch 定義了一組「補靪」,以源文件中的設定爲基礎,寫入新的設定項、或以新的設定值取代現有設定項的值。

  不懂?那看我來示範。

 

  一例、定製每頁候選數

 

  Rime 中,默認每頁至多顯示 5 個候選項,而容許的範圍是 1〜9(個別 Rime 發行版可支持10個候選)。

  設定每頁候選個數的默認值爲 9,在用戶目錄創建文檔 default.custom.yaml :

  patch: "menu/page_size": 9從新佈署 便可生效。

  〔注意〕若是 default.custom.yaml 裏面已經有其餘設定內容,只要以相同的縮進方式添加 patch: 如下的部分,不可重複 patch: 這一行。

  若只須要將獨孤一個輸入方案的每頁候選數設爲 9,以【朙月拼音】爲例,創建文檔 luna_pinyin.custom.yaml 寫入相同內容,從新佈署 便可生效。

 

  一例、定製標點符號

 

  有的用家習慣以 / 鍵輸入標點「、」。

  仍以【朙月拼音】爲例,輸入方案中有如下設定:

  # luna_pinyin.schema.yaml # ... punctuator: import_preset: default解釋:

  punctuator 是 Rime 中負責轉換標點符號的組件。該組件會從設定中讀取符號映射表,而知道該作哪些轉換。

  punctuator/import_preset 是說,本方案要繼承一組預設的符號映射表、要從另外一個設定檔 default.yaml 導入。

  查看 default.yaml ,確有以下符號表:

  punctuator: full_shape: # ……其餘…… "/" : [ /, "/", ÷ ] # ……其餘…… half_shape: # ……其餘…… "/" : [ "/", /, ÷ ] # ……其餘……可見按鍵 / 是被指定到 "/", /, ÷ 等一組符號了。 而且全角和半角狀態下,符號有不一樣的定義。

  欲令 / 鍵直接輸出「、」,可如此定製 luna_pinyin.custom.yaml:

  patch: "punctuator/full_shape": "/" : "、" "punctuator/half_shape": "/" : "、"以上在輸入方案設定中寫入兩組新值,合併後的輸入方案成爲:

  # luna_pinyin.schema.yaml # ... punctuator: import_preset: default full_shape: "/" : "、" half_shape: "/" : "、"含義是、在由 default 導入的符號表之上,覆寫對按鍵 / 的定義。

  經過這種方法,既直接繼承了大多數符號的默認定義,又作到了局部的個性化。

  還有一種狀況:

  有些用戶習慣在中文裏使用ASCII標點,那麼與其一個一個覆寫,不如 整套都換掉 。

  取得這份設定檔—— Rime 別樣設定,使用西文標點 在用戶資料夾保存爲 alternative.yaml ;

  再將輸入方案中的「繼承自 default 」經過打 patch 替換爲「繼承自 alternative 」

  # luna_pinyin.custom.yaml patch: 'punctuator/import_preset': alternative就換上了本身習慣的一套標點!

 

  一例、定製簡化字輸出

 

  注意:

  •若是您只是須要 Rime 輸出簡化字,敲 Ctrl+` 組合鍵、從菜單中選擇「漢字→漢字」便可!

  •本例說明了其中原理,以及經過設定檔修改預設輸出字形的方法。

  Rime 預設的詞彙表使用傳統漢字。 這是由於傳統漢字較簡化字提供了更多信息,作「繁→簡」轉換可以保證較高的精度。

  Rime 中的過濾器組件 simplifier,完成對候選詞的繁簡轉換。

  # luna_pinyin.schema.yaml # ... switches: - name: ascii_mode reset: 0 states: [ 中文, 西文 ] - name: full_shape states: [ 半角, 全角 ] - name: simplification # 轉換開關 states: [ 漢字, 漢字 ] engine: filters: - simplifier # 必要組件一 - uniquifier # 必要組件二以上是【朙月拼音】中有關繁簡轉換功能的設定。

  在 engine/filters 中,除了 simplifier,還用了一件 uniquifier。 這是由於有些時候,不一樣的候選會轉化爲相同的簡化字,例如「鐘→鍾」、「鍾→鍾」。 uniquifier 的做用是在 simplifier 執行轉換以後,將文字相同的候選項合併。

  該輸入方案設有三個狀態開關:中/西文、全/半角、繁簡字。即 switches 之下三項。

  每一個開關可在兩種狀態(states)之間切換,simplifier 依據名爲 simplification 的開關狀態來決定是否作簡化:

  •初始狀態下、輸出爲傳統漢字、〔方案選單〕中的開關選項顯示爲「漢字→漢字」。

  •選擇該項後、輸出爲簡化漢字、〔方案選單〕中顯示「漢字→漢字」。

  •Rime 會記憶您的選擇,下次打開輸入法時、直接切換到所選的字形。

  •亦可無視上次記住的選擇,在方案中重設初始值:reset 設爲 0 或 1,分別選中 states 列表中的兩種狀態。

  若是平常應用以簡化字爲主:-(,則往往在〔方案選單〕中切換十分不便; 於是佛振獻上默認輸出簡化字的設定檔:

  # luna_pinyin.custom.yaml patch: switches: # 注意縮進 - name: ascii_mode reset: 0 # reset 0 的做用是當從其餘輸入方案切換到本方案時, states: [ 中文, 西文 ] # 重設爲指定的狀態,而不保留在前一個方案中設定的狀態。 - name: full_shape # 選擇輸入方案後一般須要當即輸入中文,故重設 ascii_mode = 0; states: [ 半角, 全角 ] # 而全/半角則可沿用以前方案中的用法。 - name: simplification reset: 1 # 增長這一行:默認啓用「繁→簡」轉換。 states: [ 漢字, 漢字 ]其實預設輸入方案中就提供了一套【朙月拼音】的簡化字版本,名爲【簡化字】,以應你們「填表」之需。 看他的代碼如何卻與上篇定製檔寫得不一樣:

  # luna_pinyin_simp.schema.yaml # ... switches: - name: ascii_mode reset: 0 states: [ 中文, 西文 ] - name: full_shape states: [ 半角, 全角 ] - name: zh_simp # 注意這裏(※1) reset: 1 states: [ 漢字, 漢字 ] simplifier: option_name: zh_simp # 和這裏(※2)前文說,simplifier 這個組件會檢查名爲 simplification 的開關狀態; 而這款【簡化字】方案卻用了一個不一樣名的開關 zh_simp,即 ※1 處所示; 並經過在 ※2 行設定 simplifier/option_name 告知 simplifier 組件所需關注的開關名字。

  何故?

  還記得否,前文對「全/半角」這個開關的討論—— 當切換方案時,未明確使用 reset 重置的開關,會保持以前設定過的狀態。

  【朙月拼音】等多數方案,並未重設 simplification 這個選項—— 由於用戶換了一種輸入編碼的方式、並不意味著須要變動輸出的字形。

  而【簡化字】這一方案不一樣,偏偏是表達變動輸出字形的需求; 用戶再從【簡化字】切回【朙月拼音】時,必定是爲了「回到」繁體輸出模式。 因此令【簡化字】使用獨立命名的開關、而非方案間共用的 simplification 開關, 以免影響其餘輸入方案的繁簡轉換狀態。

 

  一例、定製方案選單

 

  在【小狼毫】方案選單設定介面上勾勾選選,就能夠如此定製輸入方案列表:

  # default.custom.yaml patch: schema_list: # 對於列表類型,如今無有辦法指定如何添加、消除或單一修改某項,於是要在定製檔中將整個列表替換! - schema: luna_pinyin - schema: cangjie5 - schema: luna_pinyin_fluency - schema: luna_pinyin_simp - schema: my_coolest_ever_schema # 這樣就啓用了不曾有過的高級輸入方案!其實這麼好的方案應該排在最前面哈。無有設定介面時,又想啓用、禁用某個輸入方案,手寫這樣一份定製檔、從新佈署就好啦。

 

  一例、定製喚出方案選單的快捷鍵

 

  喚出方案選單,固然要用鍵盤。默認的快捷鍵爲 Ctrl+` 或 F4。

  不過,有些同窗電腦上 Ctrl+` 與其餘軟件衝突,F4 甚至本文寫做時在【鼠鬚管】中還不可用。又或者有的玩家切換頻繁,想定義到更好的鍵位。

  那麼……

  # default.custom.yaml patch: "switcher/hotkeys": # 這個列表裏每項定義一個快捷鍵,使哪一個都中 - "Control+s" # 添加 Ctrl+s - "Control+grave" # 你看寫法並非 Ctrl+` 而是與 IBus 一致的表示法 - F4按鍵定義的格式爲「修飾符甲+修飾符乙+…+按鍵名稱」,加號爲分隔符,要寫出。

  所謂修飾符,就是如下組合鍵的狀態標誌或是按鍵彈起的標誌:

  •Release——按鍵被放開,而不是按下

  •Shift

  •Control

  •Alt——Windows上 Alt+字母 會被系統優先識別爲程序菜單項的快捷鍵,固然 Alt+Tab 也不可用

  •嗯,Linux 發行版還支持 Super, Meta 等組合鍵,不過最好選每一個平臺都能用的啦

  按鍵的名稱,大小寫字母和數字都用他們本身表示,其餘的按鍵名稱參考這裏 <X11/keysymdef.h> 的定義,去除代碼前綴 XK_ 便是。

 

  一例、定製【小狼毫】字體字號

 

  雖與輸入方案無關,也在此列出以做參考。

  # weasel.custom.yaml patch: "style/font_face": "明蘭" # 字體名稱,從記事本等處的系統字體對話框裏能看到 "style/font_point": 14 # 字號,只認數字的,不認「五號」、「小五」這樣的一例、定製【小狼毫】配色方案¶註:這款配色已經在新版本的小狼毫裏預設了,作練習時,你能夠將文中 starcraft 換成本身命名的標識。

  # weasel.custom.yaml patch: "style/color_scheme": starcraft # 這項用於選中下面定義的新方案 "preset_color_schemes/starcraft": # 在配色方案列表里加入標識爲 starcraft 的新方案 name: 星際我爭霸/StarCraft author: Contralisk <contralisk@gmail.com>, original artwork by Blizzard Entertainment text_color: 0xccaa88 # 編碼行文字顏色,24位色值,用十六進制書寫方便些,順序是藍綠紅0xBBGGRR candidate_text_color: 0x30bb55 # 候選項文字顏色,當與文字顏色不一樣時指定 back_color: 0x000000 # 底色 border_color: 0x1010a0 # 邊框顏色,與底色相同則爲無邊框的效果 hilited_text_color: 0xfecb96 # 高亮文字,即與當前高亮候選對應的那部份輸入碼 hilited_back_color: 0x000000 # 設定高亮文字的底色,可起到凸顯高亮部份的做用 hilited_candidate_text_color: 0x60ffa8 # 高亮候選項的文字顏色,要醒目! hilited_candidate_back_color: 0x000000 # 高亮候選項的底色,若與背景色不一樣就會顯出光棒效果本身看!

 

  DIY 處方集

 

  已將一些定製 Rime 的常見問題、解法及定製檔連接收錄於此。

  建議您首先讀完《定製指南》、通曉相關原理,以正確運用這些處方。

 

  初始設定

 

  在方案選單中添加五筆、雙拼

  放此例,可啓用任一預設或自訂輸入方案,如【粵拼】、【註音】等。(詳解)

  若是下載、本身製做了非預設的輸入方案,將源文件復製到「用戶資料夾」後,也用上面的方法將方案標識加入選單!

  修改於從新佈署後生效。

 

  【小狼毫】外觀設定

 

  使用橫向候選欄:

  # weasel.custom.yaml

  patch:

  style/horizontal: true

 

  【鼠鬚管】外觀與鍵盤設定

 

  〔注意〕鼠鬚管從 0.9.6 版本開始支持選擇配色方案,並改用squirrel.custom.yaml 保存用戶的設定。

 

  針對特定程序禁用漢字輸入

 

  【鼠鬚管】0.9.9 開始支持這項設定:

  在指定的應用程序中,改變輸入法的初始轉換狀態。如在

  •終端 Terminal / iTerm

  •代碼編輯器 Emacs / MacVim / Sublime Text / Xcode

  •快速啓動工具 QuickSilver / Alfred

  等程序裏不多須要輸入中文,於是鼠鬚管在這些程序裏默認不開啓中文輸入。

  自定義 Mac 應用程序的初始轉換狀態,首先查看應用的 Info.plist 文件獲得 該應用的 Bundle Identifier,一般是形如 com.apple.Xcode 的字符串,而後如此設定:

  # squirrel.custom.yaml example patch: app_options/com.googlecode.iterm2: ascii_mode: true app_options/com.alfredapp.Alfred: ascii_mode: true app_options/com.apple.Xcode: ascii_mode: true

 

  輸入習慣

 

  使用Control鍵切換中西文

 

  以及修改左、右Shift、Control鍵的行爲,提供三種切換方式。 詳見代碼註釋。

 

  方便地輸入含數字的西文用戶名

 

  一般,輸入以小寫拉丁字母組成的編碼後,數字鍵的做用是選擇相應序號的候選字。

  假設個人郵箱地址是 rime123@company.com,則須要在輸入rime以後上屏或作臨時中西文切換,方可輸入數字部分。

  爲了更方便輸入個人用戶名 rime123,設置一組特例,將 rime 與其後的數字優先識別西文

 

  以方括號鍵換頁

 

  添加 Mac 風格的翻頁鍵 [ ] 。這是比較直接的設定方式。下一則示例給出了一種更系統、可重用的設定方式。

 

  使用西文標點兼以方括號鍵換頁

 

  這份設定檔聚集了多個方面的輸入習慣,可成套導入到輸入方案。

  以回車鍵清除編碼兼以分號、單引號選字

  適合一些形碼輸入法(如五筆、鄭碼)的快手。

 

  關閉用戶詞典和字頻調整

 

  以【五筆86】爲例:

  # wubi86.custom.yaml patch: translator/enable_user_dict: false模糊音

  【朙月拼音】模糊音定製模板

  相似方案如雙拼、粵拼等可參考這裏演示的方法。

  【吳語】模糊音定製模板

  編碼反查¶設定【速成】的反查碼爲粵拼

  設定【倉頡】的反查碼爲雙拼

  在Mac系統上輸入emoji表情把 emoji 加入輸入方案選單;

  切換到 emoji 輸入方案,便可經過拼音代碼輸入表情符號。查看符號表

  輸入 all 能夠列出所有符號,符號後面的括弧裏標記其拼音代碼。

  五筆簡入繁出

  【小狼毫】用家請到下載頁取得「擴展方案集」。

  安裝完成後,執行輸入法設定,添加【五筆・簡入繁出】輸入方案。

 

[page_break]

 

  固然,由於您理想中的輸入方式千奇百怪、也許從沒有人那樣玩過,因此不可能在那種勾勾選選的介面上作得出來;須要親手來創做——

 

  Rime 輸入方案 !

 

  Rime 是啥

 

  Rime 不是一種輸入法。是從各類常見鍵盤輸入法中提煉出來的抽象的輸入算法框架。由於 Rime 涵蓋了大多數輸入法的「共性」,因此在不一樣的設定下,Rime 可化爲不一樣的輸入法用來打字。

 

  Rime 輸入方案又是啥

 

  要讓 Rime 實現某種具體輸入法的功能,就須要一些數據來描述這種輸入法以何種形式工做。即,定義該輸入法的「個性」。

  如「漢語拼音」、「註音」、「倉頡碼」、「五筆字型」,這些方法可憑藉 Rime 提供的通用設施、給定不一樣的工做參數來實做。以本文介紹的規格寫成一套套的配方,就是 Rime 輸入方案。

 

  爲啥這麼繁?

 

  一鍵就搞掂,必然選項少,功能單一。很差玩。

  輸入法程序一寫兩三年,也許還不夠火候;花兩三個小時來讀入門書,已經是輸入法專業速成班。

 

  準備開工

 

  Rime 是跨平臺的輸入法軟件,Rime 輸入方案可通用於如下發行版:

  •【中州韻】 ibus-rime → Linux

  •【小狼毫】 Weasel → Windows

  •【鼠鬚管】 Squirrel → Mac OS X

  取得適合你係統的最新版 Rime 輸入法,印一份《指南書》,準備開工了!

 

  Rime with Text Files

 

  文本爲王。 Rime 的配置文件、輸入方案定義及詞典文件,均爲特定格式的文本文檔。 所以,一款夠專業的 文本編輯器 ,是設計 Rime 輸入方案的必備工具。

  Rime 中全部文本文檔,均要求以 UTF-8 編碼,並建議使用 UNIX 換行符(LF)。

  鑑於一些文本編輯器會爲 UTF-8 編碼的文件添加 BOM 標記,爲防止誤將該字符混入文中, 莫要從文件的第一行開始正文,而請在該行行首以 # 記號起一行註釋,如:

  # Rime default settings# Rime schema: My First Cool Schema# Rime dictionary: Lingua Latina也可繼續以註釋行寫下方案簡介、碼錶來源、製做者、修訂記錄等信息,再切入正文。

 

  必知必會

 

  Rime 輸入法中,多用擴展名爲「.yaml」的文本文檔,這是以一種可讀性高的數據描述語言—— YAML 寫成。

  請訪問 http://yaml.org/ 瞭解 YAML 文檔格式。 下文只對部分語法做簡要說明,而將重點放在對語義的解讀上面。

  Rime 輸入方案亦會用到「正則表達式」實現一些高級功能。

  輸入方案設計者須要掌握這份文檔所描述的 Perl 正則表達式語法:

  http://www.boost.org/doc/libs/1_49_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html

 

  Rime 中的數據文件分佈及做用

 

  除程序文件之外,Rime 還包括多種數據文件。 這些數據文件存在於如下位置:

  共享資料夾

  •【中州韻】 /usr/share/rime-data/

  •【小狼毫】 "安裝目錄\data"

  •【鼠鬚管】 "/Library/Input Methods/Squirrel.app/Contents/SharedSupport/"

  用戶資料夾

  •【中州韻】 ~/.config/ibus/rime/ (0.9.1 如下版本爲 ~/.ibus/rime/)

  •【小狼毫】 "%APPDATA%\Rime"

  •【鼠鬚管】 ~/Library/Rime/

  共享資料夾包含預設輸入方案的源文件。 這些文件屬於 Rime 所發行軟件的一部份,在訪問權限控制較嚴格的系統上對用戶是隻讀的,所以謝絕軟件版本更新之外的任何修改—— 一旦用戶修改這裏的文件,極可能影響後續的軟件升級或在升級時丟失數據。

  在「部署 Rime」操做時,將用到這裏的輸入方案源文件、並結合用戶定製的內容來編譯預設輸入方案。

  用戶資料夾則包含爲用戶準備的內容,如:

  •〔全局設定〕 default.yaml

  •〔發行版設定〕 weasel.yaml

  •〔預設輸入方案副本〕 <方案標識>.schema.yaml

  •※〔安裝信息〕 installation.yaml

  •※〔用戶狀態信息〕 user.yaml

  編譯輸入方案所產出的二進制文件:

  •〔Rime 棱鏡〕 <方案標識>.prism.bin

  •〔Rime 固態詞典〕 <詞典名>.table.bin

  •〔Rime 反查詞典〕 <詞典名>.reverse.bin

  記錄用戶寫做習慣的文件:

  •※〔用戶詞典〕 <詞典名>.userdb.kct

  •※〔用戶詞典備份〕 <詞典名>.userdb.kct.snapshot

  以及用戶本身設定的:

  •※〔用戶對全局設定的定製信息〕 default.custom.yaml

  •※〔用戶對預設輸入方案的定製信息〕 <方案標識>.custom.yaml

  •※〔用戶自製輸入方案〕及配套的詞典源文件

  註:以上標有 ※ 號的文件,包含用戶資料,您在清理文件時要注意備份!

 

  詳解輸入方案

 

  方案定義

 

  一套輸入方案,一般包含「方案定義」和「詞典」文件。

  方案定義,命名爲 <方案標識>.schema.yaml,是一份包含輸入方案配置信息的 YAML 文檔。

  文檔中須要有這樣一組方案描述:

  # 如下代碼片斷節選自 luna_pinyin.schema.yaml schema: schema_id: luna_pinyin name: 朙月拼音 version: "0.9" author: - 佛振 <chen.sst@gmail.com> description: | Rime 預設的拼音輸入方案。首先來爲方案命名。schema/name 字段是顯示在〔方案選單〕中的名稱。

  而後——重點是——要定一個在整個 Rime 輸入法中惟一的「方案標識」,即 schema/schema_id 字段的內容。 方案標識由小寫字母、數字、下劃線構成。 僅於輸入法內部使用,且會構成方案定義文件名的一部分,所以爲了兼容不一樣的文件系統,不要用大寫字母、漢字、空格和其餘符號作方案標識。 一例:這款名爲【朙月拼音】的輸入方案,方案標識爲「luna_pinyin」。

  方案如作升級,經過版本號(schema/version)來區分相互兼容的新舊版本。

  版本號——以「.」分隔的整數(或文字)構成的字符串。

  以下都是版本號常見的形式:

  "1" # 最好加引號代表是字符串! "1.0" # 最好加引號代表是字符串! "0.9.8" "0.9.8.custom.86427531" # 這種形式是通過用戶自定義的版本;自動生成然而,若對方案的升級會致使原有的用戶輸入習慣沒法在新的方案中繼續使用,則須要換個新的方案標識。

  好比【倉頡五代】之於【倉頡三代】、【五筆98】之於【五筆86】,其實已經是互不兼容的輸入法。

  schema/author ——列出做者和主要貢獻者,格式爲文字列表:

  schema: author: - 做者甲 <alpha@rime.org> - 做者乙 <beta@rime.org> - 做者丙schema/description ——對方案做簡要介紹的多行文字。

  以上 schema/schema_id、schema/version 字段用於在程序中識別輸入方案, 而 schema/name、schema/author、schema/description 則主要是展現給用戶的信息。

  除方案描述外,方案定義文件中還包含各類功能設定,控制着輸入法引擎的工做方式。

 

  輸入法引擎與功能組件

 

  論 Rime 輸入法的工做流程:

  按鍵消息→後臺「服務」→分配給對應的「會話」→由「方案選單」或「輸入引擎」處理…… 這裏要點是,有會話的概念:多窗口、多線操做嘛,你懂得的,同時與好幾位 MM 聊天時,有無有好幾組會話。 每一組會話中都有一部輸入引擎完成按鍵序列到文字的變換。

  Rime 能夠在不一樣會話裏使用不一樣輸入方案。由於有「方案選單」。 方案選單自己可響應一些按鍵。但由於他不會寫字的緣故,更多時候要把按鍵遞給同一會話中的「輸入引擎」繼續處理。 方案選單的貢獻,就是給用戶一個便捷的方案切換介面,再把用戶挑中的輸入方案加載到輸入引擎。

  再論輸入引擎的工做流程:

  加載輸入方案、預備功能組件;各就位以後就進入處理按鍵消息、處理按鍵消息……的循環。 響應各類按鍵、產生各種結果的工做,教不一樣的功能組件分擔了。

  好,看代碼:

  # luna_pinyin.schema.yaml # ... engine: # 輸入引擎設定,即掛接組件的「處方」 processors: # 1、這批組件處理各種按鍵消息 - ascii_composer - recognizer - key_binder - speller - punctuator - selector - navigator - express_editor segmentors: # 2、這批組件識別不一樣內容類型,將輸入碼分段 - ascii_segmentor - matcher - abc_segmentor - punct_segmentor - fallback_segmentor translators: # 3、這批組件翻譯特定類型的編碼段爲一組候選文字 - echo_translator - punct_translator - r10n_translator - reverse_lookup_translator filters: # 4、這批組件過濾翻譯的結果 - simplifier - uniquifier輸入引擎把完成具體功能的邏輯拆分爲可裝卸、組合的部件。 「加載」輸入方案,即按該處方掛接所需的功能組件、令這些組件從輸入方案定義中加載各自的設定、準備各司其職。 而他們接下來要完成的做業,先是由引擎收到的一份按鍵消息引起。

 

  理解 Processors

 

  輸入引擎,做爲總體來看,以按鍵消息爲輸入,輸出包括三部分:

  •一是對按鍵消息的處理結果:操做系統要一個結果、這按鍵、輪入法接是不接?

  •二是暫存於輸入法、還沒有完成處理的內容,會展示在輸入法候選窗中。

  •三是要「上屏」的文字,並非每按一鍵都有輸出。一般中文字都會伴隨「確認」動做而上屏,有些按鍵則會直接致使符號上屏,而這些還要視具體場景而定。

  那麼第一類功能組件 processors,就是比較籠統地、起着「處理」按鍵消息的做用。

  按鍵消息依次送往列表中的 processor,由他給出對按鍵的處理意見:

  •或曰「收」、即由 Rime 響應該按鍵;

  •或曰「拒」、回稟操做系統 Rime 不作響應、請對按鍵作默認處理;

  •或曰這個按鍵我不認得、請下一個 processor 繼續看。

  優先級依照 processors 列表順序排定,接收按鍵者會針對按鍵消息作處理。

  雖然看起來 processor 經過組合能夠承擔引擎的所有任務,但爲了將邏輯繼續細分、Rime 又爲引擎設置了另外三類功能組件。這些組件均可以訪問引擎中的數據對象——輸入上下文,並將各自所作處理的階段成果存於其中。

  processor 最多見的處理,即是將按鍵所產生的字符記入上下文中的「輸入碼」序列。 當「輸入碼」發生變動時,下一組組件 segmentors 開始一輪新的做業。

  理解 Segmentors¶Rime 可將文字、數字、符號等不一樣內容連續輸入,此時須要識別不一樣格式的輸入碼、將輸入碼分紅若干段分而治之。 這經過數輪代碼段劃分操做完成。每一輪操做中、一衆 segmentors 分別給出起始於某一處、符合特定格式的代碼段,識別到的最長代碼段成爲本輪劃分的結果,而給出這一劃分的一個或多個 segmentor 組件則可爲該代碼段打上「類型標籤」;從這一新代碼段的結束位置,開始下一輪劃分,直到整個輸入碼序列劃分完畢。

  舉例來講,【朙月拼音】中,輸入碼 2012nian\,劃分爲三個編碼段:2012(貼number標籤)、nian(貼abc標籤)、\(貼punct標籤)。

  那些標籤是初步劃分後斷定的類型,也可能有一個編碼段貼多個標籤的狀況。下一個階段中,translators 會把特定類型的編碼段翻譯爲文字。

 

  理解 Translators

 

  顧名思義,translator 完成由編碼到文字的翻譯。但有幾個要點:

  •一是翻譯的對象是劃分好的一個代碼段。

  •二是某個 translator 組件每每只翻譯具備特定標籤的代碼段。

  •三是翻譯的結果可能有多條,每條結果成爲一個展示給用戶的候選項。

  •四是代碼段可由幾種 translator 分別翻譯、翻譯結果按必定規則合併成一列候選。

  •五是候選項所對應的編碼未必是整個代碼段。用拼音敲一個詞組時,詞組後面繼續列出單字候選,便是此例。

  雙目如探針般進入內存查看,發現翻譯的結果呈現這種形式:

  input | tag | translations ------+--------+------------------------------------- 2012 | number | [ "2012" ], [ "二〇一二" ] nian | abc | [ "年", "念", "唸",... ], [ "nian" ] \ | punct | [ "、", "\" ]輸入串劃分爲多個代碼段、每段代碼又可具備多組翻譯結果;取各代碼段的首選結果鏈接起來,就是預備上屏的文字「2012年、」。

  且將以上所示的數據稱爲「做文」。這是一篇未定稿(未搞定)的做文,輸入法介面此時顯示預備上屏的文字「2012年、」,並列出最末一個代碼段上的候選「、」及「\」以供選擇。

  有兩款主力 translator 完成主要文字內容的翻譯,其實現的方式很不同:

  •r10n_translator 修煉羅馬字分析法,以「固定音節表」爲算法的基礎,識別輸入碼的音節構成,推敲排列組合、完成遣詞造句。

  •table_translator 修煉傳承自上世紀的碼錶功夫,基於規則的動態碼錶,構成編碼空間內一個開放的編碼集合。

  拼音、註音、方言拼音,皆是以固定音節表上的拼寫排列組合的方式產生編碼,故適用羅馬字分析法。 倉頡、五筆字型這類則是傳統的碼錶輸入法。

  若是以碼錶方式來寫拼音輸入方案,是怎樣的效果呢?雖然仍可完成輸入,但沒法徹底實現支持簡拼、模糊拼音、使用隔音符號的動態調頻、智能語句等有用的特性。

  反之,以羅馬字方式使用碼錶輸入法,則沒法實現定長編碼頂字上屏、按編碼規則構詞等功能。在 Rime 各發行版預設輸入方案中,有一款「速成」輸入方案,便是以 r10n_translator 翻譯倉頡碼,實現全、簡碼混合的語句輸入。

  歸納起來,這是兩種構造新編碼的方式:羅馬字式輸入方案以一組固定的基本音節碼創造新的組合而構詞,而碼錶式輸入方案則以必定碼長爲限創造新的編碼映射而構詞。

 

  理解 Filters

 

  上一步已經收集到各個代碼段的翻譯結果,當輸入法須要在介面呈現一頁候選項時,就從最末一個代碼段的結果集中挑選、直至取夠方案中設定的頁最大候選數。

  每從結果集選出一條字詞、會通過一組 filters 過濾。多個 filter 串行工做,最終產出的結果進入候選序列。

  filter 能夠:

  •改裝正在處理的候選項,修改某些屬性值:簡化字、火星文、菊花文有無有?過期了!有 Rime,你對文字的想象力終於得救

  •消除當前候選項,好比檢測到重複(由不一樣 translator 產生)的候選條目

  •插入新的候選項,好比根據已有條目插入關聯的結果

  •修改已有的候選序列

 

  碼錶與詞典

 

  詞典是 translator 的參考書。

  他每每與同名輸入方案配套使用,如拼音的詞典以拼音碼查字,倉頡的詞典以倉頡碼查字。但也能夠由若干編碼屬於同一系統的輸入方案共用,如各類雙拼方案,都使用和拼音一樣的詞典,於是不只複用了碼錶數據,也可共享用戶以任一款此係列方案錄入的自造詞(仍以碼錶中的形式即全拼編碼記錄)。

  Rime 的詞典文件,命名爲 <詞典名>.dict.yaml,包含一份碼錶及對應的規則說明。 詞典文件的前半部份爲一份 YAML 文檔:

  # 注意這裏以 --- ... 分別標記出 YAML 文檔的起始與結束位置 # 在 ... 標記以後的部份就不會做 YAML 文檔來解讀 --- name: luna_pinyin version: "0.9" sort: by_weight use_preset_vocabulary: true ...解釋:

  •name: 詞典名,內部使用,命名原則同「方案標識」;能夠與配套的輸入方案標識一致,也可不一樣;

  •version: 管理詞典的版本,規則同輸入方案定義文件的版本號;

  •sort: 詞條排序方式,可選填 by_weight(按詞頻高低排序)或 original(保持原碼錶中的順序);

  •use_preset_vocabulary: 填 true 或 false,選擇是否導入預設詞彙表【八股文】。

  碼錶,定義了輸入法中編碼與文字的對應關係。

  碼錶位於詞典文件中 YAML 結束標記以後的部份。 其格式爲以製表符分隔的字段(TSV),每行定義一條「文字-編碼」的對應關係:

  # 單字 你 ni 我 wo 的 de 99% 的 di 1% 地 de 10% 地 di 90% 目 mu 好 hao # 詞組 你我 你的 個人 個人天 天地 tian di 好天 好好地 目的 mu di 目的地 mu di di※注意: 不要 從網頁復製以上代碼到實做的詞典文件!由於網頁裏製表符被轉換成空格從而不符合 Rime 詞典要求的格式。

  碼錶部份,除了以上格式的編碼行,還能夠包含空行(不含任何字符)及註釋行(行首爲 # 符號)。

  以製表符(Tab)分隔的第一個字段是所定義的文字,能夠是單字或詞組;

  第二個字段是與文字對應的編碼;若該編碼由多個「音節」組成,音節之間以空個分開;

  可選地、第三個字段是設定該字詞權重的頻度值(非負整數),或相對於預設權值的百分比(浮點數%)。 在拼音輸入法中,每每多音字的若干種讀音使用的場合不一樣,於是指定不一樣百分比來修正每一個讀音的使用頻度。

  詞組若是知足如下條件,則能夠省去編碼字段:

  •詞組中每一個單字均有編碼定義

  •詞組中不包含多音字(例:你我),或多音字在該詞組中讀音的權值超過該多音字所有讀音權值的5%(例:個人)

  這種條件下,詞組的編碼可由單字編碼的組合推導出來。

  反之,則有必要給出詞組的編碼以消除自動註音的不肯定性(例:天地)。

  當含有多音字的詞組缺乏編碼字段時,自動註音程序會利用權重百分比高於5%的讀音進行組合、生成所有可能的註音,如:

  「好好地」在編譯時自動註音爲「hao hao de」、「hao hao di」

  八股文

 

  Rime 有一份名爲【八股文】的預設詞彙表。

  多數輸入方案須要用到一些標準白話文中的通用詞彙。爲免重複在每份碼錶中包含這些詞彙,減小輸入方案維護成本,Rime 提供了一份預設詞彙表及自動編碼(註音)的設施。

  創做輸入方案時,若是但願徹底控制詞彙表的內容而不採用【八股文】中的詞組,只須直接將詞彙編入碼錶便可。

  不然,在詞典文件中設定 use_preset_vocabulary: true 將【八股文】導入該詞典; 在碼錶中給出單字碼、須要分辨多音字的詞組編碼、以及該輸入方案特有的詞彙,其餘交給自動註音來作就好啦。

  Rime預設輸入方案正是利用這份詞彙表及自動註音工具,在不犧牲效果及可維護性的前提下、使詞典文件壓縮到最小的行數。

  【八股文】包含從 CC-CEDICT、新酷音等開源項目中整理出來的約二十三萬條詞彙,其用字及詞頻數據針對傳統漢字作過調整。所以基於這份詞彙表產生的輸入結果,比較接近以傳統漢字行文的實際用法。

  爲了充分利用【八股文】提供的詞彙,自定義的詞典應保證單字碼表收錄了符合 opencc 字形標準的經常使用字。特別注意,該標準對如下幾組異體字的取捨,【八股文】將這些字(包括詞組及字頻)統一到左邊一列的字形。

  爲 為 僞 偽 嬀 媯 爲 溈 兄 兇 啓 啟 棱 稜 污 污 泄 洩 涌 涌 牀 牀 着 著 竈 竈 羣 羣 衆 眾 裏 裡 踊 踊 覈 核部署過程當中,未能完成自動註音的字、詞會以警告形式出如今日誌文件裏。若是所報告的字爲生僻字、您能夠忽略他;若是警告中大量出現某個經常使用字,那麼應該注意到碼錶裏缺失了該字的註音。

 

  編譯輸入方案

 

  將寫好的輸入方案佈署到 Rime 輸入法的過程,稱爲「編譯」:

  爲查詢效率故,輸入法工做時不直接加載文本格式的詞典源文件,而要在編譯過程當中,爲輸入方案生成專爲高速查詢設計的「.bin」文件。

  編譯時程序作如下幾件事:

  •將用戶的定製內容合併到輸入方案定義中,在用戶資料夾生成 .schema.yaml 文檔副本;

  •依照輸入方案中指定的詞典:求得音節表(不一樣種編碼的集合)、單字表;

  •對詞典中未提供編碼的詞組自動註音,也包括從【八股文】導入的詞組;

  •創建按音節編碼檢索詞條的索引,製做 Rime 固態詞典;

  •創建按詞條檢索編碼的索引,製做 Rime 反查詞典;

  •依照音節表和方案定義中指定的拼寫運算規則,製做 Rime 棱鏡。

 

  佈署 Rime

 

  初次安裝 Rime 輸入法,無有任何輸入方案和用戶設定。所以安裝的最後一個步驟便是把發行版預設的輸入方案和設定文件佈署到 Rime 爲該用戶建立的工做目錄,至此 Rime 纔成爲一部能夠發動的輸入引擎。

  此後不管是修改已有方案的設定,或是添加了新的輸入方案,都須要「從新佈署 Rime」成功後方可以使用戶的新設定做用於 Rime 輸入法。

  〔★〕從新佈署 Rime 的方法是:

  •【小狼毫】在托盤圖標上右鍵選擇「從新佈署」;

  •【鼠鬚管】在系統語言文字選單中選擇「從新佈署」;

  •【中州韻】點擊輸入法狀態欄上的 ⟲ (Deploy) 按鈕;

  •早於 ibus-rime 0.9.2 的版本:刪除用戶資料夾的 default.yaml 以後、執行 ibus-daemon -drx 重載 IBus

 

  定製指南

 

  Rime 輸入方案,將 Rime 輸入法的設定整理成完善的、可分發的形式。 但並不是必定要創做新的輸入方案,才能夠改變 Rime 的行爲。

  當用戶須要對 Rime 中的各類設定作小幅的調節,最直接、但不徹底正確的作法是:編輯用戶資料夾中那些 .yaml 文檔。

  這一方法有弊端:

  •當 Rime 軟件升級時,也會升級各類設定檔、預設輸入方案。用戶編輯過的文檔會被覆寫爲更高版本,所作調整也便丟失了。

  •即便在軟件升級後再手動恢復通過編輯的文件,也會因設定檔的其餘部分未獲得更新而失去本次升級新增和修復的功能。

  所以,對於隨 Rime 發行的設定檔及預設輸入方案,推薦的定製方法是:

  建立一個文件名的主體部份(「.」以前)與要定製的文件相同、次級擴展名(位於「.yaml」以前)寫做 .custom 的定製檔,形如:

  patch: "一級設定項/二級設定項/三級設定項": 新的設定值 "另外一個設定項": 新的設定值 "再一個設定項": 新的設定值patch 定義了一組「補靪」,以源文件中的設定爲底本,寫入新的設定項、或以新的設定值取代舊有的值。

  重要!創做了新的輸入方案,最後一步就是在「方案選單」裏啓用他。

 

  拼寫運算

 

  應該算是 Rime 輸入法最主要的首創技術。

  歸納來講就是將方案中的編碼經過規則映射到一組全新的拼寫形式! 也就是說能讓 Rime 輸入方案在不修改碼錶的狀況下、適應不一樣的輸入習慣。

  拼寫運算能用來:

  •改革拼寫法

  ◦將編碼映射到基於同一音系的其餘拼寫法,如註音、拼音、國語羅馬字相互轉換

  ◦重定義註音鍵盤、雙拼方案

  •實現簡拼查詢

  •在音節表上靈活地定義模糊音規則

  •實現音節自動糾錯

  •變換回顯的輸入碼或提示碼,如將輸入碼顯示爲字根、注音符號、帶聲調標註的羅馬字

  給力嗎?

 

[page_break]

 

  綜合演練

 

  若是你安裝好了Rime卻不會玩,就一步一步跟我學吧。

 

  【一】破空中出鞘

  Hello, Rime!

 

  第一個例子,老是最簡單的(也是最傻的)。

  # Rime schema # encoding: utf-8 # # 最簡單的 Rime 輸入方案 # schema: schema_id: hello # 注意此ID與文件名裏 .schema.yaml 以前的部分相同 name: 你們好 # 將在〔方案選單〕中顯示 version: "1" # 這是文字類型而非整數或小數,如 "1.2.3"起首幾行是註釋。然後只有一組必要的方案描述信息。

  這一課主要練習創建格式正確的YAML文檔。

  •要點一,讓你的文本編輯器以UTF-8編碼保存該文件;

  •要點二,注意將 schema: 之下的三行代碼以空格縮進——個人習慣是用兩個空格——而 不要 用Tab字符來縮進。

  縮進表示設定項所屬的層次。在他處引用到此文檔中的設定項,可分別以 schema/schema_id, schema/name, schema/version 來指稱。

  我如今把寫好的方案文檔命名爲 hello.schema.yaml,丟進用戶資料夾——對,只要這一個文件就妥了;

  而後,啓用他。有些版本會有「方案選單設定」這個介面,在那裏勾選【你們好】這個方案便可。若無有設定介面,則按照上文《定製方案選單》一節來作。

  好運!我已創建了一款名爲【你們好】的新方案!雖然他沒有實現任何效果、按鍵仍會像無有輸入法同樣直接輸出西文。

 

  開始改裝

 

  爲了處理字符按鍵、生成輸入碼,本例向輸入引擎添加兩個功能組件。

  如下代碼還是ID爲 hello 的新款輸入方案,但增長了 schema/version 的數值。 之後每一個版本,都之前一個版本爲基礎改寫,引文略去無有改動的部分,以突出重點。

  # ... schema: schema_id: hello name: 你們好 version: "2" engine: processors: - fluency_editor segmentors: - fallback_segmentorfluency_editor 將字符按鍵記入輸入上下文,fallback_segmentor 將輸入碼連綴成一段。於是從新佈署後,按下字符鍵再也不直接上屏,而顯示爲輸入碼。

  你會發現,該輸入法只是收集了鍵盤上的可打印字符,並於按下空格、回車鍵時令輸入碼上屏。

  如今就好似寫輸入法程序的過程當中,將將取得一小點成果,還有不少邏輯未實現。不一樣的是,在Rime輸入方案裏寫一行代碼,頂 Rime 開發者所寫的上百上千行。所以我能夠很快地組合各類邏輯組件、搭建出內心想的輸入法。

  建立候選項¶第二版的【你們好】將鍵盤上全部字符都記入輸入碼,這對整句輸入有用,可是時下流行輸入法只處理編碼字符、其餘字符直接上屏的形式。爲了對編碼字符作出區分,如下改用 speller + express_editor 的組合取代 fluency_editor:

  # ... schema: # ... version: "3" engine: processors: - speller # 把字母追加到編碼串 - express_editor # 空格確認當前輸入、其餘字符直接上屏 segmentors: - fallback_segmentorspeller 默認只接受小寫拉丁字母做爲輸入碼。 試試看,輸入其餘字符如大寫字母、數字、標點,都會直接上屏。而且若是已經輸入了編碼時,下一個直接上屏的字符會將輸入碼頂上屏。

  再接着,建立一個最簡單的候選項——把編碼串自己做爲一個選項。故而會提供這個選項的新組件名叫 echo_translator。

  # ... engine: # ... translators: - echo_translator # (無有其餘結果時,)建立一個與編碼串一個模樣的候選項至此,【你們好】看上去與一個真正的輸入法形似啦。只是還不會打出「你們好」哇?

 

  編寫詞典

 

  那就寫一部詞典,碼錶中設定以 hello 做爲短語「你們好」的編碼:

  # Rime dictionary # encoding: utf-8 --- name: hello version: "1" sort: original ... 你們好 hello 再見 bye 再會 bye※注意: 不要 從網頁復製以上代碼到實做的詞典文件!由於網頁裏製表符被轉換成空格從而不符合 Rime 詞典要求的格式。

  同時修改方案定義:

  #... schema: # ... version: "4" engine: #... segmentors: - abc_segmentor # 標記輸入碼的類型 - fallback_segmentor translators: - echo_translator - table_translator # 碼錶式轉換 translator: dictionary: hello # 設定 table_translator 使用的詞典名工做流程是這樣的:

  •speller 將字母鍵加入輸入碼序列

  •abc_segmentor 給輸入碼打上標籤 abc

  •table_translator 把帶有 abc 籤的輸入碼以查表的方式譯爲中文

  •table_translator 所查的碼錶在 translator/dictionary 所指定的詞典裏

  如今能夠敲 hello 而打出「你們好」。完工!

 

  實現選字及換頁

 

  等一下。

  記得 hello 詞典裏,還有個編碼叫作 bye。敲 bye,Rime 給出「再見」、「再會」兩個候選短語。

  這時敲空格鍵,就會打出「再見」;那麼怎樣打出「再會」呢?

  你們首先想到的方法,是:打完編碼 hello,按 1 選「再見」,按 2 選「再會」。 但是如今按下 2 去,倒是上屏「再見」和數字「2」。可見並無完成數字鍵選字的處理,而是將數字同其餘符號同樣作了頂字上屏處理。

  增長一部 selector,便可實現以數字鍵選字。

  schema: # ... version: "5" engine: processors: - speller - selector # 選字、換頁 - navigator # 移動插入點 - express_editor # ...selector 除了數字鍵,還響應前次頁、上下方向鍵。所以選擇第二候選「再會」,既能夠按數字2,又能夠按方向鍵「↓」將「再會」高亮、再按空格鍵確認。

  navigator 處理左右方向鍵、Home、End鍵,實現移動插入點的編輯功能。有兩種狀況須要用到他:一是發現輸入碼有誤須要定位修改,二是縮小候選詞對應的輸入碼的範圍、精準地編輯新詞組。

  接下來向詞典添加一組重碼,以檢驗換頁的效果:

  --- name: hello version: "2" sort: original ... 你們好 hello 再見 bye 再會 bye 星期一 monday 星期二 tuesday 星期三 wednesday 星期四 thursday 星期五 friday 星期六 saturday 星期日 sunday 星期一 weekday 星期二 weekday 星期三 weekday 星期四 weekday 星期五 weekday 星期六 weekday 星期日 weekday默認每頁候選數爲5,輸入 weekday,顯示「星期一」至「星期五」。再敲 Page_Down 顯示第二頁後選詞「星期6、星期日」。

 

  輸出中文標點

 

  schema: # ... version: "6" engine: processors: - speller - punctuator # 處理符號按鍵 - selector - navigator - express_editor segmentors: - abc_segmentor - punct_segmentor # 劃界,與先後方的其餘編碼區分開 - fallback_segmentor translators: - echo_translator - punct_translator # 轉換 - table_translator # ... punctuator: # 設定符號表,這裏直接導入預設的 import_preset: default此次的修改,要注意 punctuator, punct_segmentor, punct_translator 相對於其餘組件的位置。

  punctuator/import_preset 告訴 Rime 使用一套預設的符號表。他的值 default 能夠換成其餘名字如 xxx,則 Rime 會讀取 xxx.yaml 裏面定義的符號表。

  現在再敲 hello. 就會獲得「你們好。」

 

  用符號鍵換頁

 

  早先流行用 - = 這一對符號換頁,現在流行用 , 和 . 。 在第六版中「,」「。」是會頂字上屏的。如今要作些處理以達到一鍵兩用的效果。

  Rime 提供了 key_binder 組件,他可以在必定條件下,將指定按鍵綁定爲另外一個按鍵。對於本例就是:

  •當展示候選菜單時,句號鍵(period)綁定爲向後換頁(Page_Down)

  •當已有(向後)換頁動做時,逗號鍵(comma)綁定爲向前換頁(Page_Up)

  逗號鍵向前換頁的條件之因此比句號鍵嚴格,是爲了「,」仍可在未進行換頁的狀況下頂字上屏。

  通過 key_binder 的處理,用來換頁的逗號、句號鍵改頭換面爲前、後換頁鍵,從而繞過 punctuator,最終被 selector 看成換頁來處理。

  最終的代碼以下:

  schema: schema_id: hello name: 你們好 version: "7" engine: processors: - key_binder # 搶在其餘 processor 處理以前斷定是否換頁用的符號鍵 - speller - punctuator # 不然「,。」就會由此上屏 - selector - navigator - express_editor segmentors: - abc_segmentor - punct_segmentor - fallback_segmentor translators: - echo_translator - punct_translator - table_translator translator: dictionary: hello punctuator: import_preset: default key_binder: bindings: # 每條定義包含條件、接收按鍵(IBus規格的鍵名,可加修飾符,如「Control+Return」)、發送按鍵 - when: paging # 僅當已發生向後換頁時, accept: comma # 將「逗號」鍵…… send: Page_Up # 關聯到「向前換頁」;於是 navigator 將收到一發 Page_Up - when: has_menu # 只要有候選字即知足條件 accept: period send: Page_Down【二】修煉之道¶與【你們好】這個方案不一樣。如下一組示例,主要演示如何活用符號鍵盤,以及羅馬字轉寫式輸入。

 

  改造鍵盤

 

  莫覺得【你們好】是最最簡單的輸入方案。碼錶式輸入法,不如「鍵盤式」輸入法來得簡單明快!

  用 punctuator 這一套組件,就可實現一款鍵盤輸入法:

  # Rime schema # encoding: utf-8 schema: schema_id: numbers name: 數字之道 version: "1" engine: processors: - punctuator - express_editor segmentors: - punct_segmentor translators: - punct_translator punctuator: half_shape: &symtable "1" : 一 "2" : 二 "3" : 三 "4" : 四 "5" : 五 "6" : 六 "7" : 七 "8" : 八 "9" : 九 "0" : 〇 "s" : 十 "b" : 百 "q" : 千 "w" : 萬 "n" : 年 "y" : [ 月, 元, 億 ] "r" : 日 "x" : 星期 "j" : 角 "f" : 分 "z" : [ 之, 整 ] "d" : 第 "h" : 號 "." : 點 full_shape: *symtable對,所謂「鍵盤輸入法」,就是按鍵和字直接對應的輸入方式。

  此次,再也不寫 punctuator/import_preset 這項,而是自訂了一套符號表。

  鴰!原來 punctuator 不單能夠用來打出標點符號;還能夠重定義空格以及所有 94 個可打印 ASCII 字符(碼位 0x20 至 0x7e)。

  在符號表代碼裏,用對應的ASCII字符表示按鍵。記得這些按鍵字符要放在引號裏面,YAML 纔可以正確解析喔。

  示例代碼表演了兩種符號的映射方式:一對一及一對多。一對多者,按鍵後符號不會當即上屏,而是……嘿嘿,本身體驗吧 :-)

  關於代碼裏 symtable 的一點解釋:

  這是YAML的一種語法,&symtable 叫作「錨點標籤」,給緊隨其後的內容起個名字叫 symtable; *symtable 則至關於引用了 symtable 所標記的那段內容,從而避免重複。 Rime 裏的符號有「全角」、「半角」兩種狀態。本方案裏暫不做區分,教 half_shape、full_shape 使用同一份符號表。

 

  大寫數字鍵盤

 

  靈機一動,不如利用「全、半角」模式來區分「大、小寫」中文數字!

  schema: # ... version: "2" switches: - name: full_shape states: [ 小寫, 大寫 ] # ...先來定義狀態開關:0態改「半角」爲「小寫」,1態改「全角」爲「大寫」。

  這樣一改,再打開「方案選單」,方案「數字之道」底下就會多出個「小寫→大寫」的選項,每選定一次、狀態隨之反轉一次。

  接着給 half_shape、full_shape 定義不一樣的符號表:

  punctuator: half_shape: "1" : 一 "2" : 二 "3" : 三 "4" : 四 "5" : 五 "6" : 六 "7" : 七 "8" : 八 "9" : 九 "0" : 〇 "s" : 十 "b" : 百 "q" : 千 "w" : 萬 "n" : 年 "y" : [ 月, 元, 億 ] "r" : 日 "x" : 星期 "j" : 角 "f" : 分 "z" : [ 之, 整 ] "d" : 第 "h" : 號 "." : 點 full_shape: "1" : 一 "2" : 貳 "3" : 參 "4" : 肆 "5" : 伍 "6" : 陸 "7" : 柒 "8" : 捌 "9" : 玖 "0" : 零 "s" : 拾 "b" : 佰 "q" : 仟 "w" : 萬 "n" : 年 "y" : [ 月, 圓, 億 ] "r" : 日 "x" : 星期 "j" : 角 "f" : 分 "z" : [ 之, 整 ] "d" : 第 "h" : 號 "." : 點哈,調出選單切換一下大小寫,輸出的字全變樣!酷。

  可是要去選單切換,總不如按下 Shift 就全都有了:

  punctuator: half_shape: # ... 添加如下這些 "!" : 一 "@" : 貳 "#" : 參 "$" : [ 肆, ¥, "$", "€", "£" ] "%" : [ 伍, 百分之 ] "^" : 陸 "&" : 柒 "*" : 捌 "(" : 玖 ")" : 零 "S" : 拾 "B" : 佰 "Q" : 仟 "Y" : 圓於是在「小寫」態,只要按 Shift + 數字鍵便可打出大寫數字。

  用了幾下,發現一處小小的不滿意:敲 $ 這個鍵,可選的符號有五個之多。想要打出毆元、英鎊符號只得多敲幾下 $ 鍵使想要的符號高亮;可是按上、下方向鍵並無效果,按符號前面標示的數字序號,更是不只上屏了錯誤的符號、還多上屏一個數字——

  這反映出兩個問題。一是 selector 組件缺席使得選字、移動選字光標的動做未獲得響應。當即加上:

  # ... engine: processors: - punctuator - selector # 加在這裏 - express_editor # ...由於要讓 punctuator 來轉換數字鍵,因此 selector 得放在他後頭。

  好。二一個問題還在:沒法用數字序號選字。爲解決這個衝突,改用閒置的字母鍵來選字:

  # ... menu: alternative_select_keys: "acegi"完工。

 

  羅馬字之道

 

  畢竟,鍵盤上只有47個字符按鍵、94個編碼字符,對付百十個字還管使。可要輸入上千個經常使用漢字,嫌鍵盤式輸入的編碼空間過小,必得採用多字符編碼。

  羅馬字,以拉丁字母的特定排列做爲漢語音節的轉寫形式。一個音節表明一組同音字,再由音節拼寫組合成詞、句。

  凡此單字(音節)編碼天然連用而生詞、句的輸入法,皆可用 r10n_translator 組件完成基於音節碼切分的智能詞句轉換。r10n 爲 romanization 的簡寫。但不限於「拼音」、「註音」、「雙拼」、「粵拼」等一族基於語音編碼的輸入法:形式類似者,如「速成」,雖以字形爲本,亦可應用。

  如今來把【數字之道】改爲拼音→中文數字的變換。

  schema: schema_id: numbers name: 數字之道 version: "3" engine: processors: - speller - punctuator - selector - express_editor segmentors: - abc_segmentor - punct_segmentor translators: - punct_translator - r10n_translator translator: dictionary: numbers punctuator: half_shape: &symtable "!" : 一 "@" : 貳 "#" : 參 "$" : [ 肆, ¥, "$", "€", "£" ] "%" : [ 伍, 百分之 ] "^" : 陸 "&" : 柒 "*" : 捌 "(" : 玖 ")" : 零 "S" : 拾 "B" : 佰 "Q" : 仟 "W" : 萬 "N" : 年 "Y" : [ 月, 圓, 億 ] "R" : 日 "X" : 星期 "J" : 角 "F" : 分 "Z" : [ 之, 整 ] "D" : 第 "H" : 號 "." : 點 full_shape: *symtable符號表裏,把小寫字母、數字鍵都空出來了。小寫字母用來拼音,數字鍵用來選重。重點是本次用了 r10n_translator 這組件。與 table_translator 類似,該組件與 translator/dictionary 指名的詞典相關聯。

  編製詞典:

  # Rime dictionary # encoding: utf-8 --- name: numbers version: "1" sort: by_weight use_preset_vocabulary: true ... 一 yi 二 er 三 san 四 si 五 wu 六 liu 七 qi 八 ba 九 jiu 〇 ling 零 ling 十 shi 百 bai 千 qian 萬 wan 億 yi 年 nian 月 yue 日 ri 星 xing 期 qi 時 shi 分 fen 秒 miao 元 yuan 角 jiao 之 zhi 整 zheng 第 di 號 hao 點 dian 是 shi※注意: 不要 從網頁復製以上代碼到實做的詞典文件!由於網頁裏製表符被轉換成空格從而不符合 Rime 詞典要求的格式。

  碼錶裏給出了一個「示例」規格的小字集。其中包含幾組重碼字。

  要訣 sort: by_weight 意圖是不以碼錶的順序排列重碼字,而是比較字頻。那字頻呢?沒寫出來。

  要訣 use_preset_vocabulary: true 用在輸入方案須要支持輸入詞組、而碼錶中詞組相對櫃乏時。編譯輸入方案期間引入 Rime 預設的【八股文】詞彙——及詞頻資料!這就是碼錶中未具字頻的緣由。

  使用【八股文】,要注意碼錶所用的字形是否與該詞彙表一致。八股文的詞彙及詞頻統計都遵守 opencc 繁體字形標準。

  若是缺乏單字的編碼定義,天然也沒法導入某些詞彙。因此本方案只會導入這個數字「小字集」上的詞彙。

  用拼寫運算定義簡碼¶現在有了一款專門輸入數字的拼音輸入法。比一比昇陽拼音、朙月拼音和地球拼音,還有哪裏不同?

  很快我發現敲 xingqiwu 或 xingqiw 均可獲得來自【八股文】的詞組「星期五」,這很好。但是敲 xqw 怎會不中呢?

  原來 r10n_translator 羅馬字中譯的方法是,將輸入碼序列切分爲音節表中的拼寫形式,再按音節查詞典。不信你找本詞典瞧瞧,是否是按完整的拼音(註音)編排的。Rime 詞典也同樣。並無 xqw 這樣的檢索碼。

  如今我要用 Rime 獨門絕活「拼寫運算」來定義一種「音序查字法」。令 x 做 xing 的簡碼,q 做數字之道全部音節中起首爲 q 者的簡碼,即略代音節 qi 與 qian。

  「漢語拼音」裏還有三個雙字母的聲符,zh, ch, sh 也可作簡碼。

  添加拼寫運算規則:

  schema: # ... version: "4" #... speller: algebra: - 'abbrev/^([a-z]).+$/$1/' - 'abbrev/^([zcs]h).+$/$1/'如此 Rime 便知,除了碼錶裏那些拼音,還有若干簡碼也是行得通的拼寫形式。再輸入 xqw,Rime 將他拆開 x'q'w,再默默對應到音節碼 xing'qi'wan、xing'qi'wu、xing'qian'wan 等等,一翻詞典就獲得了一個好詞「星期五」,而其餘的組合都說不通。

  如今有無有悟到,羅馬字轉寫式輸入法與碼錶式輸入法理念上的不一樣?

  哈,作中了。試試看 sss,sss,sssss,sssss

  卻好像不是我要的「四是四,十是十,十四是十四,四十是四十」……

  好辦。若是某些詞彙在方案裏很重要,【八股文】又未收錄,那麼,請添加至碼錶:

  --- name: numbers version: "2" sort: by_weight use_preset_vocabulary: true ... # ... 四是四 十是十 十四是十四 四十是四十善哉。演示完畢。固然休想就此把 Rime 全盤掌握了。一本《指南書》,若能讓讀者入門,我止說「善哉〜」

  再日後,就只有多讀代碼,纔能見識到各類新穎、有趣的玩法。

 

  【三】最高武藝

 

  〔警告〕最後這部戲,對智力、技術功底的要求不通常。若是讀不下去,不要怪我、不要懷疑本身的智商!

  即便跳過本節書也無妨,只是不可忽略了下文《關於調試》這一節!(重要哇……)

  請檢查是否:

  •※ 已將前兩組實例分析透徹

  •※ 學習完了《拼寫運算》

  •※ 知道雙拼是神碼

  •※ 預習 Rime 預設輸入方案之【朙月拼音】

  設計一款【智能ABC雙拼】輸入方案作練習!

  # Rime schema # encoding: utf-8 schema: schema_id: double_pinyin_abc # 專有的方案標識 name: 智能ABC雙拼 version: "0.9" author: - 佛振 <chen.sst@gmail.com> description: | 朙月拼音,兼容智能ABC雙拼方案。 switches: - name: ascii_mode reset: 0 states: [ 中文, 西文 ] - name: full_shape states: [ 半角, 全角 ] - name: simplification states: [ 漢字, 漢字 ] engine: processors: - ascii_composer - recognizer - key_binder - speller - punctuator - selector - navigator - express_editor segmentors: - ascii_segmentor - matcher - abc_segmentor - punct_segmentor - fallback_segmentor translators: - echo_translator - punct_translator - r10n_translator - reverse_lookup_translator filters: - simplifier - uniquifier speller: alphabet: zyxwvutsrqponmlkjihgfedcba # 唉,倒背字母表徹底是我的喜愛 delimiter: " '" # 隔音符號用「'」;第一位的空白用來自動插入到音節邊界處 algebra: # 拼寫運算規則,這個纔是實現雙拼方案的重點。寫法有不少種,固然也能夠把四百多個音節碼一條一條地列舉 - erase/^xx$/ # 碼錶中有幾個拼音不明的字,編碼成xx了,消滅他 - derive/^([jqxy])u$/$1v/ - xform/^zh/A/ # 替換聲母鍵,用大寫以防與原有的字母混淆 - xform/^ch/E/ - xform/^sh/V/ - xform/^([aoe].*)$/O$1/ # 添上固定的零聲母o,先標記爲大寫O - xform/ei$/Q/ # 替換韻母鍵 - xform/ian$/W/ # ※2 - xform/er$|iu$/R/ # 對應兩種韻母的;音節er如今變爲OR了 - xform/[iu]ang$/T/ # ※1 - xform/ing$/Y/ - xform/uo$/O/ - xform/uan$/P/ # ※3 - xform/i?ong$/S/ - xform/[iu]a$/D/ - xform/en$/F/ - xform/eng$/G/ - xform/ang$/H/ # 檢查一下在此以前是否已轉換過了帶介音的ang;好,※1處有了 - xform/an$/J/ # 若是※二、※3還無有出如今上文中,應該把他們提到本行以前 - xform/iao$/Z/ # 對——像這樣讓iao提早出場 - xform/ao$/K/ - xform/in$|uai$/C/ # 讓uai提早出場 - xform/ai$/L/ - xform/ie$/X/ - xform/ou$/B/ - xform/un$/N/ - xform/[uv]e$|ui$/M/ - xlit/QWERTYOPASDFGHJKLZXCVBNM/qwertyopasdfghjklzxcvbnm/ # 最後把雙拼碼所有變小寫 translator: dictionary: luna_pinyin # 與【朙月拼音】共用詞典 prism: double_pinyin_abc # prism 要以本輸入方案的名稱來命名,以避免把朙月拼音的拼寫映射表覆蓋掉 preedit_format: # 這段代碼用來將輸入的雙拼碼反轉爲全拼顯示;待見雙拼碼的能夠把這段拿掉 - xform/o(\w)/0$1/ # 零聲母先改成0,以方便後面的轉換 - xform/(\w)q/$1ei/ # 雙拼第二碼轉換爲韻母 - xform/(\w)n/$1un/ # 提早轉換雙拼碼 n 和 g,由於轉換後的拼音裏就快要出現這兩個字母了,那時將難以分辨出雙拼碼 - xform/(\w)g/$1eng/ # 固然也能夠採取事先將雙拼碼變爲大寫的辦法來與轉換過的拼音作區分,可誰讓我是高手呢 - xform/(\w)w/$1ian/ - xform/([dtnljqx])r/$1iu/ # 對應多種韻母的雙拼碼,按搭配的聲母作區分(最好別用排除式如 [^o]r 容易出情況) - xform/0r/0er/ # 另外一種狀況,注意先不消除0,以防後面把e看成聲母轉換爲ch - xform/([nljqx])t/$1iang/ - xform/(\w)t/$1uang/ # 上一行已經把對應到 iang 的雙拼碼 t 消滅,於是這裏不用再列舉相配的聲母 - xform/(\w)y/$1ing/ - xform/([dtnlgkhaevrzcs])o/$1uo/ - xform/(\w)p/$1uan/ - xform/([jqx])s/$1iong/ - xform/(\w)s/$1ong/ - xform/([gkhaevrzcs])d/$1ua/ - xform/(\w)d/$1ia/ - xform/(\w)f/$1en/ - xform/(\w)h/$1ang/ - xform/(\w)j/$1an/ - xform/(\w)k/$1ao/ # 默默檢查:雙拼碼 o 已經轉換過了 - xform/(\w)l/$1ai/ - xform/(\w)z/$1iao/ - xform/(\w)x/$1ie/ - xform/(\w)b/$1ou/ - xform/([nl])m/$1ve/ - xform/([jqxy])m/$1ue/ - xform/(\w)m/$1ui/ - "xform/(^|[ '])a/$1zh/" # 復原聲母,音節開始處的雙拼字母a改寫爲zh;其餘位置的才真正是a - "xform/(^|[ '])e/$1ch/" - "xform/(^|[ '])v/$1sh/" - xform/0(\w)/$1/ # 好了,如今能夠把零聲母拿掉啦 - xform/([nljqxy])v/$1ü/ # 這樣纔是漢語拼音 :-) reverse_lookup: dictionary: cangjie5 prefix: "`" tips: 〔倉頡〕 preedit_format: - "xlit|abcdefghijklmnopqrstuvwxyz|日月金木水火土竹戈十大中一弓人心手口屍廿山女田難卜符|" comment_format: - xform/([nl])v/$1ü/ punctuator: import_preset: default key_binder: import_preset: default recognizer: import_preset: default patterns: reverse_lookup: "`[a-z]*$"完畢。

  這是一道大題。經過改造拼寫法而創做出新的輸入方案。

  關於調試¶如此複雜的輸入方案,極可能須要反覆調試方可達到想要的結果。

  請於試驗時及時查看日誌中是否包含錯誤信息。日誌文件位於:

  •【中州韻】 /tmp/rime.ibus.*

  •【小狼毫】 %TEMP%\rime.weasel.*

  •【鼠鬚管】 $TMPDIR/rime.squirrel.*

  •各發行版的早期版本 用戶資料夾/rime.log

  按照日誌的級別分爲 INFO / 信息、WARNING / 警告、ERROR / 錯誤。 後兩類應重點關注,若是新方案部署後不可用或輸出與設計不一致,緣由可能在此。

  沒有任何錯誤信息,就是很差使,有多是碼錶自己的問題,好比把碼錶中文字和編碼兩列弄顛倒了——Rime 等你輸入由漢字組成的編碼,然而鍵盤沒有可能作到這一點(不然也再也不須要輸入法了)。

  後續有計劃爲輸入方案創做者開發名爲「拼寫運算調試器」的工具,可以較直觀地看到每一步拼寫運算的結果。有助於定義雙拼這樣大量使用拼寫運算的方案。

  東風破¶「東風破早梅,向暖一枝開。」

  構想在 Rime 輸入軟件完善後、可以連結漢字字形、音韻、輸入法愛好者的共同興趣,造成穩定的使用者社羣,搭建一個分享知識的平臺。

  而【東風破】,定義爲 Rime 輸入方案倉庫,則是分享 Rime 輸入方案的平臺。

  Rime 是一款強調個性的輸入法。

  Rime 不要定義輸入法應當是哪一個樣、而要定義輸入法能夠玩出哪些花樣。

  Rime 不可能經過預設更多的輸入方案來知足玩家的需求;真正的玩家必定有通常人想不到的高招。

  將來必定會有,【東風破】,讓用家輕鬆地找到最新、最酷、最適合本身的 Rime 輸入方案。

  教程終因而介紹完了~~各位大大們還得慢慢研究的~

相關文章
相關標籤/搜索