创建emacs模式:定义缩进

创建emacs模式:定义缩进,emacs,programming-languages,lisp,indentation,mode,Emacs,Programming Languages,Lisp,Indentation,Mode,我正在为类似Lisp的语言编写一个简单的模式,但在设置缩进时遇到了困难。我一直在跟踪调查 然而,我不知道如何使他们的示例缩进适应我的需要,因为他们不做任何形式的计算 基本上,每次我看到一个{或()时,我只需要在缩进计数中添加2个空格,即使同一行上有多个空格,当我看到上面的闭包时,减去2个空格。我是elisp新手;我如何调整他们的示例来计算大括号和方括号 为方便起见,以下是他们正在使用的代码(对于非括号语言): (取消wpdl缩进行() “将当前行缩进为WPDL代码” (互动) (行首) (如果是

我正在为类似Lisp的语言编写一个简单的模式,但在设置缩进时遇到了困难。我一直在跟踪调查

然而,我不知道如何使他们的示例缩进适应我的需要,因为他们不做任何形式的计算

基本上,每次我看到一个
{
)时,我只需要在缩进计数中添加2个空格,即使同一行上有多个空格,当我看到上面的闭包时,减去2个空格。我是elisp新手;我如何调整他们的示例来计算大括号和方括号

为方便起见,以下是他们正在使用的代码(对于非括号语言):

(取消wpdl缩进行()
“将当前行缩进为WPDL代码”
(互动)
(行首)
(如果是(bobp);检查规则1
(将行缩进到0)
(让((不缩进)当前缩进)
(如果(查看“^[\t]*结束”);检查规则2
(项目
(省去远足
(前线-1)
(setq cur缩进(-(当前缩进)默认选项卡宽度)))
(如果(

如何实现类似lisp的缩进(但也要使用大括号)?

如果您想要一种简单的lisp风格语言,我建议您从
(syntax ppss)
开始,它返回点处的“解析状态”。该状态的第一个元素是当前的paren嵌套深度。而我使用的是“paren”,这实际上不计算paren,而是计算语法表定义为类paren的字符,因此如果设置语法表,使{和}声明为类paren,那么这些字符也将被计算

所以你可以从这样的事情开始

(defun foo-indent-function ()
  (save-excursion
    (beginning-of-line)
    (indent-line-to (* 2 (car (syntax-ppss))))))
不要将其定义为交互式,因为使用它的方法是添加

(set (make-local-variable 'indent-line-function) #'foo-indent-function)
在你的主要模式功能

但也许更好的选择是简单地做:

(require 'smie)
...
(define-derived-mode foo-mode "Foo"
  ...
  (smie-setup nil #'ignore)
  ...)

这将使用4的缩进步骤(在
smie缩进基本中配置).

为什么不看看
lisp缩进函数的源代码呢?
?abo abo,我找不到该函数的完整定义。从源代码安装emacs,然后您就可以使用
descripe function
轻松找到定义。据我所知,
lisp缩进函数
lisp mode.el
我不知道如何使用它们…你不必完全理解它就可以使用它。事实上,你可能不用修改就可以使用它。这几乎是完美的!我在这里使用前一个函数非常好。你能添加一个关于如何定义/扩展语法PPS的链接或简要说明吗?另外,我注意到我的结束语rly大括号在这里仍然缩进,我希望它是左对齐的。有什么建议吗?扩展语法ppss并不是一个真正的选项。从这个意义上说,使用SMIE更可取,因为它意味着要被扩展。此外,SMIE应该默认为您处理“右大括号应该是左对齐的”。