Melhor indentação e navegação no código fonte do assembly

13

Quando escrevo código C ou Java, é extremamente regular, mas com assembly ( asm-mode), é muito desorganizado.

Eu estou usando auto-completee yasnippet. Criei trechos e os estou usando, mas a organização e o recuo do código são desorganizados.

Que pacote (s) me ajudaria:

  • recue facilmente o código e os comentários corretamente, para que eu possa ver o que cada parte do código está fazendo;
  • navegar nessa grande massa de código, para que eu possa pular facilmente entre partes do código?
Vivian Maya
fonte
3
Tente tornar sua pergunta mais específica. Por exemplo: o que você acha que asm-modedeve fazer, mas não faz? (Que recursos estão faltando?)
Constantine
2
O EmacsWiki tem algumas opções listadas para montagem. Mas edite sua pergunta para ser mais específico sobre o problema e o que você fez até agora. "Qualquer pacote útil" cobre muito terreno.
Dan
Por que fechar esta pergunta? Fazer o recuo funcionar ( asm-modese comporta de maneira diferente de tudo o mais) e configurar um ambiente decente (pular, completar código) é um concerto válido.
Tu Do
1
Para usuários que desejaram que essa pergunta fosse reaberta, consulte esta meta-discussão . Ajude a limpar a questão e a esclarecê-la, caso contrário, há uma chance não trivial de que outros usuários votem para fechá-la novamente.
Dan

Respostas:

11

Basta usar o built-in asm-mode. Ele fornece destaque de sintaxe para qualquer linguagem assembly. gas-modenão faz isso e não é utilizável com a sintaxe da AT&T.

Se você deseja definir o recuo asm-mode, observe que você não pode usar, tab-widthmas tab-stop-listespecifica os espaços que 1 guia, 2 guias, 3 guias ... podem exibir:

(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60
                      64 68 72 76 80 84 88 92 96 100 104 108 112
                      116 120))

O exemplo acima significa que a guia primeiro possui 4 espaços, a segunda guia (ao lado da primeira guia) possui 8 espaços, a terceira guia (ao lado da segunda guia) possui 12 espaços ... e assim por diante.

Você também pode gerar a lista assim:

(setq tab-stop-list (number-sequence 2 60 2))

number-sequencegera uma lista de números, com o número inicial 2(o primeiro argumento) até 60(o segundo argumento), cada número difere de acordo 2com o número ao lado. E lembre-se de vincular newline-and-indentao RET, para que o Emacs recue automaticamente para você.

Se você quiser pular, use Ctags assim:

ctags -e -R

-esignifica gerar banco de dados de tags para ser usado pelo Emacs. -Rsignifica gerar recursivamente tags para arquivos em subdiretórios a partir da raiz do projeto.

Depois disso, você pode usar helm-etags-selectpara pular ou outro etagscliente no Emacs, se você não usar o Helm.

EDIT : Aqui está um exemplo de configuração:

(require 'asm-mode)
(add-hook 'asm-mode-hook (lambda ()
                           (setq indent-tabs-mode nil) ; use spaces to indent
                           (electric-indent-mode -1) ; indentation in asm-mode is annoying
                           (setq tab-stop-list (number-sequence 2 60 2))))

(define-key asm-mode-map (kbd "<ret>") 'newline-and-indent)
(define-key asm-mode-map (kbd "M-.") 'helm-etags-select)

Você também pode ter a conclusão básica company-completepressionando S-TAB:

(define-key asm-mode-map (kbd "<backtab>") 'company-complete)

Você pode usar <tab>para acionar a conclusão, pois ambos <tab>e M-iexecutar o mesmo comando tab-to-tab-stopque insere espaços ou guias dependem da sua configuração de indent-tabs-mode. O bom company-modeé que você obtém uma breve descrição do candidato atualmente destacado no minibuffer, se disponível. Por exemplo, se você tiver uma definição como esta:

KeyStrokes  word    0

Quando você move o cursor para KeyStrokescandidato, ele é impresso word 0no minibuffer.

Tu Do
fonte