YamaKen
yamak****@bp*****
2004年 1月 14日 (水) 19:46:30 JST
ヤマケンです。 uim-skkで以下のような表示スタイルを変更できるようにしてみました。 添付のパッチは[Anthy-dev 414]を当てた状態からの差分です。 ・プリエディット中の各文節に付加される属性(反転表示やアンダーライン等) ・▽モードで文字を入力している時にカーソルを表示するか ・再帰学習エリアの先頭と終わりを示す文字 ・候補選択ウィンドウ中に表示される候補に送り仮名を付加するか .uimに(define skk-style 'skk-style-ddskk-like)等と書く事により、 好みの表示スタイルに変更できます。また、自分でスタイルを定義して 細かく設定を変更する事もできます。 これを書いた動機は2つあるんですが、まずQt/Eのプリエディット描画 機能はGtkに比べてかなり制約があるのでそれに合わせてカスタマイズ したいという事、もう一つは保守的なSKK風表示スタイルと実験的・現 代的表示スタイルを使い分けられるようにしておきたいからです。 ついでに提案があるんですが、このパッチで定義されているddskk風の 保守的な表示スタイル('skk-style-ddskk-like)と従来のスタイル ('skk-style-uim)の2つのうち、ddskk風の方をデフォルトにしませんか? (パッチ中に既にそのように記述してあります) 私は長年SKKで暮らしてきたんですが、反転表示を多様する現在の表示 スタイルはちょっと見づらいと感じているので、変換中文字列(送り仮 名除く)のみを反転するようにしてみました。uim-skkを試してみたいと いう人は既にSKK使いである可能性が高いと思うので、試用時・移行時 の違和感を減らす事がuim普及において重要だと思います。 もちろん、未来永劫変わらない保守的な表示スタイルが最高と思ってい るわけではないので、uimネイティブの方の進化にも期待しています。 特にプリエディットの描画色を制御できるようになったら色々と嬉しそ うです。 #別スレッドのメールで「Qtopiaが羨ましい」と言われましたが、私も #Pangoで好き勝手にプリエディット描画ができるGtkが羨ましいです ------------------------------- ヤマケン yamak****@bp***** -------------- next part -------------- diff -ur trunk-352-yk1/scm/im.scm trunk-352-yk2/scm/im.scm --- trunk-352-yk1/scm/im.scm Wed Jan 14 18:23:40 2004 +++ trunk-352-yk2/scm/im.scm Wed Jan 14 17:25:44 2004 @@ -11,6 +11,13 @@ (define preedit-underline 1) (define preedit-reverse 2) (define preedit-cursor 4) +(define preedit-attr? + (lambda (attr) + (or + (= attr preedit-none) + (= attr preedit-underline) + (= attr preedit-reverse) + (= attr preedit-cursor)))) ;; config (define enable-im-switch #f) diff -ur trunk-352-yk1/scm/skk.scm trunk-352-yk2/scm/skk.scm --- trunk-352-yk1/scm/skk.scm Wed Jan 14 18:29:36 2004 +++ trunk-352-yk2/scm/skk.scm Wed Jan 14 18:33:30 2004 @@ -26,6 +26,7 @@ (define skk-use-candidate-window? #t) (define skk-candidate-op-count 0) (define skk-use-recursive-learning? #t) +(define skk-style 'skk-style-ddskk-like) ;; key defs (define skk-latin-key (lambda (key key-state) @@ -83,6 +84,69 @@ (lambda (key key-state) (= key 81))) +;; style elements +(define skk-preedit-attr-mode-mark) +(define skk-preedit-attr-head) +(define skk-preedit-attr-okuri) +(define skk-preedit-attr-pending-rk) +(define skk-preedit-attr-conv-body) +(define skk-preedit-attr-conv-okuri) +(define skk-preedit-attr-direct-pending-rk) +(define skk-preedit-attr-child-beginning-mark) +(define skk-preedit-attr-child-end-mark) +(define skk-preedit-attr-child-committed) +(define skk-child-context-beginning-mark) +(define skk-child-context-end-mark) +(define skk-show-cursor-on-preedit?) +(define skk-show-candidates-with-okuri?) +;; style specification +(define skk-style-spec + '(;; (style-element-name . validator) + (skk-preedit-attr-mode-mark . preedit-attr?) + (skk-preedit-attr-head . preedit-attr?) + (skk-preedit-attr-okuri . preedit-attr?) + (skk-preedit-attr-pending-rk . preedit-attr?) + (skk-preedit-attr-conv-body . preedit-attr?) + (skk-preedit-attr-conv-okuri . preedit-attr?) + (skk-preedit-attr-direct-pending-rk . preedit-attr?) + (skk-preedit-attr-child-beginning-mark . preedit-attr?) + (skk-preedit-attr-child-end-mark . preedit-attr?) + (skk-preedit-attr-child-committed . preedit-attr?) + (skk-child-context-beginning-mark . string?) + (skk-child-context-end-mark . string?) + (skk-show-cursor-on-preedit? . boolean?) + (skk-show-candidates-with-okuri? . boolean?))) +;; predefined styles +(define skk-style-uim + '((skk-preedit-attr-mode-mark . preedit-reverse) + (skk-preedit-attr-head . preedit-reverse) + (skk-preedit-attr-okuri . preedit-reverse) + (skk-preedit-attr-pending-rk . preedit-reverse) + (skk-preedit-attr-conv-body . preedit-reverse) + (skk-preedit-attr-conv-okuri . preedit-reverse) + (skk-preedit-attr-direct-pending-rk . preedit-underline) + (skk-preedit-attr-child-beginning-mark . preedit-reverse) + (skk-preedit-attr-child-end-mark . preedit-reverse) + (skk-preedit-attr-child-committed . preedit-reverse) + (skk-child-context-beginning-mark . "[") + (skk-child-context-end-mark . "]") + (skk-show-cursor-on-preedit? . #f) + (skk-show-candidates-with-okuri? . #t))) +(define skk-style-ddskk-like + '((skk-preedit-attr-mode-mark . preedit-underline) + (skk-preedit-attr-head . preedit-underline) + (skk-preedit-attr-okuri . preedit-underline) + (skk-preedit-attr-pending-rk . preedit-underline) + (skk-preedit-attr-conv-body . preedit-reverse) + (skk-preedit-attr-conv-okuri . preedit-underline) + (skk-preedit-attr-direct-pending-rk . preedit-underline) + (skk-preedit-attr-child-beginning-mark . preedit-underline) + (skk-preedit-attr-child-end-mark . preedit-underline) + (skk-preedit-attr-child-committed . preedit-underline) + (skk-child-context-beginning-mark . "【") + (skk-child-context-end-mark . "】") + (skk-show-cursor-on-preedit? . #t) + (skk-show-candidates-with-okuri? . #f))) ;; access (define skk-context-latin-conv @@ -191,6 +255,20 @@ ;; state kana head okuri tail candidates nth rk +(define skk-setup-style + (lambda (style-spec style) + (let* ((elem (car style)) + (name (car elem)) + (val (if (symbol? (cdr elem)) + (symbol-value (cdr elem)) + (cdr elem))) + (spec (assq name style-spec)) + (valid? (symbol-value (cdr spec)))) + (if (valid? val) + (set-symbol-value! name val)) + (if (not (null? (cdr style))) + (skk-setup-style style-spec (cdr style)))))) + (define skk-find-root-context (lambda (sc) (let ((pc (skk-context-parent-context sc))) @@ -376,11 +454,11 @@ (or (= stat 'skk-state-kanji) (= stat 'skk-state-okuri))) - (im-pushback-preedit id preedit-reverse "▽")) + (im-pushback-preedit id skk-preedit-attr-mode-mark "▽")) (if (or csc (= stat 'skk-state-converting)) - (im-pushback-preedit id preedit-reverse "▼")) + (im-pushback-preedit id skk-preedit-attr-mode-mark "▼")) (if (or (= stat 'skk-state-kanji) (= stat 'skk-state-okuri) @@ -392,17 +470,19 @@ (skk-context-kana-mode sc)))) (if (string? h) (im-pushback-preedit - id preedit-reverse + id skk-preedit-attr-head h)))) (if (and (= stat 'skk-state-converting) (not csc)) - (im-pushback-preedit - id preedit-reverse - (string-append - (skk-get-current-candidate sc) - (skk-make-string (skk-context-okuri sc) - (skk-context-kana-mode sc))))) + (begin + (im-pushback-preedit + id skk-preedit-attr-conv-body + (skk-get-current-candidate sc)) + (im-pushback-preedit + id skk-preedit-attr-conv-okuri + (skk-make-string (skk-context-okuri sc) + (skk-context-kana-mode sc))))) (if (or (= stat 'skk-state-okuri) @@ -412,29 +492,38 @@ (skk-context-okuri sc))) (begin (im-pushback-preedit - id preedit-reverse + id skk-preedit-attr-okuri (string-append "*" (skk-make-string (skk-context-okuri sc) (skk-context-kana-mode sc)))))) (if (= stat 'skk-state-direct) (begin - (im-pushback-preedit id preedit-underline + (im-pushback-preedit id skk-preedit-attr-direct-pending-rk (rk-pending rkc)) (im-pushback-preedit id preedit-cursor "")) - (im-pushback-preedit id preedit-reverse - (rk-pending rkc))) + (begin + (im-pushback-preedit id skk-preedit-attr-pending-rk + (rk-pending rkc)) + (if (and + (or + (= stat 'skk-state-kanji) + (= stat 'skk-state-okuri)) + skk-show-cursor-on-preedit?) + (im-pushback-preedit id preedit-cursor "")))) ;; child context's preedit (if csc (let ((editor (skk-context-editor sc))) - (im-pushback-preedit id preedit-reverse "[") - (im-pushback-preedit id preedit-reverse + (im-pushback-preedit id skk-preedit-attr-child-beginning-mark + skk-child-context-beginning-mark) + (im-pushback-preedit id skk-preedit-attr-child-committed (skk-editor-get-left-string editor)) (skk-do-update-preedit id csc) - (im-pushback-preedit id preedit-reverse + (im-pushback-preedit id skk-preedit-attr-child-committed (skk-editor-get-right-string editor)) - (im-pushback-preedit id preedit-reverse "]") + (im-pushback-preedit id skk-preedit-attr-child-end-mark + skk-child-context-end-mark) ))))) (define skk-update-mode @@ -956,7 +1045,8 @@ (im-pushback-mode-list id "全角英数") (im-update-mode-list id) (im-update-mode id 0) - (skk-update-prop-list id)))) + (skk-update-prop-list id) + (skk-setup-style skk-style-spec (symbol-value skk-style))))) (define skk-press-key-handler (lambda (id key state) @@ -998,7 +1088,9 @@ (dcsc (skk-find-descendant-context sc)) (cand (skk-get-nth-candidate dcsc idx)) (okuri (skk-context-okuri dcsc))) - (if okuri + (if (and + okuri + skk-show-candidates-with-okuri?) (string-append cand (skk-make-string okuri t)) cand)))) diff -ur trunk-352-yk1/scm/util.scm trunk-352-yk2/scm/util.scm --- trunk-352-yk1/scm/util.scm Wed Jan 14 18:23:43 2004 +++ trunk-352-yk2/scm/util.scm Wed Jan 14 16:36:36 2004 @@ -1,4 +1,9 @@ ;; +(define boolean? + (lambda (v) + (or (eq? v #t) + (eq? v #f)))) +;; (define alphabet-char? (lambda (c) (and (number? c)