The Old Blog Archive (Traditional Chinese), 2004-2009

香草輸入法0.05(preview release)

香草輸入法0.05版可以從Open Foundry下載取得

其實這個程式一直沒有固定的中文名字。我自己經常在「香草輸入法」和「香草注音輸入法」之間變換。不過,這個preview release的0.05版(2004/7/31)或許真的可以稱為「香草輸入法」或者就簡稱「香草輸入」了。不不,我並沒有真的「研發」了什麼新的輸入法,只是在0.05版裡,把倉頡輸入法加了進去,而且可以穩定運轉了。

那麼,這樣的模式既然被證明行得通,要再加入新的輸入法,應該難度(difficulty)不會更高。現在的問題是複雜度(complexity)和藕合度(coupling)。這樣就涉及到一個問題,即現有的「香草」,仍然是在匆忙草率的狀況下寫完的。我一直沒有擺脫「對Apple Developer Connection提供的Basic Input Method做最小補丁修改」的原則。如果「香草」要繼續長大,那麼架構上勢必要有一番重整,包括有很大一部份程式,等於要scrape(作廢丟棄)掉,重新寫過。這種感覺就跟辛苦寫完兩萬字中篇,才發現一開始的人物心理狀態就錯了,走不到尾巴,最後只能全部重寫一樣(我沒有太多其他類型的藝術經驗,只能拿寫作作為類比),對任何一個作者來說,這絕對都是極痛苦的決定。我一個禮拜以來沒有再對「香草」做什麼新動作,除了(感謝老天!)嚴重的bug幾乎沒有,因此沒有新的debugging要做之外,一方面也是我自己在拖延這件應該要做的事。

講完了感想,竟然還沒講怎麼使用。我多了一個功能鍵,CTRL-OPI-I是用來切換注音/倉頡的。這一版「香草」的倉頡輸入法資料,同樣取材自xcin的cj.cin。xcin的倉頡輸入法據朋友b6s的分析,應該是第三代倉頡(「香草」下載區的emucj.zip有個小perl程式,可以用來敲入倉頡鍵碼,來搜尋cj.cin的內容,同時敲進第三代和第五代的倉頡碼,只有第三代有搜尋結果)。再怎麼說,這應該都比OS X內建的倉頡輸入法要來的合理得多。根據mjhsieh轉來的資料,OS X的倉頡雖然可以用五代倉頡碼輸入字,但竟還保留了許多早年不可思議的特色,像是用「重」字碼來挑選重覆字等等(我不會倉頡,這裡講的細節可能有誤)。Autrijus和我作一偈云:「牧遙宣宣岸,倉頡重重難」,希望「香草倉頡」能為大家減輕一點「重重難」。

必須要說的是,xcin的cj.cin,是有包括香港Big5延伸字集的。但是我發現Perl的piconv似乎沒辦法把香港字集的字,完整地轉成UTF8。這個問題我還不是很瞭解原因在哪裡。目前的處理是,香草完全不用cj.cin後半部的香港字集,意思是說香草的倉頡只能打出台灣在用的Big5繁體字而已。

對於真正需要倉頡輸入法的朋友,CTRL-OPT-I當然是行不通的。因為每進一個新應用程式就得重設一遍輸入法(雖然一旦設好之後,在離開該應用程式前,設定會一直有效)。造成這樣的不便,只能說是我的偷懶。當然,一方面也更加證明了「對Basic Input Method做最小補丁」已經碰到了這個設計原則的玻璃天花板了(the glass ceiling of such design principle)。下一版的「香草」第一個要加的功能,一定會是「使用者偏好設定」。只有這樣才能一勞永逸解決切換輸入法的問題。

因為CTRL-OPT-I的問題,才想起「香草」引起了一些朋友的誤會。許多朋友一直以為「香草」只是「支援倚天排列的傳統注音輸入法」。事實上「香草」也有標準排列。當然,一方面排列必須用CTRL-OPT-K切換,同樣造成了極大的不便,另一方面,OS X裡的注音輸入法,本身就是標準排列的,這使得「香草」對於已經在使用標準排列的傳統注音使用者來說,意義不大。

倒是,有幾個地方值得努力的。例如,加入倚天26鍵和許氏注音排列,就是值得做的事情。另外,如果使用者能加字(例如我習慣的「呢」是一聲,但很多人在漢音和酷音,卻是習慣打輕聲的「呢」)、或者增補原來xcin的phone.cin的不足(例如加入「堃」這個原不在標準Big5範圍內的字),甚至,加入「用注音打簡體字」或「用注音打日文漢字」等功能…… 這些其實都只是在phone.cin資料層次上就可以解決的問題(可以用diff的方式來做patch)。但因為目前「香草」是把資料表編死,「編」進程式碼裡(這完全是偷懶和功力不足的表現),因此資料層次的擴充性很低–除非把phone.cin改完後,重新執行「香草」的mergecnv這道shell script,並重編整個程式碼。

最後講講這個”preview release”的0.05版有哪些東西。首先,在注音輸入法部份,新加入”<"和">“兩個換頁鍵,這是我從倚天中文(「飛碟一號」)以來就養成的習慣,看來真的是改不掉了。

另外,在原始碼層次上,我把注音輸入法的程式庫給拆開了,放在了vanillalib_phone這個目錄。倉頡輸入法則放在vanillalib_cj這個目錄。有了注音輸入法的經驗,倉頡的程式庫有了較新的設計。「香草」的倉頡(或許可以稱為「香草倉頡」)程式庫完全是以C++寫成的,在程式介面部份完全OO化–那是講好聽的說法,講難聽一點其實就只是「包裝得好看一點」。金玉其外,倉頡的搜尋部份,是用最偷懶的stdlib.h的bsearch()作完的。有了這樣的經驗,接下來要做的恐怕就是再高一層的抽象化(abstraction),例如寫作VanillaAbstractInputMethod這樣的class。哇,聽起來就很不優雅,很噁心。至於負起輸入法UI大任的VanillaEventHandler,程式還是一團糟,只能等待下一次重寫時一次清創完畢。

因為是”preview release”,相關的文件還來不及同步更新,就以這份簡單的文件,說明0.05版裡有的東西。

我實在不是個認真寫程式的傢伙,coding得少,感想卻寫了一大堆。只是覺得這是相當有趣且難得的學習經驗(必須要說是站在許多人的肩膀上)。如果沒有open source,我根本沒有機會為著自己本初的需要來「寫」一套輸入法。如果沒有open foundry,我可能得從頭建立網站、弄Wiki,而且不會有foundry那麼好的bug tracker。接下來要學的東西,除了Xcode之外,還有版本管理、研究open source licencing的問題(誠實說,一直到最近,我才真的逐條讀完GNU General Public License v2以及其Documentation License)。

最後講兩個延伸出去的話題。

首先,在clkao的提醒下,我在想IIIMF這個跨平台的輸入法計劃是個相當重要的方向,尤其該計劃的視野更大,涵蓋的輸入法不僅只有兩岸三地的中文,還有日、韓、泰文等。Clkao提到,IIIMF有”EIMIL”語言(XML-based),可以用來設計輸入法。新的輸入法應該是一個generic EIMIL processor,把使用者指定的輸入法行為翻譯出來,而不是針對各別輸入法做specific case。這個方向的確是重要的,且在X11和Windows上都有可以run的程式碼了。比較起來OS X反而是未開發的一塊地。

最後,在OS X的輸入法這邊,最近才發現到原來除了Carbon可以寫輸入法,Apple的新一代程式框架Cocoa也有自己的輸入法架構。範例程式在Xcode的/Developer/Examples/AppKit/HexInputServer,但是說明文件老舊有誤,實際執行起來,竟然只有用Cocoa寫的程式可以使用。可惜,因為Cocoa寫成的輸入法都是Objeictive-C模組,光是程式碼的漂亮程度,就比用C/Carbon寫的input component不知好上幾百倍。

這一個禮拜以來繼續有許多朋友給予他們的input, feedback與鼓勵,再次謝謝大家。

4 Responses to “香草輸入法0.05(preview release)”

  1. on 20 Aug 2004 at 11:06macauboy

    可不可以在新版本讓我們可以調校,把倉頡輸入法(或以後新增的輸入法)設為預定值喔? 這樣我們這些用倉頡的人不用每人都按ctrl+opt+i了! 謝謝!

  2. on 21 Aug 2004 at 02:01lukhnos

    這個問題一定會儘快解決,造成各位使用倉頡朋友的困擾,在此先說聲抱歉。我不久前知道了該怎麼加入使用者設定的功能了。0.06版應該可以在這幾天之內完成!

  3. on 23 Aug 2004 at 04:33autrijus

    是 “牧遙昍楥闇”… 雖然我可以體諒你在沒有內碼輸入法的情況下會打不出來… :-)

    另外呢, piconv 要用 “big5-hkscs” 而不是 “big5″ 纔行, 因為 “big5″ 預設指向 “big5-eten”. 為什麼不是 “big5-1984″ 或 “big5-cp950″ 呢? 因為沒人跟我抱怨.

    /Autrijus/

  4. on 23 Aug 2004 at 23:04zonble

    話沒說多久就完成了。真是神速。