diff --git a/emacs/.emacs.d/init/oni-circe-init.org b/emacs/.emacs.d/init/oni-circe-init.org index 1580f9a..b7fd14e 100644 --- a/emacs/.emacs.d/init/oni-circe-init.org +++ b/emacs/.emacs.d/init/oni-circe-init.org @@ -5,6 +5,7 @@ (require 'circe-color-nicks) (require 'circe-serenity) (require 'oni-circe) + (require 'mowedline) #+END_SRC I switched to Circe from ERC because I couldn't make the @@ -52,3 +53,66 @@ Serenity. #+BEGIN_SRC emacs-lisp (enable-circe-serenity) #+END_SRC + +Add external tracking. Show the status of tracked buffers in +mowedline instead in the mode-line. With color! + +This code has been generously donated by [[http://retroj.net][retroj]], the author of +mowedline. + +First define a function to parse the text properties from the tracking +buffers list so that highlights (from mentions) also appear in +mowedline. + +#+BEGIN_SRC emacs-lisp + (defun mowedline-colorize-mode-line-spec (s) + (cond + ((stringp s) (string-trim s)) + ((eq ':propertize (car s)) + (let ((s (cadr s)) + (face (plist-get (cddr s) 'face))) + (if face + `(color ,(face-foreground face) + ,(substring-no-properties s)) + s))) + (t ""))) +#+END_SRC + +Also tell mowedline to use the dbus interface directly, instead of +going through the command-line interface. + +#+BEGIN_SRC emacs-lisp + (setq mowedline-update-function 'mowedline-update/dbus) +#+END_SRC + +#+BEGIN_SRC emacs-lisp + (defvar jjf-tracking-buffers '()) + (defvar jjf-external-tracking-timer nil) + (defun jjf-external-tracking () + (setq jjf-external-tracking-timer nil) + (mowedline-update + 'irc + (if (stringp jjf-tracking-buffers) + (mowedline-colorize jjf-tracking-buffers t) + (format "%S" (mapcar #'mowedline-colorize-mode-line-spec + jjf-tracking-buffers))))) + + (defun oni:clear-irc-mowedline-widget () + (mowedline-clear 'irc)) + + (defun jjf-external-tracking-advice (orig-fun &rest args) + "Update my external status bar when tracking computes a new + status line, and suppress tracking in the mode-line. Since + tracking-status may be called many times in quick succession, for + example on a make-frame-visible event, we use a short timer to + only call the updater once within a minimum duration." + (setq jjf-tracking-buffers (apply orig-fun args)) + (when jjf-external-tracking-timer + (cancel-timer jjf-external-tracking-timer)) + (setq jjf-external-tracking-timer + (run-at-time 0.2 nil 'jjf-external-tracking)) + nil) + + (advice-add 'tracking-status :around #'jjf-external-tracking-advice) + (add-hook 'kill-emacs-hook 'oni:clear-irc-mowedline-widget) +#+END_SRC