快捷指令很强大,也很拉胯

在这个帖子里解决了和快捷指令数据互通的问题(通过 x-callback-url 和系统剪贴板)

但是又遇到了非常讨厌的快捷指令窗口无法运行后自动隐藏的问题

~~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

问题已解决:

展示下 Emacs + 快捷指令结合的效果:

唯一的不足就是快捷指令不能自动隐藏,每次调用之后都要手动点击一下 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 的运行,删掉后能如期表现了。

使用须知

  • 快捷指令不能在后台静默执行,有时会有临时窗口跳出来,强迫症慎用。

  • 不能在短时间内大量调用(比如三分钟内 30 次),会导致快捷指令拒绝执行。

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)