Emacs 插入样板两次

Emacs 插入样板两次

我有一个条目与找到的条目基本相同这里

(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)

...当我在 OS X 上使用 22.3 时,这一切都运行正常。我刚刚更新到 24.1,现在,每当我创建一个新的 .pl 文件时,样板都会插入两次。我的 .emacs 文件没有改变,所以我想知道是什么原因造成的:钩子被应用了两次吗?(没想到会发生这种情况。)

有人遇到过同样的现象吗,或者可以告诉我如何解决这个问题?

以下是我启动模块时发生的情况。请注意第二个实例是在第一个实例完成之前添加的,即在添加结束的“1;”行之前。

package Foo;

use warnings;
use strict;
# $Id$

package Foo;

use warnings;
use strict;
# $Id$


1;

1;

更新

这似乎是 22.3 和 24.1 附带的 cperl-mode.el 文件中的差异,尽管我不知道具体在哪里。(差异是 1,124 行。)但交换新旧文件(并删除已编译的 .elc 文件)会使行为恢复到我想要的状态。

答案1

(宁愿将其保留为评论 - 但我似乎缺乏代表 - 当给出真正的答案时我会删除这个答案)

似乎有两件事可能发生

  • 在评估您的 .emacs 之后,cperl-mode-hook您的函数会perl-boilerplate在其中列出两次。(如上文评论中所述)
  • 新版本的cperl正在运行cperl-mode-hook两次。

要调试第一种情况,请使用查看打开新文件时CTRL-H v的值,它已使样板加倍。cperl-mode-hook

为了调试第二种情况,您可以向钩子添加另一个函数,用于message打印出一些内容(例如“HELLO from cperl-mode-hook”),然后检查缓冲区*Messsages*以查看访问新文件后看到它多少次。

鉴于当您降级到旧版本的 cperl 时问题似乎消失,因此很可能是第二个问题。

您可能能够通过创建缓冲区局部变量并在插入样板之前检查它是否已设置来解决第二个问题 - 从而防止它被插入两次。

希望这些想法能够有所帮助。

相关内容