markdown-modeに VSCodeっぽい画像貼り付け機能を実装した

github.com

Emacs 29に yank-media という機能が追加されて clipboardにあるデータを各モードで自由にハンドリングできるようになった. VSCodemarkdownを書いているときに画像をペーストすると inline linkが挿入されますが、それと同じようなことができるように markdown-mode に機能を追加しました. ただし Emacsでは普通の yankでは実現できなくて, M-x yank-media という別のコマンドを使う必要があります. (clipboardの中身を見て先頭が画像だったら挙動を変えるとかの関数を自分で実装すればいけるとは思います). あと Emacs29以上が必要になります.

example

ブラウザでコピーした画像を markdownファイルに貼り付けている例になります.

実装

例として html-mode で clopboardの画像を img タグで Base64で貼り付ける場合を示します.

(add-hook 'html-mode-hook (lambda ()
                            (yank-media-handler "image/.*" #'html--image-media-handler)))

まず各種 major-modeやその hookで yank-media-handler 関数を呼び出して, マッチさせたい mime-typeの正規表現とそのハンドラを設定します. ハンドラの引数は 2つあって, 1つめが mime-type, 2つめがデータになります.

(defun html--image-media-handler (mimetype data)
  (let* ((mime (mailcap-mime-type-to-extension mimetype))
         (base64 (base64-encode-string data))
         (img-tag (format "<img src=\"data:image/%s;base64,%s\" />" mime base64)))
    (insert img-tag)))

ハンドラの実装はこのようになります. あとは dataを好きなように扱ってやればよいです. mime-typeをどうかしたい場合は, mailcap packageなどに各種ユーティリティがあるので探してみるとよいでしょう.

Ubuntu 22.04の設定メモ

syohex.hatenablog.com

PC買ったので設定に関するメモ. 最近デフォルト信仰なので昔ほど凝ったことはせず最低限使えるようにするメモ

Gnome Extension

  • Auto select headset 有線ヘッドフォンなどを使ったときいちいちどのデバイスを使うのか問われるのがうざかったので
  • Clipboard Indicator クリップボード履歴のために. 個人的には Windowsのものがベストで, 使い勝手はそれより悪いのだけど使えるレベルではある. 同じ名前の拡張があるので注意(Linuxに限らず macOSもそうだけど未だになんでこの機能がデフォルトで使えないのだろうか)
  • Workspace Indicator 今自分が作業している workspaceをわかりやすくするため

dconf editor

  • /org/gnome/shell/app-switcher/current-workspace-only trueに設定. falseだと macみたいな挙動になる. アプリを選んだら workspace関係なくすでに開かれているアプリにフォーカスする. true だと workspaceごとにアプリを起動したりスイッチできたりするようにする.
  • /org/gnome/desktop/interface/enable-animations false に設定. animationがうざいので
  • 不要なショートカットキーを全部無効化する. Settingsからでもできるけど, 一部できないのもあるので主に dconf editorから操作している.

その他

  • Ctrl, Caps lockの入れ替え. 最近は標準機能でできるのでそれを使った
  • マウス, trackpad速度の調整. 自分の気に入るレベルに調整

ぐらいかな. あとは開発などに必要なツールや動画見るのに困らないツールを apt で入れたぐらい.

System76 Lemur Proを買った

syohex.hatenablog.com

使っていた PCを処分することに伴い新しい PCを買った. 大学生のときに先輩に勧められて以来 ThinkPadを使っていたけど, 最近の ThinkPadカスタマイズの幅が昔ほど広くないし, たまには違うのを買ってみるかということで Lemur Proを選んでみた. Linuxを使うしインストールし直すの面倒だなということで初めから入っているメーカかつ日本に shipping可能ということでかなり選択肢の幅は狭くなってしまったのだが, 評判も悪くないし System76にしてみた.

値段

円安時期だったからかそこまでカスタムしていないけど本体 + 送料 + 関税で 21万円ぐらいだった. なんで米ドルで見るほどのお得感はなかった. まあ ThinkPadだと同スペックだと 30万円近くなってしまうのでそれよりかはお得かなと思った(Windowsじゃないとかはあるけど)

注文

Webからポチポチと構成を選んで住所を入れただけ. メモリとディスクと OSを変えた程度. PopOSにしようかと思ったけど画面が狭くてそこまで利点がなさそうかなと思ったのと, PopOSは Ubuntu LTSベースで半年ごとのアプデができないので Ubuntuにしておいた.

ただしすんなりとは買えず, カード請求にランダムな 5桁の英数字があるからそれをメールしてから発送するということだった. 自分のカード会社の問題なのか普通はそういうものなのかわからないけど, そのメールを受けて 4日後ぐらいに請求が来ていた. しかし使っているカード会社の表示の問題なのかなんなのか 3桁しか表示されておらずどうしたものかと, System76に問い合わせたところそれでもいいということでした. そのあと 1週間しないうちぐらいに届いた.

関税支払い

クロネコヤマトに関税を払うのだけど, Webで見るとカード払い可とあったのだけどカード払いできませんと言われて焦ってしまった. 交通系決済では払えるということだったので急いで mobile Suicaに限度額チャージして事なきをえた.

Lemur Pro感想

良い点

  • 軽い. 寝ながら使うようなのでちょうど良い感じ.
  • 処理速度は悪くない. そこそこのプログラミングなどでも問題なく使えている. ただファンはわりとすぐに回る.

微妙な点

  • 標準アダプタのケーブルが短すぎる. 2mもなく 1.5とかそれぐらい. ThinkPadが長過ぎる(3mぐらい)というのもあるけど, 想定していた電源には全く届かず, それを使わず USB Type-Cの長いケーブルを買ってそれで充電することにした
  • insertキーがない. Windowsも使うから Shift-insertとか結構使っていたのだけどキーがないので代替手段を使うことになってしまった. 慣れの問題ではある.

タッチパッド

今どきのタッチパッドmac以外使ったことがなかったけど, 慣れない. 昔みたいに物理左クリック, 右クリックボタンがあるわけではなく macみたくフラット. それなのに場所によって左クリック, 右クリック, 中クリックがあるというのは非常にわかりづらい. 中クリックはいるのか ?? 今どきのは非 macでもだいたいこれっぽいのだけど, シングルクリックの macはさておき, そうじゃないのは合っているのかなと思った. あとカチカチするのが以外と手間というか力がいるなと感じた.

調べたり試行錯誤していると以下の方法で代替は可能 - 左クリック: 1つの指で軽くタップする - 右クリック: 2本指で軽くタップする - スクロール: 2本指でスクロール

最後に

現状 Thinkpadの方が長年使いすぎた影響で良かったかなと思ってしまうけど, せっかく買ったので慣れていこうかと思います.

ThinkPad T490を処分した

4年ほど酷使していたのだけど, 最近ディスクエラーが増えまくって強制終了せざるを得ないことが増えてきたので新しいラップトップを買った. それにともない不要になった ThinkPad T490を処分することにしたのでその記録.

ディスクの消去

scrapbox.io

自分でやるの久しぶりだったので, dd if=/dev/zero of=/dev/hoge でいいんじゃねって思っていたけど, 調べると SSDはそうじゃないとのことだった. NVMeタイプだったので Linuxだと nvme-cli でいけるとのこと. bootable USBメモリを作って必要なソフトをインストールして試してみたのだが, ThinkPadではうまく機能しなかった. (各所で見られる一度 suspendしてからなども試したが無理であった)

github.com

NVME Admin command error:ACCESS_DENIED: Access to the namespace and/or LBA range is denied due to lack of access rights(4286)

上記のリンクのようにこのエラーが出てどうしようもなかったので, 上記の issueに書いていた Thinkpad Drive Erase Utilityを使って消去することにした.

Thinkpad Drive Erase Utility

support.lenovo.com

ここから自分の機種にあったツールの isoを取得し, USBメモリに焼いた

dd if=thinkpad_drive_erase_utility.iso of=/dev/sda bs=1M

この USBメモリからブートして指示に従い消去作業を進めたところエラーがでることなく, ディスクの消去が問題なく行えた.

PCの処分

住んでいる区と連携している リネットジャパンに申し込んだ. 箱だけ用意すればその他費用は不要であった. 宅配便の人が受け取りに来るのでそれまでに箱の梱包を済ませた.

eglotで一部 LSPの機能を無効化する

たまに Emacsでコード書いているときに, eglotが自動フォーマットするのがうざいとので方法を調べた。基本はフォーマッタ使って整形しているのでエディタで意図せぬタイミングで整形をされるとイラッとするので、無効化しておいた。

(setq eglot-ignored-server-capabilities '(:documentFormattingProvider
                                          :documentOnTypeFormattingProvider
                                          :documentRangeFormattingProvider))

上記のように eglot-ignored-server-capabilities に無効化したい機能をリストで列挙すればよい。docstringにサポートしている機能がすべて列挙されているのでそれを見て自分が不要と思う機能をリストに追加することで無効化できます. これで編集中に勝手に整形されることはなくなる.

zshでポータブルな statコマンドを使う

ほとんどの人は知る必要はないと思いますが、zshの補完を書いていて環境に応じて statコマンドでファイル更新日時を取得する必要があったのですが, GNU系と BSD系でコマンド体系が違うくて何かいい方法がないかと調べたところ zshの stat moduleを使えばいいということがわかった.

モジュールのロード

zmodload -F zsh/stat b:zstat 2> /dev/null # 補完スクリプトだと複数回実行されることがあるため, エラー表示は捨てる

これで zstatというコマンドが使えるようになります.

使い方 例

# ファイル更新日時を表示
zstat +mtime README.md

# 結果を表示せず指定した配列変数に格納する
zstat -A array_var README.md

詳しくは https://zsh.sourceforge.io/Doc/Release/Zsh-Modules.html を参照してください. 補完も当然効くのでそれでもだいたいわかります.

ウインドウサイズが小さすぎると VSCodeで F#コードを REPLに送るとエラーが出る

ただのメモです. VSCodeで F#を書いていて, FSI: Send File などのコードを REPLに送って評価する処理がこのエラーで全然機能しないことがあって原因も全然わかっていなかったんですけど, VScodeのウインドウサイズが小さすぎると出てしまうみたいで, ウインドウサイズを大きくするとエラーが解消されました. 謎.

モニタのサイズなどにもよるのかもしれないですが, 以下のものだとエラーが出て

以下ぐらいにするとエラーが解消されます

issueを見てみたのですがそれっぽいものが見当たらず. 時間があるときにちゃんと探してみます.