这里要介绍的是一款在Linux平台上实现的文字标注翻译工具。当然,在考虑实现一个具有这样功能的工具之前,我也在网上搜索了一些类似的在Linux平台上实现的开源工具,比如pdfTranslator,popup-dict,但是它们的安装和配置比较麻烦,而且是使用不方便。我实现这个工具的初衷是为了方便自己阅读一些英文文献和书籍,非常方便。考虑到分享出来可以让更多的人受益,这里详细介绍一下它的实现步骤。本文实现的分词翻译工具主要有以下特点:支持将英文单词和词组翻译成中文分词翻译,终端显示自动过滤选中文本中的换行符等特殊字符,只依赖一些Linux命令工具。下面有动画做演示。我使用的环境是在VMware虚拟机下运行的Linux发行版Ubuntu18.04.3LTS,所以这里描述的步骤可能与其他Linux发行版中的实现略有不同。让我们一步一步地实施它。1.安装必要的命令1.xclip$sudoaptinstallxclipxclip命令在终端和剪贴板之间建立通道。可以使用命令将终端输出或文件内容保存到剪贴板,也可以将剪贴板内容保存到剪贴板。输出到终端或文件。详细使用方法可以使用manxclip,查看其使用手册。下面是一些常见的用法。$xclipfile_name#保存到Xwindow剪贴板的文件内容$xclip-selectioncfile_name#保存到外部剪贴板的文件内容$xclip-o#Xwindow剪贴板内容输出到终端显示$xclip-selectionc-o#外部剪贴板内容输出到终端显示值得强调的是这里所说的Xwindow剪贴板只是简单的说就是你用鼠标选中的文本会实时保存在这个剪贴板中,你可以用鼠标中键粘贴。外部剪贴板是保存你用ctrl+c复制的文本,ctrl+v可以粘贴。这两个地方不一样。2.translate-shell$sudoaptinstalltranslate-shell这是谷歌翻译工具的命令行版本,以前叫谷歌翻译CLI是一个使用谷歌翻译(默认)、必应翻译等进行翻译的命令行翻译器。它使您可以终端访问这些翻译引擎。大多数Linux发行版都提供translate-shell。常用方法如下:$transen:zh[word]#英汉单词翻译$transen:zh-b[text]#简要输出,对于文本翻译,需要注意的是使用本翻译工具需要您具备访问外文网,或者通过修改translate-shell默认的翻译引擎,具体方法这里就不细说了。2.编程本工具的总体思路是C程序实时检测鼠标按键的动态。当它检测到用户用鼠标选中一段文字时,调用shell脚本获取Xwindow剪贴板的内容,进行翻译,输出到终端显示。1、找到鼠标设备文件mouse作为输入设备。可以使用以下命令在文件/proc/bus/input/devices中查看其信息:$sudocat/proc/bus/input/devicesI:Bus=0011Vendor=0002Product=0013Version=0006N:Name="VirtualPS/2VMwareVMMouse"P:Phys=isa0060/serio1/input1S:Sysfs=/devices/platform/i8042/serio1/input/input4U:Uniq=H:Handlers=mouse0event2B:PROP=0B:EV=bB:KEY=700000000B:ABS=3的处理程序event2的值表示可以在/dev/input/event2文件下读取鼠标的状态。需要注意的是,对于不同的设备,读取鼠标状态的文件可能不同,比如也可能是/dev/input/event3。我们可以使用下面的命令来查找你的鼠标对应的是哪个事件。$sudocat/dev/input/event2|hexdump#测试的时候改数字就行了。比如我运行上面的命令,我移动鼠标,按下鼠标左/中/右键,终端会输出一些值,就是说明event2文件对应的是我的鼠标。如果操作鼠标没有反应,说明不是这种情况。您可以使用此方法找到与您的鼠标对应的事件文件。2、Linux下获取按键响应在Linux内核中,输入设备是通过input_dev结构体来描述的。当输入子系统用于实现输入设备驱动时,驱动的核心工作是向系统上报按钮、触摸屏、键盘、鼠标等输入事件(event,由input_event结构体描述),不需要关心文件操作接口,因为input子系统已经完成了文件操作接口Linux/input.h这个文件定义了event事件的结构体,API的编码和标准键等//结构体定义见input.hstructinput_event{structtimevaltime;//按键时间__u16type;//事件类型__u16code;//模拟什么键为__s32value;//是按下还是松开};//下面的宏定义见input-event-coses.h//type#defineEV_KEY0x01#defineEV_REL0x02#defineEV_ABS0x03//...//code#defineBTN_LEFT0x110#defineBTN_RIGHT0x111#defineBTN_MIDDLE0x112//.../value#defineMSC/MSC/SERIAL0xSERIAL0x00#def这里稍微介绍一下type,指的是事件的类型。常见的事件类型有:EV_KEY,按键事件,如键盘按键(按下哪个键),鼠标左右键(是否点击)等;EV_REL,相对坐标,主要是指鼠标移动事件(相对位移);EV_ABS,绝对坐标,主要是指触摸屏的移动事件。3.编写C程序现在可以编写一个程序来检测鼠标的动态。首先在您的用户~目录中创建文件夹Translator。在Translator中创建ct.c源文件,代码如下:#include
