Commits

Anonymous committed 5298cd8

Comments (0)

Files changed (3)

+*skk.jax* *skk* skk.vim 日本語ドキュメント
+
+Author:
+  Noriaki Yagi <no_yag@yahoo.co.jp>
+  tyru <tyru.exe@gmail.com>
+  thinca <thinca@gmail.com>
+  Shougo Matsu <Shougo.Matsu@gmail.com>
+  mattn <mattn.jp@gmail.com>
+  krogue <krogue753@gmail.com>
+License: パブリックドメイン
+
+==============================================================================
+目次						*skk-contents*
+
+使い方						|skk-usage|
+TIPS						|skk-tips|
+インターフェース			|skk-interface|
+  キーマッピング			|skk-keymappings|
+グローバル変数				|skk-global-variables|
+TODO						|skk-TODO|
+
+
+==============================================================================
+使い方						*skk-usage* {{{
+
+skk_jisyo および skk_large_jisyo を適宜変更する。
+:so skk.vim
+Insert Mode で <C-j> (デフォルトでは) を押すと skk が起動する。
+
+}}}
+==============================================================================
+TIPS						*skk-tips* {{{
+
+初回起動時のもたつき {{{ ~
+最初のもたつきは :call SkkAddRulesSection()
+を実行するとコンパイル済のデータをこのファイルに書き込むのでだいぶストレスが減る。
+ただしローマ字のルールを変更してもその変更は反映されないので、
+一回 :call SkkDeleteRulesSection() を実行して次回起動時以降に
+SkkAddRulesSection() を実行する必要がある。
+}}}
+
+statusline用の関数 {{{ ~
+statuslineに含めるにはSkkGetModeStr()という関数が便利。
+>
+    let &statusline .= '%{SkkGetModeStr()}'
+<
+という風にして設定する。
+また表示する文字列は|g:skk_abbrev_mode_string|、|g:skk_hira_mode_string|、
+|g:skk_kata_mode_string|、|g:skk_zenei_mode_string|、|g:skk_ascii_mode_string|
+によって変えられる。
+
+この関数はskk.vim起動時に'rulerformat'に加えられるが、
+現在では'rulerformat'や'ruler'自体があまり使われることがないため、
+Vim7時代のskk.vimユーザにとってはこの表示は見たことがない人が多いかもしれない。
+}}}
+
+}}}
+==============================================================================
+インターフェース				*skk-interface* {{{
+
+------------------------------------------------------------------------------
+キーマッピング					*skk-keymappings* {{{
+
+|skk-global-variables|を参照。
+
+<Plug>(skk-toggle-im)				*<Plug>(skk-toggle-im)*
+	これはデフォルトで|g:skk_control_j_key|に割り当てられています。
+	割り当てたくない場合は|g:skk_control_j_key|を空文字にしてください。
+
+<Plug>(skk-enable-im)				*<Plug>(skk-enable-im)*
+<Plug>(skk-disable-im)				*<Plug>(skk-disable-im)*
+<
+
+}}}
+}}}
+==============================================================================
+グローバル変数					*skk-global-variables* {{{
+
+
+g:skk_jisyo								*g:skk_jisyo*
+										(初期値: "~/.skk-jisyo")
+		ユーザー辞書
+
+g:skk_backup_jisyo						*g:skk_backup_jisyo*
+										(初期値: g:skk_jisyo . ".BAK")
+		ユーザー辞書のバックアップファイル
+
+g:skk_auto_save_jisyo					*g:skk_auto_save_jisyo*
+										(初期値: 0)
+		終了時に辞書を保存するか?
+		:so skk.vim した後は
+		:call SkkSetAutoSaveJisyo(nr) で設定する。
+
+		負: 保存しない。
+		0: 聞いてから保存する。
+		正: 聞かずに保存する。
+
+g:skk_manual_save_jisyo_keys			*g:skk_manual_save_jisyo_keys*
+										(初期値: "gS")
+		ノーマルモードで辞書の手動セーブをするキー (空白なら mapping しない)
+
+g:skk_large_jisyo						*g:skk_large_jisyo*
+										(初期値: "/usr/local/share/skk/SKK-JISYO.L")
+		ユーザー辞書の後に検索する辞書 (ソート済みの必要あり)
+
+g:skk_external_prog						*g:skk_external_prog*
+										(初期値: "")
+		ユーザ辞書の後に検索する外部プログラム (空白でなければskk_large_jisyoは無視)
+
+g:skk_control_j_key						*g:skk_control_j_key*
+										(初期値: "<C-j>")
+		<C-j> の働きをするキー。
+		map に渡すので `\' はつけない。
+		割り当てたくない場合は空文字にする。
+
+g:skk_abbrev_to_zenei_key				*g:skk_abbrev_to_zenei_key*
+										(初期値: "<C-q>")
+		abbrevモードで全角英数に変換するキー。`\' はつけない。
+		コンソールで <C-q> がこない場合は vim 起動前に stty -ixon するか
+		他のキーにする。
+
+g:skk_keep_state						*g:skk_keep_state*
+										(初期値: 0)
+		Insert モードを抜けて再び
+		Insert モードにしたときに前の状態を維持しておくか?
+
+g:skk_initial_mode						*g:skk_initial_mode*
+										(初期値: "hira")
+		skk をオンにしたときの初期モード
+
+g:skk_marker_white						*g:skk_marker_white*
+										(初期値: "▽")
+		▽モードのマーク
+
+g:skk_marker_black						*g:skk_marker_black*
+										(初期値: "▼")
+		▼モードのマーク
+
+g:skk_marker_okuri						*g:skk_marker_okuri*
+										(初期値: "*")
+		送りがな開始位置のマーク
+
+g:skk_start_henkan_key					*g:skk_start_henkan_key*
+										(初期値: " ")
+		変換/次候補キー
+
+g:skk_prev_cand_key						*g:skk_prev_cand_key*
+										(初期値: "x")
+		前候補キー
+
+g:skk_purge_cand_key					*g:skk_purge_cand_key*
+										(初期値: "X")
+		現在の候補を辞書から削除するキー
+
+g:skk_henkan_point_keys					*g:skk_henkan_point_keys*
+										(初期値: "ABCDEFGHIJKMNOPRSTUVWYZ")
+		入力されたら▽モードにするキー
+
+g:skk_select_cand_keys					*g:skk_select_cand_keys*
+										(初期値: "ASDFJKL")
+		選択方式のときに選択に利用するキー
+
+g:skk_show_candidates_count				*g:skk_show_candidates_count*
+										(初期値: 4)
+		何回目の変換で選択方式にするか?
+
+g:skk_completion_key					*g:skk_completion_key*
+										(初期値: "\<Tab>")
+		見出し語の補完動作を行うキー
+
+g:skk_next_comp_key						*g:skk_next_comp_key*
+										(初期値: ".")
+		見出し語の補完で次の候補を出力するキー
+
+g:skk_prev_comp_key						*g:skk_prev_comp_key*
+										(初期値: ",")
+		見出し語の補完で前の候補を出力するキー
+
+g:skk_special_midasi_keys				*g:skk_special_midasi_keys*
+										(初期値: "<>?")
+		接頭辞・接尾辞の入力をするキー
+
+g:skk_kutouten_type						*g:skk_kutouten_type*
+										(初期値: "jp")
+		句読点のタイプ
+		"jp" なら skk_kutouten_jp を見る。
+		"en" なら skk_kutouten_en を見る。
+
+
+g:skk_kutouten_jp						*g:skk_kutouten_jp*
+										(初期値: "。、")
+		句読点のタイプ "jp" の場合 (最初の一文字が句点、最後の一文字が読点)
+
+g:skk_kutouten_en						*g:skk_kutouten_en*
+										(初期値: ".,")
+		句読点のタイプ "en" の場合 (最初の一文字が句点、最後の一文字が読点)
+
+g:skk_use_numeric_conversion			*g:skk_use_numeric_conversion*
+										(初期値: 1)
+		数値変換を行うか?
+
+g:skk_egg_like_newline					*g:skk_egg_like_newline*
+										(初期値: 0)
+		non-zeroなら<CR>で確定した時に改行文字を出力しない
+
+g:skk_show_annotation					*g:skk_show_annotation*
+										(初期値: 0)
+		non-zeroなら候補選択時に註釈を表示する (インラインでは未対応)
+
+g:skk_use_face							*g:skk_use_face*
+										(初期値: 0)
+		non-zeroなら変換時に色を付ける。
+		ただし変換時に skk_henkan というハイライトグループがないと 0 にされる。
+
+g:skk_autofill_toggle_key				*g:skk_autofill_toggle_key*
+										(初期値: "<C-k>")
+		Auto Fillのトグルをするキー (空白なら mapping しない) `\' はつけない。
+		format.vim が読み込まれていないと mapping しない。
+
+g:skk_user_rom_kana_rules				*g:skk_user_rom_kana_rules*
+										(初期値はとても長い)
+		ローマ字の変換ルール
+		行頭からタブ文字までがローマ字、次のタブまでがひらがな、
+		その次のタブまでがカタカナ、その次が残す文字、最後は \<NL>。
+		もしあれば skk_user_rom_kana_rules が追加されるので、
+		ちょっとした追加や変更なら skk_user_rom_kana_rules に記述したほうがいい。
+
+g:skk_user_rom_func_rules				*g:skk_user_rom_func_rules*
+										(初期値はとても長い)
+		ひらがな・カタカナモードのとき関数を呼び出すタイプのルール
+		行頭からタブ文字までがローマ字、次から \<NL> までが関数呼出し。
+		このローマ字が入力されたときはこの関数の戻り値が返る。
+		かなでも関数でも子がある場合はこの関数は実行されない。
+		もしあれば skk_user_rom_func_rules が追加される。
+
+g:skk_user_zenei_rules					*g:skk_user_zenei_rules*
+										(初期値はとても長い)
+		全角英数変換ルール
+		各行の1バイト目の入力を2バイト以降 <NL> の前までに変換する
+		もしあれば skk_user_zenei_rules が追加される。
+		SkkAscii2Zenei でも使う。
+
+g:skk_imdisable_state					*g:skk_imdisable_state*
+										(初期値: 1)
+		0: IMをオンにする (set noimdisable)
+		1: IMをオフにする (set imdisable)
+		それ以外: &imdisableを弄らない
+
+g:skk_ascii_mode_string					*g:skk_ascii_mode_string*
+										(初期値: 'SKK:aA')
+		アスキーモードを示す文字列。
+
+g:skk_hira_mode_string					*g:skk_hira_mode_string*
+										(初期値: 'SKK:あ')
+		かなモードを示す文字列。
+
+g:skk_kata_mode_string					*g:skk_kata_mode_string*
+										(初期値: 'SKK:ア')
+		カナモードを示す文字列。
+
+g:skk_zenei_mode_string					*g:skk_zenei_mode_string*
+										(初期値: 'SKK:A')
+		全英モードを示す文字列。
+
+g:skk_abbrev_mode_string				*g:skk_abbrev_mode_string*
+										(初期値: 'SKK:aあ')
+		abbrevモードを示す文字列。
+
+g:skk_use_color_cursor					*g:skk_use_color_cursor*
+										(初期値: 0)
+		カーソルに色付けする。
+
+g:skk_cursor_hira_color					*g:skk_cursor_hira_color*
+										(初期値: '')
+		かなモードを示すカーソル色。
+
+g:skk_cursor_kata_color					*g:skk_cursor_kata_color*
+										(初期値: '')
+		カナモードを示すカーソル色。
+
+g:skk_cursor_zenei_color					*g:skk_cursor_zenei_color*
+										(初期値: '')
+		全英モードを示すカーソル色。
+
+g:skk_cursor_ascii_color					*g:skk_cursor_ascii_color*
+										(初期値: '')
+		asciiモードを示すカーソル色。
+
+g:skk_cursor_abbrev_color					*g:skk_cursor_abbrev_color*
+										(初期値: '')
+		abbrevモードを示すカーソル色。
+
+g:skk_sticky_key							*g:skk_sticky_key*
+										(初期値: '')
+		入力されたら▽モードにするキー(Stickyキー)。
+		初期値はどのキーもStickyキーにマッピングしない。
+
+g:skk_kakutei_key							*g:skk_kakutei_key*
+										(初期値: "\<C-j>")
+		明示的な確定動作を行うキー。
+		入力された文字列と直接比較されるので「\」が必要。
+
+g:skk_remap_lang_mode						*g:skk_remap_lang_mode*
+										(初期値: 0)
+		もし真なら`lmap`で、もし偽なら`lnoremap`で
+		キーをマッピングする。
+		これはimapやcmapのマッピングを生かしたい場合に便利。
+
+
+g:skk_enable_hook							*g:skk_enable_hook*
+										(初期値: "")
+		次のようにしてマッピングが行われる直後に呼ばれるフック関数を登録する。
+>
+		" Do not map `<Plug>(skk-toggle-im)`.
+		let skk_control_j_key = ''
+
+		" `<C-j><C-e>` to enable, `<C-j><C-d>` to disable.
+		map! <C-j><C-e> <Plug>(skk-enable-im)
+		map! <C-j><C-d> <Nop>
+		function! MySkkMap()
+			lunmap <buffer> <C-j>
+			lmap <buffer> <C-j><C-d> <Plug>(skk-disable-im)
+		endfunction
+		let skk_enable_hook = 'MySkkMap'
+<
+		この例では<C-j><C-e>でskk.vimを有効に、
+		<C-j><C-d>でskk.vimを無効にしている。
+		このようにデフォルトマッピングを上書きしたい時に便利。
+
+
+g:skk_jisyo_encoding						*g:skk_jisyo_encoding*
+										(初期値: "guess")
+		辞書の文字コードを指定する。
+		ユーザ辞書用。
+
+		指定できる値としては
+		1. "guess"
+		2. |iconv()|や|'encoding'|オプションに指定できる形の
+		文字コードを表す文字列
+		3. 2の文字列を各要素に含んだ|List|
+		がある。
+		それ以外の不正な値だと警告を表示し
+		初期値として再判定を行う。
+
+		初期値だと
+		1. euc-jp
+		2. cp932
+		3. iso-2022-jp
+		4. utf-8
+		5. 現在の'encoding'の値
+		の順に文字コードの判定を行う。
+		いわば >
+		["euc-jp", "cp932", "iso-2022-jp", "utf-8", &enc]
+<		と同じような意味だが、
+		vim6との互換性のために文字列の初期値が使われている。
+
+g:skk_large_jisyo_encoding						*g:skk_large_jisyo_encoding*
+										(初期値: "guess")
+		|g:skk_jisyo_encoding|のシステム辞書版。
+		詳しくは|g:skk_jisyo_encoding|を参照。
+
+}}}
+==============================================================================
+TODO						*skk-TODO* {{{
+
+- Insertモードで <Esc> をマップするとコンソールで矢印キーが使えない。
+- 辞書の候補に Lisp の式が書かれている場合の処理
+- undo がぐちゃぐちゃになる。
+- vim7 で ff=mac の辞書は読み込み・書き込みが遅い。
+
+}}}
+==============================================================================
+vim:tw=78:fo=tcq2mM:ts=4:ft=help:norl:fen:fdm=marker:fmr={{{,}}}
+" vim: set sw=2 fdm=marker nowrap et:
+"
+" skk.vim
+"
+" Author: Noriaki Yagi <no_yag@yahoo.co.jp>
+" Version: $Id: skk.vim,v 0.22 2006/10/11 09:26:53 noriaki Exp noriaki $
+" Last Change: 2010-07-21.
+"
+" 使い方:
+" skk_jisyo および skk_large_jisyo を適宜変更する。
+" :so skk.vim
+" Insert Mode で <C-j> (デフォルトでは) を押すと skk が起動する。
+"
+" 最初のもたつきは :call SkkAddRulesSection() を実行するとコンパイル済のデータ
+" をこのファイルに書き込むのでだいぶストレスが減る。ただしローマ字のルールを変
+" 更してもその変更は反映されないので、一回 :call SkkDeleteRulesSection() を実
+" 行して次回起動時以降に SkkAddRulesSection() を実行する必要がある。
+"
+" TODO Insertモードで <Esc> をマップするとコンソールで矢印キーが使えない。
+" TODO 辞書の候補に Lisp の式が書かれている場合の処理
+" TODO undo がぐちゃぐちゃになる。
+" TODO vim7 で ff=mac の辞書は読み込み・書き込みが遅い。
+
+scriptencoding utf-8
+
+" プラグインの無効化
+if exists('plugin_skk_disable')
+  finish
+endif
+
+if exists("skk_loaded")
+  finish
+endif
+let skk_loaded = 1
+
+let g:skk_version = '0.25'
+let g:skk_minor_version = '0'
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+"let skk_debug = 1
+
+" Global variables {{{
+
+if !exists("skk_jisyo")
+  let skk_jisyo = "~/.skk-jisyo"
+endif
+
+if !exists("skk_backup_jisyo")
+  let skk_backup_jisyo = skk_jisyo . ".BAK"
+endif
+
+if !exists("skk_auto_save_jisyo")
+  let skk_auto_save_jisyo = 0
+endif
+
+if !exists("skk_manual_save_jisyo_keys")
+  let skk_manual_save_jisyo_keys = "gS"
+endif
+
+if !exists("skk_large_jisyo")
+  let skk_large_jisyo = "/usr/local/share/skk/SKK-JISYO.L"
+endif
+
+if !exists("skk_external_prog")
+  let skk_external_prog = ""
+endif
+
+if !exists("skk_control_j_key")
+  let skk_control_j_key = "<C-j>"
+endif
+
+if !exists("skk_abbrev_to_zenei_key")
+  let skk_abbrev_to_zenei_key = "<C-q>"
+endif
+
+if !exists("skk_keep_state")
+  let skk_keep_state = 0
+endif
+
+if !exists("skk_initial_mode")
+  let skk_initial_mode = 'hira'
+endif
+
+if !exists("skk_marker_white")
+  let skk_marker_white = '▽'
+endif
+
+if !exists("skk_marker_black")
+  let skk_marker_black = '▼'
+endif
+
+if !exists("skk_marker_okuri")
+  let skk_marker_okuri = '*'
+endif
+
+if !exists("skk_start_henkan_key")
+  let skk_start_henkan_key = " "
+endif
+
+if !exists("skk_prev_cand_key")
+  let skk_prev_cand_key = "x"
+endif
+
+if !exists("skk_purge_cand_key")
+  let skk_purge_cand_key = "X"
+endif
+
+if !exists("skk_henkan_point_keys")
+  let skk_henkan_point_keys = 'ABCDEFGHIJKMNOPRSTUVWYZ'
+endif
+
+if !exists("skk_select_cand_keys")
+  let skk_select_cand_keys = "ASDFJKL"
+endif
+
+if !exists("skk_show_candidates_count")
+  let skk_show_candidates_count = 4
+endif
+
+if !exists("skk_completion_key")
+  let skk_completion_key = "\<Tab>"
+endif
+
+if !exists("skk_next_comp_key")
+  let skk_next_comp_key = "."
+endif
+
+if !exists("skk_prev_comp_key")
+  let skk_prev_comp_key = ","
+endif
+
+if !exists("skk_special_midasi_keys")
+  let skk_special_midasi_keys = "<>?"
+endif
+
+if !exists("skk_kutouten_type")
+  let skk_kutouten_type = "jp"
+endif
+
+if !exists("skk_kutouten_jp")
+  let skk_kutouten_jp = "。、"
+endif
+
+if !exists("skk_kutouten_en")
+  let skk_kutouten_en = ".,"
+endif
+
+if !exists("skk_use_numeric_conversion")
+  let skk_use_numeric_conversion = 1
+endif
+
+if !exists("skk_egg_like_newline")
+  let skk_egg_like_newline = 0
+endif
+
+if !exists("skk_show_annotation")
+  let skk_show_annotation = 0
+endif
+
+if !exists("skk_use_face")
+  let skk_use_face = 0
+endif
+
+if !exists("skk_autofill_toggle_key")
+  let skk_autofill_toggle_key = "<C-k>"
+endif
+
+if !exists("skk_rom_kana_rules")
+  let skk_rom_kana_rules = ""
+        \. "a	あ	ア\<NL>"
+        \. "bb	っ	ッ	b\<NL>"
+        \. "ba	ば	バ\<NL>"
+        \. "be	べ	ベ\<NL>"
+        \. "bi	び	ビ\<NL>"
+        \. "bo	ぼ	ボ\<NL>"
+        \. "bu	ぶ	ブ\<NL>"
+        \. "bya	びゃ	ビャ\<NL>"
+        \. "bye	びぇ	ビェ\<NL>"
+        \. "byi	びぃ	ビィ\<NL>"
+        \. "byo	びょ	ビョ\<NL>"
+        \. "byu	びゅ	ビュ\<NL>"
+        \. "cc	っ	ッ	c\<NL>"
+        \. "cha	ちゃ	チャ\<NL>"
+        \. "che	ちぇ	チェ\<NL>"
+        \. "chi	ち	チ\<NL>"
+        \. "cho	ちょ	チョ\<NL>"
+        \. "chu	ちゅ	チュ\<NL>"
+        \. "cya	ちゃ	チャ\<NL>"
+        \. "cye	ちぇ	チェ\<NL>"
+        \. "cyi	ちぃ	チィ\<NL>"
+        \. "cyo	ちょ	チョ\<NL>"
+        \. "cyu	ちゅ	チュ\<NL>"
+        \. "dd	っ	ッ	d\<NL>"
+        \. "da	だ	ダ\<NL>"
+        \. "de	で	デ\<NL>"
+        \. "dha	でゃ	デャ\<NL>"
+        \. "dhe	でぇ	デェ\<NL>"
+        \. "dhi	でぃ	ディ\<NL>"
+        \. "dho	でょ	デョ\<NL>"
+        \. "dhu	でゅ	デュ\<NL>"
+        \. "di	ぢ	ヂ\<NL>"
+        \. "do	ど	ド\<NL>"
+        \. "du	づ	ヅ\<NL>"
+        \. "dya	ぢゃ	ヂャ\<NL>"
+        \. "dye	ぢぇ	ヂェ\<NL>"
+        \. "dyi	ぢぃ	ヂィ\<NL>"
+        \. "dyo	ぢょ	ヂョ\<NL>"
+        \. "dyu	ぢゅ	ヂュ\<NL>"
+        \. "e	え	エ\<NL>"
+        \. "ff	っ	ッ	f\<NL>"
+        \. "fa	ふぁ	ファ\<NL>"
+        \. "fe	ふぇ	フェ\<NL>"
+        \. "fi	ふぃ	フィ\<NL>"
+        \. "fo	ふぉ	フォ\<NL>"
+        \. "fu	ふ	フ\<NL>"
+        \. "fya	ふゃ	フャ\<NL>"
+        \. "fye	ふぇ	フェ\<NL>"
+        \. "fyi	ふぃ	フィ\<NL>"
+        \. "fyo	ふょ	フョ\<NL>"
+        \. "fyu	ふゅ	フュ\<NL>"
+        \. "gg	っ	ッ	g\<NL>"
+        \. "ga	が	ガ\<NL>"
+        \. "ge	げ	ゲ\<NL>"
+        \. "gi	ぎ	ギ\<NL>"
+        \. "go	ご	ゴ\<NL>"
+        \. "gu	ぐ	グ\<NL>"
+        \. "gya	ぎゃ	ギャ\<NL>"
+        \. "gye	ぎぇ	ギェ\<NL>"
+        \. "gyi	ぎぃ	ギィ\<NL>"
+        \. "gyo	ぎょ	ギョ\<NL>"
+        \. "gyu	ぎゅ	ギュ\<NL>"
+        \. "ha	は	ハ\<NL>"
+        \. "he	へ	ヘ\<NL>"
+        \. "hi	ひ	ヒ\<NL>"
+        \. "ho	ほ	ホ\<NL>"
+        \. "hu	ふ	フ\<NL>"
+        \. "hya	ひゃ	ヒャ\<NL>"
+        \. "hye	ひぇ	ヒェ\<NL>"
+        \. "hyi	ひぃ	ヒィ\<NL>"
+        \. "hyo	ひょ	ヒョ\<NL>"
+        \. "hyu	ひゅ	ヒュ\<NL>"
+        \. "i	い	イ\<NL>"
+        \. "jj	っ	ッ	j\<NL>"
+        \. "ja	じゃ	ジャ\<NL>"
+        \. "je	じぇ	ジェ\<NL>"
+        \. "ji	じ	ジ\<NL>"
+        \. "jo	じょ	ジョ\<NL>"
+        \. "ju	じゅ	ジュ\<NL>"
+        \. "jya	じゃ	ジャ\<NL>"
+        \. "jye	じぇ	ジェ\<NL>"
+        \. "jyi	じぃ	ジィ\<NL>"
+        \. "jyo	じょ	ジョ\<NL>"
+        \. "jyu	じゅ	ジュ\<NL>"
+        \. "kk	っ	ッ	k\<NL>"
+        \. "ka	か	カ\<NL>"
+        \. "ke	け	ケ\<NL>"
+        \. "ki	き	キ\<NL>"
+        \. "ko	こ	コ\<NL>"
+        \. "ku	く	ク\<NL>"
+        \. "kya	きゃ	キャ\<NL>"
+        \. "kye	きぇ	キェ\<NL>"
+        \. "kyi	きぃ	キィ\<NL>"
+        \. "kyo	きょ	キョ\<NL>"
+        \. "kyu	きゅ	キュ\<NL>"
+        \. "ma	ま	マ\<NL>"
+        \. "me	め	メ\<NL>"
+        \. "mi	み	ミ\<NL>"
+        \. "mo	も	モ\<NL>"
+        \. "mu	む	ム\<NL>"
+        \. "mya	みゃ	ミャ\<NL>"
+        \. "mye	みぇ	ミェ\<NL>"
+        \. "myi	みぃ	ミィ\<NL>"
+        \. "myo	みょ	ミョ\<NL>"
+        \. "myu	みゅ	ミュ\<NL>"
+        \. "n	ん	ン\<NL>"
+        \. "n'	ん	ン\<NL>"
+        \. "na	な	ナ\<NL>"
+        \. "ne	ね	ネ\<NL>"
+        \. "ni	に	ニ\<NL>"
+        \. "nn	ん	ン\<NL>"
+        \. "no	の	ノ\<NL>"
+        \. "nu	ぬ	ヌ\<NL>"
+        \. "nya	にゃ	ニャ\<NL>"
+        \. "nye	にぇ	ニェ\<NL>"
+        \. "nyi	にぃ	ニィ\<NL>"
+        \. "nyo	にょ	ニョ\<NL>"
+        \. "nyu	にゅ	ニュ\<NL>"
+        \. "o	お	オ\<NL>"
+        \. "pp	っ	ッ	p\<NL>"
+        \. "pa	ぱ	パ\<NL>"
+        \. "pe	ぺ	ペ\<NL>"
+        \. "pi	ぴ	ピ\<NL>"
+        \. "po	ぽ	ポ\<NL>"
+        \. "pu	ぷ	プ\<NL>"
+        \. "pya	ぴゃ	ピャ\<NL>"
+        \. "pye	ぴぇ	ピェ\<NL>"
+        \. "pyi	ぴぃ	ピィ\<NL>"
+        \. "pyo	ぴょ	ピョ\<NL>"
+        \. "pyu	ぴゅ	ピュ\<NL>"
+        \. "rr	っ	ッ	r\<NL>"
+        \. "ra	ら	ラ\<NL>"
+        \. "re	れ	レ\<NL>"
+        \. "ri	り	リ\<NL>"
+        \. "ro	ろ	ロ\<NL>"
+        \. "ru	る	ル\<NL>"
+        \. "rya	りゃ	リャ\<NL>"
+        \. "rye	りぇ	リェ\<NL>"
+        \. "ryi	りぃ	リィ\<NL>"
+        \. "ryo	りょ	リョ\<NL>"
+        \. "ryu	りゅ	リュ\<NL>"
+        \. "ss	っ	ッ	s\<NL>"
+        \. "sa	さ	サ\<NL>"
+        \. "se	せ	セ\<NL>"
+        \. "sha	しゃ	シャ\<NL>"
+        \. "she	しぇ	シェ\<NL>"
+        \. "shi	し	シ\<NL>"
+        \. "sho	しょ	ショ\<NL>"
+        \. "shu	しゅ	シュ\<NL>"
+        \. "si	し	シ\<NL>"
+        \. "so	そ	ソ\<NL>"
+        \. "su	す	ス\<NL>"
+        \. "sya	しゃ	シャ\<NL>"
+        \. "sye	しぇ	シェ\<NL>"
+        \. "syi	しぃ	シィ\<NL>"
+        \. "syo	しょ	ショ\<NL>"
+        \. "syu	しゅ	シュ\<NL>"
+        \. "tt	っ	ッ	t\<NL>"
+        \. "ta	た	タ\<NL>"
+        \. "te	て	テ\<NL>"
+        \. "tha	てぁ	テァ\<NL>"
+        \. "the	てぇ	テェ\<NL>"
+        \. "thi	てぃ	ティ\<NL>"
+        \. "tho	てょ	テョ\<NL>"
+        \. "thu	てゅ	テュ\<NL>"
+        \. "ti	ち	チ\<NL>"
+        \. "to	と	ト\<NL>"
+        \. "tsu	つ	ツ\<NL>"
+        \. "tu	つ	ツ\<NL>"
+        \. "tya	ちゃ	チャ\<NL>"
+        \. "tye	ちぇ	チェ\<NL>"
+        \. "tyi	ちぃ	チィ\<NL>"
+        \. "tyo	ちょ	チョ\<NL>"
+        \. "tyu	ちゅ	チュ\<NL>"
+        \. "u	う	ウ\<NL>"
+        \. "vv	っ	ッ	v\<NL>"
+        \. "va	う゛ぁ	ヴァ\<NL>"
+        \. "ve	う゛ぇ	ヴェ\<NL>"
+        \. "vi	う゛ぃ	ヴィ\<NL>"
+        \. "vo	う゛ぉ	ヴォ\<NL>"
+        \. "vu	う゛	ヴ\<NL>"
+        \. "ww	っ	ッ	w\<NL>"
+        \. "wa	わ	ワ\<NL>"
+        \. "we	うぇ	ウェ\<NL>"
+        \. "wi	うぃ	ウィ\<NL>"
+        \. "wo	を	ヲ\<NL>"
+        \. "wu	う	ウ\<NL>"
+        \. "xx	っ	ッ	x\<NL>"
+        \. "xa	ぁ	ァ\<NL>"
+        \. "xe	ぇ	ェ\<NL>"
+        \. "xi	ぃ	ィ\<NL>"
+        \. "xka	か	ヵ\<NL>"
+        \. "xke	け	ヶ\<NL>"
+        \. "xo	ぉ	ォ\<NL>"
+        \. "xtsu	っ	ッ\<NL>"
+        \. "xtu	っ	ッ\<NL>"
+        \. "xu	ぅ	ゥ\<NL>"
+        \. "xwa	ゎ	ヮ\<NL>"
+        \. "xwe	ゑ	ヱ\<NL>"
+        \. "xwi	ゐ	ヰ\<NL>"
+        \. "xya	ゃ	ャ\<NL>"
+        \. "xyo	ょ	ョ\<NL>"
+        \. "xyu	ゅ	ュ\<NL>"
+        \. "yy	っ	ッ	y\<NL>"
+        \. "ya	や	ヤ\<NL>"
+        \. "ye	いぇ	イェ\<NL>"
+        \. "yo	よ	ヨ\<NL>"
+        \. "yu	ゆ	ユ\<NL>"
+        \. "zz	っ	ッ	z\<NL>"
+        \. "z,	‥\<NL>"
+        \. "z-	~\<NL>"
+        \. "z.	…\<NL>"
+        \. "z/	・\<NL>"
+        \. "z[	『\<NL>"
+        \. "z]	』\<NL>"
+        \. "za	ざ	ザ\<NL>"
+        \. "ze	ぜ	ゼ\<NL>"
+        \. "zh	←\<NL>"
+        \. "zi	じ	ジ\<NL>"
+        \. "zj	↓\<NL>"
+        \. "zk	↑\<NL>"
+        \. "zl	→\<NL>"
+        \. "zo	ぞ	ゾ\<NL>"
+        \. "zu	ず	ズ\<NL>"
+        \. "zya	じゃ	ジャ\<NL>"
+        \. "zye	じぇ	ジェ\<NL>"
+        \. "zyi	じぃ	ジィ\<NL>"
+        \. "zyo	じょ	ジョ\<NL>"
+        \. "zyu	じゅ	ジュ\<NL>"
+        \. "-	ー\<NL>"
+        \. ":	:\<NL>"
+        \. ";	;\<NL>"
+        \. "!	!\<NL>"
+        \. "?	?\<NL>"
+        \. "[	「\<NL>"
+        \. "]	」\<NL>"
+endif
+
+if !exists("skk_rom_func_rules")
+  let skk_rom_func_rules = ""
+        \. ".	SkkCurrentKuten(kana)\<NL>"
+        \. ",	SkkCurrentTouten(kana)\<NL>"
+        \. "l	SkkAsciiMode(kana)\<NL>"
+        \. "L	SkkZeneiMode(kana)\<NL>"
+        \. "q	SkkToggleKana(kana)\<NL>"
+        \. "Q	SkkSetHenkanPoint1(kana)\<NL>"
+        \. "/	SkkAbbrevMode(kana)\<NL>"
+endif
+
+if !exists("skk_zenei_rules")
+  let skk_zenei_rules = ""
+        \. "  \<NL>"
+        \. "!!\<NL>"
+        \. "\"”\<NL>"
+        \. "##\<NL>"
+        \. "$$\<NL>"
+        \. "%%\<NL>"
+        \. "&&\<NL>"
+        \. "'’\<NL>"
+        \. "((\<NL>"
+        \. "))\<NL>"
+        \. "**\<NL>"
+        \. "++\<NL>"
+        \. ",,\<NL>"
+        \. "--\<NL>"
+        \. "..\<NL>"
+        \. "//\<NL>"
+        \. "00\<NL>"
+        \. "11\<NL>"
+        \. "22\<NL>"
+        \. "33\<NL>"
+        \. "44\<NL>"
+        \. "55\<NL>"
+        \. "66\<NL>"
+        \. "77\<NL>"
+        \. "88\<NL>"
+        \. "99\<NL>"
+        \. "::\<NL>"
+        \. ";;\<NL>"
+        \. "<<\<NL>"
+        \. "==\<NL>"
+        \. ">>\<NL>"
+        \. "??\<NL>"
+        \. "@@\<NL>"
+        \. "AA\<NL>"
+        \. "BB\<NL>"
+        \. "CC\<NL>"
+        \. "DD\<NL>"
+        \. "EE\<NL>"
+        \. "FF\<NL>"
+        \. "GG\<NL>"
+        \. "HH\<NL>"
+        \. "II\<NL>"
+        \. "JJ\<NL>"
+        \. "KK\<NL>"
+        \. "LL\<NL>"
+        \. "MM\<NL>"
+        \. "NN\<NL>"
+        \. "OO\<NL>"
+        \. "PP\<NL>"
+        \. "QQ\<NL>"
+        \. "RR\<NL>"
+        \. "SS\<NL>"
+        \. "TT\<NL>"
+        \. "UU\<NL>"
+        \. "VV\<NL>"
+        \. "WW\<NL>"
+        \. "XX\<NL>"
+        \. "YY\<NL>"
+        \. "ZZ\<NL>"
+        \. "[[\<NL>"
+        \. "\\¥\<NL>"
+        \. "]]\<NL>"
+        \. "^^\<NL>"
+        \. "__\<NL>"
+        \. "`‘\<NL>"
+        \. "aa\<NL>"
+        \. "bb\<NL>"
+        \. "cc\<NL>"
+        \. "dd\<NL>"
+        \. "ee\<NL>"
+        \. "ff\<NL>"
+        \. "gg\<NL>"
+        \. "hh\<NL>"
+        \. "ii\<NL>"
+        \. "jj\<NL>"
+        \. "kk\<NL>"
+        \. "ll\<NL>"
+        \. "mm\<NL>"
+        \. "nn\<NL>"
+        \. "oo\<NL>"
+        \. "pp\<NL>"
+        \. "qq\<NL>"
+        \. "rr\<NL>"
+        \. "ss\<NL>"
+        \. "tt\<NL>"
+        \. "uu\<NL>"
+        \. "vv\<NL>"
+        \. "ww\<NL>"
+        \. "xx\<NL>"
+        \. "yy\<NL>"
+        \. "zz\<NL>"
+        \. "{{\<NL>"
+        \. "||\<NL>"
+        \. "}}\<NL>"
+        \. "~~\<NL>"
+endif
+
+if !exists('skk_imdisable_state')
+  let skk_imdisable_state = 1
+endif
+
+" アスキーモードを示す文字列
+if !exists('g:skk_ascii_mode_string')
+  let g:skk_ascii_mode_string = 'SKK:aA'
+endif
+
+" かなモードを示す文字列
+if !exists('g:skk_hira_mode_string')
+  let g:skk_hira_mode_string = 'SKK:あ'
+endif
+
+" カナモードを示す文字列
+if !exists('g:skk_kata_mode_string')
+  let g:skk_kata_mode_string = 'SKK:ア'
+endif
+
+" 全英モードを示す文字列
+if !exists('g:skk_zenei_mode_string')
+  let g:skk_zenei_mode_string = 'SKK:A'
+endif
+
+" SKK abbrev モードを示す文字列
+if !exists('g:skk_abbrev_mode_string')
+  let g:skk_abbrev_mode_string = 'SKK:aあ'
+endif
+
+" カーソルに色付けする
+if !exists('g:skk_use_color_cursor')
+  let g:skk_use_color_cursor = 0
+endif
+
+" かなモードを示すカーソル色
+if !exists('g:skk_cursor_hira_color')
+  let g:skk_cursor_hira_color = ''
+endif
+
+" カナモードを示すカーソル色
+if !exists('g:skk_cursor_kata_color')
+  let g:skk_cursor_kata_color = ''
+endif
+
+" 全英モードを示すカーソル色
+if !exists('g:skk_cursor_zenei_color')
+  let g:skk_cursor_zenei_color = ''
+endif
+
+" アスキーモードを示すカーソル色
+if !exists('g:skk_cursor_ascii_color')
+  let g:skk_cursor_ascii_color = ''
+endif
+
+" SKK abbrev モードを示すカーソル色
+if !exists('g:skk_cursor_abbrev_color')
+  let g:skk_cursor_abbrev_color = ''
+endif
+
+" 入力されたら▽モードにするキー(sticky key)
+if !exists('g:skk_sticky_key')
+  let g:skk_sticky_key = ""
+endif
+
+" 明示的な確定動作を行うキー
+" 入力された文字列と直接比較されるので \ が必要
+if !exists('g:skk_kakutei_key')
+  let g:skk_kakutei_key = "\<C-j>"
+endif
+
+if !exists('skk_remap_lang_mode')
+  let skk_remap_lang_mode = 0
+endif
+
+if !exists('skk_enable_hook')
+  let skk_enable_hook = ''
+endif
+
+if !exists('skk_jisyo_encoding')
+  let skk_jisyo_encoding = 'guess'
+endif
+
+if !exists('skk_large_jisyo_encoding')
+  let skk_large_jisyo_encoding = 'guess'
+endif
+" }}}
+
+" script variables {{{
+
+let s:skk_rule_compiled = 0	" ルールを解析済みか?
+let s:skk_in_cmdline = 0	" コマンドライン入力中か?
+let s:skk_jisyo_modified = 0	" ユーザ辞書を変更したか?
+let s:skk_saved_ru = &ruler		" ruler を変更するため保存しておく。
+let s:skk_saved_ruf = &rulerformat	" rulerformat を変更するため保存しておく。
+" s:skk_hiragana と s:skk_katakana はひらがな<->カタカナ変換で使う。
+let s:skk_hiragana = "ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん"
+let s:skk_katakana = "ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲン"
+" コマンドラインでは削除が行われたときに
+" s:skk_cmdline_str s:skk_cmdline_pos が let され、入力のたびに unlet される。
+" 上記の変数が存在していれば s:SkkGetline() s:SkkCursorCol() がその値を返す。
+let s:bs_save = &backspace
+let s:thisfile = expand("<sfile>")	" for RULES section
+
+" }}}
+
+" Helper Functions {{{
+
+" ValidVarChar
+" 文字列を受け取り、変数に使える形にして返す。
+" 変数に使えない文字は __文字コード__ の形で返す。
+function! s:ValidVarChar(str)
+  let result = ''
+  let i = 0
+  while a:str[i] != ''
+    if a:str[i] =~ '\w'	" [0-9A-Za-z_]
+      let result = result . a:str[i]
+    else
+      let result = result . "__" . char2nr(a:str[i]) . "__"
+    endif
+    let i = i + 1
+  endwhile
+  return result
+endfunction
+
+" IsInclude
+" parent の子に ch が含まれているか?
+function! s:IsInclude(parent, ch)
+  return s:HasChild(a:parent) && a:ch != '' &&
+        \stridx(s:skk_rules_{a:parent}_child, a:ch) != -1
+endfunction
+
+" DoInclude
+" parent の子に ch を含める
+function! s:DoInclude(parent, ch)
+  if !s:HasChild(a:parent)
+    let s:skk_rules_{a:parent}_child = a:ch
+  elseif !s:IsInclude(a:parent, a:ch)
+    let s:skk_rules_{a:parent}_child = s:skk_rules_{a:parent}_child . a:ch
+  endif
+endfunction
+
+" HasChild
+" parent に子があるか?
+function! s:HasChild(parent)
+  return exists("s:skk_rules_{a:parent}_child")
+endfunction
+
+" GetRest
+" rom の残す文字を返す。なければ空文字。
+function! s:GetRest(rom)
+  if exists("s:skk_rules_{a:rom}_rest")
+    return s:skk_rules_{a:rom}_rest
+  else
+    return ''
+  endif
+endfunction
+
+" SkkDowncase
+" 現時点ではただ小文字を返す。
+function! s:SkkDowncase(ch)
+  return tolower(a:ch)
+endfunction
+
+" SkkGetKana
+" モードによりひらがなかカタカナを返す。
+function! s:SkkGetKana(elem)
+  if b:skk_mode == 'hira'
+    let result = matchstr(a:elem, '^[^\t]*')
+  else
+    let result = substitute(a:elem, '^[^\t]*\t\([^\t]\+\)\t\?', '\1', '')
+    if strlen(result) == 0
+      let result = matchstr(a:elem, '^[^\t]*')
+    endif
+  endif
+  return result
+endfunction
+
+" SkkGetLine (低レベルファンクション: cmdline のことを知っている。)
+function! s:SkkGetLine(lnum)
+  if s:skk_in_cmdline == 0
+    return getline(a:lnum)
+  else
+    if exists("s:skk_cmdline_str")
+      return s:skk_cmdline_str
+    else
+      return getcmdline()
+    endif
+  endif
+endfunction
+
+" SkkCursorLine (低レベルファンクション: cmdline のことを知っている。)
+function! s:SkkCursorLine()
+  if s:skk_in_cmdline == 0
+    return exists("s:skk_cur_line") ? s:skk_cur_line : line(".")
+  else
+    return 0
+  endif
+endfunction
+
+" SkkCursorCol (低レベルファンクション: cmdline のことを知っている。)
+function! s:SkkCursorCol()
+  if s:skk_in_cmdline == 0
+    return exists("s:skk_cur_col") ? s:skk_cur_col : col(".")
+  else
+    if exists("s:skk_cmdline_pos")
+      return s:skk_cmdline_pos
+    else
+      return getcmdpos()
+    endif
+  endif
+endfunction
+
+" SkkWait sec秒間待つ。何か入力があれば、その文字を返す。
+function! s:SkkWait(sec)
+  let i = a:sec * 10
+  while i > 0
+    let ch = getchar(0)
+    if ch != 0
+      return nr2char(ch)
+    endif
+    sleep 100m
+    let i = i - 1
+  endwhile
+  return ""
+endfunction
+
+" msg に対して yes なら 1 を no なら 0 を返す。
+function! s:SkkYesNo(msg)
+  let text = ""
+  let prompt = a:msg . "(yes or no) "
+  let ims_save = &imsearch
+  let arg = maparg("\<C-g>", "c")
+  try
+    cnoremap <buffer> <C-g> <C-\>e'no'<CR><CR>
+    let &imsearch = 0
+    while 1
+      let str = input(prompt, text)
+      if str == "yes"
+        return 1
+      elseif str == "no"
+        return 0
+      else
+        echon "\rPlease answer yes or no."
+        let text = s:SkkWait(1)
+      endif
+    endwhile
+  catch /^Vim:Interrupt$/
+    return 0
+  finally
+    let &imsearch = ims_save
+    if arg == ""
+      silent! cunmap <buffer> <C-g>
+    else
+      silent exe "cnoremap <buffer> <C-g> " . arg
+    endif
+    echon "\n"
+  endtry
+endfunction
+
+function! s:SkkEcho(msg, highlight, wait)
+  exe "echohl " . a:highlight
+  echo a:msg
+  echohl None
+  return a:wait ? s:SkkWait(a:wait) : ""
+endfunction
+
+" // で区切られたs1とs2の和集合を返す。
+function! s:SkkMerge(s1, s2)
+  if a:s1 == ""
+    return a:s2
+  elseif a:s2 == ""
+    return a:s1
+  endif
+  let result = a:s1
+  let start = stridx(a:s2, '/')
+  let pos = matchend(a:s2, '/[^/]\+/')
+  while pos != -1
+    let elem = strpart(a:s2, start + 1, pos - start - 1)
+    if stridx(result, '/' . elem) == -1
+      let result = result . elem
+    endif
+    let start = pos - 1
+    let pos = matchend(a:s2, '/[^/]\+/', start)
+  endwhile
+  return result
+endfunction
+
+" s1に含まれ、s2に含まれていない要素の集合を返す。
+function! s:SkkPurge(s1, s2)
+  if a:s2 == ""
+    return a:s1
+  elseif a:s1 == ""
+    return ""
+  endif
+  let result = ""
+  let start = stridx(a:s1, '/')
+  let pos = matchend(a:s1, '/[^/]\+\ze/')
+  while pos != -1
+    let elem = strpart(a:s1, start, pos - start)
+    if stridx(a:s2, elem . '/') == -1
+      let result = result . elem
+    endif
+    let start = pos
+    let pos = matchend(a:s1, '/[^/]\+\ze/', start)
+  endwhile
+  return result == "" ? result : result . '/'
+endfunction
+
+" b:skk_mode, b:skk_abbrev_mode_on に合わせて、カーソルの色を変更する
+function! s:SkkSetCursorColor()
+  if has('gui_running') && g:skk_use_color_cursor
+    if b:skk_abbrev_mode_on
+      " royalblue:#4169e1
+      let color = (&background == 'light' ? '#4169e1' : '#4169e1')
+      if g:skk_cursor_abbrev_color != ''
+        let color = g:skk_cursor_abbrev_color
+      endif
+    elseif b:skk_mode == 'hira'
+      " coral4:#8b3e2f, pink:#ffc0cb
+      let color = (&background == 'light' ? '#8b3e2f' : '#ffc0cb')
+      if g:skk_cursor_hira_color != ''
+        let color = g:skk_cursor_hira_color
+      endif
+    elseif b:skk_mode == 'kata'
+      " forestgreen:#228b22, green:#00ff00
+      let color = (&background == 'light' ? '#228b22' : '#00ff00')
+      if g:skk_cursor_kata_color != ''
+        let color = g:skk_cursor_kata_color
+      endif
+    elseif b:skk_mode == 'zenei'
+      " gold:#ffd700
+      let color = (&background == 'light' ? '#ffd700' : '#ffd700')
+      if g:skk_cursor_zenei_color != ''
+        let color = g:skk_cursor_zenei_color
+      endif
+    elseif b:skk_mode == 'ascii'
+      " ivory4:#8b8b83, gray:#bebebe
+      let color = (&background == 'light' ? '#8b8b83' : '#bebebe')
+      if g:skk_cursor_ascii_color != ''
+        let color = g:skk_cursor_ascii_color
+      endif
+    endif
+    execute 'highlight lCursor guibg=' . color
+  endif
+endfunction
+" }}}
+
+" Initialization {{{
+
+" SkkBufInit
+" バッファ変数を初期化する
+function! s:SkkBufInit()
+  let b:skk_on = 0		" 0=off 1=on
+  let b:skk_mode = g:skk_initial_mode	" hira|kata|zenei|ascii
+  let b:skk_line = 0		" 現在の行 (hira|kata だけで使う)
+  let b:skk_rom = ""		" 入力途中のローマ字 (hira|kata だけで使う)
+  let b:skk_romv = ""		" 入力途中のローマ字 変数名
+  let b:skk_rstart = 0		" ローマ字のスタート桁 (hira|kata だけで使う)
+  let b:skk_henkan_mode = 0
+  " 0=■モード 1=▽モード 2=▽モード (送りがな入力中) 3=▼モード
+  " 4=選択方式で確定したとき
+  let b:skk_abbrev_mode_on = 0	" abbrev モードか?
+  if g:skk_imdisable_state == 0 || g:skk_imdisable_state == 1
+    let &imdisable = g:skk_imdisable_state
+  endif
+  if !exists("b:skk_fo_save")
+    let b:skk_fo_save = &formatoptions
+  endif
+  let b:skk_autofill = 0	" Auto Fill モードか?
+  if !exists("b:skk_map_silent")
+    let b:skk_map_silent = 2	" <silent> 付きでマップしたか?
+  endif
+  call s:SkkSetCursorColor() " カーソル色の設定
+endfunction
+
+" SkkRuleCompile
+" skk_rom_kana_rules を解析して木構造らしきものにする。
+" 例えば ba	ば	バ\<NL> という行があったとすると
+" skk_rules_b_child = "a"
+" skk_rules_ba = "ば	バ"
+" というように変数を作っていく。
+" skk_rules_b_child というのは `b' の後につながるアルファベットで
+" ba bi bu be bo bya ... というローマ字があれば "aiueoy" となる。
+" skk_rules_ba というのは
+" `ba' が入力されたら確定する要素があるということを示す。
+" skk_rules_dd_rest というのは `dd' という入力があったときに
+" `っ' という確定要素の他に残す文字列。
+function! SkkRuleCompile()
+  " ローマ字→かなの処理
+  if exists("g:skk_rom_kana_rules")
+    let ptr = g:skk_rom_kana_rules
+    if exists("g:skk_user_rom_kana_rules")
+      let ptr = ptr . g:skk_user_rom_kana_rules
+    endif
+    while ptr != ""
+      let line = matchstr(ptr, "^[^\<NL>]*")
+      let ptr = strpart(ptr, strlen(line) + 1)
+      let rom = matchstr(line, '^[^\t]\+')
+      let kana = matchstr(line, '[^\t]\+\t\?[^\t]*\t\?', strlen(rom))
+      if strlen(kana) == 0
+        continue
+      endif
+      let line = strpart(line, strlen(rom) + strlen(kana) + 1)
+      let idx = 0
+      let romvar = ""
+      while rom[idx] != ""
+        let ch = rom[idx]
+        if strlen(romvar) != 0
+          call s:DoInclude(romvar, ch)
+        endif
+        let romvar = romvar . s:ValidVarChar(ch)
+        let idx = idx + 1
+      endwhile
+      let s:skk_rules_{romvar} = kana
+      if strlen(line) != 0
+        let s:skk_rules_{romvar}_rest = line
+      endif
+    endwhile
+    unlet g:skk_rom_kana_rules
+  endif
+  " ローマ字→関数の処理
+  if exists("g:skk_rom_func_rules")
+    let ptr = g:skk_rom_func_rules
+    if exists("g:skk_user_rom_func_rules")
+      let ptr = ptr . g:skk_user_rom_func_rules
+    endif
+    while ptr != ""
+      let line = matchstr(ptr, "^[^\<NL>]*")
+      let ptr = strpart(ptr, strlen(line) + 1)
+      let rom = matchstr(line, '^[^\t]\+')
+      let func = strpart(line, strlen(rom) + 1)
+      if strlen(rom) == 0 || strlen(func) == 0
+        continue
+      endif
+      let idx = 0
+      let romvar = ""
+      while rom[idx] != ""
+        let ch = rom[idx]
+        if strlen(romvar) != 0
+          call s:DoInclude(romvar, ch)
+        endif
+        let romvar = romvar . s:ValidVarChar(ch)
+        let idx = idx + 1
+      endwhile
+      let s:skk_rules_{romvar}_func = func
+    endwhile
+    unlet g:skk_rom_func_rules
+  endif
+  " アルファベット→全角英数の処理
+  if exists("g:skk_zenei_rules")
+    let ptr = g:skk_zenei_rules
+    if exists("g:skk_user_zenei_rules")
+      let ptr = ptr . g:skk_user_zenei_rules
+    endif
+    while ptr != ''
+      let line = matchstr(ptr, "[^\<NL>]*")
+      let ptr = strpart(ptr, strlen(line) + 1)
+      let han = char2nr(line[0])
+      let zen = matchstr(line, ".*", 1)
+      if han >= 0x80 || strlen(zen) == 0
+        continue
+      endif
+      let s:skk_zenei_rules_{han} = zen
+    endwhile
+    unlet g:skk_zenei_rules
+  endif
+  let s:skk_rule_compiled = 1
+endfunction
+
+" global mapping
+inoremap <silent> <Plug>(skk-toggle-im) <C-r>=SkkToggle()<CR>
+cnoremap          <Plug>(skk-toggle-im) <C-r>=SkkToggle()<CR>
+
+inoremap <silent> <Plug>(skk-enable-im) <C-r>=SkkEnable()<CR>
+cnoremap          <Plug>(skk-enable-im) <C-r>=SkkEnable()<CR>
+
+inoremap <silent> <Plug>(skk-disable-im) <C-r>=SkkDisable()<CR>
+cnoremap          <Plug>(skk-disable-im) <C-r>=SkkDisable()<CR>
+
+if g:skk_control_j_key != ""
+  exe "imap" g:skk_control_j_key "<Plug>(skk-toggle-im)"
+  exe "cmap" g:skk_control_j_key "<Plug>(skk-toggle-im)"
+endif
+
+nnoremap <silent> <Plug>(skk-save-jisyo)    :call <SID>SkkSaveJisyo(1, 0)<CR>
+if g:skk_manual_save_jisyo_keys != ""
+  exe "nmap" g:skk_manual_save_jisyo_keys "<Plug>(skk-save-jisyo)"
+endif
+
+" 終了時に辞書の保存
+function! SkkSetAutoSaveJisyo(nr)
+  augroup skk
+    autocmd!
+    if a:nr == 0
+      autocmd VimLeavePre * call <SID>SkkSaveJisyo(1, 0)
+    elseif a:nr > 0
+      autocmd VimLeavePre * call <SID>SkkSaveJisyo(0, 0)
+    endif
+  augroup END
+  let g:skk_auto_save_jisyo = a:nr
+endfunction
+
+call SkkSetAutoSaveJisyo(g:skk_auto_save_jisyo)
+
+" 暇なときに時間のかかることをやってしまう。
+augroup skk-setup
+  autocmd!
+  autocmd CursorHold * call s:SkkSetup()
+augroup END
+
+function! s:SkkSetup()
+  augroup skk-setup
+    autocmd!
+  augroup END
+  augroup! skk-setup
+  if s:skk_rule_compiled == 0
+    call SkkRuleCompile()
+  endif
+endfunction
+" }}}
+
+" Mode Change {{{
+
+function! s:SkkOn()
+  let b:skk_on = 1
+  let &rulerformat = "%31(%-14{SkkGetModeStr()}%l,%c%V%=%P%)"
+  let &ruler = 1
+endfunction
+
+function! SkkEnable()
+  if !exists("b:skk_on")
+    call s:SkkBufInit()
+  endif
+  if b:skk_on
+    return ''
+  endif
+
+  let s:skk_in_cmdline = mode() == "c"
+  if s:skk_rule_compiled == 0
+    call SkkRuleCompile()
+  endif
+  call s:SkkOn()
+  set cpo-=v
+  set cpo-=<
+  call SkkMap(s:skk_in_cmdline == 0)
+  call s:SkkMapCR()
+
+  " Call each function separated by ','.
+  let hook = g:skk_enable_hook
+  while hook != ''
+    let comma_pos = stridx(hook, ',')
+    if comma_pos !=# -1
+      let fn = strpart(hook, 0, comma_pos)
+      let hook = strpart(hook, strlen(fn) + 1)
+    else
+      let fn = hook
+      let hook = ''
+    endif
+
+    if exists('*' . fn)    " XXX `exists('*' . fn)` is supported by old Vim?
+      call {fn}()
+    endif
+  endwhile
+
+  let &l:formatoptions = ""
+  if s:skk_in_cmdline && v:version >= 603
+    redrawstatus
+  endif
+  return "\<C-^>"
+endfunction
+
+function! SkkDisable()
+  if !exists("b:skk_on")
+    call s:SkkBufInit()
+  endif
+  if !b:skk_on
+    return ''
+  endif
+
+  let s:skk_in_cmdline = mode() == "c"
+  let kana = s:SkkKakutei()
+  if !g:skk_keep_state
+    call s:SkkBufInit()
+  endif
+  if s:skk_in_cmdline == 0
+    call s:SkkUnmapNormal()
+  endif
+  call SkkMap(0)
+  let b:skk_on = 0
+  let &rulerformat = s:skk_saved_ruf
+  let &ruler = s:skk_saved_ru
+  let &backspace = s:bs_save
+  let &l:formatoptions = b:skk_fo_save
+  return kana . "\<C-^>"
+endfunction
+
+function! SkkToggle()
+  if !exists("b:skk_on")
+    call s:SkkBufInit()
+  endif
+
+  if b:skk_on
+    return SkkDisable()
+  else
+    return SkkEnable()
+  endif
+endfunction
+
+function! SkkIsEnabled()
+  return exists('b:skk_on') && b:skk_on
+endfunction
+
+" SkkToggleKana
+" ■モード・▼モード時にはひらがな入力モード・カタカナ入力モードを切り替える。
+" ▽モード時には b:skk_hstart からカーソルの間をひらがな入力モードのときには
+" カタカナに、カタカナ入力モードのときにはひらがなに変換する。
+function! SkkToggleKana(kana)
+  if b:skk_henkan_mode == 1 || b:skk_henkan_mode == 2
+    let kana = a:kana . s:SkkCleanRom()
+    let ostart = b:skk_henkan_mode == 2 ? b:skk_ostart : s:SkkCursorCol()
+    let hstart = b:skk_hstart + strlen(g:skk_marker_white) - 1
+    let kana = strpart(s:SkkGetLine("."), hstart, ostart - 1 - hstart) . kana
+    call s:SkkEraseYomi()
+    let b:skk_henkan_mode = 0
+    return b:skk_mode == 'hira' ? s:SkkHira2Kata(kana) : s:SkkKata2Hira(kana)
+  else
+    return b:skk_mode == 'hira' ? SkkKataMode(a:kana) : SkkHiraMode(a:kana)
+  endif
+endfunction
+
+function! SkkAbbrev2Zenei()
+  if b:skk_abbrev_mode_on == 0
+    return ""
+  endif
+  let hstart = b:skk_hstart + strlen(g:skk_marker_white) - 1
+  let str = strpart(s:SkkGetLine("."), hstart, s:SkkCursorCol() - 1 - hstart)
+  call s:SkkCleanRom()
+  call s:SkkEraseYomi()
+  let b:skk_henkan_mode = 0
+  let b:skk_abbrev_mode_on = 0
+  return s:SkkAscii2Zenei(str)
+endfunction
+
+" SkkHiraMode
+" ひらがな入力モードにする。
+function! SkkHiraMode(kana)
+  let kana = a:kana . s:SkkKakutei()
+  let b:skk_mode = 'hira'
+  call s:SkkSetCursorColor()
+  return kana
+endfunction
+
+" SkkKataMode
+" カタカナ入力モードにする。
+function! SkkKataMode(kana)
+  let kana = a:kana . s:SkkKakutei()
+  let b:skk_mode = 'kata'
+  call s:SkkSetCursorColor()
+  return kana
+endfunction
+
+" SkkZeneiMode
+" 全角英数入力モードにする。
+function! SkkZeneiMode(kana)
+  let kana = a:kana . s:SkkKakutei()
+  let b:skk_mode = 'zenei'
+  call s:SkkSetCursorColor()
+  return kana
+endfunction
+
+" SkkAsciiMode
+" ASCII直接入力モードにする。
+function! SkkAsciiMode(kana)
+  let kana = a:kana . s:SkkKakutei()
+  let b:skk_mode = 'ascii'
+  call s:SkkSetCursorColor()
+  return kana
+endfunction
+
+function! SkkAbbrevMode(kana)
+  if b:skk_henkan_mode == 1 || b:skk_henkan_mode == 2
+    call s:SkkEcho("Already in ▽ mode", "WarningMsg", 1)
+    return ""
+  endif
+  let kana = SkkSetHenkanPoint1(a:kana)
+  let b:skk_abbrev_mode_on = 1
+  call s:SkkSetCursorColor()
+  return kana
+endfunction
+
+" rulerformat で表示する現在のモード
+function! SkkGetModeStr()
+  let m = stridx("iRc", mode())		" 0..1=Insert 2=cmdline
+  if !exists("b:skk_on") "|| b:skk_on == 0
+    let str = " "	" 空文字だと幅がずれる。
+  elseif m == -1
+    let str = " "
+  elseif m < 2 && &iminsert == 0
+    let str = " "
+  elseif m == 2 && s:skk_in_cmdline == 0
+    let str = " "
+  elseif b:skk_abbrev_mode_on == 1
+    let str = "[" . g:skk_abbrev_mode_string . "]"
+  elseif b:skk_mode == "hira"
+    let str = "[" . g:skk_hira_mode_string . "]"
+  elseif b:skk_mode == "kata"
+    let str = "[" . g:skk_kata_mode_string . "]"
+  elseif b:skk_mode == "zenei"
+    let str = "[" . g:skk_zenei_mode_string . "]"
+  else
+    let str = "[" . g:skk_ascii_mode_string . "]"
+  endif
+  if exists("b:skk_autofill") && b:skk_autofill && str != " "
+    let str = str . "FILL"
+  endif
+  return str
+endfunction
+" }}}
+
+" Erase {{{
+
+" n個の <C-h> を返す。
+function! s:SkkMakeBS(n)
+  let i = 0
+  let bs = ""
+  while i < a:n
+    let bs = bs . "\<C-h>"
+    let i = i + 1
+  endwhile
+  return bs
+endfunction
+
+" <C-h> で組み立てられるか? 削除ポイントがカーソル位置より前なら可。
+function! s:SkkCanBS(dell, delc, curl, curc)
+  if a:dell == a:curl
+    return a:delc <= a:curc
+  else
+    return a:dell < a:curl
+  endif
+endfunction
+
+" SkkDeleteRange line行の start から end までを削除する。
+" (低レベルファンクション: cmdline のことを知っている。)
+function! s:SkkDeleteRange(line, start, end)
+  if a:start >= a:end
+    return
+  endif
+  if s:skk_in_cmdline == 0
+    let lnum = s:SkkCursorLine()
+    let cnum = s:SkkCursorCol()
+    if s:SkkCanBS(a:line, a:start, lnum, cnum)
+      if lnum == a:line
+        let s = strpart(getline(a:line), a:start - 1, cnum - a:start)
+        let s:skk_cur_col = cnum + a:start - a:end
+      else
+        let s = strpart(getline(a:line), a:start - 1) . "\n"
+        let i = a:line + 1
+        while i < lnum
+          let s = s . getline(i) . "\n"
+          let i = i + 1
+        endwhile
+        let s = s . strpart(getline(lnum), 0, cnum - 1)
+        if indent(lnum) > 0 && &paste == 0
+          set paste
+          let s:skk_pasted = 1
+        endif
+        set backspace=start,indent,eol
+      endif
+      let bs = s:SkkMakeBS(strlen(substitute(s, ".", "x", "g")))
+      let bs = bs . strpart(s, a:end - a:start)
+      let s:skk_bs_str = exists("s:skk_bs_str") ? s:skk_bs_str . bs : bs
+    else
+      let str = strpart(getline(a:line), a:start - 1, a:end - a:start)
+      let len = strlen(substitute(str, ".", "x", "g"))
+      if len > 0
+        if lnum == a:line && cnum > a:start
+          let cnum = cnum + a:start - a:end
+        endif
+        call cursor(a:line, a:start)
+        exe "normal! " . len . "\"_x"
+        call cursor(lnum, cnum)
+      endif
+    endif
+  else
+    let str = s:SkkGetLine(0)
+    let str = strpart(str, 0, a:start - 1) . strpart(str, a:end - 1)
+    let s:skk_cmdline_str = str
+    let s:skk_cmdline_pos = s:SkkCursorCol() - a:end + a:start
+  endif
+endfunction
+
+" SkkEraseRom
+" ローマ字を削除する。
+function! s:SkkEraseRom()
+  if b:skk_rom_erased
+    return
+  endif
+  let b:skk_rom_erased = 1
+  let len = strlen(b:skk_rom)
+  let c = s:SkkCursorCol()
+  call s:SkkDeleteRange(s:SkkCursorLine(), c - len, c)
+endfunction
+
+" SkkCleanRom
+" 確定できるものがあればそれを返して skk_rom を空にする。
+function! s:SkkCleanRom()
+  let kana = ''
+  if b:skk_rom != ''
+    if exists("s:skk_rules_{b:skk_romv}")
+      let kana = s:SkkGetKana(s:skk_rules_{b:skk_romv})
+    endif
+    call s:SkkEraseRom()
+    let b:skk_rom = ''
+    let b:skk_romv = ''
+  endif
+  let b:skk_rstart = 0
+  unlet! b:skk_comp_key
+  return kana
+endfunction
+
+" SkkEraseYomi
+" skk_hstart からカーソル位置まで削除する。
+function! s:SkkEraseYomi()
+  let lnum = s:SkkCursorLine()
+  if b:skk_line == lnum
+    call s:SkkDeleteRange(lnum, b:skk_hstart, s:SkkCursorCol())
+  else
+    call s:SkkEraseYomi2(b:skk_line, b:skk_hstart, lnum, s:SkkCursorCol())
+  endif
+endfunction
+
+" SkkEraseYomi2 複数行バージョン
+function! s:SkkEraseYomi2(lstart, start, lend, end)
+  let str = strpart(getline(a:lstart), a:start - 1) . "\n"
+  let i = a:lstart + 1
+  while i < a:lend
+    let str = str . getline(i) . "\n"
+    let i = i + 1
+  endwhile
+  let str = str . strpart(getline(a:lend), 0, a:end - 1)
+  let len = strlen(substitute(str, ".", "x", "g"))
+  if len > 0
+    let bs = s:SkkMakeBS(len)
+    let s:skk_bs_str = exists("s:skk_bs_str") ? s:skk_bs_str . bs : bs
+    let s:skk_cur_col = a:start + 1
+    let s:skk_cur_line = a:lstart
+    set backspace=indent,eol
+  endif
+endfunction
+" }}}
+
+" mapping functions {{{
+
+" SkkControlJ
+" lmap の中から呼ばれる。skk を on にすることはない。
+" b:skk_mode == 'hira'|'kata' && 未確定要素がある -> 確定
+" b:skk_mode == 'hira'|'kata' && 未確定要素がない -> b:skk_on = 0
+" b:skk_mode == 'zenei'|'ascii' -> b:skk_mode = 'hira'
+function! s:SkkControlJ()
+  if b:skk_mode =~ 'hira\|kata'
+    if b:skk_henkan_mode != 0
+      return s:SkkKakutei()
+    else
+      return SkkDisable()
+    endif
+  else		" zenei|ascii
+    return SkkHiraMode("")
+  endif
+endfunction
+
+" SkkBackspace
+" ▽モードで▽より前なら確定する。
+" ▼モードなら確定して直前の文字を削除する。
+" ローマ字入力中なら直前のローマ字を消す。
+" 入力途中のローマ字がなければ前のかなを消す。
+function! s:SkkBackspace()
+  if b:skk_mode =~ 'hira\|kata'
+    if strlen(b:skk_rom) > 0
+      let b:skk_rom = strpart(b:skk_rom, 0, strlen(b:skk_rom) - 1)
+      let b:skk_romv = s:ValidVarChar(b:skk_rom)
+    elseif b:skk_henkan_mode == 1 && s:SkkCursorCol() <= b:skk_hstart + strlen(g:skk_marker_white)
+      call s:SkkKakutei()
+      return ''
+    elseif b:skk_henkan_mode == 3
+      call s:SkkKakutei()
+    else
+      let b:skk_rstart = 0
+    endif
+  endif
+  unlet! b:skk_comp_key
+  return "\<C-h>"
+endfunction
+
+" SkkCancell
+function! s:SkkCancel()
+  if b:skk_henkan_mode == 1 && s:SkkInCompletion()
+    let key = b:skk_comp_key
+    unlet b:skk_comp_key
+    call s:SkkEraseYomi()
+    return g:skk_marker_white . key
+  endif
+  call s:SkkCleanRom()	" 戻り値は捨てる。
+  if b:skk_henkan_mode == 0
+  elseif b:skk_henkan_mode == 1 || b:skk_henkan_mode == 2
+    call s:SkkEraseYomi()
+    let b:skk_henkan_mode = 0
+    let b:skk_abbrev_mode_on = 0
+  elseif b:skk_henkan_mode >= 3
+    call s:SkkFaceOff()
+    call s:SkkEraseYomi()
+    let b:skk_ostart = 0
+    let b:skk_henkan_mode = 1
+    return g:skk_marker_white . b:skk_midasi . b:skk_okurigana
+  endif
+  return ''
+endfunction
+
+function! SkkMap(silent)
+  if hasmapto("<SID>SkkKey", "l") && b:skk_map_silent == a:silent
+    return
+  endif
+  let b:skk_map_silent = a:silent
+  let mapstr = (g:skk_remap_lang_mode ? 'lmap' : 'lnoremap') . ' <buffer>'
+  if b:skk_map_silent
+    let mapstr = mapstr . '<silent>'
+  endif
+  let mapstr = mapstr . ' '
+  lmapclear <buffer>
+  let i = char2nr(" ")
+  let tilde = char2nr("~")
+  while i <= tilde
+    let ch = "<Char-" . i . ">"
+    exe mapstr . ch . " <C-r>=<SID>SkkKey(\"" . escape(nr2char(i), '"\|') . "\")<CR>"
+    let i = i + 1
+  endwhile
+  exe mapstr . '<Tab>	<C-r>=<SID>SkkKey("<C-v><Tab>")<CR>'
+  exe mapstr . '<CR>	<C-r>=<SID>SkkKey("<C-v><CR>")<CR><CR>'
+  exe mapstr . '<C-j>	<C-r>=<SID>SkkKey("<C-v><C-j>")<CR>'
+  exe mapstr . '<C-g>	<C-r>=<SID>SkkKey("<C-v><C-g>")<CR>'
+  exe mapstr . '<BS>	<C-r>=<SID>SkkKey("<C-v><C-h>")<CR>'
+  exe mapstr . '<C-h>	<C-r>=<SID>SkkKey("<C-v><C-h>")<CR>'
+  exe mapstr . '<Home>	<C-r>=<SID>SkkKey("<C-v><C-a>")<CR><Home>'
+  exe mapstr . '<End>	<C-r>=<SID>SkkKey("<C-v><C-a>")<CR><End>'
+  exe mapstr . '<Left>	<C-r>=<SID>SkkKey("<C-v><C-a>")<CR><Left>'
+  exe mapstr . '<Right>	<C-r>=<SID>SkkKey("<C-v><C-a>")<CR><Right>'
+  exe mapstr . '<C-a>	<C-r>=<SID>SkkKey("<C-v><C-a>")<CR><Home>'
+  exe mapstr . '<C-e>	<C-r>=<SID>SkkKey("<C-v><C-a>")<CR><End>'
+  exe mapstr . '<C-b>	<C-r>=<SID>SkkKey("<C-v><C-a>")<CR><Left>'
+  exe mapstr . '<C-f>	<C-r>=<SID>SkkKey("<C-v><C-a>")<CR><Right>'
+  exe mapstr . '<C-w>	<C-r>=<SID>SkkKey("<C-v><C-u>")<CR><C-w>'
+  exe mapstr . '<C-u>	<C-r>=<SID>SkkKey("<C-v><C-u>")<CR><C-u>'
+  if mode() !=# 'c'
+    exe mapstr . '<Esc>	<C-r>=<SID>SkkKey("<C-v><Esc>")<CR><Esc>'
+    exe mapstr . '<C-c>	<C-r>=<SID>SkkKey("<C-v><Esc>")<CR><C-c>'
+  endif
+  exe mapstr . g:skk_abbrev_to_zenei_key . " <C-r>=<SID>SkkKey(\"<C-v><C-q>\")<CR>"
+  if exists("g:format_command") && g:skk_autofill_toggle_key != ""
+    exe mapstr . g:skk_autofill_toggle_key . " <C-r>=<SID>SkkKey(\"<C-v><C-k>\")<CR>"
+  endif
+endfunction
+
+function! s:SkkMapCR()
+  let mapstr = g:skk_remap_lang_mode ? 'lmap' : 'lnoremap'
+  if g:skk_egg_like_newline && b:skk_henkan_mode != 0
+    exe mapstr '<buffer> <CR> <C-r>=<SID>SkkKey("<C-v><CR>")<CR>'
+  else
+    exe mapstr '<buffer> <CR> <C-r>=<SID>SkkKey("<C-v><CR>")<CR><CR>'
+  endif
+endfunction
+
+" f や r などがあるため必要
+function! s:SkkMapNormal()
+  let keys = "iIaAoOcCsSR"
+  let i = 0
+  while keys[i] != ""
+    exe "nnoremap <silent> <buffer> " . keys[i] . " :call SkkMap(1)<CR>:let &iminsert = 1<CR>" . keys[i]
+    let i = i + 1
+  endwhile
+  call SkkMap(0)	" コマンドライン側にセットしておく。
+endfunction
+
+function! s:SkkUnmapNormal()
+  let keys = "iIaAoOcCsSR"
+  let i = 0
+  while keys[i] != ""
+    silent! exe "nunmap <buffer> " . keys[i]
+    let i = i + 1
+  endwhile
+endfunction
+
+function! s:SkkKey(key)
+  let s:skk_in_cmdline = mode() == "c"
+  unlet! s:skk_cmdline_str s:skk_cmdline_pos s:skk_bs_str s:skk_cur_col s:skk_cur_line
+  let &l:formatoptions = ""
+  let b:skk_rom_erased = 0
+  if b:skk_on == 0
+    call s:SkkOn()
+  endif
+  if b:skk_map_silent == s:skk_in_cmdline
+    call SkkMap(s:skk_in_cmdline == 0)
+  endif
+  if a:key == "\<CR>"
+    if s:skk_in_cmdline && !g:skk_keep_state && (!g:skk_egg_like_newline || b:skk_henkan_mode == 0)
+      if &imsearch == 1
+        let &imsearch = 0
+      endif
+      let &iminsert = 0
+    endif
+    let str = s:SkkKakutei()
+    let &l:formatoptions = b:skk_fo_save
+  elseif a:key == "\<Esc>"
+    if g:skk_keep_state
+      let str = s:SkkKakutei()
+      if s:skk_in_cmdline == 0
+        call s:SkkMapNormal()
+        let &iminsert = 0
+      endif
+    else
+      let str = SkkDisable()
+    endif
+    let &backspace = s:bs_save
+    let &l:formatoptions = b:skk_fo_save
+  elseif a:key == "\<C-j>"
+    let str = s:SkkControlJ()
+  elseif a:key == "\<C-g>"
+    let str = s:SkkCancel()
+  elseif a:key == "\<C-h>"
+    let str = s:SkkBackspace()
+    if s:skk_in_cmdline && !g:skk_keep_state && getcmdpos() == 1 && strlen(getcmdline()) == 0
+      if &imsearch == 1
+        let &imsearch = 0
+      endif
+      let &iminsert = 0
+    endif
+    let &backspace = s:bs_save
+  elseif a:key == "\<C-a>"
+    let str = s:SkkCleanRom()
+  elseif a:key == "\<C-u>"
+    let str = s:SkkCleanRom()
+    let &backspace = s:bs_save
+  elseif a:key == "\<C-q>"
+    let str = SkkAbbrev2Zenei()
+  elseif a:key == "\<C-k>"
+    let b:skk_autofill = b:skk_autofill ? 0 : 1
+    let str = ""
+  else
+    if b:skk_autofill && s:skk_in_cmdline == 0 && b:skk_henkan_mode == 0 && b:skk_rom == ""
+      call s:SkkDoAutoFill()
+    endif
+    let str = s:SkkInsert(a:key)
+  endif
+  call s:SkkMapCR()
+  if exists("s:skk_pasted")
+    let str = str . "\<C-o>:set nopaste\<CR>"
+    unlet s:skk_pasted
+  endif
+  return s:skk_in_cmdline ? s:SkkMakeCmdStr(str) : exists("s:skk_bs_str") ? s:skk_bs_str . str : str
+endfunction
+
+" }}}
+
+" Insert functions {{{
+
+" 入力の大元。ここで状態、キーを見てそれぞれの関数を呼び出す。
+function! s:SkkInsert(char)
+  if b:skk_mode == 'ascii'
+    return a:char
+  elseif b:skk_mode == 'zenei'
+    return s:SkkInsertZenei(a:char)
+  else		" hira|kata
+    try
+      if b:skk_henkan_mode != 0 && a:char == g:skk_kakutei_key
+        call s:SkkKakutei()
+        return ''
+      elseif b:skk_henkan_mode == 3
+        return SkkHenkan(a:char)
+      elseif b:skk_henkan_mode == 0 && a:char == g:skk_sticky_key
+        return SkkSetHenkanPoint('')
+      elseif b:skk_henkan_mode == 1 && a:char == g:skk_sticky_key
+        if !s:SkkCheckMarker(g:skk_marker_white, b:skk_hstart)
+          let b:skk_henkan_mode = 0
+          throw "skk cannot find " . g:skk_marker_white . " mark"
+        endif
+        " g:skk_sticky_key 連続押下で g:skk_sticky_key 自体を返す
+        " ;; で ▽* 、;k; で ▽* ではなく、; になるように
+        let kana = s:SkkCleanRom() " kana は n の場合に ん になる
+        if kana == '' && s:SkkCursorCol() == b:skk_hstart +
+              \ strlen(g:skk_marker_white)
+          call s:SkkKakutei() " ▽の削除 ( 確定 )
+          return g:skk_sticky_key
+        endif
+        if b:skk_rstart == 0 || b:skk_line != s:SkkCursorLine()
+          let b:skk_line = s:SkkCursorLine()
+          let b:skk_rstart = s:SkkCursorCol()
+        endif
+        let b:skk_ostart = strlen(kana) + b:skk_rstart
+        let b:skk_rstart = strlen(kana) + b:skk_rstart +
+              \ strlen(g:skk_marker_okuri)
+        let b:skk_henkan_mode = 2
+        return kana . g:skk_marker_okuri
+      elseif stridx(g:skk_henkan_point_keys, a:char) != -1 && b:skk_abbrev_mode_on == 0
+        return SkkSetHenkanPoint(a:char)
+      elseif b:skk_henkan_mode == 1 && a:char ==# g:skk_start_henkan_key
+        return SkkStartHenkan()
+      elseif b:skk_henkan_mode == 1 && s:SkkInCompletion() && a:char ==# g:skk_prev_comp_key
+        return s:SkkPrevComp()
+      elseif b:skk_henkan_mode == 1 && s:SkkInCompletion() && a:char ==# g:skk_next_comp_key
+        return s:SkkCompletion(0)
+      elseif b:skk_henkan_mode == 1 && a:char ==# g:skk_completion_key
+        return s:SkkCompletion(!s:SkkInCompletion())
+      elseif b:skk_abbrev_mode_on == 1
+        return a:char
+      elseif b:skk_henkan_mode == 1 && stridx(g:skk_special_midasi_keys, a:char) != -1
+        return SkkStartHenkan(">")
+      elseif b:skk_henkan_mode == 2
+        return SkkSetHenkanPoint(a:char)
+      else
+        return s:SkkInsertKana(a:char)
+      endif
+    catch /^skk .* mark$/
+      return s:SkkInsert(a:char)
+    catch /^Vim.*:E132:/
+      call s:SkkEcho( "SKK: Sorry, 'maxfuncdepth' is exhausted.\nSKK: Please increase 'maxfuncdepth'.", "ErrorMsg", 2)
+      return s:SkkCancel()
+    endtry
+  endif
+endfunction
+
+" SkkInsertKana
+" ひらがな、カタカナを入力する。
+function! s:SkkInsertKana(char)
+  call s:SkkEraseRom()
+  if b:skk_rstart == 0 || b:skk_line != s:SkkCursorLine()
+    let b:skk_line = s:SkkCursorLine()
+    let b:skk_rstart = s:SkkCursorCol()
+  endif
+  let kana = ''
+  let cur = b:skk_rom . a:char
+  let curv = b:skk_romv . s:ValidVarChar(a:char)
+  while 1
+    if exists("s:skk_rules_{curv}_func") && !s:HasChild(curv)
+      let b:skk_rom = s:GetRest(curv)
+      let b:skk_romv = s:ValidVarChar(b:skk_rom)
+      exe "return " . s:skk_rules_{curv}_func
+    elseif exists("s:skk_rules_{curv}")
+      if !s:HasChild(curv)
+        " 確定する
+        let s = s:SkkGetKana(s:skk_rules_{curv})
+        let kana = kana . s
+        let cur = s:GetRest(curv)
+        let curv = s:ValidVarChar(cur)
+        let b:skk_rstart = b:skk_rstart + strlen(s)
+        let kana = kana . cur
+      else
+        " 確定要素はあるがまだ続く可能性もある
+        let kana = kana . cur
+      endif
+    elseif b:skk_rom != ''
+      if exists("s:skk_rules_{b:skk_romv}")
+        if s:IsInclude(b:skk_rom, a:char)
+          " do nothing
+          let kana = kana . cur
+        else
+          " rom 確定 char 残す
+          let s = s:SkkGetKana(s:skk_rules_{b:skk_romv})
+          let kana = kana . s
+          let cur = s:GetRest(b:skk_romv) . a:char
+          let curv = s:ValidVarChar(cur)
+          let b:skk_rom = ''
+          let b:skk_romv = ''
+          let b:skk_rstart = b:skk_rstart + strlen(s)
+          continue	" 次のループへ
+        endif
+      else
+        if s:IsInclude(b:skk_romv, a:char)
+          " do nothing
+          let kana = kana . cur
+        else
+          " maybe TYPO 今までのローマ字を捨てて char から始める
+          let b:skk_rom = ''
+          let b:skk_romv = ''
+          let cur = a:char
+          let curv = s:ValidVarChar(cur)
+          continue	" 次のループへ
+        endif
+      endif
+    else	" b:skk_rom == ''
+      if s:HasChild(curv)
+        " do nothing
+        let kana = kana . cur
+      else
+        " rules にない単一の文字 (そのまま入力)
+        let cur = ''
+        let curv = ''
+        let kana = kana . a:char
+        let b:skk_rstart = b:skk_rstart + strlen(a:char)
+      endif
+    endif
+    " continue | return 以外はすべてここに来る。
+    break
+  endwhile
+  let b:skk_rom = cur
+  let b:skk_romv = curv
+  return kana
+endfunction
+
+" SkkInsertZenei
+" 全角英数を入力する。
+function! s:SkkInsertZenei(char)
+  let nr = char2nr(a:char)
+  if exists("s:skk_zenei_rules_{nr}")
+    return s:skk_zenei_rules_{nr}
+  else
+    return a:char
+  endif
+endfunction
+
+function! SkkCurrentKuten(kana)
+  let b:skk_rstart = 0
+  let kuten = matchstr(g:skk_kutouten_{g:skk_kutouten_type}, "^.")
+  return a:kana . kuten
+endfunction
+
+function! SkkCurrentTouten(kana)
+  let b:skk_rstart = 0
+  let touten = matchstr(g:skk_kutouten_{g:skk_kutouten_type}, ".$")
+  return a:kana . touten
+endfunction
+" }}}
+
+" Henkan functions {{{
+
+" マーカーのチェック 諦めが早い。
+" マーカーより前で削除・挿入が行われたときは見付けられない。
+function! s:SkkCheckMarker(mark, point)
+  let line = strpart(s:SkkGetLine("."), a:point - 1)
+  return stridx(line, a:mark) == 0
+endfunction
+
+" 変換の状態を変化させる。
+" ■モードなら▽モードに、▽モードなら▽モード(送りがな入力中)に変化させる。
+" ▽モード(送りがな入力中)にローマ字が空になったら変換を開始する。
+function! SkkSetHenkanPoint(char)
+  if b:skk_henkan_mode == 0
+    let kana = SkkSetHenkanPoint1("")
+    return kana . s:SkkInsertKana(s:SkkDowncase(a:char))
+  elseif b:skk_henkan_mode == 1
+    if !s:SkkCheckMarker(g:skk_marker_white, b:skk_hstart)
+      let b:skk_henkan_mode = 0
+      throw "skk cannot find " . g:skk_marker_white . " mark"
+    endif
+    let kana = s:SkkInsertKana(s:SkkDowncase(a:char))
+    if b:skk_rom == ''
+      " 変換開始
+      let b:skk_ostart = s:SkkCursorCol()
+      " for KAnji  ▽*か → ▽かんじ
+      if b:skk_ostart == b:skk_hstart + strlen(g:skk_marker_white)
+        let b:skk_ostart = 0
+        return kana
+      endif
+      let b:skk_okurigana = kana
+      return SkkStartHenkan()
+    else
+      let b:skk_ostart = b:skk_rstart
+      let b:skk_rstart = b:skk_rstart + strlen(g:skk_marker_okuri)
+      let b:skk_henkan_mode = 2
+      " for KanJi  ▽か*んじ → ▽かん*じ
+      if b:skk_ostart > s:SkkCursorCol()
+        let p = b:skk_ostart - s:SkkCursorCol()
+        return strpart(kana, 0, p) . g:skk_marker_okuri . strpart(kana, p)
+      else
+        return g:skk_marker_okuri . kana
+      endif
+    endif
+  else	" b:skk_henkan_mode == 2
+    if !s:SkkCheckMarker(g:skk_marker_okuri, b:skk_ostart)
+      let b:skk_henkan_mode = 1
+      let b:skk_ostart = 0
+      throw "skk cannot find " . g:skk_marker_okuri . " mark"
+    endif
+    if !s:SkkCheckMarker(g:skk_marker_white, b:skk_hstart)
+      let b:skk_henkan_mode = 0
+      throw "skk cannot find " . g:skk_marker_white . " mark"
+    endif
+    if a:char ==# g:skk_start_henkan_key
+      let kana = s:SkkCleanRom()
+      let okuri = strpart(s:SkkGetLine("."), b:skk_ostart, s:SkkCursorCol() - b:skk_ostart - 1) . kana
+      if okuri != ""
+        let b:skk_okurigana = okuri
+        return SkkStartHenkan()
+      endif
+      let c = s:SkkEcho("No okurigana!", "WarningMsg", 1)
+      return c == "" ? "" : SkkSetHenkanPoint(c)
+    endif
+    " for KanJI  ▽かん*j → ▽かん*I → ▽かん*じ
+    let kana = s:SkkInsertKana(s:SkkDowncase(a:char))
+    if b:skk_rom == ''
+      " 変換開始
+      let b:skk_okurigana = strpart(s:SkkGetLine("."), b:skk_ostart, s:SkkCursorCol() - b:skk_ostart - 1) . kana
+      return SkkStartHenkan()
+    else
+      return kana
+    endif
+  endif
+endfunction
+
+" kana の入力後に▽モードにする。
+function! SkkSetHenkanPoint1(kana)
+  if b:skk_henkan_mode == 0
+    call s:SkkEraseRom()
+    let kana = a:kana
+    if b:skk_romv != "" && exists("s:skk_rules_{b:skk_romv}")
+      let kana = kana . s:SkkGetKana(s:skk_rules_{b:skk_romv})
+      let b:skk_rom = ""
+      let b:skk_romv = ""
+    endif
+  else
+    let kana = a:kana . s:SkkKakutei()
+  endif
+  let b:skk_hstart = s:SkkCursorCol() + strlen(kana)
+  let b:skk_rstart = b:skk_hstart + strlen(g:skk_marker_white)
+  let b:skk_line = s:SkkCursorLine()
+  let b:skk_ostart = 0