MAC caps lock 을 escape + ctrl 로 사용해보자 (for VIM user)
MAC 도 해피해킹처럼
hammerspoon
개요
해피해킹의 ctrl이 일반 키보드의 calps_lock 위치에 있어서 사용이 편리하다는 소리를 들음. 그래서 사용해보고 싶었음!!!
현재 HammerSpoon을 통해 caps_lock를 esc 로 사용중 이었기에 ctrl 기능을 추가하고자 함
환경
Karabiner-Elements + hammerspoon
logic
ctrl 은 조합키 이므로
- caps_lock 와 키조합이 있는 경우는 ctrl
- 키조합이 없는 경우는 escape 로 인식
- caps_lock 는 modifier keys가 아니므로 karabiner를 통해 caps_lock -> rightctrl 로 변경 (rightCtrl은 macbook에서 존재하지 않는 키이므로 side-effect가 없어 선택됨)
hammerspoon code
local normal_keyflag = false
local control_keyflag = false
-- 마우스 클릭 이벤트 구독
normal_mousedownevent = hs.eventtap.new({hs.eventtap.event.types.leftMouseDown},function(event)
local keycode = hs.keycodes.map[event:getKeyCode()]
if(control_keyflag == true) then
normal_keyflag = true
elseif(control_keyflag == false) then
normal_keyflag = false
end
end)
normal_mousedownevent:start()
-- 키 다운 이벤트 구독
normal_keydownevent = hs.eventtap.new({hs.eventtap.event.types.keyDown},function(event)
local keycode = hs.keycodes.map[event:getKeyCode()]
if(control_keyflag == true) then
normal_keyflag = true
elseif(control_keyflag == false) then
normal_keyflag = false
end
end)
normal_keydownevent:start()
control_keyevent = hs.eventtap.new({hs.eventtap.event.types.flagsChanged},function(event)
local flags = event:getFlags()
local keycode = hs.keycodes.map[event:getKeyCode()]
if(flags.ctrl == true) then
control_keyflag = true
elseif(flags.ctrl == nil) then
control_keyflag = false
end
if(flags.fn == true) then
fnkeyflag = true
end
if(keycode == 'rightctrl' and flags.ctrl == nil and normal_keyflag == false) then
print('rightCtrl & escape !!')
changeLanguage()
hs.eventtap.keyStroke({}, 'escape')
fnkeyflag = false
end
normal_keyflag = false
return false
end)
control_keyevent:start()
-- 한영전환 function
function changeLanguage()
local inputEnglish = "com.apple.keylayout.ABC"
local input_source = hs.keycodes.currentSourceID()
if not (input_source == inputEnglish) then
hs.keycodes.currentSourceID(inputEnglish)
end
end