在 Obsidian 点读英文单词

英文单词书写由空格分隔,因此双击英文单词会自动选中该单词。

只需要发音:有道 API + QuickAdd

得益于 DataviewJS 打字背诵练习 发现的有道 API。

基本配置参 QuickAdd JS & Templater JS 简介及相互修改
“QuickAdd Macro 加载 QuickAdd Capture”。

js quickadd 代码
document.ondblclick = ()=> {
  const str = String(getSelection()), audio = document.createElement('audio'); if (!str) return
  audio.src = `https://dict.youdao.com/dictvoice?le=en&audio=${str}`; audio.autoplay = 1
}
  • 首次重启 Ob 后,为 document 添加双击监听。
  • HTML <audio> 标签指定 autoplay 自动发音。
  • 指定有道 API 语种为 en,所以只有英语单词才发音。

需要发音和查词:沙拉查词

image

效果 GIF,点击展开

20240506_230450

沙拉查词(Saladict)是一款多语种多词典聚合查词的开源浏览器扩展,支持自动发音、添加生词及 配合 Anki 制卡。为在浏览器外使用,需按照 Saladict 教程 - 浏览器外划词 做好设置给予权限。教程帖里也介绍了其他平台借助其他工具在浏览器外使用的方法。

本话题介绍供对照参考,如有遗漏以官方教程为准:

右键扩展图标的设置

imageimage

  • 基本选项 - 启用“后台保持运行”
  • 快捷查词 - 全部启用
  • 发音设置 - 英文自动发音 - 朗文词典或有道词典,美式口音(朗文词典好听!)
  • 权限管理 - 启用“读取剪贴板”
浏览器管理扩展的设置

imageimage
image

AutoHotKey(AHK)是一款创建热键的脚本语言和 Windows 开源软件,楼主使用 v1 版本。

总的来说,你需要复制功能函数部分的代码,然后再选择或自定义设置热键部分的代码。

下载安装 AHK v1.1,依序粘贴代码到一个 .txt,将后缀改为 .ahk,双击用 AHK 运行,脚本就会开始监听了。

你可以为这个脚本创建快捷方式,将快捷方式移动到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup,实现开机自启。

功能函数部分
act(exe) {
  WinGet, Process, ProcessName, A
  if (Process == exe)   ; 当前活动进程名是否为...
    return 1
}
obSaladict() {
  if !act("Obsidian.exe")
    return
  prev := ClipboardAll  ; 剪贴板内容附给变量 prev
  Clipboard :=          ; 清空剪贴板
  Send ^c               ; 模拟 Ctrl+C 复制
  ClipWait              ; 等待剪贴板出现内容
  RegExMatch(Clipboard, "[a-zA-Z]+", m)
  if m {                ; 匹配正则 /[a-zA-Z]+/
    Clipboard := m      ; 首个匹配值写入剪贴板
    Send !+t            ; 模拟 Alt+Shift+t
  }                     ; 即楼主查词全局快捷键
  Clipboard := prev     ; 恢复剪贴板内容
  prev :=               ; 释放 prev
}
  • 代码完成的部分:模拟复制键 - 模拟浏览器调用沙拉查词的全局快捷键。
    沙拉查词扩展完成的部分:读取剪贴板 - 在独立窗口搜索剪贴板内容。
  • 清空和恢复操作使查词不会污染剪贴板。
  • 因为是在 Obsidian 点读,控制了只会在 Obsidian 起效。
  • 因为是点读英文单词,用正则控制仅内容包含英文时起效。

设置热键部分就比较灵活了。先试试最普通的 AHK 设置:

#C::obSaladict()

现在,你可以划选或双击选中单词,再按下 Win + C 键,代码执行,就完成了发音和查词。

当然,这样可能不够点读。让我们实现一个普通的双击:

双击的代码
last := 0
~LButton::
curr := A_TickCount
if (curr - last <= 300) ; 两次热键间隔毫秒
  obSaladict()
last := curr
Return
  • ~LButton~ 表不覆盖原始功能,组合键中只要有一个就都会起作用。这里保留了左键功能,比如点击等功能。

现在,只需左键双击一个英文单词就会执行代码了。

当然,双击容易误触,我们可以将 ~LButton 改为 ^~LButton,表示按住 Ctrl 双击。按住 Alt 和 Shift 双击有多选功能,不建议设置。

如果你和楼主一样异端,希望用 Meta 键(也就是 Win 键)来控制:

Meta 键的代码
~LWin::
if GetKeyState("LButton", "P") ; 左键处于按下状态
  obSaladict()
if act("vivaldi.exe")||act("Obsidian.exe")
  Send {Blind}{vkE8}      ; 阻止 LWin 键默认行为
Return           ; 不影响 Win+A Win+Tab 等组合键
  • 从上往下,第一个 if 实现类似沙拉查词“放开鼠标之前按住选择的按键显示词典面板”设置勾选“Meta”时的效果。双击第二下按住左键不松开按下左 Win 键,也实现了点读。
  • 第二个 if 使得在 Vivaldi 浏览器和 Obsidian 单击 Win 键不会执行默认行为,即不打开左下角的开始菜单,这是异端的部分。
  • 启动了 .ahk 文件后,系统托盘右键选择“Windows Spy”会打开 AHK 自带的窗口检测工具,鼠标点到哪个窗口,就能在首栏 ahk_exe 处查看到 .exe 名称了。

    image

    image

拓展:利用autohotkey一鍵查單字及作成筆記

2 个赞

虽然我看不懂 ,但我用欧路词典也很方便查词,几乎无延迟

2 个赞

彩蛋:日语五十音点读及笔顺

因为在“DataviewJS 打字背诵练习”储备了数据,单纯进行数据的充分利用。
可前往帖子“DataviewJS 的传参与复用”蓝奏云链接,选择“打字示例库”,执行库内“程序执行档.md”从上往下第二个代码块。若阅读本帖有疑问,可先阅读“DataviewJS 的传参与复用”。

20240508_110726

  • 所有假名单击自动发音。
  • 清音单击额外显示笔顺。除点击其他假名自动清除外,可单击笔顺 GIF 立即清除。
  • 存在拗音组合的假名单击在右下显示小假名,点击小假名自动发各自对应的组合音。

对了,用 DataviewJS 生成有交互的表不可以偷懒用 dv.paragraph() + Markdown 表格文本,渲染出来交互没了。

1 个赞

大佬这是怎么做到的

1 个赞

mac apple搜索欧路词典 然后里面有个鼠标取词功能 鼠标移动到有英文的地方秒识别

1 个赞

PlayerMiller大佬

多謝分享神操作,我看了好幾天才稍微看懂及依樣成功在Obsidian中實作有道playsound成功,謝謝您:rofl:

因為希望以鍵盤操作(Obsidian/Vim)為主,有些js腳本延伸調整,不知能否實現。

一、在 Obsidian/Vim Mode(Normal) , 滑鼠在單字點二下後,會變 Vim Mode(Visual) ,還要再按一次 【ESC】才會跳回 Vim Mode(Normal)。
請問js腳本能增加送出一組 【Ctrl + [ 】 或 【ESC 】 (跳回 Vim Mode(Normal)嗎?

(註: 查找後,Ob/vim目前尚不知能否有選項,把鼠標doubleClick變Visual的設定ban掉,不知有人知道嗎?)

二、承上,如果希望能以鍵盤操作為主,在 Vim Mode(Normal) ,可以用 鍵盤指令 yiw 直接把 單字 copy 到windows 系統剪貼簿 (vim也可以用不同的指令指定不同的buffer)。

請問js腳本除了用 doubleClick 外,能有其他方法把單字取到系統剪貼簿後觸發有道playsound 嗎?

:raising_hand_man:初步思路(理想狀況)是在Obsidian/Vim希望能把鍵盤游標移到單字上,如果是按 Alt + 1觸發時 , 能不去改變 Vim Normal Mode,就能 playsound。:grin::grin::grin:

謝謝大佬

查词的第一步是取词,双击只是其中比较快捷的一种方式, 专门为了快速编辑的 Vim 相比普通模式有更多可选方案,比如按 ve 就能快速选中整个单词,相关后续脚本的触发也可以由双击改为 ve 配合其他修饰键,比如 Ctrl 之类的,主要是不影响正常的 ve 取词但不查词的情况。

1 个赞

多謝回覆,您的回覆內容,完全就是這套設計流程最關鍵的部分。:+1::+1::+1:

(取詞+playsound V.S 取詞+ 不 playsound):+1::+1::+1:

另外請問一個AHK的問題 :

有道的格式是

https://dict.youdao.com/dictvoice?le=en&audio=英文

https://dict.youdao.com/dictvoice?le=en&audio=excellent
上面的網址,點擊後的結果是開啟瀏覽器+播放聲音(playsound)

在AHK(AutoHotKey) ,如果已經可以取詞 +產生上面的網址字串,

請問ahk有什麼指令或語法能 不開啟瀏覽器就直接背景播放上面的網址playsound?

多謝指點

謝謝

~V::
KeyWait, E, D T1
KeyWait, Ctrl, D T2
if !ErrorLevel
  ObSaladict()
Return

这是一个 AHK 示例,检测 V 键,然后在 1 秒内是否按下了 E 键,然后在 2 秒内是否按下了 Ctrl 键,都符合执行查词。你可以根据你的情况继续修改。

效果 GIF,点击展开

20240601_111830

如果只需要用有道 API 发音,AHK 我不太熟,原来的代码是用 document 创建 audio 标签的,QuickAdd 这个插件我现在又没有在用了。你可以把下图红框两行代码设置为一个 QuickAdd Capture 快捷键,ve 选中之后再执行这个快捷键就可以发音了。

1 个赞

PlayerMiller大佬
太感謝您了 :heart:
程式語言(AHK,Vim,js ,quickadd…),我也都還是幼幼班。

我再研究一下您的:+1:改良示例,
謝謝您

大佬666 等我搞明白大佬的思路搞出点读 ahk ob插件后 就是搞个性化艾宾浩斯遗忘曲线 突破四级 雅思 英文汉化 等关卡.