分类 赛博艺术 下的文章

GoldenDict 在 Linux 上的屏幕取词或许是利用了 X 第二剪贴板的特性,所以当用户选择文本后可以自动在附近弹出一个小按钮,点击后即可查词。而 Windows 上的取词一直不太稳定,唯一稳定的方法是利用剪贴板激活全局热键 Ctrl + C + C,而这对于正在使用剪贴板的情况非常不友好。本次努力是试图利用 AutoHotkey 尽量再现 Linux 上的体验。

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.

; Clip() - Send and Retrieve Text Using the Clipboard
; by berban - updated February 18, 2019
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=62156
Clip(Text="", Reselect="")
{
    Static BackUpClip, Stored, LastClip
    If (A_ThisLabel = A_ThisFunc) {
        If (Clipboard == LastClip)
            Clipboard := BackUpClip
        BackUpClip := LastClip := Stored := ""
    } Else {
        If !Stored {
            Stored := True
            BackUpClip := ClipboardAll ; ClipboardAll must be on its own line
        } Else
            SetTimer, %A_ThisFunc%, Off
        LongCopy := A_TickCount, Clipboard := "", LongCopy -= A_TickCount ; LongCopy gauges the amount of time it takes to empty the clipboard which can predict how long the subsequent clipwait will need
        If (Text = "") {
            SendInput, ^c
            ClipWait, LongCopy ? 0.6 : 0.2, True
        } Else {
            Clipboard := LastClip := Text
            ClipWait, 10
            SendInput, ^v
        }
        SetTimer, %A_ThisFunc%, -700
        Sleep 20 ; Short sleep in case Clip() is followed by more keystrokes such as {Enter}
        If (Text = "")
            Return LastClip := Clipboard
        Else If ReSelect and ((ReSelect = True) or (StrLen(Text) < 3000))
            SendInput, % "{Shift Down}{Left " StrLen(StrReplace(Text, "`r")) "}{Shift Up}"
    }
    Return
    Clip:
    Return Clip()
}

SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

CoordMode, mouse, Screen
Gui, New, +AlwaysOnTop -Resize -MaximizeBox -MinimizeBox +MinSize -Caption, Dict
Gui, Add, Button, cBlue gSearch X0 Y0, Search
Gui, Margin, 0, 0
Gui, Show, NA AutoSize, movinggui
settimer, WatchCursor, 1000
return

WatchCursor:
MouseGetPos, oX, oY
WinMove, movinggui, , oX +20, oY + 20
return


OnMessage(0x0201, "WM_LBUTTONDOWN")

WM_LBUTTONDOWN()
{
  If (A_Gui)
    PostMessage, 0xA1, 2
}

Search:
Send, !{Tab}
Sleep, 300
text := Clip()
run "C:\Program Files (x86)\GoldenDict\GoldenDict.exe"  %text%
return

不得不承认 AHK 的脚本语言真的非常反人类。我就随便写写了。

不足之处在于,一个按钮会始终跟随光标,怎样根据需要显示我不会。此外,为了让用户能点击到,设置了一秒的运动延迟。GoldenDict 程序路径以及按钮位置等参数可以根据需要在脚本中修改。

GoldenDict 的弹出窗口可以用命令行调用,这个功能真是隐蔽,此前闻所未闻。

脚本参考了:

在此感谢。

事情是这样的。

我在这里 EPWING for the classics 发现了质量非常好的拉丁语古希腊语辞典文件,所有变形都能查到,非常方便,不过只能用于 EB 系列。

欣闻 GoldenDict 的 Windows 版支持此格式,然试用后发现外字(GAIJI)处理很成问题,不能 Unicode 化,非常难看,且不能复制。

联想到上次经历(伟大献礼(误)致 GoldenDict 德语辞典用户),意识到可以调用 EBWin4 的命令行模式,同样地处理编码问题后,于是有如下。

import sys
import os

# Version 1.0
# 需要配合 EBWin4 使用,词典分组需要设置好


def output(o):
    fullstr = '<meta charset="utf-8">'
    for l in o:
        fullstr += l
    # print(fullstr)
    sys.stdout.buffer.write(fullstr.encode('utf-8'))


s = sys.argv[1].strip()
# s = "organon"

result = os.popen(
    '"C:\Program Files (x86)\EBWin4\ebwinc.exe" /G=KL /C=1 /O=h ' + s).readlines()
output(result)

希望使用者可以在词典列表中设置执行此程序,注意输入正确的参数。

本程序使用 MIT License,不对其功能作任何担保。

CHANGE LOG

18.11.2017 v1.01: 强行指定编码,防止 GBK 破坏。

痛点破坏!

一言不合:

import sys

# Version: 1.01
# 需要配合 GoldenDict 中拼写检查功能使用

def output(o):
    fullstr = '<meta charset="utf-8"><a href="' + o + '">' + o + '</a>'
    # print(fullstr)
    sys.stdout.buffer.write(fullstr.encode('utf-8'))

s = sys.argv[1].strip().split(' ')

# Er sieht gern fern.
if len(s) > 2:
    output(s[-1] + ' ' + s[0])

# Er braucht nicht fernzusehen.
if len(s) == 1 and 'zu' in s[0]:
    w = s[0]
    pos = w.find('zu')
    if pos > 1 and w[-1] == 'n':
        output(w[:pos] + w[pos+2:])

sys.exit(0)

其实中间需要多点一步,然而这已经算不得什么了。

本程序旨在提升划词搜索的体验。

希望使用者可以在词典列表中设置执行此程序,注意输入正确的参数。

判断条件十分粗糙不耐用,极大概率出错,故不能完全依赖之。

本程序使用 MIT License,不对其功能作任何担保。

已知问题:

»Man sieht fern.« 这种中间没有被其他词间隔开的无法在程序中处理,因与 GoldenDict 自身判断机制冲突。似乎只要程序有输出,额外的联想就不会进行。征求优雅的解决方案。

我只简单谈一谈普通用户的方法论吧。

(以下 Linux 主要是指发行版,不是专指内核)

从 2009 年开始算 Linux 的坑我已经入了八年,这八年来最大的变化就是心态。有些看起来是老生常谈,经过考察证实了确实是人生的经验。但是同时我们也要考虑到历史的进程,发现所谓经验中具有普遍价值的真理,将其从时常变化的意见中分离出来。这应该就是我在与 Linux 相伴的八年里学会的东西。

说得这么玄乎究竟是什么意思?我觉得还是应该先谈一下我对待计算机及其相关技术的原则。

计算机其实在大多数情况下只是工具,不是玩具。固然可以把它当作玩具,但这终究不是人生的常态。我其实只是一个普通用户,我会写一些小程序,但我不是程序员,有时玩玩游戏,至于我的专业则与计算机毫无关联。因此,我对计算机的要求其实很简单,不过是要它总能按照我的意思工作而已(我坦言我很懒,能自动化处理的事情总想交给计算机,毕竟计算机是适合处理这类事情的)。但是就算是这样一种看起来很简单的要求,实现起来确实是有点困难。操作系统发展到今天,已经变得非常用户友好,但这种友好并不总是足够的,正如一切不完美的人工事物,很多时候还是会出现各种问题。这种时候,为了用户友好而被隐藏起来的技术细节就显得尤为重要,考察技术细节的能力似乎成为了判断用户水平的依据。我不认为这个问题短期内能够解决,但至少在这个时代,多一些这方面能力总归是能便利自己的,而且多少可以在这个特殊的信息技术时代对我们生存的世界掌握一些主动权,这基本上也就是普通用户学习技术的目标界限。这是好的。

言归正传。事实上我已经很难再想起 2009 年尝试 Ubuntu 的确切原因了,可以确定的是我当时对 Windows XP 已经十分厌倦了。容易中毒,处处得小心谨慎,为了一件小事下一大堆软件,而且我家机器也有点旧了,拖着 XP 又卡又慢,当然更重要的是当时我喜欢自己改系统,好奇心强,于是一听说我们其实也有其他选择时,Linux 自然吸引了我。而其中 Ubuntu 是最有名的,新手最多尝试的,用户群体相对大的,支持相对好的。关于 Linux 普遍意义上的优点,我只提它的开放性和可控制性。这个系统的每一个部分都毫无秘密可言,所有的“秘笈”都是公开的信息,每个部件都是相对独立的,每个软件的开发者都是大活人(与冷冰冰的大公司相对),这当然和它社区的程序员文化有关。有时如果想自己动手写点什么解决非常独特的问题,Linux 下是有正常方便的门路可走的,各种文档都可以去看。结果就是每个用户都被允许拥有一个最适合自己使用的系统(总觉得这句话宗教性很强,简直像传福音)。总之在使用上,弄明白想做什么和怎么去做之后,基本上就是直来直往的坦途。这多少有点共产主义的味道,我们没有被奴役,并且与生产工具的关系是和谐的。不过自己必须对自己负责也正是自由的代价了。

后来换掉了 Ubuntu 原因也正是它与我的观念背道而驰。经常折腾 Linux 的朋友一定懂得,每次配置新系统总是希望这是最后一次了。但是很多时候还是无法避免不停地重装。这很烦。有这个精力还不如干点别的。由于 Ubuntu 众所周知的跨版本升级问题我的机器挂了,并且此前为了我的“方便”以我难以理解的方式预先配置好的东西总给我制造麻烦,是时候换成 Archlinux 了。Arch 可以不停滚,保持最新,简直一劳永逸,特别适合向我这样的懒人。而且可以做到里面所有的软件都是我的选择。后来换了电脑,人越来越懒了,精神洁癖也没有了,就装了 Manjaro。可以滚,可以新,享用充分测试后的软件,不容易挂,我甚至开始觉得历史要终结了。其实此前也用过 Lubuntu、Deepin,不过时间不长,而且也没有什么能给我留下深刻的印象的特点,所以就略过不谈了。

感觉有点偏题……

如果说体验的话,除却那些系统本身带来的轻松愉快的感觉之外,令人不爽的折腾其实主要还是由软件的生态环境造成的。QQ 的故事其实很典型。QQ 一度是刚需,因为大家都用,不能不用。有人就分析了协议自己写了名为 eva 的客户端,这曾经是 Linux 上最好用的 QQ 客户端,没有之一。但是腾讯不喜欢,而且对 Linux 上客户端的开发基本无视(别提那个官方的客户端了,很好笑)。总之长久来都是不能用的,那时我总是开着虚拟机。但与此同时,wine 变得越来越好用,最终使得 wine QQ 也成为一个可选的方案了。然而如今我也不用 QQ 了。类似的还有网银的需求被支付宝替代、WPS 最终推出 Linux 版的事情。讲这些故事是为了说明具体的应用软件其实变更很快,一方面是因为新的软件被开发出来,新的解决方案被研究出来,另一方面需求同样也会发生变化,这是沧海桑田的事。因此用陈旧的印象评判现在的环境其实并不合理,有些时候只是耐心问题。当然我作为普通用户持这种观点没问题,行业一线的朋友可能就需要多一些担当了。这几年的经验倒是训练了我敏锐的判断,即什么事是可行的,什么现在还不行,什么新项目很有前途,可进可退才是明智之举。

谈哪些软件好用可能没什么意思,最后总结一下经验教训吧。

  • 精简系统和软件配置
  • 不要做完全不理解的事
  • 备份重要文件,工作环境和玩具环境分开,区分保守和激进两种策略
  • 提前了解麻烦的事和不可能的事 (例如买机器时避免奇怪的硬件)
  • 关心真正要做的事 (工作时别折腾,珍惜时间)
  • 装个 Windows 10 救急用 (我好坏啊 捂脸)