Làm thế nào về việc sử dụng shell-quote-argument
(để trích dẫn bất kỳ ký tự có thể vui nhộn) trên kết quả của expand-file-name
(để mở rộng ~
, trước khi nó được trích dẫn).
(let ((path "~/Foo Bar/file.tex"))
(shell-quote-argument (expand-file-name path)))
Nếu ~
nó chưa phải là một phần của chuỗi trước khi nó đến với bạn, bạn có thể thêm nếu sau khi sử dụng shell-quote-argument
để shell sẽ mở rộng ~
cho bạn thay vì Emacs:
(let ((path-in-home "Foo Bar/file.tex"))
(concat "~/" (shell-quote-argument path-in-home)))
Câu trả lời cho câu hỏi được tham chiếu của bạn hiển thị bằng cách sử dụng (buffer-file-name)
để lấy tên tệp. Trong trường hợp đó, chỉ cần sử dụng (shell-quote-argument (buffer-file-name))
thay thế. Sẽ không có sự ~
tham gia.
Rõ ràng lỗi của bạn đến từ texcount.pl
. Nó không xử lý đúng các khoảng trắng trong tên tệp được đưa ra. Trong nội bộ, nó đang sử dụng tên tệp đã cho làm mẫu hình cầu thay vì tên tệp thực tế. Các shell Unix thường xử lý toàn cầu cho người dùng, vì vậy các chương trình thường không bao gồm chức năng này. Có thể bit chức năng này là dành cho người dùng Windows (nơi shell không mở rộng các mẫu tệp).
Dù sao, bạn có thể giải quyết vấn đề bằng cách gói các trích dẫn xung quanh tên tệp của bạn:
(defun latex-word-count ()
(interactive)
(shell-command (concat "/path/to/texcount.pl "
(shell-quote-argument (concat "'" (buffer-file-name) "'")))))
Hoặc bạn có thể tách chức năng globalbing ra khỏi 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);
}
Và sử dụng mã hợp lý hơn ở phía elisp:
(defun latex-word-count ()
(interactive)
(shell-command (concat "/path/to/texcount.pl "
(shell-quote-argument (buffer-file-name)))))