选择数字并不总是用 ibus 拼音返回汉字

选择数字并不总是用 ibus 拼音返回汉字

我用智能拼音键盘1ibusUbuntu 中将中文字符输入到我的文档中。

设计方式input-method是,人们可以键入与字符相关联的,然后可以使用键盘上的数字从pinyin字符列表中选择它。09

例子:

在此处输入图片描述


问题:上周,我有时会按数字键0-9输入法不会产生中文字符,而是产生我按的数字。此外,任何进一步的键盘输入都不会被解释为 ibus 的输入,而只是按原样显示在屏幕上,直到我再次手动切换输入模式pinyin

我按以下顺序尝试过:

  • 重启
  • 删除输入法配置,然后重新添加
  • 重新安装ibus-pinyin

这些似乎都没有什么帮助。

问:有谁知道如何解决这个问题?


*ibus-engine-libpinyin.*.crash顺便说一句,里面似乎有一个文件/var/crash可能与此问题有关。但是,我不确定如何在线跟踪此错误报告并查看它是否已在线解决。

编辑:我目前的解决方法是使用fcitx而不是ibus..尽管这并不能真正解决软件中的问题。

1 智能拼音键盘可以通过调用来安装,sudo apt-get install ibus-libpinyin并且可以All Setting-->Text Entry-->Input sources to use-->+位于中文(智能拼音)(Ibus)

答案1

总结: rm ~/.cache/ibus/libpinyin/*

长答案:

我有类似的问题,只是我的问题是无法在下一列返回任何汉字>

我做的第一件事是运行watch -n 3 -d 'ps auxww|tac' 以比较成功(第一列)和失败(下一列)时输出的区别。

我很快注意到,/usr/lib/ibus/ibus-engine-libpinyin --ibus成功时它仍在运行,但失败时它就会消失。

在此处输入图片描述

这意味着/usr/lib/ibus/ibus-engine-libpinyin --ibus在下一列中选择字符时进程崩溃。

由于之前的进程已经没有了,所以Super+Space要切换新的libpinyin进程,选择第一列,然后ps auxww在另一个终端中运行,就可以知道最新的pid6798,运行sudo strace -ff -vvv -p 6798 -s 1000000即可了解进程:

[pid  6798] lseek(14, 12288, SEEK_SET)  = 12288
[pid  6798] read(14, "", 4096)          = 0
[pid  6798] write(2, "ibus-engine-libpinyin: ../src/lookup/phonetic_lookup.h:901: bool pinyin::PhoneticLookup<nbest>::train_result3(const pinyin::PhoneticKeyMatrix*, const pinyin::ForwardPhoneticConstraints*, MatchResult) [with int nbest = 3; MatchResult = _GArray*; GArray = _GArray]: Assertion `m_user_bigram->store(last_token, user)' failed.\n", 323) = 323
[pid  6798] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f59a80e2000
[pid  6798] rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
[pid  6798] rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
[pid  6798] getpid()                    = 6798
[pid  6798] gettid()                    = 6798
[pid  6798] tgkill(6798, 6798, SIGABRT) = 0
[pid  6798] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid  6798] --- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=6798, si_uid=1000} ---
[pid  6800] <... poll resumed> <unfinished ...>) = ?
[pid  6799] <... restart_syscall resumed>) = ?
[pid  6800] +++ killed by SIGABRT (core dumped) +++
[pid  6799] +++ killed by SIGABRT (core dumped) +++
+++ killed by SIGABRT (core dumped) +++

strace 输出在 select character in next column 之后停止。现在我知道这是核心转储。另一种方法是使用 进行调试以tail -f /var/log/syslog了解它的systemd-coredump

所以我运行后coredumpctl list发现与 coredump 相关的pid6798

Sun 2018-10-28 06:18:31 +08    6798  1000  1000   6 present   /usr/lib/ibus/ibus-engine-libpinyin

我运行coredumpctl dump 6798 --output alamak将 coredump 保存到 alamak 文件中,然后运行gdb -q /usr/lib/ibus/ibus-engine-libpinyin alamak(可执行路径可以从ps auxww或获取coredumpctl list)来检查 coredump 文件:

xb@dnxb:~$ gdb -q /usr/lib/ibus/ibus-engine-libpinyin alamak
expansion:  History expansion on command input is on.
filename:  The filename in which to record the command history is "/home/xiaobai/.gdb_history".
remove-duplicates:  The number of history entries to look back at for duplicates is 0.
save:  Saving of the history record on exit is on.
size:  The size of the command history is 10000000.
Reading symbols from /usr/lib/ibus/ibus-engine-libpinyin...(no debugging symbols found)...done.

warning: core file may not match specified executable file.
[New LWP 6798]
[New LWP 6800]
[New LWP 6799]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `/usr/lib/ibus/ibus-engine-libpinyin --ibus'.
Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
[Current thread is 1 (Thread 0x7f59a80971c0 (LWP 6798))]

尝试thread apply all bt full导航到下一页,我可以看到一些有趣的关键字,它们与之前的输出Enter相同:stracewrite()

(gdb) thread apply all bt full

Thread 3 (Thread 0x7f59a36a9700 (LWP 6799)):
...
#1  0x00007f59a67cd801 in __GI_abort () at abort.c:79
        save_stage = 1
        act = 
          {__sigaction_handler = {sa_handler = 0x555b8ce58800, sa_sigaction = 0x555b8ce58800}, sa_mask = {__val = {0, 18446744073709551600, 0, 0, 0, 140733365772904, 0, 140733365772736, 140023023567312, 21474836480, 140023023552472, 0, 2476426370025201152, 140023023537428, 0, 140023023552472}}, sa_flags = -1488188568, sa_restorer = 0x7f59a74c0c00}
        sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x00007f59a67bd39a in __assert_fail_base (fmt=0x7f59a69447d8 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x7f59a74c0c00 "m_user_bigram->store(last_token, user)", file=file@entry=0x7f59a74c0b68 "../src/lookup/phonetic_lookup.h", line=line@entry=901, function=function@entry=0x7f59a74c14e0 "bool pinyin::PhoneticLookup<nbest>::train_result3(const pinyin::PhoneticKeyMatrix*, const pinyin::ForwardPhoneticConstraints*, MatchResult) [with int nbest = 3; MatchResult = _GArray*; GArray = _GArra"...) at assert.c:92
        str = 0x555b8ce58800 ""
        total = 4096
#3  0x00007f59a67bd412 in __GI___assert_fail (assertion=0x7f59a74c0c00 "m_user_bigram->store(last_token, user)", file=0x7f59a74c0b68 "../src/lookup/phonetic_lookup.h", line=901, function=0x7f59a74c14e0 "bool pinyin::PhoneticLookup<nbest>::train_result3(const pinyin::PhoneticKeyMatrix*, const pinyin::ForwardPhoneticConstraints*, MatchResult) [with int nbest = 3; MatchResult = _GArray*; GArray = _GArra"...) at assert.c:101
#4  0x00007f59a7476a71 in pinyin_train () at /usr/lib/x86_64-linux-gnu/libpinyin.so.13
#5  0x0000555b8c7e5689 in  ()

现在导致 coredump 的主要关键字已经确定了,google 一下const pinyin::PhoneticKeyMatrix*, const pinyin::ForwardPhoneticConstraints*,会发现这个错误报告线程

我在终端中运行 libpinyin 并收到以下错误消息:

debian-user:~$ /usr/lib/ibus/ibus-engine-libpinyin --ibus ibus-engine-libpinyin: ../src/lookup/phonetic_lookup.h:901: bool pinyin::PhoneticLookup::train_result3(const pinyin::PhoneticKeyMatrix*, const pinyin::ForwardPhoneticConstraints*, MatchResult) [with int nbest = 3; MatchResult = _GArray*; GArray = _GArray]: 断言 `m_user_bigram->store(last_token, user)' 失败。已中止

所以这个错误与用户数据有关。当您选择除第一个短语之外的其他短语时,libpinyin 会尝试将其存储在您的主文件夹中。如果不行,它将失败并退出。

您可能需要检查 ~/.cache/ibus/libpinyin/ 中的内容。我只是删除了此文件夹中的所有文件并终止了 ibus-engine-libpinyin 进程以重新启动它。它们又恢复正常了。我认为您遇到的问题可能与我的问题相同。如果不是,请在终端中运行 ibus-engine-libpinyin 时提供错误消息

...

我按照你的指示删除了~./cache/ibus/libpinyin文件夹。问题解决了。

就是这样,运行rm ~/.cache/ibus/libpinyin/*,问题就解决了。

答案2

1.

此外,任何进一步的键盘输入都不会被解释为 ibus 的输入,而只是按原样写在屏幕上,直到我再次手动将输入模式切换到拼音。

SunPinyin在(使用输入)中ibus,您可以设置输出的初始状态英文/中文。它不适用于IBus Pinyin 1.5.0

2. 至少作为修复崩溃之前的权宜之计,您可以尝试使用、 或Google PinyinWubiPinyin的,这样能够更好地管理罗马化输入。SunPinyinPinyinfcitx

sudo apt install fcitx fcitx-googlepinyin fcitx-table-wbpy fcitx-pinyin fcitx-sunpinyin

您需要fcitx在 中更改 输入法System Settings --> Language Support并重新启动系统(在我的情况下,注销/登录就足够了)。托盘图标将显示keyboard( fcitx) 代替En/ Ru/Pl按钮 ( ibus)。

然后查找Google Pinyin、、WubiPinyin或在、中输入SunPinyinPinyinAll Setting --> Text Entry --> Input sources to use --> +中国人缩小列表范围。

3.(临时便利)按一下,Shift您可以手动更改输入以及标点符号ETC. 检查:All Settings --> Text Entry --> Input source --> Preferences --> Shortcuts指定适当的快捷方式。

相关内容