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

时间:2016-04-17 02:49:39

标签: emacs keyboard-shortcuts

我使用带有邪恶模式的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中调用的函数名?

1 个答案:

答案 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命令似乎是最不言自明的实现。

相关问题