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