簡體   English   中英

Emacs將一致的縮進規則添加到generic-x模式

[英]Emacs add consistent indent rule to generic-x mode

我為Standard ML寫了一個非常簡單的Emacs模式:

;; 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的倍數的列。制表符應為空格。 如何使用通用模式執行此操作?

作為有關模式定義的注釋,我錯誤地使用了內置面,因為操作員面沒有顏色。 現在看起來確實很丑。

首先:我強烈建議您從define-derived-mode開始,而不是從define-generic-mode因為前者將無縫增長以適應功能齊全的主模式,而define-generic-mode將迅速施加不便的限制工作。

例如,您可以將代碼重寫為:

(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))

Wrt TAB和SPC,“在它們之間切換”是Emacs的默認行為(態度是TAB只是我們在適用時使用的一種優化)。 如果你不喜歡它,然后把(setq-default indent-tabs-mode nil)你的 ~/.emacs而不是在你的主要模式的定義,因為這是SML無關個人的選擇(不區分標簽和SPC與Haskell相反)。

至於您建議的縮進,您可以先添加(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 ELPA中現有的sml-mode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM