在 emacs/perl 中转义空格

在 emacs/perl 中转义空格

这个问题该命令运行正常,但它不喜欢父文件夹名称中有空格。如何让这些空格自动转义?

我不知道这是关于 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 之前对其进行转义。

希望这会有所帮助,如果没有帮助,请联系我,我会看看是否可以提供帮助...我不是这里的常客,所以如果以回复形式发布,我可能不会注意到问题。

已将此回复放在此主题和原始主题中:不是为了发送垃圾邮件,而是为了方便查找。

艾纳尔

相关内容