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



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

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

这两种方式都失败了,因为用于选择日期的交互式菜单仍然显示。它提示我使用光标键选择一个日期,然后使用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(。这是组织模式的主要模式键盘映射,它会覆盖组织模式缓冲区中的全局映射。参见 Emacs Lisp 手册中的 Active 键盘映射 - 事实上,阅读(并重读(整章是个好主意。

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

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

最新更新