昔の最近の出来事(2023.09)

2023/09/30

昼前起床。寝すぎ。

Emacsのフォントフォールバックでみつけられないフォントファミリの件。
結局、どうにもうまく見つけられそうにないのと、見つけられたとしても時間がかかる事を鑑みると、 豆腐になるユニコード文字が表示可能なフォントはWebで検索して調べ、 必要に応じてフォントをインストールした後、.emacsに 「(set-fontset-font t '文字セット "フォントファミリ名")」 を記す事で対応するのが、普段使いする事を考えると一番良いのではないか?という気がしてきました😓。 という訳でこの件については一旦終了。

フォントフォールバックに時間がかかる件の対応について。
以前、表示はされるけど どの文字で時間がかかっているのか判らないので、 set-fontset-fontでの対応のしようが無い....という事になっていました。 そこで、時間がかかる場所の時間計測が可能なので、何かしら対処の手掛かりとなるようなメッセージを 出せないかと考えてみました。一応出せそうな所までは出来たものの、 メッセージを 関数message()で出力しようとすると Emacs本体が落ちるという現象に見舞われています🥺。 原因がよく判っていないのですが、画面表示が行なわれていない状態で message()を何度も 行なうとダメなのでは?という気がしたりも。

そういえば、フォント関連のソースを弄っていて、ところどころに FONT_ADD_LOG()というマクロ関数を 使って何かしら記録を取っているように思ったのですがスルーしていました。 先の message()を使えない代わりに、このログを取る仕組みに乗っかるのはどうか?と思って ログの表示方法を調べてみたり。 infoに使い方が見当たらなかったので helpで調べながら試してみたところ、 組み込み変数font-log をnilにするとフォント関連操作のログが取られるようになり (デフォルトはtで記録抑止の状態。なんか意味的に逆じゃないか?)、 「M-x font-show-log」で記録したログが表示されるようです。 という訳で、フォントログに記録してみるようにしたところイケたかも。

次のような感じで使う想定。Emacs起動後、scratchバッファなどで以下のようなロギング設定をする。

(progn
  (setq font-log nil)
  (setq debug-font-find-time-limit 900) ;今回追加した設定変数. 900msより時間がかかるとログに記録する.
  ) ; and press C-j

この後、例えば「M-x view-hello-file」を実行。終わったら「M-x font-show-log」でログを開くと 以下のような文字列で記録されるようにしました。

font_find_for_lface: exec time 6892.0ms > 900.0ms char=0x1787 (#<font-entity harfbuzz outline Leelawadee UI sans iso10646-1 regular normal normal 0 nil 0 nil ((:format . opentype) (:script symbol buginese khmer lao thai latin))>)

読みにくいですが、char=0x1787というユニコード文字を表示しようとして 6892ms時間がかかり、 「Leelawadee UI」が選ばれたという感じになります。文字0x1787は scratchバッファなどで 「C-x 8 RET」で16進文字コードで文字入力した後、「M-x describe-char」で文字を調べて 「script: khmer」って事が分かります。以上を踏まえて、.emacsに

  (set-fontset-font t 'khmer "Leelawadee UI")

を足せば、フォントフォールバックで時間がかかるのを回避できるようになる (厳密に言うとフォントフォールバックが発生しないようにした)....という感じになるかな?と。

2023/09/29

テレワーク。早めに終了。

Emacsのフォントフォールバックでみつけられないフォントファミリの件。
ふんわり次のような感じなのかなぁ? 関数font_has_char()では 文字が含まれるフォントが指定してあれば表示可能と判断されるようですが、 フォントの指定がデフォルトフォントだけなので、それだと結果的に表示可能と判断されず。 続いて関数font_list_entities()でより多くのフォントを探して、その中から表示可能な物を選択する と思われます。しかし、フォントのリストを取得する 関数 w32font_match_internal()では Win32APIの EnumFontFamiliesEx() でCHARSETなどから探そうとするようなのですが、 ここで「Noto Sans Modi」をリストに挙げることができず、結果的に表示可能なフォントが無いと 判定されてしまう....という感じかな?
khmer文字で時間がかかっていたのは、w32font_match_internal()でのフォントリストに インストールされている全てのフォントが含まれていて、この中から実際に表示可能なフォントに 到達した結果「Leelawadee UI」が選ばれるという感じのようでした。 無理矢理全部入りフォントリストを渡せば見つけられるのだろうか?🤔

2023/09/28

テレワーク。気持ち早めに終了。

Emacsのフォントフォールバックでみつけられないフォントファミリの件。
観察してみてますが特に進展無し。

2023/09/27

テレワーク。気持ち早めに終了。

Emacsのフォントフォールバックでみつけられないフォントファミリの件。
動きを観察してみるものの、まだよく判らず。 以前、例えばkhmer文字を表示できるフォントを見つけるのに 関数font_find_for_lface()で大量のフォントファミリ群の中から探していて、 それで時間がかかるという感じになっていました。しかし、modi文字の場合は font_find_for_lface()で 時間がかからずにそして何もみつけられずに終了している感じになっているみたい。 khmer文字と同じ感じならmodi文字も同じように探すんじゃないか?と思った訳ですが、 この違いがどこから生じるのかがまだ不明という感じです。

2023/09/26

テレワーク。気持ち早めに終了。

Emacsのフォントフォールバックでみつけられないフォントファミリの件。
多分こうなんじゃないか?という感じ。 src/fontset.c内の 関数fontset_find_font()でフォールバックした時のフォントを探しているようですが、 その中で font_has_char()という関数を使って 文字がフォントオブジェクトに含まれるかどうかを検査しているようです。 src/font.c内に 関数font_has_char()の実体は存在していて、この中では更にフレーム表示に紐づけられる フォントドライバの持つ has_char()という下請け関数を実行しているようです。 harfbuzzの場合は has_char()の実体は持たないようなので、その時点で検査不可能で終了...って 訳では無いようで、代わりに フォントドライバの持つ encode_char()という下請け関数を実行して 検査している模様。encode_char()の実体は src/w32uniscribe.c内の 関数w32hb_encode_char()で、 どうやらここで FONT_INVALID_CODEとなってしまった結果、表示可能なフォントが無いという判定になっているようです。 実際の検査は以下のようなコードで行なっていました(デバッグ表示コードが盛られています😓)。

  hb_codepoint_t glyph;
  if (hb_font_get_nominal_glyph (hb_font, c, &glyph))
    return glyph;
  fprintf(stderr,"w32hb_encode_char      c=%x  invalid_code2\n",c); //debug
  return FONT_INVALID_CODE;

で、実際に表示できていない文字は以下のスナップショットのような文字なのですが、 二つの文字の合字のようです。

EmacsでModi文字を表示

codepointが 71206って文字と 71227って文字の合字って事なのかな?と思われるのですが、 関数w32hb_encode_char()で検査すると 71206だけで検査してINVALID_CODE、続いて 71227だけで検査してINVALID_CODE という感じになっているようです。

いや違うな....。どうやらデフォルトのフォントだけを検査して、そこで見つからなければ終わりって 感じになっているみたい。試しに、

./src/emacs -Q --no-splash -fn 'Noto Sans Modi' fallback_char2.txt

という感じで立ち上げてみると、mode-line表示など殆どの文字は豆腐になるのですが、 fallback_char2.txtに含まれる modi文字は表示されました。単純に探し方が足りないだけ?🤔

2023/09/25

テレワーク。早くもなく遅くもなく終了。

Emacsのフォントフォールバックでみつけられないフォントファミリの件。
なんとなく harfbuzzか uniscribeかに関係無い方法で表示可否を判断しているような?🤔 uniscribeで表示可能か否かを判断している為、harfbuzzならば表示可能な場合でも 表示可能なフォントをuniscribe基準で判定している(==表示できないと判断)してしまった結果、 表示できるフォント無しという事になってるんじゃないかと推測してみたり。 例えば、Modi文字(参考Wikipedia) は harfbuzzならば表示可能なフォント「Noto Sans Modi」を指定していても uniscribeでは表示できません。という所からの推測です。

もう少し調べてみたのですが違うかも😓

2023/09/24

AM中に起床。

掃除したり洗濯したり。

Emacsのフォントフォールバックで時間がかかる場所。
ELISP上からフォントファミリの一覧を取得する関数font-family-listってのがあるのですが、 何故か重複しているなぁ?と思っていました。 以前、フォント設定を行うのにフォントファミリの一覧から 選択するようなELISPを作ったとき、関数delete-dupsを使って重複するリストの要素を 削除するという事をやったのですが、この時は何故重複する要素があるのかまでは調べていませんでした。
で、フォントファミリ一覧を生成する実体は src/w32font.c 内の 関数w32font_list_family() で 行なっていて、更に潜ると 関数add_font_name_to_list() が下請け関数として 得られた一つの フォントファミリオブジェクトをリストに追加するという事をやっているようなのですが、 既にリストに含まれている要素と同じものがあれば追加しないって事をやっている風に見えます。 しかしデバッグprintを仕込んで見てみると、マルチバイト文字のフォントファミリ名の場合が うまく動いていないようで、結果、同じ名前の要素が含まれるリストになっているようです。

試しに、関数w32font_list_family()の方は重複しないように直してみたのですが、 ELISPの 関数font-family-list の結果は様子が変わらず。なんでだ?🤔
font-family-listは組み込みELISP関数のようですが、w32font_list_family()とは別のコードで 複数のフォントドライバが返すフォントファミリ名リストを重複排除するように連結してっぽい。しかし、 「if (NILP (Fmemq (XCAR (val), tail)) && ...)」という感じで 関数memq を使って リストの中に同じものがあるか否かを検査してっぽいのですが、 文字列の場合にこれでちゃんと動くのか?🤔と思ったりも。
memqじゃなくてmemberなら良いんじゃないか?と思って Fmember(...) に書き換えてみたのですが、 何故か反応が変わらず。なんでだ?と思ったのですが、蓄積するリストにはSYMBOL_NAME()で変換 して繋いでいるのに、Fmember()ではSYMBOL_NAME()で変換していないのが原因っぽい。 でもこの関数、プラットフォームによらず実行可能な関数のハズですが 今のままで大丈夫なのだろうか?

フォントファミリのリストの重複要素を削ると 要素数が 約1/3になる為、フォールバックで フォントを探す処理も 1/3になりました。とは言え約20秒が約7秒って所なので フォント設定を 行なわなくても良しなに表示されるという感じではないかも😓。
もう一つ、表示可能なフォントはインストールされているけどフォールバックで見つからない 文字がある件はまだ理由が判らず。先日の「Noto Sans Modi Regular」と「Noto Sans Modi」は どちらでも良いようです。

(set-fontset-font t 'modi "Noto Sans Modi Regular")  ;どちらでも良い
(set-fontset-font t 'modi "Noto Sans Modi")          ;どちらでも良い

「Noto Sans Modi」の方は探したフォントファミリの一覧には含まれているので、選択されれば 表示可能なハズなのですが....?🤔

2023/09/23

昼過ぎ起床。寝すぎ。

Emacsのフォントフォールバックで時間がかかる場所。
src/font.c の中の 関数font_list_entities()からフォントドライバに応じてフォントスペックの リストを取得する関数を呼んでいるのですが、ここで時間がかかっている模様。 丁度この下に、

            /* We put zero_vector in the font-cache to indicate that
               no fonts matching SPEC were found on the system.
               Failure to have this indication in the font cache can
               cause severe performance degradation in some rare
               cases, see bug#21028.  */

というコメントが記されているのですが なんのこっちゃ意味が判らず。 リストの取得に時間がかかる事とは別件のような気がしたりも?🤔

更に潜ると、src/w32font.c内の 関数w32font_list_internal()に行きつくのですが、 更に潜って src//w32font.c内の 関数list_all_matching_fonts()の中で インストールされているフォントファミリ全てを検査しているようで、ここで時間がかかってっぽい。

インストールされているフォントが豆腐になる理由が解ってきたようなそうでもないような。 例えば「Modi」の場合、Windows上のフォントファミリの完全名は「Noto Sans Modi Regular」となっているのですが、 関数w32font_list_family()で得られるフォントファミリの名前は「Noto Sans Modi」となっていて、 存在しないフォントを指定して表示できる文字か否かを判定しているような気がしてきたりも。

2023/09/22

テレワーク。早くもなく遅くもなく終了。

何気なく Emacsの ewwで Google検索ページを開いて日本語文字で検索したらなにやら 謎の検索結果になったり。よく見てみるとクエリ文字列が「...&ie=Shift_JIS&...」 となっていて、utf-8の文字列なのに Shift_JISと指定されてて 壊れた文字コードで検索しているという感じみたい。 この「ie=Shift_JIS」ってどこから出てくるんだ? と思ったのですが調べてみてもよく判らず🥺。
調べている過程の中で「eww-search-words」というコマンドがあるのを知りました。 こちらは「ie=UTF-8」となっている為、意図した文字列で検索が行なわれるようです。 でもどこで埋めているのかはやっぱり判らず🥺。

Google検索ページのソースを見てみると 「<input name="ie" value="Shift_JIS" type="hidden">」 というフォーム入力があり、ここで固定的にShift_JISになってっぽい。変えられるものなのかよく判らず。

w3m-modeでGoogle検索ページを開くと、buffer-coding-systemが shift_jis になってるなぁ? と思ったり。w3m.elを調べてみると URL文字列を検査してgoogleっぽいページの場合は 「&ie=\\([^&]+\\)」で文字セットを取り出して buffer-coding-system を切り替えているみたい。 googleっぽくなければページの文字コードの buffer-coding-system になる模様。えぇ....

2023/09/21

テレワーク。早めに終了。

Emacsのフォントフォールバックで時間がかかる場合に、どこで時間がかかっているのかを 特定していなかったので調べたり。どうやら font_find_for_lface() って関数の実行が 激烈に遅い場合があるようです。関数の実体は src/font.cに記されているようですが、 確かに4重ループを実行している箇所がありました。ここで時間がかかっているのかなぁ? と思ったのですが、トータルループ回数は6回で、実際に時間がかかっているのは ループの一番奥で実行されている font_list_entities() という関数のようです。 この関数の中の何に時間がかかっているのかはまだ判らず。深い...🥺

2023/09/20

テレワーク。気持ち早めに終了。

調べ事。わからん。

2023/09/19

テレワーク。早くもなく遅くもなく終了。

何気にVMwareのFedoraを起動しようとしたら、Bootの途中でファイルシステムが読み込めないと いう状態になり起動できなかったり。ファイルシステムの異常を検知しているのはWindows(ホストOS)側なので、 VMのイメージが何かしら変に見えてっぽい模様。ホストOSを再起動したり、VMwareの15だったのを 17にアップデートしてみたりしたのですが状況変わらず。Fedora38に上げる前の37のバックアップ からだと起動できたので、やっぱりVMイメージがダメになっていそう。てか なんでだよ!?🥺。 ひとまず Fedora38にアップデートして一旦完了。まだ Emacs29は落ちてきていない模様。 そしてImageMagickやGIMPで HEICフォーマットが読み込めないのも変わらず (以前の日記)。

2023/09/18

AM中に起床。

掃除したり。

フォールバックで見つかったフォントを得る方法。
先日の件をELISPで自動化する方法をもう少し調べてみました。少々散らかった感じではあるものの 手でやるよりは幾分マシくらいの方法を考えてみました。以下が作ってみた ELISPの関数です。

(defun my-chkfontset (&optional begpos endpos)
  "リージョン範囲の文字をdescribe-charして*chkfontset*に蓄積したのち
set-fontset-fontの一覧に変換する。"
  (interactive "r")
  (let ((strbuf (buffer-substring-no-properties begpos endpos))
        (wkbufname "*chkfontset*")
        )

    (with-current-buffer (get-buffer-create wkbufname)
      (erase-buffer)
      )
    (dotimes (p (length strbuf))
      (let ((chrstr (substring strbuf p (1+ p))))
        (with-current-buffer (get-buffer-create wkbufname)
          (insert chrstr)
          ))
      (set-window-buffer (selected-window) wkbufname)
      (with-current-buffer (get-buffer-create wkbufname)
        (describe-char (1- (point)) (current-buffer))
        (insert-buffer-substring-no-properties "*Help*")
        )
      )
    (with-current-buffer (get-buffer-create wkbufname)
      (shell-command-on-region
       (point-min)
       (point-max)
       "gawk '{if(/ position:/){src=\"\";fn=\"\";}else if(/script:/){src=$2}else if(/harfbuzz:|gdi:|uniscribe:/){split($0,f,\"-\");fn=f[3];}else if(/\\[back\\]/){printf(\"(set-fontset-font t '\"'\"'%-15s \\\"%s\\\")\\n\",src,fn);}}' | sort | uniq"
       )
      )
    ))

scratchバッファに貼り付けて C-jで実行すると my-chkfontset というコマンド関数が設定されます。 適当な文字列をリージョン選択した状態で「M-x my-chkfontset」を実行すると 「*chkfontset*」というバッファに一文字ずつdescribe-charを実行した結果を集めます。 全て集まったところで gawkのワンライナーとsort、uniqを使って set-fontset-font の形式に加工したものが 「*Shell Command Output*」バッファに出力されます。 gawkのワンライナーが Windowsで動作するEmacs向けになってしまっていますがフォントドライバ名が分かる ならば適当に直せば他のプラットフォームでも使えるかと思います。

例えば etc/HELLO ファイルの 以下の行を例にしてみます。

Adlam (𞤀𞤣𞤤𞤢𞤥)   𞤅𞤢𞤤𞤢𞥄𞤥
Amharic (አማርኛ)  ሠላም
Arabic (العربيّة)        السّلام عليكم
Armenian (հայերեն)      Բարև ձեզ

我が家のEmacsでは一応全ての文字が表示されるのですが、その状態だと以下のような結果になりました。

(set-fontset-font t 'adlam           "Noto Sans Adlam")
(set-fontset-font t 'arabic          "Noto Sans Arabic")
(set-fontset-font t 'armenian        "Consolas")
(set-fontset-font t 'ethiopic        "Ebrima")
(set-fontset-font t 'latin           "")
(set-fontset-font t 'latin           "MeiryoKe_Console")

ちょっと面倒臭いのは「TAB文字」は表示するフォントが無い扱いの為「latinでフォント名無し」となっています。 それ以外は使用しているフォント名が記されている感じになっています。 「TAB文字のフォント名無しは抜く」として、それ以外の文字で .emacsに明示的にフォントセットを 指定していない場合は、もしかすると指定すれば フォールバックにかかる時間が短縮できるかも? という感じです。因みに、armenianと ethiopicはフォールバックによる表示だというのを 今回初めて知ったのですが、これらについては今のところ性能の問題は見えてなさそうです。

もし明らか豆腐になっている文字を指定した場合は、例えば次のようになります。

(set-fontset-font t 'tagalog         "")

上記 tagalogは豆腐である事が判っているので、この場合は フォントを探してインストールした後、 指定する必要があるようです。

ただ、実際に「emacs-w32 -Q」で起動した後、「M-x view-hello-file」で表示されたものを対象に 「M-x my-chkfontset」を実行してみたところ、我が家では2時間ほど無反応になるという感じでした😓。 しかも豆腐が解決している訳では無いので、実際に手作業も含めると整えるのにはかなり手間がかかる感じになりそうです。 個人的に面倒臭いと思うのは、表示可能なフォントがインストールされていても豆腐になる場合がある所。 これ、ナゼなんですかね?🤔

すっかり忘れていましたが Cygwinパッケージの emacs-w32ではマルチバイト文字を使った フォント名が化けます。この為、gawkのワンライナーがエラーするようです。 「(LANG=japanese.sjis emacs-w32 -Q) &」のようにLANGを設定して起動した上で、

(progn
  (set-terminal-coding-system 'cp932-unix)
  (set-keyboard-coding-system 'cp932-unix)
  (set-buffer-file-coding-system 'cp932-unix)
  (setq default-process-coding-system '(cp932 . cp932))
  (setq locale-coding-system 'cp932)
)

を起動後一番最初にscratchバッファで実行して coding-system設定を cp932にするとひとまずイケそうです (以前の日記)。 上記設定前に日本語文字を何かしら表示してしまうと、その後で設定を行なっても文字が化けてしまうようです。 何の順序に依存しているかはよく判らずですが御参考まで。

2023/09/17

AM中に起床。

フォールバックで見つかったフォントを得る方法。 良い方法とは思えないけど一応判るかな?という方法として、

  1. 「emacs -Q」で起動した後「M-x view-hello-file」を実行する。
  2. 表示されてるデフォルトフォントじゃないっぽい文字を「M-x describe-char」で調べる。
  3. 「script:」から文字セットを、「uniscribe: や harfbuzz:」から フォントファミリ名を調べる。
  4. .emacs に
    (set-fontset-font t '文字セット        "フォントファミリ名")
        
    で記す。

というのはどうだろう?と思ったり。 表示されている文字は何かしらフォールバックしていると見なして、 明示的にフォントセット設定しておくといった感じでしょうか。
ELISPで自動化できるかな?と思ったのですが、フォントファミリ名は実際に表示しないと得られないようで、 表示されていない with-temp-buffer上の文字を describe-charしてみたのですが 「display: no font available」となって調べる事ができないようです🥺。 「一文字ずつ調べた describe-charの結果を適当なファイルに蓄積する」のをキーボードマクロで行なって、 ファイルを適当なスクリプトで頑張ってフォントセット指定に加工するという方法もあるっちゃあるかも?

セブンイレブンで「ビャンビャン麺」 (Wikipedia) が売っているのを見たので食す。初めて食べたけどTANEにはちょっと辛目の味付けでした。 以前、源ノ角ゴシックであれば表示できるというのを知り、 Emacsの設定に
    (set-fontset-font t '(#x30edd . #x30ede)     (font-spec :family "源ノ角ゴシック") nil 'append) ; ビャンビャン麺 対応

みたいなのを入れていたのですが、単語登録しないと入力できないと改めて気づいたりも😓

Web散策をしていて「last-resort-font」というものを知ったり。 フォールバック用のフォントで、豆腐になる場合にこのフォントで表示するとただの豆腐ではなくて どういう文字を表示しようとしているかが判るようなフォントで表示されるようになるというものらしい。 ただこれ、一番最初に採用されてしまうと表示が壊れてどうしようもなくなりそうにも思ったりも?🤔

2023/09/16

昼過ぎ起床。寝すぎ。

Emacsの文字によって表示に時間がかかる件。 とりあえず、fontset.c内の 関数 fontset_find_font() に時間計測のデバッグコードを入れてみたところ、 見た時間範囲での 関数実行自体は 3.1万回くらい実行していたのですが、 そのうち 1回の実行に 20秒ほどかかるケースが3回あり、おそらくこれが幅を利かせているようです。 3.1万回の殆どがミリ秒単位表示で 0.0msなのですが(Cygwinではclock関数の時間分解能がmsなため)、 15ms以上かかっているケースが400回ほどあり(20秒かかる3回もこれに含まれる)、 ただ単純に 15ms×400としても 6秒になってしまうので、まぁまぁ時間がかかる事には変わりはありませんが🥺。
デバッガでの実行を想定して -O0でビルドしていたのを忘れていたので -O2でビルドし直してみたのですが、 20秒かかるケースが縮んだりはしませんでした。

一応原因判明。20秒ほど時間がかかるのは 文字のフォント指定が無い為、フォントフォールバック で探している時間でした。Emacs上の文字セットで言うと sinhala、tibetan、khmer に対応するフォントを 探すのに時間がかかっていたという感じでした。 デバッグコードを仕込んで調べた結果、フォントフォールバックで一応フォント(フォントファミリ名)が 見つかっているので、フォントセットを .emacsで指定してみたところ、M-x view-hello-file の実行が 1秒くらいになりました😅。なんてこった。参考までに今回追加したフォントセットは以下です。

  (set-fontset-font t 'sinhala                 "Nirmala UI")
  (set-fontset-font t 'tibetan                 "Microsoft Himalaya")
  (set-fontset-font t 'khmer                   "Leelawadee UI")

面倒臭いのは 「フォントフォールバックで時間がかかるのは判ったけど、結局どの文字セットに時間がかかったのか判らない」 というところ。いわゆる「豆腐」になればフォントが見つからないから時間がかかるという事で、 豆腐の中に表示される文字コードから文字セットを調べて、それに応じたフォントをインストールしたのち、 フォントセットを .emacsに記すという流れで対応できます。しかし、時間はかかるが表示はできている場合、 その原因を本体ソースコードにデバッグコードなどを仕込まずに調べる方法が無いのが 今回の話に繋がっていると考えます。なんか上手い方法無いんですかね?🤔 (あるのかも知れませんが)

Unicodeに「Chess Symbols」っていうブロックがあるのを知りました (参考)。 カラー絵文字フォントで表示できるのかと思いきやグリフが含まれていなくて、 Emacsではモノクロフォントの「Symbola」じゃないと表示されませんでした。 これ使っておけばOKというカラー絵文字フォントは無いって事なのか?🤔
もう少し調べてみると、カラーではありませんが Chess Symbols のグリフを持つフォントは色々あるみたい (参考)。 「MS ゴシック」もイケるようです。 ただし、Emacsで意図的に Symbola以外に切り替えるには設定が必要になる場合があるようです。 やっぱり絵文字の設定ムズい...🥺

2023/09/15

テレワーク。気持ち早めに終了。

Emacsの文字によって表示に時間がかかる件。 とりあえず、fontset.c内の 関数 fontset_find_font() に当たりを付けてデバッグ表示を 仕込んだり強制的にループを脱出してみたりして反応を見たり。 何かしら時間がかかって待たされているようにも見える場合があるようですが、 具体的にどこで時間がかかっているかは判らず。

2023/09/14

テレワーク。気持ち早めに終了。

Emacsの M-x view-hello-file で各国言語の挨拶テキストが表示できますが、 フォントのインストールや設定をうまく行なわないと表示されない文字が出てきます。 我が家の設定では一応全ての文字は表示できるものの表示されるまでに猛烈に時間がかかります。 よく判らないけどこんなものなのか?とも思っていたのですが、 高々画面上に表示された文字数の文字を表示する事を考えると時間がかかり過ぎじゃないか? と思ったりも。という訳で何に時間がかかっているのか調べようとしているのですが当たりが付かず。

2023/09/13

テレワーク。早めに終了。

調べ事して終了。

2023/09/12

テレワーク。気持ち早めに終了。

Web巡回して終了。

2023/09/11

テレワーク。早めに終了。

Emacsの雑記」の中に、 ImageMagickのconvertコマンドを拡張する wrapped_convertというスクリプトを置いてあるつもりだったのですが、 アップロードし忘れていたというのに今日気づきました😓。 去年、Emacs-28.1ベースに更新した時からずっと Not Foundに なっていたと思います。役に立たない状態になっててすみませんでした。

2023/09/10

AM中に起床。

掃除したり洗濯したり。

そういやノートPCのEmacsで文字入力をしていて、変換キーを押していないのに候補が出てくるなぁ? と思ったり。調べてみたところ、普段使いのデスクトップPCでは MS-IMEの予測入力がOFFに なっていて、そのため変換キーを押さないと変換候補が出てこないという感じになっていました。 なぜOFFにしたのか記憶に無いのですが、予測入力の候補は気に入らなければその場で「×」を押して 誤変換候補を削除できるので、まぁ ONで良いかと思ったりも。

なるだけ長い文を変換した方が良いというのは判ってはいるものの、直ぐに単語で区切ってしまいます😓。 以前の書き込みを見返していて、 ローマ字入力中でも「半角/全角」キーが効くっていうのを すっかり記憶から消し去っていました😓。 ローマ字入力で「ビルドにmakeとautoconfを使用します」みたいなのを入れようと思うと、 前述「半角/全角」キーを使わないと、「autoconfを」は文節を調節しても 「autoconふぉ」か「autoconfwo」にしか変換できません🥺

2023/09/09

AM中に起床。

Cygwinパッケージを更新。minttyのアップデートが含まれていました。 前のバージョンで minttyに表示された文字列をマウスのダブルクリックで選択したときに「~(チルダ)」が選択の対象にならなくなって いました(以前のメモ)。 今回のアップデートで直った(バグ修正したのか仕様的に元に戻したのかは判りません)ようです。 ともかく 「~/pathto/filename.ext」が、いちいち「/pathto/filename.ext」になって そんなファイルは無いって怒られるストレスから解放されそうです。

2023/09/08

テレワーク。早めに終了。

夕方以降 大雨のニュースばかりになっているのですが、台風の本体は無くなったのか?

明日付けになっていますが 「Emacsの雑記」を更新しました。 先週から対応&テストしていた IMEパッチでインライン変換時の表示フォントサイズを text-scaleに連動させる件を追加しました。 御参考まで。

2023/09/07

テレワーク。早めに終了。

org-modeのエクスポート時にzero width space(ZWSP) を削って出力する機能。 Emacs-29.1の lisp/org/ox.el 向けですがパッチにしてみました (org-mode_zwsp_patch_230907.patch)。

以下の様な ZWSPを使ってorg表記をコントロールした例(以下はZWSP文字が含まれています)。 例えば 日本語文字列の間に続けて「=」や「*」を入れても装飾文字と認識されないので、 ZWSPを使って区切りを明示する必要があります。ZWSPを使わないのであれば 半角空白文字を 区切りに使う事になりますが、HTMLに出力すると空白文字が1文字入ってしまう事になります。

#+STARTUP: showall
#+TITLE:  Org-mode ZWSP export control test
#+OPTIONS: ^:{} toc:nil timestamp:nil -:nil creator:nil author:nil zwsp:nil

* Zero Width Space のエクスポート抑止テスト

「#+OPTIONS:」の「zwsp:nil」で「Zero Width Space」のエクスポートを抑止できます。

  - ​=今日=​は​*良い*​_天気_​ですね🙂
  - <<識別文字列>>「<​<識別文字列>>」と書くと
  - [[識別文字列][​[​[識別文字列]​]​]]で文書内リンクになります。

ZWSP文字の出力抑止でHTMLにエクスポートした例(一部抜粋)。

<ul class="org-ul">
<li><code>今日</code>は<b>良い</b><span class="underline">天気</span>ですね🙂</li>
<li><a id="org7dbc6ee"></a>「&lt;&lt;識別文字列&gt;&gt;」と書くと</li>
<li><a href="#org7dbc6ee">[[識別文字列]]</a>で文書内リンクになります。</li>
</ul>

HTML出力には ZWSPは含まれていません。実際の表示は以下のような感じ。

ZWSPが含まれていないのでコマンドライン文字列のような場合でも安心してコピペできます。

ただ、ZWSP文字自体を完全に削除してしまうので、意図的に含めたい時は困る事があるかと思います。 HTMLにエクスポートする場合は代替案として「#+MACRO: zw @@html:&#x200b;@@」のようなマクロを 定義して「{{{zw}}}」で実際に入れたいところに展開するという方法などがあると思います。 HTMLの文字コード指定「&#x200b;」でZWSPを入れているので、今回のパッチでもエクスポート時の 削除対象にはならないという事になります。

2023/09/06

テレワーク。気持ち早めに終了。

実験。org-modeのexportに zero width space(ZWSP) を削って出力する機能を付けてみようと思い試していました。 削るのは単純な文字列置換で行うようにしたのですが、「#+OPTIONS: 」にキーワードを追加して ON/OFFできるようにしようとしたところ、どこにどう入れればスイッチの状態を取得できるのかよく判らなかったり。 org/ox.elに 変数org-export-options-alist というのがあり、「#+OPTIONS: 」で指定できる キーワードが並んでいたのでここに足せば良いのかと思ったのですが、足しただけでは何も起こらず。 むーん?🤔

もう少しよく見てみたら、エクスポートデータを生成する関数内であれば追加したスイッチの状態を 取得できる事が判りました。生成されたデータを加工する感じで実験していたのですが、 データを生成する関数の最後の方で加工する事になる為 どのような形式でも有効になるのが 良いかもと思ったり。という訳で思った感じになった気も。

2023/09/05

テレワーク。気持ち早めに終了。

実験。なんかうまく反応せず🤔

2023/09/04

テレワーク。早めに終了。

Org文書内の任意の位置にリンクを張る方法が無いか?と思ったり。 「4.2 Internal Links」という方法が そのものズバリな方法でした「<<target>>」という感じで記すと、 HTMLにエクスポートした時には見えないタグが埋め込まれて、「「[[target][なんとか]]」で リンクによる参照が可能になるという仕組みのようです。
org-modeの文法では 文書にまぎれて特殊な操作を行うコマンドなどを記述しますが、 それ自身をエスケープする方法が用意されていなくて 以前知った「zero width space(ZWSP)」を 使ってコマンドと解釈されないようにするのがお勧めとされています。 しかし、HTMLエクスポートした時にも ZWSPがそのまま出力されるので ブラウザで表示されたものをコピペすると ZWSPが邪魔になる場合があります。 HTML化した後に ZWSPを削除するようなモードって無いのかなぁ?🤔 と思い調べてみると、世の中では パッチ は提案されているっぽいですが 取り込まれてはいなさげ?

2023/09/03

AM中に起床。

掃除したり洗濯したり。

Makefileやプログラミング言語の中には「\」(ASCII文字の0x5c)を行の継続記号として使用するものがあります。 長い式やリストの場合に改行を入れてしまうとそこで切れてしまうため、編集しやすくしたり読みやすくする為に 行の継続記号を使用する感じかと思います。 一方 TeXや Emacsの org-modeでは「\\」を明示的な改行記号として使用します。基本的に改行を入れても 存在しないものとして長い行として解釈されるような場合に、改行として明示的に区切る為に使用する感じかと思います。 どちらも「\」を使うのでどっちの意味だっけ?というのを忘れそうになるのですが、先に記したように 改行が区切りを示すものか 無視されるものかで それを打ち消す方向で使うって考えれば良いかなと思ったり。

先日、普段使いのEmacsのテーマをダーク系に変えたのですが、 org-modeの HTMLエクスポートを行なった際、SRCブロックの色がダーク系テーマのfaceでエクスポートされます。 Web表示の背景色がライト系の想定だと、文字色が明るすぎて読みづらい感じになってしまいます。 文書を書いている最中は色は気にしないとして、 最後の仕上げ出力の時は Emacsのテーマをデフォルトに変更してからエクスポートする必要があります。 地味に面倒くさいかも😓。

2023/09/02

AM中に起床。

IMEパッチでのインライン変換表示のフォント。 インクリメンタルサーチ時の条件が足りてないなぁというのに気づき直してみたり。 設定との合わせ技での対応なのでちょっとイマイチな感じもしたのですが、 設定すれば良い(元々設定してねって事にしてある)ので まぁいいかって事にしよう😅。

Emacs 29のブランチを見ていると、29.1がリリースされた後の変更量が結構多いなぁと思ったりも。 30系をいつリリースするのかは判りませんが、29.2を出してから30系の計画が出るのだとすると、 30系ブランチにマージされたAndroid対応は忘れた頃に出る感じになるような気も。 個人的には 29.2を今年の秋頃に出して、30系は2024年春頃をリリース目標にするくらいだと良いなぁと思います。 フィーチャーFIXしてから29.1が出るまでの期間は 大量のtree-sitter関連バグ修正を行なっていたので、 結局のところ出すって決まらないと整わないのだろうと思われます。

そういえば、テキストエディタの vimの読み方。 Wikipediaに 「ぶいあいえむ」と読むのは誤りとあるのですが、昔(90年代)からそうなんだっけ?と思ったり。 Wikipediaにある runtime/doc/intro.txt の履歴をvimの gitリポジトリをcloneして調べて みたところ、intro.txtに発音についての文言 「Vim is pronounced as one word, like Jim, not vi-ai-em. It's written with a capital, since it's a name, again like Jim.」 が足されたのは 2010年1月6日のコミットのようです。という訳で2010年以降は「びむ」かも知れませんが それ以前がどうだったかは判らず。 Google検索で 期間を 2009年12月31日以前にして検索してみたのですが、読み方に触れたページは見つけられず。 ただし Web上のデータは消滅する可能性がある(最初から存在していないのではなく 存在していたけど無くなった) ので歴史探索は意外と難しいです。
英単語として vim は「活力」とか「元気」って意味があるらしいですが それは「びむ」って発音するみたい。 個人的には「びむ」って読み方をしているのを音声で初めて聞いたのは 2018年くらいで、 その時に読み方もそれが正式だって知ったのですが、viは初めて知った時(1993年頃)から 「ぶいあい」って言われたのと、vimはその流れで「ぶいあいえむ」って言ってた(1994年頃)ので、 個人的には「びむ」って読み方の方に違和感があります😅。

2023/09/01

テレワーク。早めに終了。

Web巡回して終了。


TOP PREV