emacs如何使用call-interactively参数

时间:2016-05-30 17:39:03

标签: emacs

如果我想创建自己的功能,其中包括 wg-save (workgroups.el - 保存工作组),那么我会这样做:

(defun foo ()
  (interactive)
  ...
  (call-interactively 'wg-save)
)
(global-set-key (kbd "my binding") 'foo)

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

眉笔使用C-c C-w'数字'移动到不同的窗口配置,例如C-c C-w 1移动到1或C-c C-w 2移动到2。

我怎样才能编写类似于' foo'从现在起,我需要以交互方式传递给对方。一个号码'作为参数?

编辑:C-c C-w 1调用eyebrowse-switch-to-window-config-1。 所以我需要制作一个' foo'像上面这样的功能将以交互方式呼叫#39; ' eyebrowse-交换机到窗口-CONFIG-1'当密钥绑定是' C-c C-w 1',' eyebrowse-switch-to-window-config-2'当密钥绑定是' C-c C-w 2'等等 类似下面的内容(如果有意义的话):

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

3 个答案:

答案 0 :(得分:5)

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

  

可选的第三个arg KEYS,如果给定,则指定事件序列   如果命令查询使用了哪些事件,则作为向量提供   调用它。如果省略KEYS或nil,则返回值   `这个命令密钥矢量'使用。

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

(call-interactively 'my-fn t (vector arg1 arg2))

这样你就不需要调用eyebrowse-switch-to-config-window-n,其中n是数字,你可以调用他们所依赖的函数eyebrowse-switch-to-window-config,并给它一个数字作为参数。

你可以得到一个这样的论证数字:(参见&#34的帮助;互动")

(defun foo (arg)
    (interactive "nWindow? ")
    (call-interactively 'my-fn t (vector arg))
)

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

(defun eyebrowse-switch-to-window-config-0 ()
  "Switch to window configuration 0."
  (interactive)
  (eyebrowse-switch-to-window-config 0))

答案 1 :(得分:1)

我相信你可以这样做:

(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)))

关键是read-key-sequence功能

答案 2 :(得分:0)

为节省时间和空间,您可以使用循环来定义将要使用的所有键绑定。

例如,对于眉毛来说,不必定义每个键绑定,而是可以这样做:

(load-library "eyebrowse")
(dotimes (i 10)
  (global-set-key
   (kbd (concat "C-c C-w " (number-to-string i)))
   `(lambda ()
      (interactive)
      (eyebrowse-switch-to-window-config ,i))))