有馬総一郎のブログ

(彼氏の事情)

2024年01月28日 08:31:30 JST - 5 minute read - Comments - Linux

user.dictを削除したら、ログイン後操作できなくなった話とIBus-SKKとskkeletonの話

ある日、ログインしたら「処理を続行してもよろしいですか?」とダイアログ表示されて、OKクリックしようにもマウスカーソル表示されない、キーボード操作してもダイアログが閉じない。画面真っ暗のままで、何も操作できなくなって強制終了するしかなくなる。

Pop!_OS

仮想コンソールでログイン

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で設定が保存されるようにするに記載した。

追記ここまで


dconfエディター

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で使ってる人ばかりなんだろうか。


  1. OSリフレッシュ後にログイン画面にアカウントが表示されなくなったので表示させるでもやり方を紹介してる。 ↩︎

  2. ログイン(一度読みこんだ)後であれば、削除しても勝手に蘇える。そう不死鳥のように。 ↩︎

Tags: Pop!_OS SKK Vim

Blu-rayの動画(m2ts)をFFmpegを使って分秒(チャプター)で分割する IBus-SKKで設定が保存されるようにする

comments powered by Disqus