J'utilise le clavier Pinyin intelligent 1 avec ibus
dans Ubuntu pour saisir des caractères chinois dans mon document.
Le input-method
est conçu de manière à pouvoir taper le pinyin
associé à un caractère, puis on peut le sélectionner dans une liste de caractères à l'aide de nombres -9 sur le clavier.
Exemple:
Problème: la semaine dernière, il arrive parfois que lorsque j'appuie sur un numéro de -9 la méthode d'entrée ne donne pas un caractère chinois mais le chiffre que j'ai appuyé à la place. De plus, toute autre entrée au clavier n’est pas interprétée comme une entrée pour ibus, elle est simplement écrite telle quelle à l’écran jusqu’à ce que je passe à nouveau manuellement en mode entrée sur pinyin
name__.
Ce que j'ai essayé, dans l'ordre:
Aucun de ceux-ci n'a semblé aider.
Q: Quelqu'un sait-il comment résoudre ce problème?
Remarque: il semble y avoir un fichier *ibus-engine-libpinyin.*.crash
dans /var/crash
qui pourrait être lié à ce problème. Cependant, je ne sais pas comment puis-je suivre ce rapport de bogue en ligne et voir s'il a déjà une solution en ligne.
modifier: ma solution actuelle consiste à utiliser fcitx
au lieu de ibus
.. bien que cela ne résolve pas vraiment le problème dans le logiciel.
1 Le clavier intelligent Pinyin peut être installé en appelant le Sudo apt-get install ibus-libpinyin
et peut être situé dans All Setting-->Text Entry-->Input sources to use-->+ as chinois (pinyin intelligent) (Ibus) .
TL; DR: rm ~/.cache/ibus/libpinyin/*
Réponse longue:
J'ai un problème similaire, sauf que mon problème ne peut pas renvoyer de caractères chinois dans la colonne suivante > .
La première chose que je fais est d'exécuter watch -n 3 -d 'ps auxww|tac'
pour comparer quelle est la différence entre la sortie lorsque succès (première colonne) et échec (colonne suivante) se produisent.
J'ai rapidement remarqué que /usr/lib/ibus/ibus-engine-libpinyin --ibus
fonctionnait toujours en cas de succès mais disparaissait en cas d'échec.
Cela signifie que /usr/lib/ibus/ibus-engine-libpinyin --ibus
se bloque lorsque vous sélectionnez un caractère dans la colonne suivante.
Depuis le processus précédent est parti, alors Super+Space pour basculer vers un nouveau processus libpinyin, sélectionnez la première colonne, puis exécutez ps auxww
dans un autre terminal pour connaître la dernière pid
est 6798
, exécutez Sudo strace -ff -vvv -p 6798 -s 1000000
pour comprendre le processus:
[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) +++
La sortie strace s'est arrêtée après la sélection du caractère dans la colonne suivante. Maintenant, je sais que c'est le noyau vidé . Une autre méthode consiste à déboguer avec tail -f /var/log/syslog
pour savoir que c'est systemd-coredump
.
Donc, je lance coredumpctl list
pour connaître le nom de pid
lié à coredump est 6798
:
Sun 2018-10-28 06:18:31 +08 6798 1000 1000 6 present /usr/lib/ibus/ibus-engine-libpinyin
J'exécute coredumpctl dump 6798 --output alamak
pour enregistrer coredump dans un fichier alamak, puis gdb -q /usr/lib/ibus/ibus-engine-libpinyin alamak
(le chemin de l'exécutable peut être obtenu à partir de ps auxww
ou coredumpctl list
) pour examiner le fichier 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))]
Essayez thread apply all bt full
et Enter pour naviguer à la page suivante, je peux voir un mot clé intéressant qui est identique à la sortie précédente strace
name __ '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 ()
Maintenant, le mot-clé principal qui cause le coredump a été confirmé, google const pinyin::PhoneticKeyMatrix*, const pinyin::ForwardPhoneticConstraints*
, va trouver ceci fil de rapport de bogue :
J'ai exécuté libpinyin dans le terminal et j'ai reçu le message d'erreur suivant:
utilisateur 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) [avec int nbest = 3; MatchResult = _GArray *; GArray = _GArray]: l'assertion `m_user_bigram-> store (last_token, utilisateur) 'a échoué. Avorté
Donc, cette erreur est liée aux données de l'utilisateur. Lorsque vous sélectionnez une phrase autre que la première, libpinyin essaiera de la stocker dans votre dossier personnel. Si ça ne marche pas, ça va échouer et sortir.
Vous voudrez peut-être vérifier le contenu dans ~/.cache/ibus/libpinyin /. J'ai simplement supprimé tous les fichiers de ce dossier et arrêté le processus ibus-engine-libpinyin pour le redémarrer. Ils reviennent à la normale. Je pense que le problème que vous avez est susceptible d'être le même que le mien. Sinon, veuillez fournir des messages d'erreur lorsque vous exécutez ibus-engine-libpinyin dans un terminal
...
J'ai suivi vos instructions et supprimé le dossier ~./Cache/ibus/libpinyin. Le problème résolu.
Voilà, lancez rm ~/.cache/ibus/libpinyin/*
et le problème a été résolu.
1.
De plus, toute entrée au clavier supplémentaire n'est pas interprétée comme une entrée pour ibus, elle est simplement écrite en l'état à l'écran jusqu'à ce que je passe manuellement en mode d'entrée à nouveau en pinyin.
Dans SunPinyin
(avec l'entrée ibus
), vous pouvez définir l'état initial d'une sortie pour anglais/chinois. Il ne fonctionne pas sur IBus Pinyin 1.5.0
.
2. Au moins comme solution provisoire jusqu'à ce que l'incident soit réparé, vous pouvez essayer d'utiliser Google Pinyin
, WubiPinyin
, SunPinyin
ou Pinyin
sous fcitx
, qui permet de mieux gérer l'entrée romanisée.
Sudo apt install fcitx fcitx-googlepinyin fcitx-table-wbpy fcitx-pinyin fcitx-sunpinyin
Vous devez changer la méthode de saisie pour fcitx
dans le System Settings-->Language Support et redémarrez le système (dans mon cas, il suffit de vous déconnecter/de vous connecter). L'icône du bac va montrer keyboard (fcitx
) à la place de En / Ru / Pl bouton (ibus
).
Recherchez ensuite Google Pinyin
, WubiPinyin
, SunPinyin
ou Pinyin
dans All Setting-->Text Entry-->Input sources to use-->+, en tapant en chinois pour réduire la liste.
. (Facilitation temporaire) En appuyant sur Shift vous pouvez modifier l’entrée manuellement ainsi que la ponctuation , etc. . Vérifier: All Settings-->Text Entry-->Input source-->Preferences-->Shortcuts assigner un raccourci approprié.