2012-06-19 30 views
6

Câu hỏi phức tạp đơn giản. Sử dụng chế độ CPerl trong Emacs 23.4.1 trên Windows 7 64, khi tôi sử dụng C-c c để chạy tập lệnh Emacs không quấn đường dẫn trong dấu ngoặc kép, vì vậy bất kỳ thư mục nào có dấu cách đều khiến Perl không thể tìm thấy tệp. "C:/Perl64/bin\perl.exe -w g:/foo/bar/first second/myscript.pl" tạo ra thông điệp này lỗi: "Can't open perl script "g:/foo/bar/first": No such file or directory"Perl: Làm thế nào tôi có thể nhận được Emacs để thêm dấu ngoặc kép cho đường dẫn đầy đủ của một tập lệnh Perl?

Câu hỏi: làm thế nào để làm cho Emacs sử dụng dấu ngoặc kép khi đi qua các tên tập tin để Perl bản thân?

Chỉnh sửa: vì một số lý do tôi không thể nhận xét (có thể là sự cố trình duyệt) vì vậy tôi đang chỉnh sửa bài đăng gốc để trả lời nhận xét từ @legoscia: "C-c c chạy chế độ lệnh biên dịch". Trong menu Perl, nó được đánh dấu là "Chạy".

+0

'C-c c' có vẻ là một ràng buộc không chuẩn. Những gì bạn nhận được nếu bạn gõ 'C-h c C-c c'? – legoscia

+1

'mode-compile.el' không phải là tiêu chuẩn. Bạn đang sử dụng http://perso.tls.cena.fr/boubaker/distrib/mode-compile.el hoặc cái gì khác? – phils

+0

@phils Tôi không cố ý sử dụng 'mode-compile.el' - tôi không có hồi ức nào khi cố gắng cài đặt nó và cũng không cần phải làm như vậy trực tiếp vì ngôn ngữ duy nhất tôi sử dụng được diễn giải (R, Perl) . Có lẽ nó là cái gì đó đã được cài đặt với ESS ...? Khi một kịch bản Perl nằm trong bộ đệm, chế độ chính là CPerl và chế độ nhỏ là Abbrev. Không có gì khác rõ ràng là khác. – SlowLearner

Trả lời

2

Tôi chỉ có chế độ biên dịch.el v2.29, nhưng trong phiên bản đó vấn đề chính xác như bạn mô tả, các đối số cho lệnh biên dịch không được thoát đúng cách và không có tùy chọn để bật nó.

Đó là một chút hack nhưng bạn sẽ có thể để xác định lại chức năng có liên quan với đúng thoát cho tên tập tin với điều này trong .emacs tập tin của bạn:

(eval-after-load 'mode-compile 
    '(progn 
    (defun mc--shell-compile (shell dbgflags &optional errors-regexp-alist) 
     ;; Run SHELL with debug flags DBGFLAGS on current-buffer 
     (let* ((shcmd (or (mc--which shell) 
          (error "Compilation abort: command %s not found" shell))) 
      (shfile (or mc--remote-pathname (buffer-file-name) 
          (error "Compilation abort: Buffer %s has no filename" 
           (buffer-name)))) 
      (run-cmd (concat shcmd " " dbgflags " " (shell-quote-argument shfile) " " 
           (setq mc--shell-args 
            (read-string (if mode-compile-expert-p 
                "Argv: " 
                (format "Arguments to %s %s script: " 
                  shfile shell)) 
               mc--shell-args))))) 
     ;; Modify compilation-error-regexp-alist if needed 
     (if errors-regexp-alist 
      (progn 
       ;; Set compilation-error-regexp-alist from compile 
       (or (listp errors-regexp-alist) 
        (error "Compilation abort: In mc--shell-compile errors-regexp-alist not a list.")) 
       ;; Add new regexp alist to compilation-error-regexp-alist 
       (mapcar '(lambda(x) 
         (if (mc--member x compilation-error-regexp-alist) nil 
          (setq compilation-error-regexp-alist 
           (append (list x) 
             compilation-error-regexp-alist)))) 
         errors-regexp-alist))) 
     ;; Run compile with run-cmd 
     (mc--compile run-cmd))))) 

Dòng Tôi đã thay đổi được thay đổi

(run-cmd (concat shcmd " " dbgflags " " shfile " " 

để

(run-cmd (concat shcmd " " dbgflags " " (shell-quote-argument shfile) " " 

Một hoàn chỉnh hơn sửa chữa sẽ được cũng thoát khỏi dbgflags (bất cứ nơi nào chúng được đặt, chỉ cần thoát khỏi toàn bộ biến sẽ không đúng) và mc--shell-args khi chúng được đặt.

+1

+1, nhưng tôi khuyên bạn nên viết thư cho tác giả và khắc phục sự cố này tại nguồn. p.s. Nếu bạn tiền tố mã elisp của bạn với '' Stack Overflow sẽ nhận được cú pháp tô sáng chính xác. – phils

+0

Mẹo hữu ích, cảm ơn, và thực sự, gửi một bản vá ngược dòng luôn luôn là khôn ngoan. –

Các vấn đề liên quan