最近断断续续地又为 Emacs 和系统做了一些优化,渐渐地把它作为主要的主产工具了。

1. 改进的 Golden Dict 查词

Emacs 折腾小记 中提到使用 goldendict-ng 作为离线词典来查单词,但这里只涉及到了它在 Emacs 内部用法,后来我想着把这个查词工具应用得更广泛一些,把它变成 Windows 系统下生产时的主要查词工具。

这里实现的方式比较简单,直接写了一个 AutoHotKey 脚本,监听双击后文本选中的事件,一旦双击后选中了一个英文单词,那么立马调用 goldendict 来翻译。这里最关键的是利用了 goldendict 的命令行查词接口 goldendict [word]

脚本如下所示,具体的逻辑参考代码注释。这里还添加了一个在 goldendict 界面点击鼠标中键快速退出的功能,方便看完词的意思后直接跳回原来的界面,防止从原文本中分心。有了这个脚本,现在就可以方便地查询浏览器、PDF中的英文单词了。现在我已经几乎不用网络搜索查词,所有需求全部都能用 goldendict 解决。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
~LButton::
{
    if (A_PriorHotkey != "~LButton" or A_TimeSincePriorHotkey > 200)
    {
        ; 不是有效的双击(太慢了)
        KeyWait "LButton"
        return
    }
    ; 当前窗口无效
    if WinActive("ahk_class CabinetWClass")
    {
        return
    }
    ; 备份剪贴板的内容
    prev_clipboard_content := A_Clipboard
    A_Clipboard := ""
    Sleep 200 ; 选中文本延时
    if WinActive("ahk_class Emacs")
    {
        Send "!w" ; alt+w 来复制 Emacs 中的文本
    }
    else
    {
        Send "^c" ; ctrl+c 来复制其他的软件中的文本
    }
    ClipWait(1)
    Length := StrLen(A_Clipboard)
    ; 防止选中的文本不是英文单词
    if (Length < 2 or Length > 20)
    {
        A_Clipboard := prev_clipboard_content ; restore clipboard
        return
    }
    Run "C:\Program Files (x86)\GoldenDict\GoldenDict.exe " A_Clipboard ; 调用 goldendict
    A_Clipboard := prev_clipboard_content
}

#Hotif WinActive("ahk_exe GoldenDict.exe")
MButton::ControlSend "{Esc}", , "ahk_exe GoldenDict.exe" ; 按鼠标中键退出 goldendict

效果如下:

2. 护眼 Pro Max

经常面对电脑屏幕难免会眼疲劳,即使用了 Emacs 折腾小记 中提到的昼夜不同主题,也会因为显示器的蓝光而眼睛酸痛。通过搜索发现 Linux 上的一款开源护眼神器 redshift ,令人惊喜的是它现在已经有了构建好的 Windows 的版本,可以直接下载下来使用。 redshift 根据你所在位置的经纬度计算出日出日落时间,再根据这个时间来调节屏幕的色温。所有配置都写在 %USERPROFILE%\AppData\Local\ 下的 redshift.config 文件中。

它仓库中自带了 redshift.config 的示例,只要稍作修改,放到上面说的目录中就行。

我做的修改如下:

1
2
3
4
5
6
7
-adjustment-method=randr
+adjustment-method=wingdi

-lat=48.1
-lon=11.6
+lat=30.58
+lon=114.27

为了让它开机就能自动运行,我又写了一个 Powershell 脚本:

1
Start-Process -FilePath "C:\Users\niall\source\tools\redshift\redshift.exe" -WindowStyle hidden

并在 startup 目录下创建快捷方式( win+r 运行,输入 shell:startup 进入这个目录),填入:

1
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -Command "& 'C:\Users\niall\source\tools\redshift\autostart.ps1'"

这样开机后 redshift 会自动启动并按时间来调整屏幕色温。我一直用到现在,感觉还不错。

3. 添加 pdf-tools

虽然一直以来的观念是把任务交给更适合它的工具来完成,但因为笔记一直使用 Org Mode ,所以如果能直接在 Emacs 中看 PDF 那将是一件非常棒的事情。因为这里就可以充分利用多 Buffer 的优势,可以创建两个水平并列的 Buffer,一边读 PDF 一边写 Org Mode 笔记,也可以在写笔记的时候快速切换到 PDF 进行查阅,而后返回笔记进行编写,中间不会因为切换软件而打乱思路。

Emacs 有一个著名的包 pdf-tools 能出色地完成 PDF 显示的任务。在 Windows 下编译 pdf-tools 总是一个令人头痛的问题,后来我才发现是我的方法没有掌握好。

编译 pdf-tools 需要安装 MSYS2 编译工具链,这里选择直接用 winget 安装:

1
winget install --id MSYS2.MSYS2

安装后更新数据源,开始准备编译。打开 mingw64 终端:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# update
pacman -Syu
# add git to path
export PATH=/c/Program\ Files/Git/bin:$PATH
cd /home
mkdir src
cd src
git clone https://github.com/vedang/pdf-tools
cd pdf-tools
./server/autobuild

这样直接就能编译出一个 epdfinfo.exe 可执行文件,如果编译失败可能是由于缺少指定的包,使用 pacman 安装再重新编译就行了。

在 Emacs 中使用 M-x package-install 安装 pdf-tools ,再将上面生成的 epdfinfo.exe 拷贝到 ~/.emacs.d/elpa/pdf-tools-[version]/ 目录下。最后在 Emacs 配置文件中加入下面的设置就完成了。

1
2
(setenv "PATH" (concat "C:\\msys64\\mingw64\\bin;" (getenv "PATH")))
(pdf-loader-install)

效果如下:

补充:因为 pdf-tools 有自己的文档搜索,所以如果装了 Swiper 等搜索插件的话会无法调用,因此需要在 pdf-view-mode 下将原来的 isearch 恢复:

1
2
3
4
(add-hook 'pdf-view-mode-hook
        (lambda ()
          (local-set-key (kbd "C-s") 'isearch-forward)
          (local-set-key (kbd "C-r") 'isearch-backward)))

4. 为 Org 添加番茄钟

工作时很难一直专心做一件事,经常干累了就走神很长时候,用番茄钟来控制自己的工作与休息,让工作的效率保持在一个高的状态是不错的方法。

Emacs 中的番茄钟安装很简单,但在 Windows 上无法在倒计时结束的时候弹出提醒,经过查询后使用 Emacs China 论坛上大佬的代码修复了这个问题,整体配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
(use-package org-pomodoro
  :ensure t
  :bind ("s-t p" . org-pomodoro)
  :config
  (add-hook 'org-pomodoro-finished-hook
          (lambda () (org-notify "A pomodoro is finished, take a break!")))
  (add-hook 'org-pomodoro-short-break-finished-hook
            (lambda () (org-notify "A short break done, ready a new pomodoro!")))
  (add-hook 'org-pomodoro-long-break-finished-hook
            (lambda () (org-notify "A long break done, ready a new pomodoro!"))))

效果如下:

5. 为 Org 添加 Zotero 链接

在写论文笔记的时候经常需要直接从 Org 文件跳转到 Zotero 相应的论文条目, Org Mode 中不支持 zotero:// 类型的链接,需要手动添加:

1
2
(org-link-set-parameters "zotero"
                         :follow (lambda (url arg) (browse-url (format "zotero:%s" url) arg)))

另外需要在 Zotero 中安装 Zutilo 插件,并在选项中勾选 copy select item links ,这样就能直接在目录对应的论文条目上提取 zotero 链接,再把链接放到笔记中了。

6. 使用 org-download 来快速插入图片

虽然大部分时候只用 Org Mode 来处理文字,但免不了会有导出后查看的需求,这时图文并茂常常能让理解更加深刻一些。传统的插入图片的方法要将图片保存到特定目录,再在 Org 笔记中写图片链接,这对于截图、网页图片来说很不友好。 org-download 能很好地解决这个问题,它可以从链接中下载图片存到本地,再自己插入图片链接,也可以从剪贴板中提取图片,甚至直接调用截图工具。

在 Windows 下使用 org-download 不那么容易,要先安装 imagemagick 工具和 irfanview 工具,前者用来保存剪贴板中的图片,后者用来截图。这里有个坑是 irfanview 的图片保存路径是传统的 cmd 风格,所以要修改一下 org-download-screensot-file 变量。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
(use-package org-download
  :ensure t
  :after org
  :bind
  ("<f7>" . org-download-clipboard)
  ("<f8>" . org-download-screenshot)
  :config
  (setq-default org-download-image-dir "C:/Users/niall/OneDrive/note/org/images")
  (setq org-download-screenshot-method "irfanview /capture=4 /convert=\"%s\"")
  (setq org-download-screenshot-file
   "c:\\Users\\niall\\AppData\\Local\\Temp\\screenshot.png")) ;; irfanview do not accept / path

效果如下:

写在最后

现在的 Emacs 已经基本符合我理想中的样子,还有一些有关写程序的自定义配置考虑等后续更充实后放在(三)中发布出来。终于可以暂时不折腾,把精力放在更重要的专业知识和技能的学习中了。