在这个帖子里解决了和快捷指令数据互通的问题(通过 x-callback-url 和系统剪贴板)
我想在 Emacs 里调用一个包的函数来运行快捷指令,需要给快捷指令的 URL Scheme 传递参数。
想要获得的函数返回值
thing-at-point 'sentence
想要传递的参数
ACTION run-shortcut
NAME EmacsTranslate
INPUT text
TEXT thing-at-point 'sentence
包的函数(自带的文档说明)
Signature
(siri-shortcuts-browse-url &optional ACTION NAME INPUT TEXT QUERY)
Documentation
Browse a Shortcuts scheme URL ACTION.
If ACTION is nil, then the bare URL is used, which will navigate to
Shortcuts app's last state.
ACTION - one of "create-shortcut", "open-shortcut", "run-shortcut", …
但是又遇到了非常讨厌的快捷指令窗口无法运行后自动隐藏的问题
~~https://discussionschinese.apple.com/thread/254400120~~
Apple 支持的在线客服完全不了解快捷指令,只是让重启和以安全模式运行,检查完之后还是老样子,暂时确定了这应该是快捷指令本身的问题。
快捷指令里的 AppleScript 貌似也是失效的:
on run
tell application id "org.gnu.Emacs" to show
tell application id "com.apple.shortcuts" to quit
end run
问题已解决:
问题解决了,快捷指令里的一个多余的动作(类似编程中的断点)影响到了后面 AppleScript 的运行,删掉后能如期表现了。
使用须知
快捷指令不能在后台静默执行,有时会有临时窗口跳出来,强迫症慎用。
不能在短时间内大量调用(比如三分钟内 30 次),会导致快捷指令拒绝执行。
[截屏2022-11-23 02.45.30]
展示下 Emacs + 快捷指令结合的效果:
## 以下内容已过时,请看最新视频:https://www.bilibili.com/video/BV19M411h7Xx/Emacs 调用快捷指令翻译光标下的句子快捷指令:https://www.icloud.com/shortcuts/ad8dc27c518c44ce92e02b7e41034535插件:DaniruKun/siri-shortcuts.elhttps://github.com, 视频播放量 139、弹幕量 0、点赞数 3、投硬币枚数 1、收藏人数 2、转发人数 1,...
唯一的不足就是快捷指令不能自动隐藏,每次调用之后都要手动点击一下 Emacs 程序窗口获得焦点。
迂回处理下,用 apple script 弄个恢复焦点的功能绑个快捷键,起码可以不动鼠标。我这用的是 alfred 的 workflow 。
on alfred_script(q)
tell application "Emacs" to activate
end alfred_script
你这么一说我好像知道问题出在哪儿了,我用自己写的 Alfred Workflow 查到的 emacs-mac 的bundle id 居然是 MACS 不是 org.gnu.Emacs
这是我之前的设置
on run
tell application id "org.gnu.Emacs" to activate
-- tell application id "com.apple.shortcuts" to quit
end run
稍等我直接用 App 名试一下。
2022-11-22 23:50:35 +0800
on run
tell application "Emacs" to activate
-- tell application id "com.apple.shortcuts" to quit
end run
还是不行,应该就是快捷指令的问题。
2022-11-23 00:01:19 +0800
AppleScript 也不行,快捷指令动作“隐藏app-快捷指令”也不行、“退出app-快捷指令”也不行,可把我恶心坏了。
2022-11-23 00:09:03 +0800
快捷指令,我是真的服气。
on run
tell application "System Events" to keystroke "H" using {command down}
-- tell application "System Events" to key code 4 using command down
end run
问题解决了,快捷指令里的一个多余的动作(类似编程中的断点)影响到了后面 AppleScript 的运行,删掉后能如期表现了。
使用须知
1 个赞
尝试复现的时候发现仍然会跳出 Shortcuts 的窗口. 不过有一个比较朴素的做法, 不知道是否算得上是解决方法:
直接通过 shell-command
来调用 shortcut run <name> [-i input] [-o output]
会不会更加方便一些呢?
(下面的代码是参考 siri-shorcuts.el (line 174) 里面的 siri-shortcuts-list
方法实现的):
;; macOS Shortcuts
(defun my/shortcuts-command (&optional action name)
"Run `shortcuts <action> <...>'.
ACTION:
+ `run': run a shortcut, pass in NAME
+ `list': list shortcuts"
(let ((command "shortcuts ")
(subcmd (cond
((string= action "list") "list")
((and (string= action "run") name)
(concat "run \"" name "\"")))))
(thread-first
(concat command subcmd)
(shell-command-to-string)
(split-string "\n"))))
(defun my/ocr-screen ()
"Call the OCR Select Area Shortcut."
(interactive)
(my/shortcuts-command "run" "OCR Select Area"))
(defun my/shortcut-list ()
"Return a list of all the shortcuts."
(interactive)
(my/shortcuts-command "list"))
(最近刚接触 Emacs, 感觉这个联动很有意思.)
这是我现在的配置,不依赖第三方插件包,不会跳出来快捷指令的窗口。快捷指令也可以被其他 app 调用。
(defun my/siri-ocr ()
(interactive)
;; (siri-shortcuts-run "EmacsOCR")
;; (shell-command "shortcuts run \"EmacsOCR\"")
(shell-command "shortcuts run \"OCR Selected Area\"")
(do-applescript "tell application id \"org.gnu.Emacs\" to activate")
)
(keymap-global-set "C-c M-o" #'my/siri-ocr)