1 ;;; skk-server.el --- SKK
\e$B%5!<%P!<$N$?$a$N%W%m%0%i%`
\e(B
2 ;; Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
4 ;; Masahiko Sato <masahiko@kuis.kyoto-u.ac.jp>
6 ;; Author: Masahiko Sato <masahiko@kuis.kyoto-u.ac.jp>
7 ;; Maintainer: Mikio Nakajima <minakaji@osaka.email.ne.jp>
8 ;; Version: $Id: skk-server.el,v 1.2 2000-07-10 04:34:01 yoshiki Exp $
10 ;; Last Modified: $Date: 2000-07-10 04:34:01 $
12 ;; This file is part of SKK.
14 ;; SKK is free software; you can redistribute it and/or modify
15 ;; it under the terms of the GNU General Public License as published by
16 ;; the Free Software Foundation; either versions 2, or (at your option)
19 ;; SKK is distributed in the hope that it will be useful
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 ;; GNU General Public License for more details.
24 ;; You should have received a copy of the GNU General Public License
25 ;; along with SKK, see the file COPYING. If not, write to the Free
26 ;; Software Foundation Inc., 59 Temple Place - Suite 330, Boston,
27 ;; MA 02111-1307, USA.
32 (eval-when-compile (require 'skk))
33 (require 'skk-foreword)
36 (defgroup skk-server nil "SKK server related customization."
41 (defcustom skk-server-host (getenv "SKKSERVER")
42 "*SKK
\e$B<-=q%5!<%P!<$rAv$i$;$F$$$k%[%9%HL>!#
\e(B"
46 (defcustom skk-server-prog (getenv "SKKSERV")
47 "*SKK
\e$B<-=q%5!<%P!<%W%m%0%i%`L>!#%U%k%Q%9$G=q$/!#
\e(B"
51 (defcustom skk-server-jisyo (getenv "SKK_JISYO")
52 "*SKK
\e$B<-=q%5!<%P!<%W%m%0%i%`$KEO$9<-=qL>!#%U%k%Q%9$G=q$/!#
\e(B"
56 (defcustom skk-server-portnum nil
57 "*Non-nil
\e$B$G$"$l$P!"$=$NCM$r
\e(B port number
\e$B$H$7$F
\e(B skkserv
\e$B$H
\e(B TCP
\e$B@\B3$9$k!#
\e(B
58 /etc/services
\e$B$rD>@\=q$-49$($k8"8B$,$J$$%f!<%6!<$N$?$a$NJQ?t!#
\e(B"
59 :type '(choice integer (const nil))
62 ;;(defvar skk-server-debug nil
63 ;; "*Non-nil
\e$B$G$"$l$P!"<-=q%5!<%P!<%W%m%0%i%`$r%G%#%P%C%0%b!<%I$G5/F0$9$k!#
\e(B
64 ;;
\e$B%G%#%P%C%0!&%b!<%I$G
\e(B skkserv
\e$B$rAv$i$;$k$H!"$=$N$^$^
\e(B foreground
\e$B$GAv$j!"%a%C%;!<
\e(B
65 ;;
\e$B%8$r=PNO$9$k!#%-!<%\!<%I$+$i3d$j$3$_$r$+$1$k$3$H$b$G$-$k!#
\e(B" )
67 (defcustom skk-servers-list nil
68 "*
\e$B<-=q%5!<%P!<Kh$N>pJs%j%9%H!#
\e(B
70 \e$BJ#?t$N%[%9%H$GF0$$$F$$$k%5!<%P$K%"%/%;%9$G$-$k>l9g$K$O!"0J2<$N$h$&$K%j%9%H$N
\e(B
71 \e$B3FMWAG$K=g$K%[%9%HL>!"%U%k%Q%9$G$N
\e(B SKK
\e$B%5!<%P!<L>!"
\e(BSKK
\e$B%5!<%P!<$KEO$9<-=qL>!"
\e(B
72 SKK
\e$B%5!<%P!<$,;HMQ$9$k%]!<%HHV9f$r=q$-!"@_Dj$r$9$k$3$H$,$G$-$k!#
\e(B
74 \(setq skk-servers-list
75 '\(\(\"host1\" \"/path/to/skkserv\" \"/path/to/SKK-JISYO.L\" 1178\)
76 \(\"host2\" \"/path/to/skkserv\"\) \)\)
78 \e$B$3$N>l9g!":G=i$K;XDj$7$?%5!<%P$K%"%/%;%9$G$-$J$/$J$k$H!"<+F0E*$K=g<!%j%9%H$K$"
\e(B
79 \e$B$k;D$j$N%5!<%P$K%"%/%;%9$9$k$h$&$K$J$k!#
\e(B
80 \e$B%5!<%P!<$N%G%#%U%)%k%H$N<-=q$*$h$S%]!<%HHV9f$r;HMQ$9$k>l9g$O
\e(B nil
\e$B$r;XDj$9$k$+!"
\e(B
81 \e$B2?$b=q$+$J$$$GNI$$!#
\e(B
83 \e$B$J$*!"%f!<%6!<<+?H$K<B9T8"8B$N$J$$%5!<%P!<$r;XDj$9$k>l9g$O!"
\e(B
85 \(setq skk-servers-list '\(\(\"host1\"\) \(\"host2\"\)\)\)
87 \e$B$N$h$&$K!"%[%9%HL>$@$1$r=q$/$3$H$,$G$-$k!#>e5-$N@_DjNc$G$O!"
\e(Bhost1, host2
\e$B$K$*
\e(B
88 \e$B$1$k
\e(B skkserv
\e$B%5!<%S%9$N
\e(B TCP
\e$B@\B3$N3+;O$N$_;n$_!"%5!<%P!<$N5/F0$O;n$_$J$$!#
\e(B"
90 (list (string :tag "Hostname")
91 (choice :tag "Server" file (const nil))
92 (choice :tag "Dictionary" file (const nil))
93 (choice :tag "Port number" integer (const nil)) ))
96 (defcustom skk-server-report-response nil
97 "*Non-nil
\e$B$G$"$l$P!"JQ49;~%5!<%P!<$NAw=P$9$kJ8;z$r<u$1<h$k$^$G$K
\e(B accept-process-output
\e$B$r2?2s<B9T$7$?$+$rJs9p$9$k!#
\e(B"
101 (defcustom skk-server-remote-shell-program
102 (or (getenv "REMOTESHELL")
103 (and (boundp 'remote-shell-program) remote-shell-program)
105 ((eq system-type 'berkeley-unix)
106 (if (file-exists-p "/usr/ucb/rsh") "/usr/ucb/rsh" "/usr/bin/rsh") )
107 ((eq system-type 'usg-unix-v)
108 (if (file-exists-p "/usr/ucb/remsh") "/usr/ucb/remsh" "/bin/rsh"))
109 ((eq system-type 'hpux) "/usr/bin/remsh")
110 ((eq system-type 'EWS-UX/V) "/usr/ucb/remsh")
111 ((eq system-type 'pcux) "/usr/bin/rcmd")
113 "*
\e$B%j%b!<%H%7%'%k$N%W%m%0%i%`L>!#
\e(B"
117 (defcustom skk-server-load-hook nil
118 "*skk-server.el
\e$B$r%m!<%I$7$?8e$K%3!<%k$5$l$k%U%C%/!#
\e(B"
122 ;; internal constants and variables.
123 (defconst skk-network-open-status 'open)
124 (defconst skkserv-working-buffer " *skkserv*")
125 (defvar skkserv-process nil)
127 (defun skk-server-version ()
130 (message (skk-server-version))
132 (if (not (or skk-server-host skk-servers-list))
133 (skk-error "Lack of host information of SKK server"
134 "SKK
\e$B%5!<%P!<$N%[%9%H>pJs$,$"$j$^$;$s
\e(B" ))
135 (setq status (process-status "skkservd"))
136 (or (eq status skk-network-open-status) (setq status (skk-open-server)))
137 (if (eq status skk-network-open-status)
140 (with-current-buffer skkserv-working-buffer
142 ;;
\e$B%5!<%P!<%P!<%8%g%s$rF@$k!#
\e(B
143 (process-send-string "skkservd" "2")
144 (while (eq (buffer-size) 0)
145 (accept-process-output) )
146 (setq v (buffer-string))
148 ;;
\e$B%[%9%HL>$rF@$k!#
\e(B
149 (process-send-string "skkservd" "3")
150 (while (eq (buffer-size) 0)
151 (accept-process-output) )
152 (goto-char (point-min))
154 (concat "SKK SERVER version %s"
155 (if skk-japanese-message-and-error
156 "(
\e$B%[%9%HL>
\e(B %s)"
157 "running on HOST %s" ))
158 v (prog1 (buffer-string) (erase-buffer)) ))))))))
160 (defun skk-search-server (file limit &optional nomsg)
161 ;; SKK
\e$B<-=q%U%)!<%^%C%H$N
\e(B FILE
\e$B$G
\e(B SKK
\e$B%5!<%P!<$r;HMQ$7$F
\e(B skk-henkan-key
\e$B$r%-!<
\e(B
162 ;;
\e$B$K$7$F8!:w$r9T$&!#
\e(B
163 ;; SKK
\e$B%5!<%P!<$,;HMQ$G$-$J$$$H$-$O!"
\e(BFILE
\e$B$r%P%C%U%!$KFI$_9~$s$G%5!<%A$r9T
\e(B
165 ;; LIMIT
\e$B$H
\e(B NOMSG
\e$B$O
\e(B SKK
\e$B%5!<%P!<$r;HMQ$7$J$$$H$-$N$_;H$&!#
\e(B
166 ;;
\e$B8!:w%j!<%8%g%s$,
\e(B LIMIT
\e$B0J2<$K$J$k$^$G%P%$%J%j%5!<%A$r9T$$!"$=$N8e%j%K%"
\e(B
167 ;;
\e$B%5!<%A$r9T$&!#
\e(B
168 ;; LIMIT
\e$B$,
\e(B 0
\e$B$G$"$l$P!"%j%K%"%5!<%A$N$_$r9T$&!#
\e(B
169 ;;
\e$B<-=q$,%=!<%H$5$l$F$$$J$$$N$G$"$l$P!"
\e(BLIMIT
\e$B$r
\e(B 0
\e$B$9$kI,MW$,$"$k!#
\e(B
170 ;;
\e$B%*%W%7%g%J%k0z?t$N
\e(B NOMSG
\e$B$,
\e(B non-nil
\e$B$G$"$l$P
\e(B skk-get-jisyo-buffer
\e$B$N%a%C
\e(B
171 ;;
\e$B%;!<%8$r=PNO$7$J$$$h$&$K$9$k!#
\e(B
172 (if (or skk-server-host skk-servers-list)
173 (skk-search-server-subr file limit)
174 (skk-search-jisyo-file file limit nomsg) ))
176 (defun skk-search-server-subr (file limit)
177 ;; skk-search-server
\e$B$N%5%V%k!<%A%s!#
\e(B
179 (if skk-use-numeric-conversion
180 (skk-num-compute-henkan-key skk-henkan-key)
182 ;;
\e$B%P%C%U%!%m!<%+%kCM$N<u$1EO$7$N$?$a!"JLL>$N0l;~JQ?t$K<h$k!#
\e(B
183 (okurigana (or skk-henkan-okurigana skk-okuri-char))
184 (status (process-status "skkservd")) )
185 (or (eq status skk-network-open-status) (setq status (skk-open-server)))
186 (if (eq status skk-network-open-status)
187 (with-current-buffer skkserv-working-buffer
188 (let ((cont t) (count 0)
191 (process-send-string "skkservd" (concat "1" key " "))
192 (while (and cont (eq (process-status "skkservd")
193 skk-network-open-status ))
194 (accept-process-output)
195 (setq count (1+ count))
196 (if (> (buffer-size) 0)
197 (if (eq (char-after 1) ?1) ;?1
198 ;; found key successfully, so check if a whole line
200 (if (eq (char-after (1- (point-max))) ?\n) ;?\n
202 ;; not found or error, so exit
204 (goto-char (point-min))
205 (if skk-server-report-response
206 (skk-message "%d
\e$B2s
\e(B SKK
\e$B%5!<%P!<$N1~EzBT$A$r$7$^$7$?
\e(B"
207 "Waited for server response %d times" count ))
208 (if (eq (following-char) ?1) ;?1
211 (setq l (skk-compute-henkan-lists okurigana))
213 (cond ((and okurigana skk-henkan-okuri-strictly)
214 ;;
\e$BAw$j2>L>$,F10l$N%(%s%H%j$N$_$rJV$9!#
\e(B
216 ((and okurigana skk-henkan-strict-okuri-precedence)
217 (skk-nunion (nth 2 l) (car l)) )
219 ;; server is not active, so search file instead
220 (skk-search-jisyo-file file limit) )))
222 (defun skk-open-server ()
223 ;; SKK
\e$B%5!<%P!<$H@\B3$9$k!#%5!<%P!<%W%m%;%9$N
\e(B status
\e$B$rJV$9!#
\e(B
224 (let (status code proc)
225 (if (or (skk-open-network-stream) (skk-open-server-1))
227 (setq status (process-status "skkservd"))
228 (if (eq status skk-network-open-status)
230 (setq code (cdr (assoc "euc" skk-coding-system-alist))
231 proc (get-process "skkservd") )
232 (cond ((eq skk-emacs-type 'xemacs)
233 (set-process-input-coding-system proc code)
234 (set-process-output-coding-system proc code) )
236 (set-process-coding-system proc code code) ))))))
239 (defun skk-open-server-1 ()
240 ;; skk-open-server
\e$B$N%5%V%k!<%A%s!#
\e(B
241 ;; skkserv
\e$B%5!<%S%9$r%*!<%W%s$G$-$?$i
\e(B t
\e$B$rJV$9!#
\e(B
242 ;; skkserv
\e$B$O0z?t$K<-=q$,;XDj$5$l$F$$$J$1$l$P!"
\e(BDEFAULT_JISYO
\e$B$r;2>H$9$k!#
\e(B
243 (if (null skk-servers-list)
245 ;; Emacs
\e$B5/F08e$K4D6-JQ?t$r@_Dj$7$?>l9g!#
\e(B
246 (if (not skk-server-host)
247 (setq skk-server-host (getenv "SKKSERVER")) )
248 (if (not skk-server-prog)
249 (setq skk-server-prog (getenv "SKKSERV")) )
250 (if (not skk-server-jisyo)
251 (setq skk-server-jisyo (getenv "SKK_JISYO")) )
253 (setq skk-servers-list (list (list skk-server-host
256 skk-server-portnum )))
257 (setq skk-server-prog nil) )))
258 (while (and (not (eq (process-status "skkservd") skk-network-open-status))
260 (let ((elt (car skk-servers-list))
262 (setq skk-server-host (car elt)
263 skk-server-prog (nth 1 elt)
264 skk-server-jisyo (nth 2 elt)
265 skk-server-portnum (nth 3 elt)
266 skk-servers-list (cdr skk-servers-list) )
267 ;; skkserv
\e$B$N5/F0%*%W%7%g%s$O2<5-$NDL$j!#
\e(B
268 ;; skkserv [-d] [-p NNNN] [JISHO]
269 ;; `-d'
\e$B%G%#%P%C%0!&%b!<%I
\e(B
270 ;; `-p NNNN'
\e$BDL?.MQ$N%]!<%HHV9f$H$7$F
\e(BNNNN
\e$B$r;H$&
\e(B.
271 ;; `~/JISYO' ~/JISYO
\e$B$r<-=q$H$7$FMxMQ
\e(B.
273 (setq arg (list skk-server-jisyo))
274 ;; skkserv
\e$B$O0z?t$K<-=q$,;XDj$5$l$F$$$J$1$l$P!"
\e(BDEFAULT_JISYO
\e$B$r
\e(B
275 ;;
\e$B;2>H$9$k!#
\e(B
277 ;;(if skk-server-debug
278 ;; (setq arg (cons "-d" arg)) )
279 (if (and skk-server-portnum (not (= skk-server-portnum 1178)))
281 (nconc (list "-p" (number-to-string skk-server-portnum)) arg) ))
282 (if (and skk-server-host (not (skk-open-network-stream))
284 ;; skk-startup-server
\e$B$G%5!<%P!<$r5/F0$9$k$K$O!"
\e(Bskk-server-host
\e$B$H
\e(B
285 ;; skk-server-prog
\e$B$,@_Dj$5$l$F$$$k$3$H$,I,MW!#
\e(B
286 (skk-startup-server arg) )))
287 (if (not (eq (process-status "skkservd") skk-network-open-status))
288 ;; reset SKK-SERVER-HOST so as not to use server in this session
289 (setq skk-server-host nil
291 skk-servers-list nil )
294 (defun skk-open-network-stream ()
295 ;; skk-server-host
\e$B$K$*$1$k
\e(B skkserv
\e$B%5!<%S%9$N
\e(B TCP
\e$B@\B3$r%*!<%W%s$7!"%W%m%;
\e(B
296 ;;
\e$B%9$rJV$9!#
\e(B
299 (setq skkserv-process
300 (open-network-stream "skkservd" skkserv-working-buffer
302 (or skk-server-portnum "skkserv") ))
303 (process-kill-without-query skkserv-process) )
306 (defun skk-startup-server (arg)
307 ;; skkserv
\e$B$r5/F0$G$-$?$i
\e(B t
\e$B$rJV$9!#
\e(B
309 ;;(msgbuff (get-buffer-create " *skkserv-msg*"))
313 "%s
\e$B$N
\e(B SKK
\e$B%5!<%P!<$,5/F0$7$F$$$^$;$s!#5/F0$7$^$9
\e(B%s"
314 "SKK SERVER on %s is not active, I will activate it%s"
315 skk-server-host (make-string count ?.) )
316 (if (or (string= skk-server-host (system-name))
317 (string= skk-server-host "localhost"))
318 ;; server host is local machine
319 (apply 'call-process skk-server-prog nil
323 skk-server-remote-shell-program nil
324 ;; 0
\e$B$K$7$F%5%V%W%m%;%9$N=*N;$rBT$C$F$O$$$1$J$$M}M3$,$"$k!)
\e(B
325 ;;
\e$B$J$1$l$P
\e(B msgbuf
\e$B$K%(%i!<=PNO$r<h$C$?J}$,7z@_E*$G$O!)
\e(B
\e$B$^$?$=
\e(B
326 ;;
\e$B$N>l9g$O$3$N
\e(B while
\e$B%k!<%W<+?H$,$$$i$J$$!)
\e(B
328 0 nil skk-server-host skk-server-prog arg ))
330 (if (and (skk-open-network-stream)
331 (eq (process-status "skkservd") skk-network-open-status) )
333 (setq count (1- count)) ))
334 (if (eq (process-status "skkservd") skk-network-open-status)
336 (skk-message "
\e$B%[%9%H
\e(B %s
\e$B$N
\e(B SKK
\e$B%5!<%P!<$,5/F0$7$^$7$?
\e(B"
337 "SKK SERVER on %s is active now"
339 (sit-for 1) ; return t
340 t ) ;
\e$B$G$bG0$N$?$a
\e(B
341 (skk-message "%s
\e$B$N
\e(B SKK
\e$B%5!<%P!<$r5/F0$9$k$3$H$,$G$-$^$;$s$G$7$?
\e(B"
342 "Could not activate SKK SERVER on %s"
346 nil ))) ;
\e$B$G$bG0$N$?$a
\e(B
349 (defun skk-adjust-search-prog-list-for-server-search (&optional non-del)
350 ;; skk-server-host
\e$B$b$7$/$O
\e(B skk-servers-list
\e$B$,
\e(B nil
\e$B$G$"$l$P!"
\e(B
351 ;; skk-search-prog-list
\e$B$+$i
\e(B skk-search-server
\e$B$r
\e(B car
\e$B$K;}$D%j%9%H$r>C$9!#
\e(B
352 ;; non-nil
\e$B$G$"$l$P!"2C$($k!#
\e(B
353 (if (or skk-server-host skk-servers-list)
354 (if (null (assq 'skk-search-server skk-search-prog-list))
355 ;; skk-search-prog-list
\e$B$,
\e(B nil
\e$B$H$$$&$3$H$O$^$:$J$$$@$m$&$,!"G0$N$?
\e(B
356 ;;
\e$B$a!"
\e(Bsetq
\e$B$7$F$*$/!#
\e(B
357 (setq skk-search-prog-list
358 ;;
\e$BKvHx$KIU$1$k!#KvHx$K$O
\e(B (skk-okuri-search)
\e$B$r;}$C$F$-$?$$?M
\e(B
359 ;;
\e$B$b$$$k$+$b!#%*%W%7%g%s$GIU$1$k>l=j$rJQ99$9$k$h$&$K$7$?J}$,
\e(B
361 (nconc skk-search-prog-list
363 '(skk-search-server skk-aux-large-jisyo 10000) ))))
365 (remove-alist 'skk-search-prog-list 'skk-search-server) )))
367 (defun skk-disconnect-server ()
368 ;;
\e$B%5!<%P!<$r@Z$jN%$9!#
\e(B
369 (if (and skk-server-host
370 (eq (process-status "skkservd") skk-network-open-status) )
372 (process-send-string "skkservd" "0") ; disconnect server
373 (accept-process-output (get-process "skkservd")) )))
375 ;;(add-hook 'skk-mode-hook 'skk-adjust-search-prog-list-for-server-search)
376 (add-hook 'skk-before-kill-emacs-hook 'skk-disconnect-server)
378 (run-hooks 'skk-server-load-hook)
380 (provide 'skk-server)
381 ;;; skk-server.el ends here