行番号バー全体をカスタムの背景色で塗りつぶすにはどうすればよいですか?


9

下のスクリーンショットでは、linum顔の背景をいくつかの色に設定していますが、バッファーの最後に空白の領域があり、行の折り返し(global-visual-line-mode)が有効になっていると、行間にギャップがあります。

ラインラップで壊れたリナム背景。

理想的には、左側全体が均一な色である必要があります。これは可能ですか?Elispを知っているので、可能であれば、いくつかの指示を添えて自分で修正を書くことができます。


私はテーマを切り替えるときにこれに気づきました。私の回避策は、デフォルトのテーマに戻り、特定のテーマを再度有効にすることでした。これは通常、背景色をリセットします。デフォルトのテーマ設定を見て、それを修正する関数を書く方法の手掛かりになるかもしれない特定の顔にもっと注意を払っているかどうかを確認することは価値があるかもしれません。
エラソン2014年

「中間」の色を修正することは実行可能かもしれません(試してみます)。残念ながら、バッファ終了後に色を修正するのは残念ですが、色付けするものはありません。
Malabarba 2014年

実際、私はこれが頻繁に尋ねられるのを見たことがあるので、それはおそらく価値のある機能要求です。
Malabarba 2014年

@Malabarbaなぜそれをバッファの下の領域に拡張できないのですか?結局、フリンジもこれを行います。
Lenar Hoyt 2014

1
@mcb私はあなたが今何を意味していたのか少し理解しました。フリンジには独自の顔があり(背景は画面の下部まで拡張されています)、マージンにはありません(デフォルトの顔を借用しています)。
Malabarba 2014年

回答:


6

問題

ここでの問題は、マージンの外観を制御する面がないことです。オーバーレイを使用して余白にテキストを表示できます(これlinum-modeは実際に行われます)が、Emacsの他のテキストと同様に、バッファーの制限に制限されています。したがって、バッファの最後の行を超えるマージン表示を制御することはできません。

あなたができることは、その間でそれらの欠陥のある行を修正することです。

そこに何を置くか

この変数は、2つの論理行の「間」にあるこれらの視覚行に表示するものを制御します。重要な部分はであり'face 'linum、これにより、これらの線がの外観に従うようになりますlinum-mode。この"-----"部分は説明的なものであり、スペースまたは希望するものに変更できます。

(defvar endless/margin-display
  `((margin left-margin) ,(propertize "-----" 'face 'linum))
  "String used on the margin.")

どうやってするの

次のコードは、バッファを通過して、linum-mode「実際のもの」ではない各行に(使用するものと同様の)オーバーレイを配置します。

(defvar-local endless/margin-overlays nil
  "List of overlays in current buffer.")

(defun endless/setup-margin-overlays ()
  "Put overlays on each line which is visually wrapped."
  (interactive)
  (let ((ww (- (window-width)
               (if (= 0 (or (cdr fringe-mode) 1)) 1 0)))
        ov)
    (mapc #'delete-overlay endless/margin-overlays)
    (save-excursion
      (goto-char (point-min))
      (while (null (eobp))
        ;; On each logical line
        (forward-line 1)
        (save-excursion
          (forward-char -1)
          ;; Check if it has multiple visual lines.
          (while (>= (current-column) ww)
            (endles/make-overlay-at (point))
            (forward-char (- ww))))))))

(defun endles/make-overlay-at (p)
  "Create a margin overlay at position P."
  (push (make-overlay p (1+ p)) endless/margin-overlays)
  (overlay-put
   (car endless/margin-overlays) 'before-string
   (propertize " "  'display endless/margin-display)))

そしてlinum-mode、行番号が更新されるたびに実行したいと考えています。

(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)

私はそれをテストしたばかりでorg-mode、スクロール中に遅延が発生するようで、アダプティブラップがオンになっていると、明らかな理由もなくギャップを逃します。スクリーンショット。
Lenar Hoyt 2014

@mcbはい、パフォーマンスはここで問題ですが、それを改善することは長くて複雑な問題になります。org-modeの問題については、orgはオーバーレイを頻繁に使用するため、競合が発生することは理にかなっています。私はそれを修正する方法を知りませんが、少し考えてみます。
Malabarba 2014年

-1

あなたはあなたの設定にこれを置くことができます:

(set-face-background 'fringe "#f4a460")

...カラーコードを必要なものに変更します。


2
これによりフリンジの色が変更され、フリンジに行番号は表示されません。(試してみると違いがわかります)
マラバルバ

1
質問のスクリーンショットにも表示されています。「行番号列」はバッファーと同じ背景色ですが、フリンジは行番号列とバッファーの間の小さな領域で、灰色で表示されています。
T. Verron 2014年

はい、あなたが正しい。linum-before-numbering-hookのfuncton runに新しいオーバーレイを導入し、設定できる面を与える必要があると思います。
ティーレッグ2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.