Featured Post

Download assíncrono de imagens para uma UITable

O Markj fez um excelente post explicando como fazer o download assíncrono de imagens para preencher uma UITable. E o que é melhor: sem precisar se preocupar com programação de threads. Ele usou alguns recursos do framework Cocoa para conseguir isso. Compartilhe este post:

Read More

Como criar macros no Xcode

Posted by Marcelo Baltar | Posted in xcode | Posted on 30-03-2009

Tags:

1

Acho que não deve ter um usuário do Xcode que não seja fã do code completion dele. Funciona maravilhosamente bem e é surpreendente a produtividade que ele proporciona ao desenvolvedor. Já utilizei diversas IDEs com este tipo de recurso, mas o Xcode conseguiu inovar e trazer uma forma mais interessante de adivinhar seu código. Umas poucas letras digitadas e dá-lhe TAB (ou ENTER, dependendo do freguês), um atrás do outro, para ver seu código ser inserido. É começar a usar e se apaixonar.

Mas é claro que o que é bom pode ficar melhor ainda. Você pode criar suas próprias macros para facilitar ainda mais sua vida. Está cansado de digitar:

@property (nonatomic, retain) NSTipoQualquer minhaPropriedade

nas suas interfaces?

Então é só criar uma macro que irá inserir o texto acima quando você digitar “@prop”, por exemplo. E colocando “placeholders” nos lugares certos (em NSTipoQualquer e minhaPropriedade), para facilitar a navegação e substituições necessárias.

O Xcode já vem com uma série de macros pré-definidas. Elas ficam no diretório /Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro/Contents/Resources/. Macros criadas pelo usuário devem ser colocadas no diretório ~/Library/Application Support/Developer/Shared/Xcode/Specifications.

Para criar a macro @property acima, siga os passos:

  1. Crie o arquivo ObjectiveC.xctxtmacro no diretório ~/Library/Application Support/Developer/Shared/Xcode/Specifications. Você provavelmente vai precisar criar este diretório, pois ele não é criado na instalação do Xcode.
  2. Insira o código abaixo no seu arquivo ObjectiveC.xctxtmacro:
    /**
        Objective C text macro specifications
      by Marcelo Baltar
    */
    
    (
      {
        Identifier = objc.msb.property;
        BasedOn = objc;
        IsMenuItem = NO;
        Name = "@property definition";
        TextString = "@property (nonatomic, retain) <#datatype#> <#property#>";
        CompletionPrefix = "@prop";
        IncludeContexts = ( "xcode.lang.objc.interface" );
      },
    )
    
  3. Reinicie o Xcode (sim, essa é a parte chata: toda edição nos arquivos das macros só será reconhecida após você reiniciar o Xcode).

Vamos dar uma olhada no arquivo para entendê-lo. As propriedades que definem uma macro devem estar entre colchetes. Se você criar várias macros em um mesmo arquivo (o que você provavelmente irá fazer), não se esqueça de separar cada definição com uma vírgula.

As propriedades que utilizamos para definir nossa macro foram:

Identifier: identificador único da macro. Pode ser qualquer string, desde que única entre suas macros. Mas, claro, tente colocar algo que faça sentido. No exemplo, utilizei obj para identificar uma macro para Objective-C (seguindo uma convenção da Apple), msb são as minhas iniciais :) e property é um nome que escolhi identificando o comando sobre o qual a macro será aplicada.

BasedOn: Define o “pai” dessa macro. Quaisquer propriedades não setadas na definição da sua macro serão herdadas do “pai” que você definir aqui. No nosso exemplo, estamos herdando da definição de objc.

IsMenuItem: Determina se a macro irá aparecer no menu Edit → Insert Text Macro.

Name: Nome da macro, que irá aparecer no menu Edit → Insert Text Macro, se  a propriedade IsMenuItem estiver setada (YES).

TextString: A string que efetivamente será inserida no seu código. Note que você pode configurar alguns placeholders, utilizando a sintaxe <#nome_do_placeholder#>. Lembrando que placeholders são aquelas posições na string inserida pelo code completion pelas quais você pode navegar com uma combinação de teclas (^/ por default).

CompletionPrefix: Essa é a macro que será substituída pelo conteúdo definido pela propriedade TextString.

IncludeContexts/ExcludeContexts: Essa propriedade serve para você definir um escopo onde sua macro funcionará. Ela não é obrigatória, mas é útil se você quiser utilizar, por exemplo, macros iguais com comportamentos diferentes, dependendo de onde ela for inserida, ou simplesmente para evitar situações onde a macro não se aplica. No nosso exemplo, o code completion só irá substituir @prop quando estiver definido dentro de uma @interface, o que faz todo o sentido.’

Algumas observações

Tenha muito cuidado com a sintaxe do arquivo, porque qualquer erro impedirá que o Xcode faça o parsing adequadamente e a mensagem de erro dele não será nem um pouco amigável. Isso se ele der alguma mensagem de erro. Ele pode simplesmente ignorar todo seu arquivo, ou uma parte dele, tornando bastante difícil a identificação do erro. Em especial, lembre-se sempre de fazer o correto escape das aspas, usando a barra invertida. Por exemplo:

TextString = "NSString *meuBlog = @\"Still Coding\"";

Você pode usar o mesmo valor do CompletionPrefix para diversas macros. Basta usar o atalho de teclado Next Completion para alternar entre as definições.

Os valores permitidos para as propriedades IncludeContext e ExcludeContext são:

"xcode.lang.objc.block"
"xcode.lang.objc.bracketexpr"
"xcode.lang.objc.parenexpr"
"xcode.lang.objc.interface"
"xcode.lang.objc.implementation",
"xcode.lang.objc.protocol.declaration",
"xcode.lang.objc.protocol",
"xcode.lang.objc.function.declaration",
"xcode.lang.objc.function.definition",
"xcode.lang.objc.typedef",
"xcode.lang.objc.initializer"

Criei um projetinho no github para ir colocando algumas macros que eu for definindo ao longo da vida. Fique à vontade para fazer um fork e contribuir com suas macros!

Disclaimer: As idéias para este post foram retiradas deste excelente artigo. Não deixe de visitá-lo para informações adicionais.

Em tempo: confira também esse post para saber mais sobre o autocompletion do Xcode.

Compartilhe este post:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Digg
  • FriendFeed
  • LinkedIn
  • StumbleUpon
  • Twitter

Comments (1)

[...] que postei há pouco tempo sobre macros do Xcode, aí vai uma dica rápida: um cheatsheet com as macros que [...]

Write a comment