* riece-commands.el (riece-command-join): Abolished prefix-arg
[riece] / lisp / riece-commands.el
index c242442..2175264 100644 (file)
 (require 'riece-complete)
 (require 'riece-layout)
 (require 'riece-display)
-(require 'riece-version)
 (require 'riece-server)
 (require 'riece-misc)
 (require 'riece-identity)
 (require 'riece-message)
 
+(autoload 'derived-mode-class "derived")
+
 ;;; Channel movement:
 (defun riece-command-switch-to-channel (channel)
   (interactive (list (riece-completing-read-identity
-                     "Channel/User: " riece-current-channels nil t)))
+                     "Switch to channel/user: "
+                     riece-current-channels nil t)))
   (unless (equal channel riece-current-channel)
-    (riece-switch-to-channel channel)
-    (riece-redisplay-buffers)))
+    (riece-switch-to-channel channel)))
 
 (defun riece-command-switch-to-channel-by-number (number)
   (interactive
    (let ((command-name (symbol-name this-command)))
      (if (string-match "[0-9]+$" command-name)
         (list (string-to-number (match-string 0 command-name)))
-       (list (string-to-number (read-string "Number: "))))))
+       (list (string-to-number (read-string "Switch to number: "))))))
   (let ((channel (nth (1- number) riece-current-channels)))
     (if channel
        (riece-command-switch-to-channel channel)
 (defun riece-command-change-layout (name)
   "Select a layout-name from all current available layouts and change
 the layout to the selected layout-name."
-  (interactive (list (completing-read "Layout: " riece-layout-alist)))
+  (interactive (list (completing-read "Change layout: " riece-layout-alist)))
   (setq riece-layout name
        riece-save-variables-are-dirty t)
   (riece-command-configure-windows))
@@ -146,8 +147,9 @@ the layout to the selected layout-name."
   (interactive
    (let* ((completion-ignore-case t)
          (user (riece-completing-read-identity
-                "User: "
-                (riece-get-users-on-server (riece-current-server-name)))))
+                "Finger user: "
+                (riece-get-users-on-server (riece-current-server-name))
+                nil nil nil nil nil t)))
      (list user current-prefix-arg)))
   (if recurse
       (riece-send-string (format "WHOIS %s %s\r\n"
@@ -160,14 +162,14 @@ the layout to the selected layout-name."
    (progn
      (riece-check-channel-commands-are-usable t)
      (list (read-from-minibuffer
-           "Topic: " (cons (or (riece-with-server-buffer
-                                   (riece-identity-server
-                                    riece-current-channel)
-                                 (riece-channel-get-topic
-                                  (riece-identity-prefix
-                                   riece-current-channel)))
-                               "")
-                           0)))))
+           "Set topic: " (cons (or (riece-with-server-buffer
+                                    (riece-identity-server
+                                     riece-current-channel)
+                                    (riece-channel-get-topic
+                                     (riece-identity-prefix
+                                      riece-current-channel)))
+                                   "")
+                               0)))))
   (riece-send-string (format "TOPIC %s :%s\r\n"
                             (riece-identity-prefix riece-current-channel)
                             topic)))
@@ -177,8 +179,9 @@ the layout to the selected layout-name."
    (let ((completion-ignore-case t))
      (riece-check-channel-commands-are-usable t)
      (list (riece-completing-read-identity
-           "User: "
-           (riece-get-users-on-server (riece-current-server-name))))))
+           "Invite user: "
+           (riece-get-users-on-server (riece-current-server-name))
+           nil nil nil nil nil t))))
   (riece-send-string (format "INVITE %s %s\r\n"
                             (riece-identity-prefix user)
                             (riece-identity-prefix riece-current-channel))))
@@ -188,7 +191,7 @@ the layout to the selected layout-name."
    (let ((completion-ignore-case t))
      (riece-check-channel-commands-are-usable t)
      (list (completing-read
-           "User: "
+           "Kick user: "
            (riece-with-server-buffer
                (riece-identity-server riece-current-channel)
              (riece-channel-get-users (riece-identity-prefix
@@ -208,7 +211,7 @@ the layout to the selected layout-name."
   (interactive
    (let ((completion-ignore-case t))
      (list (read-from-minibuffer
-           "Pattern: "
+           "NAMES pattern: "
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
@@ -222,7 +225,7 @@ the layout to the selected layout-name."
   (interactive
    (let ((completion-ignore-case t))
      (list (read-from-minibuffer
-           "Pattern: "
+           "WHO pattern: "
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
@@ -236,7 +239,7 @@ the layout to the selected layout-name."
   (interactive
    (let ((completion-ignore-case t))
      (list (read-from-minibuffer
-           "Pattern: "
+           "LIST pattern: "
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
@@ -252,8 +255,9 @@ the layout to the selected layout-name."
          (channel
           (if current-prefix-arg
               (riece-completing-read-identity
-               "Channel/User: "
-               (riece-get-identities-on-server (riece-current-server-name)))
+               "Change mode for channel/user: "
+               (riece-get-identities-on-server (riece-current-server-name))
+               nil nil nil nil nil t)
             (riece-check-channel-commands-are-usable t)
             riece-current-channel))
          (riece-overriding-server-name (riece-identity-server channel))
@@ -271,8 +275,12 @@ the layout to the selected layout-name."
            (concat (riece-concat-channel-modes
                     channel "Mode (? for help)") ": ")
            nil riece-minibuffer-map))))
-  (riece-send-string (format "MODE %s :%s\r\n" (riece-identity-prefix channel)
-                            change)))
+  (if (equal change "")
+      (riece-send-string (format "MODE %s\r\n"
+                                (riece-identity-prefix channel)))
+    (riece-send-string (format "MODE %s %s\r\n"
+                              (riece-identity-prefix channel)
+                              change))))
 
 (defun riece-command-set-operators (users &optional arg)
   (interactive
@@ -280,7 +288,9 @@ the layout to the selected layout-name."
      (riece-check-channel-commands-are-usable t)
      (let ((completion-ignore-case t))
        (list (riece-completing-read-multiple
-             "Users"
+             (if current-prefix-arg
+                 "Unset +o for users"
+               "Set +o for users")
              (riece-with-server-buffer
                  (riece-identity-server riece-current-channel)
                (riece-channel-get-users (riece-identity-prefix
@@ -304,7 +314,7 @@ the layout to the selected layout-name."
                     ?-
                   ?+)
                 (make-string (length group) ?o)
-                (mapconcat #'identity group " ")))
+                (mapconcat #'identity (nreverse group) " ")))
        (setq group nil)))))
 
 (defun riece-command-set-speakers (users &optional arg)
@@ -313,7 +323,9 @@ the layout to the selected layout-name."
      (riece-check-channel-commands-are-usable t)
      (let ((completion-ignore-case t))
        (list (riece-completing-read-multiple
-             "Users"
+             (if current-prefix-arg
+                 "Unset +v for users"
+               "Set +v for users")
              (riece-with-server-buffer
                  (riece-identity-server riece-current-channel)
                (riece-channel-get-users (riece-identity-prefix
@@ -337,11 +349,12 @@ the layout to the selected layout-name."
                     ?-
                   ?+)
                 (make-string (length group) ?v)
-                (mapconcat #'identity group " ")))
+                (mapconcat #'identity (nreverse group) " ")))
        (setq group nil)))))
 
 (defun riece-command-send-message (message notice)
   "Send MESSAGE to the current channel."
+  (run-hooks 'riece-command-send-message-hook)
   (if (equal message "")
       (error "No text to send"))
   (riece-check-channel-commands-are-usable)
@@ -385,10 +398,13 @@ the layout to the selected layout-name."
 (defun riece-command-enter-message-to-user (user)
   "Send the current line to USER."
   (interactive
-   (let ((completion-ignore-case t))
-     (list (riece-completing-read-identity
-           "User: "
-           (riece-get-users-on-server (riece-current-server-name))))))
+   (if (and (bolp) (eolp))
+       (error "No text to send")
+     (let ((completion-ignore-case t))
+       (list (riece-completing-read-identity
+             "Message to user: "
+             (riece-get-users-on-server (riece-current-server-name))
+             nil nil nil nil nil t)))))
   (let ((text (buffer-substring
               (riece-line-beginning-position)
               (riece-line-end-position))))
@@ -417,35 +433,27 @@ the layout to the selected layout-name."
     (if pointer
        (riece-command-switch-to-channel (car pointer))
       (riece-join-channel target)
-      (riece-switch-to-channel target)
-      (riece-redisplay-buffers))))
+      (riece-switch-to-channel target))))
 
-(defun riece-command-join (target &optional key)
+(defun riece-command-join (target)
   (interactive
-   (let* ((completion-ignore-case t)
-         (target
-          (if riece-join-channel-candidate
-              (let ((default (riece-format-identity
-                              riece-join-channel-candidate)))
-                (riece-completing-read-identity
-                 (format "Channel/User (default %s): " default)
-                 (riece-get-identities-on-server (riece-current-server-name))
-                 nil nil nil nil default))
-            (riece-completing-read-identity
-             "Channel/User: "
-             (riece-get-identities-on-server (riece-current-server-name)))))
-         key)
-     (if (and current-prefix-arg
-             (riece-channel-p (riece-identity-prefix target)))
-        (setq key
-              (riece-read-passwd (format "Key for %s: "
-                                         (riece-format-identity target)))))
-     (list target key)))
+   (let ((completion-ignore-case t))
+     (list
+      (if riece-join-channel-candidate
+         (let ((default (riece-format-identity
+                         riece-join-channel-candidate)))
+           (riece-completing-read-identity
+            (format "Join channel/user (default %s): " default)
+            (riece-get-identities-on-server (riece-current-server-name))
+            nil nil nil nil default))
+       (riece-completing-read-identity
+        "Join channel/user: "
+        (riece-get-identities-on-server (riece-current-server-name)))))))
   (let ((pointer (riece-identity-member target riece-current-channels)))
     (if pointer
        (riece-command-switch-to-channel (car pointer))
       (if (riece-channel-p (riece-identity-prefix target))
-         (riece-command-join-channel target key)
+         (riece-command-join-channel target nil)
        (riece-command-join-partner target)))))
 
 (defun riece-command-part-channel (target message)
@@ -465,7 +473,7 @@ the layout to the selected layout-name."
      (let* ((completion-ignore-case t)
            (target
             (riece-completing-read-identity
-             (format "Channel/User (default %s): "
+             (format "Part from channel/user (default %s): "
                      (riece-format-identity riece-current-channel))
              riece-current-channels nil nil nil nil
              (riece-format-identity riece-current-channel)))
@@ -477,8 +485,7 @@ the layout to the selected layout-name."
   (if (riece-identity-member target riece-current-channels)
       (if (riece-channel-p (riece-identity-prefix target))
          (riece-command-part-channel target message)
-       (riece-part-channel target)
-       (riece-redisplay-buffers))
+       (riece-part-channel target))
     (error "You are not talking with %s" target)))
 
 (defun riece-command-change-nickname (nickname)
@@ -541,71 +548,95 @@ the layout to the selected layout-name."
                                            (riece-current-nickname))
                   (riece-user-get-away (riece-identity-prefix
                                         (riece-current-nickname)))))
-           (or (null riece-away-message)
-               current-prefix-arg))
-       (let ((message (read-string "Away message: ")))
-        (list message))))
-  (if message
-      (riece-send-string (format "AWAY :%s\r\n" message))
-    (riece-send-string "AWAY\r\n")))
+           current-prefix-arg)
+       (list (read-from-minibuffer
+             "Away message: " (cons (or riece-away-message "") 0)))))
+  (if (riece-with-server-buffer (riece-identity-server
+                                (riece-current-nickname))
+       (riece-user-get-away (riece-identity-prefix
+                             (riece-current-nickname))))
+      (riece-send-string "AWAY\r\n")
+    (riece-send-string (format "AWAY :%s\r\n" (or message
+                                                 riece-away-message)))))
 
 (defun riece-command-toggle-freeze (&optional arg)
   "Prevent automatic scrolling of the dialogue window.
 If prefix argument ARG is non-nil, toggle frozen status."
   (interactive "P")
-  (with-current-buffer (if (and riece-channel-buffer-mode
-                               riece-channel-buffer)
-                          riece-channel-buffer
-                        riece-dialogue-buffer)
+  (with-current-buffer (if (eq (derived-mode-class major-mode)
+                              'riece-dialogue-mode)
+                          (current-buffer)
+                        (if (and riece-channel-buffer-mode
+                                 riece-channel-buffer)
+                            riece-channel-buffer
+                          riece-dialogue-buffer))
     (setq riece-freeze (if arg
                           (< 0 (prefix-numeric-value arg))
-                        (not riece-freeze))))
-  (riece-update-status-indicators)
-  (force-mode-line-update t))
+                        (not riece-freeze)))
+    (riece-emit-signal 'buffer-freeze-changed
+                      (current-buffer) riece-freeze)))
 
 (defun riece-command-toggle-own-freeze (&optional arg)
   "Prevent automatic scrolling of the dialogue window.
 The difference from `riece-command-freeze' is that your messages are hidden.
 If prefix argument ARG is non-nil, toggle frozen status."
   (interactive "P")
-  (with-current-buffer (if (and riece-channel-buffer-mode
-                               riece-channel-buffer)
-                          riece-channel-buffer
-                        riece-dialogue-buffer)
+  (with-current-buffer (if (eq (derived-mode-class major-mode)
+                              'riece-dialogue-mode)
+                          (current-buffer)
+                        (if (and riece-channel-buffer-mode
+                                 riece-channel-buffer)
+                            riece-channel-buffer
+                          riece-dialogue-buffer))
     (if (if arg
            (< 0 (prefix-numeric-value arg))
          (not (eq riece-freeze 'own)))
        (setq riece-freeze 'own)
-      (setq riece-freeze nil)))
-  (riece-update-status-indicators)
-  (force-mode-line-update t))
+      (setq riece-freeze nil))
+    (riece-emit-signal 'buffer-freeze-changed
+                      (current-buffer) riece-freeze)))
 
 (eval-when-compile
   (autoload 'riece-exit "riece"))
 (defun riece-command-quit (&optional arg)
   "Quit IRC."
   (interactive "P")
-  (if (y-or-n-p "Really quit IRC? ")
-      (if riece-server-process-alist
-         (let ((message
-                (if arg
-                    (read-string "Message: ")
-                  (or riece-quit-message
-                      (riece-extended-version))))
-               (alist riece-server-process-alist))
-           (while alist
-             (riece-quit-server-process (cdr (car alist)) message)
-             (setq alist (cdr alist))))
-       ;; If no server process is available, exit immediately.
-       (riece-exit))))
+  (if (null riece-server-process-alist)
+      (progn
+       (message "No server process")
+       (ding))
+    (if (y-or-n-p "Really quit IRC? ")
+       (let ((message
+              (if arg
+                  (read-string "Message: ")
+              riece-quit-message))
+             (alist riece-server-process-alist))
+         (while alist
+           (riece-quit-server-process (cdr (car alist)) message)
+           (setq alist (cdr alist)))))))
 
 (defun riece-command-raw (command)
   "Enter raw IRC command, which is sent to the server."
   (interactive "sIRC command: ")
   (riece-send-string (concat command "\r\n")))
 
+(defun riece-command-beginning-of-buffer ()
+  "Scroll channel buffer to the beginning."
+  (interactive)
+  (let (buffer window)
+    (setq buffer (if riece-channel-buffer-mode
+                    riece-channel-buffer
+                  riece-dialogue-buffer))
+    (or (setq window (get-buffer-window buffer))
+       (setq window (get-buffer-window riece-dialogue-buffer)
+             buffer riece-dialogue-buffer))
+    (when window
+      (save-selected-window
+       (select-window window)
+       (goto-char (point-min))))))
+
 (defun riece-command-end-of-buffer ()
-  "Get end of the dialogue buffer."
+  "Scroll channel buffer to the end."
   (interactive)
   (let (buffer window)
     (setq buffer (if riece-channel-buffer-mode
@@ -624,9 +655,31 @@ If prefix argument ARG is non-nil, toggle frozen status."
   (interactive "r")
   (kill-new (buffer-substring-no-properties start end)))
 
+(defun riece-command-complete-user ()
+  "Complete a user name in the current buffer."
+  (interactive)
+  (let* ((completion-ignore-case t)
+        (table (mapcar (lambda (user)
+                         (list (riece-format-identity user t)))
+                       (riece-get-users-on-server
+                        (riece-current-server-name))))
+        (current (or (current-word) ""))
+        (completion (try-completion current table))
+        (all (all-completions current table)))
+    (if (eq completion t)
+       nil
+      (if (null completion)
+         (message "Can't find completion for \"%s\"" current)
+       (if (equal current completion)
+           (with-output-to-temp-buffer "*Help*"
+             (display-completion-list all))
+         (re-search-forward "\\>" nil t)
+         (delete-region (point) (- (point) (length current)))
+         (insert completion))))))
+
 (defun riece-command-open-server (server-name)
   (interactive
-   (list (completing-read "Server: " riece-server-alist)))
+   (list (completing-read "Open server: " riece-server-alist)))
   (if (riece-server-process server-name)
       (error "%s is already opened" server-name))
   (riece-open-server
@@ -635,11 +688,10 @@ If prefix argument ARG is non-nil, toggle frozen status."
 
 (defun riece-command-close-server (server-name &optional message)
   (interactive
-   (list (completing-read "Server: " riece-server-process-alist)
+   (list (completing-read "Close server: " riece-server-process-alist)
         (if current-prefix-arg
             (read-string "Message: ")
-          (or riece-quit-message
-              (riece-extended-version)))))
+          riece-quit-message)))
   (riece-quit-server-process (riece-server-process server-name) message))
 
 (defun riece-command-universal-server-name-argument ()