emacs如何使用call-interactively参数

Geo*_* B. 7 emacs

如果我想创建自己的函数,其中包括调用wg-save(workgroups.el - save workgroups),那么我会这样做:

(defun foo ()
  (interactive)
  ...
  (call-interactively 'wg-save)
)
(global-set-key (kbd "my binding") 'foo)
Run Code Online (Sandbox Code Playgroud)

以下场景如何(我将使用eyebrowse.el作为示例):

眉毛使用Cc Cw'数字'移动到不同的窗口配置,例如Cc Cw 1移动到1或Cc Cw 2移动到2.

我怎么能写一个类似'foo'的类似函数,因为现在我需要传递'call-interactively'一个'number'作为参数?

编辑:Cc Cw 1调用eyebrowse-switch-to-window-config-1.因此,当键绑定为'Cc Cw 1','eyebrowse-switch-to时,我需要制作一个'foo'函数,就像上面那样'交互式调用''eyebrowse-switch-to-window-config-1' -window-config-2'当键绑定是'Cc Cw 2'时等.如下所示(如果有意义):

(defun foo ()
    (interactive)
    ...
    (call-interactively 'eyebrowse-switch-to-window-config-"number")
)
(global-set-key (kbd "C-c C-w 'number'") 'foo)
Run Code Online (Sandbox Code Playgroud)

Ehv*_*nce 7

从文档中阅读C-h f call-interactively RET

如果命令询问要使用哪些事件来调用它,则可选的第三个arg KEYS(如果给定)指定要提供的事件序列(作为向量)。如果KEYS被省略或为nil,则使用'this-command-keys-vector'的返回值。

因此要将参数传递给call-interactively,给它一个带有参数的向量,就像这样

(call-interactively 'my-fn t (vector arg1 arg2))
Run Code Online (Sandbox Code Playgroud)

这样,您就无需调用eyebrowse-switch-to-config-window-nn是数字的地方,只需调用它们所依赖的函数eyebrowse-switch-to-window-config,并为其指定一个数字即可。

您可以为这样的参数获取一个数字:(请参阅“交互式”的帮助)

(defun foo (arg)
    (interactive "nWindow? ")
    (call-interactively 'my-fn t (vector arg))
)
Run Code Online (Sandbox Code Playgroud)

但是您读过眉毛的来源了吗?它将给出想法。

(defun eyebrowse-switch-to-window-config-0 ()
  "Switch to window configuration 0."
  (interactive)
  (eyebrowse-switch-to-window-config 0))
Run Code Online (Sandbox Code Playgroud)


Jul*_*les 2

我相信你可以做这样的事情:

(defun foo (NUM)
  "Enter the NUM of the screen to go to.
If the key pressed is not a number go to screen 0."
  (interactive
   (list (read-key-sequence "Which window: ")))
  ((eyebrowse-switch-to-window-config 3) (string-to-number NUM)))
Run Code Online (Sandbox Code Playgroud)

关键是read-key-sequence功能