【已解决】 小白问题:如何获取函数返回值并给插件包的函数传参?

我想在 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", "gallery" or "gallery/search".

NAME - Shortcut name, can be unescaped.

INPUT - The initial input into the shortcut.

There are two input options: a text string or the word clipboard.
When the INPUT value is a text string, that text is used.
When the input value is Clipboard, the contents of the clipboard are used.

TEXT - If INPUT is set to text, then value of TEXT is passed as input to the shortcut.
If INPUT is set to clipboard, then this parameter is ignored.

QUERY - determines the URL-encoded keywords to be searched in the Gallery.

它的定义

(defun siri-shortcuts-browse-url (&optional action name input text query)
  (let ((scheme "shortcuts://")
        (path (cond
               ((null action) "")
               ((string= action "create-shortcut") "create-shortcut")
               ((and (string= action "open-shortcut") name)
                (concat "open-shortcut?name=" (url-encode-url name)))
               ((and (string= action "run-shortcut") name)
                (concat "run-shortcut?name=" (url-encode-url name)
                        "&input=" input "&text=" (url-encode-url text)))
               ((string= action "gallery") "gallery")
               ((and (string= action "gallery/search") query)
                (concat "gallery/search?query=" (url-encode-url query))))))
    (browse-url (concat scheme path))))

问题已解决,效果见如下视频:

使用过程中可能会有快捷指令的临时窗口蹦出来,强迫症慎用。

(siri-shortcuts-browse-url 'run-shortcut "EmacsTranslate" "text" (thing-at-point 'sentence))

这样吗?不是太理解你的意思。

1 个赞

我的目标是用快捷键绑定函数,利用快捷指令的 URL Scheme 完成离线句子的翻译。

:rofl: 零基础,空有想法不知道从哪里开始学。

原始的 URL Scheme 是这样的:

shortcuts://run-shortcut?name=[name]&input=[input]&text=[text]
用例:
shortcuts://run-shortcut?name=EmacsTranslate&input=text&text=Hello%20World!

需要传给快捷指令两个参数:快捷指令的名称、传入的文本

吐槽一下快捷指令,好几年没写过快捷指令,现在越来越难用了,一会儿的功夫 App 崩溃了四五次。

感觉大致是这样的:

(defun my/siri-trans()
  (interactive)
  (siri-shortcuts-browse-url 'run-shortcut "EmacsTranslate" "text" (thing-at-point 'sentence t)))

(global-set-key "\M-m" 'my/siri-trans) ; 绑定 Alt-m

没 macOS ,没法测试,仅供参考

1 个赞

感谢感谢 :pray:能运行起来了。

不过快捷指令太拖后腿了,时灵时不灵,一会儿能运行,一会儿又提示操作不被允许。 为了稳定调用,或许我应该找个命令行工具实现。

直接用 Emacs 的插件。

感谢 @ginqi7@hsingko 的帮助,问题解决了。

如果有人需要快捷指令,可以点击链接安装:

https://www.icloud.com/shortcuts/ad8dc27c518c44ce92e02b7e41034535

这是我目前的快捷键设置:

(require 'siri-shortcuts)
(defun my/siri-trans() ;; shortcuts://run-shortcut?name=[name]&input=[input]&text=[text]
  (interactive)
  (siri-shortcuts-browse-url 'run-shortcut "EmacsTranslate" "text" (thing-at-point 'sentence t)))
(global-set-key (kbd "C-c t") 'my/siri-trans)

依赖

  1. 快捷指令 App,并安装上述 iCloud 链接中的快捷指令。

  2. 插件

其他可能有用的信息

这是一个并行翻译插件,搭配本翻译方案可能有奇效。 :stuck_out_tongue_closed_eyes:

命令行翻译可以参考这个,不过它是在线翻译,有网络代理的话翻译速度还行。 糊了个demo函数:

(defun my/shell-trans()
  (interactive)
  (message "%s" (shell-command-to-string
                 (format "trans -t zh -e google -x 127.0.0.1:1080 '%s'" (thing-at-point 'sentence t)))))

顺带一提,我觉得elisp技能就是从造轮子开始提高的,自己写着玩其实很有趣。

1 个赞

依赖的插件就是 siri-shortcuts.el :sweat_smile: 实在太小白了不会调用。

谢谢 :smiling_face_with_three_hearts:

我主要是为了离线翻译,操作系统自带了翻译App但藏在快捷指令里。

macOS 命令行好像只能通过 Swift/objc 或者安装 Python 的 pyobjc 来调用系统的词典、翻译等功能。

我的意思是直接使用 emacs 的翻译插件,论坛里有不少分享,你可以搜索一下。

我是为了离线翻译,不然也不会折腾快捷指令。

坛里 xuchunyang 大佬的 osx-dictionary 我一直在用,但如果是离线翻译句子,就只有安装体积巨大的第三方软件或者调用快捷指令里隐藏的Apple翻译服务(在iOS/iPadOS上是独立App)。