自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我擼了一個(gè)劃線翻譯工具!

系統(tǒng) Linux
這里將要介紹的是一種在 Linux 平臺(tái)實(shí)現(xiàn)的劃詞翻譯工具,當(dāng)然在考慮自己實(shí)現(xiàn)一個(gè)如此功能的工具前,本人也是在網(wǎng)上搜索了一些在 Linux 平臺(tái)實(shí)現(xiàn)的類似的開(kāi)源工具,例如 pdfTranslator,popup-dict,但它們的安裝和配置都顯得比較麻煩,而且使用起來(lái)也并不方便。

?[[350260]]?

這里將要介紹的是一種在 Linux 平臺(tái)實(shí)現(xiàn)的劃詞翻譯工具,當(dāng)然在考慮自己實(shí)現(xiàn)一個(gè)如此功能的工具前,本人也是在網(wǎng)上搜索了一些在 Linux 平臺(tái)實(shí)現(xiàn)的類似的開(kāi)源工具,例如 pdfTranslator,popup-dict,但它們的安裝和配置都顯得比較麻煩,而且使用起來(lái)也并不方便。

本人實(shí)現(xiàn)這個(gè)工具的初衷本是方便自己看一些英文文獻(xiàn)和書(shū)籍的,極為方便,考慮到分享出去可以讓更多人受惠,因此這里詳細(xì)介紹一下它的實(shí)現(xiàn)步驟。

本文所實(shí)現(xiàn)的劃詞翻譯工具主要有以下特性:

  • 支持英文單詞和短語(yǔ)到中文的翻譯
  • 劃詞翻譯,終端顯示
  • 自動(dòng)過(guò)濾選中文本中的換行等特殊字符
  • 只依賴少數(shù)幾個(gè) Linux 命令工具

下面有動(dòng)圖進(jìn)行演示。

??

本人所使用的環(huán)境是運(yùn)行在 VMware 虛擬機(jī)下的 Linux 發(fā)行版 Ubuntu 18.04.3 LTS,因此這里介紹的步驟可能與其他 Linux 發(fā)行版中的實(shí)現(xiàn)略有不同。下面就來(lái)一步一步的實(shí)現(xiàn)它吧。

一. 安裝必要的命令

1.xclip

$ sudo apt install xclip

xclip 命令建立了終端和剪切板之間通道,可以用命令的方式將終端輸出或文件的內(nèi)容保存到剪切板中,也可以將剪切板的內(nèi)容輸出到終端或文件。詳細(xì)的用法可以使用 man xclip,見(jiàn)其手冊(cè)。這里介紹幾個(gè)常用的用法。

$ xclip file_name # 文件內(nèi)容保存到X window剪切板
$ xclip -selection c file_name #文件內(nèi)容保存到外部剪切板
$ xclip -o # X window剪切板內(nèi)容輸出到終端顯示
$ xclip -selection c -o # 外部剪切板內(nèi)容輸出到終端顯示

值得強(qiáng)調(diào)的是,這里所說(shuō)的 X window 剪切板,簡(jiǎn)單的說(shuō)就是你用鼠標(biāo)選擇的文本會(huì)實(shí)時(shí)的存放在這個(gè)剪切板,使用鼠標(biāo)中鍵可以粘貼。而外部剪切板是保存你用 ctrl+c 復(fù)制的文本,ctrl+v 可以粘貼。這兩個(gè)地方是不一樣的。

2.translate-shell

$ sudo apt install translate-shell

這是命令行版的谷歌翻譯工具,之前叫做 Google Translate CLI 是一款借助谷歌翻譯(默認(rèn))、必應(yīng)翻譯等來(lái)翻譯的命令行翻譯器。它讓你可以在終端訪問(wèn)這些翻譯引擎。translate-shell 在大多數(shù) Linux 發(fā)行版中都能使用。常用的方法如下:

$ trans en:zh [word] # 英文到中文的單詞翻譯
$ trans en:zh -b [text] # 簡(jiǎn)要的輸出,進(jìn)行文本翻譯

需要注意的是,使用這個(gè)翻譯工具需要你能夠訪問(wèn)外網(wǎng),或者通過(guò)修改 translate-shell 的默認(rèn)翻譯引擎,具體的方法這里就不闡述了。

二. 編程實(shí)現(xiàn)

這個(gè)工具整體的思路就是 C 程序?qū)崟r(shí)檢測(cè)鼠標(biāo)按鍵的動(dòng)態(tài),當(dāng)檢測(cè)到用戶使用鼠標(biāo)選擇一段文本之后,調(diào)用 shell 腳本獲取 X window 剪切板的內(nèi)容進(jìn)行翻譯后輸出到終端顯示。

1. 定位鼠標(biāo)設(shè)備文件

鼠標(biāo)作為輸入設(shè)備。其信息可以在文件 /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 文件下讀取鼠標(biāo)的狀態(tài)。需要注意的是,對(duì)于不同的設(shè)備,讀取鼠標(biāo)的狀態(tài)的文件可能不一樣,比如也可能是 /dev/input/event3 。我們可以使用下面的命令找到你的鼠標(biāo)對(duì)應(yīng)的是哪一個(gè) event。

$ sudo cat /dev/input/event2 | hexdump # 測(cè)試時(shí)改變數(shù)字即可

比如,當(dāng)我運(yùn)行上面這條命令之后,我移動(dòng)鼠標(biāo)、按鼠標(biāo)左鍵/中鍵/右鍵,終端都會(huì)輸出一些值,這就說(shuō)明 event2 文件就是對(duì)應(yīng)著我的鼠標(biāo)。如果操作鼠標(biāo)沒(méi)有反應(yīng),說(shuō)明這個(gè)就不是。你可以通過(guò)這種方法找到你的鼠標(biāo)對(duì)應(yīng)的 event 文件。

2. Linux 下獲取按鍵響應(yīng)

在 Linux 內(nèi)核中,input 設(shè)備用 input_dev 結(jié)構(gòu)體描述,使用 input 子系統(tǒng)實(shí)現(xiàn)輸入設(shè)備驅(qū)動(dòng)的時(shí)候,驅(qū)動(dòng)的核心工作就是向系統(tǒng)報(bào)告按鍵、觸摸屏、鍵盤(pán)、鼠標(biāo)等輸入事件(event,通過(guò) input_event 結(jié)構(gòu)體描述),不再需要關(guān)心文件操作接口,因?yàn)?input 子系統(tǒng)已經(jīng)完成了文件操作接口 Linux/input.h 這個(gè)文件定義了 event 事件的結(jié)構(gòu)體,API 和標(biāo)準(zhǔn)按鍵的編碼等。

// 結(jié)構(gòu)體定義見(jiàn) input.h
struct input_event
{
struct timeval time; // 按鍵時(shí)間
__u16 type; // 事件類型
__u16 code; // 要模擬成什么按鍵
__s32 value; // 是按下還是釋放
};

// 下面宏定義見(jiàn) 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
// ...

這里稍微介紹一下 type,指事件類型,常見(jiàn)的事件類型有:EV_KEY,按鍵事件,如鍵盤(pán)的按鍵(按下哪個(gè)鍵),鼠標(biāo)的左鍵右鍵(是否擊下)等;EV_REL,相對(duì)坐標(biāo),主要是指鼠標(biāo)的移動(dòng)事件(相對(duì)位移);EV_ABS, 絕對(duì)坐標(biāo),主要指觸摸屏的移動(dòng)事件 。

3. 編寫(xiě) C 程序

下面就可以編寫(xiě)程序來(lái)檢測(cè)鼠標(biāo)的動(dòng)態(tài)了。首先在你的用戶~(yú)目錄下建立文件夾 Translator。在 Translator 里建立一個(gè) ct.c 源文件,代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/input.h>
#include <fcntl.h>

int main(void)
{
int keys_fd;
struct input_event t;

// 注意這里打開(kāi)的文件根據(jù)你自己的設(shè)備情況作相應(yīng)的改變
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) // 鼠標(biāo)左鍵
if (t.value == MSC_SERIAL) // 松開(kāi)
// 調(diào)用外部shell腳本
system("~/Translator/goTranslate.sh");
}
close(keys_fd);
return 0;
}

然后就是調(diào)用 gcc 編譯器生成可執(zhí)行文件 ct :

$ gcc ct.c -o ct

4. 編寫(xiě) shell 腳本翻譯剪切板內(nèi)容

在 Translator 里建立 goTranslate.sh 文件,內(nèi)容如下:

#!/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

原理非常簡(jiǎn)單,讀者自行了解。這里我們還要在 Translator 里建立一個(gè) lastContent.txt 文件作為緩存,目的是本次調(diào)用腳本時(shí)能夠獲取上一次調(diào)用時(shí)翻譯的文本內(nèi)容,如果和本次調(diào)用的翻譯文本一樣,則本次就不進(jìn)行翻譯。

設(shè)置 ct 別名

這里已經(jīng)可以通過(guò)下面的命令運(yùn)行程序了:

$ sudo ~/Translator/ct

但是由于每次運(yùn)行都要輸出這么長(zhǎng)的命令,因此我們?cè)?~/.bashrc 文件中加入下面一條命令。

alias ct='sudo ~/Translator/ct'

這樣,以后每次看英文文獻(xiàn)時(shí)就可以在命令行下輸入:

$ ct

三. 結(jié)束語(yǔ)

這里有一些小技巧。可以更方便的使用這個(gè)工具。比如,把終端設(shè)為置頂并縮小到合適的尺寸,這樣在閱讀文獻(xiàn)劃詞翻譯時(shí)終端屏幕不會(huì)遮擋我們的視線。

值得說(shuō)明的是,由于本人完全是為了方便自己的使用,而且在搞出這么個(gè)工具時(shí)僅僅接觸 Linux 系統(tǒng)才不到兩周,所以里面的實(shí)現(xiàn)對(duì)于有經(jīng)驗(yàn)的朋友來(lái)說(shuō)略顯的有些笨拙了,請(qǐng)理解哈。

個(gè)人覺(jué)得這個(gè)工具使用起來(lái)還是很方便的,你覺(jué)得呢?

本文轉(zhuǎn)載自微信公眾號(hào)「Java建設(shè)者」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java建設(shè)者公眾號(hào)。

??

 

責(zé)任編輯:武曉燕 來(lái)源: Java建設(shè)者
相關(guān)推薦

2021-04-27 07:52:19

StarterSpring Boot配置

2022-08-02 09:40:09

代碼翻譯神器

2021-02-22 11:13:17

VS Code代碼編程

2022-02-14 07:34:23

工具類GET、POST

2022-03-01 08:21:32

工具類代碼封裝網(wǎng)絡(luò)請(qǐng)求

2021-02-03 07:56:08

版本游戲邏輯

2020-07-20 10:00:52

Python翻譯工具命令行

2021-11-04 17:23:03

Java對(duì)象 immutable

2022-01-21 07:35:06

LRU緩存java

2021-03-26 05:59:10

內(nèi)存檢測(cè)工具

2021-11-29 07:47:57

gRPCGUI客戶端

2022-04-22 08:22:50

MVCCMySQLC++

2022-05-07 13:52:22

Feign 增強(qiáng)包K8s

2025-04-25 09:00:00

2020-09-27 14:13:50

Spring BootJava框架

2021-09-13 08:41:52

職場(chǎng)互聯(lián)網(wǎng)自閉

2022-05-16 08:42:26

Pandasbug

2021-12-12 18:18:15

代碼元宇宙Python

2020-09-10 06:58:34

C語(yǔ)言DBProxy

2018-04-12 17:00:07

云計(jì)算燒烤SaaS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)