2025-07-10

60%鍵盤最好用

自從使用鍵盤定義軟體keyd加上home row概念之後,改變了以前一直認為要用全幅鍵盤的想法。回顧鍵盤實際使用的經驗,全幅鍵盤確實有很多鍵幾乎從來不會去按。

註:home row指的是「ASDF JKL;」這一排鍵位,手指平常會停放在這個基準位。

全幅鍵盤指又稱為100%鍵盤,或是叫做108鍵,右邊九宮數字以及Prtscr/Scroll/Pause從來不用,82鍵或叫75%鍵盤,最上面12個Fx鍵也幾乎用不到。

68鍵鍵盤也叫做65%鍵盤,61鍵比起68鍵少了「上、下、左、右、Home、End、Del」七個鍵,又叫做60%鍵盤。

鍵盤經由keyd或kanata的軟體自行定義後,要用什麼鍵就有什麼鍵,像常用的上、下、左、右、Home、End、PgUp、PgDn、Del、Backspace、Esc這幾個鍵都可以藉由軟體定義安排到更方便按的位置。

在使用全幅鍵盤(108鍵)時,常常要用眼睛去看右手右邊的那些鍵,確定位置才按。但61鍵經過自行定義把一些常用鍵安排到home row之後,根本不必用眼睛去看位置,手指可以一直保持在home row的範圍,就能操控所有鍵的效果,不但不必跨越長距離去按,更是可以關燈操作,所以是最好用的鍵盤。

筆記型電腦受到物理上的限制,會把一些鍵做得比較小,或是做得位置不好按,或是必需按複合鍵「Fn」加上某個鍵來達到其他功能,但「Fn」鍵位置往往不好搭配要按的某個鍵位、距離,手的移動有諸多不便。

在OS裡安裝keyd或kanata,操作習慣之後可以讓各種電腦鍵盤,包括筆記型電腦或外接式機械鍵盤有統一的操作方式之外,更可以讓鍵盤的操作變得很方便、快速。

註:某些61鍵的鍵盤在不使用keyd或kanata情況下,「上、下、左、右」鍵可以先按住Fn再按按一次W,放開之後A=左、S=下、W=上、D=右,按住Fn再按一次W,便取消A,S,W,D的上下左右功能,但還是不如用keyd或kanata自行定義來得好用。

再來談到Alice佈局鍵盤,其實在Alice名稱佈局的鍵盤出現之前,十幾年前就已經有這種左右手鍵位分開的鍵盤在販售,以前稱為「人體工學鍵盤」。我一直有個迷思,認為這樣的佈局才符合人體工學。直到最近使用鍵盤定義軟體搭配61鍵的鍵盤,才破除這個迷思。

其實整齊排式式(非左右分離、非Alice)的傳統型鍵盤,我們在打字時的手腕角度其實沒有很大的彎曲,並不違反手腕、手指的使用。

因為基本上手指擺放位置會是
A: 左小指
W: 左無名指
E: 左中指
F: 左食指
space: 左拇指、左拇指
J: 右食指
I: 右中指
O: 右無名指
;: 右小指
所以手腕仍然近乎伸直,不致於彎曲不舒服。

這樣的位置適合把兩鍵組合起來(一起按)當某一個功能使用。
W+E
E+F
I+J
I+O

以及稍微移動就能按到的各種延伸變化:
U+H
H+B
R+G
G+B
2+3
9+0
X+C
C+V
,+.
,+M
E+R
U+I

總計有16個組合位置,可供定義出我們最常用的功能。而61+16=77鍵,已經非常夠用了。

這樣的組合鍵盤佈局,按的時候完全不用眼睛看一下,就包括了Home, End, PgUp, PgDn, Del, Backspace, Insert, Up, Down, Left, Right 11個鍵功能,16-11=5,還剩五個空位,可以重複定義,例如定義兩個Home, 兩個PgUp, 兩個Esc……等等。

總之經由鍵盤定義軟體(如keyd, kanata)設定後,61鍵的鍵盤不但夠用而且操作方便,讓桌面有更多空間。

2025-06-24

給kanata更多滑鼠的控制項目

增加一個滑鼠layer "mmouse" 啟動按鍵為"e"

按住 "e" 不放,加按以下各鍵,達到跟用滑鼠一樣的作用

  i = 往上移動
  j = 往左移動
  k = 往下移動
  l = 往右移動
  (同時按 i+l = 往右上移動,其餘類推)

  在移動游標的同時,左手加按
  t = 加速
  f = 減速
  s = 最慢速

  w = 壓下滑鼠左鍵不放
  r = 壓下滑鼠右鍵不放

  y = 滾輪向前
  h = 滾輪向後
  u = 滾輪向左
  o = 滾輪向右

(defcfg
;; You can set the value below to no if you only use the keys defined in defsrc.
  process-unmapped-keys yes
;;  danger-enable-cmd 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 up
  lctl lmet lalt          spc          ralt rmet rctl    left down right
)

(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 |#
  ;; KEY (tap-hold tap-time hold-time ACTION (layer-while-held LAYER))
  ;; 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 60 lctl) (macro M-f 60 lctl))) lsft)
  rsft (tap-hold 200 200 (tap-dance 180 ((macro M-f 60 lctl) (macro M-a 60 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 mltp
  k mmtp
  l mrtp
  , (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)
)

(deflayermap (mmouse)
  t (movemouse-speed 200)
  f (movemouse-speed 50)
  s (movemouse-speed 25)

  w mlft 
  r mrgt

  y (mwheel-up 50 120)
  h (mwheel-down 50 120)
  u (mwheel-left 50 120)
  o (mwheel-right 50 120)

  i (movemouse-up 4 3)
  j (movemouse-left 4 3)
  k (movemouse-down 4 3)
  l (movemouse-right 4 3)
)

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)
)

2025-05-22

沒辦法回報google地圖上的錯誤

發現這個地方絕對不是google地圖標示的「田寮河」。

這裡是荒郊野外一條小溪。

田寮河南側是東明路接仁一路,北側是東信路接信一路,流經基隆女中前面,向西直到文化中心進入基隆港的一條至少20公尺寬的河流。

按照說明,點了地圖進入,一一填寫,最後按「提交」卻完全沒反應。
為什麼不讓使用著很簡單的就能貼個圖、寫幾行字說明,簡單就能回報錯誤?
算了,貼在這裡就好了。