Как насчет использования shell-quote-argument
(для цитирования любых, возможно, причудливых символов) в результате результата имени- expand-file-name
(чтобы раскрыть ~
, прежде чем он будет заключен в кавычки).
(let ((path "~/Foo Bar/file.tex"))
(shell-quote-argument (expand-file-name path)))
Если ~
не является частью строки до того, как он попадет к вам, вы можете добавить if после использования shell-quote-argument
чтобы оболочка расширилась для вас ~
вместо 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
. Он неправильно обрабатывает пробелы в именах файлов, которые ему даны. Внутренне, он использует заданные имена файлов в качестве шаблонов глобуса вместо реальных имен файлов. Оболочки Unix обычно обрабатывают сглаживание для пользователя, поэтому программы не часто сами включают эту функцию. Возможно, эта функциональность была для пользователей Windows (где оболочка не расширяет шаблоны файлов).
В любом случае, вы можете обойти эту проблему, заключив в кавычки ваше имя файла:
(defun latex-word-count ()
(interactive)
(shell-command (concat "/path/to/texcount.pl "
(shell-quote-argument (concat "'" (buffer-file-name) "'")))))
Или вы можете удалить функциональность globbing из 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)))))