一. 安装必要的命令
1.xclip
- $ sudo apt install xclip
xclip 命令建立了终端和剪切板之间通道,可以用命令的方式将终端输出或文件的内容保存到剪切板中,也可以将剪切板的内容输出到终端或文件。详细的用法可以使用 man xclip,见其手册。这里介绍几个常用的用法。
- $ xclip file_name # 文件内容保存到X window剪切板
- $ xclip -selection c file_name #文件内容保存到外部剪切板
- $ xclip -o # X window剪切板内容输出到终端显示
- $ xclip -selection c -o # 外部剪切板内容输出到终端显示
值得强调的是,这里所说的 X window 剪切板,简单的说就是你用鼠标选择的文本会实时的存放在这个剪切板,使用鼠标中键可以粘贴。而外部剪切板是保存你用 ctrl+c 复制的文本,ctrl+v 可以粘贴。这两个地方是不一样的。
2.translate-shell
- $ sudo apt install translate-shell
这是命令行版的谷歌翻译工具,之前叫做 Google Translate CLI 是一款借助谷歌翻译(默认)、必应翻译等来翻译的命令行翻译器。它让你可以在终端访问这些翻译引擎。translate-shell 在大多数 Linux 发行版中都能使用。常用的方法如下:
- $ trans en:zh [word] # 英文到中文的单词翻译
- $ trans en:zh -b [text] # 简要的输出,进行文本翻译
需要注意的是,使用这个翻译工具需要你能够访问外网,或者通过修改 translate-shell 的默认翻译引擎,具体的方法这里就不阐述了。
二. 编程实现
这个工具整体的思路就是 C 程序实时检测鼠标按键的动态,当检测到用户使用鼠标选择一段文本之后,调用 shell 脚本获取 X window 剪切板的内容进行翻译后输出到终端显示。
1. 定位鼠标设备文件
鼠标作为输入设备。其信息可以在文件 /proc/bus/input/devices 中,使用下列命令查看:
- $ sudo cat /proc/bus/input/devices
- I: Bus=0011 Vendor=0002 Product=0013 Version=0006
- N: Name="VirtualPS/2 VMware VMMouse"
- P: Phys=isa0060/serio1/input1
- S: Sysfs=/devices/platform/i8042/serio1/input/input4
- U: Uniq=
- H: Handlers=mouse0 event2
- B: PROP=0
- B: EV=b
- B: KEY=70000 0 0 0 0
- B: ABS=3
其中的 Handlers 的值 event2 表示可以在 /dev/input/event2 文件下读取鼠标的状态。需要注意的是,对于不同的设备,读取鼠标的状态的文件可能不一样,比如也可能是 /dev/input/event3 。我们可以使用下面的命令找到你的鼠标对应的是哪一个 event。
- $ sudo cat /dev/input/event2 | hexdump # 测试时改变数字即可
比如,当我运行上面这条命令之后,我移动鼠标、按鼠标左键/中键/右键,终端都会输出一些值,这就说明 event2 文件就是对应着我的鼠标。如果操作鼠标没有反应,说明这个就不是。你可以通过这种方法找到你的鼠标对应的 event 文件。
2. Linux 下获取按键响应
在 Linux 内核中,input 设备用 input_dev 结构体描述,使用 input 子系统实现输入设备驱动的时候,驱动的核心工作就是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过 input_event 结构体描述),不再需要关心文件操作接口,因为 input 子系统已经完成了文件操作接口 Linux/input.h 这个文件定义了 event 事件的结构体,API 和标准按键的编码等。