Как да настроя Emacs за асемблерно програмиране и да коригирам отстъп?

Как да настроя Emacs за асемблерно програмиране и да коригирам отстъп?

Emacs прави отстъп на някои директиви по досаден начин.

По-специално ключовите думи global, extern и section по-долу са с отстъп като код.

Искам тези ключови думи да са подравнени вляво. Как може да стане това?

В допълнение, има ли добри режими за асемблерно програмиране, които си струва да се препоръчат?

        global _main
        extern _printf
        section .text
_main:
        push msg
        call _printf
        add esp, 4
        ret
msg:
        db 'HelloWorld', 0

Осветяването на синтаксис обаче работи в режим asm:

въведете описание на изображението тук


person Shuzheng    schedule 30.07.2016    source източник
comment
Никога не съм бил много доволен от режима Assembler на emacs, но не съм си правил труда да намеря нещо по-добро. Електрическата точка и запетая не работи много добре и трябва да се борите с нея през цялото време, когато коментирате ред или нещо подобно, ако просто не я деактивирате.   -  person Peter Cordes    schedule 30.07.2016
comment
Каква е вашата препоръка за алтернатива (редактор)? Също така, как да персонализирам ASM режима по подразбиране за Emacs?   -  person Shuzheng    schedule 30.07.2016
comment
Все още използвам emacs; както казах, не съм си правил труда да намеря нещо по-добро и харесвам emacs за C / C++ / shell съвсем добре. Вие персонализирате режимите на emacs, като редактирате вашия ~/.emacs файл. Последният път, когато се опитах да деактивирам електрическа точка и запетая по подразбиране, не се получи (с (add-hook 'asm-mode-hook #'my-asm-mode-hook) за изпълнение на функция, която дефинирах по-рано, която изпълнява (local-unset-key (vector asm-comment-char)). Това local-unset-key работи, ако го стартирам ръчно (M-x eval-expression). Вероятно трябва да отделя известно време да науча персонализирането на emacs по-добре, ако смятам да продължа да го използвам през цялото време.   -  person Peter Cordes    schedule 30.07.2016
comment
директивите трябва да са във втората колона. Само етикетите принадлежат към първата колона.   -  person fuz    schedule 30.07.2016


Отговори (1)


Използвам това в моя ~/.emacs на Linux, за да персонализирам asm-mode, което го прави доста използваем за синтаксиса на NASM и умерено добър за синтаксиса на GAS. (Осветяването на синтаксиса и т.н. използва ; като знак за коментар, така че GAS с # е бъркотия. Не съм търсил да променя това).

Дедефинирам нещото с електрически коментари, така че мога да напиша ; без asm-mode, предполагайки, че знае къде искам коментара.

Настроих някои регулярни изрази, за да задам колоната с отстъп на 0 за директива %nasm_macro, global, section и етикети (завършващи с :)

(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)

Натискането на enter автоматично отстъпва реда, на който преди е бил курсорът. Натиснете control-O, за да вмъкнете нов ред, без да задействате автоматично отстъп.

Enter винаги ви отвежда до колона 4. Ако въведете нещо като .my_loop:, отстъпът ще бъде грешен, докато не натиснете return, така че е необходимо малко свикване да пишете бързо и да не очаквате да се върнете назад и да коригирате отстъпа на ред след натискане на enter.

Натискането на TAB автоматично ще направи отстъп на ред, но повторното натискане ще направи отстъп до следващия разделител.

Emacs 25.3.1 на Arch Linux, редактиране на отговор в процес на код-голф. (Направих прозореца малък само за целите на екранната снимка, разбира се.) Всички тези редове са с естествения си отстъп. Коментарите са предимно в колоната, в която meta-; ги поставя.

въведете описание на изображението тук

person Peter Cordes    schedule 14.06.2018
comment
навсякъде те виждам да даваш най-добрите отговори :) - person Noah; 14.11.2020
comment
Моето предположение работи само за x86_64 at&t синтаксис, но написах asm beautifier, за да улесня живота си с glibc неща. Свързва се добре с emacs imo. Може да ви хареса. - person Noah; 20.04.2021