Выбор номера не всегда возвращает китайский символ с ibus пиньинь
Я использую интеллектуальную клавиатуру пиньинь 1 с ibus
в Ubuntu для ввода китайских символов в мой документ.
input-method
разработан таким образом, что один печатает pinyin
связан с символом, а затем можно выбрать его из списка символов, используя цифры 0 - 9 на клавиатуре.
Пример:
Проблема: на прошлой неделе иногда случается, что, когда я нажимаю число от 0 до 9, метод ввода дает не китайский символ, а цифру, которую я нажал вместо этого. Более того, любой дальнейший ввод с клавиатуры не интерпретируется как ввод для ibus, а просто записывается на экране как есть, пока я не переключу режим ввода вручную на pinyin
снова.
Что я пробовал, по порядку:
- перезагружать
- удалите конфигурацию метода ввода и добавьте снова
- переустановить ибус-пиньинь
Казалось, ничего из этого не помогло.
Q: Кто-нибудь знает, как решить эту проблему?
Как примечание стороны, кажется, *ibus-engine-libpinyin.*.crash
файл внутри /var/crash
это может быть связано с этой проблемой. Тем не менее, я не уверен, как я могу отследить этот отчет об ошибке онлайн и посмотреть, есть ли у него уже решение онлайн.
редактировать: мой текущий обходной путь должен использовать fcitx
вместо ibus
... хотя это не решает проблему в программном обеспечении.
1 Интеллектуальная клавиатура пиньинь может быть установлена с помощью вызова sudo apt-get install ibus-libpinyin
и может быть расположен в Все настройки -> Ввод текста -> Источники ввода для использования -> + как китайский (Интеллектуальный пиньинь) (Ibus).
2 ответа
TL;DR: 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
в другом терминале, чтобы узнать последние pid
является 6798
, бежать 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) +++
Вывод строки прекратился после выбора символа в следующем столбце. Теперь я знаю, что это ядро сброшено. Альтернативный способ отладки с tail -f /var/log/syslog
знать это systemd-coredump
,
Итак, я бегу coredumpctl list
знать, связанный с coredump pid
является 6798
:
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, чтобы перейти на следующую страницу, я вижу интересное ключевое слово, которое совпадает с предыдущим strace
"s write()
выход:
(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:~$ /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) [с 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/*
и это решило проблему.
1.
Более того, любой дальнейший ввод с клавиатуры не интерпретируется как ввод для ibus, а просто записывается на экране как есть, пока я снова вручную не переключу режим ввода на пиньинь.
в SunPinyin
(с ibus
вход) вы можете установить начальное состояние вывода для английского / китайского языков. Не работает на IBus Pinyin 1.5.0
,
2. По крайней мере, в качестве временного промежутка до устранения сбоя, вы можете попробовать использовать Google Pinyin
, WubiPinyin
, SunPinyin
или же Pinyin
под fcitx
, который может лучше управлять латиноамериканским вводом.
sudo apt install fcitx fcitx-googlepinyin fcitx-table-wbpy fcitx-pinyin fcitx-sunpinyin
Вам нужно изменить метод ввода для fcitx
в Системных настройках -> Поддержка языков и перезагрузите систему (в моем случае достаточно выйти / войти). Значок в трее покажет клавиатуру (fcitx
) вместо кнопки En / Ru / Pl (ibus
).
Тогда ищи Google Pinyin
, WubiPinyin
, SunPinyin
или же Pinyin
в Все настройки -> Ввод текста -> Использовать источники ввода -> +, набрав китайский язык, чтобы сузить список.
3. (Временное облегчение) Нажав Shift, вы можете изменить ввод вручную, а также пунктуацию и т. Д. Проверьте: Все настройки -> Ввод текста -> Источник ввода -> Предпочтения -> Ярлыки, чтобы назначить правильный ярлык.