-;;; lurk.el --- Little Unified iRc Klient -*- lexical-binding:t -*-
+;;; lurk.el --- Little Uni-buffer iRc Klient -*- lexical-binding:t -*-
;; Copyright (C) 2021 Tim Vaughan
(lurk-render-prompt))
(lurk-display-error "No channels joined.")))
-(defun lurk-cycle-contexts-forward ()
- (interactive)
- (lurk-cycle-contexts))
-
-(defun lurk-cycle-contexts-reverse ()
- (interactive)
- (lurk-cycle-contexts t))
-
;;; Buffer
;;
+
(defun lurk-render-prompt ()
(with-current-buffer "*lurk*"
(let ((update-point (= lurk-input-marker (point)))
(defun lurk-setup-buffer ()
(with-current-buffer (get-buffer-create "*lurk*")
(setq-local scroll-conservatively 1)
+ (setq-local buffer-invisibility-spec nil)
(if (markerp lurk-prompt-marker)
(set-marker lurk-prompt-marker (point-max))
(setq lurk-prompt-marker (point-max-marker)))
(lurk-display-string
context
(pcase (lurk-get-context-type to)
- ('channel (concat to " <" from "> " text))
- ('nick (concat "[" from " -> " to "] " text))
+ ('channel (concat to " <" from "> "))
+ ('nick (concat "[" from " -> " to "] "))
(_
- (error "Unsupported context type"))))))
+ (error "Unsupported context type")))
+ text)))
+
+(defun lurk-display-action (from to action-text)
+ (let ((context (if (eq 'channel (lurk-get-context-type to))
+ to
+ (if (equal to lurk-nick) from to))))
+ (lurk-display-string
+ context
+ "* " from " " action-text)))
+
(defun lurk-display-notice (context &rest notices)
(lurk-display-string
(with-current-buffer "*lurk*"
(maphash
(lambda (this-context _)
- (let ((this-context-atom (if this-context (intern this-context) nil)))
- (if (equal this-context context)
- (remove-from-invisibility-spec this-context-atom)
- (add-to-invisibility-spec this-context-atom))))
+ (when this-context
+ (let ((this-context-atom (intern this-context)))
+ (if (equal this-context context)
+ (remove-from-invisibility-spec this-context-atom)
+ (add-to-invisibility-spec this-context-atom)))))
lurk-context-facelists)
(force-window-update "*lurk*")))
"No topic set.")))
("332"
- (lurk-display-notice nil "Detected 332: "string)
(let* ((params (lurk-msg-params msg))
(channel (elt params 1))
(topic (elt params 2)))
((rx (let ping (: "\01PING " (* (not "\01")) "\01")))
(lurk-send-msg (lurk-msg nil nil "NOTICE" (list from ping)))
- (lurk-display-notice "CTCP ping received from " from))
+ (lurk-display-notice from "CTCP ping received from " from))
("\01USERINFO\01"
- (lurk-display-notice "CTCP userinfo request from " from " (no response sent)"))
+ (lurk-display-notice from "CTCP userinfo request from " from " (no response sent)"))
+
+ ((rx (: "\01ACTION " (let action-text (* (not "\01"))) "\01"))
+ (lurk-display-action from to action-text))
(_
(if (and (equal from "BitBot")
(lurk-send-msg (lurk-msg nil nil "TOPIC" lurk-current-context new-topic)))
((rx (: "ME " (let action (* not-newline))))
- (lurk-send-msg (lurk-msg nil nil "PRIVMSG"
- (list lurk-current-context
- (concat "\01ACTION " action "\01"))))
- (lurk-display-action lurk-nick action))
+ (let ((ctcp-text (concat "\01ACTION " action "\01")))
+ (lurk-send-msg (lurk-msg nil nil "PRIVMSG"
+ (list lurk-current-context ctcp-text)))
+ (lurk-display-action lurk-nick lurk-current-context action)))
((rx (: "VERSION" " " (let nick (+ (not whitespace)))))
(lurk-send-msg (lurk-msg nil nil "PRIVMSG"
(lurk-enter-string line))))
+;;; Command completion
+;;
+
+;;; Interactive functions
+;;
+
+(defun lurk-cycle-contexts-forward ()
+ (interactive)
+ (lurk-cycle-contexts))
+
+(defun lurk-cycle-contexts-reverse ()
+ (interactive)
+ (lurk-cycle-contexts t))
+
+(defvar lurk-zoomed nil
+ "Keeps track of zoom status.")
+
+(defun lurk-toggle-zoom ()
+ (interactive)
+ (if lurk-zoomed
+ (lurk-zoom-out)
+ (lurk-zoom-in lurk-current-context))
+ (setq lurk-zoomed (not lurk-zoomed)))
+
;;; Mode
;;
(defvar lurk-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "RET") 'lurk-enter)
+ (define-key map (kbd "<tab>") 'lurk-complete)
+ (define-key map (kbd "C-c C-z") 'lurk-toggle-zoom)
(define-key map (kbd "<C-tab>") 'lurk-cycle-contexts-forward)
(define-key map (kbd "<C-S-tab>") 'lurk-cycle-contexts-reverse)
map))