1
0
emacs-config/my-utils/erc-faces.el
2021-02-03 09:27:27 -07:00

138 lines
4.9 KiB
EmacsLisp
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; ERC is terrible but lovely and here's some terrible fixes to terrible bugs, enjoy.
(defface erc-italics-face
'((t :slant italic))
"ERC face for italics")
(defface erc-record-separator-face
'((t))
"ERC face for record separator")
(defface erc-device-control-face
'((t))
"ERC face for record device control")
(defun erc-controls-highlight ()
"Highlight IRC control chars in the buffer.
This is useful for `erc-insert-modify-hook' and `erc-send-modify-hook'.
Also see `erc-interpret-controls-p' and `erc-interpret-mirc-color'."
(goto-char (point-min))
(cond ((eq erc-interpret-controls-p 'remove)
(while (re-search-forward erc-controls-remove-regexp nil t)
(replace-match "")))
(erc-interpret-controls-p
(let ((boldp nil)
(inversep nil)
(underlinep nil)
;; italics
(italicsp nil)
;; record separator
(rsp nil)
;; device control one
(dc1 nil)
(fg nil)
(bg nil))
(while (re-search-forward erc-controls-highlight-regexp nil t)
(let ((control (match-string 1))
(fg-color (match-string 2))
(bg-color (match-string 4))
(start (match-beginning 0))
(end (+ (match-beginning 0) (length (match-string 5)))))
(replace-match "" nil nil nil 1)
(cond ((and erc-interpret-mirc-color (or fg-color bg-color))
(setq fg fg-color)
(setq bg bg-color))
((string= control "\C-b")
(setq boldp (not boldp)))
((string= control "\C-v")
(setq inversep (not inversep)))
((string= control "\C-_")
(setq underlinep (not underlinep)))
((string= control "\C-c")
(setq fg nil
bg nil))
((string= control "\C-g")
(when erc-beep-p
(ding)))
;; italics
((string= control "\x1D")
(setq italicsp (not italicsp)))
;; record separator
((string= control "\x1e")
(setq rsp (not rsp)))
;; device control one
((string= control "\x11")
(setq dc1 (not dc1)))
((string= control "\C-o")
(setq boldp nil
inversep nil
underlinep nil
fg nil
bg nil))
(t nil))
(erc-controls-propertize start end
boldp inversep underlinep italicsp rsp dc1 fg bg)))))
(t nil)))
(defun erc-controls-propertize (from to boldp inversep underlinep italicsp rsp dc1 fg bg
&optional str)
"Prepend properties from IRC control characters between FROM and TO.
If optional argument STR is provided, apply to STR, otherwise prepend properties
to a region in the current buffer."
(font-lock-prepend-text-property
from
to
'font-lock-face
(append (if boldp
'(erc-bold-face)
nil)
(if inversep
'(erc-inverse-face)
nil)
(if underlinep
'(erc-underline-face)
nil)
;; italics
(if italicsp
'(erc-italics-face)
nil)
;; record separator
(if rsp
'(erc-record-separator-face)
nil)
;; device control one
(if dc1
'(erc-device-control-face)
nil)
(if fg
(list (erc-get-fg-color-face fg))
nil)
(if bg
(list (erc-get-bg-color-face bg))
nil))
str)
str)
(setq erc-controls-highlight-regexp
"\\(\\|\\|\\|\x1e\\|\\|\\|\\|\\|\\([0-9][0-9]?\\)?\\(,\\([0-9][0-9]?\\)\\)?\\)\\([^\x1e]*\\)")
;;; Added `t' to `format-time-string' for universal time.
(defun erc-format-timestamp (time format)
"Return TIME formatted as string according to FORMAT.
Return the empty string if FORMAT is nil."
(if format
(let ((ts (format-time-string format time t)))
(erc-put-text-property 0 (length ts)
'font-lock-face 'erc-timestamp-face ts)
(erc-put-text-property 0 (length ts) 'invisible 'timestamp ts)
(erc-put-text-property 0 (length ts)
'isearch-open-invisible 'timestamp ts)
;; N.B. Later use categories instead of this harmless, but
;; inelegant, hack. -- BPT
(and erc-timestamp-intangible
(not erc-hide-timestamps) ; bug#11706
(erc-put-text-property 0 (length ts) 'cursor-intangible t ts))
ts)
""))