如何为汇编编程设置Emacs并修复缩进?

3
如何设置 Emacs 以进行汇编编程并修复缩进?
Emacs 对某些指令的缩进方式很烦人。特别是下面的 global、extern 和 section 关键字会被缩进为代码。
我希望这些关键字左对齐。怎样做呢?
此外,是否有任何值得推荐的汇编编程模式?
        global _main
        extern _printf
        section .text
_main:
        push msg
        call _printf
        add esp, 4
        ret
msg:
        db 'HelloWorld', 0

虽然如此,语法高亮在汇编模式下确实有效:

enter image description here


我从未对emacs的“Assembler”模式感到满意,但我也没有费心找更好的替代品。电动分号并不是很好用,如果你不禁用它,在注释一行或其他操作时就必须一直与它斗争。 - Peter Cordes
你对替代编辑器有什么推荐?另外,我该如何自定义Emacs的默认ASM模式? - Shuzheng
我仍然使用Emacs,就像我说的,我没有找到更好的替代品,而且我对于C/C++/Shell的Emacs也非常满意。你可以通过编辑~/.emacs文件来自定义Emacs模式。上次我尝试默认禁用electric-semicolon时,它没有起作用(使用(add-hook 'asm-mode-hook #'my-asm-mode-hook)运行之前定义的一个函数,该函数运行(local-unset-key (vector asm-comment-char)))。如果我手动运行M-x eval-expression,那么local-unset-key会起作用。如果我想一直使用它,我应该花些时间学习Emacs自定义设置。 - Peter Cordes
2
指令应该放在第二列,只有标签可以放在第一列。 - fuz
1个回答

3
我在Linux的~/.emacs中使用这个来自定义asm-mode,使它对NASM语法非常可用,对GAS语法也还可以。 (语法高亮等使用;作为注释字符,因此带有#的GAS会很混乱。 我还没有研究过如何更改这个)。
我取消了电子注释的定义,这样我就可以键入;而不让asm-mode认为它知道我想要的注释位置。
我设置了一些正则表达式,将缩进列设置为0,用于%nasm_macro指令、globalsection和以:结尾的标签。
(defun my-asm-mode-hook ()
  ;; you can use `comment-dwim' (M-;) for this kind of behaviour anyway
  (local-unset-key (vector asm-comment-char))
  ;; (local-unset-key "<return>") ; doesn't work. "RET" in a terminal.  http://emacs.stackexchange.com/questions/13286/how-can-i-stop-the-enter-key-from-triggering-a-completion-in-company-mode
  (electric-indent-local-mode)  ; toggle off
;  (setq tab-width 4)
  (setq indent-tabs-mode nil)
  ;; asm-mode sets it locally to nil, to "stay closer to the old TAB behaviour".
  ;; (setq tab-always-indent (default-value 'tab-always-indent))

  (defun asm-calculate-indentation ()
  (or
   ;; Flush labels to the left margin.
;   (and (looking-at "\\(\\.\\|\\sw\\|\\s_\\)+:") 0)
   (and (looking-at "[.@_[:word:]]+:") 0)
   ;; Same thing for `;;;' comments.
   (and (looking-at "\\s<\\s<\\s<") 0)
   ;; %if nasm macro stuff goes to the left margin
   (and (looking-at "%") 0)
   (and (looking-at "c?global\\|section\\|default\\|align\\|INIT_..X") 0)
   ;; Simple `;' comments go to the comment-column
   ;(and (looking-at "\\s<\\(\\S<\\|\\'\\)") comment-column)
   ;; The rest goes at column 4
   (or 4)))
  )

(add-hook 'asm-mode-hook #'my-asm-mode-hook)

按下回车键会自动缩进光标之前所在的行。按下Ctrl+O可以插入一个新行而不触发自动缩进。
回车总是会带你到第4列。如果你输入类似于.my_loop:这样的东西,直到你按下回车键它才会被正确缩进,所以需要花一点时间适应快速输入并且不期望需要在按下回车键后回去修正行缩进。
按下TAB键会自动缩进一行,但再次按下它将缩进到下一个制表符停止位。
在Arch Linux上的Emacs 25.3.1正在编辑一个进行中的代码高尔夫答案。(当然,我只是为了截图将窗口缩小了。)所有这些行都处于它们自然的缩进位置。注释大多在元-;放置它们的列上。

enter image description here


无论在哪里,我都看到你给出最好的答案 :) - Noah
1
我的猜测只适用于x86_64的AT&T语法,但我编写了一个汇编美化器来使我的glibc编程更轻松。我认为它可以很好地与emacs配合使用。你可能会喜欢它。 - Noah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接