如何在Emacs中将功能重新映射到另一个?

时间:2013-08-19 12:32:32

标签: emacs coffeescript elisp evil-mode

coffee-mode RET绑定coffee-newline-and-indent,效果正常。

我还使用evil-mode进行Vim仿真。 evil-mode使用标准newline-and-indent,因此某些vim命令(例如oO)的缩进不正确。

newline-and-indent重新绑定到coffee-newline-and-indent的最佳方式是什么?

我仍然是ELisp的新手并试过下面的一行,但它不起作用。

(add-hook 'coffee-mode-hook
          (lambda () 
            (setq newline-and-indent '(funcall coffee-newline-and-indent))))

5 个答案:

答案 0 :(得分:1)

这是我的尝试。它应该工作,但我不喜欢它。

(add-hook
 'coffee-mode-hook 
 (lambda ()
   (defalias 
       'newline-and-indent 
       (lambda()
         (interactive)
         (if (eq major-mode 'coffee-mode)
             (coffee-newline-and-indent)
           (delete-horizontal-space t)
           (newline)
           (indent-according-to-mode))))))

我希望我能用更优雅的东西来复制源码 newline-and-indent的{​​{1}},但make-variable-buffer-local不适用于此情况, 我无法获得symbol-function的深层副本。 我很高兴看到更好的方法。

答案 1 :(得分:1)

完成你似乎要求的标准方法是

(autoload 'coffee-newline-and-indent "coffee-mode") ; (or whatever)
(define-key evil-mode-map (kbd "RET") 'coffee-newline-and-indent)

编辑:仅在coffee-newline-and-indent中启用coffee-mode

(define-key evil-mode-map (kbd "RET")
  (lambda ()
    (interactive)
    (if (eq major-mode 'coffee-mode)
        (coffee-newline-and-indent)
      (newline-and-indent))))

答案 2 :(得分:0)

尝试以下方法:

(define-key evil-mode-map (kbd "RET") nil)

我知道它看起来过于简单,但如果邪恶模式按照我认为的方式工作那么它应该有效。

  1. 这将从你的邪恶模式地图中擦除ret键,这将让咖啡模式地图的绑定闪耀。
  2. 在非咖啡缓冲区中,ret键仍然有效,因为它仍然在全局地图中绑定。

答案 3 :(得分:0)

我找到了解决方案。

邪恶模式实际上使用coffee-indent-line。问题来自coffee-indent-line,它没有正确缩进。在将其修改为coffee-newline-and-indent之后,邪恶模式可以正常工作:

(defadvice coffee-indent-line (after wants-indent activate)
  (let ((tabs-needed (- (/ (coffee-previous-indent) coffee-tab-width) 1)))
    (when (> tabs-needed 0)
      (insert-tab tabs-needed)))
  (when(coffee-line-wants-indent)
    (insert-tab)))

答案 4 :(得分:0)

如果要重新映射func,但仅限于某些主要模式处于活动状态 - 创建一个定义别名的func   并运行功能(A) - 另一个函数(B)调用(A) - 最后,主模式可以建议功能A设置正确   FUNC。它必须测试主要模式。

让我们说A是define-my-indent-f 然后它说(defalias my-indent' newline-and-indent) func b运行A然后运行命令my-indent。 最后coffe模式确实消除了A说 (如果eq主要模式咖啡defalais my-indent' coffe-newline-and-indent)

当然这是非常重要的定义,但随后 - 每个主要模式都可以添加它的作品 - 只有加载主要模式的建议