继这个问题该命令运行正常,但它不喜欢父文件夹名称中有空格。如何让这些空格自动转义?
我不知道这是关于 perl 还是 emacs 的问题,但由于它源自 SU 问题而不是 SO 问题,所以我也在这里询问了后续问题。
假设我对文件字数统计感兴趣,/home/seamus/Foo Bar/file.tex
我会收到以下错误:文件未找到或无法读取:/home/seamus/Foo 文件未找到或无法读取:Bar/file.tex
[编辑以使错误更接近我得到的实际错误]
答案1
如何在(扩展)的shell-quote-argument
结果上使用(引用任何可能奇怪的字符)expand-file-name
~
前被引用)。
(let ((path "~/Foo Bar/file.tex"))
(shell-quote-argument (expand-file-name path)))
如果~
在到达您之前, 还不是字符串的一部分,您可以在使用之后添加 if,shell-quote-argument
这样 shell 就会~
为您扩展,而不是 Emacs:
(let ((path-in-home "Foo Bar/file.tex"))
(concat "~/" (shell-quote-argument path-in-home)))
您所引用问题的答案显示使用(buffer-file-name)
来获取文件名。在这种情况下,只需使用(shell-quote-argument (buffer-file-name))
即可。不会~
涉及任何内容。
显然您的错误来自texcount.pl
。它无法正确处理给定文件名中的空格。在内部,它使用给定的文件名作为 glob 模式,而不是实际文件名。Unix shell 通常为用户处理 glob,因此程序本身通常不包含此功能。也许这个功能是为 Windows 用户提供的(shell 不会扩展文件模式)。
无论如何,您可以通过在文件名周围加上引号来解决该问题:
(defun latex-word-count ()
(interactive)
(shell-command (concat "/path/to/texcount.pl "
(shell-quote-argument (concat "'" (buffer-file-name) "'")))))
或者你可以把通配符功能从以下代码中删除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);
}
并在elisp端使用更合理的代码:
(defun latex-word-count ()
(interactive)
(shell-command (concat "/path/to/texcount.pl "
(shell-quote-argument (buffer-file-name)))))
答案2
您需要转义空格,因此从您的示例来看,您可以在 e-lisp 中写入:
“〜/ Foo \\ Bar / file.text.pl”
你会得到:
“〜/ Foo \ Bar /文件.text.pl”
答案3
我是 TeXcount 的开发人员,不久前偶然看到了这篇帖子。
正如所指出的,问题出在 TeXcount 上,因此最好的解决方案是修复 TeXcount,而不是破解其他解决方案。我在 TeXcount 网页上提供了一个更新,希望问题能得到解决: http://folk.uio.no/einarro/TeXcount/download.html
注意:这是新网页的临时版本,如果我决定为 TeXcount 更换新地址,它可能会稍后移动。
正如 Chris 已经解释的那样,问题出现的原因是,为了允许在 Windows 下使用文件名中的通配符,我使用了 <@files> 来获取所有文件,但这并不喜欢空格。在 Linux 中,您可以直接使用 @files 而不使用 glob(<...>),但我希望 TeXcount 也能在 Windows 中工作,因此更好的解决方案是在将空格传递给 glob 之前对其进行转义。
希望这会有所帮助,如果没有帮助,请联系我,我会看看是否可以提供帮助...我不是这里的常客,所以如果以回复形式发布,我可能不会注意到问题。
已将此回复放在此主题和原始主题中:不是为了发送垃圾邮件,而是为了方便查找。
艾纳尔