2012-06-19 7 views
6

Z prostotą proste pytanie. Korzystanie z trybu CPerl w Emacs 23.4.1 na Windows 7 64, kiedy używam C-c c do uruchamiania skryptu Emacs nie owija ścieżki w cudzysłów, więc wszelkie katalogi ze spacjami powodują, że Perl nie może znaleźć pliku. "C:/Perl64/bin\perl.exe -w g:/foo/bar/first second/myscript.pl" generuje komunikat o błędzie: "Can't open perl script "g:/foo/bar/first": No such file or directory"Perl: Jak mogę zachęcić Emacsa do dodawania cudzysłowów do pełnej ścieżki skryptu Perla?

pytanie: Jak zrobić Emacs używać cytatów przechodząc nazwę pliku do Perl się?

Edytuj: z jakiegoś powodu nie mogę komentować (być może problemu z przeglądarką), więc edytuję oryginalny wpis w odpowiedzi na komentarz z @legoscia: "C-c c uruchamia polecenie-kompilacja". W menu Perl jest oznaczone jako "Uruchom".

+0

'C-c c' wydaje się być niestandardowym wiązaniem. Co otrzymasz, jeśli wpiszesz 'C-h c C-c c'? – legoscia

+1

'mode-compile.el' nie jest standardem. Używasz http://perso.tls.cena.fr/boubaker/distrib/mode-compile.el lub czegoś innego? – phils

+0

@phils Nie celowo używam 'mode-compile.el' - nie pamiętam, żeby go zainstalować, ani nie byłoby mi potrzebne, aby to zrobić bezpośrednio, ponieważ używane są tylko te języki, których używam (R, Perl) . Być może jest to coś, co zostało zainstalowane z ESS ...? Kiedy skrypt Perla znajduje się w buforze, trybem głównym jest CPerl, a trybem podrzędnym jest Abbrev. Nie ma oczywiście nic innego. – SlowLearner

Odpowiedz

2

Dostępna jest tylko wersja mode-compile.el v2.29, ale w tej wersji problem jest dokładnie taki, jak opisujesz, argumenty polecenia kompilacji nie są poprawnie wymazywane i nie ma opcji, aby je włączyć.

To trochę Hack ale powinieneś być w stanie na nowo zdefiniować odpowiednią funkcję z poprawna ucieczce do nazwy pliku w pliku .emacs:

(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))))) 

Linia Zmieniłem zmieniał

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

do

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

pełniejszy fix byłoby również uciec od dbgflags (gdziekolwiek są ustawione, po prostu ucieka cała zmienna nie będzie w porządku) i mc--shell-args, gdy są ustawione.

+1

+1, ale proponuję napisanie do autora i poprawienie go u źródła. p.s. Jeśli przedrostkujesz swój kod elisp z '' Stack Overflow sprawi, że podświetlanie składni będzie poprawne. – phils

+0

Przydatna wskazówka, dzięki, i rzeczywiście, wysyłanie łatek w górę strumienia jest zawsze mądre. –

Powiązane problemy