Hammerspoon04 - ctrl키로 한영 전환 및 충돌 피하기
2 분 소요
Hammerspoon04 - ctrl키로 한영 전환 및 충돌 피하기
- macOS에서 HHKB를 사용해서 개발을 하고 있습니다.
- macOS 기본 키보드에서는 capslock을 이용해서 한영전환을 하는데요, 이게 기존 방식(오른쪽 엄지손가락 사용하는 방식)보다 훨씬 편해서, HHKB에서도 capslock 위치에 있는 ctrl 버튼을 사용해서 한영 전환을 하도록 설정하였습니다.
- 다만 저는
ctrl
+ hjkl
을 화살표로 사용하고 있습니다. 이 상태에서 위 코드를 사용하게 되면 화살표를 누를 때마다 한영 변환이 발생하게 되는 문제점이 있습니다. hammerspoon을 사용하였고, 해당 코드는 다음과 같죠.
function control_key_change_kor_en()
control_keyevent = hs.eventtap.new (
{
hs.eventtap.event.types.flagsChanged,
hs.eventtap.event.types.keyDown
},
function (event)
local flags = event:getFlags()
local keycode = hs.keycodes.map[event:getKeyCode()]
if (flags:containExactly({'ctrl'}) == true) then
if (flags.ctrl == true) then
--print("This is ctrl")
change_kor_en_input()
end
else
--print('not only ctrl other pressed or released')
end
end
)
control_keyevent:start()
end
개선된 코드
- ‘ctrl이 눌렸을 때’가 아닌, ‘ctrl이 release될 때’ 한영변환이 발생되도록 한다.
- ‘ctrl 버튼이 눌리기 전’ 입력 소스를 기억하고 있다가, ‘ctrl이 눌려 있는 상태’에서 hjkl 등의 키가 눌리면, 한영 변환을 하지 않고, 이전 입력 소스로 전환한다.
- 그 외에도, 만약 ctrl과 함께 쓰이는 다른 단축키들이 있을 경우 해당 키를 아래에 추가하여, 해당 단축키를 사용했을 때, 한영 변환이 발생하지 않도록 할 수 있습니다.
------------------------------------------------------------------------------------
-- 2022.03.30 - sng_hn.lee - ctrl release change kor en
-- ctrl이 단독으로 눌리는 경우에는 한영 변환을 진행하고,
-- ctrl이 눌린 상태에서, hjkl이 눌린 적이 있으면, 이전 입력 소스로 변경함
-- arrow(Fn + [;/')이 입력되었을 때도 변환되지 않도록 처리함
-- 제외되어야 하는 key_code 들을 set로 빼서, contain 등으로 처리하는 것이 필요함
input_before_ctrl_pressed = nil
hjkl_press_count_during_ctrl_pressed = 0
function only_ctrl_change_kor_en()
local_function = hs.eventtap.new (
{
hs.eventtap.event.types.flagsChanged,
hs.eventtap.event.types.keyDown
},
function (event)
input_before_ctrl_pressed = hs.keycodes.currentSourceID()
local flags = event:getFlags()
local keycode = hs.keycodes.map[event:getKeyCode()]
--print('hjkl_press_count: ', hjkl_press_count)
--print('== print_keycode ========================')
if (keycode == 'ctrl' and flags.ctrl == true and flags:containExactly({'ctrl'}) == true) then
--print('== ctrl key pressed')
hjkl_press_count_during_ctrl_pressed = 0
elseif (keycode == 'h' or keycode == 'j' or keycode == 'k' or keycode == 'l') then
hjkl_press_count_during_ctrl_pressed = hjkl_press_count_during_ctrl_pressed + 1
elseif (keycode == 'left' or keycode == 'right' or keycode == 'up' or keycode == 'down') then
hjkl_press_count_during_ctrl_pressed = hjkl_press_count_during_ctrl_pressed + 1
elseif (keycode == 'ctrl' and flags.ctrl == nil and flags:containExactly({'ctrl'}) == false) then
--print('== ctrl key released')
if (hjkl_press_count_during_ctrl_pressed== 0) then
-- ctrl press 이후 hjkl이 눌린 적 없으므로 변환
kor_en_lang_lib.change_kor_en_input()
else
-- ctrl 이후 hjkl이 눌렸으므로 이전 input으로 변경함
hs.keycodes.currentSourceID(input_before_ctrl_pressed)
end
end
--print('==========================================')
end
)
local_function:start()
end
Wrap-up
- 이 이슈 때문에 며칠동안 퇴근하고 와서 고생한 것 같은데, 드디어 해결해서 매우 기분이 좋습니다 호호호.
- Hammerspoon 설정을 frhyme - frhyme_hammerspoon 저장소를 만들어 관리하고 있습니다. 혹시 관심이 있으시거나 도움이 되신 분들을 참고하시면 좋을 것 같아요.
댓글남기기