Python: open r+

Fedora 37 で今頃気がついたけど。
Anthy の辞書がまた PageDown でページ送りができなくなっているじゃん。

/usr/share/ibus-anthy/engine/engine.py は八月に更新されているな。
バッチは当ててくれなかったのか、気がつかなかったようで。
do_page_down なんてメソッドは定義されていないよメンテナさん。
しかたがない、今回も自前バッチを。

#!/usr/bin/env python3

'''
    Fedora 37 の Anthy で PageUp(Down) にて辞書送りできないのを修正
    コピペして sudo で実行しログインのやりなおし
    万が一失敗したら gnome-softwere から入れ直しで元通り
'''

import os

os.chdir('/usr/share/ibus-anthy/engine')

with open('engine.py') as f:
    src = f.read()
    dst = src.replace('do_page_up()', '__page_up(0)', 1).replace('do_page_down()', '__page_down(0)', 1)
    with open('engine.py', 'w') as g:
        g.write(dst)

今回は replace で。

いや Python の open には r+ という読み書きモードがあるんだけど?
と思うかもだけど r+ は使わないほうがいいよ。

#!/usr/bin/env python3

import os

with open('rw.txt', 'w') as f:
    f.write('ABCDEFG')

with open('rw.txt', 'r+') as f:
    src = f.read()
    #
    # 巻き戻すのを忘れずに
    f.seek(0)
    #
    # r+ での書き込みは以前の内容が残る
    dst = src.replace('ABCDE', 'a', 1)
    f.write(dst)
    #
    # 確認
    f.seek(0)
    print(f.read())
    #
    #=> 'aFGDEFG'

ね。
書き出しが短いと最初の語尾が残ってしまうんです。
文字数を合わせる、又はそれ以上なら問題ないんですけど。
ただ文字数を合わせても日本語だと以下のように。

#!/usr/bin/env python3

import os

with open('rw2.txt', 'w') as f:
    f.write('あいうえお')

with open('rw2.txt', 'r+') as f:
    src = f.read()
    f.seek(0)
    #
    # write は UTF-8 で書き出す
    dst = src.replace('あいう', 'aiu', 1)
    f.write(dst)
    #
    # 確認
    f.seek(0)
    print(f.read())
    #
    #=> 'aiuえおえお'

日本語はほぼ 3byte なので。
対策はあるんだろうけど、一番の対策は使わないことですよね。

ところで Nautilus 43 のリネームで入力メソッド切り替えが初回が無視される。
いやこれ US 配列キーボード愛用者以外には関係ないといえばそうなんですけど。
Ctrl+J のほうを使えばいいんだけど macOS と同じコッチを使ってしまうし。

Fedora とは関係ないけど GTK4 になった GHex もなんかおかしいな。

ghex font

Source Code Pro 以外のフォントだとはみ出すんだが。
なにがどうしてこうなるのか全然わからん。