Open tsutsui opened 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サーバーが起動していない状態で実施するのは難しいかもしれない。
よくよく考えると、 ~/.mozc/config1.db のデフォルトではキー設定は MS-IME になっていてキー設定のテーブルは存在しないという気がする。よって、以下が必要?
デフォルトのキーマップ設定は mozc-2.20.2673.102/src/data/keymap/atok.tsv 等にあるっぽい。
値の設定は https://github.com/hidegit/mozc-config で可能? キーマップについては可変長なので、データ長その他の情報が含まれるとするとフォーマット仕様を調べないと難しいかも……。
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>
キーマップテーブル - 詳細不明
という記載はあるが、具体的なところはいろいろと読み解く必要がある感じ。
既存の mozc_tool にも 「キー設定」→「キー設定の選択」→「編集」 →「編集」プルダウンメニュー→「エクスポート」 という機能があり、修正後の設定ファイルをテキスト形式 (atok.tsv 等と同じ形式) でエクスポートする機能がある。
https://github.com/hidegit/mozc-config を改良してキー設定ファイルをインポートする機能を付ける、というほうがスッキリするかもしれない。ただ、ホストツールとしてビルドする必要が出てくるので、そのバイナリをどうやってビルドする(用意する)かを考える必要がある。
いっそのこと pkgsrc の mozc_tool にパッチを入れて取り込んでしまえ、という乱暴な案もあるが、それが許される程度の品質のコードが書けるか(設定のパースとかエラーハンドリングとか)というと難しいかも……。
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 にコマンドライン設定オプションを足す」というのが理想だが、落とし所をどこにすべきか……。
mozc-config について fork してブランチで修正をコミットした。 https://github.com/tsutsui/mozc-config/tree/pkgsrc-mozc-2.20.2673.102
現状は mozc_tool の GUI でしか変更ができないので、起動直後は英語キーボードで全角入力切り替えができない。使い方のページに設定方法を書いてはいるが、使い勝手としてはイケてないので ibus 同様にコマンドラインでなんとかしたい。mozc固有のフォーマットなので、自前でガッツリ書かないと難しいとは思うが……。
過去の mozc の設定ツールは存在したが mozc_tool の登場で開発は止まってしまったようである。 https://github.com/hidegit/mozc-config