GUI Vim이 아닌 경우, Ctrl + Enter나 Shift + Backspace 조합 키를 인식하지 못합니다. 키 매크로로 해당 조합이 다른 키 조합을 발생시키도록 바꿔 해결할 수 있습니다.
KMonad https://github.com/kmonad/kmonad
이름에 monad가 들어가 있지만, 하스켈 지식을 필요로 하진 않습니다.
다른 매크로 앱을 써보지 않아 얼마나 좋은지는 잘 모르겠습니다. 설정 파일도 나름 직관적이고, 동작도 별 탈없이 잘 됩니다. Readme에 원하는 동작에 관한 설명을 찾기가 어려워 설정에 좀 노력이 들어가다 보니, 설치 시도를 계속 해야 되나란 생각이 들기도 했습니다만, 설치 완료하고나니, 확실히 있으면 좋긴 합니다. 좋은 앱입니다.
동시 키조합이 눌리는 것만 만들 수 있는 게 아니라, 순차적으로 키열이 입력되도록 할 수도 있습니다. 기능은 꽤 유연해 보입니다.
(defcfg;; 공식 튜토리얼 리눅스 설정 중 device-file 만 바꿨습니다.
"/dev/input/by-id/usb-04d9_a097-event-kbd")
input (device-file "My KMonad output" "sleep 1 && setxkbmap -option compose:ralt")
output (uinput-sink ;; Set the compose key to `RightAlt'
cmp-seq ralt 5 ;; 5ms delay between each compose-key sequence press
cmp-seq-delay
fallthrough true
allow-cmd true
)
;; 아래 키보드의 레이아웃은 자신의 키보드에 맞게 바꿔야 합니다.
;; 전 Leopold FC660 기계식 키보드를 쓰고 있습니다.
(defsrc1 2 3 4 5 6 7 8 9 0 - = bspc
grv t y u i o p [ ] \
tab q w e r ; ' ret
lctl a s d f g h j k l / rsft
lsft z x c v b n m , .
caps lmet lalt spc ralt rctl
)
;; alias 이름은 마음대로 지어도 됩니다.
(defalias;; ccr 레이어를 켜고, 본래 control키도 같이 넘기기
ccr (around (layer-toggle ccr) ctl) ;; sbs 레이어를 켜고, 본래 shift키도 같이 넘기기
sbs (around (layer-toggle sbs) sft) ;; Control + j 조합이 눌린 것으로
ctj (around ctl j) ;; Control + x 조합이 눌린 것으로
ctx (around ctl x)
)
;; 처음 설정하는 레이어가 디폴트 레이어 (이름으로 구분하지 않는 듯 합니다.)
;; 보통 default, qwerty, base 등으로 이름 붙입니다.
(deflayer default
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
@ccr _ _ _ _ _ _ _ _ _ _ _ _
@sbs _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _
)
;; 디폴트 레이어 상태에서 ctrl 이나 shift를 누르면 각 각
;; @ccr로 지정한 동작을 실행, @sbs로 지정한 동작을 실행
;; 아래 레이어들이 활성화 되고,
;; 이 상태에서 Enter키를 이 ccr레이어가 받아 ctj를 실행합니다.
(deflayer ccr
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ @ctj
_ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _
)
;; 이 상태에서 Backspace키를 이 sbs레이어가 받아 ctx를 실행합니다.
(deflayer sbs
_ _ _ _ _ _ _ _ _ _ _ _ _ @ctx
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ )
ccr (around (layer-toggle ccr) ctl)
이 부분을 ccr (layer-toggle ccr)
로 해두고 한참 헤맸습니다. around
로 ctl
을 같이 넘기지 않으면, ctl
정보가 사라져서, 위에 아무 설정없이 _
로 통과 시킨 ctl + d
같은 키들이 모두 먹통이 됩니다. 즉, ctl
(Control)키로 ccr
레이어만 활성화toggle시키기만 하면, 본래 Control 키 의미는 사라져 버립니다. 그래서 around
로 Control을 같이 감싸 넘겨야 합니다.
위와 같은 설정 파일을 ~/.config/kmonad/keyForVim.kbd 처럼 적당한 위치에 넣어 두고,
> kmonad ~/.config/kmonad/keyForVim.kbd
로 실행해서 원하는 동작을 하는 지 확인 후,
/etc/systemd/system/kmonad.service
[Unit]
Description=kmonad keyboard config
[Service]
Restart=always
RestartSec=3
ExecStart=/kmonad설치위치/kmonad /설정파일위치/keyForVim.kbd
Nice=-20
[Install] WantedBy=default.target
를 만들어
> service kmonad start
서비스로 동작하게 만듭니다.
이제 Control + Enter
가 Control + j
를 누르는 것으로 바뀌고,
Shift + Backspace
가 Control + x
를 누른 것으로 바뀌니,
Neovim에서는 Ctrl j
, Ctrl x
에 관한 키 설정을 하면 됩니다.
-- 라인 끝으로 이동 후 Enter키를 누른 것으로
vim.keymap.set({ 'i' }, '<C-j>', '<C-o>A<cr>', { silent = true })
vim.keymap.set(
{ 'i' },
'<C-x>',
function ()
vim.cmd.normal("xli") -- 입력 모드에서 delete
end,
{ desc = 'Delete' }
)