Estou tentando adicionar um recurso de comentário à documentação do Pod para scripts Perl, e gostaria de destacar os comentários do Pod com uma face especial. Um protótipo simples de script Perl poderia ser:
#! /usr/bin/env perl
use strict;
use warnings;
print "Hello\n"; # a Perl comment /* hello */
__END__
=head1 SYNOPSIS
my_program <arg1> [OPTIONS]
/* this is a Pod comment */
Como vemos, um comentário de um pod é substituído por uma /* */
linguagem de programação C. No entanto, apenas a parte abaixo da linha __END__
é a documentação do Pod. A parte acima dessa linha é um código Perl comum. Agora, se eu tentar adicionar destaque de sintaxe ao comentário do Pod usando, por exemplo (chamado de cperl-mode-hook
):
(font-lock-add-keywords nil '(("\\(/\\*.*?\\*/\\)" 1 'font-lock-warning-face t)))
Recebo o seguinte usando cperl-mode
como modo principal:
Portanto, os comentários do Pod também são destacados em um comentário Perl comum (um comentário do Perl começa com um #
caractere), o que não é desejado (os comentários do Pod devem ser destacados apenas nas seções do Pod, e não no código Perl comum).
Para simplificar, para esta pergunta, podemos assumir que a documentação do Pod está confinada ao final do documento, começando pelas linhas após a __END__
tag. É possível verificar a posição do comentário atual e relacioná-lo à posição da __END__
linha e, a partir dessas informações, determinar se estamos dentro de um bloco de Pod ou não (e adicionar sintaxe destacando apenas se estiver dentro de um bloco de Pod) ao executar o código de bloqueio da fonte?
mmm-mode
mas acho que essa pode ser a solução para você.pod-mode
modo principal que seja adequado para as regiões de comentários do Pod,mmm-mode
poderá ser aplicável. Não sei se é esse o caso. Provavelmente o que você precisa aqui é apenas uma configuração adicional de bloqueio de fonte.Respostas:
Solução atualizada
Existe uma maneira integrada de fazer isso com o bloqueio de fonte (obrigado sanityinc)
Esta resposta tem todos os detalhes sobre como esse estilo de fonte-lock-keywords funciona: https://stackoverflow.com/a/14675550
O resultado é o mesmo que a solução original.
Aqui está em ação:
Solução original usando funções jit-lock (não é o ideal)
Eu acredito que você precisará fazer a fontificação manualmente em uma função adicionada ao
jit-lock-functions
.jit-lock-functions
são as funções que realmente executam a fonte e a área chamadas com os parâmetros BEG e END para indicar a região à qual eles devem aplicar propriedades de texto.Nesse cenário, sua função primeiro verificará se a região a ser colorida está
__END__
em seu buffer e, nesse caso, pesquise manualmente / * comments * / e aplique propriedades de texto a elas.Aqui está uma implementação:
Para o seu cenário, você pode adicionar a função jit lock dentro de um gancho no modo perl
Observe também que essa função não é "inteligente", apenas procura END em qualquer lugar do buffer, portanto, se ocorrer em uma string ou um comentário perl onde não deveria ter efeito, na verdade ocorrerá. Você pode estender a função para examinar o contexto de onde END ocorre, se necessário.
fonte
jit-lock-function
. Esse é um detalhe interno da implementaçãofont-lock
. Deve haver umafont-lock
maneira simples de conseguir isso.