如何为带参数的交互式功能/命令创建Emacs键绑定?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为带参数的交互式功能/命令创建Emacs键绑定?相关的知识,希望对你有一定的参考价值。

使用功能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")))
    

这两种方式都无法显示用于选择日期的交互式菜单。它提示我用光标键选择一个日期,然后按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模式的主要模式键盘映射,它overrides >> Org模式缓冲区中的全局映射。参见Acive 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)

以上是关于如何为带参数的交互式功能/命令创建Emacs键绑定?的主要内容,如果未能解决你的问题,请参考以下文章

是否有某种“包搜索”功能可用于Emacs?

如何为 SqlDataSource 动态绑定变量参数

emacs smartscan 更改键绑定

无论 JComponent 是啥焦点,如何为 JFrame 进行键绑定?

更改代码块的 emacs 组织模式键绑定

4.Emacs快速入门之窗口