hl-line-mode背景を非表示にします。これを回避するにはどうすればよいですか?


10

と:

(when window-system
  (set-face-background 'hl-line "light yellow")
  (global-hl-line-mode 1))

現在の行は黄色の背景で強調表示されますが、テキストに背景プロパティがある場合は上書きされます(diff-mode、rainbow-modeなど)。

適切なプロパティを持たないパーツにのみ背景を設定することは可能ですか?

更新私は実験を始めました、スティプルは背景と競合していないようです:

(set-face-stipple 'hl-line '(4 4 "\x01\x00\x00\x00"))
(set-face-attribute 'hl-line nil :inherit nil)

しかし、点描は残念ながらテキストの外観を損ないます...


1
検討したいもう1つの可能性は、現在の行の先頭から現在の行の末尾(または末尾)まで検索が実行されるように、各hl-lineコマンドループの末尾に配置された削除関数です。現在の視線(該当する場合)およびhl-lineオーバーレイ面は、背景色が異なる他のテキストが存在する場所から削除できます。font-lockによって配置されたハイライトを検索する可能性がありますが、他のオーバーレイ(たとえば、フライスペルエラー/重複)を使用してハイライトを配置することもできます。
法律家、2015

@lawlist私はその実装に興味があります。以下の完全なソリューションを追加できますか?
Kaushal Modi

@kaushalmodi-特定のオーバーレイまたは生のテキストに対してこれを行う方法は知っていますが、特定のテキストプロパティ/フォントロックの強調表示についてはわかりません。この質問に適切に回答するためには、後者の2つの発生をテストする方法を調査する必要があるため、代わりにコメントを付けることにしました。ここでのポイントで特定のオーバーレイのためのテストに[ドリューのライブラリのいずれかから借り]スニペットがある: (when (memq NAME-OF-FACE (mapcar (function (lambda (ovr) (overlay-get ovr 'face))) (overlays-at (point)))) (remove-overlays BEGINNING-POINT ENDING-POINT 'face hl-line))
lawlist

回答:


5

問題は、テキストプロパティfaceが強調表示にhl-line-mode使用され、オーバーレイが使用されることです。また、オーバーレイは常に「上に」テキストプロパティのface強調表示として表示されます

diff-modeたとえば、オーバーレイではなくtextプロパティを使用します。したがって、このような場合、あなたは運が悪いです。

ただし、オーバーレイによって生成される強調表示の場合は、hl-lineオーバーレイのオーバーレイの優先度を下げるか、hl-line-overlayまたはglobal-hl-line-overlayを行うだけで、そのオーバーレイが他のオーバーレイの強調表示より「下」に表示されます。

ライブラリを使用するhl-line+.el場合は、オプションhl-line-overlay-priorityを使用してオーバーレイの優先順位を設定できます。Emacs WikiページHighlight Current Lineも参照してください。(ただし、他の強調表示がオーバーレイからのものでない場合、オーバーレイの優先度を変更しても効果はありません。)


ご回答ありがとうございます。面とオーバーレイの違いを気にしません... +1
ギブンコア2015

そのhl-line-overlayプロパティにアクセスするにはどうすればよいですか?たとえば、には表示されませんcustomize-variable
9000年

@ 9000:答えが言うように、ライブラリを使用する場合は、hl-line+.elオプションをカスタマイズするだけhl-line-overlay-priorityです。それ以外の場合はできません(事前提供された関数を再定義または通知する場合を除く)。これが、このユーザーオプションを提供するポイントです。
2016年

3

私は部分的な解決策で終わります-行末からのみ強調表示します:

(defun my-hl-line-range-function ()
  (cons (line-end-position) (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

(when window-system
  (require 'hl-line)
  (set-face-attribute 'hl-line nil :inherit nil :background "light yellow")
  (setq global-hl-line-sticky-flag t)
  (global-hl-line-mode 1))

2

hl-line背景を上書きしないようにしようとしたときに、この質問に遭遇しました(ただし、この場合はインデントガイドでした)。

私はこれに落ち着きました、それはインデントの後にハイライト線を描き始めます:

(defun my-hl-line-range-function ()
  (cons
   (+ (line-beginning-position 1) (current-indentation))
   (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

置換(+ (line-beginning-position 1) (current-indentation))(point)動作します(カーソル位置から開始)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.