定型句を2回挿入するEmacs


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)

OS Xで22.3を使用していたときは、これはすべてうまくいきました。24.1にアップデートしたところです。新しい.plファイルを作成するたびに、定型句が2回挿入されます。私の.emacsファイルは変更されていないので、これが何を引き起こすのか疑問に思います。フックが2回適用されているのでしょうか。 (それが起こる可能性があるとは思わなかった。)

誰もが同じ現象に遭遇する、またはこれを修正する方法を教えてもらえますか?

また

これは私がモジュールを起動したときに起こることです。 2番目のインスタンスが最初のインスタンスが終了する前に、つまり最後の '1;'が追加される前に、どのように追加されるかに注意してください。ライン。

package Foo;

use warnings;
use strict;
# $Id$

package Foo;

use warnings;
use strict;
# $Id$


1;

1;

更新

22.3と24.1に同梱されているcperl-mode.elファイルの違いと思われますが、正確にはどこにあるかわかりません。 (diffは1,124行です。)しかし、古いファイルと新しいファイルを交換する(そしてコンパイルされた.elcファイルを削除する)と、動作は私の望むものに戻りました。


コメントアウトするとどうなりますか add-hook ライン?
choroba

add-hookをコメントアウトしても、定型句はまったく追加されません。
amp108

.emacsファイルが2回評価されているように見えるため、定型句が2回フックに追加されています。なぜこれが起こるのか私にはわかりません。
choroba

回答:


2

(むしろこれをコメントとして残しておきたいのですが、担当者がいないようです - 本当の答えが出たらこの答えを削除します)

2つのうちどちらかが起こっているようです

  • あなたの.emacsが評価された後 cperl-mode-hook あなたがいます perl-boilerplate それに二度リストされている機能。 (コメントで上述したように)
  • 新しいバージョンのcperlが動作しています。 cperl-mode-hook 二度。

最初のケースをデバッグするには CTRL-H v の価値を見るため cperl-mode-hook あなたが新しいファイルを開いて、それが定型書を倍増したとき。

2番目のケースをデバッグするには、フックに別の関数を追加します。 message 何かを印刷するには( 'HELLO from cperl-mode-hook'のように)、 *Messsages* 新しいファイルを訪問した後に何回それを見るかを見るためのバッファ。

あなたがcperlの古いバージョンにダウングレードするとき問題が消えるように思われるならそれはそれが2番目の問題である可能性が高いようです。

2番目の問題は、buffer-local-variableを作成し、定型句を挿入する前にそれが設定されているかどうかをチェックすることで解決できる場合があります。

これらのアイデアが役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.