ある日、ログインしたら「処理を続行してもよろしいですか?」とダイアログ表示されて、OKクリックしようにもマウスカーソル表示されない、キーボード操作してもダイアログが閉じない。画面真っ暗のままで、何も操作できなくなって強制終了するしかなくなる。
仮想コンソールでログイン
Pop!_OSのリフレッシュインストール1してもいいのだけど、それはそれで手間がかかるので、やはり避けたい。
【Ubuntu日和】【第19回】Ubuntuが起動しなくなった時の対策あれこれ - PC Watchを見ると、
- パスワードを忘れたとき
- ログインできなくなったとき
- ソフトウェアが起動しなくなったとき
の3パターンが書かれている。今回のケースはログインできなくなったとき、なので Ctrl-Alt-F3 で仮想コンソールを起動させてログインしてみる。
すると、
Pop! OS 22.04 LTS pop-os tty3
pop-os login: arimasou16
Identified face as arimasou16
Welcome to Pop! OS 22.04 LTS (GNU/Linux 6.6.10-76860618-generic x86_64)
* Homepage: https://pop.system76.com
* Support: https://support.system76.com
The programs included with the Pop! OS system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Pop! OS comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
error: Invalid value "/home/arimasou16/.config/ibus-skk/user.dict" for '<jisyo>...': jisyo "/home/arimasou16/.config/ibus-skk/user.dict" not found
For more information try --help
と表示。まさかの user.dict が存在しなくてのエラー。無ければ自動で生成される2と思ってたけど、そうではないのか?
;;; -*- coding: euc-jp -*-
;; okuri-ari entries.
;; okuri-nasi entries.
で作成。すると回復した。
以下、何故そんなことになったのかを説明。
skkeletonでのユーザ辞書の扱い
GitHub - vim-skk/skkeleton: SKK implements for Vim/Neovim with denops.vimでユーザ辞書はUTF-8で読みこまれる。
userDictionary skkeleton-config-userDictionary (デフォルト “~/.skkeleton”) ユーザー辞書のパス JavaScriptの制約によりエンコーディングはUTF-8限定になります。
追記 2024-01-29
- “globalJisyo” オプションと “globalJisyoEncoding” オプションの削除
- “userJisyo” オプションは “userDictionary” オプションに変更
だそう。
追記ここまで
IBus SKKのユーザ辞書の扱い
IBus SKKのユーザ辞書はデフォルトEUC-JPで読み書きされるので;;; -*- coding: euc-jp -*-
で出力される。
にあるとおり、
dconf write /desktop/ibus/engine/skk/dictionaries "['host=localhost,port=1178,type=server', 'file=/usr/share/skk/SKK-JISYO.L,mode=readonly,type=file', 'file=/home/arimasou16/.config/ibus-skk/user.dict,mode=readwrite,type=file,encoding=UTF-8']"
と書き込む。
dconf read /desktop/ibus/engine/skk/dictionaries
['host=localhost,port=1178,type=server', 'file=/usr/share/skk/SKK-JISYO.L,mode=readonly,type=file', 'file=/home/arimasou16/.config/ibus-skk/user.dict,mode=readwrite,type=file,encoding=UTF-8', 'file=/home/arimasou16/.config/ibus-skk/SKK-JISYO.jawiki,mode=readonly,type=file,encoding=UTF-8']
読んでも、上記のとおり設定されているが、 user.dict はUTF-8で書き込まれない。 Look over invalid chars, or support UTF-8 dictionary? · Issue #45 · ueno/ibus-skk · GitHubにあるとおり、サポートされているはずなのに。dconfエディターで確認すると…
No schema available. A schema is what describes the use of a key, and Dconf Editor can't find one associated with this key. If the application that was using this key has been uninstalled, or if this key is obsolete, you may want to erase it.
と表示されてスキーマを認識しない。 Pop!_OSだからなのか?
追記 2024-01-30
解決策があった。 IBus-SKKで設定が保存されるようにするに記載した。
追記ここまで
gsettings - Why does dconf-editor think that my schema does not exist? - Ask Ubuntu
の回答見るに簡単な話ではなさそう。
で、EUC-JPのユーザ辞書をskkeleton
でユーザ辞書として読みこませると、それまで育てたユーザ辞書が壊れる。
だったら、Coding cookieである;;; -*- coding: utf-8 -*-
を先頭に追記すれば良いじゃないか、と思われるかも知れないがskkeleton
で書き込まれるとCoding cookieが消えてしまう。すると、IBus-skkではEUC-JPと判定されてしまう。
なので、結局、別ファイルのユーザ辞書を読み込ませるようにしている。
call skkeleton#config({
\'userDictionary':"~/.config/ibus-skk/user.dict.utf8",
\})
ある時、別ファイルでなくEUC-JPのユーザ辞書を間違えて読み込ませてしまったので user.dict を削除した。次回ログインするときに勝手に作成されるだろうと、シャットダウンしたら冒頭のようなことになってしまった…
skkeleton
のフック機能
まあ、skkeleton
にはフック機能が用意されているので、skkeleton
が最初に有効化された時、skkeleton
が無効化された後に実行される時、それぞれにEUC-JPからUTF-8に変換出力、UTF-8からEUC-JPへ変換出力などすれば、問題がなくなるのかなぁ。
function! s:skkeleton_init() abort
call system("iconv -f euc-jisx0213 -t utf8 ~/.config/ibus-skk/user.dict > ~/.config/ibus-skk/user.dict.utf8")
endfunction
function! s:skkeleton_disabled() abort
call system("iconv -f utf8 -t euc-jisx0213 ~/.config/ibus-skk/user.dict.utf8 > ~/.config/ibus-skk/user.dict.enc")
call system("skkdic-expr2 ~/.config/ibus-skk/user.dict + ~/.config/ibus-skk/user.dict.enc > ~/.config/ibus-skk/user.dict")
endfunction
augroup skkeleton-initialize-pre
autocmd!
autocmd User skkeleton-initialize-pre call s:skkeleton_init()
augroup END
augroup skkeleton-disable-post
autocmd!
autocmd User skkeleton-disable-post call s:skkeleton_disabled()
augroup END
これは、あまりにも忙しないので、ログイン後とか、ログアウト前とかに出来ないだろうか?ログインは.profile
ファイルなどに書けば良いとしても、ログアウト前となると難しそう。調べると、
シグナルと trap コマンド | UNIX & Linux コマンド・シェルスクリプト リファレンスなるコマンドがあることを知る。
trap commnad EXIT
で行けるのか思ったら、上手くいかない。zsh
だからか?それともシグナルの設定か?
zshrc
のフック機能
ともあれ、zshrc
なら
zshでhook関数を登録する #Zsh - Qiitaと色々hook関数があるらしいので、
.zshrc
trap_skk() {
iconv -f utf8 -t euc-jisx0213 ~/.config/ibus-skk/user.dict.utf8 > ~/.config/ibus-skk/user.dict.enc;
skkdic-expr2 ~/.config/ibus-skk/user.dict + ~/.config/ibus-skk/user.dict.enc > ~/.config/ibus-skk/user.dict;
}
if type "iconv" > /dev/null 2>&1; then
if type "skkdic-expr2" > /dev/null 2>&1; then
if [[ -f ~/.config/ibus-skk/user.dict.utf8 ]]; then
add-zsh-hook zshexit trap_skk
fi
fi
fi
と設定して上手くいった。これで様子見。とはいえ、元々ログイン時や、シェル終了のタイミングであれこれやるのは、冒頭と同じようなログイン出来ない(ログインしても操作不可能)なことになりそうで本末転倒な気もする…
skkeleton
使ってる人はどのようにIBus-SKKと共存しているのだろうか?それとも、日本語環境ではfcitx5
で使ってる人ばかりなんだろうか。
-
OSリフレッシュ後にログイン画面にアカウントが表示されなくなったので表示させるでもやり方を紹介してる。 ↩︎
-
ログイン(一度読みこんだ)後であれば、削除しても勝手に蘇える。そう不死鳥のように。 ↩︎