Path: utzoo!attcan!uunet!lll-winken!csd4.milw.wisc.edu!uxc!garcon!garcon.cso.uiuc.edu!grunwald From: grunwald@flute.cs.uiuc.edu Newsgroups: comp.emacs Subject: Re: webster mode for GNU Emacs Message-ID: Date: 17 Mar 89 20:45:01 GMT References: <37179@bbn.COM> <28684@sri-unix.SRI.COM> Sender: news@garcon.cso.uiuc.edu Organization: University of Illinois, Urbana-Champaign Lines: 183 In-reply-to: felix@AI.SRI.COM's message of 17 Mar 89 03:12:05 GMT Try this hack of webster.el instead. I've modified it to keep the connection open and be a little more intelligent in determining when a connect has been opened -- the previous version just slept for 2 seconds. Now, once you establish a connection, you'll get very fast response. If the connection closes, you'll have to restart it, but it's fairly invisible (except for the delay). Definitions are kept around in the buffer, and you're always moved to the bottom -- you can delete it using kill-region or whatever. ;; Copyright (C) 1989 Free Software Foundation ;; This file is part of GNU Emacs. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY. No author or distributor ;; accepts responsibility to anyone for the consequences of using it ;; or for whether it serves any particular purpose or works at all, ;; unless he says so in writing. Refer to the GNU Emacs General Public ;; License for full details. ;; Everyone is granted permission to copy, modify and redistribute ;; GNU Emacs, but only under the conditions described in the ;; GNU Emacs General Public License. A copy of this license is ;; supposed to have been given to you along with GNU Emacs so you ;; can know your rights and responsibilities. It should be in a ;; file named COPYING. Among other things, the copyright notice ;; and this notice must be preserved on all copies. ;; ;; Author Jason R. Glasgow (glasgow@cs.yale.edu) ;; Modified from telnet.el by William F. Schelter ;; ;; Modified by Dirk Grunwald to maintain an open connect ;; But almost entirely different ;; ;; To use this, you might want to add this line to your .emacs file: ;; ;; (autoload 'webster "webster" "look up a word in Webster's 7th edition" t) ;; ;; Then just hit M-x webster to look up a word. ;; (defvar webster-host "128.197.2.40" "Host that is a webster server (Boston U). Try also 26.0.0.73, which is sri-nic") (defvar webster-port "103" "The port to connect to. Either 103 or 2627") (defvar webster-request "DEFINE SPELLING ENDINGS" "The type of request to use. Try DEFINE SPELLING ENDINGS") (defvar webster-process nil "The current webster process") (defvar webster-start-delay 1 "Seconds to delay before talking to webster server") (defvar webster-running nil "Used to determine when connection is established") ;;; ;;; Initial filter for ignoring information until successfully connected ;;; (defun webster-initial-filter (proc string) (cond ((not (eq (process-status webster-process) 'run)) (progn (setq webster-running t) (message "webster died"))) ((string-match "No such host" string) (progn (setq webster-running t) (kill-buffer (process-buffer proc)) (error "No such host."))) ((string-match "]" string) (progn (setq webster-running t) (set-process-filter proc 'webster-filter))))) (defun webster-filter (proc string) (let ((closed-message (string-match "Connection closed" string)) (end-def-message (or (string-match "\200" string) (string-match "\0" string)))) (cond ((not (eq (process-status webster-process) 'run)) (message "Webster died")) (closed-message (progn (message "Closing webster connection...") (kill-process proc) (save-excursion (set-buffer (process-buffer proc)) (replace-regexp "Process webster killed" "" nil) (goto-char 1)) (message "Done."))) ((string-match "SPELLING 0" string) (message "Word not found in webster")) ((string-match "SPELLING 1" string) (message "Spelled correctly")) (end-def-message (progn (webster-filter proc (concat (substring string 0 (- end-def-message 1)) "\n\n")) (goto-char (point-max)) (recenter -1))) (t (save-excursion (set-buffer (process-buffer proc)) (goto-char (point-max)) (let ((now (point))) (insert string) (delete-char-in-region now (point) ?\^m ?\ )) (if (process-mark proc) (set-marker (process-mark proc) (point)))))))) ;;; ;;; delete char1 and char2 if it precedes char1 ;;; used to get rid of (defun delete-char-in-region (start end char1 char2) (goto-char start) (while (search-forward (char-to-string char1) end t) (backward-delete-char 1) (if (equal (char-after (- (point) 1)) char2) (backward-delete-char 1)))) (defun webster (arg) "Open a network login connection to a webster host. And look lookup a word using DEFINE WORD. Communication with host is recorded in a buffer *webster*. The process will end after a \200 is sent." (interactive "sLook up word in webster: ") (webster-send-request "DEFINE" arg)) (defun webster-endings (arg) "Call webster looking for endings" (interactive "sFind endings for word in webster: ") (webster-send-request "ENDINGS" arg)) (defun webster-spell (arg) "Call webster looking for endings" (interactive "sTry to spell word in webster: ") (webster-send-request "SPELL" arg)) (defun webster-send-request (kind word) (require 'shell) (let ((name "webster") (webster-command (concat "open " webster-host " " webster-port "\n"))) (cond ((not (eq (get-buffer-window (concat "*" name "*")) nil)) (select-window (get-buffer-window (concat "*" name "*")))) ((one-window-p) (split-window-vertically) (other-window 1))) (if (or (not webster-process) (not (eq (process-status webster-process) 'run))) (progn (message (concat "Attempting to connect to server " webster-host "...")) (switch-to-buffer (make-shell name "telnet")) (setq webster-process (get-process name)) (set-process-filter webster-process 'webster-initial-filter) (process-send-string webster-process webster-command) ; ; wait for feedback before sending query ; (setq webster-running nil) (while (not webster-running) (accept-process-output)))) (process-send-string webster-process (concat kind " " word "\n")))) -- Dirk Grunwald Univ. of Illinois grunwald@flute.cs.uiuc.edu