2

У меня есть запись, которая в основном идентична найденной здесь:

(defun perl-boilerplate ()
  (if (not (file-exists-p (buffer-file-name (current-buffer))))
      (cond 
       ((string-match "\.pl$" buffer-file-name)
        (insert
         "#!/usr/local/bin/perl\nuse warnings;\nuse strict;\n"))
       ((string-match "\\([^/]*\\)\.pm$" buffer-file-name)
        (insert
         (concat "package " (match-string 1 buffer-file-name)
                 ";\n\nuse warnings;\nuse strict;\n\n1;\n"))
        (backward-char 4)))))

(add-hook 'cperl-mode-hook 'perl-boilerplate)

... все это работало нормально, когда я использовал 22.3 на OS X. Я только что обновил до 24.1, и теперь, когда я создаю новый файл .pl, шаблон вставляется дважды. Мой файл .emacs не изменился, поэтому мне интересно, что вызывает это: хук применяется дважды? (Не думал, что это может произойти.)

Кто-нибудь сталкивался с таким же явлением, или может подсказать, как это исправить?

Также

Вот что происходит, когда я запускаю модуль. Обратите внимание, как второй экземпляр добавляется до того, как заканчивается первый, т. Е. До того, как он добавляет закрывающий '1;' линия.

package Foo;

use warnings;
use strict;
# $Id$

package Foo;

use warnings;
use strict;
# $Id$


1;

1;

Обновить

Кажется, это разница в файле cperl-mode.el, который поставляется с 22.3 и 24.1, хотя я точно не знаю, где. (Разница составляет 1124 строки.) Но выгрузка старых и новых файлов (и удаление скомпилированного файла .elc) вернули поведение к тому, что я хотел.

1 ответ1

2

(лучше оставить это как комментарий - но мне, кажется, не хватает представителя - я удалю этот ответ, когда будет дан реальный ответ)

Кажется, одна из двух вещей, вероятно, происходит

  • после того, как ваш .emacs будет оценен, cperl-mode-hook дважды включит в него вашу функцию perl-boilerplate . (как указано выше в комментарии)
  • новая версия cperl дважды запускает cperl-mode-hook .

Для отладки первого случая используйте CTRL-H v чтобы увидеть значение cperl-mode-hook когда вы открыли новый файл, и он удвоил шаблон.

Чтобы отладить второй случай, вы можете добавить еще одну функцию в ловушку, которая использует message для распечатки чего-либо (например, 'HELLO from cperl-mode-hook'), затем проверьте буфер *Messsages* чтобы увидеть, сколько раз вы видите его после посещения новый файл.

Учитывая, что проблема, похоже, исчезает, когда вы переходите на старую версию cperl, тогда, скорее всего, это вторая проблема.

Возможно, вам удастся решить вторую проблему, создав буферную локальную переменную и проверив, установлена ли она перед вставкой шаблонной таблицы - таким образом, предотвращая ее вставку дважды.

Надеюсь, что эти идеи полезны.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .