ISO Emacs [C] Perl-mode раскрашивает ссылки на хеш, такие как хэши - PullRequest
0 голосов
/ 30 мая 2018

Я все еще использую Perl, немного нового кода и поддерживаю старый код.Я использую emacs и cperl-mode.Мне нравится раскраска синтаксиса.

Сначала (много лет назад) я не любил специальную раскраску массивов и хэшей в cperl-mode, но она выросла на мне.До такой степени, что я иногда предпочитаю использовать хеш, а не ссылку на хеш, просто чтобы получить специальную раскраску.Это может звучать не так уж плохо - но если я допускаю, что иногда использую глобальный% hash или $ hash {key}, а не член объекта $ hashref -> {key}, просто чтобы получить раскраску, ну, это плохо.Т.е. раскраска синтаксиса заставляет меня хотеть следовать плохим практикам программирования.

Итак, мой вопрос: есть ли у кого-нибудь код конфигурации emacs / elisp для получения cperl-mode или perl-mode для раскрашивания ссылки на хеш, такой как $ hashref-> {key} в том же самом или похожем на $ hash {key}?

Позвольте мне использовать жирный шрифт, чтобы указать места, которые могут быть окрашены:

  • cperl-mode делает это сейчас: $ hash {key}
  • что я хотел бы: $ hash -> {key}

Я сделал большую настройкураскраски (граней) в emacs - например, раскраска, чтобы отличить код DEBUG от кода без отладки, TEST от не тестового и т. д. - но мне не удалось получить эту раскраску синтаксиса в режиме cperl-mode.(ПОСЛЕДОВАТЕЛЬНО: Я в итоге получил работоспособность font-lock-add-Keywords, как показано в моем ответе на мой собственный вопрос ниже.)

В приведенном ниже примере вы можете видеть, что $ hashref -> {key} не окрашен, в то время как $ hash {key} есть.

example of cperl-mode syntax coloring

Аналогично для ссылок на массивы и, возможно, для других ссылок.

Я понимаю, что ссылки на раскраски будут применяться только к разыменованиям, таким как $ hashref-> {ключ}, а не для других вещей, таких как $ hashref1 = $ hashref2.Я думаю, что я могу жить с этим.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вы не можете делать то, что хотите, не расширяя cperl-mode.cperl-mode не понимает ссылки.Там нет ссылки "лицо" для вас, чтобы настроить, и нет "вещь", чтобы применить это лицо.Если вы хотите отобразить ссылку на хеш, как хеш (в качестве примера), я бы начал с изменения второго регулярного выражения в определении t-font-lock-keywords-1 в cperl-mode.el.Это должно заботиться о хэше и массиве ссылок.Остерегайтесь cperl-highlight-variables-indiscriminately отменять ваши изменения.Если вы хотите сделать что-то более изощренное, например, иметь «эталонное лицо», вам придется

  1. определить лицо
  2. добавить лицо для настройки (если вы хотите)
  3. взломать t-font-lock-keywords-1 и применить лицо к совпадению с регулярным выражением

Конечно, может быть проще отправить запрос функции в восходящем направлении.cperl-mode является древним и определенно может использовать некоторую модернизацию.

0 голосов
/ 31 мая 2018

Мне не нравится отвечать на мой собственный вопрос, но ответ на погоню за диким гусем подсказал мне достаточно раздражения, чтобы понять, что мои попытки делали неправильно.

(Я ненавижу, когда спрашиваю X, кто-то отвечает Y,и пропускает X. Особенно, когда X выполнимо, как здесь.)

Вот рабочий код из моего .emacs:

(defun ag-extend-cperl-font-lock-keywords ()
  (interactive)
  (font-lock-add-keywords
    'cperl-mode
    '(
       (
         "\\($[a-zA-Z_][a-zA-Z_0-9]*->\\){"
         1 'cperl-hash-face t
         )
       (
         "\\($[a-zA-Z_][a-zA-Z_0-9]*->\\)\\["
         1 'cperl-array-face t
         )
       (
         "\\($[a-zA-Z_][a-zA-Z_0-9]*->\\)("
         1 'font-lock-function-name-face t
         )
       )
    t
    )
  )

(ag-extend-cperl-font-lock-keywords)

, дающий

enter image description here

Только для улыбок, пример @ choroba нескольких типов:

enter image description here

Я не решил, должен ли ясоздать отдельные грани для hashrefs, arrayrefs и coderefs.На данный момент, просто используя то же лицо, что и их коллеги без ссылок.Включение -> как часть текста, выделенного цветом, дает некоторое различие между non-ref и ref.

Также я еще не решил, хочу ли я распространяться на различные другие синтаксисы Perl.С https://perldoc.perl.org/perlref.html:

enter image description here

Но теперь, когда у меня есть вызов font-lock-add-Keywords, эти детали я могу исправить на досуге.

0 голосов
/ 30 мая 2018

Вы можете установить cperl-highlight-variables-indiscriminately на t (через его настройку), чтобы скалярные переменные окрашивались не только при объявлении, но и всегда.enter image description here

Использование одного и того же цвета для @ref и $ref сбивает с толку, так как это разные типы переменных (и разные переменные);Точно так же сбивает с толку использование скалярного цвета для $ref, но цвета массива для $ref->[0], поскольку они являются одной и той же переменной.

Кроме того, Perl, будучи Perl, вы бы использовали здесь все три цвета?

if (ref $ref eq 'ARRAY') {
    return $ref->[0]
} elsif (ref $ref eq 'HASH') {
    return $ref->{key}
}
...