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



我使用的是带有邪恶模式的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命令似乎是最不言自明的实现。

最新更新