汇编代码的自定义缩进函数
Custom indent function for assembly code
我想为我的汇编语言编写 Emacs 的自定义缩进。我写了一个几乎可以用的。
在我的语言中,有些指令以点“.”开头。 (例如 .data .text)、以“:”结尾的标签(例如 msg: x: buffer:)和说明(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)))))
我用这段代码测试了 scratch 缓冲区中的正则表达式:
(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"
指示和说明的缩进是正确的,但缩进四个空格的标签不正确。
感谢您的帮助。
您对字符 类 的语法感到困惑。
[:alnum:]
代表一组字符,但它是在 character-range 中使用的语法,而不是在正则表达式中使用。
IOW 你需要一组额外的括号:
((looking-at "[ \t]*\.[[:alnum:]]*") (indent-line-to 0))
((looking-at "[ \t]*[[:alnum:]]*:") (indent-line-to 0))
这样您就可以使用 [_[:upper:][:digit:]]
或 [^[:alnum:]]
.
这样的正则表达式
我想为我的汇编语言编写 Emacs 的自定义缩进。我写了一个几乎可以用的。
在我的语言中,有些指令以点“.”开头。 (例如 .data .text)、以“:”结尾的标签(例如 msg: x: buffer:)和说明(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)))))
我用这段代码测试了 scratch 缓冲区中的正则表达式:
(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"
指示和说明的缩进是正确的,但缩进四个空格的标签不正确。
感谢您的帮助。
您对字符 类 的语法感到困惑。
[:alnum:]
代表一组字符,但它是在 character-range 中使用的语法,而不是在正则表达式中使用。
IOW 你需要一组额外的括号:
((looking-at "[ \t]*\.[[:alnum:]]*") (indent-line-to 0))
((looking-at "[ \t]*[[:alnum:]]*:") (indent-line-to 0))
这样您就可以使用 [_[:upper:][:digit:]]
或 [^[:alnum:]]
.