* riece-options.el (riece-saved-forms): Add riece-layout.
[riece] / lisp / riece-commands.el
index 8303504..580e77a 100644 (file)
@@ -26,6 +26,7 @@
 
 (require 'riece-channel)
 (require 'riece-complete)
 
 (require 'riece-channel)
 (require 'riece-complete)
+(require 'riece-layout)
 (require 'riece-display)
 (require 'riece-version)
 (require 'riece-server)
 (require 'riece-display)
 (require 'riece-version)
 (require 'riece-server)
   (interactive)
   (riece-redisplay-buffers t))
 
   (interactive)
   (riece-redisplay-buffers t))
 
+(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)))
+  (setq riece-layout name
+       riece-save-variables-are-dirty t)
+  (riece-command-configure-windows))
+
 (defun riece-command-toggle-channel-buffer-mode ()
   (interactive)
   (setq riece-channel-buffer-mode
 (defun riece-command-toggle-channel-buffer-mode ()
   (interactive)
   (setq riece-channel-buffer-mode
 
 (defun riece-command-topic (topic)
   (interactive
 
 (defun riece-command-topic (topic)
   (interactive
-   (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))))
+   (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)))))
   (riece-send-string (format "TOPIC %s :%s\r\n"
                             (riece-identity-prefix riece-current-channel)
                             topic)))
   (riece-send-string (format "TOPIC %s :%s\r\n"
                             (riece-identity-prefix riece-current-channel)
                             topic)))
 (defun riece-command-invite (user)
   (interactive
    (let ((completion-ignore-case t))
 (defun riece-command-invite (user)
   (interactive
    (let ((completion-ignore-case t))
-     (unless (and riece-current-channel
-                 (riece-channel-p (riece-identity-prefix
-                                   riece-current-channel)))
-       (error "Not on a channel"))
+     (riece-check-channel-commands-are-usable t)
      (list (completing-read
            "User: "
            (mapcar #'list (riece-get-users-on-server))))))
      (list (completing-read
            "User: "
            (mapcar #'list (riece-get-users-on-server))))))
 (defun riece-command-kick (user &optional message)
   (interactive
    (let ((completion-ignore-case t))
 (defun riece-command-kick (user &optional message)
   (interactive
    (let ((completion-ignore-case t))
-     (unless (and riece-current-channel
-                 (riece-channel-p (riece-identity-prefix
-                                   riece-current-channel)))
-       (error "Not on a channel"))
+     (riece-check-channel-commands-are-usable t)
      (list (completing-read
            "User: "
      (list (completing-read
            "User: "
-           (mapcar #'list (riece-channel-get-users
-                           riece-current-channel)))
+           (mapcar #'list
+                   (riece-with-server-buffer
+                       (riece-identity-server riece-current-channel)
+                     (riece-channel-get-users
+                      (riece-identity-prefix riece-current-channel)))))
           (if current-prefix-arg
               (read-string "Message: ")))))
   (riece-send-string
           (if current-prefix-arg
               (read-string "Message: ")))))
   (riece-send-string
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
-               (cons (riece-format-identity riece-current-channel t)
+               (cons (riece-identity-prefix riece-current-channel)
                      0))))))
   (if (or (not (equal pattern ""))
          (yes-or-no-p "Really want to query NAMES without argument? "))
                      0))))))
   (if (or (not (equal pattern ""))
          (yes-or-no-p "Really want to query NAMES without argument? "))
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
-               (cons (riece-format-identity riece-current-channel t)
+               (cons (riece-identity-prefix riece-current-channel)
                      0))))))
   (if (or (not (equal pattern ""))
          (yes-or-no-p "Really want to query WHO without argument? "))
                      0))))))
   (if (or (not (equal pattern ""))
          (yes-or-no-p "Really want to query WHO without argument? "))
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
            (if (and riece-current-channel
                     (riece-channel-p (riece-identity-prefix
                                       riece-current-channel)))
-               (cons (riece-format-identity riece-current-channel t)
+               (cons (riece-identity-prefix riece-current-channel)
                      0))))))
   (if (or (not (equal pattern ""))
          (yes-or-no-p "Really want to query LIST without argument? "))
                      0))))))
   (if (or (not (equal pattern ""))
          (yes-or-no-p "Really want to query LIST without argument? "))
           (if current-prefix-arg
               (riece-completing-read-identity
                "Channel/User: " riece-current-channels)
           (if current-prefix-arg
               (riece-completing-read-identity
                "Channel/User: " riece-current-channels)
+            (riece-check-channel-commands-are-usable t)
             riece-current-channel))
          (riece-overriding-server-name (riece-identity-server channel))
          (riece-temp-minibuffer-message
             riece-current-channel))
          (riece-overriding-server-name (riece-identity-server channel))
          (riece-temp-minibuffer-message
 
 (defun riece-command-set-operators (users &optional arg)
   (interactive
 
 (defun riece-command-set-operators (users &optional arg)
   (interactive
-   (let ((operators
-         (riece-with-server-buffer
-             (riece-identity-server riece-current-channel)
-           (riece-channel-get-operators
-            (riece-identity-prefix riece-current-channel))))
-        (completion-ignore-case t)
-        users)
-     (if current-prefix-arg
+   (progn
+     (riece-check-channel-commands-are-usable t)
+     (let ((operators
+           (riece-with-server-buffer
+               (riece-identity-server riece-current-channel)
+             (riece-channel-get-operators
+              (riece-identity-prefix riece-current-channel))))
+          (completion-ignore-case t)
+          users)
+       (if current-prefix-arg
+          (setq users (riece-completing-read-multiple
+                       "Users"
+                       (mapcar #'list operators)))
         (setq users (riece-completing-read-multiple
                      "Users"
         (setq users (riece-completing-read-multiple
                      "Users"
-                     (mapcar #'list operators)))
-       (setq users (riece-completing-read-multiple
-                   "Users"
-                   (delq nil (mapcar
-                              (lambda (user)
-                                (unless (member user operators)
-                                  (list user)))
-                              (riece-with-server-buffer
-                                  (riece-identity-server
-                                   riece-current-channel)
-                                (riece-channel-get-users
-                                 (riece-identity-prefix
-                                  riece-current-channel))))))))
-     (list users current-prefix-arg)))
+                     (delq nil (mapcar
+                                (lambda (user)
+                                  (unless (member user operators)
+                                    (list user)))
+                                (riece-with-server-buffer
+                                    (riece-identity-server
+                                     riece-current-channel)
+                                  (riece-channel-get-users
+                                   (riece-identity-prefix
+                                    riece-current-channel))))))))
+       (list users current-prefix-arg))))
   (let (group)
     (while users
       (setq group (cons (car users) group)
   (let (group)
     (while users
       (setq group (cons (car users) group)
 
 (defun riece-command-set-speakers (users &optional arg)
   (interactive
 
 (defun riece-command-set-speakers (users &optional arg)
   (interactive
-   (let ((speakers
-         (riece-with-server-buffer
-             (riece-identity-server riece-current-channel)
-           (riece-channel-get-speakers
-            (riece-identity-prefix riece-current-channel))))
-        (completion-ignore-case t)
-        users)
-     (if current-prefix-arg
+   (progn
+     (riece-check-channel-commands-are-usable t)
+     (let ((speakers
+           (riece-with-server-buffer
+               (riece-identity-server riece-current-channel)
+             (riece-channel-get-speakers
+              (riece-identity-prefix riece-current-channel))))
+          (completion-ignore-case t)
+          users)
+       (if current-prefix-arg
+          (setq users (riece-completing-read-multiple
+                       "Users"
+                       (mapcar #'list speakers)))
         (setq users (riece-completing-read-multiple
                      "Users"
         (setq users (riece-completing-read-multiple
                      "Users"
-                     (mapcar #'list speakers)))
-       (setq users (riece-completing-read-multiple
-                   "Users"
-                   (delq nil (mapcar
-                              (lambda (user)
-                                (unless (member user speakers)
-                                  (list user)))
-                              (riece-with-server-buffer
-                                  (riece-identity-server
-                                   riece-current-channel)
-                                (riece-channel-get-users
-                                 (riece-identity-prefix
-                                  riece-current-channel))))))))
-     (list users current-prefix-arg)))
+                     (delq nil (mapcar
+                                (lambda (user)
+                                  (unless (member user speakers)
+                                    (list user)))
+                                (riece-with-server-buffer
+                                    (riece-identity-server
+                                     riece-current-channel)
+                                  (riece-channel-get-users
+                                   (riece-identity-prefix
+                                    riece-current-channel))))))))
+       (list users current-prefix-arg))))
   (let (group)
     (while users
       (setq group (cons (car users) group)
   (let (group)
     (while users
       (setq group (cons (car users) group)
   "Send MESSAGE to the current channel."
   (if (equal message "")
       (error "No text to send"))
   "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-check-channel-commands-are-usable)
   (if notice
       (progn
        (riece-send-string
   (if notice
       (progn
        (riece-send-string
   (let ((next-line-add-newlines t))
     (next-line 1)))
 
   (let ((next-line-add-newlines t))
     (next-line 1)))
 
+(defun riece-command-enter-message-to-user (user)
+  "Send the current line to USER."
+  (interactive
+   (let ((completion-ignore-case t))
+     (list (completing-read
+           "User: "
+           (mapcar #'list (riece-get-users-on-server))))))
+  (let ((text (buffer-substring
+              (riece-line-beginning-position)
+              (riece-line-end-position))))
+    (riece-send-string
+     (format "PRIVMSG %s :%s\r\n" user text))
+    (riece-display-message
+     (riece-make-message (riece-current-nickname)
+                        (riece-make-identity user (riece-current-server-name))
+                        text nil t)))
+  (let ((next-line-add-newlines t))
+    (next-line 1)))
+
 (defun riece-command-join-channel (target key)
   (let ((process (riece-server-process (riece-identity-server target))))
     (unless process
 (defun riece-command-join-channel (target key)
   (let ((process (riece-server-process (riece-identity-server target))))
     (unless process
   (interactive
    (let* ((completion-ignore-case t)
          (target
   (interactive
    (let* ((completion-ignore-case t)
          (target
-          (riece-completing-read-identity
-           "Channel/User: " riece-current-channels))
+          (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-current-channels nil nil nil nil default))
+            (riece-completing-read-identity
+             "Channel/User: " riece-current-channels)))
          key)
      (if (and current-prefix-arg
          key)
      (if (and current-prefix-arg
-             (riece-channel-p target))
+             (riece-channel-p (riece-identity-prefix target)))
         (setq key
         (setq key
-              (riece-read-passwd (format "Key for %s: " target))))
+              (riece-read-passwd (format "Key for %s: "
+                                         (riece-format-identity target)))))
      (list target key)))
   (let ((pointer (riece-identity-member target riece-current-channels)))
     (if pointer
      (list target key)))
   (let ((pointer (riece-identity-member target riece-current-channels)))
     (if pointer
 
 (defun riece-command-part-channel (target message)
   (let ((process (riece-server-process (riece-identity-server target))))
 
 (defun riece-command-part-channel (target message)
   (let ((process (riece-server-process (riece-identity-server target))))
-    (unless process
-      (error "%s" (substitute-command-keys
-                  "Type \\[riece-command-open-server] to open server.")))
     (riece-process-send-string process
                               (if message
                                   (format "PART %s :%s\r\n"
     (riece-process-send-string process
                               (if message
                                   (format "PART %s :%s\r\n"
 
 (defun riece-command-part (target &optional message)
   (interactive
 
 (defun riece-command-part (target &optional message)
   (interactive
-   (let* ((completion-ignore-case t)
-        (target
-         (riece-completing-read-identity
-          "Channel/User: " riece-current-channels nil nil
-          (cons (riece-format-identity riece-current-channel) 0)))
-        message)
-     (if (and current-prefix-arg
-             (riece-channel-p (riece-identity-prefix target)))
-        (setq message (read-string "Message: ")))
-     (list target message)))
+   (progn
+     (riece-check-channel-commands-are-usable)
+     (let* ((completion-ignore-case t)
+           (target
+            (riece-completing-read-identity
+             (format "Channel/User (default %s): "
+                     (riece-format-identity riece-current-channel))
+             riece-current-channels nil nil nil nil
+             (riece-format-identity riece-current-channel)))
+           message)
+       (if (and current-prefix-arg
+               (riece-channel-p (riece-identity-prefix target)))
+          (setq message (read-string "Message: ")))
+       (list target message))))
   (if (riece-identity-member target riece-current-channels)
       (if (riece-channel-p (riece-identity-prefix target))
          (riece-command-part-channel target message)
   (if (riece-identity-member target riece-current-channels)
       (if (riece-channel-p (riece-identity-prefix target))
          (riece-command-part-channel target message)
 (defun riece-command-toggle-away (&optional message)
   "Mark yourself as being away."
   (interactive
 (defun riece-command-toggle-away (&optional message)
   "Mark yourself as being away."
   (interactive
-   (if (and (not (riece-user-get-away (riece-current-nickname)))
+   (if (and (not (riece-with-server-buffer (riece-identity-server
+                                           (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: ")))
            (or (null riece-away-message)
                current-prefix-arg))
        (let ((message (read-string "Away message: ")))
@@ -563,10 +605,10 @@ If prefix argument ARG is non-nil, toggle frozen status."
                 (read-string "Message: ")
               (or riece-quit-message
                   (riece-extended-version))))
                 (read-string "Message: ")
               (or riece-quit-message
                   (riece-extended-version))))
-           (process-list riece-process-list))
-       (while process-list
-         (riece-quit-server-process (car process-list) message)
-         (setq process-list (cdr process-list))))))
+           (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."
 
 (defun riece-command-raw (command)
   "Enter raw IRC command, which is sent to the server."
@@ -604,13 +646,7 @@ If prefix argument ARG is non-nil, toggle frozen status."
 
 (defun riece-command-close-server (server-name &optional message)
   (interactive
 
 (defun riece-command-close-server (server-name &optional message)
   (interactive
-   (list (completing-read
-         "Server: "
-         (mapcar
-          (lambda (process)
-            (with-current-buffer (process-buffer process)
-              (list riece-server-name)))
-          riece-process-list))
+   (list (completing-read "Server: " riece-server-process-alist)
         (if current-prefix-arg
             (read-string "Message: ")
           (or riece-quit-message
         (if current-prefix-arg
             (read-string "Message: ")
           (or riece-quit-message
@@ -620,13 +656,7 @@ If prefix argument ARG is non-nil, toggle frozen status."
 (defun riece-command-universal-server-name-argument ()
   (interactive)
   (let* ((riece-overriding-server-name
 (defun riece-command-universal-server-name-argument ()
   (interactive)
   (let* ((riece-overriding-server-name
-         (completing-read
-          "Server: "
-          (mapcar
-           (lambda (process)
-             (with-current-buffer (process-buffer process)
-               (list riece-server-name)))
-           riece-process-list)))
+         (completing-read "Server: " riece-server-process-alist))
         (command
          (key-binding (read-key-sequence
                        (format "Command to execute on \"%s\":"
         (command
          (key-binding (read-key-sequence
                        (format "Command to execute on \"%s\":"