В vim следующий документ будет $PWD
окрашивать строки 2 и 3 двумя разными способами:
#/bin/sh
echo "Current Directory: $PWD"
echo 'Current Directory: $PWD'
Первый экземпляр $PWD
будет отличаться по цвету от остальной строки, в которой он находится. Это дает четкую визуальную индикацию того, что переменная будет расширена, а не будет рассматриваться как буквальный текст. Напротив, второй экземпляр $PWD
будет окрашен так же, как и остальная часть строки, потому что одинарные кавычки приводят к тому, что он обрабатывается как буквальный текст.
Существуют ли какие-либо существующие режимы emacs, обеспечивающие этот тип "осведомленности о цитировании оболочки"?
sh-mode
? Может быть, его можно добавить в сам Emacs.Ответы:
В приведенном ниже коде используется правило блокировки шрифта с функцией вместо регулярного выражения, функция ищет вхождения,
$VAR
но только когда они находятся внутри строки в двойных кавычках. Функция(syntax-ppss)
используется для определения этого.Правило font-lock использует
prepend
флаг, чтобы добавить себя поверх существующей подсветки строки. (Обратите внимание, чтоt
для этого используются многие пакеты . К сожалению, это перезаписывает все аспекты существующей подсветки. Например, при использованииprepend
будет сохраняться цвет фона строки (если он есть) при замене цвета переднего плана.)Вы можете вызвать использование этого, добавив последнюю функцию к подходящему хуку, например:
источник
2
правило блокировки шрифтов на,0
оно должно работать. (Возможно, вам придется расширить регулярное выражение, чтобы включить трейлинг}
для${FOO}
правильного выделения .) Это число относится к подгруппе регулярного выражения соответствия,0
что означает, что все совпадение должно быть выделено.Я улучшил ответ @ Lindydancer следующими способами:
sh-script-extra-font-lock-is-in-double-quoted-string
функцию, так как она использовалась только один раз$10
,$1
и т. Д.) Подсвечиваются.Перерыв на код
источник
[^\\\\]
можно записать как[^\\]
, это набор символов, которые не должны совпадать, и ваш код содержит обратную косую черту дважды. В более старых версиях Emacs, которые вы должны использоватьfont-lock-fontify-buffer
, в более новых версиях вы должны вызывать,font-lock-flush
а вызовfont-lock-fontify-buffer
из elisp считается устаревшим. Мой оригинальный код следовал этому, ваш код - нет. В любом случае, может быть, лучше перенести это в архив GitHub и объединить усилия.[^\\]
ускользает от]
? Вот как я знаю регулярное выражение в Java.