从Lisp Mode派生,忽略它的钩子?

时间:2016-03-28 18:45:31

标签: emacs slime major-mode

所以我通过派生标准的Lisp模式为自定义lisp创建了一个主要模式。但是,当emacs输入时,它会自动激活粘液模式,这会覆盖我的大部分绑定。据我所知,这是因为SLIME使用Lisp Mode注册了一些钩子,我的模式也触发了它们,但我不确定。有没有办法避免这种情况?

3 个答案:

答案 0 :(得分:3)

如果您正在使用define-derived-mode,那么您的父模式的正文和模式挂钩将会运行。

有关详细信息,请参阅https://stackoverflow.com/a/19295380

如果您在slime-mode中启用lisp-mode-hook,并且您的新模式来自lisp-mode,则最简单的事情将是< em>在导出模式的模式挂钩中再次禁用 slime-mode

编辑:实际上我相信你可以通过操纵你模式的 body 中的delayed-mode-hooks来防止祖先模式的模式挂钩运行。

(你不能阻止祖先模式的身体运行。)

我建议您不要这样做。我想如果你发现自己想要搞乱派生模式机制(特别是如果你计划共享代码),那么你根本就不应该使用派生模式。

您应该从lisp-mode vs emacs-lisp-mode的实施中获得提示。它们不是从另一个派生出来的,而是不同的模式(每个模式都来自prog-mode)。他们的(独立)键盘映射具有共享的父键映射,但这意味着许多键绑定会执行相同的操作。

我建议使用该代码作为模板来创建新的lisp-ish主要模式。

答案 1 :(得分:1)

正确的方法是从lisp-mode的父级继承。理想情况下,所有类似Lisp的主要模式都应该使用父function custItemAmount(type) { if(type == 'edit') { var record = nlapiLoadRecord(nlapiGetRecordType(), nlapiGetRecordId()); var itemCount = record.getLineItemCount('item'); for(i=1; i<=itemCount; i++) { //fetch amount of each item var item_amount=record.getLineItemValue('item', 'amount', i); if (item_amount != null && item_amount != '') { record.setLineItemValue('item', 'custbody_itemamount', i, item_amount); //set total amount to custom item amount field } } var id = nlapiSubmitRecord(record, true); } } ,但目前还没有这样的东西,因此您必须使用lispish-mode然后手动设置/从prog-mode复制你想要的东西。

我欢迎添加lisp-mode的补丁(如果它有更好的名字,会更好),但到目前为止我每次看到它时我最终发现它也有Lispish模式之间有很多差异,需要分享很多东西。

答案 2 :(得分:0)

我可以看到两种解决问题的方法

  1. 更改添加到lisp-mode-hook的挂钩函数,以使其测试(eq major-mode 'lisp-mode),因此不在派生模式下执行。

  2. 在运行父级时禁用lisp-mode-hook

    (defun my-tamed-lisp-mode ()
      (let ((lisp-mode-hook nil))
        (lisp-mode)))
    
    (define-derived-mode my-custom-lisp-mode my-tamed-lisp-mode "CustomLisp"
      "Major mode for my custom Lisp."
      ...)