代码之家  ›  专栏  ›  技术社区  ›  Itsbananas

汇编代码的自定义缩进函数

  •  1
  • Itsbananas  · 技术社区  · 6 年前

    我想为我的汇编语言编写Emacs的自定义缩进。我写了一个几乎奏效的。

    在我的语言中,有以点“.”开头的指令(例如,data.text)、以“:”结尾的标签(例如,消息:x:缓冲区:)和指令(mov eax,$24)。我希望指令和标签向左缩进,指令缩进四个空格。以下是elisp中的函数:

    (defun myasm-indent-line ()
    "Indent current line as myasm code"
    (interactive)
    (beginning-of-line)
    (save-excursion
      (beginning-of-line)
      (cond ((bobp) (indent-line-to 0))
        ((looking-at "[ \t]*\\.[:alnum:]*") (indent-line-to 0))
        ((looking-at "[ \t]*[:alnum:]*:") (indent-line-to 0))
        (t (indent-line-to 4)))))
    

    我测试了 划痕 具有此代码的缓冲区:

    (defun foo (s)
      (cond ((string-match-p "[ \t]*\\.[:alnum:]*" s) (message "directive"))
      ((string-match-p "[ \t]*[:alnum:]*:" s) (message "label"))
      (t (message "instruction"))))
    (foo ".data")        ; prints "directive"
    (foo "mov eax, 13")  ; prints "instruction"
    (foo "msg:")         ; prints "label"
    

    缩进对于指令和说明是正确的,但对于缩进了四个空格的标签是不正确的。

    谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Stefan    6 年前

    您对字符类的语法感到困惑。 [:alnum:] 表示一组字符,但它是在字符范围内使用的语法,而不是在正则表达式中使用。 您需要一组额外的括号:

    ((looking-at "[ \t]*\\.[[:alnum:]]*") (indent-line-to 0))
    ((looking-at "[ \t]*[[:alnum:]]*:") (indent-line-to 0))
    

    这是为了让您可以像 [_[:upper:][:digit:]] [^[:alnum:]]