1

Исходя из этого вопроса, команда работает нормально, но ей не нравится, когда в родительской папке есть пробелы в имени. Как я могу получить эти пробелы, которые будут автоматически экранированы?

Я не знаю, является ли это вопросом о perl или о emacs, но, поскольку это следует из вопроса SU, а не вопроса SO, я также задал этот вопрос.

Скажем, файл, который меня интересует в подсчете слов: /home/seamus/Foo Bar/file.tex Я получаю следующую ошибку: файл не найден или не читается: /home /seamus /Foo файл не найден или не читается : Bar /file.tex

[отредактировано, чтобы приблизить ошибку к фактической ошибке, которую я получил]

3 ответа3

1

Как насчет использования 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)))))
0

Вам нужно будет избежать пробелов, поэтому из вашего примера вы напишите в e-lisp:

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

и вы получите:

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

0

Я разработчик TeXcount и недавно наткнулся на это сообщение.

Как уже отмечалось, проблема в TeXcount, поэтому лучшее решение - это исправить TeXcount, а не взломать какое-либо другое решение. У меня есть обновление, доступное на веб-странице TeXcount, на котором, я надеюсь, проблема будет решена:http://folk.uio.no/einarro/TeXcount/download.html

NB. Это временная версия новых веб-страниц, которая может перейти позже, если я решу перейти на новый адрес для TeXcount.

Как уже объяснял Крис, проблема возникла потому, что для разрешения подстановочных знаков в именах файлов под Windows я использовал <@files>, чтобы получить все файлы, и это не понравилось пробелами. В Linux вы можете просто использовать @files без glob (<...>), но я бы хотел, чтобы TeXcount работал и в Windows, поэтому лучшим решением было бы избежать пробелов перед передачей их в glob.

Надеюсь, что это поможет, и если это не так, пожалуйста, свяжитесь со мной, и я посмотрю, смогу ли я помочь ...Я здесь не постоянный, поэтому я могу не заметить вопросы, если они будут опубликованы как ответы.

Поместите этот ответ и в эту ветку, и в оригинальную: не для спама, а для удобства поиска.

Эйнар

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .