From 69fc35bec557b9a55782a2e53dd1fa719b2a662b Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Sat, 22 Aug 2015 01:28:44 +0200 Subject: Move margin prompts to their own library Eventually maybe this can be turned into a library on its own. --- emacs/.emacs.d/site-lisp/jabber-init.el | 111 +--------------- emacs/.emacs.d/site-lisp/jabber-margin-prompts.el | 152 ++++++++++++++++++++++ 2 files changed, 153 insertions(+), 110 deletions(-) create mode 100644 emacs/.emacs.d/site-lisp/jabber-margin-prompts.el diff --git a/emacs/.emacs.d/site-lisp/jabber-init.el b/emacs/.emacs.d/site-lisp/jabber-init.el index 606c778..e95799d 100644 --- a/emacs/.emacs.d/site-lisp/jabber-init.el +++ b/emacs/.emacs.d/site-lisp/jabber-init.el @@ -77,116 +77,7 @@ Insert PROPOSED-ALERT in the buffer if it is non-nil." (global-set-key (kbd "") 'jabber-switch-to-roster-buffer) - -;;; Ugly, but works - -(defvar *longest-prompt* 0) -(make-variable-buffer-local '*longest-prompt*) - -(defun update-margins (prompt-length) - (when (> prompt-length *longest-prompt*) - (let ((window (get-buffer-window (current-buffer)))) - (when (equal window (selected-window)) - (set-window-margins window prompt-length)) - (setq left-margin-width prompt-length - *longest-prompt* prompt-length)))) - - -(defun jabber-chat-self-prompt (timestamp delayed dont-print-nick-p) - "Print prompt for sent message. -TIMESTAMP is the timestamp to print, or nil for now. -If DELAYED is true, print long timestamp -\(`jabber-chat-delayed-time-format' as opposed to -`jabber-chat-time-format'). -If DONT-PRINT-NICK-P is true, don't include nickname." - (let* ((state-data (fsm-get-state-data jabber-buffer-connection)) - (username (plist-get state-data :username)) - (server (plist-get state-data :server)) - (resource (plist-get state-data :resource)) - (nickname username) - (prompt (format-spec jabber-chat-local-prompt-format - (list - (cons ?t (format-time-string - (if delayed - jabber-chat-delayed-time-format - jabber-chat-time-format) - timestamp)) - (cons ?n (if dont-print-nick-p "" nickname)) - (cons ?u username) - (cons ?r resource) - (cons ?j (concat username "@" server)))))) - (insert (jabber-propertize - " " - 'display (list '(margin left-margin) prompt) - 'face 'jabber-chat-prompt-local - 'help-echo - (concat (format-time-string "On %Y-%m-%d %H:%M:%S" timestamp) " from you"))) - (update-margins (length prompt)))) - -(defun jabber-chat-print-prompt (xml-data timestamp delayed dont-print-nick-p) - "Print prompt for received message in XML-DATA. -TIMESTAMP is the timestamp to print, or nil to get it -from a jabber:x:delay element. -If DELAYED is true, print long timestamp -\(`jabber-chat-delayed-time-format' as opposed to -`jabber-chat-time-format'). -If DONT-PRINT-NICK-P is true, don't include nickname." - (let* ((from (jabber-xml-get-attribute xml-data 'from)) - (timestamp (or timestamp - (car (delq nil (mapcar 'jabber-x-delay (jabber-xml-get-children xml-data 'x)))))) - (prompt (format-spec jabber-chat-foreign-prompt-format - (list - (cons ?t (format-time-string - (if delayed - jabber-chat-delayed-time-format - jabber-chat-time-format) - timestamp)) - (cons ?n (if dont-print-nick-p "" (jabber-jid-displayname from))) - (cons ?u (or (jabber-jid-username from) from)) - (cons ?r (jabber-jid-resource from)) - (cons ?j (jabber-jid-user from)))))) - (insert (jabber-propertize - " " - 'display (list '(margin left-margin) prompt) - 'face 'jabber-chat-prompt-foreign - 'help-echo - (concat (format-time-string "On %Y-%m-%d %H:%M:%S" timestamp) " from " from))) - (update-margins (length prompt)))) - -(defun jabber-muc-print-prompt (xml-data &optional local dont-print-nick-p) - "Print MUC prompt for message in XML-DATA." - (let* ((nick (jabber-jid-resource (jabber-xml-get-attribute xml-data 'from))) - (timestamp (car (delq nil (mapcar 'jabber-x-delay (jabber-xml-get-children xml-data 'x))))) - (prompt (format-spec jabber-groupchat-prompt-format - (list - (cons ?t (format-time-string - (if timestamp - jabber-chat-delayed-time-format - jabber-chat-time-format) - timestamp)) - (cons ?n (if dont-print-nick-p "" nick)) - (cons ?u nick) - (cons ?r nick) - (cons ?j (concat jabber-group "/" nick)))))) - (if (stringp nick) - (insert (jabber-propertize - " " - 'display (list '(margin left-margin) prompt) - 'face (if local ;Message from you. - (if jabber-muc-colorize-local ;; If colorization enable... - ;; ...colorize nick - (list ':foreground (jabber-muc-nick-get-color nick)) - ;; otherwise, use default face. - 'jabber-chat-prompt-local) - ;; Message from other participant. - (if jabber-muc-colorize-foreign ;If colorization enable... - ;; ... colorize nick - (list ':foreground (jabber-muc-nick-get-color nick)) - ;; otherwise, use default face. - 'jabber-chat-prompt-foreign)) - 'help-echo (concat (format-time-string "On %Y-%m-%d %H:%M:%S" timestamp) " from " nick " in " jabber-group))) - (jabber-muc-system-prompt)) - (update-margins (length prompt)))) +(jabber-margin-prompts-mode) (provide 'jabber-init) ;;; jabber-init.el ends here diff --git a/emacs/.emacs.d/site-lisp/jabber-margin-prompts.el b/emacs/.emacs.d/site-lisp/jabber-margin-prompts.el new file mode 100644 index 0000000..a27b301 --- /dev/null +++ b/emacs/.emacs.d/site-lisp/jabber-margin-prompts.el @@ -0,0 +1,152 @@ +;;; jabber-margin-prompts.el --- Show user prompts in Emacs' margins -*- lexical-binding: t; -*- + +;; Copyright (C) 2015 Tom Willemse + +;; Author: Tom Willemse +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'jabber-chat) +(require 'jabber-muc) + +(defvar jmp--longest-prompt 0) +(make-variable-buffer-local 'jmp--longest-prompt) + +(defun jmp--update-margins (prompt-length) + "Increase left margin width if PROMPT-LENGTH requires it." + (when (> prompt-length jmp--longest-prompt) + (let ((window (get-buffer-window (current-buffer)))) + (when (equal window (selected-window)) + (set-window-margins window prompt-length)) + (setq left-margin-width prompt-length + jmp--longest-prompt prompt-length)))) + +(defun jmp-chat-self-prompt (timestamp delayed dont-print-nick-p) + "Print prompt for sent message. +TIMESTAMP is the timestamp to print, or nil for now. +If DELAYED is true, print long timestamp +\(`jabber-chat-delayed-time-format' as opposed to +`jabber-chat-time-format'). +If DONT-PRINT-NICK-P is true, don't include nickname." + (let* ((state-data (fsm-get-state-data jabber-buffer-connection)) + (username (plist-get state-data :username)) + (server (plist-get state-data :server)) + (resource (plist-get state-data :resource)) + (nickname username) + (prompt (format-spec jabber-chat-local-prompt-format + (list + (cons ?t (format-time-string + (if delayed + jabber-chat-delayed-time-format + jabber-chat-time-format) + timestamp)) + (cons ?n (if dont-print-nick-p "" nickname)) + (cons ?u username) + (cons ?r resource) + (cons ?j (concat username "@" server)))))) + (insert (jabber-propertize + " " + 'display (list '(margin left-margin) prompt) + 'face 'jabber-chat-prompt-local + 'help-echo + (concat (format-time-string "On %Y-%m-%d %H:%M:%S" timestamp) " from you"))) + (jmp--update-margins (length prompt)))) + +(defun jmp-chat-print-prompt (xml-data timestamp delayed dont-print-nick-p) + "Print prompt for received message in XML-DATA. +TIMESTAMP is the timestamp to print, or nil to get it +from a jabber:x:delay element. +If DELAYED is true, print long timestamp +\(`jabber-chat-delayed-time-format' as opposed to +`jabber-chat-time-format'). +If DONT-PRINT-NICK-P is true, don't include nickname." + (let* ((from (jabber-xml-get-attribute xml-data 'from)) + (timestamp (or timestamp + (car (delq nil (mapcar 'jabber-x-delay (jabber-xml-get-children xml-data 'x)))))) + (prompt (format-spec jabber-chat-foreign-prompt-format + (list + (cons ?t (format-time-string + (if delayed + jabber-chat-delayed-time-format + jabber-chat-time-format) + timestamp)) + (cons ?n (if dont-print-nick-p "" (jabber-jid-displayname from))) + (cons ?u (or (jabber-jid-username from) from)) + (cons ?r (jabber-jid-resource from)) + (cons ?j (jabber-jid-user from)))))) + (insert (jabber-propertize + " " + 'display (list '(margin left-margin) prompt) + 'face 'jabber-chat-prompt-foreign + 'help-echo + (concat (format-time-string "On %Y-%m-%d %H:%M:%S" timestamp) " from " from))) + (jmp--update-margins (length prompt)))) + +(defun jmp-muc-print-prompt (xml-data &optional local dont-print-nick-p) + "Print MUC prompt for message in XML-DATA." + (let* ((nick (jabber-jid-resource (jabber-xml-get-attribute xml-data 'from))) + (timestamp (car (delq nil (mapcar 'jabber-x-delay (jabber-xml-get-children xml-data 'x))))) + (prompt (format-spec jabber-groupchat-prompt-format + (list + (cons ?t (format-time-string + (if timestamp + jabber-chat-delayed-time-format + jabber-chat-time-format) + timestamp)) + (cons ?n (if dont-print-nick-p "" nick)) + (cons ?u nick) + (cons ?r nick) + (cons ?j (concat jabber-group "/" nick)))))) + (if (stringp nick) + (insert (jabber-propertize + " " + 'display (list '(margin left-margin) prompt) + 'face (if local ;Message from you. + (if jabber-muc-colorize-local ;; If colorization enable... + ;; ...colorize nick + (list ':foreground (jabber-muc-nick-get-color nick)) + ;; otherwise, use default face. + 'jabber-chat-prompt-local) + ;; Message from other participant. + (if jabber-muc-colorize-foreign ;If colorization enable... + ;; ... colorize nick + (list ':foreground (jabber-muc-nick-get-color nick)) + ;; otherwise, use default face. + 'jabber-chat-prompt-foreign)) + 'help-echo (concat (format-time-string "On %Y-%m-%d %H:%M:%S" timestamp) " from " nick " in " jabber-group))) + (jabber-muc-system-prompt)) + (jmp--update-margins (length prompt)))) + +;;;###autoload +(define-minor-mode jabber-margin-prompts-mode + "Show jabber prompts in the margins." + :global t + (if jabber-margin-prompts-mode + (progn + (add-function :override (symbol-function 'jabber-chat-self-prompt) #'jmp-chat-self-prompt) + (add-function :override (symbol-function 'jabber-chat-print-prompt) #'jmp-chat-print-prompt) + (add-function :override (symbol-function 'jabber-muc-print-prompt) #'jmp-muc-print-prompt)) + (remove-function (symbol-function 'jabber-chat-self-prompt) #'jmp-chat-self-prompt) + (remove-function (symbol-function 'jabber-chat-print-prompt) #'jmp-chat-print-prompt) + (remove-function (symbol-function 'jabber-muc-print-prompt) #'jmp-muc-print-prompt))) + +(provide 'jabber-margin-prompts) +;;; jabber-margin-prompts.el ends here -- cgit v1.2.3-54-g00ecf