俺のAZIKが火を噴くぜ!
先日、とあるslackで IME について雑談をしていたところ、AZIK ユーザーは何かしら独自の工夫をすることを余儀なくされているはずだから、みんなの設定をいろいろ見てみたいよねという話になりました。
そこで、先ず隗より始めよということで私の SKK + AZIK の設定をご紹介したいと思います。
みんなで広げて行こう AZIK の輪 🙆
AZIK とは?
ローマ字入力の拡張の一です。
AZIK の入力方法はローマ字入力の拡張となっており、一度に AZIK の全てを覚えなくとも段階的に移行できる点が魅力です。
詳しくは、AZIK の考案者である木村 清氏のウェブサイトをご覧ください。
AZIK総合解説書 ※Internet Archive へのリンクです。
SKK とは?
日本語入力システムの一です。
MS-IME や ATOK とは異り、漢字に変換する区切りをユーザーが決める必要があるという特徴があります。
SKK については以下の記事に詳しくあります。
かな漢字変換プログラム SKK の紹介 | Emacs JP
SKKとは (エスケイケイとは) [単語記事] - ニコニコ大百科
工夫が必要なポイント
さて、SKK + AZIK の設定で工夫が必要になってくる点として、次のものが挙げられると思います。
- カタカナモード、半角カタカナモード、全角英数字モードなどに移る為のキー
- SKK の sticky key[1]
- 「っんーぁぃぅぇぉゃゅょゎ」に割り当てるキー
- 辞書の削除用キー
- 「←」などの記号を割り当てるキー
- その他、独自マッピング
この記事では他に、skkeleton に特有の便利な機能についてもご紹介します。
以降、上述の木村氏のサイトの設定のことを「原典」、ないしは「原典の設定」と呼ぶこととします。
原典の設定を施している前提でそこからの差異について論じます。
また、私は普段 US 配列のキーボードを使用しています。ここでご紹介するマッピングも US 配列が前提となっています。
カタカナモード、半角カタカナモード、全角英数字モードなど
SKK の実装には入力が直接カタカナになるモードなどがある場合が多く、これらのモードを遷移するマッピングは原典の設定と干渉しがちです。
-
カタカナモード(
q)
使用頻度は低めでqにマッピングしています。原典でqは「ん」に割り当てられていますが、あまり使用する頻度は高くないので問題無いと判断しました。 -
半角カタカナモード(
Q)
更にあまり使わないモードです。マッピング理由は同上。 -
全角英数モード(
@)
こちらもあまり使わないモードです。ホームから遠く、日本語を入力中に使う機会の少ない@を採用しました。 -
abbrev モード(
/)
とてもよく使います。/で割り当てられている実装が多いのではないのでしょうか。
私は外来語を入力する時はスペリングの勉強も兼ねて abbrev モードで入力することにしています。そうすることで、単独での「ん」や「ー」の入力も減らせているのではないかと思います。また、emoji 辞書を使っているので emoji の変換にも abbrev モードを使用しています🐈 -
SKK をオフ(
')
lに割り当てられることも多いと思いますが、lは「っ」に割り当てている為、その隣にあり、かつ、日本語入力中にあまり使わない'を採用しました。 -
SKK のオン/オフをトグル(
C-J[2])
SKK をオフにするには、上記'よりもこちらを使うことの方が多いです。 -
インサート・モード/コマンドライン・モードから離脱(
jj)
これは Vim での実装である skkeleton 独特の機能ですね。元々 Vim でのインサート・モードもjjで抜けるように設定しているので、日本語入力中であってもjjで離脱できるようにしています。また、これでは原典のjjが潰れてしまいますので、同時にJJで「じゅん」と入力するように設定しています。
sticky key(;)
;に割り当てられることが多いと思います。私もそうしています。;は原典では「っ」に割り当てられています。「っ」の退避先については次項で説明しましょう。
「っんーぁぃぅぇぉゃゅょゎ」
- っ(
l/L)
「っ」はlにマッピングしています。また、変換を開始する「っ」にはLを割り当てています。
-
ん(
n/nn/n')
原典ではq/Qに割り当てられていますが、AZIK の拡張を使いこなしていればあまり使用する頻度は高くないでしょう。nが登録してあるのは、語末のnで「ん」になって欲しい為です。 -
ー(
-/:)
原典と同様です。加えて、「:」はz:で入力できるようにしています。外来語を abbrev モードで入力するようにしていると出番は少ないと思います。 -
ぁぃぅぇぉゃゅょゎ(
xx + X[3])
原典ではl + X[3:1]となっています。lは「っ」に使用していること、そして、そもそもこれらの文字を単独で入力することはあまりないという状況に鑑みて、多少手間ではありますがこのようなマッピングにしました。
辞書の削除用キー(<)
Xに割り当てられている実装が多いのですが、私は<にしています。このキーがXのままだと、AZIK の場合は前の単語の変換を確定せずにXから始まる入力をしようとすると、前の単語を辞書から削除する操作になってしまいます。
「←」などの記号
例えば、デフォルトで「←↓→↑」をそれぞれzh、zj、zk、zlに割り当てている実装も多いのではないのでしょうか。私は矢印は abbrev モードでそれぞれ<、v、^、>などで入力してます。
私もzを prefix として利用しています。以下、よく使っているマッピングです。
- ・(
z/) - <全角スペース>(
z) - ~(
z~/z-) - …(
z.) - :(
z:) - 『/』(
z[/z]) ※「/」は[/]
独自マッピング
-
fにq相当の母音を割り当てる
原典では子音の後のfは空いてますから自由にマッピングできます。原典ではsfだけ「さい」になっていますが、これを他の全ての子音にも対応させています。fは折角入力しやすい位置にあるのに勿体ないですからね。 -
smを「さま」に
ビジネス文書を書く際によく使うので気に入っています。 -
xi/xkを「し/しん」に
私は元々ヘボン式ローマ字入力を律儀に守っていたタイプの人間なのですが、AZIK といえどsiで「し」と入力するのには心理的な抵抗がありました。jやcなどについても同様です。 -
dxを「でした」、mxを「ました」
原典ではdsで「です」、msで「ます」があります。その派生で頻出の語尾を登録しました。
ここまでのマッピングを使うと、「ありがとうございました」などが大分省エネになります!
YLで「読ん」、KPで「乞う」って変換できたら嬉しくない?
AZIKer なら一度は思ったことがあるのではないでしょうか。撥音拡張や二重母音拡張のキーを大文字で入力することでLとoNが等価になるように変換してみたいと。
これができると、大文字が連続していて、シフト・キーを押しっぱなしで良いといのもあって、打っていてすごく気持ちが良いんですよね!
このような SKK の機能の実装を私は今まで聞いたことがないのですが、skkeleton に機能を追加して実装できるようにしてみました。
ここからは Vim のお話です!
以下は私のvimrcからの引用です。s:azikOkuriListを見ると雰囲気が少し伝わるかもしれません。
imapとcmapの両方でQなどをある関数を実行するようにマッピングしています。
その関数では、aIなどのキー列を SKK で入力したものとして SKK の内部に送信しています。
そのままにしておくと、英語を入力する際にもQが「あ▽い」などになってしまう為、SKK を無効したタイミングでマッピングを消し、再度 SKK が有効になったタイミングでもう一度同じマッピングを設定するようにしています。
augroup Skkeleton
autocmd!
let s:azikOkuriList = [
\ ['Q', 'aI'],
\ ['Z', 'aNn'],
\ ['K', 'iNn'],
\ ['H', 'uU'],
\ ['J', 'uNn'],
\ ['W', 'eI'],
\ ['D', 'eNn'],
\ ['P', 'oU'],
\ ['L', 'oNn'],
\ ]
function s:mapAzikOkuri(input, feed) abort
for mode in ['i', 'c']
exec 'autocmd User skkeleton-enable-post ' .. mode .. 'map <buffer> ' ..
\ a:input .. " <Cmd>call <SID>azikOkuri('" .. a:input .. "', '" ..
\ a:feed .. "')<CR>"
exec 'autocmd User skkeleton-disable-post silent! ' .. mode ..
\ 'unmap <buffer> ' .. a:input
endfor
endfunction
function s:azikOkuri(input, feed) abort
if g:skkeleton#state.phase ==# 'input:okurinasi' && g:skkeleton#mode !=# 'abbrev'
\ && g:skkeleton#vim_status().prevInput =~# '\a$'
call skkeleton#handle('handleKey', {'key': split(a:feed, '\zs')})
else
call skkeleton#handle('handleKey', {'key': a:input})
endif
endfunction
for item in s:azikOkuriList
call s:mapAzikOkuri(item[0], item[1])
endfor
augroup END
終わり
以上です。
AZIK 最高!
みんなで広げて行こう AZIK の輪 🙆
-
SKK では大文字で入力することで変換の区切りを表現します。例えば、「思う」と変換したい場合は
OmoUと入力します。この大文字での表現を特定のキーで代替するのが sticky key です。sticky key を;に設定していた場合、「思う」は;omo;uとも入力できます。 ↩︎ -
C-Xでコントロール・キーと X を押すことを表すこととします。ここで X は大文字ですがシフト・キーも同時に押すという意味ではありません。 ↩︎ -
ここで
xx + Xは、xxの後に対応するローマ字入力をしていることを表すものとします。つまり、「ぁ」はxxa、「ゃ」はxxya、そして「ゎ」はxxwaとなります。直後のl + Xについても同様とします。 ↩︎ ↩︎
Discussion