emacs の indirect buffer が便利だった

Emacsを使っていると、「このファイルの一部だけを別のウィンドウで編集したい…」「同じ内容だけど、表示モードを変えて見比べたい…」と思うことはありませんか? 自分は、よくありました。 そんな時に発見して感動した機能が、 Indirect Buffer です! この記事では、Indirect Bufferの基本的な概念から、使い方、注意点までを解説します。 Indirect Bufferとは? Indirect Bufferは、Emacsの特殊なバッファの一種で、別のバッファ(ベースバッファ と呼ばれます)の内容を「共有」するものです。 ファイルシステムのシンボリックリンクのようなもの、と言えばイメージしやすいかもしれません。 内容の共有: Indirect Bufferは、ベースバッファのテキスト内容(文字だけでなく、文字の色やフォントなどの テキストプロパティ も含む)を完全に共有します。一方での変更は、もう一方に即座に反映されます。 独立性: 内容は共有しますが、それ以外の点(バッファ名、カーソル位置、表示モードなど)は、Indirect Bufferとベースバッファでそれぞれ独立して設定できます。 ファイルとの関連: Indirect Buffer自体はファイルを直接開きませんが、ベースバッファはファイルを開くことができます。Indirect Bufferを保存しようとすると、実際にはベースバッファが保存されます。 Indirect Bufferの作り方 自分が調べた限りでは、 Indirect Bufferを作成する方法は、以下の3つでした。 M-x make-indirect-buffer: より汎用的な作成方法です。 ミニバッファを使って、ベースバッファとIndirect Bufferの名前を指定します。 M-x clone-indirect-buffer またはdoom emacs で SPC B c (clone-indirect-buffer-other-window または SPC B c): 現在開いているバッファをベースバッファとするIndirect Bufferを、素早く作成する方法です。 SPC B c は、新しいウィンドウでIndirect Bufferを開きます。 (org-mode内で) M-x org-tree-to-indirect-buffer (z n): 現在の subtree をIndirect Bufferとして開きます。 M-x doom/widen-indirectly-narrowed-buffer (z N)で、元のバッファに戻る 個人的には、1の方法は全く使わず、 2と3をよく使います。 手軽にIndirect Bufferを作れて、とても便利です!...

3月 28, 2025 · 1 分 · Kaoru Babasaki

最強のAnki用単語学習Cardを作った

はじめに 皆さん、Ankiは使っていますか? Ankiは、間隔反復学習システム(SRS)を採用した、非常に強力な暗記ツールです。 私も長年Ankiを愛用しており、特に語学学習には欠かせない存在となっています。 今回、私がAnkiで英語の語彙学習をするにあたり、「こんな機能があったら最高なのに…」と思う理想のカードタイプを形にし、 GitHubで公開しました。 この記事では、そのカードタイプ「Super Vocab」の紹介と、開発の経緯、そしてAnki/Emacsユー ザーには嬉しい、 anki-editor を使ったカード作成方法について解説します。 理想の単語カードに求める機能 私が単語学習用のフラッシュカードに求める機能は、以下の5点です。 双方向学習: 単語を見て意味を答えるだけでなく、意味を見て単語を答える、両方向の学習ができること。 意味→単語カードでの例文表示: 意味から単語を答えるカードでは、定義だけでなく、例文や用例も表示すること。 理由: 単語は例文や構文とセットで覚えることで、記憶に定着しやすくなる。 同義語の微妙なニュアンスの違いを理解し、区別して覚えられる。 ただし、例文中のターゲット単語は隠したい (ここがポイント!) 理由: 答えが見えてしまうとフラッシュカードの意味がないからカードの意味がないから。 単語→意味はシンプルに: 単語から意味を答えるカードでは、単語以外の情報は極力表示しないこと。 理由: 例文などがあると、単語の意味を推測できてしまい、フラッシュカード本来の目的(想起訓練)が損なわれるため。 簡単に単語を追加でき、経験と結びつけられる: 読書などで出会った単語を、その文脈(例文)ごと簡単にカードに追加できること。 理由: 自分の経験と単語を結びつけることで、より深く記憶に刻み込むため。 柔軟な情報追加: 発音記号、品詞、関連語、語源、メモ、ヒント画像など、単語に関するあらゆる情報を簡単に追加できること。 既存のカードとの比較、そしてSuper Vocab誕生へ AnkiWebを探しても、上記の機能を全て満たすカードタイプは見つかりませんでした。 特に、2番目と3番目の要件(文脈付きの意味→単語カードで、ターゲット単語を自動的に隠す)を満たすものは皆無でした。 Ankiの標準機能であるクローズ削除(穴埋め問題)を使えば、この要件に近いものは作れます。 しかし、例文が増えるほど手作業でのクローズ削除は大変です。 「JavaScriptなどを使って、自動的に単語を隠せないか?」 そう考えていた時、English vocab (note type) という素晴らしいカードタイプに出会いました。 このカードタイプは、まさに私が求めていた自動クローズ削除機能を備えていました! しかし、惜しいことに、上記の要件を全て満たしているわけではありません。 そこで、私はこの「English vocab (note type)」をベースに、自分の理想とする機能を全て盛り込んだ、究極の単語カード「Super Vocab」を作ることにしました。 anki-editorとEmacs、立ちはだかる壁、そしてPull Requestへ 私は普段、Ankiのカード作成にanki-editorというEmacs packageを使っています。 org-modeで構造化されたノートをAnkiに簡単に取り込める、非常に便利なツールです。 Super Vocabのカードタイプも、anki-editorを使ってEmacsからAnkiに送信しようとしました。 しかし、ここで問題が発生しました。 通常、anki-editorはorg-modeのノートをHTMLに変換してAnkiに送信します。 しかし、HTMLに変換してしまうと、Super VocabのJavaScriptによる自動クローズ削除機能が動作しなくなってしまうのです。 anki-editorには :ANKI_FORMAT: nil というオプションがあり、これを使うとHTML変換を無効にできます。 しかし、このオプションは全てのフィールドに適用されてしまい、カードの見た目(HTML/CSSによる装飾)も失われてしまいます。...

3月 17, 2025 · 1 分 · Kaoru Babasaki

emacs起動時の、 Project … cannot be read

問題 先日、いつものようにEmacsを起動すると、mini bufferに Project <プロジェクト名> at <プロジェクトのパス> cannot be read. と表示され、emacsがただの白い画面を写すソフトウェアになってしまいました。 少し前にこのプロジェクトのパスを変更したので、そのせいかと思い、 projectile-known-projects-file にあるプロジェクトのパスを変更/削除してみましたが、状況は変わりませんでした。 doom sync や doom upgrade なども試しても、解決しませんでした。 解決策 試行錯誤の結果、原因はなんと、treemacs にあることがわかりました。 treemacsは、セッション情報を、 treemacs-persist-file (通常は user-emacs-directory/.cache/treemacs-persist)に保存するのですが、 その名の通り、treemacs_persistがpesistしていたのが原因だったようです。 そのため、 rm ~/.config/emacs/.cache/treemacs-persist # pathは環境によって異なる で解決することができます。 自分はtreemacsを入れておきながら、全然使ってなかったので、treemacsをinitファイルから削除しました。 今回は以上です。 参考 Project .emacs.d at User/x.emacs.d cannot be read. · Issue #586 · Alexander-Miller/treemacs

2月 23, 2025 · 1 分 · Kaoru Babasaki

Server julia-ls starting exited (check corresponding stderr buffer for details). Do you want to restart it? (y or n) の解決策

問題 先日久々にemacsでjuliaを使おうとしたら、 Server julia-ls:50759/starting exited (check corresponding stderr buffer for details). Do you want to restart it? (y or n) のようなmessageが(y を押しても繰り返し)出てきて、lspが起動しませんでした。 これを直すのにそこそこ時間がかかったので、emacsでjuliaを使っている方 (果たして日本に何人いるのか…) のために解決策をメモしておきます。 解決策 lsp-julia のビルド済みファイルが格納されているディレクトリの中にある Project.toml (自分の環境では ~/.config/emacs/.local/straight/build-29.4/lsp-julia/languageserver/Project.toml ) が実体のあるファイルではなく、シンボリックリンクであることが原因でした。(理由はよくわからない) そのため、シンボリックリンク先のファイル(自分の場合は /.config/emacs/.local/straight/repos/lsp-julia/languageserver/Project.toml)をコピーして、直接のファイルを同じ場所に作成することで解決しました。 参考 language server crashes · Issue #66 · gdkrmr/lsp-julia

1月 29, 2025 · 1 分 · Kaoru Babasaki

Hoffの解答例のサイトのソースコードを公開しました

Hoffの演習問題の解答例のソースコードを公開しました: GitHub このサイトはちょうど2年前に公開し、少しずつアップデートしてきたものです 今までは、間違いやtypoを見つけたらメールで連絡して欲しいとサイトに書いていましたが、結局そのような連絡は2年間で1度も来たことがありませんでした😭 (海外の研究者の方から感謝のメールをいただいたことはあり、それはとても嬉しかったです) なので、もしかしたらgithubのissueやPRだと気軽に連絡してもらえるかもしれないと思い、公開しました これからは 11章以降の演習問題の解答例を追加 日本語と英語が混在しているので、英語版と日本語版をちゃんと分ける julia で書いた教科書本文中のコードをrepoに追加 などをしていきたいと思います

1月 28, 2025 · 1 分 · Kaoru Babasaki

Advent of Code 2023 1日目

明けましておめでとうございます。 昨年の年末、とある理由で2023 のAdvent of Code をちょっとずつ解いていたので、自分の解答や、ちょっとしたメモを残していこうと思います。 なお、全部pythonで書いています。 全部解き終わったタイミングで、まとめてgithubにあげようかなと考えていますが、いつになるかはわかりません。 それでは、早速Day 1 の解答を書いていきます。 Part a 問題の概要 数字と文字が混ざった文字列が与えられる。 この文字列のそれぞれの行に含まれる最初の数字と最後の数字を取り出し、それらを結合した数値を求める。 例: 1abc2 → 12 pqr3stu8vwx → 38 a1b2c3d4e5f → 15 treb7uchet → 77 課題は、与えられた入力ファイルの全ての行について、この方法で校正値を求めて合計することである。 この例では、4つの行の校正値(12 + 38 + 15 + 77)を合計すると142になる。 My solution from fastcore.utils import L from aocd import get_data, submit import re, regex from regex import findall def get_calibration_value(x:str): digits = re.findall(r"\d", x) return int(digits[0]+digits[-1]) def solve1a(inp:str): lines = L(inp.splitlines()) return lines.map(get_calibration_value).sum() Part b 問題の概要...

1月 7, 2025 · 1 分 · Kaoru Babasaki

『Pythonではじめる時系列分析入門』のorg version repoを作ったよ

最近、 馬場 真哉 (著) 『Pythonではじめる時系列分析入門』という本を読みました。 この本はpythonのコードを手で動かしながら時系列分析の基礎を学ぶことができる本で、とてもためになりました。 特にsktimeという、トレンド・季節性の除去などの前処理や予測モデルをsklearnのように簡単にpipeline化できるライブラリを知ることができた点がよかったです。 馬場先生はこの本の公式リポジトリを公開されているのですが、pythonコードがjupyter notebook形式で書かれているため、heavy emacserの私としてはどうしてもorg-modeを使いたくなってしまいました。 そこで、この本のコードをorg-mode形式に変換したリポジトリを作成しました。 リポジトリのリンク このリポジトリを使って、emacsユーザーの方々がこの本を読む際に、jupyter notebookを使わずにorg-modeでコードを実行できるようになればと思います。 特にないと思いますが、このリポジトリを使って何か問題が発生した場合は、pull requestやissueを送っていただけると助かります。 時系列分析勉強中のemacsユーザーは私に感謝したうえで今年のクリスマスは家族と過ごしてください。 読んでいただきありがとうございました。

12月 22, 2024 · 1 分 · B.Kaoru

emacsをupgradeしたらankiの数式が汚くなったので直した

導入 こんにちは。 私は日頃からanki-editor を使ってAnkiのカードを作成しているのですが、 Emacsをupgradeすると、数式が汚く表示されるようになってしまいました。 症状としては、 デスクトップ版のAnkiのBrowserで各Fieldのプレビューで数式が数式として表示されない (plain latex codeとして表示される) 数式がpng画像として表示される (もともとはMathJax inlineで表示されていた) というものでした。 デスクトップ版のAnkiでcardを編集することはほぼないので、1の症状についてはまだ許容範囲でしたが、 2のほうについては、数式の解像度だけ低くなったり、他の文字とのサイズが合わなくなったりして、かなり気になりました。 解決策 以下を config.org に追加することで解決しました。 (use-package! anki-editor :after org :init (setq-default anki-editor-latex-style 'mathjax)) この解決策に至った背景 anki-editor でpushされたカードは、HTMLに変換された状態でカードとして保存されます。 うまく数式が表示されるカードのHTMLを見ると、数式は以下のように anki-mathjax というタグで囲まれていました。 <anki-mathjax block="true">1 + 1 = 3</anki-mathjax> 一方、今回の問題が発生したカードのHTMLを見ると、数式は以下のように p タグと [$$] で囲まれていました。 <p>[$$] 1 + 1 = 3 [/$$]</p> したがって、anki-editorがorgテキストをHTMLに変換する部分で、問題が発生していることがわかりました。 anki-editor.el の中を見てみると、以下のように anki-editor-latex-style という変数によって、latexのスタイルを変更できるようになっており、今回の解決策に至りました。 (defun anki-editor--translate-latex-env (latex-code) (setq latex-code (replace-regexp-in-string "\n" "<br>" (org-html-encode-plain-text latex-code))) (cl-ecase anki-editor-latex-style (builtin (concat "[latex]<br>" latex-code "[/latex]")) (mathjax (concat "\\[<br>" latex-code "\\]")))) 読んでいただきありがとうございました。...

11月 24, 2024 · 1 分 · Kaoru Babasaki

Hoff/標準ベイズ 演習問題 10-4

導入 Answers of exercises on Hoff, A first course in Bayesian statistical methods (標準ベイズ統計学の演習問題の解答例) を更新(10-4を追加)したので、このブログでもその内容をほんの少しだけ触れようと思います。 まず、この問題と教科書本文の関係について簡単に説明します。 以前 Hoff/標準ベイズのM-Hアルゴリズムがworkすることの証明でつまずいた話 という記事を書きましたが、Hoff (2009) では10章でM-Hアルゴリズムがうまくいくことの-証明を以下のステップで行っています。 M-Hアルゴリズムは、 irreducible (非可約), aperiodic (非周期的), positive recurrent (正再帰的) なマルコフ連鎖を生成する。 Ergodic Theoremより、\(s \to \infty\)で \(\mathrm{Pr}(x^{(s)} \in A) \to \pi(A)\) for any set \(A\); \(\frac{1}{S} \sum g(x^{(s)}) \to \int g(x) \pi(x) dx\). を満たす\(\pi\)が一意に存在する。 このような\(\pi\)は定常分布と呼ばれ、以下の性質を持つ If \(x^{(s)} \sim \pi\), and \(x^{(s+1)} \) is generated from the Markov chain starting at \(x^{(s)}\), then \(\mathrm{Pr}(x^{(s+1)} \in A) = \pi(A)\)....

11月 19, 2024 · 2 分 · Kaoru Babasaki

ox-htmlで\bmなどのlatexマクロを使う方法

問題 \bm{a} 上の数式を書いたorg fileは、latex(pdf)へのexportであれば \usepackage{bm} とセットで斜体太字になるところ、 ox-html で単にHTMLとして exportしただけではlatexマクロとして認識されなかったので、その対処法を解説します。 latexによる数式をHTML上で表示する場合、MathJaxというライブラリを使うことが一般的であり、今回の問題も \bm をMathJaxでマクロとして認識させることで解決できます。 このQiita記事がまさにそれをやっていたので、それを参考にまず以下の方法を試してみました。 最初に試した方法 以下のブロックをorg fileに追加しました。 #+BEGIN_EXPORT html <script> MathJax = { tex: { macros: { bm: ["\\boldsymbol{#1}", 1], }, } }; </script> #+END_EXPORT 結果、 \bm はうまく斜体太字になったが、 \eqref{} など他のlatexマクロが逆にうまく表示されなくなってしまうという問題が発生しました。 解決策 よく調べてみると、 ox-html の変数に、 org-html-mathjax-template というものがあり、そこにMathJaxの設定を書き込むことで、latexマクロをHTML上で認識させることができることがわかりました。 テコちゃんのconfigを参考に、以下の設定config.orgに追加することで解決しました。 (setq org-html-mathjax-template "<script> window.MathJax = { loader: { load: ['[tex]/mathtools'], }, tex: { ams: { multlineWidth: '%MULTLINEWIDTH' }, tags: '%TAGS', tagSide: '%TAGSIDE', tagIndent: '%TAGINDENT', packages: {'[+]': ['mathtools']}, macros: { RR: ['\\\\ifstrempty{#1}{\\\\mathbb{R}}{\\\\mathbb{R}^{#1}}', 1, ''], NN: ['\\\\ifstrempty{#1}{\\\\mathbb{N}}{\\\\mathbb{N}^{#1}}', 1, ''], ZZ: ['\\\\ifstrempty{#1}{\\\\mathbb{Z}}{\\\\mathbb{Z}^{#1}}', 1, ''], QQ: ['\\\\ifstrempty{#1}{\\\\mathbb{Q}}{\\\\mathbb{Q}^{#1}}', 1, ''], CC: ['\\\\ifstrempty{#1}{\\\\mathbb{C}}{\\\\mathbb{C}^{#1}}', 1, ''], bm: ['\\\\boldsymbol{#1}', 1], ;; <- ここに\bmの設定を追加 EE: '\\\\mathbb{E}', Lap: '\\\\operatorname{\\\\mathcal{L}}', Var: '\\\\operatorname{Var}', Cor: '\\\\operatorname{Cor}', E: '\\\\operatorname{E}', }, mathtools: { pairedDelimiters: { abs: ['\\\\lvert', '\\\\rvert'], norm: ['\\\\lVert', '\\\\rVert'], ceil: ['\\\\lceil', '\\\\rceil'], floor: ['\\\\lfloor', '\\\\rfloor'], round: ['\\\\lfloor', '\\\\rceil'], } } }, chtml: { scale: %SCALE, displayAlign: '%ALIGN', displayIndent: '%INDENT' }, svg: { scale: %SCALE, displayAlign: '%ALIGN', displayIndent: '%INDENT' }, output: { font: '%FONT', displayOverflow: '%OVERFLOW' } }; </script> <script id=\"MathJax-script\" async src=\"%PATH\"> </script>") これでどんなlatexマクロもHTML上で認譫させることができますね!...

11月 18, 2024 · 1 分 · Kaoru Babasaki