在emacs中,如何创建到另一个函数返回的函数的映射?

在emacs中,如何创建到另一个函数返回的函数的映射?,emacs,keyboard-shortcuts,Emacs,Keyboard Shortcuts,我在使用带有邪恶模式的emacs时,我想将tt映射到函数投射式dired,但是如果显示了dired缓冲区,那么它应该映射到邪恶删除缓冲区,因此本质上创建了切换函数的映射 在学习了emacs lisp的基础知识后,我提出了以下解决方案: (defun toggle-projectile-dired () "Toggles projectile-dired buffer." (interactive) (or (when (derived-mode-p 'dired-mode)

我在使用带有邪恶模式的emacs时,我想将
tt
映射到函数
投射式dired
,但是如果显示了dired缓冲区,那么它应该映射到
邪恶删除缓冲区
,因此本质上创建了切换函数的映射

在学习了emacs lisp的基础知识后,我提出了以下解决方案:

(defun toggle-projectile-dired ()
  "Toggles projectile-dired buffer."
  (interactive)
  (or
   (when (derived-mode-p 'dired-mode)
     (evil-delete-buffer (current-buffer)))
   (projectile-dired)))

;; This is how the mapping is done
(evil-leader/set-key "tt" 'toggle-projectile-dired)
但我使用这个解决方案所做的是创建一个映射到一个函数,该函数最终调用另一个函数

虽然我的解决方案是可行的(我对此很满意),但我不能做的是返回要调用的函数(而不是像我那样调用它),这种方法应该如何编写

或者换句话说,如何返回函数名并使该映射调用返回函数

PD:这个问题只是为了学习一些elisp。谢谢

编辑:

下面是我想要实现的一些伪代码(javascript):

function toggleProjectileDired() {
  if (derivedModeP == 'dired-mode') {
    // We're in dired buffer
    return 'evilDeleteBuffer';
  } else {
    return 'projectileDired';
  }
}

evilLeaderSetKey("tt", toggleProjectileDired());
我的伪代码解决方案是:

function toggleProjectileDired() {
  if (derivedModeP == 'dired-mode') {
    // We're in dired buffer
    evilDeleteBuffer();
  } else {
    projectileDired();
  }
}

evilLeaderSetKey("tt", toggleProjectileDired);
如您所见,一个返回要调用的函数名,而另一个调用该函数。如何返回要在elisp中调用的函数名?

(注意:我不使用
evil
,也不熟悉它的自定义键绑定函数。)

使一个键在
dired模式下做一件事,在其他地方做另一件事的规范方法是在dired的keymap中定义一个绑定,在全局keymap中定义另一个绑定(或任何合适的绑定)。我建议您在大多数情况下尝试采用这种方法,因为它使查看发生了什么变得更加简单

然而,有一种方法可以满足你的要求。这些页面展示了该方法的一些变化:

本质上,您使用菜单项的
:filter
功能(注意,菜单实际上是Emacs中奇特的键映射)来确定运行时的命令。注意,如果filter函数返回
nil
,Emacs将其视为该键映射中不存在绑定,并继续在其余键映射中查找绑定;因此,此功能有助于仅在条件下处于活动状态的绑定

示例的非
邪恶版本可能如下所示:

(定义键全局映射(kbd“”)
`(菜单项“投射物导向”
:过滤器,(λ(默认值)
(if(导出模式-p’方向模式)
'删除缓冲区
(默认值)
同样,这将更为常见:

(全局设置键(kbd“”)”投射物方向)
(装载“直接”后的评估)
“(定义键驱动模式映射(kbd”“)”删除缓冲区))

FWIW,我实际上认为你开始使用的一般方法可能是在这种情况下最好的方法。如果在该窗口中键入KEY总是切换
dired
,那么将其绑定到
toggle dired
命令似乎是最简单的实现。

请添加一些伪代码,显示您希望能够执行的操作,因为您的问题不明确。问题不清楚。另外,
when
始终返回
nil
(除非它导致非本地退出且不返回),因此将其包装在
中是没有用的。如果您不想在
邪恶删除缓冲区
返回非
nil
时执行
投射物dired
(或执行其他具有相同效果的操作)。@phils done:)@Drew谢谢我是emacs的新手,如果不起作用,我会使用
if
语句,但它起作用了,尽管我会修改它,谢谢。