2020-06-03 ,

org-modeで幅の広い表を折り返しモード時でも折り返さず水平スクロールさせる

昨日の続き。

org-mode ではデフォルトで truncate-lines がtとなっています(org-startup-truncated で変更できます) 。つまり、折り返さずに表示するのがデフォルトです。これはおそらく折り返すと幅が広い表(テーブル)が正しく表示されないためではないでしょうか。

しかしそれだと普通のテキストも折り返さずに表示されて大変読みづらくなってしまいます。fill-paragraph 等を使って自分で適当な位置に改行を入れていくことになるのですが多少問題もあります。私はよくHTMLでエクスポートするのですが、文字と文字との間にわずかに空白が入ってしまうことがあります。確認してみるとそれは文章の途中にある改行のせいだったりします。なので私は必要に応じて M-x toggle-truncate-lines で切り替えていたのですが、やっぱり面倒くさい。

というわけで、先日作った部分的に水平スクロールできるようにするコードをorg-modeの表部分に適用してみました。

ソースコードはGitHubにあります。

misohena/phscroll: Enable partial horizontal scroll in Emacs

使い方は (load "org-phscroll.el") するだけ。スクロールは C-x < や C-x > でも可能です。

それと truncate-lines はnilにしないと意味がありません。私は org-startup-truncated をnilに変更してしまいました。

表全体を消した場合自動的にスクロールエリアも削除されますが、表が表で無くなった場合(先頭の|を消すなどして)、スクロールエリアが残ってしまいます。 M-x phscroll-delete-at でポイントがある位置のスクロールエリアを削除できます。

org-phscroll.elの使用例
図1: org-phscroll.elの使用例

実装にあたっては、例によってfont-lockのタイミングで表を探して水平スクロール領域を適用しています。他のタイミングでも良いのですがfont-lock処理の直後、特にorg-fontify-meta-lines-and-blocksの直後ならばfaceがorg-tableかどうかで表かどうかを判別できるのでそこにしました。単純に行頭に|があるかどうかで判別すると、各種ブロック(#+BEGIN_~#+END_)の中にあるものまで拾ってしまうので。

phscroll.el自体の問題も色々修正したのでそこそこ使えるようになってきましたが、大きな表は少し重いかもしれません。できるだけウィンドウ内だけ更新するように作ってありますが、折りたたんだ場所に沢山の表が入っている場所がウィンドウ内に入ると、それらの表を全て一度に整形することになるので時間がかかります。

今のところオーバーレイやテキストプロパティを一文字毎にチェックしているので、それをある程度まとめてやれば少し速くなるかもしれません。面倒くさいですけど。

Pingback / Trackback