2026-02-11 ,

org-modeの表に数式を入力するときに座標を表示する

C-c = (org-table-eval-formula)で数式を入力するときに自動的に座標(行番号/列番号)を表示するようにしてみました。

元々 C-c } (org-table-toggle-coordinate-overlays)で座標を表示/非表示にできますが、 C-c = で数式を入力するときに自動的に座標を表示し、入力が終わったら消すようにするわけです。

;; C-c = で式を入力するときに座標を表示する。
(defun my-org-table-display-coordinates-around (old-fun &rest args)
  (if (and (org-at-table-p) (not org-table-overlay-coordinates))
      (progn
        (org-table-toggle-coordinate-overlays)
        (unwind-protect
            (apply old-fun args)
          (org-table-toggle-coordinate-overlays)))
    (apply old-fun args)))
(advice-add #'org-table-eval-formula
            :around #'my-org-table-display-coordinates-around)
C-c =を押したところ
図1: C-c =を押したところ

頻繁に表示が切り替わるので、鬱陶しいと思ったら使用を止めるかもしれません。

C-c ' (org-table-edit-formulas)を改良するという方向性もあるかもしれません。 S-<left> / S-<right> で列参照を生成できるようにするとか。いや、 C-c = (org-table-eval-formula)でもミニバッファの中でそういった操作が出来れば良さそうですけどね。そうすれば C-c = S-<left> S-<left> といった操作で二つ左の列を参照できるわけですし($-2でも良いですが、列の位置を変えたときに困るので)。この辺りはもっと改良すべきかもしれません。

ちなみに座標はorg-special-keywordというfaceで表示されるようになっています。私はorg-special-keywordを小さなフォントにしているのですが、そうすると座標を表示したときにテーブルのレイアウトが崩れてしまいます。使用するfaceはorg-table-overlay-coordinates関数の中にハードコードされているので簡単には変更できません。次のようなコードで無理矢理変えてみました。

;; 表の座標のfaceを`org-special-keyword'ではなく`org-table'にする。
;; 私は`org-special-keyword'の文字サイズを小さくしているので表が崩れて困る。
(defun my-org-table-overlay-coordinates (old-fun)
  (cl-letf* ((old-fun1
              (symbol-function 'org-overlay-before-string))
             ((symbol-function 'org-overlay-before-string)
              (lambda (ovl text &optional _face &rest args)
                (apply old-fun1 ovl text 'org-table args)))
             (old-fun2
              (symbol-function 'org-overlay-display))
             ((symbol-function 'org-overlay-display)
              (lambda (ovl text &optional _face &rest args)
                (apply old-fun2 ovl text 'org-table args))))
    (funcall old-fun)))
(advice-add #'org-table-overlay-coordinates
            :around #'my-org-table-overlay-coordinates)