diff --git a/my-utils/erc-faces.el b/my-utils/erc-faces.el new file mode 100644 index 0000000..2ba4f52 --- /dev/null +++ b/my-utils/erc-faces.el @@ -0,0 +1,137 @@ +;;; 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) + ""))