我使用的是带有邪恶模式的emacs,我想将<leader>tt
映射到函数projectile-dired
,但如果显示了一个定向缓冲区,那么它应该映射到evil-delete-buffer
,所以本质上是创建一个到切换函数的映射。
在学习了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:这个问题只是为了学习一些省略。谢谢
编辑:
以下是我想要实现的一些伪代码(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-mode
中做一件事,在其他地方做另一件事的规范方法是在dired的键映射中定义一个绑定,在全局键映射(或任何合适的)中定义另一个绑定。我建议你在大多数情况下都尽量遵循这种方法,因为它可以让你更容易地了解发生了什么。
然而,有一种方法可以满足你的要求。这些页面展示了方法的一些变化:
- https://stackoverflow.com/a/22863701
- http://endlessparentheses.com/define-context-aware-keys-in-emacs.html
- http://paste.lisp.org/display/304865
本质上,您使用菜单项的:filter
功能(n.b.menus实际上是Emacs中的高级键映射)来确定运行时的命令。注意,如果filter函数返回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
命令似乎是最不言自明的实现。