You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求完善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个空格,让指令统一对齐。

使用提示

  1. 将上述代码添加到你的Emacs配置文件(比如~/.emacs或~/.emacs.d/init.el)。
  2. 确保你的自研汇编模式名称是myasm-mode,如果不是,把钩子里的模式名改成你实际使用的名称。
  3. 保存配置后重启Emacs,或者用M-x eval-buffer加载当前配置。之后打开你的汇编文件,就能自动按规则缩进了;也可以手动调用M-x myasm-indent-line来测试单行缩进效果。

内容的提问来源于stack exchange,提问作者Itsbananas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:36:04