web-dev-qa-db-fra.com

La sélection d'un numéro ne renvoie pas toujours un caractère chinois avec ibus pinyin

J'utilise le clavier Pinyin intelligent 1 avec ibusdans Ubuntu pour saisir des caractères chinois dans mon document.

Le input-method est conçu de manière à pouvoir taper le pinyinassocié à un caractère, puis on peut le sélectionner dans une liste de caractères à l'aide de nombres -9 sur le clavier.

Exemple:

enter image description here


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 pinyinname__.

Ce que j'ai essayé, dans l'ordre:

  • redémarrer
  • supprime la configuration de la méthode d'entrée et rajoute
  • réinstaller ibus-pinyin

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 fcitxau 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) .

7
Patrick Trentin

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.

enter image description here

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 pidest 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 pidlié à 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 stracename __ '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.

9
林果皞

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é.

1
Christianus