* riece.el (riece-command-mode): Set
[riece] / lisp / riece.el
index 8457cf5..2fe80de 100644 (file)
     (riece-dialogue-buffer "*Dialogue*" riece-dialogue-mode)
     (riece-others-buffer "*Others*" riece-others-mode)
     (riece-channel-list-buffer "*Channels*" riece-channel-list-mode)
     (riece-dialogue-buffer "*Dialogue*" riece-dialogue-mode)
     (riece-others-buffer "*Others*" riece-others-mode)
     (riece-channel-list-buffer "*Channels*" riece-channel-list-mode)
-    (riece-user-list-buffer " *Users*" riece-user-list-mode)))
+    (riece-user-list-buffer " *Users*" riece-user-list-mode)
+    (riece-temp-buffer " *Temp*")
+    (riece-debug-buffer " *Debug*")))
 
 (defvar riece-shrink-buffer-idle-timer nil
   "Timer object to periodically shrink channel buffers.")
 
 
 (defvar riece-shrink-buffer-idle-timer nil
   "Timer object to periodically shrink channel buffers.")
 
-(defvar riece-addons-insinuated nil
-  "Non nil if add-ons are already insinuated.")
-
 (defvar riece-select-keys
   `("#" riece-command-switch-to-channel-by-number
     "1" riece-command-switch-to-channel-by-number-1
 (defvar riece-select-keys
   `("#" riece-command-switch-to-channel-by-number
     "1" riece-command-switch-to-channel-by-number-1
@@ -164,6 +163,7 @@ If optional argument SAFE is nil, overwrite previous definitions."
     "f" riece-command-finger
     "\C-tf" riece-command-toggle-freeze
     "\C-to" riece-command-toggle-own-freeze
     "f" riece-command-finger
     "\C-tf" riece-command-toggle-freeze
     "\C-to" riece-command-toggle-own-freeze
+    "\C-tO" riece-command-toggle-others-buffer-mode
     "\C-tu" riece-command-toggle-user-list-buffer-mode
     "\C-tc" riece-command-toggle-channel-buffer-mode
     "\C-tC" riece-command-toggle-channel-list-buffer-mode
     "\C-tu" riece-command-toggle-user-list-buffer-mode
     "\C-tc" riece-command-toggle-channel-buffer-mode
     "\C-tC" riece-command-toggle-channel-list-buffer-mode
@@ -184,7 +184,8 @@ If optional argument SAFE is nil, overwrite previous definitions."
     "r" riece-command-configure-windows
     "x" riece-command-copy-region
     "t" riece-command-topic
     "r" riece-command-configure-windows
     "x" riece-command-copy-region
     "t" riece-command-topic
-    "w" riece-command-who)
+    "w" riece-command-who
+    "z" riece-command-suspend-resume)
 
   (riece-define-keys riece-command-mode-map
     "\r" riece-command-enter-message
 
   (riece-define-keys riece-command-mode-map
     "\r" riece-command-enter-message
@@ -275,13 +276,15 @@ If optional argument CONFIRM is non-nil, ask which IRC server to connect."
   (run-hooks 'riece-after-load-startup-hook)
   (if (riece-server-opened)
       (riece-command-configure-windows)
   (run-hooks 'riece-after-load-startup-hook)
   (if (riece-server-opened)
       (riece-command-configure-windows)
-    (unless riece-addons-insinuated
-      (setq riece-addons (riece-resolve-addons riece-addons))
-      (let ((pointer riece-addons))
-       (while pointer
-         (riece-insinuate-addon (car pointer) riece-debug)
-         (setq pointer (cdr pointer))))
-      (setq riece-addons-insinuated t))
+    (modify-frame-parameters (selected-frame)
+                            (list (cons 'riece-window-configuration
+                                        (current-window-configuration))))
+    (setq riece-addon-dependencies (riece-resolve-addons
+                                   (copy-sequence riece-addons)))
+    (let ((pointer riece-addon-dependencies))
+      (while pointer
+       (riece-insinuate-addon (car (car pointer)) riece-debug)
+       (setq pointer (cdr pointer))))
     (if (or confirm (null riece-server))
        (setq riece-server (completing-read "Server: " riece-server-alist)))
     (if (stringp riece-server)
     (if (or confirm (null riece-server))
        (setq riece-server (completing-read "Server: " riece-server-alist)))
     (if (stringp riece-server)
@@ -294,11 +297,13 @@ If optional argument CONFIRM is non-nil, ask which IRC server to connect."
               (lambda ()
                 (let ((buffers riece-buffer-list))
                   (while buffers
               (lambda ()
                 (let ((buffers riece-buffer-list))
                   (while buffers
-                    (if (eq (derived-mode-class
-                             (with-current-buffer (car buffers)
-                               major-mode))
-                            'riece-dialogue-mode)
-                        (riece-shrink-buffer (car buffers)))
+                    (if (buffer-live-p (car buffers))
+                        (if (eq (derived-mode-class
+                                 (with-current-buffer (car buffers)
+                                   major-mode))
+                                'riece-dialogue-mode)
+                            (riece-shrink-buffer (car buffers)))
+                      (delq (car buffers) riece-buffer-list))
                     (setq buffers (cdr buffers))))))))
     (switch-to-buffer riece-command-buffer)
     (riece-display-connect-signals)
                     (setq buffers (cdr buffers))))))))
     (switch-to-buffer riece-command-buffer)
     (riece-display-connect-signals)
@@ -319,10 +324,10 @@ If optional argument CONFIRM is non-nil, ask which IRC server to connect."
          (unless (riece-server-opened server)
            (riece-command-open-server server))
          (setq channel-list (cdr channel-list))))
          (unless (riece-server-opened server)
            (riece-command-open-server server))
          (setq channel-list (cdr channel-list))))
-      (let ((pointer riece-addons))
+      (let ((pointer riece-addon-dependencies))
        (while pointer
        (while pointer
-         (unless (get (car pointer) 'riece-addon-default-disabled)
-           (riece-enable-addon (car pointer) riece-debug))
+         (unless (get (car (car pointer)) 'riece-addon-default-disabled)
+           (riece-enable-addon (car (car pointer)) riece-debug))
          (setq pointer (cdr pointer))))
       (run-hooks 'riece-startup-hook)
       (message "%s" (substitute-command-keys
          (setq pointer (cdr pointer))))
       (run-hooks 'riece-startup-hook)
       (message "%s" (substitute-command-keys
@@ -335,13 +340,15 @@ If optional argument CONFIRM is non-nil, ask which IRC server to connect."
     (while (> (buffer-size) riece-max-buffer-size)
       (let* ((inhibit-read-only t)
             buffer-read-only
     (while (> (buffer-size) riece-max-buffer-size)
       (let* ((inhibit-read-only t)
             buffer-read-only
-            (start (point))
-            (end (progn (beginning-of-line 2) (point)))
-            (overlays (riece-overlays-in start end)))
+            (end (progn
+                   (goto-char riece-shrink-buffer-remove-chars)
+                   (beginning-of-line 2)
+                   (point)))
+            (overlays (riece-overlays-in (point-min) end)))
        (while overlays
          (riece-delete-overlay (car overlays))
          (setq overlays (cdr overlays)))
        (while overlays
          (riece-delete-overlay (car overlays))
          (setq overlays (cdr overlays)))
-       (delete-region start end)))))
+       (delete-region (point-min) end)))))
 
 (defun riece-exit ()
   (if riece-save-variables-are-dirty
 
 (defun riece-exit ()
   (if riece-save-variables-are-dirty
@@ -366,6 +373,8 @@ If optional argument CONFIRM is non-nil, ask which IRC server to connect."
        riece-operator-indicator "-"
        riece-channel-status-indicator "-"
        riece-freeze-indicator "-")
        riece-operator-indicator "-"
        riece-channel-status-indicator "-"
        riece-freeze-indicator "-")
+  (modify-frame-parameters (selected-frame)
+                          (list (list 'riece-window-configuration)))
   (delete-other-windows)
   (run-hooks 'riece-exit-hook))
 
   (delete-other-windows)
   (run-hooks 'riece-exit-hook))
 
@@ -384,21 +393,24 @@ For a list of the generic commands type \\[riece-command-generic] ? RET.
   (make-local-variable 'truncate-partial-width-windows)
   (setq truncate-partial-width-windows nil)
 
   (make-local-variable 'truncate-partial-width-windows)
   (setq truncate-partial-width-windows nil)
 
+  (make-local-variable 'riece-mode-line-buffer-identification)
   (setq riece-away-indicator "-"
        riece-operator-indicator "-"
        riece-channel-status-indicator "-"
        major-mode 'riece-command-mode
        mode-name "Command"
   (setq riece-away-indicator "-"
        riece-operator-indicator "-"
        riece-channel-status-indicator "-"
        major-mode 'riece-command-mode
        mode-name "Command"
+       riece-mode-line-buffer-identification
+       '("Riece: "
+         riece-away-indicator
+         riece-operator-indicator
+         riece-channel-status-indicator
+         " "
+         riece-user-indicator
+         " "
+         riece-channel-indicator)
        mode-line-buffer-identification
        (riece-mode-line-buffer-identification
        mode-line-buffer-identification
        (riece-mode-line-buffer-identification
-        '("Riece: "
-          riece-away-indicator
-          riece-operator-indicator
-          riece-channel-status-indicator
-          " "
-          riece-user-indicator
-          " "
-          riece-channel-indicator))
+        riece-mode-line-buffer-identification)
        truncate-lines nil)
   (riece-simplify-mode-line-format)
   (use-local-map riece-command-mode-map)
        truncate-lines nil)
   (riece-simplify-mode-line-format)
   (use-local-map riece-command-mode-map)
@@ -427,21 +439,24 @@ Instead, these commands are available:
   (make-local-variable 'truncate-partial-width-windows)
   (setq truncate-partial-width-windows nil)
 
   (make-local-variable 'truncate-partial-width-windows)
   (setq truncate-partial-width-windows nil)
 
+  (make-local-variable 'riece-mode-line-buffer-identification)
   (setq riece-freeze riece-default-freeze
        riece-away-indicator "-"
        riece-operator-indicator "-"
        riece-channel-status-indicator "-"
        major-mode 'riece-dialogue-mode
        mode-name "Dialogue"
   (setq riece-freeze riece-default-freeze
        riece-away-indicator "-"
        riece-operator-indicator "-"
        riece-channel-status-indicator "-"
        major-mode 'riece-dialogue-mode
        mode-name "Dialogue"
+       riece-mode-line-buffer-identification
+       '("Riece: "
+         riece-away-indicator
+         riece-operator-indicator
+         riece-freeze-indicator
+         riece-channel-status-indicator
+         " "
+         riece-channel-list-indicator " ")
        mode-line-buffer-identification
        (riece-mode-line-buffer-identification
        mode-line-buffer-identification
        (riece-mode-line-buffer-identification
-        '("Riece: "
-          riece-away-indicator
-          riece-operator-indicator
-          riece-freeze-indicator
-          riece-channel-status-indicator
-          " "
-          riece-channel-list-indicator " "))
+        riece-mode-line-buffer-identification)
        truncate-lines nil
        buffer-read-only t)
   (riece-simplify-mode-line-format)
        truncate-lines nil
        buffer-read-only t)
   (riece-simplify-mode-line-format)
@@ -463,15 +478,18 @@ All normal editing commands are turned off.
 Instead, these commands are available:
 \\{riece-channel-mode-map}"
   (make-local-variable 'riece-channel-buffer-window-point)
 Instead, these commands are available:
 \\{riece-channel-mode-map}"
   (make-local-variable 'riece-channel-buffer-window-point)
-  (setq mode-line-buffer-identification
+  (make-local-variable 'riece-mode-line-buffer-identification)
+  (setq riece-mode-line-buffer-identification
+       '("Riece: "
+         riece-away-indicator
+         riece-operator-indicator
+         riece-freeze-indicator
+         riece-channel-status-indicator
+         " "
+         riece-long-channel-indicator)
+       mode-line-buffer-identification
        (riece-mode-line-buffer-identification
        (riece-mode-line-buffer-identification
-        '("Riece: "
-          riece-away-indicator
-          riece-operator-indicator
-          riece-freeze-indicator
-          riece-channel-status-indicator
-          " "
-          riece-long-channel-indicator))))
+        riece-mode-line-buffer-identification)))
 
 (defun riece-channel-list-mode ()
   "Major mode for displaying channel list.
 
 (defun riece-channel-list-mode ()
   "Major mode for displaying channel list.
@@ -484,10 +502,13 @@ All normal editing commands are turned off."
   (make-local-variable 'truncate-partial-width-windows)
   (setq truncate-partial-width-windows nil)
 
   (make-local-variable 'truncate-partial-width-windows)
   (setq truncate-partial-width-windows nil)
 
+  (make-local-variable 'riece-mode-line-buffer-identification)
   (setq major-mode 'riece-channel-list-mode
        mode-name "Channels"
   (setq major-mode 'riece-channel-list-mode
        mode-name "Channels"
+       riece-mode-line-buffer-identification '("Riece: ")
        mode-line-buffer-identification
        mode-line-buffer-identification
-       (riece-mode-line-buffer-identification '("Riece: "))
+       (riece-mode-line-buffer-identification
+        riece-mode-line-buffer-identification)
        truncate-lines t
        buffer-read-only t)
   (make-local-hook 'riece-update-buffer-functions)
        truncate-lines t
        buffer-read-only t)
   (make-local-hook 'riece-update-buffer-functions)
@@ -509,11 +530,14 @@ Instead, these commands are available:
   (make-local-variable 'truncate-partial-width-windows)
   (setq truncate-partial-width-windows nil)
 
   (make-local-variable 'truncate-partial-width-windows)
   (setq truncate-partial-width-windows nil)
 
+  (make-local-variable 'riece-mode-line-buffer-identification)
   (setq major-mode 'riece-user-list-mode
        mode-name "Users"
   (setq major-mode 'riece-user-list-mode
        mode-name "Users"
+       riece-mode-line-buffer-identification
+       '("Riece: " riece-long-channel-indicator " ")
        mode-line-buffer-identification
        (riece-mode-line-buffer-identification
        mode-line-buffer-identification
        (riece-mode-line-buffer-identification
-        '("Riece: " riece-long-channel-indicator " "))
+        riece-mode-line-buffer-identification)
        truncate-lines t
        buffer-read-only t)
   (if (boundp 'transient-mark-mode)
        truncate-lines t
        buffer-read-only t)
   (if (boundp 'transient-mark-mode)
@@ -536,23 +560,38 @@ Instead, these commands are available:
          (funcall (nth 2 (car alist))))
        (setq alist (cdr alist))))))
 
          (funcall (nth 2 (car alist))))
        (setq alist (cdr alist))))))
 
+(defvar reporter-prompt-for-summary-p)
 (defun riece-submit-bug-report (&optional recent-messages recent-keys)
   "Submit via mail a bug report on Riece."
   ;; This strange form ensures that (recent-keys) is the value before
   ;; the bug subject string is read.
 (defun riece-submit-bug-report (&optional recent-messages recent-keys)
   "Submit via mail a bug report on Riece."
   ;; This strange form ensures that (recent-keys) is the value before
   ;; the bug subject string is read.
-  (interactive (list (with-output-to-string
-                      (print-recent-messages 20))
-                    (recent-keys)))
+  (interactive (list (riece-recent-messages 20) (recent-keys)))
+  (message "Querying server version...")
+  (let ((pointer riece-server-process-alist)
+       nickname)
+    (while pointer
+      (when (riece-server-process-opened (cdr (car pointer)))
+       (process-send-string (cdr (car pointer)) "VERSION\r\n")
+       (if (setq nickname
+                 (with-current-buffer (process-buffer (cdr (car pointer)))
+                   riece-real-nickname))
+           (process-send-string
+            (cdr (car pointer))
+            (format "PRIVMSG %s :\1VERSION\1\r\n" nickname))))
+      (setq pointer (cdr pointer))))
+  (sit-for 3)
+  (message "Querying server version...done")
   (require 'reporter)
   (let ((reporter-prompt-for-summary-p t))
   (require 'reporter)
   (let ((reporter-prompt-for-summary-p t))
-    (when (y-or-n-p "Do you want to submit a report on Riece? ")
-      (reporter-submit-bug-report
-       "liece@unixuser.org"
-       (riece-version)
-       '(riece-debug)
-       nil
-       nil
-       "This bug report will be sent to the Riece Development Team,
+    (unless riece-debug
+      (error "Please turn on riece-debug and restart Riece."))
+    (reporter-submit-bug-report
+     "liece@unixuser.org"
+     (riece-version)
+     '(riece-debug)
+     nil
+     nil
+     "This bug report will be sent to the Riece Development Team,
 not to your local site managers!!
 
 Please write in Japanese or English, because the Riece maintainers do
 not to your local site managers!!
 
 Please write in Japanese or English, because the Riece maintainers do
@@ -567,39 +606,43 @@ Also include a reliable recipe for triggering the bug, as well as
 any lisp back-traces that you may have.
 \(setq stack-trace-on-error t\), or \(setq debug-on-error t\) if you
 are familiar with the debugger, to get a lisp back-trace.")
 any lisp back-traces that you may have.
 \(setq stack-trace-on-error t\), or \(setq debug-on-error t\) if you
 are familiar with the debugger, to get a lisp back-trace.")
-      (save-excursion
-       (goto-char (point-max))
-       (insert
-        "\nAdd-on state:\n"
-        "------------\n"
-        (save-window-excursion
-          (save-excursion
-            (riece-command-list-addons)
-            (search-forward "\n\n")
-            (buffer-substring (point-min) (point)))))
-       (when riece-debug
-         (insert "Recent messages from servers:\n"
-                 "--------------------------")
-         (let ((pointer riece-server-process-alist))
-           (while pointer
-             (insert "\n- \"" (car (car pointer)) "\", \n"
-                     (format "%S" (if (equal (car (car pointer)) "")
-                                      riece-server
-                                    (cdr (assoc (car (car pointer))
-                                                riece-server-alist))))
-                     "\n"
-                     (if (process-live-p (cdr (car pointer)))
-                         (save-excursion
-                           (set-buffer (process-buffer (cdr (car pointer))))
-                           (goto-char (point-max))
-                           (beginning-of-line -20)
-                           (buffer-substring (point) (point-max)))
-                       "(closed server)"))
-             (setq pointer (cdr pointer)))))
-       ;; Insert recent keystrokes.
-       (insert "\n\n"
-       "Recent keystrokes:\n-----------------\n\n")
-       (let ((before-keys (point)))
+    (delete-other-windows)
+    (save-excursion
+      (goto-char (point-max))
+      (insert
+       "\nAdd-on state:\n"
+       "------------\n"
+       (save-window-excursion
+        (save-excursion
+          (riece-command-list-addons)
+          (search-forward "\n\n")
+          (buffer-substring (point-min) (point)))))
+      (insert "Recent messages from servers:\n"
+             "--------------------------")
+      (let ((pointer riece-server-process-alist))
+       (while pointer
+         (insert "\n- \"" (car (car pointer)) "\", \n"
+                 (format "%S" (if (equal (car (car pointer)) "")
+                                  riece-server
+                                (cdr (assoc (car (car pointer))
+                                            riece-server-alist))))
+                 "\n"
+                 (if (riece-server-process-opened (cdr (car pointer)))
+                     (save-excursion
+                       (set-buffer (process-buffer (cdr (car pointer))))
+                       (goto-char (point-max))
+                       (beginning-of-line -60)
+                       (buffer-substring (point) (point-max)))
+                   "(closed server)"))
+         (setq pointer (cdr pointer))))
+      (insert "\n\nRecent debug messages:\n"
+             "-----------------------------------\n"
+             (with-current-buffer riece-debug-buffer
+               (buffer-string)))
+      ;; Insert recent keystrokes.
+      (insert "\n\nRecent keystrokes:\n"
+             "-----------------\n\n")
+      (let ((before-keys (point)))
        (insert (key-description recent-keys))
        (save-restriction
          (narrow-to-region before-keys (point))
        (insert (key-description recent-keys))
        (save-restriction
          (narrow-to-region before-keys (point))
@@ -607,10 +650,10 @@ are familiar with the debugger, to get a lisp back-trace.")
          (while (progn (move-to-column 50) (not (eobp)))
            (search-forward " " nil t)
            (insert "\n"))))
          (while (progn (move-to-column 50) (not (eobp)))
            (search-forward " " nil t)
            (insert "\n"))))
-       ;; Insert recent minibuffer messages.
-       (insert "\nRecent messages (most recent first):\n"
-               "-----------------------------------\n"
-               recent-messages)))))
+      ;; Insert recent minibuffer messages.
+      (insert "\n\nRecent messages (most recent first):\n"
+             "-----------------------------------\n"
+             recent-messages))))
 
 (provide 'riece)
 
 
 (provide 'riece)