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))