AutoHotkey로 Mac US 키보드 완전 호환을 목표로

이 기사의 목적



Windows 환경 + Mac의 US 키보드를 사용하여,
마치 Mac + US 키보드에서 Karabiner를 사용하는 환경을 구축합니다.

이 방법은 다음 단계로 구성됩니다.
1, 좌우 windows 키를 부작용이 없는 다른 키로 변경
2, AutoHotkey를 사용하여 키 조합을 모든 기능에 할당
3, IME 설정에서 command 키 단체를 눌러 IME ON 및 IME OFF에 할당

키 할당 변경



우선 changeKey등의 레지스트리의 키보드 맵을 만지는 툴을 사용해, command키(windows에서는 win키라고 인식된다)를 부작용이 없는 다른 키에 할당한다. 부작용은 키를 누르면 무언가 동작이 일어난다는 것을 의미합니다. 나중에 AutoHotkey에서 조합 바로 가기를 기능에 할당하지만 그 때 키의 원래 기능을 완전히 비활성화 할 수 없기 때문입니다.

내 경우에는 왼쪽 win 키를 Pause, 오른쪽 win 키를 scroll lock에 할당했습니다.
(나중에 깨달았습니다만, scroll lock의 기능은, 엑셀등으로 커서 키로 이웃의 셀로 이동할지, 스크롤할까를 바꾸기 때문에, 완전히 부작용 없음으로는 가지 않습니다.누군가 다른 부작용 없는 키가 있으면 알려주세요.)

changeKey로 보면 다음과 같습니다.
(왼쪽 Alt와 ctrl은 자신의 취미입니다. 여기서는 필수는 아닙니다)

changeKey



AutoHotkey



AutoHotkey에서 할당을 변경한 Pause 키와 모든 키 조합에 기능을 할당합니다.
여기에서는, 키 단체를 눌렀을 때의 설정은 실시하지 않습니다.
어디까지나 콤비네이션의 할당만입니다.

AutoHotkey.ahk
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
SetTitleMatchMode,2
#InstallKeybdHook
#UseHook

#ifWinActive Lightshot.exe

enter::
    winGetTitle, window_title, ahk_exe Lightshot.exe
    if inStr(window_title, "save")
        msgbox, "LWin+4"
;        send {enter}
    else send ^{s}
    return

#ifWinActive

;LControl::LAlt
vkFF::Send, {vk1D}  ;左Windowsキー to 無変換キー
ScrollLock::Send, {vk1C}  ;右Windowsキー to 変換キー
vkFF & Space::Send, ^{Esc}
vkFF & Enter::Send, ^{Enter}
vkFF & n::Send, ^{n}
vkFF & x::Send, ^{x}
vkFF & c::Send, ^{c}
vkFF & v::Send, ^{v}
vkFF & s::Send, ^{s}
vkFF & o::Send, ^{o}
vkFF & p::Send, ^{p}
vkFF & a::Send, ^{a}
vkFF & f::Send, ^{f}
vkFF & l::Send, ^{l}
vkFF & w::Send, ^{w}
vkFF & t::Send, ^{t}
vkFF & g::Send, ^{g}
vkFF & z::Send, ^{z}

Shift & Backspace::Send, {Del}

vkFF & Tab::AltTab

RAlt & Up::Send, {PgUp}
RAlt & Down::Send, {PgDn}
RAlt & Left::Send, {Home}
RAlt & Right::Send, {End}



vkFF & 4::
    If GetKeyState("Shift", "P")
        send, {PrintScreen}
    Else
        msgbox, "LWin+4"
    Return

vkFF & 3::
    If GetKeyState("Shift", "P")
        send, #{s}
    Else
        msgbox, "LWin+4"
    Return


;;
;; An autohotkey script that provides emacs-like keybinding on Windows

; The following line is a contribution of NTEmacs wiki http://www49.atwiki.jp/ntemacs/pages/20.html
SetKeyDelay 0

; turns to be 1 when ctrl-x is pressed
is_pre_x = 0
; turns to be 1 when ctrl-space is pressed
is_pre_spc = 0

; Applications you want to disable emacs-like keybindings
; (Please comment out applications you don't use)
is_target()
{
  IfWinActive,ahk_class VirtualConsoleClass
    Return 1
  IfWinActive,ahk_class ConsoleWindowClass ; Cygwin
    Return 1
  IfWinActive,ahk_class MEADOW ; Meadow
    Return 1
  IfWinActive,ahk_class cygwin/x X rl-xterm-XTerm-0
    Return 1
  IfWinActive,ahk_class MozillaUIWindowClass ; keysnail on Firefox
    Return 1
  ; Avoid VMwareUnity with AutoHotkey
  IfWinActive,ahk_class VMwareUnityHostWndClass
    Return 1
  IfWinActive,ahk_class Vim ; GVIM
    Return 1
;  IfWinActive,ahk_class SWT_Window0 ; Eclipse
;    Return 1
;   IfWinActive,ahk_class Xming X
;     Return 1
;   IfWinActive,ahk_class SunAwtFrame
;     Return 1
;   IfWinActive,ahk_class Emacs ; NTEmacs
;     Return 1  
;   IfWinActive,ahk_class XEmacs ; XEmacs on Cygwin
;     Return 1
  Return 0
}
tab_window()
{
  Send !{Tab}
  global is_pre_spc = 0
  Return
}
delete_char()
{
  Send {Del}
  global is_pre_spc = 0
  Return
}
delete_backward_char()
{
  Send {BS}
  global is_pre_spc = 0
  Return
}
kill_line()
{
  Send {ShiftDown}{END}{SHIFTUP}
  Sleep 50 ;[ms] this value depends on your environment
  Send ^x
  global is_pre_spc = 0
  Return
}
open_line()
{
  Send {END}{Enter}{Up}
  global is_pre_spc = 0
  Return
}
quit()
{
  Send {ESC}
  global is_pre_spc = 0
  Return
}
newline()
{
  Send {Enter}
  global is_pre_spc = 0
  Return
}
indent_for_tab_command()
{
  Send {Tab}
  global is_pre_spc = 0
  Return
}
newline_and_indent()
{
  Send {Enter}{Tab}
  global is_pre_spc = 0
  Return
}
isearch_forward()
{
  Send ^f
  global is_pre_spc = 0
  Return
}
isearch_backward()
{
  Send ^f
  global is_pre_spc = 0
  Return
}
kill_region()
{
  Send ^x
  global is_pre_spc = 0
  Return
}
kill_ring_save()
{
  Send ^c
  global is_pre_spc = 0
  Return
}
yank()
{
  Send ^v
  global is_pre_spc = 0
  Return
}
undo()
{
  Send ^z
  global is_pre_spc = 0
  Return
}
find_file()
{
  Send ^o
  global is_pre_x = 0
  Return
}
save_buffer()
{
  Send, ^s
  global is_pre_x = 0
  Return
}
kill_emacs()
{
  Send !{F4}
  global is_pre_x = 0
  Return
}

move_beginning_of_line()
{
  global
  if is_pre_spc
    Send +{HOME}
  Else
    Send {HOME}
  Return
}
move_end_of_line()
{
  global
  if is_pre_spc
    Send +{END}
  Else
    Send {END}
  Return
}
previous_line()
{
  global
  if is_pre_spc
    Send +{Up}
  Else
    Send {Up}
  Return
}
next_line()
{
  global
  if is_pre_spc
    Send +{Down}
  Else
    Send {Down}
  Return
}
forward_char()
{
  global
  if is_pre_spc
    Send +{Right}
  Else
    Send {Right}
  Return
}
backward_char()
{
  global
  if is_pre_spc
    Send +{Left}
  Else
    Send {Left}
  Return
}
scroll_up()
{
  global
  if is_pre_spc
    Send +{PgUp}
  Else
    Send {PgUp}
  Return
}
scroll_down()
{
  global
  if is_pre_spc
    Send +{PgDn}
  Else
    Send {PgDn}
  Return
}



;vkFF & Tab::
;  If is_target()
;    Send %A_ThisHotkey%
;  Else
;    tab_window()
;  Return 

^f::
  If is_target()
    Send %A_ThisHotkey%
  Else
    forward_char()
  Return  
^d::
  If is_target()
    Send %A_ThisHotkey%
  Else
    delete_char()
  Return
^h::
  If is_target()
    Send %A_ThisHotkey%
  Else
    delete_backward_char()
  Return
^w::
  If is_target()
    Send %A_ThisHotkey%
  Else
    kill_region()
  Return
^g::
  If is_target()
    Send %A_ThisHotkey%
  Else
    quit()
  Return
^m::
  If is_target()
    Send %A_ThisHotkey%
  Else
    newline()
  Return
!s::
  If is_target()
    Send %A_ThisHotkey%
  Else
    isearch_forward()
  Return
^s::
  If is_target()
    Send %A_ThisHotkey%
  Else
    isearch_forward()
  Return
^@::
  Suspend, Toggle
  Return
^a::
  If is_target()
    Send %A_ThisHotkey%
  Else
    move_beginning_of_line()
  Return
^e::
  If is_target()
    Send %A_ThisHotkey%
  Else
    move_end_of_line()
  Return
^p::
  If is_target()
    Send %A_ThisHotkey%
  Else
    previous_line()
  Return
^n::
  If is_target()
    Send %A_ThisHotkey%
  Else
    next_line()
  Return
^b::
  If is_target()
    Send %A_ThisHotkey%
  Else
    backward_char()
  Return

IME 설정



그리고는, IME의 설정으로 키 단체 누르었을 때를 IME ON 과 IME OFF에 할당합니다.

좋은 웹페이지 즐겨찾기