Emacs inserindo o clichê duas vezes

2

Eu tenho uma entrada que é basicamente idêntica à encontrada aqui :

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

... tudo isso funcionou bem quando eu estava usando o 22.3 no OS X. Acabei de atualizar para o 24.1, e agora, sempre que eu crio um novo arquivo .pl, o clichê é inserido duas vezes. Meu arquivo .emacs não mudou, então estou pensando o que causa isso: o gancho está sendo aplicado duas vezes? (Não achei que isso pudesse acontecer.)

Alguém encontra o mesmo fenômeno, ou pode me dizer como consertar isso?

Veja o que acontece quando eu inicio um módulo. Observe como a segunda instância é adicionada antes do primeiro terminar - ou seja, antes de adicionar o fechamento '1;' linha.

package Foo;

use warnings;
use strict;
# $Id$

package Foo;

use warnings;
use strict;
# $Id$


1;

1;

Atualizar

Parece ser uma diferença no arquivo cperl-mode.el fornecido com o 22.3 e 24.1, embora eu não saiba exatamente onde. (O diff é de 1.124 linhas.) Mas trocar os arquivos antigos e novos (e remover o arquivo .elc compilado) retornou o comportamento para o que eu queria.

    
por amp108 19.07.2012 / 03:25

1 resposta

2

(preferiria deixar isso como um comentário - mas parece que não tenho o representante - removerei essa resposta quando uma resposta real for dada)

Parece que uma das duas coisas provavelmente está acontecendo

  • após o seu .emacs ser avaliado cperl-mode-hook tem sua função perl-boilerplate listada nele duas vezes. (como mencionado acima em um comentário)
  • a nova versão do cperl está executando o cperl-mode-hook duas vezes.

Para depurar o primeiro caso, use CTRL-H v para ver o valor de cperl-mode-hook quando você abriu um novo arquivo e ele dobrou o clichê.

Para depurar o segundo caso, você pode adicionar outra função ao hook, que usa message para imprimir algo (como 'HELLO de cperl-mode-hook') e, em seguida, verificar o *Messsages* buffer para ver quantas vezes você veja depois de visitar um novo arquivo.

Dado que o problema parece desaparecer quando você faz o downgrade para a versão antiga do cperl, parece provável que seja o segundo problema.

Você pode consertar o segundo problema criando uma variável local do buffer e verificando se ela está configurada antes de inserir o boilerplate - evitando que seja inserido duas vezes.

Espero que essas ideias sejam úteis.

    
por 27.10.2012 / 20:37

Tags