【问题标题】:Polymorphic Callbacks in Emacs/ElispEmacs/Elisp 中的多态回调
【发布时间】:2012-01-05 23:16:01
【问题描述】:

在 elisp 中实现多态回调的惯用方式是什么?

具体来说,假设我有一个次要模式,其中一个函数执行某个操作,然后调用另一个函数。根据当前缓冲区是包含 C++ 文件还是 Java 文件,第二个函数应该有不同的实现。

或者,假设我想重载变量而不是函数。例如,我想调用一些外部可执行文件,传递给它的参数之一根据当前缓冲区是 C++ 文件还是 Java 文件而有所不同。我希望能够在通用函数中构造命令行并根据缓冲区的内容替换一个参数。 make-variable-buffer-local 是正确的方法吗?最初应该在什么时候(以及通过哪种机制)设置这些局部变量?

【问题讨论】:

    标签: emacs polymorphism elisp overloading


    【解决方案1】:

    我猜你有多种方法。您的回调函数想到的一些选项是:

    1. 缓冲区局部变量,如您所述。

      如何设置它实际上取决于您的用例,但您可能会实现特定的主要模式挂钩,或者一般情况下使用 after-change-major-mode-hook

      make-variable-buffer-local 如果您希望变量始终是缓冲区本地的,那肯定是正确的方法。

    2. 将主要模式映射到相关功能的列表。

      为您需要的所有模式配置此项,然后为当前主要模式执行查找。

    3. 只需根据主模式名称生成函数名称,如果存在这样的函数就调用它。

    在所有情况下,您都有可能使用funcallapply 来运行选定的函数。

    数字 1 和 2 也与您问题的第二部分相关。

    【讨论】:

    • 我注意到make-variable-buffer-localfuncall 是与indent-line-function 等一起采用的方法。
    【解决方案2】:

    如果您正在编辑 c++ 或 java 文件,则该缓冲区应分别位于 c++-modejava-mode 中。因此,您可以执行以下操作:

    (defun function1 ()
      (interactive)
      ;; put your generic code here
      (cond ((string= major-mode "c++-mode")
         (function2-cpp))
        ((string= major-mode "java-mode")
         (function2-java))
        (t (message "I don't know what mode this is"))))
    
    (defun function2-cpp ()
      (message "this is cpp mode"))
    
    (defun function2-java ()
      (message "this is java mode"))
    

    【讨论】:

      【解决方案3】:

      我不知道一种惯用的方式,但我写了这个可能会做你想做的事:

      http://lists.gnu.org/archive/html/gnu-emacs-sources/2011-03/msg00001.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        相关资源
        最近更新 更多