我使用带有邪恶模式的emacs,我想将<leader>tt
映射到函数projectile-dired
但是如果显示了一个dired缓冲区,那么它应该映射到{{1因此,本质上是为切换功能创建一个地图。
在学习了emacs lisp的基础知识之后,我想出了这个解决方案:
evil-delete-buffer
但我对此解决方案所做的是创建一个函数的映射,最终调用另一个函数。
虽然我的解决方案有效(而且我很好)但我不能做的是返回要调用的函数(而不是像我一样调用它)应该如何编写这样的方法?
或者换句话说,如何返回一个函数名并使该映射调用返回函数?。
PD:这个问题只是为了学习一些elisp。谢谢!修改
这是我想要实现的一些伪代码(javascript):
(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)
我在伪代码中的解决方案是:
function toggleProjectileDired() {
if (derivedModeP == 'dired-mode') {
// We're in dired buffer
return 'evilDeleteBuffer';
} else {
return 'projectileDired';
}
}
evilLeaderSetKey("tt", toggleProjectileDired());
如您所见,一个返回要调用的函数名,而另一个调用该函数。如何返回要在elisp中调用的函数名?
答案 0 :(得分:1)
(警告:我不使用evil
,并且不熟悉其自定义键绑定功能。)
制作密钥的规范方法在dired-mode
中做了一件事,而在其他地方做的另一件事是在dired的keymap中定义一个绑定,在全局keymap中定义另一个绑定(或任何适当的绑定)。我建议你在大多数情况下尝试遵循这种方法,因为这样可以更容易地看到发生了什么。
但是,有一种方法可以满足您的要求。这些页面展示了该方法的一些变化:
本质上,您使用菜单项的:filter
工具(n.b。菜单实际上是Emacs中的花哨键盘图)来确定运行时的命令。请注意,如果过滤器函数返回nil
,则Emacs将其视为该键映射中不存在绑定,并继续在其余键映射中查找绑定;所以这个功能有助于只有条件活动的绑定。
您的示例的非evil
版本可能如下所示:
(define-key global-map (kbd "<f6>")
`(menu-item "" projectile-dired
:filter ,(lambda (default)
(if (derived-mode-p 'dired-mode)
'evil-delete-buffer
default))))
同样,这更常见:
(global-set-key (kbd "<f6>") 'projectile-dired)
(eval-after-load "dired"
'(define-key dired-mode-map (kbd "<f6>") 'evil-delete-buffer))
FWIW,我实际上认为你开始的一般方法可能是这个例子中最好的方法。如果键入KEY应始终在该窗口中切换dired
,那么将其绑定到toggle-dired
命令似乎是最不言自明的实现。