2010/10/28

ibus 無調注音支援空白鍵作為一聲

最近都在修改 ibus 的注音輸入法,這次新增的功能是把原本空白鍵的導引鍵功能,改成支援陰平聲調(也就是注音聲調中的一聲)。之前的無調注音雖然好用,不過許多人還是習慣在輸入的時候鍵入聲調。而 ibus 注音輸入法遇到聲調目前會自動忽略,所以就算你輸入聲調也不會有什麼問題,不過令人困擾的是平常繁體中文使用者使用空白鍵作為聲調中的一聲,正巧跟 ibus 注音輸入法的導引鍵衝突。所以我花了一些時間加入空白鍵作為一聲的支援。

相同的源碼我都放在 github 上,現在要使用新增的功能都需要編譯源碼。晚點我測試的差不多後就會推到官方 ibus 的 repository 中。

新的 ibus 注音輸入法在設定的地方會多一個空白鍵功能的選項。



現在預設會使用陰平聲調,所以新的使用者不需要調整。之前有使用 ibus 注音輸入法的使用者只需要切換這個選項就可以讓空白鍵變成陰平聲調。

2010/10/20

ibus-pinyin-bopomofo 無調注音輸入法新增 enter 直接輸出第一個候選字

最近正在參與 ibus 中的無調注音輸入法 (pinyin-bopomofo) 的開發。希望能夠讓這個輸入法更好用,並且也同時考慮到對岸以及台灣使用者的使用習慣。

這次修改的是加入 enter 鍵的功能選項。原本的輸入法按下 enter 後會輸出原本的英文字串。比如說輸入 yurenju 雖然剛開始會變成好像是亂打的字如下圖:


不過當你按下 Enter 之後就會變成 yurenju。不過台灣的中文使用者有些比較習慣按下 Enter 後輸出的是第一個候選詞。所以小弟新增了一個小功能,讓使用者可以在設定裡面調整 Enter 鍵的功能。源碼在 github 上,現在要使用必須直接編譯源碼。新的版本預設會讓按下 Enter 後輸出第一個候選字,不過也可以在設定裡面調整。


另外在我 github 的版本也有把 shift + , 與 shift + . 重新 mapping 到全形的逗點跟句點了。接下來會看一些 issues 有哪些要幫忙解。

2010/10/19

[筆記] gdb C++ 小技巧

以前自己用 gdb 都是拿來 debug C 語言的程式,這次拿來對 C++ 除錯發現有些小地方要注意的。

第一個是 C++ 字串。平常印出 C 語言的字串只需要用 print str_var 就可以了,不過要印出 C++ 的字串則是要用 print str_var.c_str()。

另外一個要注意的是 breakpoint 的設定方式。breakpoint 的設定可以用行號或者是 function name,不過如果在 C++ 除錯時如果有 namespace 必須要打出完整的 name + class + method name。比如說 ibus 的 PYBopomofoEditor.cc 裡面有 BopomofoEditor::processBopomofo method,要設定中斷點就必須打


b PY::BopomofoEditor::processBopomofo(unsigned int, unsigned int, unsigned int)


我想你也會跟我一樣覺得打這串也太長了吧,不過 gdb 支援自動補齊,只要打 PY::Bo 之後按下 Tab 鍵就可以用自動補齊的方式快速的打完整串了。

2010/10/12

printf debug 大法?改用 gdb 取代 printf debug 方式

這個東西 jserv 在好久以前的演講就提過,不過今天要用又找了一會才找到,筆記與此。

很多時候在 debug 的時候只是要確定程式跑到那段時,大概有很大的機率會加入 printf 到程式碼裡面來進行這樣的 debug 動作。不過使用 printf 每次都要重新編譯源碼實在是有點麻煩,而使用 gdb print 資訊可以在不更動源碼也不會有每次都因為設定中斷點就停下來的問題。

比如說有以下程式:
switch (m_punct_mode) {
    case MODE_DISABLE:
        {
            g_assert (ch == IBUS_grave);
            ...
            update ();
        }
        break;
    case MODE_INIT:
        {
            m_text.clear ();
            ...
            m_cursor = 0;
        }
    case MODE_NORMAL:
        {
            m_text.insert (m_cursor, ch);
            ...
            update ();
        }
        break;
    default:
        g_assert_not_reached ();
    }

我們想在程式運行時知道到底跑到那個 switch case, 就可以用 gdb 來 print。其中的原理是利用中斷之後執行一小段 gdb 命令來達成。gdb 有個指令叫做 commands 可以在中斷後自動執行一小段 gdb 指令,所以如果我們使用 command 指令再配合 print 以及 continue 就可以做出類似 printf 的除錯功能。比如說第一個中斷點的設定方式則為:

b editor.cc:4
commands
print "MODE_DISABLE"
continue
end

這樣執行時就可以讓 gdb 印出資訊達到 printf 的效果,但卻不用重新編譯源碼。

2010/10/06

Linux 無調注音輸入法 - ibus-pinyin-bopomofo

前幾天,PingoooHychen 在 TOSSUG 討論最近 Ubuntu 10.04 的 ibus 輸入法有很多 issues,然後又聊到對岸的拼音輸入法比起注音輸入法少打了聲調速度好像快很多之後,我們三個就想說是不是自己來修一下 ibus 的問題,順便看有沒有可能寫出無調的注音輸入法。

無調注音輸入法的概念也很簡單,基本上跟使用新酷音用法差不多,但是不需要輸入一二三四聲,所以才稱爲無調注音。基本上拼音輸入法原本就不需要輸入聲調,理論上我們可以基於拼音輸入法把英文拼音轉換成注音這樣的基礎原理來創造無調注音輸入法。

沒想到前幾天 hychen 丟出了一個對岸同胞作出以拼音爲基礎的注音輸入法,正巧是我們想要的無調注音輸入法!

這個注音輸入法是基於 ibus-pinyin 所作的注音輸入法,雖然說目前正在研發還不是很穩定,不過基本上方向是與我們心目中的無調注音輸入法是相同的。要在 Ubuntu 10.04 安裝也是相當容易,輸入以下指令即可安裝:

sudo add-apt-repository ppa:shawn-p-huang/ppa
sudo apt-get update
sudo apt-get install ibus-gtk ibus-qt ibus-pinyin ibus-pinyin-db-open-phrase
 

這兩天試用了一下發現有些問題先筆記起來,或許有機會可以提交到原作者的『注音模式用戶交互設計方案』,這些發現是基於一個新酷音使用者的意見回饋,或許拼音輸入法的使用者有更好的使用方式,只是我只試用兩天還沒發現罷了

  1. 輸入完畢後,如果輸入法候選字都正確時,不能直接按下 enter 鍵直接輸出,需要先按空白鍵再選擇第一組正確的候選字組纔可以輸入(或者是連按兩下空白鍵)。
  2. 輸入完畢後直接按 enter 會直接出現剛剛敲過的所有按鍵,看起來像這樣:d0fux9vu;5ku;。這個似乎不是使用者預期的輸出
  3. 以上兩點如果將 enter 鍵改成直接輸出正確的候選字會比較快速。
  4. 按着 shift + , 或者 shift + . 出現的並不是全形的逗號以及句號,而是『《』以及『》』,感覺不符合使用者預期
  5. 使用 ` 鍵叫出符號表的時候,如果已經設定選字鍵爲 asdfghjkl;,但是符號表的選字鍵依然是 1234567890
  6. 輸入了一個句子後,可以用左右鍵移動到注音符號的任意位置,但不清除功能爲何。看起來似乎可以用來決定切字點,但是移到要切字的位置後按下空白選字,接下來的字會變成注音符號。例如要輸入:十全路十五號,需要切字在『十五』之間。如果移到十五中間按下空白鍵選字,整串字會變成『十全路十ㄨㄏㄠ』
  7. 按下空白鍵選字後,必須要按下 page up/down 跳頁選字。此時方向鍵之中的上下鍵並沒有功能,建議可以用來取代 page up/down
  8. 如果第一次選詞的時候沒有正確選擇,下次就算正確選詞也沒辦法更正。比如說我第一次選擇注音輸入法的時候選錯成『註音』,接下來就算我多選幾次注音也沒辦法讓註音慢慢消失。
接下來希望可以跟開發者有些聯絡,來協助改善這個無調注音輸入法 :-)