WindowsのNTEmacs周りでの設定with Autohotkey

とりあえず、Autohotkeyの色々なキー設定と干渉しまくっているのでそれをなんとかしなければいけない。

Autohotkeyで常時監視って出来るんだろうか、IfWinActive, emacsみたいな感じで。

たぶん、タイマーを使うことになるのかなぁ。延々とタイマーを回すし、1秒とかで回すと場合によっては対応が1秒遅れるわけか。それだったらEmacsをグローバルホットキーで起動、最前面、アクティブやめを一つのホットキーにして、それによって状態でAutohotkeyをSuspendにしたほうがいいのかなぁ。
でも、グローバルホットキーにしていて、Emacsと被るものはそれほどは多くないから、それを押す時にEmacsが起動していたらAutohotkeyの設定は使わないようにしたほうがスマートかなぁ。

一番スマートな解決策ってなんだろうなぁ。それに対してダーティーだが一番使える実践的な解決策ってなんだろう。

Autohotkeyスクリプトの中を見ていたらEmacsのためにSuspendする方法として手動でSuspendさせる方法を記述してあった。まぁ、確かにね。それもあるか。ただこれからはがんがんEmacsを使っていきたいからなぁ。それで対応して行くのも一つの手だが。

とりあえず干渉するホットキーのあたりを書き出してみることにする。
まずCtrl-SpaceでLaunchyの呼び出しと自動的に半角英数からはじめるスクリプトが干渉する。
Ctrl-lでRTMに使っているグリースモンキースクリプトでタスクのリストを移動するためにAutohotkeyを一時的にSuspendさせるやつも干渉する。
Ctrl-gでRTMの呼び出し、また最小化をトグルしているものも干渉する。

;Ctrl+pで前の行(カーソル↑)
^p::Send {Up}

;Ctrl+nで次の行(カーソル↓)
^n::Send {Down}

;Ctrl+bで前の文字(カーソル←)
^b::Send {Left}

;Ctrl+fで次の文字(カーソル→)
^f::Send {Right}

;Ctrl+hでBackspace
^h::Send {Backspace}

;Ctrl+DをDeleteにRemeap
^d::Send {Delete}

;Ctrl+jでEnter
^j::Send {Enter}

この辺はEmacsと同じ動作だから干渉していても問題ないらしい。そのまま動く。

Ctrl+wでウインドウを閉じる。Ctrl+qでウインドウ最大化。Ctrl+eでウインドウ最小化、Ctrl+rでウインドウを元のサイズに戻す。

この辺が干渉するか。

後、関係ないけど個人的にCtrl+tでそのソフトを最前面にするってのはVLCでやってるけど、それがあったらいいかもしれないなぁと思う。結構それはAutohotkeyの設定で簡単に出来たはず。

#PersistentとかExitAppみたいなので制御するのかなぁ、Timer使うと。
IfWinActiveが鍵だろうけど、これを常時監視だとTimer系、グローバルホットキーのトグルでEmacsをアクティブにしたり最小化したりするとそっち系かな。
Emacsを起動した時から監視系のTimer回すようにしてもいい。終了したら消せばいい。ただこのスペックのPCなら常時監視にしても別に少しも重くないのかなぁ。とりあえず出来るだけスマートにはしたいんだが。

とりあえずマシンスペックが足りてるか常時監視しても負荷や遅延がほとんど発生しないならTimer系がスマートで、
そうでないなら干渉してる個別のグローバルホットキーごとにIfWinActiveでEmacs起動してたら一時的にSuspendみたいな感じかな。
もう一つ方法があって、グローバルホットキーでEmacsを起動、アクティブ、hideするトグルを設定すること。
その三つか。

Emacsで基本バッファのやりくりで回していくソフトで多重起動ってどうなんだと思いつつ、一応はそれが出来る状態にあるからなぁ。それに何気に多重起動も便利そうだし。そう考えるとどうしたらいいのやら。今後どうしていくのかも正直まだわかってないし。多重起動するとしたらグローバルホットキーでEmacsトグル最前面ってのは採用できない。

今Ctrl+SpaceをEmacsと干渉しないようにIfWinActiveあたりでどうにかしようと思ったけど、でもどの道、LaunchyのCtrl+Spaceとの呼び出しとは干渉するんだよな。
どちらかLaunchyかEmacsのキー設定を変えるしかないと思うんだが、今までどおり両方ともCtrl+Spaceでやるために、一つその解決策を思いついたけど、Lauchy側のCtrl+Spaceを無茶なキー設定にして、Emacsがアクティブでない時はそのキーをCtrl+Spaceで送信、アクティブな時は通常通りCtrl+Spaceを送信でいいのかなぁ。

改変前

;ウインドウ元のサイズに戻す
^r::
WinGetActiveTitle, Title
WinRestore, %Title%
return

改変後

;ウインドウ元のサイズに戻す
^r::
IfWinNotActive, emacs
{
WinGetActiveTitle, Title
WinRestore, %Title%
return
}

こんな感じでGlobalHotkeyタイプのスクリプトを変換していくことにした。

いや、これじゃ駄目だった。まずEmacsにCtrl-rが送られてないこれじゃ。

;ウインドウ最大化
^q::
IfWinNotActive, emacs
{
WinGetActiveTitle, Title
WinMaximize, %Title%
}
else
{
Suspend, On
Send ^q
Suspend, Off
}
return

こんな感じにした。Suspendを入れないと永久ループになるw
とりあえずこんな感じで動いているんで、こんな感じでいいですかねぇという感じ。

ああぁ、そうかそういうことか。Ctrl-x Ctrl-fが効かない何故だ!と思っていたら、Ctrl-fを→矢印にしているからだ。Ctrl-x →みたいなことしてたことになる。だからバッファの移動みたいな感じになってたのか。てか、Ctrl-x →ってバッファの移動なのか。初めて知ったぞw

ということはどうすればいいんだ。どこをどうすればいいんだ。とりあえずおそらく同じような動作すればいいだけだよなぁ。

こんな感じだったのを、

;Ctrl+hでBackspace
^h::Send {Backspace}

こんな感じにしてみた。

;Ctrl+hでBackspace
^h::
IfWinNotActive, emacs
{
Send {Backspace}
}
else
{
Suspend, On
Send ^h
Suspend, Off
}
return

とりあえずこれでいいかな?また支障が出るようなら考えよう。
Ctrl-hはEmacsのデフォルト設定だとBackspaceになってないから.emacsいじって変えなきゃだなぁ。

後は問題なのはLaunchyの部分かなぁ。そこもやってみる。

とりあえずLaunchyの設定はこんな感じにした。今までCtrl+SpaceでLaunchyを開いている設定しにしていたけど、Launchyのほうの設定でAlt+Spaceに変更。Alt+SpaceはLaunchyにそれを割り当てていない状態で色々なところでやってみるとわかるけど、ウインドウの右上のメニューとかにアクセスできるらしいホットキーらしい。だが、LaunchyにAlt+Spaceを割り当ててしまうとLaunchyのほうが優先されるらしく、それは消えてしまう。普段は使っていないので個人的には干渉しないのでありがたい。
それでこれでOKらしい。sc07Bというのは無変換キーだが、無変換キーを半角英数、変換キーをひらがなに個人的にIMEの設定でしているのでそうなっている。
結構ちまちまと費やしたけどこんな感じかなぁ。手間取ったし、以前よりは汚くなったかもしれないけど、コードがifのお陰で少し複雑化した以外は今までと同じやり方でいい。これは素晴らしいことだと考えることにする。Done.

^Space::
IfWinNotActive, emacs
{
Send, !{Space}
Sleep, 300
Send, {sc07B}
}
else
{
Suspend, On
Send ^{Space}
Suspend, Off
}
return