2025-05-16

鍵盤也能當滑鼠用:mouseless

 前面介紹了keyd這個軟體式的QMK,把沒有QMK的鍵盤變成跟QMK鍵盤一樣,不管機械鍵盤或一般鍵盤都能用,特別是筆記型電腦的鍵盤也能有layer、改鍵位、組合。而且跨X11/Wayland/tty,讓你在不同的鍵盤、不同的筆記型電腦(有些筆記型電腦上面的鍵盤位置差很大)、Macbook,都像用同一把鍵盤一樣有相同的鍵位,不必再用眼睛去尋找控制/編輯…等等的鍵位而中斷思路。

 本文來介紹如何把鍵盤設成滑鼠一樣的使用。

 有時在某些狀況下不想用,或不能用滑鼠,也可以透過軟體方式,用這個就能把鍵盤當滑鼠使用,不論是在X11/Wayland,皆能使用。

 https://github.com/jbensmann/mouseless
(最近的程式修改是七個月前)
它是使用go語言寫的,在github的Releases都附了一個compile好的binary執行檔可用,可以不必自己compile.

 mouseless的config.ymal跟keyd的default.conf類似,很容易看懂,自行修改後,放在
$HOME/.config/mouseless/config.yaml

 devices: 下要用你電腦裡真正顯示的檔名,用
ls /dev/input/by-id/
看一下你的鍵盤是什麼叫做kbd結尾的檔名。

 以下是我初次使用的設定檔,我原本把左、中、右三個按鍵放在移動上、下、左、右的鍵的下一排的"n,m,.",比較近。後來發現這樣沒辦法單手進行拖曳,還是把這三個鍵放在左手,押住後右手按上、下、左、右才能進行拖曳。

 按住Tab同時再按一下r,可以固定住鍵盤當滑鼠用。
按住Tab跟config裡定義的字母,就是只用一次定義裡的功能,例如往上移動遊標,放掉Tab就打出i。

devices:
  - "/dev/input/by-id/usb-XXX_Gaming_Keyboard-event-kbd"
# the default speed for mouse movement and scrolling
baseMouseSpeed: 750.0
baseScrollSpeed: 20.0

# the rest of the config defines the layers with their bindings
layers:
  # the first layer is active at start
  - name: initial
    bindings:
      # when tab is held and another key pressed, activate mouse layer
      tab: tap-hold-next tab ; toggle-layer mouse ; 500
      # when a is held for 300ms, activate mouse layer
      #a: tap-hold a ; toggle-layer mouse ; 300
  # a layer for mouse movement
  - name: mouse
    # when true, keys that are not mapped keep their original meaning
    passThrough: true
    bindings:
      # quit mouse layer
      q: layer initial
      # keep the mouse layer active
      r: layer mouse
      l: move  1  0
      j: move -1  0
      k: move  0  1
      i: move  0 -1
      u: scroll up
      h: scroll down
      s: speed 4.0
      d: speed 0.3
      f: speed 0.1
      x: button left
      c: button middle
      v: button right
      m: button left
      comma: button middle
      60: button right

如果要讓一般user有使用權限,必需把他加到input的group 

usermod -aG input USER_NAME

 另外還要建立一個檔
/etc/udev/rules.d/99-XXXX.rules

可以用以下的script來建立:
sudo tee /etc/udev/rules.d/99-$USER.rules <<EOF
KERNEL=="uinput", GROUP="$USER", MODE:="0660"
KERNEL=="event*", GROUP="$USER", NAME="input/%k", MODE="660"
EOF

 以及跟keyd一樣透過systemd來啟動/停止,需要建立
/etc/systemd/system/mouseless.service
讓它被systemctl控制。
以下的PATH跟USER要用你系統裡真實的路徑。

[Unit]
Description=mouseless

[Service]
ExecStartPre=/bin/sleep 2
ExecStart=/PATH/bin/mouseless --config /home/USER/.config/mouseless/config.yaml

[Install]
WantedBy=multi-user.target
目前的使用,發現mouseless先啟動
systemctl start mouseless
再執行
systemctl start keyd


如果mouseless的config有錯誤,systemctl status mouseless會失敗,然後keyd功能會失效,這時必需restart keyd,先讓keyd功能回來。修改mouseless的config.yaml,等成功後,中止keyd,等mouseless啟動後,再啟動keyd。
如果要用到「非字母鍵」來定義,需要改用「鍵值」,這時可以執行xev來查出鍵值。
例如原本用v
v: button right
改成句點
.: button right
mouseless執行會失敗,這時執行xev查出句點"." 是60,改成
60: button right
systemctl start mouseless 才能成功。

沒有留言: