Em um idioma (julia) que possui blocos definidos por palavras-chave, como for..end
, begin..end
entre parênteses, qual é uma boa maneira de pular esse bloco? Além disso, end
nã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 end
es, 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-sexp
funcionem 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.]
ruby-mode
que 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 partidaRespostas:
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-mode
mencionados em um comentário), para fornecer movimento e recuo sexp.A implantação do SMIE para um idioma é aproximadamente uma tarefa de duas etapas:
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-parens
destacará 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-ppss
para 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-list
seguidas porbackward-sexp
) podem ser uma substituição.fonte
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--:
Quando terminar, deve estar disponível, ou seja, copiado e retornado assim
fonte