* liece-handle.el (liece-handle-kill-message): Call
[elisp/liece.git] / lisp / liece.el
index e798957..d9fa3ae 100644 (file)
     "Mapping from keywords to default values.
 All keywords that can be used must be listed here."))
 
-(defadvice save-buffers-kill-emacs
-  (before liece-save-buffers-kill-emacs activate)
-  "Prompt user to quit IRC explicitly."
-  (run-hooks 'liece-before-kill-emacs-hook) )
-
-(add-hook 'liece-before-kill-emacs-hook 'liece-command-quit)
+(add-hook 'kill-emacs-hook 'liece-command-quit)
 
 (defvar liece-tmp-server-name nil "Temporaly server name.")
 (defvar liece-buffer-last-check-time nil)
@@ -202,7 +197,6 @@ If optional argument SAFE is nil, overwrite previous definitions."
     "/" liece-command-generic
     ">" end-of-buffer
     "<" beginning-of-buffer
-    "!" liece-command-exec
     "|" liece-command-show-last-kill
     "a" liece-command-away
     "b" liece-command-submit-bug-report
@@ -230,8 +224,6 @@ If optional argument SAFE is nil, overwrite previous definitions."
     "t" liece-command-topic
     "T" liece-command-timestamp
     "\C-t" liece-command-find-timestamp
-    "u" liece-command-lusers
-    "U" liece-command-userhost
     "v" liece-command-browse-url
     "w" liece-command-who)
 
@@ -266,11 +258,7 @@ If optional argument SAFE is nil, overwrite previous definitions."
     "\r" liece-command-enter-message
     [tab] liece-command-complete
     [(meta control c) >] liece-command-push
-    [(meta control c) <] liece-command-pop
-    [(meta control c) o] liece-command-mode+o
-    [(meta control c) O] liece-command-mode-o
-    [(meta control c) v] liece-command-mode+v
-    [(meta control c) V] liece-command-mode-v)
+    [(meta control c) <] liece-command-pop)
 
   (liece-define-keys (liece-command-map "\C-c" liece-command-mode-map)
     "\177" liece-command-scroll-down
@@ -281,8 +269,6 @@ If optional argument SAFE is nil, overwrite previous definitions."
     ">" liece-command-next-channel
     "<" liece-command-previous-channel
     "a" liece-command-away
-    "c" liece-command-inline
-    "\C-a" liece-command-previous-channel
     "\C-f" liece-command-freeze
     "\C-j" liece-command-next-channel
     "\C-n" liece-command-names
@@ -291,7 +277,7 @@ If optional argument SAFE is nil, overwrite previous definitions."
     "L" liece-command-load-vars
     "M" liece-command-own-freeze
     "\C-m" liece-command-modec
-    "o" liece-command-mode+o
+    "o" liece-command-set-operators
     "O" liece-command-toggle-nick-buffer-mode
     "\C-o" liece-command-toggle-channel-buffer-mode
     "\C-p" liece-command-part
@@ -299,16 +285,14 @@ If optional argument SAFE is nil, overwrite previous definitions."
     "\C-r" mule-caesar-region
     "s" liece-command-set-window-style
     "S" liece-command-save-vars
-    "v" liece-command-mode+v
+    "v" liece-command-set-voices
     "\C-v" liece-command-browse-url
     "\C-y" liece-command-yank-send)
   (set-keymap-parent liece-command-map liece-dialogue-mode-map)
 
   (liece-define-keys liece-nick-mode-map
-    "o" liece-command-mode+o
-    "O" liece-command-mode-o
-    "v" liece-command-mode+v
-    "V" liece-command-mode-v
+    "o" liece-command-set-operators
+    "v" liece-command-set-voices
     "f" liece-command-finger
     " " liece-command-nick-scroll-up
     "\177" liece-command-nick-scroll-down
@@ -346,13 +330,13 @@ is running on."
   (unless (listp liece-server)
     (let ((entry (assoc liece-server liece-server-alist)))
       (if entry
-         (setq liece-server (cdr entry)))
-      (setq liece-server
-           (let ((plist (liece-server-parse-string liece-server)))
-             (unless entry
-               (set-alist 'liece-server-alist liece-server plist)
-               (setq liece-save-variables-are-dirty t))
-             plist))))
+         (if (listp (cdr entry))
+             (setq liece-server (cdr entry))
+           (setq liece-server (liece-server-parse-string (cdr entry))))
+       (let ((plist (liece-server-parse-string liece-server)))
+         (set-alist 'liece-server-alist liece-server plist)
+         (setq liece-save-variables-are-dirty t)
+         (setq liece-server plist)))))
   (when (or (and confirm liece-ask-for-nickname)
            (null liece-nickname))
     (setq liece-nickname (read-string (_ "Enter your nickname: ") liece-nickname)))
@@ -372,7 +356,7 @@ is running on."
        liece-server nil))
 
 ;;;###liece-autoload
-(defun liece-close-server (&optional quit-string)
+(defun liece-close-server ()
   "Close chat server."
   (unwind-protect
       (progn
@@ -381,12 +365,17 @@ is running on."
                   (eq 'liece-sentinel
                       (process-sentinel liece-server-process)))
          (set-process-sentinel liece-server-process nil))
-       ;; We cannot send QUIT command unless the process is running.
-       (when (liece-server-opened)
-         (if quit-string
-             (liece-send "QUIT :%s" quit-string)
-           (liece-send "QUIT"))))
-    (liece-close-server-internal)))
+       (if (liece-server-opened)
+           (liece-command-quit)))
+    (liece-close-server-internal)
+    ;; Save settings to the `~/.liece/init.el' file.
+    (if liece-save-variables-are-dirty
+       (liece-command-save-vars))
+    ;; Reset everything.
+    (liece-clear-system)
+    (liece-window-configuration-pop)
+    ;; Allow the user to do things after cleaning up.
+    (run-hooks 'liece-exit-hook)))
 
 (defmacro liece-server-keyword-bind (plist &rest body)
   "Return a `let' form that binds all variables in PLIST.
@@ -444,7 +433,7 @@ If optional argument SERVICE is non-nil, open by the service name."
     (if (and (memq type '(rlogin telnet)) relay)
        (setq liece-tcp-relay-host relay))
     (setq liece-tmp-server-name host)
-    (liece-open-server-internal host service type)
+    (setq liece-server-process (liece-open-server-internal host service type))
     (setq liece-after-registration nil)
     (liece-maybe-poll)
     (if (null (liece-wait-for-response "^:[^ ]+ [4P][5O][1N][ G]"))
@@ -481,29 +470,20 @@ If optional argument SERVICE is non-nil, open by the service name."
 (defun liece-open-server-internal (host &optional service type)
   "Open connection to chat server on HOST by SERVICE (default is irc).
 Optional argument TYPE specifies connection types such as `program'."
-  ;; canonicalize host representation
-  (unless (string-match "^[^\\[]" host)
-    (setq host (substring host 1 (1- (length host)))))
-  (condition-case error
-      (save-excursion
-       (let ((liece-tcp-connection-type type))
-         (as-binary-process
-          (setq liece-server-process
-                (liece-open-network-stream
-                 "IRC" " *IRC*" host (or service "irc"))))
-         (setq liece-server-buffer (process-buffer liece-server-process))
-         (set-buffer liece-server-buffer)
-         (set-buffer-multibyte nil)
-         (kill-all-local-variables)
-         (buffer-disable-undo)
-         (erase-buffer)
-         (setq liece-server-name host)
-         (run-hooks 'liece-server-hook)
-         ;; return the server process
-         liece-server-process))
-    (error
-     (setq liece-status-message-string (cadr error)
-          liece-server-process nil))))
+  (let ((liece-tcp-connection-type type)
+       process)
+    (as-binary-process
+     (setq process
+          (liece-open-network-stream
+           "IRC" " *IRC*" host (or service "irc"))))
+    (setq liece-server-buffer (process-buffer process))
+    (save-excursion
+      (set-buffer liece-server-buffer)
+      (set-buffer-multibyte nil)
+      (kill-all-local-variables)
+      (buffer-disable-undo)
+      (erase-buffer))
+    process))
 
 (defun liece-initialize-timers ()
   "Initialise internal timers."