;;; Commentary:
-;; To use, add the following line to your ~/.riece/init.el:
-;; (add-to-list 'riece-addons 'riece-history)
+;; You can check recently visited channels via `C-c g' in the commands
+;; buffer, by adding the following lines to ~/.riece/init.el:
+
+;; (add-hook 'riece-guess-channel-try-functions
+;; 'riece-guess-channel-from-history)
;;; Code:
+(require 'riece-options)
+(require 'riece-globals)
+(require 'riece-highlight)
+(require 'riece-identity)
+(require 'riece-signal)
(require 'ring)
(defgroup riece-history nil
:type 'integer
:group 'riece-history)
+(defface riece-channel-list-history-face
+ '((((class color)
+ (background dark))
+ (:foreground "PaleTurquoise"))
+ (((class color)
+ (background light))
+ (:foreground "SeaGreen3"))
+ (t
+ (:bold t)))
+ "Face used for displaying history channels."
+ :group 'riece-highlight-faces)
+(defvar riece-channel-list-history-face 'riece-channel-list-history-face)
+
+(unless (riece-facep 'riece-modeline-history-face)
+ (make-face 'riece-modeline-history-face
+ "Face used for displaying history channels in modeline.")
+ (if (featurep 'xemacs)
+ (set-face-parent 'riece-modeline-history-face 'modeline))
+ (set-face-foreground 'riece-modeline-history-face
+ (face-foreground 'riece-channel-list-history-face)))
+
+(defvar riece-modeline-history-face 'riece-modeline-history-face)
+
(defvar riece-channel-history nil)
+(defvar riece-history-enabled nil)
+
+(defconst riece-history-description
+ "Keep track channel history")
+
(defun riece-guess-channel-from-history ()
(let ((length (ring-length riece-channel-history))
(index 0)
index (1+ index)))
(nreverse result)))
-(defun riece-history-requires ()
- (if (memq 'riece-guess riece-addons)
- '(riece-guess)))
+(defun riece-history-format-identity-for-channel-list-buffer (index identity)
+ (if (and riece-history-enabled
+ (not (ring-empty-p riece-channel-history))
+ (riece-identity-equal identity (ring-ref riece-channel-history 0)))
+ (concat (format "%2d:+" index)
+ (riece-format-identity identity))))
+
+(defun riece-history-format-identity-for-channel-list-indicator (index
+ identity)
+ (if (and riece-history-enabled
+ (not (ring-empty-p riece-channel-history))
+ (riece-identity-equal identity (ring-ref riece-channel-history 0)))
+ (let ((string (riece-format-identity identity))
+ (start 0))
+ ;; Escape % -> %%.
+ (while (string-match "%" string start)
+ (setq start (1+ (match-end 0))
+ string (replace-match "%%" nil nil string)))
+ (list (format "%d:" index)
+ (riece-propertize-modeline-string
+ string 'face 'riece-modeline-history-face)))))
+
+;;; (defun riece-history-requires ()
+;;; (if (memq 'riece-guess riece-addons)
+;;; '(riece-guess)))
(defun riece-history-insinuate ()
- (add-hook 'riece-startup-hook
- (lambda ()
- (setq riece-channel-history
- (make-ring riece-channel-history-length))))
- (add-hook 'riece-exit-hook
- (lambda ()
- (setq riece-channel-history nil)))
(add-hook 'riece-after-switch-to-channel-functions
(lambda (last)
- (ring-insert riece-channel-history last)))
- (if (memq 'riece-guess riece-addons)
- (add-hook 'riece-guess-channel-try-functions
- 'riece-guess-channel-from-history)))
+ (if (and riece-history-enabled last
+ (not (riece-identity-equal last riece-current-channel)))
+ (ring-insert riece-channel-history last))))
+ (add-hook 'riece-format-identity-for-channel-list-buffer-functions
+ 'riece-history-format-identity-for-channel-list-buffer)
+ (add-hook 'riece-format-identity-for-channel-list-indicator-functions
+ 'riece-history-format-identity-for-channel-list-indicator)
+ (if (memq 'riece-highlight riece-addons)
+ (setq riece-channel-list-mark-face-alist
+ (cons '(?+ . riece-channel-list-history-face)
+ riece-channel-list-mark-face-alist)))
+;;; (if (memq 'riece-guess riece-addons)
+;;; (add-hook 'riece-guess-channel-try-functions
+;;; 'riece-guess-channel-from-history))
+ )
+
+(defun riece-history-enable ()
+ (setq riece-channel-history
+ (make-ring riece-channel-history-length))
+ (setq riece-history-enabled t)
+ (riece-emit-signal 'channel-list-changed))
+
+(defun riece-history-disable ()
+ (setq riece-channel-history nil
+ riece-history-enabled nil)
+ (riece-emit-signal 'channel-list-changed))
(provide 'riece-history)
;;; riece-history.el ends here
-