AM中に起床。
掃除したり洗濯したり。
東京都コロナ感染者。新規は 11189人。
そんな訳で今年を振り返り。
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'")
(treesit-ready-p 'dlang) ;; and press C-j t (treesit-query-validate 'dlang "") ;; and press C-j "QUERY is valid"
(treesit-query-validate 'dlang '((comment) @font-lock-comment-face))
Node type error at: 2 (comment) @font-lock-comment-face
(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"
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 : 省略
⛔ 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
$ gcc -shared -g -O2 -Isrc src/parser.c -o libtree-sitter-c.dll
テレワーク。早めに終了。
東京都コロナ感染者。新規は 20243人。
調べ事。
テレワーク。気持ち早めに終了。
東京都コロナ感染者。新規は 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 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]))))))))))))))
テレワーク。気持ち遅めに終了。
東京都コロナ感染者。新規は 8428人。
D言語モード。演算子オーバーロードを記述するのに「static if(){} else static if() {} else statick assert();」
みたいな「static if コンディション」てのを使う場面があるのですが、elseに続けると インデントがイマイチ
思った感じにならなかったり。 staticが入らなければ意図通りなので static ifをどうにかする必要があるっぽい。
でもどうやれば良いのか判りません🤔
昼前起床。
掃除したり洗濯したり。
東京都コロナ感染者。新規は 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]=凾
$ ./dlang_argtest.exe This is 🙂 | cat arg[1]=This arg[2]=is arg[3]=🙂
$ /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]=🙂
$ alias chcp='/cygdrive/c/Windows/System32/chcp.com' $ chcp 現在のコード ページ: 932
昼前起床。
東京都コロナ感染者。新規は 18731人。
Emacs 29.0.50でのD言語モード。C#モードを元にして色付けはそれとなくできるようになった気が?
入れ子可能な「/+ +/」コメントブロックとかは元のd-modeでどうやってるのかイマイチ理解できてないので放置。
Emacs29では tree-sitterなるものが使えるようになるらしいのですが、ライブラリのCygwinパッケージには無いので組み込めず。
てかビルドや組み込み方法などがイマイチよく判っていないです😓
テレワーク。気持ち早めに終了。
東京都コロナ感染者。新規は 17332人。
Emacs 29.0.50で d-mode の色付けが変な件。
当面の回避策として、以前試してなんとなく対応できそうな気のする C#モードを改造してみるのを試し中。
d-modeではswitchステートメントのcaseのインデントが
変な感じだったのが なんとなく普通な感じになってみたり。
テレワーク。気持ち遅めに終了。
東京都コロナ感染者。新規は 18820人。
実験。
テレワーク。気持ち早めに終了。
東京都コロナ感染者。新規は 21186人。
調べ事。
テレワーク。気持ち遅めに終了。
東京都コロナ感染者。新規は 20513人。
あまりの眠さに急速停止。
テレワーク。気持ち遅めに終了。
東京都コロナ感染者。新規は 7949人。
Web巡回して終了。
昼前起床。
掃除したり洗濯したり。
東京都コロナ感染者。新規は 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ブランチ。分岐してから新規に追加されるパッケージやファイルが沢山ある気がします。
どこまで入れるかの交通整理って行われているのかしら?
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で保持している為 うまく動くという事のようです。
テレワーク。気持ち遅めに終了。
東京都コロナ感染者。新規は 16273人。
image-cropでの水色の横線。画像に引かれているんじゃなくて訂正線で表現されているのか?と思ってdescribe-charで
調べてみるもそういう訳では無さげ。弊害がある訳ではないので調査は一旦保留🙁
emacs -Qで image-crop確認。以前確認した事の中で、ImageMagickで表示した画像の切り出しに
失敗する件は、フォーマットによって image-propertyに :flip と :rotation の両方が無い場合に失敗するのが原因のようでした。
失敗するのとしないのとの違いは判りませんが、どちらかが入っていれば問題無いので、:rotation に 0.0 にセットする事で
ワークアラウンドになったという感じ。
本日休業。
先日コロナワクチン接種を行ったのですが、一日中うっすら具合が悪い感じ。
東京都コロナ感染者。新規は 17687人。
image-cropでの水色の横線。実際に描画されているSVGデータを message関数とformat関数を使ってミニバッファに
表示し、その表示したデータをSVGデータとして svg-insert-image関数でスクラッチバッファで表示してみたところ、
やっぱり水色の横線は描画されません。SVGデータに描画要素が含まれていないのでこれは当然なのですが。
元々 emacs -Q で起動した場合は水色の横線が描画されないので何故だ?
と思い調べ始めたのですが、何故か目の前で起こっている事象の原因が判らない不思議🤔
テレワーク。気持ち遅めに終了。
東京都コロナ感染者。新規は 188812人。
image-cropでの水色の横線。どこで入っているんだ?と調べてみるも、crop/cutモード時にSVGデータで表示される
のですが、そのSVGデータをsvg-createした直後くらいのデータで線を引く要素は無いのにも関わらず何故か
線が引かれます。なんだこれ?🤔
「--with-x-toolkit=gtk」でビルドしても引かれるので、w32だからという訳では無さそう。謎。
テレワーク。気持ち早めに終了。
東京都コロナ感染者。新規は 19800人。一直線に増加傾向か。
少し前に組み込みImageMagickでの表示が反転に対応していなかったので対応してみたのですが、
先日 image-modeの組み込みローダー表示および外部convert表示の画像回転は 反転していなければ時計回り、
反転していれば反時計回りになるのに気づきました。組み込みImageMagickの反転対応では 反転しているか否かに関係無く時計回りとしていたのですが
image-modeの仕様に合わせてみました。回転方向で表向きか裏向きかを判断できるのでこれはこれでアリと思い直したりも。
emacs -Q で image-crop の確認をしてみてたのですが、cropやcutモードの表示の時に水色の横線(先日の例)が
表示されないなぁ?と思ったり。この線が入る事で crop/cutモードになっているのを表しているのかなぁ?くらいに思っていたのですが
そういう訳では無いのか?てか、この線をどこで描画しているのかが何故か分からない😓 あれぇ?
テレワーク。早くもなく遅くもなく終了。
東京都コロナ感染者。新規は 7044人。
Emacs29の image-crop。画像反転に対応してみたり。対応している中で image-modeの回転はClockwiseとなっているのですが、
反転表示の状態では逆回転になるのは仕様なのだろうか? convertコマンドを使う都合で image-modeの仕様に合わせるには
反転しているか否かで分岐を入れる必要がありました。何か間違っているのかも知れませんが。
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するように
なってれば、座標を好きなように加工する事もできるかもなぁ?と思ったり。
AM中に起床。
東京都コロナ感染者。新規は 14558人。
Emacs29の image-crop。範囲指定を右下から左上に囲んだり、矩形の形を変更する時に象限が変わるような動かし方を
した時に変な範囲が選択されるのを直してみたり。コード的にはなんかイマイチな感じですが使い勝手は良くなった気も。
ついでに選択領域が塗られるような表示だったのを、svgのpath塗りつぶしの fill-rule って属性を使って
選択領域が明るくなるようにしてみました。
image-cut(選択領域の塗りつぶし)は これまで通り選択領域を暗くした方が良いと思ったのですが、
関数の引数を増やす必要があるのでまたいずれ。
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を表示できるビルドになっている必要があるっぽい。さておき、
クリッピングした画像の保存ができなくてなんだこれ?ってなったのですが、まだ細かいところの作りこみが甘い感じ。
気づいた点と今の所の対応策のメモ。
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の時には編集できず見た目も表示されないので、
カーソル位置としてはノーカウントにしてもらわないとダメかもとは思ったりも。 それにしても 絵文字ムズい....🥺
AM中に起床。
ちょろり買い物にお出かけ。
東京都コロナ感染者。新規は 14946人。
Emacs 29.0.50でimage-diredと拙作window-plusとの相性が悪くなった件。
Emacs29で image-diredでサムネイルを選んだ時の 画像表示がimage-modeを使うように全面的に書き換えられたのですが、
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
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 の色付けが変な件。いまだ見当が付かず。なんだこりゃ?🤔
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)には色が付いていないのでこの辺から手繰ってみようと思った訳ですが、
ルールに従って型のリストを設定すれば よしなに色付けしてくれるっていう体なので、これ以上 なにをすれって感じになってます。
弄っても反応が無いので何がなんだか判りません....🥺
AM中に起床。
東京都コロナ感染者。新規は 13321人。
Emacs 29.0.50。pdf-toolsのハングが影響大きすぎて突っかかっていましたが、その他も少し確認してみた
ところ色々ダメな感じかも。既に挙げている分も合わせてメモ。
テレワーク。気持ち早めに終了。
東京都コロナ感染者。新規は 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)))))
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))
テレワーク。早めに終了。
東京都コロナ感染者。新規は 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))