Escapando espaços no emacs / perl

1

Na sequência de esta questão , o comando funciona bem, mas não gosto quando a pasta pai tem espaços em seu nome. Como obtenho esses espaços para serem automaticamente excluídos?

Eu não sei se esta é uma pergunta sobre o perl ou sobre o emacs, mas como se segue de uma pergunta do SU em vez de uma pergunta SO, também pedi o acompanhamento aqui.

Digamos que o arquivo que me interessa na contagem de palavras é /home/seamus/Foo Bar/file.tex . Recebo o seguinte erro: Arquivo não encontrado ou não legível: / home / seamus / Foo Arquivo não encontrado ou não legível: Bar / file.tex

[editado para tornar o erro mais próximo do erro real que recebi]

    
por Seamus 02.07.2010 / 15:12

3 respostas

1

Que tal usar shell-quote-argument (para citar qualquer caractere possivelmente funky) sobre o resultado de expand-file-name (para expandir o ~ , antes é citado).

(let ((path "~/Foo Bar/file.tex"))
  (shell-quote-argument (expand-file-name path)))

Se o ~ ainda não fizer parte da string antes de chegar até você, você poderá adicionar if depois de usar shell-quote-argument para que o shell expanda ~ para você em vez do Emacs:

(let ((path-in-home "Foo Bar/file.tex"))
  (concat "~/" (shell-quote-argument path-in-home)))

A resposta à sua pergunta referenciada mostra o uso de (buffer-file-name) para obter o nome do arquivo. Nesse caso, use apenas (shell-quote-argument (buffer-file-name)) . Não haverá ~ envolvido.

Aparentemente, seus erros estão vindo de texcount.pl . Ele não manipula corretamente espaços nos nomes de arquivos que são fornecidos. Internamente, ele está usando os nomes de arquivos fornecidos como padrões globais em vez de nomes de arquivos reais. Unix shells normalmente lidam com globbing para o usuário, portanto os programas não costumam incluir essa funcionalidade. Talvez esse pouco de funcionalidade foi para Usuários do Windows (em que o shell não expande os padrões de arquivo).

De qualquer forma, você pode resolver o problema envolvendo aspas em torno do nome do arquivo:

(defun latex-word-count ()
  (interactive)
  (shell-command (concat "/path/to/texcount.pl "
                         (shell-quote-argument (concat "'" (buffer-file-name) "'")))))

Ou você pode extrair as funcionalidades de globbing de texcount.pl :

diff --git i/texcount.pl w/texcount.pl
index 96fac5c..aa96eb4 100755
--- i/texcount.pl
+++ w/texcount.pl
@@ -360,7 +360,7 @@ sub parse_options_output {
 sub parse_file_list {
   my @filelist=@_;
   my $listtotalcount=new_count("TOTAL COUNT");
-  for my $file (<@filelist>) {
+  for my $file (@filelist) {
     my $filetotalcount=parse_file($file);
     add_count($listtotalcount,$filetotalcount);
   }

E use um código mais razoável no lado elisp:

(defun latex-word-count ()
  (interactive)
  (shell-command (concat "/path/to/texcount.pl "
                         (shell-quote-argument (buffer-file-name)))))
    
por 02.07.2010 / 19:07
0

Você precisará escapar dos espaços, então, a partir do seu exemplo, você escreveria no e-lisp:

"~/Foo\ Bar/file.text.pl "

e você conseguiria:

"~/Foo\ Bar/file.text.pl "

    
por 02.07.2010 / 16:14
0

Eu sou o desenvolvedor do TeXcount e descobri essa postagem há pouco tempo.

Como é apontado, o problema é com o TeXcount, então a melhor solução é corrigir o TeXcount em vez de hackear alguma outra solução. Eu tenho uma atualização disponível na página da TeXcount na qual espero que o problema seja resolvido: link

NB: Esta é a versão temporária das novas páginas da web, e pode ser movida mais tarde se eu decidir pelo novo endereço do TeXcount.

Como já foi explicado por Chris, o problema surgiu porque, para permitir caracteres curinga em nomes de arquivos no Windows, eu usei < @ files > para obter todos os arquivos, e isso não gostou dos espaços. No Linux, você poderia simplesmente usar @files sem o glob (< ...), mas eu gostaria que o TeXcount funcionasse no Windows também, então uma solução melhor era escapar dos espaços antes de passá-los para o glob.

Espero que isso ajude, e se isso não acontecer, entre em contato comigo e veremos se posso ajudar ... Não sou regular aqui, por isso talvez eu não note as perguntas se postadas como respostas.

Coloque esta resposta neste tópico e no encadeamento original: não para spam, mas para facilitar a localização.

Einar

    
por 23.07.2010 / 14:20

Tags