터미널 Neovim에서 Ctrl + Enter 바인딩 잡기 - Kmonad

Posted on March 14, 2023

GUI Vim이 아닌 경우, Ctrl + Enter나 Shift + Backspace 조합 키를 인식하지 못합니다. 키 매크로로 해당 조합이 다른 키 조합을 발생시키도록 바꿔 해결할 수 있습니다.

KMonad https://github.com/kmonad/kmonad

이름에 monad가 들어가 있지만, 하스켈 지식을 필요로 하진 않습니다.
다른 매크로 앱을 써보지 않아 얼마나 좋은지는 잘 모르겠습니다. 설정 파일도 나름 직관적이고, 동작도 별 탈없이 잘 됩니다. Readme에 원하는 동작에 관한 설명을 찾기가 어려워 설정에 좀 노력이 들어가다 보니, 설치 시도를 계속 해야 되나란 생각이 들기도 했습니다만, 설치 완료하고나니, 확실히 있으면 좋긴 합니다. 좋은 앱입니다.

동시 키조합이 눌리는 것만 만들 수 있는 게 아니라, 순차적으로 키열이 입력되도록 할 수도 있습니다. 기능은 꽤 유연해 보입니다.

설정

(defcfg
  ;; 공식 튜토리얼 리눅스 설정 중 device-file 만 바꿨습니다.
  input  (device-file "/dev/input/by-id/usb-04d9_a097-event-kbd")
  output (uinput-sink "My KMonad output" "sleep 1 && setxkbmap -option compose:ralt")
  cmp-seq ralt    ;; Set the compose key to `RightAlt'
  cmp-seq-delay 5 ;; 5ms delay between each compose-key sequence press
  fallthrough true
  allow-cmd true
)

;; 아래 키보드의 레이아웃은 자신의 키보드에 맞게 바꿔야 합니다.
;; 전 Leopold FC660 기계식 키보드를 쓰고 있습니다.
(defsrc
  grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
  tab  q    w    e    r    t    y    u    i    o    p    [    ]    \
  lctl a    s    d    f    g    h    j    k    l    ;    '    ret
  lsft z    x    c    v    b    n    m    ,    .    /    rsft
  caps lmet lalt           spc            ralt rctl     
)

;; alias 이름은 마음대로 지어도 됩니다.
(defalias
  ccr  (around (layer-toggle ccr) ctl) ;; ccr 레이어를 켜고, 본래 control키도 같이 넘기기
  sbs  (around (layer-toggle sbs) sft) ;; sbs 레이어를 켜고, 본래 shift키도 같이 넘기기
  ctj  (around ctl j) ;; Control + j 조합이 눌린 것으로 
  ctx  (around ctl x) ;; Control + 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)로 해두고 한참 헤맸습니다. aroundctl을 같이 넘기지 않으면, 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

서비스로 동작하게 만듭니다.

Neovim 설정

이제 Control + EnterControl + j를 누르는 것으로 바뀌고,
Shift + BackspaceControl + 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' }
)
Github 계정이 없는 분은 메일로 보내주세요. lionhairdino at gmail.com