X-Git-Url: https://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-commands.el;h=28b0d39943395c4b11c2dc9ccb5c7acdb720d5aa;hp=f00eb99dade43a7183fdc9f20748cf6c13cf5fea;hb=042b02236efc8721d134b4c9dc40706886278fd3;hpb=42e31f8eeb303141b360d377fe14510f8ceb3e7a diff --git a/lisp/riece-commands.el b/lisp/riece-commands.el index f00eb99..28b0d39 100644 --- a/lisp/riece-commands.el +++ b/lisp/riece-commands.el @@ -38,7 +38,7 @@ ;;; Channel movement: (defun riece-command-switch-to-channel (channel) (interactive - (list (completing-read "Channel/user: " + (list (completing-read "Channel/User: " (mapcar #'list riece-current-channels) nil t))) (riece-switch-to-channel channel) @@ -72,31 +72,42 @@ (defun riece-command-next-channel () "Select the next channel." (interactive) - (let ((pointer (cdr (string-list-member-ignore-case - riece-current-channel - riece-current-channels)))) - (while (and pointer - (null (car pointer))) - (setq pointer (cdr pointer))) - (if (car pointer) - (riece-command-switch-to-channel (car pointer)) - (error "No such channel!")))) + (when (> (length riece-current-channels) 1) + (let ((pointer (cdr (string-list-member-ignore-case + riece-current-channel + riece-current-channels)))) + (while (and pointer + (null (car pointer))) + (setq pointer (cdr pointer))) + (when (null pointer) + (setq pointer riece-current-channels) + (while (and pointer + (null (car pointer))) + (setq pointer (cdr pointer)))) + (if (car pointer) + (riece-command-switch-to-channel (car pointer)) + (error "No such channel!"))))) (defun riece-command-previous-channel () "Select the previous channel." (interactive) - (let ((pointer (string-list-member-ignore-case - riece-current-channel - riece-current-channels)) - (start riece-current-channels) - channel) - (while (and start (not (eq start pointer))) - (if (car start) - (setq channel (car start))) - (setq start (cdr start))) - (if channel - (riece-command-switch-to-channel channel) - (error "No such channel!")))) + (when (> (length riece-current-channels) 1) + (let ((pointer (string-list-member-ignore-case + riece-current-channel + riece-current-channels)) + (start riece-current-channels) + channel) + (while (and start (not (eq start pointer))) + (setq channel (car start)) + (setq start (cdr start))) + (when (null channel) + (setq start (copy-sequence riece-current-channels)) + (setq start (delq nil start)) + (and (> (length start) 1) + (setq channel (nth (1- (length start)) start)))) + (if channel + (riece-command-switch-to-channel channel) + (error "No such channel!"))))) (defun riece-command-select-command-buffer () "Select the command buffer." @@ -112,33 +123,24 @@ (defun riece-command-toggle-channel-buffer-mode () (interactive) (setq riece-channel-buffer-mode - (not riece-channel-buffer-mode)) + (not riece-channel-buffer-mode) + riece-save-variables-are-dirty t) (riece-command-configure-windows)) (defun riece-command-toggle-user-list-buffer-mode () (interactive) (setq riece-user-list-buffer-mode - (not riece-user-list-buffer-mode)) + (not riece-user-list-buffer-mode) + riece-save-variables-are-dirty t) (riece-command-configure-windows)) (defun riece-command-toggle-channel-list-buffer-mode () (interactive) (setq riece-channel-list-buffer-mode - (not riece-channel-list-buffer-mode)) + (not riece-channel-list-buffer-mode) + riece-save-variables-are-dirty t) (riece-command-configure-windows)) -(defun riece-get-users-on-server () - (riece-with-server-buffer - (let (users) - (mapatoms - (lambda (atom) - (unless (riece-channel-p (symbol-name atom)) - (push (symbol-name atom) users))) - riece-obarray) - (if (member riece-real-nickname users) - users - (cons riece-real-nickname users))))) - (defun riece-command-finger (user &optional recurse) (interactive (let* ((completion-ignore-case t) @@ -221,13 +223,26 @@ (yes-or-no-p "Really want to query WHO without argument? ")) (riece-send-string (format "WHO %s\r\n" pattern)))) +(defun riece-command-list (pattern) + (interactive + (let ((completion-ignore-case t)) + (list (read-from-minibuffer + "Pattern: " + (if (and riece-current-channel + (riece-channel-p riece-current-channel)) + (cons (riece-identity-prefix riece-current-channel) + 0)))))) + (if (or (not (equal pattern "")) + (yes-or-no-p "Really want to query LIST without argument? ")) + (riece-send-string (format "LIST %s\r\n" pattern)))) + (defun riece-command-change-mode (channel change) (interactive (let* ((completion-ignore-case t) (channel (if current-prefix-arg (completing-read - "Channel/user: " + "Channel/User: " (mapcar #'list riece-current-channels)) riece-current-channel)) (riece-overriding-server-name (riece-identity-server channel)) @@ -266,7 +281,8 @@ (list users current-prefix-arg))) (let (group) (while users - (push (pop users) group) + (setq group (cons (car users) group) + users (cdr users)) (if (or (= (length group) 3) (null users)) (riece-send-string @@ -297,7 +313,8 @@ (list users current-prefix-arg))) (let (group) (while users - (push (pop users) group) + (setq group (cons (car users) group) + users (cdr users)) (if (or (= (length group) 3) (null users)) (riece-send-string @@ -309,25 +326,43 @@ (make-string (length group) ?v) (mapconcat #'identity group " "))))))) -(defun riece-command-send-message (message) +(defun riece-command-send-message (message notice) "Send MESSAGE to the current channel." (if (equal message "") (error "No text to send")) (unless riece-current-channel (error (substitute-command-keys "Type \\[riece-command-join] to join a channel"))) - (riece-send-string - (format "PRIVMSG %s :%s\r\n" - (riece-identity-prefix riece-current-channel) - message)) - (riece-own-channel-message message)) + (if notice + (progn + (riece-send-string + (format "NOTICE %s :%s\r\n" + (riece-identity-prefix riece-current-channel) + message)) + (riece-own-channel-message message riece-current-channel 'notice)) + (riece-send-string + (format "PRIVMSG %s :%s\r\n" + (riece-identity-prefix riece-current-channel) + message)) + (riece-own-channel-message message))) (defun riece-command-enter-message () "Send the current line to the current channel." (interactive) (riece-command-send-message (buffer-substring (riece-line-beginning-position) - (riece-line-end-position))) + (riece-line-end-position)) + nil) + (let ((next-line-add-newlines t)) + (next-line 1))) + +(defun riece-command-enter-message-as-notice () + "Send the current line to the current channel as NOTICE." + (interactive) + (riece-command-send-message (buffer-substring + (riece-line-beginning-position) + (riece-line-end-position)) + t) (let ((next-line-add-newlines t)) (next-line 1))) @@ -360,7 +395,7 @@ (interactive (let ((completion-ignore-case t) (target - (completing-read "Channel/user: " + (completing-read "Channel/User: " (mapcar #'list riece-current-channels))) key) (if (and current-prefix-arg @@ -396,7 +431,7 @@ (interactive (let ((completion-ignore-case t) (target - (completing-read "Channel/user: " + (completing-read "Channel/User: " (mapcar #'list riece-current-channels) nil t (cons riece-current-channel 0))) message) @@ -465,7 +500,9 @@ (defun riece-command-toggle-away (&optional message) "Mark yourself as being away." (interactive - (if current-prefix-arg + (if (and (not (riece-user-get-away (riece-current-nickname))) + (or (null riece-away-message) + current-prefix-arg)) (let ((message (read-string "Away message: "))) (list message)))) (if message @@ -530,12 +567,11 @@ If prefix argument ARG is non-nil, toggle frozen status." (defun riece-command-open-server (server-name) (interactive (list (completing-read "Server: " riece-server-alist))) - (let ((process (riece-start-server - (riece-server-name-to-server server-name) - server-name))) - (with-current-buffer (process-buffer process) - (setq riece-server-name server-name)) - (push (cons server-name process) riece-server-process-alist))) + (if (assoc server-name riece-server-process-alist) + (error "%s is already opened" server-name) + (riece-open-server + (riece-server-name-to-server server-name) + server-name))) (defun riece-command-close-server (server-name &optional message) (interactive