我手撸了一个划线翻译工具!
Hollis
共 3999字,需浏览 8分钟
·
2020-12-11 04:41
支持英文单词和短语到中文的翻译 划词翻译,终端显示 自动过滤选中文本中的换行等特殊字符 只依赖少数几个 Linux 命令工具
VMware
虚拟机下的 Linux 发行版 Ubuntu 18.04.3 LTS,因此这里介绍的步骤可能与其他 Linux 发行版中的实现略有不同。下面就来一步一步的实现它吧。一. 安装必要的命令
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 # 外部剪切板内容输出到终端显示
translate-shell
$ sudo apt install translate-shell
Google Translate CLI
是一款借助谷歌翻译(默认)、必应翻译等来翻译的命令行翻译器。它让你可以在终端访问这些翻译引擎。translate-shell 在大多数 Linux 发行版中都能使用。常用的方法如下:$ trans en:zh [word] # 英文到中文的单词翻译
$ trans en:zh -b [text] # 简要的输出,进行文本翻译
二. 编程实现
$ 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
$ sudo cat /dev/input/event2 | hexdump # 测试时改变数字即可
input_dev
结构体描述,使用 input 子系统实现输入设备驱动的时候,驱动的核心工作就是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过 input_event 结构体描述),不再需要关心文件操作接口,因为 input 子系统已经完成了文件操作接口 Linux/input.h 这个文件定义了 event 事件的结构体,API 和标准按键的编码等。// 结构体定义见 input.h
struct input_event
{
struct timeval time; // 按键时间
__u16 type; // 事件类型
__u16 code; // 要模拟成什么按键
__s32 value; // 是按下还是释放
};
// 下面宏定义见 input-event-coses.h
// type
#define EV_KEY 0x01
#define EV_REL 0x02
#define EV_ABS 0x03
// ...
// code
#define BTN_LEFT 0x110
#define BTN_RIGHT 0x111
#define BTN_MIDDLE 0x112
// ...
// value
#define MSC_SERIAL 0x00
#define MSC_PULSELED 0x01
// ...
EV_KEY
,按键事件,如键盘的按键(按下哪个键),鼠标的左键右键(是否击下)等;EV_REL
,相对坐标,主要是指鼠标的移动事件(相对位移);EV_ABS
, 绝对坐标,主要指触摸屏的移动事件 。#include
#include
#include
#include
#include
int main(void)
{
int keys_fd;
struct input_event t;
// 注意这里打开的文件根据你自己的设备情况作相应的改变
keys_fd = open("/dev/input/event2", O_RDONLY);
if (keys_fd <= 0)
{
printf("open /dev/input/event2 error!\n");
return -1;
}
while (1)
{
read(keys_fd, &t, sizeof(t));
if (t.type == EV_KEY) // 有键按下
if (t.code == BTN_LEFT) // 鼠标左键
if (t.value == MSC_SERIAL) // 松开
// 调用外部shell脚本
system("~/Translator/goTranslate.sh");
}
close(keys_fd);
return 0;
}
gcc
编译器生成可执行文件 ct :$ gcc ct.c -o ct
#!/bin/bash
str_old=$(cat ~/Translator/lastContent)
str_new=$(xclip -o 2>/dev/null | xargs)
if [[ "$str_new" != "$str_old" && $str_new ]]; then
echo -e "\n"
count=$(echo "$str_new" | wc -w)
if [ "$count" == "1" ]; then
echo -n -e "$str_new " >>~/Translator/words
echo "$str_new" | trans :zh-CN | tail -1 | cut -c 5- | sed "s,\x1b\[[0-9;]*[a-zA-Z],,g" | tee -a ~/Translator/words
else
echo "$str_new" | trans :zh-CN -b
fi
echo "$str_new" >~/Translator/lastContent
fi
设置 ct 别名
$ sudo ~/Translator/ct
~/.bashrc
文件中加入下面一条命令。alias ct='sudo ~/Translator/ct'
$ ct
三. 结束语
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
评论