如何在最新版Ubuntu桌面配置热键触发的全触摸板单指滚动功能?
如何在最新版Ubuntu桌面配置热键触发的全触摸板单指滚动功能?
嘿,这个需求太懂了!十指打字的时候,不管是挪手去摸触摸板边缘,还是抬手用双指滚动,都特别打断节奏对吧?我来分享几个在最新Ubuntu(比如22.04/24.04)上能实现的方法,亲测好用:
方法一:用自定义脚本+全局快捷键(灵活度高)
这种方法适合喜欢折腾、想要精准控制的用户:
先装必要工具:
打开终端,运行这条命令安装依赖:sudo apt install libinput-tools xdotool写个监听脚本:
在你的主目录下新建一个脚本文件(比如叫touchpad-scroll-toggle.sh),把下面的内容复制进去——记得替换里面的触摸板名称,你可以先运行libinput list-devices找到自己的触摸板(比如常见的"SynPS/2 Synaptics TouchPad"):#!/bin/bash # 替换成你的触摸板设备名称 TOUCHPAD_NAME="SynPS/2 Synaptics TouchPad" TOUCHPAD=$(libinput list-devices | grep -B 1 -A 10 "$TOUCHPAD_NAME" | grep "Device:" | awk '{print $2}') if [ "$1" = "start" ]; then # 监听触摸板的移动事件,转换成滚动操作 libinput debug-events --device "$TOUCHPAD" | while read -r line; do # 处理垂直滚动 if echo "$line" | grep -q "ABS_Y"; then Y_VAL=$(echo "$line" | awk '{print $NF}') # 数值正负对应上下,可根据触摸板灵敏度调整阈值 if [ $Y_VAL -gt 5 ]; then xdotool click 4 # 向上滚动 elif [ $Y_VAL -lt -5 ]; then xdotool click 5 # 向下滚动 fi # 处理水平滚动 elif echo "$line" | grep -q "ABS_X"; then X_VAL=$(echo "$line" | awk '{print $NF}') if [ $X_VAL -gt 5 ]; then xdotool click 6 # 向右滚动 elif [ $X_VAL -lt -5 ]; then xdotool click 7 # 向左滚动 fi fi done elif [ "$1" = "stop" ]; then # 停止监听脚本 pkill -f "libinput debug-events --device $TOUCHPAD" fi给脚本加执行权限:
chmod +x ~/touchpad-scroll-toggle.sh设置全局快捷键:
打开「系统设置」→「键盘」→「快捷键」→「自定义快捷键」,添加两个条目:- 名称:启用单指滚动,命令:
~/touchpad-scroll-toggle.sh start,绑定你想用的热键(比如Ctrl+Alt+S) - 名称:禁用单指滚动,命令:
~/touchpad-scroll-toggle.sh stop,绑定对应的停止热键(比如Ctrl+Alt+X)
如果你觉得手动按停止键麻烦,可以用
xbindkeys来监听按键的按下/释放事件,实现按住热键时自动启用,松开就恢复——需要额外安装xbindkeys,然后配置~/.xbindkeysrc文件,感兴趣的话可以自己摸索下~- 名称:启用单指滚动,命令:
方法二:用Touchegg(图形化工具,新手友好)
如果你不想写脚本,这个图形化工具能帮你快速搞定:
- 安装Touchegg和配套的图形界面:
sudo apt install touchegg touche - 配置手势:
打开应用列表里的「Touche」,点击右上角的「+」添加手势:- 选择「按键组合触发」,设置你想要的热键(比如左Ctrl)
- 手势类型选「单指拖动」,动作设置为「滚动」
- 还可以调整滚动的方向、速度,按需设置就行
- 重启服务生效:
终端运行这条命令重启Touchegg服务:systemctl restart touchegg
注意事项
- 为了避免冲突,建议先在「系统设置」→「鼠标和触摸板」里关闭默认的双指滚动/边缘滚动功能
- 如果测试时滚动不灵敏,可以调整脚本里的阈值(比如把
5改成更大或更小的数值),或者在Touche里调整滚动速度 - 部分品牌的触摸板(比如ThinkPad)可能需要额外启用libinput的支持,不过最新Ubuntu一般都默认支持了
备注:内容来源于stack exchange,提问作者grigoryvp




