首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs将一致的缩进规则添加到泛型-x模式中。

Emacs将一致的缩进规则添加到泛型-x模式中。
EN

Stack Overflow用户
提问于 2016-02-24 14:06:55
回答 1查看 551关注 0票数 0

我为标准ML编写了一个非常简单的Emacs模式:

代码语言:javascript
复制
;; sml syntax
(require 'generic-x)

(define-generic-mode
    'sml-mode                          ;; name of the mode
  '(("(*" . "*)"))                           ;; comments delimiter
  '("fun" "fn" "let" "val" "datatype" "type" "case" "of" "end" "structure" "struct" "signature" "sig")
  '(("=" . 'font-lock-builtin-face)
    ("|" . 'font-lock-builtin-face)
    (">" . 'font-lock-builtin-face)
    ("<" . 'font-lock-builtin-face)
    ("-" . 'font-lock-builtin-face)
    ("+" . 'font-lock-builtin-face)
    (";" . 'font-lock-builtin-face)
    ("," . 'font-lock-builtin-face)
    ("{" . 'font-lock-builtin-face)
    ("}" . 'font-lock-builtin-face)
    ("(" . 'font-lock-builtin-face)
    (")" . 'font-lock-builtin-face)
    (":" . 'font-lock-builtin-face)
    ("[" . 'font-lock-builtin-face)
    ("]" . 'font-lock-builtin-face))     ;; a built-in
  '("\\.sml$")                    ;; files that trigger this mode
  nil                              ;; any other functions to call
  "SML highlighting mode"     ;; doc string
  )

然而,它不会始终如一地退缩。我不能确切地描述它是如何缩进的,但是它在制表符和空格以及空格的长度之间切换不一致。我能想到的最简单的规则是总是在同一列上启动一条新行,而选项卡总是带您到下一列,即4的倍数。制表符应该是空格。如何使用泛型模式进行此操作?

作为对模式定义的一个注意事项,我错误地使用了内置面,因为操作员脸没有着色。不过,现在看起来确实很难看。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-25 13:37:47

首先,我强烈建议您从define-derived-mode开始,而不是从define-generic-mode开始,因为前者将无缝增长以适应功能齐全的主要模式,而define-generic-mode将很快施加不方便的限制。

例如,您可以将代码重写为:

代码语言:javascript
复制
(defvar sml-mode-syntax-table
  (let ((st (make-syntax-table)))
    ;; Make (*...*) a comment.
    (modify-syntax-entry ?\( "()1" st)
    (modify-syntax-entry ?\) ")(4" st)
    (modify-syntax-entry ?\* ". 23n" st)
    st))

(defvar sml-font-lock-keywords
  `((,(concat "\\_<" 
              (regexp-opt '("fun" "fn" "let" "val" "datatype" "type" "case" "of" "end" "structure" "struct" "signature" "sig"))
              "\\_>")
     (0 font-lock-keyword-face))
    ("[][=|><-+;,{}():]" (0 font-lock-builtin-face))))

;;;###autoload
(define-derived-mode sml-mode prog-mode "SML"
  "SML major mode."
  (set (make-local-variable 'comment-start) "(* ")
  (set (make-local-variable 'comment-end) " *)")
  (set (make-local-variable 'font-lock-defaults)
       '(sml-font-lock-keywords)))

;;;###autoload
(add-to-list 'auto-mode-alist '("\\.sml\\'" . sml-mode))

W.r.t选项卡和SPC,“在它们之间切换”是默认的Emacs行为(态度是TAB只是我们在适用时使用的一种优化)。如果您不喜欢它,那么将(setq-default indent-tabs-mode nil)放在~/.emacs中,而不是在主要模式的定义中,因为这是一个与SML无关的个人选择(与Haskell相反,SML不区分制表符和SPC)。

至于您建议的缩进,您可以从添加(set (make-local-variable 'indent-line-function) #'indent-relative)开始,这应该确保默认情况下缩进与前面的行相同;对于"TAB应该前进4列“,也许像(set (make-local-variable 'tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64))这样的东西会起作用(在最近的Emacsen中,'(4 8)就足够了,因为Emacs最终学会了”自动扩展列表“。

但我很好奇:为什么不直接使用GNU中现有的sml-mode呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35604365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档