Как настроить 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
Мне никогда не нравился режим ассемблера в 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-режим, что делает его достаточно пригодным для синтаксиса 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)

При нажатии клавиши ввода автоматически изменяется отступ строки, на которой ранее находился курсор. Нажмите control-O, чтобы вставить новую строку без запуска автоматического отступа.

Enter всегда переводит вас в столбец 4. Если вы наберете что-то вроде .my_loop:, он будет иметь неправильный отступ, пока вы не нажмете клавишу возврата, поэтому нужно немного привыкнуть к быстрому вводу и не ожидать, что вам нужно будет вернуться и исправить отступ на строку после нажатия 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. Вам это может понравиться. - person Noah; 20.04.2021