emacs/sekka.el in sekka-0.9.2 vs emacs/sekka.el in sekka-0.9.3
- old
+ new
@@ -39,10 +39,20 @@
(defcustom sekka-server-url "http://localhost:12929/"
"SekkaサーバーのURLを指定する。"
:type 'string
:group 'sekka)
+(defcustom sekka-server-url-2 ""
+ "SekkaサーバーのURLを指定する。"
+ :type 'string
+ :group 'sekka)
+
+(defcustom sekka-server-url-3 ""
+ "SekkaサーバーのURLを指定する。"
+ :type 'string
+ :group 'sekka)
+
(defcustom sekka-server-timeout 10
"Sekkaサーバーと通信する時のタイムアウトを指定する。(秒数)"
:type 'integer
:group 'sekka)
@@ -122,15 +132,20 @@
:group 'sekka)
(defvar sekka-sticky-shift nil "*Non-nil であれば、Sticky-Shiftを有効にする")
(defvar sekka-mode nil "漢字変換トグル変数")
-(defvar sekka-mode-line-string " Sekka")
+(defun sekka-modeline-string ()
+ ;; 接続先sekka-serverのホスト名を表示する。
+ (format " Sekka[%s]" (if current-sekka-server-url
+ (url-host
+ (url-generic-parse-url current-sekka-server-url))
+ "")))
(defvar sekka-select-mode nil "候補選択モード変数")
(or (assq 'sekka-mode minor-mode-alist)
(setq minor-mode-alist (cons
- '(sekka-mode sekka-mode-line-string)
+ '(sekka-mode (:eval (sekka-modeline-string)))
minor-mode-alist)))
;; ローマ字漢字変換時、対象とするローマ字を設定するための変数
(defvar sekka-skip-chars "a-zA-Z0-9.,@:`\\-+!\\[\\]?;'")
@@ -142,10 +157,12 @@
(setq minor-mode-map-alist
(append (list (cons 'sekka-mode sekka-mode-map)
(cons 'sekka-select-mode sekka-select-mode-map))
minor-mode-map-alist)))
+
+
;;;
;;; hooks
;;;
(defvar sekka-mode-hook nil)
(defvar sekka-select-mode-hook nil)
@@ -170,10 +187,13 @@
(with-current-buffer buffer
(goto-char (point-max))
(insert string)))))
+;;; 現在のsekka-serverの接続先
+(defvar current-sekka-server-url nil)
+
;;; 候補選択モード用
(defvar sekka-history-stack '()) ; 過去に変換した、場所と変換候補の状態を保存しておくスタック
;; データ構造は以下の通り。
;; alistのlistとなる。 alistのキーは、sekka-* というバッファローカル変数のバックアップとなる)
;; 新しいものは先頭に追加され、検索も先頭から行われる。即ち、古い情報も残るがいつかstackのlimitを超えるとあふれて捨てられる。
@@ -251,10 +271,13 @@
;;
;; 初期化
;;
(defun sekka-init ()
(when (not sekka-init)
+ ;; 現在のsekka-serverの接続先
+ (defvar current-sekka-server-url sekka-server-url) ;; 第一候補で初期化しておく。
+
;; ユーザー語彙のロード + サーバーへの登録
(sekka-register-userdict-internal)
;; 初期化完了
(setq sekka-init t)))
@@ -277,21 +300,70 @@
("yomi" . "kanji")
("limit" . 2)
("method" . "normal")
)))
+
;;
+;; 接続先を次候補のsekka-serverに切りかえる
+;;
+(defun sekka-next-sekka-server ()
+ (defun sekka-next-sekka-server-message(str varname)
+ (message (format "If you have %s sekka-server, please set the `%s' variable." str varname))
+ (sit-for 5))
+
+ (cond
+ ((string-equal current-sekka-server-url
+ sekka-server-url)
+ (if (< 0 (length sekka-server-url-2))
+ (setq current-sekka-server-url sekka-server-url-2)
+ (sekka-next-sekka-server-message "second" "sekka-server-url-2")))
+ ((string-equal current-sekka-server-url
+ sekka-server-url-2)
+ (if (< 0 (length sekka-server-url-3))
+ (setq current-sekka-server-url sekka-server-url-3)
+ (sekka-next-sekka-server-message "third" "sekka-server-url-3")))
+ (t
+ (when (< 0 (length sekka-server-url))
+ (setq current-sekka-server-url sekka-server-url)))))
+
+
+;;
;; ローマ字で書かれた文章をSekkaサーバーを使って変換する
;;
;; arg-alistの引数の形式
;; 例:
;; '(
;; ("yomi" . "kanji")
;; ("limit" . 2)
;; ("method" . "normal")
;; )
(defun sekka-rest-request (func-name arg-alist)
+ (defun one-request (func-name arg-alist)
+ (let ((result (sekka-rest-request-sub func-name arg-alist)))
+ (if (or
+ (string-match-p "^curl: [(]6[)] " result) ;; Couldn't resolve host 'aaa.example.com'
+ (string-match-p "^curl: [(]7[)] " result) ;; Couldn't connect to host 'localhost'
+ )
+ (progn
+ (sekka-next-sekka-server)
+ nil)
+ result)))
+
+ (or
+ (one-request func-name arg-alist)
+ (one-request func-name arg-alist)
+ (one-request func-name arg-alist)
+ (concat
+ "Error: All sekka-server are down. "
+ " " sekka-server-url
+ " " sekka-server-url-2
+ " " sekka-server-url-3)))
+
+
+
+(defun sekka-rest-request-sub (func-name arg-alist)
(if sekka-psudo-server
(cond
((string-equal func-name "henkan")
;; クライアント単体で仮想的にサーバーに接続しているようにしてテストするモード
;; result of /henkan
@@ -312,11 +384,11 @@
(concat " --noproxy " sekka-no-proxy-hosts)
"")
(format " --max-time %d " sekka-server-timeout)
" --insecure "
" --header 'Content-Type: application/x-www-form-urlencoded' "
- (format "%s%s " sekka-server-url func-name)
+ (format "%s%s " current-sekka-server-url func-name)
(sekka-construct-curl-argstr (cons
'("format" . "sexp")
arg-alist))
(format "--data 'userid=%s' " sekka-login-name))))
@@ -1550,10 +1622,10 @@
;; input-method として登録する。
(set-language-info "Japanese" 'input-method "japanese-sekka")
(setq default-input-method "japanese-sekka")
(defconst sekka-version
- "0.9.2" ;;SEKKA-VERSION
+ "0.9.3" ;;SEKKA-VERSION
)
(defun sekka-version (&optional arg)
"入力モード変更"
(interactive "P")
(message sekka-version))