Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
tsutsui opened this issue Feb 17, 2019 · 6 comments
Open

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

tsutsui opened this issue Feb 17, 2019 · 6 comments

Comments

@tsutsui
Copy link
Owner

@tsutsui tsutsui commented Feb 17, 2019

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

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

@tsutsui
Copy link
Owner Author

@tsutsui tsutsui commented Mar 30, 2019

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) の起動時と思われるので、以下を考える必要があるか。

  • 初回のみ実施(複数回実行しない)という手段を考える
  • ~/.mozc/config1.db を Live Image 作成時点で生成する方法を考える

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

@tsutsui
Copy link
Owner Author

@tsutsui tsutsui commented Mar 30, 2019

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

  • キー設定をカスタムに切り替える
  • 既存のキーマップ設定をインポートする
  • Ctrl+Space の設定を追加 or 置換する

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

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

@tsutsui
Copy link
Owner Author

@tsutsui tsutsui commented Mar 30, 2019

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
Copy link
Owner Author

@tsutsui tsutsui commented Mar 30, 2019

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

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

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

@tsutsui
Copy link
Owner Author

@tsutsui tsutsui commented Mar 30, 2019

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
Copy link
Owner Author

@tsutsui tsutsui commented Mar 30, 2019

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant