Ассоциирование cperl-режима с кодом Perl в emacs

Я пытаюсь связать режим CPerl с исходными файлами Perl в emacs (23.1.1 в CentOS 6).

Если я включу следующую строку в мой.emacs

(defalias 'perl-mode 'cperl-mode)

тогда режим CPerl будет загружен при открытии исходного файла Perl.

Однако следующая строка, которая, кажется, должна работать, приводит к загрузке режима Perl:

(add-to-list 'auto-mode-alist '("\\.p[lm]$" . cperl-mode))

Там нет сообщения об ошибке - он просто загружает режим Perl вместо режима CPerl.

Причина, по которой я спрашиваю, состоит в том, что у меня возникли некоторые проблемы с использованием стиля cperl-set (работает из меню emacs, но не в том случае, если я добавляю его в качестве ловушки в режим CPerl, когда он связан с режимом perl), и я хотел попробовать загрузить режим CPerl напрямую.

Оператор, который я использую в своем.emacs для установки стиля отступа в качестве привязки к режиму CPerl:

(eval-after-load "cperl-mode" 
    add-hook 'cperl-mode-hook (lambda() (cperl-set-style 'C++))))

Это, очевидно, не имеет никакого эффекта, если режим CPerl не загружен (когда я использую подход auto-mode-alist), и не делает правильных действий (кажется, использует стиль отступа GNU), когда я загружаю режим CPerl путем наложения его на режим Perl.

2 ответа

Решение

Вам нужно использовать (cperl-set-style "C++") вместо (cperl-set-style 'C++), Если вы посмотрите на переменную cperl-style-alist (например, с Chv), то вы увидите, что carсостоит из строк, а не символов. Кажется прискорбным, что ваш пример провалился молча, а не выдал ошибку. Большую часть времени я хотел бы знать, что я пытался выбрать несуществующий стиль, но, вероятно, есть веская причина, чтобы он был таким, какой он есть.

M-: (info "(emacs) Choosing Modes") RET

Ваши Perl-скрипты начинаются с #!/usr/bin/perl?

Во-вторых, если нет файловой переменной, задающей основной режим, Emacs проверяет, начинается ли содержимое файла с `#!'. Если это так, это означает, что файл может служить в качестве исполняемой команды оболочки, которая работает, выполняя интерпретатор, названный в первой строке файла (остальная часть файла используется в качестве входных данных для интерпретатора). Поэтому Emacs пытается использовать имя интерпретатора для выбора режима. Например, файл, начинающийся с `#!/ Usr/bin/perl', открывается в режиме Perl. Переменная интерпретатор-mode-alist определяет соответствие между именами программ интерпретатора и основными режимами.

Конечно, по умолчанию это perl-mode:

ELISP> (assoc "perl" interpreter-mode-alist)
("perl" . perl-mode)

Таким образом, вы просто снова используете add-to-list...

(add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
Другие вопросы по тегам