popup-tip で改行が無視される場合の回避策

popup.el の popup-tip では popup-fill-string の結果を表示していますが、この関数を使用することで次のように改行が半角スペースに置換されることがあります。
リストの各要素が各行に相当します。

ELISP> (popup-fill-string "line 1\nline 2" 12)
(11 "line 1 line" "2")

これを回避するには次のように fill-region の最初で use-hard-newlines を non-nil にする advice を定義します。
さらに、LF は (propertize “\n” ‘hard t) に置換します。

(defadvice fill-region (before jsx---fill-region activate)
  (beginning-of-buffer)
  (replace-string "\n" (propertize "\n" 'hard t))
  (setq use-hard-newlines t))
ELISP> (popup-fill-string "line 1\nline 2" 12)
(6 "line 1" "line 2")

popup-fill-string では with-temp-buffer の中で fill-region を使っていますが、use-hard-newlines は buffer local なのでコードに手を入れない限りこの方法しか回避策はなさそうです。
さらに、popup-tip の最初でテキストのプロパティが取り除かれることにも注意が必要です。

cf. Line feeds can be ignored in popup-tip · Issue #43 · auto-complete/popup-el

広告
初めて Perl でコードを書く時に知っておきたかったこと R のスクリプトをパッケージっぽく読み込むパッケージを作ってみた
※このエントリーははてなダイアリーから移行したものです。過去のコメントなどはそちらを参照してください