如何为带有参数的交互式组织模式函数/组织模式命令创建 Emacs 键绑定?

How to create Emacs key bindings for interactive org-mode functions / org-mode commands with arguments?

使用函数 org-deadline,可以在 Emacs 组织模式中为任务定义截止日期。描述如下所示:

(org-deadline ARG &optional TIME)

Insert the "DEADLINE:" string with a timestamp to make a deadline.
With one universal prefix argument, remove any deadline from the item.
With two universal prefix arguments, prompt for a warning delay.
With argument TIME, set the deadline at the corresponding date.  TIME
can either be an Org date like "2011-07-24" or a delta like "+2d".

我想创建一个快捷键,直接将截止日期设置为未来 1 周。所以键绑定应该调用 org-deadline 函数并将 +1w 作为参数。写入 (org-deadline nil "+1w") 然后在该区域上执行 eval 按预期工作。

但是为什么我不能把它绑定到一个键上呢?我尝试了以下两个选项:

  1. (defun org-deadline-in-one-week ()
      (interactive)
      (org-deadline nil "+1w"))
    (global-set-key (kbd "C-c C-s") 'org-deadline-in-one-week)
    
  2. (global-set-key (kbd "C-c C-s") (lambda () (interactive) (org-deadline nil "+1w")))
    

这两种方法都失败了,因为 select 日期的交互式菜单仍然显示。它提示我使用光标键 select 一个日期,然后使用 RET 确认。但我想非交互地使用交互功能,只需将截止日期设置为未来一周即可。我错过了什么?

更新:我正在使用 Org mode version 9.1.9 (release_9.1.9-65-g5e4542 @ /usr/share/emacs/26.1/lisp/org/)

您 运行 陷入键盘映射问题:C-c C-s 绑定在 org-mode-map(至 org-schedule)。这是 Org 模式的主要模式键盘映射,它 覆盖 Org 模式缓冲区中的全局映射。参见 Active keymaps in the Emacs Lisp manual - 事实上,阅读(并重读)整章是个好主意。

你应该做两件事:在 org-mode-map 中定义键,而不是在全局映射中;并确保密钥尚未定义(或者至少您不介意丢失其当前设置)。例如 C-c sorg-mode-map 中未定义(默认情况下),所以我会做

(define-key org-mode-map (kbd "C-c s") 'org-deadline-in-one-week)