所以我通过派生标准的Lisp模式为自定义lisp创建了一个主要模式。但是,当emacs输入时,它会自动激活粘液模式,这会覆盖我的大部分绑定。据我所知,这是因为SLIME使用Lisp Mode注册了一些钩子,我的模式也触发了它们,但我不确定。有没有办法避免这种情况?
答案 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)
我可以看到两种解决问题的方法
更改添加到lisp-mode-hook
的挂钩函数,以使其测试(eq major-mode 'lisp-mode)
,因此不在派生模式下执行。
在运行父级时禁用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."
...)