markdown-modeに VSCodeっぽい画像貼り付け機能を実装した
Emacs 29に yank-media
という機能が追加されて clipboardにあるデータを各モードで自由にハンドリングできるようになった. VSCodeで markdownを書いているときに画像をペーストすると inline linkが挿入されますが、それと同じようなことができるように markdown-mode
に機能を追加しました. ただし Emacsでは普通の yankでは実現できなくて, M-x yank-media
という別のコマンドを使う必要があります. (clipboardの中身を見て先頭が画像だったら挙動を変えるとかの関数を自分で実装すればいけるとは思います). あと Emacs29以上が必要になります.
例
ブラウザでコピーした画像を 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の設定メモ
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を買った
使っていた 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を処分することにしたのでその記録.
ディスクの消去
自分でやるの久しぶりだったので, dd if=/dev/zero of=/dev/hoge
でいいんじゃねって思っていたけど, 調べると SSDはそうじゃないとのことだった. NVMeタイプだったので Linuxだと nvme-cli でいけるとのこと. bootable USBメモリを作って必要なソフトをインストールして試してみたのだが, ThinkPadではうまく機能しなかった. (各所で見られる一度 suspendしてからなども試したが無理であった)
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
ここから自分の機種にあったツールの 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 を参照してください. 補完も当然効くのでそれでもだいたいわかります.