昔の最近の出来事(2022.12)

2022/12/31

AM中に起床。

掃除したり洗濯したり。

東京都コロナ感染者。新規は 11189人。

そんな訳で今年を振り返り。


他、SAI2は今年も定期アッップデートが行われていますが、TANE自身は全然描けていません😓
振り返りは以上です。

今年の日記を読み返していて、カラー絵文字の話って大分前にも ゴニョゴニョやってたな?と思い出したので少しだけメモ。 2020年12月頃にcairoを使ってレンダリング対応できるものじゃないの?と思った 訳ですが、cairo単体でカラー絵文字をレンダリングする方法が判らず2021年1月頃一旦諦めました。 2022年4月にEmacs-28.1がリリースされた後も Windows GUIビルドのEmacsではカラー絵文字が表示できる兆しは無いままだったのと、 cairoは CygwinでビルドするとGDIがバックエンドに含まれないという都合から、DirectWriteでGDIをバックエンドに描画する方法を調べ始めたのが 2022年9月。D言語のバインディングを試し始めたところ全然使える感じじゃなかったのを 対応しながら調べているうちに手順が少しずつ判ってきた感じだったかも知れません。 それでもグリフで描く手順になると全く資料が無いという謎な状況だったのですが、 こちらのサンプルMSのサンプルとから D言語向けに対応したDirectWriteのバインディングで実験してどうにか手順が判ったのが 2022年11月初めでした。2020年12月にcairoで実験した時にEmacsのどこら辺に組み込めば良い かが判っていたのと、重ね合わせの対応方法が直ぐに判った事もあって、割と短時間で整ったように思います🙂。運が良かっただけかも知れませんが😅
振り返っていて 「カラー絵文字で表示できればなぁ?」ってのは今年に入って何度も記していました😅 (1,2,3) この時は自分でやる事になるとは思ってもいませんでしたが。

コロナはそろそろ終息して欲しいなぁと思う所です。そんな感じで今年の更新はここまで。それではみなさん良いお年を。

2022/12/30

AM中に起床。

東京都コロナ感染者。新規は 14525人。

D言語モードでtree-sitter。先日 c-ts-mode で雰囲気は判ったので 避難用のD言語モードで試してみたり。 因みにオリジナルのd-modeと区別する為に dlang-modeってのにしてみてます。 tree-sitter-d では言語は「d」となっているのですが、区別する為に名前だけを変えて tree-sitter-dlang にしようとしたところ、 言語名を変えて tree-sitterの parserを生成し直さなくては色々辻褄が合わなくなるようです。 で、再生成したいのですがWindowsでは Node.jsの入れ方がイマイチよく判らなかったので VMware上のFedoraで対応してみました。 grammar.js の最初の方に記されている「name: 'd'」を「name: 'dlang'」に変更した後、 「tree-sitter generate」で再生成してみたらsrc/parser.cはうまく生成できました。 「src/scanner.cc」の方は手動で対応が必要みたいだったので書き換え。出来上がったソースを 先日の通り Cygwinの方でコンパイルして libtree-sitter-dlang.dll をパスの通った所に置いて準備はできたつもり。

で、dlang-ts-modeで切り替えてみるのですが色は付かず🥺。以下のようなエラーメッセージが出ていました。

Error during redisplay: (jit-lock-function 1) signaled (treesit-query-error "Node type error at" 2 "Debug the query with `treesit-query-validate'")

意味がイマイチよく判りません。 でも、scratchバッファでモードが使えるかどうかを検査してみた感じ、

(treesit-ready-p 'dlang)  ;; and press C-j
t
(treesit-query-validate 'dlang "")  ;; and press C-j
"QUERY is valid"

てな感じでそれとなく応答は返ってくるようなので、dlangという言語でのtree-sitterは反応できているような気がしたりも。 再生成したparser.cをdiffで調べてみても本体の差分は無くて、APIとなる関数の名前が置き換わっているだけだったので、 大丈夫だと思うのですが....? どう調べたもんか...?🤔

どうやら treesit-query-compile という関数があって、その中でエラーしているっぽい。 *-ts-modeの設定が必要な変数の中に dlang-ts-mode--font-lock-settingsという変数があり、 色付けに関するルールが記されているっぽいのですが、そのルールがエラーを含んでいる模様。 先のメッセージの中に「treesit-query-validateでクエリをデバッグする」とありますが、 どうやら関数 treesit-query-compile がエラーした時は treesit-query-validate でデバッグするという感じらしい。 以下の様にeval-expressionで実行してみたところ、

(treesit-query-validate 'dlang     '((comment)  @font-lock-comment-face))

「*tree-sitter check query*」というバッファに

Node type error at: 2
(comment) @font-lock-comment-face

と表示されました。なんとなくエラーの状況が再現しているような気がしたりも。 気がするというのは、最初のエラーメッセージ「Error during redisplay: ....」の中に肝心なquery文字列が表示されていない為、 対応しているのか否かの判断ができません。 treesit-query-validate を使ってデバッグを...のようなメッセージを出す以前に、 エラーした時の情報は全て表示して貰わないとなんのこっちゃ判りません。

他の言語モードを見てみたところ、コメントを示すキーワードは tree-sitter-d で定義しているものを指定する必要があるようです。 D言語のコメント文については grammar.js の定義と合わせてみると、

(defvar dlang-ts-mode--font-lock-settings
  (treesit-font-lock-rules
   :language 'dlang
   :override t
   :feature 'comment
   `((line_comment) @font-lock-comment-face                 ;;tree-sitter-dでの行コメント定義
     (block_comment) @font-lock-comment-face                ;;tree-sitter-dでのブロックコメント定義
     (nesting_block_comment) @font-lock-comment-face)       ;;tree-sitter-dでの入れ子ブロックコメント定義

って書く必要がありました。スクラッチバッファで検査してみても大丈夫そうで、

(treesit-query-validate 'dlang
   `((line_comment) @font-lock-comment-face
     (block_comment) @font-lock-comment-face
     (nesting_block_comment) @font-lock-comment-face)
   )  ;; and press C-j
"QUERY is valid"

dlang-ts-modeにしてみるとコメントだけは色が付くようになりました😓。てか、全く色が付かなかった所を見ると C#のコードとはカスってもいないという事みたいなので、treesit-font-lock-rulesの中の定義を D言語向けに全部見直す必要がありそうです🥺

*-ts-mode。少し弄ってみたのですが、インデントも意図通りに機能していないし色付けも妙な感じになってて なんだか対応がムズかしいです🥺

先日、tree-sitterの対応言語を有効にする手順が面倒臭すぎると記したのですが、 Emacs29のgitブランチで treesit-install-language-grammar というtree-sitter対応言語のインストールを サポートする関数が追加されたみたい。整うのにはまだしばらくかかりそうな予感がしたりも。

2022/12/29

AM中に起床。

東京都コロナ感染者。新規は 18372人。

D言語モード。先日の「static if コンディション」のインデントがイマイチな件。 d-modeから関係ありそうなコードを取り込んでみたところ所望の感じになったり。

tree-sitter。どうやらライブラリはtree-sitterの ソースアーカイブからmakeを使ってビルドすれば良いっぽい感じだというのが判ったり。 Makefileがポン置きされているので make して make install すれば /usr/local/ の下にインストールできるようです。 インストール後、以下のような感じでEmacs29のconfigureを実行。

$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --prefix=/usr --with-w32 --with-imagemagick --with-native-image-api --with-tree-sitter
configure: loading site script /usr/share/config.site
checking for xcrun... no
 :省略
Configured for 'x86_64-pc-cygwin'.

  Where should the build process find the source code?    .
  What compiler should emacs be built with?               gcc -g3 -O2
  Should Emacs use the GNU version of malloc?             no
    (The GNU allocators don't work with this system configuration.)
  Should Emacs use a relocating allocator for buffers?    no
  Should Emacs use mmap(2) for buffer allocation?         no
  What window system should Emacs use?                    w32
  What toolkit should Emacs use?                          none
  Where do we find X Windows header files?                Standard dirs
  Where do we find X Windows libraries?                   Standard dirs
  Does Emacs use -lXaw3d?                                 no
  Does Emacs use -lXpm?                                   yes
  Does Emacs use -ljpeg?                                  yes
  Does Emacs use -ltiff?                                  yes
  Does Emacs use a gif library?                           yes -lgif
  Does Emacs use a png library?                           yes -lpng16 -lz
  Does Emacs use -lrsvg-2?                                yes
  Does Emacs use -lwebp?                                  yes
  Does Emacs use -lsqlite3?                               no
  Does Emacs use cairo?                                   no
  Does Emacs use -llcms2?                                 yes
  Does Emacs use imagemagick?                             yes
  Does Emacs use native APIs for images?                  yes (w32)
  Does Emacs support sound?                               yes
  Does Emacs use -lgpm?                                   no
  Does Emacs use -ldbus?                                  yes
  Does Emacs use -lgconf?                                 no
  Does Emacs use GSettings?                               no
  Does Emacs use a file notification library?             yes -lgio (gfile)
  Does Emacs use access control lists?                    yes
  Does Emacs use -lselinux?                               no
  Does Emacs use -lgnutls?                                yes
  Does Emacs use -lxml2?                                  yes
  Does Emacs use -lfreetype?                              no
  Does Emacs use HarfBuzz?                                yes
  Does Emacs use -lm17n-flt?                              no
  Does Emacs use -lotf?                                   no
  Does Emacs use -lxft?                                   no
  Does Emacs use -lsystemd?                               no
  Does Emacs use -ljansson?                               yes
  Does Emacs use -ltree-sitter?                           yes       ★ライブラリは認識されてる
  Does Emacs use the GMP library?                         yes
  Does Emacs directly use zlib?                           yes
  Does Emacs have dynamic modules support?                yes
  Does Emacs use toolkit scroll bars?                     yes
  Does Emacs support Xwidgets?                            no
  Does Emacs have threading support in lisp?              yes
  Does Emacs support the portable dumper?                 yes
  Does Emacs support legacy unexec dumping?               no
  Which dumping strategy does Emacs use?                  pdumper
  Does Emacs have native lisp compiler?                   no
  Does Emacs use version 2 of the X Input Extension?      no
  Does Emacs generate a smaller-size Japanese dictionary? no


configure: creating ./config.status
  : 省略

そしてmake実行。ビルドは特に問題ありませんでした。 因みに--with-tree-sitterは付けなければ自動検出となるのですが、付ければ 認識できなかった時にエラーとなるので pkgconfがちゃんと認識できているか?とかが調べやすくなるかと思います。

で、C言語で試してみたところ もうひと手間必要みたい。 C言語のソースコードを読み込むと、「c-mode」で立ち上がるので「c-ts-mode」に切り替えると、

⛔ Warning (treesit): Cannot activate tree-sitter, because language definition for c is unavailable (not-found): (libtree-sitter-c libtree-sitter-c.dll) No such file or directory

てな感じで怒られます。どうやら libtree-sitter-{言語}.dll みたいな感じで言語毎のパーサーライブラリが必要みたい。 こちらを参考に tree-sitter-cからソースを拾って、

$ gcc -shared -g -O2 -Isrc src/parser.c -o libtree-sitter-c.dll

てな感じで libtree-sitter-c.dll を生成し、パスの通った場所に置いて、c-ts-modeに切り替えてみたところ、 うまくハイライティングが行われました。ぱっと見違いが判らなかったのですが 以下のような感じ。

Emacs29.0.50 c-mode Emacs29.0.50 c-ts-mode

左側が「c-mode」、右側が「c-ts-mode」。c-ts-modeでは文中の変数や関数呼び出しにも色が付いています。 てか、c-ts-modeは色が付いていない文字の方が少ないようにも思ったり😅
さておき、Cygwinでのビルドでもtree-sitterが一応組み込めるっぽい事が判ったのですが、このままでは有効にする手順が面倒臭すぎます。 そもそも有効にする手順を間違えているのかも知れません。

2022/12/28

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

東京都コロナ感染者。新規は 20243人。

調べ事。

2022/12/27

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

東京都コロナ感染者。新規は 22063人。

tree-sitterについて調べたり。 ここではEmacsは関係無しでtree-sitter単体の話になります。 イマイチビルド方法とかが判らなかったのですが、Rustで書かれていてRustのcargoコマンドを 使ってインストールできるようだったので、随分前 に試したっきり(その後 PCを入れ替えた時に何かの用事でもう一度入れた痕跡がありましたが😅) だったのでアップデートしてみました。
で、tree-sitter-dというD言語向けの 実装があったので試してみました。以下のようなD言語のソースコードを用意して、

$ cat -n hello.d
     1  import std.stdio;
     2  import std.string;
     3
     4  void main()
     5  {
     6    writef("Hello D world. こんにちはDの世界。\n") ;
     7  }

tree-sitterコマンドに食わせてみた結果が以下のような感じです。

$ tree-sitter parse hello.d | cat -n
     1  (source_file [0, 0] - [7, 0]
     2    (module [0, 0] - [6, 1]
     3      (decl_defs [0, 0] - [6, 1]
     4        (import_declaration [0, 0] - [0, 17]
     5          (import_list [0, 7] - [0, 16]
     6            (import [0, 7] - [0, 16]
     7              (module_fully_qualified_name [0, 7] - [0, 16]
     8                (packages [0, 7] - [0, 10]
     9                  (package_name [0, 7] - [0, 10]
    10                    (identifier [0, 7] - [0, 10])))
    11                (module_name [0, 11] - [0, 16]
    12                  (identifier [0, 11] - [0, 16]))))))
    13        (import_declaration [1, 0] - [1, 18]
    14          (import_list [1, 7] - [1, 17]
    15            (import [1, 7] - [1, 17]
    16              (module_fully_qualified_name [1, 7] - [1, 17]
    17                (packages [1, 7] - [1, 10]
    18                  (package_name [1, 7] - [1, 10]
    19                    (identifier [1, 7] - [1, 10])))
    20                (module_name [1, 11] - [1, 17]
    21                  (identifier [1, 11] - [1, 17]))))))
    22        (func_declaration [3, 0] - [6, 1]
    23          (fundamental_type [3, 0] - [3, 4])
    24          (func_declarator [3, 5] - [3, 11]
    25            (identifier [3, 5] - [3, 9])
    26            (func_declarator_suffix [3, 9] - [3, 11]
    27              (parameters [3, 9] - [3, 11])))
    28          (specified_function_body [4, 0] - [6, 1]
    29            (block_statement [4, 0] - [6, 1]
    30              (statement_list [5, 2] - [5, 59]
    31                (expression_statement [5, 2] - [5, 59]
    32                  (expression [5, 2] - [5, 57]
    33                    (postfix_expression [5, 2] - [5, 57]
    34                      (qualified_identifier [5, 2] - [5, 8]
    35                        (identifier [5, 2] - [5, 8]))
    36                      (argument_list [5, 9] - [5, 56]
    37                        (primary_expression [5, 9] - [5, 56]
    38                          (string_literals [5, 9] - [5, 56]
    39                            (double_quoted_string [5, 9] - [5, 56]))))))))))))))

例えば22行目の「(func_declaration [3, 0] - [6, 1]」は元のソースの4行目1カラム目~7行目1カラム目の後までの 関数のブロックに対応し、23行目の「(fundamental_type [3, 0] - [3, 4])」は元のソースの4行目の1カラム目から4カラム目で 関数の型の「void」の部分が対応する...といった感じのようです。 declarationや *_name などが示すそれぞれの範囲に色付けを割り当てる事でキーワードハイライティングが行える という事なのかなと思われます。

という訳でtree-sitterは ハイライティングを行う為のプリプロセスの仕組みなのだろうと思ったのですが、 言語モードのELISPソースを見てみると インデントのルールにも関係があるみたい。 parseサブコマンドだとインデントを修正する為の要素は無いように思うのですが 何か別の仕組みがあるのかも知れません。 しかしながら、CygwinでのEmacsビルドの場合にどうやって組み込むものなのかはやっぱりよく判っていません...

2022/12/26

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

東京都コロナ感染者。新規は 8428人。

D言語モード。演算子オーバーロードを記述するのに「static if(){} else static if() {} else statick assert();」 みたいな「static if コンディション」てのを使う場面があるのですが、elseに続けると インデントがイマイチ 思った感じにならなかったり。 staticが入らなければ意図通りなので static ifをどうにかする必要があるっぽい。 でもどうやれば良いのか判りません🤔

2022/12/25

昼前起床。

掃除したり洗濯したり。

東京都コロナ感染者。新規は 15403人。一直線に増えてるなぁ。指数関数的に増えるよりは猶予があるとは言え、 このままだとそのうちキャパオーバーになるだろうと思われるのですが...

CygwinネイティブのC言語で書いていると、printfに UTF-8文字を書いても意図通りに動くので あまり気にしないのですが、Cygwinネイディブではない D言語で同じようにwritefで書くとターミナル出力とパイプとで 文字コードが変わるのでちょっと困る事があります。以下のようなD言語コードで確認してみます。

$ cat ./dlang_argtest.d
import std.stdio;
import std.string;

int main(string[] args)
{
  foreach( size_t i, arg ; args ){
    if(i==0) continue;
    writef("arg[%d]=%s\n",i,arg);
  }
  return 0;
}

これに絵文字を含んだ引数を指定してみるとコンソール出力では以下のように絵文字が化けます。

$ ./dlang_argtest.exe This is 🙂
arg[1]=This
arg[2]=is
arg[3]=凾

でも、CygwinのcatでパイプするとUTF-8でそのまま伝わるようです。

$ ./dlang_argtest.exe This is 🙂 | cat
arg[1]=This
arg[2]=is
arg[3]=🙂

パイプを介すか否かで変わるという事は、引数文字列はUTF-8のまま子プロセスには伝わり、 コンソール出力の場合に限り余計な変換がかかっているのだろうと推測します。
で、Windowsの標準コマンドに chcpというものがあってこれを使うとコンソール出力のコードを変更できるようです。 イマイチどこでコード変換しているのかが判りませんが、挙動から察するとターミナル出力の手前でコード変換 が行われていて、その変換方法を変更するもののように思います。さておき、Cygwinだとパスが通ってなくて 実行できなかったので、フルパス指定で実行してみました。

$ /cygdrive/c/Windows/System32/chcp.com 65001
Active code page: 65001
この状態で同じように実行すると以下のような感じに。
$ ./dlang_argtest.exe This is 🙂
arg[1]=This
arg[2]=is
arg[3]=🙂

$ ./dlang_argtest.exe This is 🙂 | cat
arg[1]=This
arg[2]=is
arg[3]=🙂

コンソールに直接出力する場合もパイプを介する場合も所望のUTF-8で伝わっているようです。
Cygwinのbashコマンドラインから使って範囲では、環境変数の様に bashプロセス下のプロセスにしか影響しないようです。 Windows全体に影響が及ぶようなものでは無いので良いかと思います。 元のcp932に戻すには「/cygdrive/c/Windows/System32/chcp.com 932」ってすれば戻ります。
フルパス指定は長いので以下の様にaliasで対応してみる事にしました。

$ alias chcp='/cygdrive/c/Windows/System32/chcp.com'

$ chcp
現在のコード ページ: 932

因みに、ipconfigコマンドはTTYだとUTF-8、パイプで繋ぐとcp932になるという、今回とは逆の挙動になっています (以前のメモ)。 chcpでコードページをUTF-8に変更するとメッセージの"大部分"が英語表示になるようです (即ち表示に互換が無い)。大部分と記したのは全部ではないという所。ネットワークアダプタ名は日本語文字が含まれています。 だったら全部互換表示にすれば良いのに?と思わなくもありませんでしたが、元のネットワークアダプタ名が日本語文字で 名づけられているのでUTF-8で表示はできているけど、全てを日本語文字で表示してしまうと他国の人が読めなくなるので ダメという事なのかなと思い直したりも。表示できるか否かと、表示できたとしてそれで伝わるか否かとは別の話なのでしょう。

2022/12/24

昼前起床。

東京都コロナ感染者。新規は 18731人。

Emacs 29.0.50でのD言語モード。C#モードを元にして色付けはそれとなくできるようになった気が? 入れ子可能な「/+ +/」コメントブロックとかは元のd-modeでどうやってるのかイマイチ理解できてないので放置。
Emacs29では tree-sitterなるものが使えるようになるらしいのですが、ライブラリのCygwinパッケージには無いので組み込めず。 てかビルドや組み込み方法などがイマイチよく判っていないです😓

2022/12/23

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

東京都コロナ感染者。新規は 17332人。

Emacs 29.0.50で d-mode の色付けが変な件。 当面の回避策として、以前試してなんとなく対応できそうな気のする C#モードを改造してみるのを試し中。 d-modeではswitchステートメントのcaseのインデントが 変な感じだったのが なんとなく普通な感じになってみたり。

2022/12/22

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

東京都コロナ感染者。新規は 18820人。

実験。

2022/12/21

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

東京都コロナ感染者。新規は 21186人。

調べ事。

2022/12/20

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

東京都コロナ感染者。新規は 20513人。

あまりの眠さに急速停止。

2022/12/19

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

東京都コロナ感染者。新規は 7949人。

Web巡回して終了。

2022/12/18

昼前起床。

掃除したり洗濯したり。

東京都コロナ感染者。新規は 13646人。

image-crop。この前、切り出しに失敗する場合があったので、見た目の影響が無いように 「:rotation 0.0」を設定するというワークアラウンドを入れたのですが、TIFFフォーマットはそれをやるとダメでした。 仕方なくフォーマットによって設定する/しないを分岐する事に。ぐぬぬ。

以前、Emacs 29.0.50の image-diredの画像表示関数が大幅に変更されていて 都合が悪かったのを直したのですが、この時は image-cropの存在を知らなかったので ReadOnlyでバッファ設定するように していました。image-modeをベースにした表示になっているので、image-cropも実行できるようにする為の 対応を入れてみたり。ReadOnlyを外す以外に undoも無効にしていたのですが、undoを無効にしてしまうとcrop/cutした後に 戻せなくなります。でも、ずっと有効だと別の画像を表示した分もundoできるようになってしまいます。 そこで、新しい画像を読み込む前に一旦undoを無効に、読み込み終えたらundo有効にすることで、crop/cutでのundoは 可能にしつつ バッファ自体のundoメモリ消費を抑えるようにしてみました。

Emacs29のgitブランチ。分岐してから新規に追加されるパッケージやファイルが沢山ある気がします。 どこまで入れるかの交通整理って行われているのかしら?

2022/12/17

AM中に起床。

東京都コロナ感染者。新規は 17020人。

image-crop。ImageMagick表示での切り出しでTGAフォーマットがうまくいかないのをどうにかしようと試みたのですが断念。
TGAフォーマットにはマジックナンバーが含まれていないため、データからフォーマットを自動判定できません。 この為 convertコマンドでは ファイル名指定してファイルの拡張子から判断するか、標準入力の場合は「tga:-」と指定 してTGAが入力される事を指定する必要があります。 image-cropでは fileコマンドを外部実行してファイルフォーマットを判定しているのですがmime-type形式で取得しています。 そして「(cadr (split-string type "/"))]のような関数で例えば image/png みたいなのから png の部分だけを 取り出して、convertコマンドに「png:-」のような指定ができるように渡しているのですが、この方法だといくつか構造欠陥 を抱えている事になります。 一つは TGAはmime-typeでは「image/x-tga」となるのですがconvertコマンドは「x-tga:-」を受け付けない。もう一つ PPMはmime-typeでは「image/x-portable-pixmap」となるのですがTGAと同様に「x-portable-pixmap:-」は受け付けない (以前気づいたPPMのバグと関連)。 そして、convertで自動判定できないTGAの時だけ「tga:-」指定して、自動判定可能なものは「-」だけにする事も考えたのですが、 convertコマンド列をdefcustomできるようになっている都合で「xxx:-」と「-」を動的に切り替えられません。 という訳で詰んでしまった結果、ImageMagick表示のTGAフォーマットについては対応断念という方向で。 因みに、組み込みImageMagickを使わずに外部コンバート表示の場合は内部的にはPNGで保持している為 うまく動くという事のようです。

2022/12/16

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

東京都コロナ感染者。新規は 16273人。

image-cropでの水色の横線。画像に引かれているんじゃなくて訂正線で表現されているのか?と思ってdescribe-charで 調べてみるもそういう訳では無さげ。弊害がある訳ではないので調査は一旦保留🙁

emacs -Qで image-crop確認。以前確認した事の中で、ImageMagickで表示した画像の切り出しに 失敗する件は、フォーマットによって image-propertyに :flip と :rotation の両方が無い場合に失敗するのが原因のようでした。 失敗するのとしないのとの違いは判りませんが、どちらかが入っていれば問題無いので、:rotation に 0.0 にセットする事で ワークアラウンドになったという感じ。

2022/12/15

本日休業。

先日コロナワクチン接種を行ったのですが、一日中うっすら具合が悪い感じ。

東京都コロナ感染者。新規は 17687人。

image-cropでの水色の横線。実際に描画されているSVGデータを message関数とformat関数を使ってミニバッファに 表示し、その表示したデータをSVGデータとして svg-insert-image関数でスクラッチバッファで表示してみたところ、 やっぱり水色の横線は描画されません。SVGデータに描画要素が含まれていないのでこれは当然なのですが。 元々 emacs -Q で起動した場合は水色の横線が描画されないので何故だ? と思い調べ始めたのですが、何故か目の前で起こっている事象の原因が判らない不思議🤔

2022/12/14

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

東京都コロナ感染者。新規は 188812人。

image-cropでの水色の横線。どこで入っているんだ?と調べてみるも、crop/cutモード時にSVGデータで表示される のですが、そのSVGデータをsvg-createした直後くらいのデータで線を引く要素は無いのにも関わらず何故か 線が引かれます。なんだこれ?🤔 「--with-x-toolkit=gtk」でビルドしても引かれるので、w32だからという訳では無さそう。謎。

2022/12/13

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

東京都コロナ感染者。新規は 19800人。一直線に増加傾向か。

少し前に組み込みImageMagickでの表示が反転に対応していなかったので対応してみたのですが、 先日 image-modeの組み込みローダー表示および外部convert表示の画像回転は 反転していなければ時計回り、 反転していれば反時計回りになるのに気づきました。組み込みImageMagickの反転対応では 反転しているか否かに関係無く時計回りとしていたのですが image-modeの仕様に合わせてみました。回転方向で表向きか裏向きかを判断できるのでこれはこれでアリと思い直したりも。

emacs -Q で image-crop の確認をしてみてたのですが、cropやcutモードの表示の時に水色の横線(先日の例)が 表示されないなぁ?と思ったり。この線が入る事で crop/cutモードになっているのを表しているのかなぁ?くらいに思っていたのですが そういう訳では無いのか?てか、この線をどこで描画しているのかが何故か分からない😓 あれぇ?

2022/12/12

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

東京都コロナ感染者。新規は 7044人。

Emacs29の image-crop。画像反転に対応してみたり。対応している中で image-modeの回転はClockwiseとなっているのですが、 反転表示の状態では逆回転になるのは仕様なのだろうか? convertコマンドを使う都合で image-modeの仕様に合わせるには 反転しているか否かで分岐を入れる必要がありました。何か間違っているのかも知れませんが。

2022/12/11

AM中に起床。

掃除したり洗濯したり。

東京都コロナ感染者。新規は 12163人。

Emacs29の image-crop の選択。先日、cropかcutで選択領域の塗り方を変えたいと記したのですが、 よく見たら関数の引数に関連付く情報が渡されていたのでそれを利用して切り替えてみました。 あと、image-cutを実行した後に何故か余計に縮小された表示になっていたのを調べてみたら、 よく分からない係数が足されて表示されていたようだったのでウインドウのサイズから取得するように変更してみたり。 強まった気がしたりも。

ImageMagickの convertコマンド。image-cropの中で cutを行う場合は convertコマンドの fillと rectangleを使っています。 convertコマンドのオプションとして指定するようになっているのですが、どうやら convertコマンド自体は「-draw string」 という形を取って、stringには実行したい描画コマンドをいくつも羅列して書けるようです。 で、描画コマンドの羅列を文字列として生成して渡せば塗りつぶしに限らない描画が行えるんじゃないか?と思ったり。 関数image-crop--process の中で format-spec ってのを使って独自format関数で 座標のような動的な値は取り込まれる ような仕組みになっているみたい。ただ、演算とかができる訳ではないので、式のまま定義しておいてevalするように なってれば、座標を好きなように加工する事もできるかもなぁ?と思ったり。

2022/12/10

AM中に起床。

東京都コロナ感染者。新規は 14558人。

Emacs29の image-crop。範囲指定を右下から左上に囲んだり、矩形の形を変更する時に象限が変わるような動かし方を した時に変な範囲が選択されるのを直してみたり。コード的にはなんかイマイチな感じですが使い勝手は良くなった気も。 ついでに選択領域が塗られるような表示だったのを、svgのpath塗りつぶしの fill-rule って属性を使って 選択領域が明るくなるようにしてみました。

Emacs29.0.50 image-crop improvement

image-cut(選択領域の塗りつぶし)は これまで通り選択領域を暗くした方が良いと思ったのですが、 関数の引数を増やす必要があるのでまたいずれ。

2022/12/09

AM中に起床。

東京都コロナ感染者。新規は 13556人。

Emacs29の git log を眺めていると なにやら10年前のコミットがマージされていて 何これ?と思ったり。 use-packageっていうパッケージを取り込んだみたい。 masterと間違って 29のブランチにマージしたの?とも思ったのですが そうではないっぽい。ほぅ....

org-modeで特殊文字のエスケープ方法として「zero width space」ってのを使う方法があるのを知ったり (17.12 Escape Character)。 前から使えましたっけ? ただ、HTMLにエクスポートすると zero width space もそのままエクスポートされてしまう為、 それをコピペしたら何故か動かないってなりそう。

Emacs29のimage-modeで画像のクリッピングやカットができるというのを知って試してみたり。 因みにSVGを表示できるビルドになっている必要があるっぽい。さておき、 クリッピングした画像の保存ができなくてなんだこれ?ってなったのですが、まだ細かいところの作りこみが甘い感じ。 気づいた点と今の所の対応策のメモ。


とは言え、テキストエディタの領分は超えてる気も😅

2022/12/08

AM中に起床。

東京都コロナ感染者。新規は 14104人。

先日Emacs29では image-modeで上下反転や左右反転ができるようになったのですが、 組み込みImageMagick表示では反転できないというのに気づきました。できなくは無いだろう?と思い対応してみたり。 他の表示メソッドと違いImageMagickでは個別対応が必要な感じでしたが、 一応 MagickFlopImage() という関数を使って回転の前に実行すればイケました。 ImageMagick以外の表示メソッドでは「変形」という形で行列を使って回転も反転も一体化しているのですが、それに比べると 筋が悪い感じかもなとは思ったりも。 ところで、サンプルコードを見た時、MagickFlopImage(...) と MagickFlipImage(...) の見た目の違いが直ぐに認識できませんでした😓。 「flip」には反転するとといった意味がありますが、「flop」にはそのような意味は無さげな気もします。 論理回路のフリップフロップ (参考Wikipedia) もflip-flopで一つの単語(反転とパタパタ動くが合わさってますが)なので、flopだけ取り出すのはどうなんだ?という気も。 MagickFlipImage(上下反転)に対応するものとしてMagickFlopImage(左右反転)は語感で付けた に一票。

最近のIntel CPUは Pコア(Performance-core)と Eコア(Efficient-core)の二種類のコアがあって それぞれスレッド数や動作周波数が異なるそうな。 でも、タスクスケジュールが難しそうと思ったりも。ある処理量を 単純にロジカルコア数で 均等にマルチスレッド分割してしまうと 速いコアに割当たった仕事は早く終わって持て余してしまう/遅いコアに割当たった仕事はボトルネックとなる 可能性が考えられます。かといって、速いコアに仕事量多めで割り当てたりすると、プログラムが一つしか実行されていない場合は 良いですが、いくつものプログラムが同じ事をしてしまうと 速いコアが渋滞してしまう可能性も考えられます。 シングルスレッドのプログラムだけど速く終わって欲しい場合とそうでも無い場合とで、想定と違うコアに割当たると何か違う感じになるかも知れません。 OSはどうやってスケジュールしているんだろう?

明日付けになってますが「Emacsの雑記」を 28.2ベースのカラー絵文字対応に更新してみました。御参考まで。

Emacs29のemoji-listで「🌶️」の絵文字をいくつか並べたのですが、何故か他の絵文字よりもカーソル位置が余計に進んで なんで?ってなりました。describe-charで調べてみると、「🌶」の後に「VARIATION SELECTOR-16」っていうコード(異体字選択符号)が 付加されていて、その分余計にカーソルが進む感じになっているようです。Emacsで見ると異体字選択符号がなぜ必要なのか判らなかったのですが、 ブラウザでみると符号が付いた「🌶️」はカラー絵文字で表示されますが符号が無い「🌶」はモノクロで表示されます。
ここで気づいたのですが、以前 何故かカラーで表示されない絵文字があって 組み込み変数の use-default-font-for-symbols をnilにセットするという方法を知ったのですが、この異体字選択符号ってのを 付ければカラーになるのか?と思って試してみたころ、 use-default-font-for-symbolsが tでもカラー表示になりました。 ブラウザでも切り替わるのか?と思い「☀☁☂☃☄」(異体字選択符号なし)と「☀️☁️☂️☃️☄️」(異体字選択符号あり) で書き分けてみたのですが、ChromiumEdgeとChromeどちらもモノクロでの表示になり、あれぇ~?な感じになりました🤔。 因みにFirefoxでは表示が切り替わるようです。 それじゃぁと思い、その前の日記で「🖲(TRACKBALL)」と「🖇(LINKED PAPERCLIPS)」が ブラウザではモノクロ表示になってましたが、こちらは異体字選択符号を入れると「🖲️🖇️」 ChromiumEdge/Chrome/Firefoxとも カラー表示されるようです。
話が逸れましたが、Emacsでは 異体字選択符号は auto-composition-modeが tの時には編集できず見た目も表示されないので、 カーソル位置としてはノーカウントにしてもらわないとダメかもとは思ったりも。 それにしても 絵文字ムズい....🥺

2022/12/07

AM中に起床。

ちょろり買い物にお出かけ。

東京都コロナ感染者。新規は 14946人。

Emacs 29.0.50でimage-diredと拙作window-plusとの相性が悪くなった件。 Emacs29で image-diredでサムネイルを選んだ時の 画像表示がimage-modeを使うように全面的に書き換えられたのですが、

  1. 画像表示用バッファが存在していればkill-bufferで削除する。
  2. 画像ファイル指定でバッファを開く。
  3. バッファ名を画像表示用バッファにrename-bufferで変更する。

という手順で画像表示されていました。開いていた画像表示用バッファを閉じてしまうので表示していたウインドウが無くなる為、 同じ位置の別バッファ表示になってしまったウインドウが再利用されるかは不確定となり、それが拙作window-plusと相性が悪いという結果に。 また、バッファを再利用しない為、別フレームに表示していてもそのウインドウが使われる事はありません。 という訳で image-dired-display-image という関数を 元の動きを踏襲する形で window-plusとの相性問題の解消と 使い勝手を改善してみました。画像表示用バッファをフレームの場所によらず再利用するようにしたので 画像ビュアとして強まった気がしてみたりも🙂

組み込み変数を用意して カラー絵文字表示のON/OFFを切り替えられるようにしてみたり。 多分普段は使わないと思いますが、たまに「モノクロだとどんなだっけ?」って思った時に パッチ無しのビルドで立ち上げる とか面倒臭くなったので😅

Emacs27以降、バージョンアップの度に何かしらうまく動かなくてすんなり移行できません😓。 個人的には暇つぶしになるので構いませんが、 高々テキストエディタのバージョンアップに余計な時間を吸われるのは、普通は許容されないだろうなぁとは思ったりも。

Inkscapeの1.2.2が出ていたり。バグフィックスリリースの模様。

2022/12/06

AM中に起床。

東京都コロナ感染者。新規は 15501人。

Emacs29にはorg-9.6が入るっぽい。という訳で普段使いのorg-modeを git pullで最新にアップデートしてみたり。 いくつか自前のパッチはあるのですがマージは特に問題無さげ。動作もちょろっと使った範囲では問題無さげ。

Windows11のカラー絵文字フォント。Segoe UI Emojiに代わって Fluent Emoji (調べたけど名前がよく判らない)って フォントになるようですが、オープンソースとして公開されているのを知ったり (GitHubサイト)。 カラー絵文字フォントのフォーマットはいくつかあって、Segoe UI Emojiの場合は COLR/CPALテーブルという方式です (参考)。 COLR/CAPLでは単色のカラーレイヤーをいくつか重ねて表示する方式となっています。単色のレイヤーなので スムーズなグラデーションを描くのは難しいと考えられます。 SVGテーブルのフォーマットであればグラデーションもイケると思われますがGDIにレンダリングする方法が無いっぽいです。
で、Windowsの場合アプリ側で対応しないとカラー絵文字はレンダリングできません。DirectWrite化すれば大抵のものはイケる ようになりそうですが、現状圧倒的にGDIアプリの方が多いのと、DirectWriteでのレンダリングは作法がある為、 例えば EmacsのWindows対応のように 思いついた所でデバイスコンテキストにレンダリングするような作りになっていると DirectWrite対応が死ぬほど面倒臭い感じになっていると考えられます。なので、Windows11でも COLR/CPALテーブル方式のみサポートのアプリとか GDIアプリ向けには、SVGや画像埋め込み型のフォントではダメという事になります。
で、Fluent Emoji ってどうやって対応しているんだろう?と思って興味があったのですが、GitHubのリポジトリを 眺めてみると、 3D(画像埋め込み)、Color(SVG)、Flat(SVGですが多分COLR/CPAL向け)、High Constrast(モノクロ )と それぞれ用意されているみたいです。3Dは元データが無いのでどうやって画像にしたのか判りませんが、 他はSVG形式なので Inkscapeとかで見られます。 試しにアコーディオン のデータを見てみたのですが、パスもグラデーションも山盛り使われていて、絵文字で表示するにはオーバースペックに 思えるデータです😅 Flatの方はCOLR/CPALテーブル方式のフォントにしてくれれば、Emacsのカラー絵文字パッチでも 表示できそうに思いました。

さておき、個人的には Segoe UI Emoji は バタ臭さが無いのと 小さくてもモノクロでも視認性が良いので好きなのですが、 Fluent Emoji に移行していくとなると Segoe UI Emojiの方は新しい絵文字/合字の追加対応などのアップデートはされないのだろうか? とは思ったりも。

Emacs 29.0.50で d-mode の色付けが変な件。何がダメなのかを Emacs29に含まれる C#モードである lisp/progmodes/csharp-mode.elと見比べていたのですがよく判らず。 いっその事 cshap-mode.elをベースにした方がよくね?と思って、まずは雑に

$ cat csharp-mode.el | sed 's/csharp/dlang/g' | sed 's/C#/D/g' | sed 's/c#/d/g' | sed 's/c-sharp/d-lang/g' | sed 's/\.cs\\/\.d\\/g' > dlang-mode.el

で生成した dlang-mode を読み込んでみたところ、それになりに色は付くようです。勿論 C#の言語仕様で色が付いているので 変な所はあるのですがキーワードを直せばイケそうな感じには思ったりも。 org-modeも「#+BEGIN_SRC dlang」 としてコードブロックを定義すればHTMLへのエクスポートもうまくできました。 という訳で、d-modeはきっと誰か得意な人が対応してくれるに違いないという事にして Emacs29が正式にリリースされる までは一旦棚上げにしよう😅

Emacs 29.0.50のEWWで背景塗りつぶしが意図通りできていない事がある件。なんとなく改行部分でピンポイントにダメな感じだったのですが、 背景は全て「:extend t」を含むような形にしてなんとなくイケたような気が。一旦これで。

2022/12/05

AM中に起床。今週は休暇でお休み。

掃除したり。

東京都コロナ感染者。新規は 5388人。

そういえば絵文字に「🙈🙉🙊」三猿や「✊✌️🖐️」ジャンケンの手がありますが、グローバルには何なのか判るのだろうか? 手の方は他のハンドサインにまぎれているのでジャンケンのものとは思われていないかも知れませんけれども。 あと、Windows10のChromiumEdgeとChromeでは チョキだけ違うフォントで表示されるので使いでが無い気もします。 FirefoxはチョキもSegoe UI Emojiで表示されるみたい。挙動に一貫性が無いのは謎。

Cygwin 3.4.0がリリースされている模様 ([ANNOUNCEMENT] cygwin 3.4.0-1)。 予定通り32bit Windowsのサポートは停止されたようです。 また、Windows7とWindows8のサポートも3.4.xまでとするようですが、Windows8.1はしばらくサポートされるようです。

自作ELISPが予定通りEmacs29で動かなくなっていたので対応してみたり。 バージョンによってコードを切り替える感じになってしまうのは外部アプリの宿命か。本体にバンドルされる場合は そのバージョンで動けば良いので楽だよなぁとは思ったりも。

Web散策していて知った動画「レゴ マングルラック時計」。 すげぇ。作った人はもちろんスゴイのですが、レゴのポテンシャルが高すぎだろと思ったりも。

Emacs 29.0.50で d-mode の色付けが変な件。いまだ見当が付かず。なんだこりゃ?🤔

2022/12/04

AM中に起床。

東京都コロナ感染者。新規は 10454人。

Emacs 29.0.50+pdf-toolsでハング状態に陥る件。 少しコードの意図が判ったようなそうでも無いような。関数pdf-info-query が実行される契機がどうやら二つあって、 pdf-info-asynchronous がnilの時か否かで話が変わるようです。 pdf-info-asynchronous が nilでは無い場合は closureに対応する 無名関数が入っているのが想定されていて、 インクリメンタルサーチの時は pdf-info-asynchronous に独自のclosure手続きが入っているという仕組みのようです。 この為、pdf-info-asynchronousを無視してしまうと インクリメンタルサーチ時には意図しないclosureとなってしまう為、 うまく動かないという感じみたい。コードは先日抜粋した通りなのですが、 普通のプログラム言語でマルチスレッドな構造を想定したとき、グローバル変数なpdf-info-asynchronous を空中から 拾って参照するのは 直感的に引っかかるやり方なのが気になると言えば気になります。ELISPでは大丈夫なのかも知れませんが。

どうやら pdf-cache--prefetch-pages という関数で設定した pdf-info-asynchronous が失敗している事が判りました。 そして pdf-tools-enabled-modes という pdf-tools.el で defcustom定義されているリストのうち、 pdf-cache-prefetch-minor-mode をコメントアウトして .emacsで再設定すると pdf-cache--prefetch-pagesが実行されなくなり、 その結果 件のハング状態に陥る事は無くなりました。またpdf-info-asynchronousにclosureを入れて動作する インクリメンタルサーチもうまく動いています。 臭いものに蓋をするやり方ですが、ワークアラウンド方法の一つとしては ひとまず有効かなと思います。

先日知った emoji-list コマンドですが、絵文字を選んでRETを押すと emoji-listコマンドを実行した時のバッファに 挿入されるみたいです。ただし挿入先のバッファを切り替えるには一度「*Emoji*」というバッファを削除して、 切り替える 挿入先バッファでemoji-listコマンドを実行し直す必要があるみたいです。 「*Emoji*」バッファを削除せずに再度emoji-listコマンドを実行しても挿入先バッファは切り替わらない模様。 この為、意図していないバッファを更新してしまう可能性があるのに注意が必要です。

Emacs 29.0.50で d-mode の色付けが変な件。コンパイルしてもエラーやワーニングの無いコードなので何がダメなのか全く見当がつかず。 全く色が付かない訳ではなく、import/class/this/newなどのキーワード、コメント、文字列には色が付いています。 ひとまず intなどの型(type)には色が付いていないのでこの辺から手繰ってみようと思った訳ですが、 ルールに従って型のリストを設定すれば よしなに色付けしてくれるっていう体なので、これ以上 なにをすれって感じになってます。 弄っても反応が無いので何がなんだか判りません....🥺

2022/12/03

AM中に起床。

東京都コロナ感染者。新規は 13321人。

Emacs 29.0.50。pdf-toolsのハングが影響大きすぎて突っかかっていましたが、その他も少し確認してみた ところ色々ダメな感じかも。既に挙げている分も合わせてメモ。


Emacs 29の etc/NEWSを眺めていて 「New command to change the font size globally.」という項目に気づきました。 フレームやウインドウのレイアウトはそのままに全てのバッファのフォントサイズを変更できるようです。 メニューの「Options→Set Default Font...」からフォントダイアログでサイズを変えるとフレームサイズも フォントサイズに合わせて変更されます。例えばフォントサイズを大きくした後にフレームサイズ(ウインドウ) を小さくするという手作業が必要になっていたのですが、それが不要になります。ほぅ...

Emacs 29の etc/NEWSで emoji-list というコマンドが追加されているのを知りました。 絵文字の一覧が表示されるのでここからコピペするというのも可能なようです。 ところで「People>role」の項で「🧑‍🎓」という例が示されているのですが、Segoe UI Emojiで表示すると 「🧑🎓」のように分離されて表示されます。 「🧑」は「ADULT」って絵文字で年齢を示す絵文字で性別を表すものではありません。 性別の場合は「👨」の「MAN」か「👩」の「WOMAN」で、先ほどの「🧑‍🎓」の「🧑」を「👨」にすれば「👨‍🎓」になり、 「👩」にすれば「👩‍🎓」になります。で、どうやら「🧑‍🎓」も環境によっては一つの文字で表示されるらしいのを知りました。 試しにEmacsでも「Twitter Color Emoji SVGinOT」で表示してみたところ なんか表示がスキップされてます😓

Emacs29.0.50 emoji-list Segoe UI Emoji 表示
Emacs29.0.50 emoji-list Twitter Color Emoji SVGinOT 表示

でも、スクラッチバッファに貼り付けるとちゃんと合字で表示されるようです。線画だけど。

Emacs29.0.50 Twitter Color Emoji SVGinOT 表示

挙動がよくわからないなぁ?🤔

Emacs 29の etc/NEWSで image-modeで上下反転や左右反転表示ができるようになったのを知りました。 ただ、image-modeはキーバインドがプレフィックスとして「i」を押すように変更されたのは微妙かも。 追記ですが組み込みImageMagickで表示した場合は反転できないみたい(シラっと無視される)。 外部コマンドで表示した場合は大丈夫そう。

Emacs 29の etc/NEWSで Windows向けにもダブルバッファリング表示がサポートされたのを知りました。 「👨‍👩‍👧‍👦」のような合字のカラー絵文字にカーソルが乗った場合に、原理的なレンダリング手順の都合でチラついていましたが (参考)、Emacs 29ではちらつかなくなってます。ありがたや。

2022/12/02

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

東京都コロナ感染者。新規は 11244人。

Emacs 29.0.50+pdf-toolsでハング状態に陥る件。 pdf-toolsのハングに関係する箇所を眺めていると、これってどうなるんだっけ?と思う所があったので 試しに書き換えてみたところ、ハング状態に陥らなくなりました。具体的には pdf-info.elの 関数pdf-info-query の以下の部分。

         (closure (or pdf-info-asynchronous
                      (lambda (s r)
                        (setq status s response r done t)))))

このclosureはローカル変数で tq-enqueue でプロセスからの応答が完了した時の動作を 指定しています。変数 doneにtを設定するのはこの部分なのですが、doneがtにならなくて無限ループに なっているというのがハングの直接の原因でした。上記のコードを見て、 もし 変数pdf-info-asynchronous がtになっていた場合、後ろの無名関数は実行されません。 もしかしてこれか?と思い、pdf-info-asynchronous をor条件から外してみたところ、 ハング状態に陥る事は無くなったという次第です。 でも、動作確認したらダメでした。インクリメンタルサーチでのハイライティングが行われません。ダメだ🥺

変数pdf-info-asynchronousが何かしらの理由でtになっているから抜けられないのかと思ったのですが いや、なんかおかしくないか?という状況だったり。ます関係コードは以下。

    352 (defun pdf-info-query (cmd &rest args)
    353   "Query the server using CMD and ARGS."
    354   (pdf-info-process-assert-running)
    355   (unless (symbolp cmd)
    356     (setq cmd (intern cmd)))
    357   (let* ((query (concat (mapconcat #'pdf-info-query--escape
    358                                    (cons cmd args) ":")
    359                         "\n"))
    360          (callback
    361           (lambda (closure response)
    362             (cl-destructuring-bind (status &rest result)
    363                 (pdf-info-query--parse-response cmd response)
    364               (pdf-info-query--log response)
    365               (let* (pdf-info-asynchronous)
    366                 (if (functionp closure)
    367                     (funcall closure status result)
    368                   (apply (car closure) status result (cdr closure)))))))
    369          response status done
    370          (closure (or pdf-info-asynchronous                    ;(*2)pdf-info-asynchronousを見なければ続く372行目で変数doneがtにセットされる
    371                       (lambda (s r)
    372                         (setq status s response r done t)))))
    373     (pdf-info-query--log query t)
    374     (tq-enqueue
    375      pdf-info--queue query "^\\.\n" closure callback)
    376     (unless pdf-info-asynchronous                              ;(*?)そもそもpdf-info-asynchronousがnilでなくては377行目以降実行されない
    377       (while (and (not done)                                   ;(*1)このループが脱出できない
    378                   (eq (process-status (pdf-info-process))
    379                       'run))
    380         (accept-process-output (pdf-info-process) 0.01))

脱出できないのは(*1)のwhile。理由は変数doneがnilのままだから。変数doneはどのコードで更新 してるかというと(*2)のclosureとして定義している所。pdf-info-asynchronousを見ずに 「(or (lambda (s r)....」と書き換えれば変数はdoneはtにセットされる。 ところが(*?)の unlessブロックが実行されるには pdf-info-asynchronous がnilでなくてはならない。 ここで変なのは、(*?)のunlessが成立することと (*2)でpdf-info-asynchronousが nil以外じゃないとdoneがtにセットされない事とは 両立するハズが無いのですが、成立してしまっててなんで?ってなってます🤔

ごにょごにょ書き換えて反応を見てみるも判らず。変数 pdf-info-asynchronous がどうも怪しい気がするのですが...?🤔

2022/12/01

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

東京都コロナ感染者。新規は 12332人。

SAI2の新しいのがリリースされてたり。おつかれさまです。

Emacs 29.0.50+pdf-toolsでハング状態に陥る件。 原因は一旦置いといて、待ち合わせのループ回数に上限を設けて強制的に脱出するようにしてみたところ、 ハング状態に陥る事は無くなりますが 動きはやっぱり怪しいままになります。脱出した所でページを進めても プロセスが終了しないという現象は再現する模様。うーむ。

感触的にはデッドロック案件のような気も。以前 EMMSの停止関数でプロセスの削除が成功するまで繰り返すというワークアラウンドを行いましたが、 このとき単純にループさせるのでは プロセスの状態更新が行われなかったので sleep-for関数を間に挟んで 状態更新されるようにした事がありました。今回は

      (while (and (not done)
                  (eq (process-status (pdf-info-process))
                      'run))
        (accept-process-output (pdf-info-process) 0.01))

というループで終了を待ち合わせています。ELISP的には大丈夫な書き方のようですが、 本来は これでも状態更新イベントが発生するべきものが、何かしらの理由でイベントが発生 できない状況に陥っているのではないか?と推測したり。しかし、EMMSの時のように sleep-for関数を 挟んだりしてみたのですが効果無かったので、ELISPでワークアラウンドできない Emacs本体のバグなんじゃないかなぁ?と思ったりも。

そういえば Emacs29では emoji っていうインプットメソッドが追加されてます。 「M-x set-input-method」で emoji を選ぶと切り替えられます。英語圏の顔文字やマッチする単語を 絵文字に変換するような感じみたい。例えば「a pen and a lemon and a red apple :)」 と入力すると「a 🖊️ and a 🍋 and a 🍎 😃」みたいに変換されました。 ただ、他のEmacs標準インプットメソッドとは排他になるので Emacs標準の日本語入力(japanese)でも絵文字を となると(今は)無理な感じ。


TOP PREV