Faça sex-forward reconhecer blocos definidos por palavras-chave, não apenas parênteses

10

Em um idioma (julia) que possui blocos definidos por palavras-chave, como for..end, begin..endentre parênteses, qual é uma boa maneira de pular esse bloco? Além disso, endnão é apenas uma palavra-chave de bloco, mas também um identificador válido usado em outros lugares.

Uma maneira é procurar regex de início / fechamento de bloco e pular todas as strings, comentários endes, etc., mas isso é um tanto ineficiente e um pouco feio.

Existe uma maneira de fazer com que a análise de sintaxe do emacs reconheça essas palavras-chave de bloco, para que forward/backward-sexpfuncionem automaticamente e para que seja possível distinguir rapidamente o início do bloco atual a partir da saída de, por exemplo syntax-ppss?

[Nota: Não me importo de analisar o arquivo, mas nesse caso ainda gostaria de saber como meu analisador deve ser conectado ao restante do emacs.]

Kirill
fonte
11
Você pode dar uma olhada no ruby-modeque faz algo semelhante ao ruby. Outra opção é ligar-se smartparens , tem uma configuração especial para ruby modo que você pode usar como ponto de partida
Iqbal Ansari

Respostas:

9

Você pode dar uma olhada na biblioteca embutida SMIE (sigla para Simple-Minded Indentation Engine). Apesar do nome, o recuo é apenas um dos recursos que ele fornece. Esse é o método usado por muitos modos (inclusive ruby-modemencionados em um comentário), para fornecer movimento e recuo sexp.

A implantação do SMIE para um idioma é aproximadamente uma tarefa de duas etapas:

  • defina a gramática do seu idioma, juntamente com um lexer que identifica tokens;
  • definir regras de indentação.

Para o seu propósito, apenas o primeiro passo será necessário!

No geral, o analisador definido dessa maneira se conecta muito bem ao emacs. Por exemplo, show-parensdestacará expressões parênticas definidas na gramática SMIE (pelo menos nas versões recentes o bastante do emacs).

Observe que você ainda não poderá usar syntax-ppsspara obter informações sobre o ambiente anexo, porque ele fornecerá apenas o resultado do analisador de tabela de sintaxe. Mas as funções de movimento sexp (por exemplo, up-listseguidas por backward-sexp) podem ser uma substituição.

T. Verron
fonte
2

Eu fiz uma biblioteca para isso

Uma vez definido, vários comandos estão disponíveis, avançando, retrocedendo, copiando etc.

Definindo --em pseudo-código--:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

Quando terminar, deve estar disponível, ou seja, copiado e retornado assim

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Andreas Röhler
fonte