想嘗試修改不用方向鍵選字

615 views
Skip to first unread message

yoco

unread,
Jun 23, 2011, 10:00:02 AM6/23/11
to Chewing IM Development
今天跟學弟討論一下關於新酷音的使用,我們兩個人都覺得有的時候要使用方向鍵選字有點懶,所以在想說能不能修改成不用方向鍵選字,雖然 tab 切字已
經解決很多選字問題,但是有的時候要用左右鍵退回去某處選字,手就必須離開主鍵區。

跟學弟討論過後,因為我們兩個都有在使用vim,很習慣 hjkl 的移動方式,所以我打算自己動手修改,嘗試使用 shift + hjkl 的方法
來移動游標以及拉下選字選單。

稍微爬了一下程式碼,但是不知道該從哪邊下手,能不能請前輩指導一下該從哪個 class 或是檔案開始閱讀?

多謝。

yoco

Tib

unread,
Jun 23, 2011, 12:52:33 PM6/23/11
to chewin...@googlegroups.com
Hi,

其實我已經 hack 進去好久了, 所以現在的 win32-chewing 或其他用 libchewing 弄出來的酷音輸入法就有這個功能 (爆)
當時是選 jk 當左右鍵, 假如沒把選字鍵設成 asdfghjkl 這排的話, j 就是左移, k 就是右移
(我自己是用 jk 左右移 + 數字鍵 0-9 選字)

現在想想好像要用 hl 才符合 vim 方向鍵習慣, 但似乎沒有比較好按 hmm
又懶得弄設定介面 ... 就這樣好幾年過去 (下略

這段程式碼在 libchewing\src\chewingio.c # OnKeyDefault 裡面。

BR,
Tib

2011/6/23 yoco <peter...@gmail.com>:

> --
> 您已訂閱「Google 網上論壇」的「Chewing IM Development」群組,因此我們特別傳送這封郵件通知您。
> 如要在此群組張貼留言,請傳送電子郵件至 chewin...@googlegroups.com
> 如要取消訂閱此群組,請傳送電子郵件至 chewing-deve...@googlegroups.com
> 如需更多選項,請造訪此群組:http://groups.google.com/group/chewing-devel?hl=zh-TW
>
>

yoco

unread,
Jun 23, 2011, 9:43:36 PM6/23/11
to Chewing IM Development
Hi Tib,

感謝大大回覆。但小弟尚有兩個疑惑的地方。

小弟剛剛看了一下 chewingio.c,發現 jk 真的可以用來換頁,原來還有這種隱藏功能 XD

可能我前面沒有講清楚抱歉 QQ
其實我想要的是可以在 edit 模式下,不使用方向鍵,就能移動 buffer 游標。
因為有的時候輸入錯誤的字,手還要按「←→」移到前面去,再按「↓」拉出 select 模式。
用慣 vim 以後,由於雙手懶惰,所以希望可以有別的方法移動 buffer 的游標。

感謝前輩回覆,這樣我知道 chewing 處理按鍵是在哪邊了。

本來我昨天後來繼續看程式碼,
看到好似可以在 ChewingIME.cpp 的 FilterKeyByChweing() 這個函數進行按鍵的處理,
原來的程式碼有 if ( key == VK_LEFT ) g_chewing->Left(),
我想說可以在稍微前面一點的地方判斷「Shift + HJKL」然後呼叫 g_chewing->Left/Up/Down/Right()。
這樣應該也可以吧?

若小弟有任何成果會再回來報告 XD

感謝。

On 6月24日, 上午12時52分, Tib <tiberius.t...@gmail.com> wrote:
> Hi,
>
> 其實我已經 hack 進去好久了, 所以現在的 win32-chewing 或其他用 libchewing 弄出來的酷音輸入法就有這個功能 (爆)
> 當時是選 jk 當左右鍵, 假如沒把選字鍵設成 asdfghjkl 這排的話, j 就是左移, k 就是右移
> (我自己是用 jk 左右移 + 數字鍵 0-9 選字)
>
> 現在想想好像要用 hl 才符合 vim 方向鍵習慣, 但似乎沒有比較好按 hmm
> 又懶得弄設定介面 ... 就這樣好幾年過去 (下略
>
> 這段程式碼在 libchewing\src\chewingio.c # OnKeyDefault 裡面。
>
> BR,
> Tib
>

> 2011/6/23 yoco <peter.x...@gmail.com>:

Tib

unread,
Jun 23, 2011, 9:48:51 PM6/23/11
to chewin...@googlegroups.com
Hi yoco,

我是設定空白鍵選字, 先按 space 進入選字模式, 再用 jk 往前移、空白換頁、數字鍵選擇選項, tab 斷詞 ...
沒有進入選字模式要怎麼移動我就不知道了, 等你研究 XD

BR,
Tib

2011/6/24 yoco <peter...@gmail.com>:

yoco

unread,
Jun 29, 2011, 12:23:58 PM6/29/11
to Chewing IM Development
Hi Tib,

感謝回覆,敝人初步已經成功啦,目前是改 ChewingIME.cpp 的 FilterKeyByChweing() 這個函數,
在裡面加上 if ( keystatus[VK_SHIFT] && key == 'H' ) key = VK_KEFT ;
如果就可以把 Shift H 竄改成 Shift Left。

但是,trace 了一下原始碼,發現 Shift Left 再新酷音似乎有別的用途,
不過我看 chewingio.c 裡面,OnKeyShiftLeft() 的註解寫著「Add phrase in Hanin Style」
但我不確定 Shift Left 到底是什麼作用,因為我平常按下 Shfit Left 的行為跟只按 Left 好像一樣。

可以請教一下 Shift Left 是作什麼用的嗎?

如果說真的跟原有功能有衝突的話,我可能考慮增加一個「HJKL編輯模式」,然後使用某個熱鍵進入,
gcin 好像也有 Ctrl + e 就可以進入這種模式的功能。

yoco.

蕭刻庭

unread,
Jun 29, 2011, 1:51:19 PM6/29/11
to Chewing IM Development
忘記附上 diff file,如果有前輩有空,還請幫小弟 review,多謝 :)
ShiftHJKL.diff

Kan-Ru Chen

unread,
Jun 29, 2011, 9:45:12 PM6/29/11
to chewin...@googlegroups.com
yoco <peter...@gmail.com> writes:

> Hi Tib,
>
> 感謝回覆,敝人初步已經成功啦,目前是改 ChewingIME.cpp 的 FilterKeyByChweing() 這個函數,
> 在裡面加上 if ( keystatus[VK_SHIFT] && key == 'H' ) key = VK_KEFT ;
> 如果就可以把 Shift H 竄改成 Shift Left。
>
> 但是,trace 了一下原始碼,發現 Shift Left 再新酷音似乎有別的用途,
> 不過我看 chewingio.c 裡面,OnKeyShiftLeft() 的註解寫著「Add phrase in Hanin Style」
> 但我不確定 Shift Left 到底是什麼作用,因為我平常按下 Shfit Left 的行為跟只按 Left 好像一樣。
>
> 可以請教一下 Shift Left 是作什麼用的嗎?

Shift + Left/Right 是用來做動態加入詞庫的功能,例如:

新酷音輸入法
[----][----]‾

一般是斷成這樣,若是使用 Shift + Left 用游標把整串字反白,
則會加入新詞

新酷音輸入法
[----------]‾

> 如果說真的跟原有功能有衝突的話,我可能考慮增加一個「HJKL編輯模式」,然後使用某個熱鍵進入,
> gcin 好像也有 Ctrl + e 就可以進入這種模式的功能。

--
Kanru

蕭刻庭

unread,
Jun 29, 2011, 10:39:41 PM6/29/11
to chewin...@googlegroups.com
Hi Kanru,

多謝你的回覆,那我現在的作法果然不行,那我接下來有兩個選擇:

1. 把 keystatus[VK_SHIFT] 設成 0,讓 Shift H 變成單純的 Left 而不是 Shift Left。

2. 增加一個「HJKL」編輯模式。

可以詢問一下大家比較偏好哪一種嗎?
決定以後,我就可以進行「設定視窗」選項的 coding。

yoco

2011/6/30 Kan-Ru Chen <ka...@kanru.info>

Shift + Left/Right 是用來做動態加入詞庫的功能,例如:

新酷音輸入法
[----][----]‾

一般是斷成這樣,若是使用 Shift + Left 用游標把整串字反白,
則會加入新詞

新酷音輸入法
[----------]‾

> 如果說真的跟原有功能有衝突的話,我可能考慮增加一個「HJKL編輯模式」,然後使用某個熱鍵進入,

--
Kanru

--
蕭刻庭, Xiao Ke-Ting
Artificial Intelligence Lab
National Tsing Hua University

hialan

unread,
Jun 29, 2011, 10:42:33 PM6/29/11
to chewin...@googlegroups.com
我投 「2. 增加一個「HJKL」編輯模式。」 一票

Kan-Ru Chen

unread,
Jul 5, 2011, 12:38:54 AM7/5/11
to chewin...@googlegroups.com
Hi,

蕭刻庭 <peter...@gmail.com> writes:

> Hi Kanru,
>
> 多謝你的回覆,那我現在的作法果然不行,那我接下來有兩個選擇:
>
> 1. 把 keystatus[VK_SHIFT] 設成 0,讓 Shift H 變成單純的 Left 而不是 Shift Left。
>
> 2. 增加一個「HJKL」編輯模式。
>
> 可以詢問一下大家比較偏好哪一種嗎?
> 決定以後,我就可以進行「設定視窗」選項的 coding。

我倒是沒有特別的偏好,因為這些都是修改在 win32-chewing 的 client 部份,
只要修改本身不干擾到其他功能就好。

..發想時間..

最近在想,這些增強的編輯功能到底該做在 client 部份,還是要讓 libchewing
直接支援,但如此一來又會增加很多跟選字引擎本身無關的程式碼,如何切割是個
問題...

如果考慮原本打算把 keyboard layout 獨立出來,也許也可以把 pre-edit 的部
份也切割出來,所以就會有處理:輸入,虛擬編輯區,斷詞,字典等部份。

--
Kanru

蕭刻庭

unread,
Jul 5, 2011, 3:37:57 AM7/5/11
to chewin...@googlegroups.com
Hi,

我來報告一下目前進度。

後來採用 HJKL 模式的設計,進入 HJKL 模式的方法很簡單:連按兩下 H 或是 J。

因為實際輸入注音的時候,連按兩個「H(ㄘ)」不會是有效的輸入,所以我就把他換成←,然後進入 HJKL 模式。

同理,連按兩個「J(ㄨ)」就被我換成↓,會拉出選字視窗,進入 HJKL 模式。

實際使用測試的結果,比起原來的 Shift + HJKL 還要順手許多 ^O^


不過目前還有一些問題想要請教。

第一:
我目前判斷連按兩下 H/J 的方法,是去 g_chewing->zuinStr(),判斷內容是不是「ㄘ/ㄨ」,
但是這個方法只對一般注音配置合理,如果是其他的注音配置,H 不一定是 ㄘ,請問這邊有什麼建議嗎?

第二:
我用了一個 static 變數,來判定現在是不是在 HJKL 模式,
我不認為使用 static 是個好的設計,但是我又確實需要一個地方存放這個 state,
請問應該放入到哪邊好?

yoco

2011/7/5 Kan-Ru Chen <ka...@kanru.info>

--
Kanru

--
您已訂閱「Google 網上論壇」的「Chewing IM Development」群組,因此我們特別傳送這封郵件通知您。
如要在此群組張貼留言,請傳送電子郵件至 chewin...@googlegroups.com
如要取消訂閱此群組,請傳送電子郵件至 chewing-deve...@googlegroups.com
如需更多選項,請造訪此群組:http://groups.google.com/group/chewing-devel?hl=zh-TW

Kan-Ru Chen

unread,
Jul 5, 2011, 4:02:31 AM7/5/11
to chewin...@googlegroups.com
Hi,

蕭刻庭 <peter...@gmail.com> writes:

> Hi,
>
> 我來報告一下目前進度。
>
> 後來採用 HJKL 模式的設計,進入 HJKL 模式的方法很簡單:連按兩下 H 或是 J。
>
> 因為實際輸入注音的時候,連按兩個「H(ㄘ)」不會是有效的輸入,所以我就把他
> 換成←,然後進入 HJKL 模式。
>
> 同理,連按兩個「J(ㄨ)」就被我換成↓,會拉出選字視窗,進入 HJKL 模式。
>
> 實際使用測試的結果,比起原來的 Shift + HJKL 還要順手許多 ^O^

賀 :)

> 不過目前還有一些問題想要請教。
>
> 第一:
> 我目前判斷連按兩下 H/J 的方法,是去 g_chewing->zuinStr(),判斷內容是不是「ㄘ/ㄨ」,
> 但是這個方法只對一般注音配置合理,如果是其他的注音配置,H 不一定是 ㄘ,請問這邊有什麼建議嗎?

1) 交給酷音處理前先判斷,如此一來不論什麼配置都可以使用同樣的 key (h/j)
來啟動這個模式

2) 由酷音的 layout 轉換過之後再判斷,這樣一來各種 layout 都是用一樣的音
(ㄘ/ㄨ) 來處理

> 第二:
> 我用了一個 static 變數,來判定現在是不是在 HJKL 模式,
> 我不認為使用 static 是個好的設計,但是我又確實需要一個地方存放這個 state,
> 請問應該放入到哪邊好?

libchewing 有 ChewingContext, win32-chewing 應該也有類似的地方可以來存放 state

--
Kanru

蕭刻庭

unread,
Jul 5, 2011, 10:41:08 AM7/5/11
to chewin...@googlegroups.com
Hi,

真可惜,爬了一下 code 但是不知道應該怎麼給酷音作前處理。
找了一下也沒看到怎麼丟給 layout 處理 Orz

只有看到設定跟取得 g_chewing->Layout 是什麼,
但是如果我要交給 g_chewing 的 layout 作的話,
這樣就變成把跟選字引擎無關的部份摻進去了,

前輩可以給一點提示嗎?

如果說不考慮 layout 問題的話,
目前試用感覺還蠻順手的。
diff 如附檔。

如果有人懶得自己編譯但是想試用看看的話,可以到這邊抓

Yoco


2011/7/5 Kan-Ru Chen <ka...@kanru.info>
Kanru

--
您已訂閱「Google 網上論壇」的「Chewing IM Development」群組,因此我們特別傳送這封郵件通知您。
如要在此群組張貼留言,請傳送電子郵件至 chewin...@googlegroups.com
如要取消訂閱此群組,請傳送電子郵件至 chewing-deve...@googlegroups.com
如需更多選項,請造訪此群組:http://groups.google.com/group/chewing-devel?hl=zh-TW

HJKL.diff
Reply all
Reply to author
Forward
0 new messages