openvanilla / McBopomofo

小麥注音輸入法
http://mcbopomofo.openvanilla.org/
MIT License
624 stars 76 forks source link

讓選字行為更接近新注音 #431

Closed PlusoneChiang closed 8 months ago

PlusoneChiang commented 9 months ago

當候選字起點設定為新注音模式且游標在緩衝區末尾開啟候選字視窗時, 游標會回退一格到最末尾字前,讓選字行為更接近新注音。

zonble commented 9 months ago

請問一下,如果用戶取消選字,或是選完字之後,應該要回復到最後面嗎?還是繼續停在倒數一格的位置?

PlusoneChiang commented 9 months ago

請問一下,如果用戶取消選字,或是選完字之後,應該要回復到最後面嗎?還是繼續停在倒數一格的位置?

新注音在選字完成後,都會移動至下個位置,這個是目前的小麥就有的可選功能。

但我遺漏了一點沒改到。 以新注音的行為來說,當末尾字進入選字狀態時,游標會回退一格開啟候選視窗。 若此時取消選字,游標會回到原本的最末尾位置。 我修改的部分,如果在末尾進入選字後取消選字,游標不會回到最末尾。

zonble commented 9 months ago

從目前的 code 來看,目前只要游標在行尾選字,就會往回退一格。但,如果沒有把自動移動游標選項打開,或是直接取消選字,退回去之後,直接開始打字,就會變成從倒數第一個字的位置輸入,而不是從行尾輸入。感覺這應該不是預期的行為。

另外一個實作的方向是,我們或許不用實際去改動內部 grid 模型上的 cursor 的位置,而是「看起來」退後一格。小麥注音的內部邏輯與外顯的 UI 之間,有一個中介的狀態物件,我們或許可以在代表選字狀態的物件上,加上一小段邏輯,發現 cursor 在最後方而且選了新注音風格之後,在呼叫 setMarkedText:selectionRange:replacementRange: 這邊,把游標往前移動一格。這樣就可以省去取消選字的時候還要把游標放回行尾的邏輯。

zonble commented 9 months ago

前面那篇寫成 code 的話,大概就像這樣。

https://github.com/zonble/McBopomofo/commit/1687baa387491c5029982ce12790c5bdf1a56863

PlusoneChiang commented 9 months ago

前面那篇寫成 code 的話,大概就像這樣。

zonble@1687baa

這個我在測試的時後,如果搭配選字時使用JK移動游標的功能,因為在末尾開啟候選視窗時並沒有實際移動游標位置,所以如果使用JK移動游標,在末尾與末尾-1的這兩個位置上,會因為顯示都在末尾-1的位置,而無法確認游標的實際所在位置。

使用時,開啟候選視窗後,如果要修改的位置位於末尾-2的位置上: 預期行為是開啟候選視窗 --> 游標移至末尾-1 --> 按一次J --> 游標移動至末尾-2 實際行為會是要按兩次J,才能將游標實際移動至末尾-2的位置上。

另一種狀況是,如果在候選狀態下移動游標,當游標移動至末尾處時,在畫面上無法確認是否已經將游標移動至最末尾,此時如果取消候選狀態繼續輸入,就會出現在末尾-1的位置接續輸入的狀況。

所以或許實際上移動游標位置,會比較直觀的貼合預期行為。

我的修改是補上了在候選狀態下,如果取消選字狀態,且在新注音風格的情況下,會將處於末尾-1的游標,移動至末尾處。

zonble commented 8 months ago

現在這樣的寫法,看起來又會變成,開始選字前,游標在倒數第一個字,但取消選字就直接變成到行尾了。

建議一種作法,在把游標位置往前調之前,就分別記住移動前後的游標位置,這樣在確認與取消選字的時候,就直接回到應該回到的位置。

試試看 https://github.com/zonble/McBopomofo/commit/6d181a2a4cf42915cace8305044ac216f6c5c390

zonble commented 8 months ago

又改了一下

https://github.com/zonble/McBopomofo/commit/7cf18dc5bc416961b27bb8ec6a243a073f116a1b

PlusoneChiang commented 8 months ago

又改了一下

zonble@7cf18dc

測試過後,目前在新注音風格的情況下,已經完美的符合新注音於行尾選字的行為了。 但是小麥與新注音仍然不同,因為新注音本身的選字後游標自動遞移並不是可選功能, 所以就要考慮,新注音風格下自動遞移功能關閉時,行尾的選字行為該如何去執行,

目前是行尾選字游標會回退,取消選字或完成選字,游標會回到行尾。 如果是在其他位置進入選字,無論取消或完成選字,都會停留在原本的位置。

所以在自動遞移功能關閉時就要決定:

  1. 行尾選字,游標該不該自動退1。
  2. 若行尾選字自動退1,則取消或完成時,游標該不該自動遞移?

我是覺得如果沒開啟自動遞移功能,就不需要自動調整游標位置, 無論是否為行尾選字的狀態。 只要不自動退1,就不需要考慮游標需不需要回復的問題了。

zonble commented 8 months ago

如果是這樣的話,簡單加上一個判斷就好了。

https://github.com/zonble/McBopomofo/commit/c9c5ea7601c86b6fb7513bee3e901fdf8e8efdc0

PlusoneChiang commented 8 months ago

如果是這樣的話,簡單加上一個判斷就好了。

zonble@c9c5ea7

目前使用這個修改版本測試大概兩天左右,功能都很正常。 慣用新注音的人,基本只要開啟自動遞移,基本可以無痛轉換。

zonble commented 8 months ago

Fixed in #432