请求完善Emacs中自定义汇编语言的Elisp缩进函数
自研汇编语言的Emacs自定义缩进实现
我来帮你搞定这个自研汇编在Emacs里的自定义缩进问题!你已经有了一个接近可用的函数,我把它补全并优化,完美贴合你的需求:以.开头的伪指令、以:结尾的标签左对齐,普通指令缩进4个空格。
下面是完整可用的Elisp实现:
(defun myasm-indent-line () "Indent current line as custom assembly code." (interactive) (beginning-of-line) (save-excursion (let ((indent-level 0) (current-line (buffer-substring-no-properties (point) (line-end-position)))) ;; 匹配以.开头的伪指令,左对齐 (if (string-match "^\\." current-line) (setq indent-level 0) ;; 匹配以:结尾的标签(行首为非空白字符),左对齐 (if (string-match "^[^\\s-]+:$" current-line) (setq indent-level 0) ;; 普通指令,缩进4个空格 (setq indent-level 4))) ;; 应用计算好的缩进 (indent-line-to indent-level)))) ;; 将缩进函数绑定到自研汇编模式(假设你的模式名为myasm-mode) (add-hook 'myasm-mode-hook (lambda () (setq-local indent-line-function 'myasm-indent-line)))
逻辑拆解
- 伪指令处理:用正则
^\\.匹配行首的.,这类行直接设置缩进为0,确保左对齐。 - 标签处理:用正则
^[^\\s-]+:$匹配行首是非空白字符且以:结尾的行,同样左对齐。 - 普通指令处理:如果当前行既不是伪指令也不是标签,就设置缩进为4个空格,让指令统一对齐。
使用提示
- 将上述代码添加到你的Emacs配置文件(比如
~/.emacs或~/.emacs.d/init.el)。 - 确保你的自研汇编模式名称是
myasm-mode,如果不是,把钩子里的模式名改成你实际使用的名称。 - 保存配置后重启Emacs,或者用
M-x eval-buffer加载当前配置。之后打开你的汇编文件,就能自动按规则缩进了;也可以手动调用M-x myasm-indent-line来测试单行缩进效果。
内容的提问来源于stack exchange,提问作者Itsbananas
相关产品推荐
相关产品推荐

