Переопределить `show-trailing-whitespace` в` diff-mode`

9

Я show-trailing-whitespaceустановил tглобально в своем .emacsфайле, и это, как правило, не проблема, за исключением случаев, когда я diff-modeсмотрю на патч, в котором есть обязательный конечный пробел для пустых строк контекста.

Одним из решений было бы просто отключиться show-trailing-whitespaceв diff-modeкаком-то подходящем хуке, но на самом деле я бы хотел, чтобы конечный пробел в строках изменений все еще появлялся. Например, если я случайно ввел конечный пробел или удаляю его, это нормально, и я все еще хочу, чтобы это появилось на trailing-whitespaceлице . Я просто не хочу, чтобы пустые строки контекста обрабатывались как конечный пробел, поскольку они необходимы для самого формата diff.

Вот пример текущего поведения, которое я получаю:

введите описание изображения здесь

И это то, что я хотел бы:

введите описание изображения здесь

Вот еще один пример, но на этот раз с фактическим добавлением пробелов:

введите описание изображения здесь

Однако, если я отключу show-trailing-whitespaceполностью diff-mode, то я не буду видеть темно-красный вообще. Вместо этого это то, что я хочу:

введите описание изображения здесь

По сути, я думаю, что это подразумевает show-trailing-whitespaceосознание того, что линии различий только с одним пробелом являются особыми.

b4hand
источник
3
Вы уверены, что просто отключить это полностью в diff-режиме не то, что вам нужно? Если вы случайно добавили или удалили конечный пробел, не будет ли в diff-режиме это выделено независимо от вашей конфигурации emacs (в силу того, что это изменение в файле)?
Малабарба
Я хочу видеть конечный пробел в шрифте белого пробела красного цвета. Не стесняйтесь включать ответ для отключения только в diff-режиме, поскольку это может быть полезно для других людей, но это не совсем то, что я искал.
b4hand
1
Было бы удовлетворительным, если бы собственное лицо подсветки diff-режима было установлено на что-то похожее на красный цвет белого пространства-режима?
Малабарба

Ответы:

1

Одно из решений состоит в том, чтобы отключить режим конечных пробелов в режиме Diff и вместо этого определить собственные правила блокировки шрифтов для конечных пробелов, которые вы не хотите видеть.

(defvar diff-trailing-whitespace-keywords
  '(("^[+-<>]\\(.*\\S \\)?\\(\\s +\\)$" (2 'trailing-whitespace t))))
(defun diff-mode-font-lock-add-trailing-whitespace ()
  (setq diff-font-lock-keywords-and-whitespace
    (append diff-font-lock-keywords
        diff-trailing-whitespace-keywords))
  (setcar diff-font-lock-defaults 'diff-font-lock-keywords-and-whitespace))
(defun turn-off-trailing-whitespace ()
  (setq show-trailing-whitespace nil))
(add-hook 'diff-mode-hook 'turn-off-trailing-whitespace)
(eval-after-load "diff-mode" '(diff-mode-font-lock-add-trailing-whitespace))
Жиль "ТАК - перестань быть злым"
источник
2

При установке значение show-trailing-whitespaceстановится локальным для буфера, поэтому вы можете просто установить его в соответствующем хуке:

(add-hook 'diff-mode-hook (lambda () (setq show-trailing-whitespace nil)))

Для того, чтобы проверить документацию для шоу-сцепного-пробельного: C-h v show-trailing-whitespace.

aerique
источник
2
Но это отключает режим для всего буфера, чего и хочет избежать b4hand.
Жиль "ТАК - перестань быть злым"