2025-06-18

kanata鍵盤程式可以在三種OS使用

用了一陣子keyd之後,覺得可惜的是它只能在Linux用,沒辦法推薦給更多非Linux使用者。所以換用kanata看看,一開始被它的設定檔搞得一頭霧水,慢慢摸索終於把keyd用的default.conf 轉換過來,在kanata也能使用相同於keyd的操作方式。

https://github.com/jtroo/kanata
這裡有compile好的可執行檔可以下載來用
https://github.com/jtroo/kanata/releases/tag/v1.8.1

kanata 最大優點是能跨三種OS使用,Linux, Windows, MacOS(某些功能受限)。兩者的設定檔不同,不過有了keyd的設定概念,轉來kanata用也不會太難懂。

kanata 有一項keyd沒有的功能,就是tap-dance

可以定義某個鍵按幾下是什麼功能,例如

Home按一下是Home
Home按兩下是End
Left按一下是Left
Left按兩下是Home
當然不止能按兩下,也可以定義Home按三下=up、按四下=down……,不過按那麼多下其實也不是很好用。

(上面說的「按幾下」是說快速連續按)
以下是我的kanata.kdb 裡面的功能跟我在keyd 定義方式一樣。


(defcfg
  process-unmapped-keys yes
)

(defsrc
  grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
  tab  q    w    e    r    t    y    u    i    o    p    [    ]    \
  caps a    s    d    f    g    h    j    k    l    ;    '    ret
  lsft z    x    c    v    b    n    m    ,    .    /    rsft
  lctl lmet lalt          spc          ralt rmet rctl
)

(defvar
  streak-count 3
  streak-time 325
  tap-timeout 200
  hold-timeout 500
  hold-time-slow 300
  chord-timeout 50
)

(deftemplate charmod (char mod)
  (switch 
    ((key-timing $streak-count less-than $streak-time)) $char break
    () (tap-hold-release-timeout $tap-timeout $hold-timeout $char $mod $char) break
  )
)

(defchords piano $chord-timeout
  ( 2 ) 2
  ( 3 ) 3
  ( q ) q
  ( w ) (tap-hold 200 200 w (layer-while-held himep))
  ( e ) (tap-hold 200 200 e (layer-while-held mmouse))
  ( r ) r
  ( f ) (t! charmod f lmet)
  ( g ) g
  ( 2 3 ) esc
  ( w e ) A-left
  ( e f ) home
  ( r g ) C-S--
  ( x ) x
  ( c ) c
  ( v ) v
  ( b ) b
  ( 9 ) 9
  ( 0 ) 0
  ( - ) -
  ( u ) u
  ( i ) i
  ( o ) o
  ( p ) p
  ( h ) h
  ( j ) (t! charmod j rmet)
  ( m ) m
  ( , ) ,
  ( . ) .
  ( x c ) A-tab
  ( c v ) mmid
  ( v b ) enter
  ( i o ) A-right
  ( i j ) end
  ( u h ) pgup
  ( h b ) pgdn
  ( 9 0 ) bspc
  ( m , ) C-f12
  ( , . ) C-tab
)

(deflayermap (main)
  ;; for some Notebook combine up/down/left/right with pgup/pgdn/home/end
  ;; use tap-dance to set one key with multiple functions by tapping more than once
  ;; KEY (tap-dance timeout ACTIONa ACTIONb ACTIONc)
  up (tap-dance 170 (up pgup))
  down (tap-dance 170 (down pgdn))
  home (tap-dance 200 (home end))
  lsft (tap-hold 200 200 (tap-dance 180 ((macro M-a lctl) (macro M-f lctl))) lsft)
  rsft (tap-hold 200 200 (tap-dance 180 ((macro M-f lctl) (macro M-a lctl))) rsft)
  caps (tap-hold 200 200 C-spc (layer-while-held capc))
  2 (chord piano 2)
  3 (chord piano 3)
  q (chord piano q)
  w (chord piano w)
  e (chord piano e)
  r (chord piano r)
  a (t! charmod a lalt)
  s (t! charmod s lsft)
  d (t! charmod d lctl)
  f (chord piano f)
  g (chord piano g)
  x (chord piano x)
  c (chord piano c)
  v (chord piano v)
  b (chord piano b)
  9 (chord piano 9)
  0 (chord piano 0)
  - (chord piano -)
  u (chord piano u)
  i (chord piano i)
  o (chord piano o)
  p (chord piano p)
  h (chord piano h)
  j (chord piano j)
  k (t! charmod k rctl)
  l (t! charmod l rsft)
  ; (t! charmod ; ralt)
  m (chord piano m)
  , (chord piano ,)
  . (chord piano .)
  rctl (tap-hold 200 200 C-f12 rctl)
  spc  (tap-hold 200 200 spc (layer-while-held nav))
)

(deflayermap (nav)
  i up
  j left
  k down
  l right
  h home
  ; end
  y bspc
  u del
  g `
  f esc
  m mute
  , vold
  . volu
  q 1 ;; kp1
  w 2 ;; kp2
  e 3 ;; kp3
  a 4 ;; kp4
  s 5
  d 6
  z 7
  x 8
  c 9
  v 0
)

(deflayermap (capc)
  g `
  f esc
  i (mwheel-up 50 120)
  j mlft
  k mmid
  l mrtp ;; mrgt
  , (mwheel-down 50 120)
  u (mwheel-left 50 120)
  o (mwheel-right 50 120)
)

(deflayermap (himep)
  o (macro . o spc)
  k (macro . k spc)
  i (macro . i spc)
  y (macro . y spc)
  p (macro . p spc)
  h (macro . h spc)
  j (macro . j spc)
  . (macro . spc)
  f (macro . f spc)
  g (macro . g spc)
)