Skip to content

「加詞失敗:字數不符或夾雜符號」訊息合併兩種失敗原因,游標方向造成的失敗會誤導使用者排查符號 #813

Description

@Tsun-u

問題描述

「加詞失敗:字數不符或夾雜符號」這個錯誤訊息把兩種不同的失敗原因合併成一句,其中「字數不符」的實際成因(加詞方向設定為向後抓字、但游標在緩衝區尾端)對使用者完全不可見,容易誤導使用者往「符號」方向排查。

實際案例:使用者在 fcitx5-chewing(預設 AddPhraseForward=True,對應 chewing_set_addPhraseDirection(ctx, 0))打出「物流士」三個純漢字後按 Ctrl+3,反覆失敗。因為游標停在句尾、方向設定又是抓游標後面的字,所以永遠「字數不符」——但訊息裡的「夾雜符號」讓使用者一直懷疑是輸入內容有問題,而不是游標位置/方向設定。

環境

  • libchewing 0.11.0(Ubuntu 26.04 套件 libchewing3 0.11.0-1)
  • fcitx5-chewing 5.1.10

重現步驟

使用 Python ctypes 直接呼叫 C API(乾淨的暫存使用者詞庫):

import ctypes, os, tempfile
lib = ctypes.CDLL("libchewing.so.3")
lib.chewing_new2.restype = ctypes.c_void_p
lib.chewing_new2.argtypes = [ctypes.c_char_p]*2 + [ctypes.c_void_p]*2
lib.chewing_aux_String.restype = ctypes.c_char_p
lib.chewing_aux_String.argtypes = [ctypes.c_void_p]

def run(label, direction, left_moves):
    tmpdir = tempfile.mkdtemp()
    ctx = ctypes.c_void_p(lib.chewing_new2(
        None, os.path.join(tmpdir, "chewing.dat").encode(), None, None))
    lib.chewing_set_maxChiSymbolLen(ctx, 20)
    if direction is not None:
        lib.chewing_set_addPhraseDirection(ctx, direction)
    for ch in "j4xu.6g4":          # ㄨˋ ㄌㄧㄡˊ ㄕˋ(三個純漢字)
        lib.chewing_handle_Default(ctx, ord(ch))
    for _ in range(left_moves):
        lib.chewing_handle_Left(ctx)
    lib.chewing_handle_CtrlNum(ctx, ord('3'))
    print(label, "->", lib.chewing_aux_String(ctx).decode())

run("預設方向、游標句尾", None, 0)
run("預設方向、游標句首", None, 3)
run("direction=1、游標句尾", 1, 0)

輸出:

預設方向、游標句尾 -> 加詞失敗:字數不符或夾雜符號
預設方向、游標句首 -> 加入:勿流逝
direction=1、游標句尾 -> 加入:勿流逝

緩衝區內是三個純漢字、完全沒有符號,但訊息仍然提到「夾雜符號」。

建議

把兩種失敗原因拆成兩個訊息,例如:

  • 字數不符(方向抓不到足夠的字):「加詞失敗:游標之後(或之前,依方向設定)不足 N 個字」
  • 真的夾雜符號時才顯示:「加詞失敗:詞中夾雜符號」

這樣使用者能立刻知道該調整的是游標位置或加詞方向設定,而不是去檢查輸入內容。

(附帶一提:前端 fcitx5-chewing 的選項文案「前方加詞」也不容易讓人聯想到「抓游標後方的字」,若訊息拆開後能帶出方向資訊,對前端使用者的困惑會有很大幫助。)

必要的話我可以協助提 PR。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions