[prime-dev: 418] uim-prime の backspace

Back to archive index

Masaki Yatsu yatsu****@yatsu*****
2004年 8月 5日 (木) 12:56:30 JST


谷津です。

uim-primeで文字入力中にbackspaceを押したときに、ひらがな1文字が削除
されるようにできないかと試してみました。

~/.uimまたはprime.scmで以下のようにします。

(define prime-command-preedit-backspace
  (lambda (context key key-state)
    (let* ((sc (context-data context))
           (preedit-char-list (string-to-list
                               (prime-preedit-get-string-label sc))))
      (letrec ((delete-backward
                (lambda (char-list goal-char-list)
                  (cond
                   ((= (length goal-char-list) 0)
                    (prime-context-set-left-string! sc '()))
                   ((= (length char-list) (length goal-char-list))
                    (cond
                     ((equal? (car char-list) (car goal-char-list)) ())
                     ((and (equal? (car char-list) "n")
                           (equal? (car goal-char-list) "ん"))
                      (prime-context-set-left-string!
                       sc (cons "n" (prime-context-left-string sc))))
                     (else
                      (delete-backward char-list (cdr goal-char-list)))))
                   (else
                    (begin
                      (prime-context-set-left-string!
                       sc (cdr (prime-context-left-string sc)))
                      (delete-backward
                       (string-to-list (prime-preedit-get-string-label sc))
                       goal-char-list)))))))
        (delete-backward preedit-char-list (cdr preedit-char-list)))
      (prime-context-set-candidate-window! sc #f) ;FIXME:very dirty hack
      )))

プリエディットのキー入力を1つ消すごとにPRIMEのget_labelを呼んでいる
ので効率は悪いですが、一応動いてます。
"n"1文字で「ん」になった場合だけ特別な対応をしています。

ただし、これだけだと"nngh"と打ってからbackspaceでハングしてしまいます。

get_label   nng
の結果は「んg」ですが、
get_label   nngh
の結果は「nngh」となり、比較ができないためです。

これを回避するためには、prime-japanese.rbの以下の箇所

  def PrimeTypeConv::convert(string)
    suikyo = PrimeTypeConv::initialize_suikyo()
    (conversion, pending, node) = suikyo.convert_internal(string)

    if PRIME_ENV['typing_method'] == 'romaji' or
        PRIME_ENV['typing_method'] == nil then
      if conversion =~ /[a-zA-Z]/ then
        return [string]
      elsif string =~ /^[0-9+-][0-9,.+-]*/ then

の return [string] の行をコメントにします。
こうすると、
get_label   nngh
の結果が「んgh」になるので、正常に文字を削除できます。

自分にとっては、これでかなり使いやすくなったのですが、uim-primeと
PRIME(特にget_label)の仕様変更はポリシーに反しているような気がする
ので、変更でもボツでも、ご自由にご判断お願いします。

---
谷津真樹 (Masaki Yatsu)
mailto:yatsu****@yatsu*****





Prime-dev メーリングリストの案内
Back to archive index