No vim, o documento a seguir fará com que as $PWD
linhas 2 e 3 sejam coloridas de duas maneiras diferentes:
#/bin/sh
echo "Current Directory: $PWD"
echo 'Current Directory: $PWD'
A primeira instância de $PWD
terá uma cor diferente do restante da string em que está. Isso fornece uma indicação visual clara de que a variável será expandida, em vez de tratada como texto literal. Por outro lado, a segunda instância de $PWD
será colorida da mesma forma que o restante da string, porque as aspas simples fazem com que seja tratada como texto literal.
Existe algum modo emacs existente que forneça esse tipo de "reconhecimento de cotação de shell"?
sh-mode
? Talvez ele possa ser adicionado ao próprio Emacs.Respostas:
O código abaixo usa uma regra de bloqueio de fonte com uma função em vez de uma regexp, a função procura por ocorrências,
$VAR
mas somente quando elas estão dentro de uma cadeia de caracteres entre aspas duplas. A função(syntax-ppss)
é usada para determinar isso.A regra de bloqueio de fonte usa o
prepend
sinalizador para adicionar-se sobre o realce de string existente. (Observe que muitos pacotes usamt
isso. Infelizmente, isso substitui todos os aspectos do realce existente. Por exemplo, o usoprepend
reterá uma cor de fundo da string (se houver) ao substituir a cor do primeiro plano.)Você pode chamar usar isso adicionando a última função a um gancho adequado, por exemplo:
fonte
2
regra de bloqueio de fonte por uma regra,0
ela funcionará. (Pode ser necessário estender a regexp para incluir um final}
para destacar${FOO}
adequadamente.) Esse número refere-se ao subgrupo regexp da correspondência,0
significa que a correspondência inteira deve ser destacada.Melhorei a resposta da @ Lindydancer das seguintes maneiras:
sh-script-extra-font-lock-is-in-double-quoted-string
função, pois ela foi usada apenas uma vez$10
,$1
, etc) estão destacados.Quebra de código
fonte
[^\\\\]
poderia ser escrito como[^\\]
, é um conjunto de caracteres que não devem ser combinados, e seu código inclui barra invertida duas vezes. Nas versões mais antigas do Emacs, é necessário usar as versõesfont-lock-fontify-buffer
mais recentes, e você deve chamar maisfont-lock-flush
e a chamadafont-lock-fontify-buffer
do elisp está obsoleta. Meu código original seguiu isso, seu código não. De qualquer forma, pode ser uma idéia melhor migrar isso para um arquivo GitHub e participar do esforço.[^\\]
escapa da]
? É assim que o regex funciona em Java, como eu sei.