emacs/sekka.el in sekka-0.9.0 vs emacs/sekka.el in sekka-0.9.1

- old
+ new

@@ -728,12 +728,14 @@ (define-key map [f1] 'popup-help) (define-key map (kbd "\C-?") 'popup-help) (define-key map "\C-s" 'popup-isearch) (define-key map "\C-g" 'popup-close) + (define-key map "\C-r" 'popup-select) map)) + ;; 選択操作回数のインクリメント (defun sekka-select-operation-inc () (incf sekka-select-operation-times) (when (< 3 sekka-select-operation-times) (sekka-select-operation-reset) @@ -854,20 +856,21 @@ (push x lst)))) sekka-henkan-kouho-list) (sekka-debug-print (format "filtered-lst = %S\n" (reverse lst))) (if (null lst) nil - (car (reverse lst))))) + (reverse lst)))) + ;; 指定された type の候補が存在するか調べる (defun sekka-include-typep ( _type ) (sekka-select-by-type-filter _type)) ;; 指定された type の候補に強制的に切りかえる ;; 切りかえが成功したかどうかを t or nil で返す。 (defun sekka-select-by-type ( _type ) - (let ((kouho (sekka-select-by-type-filter _type))) + (let ((kouho (car (sekka-select-by-type-filter _type)))) (if (not kouho) (progn (cond ((eq _type 'j) (message "Sekka: 漢字の候補はありません。")) @@ -924,19 +927,20 @@ ;; UNDO再開 (sekka-enable-undo)) ;; 登録語リストからユーザーに該当単語を選択してもらう -(defun sekka-add-new-word-sub (yomi lst) +(defun sekka-add-new-word-sub (yomi lst hiragana-lst) (let* ((etc "(自分で入力する)") (lst (if (stringp lst) (progn (message lst) ;; サーバーから返ってきたエラーメッセージを表示 '()) lst)) (result (popup-menu* - (append lst `(,etc)) + (append hiragana-lst + (append lst `(,etc))) :margin t :keymap sekka-popup-menu-keymap)) (b (copy-marker sekka-fence-start)) (e (copy-marker sekka-fence-end))) (let ((tango @@ -946,10 +950,15 @@ result))) ;; 新しい単語で確定する (sekka-replace-kakutei-word (marker-position b) (marker-position e) tango) + + (when (member result hiragana-lst) ;; 平仮名フレーズの場合 + (setq yomi result) + (setq tango "")) + ;; .sekka-jisyoとサーバーの両方に新しい単語を登録する (let ((added (sekka-add-new-word-to-jisyo sekka-jisyo-filename yomi tango))) (if added (progn (sekka-register-userdict-internal t) @@ -959,19 +968,44 @@ (defun sekka-add-new-word () "変換候補のよみ(平仮名)に対応する新しい単語を追加する" (interactive) (setq case-fold-search nil) - (when (sekka-select-by-type 'h) + (let ((type + (cond + ((string-match-p "^[A-Z][^A-Z]+$" sekka-last-roman) + (if (sekka-select-by-type 'h) ;; 平仮名候補に自動切り替え + 'H + nil)) + ((string-match-p "^[a-z][^A-Z]+$" sekka-last-roman) + 'h) + (t + nil)))) (let* ((kouho (nth sekka-cand-cur sekka-henkan-kouho-list)) (hiragana (car kouho))) (sekka-debug-print (format "sekka-register-new-word: sekka-last-roman=[%s] hiragana=%s result=%S\n" sekka-last-roman hiragana (string-match-p "^[A-Z][^A-Z]+$" sekka-last-roman))) - (when (string-match-p "^[A-Z][^A-Z]+$" sekka-last-roman) + (cond + ;; 漢字語彙をgoogleimeで取得 + ((eq 'H type) (sekka-select-kakutei) (sekka-add-new-word-sub hiragana - (sekka-googleime-request hiragana)))))) + (sekka-googleime-request hiragana) + '())) + ;; 平仮名フレーズから選択 + ((eq 'h type) + (sekka-select-kakutei) + (let ((kouho (sekka-select-by-type-filter 'h))) + (sekka-debug-print (format "sekka-register-new-word: kouho=%S\n" kouho)) + (sekka-add-new-word-sub + hiragana + '() + (cons + hiragana ;; 確定値の平仮名文言を先頭に追加。 + (mapcar + (lambda (x) (car x)) kouho)))))) + ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 変換履歴操作関数 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1143,15 +1177,20 @@ (goto-char b) (insert (sekka-get-display-string)) (setq e (point)) (sekka-display-function b e nil) (sekka-select-kakutei) - (when sekka-use-googleime - (when (not (sekka-include-typep 'j)) - (sekka-add-new-word))) - ))))) - + (cond + ((string-match-p "^[A-Z][^A-Z]+$" sekka-last-roman) + ;; 漢字語彙 + (when sekka-use-googleime + (if (not (sekka-include-typep 'j)) + (sekka-add-new-word)))) + (t + ;; 平仮名フレーズはGoogleIMEの問い合わせの自動起動はしない + ))))))) + ((sekka-kanji (preceding-char)) (sekka-debug-print (format "sekka-kanji(%s) => t\n" (preceding-char))) ;; カーソル直前が 全角で漢字以外 だったら候補選択モードに移行する。 ;; また、最後に確定した文字列と同じかどうかも確認する。 @@ -1293,32 +1332,33 @@ nil)))) sticky-list) (define-key sticky-map sticky-key '(lambda ()(interactive)(insert sticky-key)))) +(defun sekka-insert-space (times) + (if (null times) + (insert " ") + (dotimes(i times) + (insert " ")))) + (defun sekka-spacekey-init-function () (define-key global-map (kbd "SPC") '(lambda (&optional arg)(interactive "P") (cond ((and (< 0 sekka-timer-rest) sekka-kakutei-with-spacekey) (cond ((string= " " (char-to-string (preceding-char))) - (insert " ")) + (sekka-insert-space arg)) ((eq 10 (preceding-char)) ;; 直前に改行があった - (insert " ")) + (sekka-insert-space arg)) ((string= "/" (char-to-string (preceding-char))) (delete-region (- (point) 1) (point)) - (insert " ")) + (sekka-insert-space arg)) (t (sekka-rK-trans)))) (t - (cond - ((null arg) - (insert " ")) - (t - (dotimes(i arg) - (insert " "))))))))) + (sekka-insert-space arg)))))) (defun sekka-realtime-guide () "リアルタイムで変換中のガイドを出す sekka-modeがONの間中呼び出される可能性がある。" @@ -1488,10 +1528,10 @@ ;; input-method として登録する。 (set-language-info "Japanese" 'input-method "japanese-sekka") (setq default-input-method "japanese-sekka") (defconst sekka-version - "0.9.0" ;;SEKKA-VERSION + "0.9.1" ;;SEKKA-VERSION ) (defun sekka-version (&optional arg) "入力モード変更" (interactive "P") (message sekka-version))