薙刀式AutoHotkey版が大岡さんのブログに取り上げられました

oookaworks.seesaa.net
3キー同時押しの実装はやはり面倒ですよね。少し考えてみたのですが

sho_test(){
	Send,{BackSpace}
	Send,{s}
	Send,{h}
	Send,{o}
}
jyo_test(){
	Send,{BackSpace 2}
	Send,{j}
	Send,{y}
	Send,{o}
}
r::Send,{s}{i}
~r & i::
If GetKeyState("j", "P") {
	jyo_test()
}
else
{
	sho_test()
}
return
~i & r::
If GetKeyState("j", "P") {
	jyo_test()
}
else
{
	sho_test()
}
return
~r & j::
If GetKeyState("i", "P") {
	jyo_test()
}
return
;j & rやj & iなどもr & jと同様の定義が必要

以下省略しますが「じょ」だけでも本来は3の階乗で6回もコンビネーションキーを定義する必要があります。確かに力技です。

3キー同時押しを定義するにはこの処理を繰り返す根気、もしくはよりスマートな手法を見つけなけばなりません。挑戦される方は頑張ってください。

追記

あくまで一案ですがコードを書くためのコードを書くというこれまた力技です。クリップボードの中身を破壊します。

write_3key(a,b,c,d,e){
Clipboard := "~"
Send,^v
Clipboard := a
Send,^v
Clipboard := " & "
Send,^v
Clipboard := b
Send,^v
Clipboard := " ::"
Send,^v
Send,{Enter}
Clipboard := "If GetKeyState('"
Send,^v
Clipboard := c
Send,^v
Clipboard := "', 'P') {"
Send,^v
Send,{Enter}
Send,{Tab}
Clipboard := d
Send,^v
Clipboard := "_test()"
Send,^v
Send,{Enter}
Clipboard := "}"
Send,^v
Send,{Left}{BackSpace}{Right}{Enter}
Clipboard := "else"
Send,^v
Send,{Enter}
Clipboard := "{"
Send,^v
Send,{Enter}
Send,{Tab}
Clipboard := e
Send,^v
Clipboard := "_test()"
Send,^v
Send,{Enter}
Clipboard := "}"
Send,^v
Send,{Left}{BackSpace}{Right}{Enter}
Clipboard := "return"
Send,^v
Send,{Enter}
Clipboard := "~"
Send,^v
Clipboard := b
Send,^v
Clipboard := " & "
Send,^v
Clipboard := a
Send,^v
Clipboard := " ::"
Send,^v
Send,{Enter}
Clipboard := "If GetKeyState('"
Send,^v
Clipboard := c
Send,^v
Clipboard := "', 'P') {"
Send,^v
Send,{Enter}
Send,{Tab}
Clipboard := d
Send,^v
Clipboard := "_test()"
Send,^v
Send,{Enter}
Clipboard := "}"
Send,^v
Send,{Left}{BackSpace}{Right}{Enter}
Clipboard := "else"
Send,^v
Send,{Enter}
Clipboard := "{"
Send,^v
Send,{Enter}
Send,{Tab}
Clipboard := e
Send,^v
Clipboard := "_test()"
Send,^v
Send,{Enter}
Clipboard := "}"
Send,^v
Send,{Left}{BackSpace}{Right}{Enter}
Clipboard := "return"
Send,^v
Send,{Enter}
}
write_3key_only(a,b,c,d){
Clipboard := "~"
Send,^v
Clipboard := a
Send,^v
Clipboard := " & "
Send,^v
Clipboard := b
Send,^v
Clipboard := " ::"
Send,^v
Send,{Enter}
Clipboard := "If GetKeyState('"
Send,^v
Clipboard := c
Send,^v
Clipboard := "', 'P') {"
Send,^v
Send,{Enter}
Send,{Tab}
Clipboard := d
Send,^v
Clipboard := "_test()"
Send,^v
Send,{Enter}
Clipboard := "}"
Send,^v
Send,{Left}{BackSpace}{Right}{Enter}
Clipboard := "return"
Send,^v
Send,{Enter}
Clipboard := "~"
Send,^v
Clipboard := b
Send,^v
Clipboard := " & "
Send,^v
Clipboard := a
Send,^v
Clipboard := " ::"
Send,^v
Send,{Enter}
Clipboard := "If GetKeyState('"
Send,^v
Clipboard := c
Send,^v
Clipboard := "', 'P') {"
Send,^v
Send,{Enter}
Send,{Tab}
Clipboard := d
Send,^v
Clipboard := "_test()"
Send,^v
Send,{Enter}
Clipboard := "}"
Send,^v
Send,{Left}{BackSpace}{Right}{Enter}
Clipboard := "return"
Send,^v
Send,{Enter}
}
f::write_3key("r","i","j","jyo","sho")
d::write_3key_only("r","j","i","jyo")
e::write_3key_only("j","i","r","jyo")

Alt+Tab問題を終わらせたい 続き

#IfWinNotActive ahk_class CabinetWClass
~d & j::AltTab
~d & f::Send,{BackSpace}
~d & k::
Suspend, Off
If GetKeyState("f", "P") {
	MsgBox, alt_tab_testの機能を再開します。`n文字入力時にはD+F+Iで機能を停止してください。
}
else{
	Send,{BackSpace}
	Suspend, On
}
Return
~d & i::
If GetKeyState("f", "P") {
	Suspend, On
	MsgBox, alt_tab_testを無効化しました。`n使いたいときはD+F+Kで再開します。
}
else{
	Send,{BackSpace}
}
Return
~d & v::
Send,{BackSpace}
Send,#{2}
sleep 1000
Send,!{f}
sleep 1000
Send,{c}
sleep 1000
Return
#If
#IfWinActive ahk_class CabinetWClass
~d & v::
Send,^w
#If

ややこしくなってきたのでコマンドを表にしておきます。繰り返しますがくれぐれも文字入力中はD+F+Iで機能を停止させてください。消えようが何しようが責任が取れません。

コマンド 動作
D+F+J Alt+Tabを起動
D+J Alt+Tab中に移動
D+F+I 無効化
D+F+K 再開
D+V エクスプローラを閉じる

いつの間にか詳しくなっていた

もしAutoHotkeyでやるなら、薙刀AutoHotkey版で用いた手法が使えます。

~d & j::
If GetKeyState("s", "P") {
	Send,{Backspace 2}{n}{e}
}
~s & j::
If GetKeyState("d", "P") {
	Send,{Backspace 2}{n}{e}
}


Google日本語入力のみでやるとすれば、こんな感じでしょうか

s		a
ad		c
d		b
bs		c
cj	ね

Alt+Tab問題を終わらせたい

Alt+Tabをどう実装するかはキーカスタマイザーの腕の見せ所です。しかし、そんな話はもうそろそろ終わらせたいものです。

~d & j::AltTab

D+JでAlt+Tabのメニューを表示し、Jで移動します。テキストエディタや入力フォームで使うとDやJが入力されるのが問題です。

追記

~d & j::AltTab
~d & f::Send,{BackSpace}{Alt}

D+F+Jに変更しました。D+FでAltを入力しフォームからカーソルを退避します。文字入力中に動作するのを避けるためIMEのオンオフで動作を限定したいのですが、IME.ahkで機能を抑えられません。どうしたものか。

追記2

#IfWinNotActive ahk_class CabinetWClass
~d & j::AltTab
~d & f::Send,{BackSpace}
~d & v::
Send,{BackSpace}
Send,#{2}
sleep 1000
Send,!{f}
sleep 1000
Send,{c}
sleep 1000
Return
#IfWinActive ahk_class CabinetWClass
~d & v::
Send,^w
#If

エクスプローラが起動していると問題が多いようなので、D+Vでエクスプローラを閉じる動きを定義しました。エクスプローラがWin+2で起動する環境を想定しています。

追記3

#IfWinNotActive ahk_class CabinetWClass
~d & j::AltTab
~d & f::Send,{BackSpace}
~d & k::Send,{Alt}
~d & v::
Send,{BackSpace}
Send,#{2}
sleep 1000
Send,!{f}
sleep 1000
Send,{c}
sleep 1000
Return
#If
#IfWinActive ahk_class CabinetWClass
~d & v::
Send,^w
#If

Dがテキストエリアフォーカス時に入力される問題の対策として、D+F+K+Jに定義を変更しました。Dホールド中にJで移動します。やはり文字入力中は機能を抑えたいのですが難しそうです。

追記4

Firefoxがアクティブ時に動かすとBackSpaceで「戻る」のショートカットが機能する問題が発生しました。about:configで無効に設定可能ですから、ショートカットとしてBSを使っていないFirefoxユーザーの方は設定していただくことをおすすめします。
orangeclover.hatenablog.com
チェックマークのアイコンをクリックしないと保存されないので注意してください。
support.mozilla.org

追記5

#IfWinNotActive ahk_class CabinetWClass
~d & j::AltTab
~d & f::Send,{BackSpace}
~d & k::Send,#{b}
~d & v::
Send,{BackSpace}
Send,#{2}
sleep 1000
Send,!{f}
sleep 1000
Send,{c}
sleep 1000
Return
#If
#IfWinActive ahk_class CabinetWClass
~d & v::
Send,^w
#If

D+KをAltからWin+B(通知領域にフォーカスを移動)に変更しました。タスクバーの「>」のマークが白い枠で囲まれるのを確認してからJを押してください。

追記6

#IfWinNotActive ahk_class CabinetWClass
~d & j::AltTab
~d & f::Send,{BackSpace}
~d & k::
Suspend, Off
Send,{BackSpace}
MsgBox, alt_tab_testを使用する準備が整いました。`n文字入力時にはD+Iで機能を停止してください。
Return
~d & i::
Send,{BackSpace}
Suspend, On
MsgBox, alt_tab_testを無効化しました。`n使いたいときはD+Kで再開します。
Return
~d & v::
Send,{BackSpace}
Send,#{2}
sleep 1000
Send,!{f}
sleep 1000
Send,{c}
sleep 1000
Return
#If
#IfWinActive ahk_class CabinetWClass
~d & v::
Send,^w
#If

D+F+Jに機能を戻しました。D+Iで無効化して、D+Kで再開します。文字入力時には無効化してください。

続きます
jigendaddy.hatenablog.com

薙刀式AutoHotkey版の進捗

jigendaddy.hatenablog.com
若干違いはありますが外来音の一部と編集モードを除いて実装できました。問題はR+IとI+Rでどちらも「しょ」が出力されるような自由度の確保です。
oookaworks.seesaa.net
SandSの実装が難しいと思っていたのですが、予想以上にあっさり可能でした。外来音は理解できる部分だけを実装しています。

編集モードは薙刀式にとって重要なのでしょうが、社説タイピングならMS-IMEを前提にすれば既に実装済みのBSやエンターを除けばそれほど必要なキーは多くないはずです。大岡さんには悪い気もしますが省かせていただきます。

「しょ」のように2キー同時押しならまだ裏返せば済む話ですが、3キー同時押しとなるとかなり複雑な話です。2キー同時押しだけでも定義するべきなのか迷っています。
naginata_v13.ahk - Google ドライブ

追記

できる限り2キー同時押しの裏返しを定義しました。うっかりしていたのですが、uがIMEオフ時にもBSとして機能します。どうしたものでしょうか

追記2

IMEオフ時にSpace+UでUを入力するようにしました。これだけだとSpaceが入力できない問題がありますので、IMEオフ時は以下のように定義します。

入力 出力
Space+U U
Space+F Space
Space+A Alt+Space
Space+S Shift+Space
Space+C Ctrl+Space
Space+W Win+Space
Space+D Ctrl+Shift+Space

Space+Wは通常のWin+Spaceのようにドロップダウンメニューが表示されない問題があります。そもそもWin+SpaceによるIME切り替え自体が不要であれば、定義している箇所を削除してください。

追記3

IMEオンオフの裏返しを定義していなかったので修正しました。また全角英数が入力できない対策にSpace+Xへ変換キーを定義しています。直接入力でアルファベットを入力した後に、IMEオンでかな入力モードに戻してSpace+X(変換キー)を打ってください。変換対象に全角英数が出るはずです。

薙刀式AutoHotkey版?

薙刀式をどうにかAutoHotkey単体で動かせないか挑戦しています。まだ途中ですが既に頭の中でコードを管理できる限界量のようです。本家より自由度がかなり落ちています。
naginata_v13 (1).ahk - Google ドライブ
使用環境はMS-IMEローマ字入力(変換表がデフォルトのまま)を想定しています。「ぢゃ」が実装できていません。いいアイデアをお持ちの方は教えて下さい。これを本家のように自由度を持って実装できる方はすごいとか言いようがありません。

SandSをあきらめて変換は句読点の位置で強制的に行います。我ながら強引ですね。実用は難しいでしょう。DvorakJを使う気はしないけども薙刀式に興味はあるという方のために作りました。どんなものか軽く触る程度にしていただければと思います。
oookaworks.seesaa.net

追記

「ぢゃ」については不本意ですが、本来の位置とは別の箇所に置きました。G+J+HかG+F+Hが通常のはずですが、G+J+Bに置いています。「ちゃ」もこれに伴ってG+Bへ移しています。ご容赦いただけるとありがたいです。

書き忘れていましたが「ゎ」についてはSpace+Q+Lが本来の配置でしょうが、Space+Qに配置しています。こちらも合わせてご理解をいただければ幸いです。

追記2

任意の位置で変換できるように変換キーをSpace+J+Fに持ってきました。大岡さんはSpaceキーを変換候補表示時の下移動に使用されているようですが、代用としてSpace+TにUp、Space+YにDownを配置しました。外来音と編集モードは省きます。

追記3

思ったよりあっさりSandSが実装できました。私が勝手に実装していた句読点変換やUpDownキーを省きます。F15~F18キーの定義がズレていたバグの修正も行いました。

追記4

濁音単打が正常に表示されないバグを修正しました。濁音・半濁音の可能性がある文字は単打面にあるとわかりやすい気もしますが、勝手にいじるわけにもいかないですね。

追記5

本家にはありませんが、濁音・半濁音絡みで個人的に打ってみたい定義を加えています。コメントで定義した直下の行に「仕様外だが定義する」「仕様外定義」等と書きましたので、目障りな方は消してください。

追記6

半濁音絡みの修正を行いました。「ぴゃ」は本来X+M+Hのはずが、機能しないのでX+V+Hに置きました。これはこれで悪くない気がするのですがどうでしょう。

追記7

外来音をできるだけ定義しました。F13からF24までのファンクションキーを使い切ってしまったのでどうしたものかと思っていたのですが、Shift+F13とかで代用しています。

続きます。
jigendaddy.hatenablog.com

tsf-tutcode使用時のAutoHotkey設定を考えていたのですが問題点の解消を目指しているうちに、作り直しに近いレベルの手入れが必要な気がしてきました。区別するのに名称がないと不便ですのでこれまで使ってきた設定を脇差、新しく作り直している側の設定を葵と呼びます。

葵の設定を貼っておきます。これまでと同様に備忘録の域は出ていません。
aoi_cmd41.PNG - Google ドライブ
wakizasi_space61.PNG - Google ドライブ

https://jigendaddy.tumblr.com/post/635899665392500736
jigendaddy.tumblr.com

#include ime.ahk
#If IME_GET()
Space & n::Send,{Enter}
Space & c::Send,^t
Space & d::Send,{Esc}{BackSpace}
Space & f::Send,{Enter}{BackSpace}
Space & h::Send,{vk1D}{vk1C}
Space & e::Send,{Esc}
Space & u::
	Send,{Enter}
	Send,{Left}
	Send,{BackSpace}
	Send,{Right}
Return
~i & d::
	Send,{Esc}
	Send,{m}
	Send,{1}
	Sleep,1000
Return
~d & i::
	Send,{Esc}
	Send,{m}
	Send,{1}
	Sleep,1000
Return
~j & i::
	Send,{Esc}
	Send,{m}
	Send,{2}
	Sleep,1000
Return
~i & j::
	Send,{Esc}
	Send,{m}
	Send,{2}
	Sleep,1000
Return
~vkBC & f::
	Send,{Esc}
	Send,{m}
	Send,{7}
	Sleep,1000
Return
~f & vkBC::
	Send,{Esc}
	Send,{m}
	Send,{7}
	Sleep,1000
Return
~m & d::
	Send,{Esc}
	Send,{n}
	Send,{1}
	Sleep,1000
Return
~d & m::
	Send,{Esc}
	Send,{n}
	Send,{1}
	Sleep,1000
Return
~m & f::
	Send,{Esc}
	Send,{n}
	Send,{2}
	Sleep,1000
Return
~f & m::
	Send,{Esc}
	Send,{n}
	Send,{2}
	Sleep,1000
Return
~m & e::
	Send,{Esc}
	Send,{n}
	Send,{3}
	Sleep,1000
Return
~e & m::
	Send,{Esc}
	Send,{n}
	Send,{3}
	Sleep,1000
Return
~vkBC & v::
	Send,{Esc}
	Send,{n}
	Send,{4}
	Sleep,1000
Return
~v & vkBC::
	Send,{Esc}
	Send,{n}
	Send,{4}
	Sleep,1000
Return
~vkBC & m::
	Send,{Esc}
	Send,{k}
	Send,{0}
	Sleep,1000
Return
~m & vkBC::
	Send,{Esc}
	Send,{k}
	Send,{0}
	Sleep,1000
Return
~j & v::
	Send,{Esc}
	Send,{j}
	Send,{1}
	Sleep,1000
Return
~v & j::
	Send,{Esc}
	Send,{j}
	Send,{1}
	Sleep,1000
Return
~k & v::
	Send,{Esc}
	Send,{j}
	Send,{2}
	Sleep,1000
Return
~v & k::
	Send,{Esc}
	Send,{j}
	Send,{2}
	Sleep,1000
Return
~g & m::
	Send,{BackSpace}
	Send,{Esc}
	Send,^q
	Send,{Space}
	Send,{vk1C}
Return
~m & g::
	Send,{BackSpace}
	Send,{Esc}
	Send,^q
	Send,{Space}
	Send,{vk1C}
Return
Space & i::
	Send,{m}
	Send,{3}
	Sleep,1000
Return
Space & j::
	Send,{m}
	Send,{4}
	Sleep,1000
Return
Space & k::
	Send,{m}
	Send,{5}
	Sleep,1000
Return
Space & v::
	Send,{m}
	Send,{6}
	Sleep,1000
Return
Space & r::
	Send,{i}
	Send,{d}
Return
Space & m::
If GetKeyState("g", "P") {
	Send,{Esc}
	Send,^q
	Send,{Space}
	Send,{vk1C}
}
else {
	Send,^w
}
Return
Space & g::
If GetKeyState("m", "P") {
	Send,{Esc}
	Send,^q
	Send,{Space}
	Send,{vk1C}
}
else {
	Send,^q
}
Return
~v & c::Send,{Esc}{vk1D}
~c & v::Send,{Esc}{vk1D}
#If
#If ! IME_GET()
~n & m::Send,{BackSpace}{vk1C}
~m & n::Send,{BackSpace}{vk1C}
Space::Send,{Space}
#If