Подсветка синтаксиса для Perl в Emacs не работает, есть ли исправление?

Я программист на Perl и новый пользователь emacs. Я под Windows, использую cperl-mode для редактирования perl. Версия Emacs - 24.2.1. Вот скриншот с некоторым примером кода:

http://breqwas.net/dropbox/perlsyn_emacs.png

Очевидная ошибка: она выделяет массивы, хэши и буквенные значения без кавычек в (a => "b") списках стилейвнутри комментарииЕще одна ошибка: он выделяет первое слово в регулярном выражении в виде массива из-за нестандартного символа кавычкиНе ошибка, но выглядит странно: он подсвечивает массивы и хэши в любое время, когда они используются (даже в комментариях, да), но скаляры подсвечиваются только при объявленииНе ошибка, но выглядит странно: та же история с функциями: подсвечивается при объявлении, а не при вызовеНе ошибка, но выглядит странно: почему «print», «say» и «system» имеют разные цвета?

Я мог бы продолжать, но я надеюсь, что это довольно хорошо объясняет слово «сломанный».

Затем я изучил волшебную комбинацию клавиш C-u C-x =, которая показывает, помимо прочего, свойства текста для текста под курсором, надеясь создать лучшую собственную схему раскраски. На этом этапе это стало иметь еще меньше смысла.

«печать» имеетcperl-nonoverridable-лицо, "умереть" имеетшрифта блокировки ключевых слов лицо, Между тем, оба являются функциями и могут быть (и часто) переопределены. "система" имеетшрифт блокировка типа лицо, Почему? Объявления функций имеютшрифт-замок-имя-функции-лица - все в порядке, но так же как и аргументы «использования». Почему? Вызовы функций и скаляры вообще не имеют свойства лица и не могут быть выделены. Почему? И т. Д. И т. Д. Снова, я мог продолжать идти.

Есть ли способ исправить все это? Есть ли какой-нибудь конфиг, где я могу переназначить лексические единицы на некоторые другие шрифтовые грани или каким-то другим способом сделать синтаксическую подсветку менее сумасшедшей?

Чтобы избежать разговора «perl is unparsible», вот скриншот редактора, с которого я перехожу, с тем же кодом:http://breqwas.net/dropbox/perlsyn_pn.png, Выглядит гораздо разумнее.

Upd: К настоящему времени (через 3 недели после того, как задал этот вопрос здесь), я не нашел лекарство. Все программисты на Perl, которые используют emacs, я знаю, просто игнорируют эти проблемы. Похоже, что для emacs не существует более качественных подсветок perl. Чтение документов в режиме cperl дает некоторые объяснения (выбор лиц для различных элементов теперь кажется менее сумасшедшим), но не дает никаких ответов. Я написал электронное письмо сопровождающему cperl-mode с этими вопросами и дальнейшими поисками, но не получил ответа.

Да, вы правильно поняли: кажется, что сообщество emacs не смогло сделать хорошую подсветку синтаксиса perl за 25 лет, что perl есть. Это грустная история.

 choroba30 окт. 2012 г., 15:14
Я просто живу с этим. Рассмотрим настройкиcperl-highlight-variables-indiscriminately вt.

Ответы на вопрос(2)

perl-mode вместоcperl-mode, Если вы обнаружите в нем недостающие функции, мы можем перенести их сcperl-mode без особых проблем.perl-modeПодсветка менее яркая, чемcperl-modeНо это решает некоторые проблемы, которые вы указали.

Что касается «выделено при объявлении, а не при вызове», это потому, что Emacs обычно подсвечивает таким образом. Я считаю, что нет никакой пользы от выделения переменных и функций. Я сохранил выделение переменных вperl-mode главным образом потому, что это было там раньше, и я не хотел иметь дело с недовольными пользователями. Кроме того, в случае с Perl, вероятно, легче выделить объявления переменных и использовать их идентичноperl-mode в то время какcperl-mode должен сделать дополнительную работу, чтобы различить эти два случая.

подсвечивающий snafu, за которым следует следить с помощью Emacs cperl-mode, относится к комментариям POD, используемым для комментирования блоков кода. Вот скриншот для демонстрации:

ОЧЕНЬ легко пропустить закомментированный код, который использует директивы POD без дополнения пустыми строками, как в моем примере «не рекомендуется» выше. Это просто не бросается в глаза как комментарий при просмотре его в Emacs, особенно если закомментированный блок большой и занимает несколько экранных страниц, поэтому строки '= cut' даже не видны.

Стоит отметить, чтонапорРежим Perl правильно подсвечивает POD, не требуя дополнения пустыми строками в соответствии со спецификацией POD, хотя я бы предостерег пользователей vim не полагаться на эту функцию и использовать заполнение пустыми строками и директивы = begin comment ... = end comment, как показано выше икак рекомендуется.

Было бы неплохо, если бы в Perl был более простой синтаксис многострочного комментария в стиле '/ * ... * /', а не механизм POD, который подвержен злоупотреблениям. Возможно, мы когда-нибудь получим это в Perl 6?

Другой способ сделать многострочные комментарии в Emacs (для любого языка) - через встроенный 'string-rectangle': C-x r t, затем набрать '#'. Чтобы раскомментировать блок, сделайте это вручную или напишите простой макрос.

Ваш ответ на вопрос