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