tsutsui / netbsd-teokureliveimage

Scripts and files to build NetBSD "Teokure Live Image" http://www.ceres.dti.ne.jp/tsutsui/netbsd/liveimage/
9 stars 1 forks source link

mozc の設定をコマンドラインで変更する #5

Open tsutsui opened 5 years ago

tsutsui commented 5 years ago

現状は mozc_tool の GUI でしか変更ができないので、起動直後は英語キーボードで全角入力切り替えができない。使い方のページに設定方法を書いてはいるが、使い勝手としてはイケてないので ibus 同様にコマンドラインでなんとかしたい。mozc固有のフォーマットなので、自前でガッツリ書かないと難しいとは思うが……。

過去の mozc の設定ツールは存在したが mozc_tool の登場で開発は止まってしまったようである。 https://github.com/hidegit/mozc-config

tsutsui commented 5 years ago

mozc_tool のキー設定読み込みは mozc-2.20.2673.102/src/gui/config_dialog/config_dialog.cc の以下、 keymap_file を current_keymap_table に読み込んでいるところ?

void ConfigDialog::EditKeymap() {
  string current_keymap_table = "";
  const QString keymap_name = keymapSettingComboBox->currentText();
  const map<QString, config::Config::SessionKeymap>::const_iterator itr =
      keymapname_sessionkeymap_map_.find(keymap_name);
  if (itr != keymapname_sessionkeymap_map_.end()) {
    // Load from predefined mapping file.
    const char *keymap_file =
        keymap::KeyMapManager::GetKeyMapFileName(itr->second);
    std::unique_ptr<istream> ifs(
        ConfigFileStream::LegacyOpen(keymap_file));
    CHECK(ifs.get() != NULL);  // should never happen
    stringstream buffer;
    buffer << ifs->rdbuf();
    current_keymap_table = buffer.str();
  } else {
    current_keymap_table = custom_keymap_table_;
  }
  string output;
  if (gui::KeyMapEditorDialog::Show(this,
                                    current_keymap_table,
                                    &output)) {
    custom_keymap_table_ = output;
    // set keymapSettingComboBox to "Custom keymap"
    keymapSettingComboBox->setCurrentIndex(0);
  }
}

実際のキー設定のファイルからの読み出しは mozc-2.20.2673.102/src/gui/config_dialog/keymap_editor.cc の KeyMapEditorDialog::LoadFromStream() の以下で、タブ区切りの status, key, command の 3つのフィールドを持つテキスト行?

  invisible_keymap_table_.clear();
  direct_mode_commands_.clear();
  while (getline(*is, line)) {
    if (line.empty() || line[0] == '#') {
      continue;
    }
    Util::ChopReturns(&line);

    fields.clear();
    Util::SplitStringUsing(line, "\t", &fields);
    if (fields.size() < 3) {
      VLOG(3) << "field size < 3";
      continue;
    }

    const string &status = fields[0];
    const string &key = fields[1];
    const string &command = fields[2];

実際のコンフィグファイルの書式の本質は上記と同じ keymap_editor.cc の 以下、 status, key, command のタブ区切りテキスト行?

    const string keymap_line = status + "\t" + key + "\t" + command;
    *keymap_table += keymap_line;
    *keymap_table += '\n';

設定ファイルの ~/.mozc/config1.db はバイナリファイルではあるが、キー設定については上記構造と同様のテキスト行で保存されている。ておくれ Live Image での推奨(?)設定の「Ctrl+Space で IME ON/OFF」の定義は以下の行に含まれているようである。

Composition     Ctrl Space      CancelAndIMEOff
Conversion      Ctrl Space      CancelAndIMEOff
DirectInput     Ctrl Space      IMEOn
Precomposition  Ctrl Space      CancelAndIMEOff

とりあえずの kludge として、バイナリ書式ガン無視のまま、どうにかして ~/.mozc/config1.db に上記の4行のテキスト記述を追加する、という案はある。

ただし、 ~/.mozc/config1.db が作られるのは初回の mozc_server (ibus-daemon) の起動時と思われるので、以下を考える必要があるか。

後者については、 ibus の設定同様で Xサーバーが起動していない状態で実施するのは難しいかもしれない。

tsutsui commented 5 years ago

よくよく考えると、 ~/.mozc/config1.db のデフォルトではキー設定は MS-IME になっていてキー設定のテーブルは存在しないという気がする。よって、以下が必要?

デフォルトのキーマップ設定は mozc-2.20.2673.102/src/data/keymap/atok.tsv 等にあるっぽい。

値の設定は https://github.com/hidegit/mozc-config で可能? キーマップについては可変長なので、データ長その他の情報が含まれるとするとフォーマット仕様を調べないと難しいかも……。

tsutsui commented 5 years ago

https://github.com/hidegit/mozc-config の使い方については古い README を参照する必要あり https://github.com/hidegit/mozc-config/blob/c5f3bffc2860653acf11f30ccb94c6522c538c87/README

    session_keymap = <enum default=NONE>
        NONE    - 無効
        CUSTOM  - カスタムキーマップ
        ATOK    - ATOKスタイル
        MSIME   - MSIMEスタイル
        KOTOERI - ことえりスタイル
    custom_keymap_table = <bytes>
        キーマップテーブル - 詳細不明

という記載はあるが、具体的なところはいろいろと読み解く必要がある感じ。

tsutsui commented 5 years ago

既存の mozc_tool にも 「キー設定」→「キー設定の選択」→「編集」 →「編集」プルダウンメニュー→「エクスポート」 という機能があり、修正後の設定ファイルをテキスト形式 (atok.tsv 等と同じ形式) でエクスポートする機能がある。

https://github.com/hidegit/mozc-config を改良してキー設定ファイルをインポートする機能を付ける、というほうがスッキリするかもしれない。ただ、ホストツールとしてビルドする必要が出てくるので、そのバイナリをどうやってビルドする(用意する)かを考える必要がある。

いっそのこと pkgsrc の mozc_tool にパッチを入れて取り込んでしまえ、という乱暴な案もあるが、それが許される程度の品質のコードが書けるか(設定のパースとかエラーハンドリングとか)というと難しいかも……。

tsutsui commented 5 years ago

mozc-config を適当に修正してみる https://gist.github.com/tsutsui/8d7dd8c01276d2be513d0cfa8a62d64d

とりあえず mozc-config -a による設定読み出しは動いているっぽい?

general_config: /* Not Impl Error!! */
verbose_level: 0
incognito_mode: false
check_default: true
presentation_mode: false
preedit_method: ROMAN
session_keymap: CUSTOM
custom_keymap_table: "status    key command
Composition Backspace   Backspace
Composition Ctrl [  Cancel
Composition Ctrl @  ConvertToHalfAlphanumeric
Composition Ctrl g  Delete
Composition Ctrl h  Backspace
Composition Ctrl i  ConvertToFullKatakana
Composition Ctrl k  MoveCursorLeft
Composition Ctrl l  MoveCursorRight
Composition Ctrl Left   MoveCursorToBeginning
Composition Ctrl m  Commit
Composition Ctrl n  Commit
Composition Ctrl o  ConvertToHalfWidth
Composition Ctrl p  ConvertToFullAlphanumeric
Composition Ctrl Right  MoveCursorToEnd
Composition Ctrl u  ConvertToHiragana
Composition Delete  Delete
Composition Down    Commit
Composition Eisu    ToggleAlphanumericMode
Composition Enter   Commit
Composition ESC Cancel
Composition F10 ConvertToHalfAlphanumeric
Composition F2  ConvertWithoutHistory
Composition F6  ConvertToHiragana
Composition F7  ConvertToFullKatakana
Composition F8  ConvertToHalfWidth
Composition F9  ConvertToFullAlphanumeric
Composition Hankaku/Zenkaku CancelAndIMEOff
Composition Henkan  Convert
Composition Hiragana    ToggleAlphanumericMode
Composition Kana    ToggleAlphanumericMode
Composition Left    MoveCursorLeft
Composition Muhenkan    ToggleAlphanumericMode
Composition Right   MoveCursorRight
Composition Shift Henkan    Convert
Composition Shift Muhenkan  ToggleAlphanumericMode
Composition Shift Space Convert
Composition Space   Convert
Composition Tab PredictAndConvert
Conversion  Backspace   Cancel
Conversion  Ctrl [  Cancel
Conversion  Ctrl @  ConvertToHalfAlphanumeric
Conversion  Ctrl h  Cancel
Conversion  Ctrl i  ConvertToFullKatakana
Conversion  Ctrl k  SegmentWidthShrink
Conversion  Ctrl l  SegmentWidthExpand
Conversion  Ctrl Left   SegmentFocusFirst
Conversion  Ctrl m  Commit
Conversion  Ctrl n  CommitOnlyFirstSegment
Conversion  Ctrl o  ConvertToHalfWidth
Conversion  Ctrl p  ConvertToFullAlphanumeric
Conversion  Ctrl Right  SegmentFocusLast
Conversion  Ctrl Shift Left SegmentWidthShrink
Conversion  Ctrl Shift Right    SegmentWidthExpand
Conversion  Ctrl u  ConvertToHiragana
Conversion  Down    CommitOnlyFirstSegment
Conversion  Eisu    ToggleAlphanumericMode
Conversion  Enter   Commit
Conversion  ESC Cancel
Conversion  F10 ConvertToHalfAlphanumeric
Conversion  F6  ConvertToHiragana
Conversion  F7  ConvertToFullKatakana
Conversion  F8  ConvertToHalfWidth
Conversion  F9  ConvertToFullAlphanumeric
Conversion  Hankaku/Zenkaku CancelAndIMEOff
Conversion  Henkan  ConvertNextPage
Conversion  Hiragana    ToggleAlphanumericMode
Conversion  Insert  Cancel
Conversion  Left    SegmentWidthShrink
Conversion  Right   SegmentWidthExpand
Conversion  Shift Henkan    ConvertPrevPage
Conversion  Shift Left  SegmentFocusLeft
Conversion  Shift Right SegmentFocusRight
Conversion  Shift Space ConvertNext
Conversion  Shift Tab   ConvertPrev
Conversion  Space   ConvertNext
Conversion  Tab PredictAndConvert
Conversion  Up  ConvertPrev
DirectInput Hankaku/Zenkaku IMEOn
DirectInput Henkan  IMEOn
DirectInput Muhenkan    IMEOn
DirectInput Shift Henkan    Reconvert
Precomposition  Backspace   Revert
Precomposition  Ctrl Backspace  Undo
Precomposition  Ctrl F12    LaunchConfigDialog
Precomposition  Ctrl F7 LaunchWordRegisterDialog
Precomposition  Eisu    ToggleAlphanumericMode
Precomposition  F10 ToggleAlphanumericMode
Precomposition  Hankaku/Zenkaku CancelAndIMEOff
Precomposition  Henkan  CancelAndIMEOff
Precomposition  Kana    ToggleAlphanumericMode
Precomposition  Muhenkan    CancelAndIMEOff
Precomposition  Shift Henkan    Reconvert
Precomposition  Shift Muhenkan  ToggleAlphanumericMode
Precomposition  Shift Space InsertAlternateSpace
Precomposition  Space   InsertSpace
Prediction  Ctrl Down   ConvertNext
Prediction  Ctrl Up ConvertPrev
Prediction  Down    ConvertNext
Prediction  Up  ConvertPrev
Prediction  Ctrl Delete DeleteSelectedCandidate
Suggestion  Ctrl Down   PredictAndConvert
Suggestion  Ctrl Enter  CommitFirstSuggestion
Suggestion  Down    PredictAndConvert
Suggestion  Shift Enter CommitFirstSuggestion
Composition Ctrl Space  CancelAndIMEOff
Conversion  Ctrl Space  CancelAndIMEOff
DirectInput Ctrl Space  IMEOn
Precomposition  Ctrl Space  CancelAndIMEOff
Conversion  Ctrl s  SegmentFocusLeft
Conversion  Ctrl d  SegmentFocusRight
Composition Kanji   CancelAndIMEOff
Composition OFF CancelAndIMEOff
Composition ON  IMEOn
Conversion  Kanji   CancelAndIMEOff
Conversion  OFF CancelAndIMEOff
Conversion  ON  IMEOn
DirectInput Kanji   IMEOn
DirectInput ON  IMEOn
Precomposition  Kanji   CancelAndIMEOff
Precomposition  OFF CancelAndIMEOff
Precomposition  ON  IMEOn
"
custom_roman_table: ""
punctuation_method: KUTEN_TOUTEN
symbol_method: CORNER_BRACKET_MIDDLE_DOT
space_character_form: FUNDAMENTAL_HALF_WIDTH
use_keyboard_to_change_preedit_method: false
history_learning_level: DEFAULT_HISTORY
selection_shortcut: SHORTCUT_123456789
character_form_rules: character_form_rules {
  group: KATAKANA
  preedit_character_form: FULL_WIDTH
  conversion_character_form: FULL_WIDTH
}
character_form_rules {
  group: ALPHABET
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: NUMBER
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: "(){}[]"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: ".,"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: "。、"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: FULL_WIDTH
}
character_form_rules {
  group: "・「」"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: FULL_WIDTH
}
character_form_rules {
  group: "\"\'"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: ":;"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: "#%&@$^_|`\\"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: "~"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: "<>=+-/*"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
character_form_rules {
  group: "?!"
  preedit_character_form: FULL_WIDTH
  conversion_character_form: LAST_FORM
}
use_auto_ime_turn_off: true
use_cascading_window: true
shift_key_mode_switch: ASCII_INPUT_MODE
numpad_character_form: NUMPAD_HALF_WIDTH
use_auto_conversion: false
auto_conversion_key: 13
yen_sign_character: YEN_SIGN
use_japanese_layout: false
use_kana_modifier_insensitive_conversion: false
use_typing_correction: false
use_date_conversion: true
use_single_kanji_conversion: true
use_symbol_conversion: true
use_number_conversion: true
use_emoticon_conversion: true
use_calculator: true
use_t13n_conversion: true
use_zip_code_conversion: true
use_spelling_correction: true
use_emoji_conversion: false
information_list_config: /* Not Impl Error!! */
use_history_suggest: true
use_dictionary_suggest: true
use_realtime_conversion: true
suggestions_size: 3
use_mode_indicator: true
allow_cloud_handwriting: false

ただ、 custom_keymap_table をバイト列(改行を含むテキスト文字列一式)で渡すというのは筋が悪いというか、 Live Image の設定に入れるにはちょっと不格好という気もする。

やっぱり「mozc_tool にコマンドライン設定オプションを足す」というのが理想だが、落とし所をどこにすべきか……。

tsutsui commented 5 years ago

mozc-config について fork してブランチで修正をコミットした。 https://github.com/tsutsui/mozc-config/tree/pkgsrc-mozc-2.20.2673.102