创建emacs模式:定义缩进

无尽的世界

我正在为类似Lisp的语言编写一个简单的模式,但在设置缩进时遇到了麻烦。我一直在关注emacswiki模式教程

但是,我无法弄清楚如何使示例缩进适应我的需求,因为他们不进行任何形式的计数。

基本上,每次看到{或时(,即使在同一行上有多个,我只需要在缩进计数中添加2个空格,而在看到上述内容的闭包时,就减去2个空格。我是elisp的新手。我怎样才能适应他们的例子来计算括号和括号?

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

(defun wpdl-indent-line ()
  "Indent current line as WPDL code"
  (interactive)
  (beginning-of-line)
  (if (bobp)  ; Check for rule 1
      (indent-line-to 0)
    (let ((not-indented t) cur-indent)
      (if (looking-at "^[ \t]*END_") ; Check for rule 2
      (progn
        (save-excursion
          (forward-line -1)
          (setq cur-indent (- (current-indentation) default-tab-width)))
        (if (< cur-indent 0)
        (setq cur-indent 0)))
        (save-excursion 
          (while not-indented
            (forward-line -1)
            (if (looking-at "^[ \t]*END_") ; Check for rule 3
                (progn
                  (setq cur-indent (current-indentation))
                  (setq not-indented nil))
                    ; Check for rule 4
              (if (looking-at "^[ \t]*\\(PARTICIPANT\\|MODEL\\|APPLICATION\\|WORKFLOW\\|ACTIVITY\\|DATA\\|TOOL_LIST\\|TRANSITION\\)")
                  (progn
                    (setq cur-indent (+ (current-indentation) default-tab-width))
                    (setq not-indented nil))
                (if (bobp) ; Check for rule 5
                    (setq not-indented nil)))))))
      (if cur-indent
          (indent-line-to cur-indent)
        (indent-line-to 0))))) ; If we didn't see an indentation hint, then allow no indentation

我怎样才能实现类似Lisp的缩进(也可以使用花括号)?

斯特凡

如果您希望使用Lisp风格的语言简单一些,建议您从(syntax-ppss)此处开始返回“解析状态”。该状态的第一个元素是当前的嵌套嵌套深度。当我使用“ paren”一词时,它实际上并不计算parens,而是计算语法表定义为类似于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-indent-basic)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Emacs中更改Java模式的缩进样式

来自分类Dev

完全禁用Emacs的JavaScript模式自动缩进

来自分类Dev

使用Emacs次要模式更改缩进

来自分类Dev

emacs主模式定义

来自分类Dev

带有yasnippet,Emacs的python模式下的错误缩进

来自分类Dev

Emacs:Java模式下的新行和自动缩进

来自分类Dev

缩进在Emacs Haskell模式下变得疯狂

来自分类Dev

带选项卡的Emacs xml模式缩进

来自分类Dev

Emacs:在shell脚本模式下在&&之后抑制缩进

来自分类Dev

emacs python模式下的缩进不正确

来自分类Dev

如何在所有模式下在emacs中获得自动缩进(不是智能缩进)

来自分类Dev

如何在所有模式下在emacs中获得自动缩进(不是智能缩进)

来自分类Dev

如何在Emacs中用Web模式将Tab的缩进替换为空格的缩进

来自分类Dev

Emacs中的“转到”定义-Haskell模式

来自分类Dev

Emacs电对模式中的自定义对

来自分类Dev

宏定义期间的Emacs模式行高亮

来自分类Dev

Emacs Lisp代码缩进

来自分类Dev

更改cmake的emacs缩进?

来自分类Dev

Emacs 24.3 python模式在函数结束后错误地缩进代码

来自分类Dev

如何在Emacs中将php模式下的缩进更改为2个空格?

来自分类Dev

在Emacs中编辑Makefile时,如何恢复缩进制表符模式?

来自分类Dev

如何在emacs组织模式下缩进纯文本段落?

来自分类Dev

使用诸如“ each”之类的迭代器时的Emacs 24红宝石模式缩进行为

来自分类Dev

由于c ++模式下的缩进,Emacs imenu和speedbar + semantic失败

来自分类Dev

使用诸如“ each”之类的迭代器时的Emacs 24红宝石模式缩进行为

来自分类Dev

由于C ++模式下的缩进,Emacs imenu和speedbar + semantic失败

来自分类Dev

ghci:Emacs haskell模式下的自定义提示

来自分类Dev

emacs注释缩进Qt样式

来自分类Dev

Emacs中的注释缩进错误

Related 相关文章

  1. 1

    在Emacs中更改Java模式的缩进样式

  2. 2

    完全禁用Emacs的JavaScript模式自动缩进

  3. 3

    使用Emacs次要模式更改缩进

  4. 4

    emacs主模式定义

  5. 5

    带有yasnippet,Emacs的python模式下的错误缩进

  6. 6

    Emacs:Java模式下的新行和自动缩进

  7. 7

    缩进在Emacs Haskell模式下变得疯狂

  8. 8

    带选项卡的Emacs xml模式缩进

  9. 9

    Emacs:在shell脚本模式下在&&之后抑制缩进

  10. 10

    emacs python模式下的缩进不正确

  11. 11

    如何在所有模式下在emacs中获得自动缩进(不是智能缩进)

  12. 12

    如何在所有模式下在emacs中获得自动缩进(不是智能缩进)

  13. 13

    如何在Emacs中用Web模式将Tab的缩进替换为空格的缩进

  14. 14

    Emacs中的“转到”定义-Haskell模式

  15. 15

    Emacs电对模式中的自定义对

  16. 16

    宏定义期间的Emacs模式行高亮

  17. 17

    Emacs Lisp代码缩进

  18. 18

    更改cmake的emacs缩进?

  19. 19

    Emacs 24.3 python模式在函数结束后错误地缩进代码

  20. 20

    如何在Emacs中将php模式下的缩进更改为2个空格?

  21. 21

    在Emacs中编辑Makefile时,如何恢复缩进制表符模式?

  22. 22

    如何在emacs组织模式下缩进纯文本段落?

  23. 23

    使用诸如“ each”之类的迭代器时的Emacs 24红宝石模式缩进行为

  24. 24

    由于c ++模式下的缩进,Emacs imenu和speedbar + semantic失败

  25. 25

    使用诸如“ each”之类的迭代器时的Emacs 24红宝石模式缩进行为

  26. 26

    由于C ++模式下的缩进,Emacs imenu和speedbar + semantic失败

  27. 27

    ghci:Emacs haskell模式下的自定义提示

  28. 28

    emacs注释缩进Qt样式

  29. 29

    Emacs中的注释缩进错误

热门标签

归档