2012-06-19 13 views
6

Pregunta embarazosamente simple. Usando el modo CPerl en Emacs 23.4.1 en Windows 7 64, cuando uso C-c c para ejecutar el script, Emacs no ajusta la ruta entre comillas, por lo que cualquier directorio con espacios hace que Perl no pueda encontrar el archivo. "C:/Perl64/bin\perl.exe -w g:/foo/bar/first second/myscript.pl" genera este mensaje de error: "Can't open perl script "g:/foo/bar/first": No such file or directory"Perl: ¿Cómo puedo hacer que Emacs agregue comillas a la ruta completa de un script de Perl?

Pregunta: ¿cómo puedo hacer Emacs usar comillas cuando se pasa el nombre del archivo a Perl en sí?

Editar: por alguna razón no puedo comentar (tal vez un problema con el navegador) por lo que estoy editando la publicación original en respuesta al comentario de @legoscia: "C-c c ejecuta el comando mode-compile". En el menú de Perl, está marcado como "Ejecutar".

+0

'C-c c' parece ser una unión no estándar. ¿Qué obtienes si escribes 'C-h c C-c c'? – legoscia

+1

'mode-compile.el' no es estándar. ¿Estás usando http://perso.tls.cena.fr/boubaker/distrib/mode-compile.el o algo más? – phils

+0

@phils No estoy usando intencionalmente 'mode-compile.el' - No recuerdo haber intentado instalarlo ni habría necesidad de hacerlo directamente ya que los únicos idiomas que uso son interpretados (R, Perl) . Tal vez es algo que se instaló con ESS ...? Cuando una secuencia de comandos de Perl está en el búfer, el modo principal es CPerl y el modo secundario es Abrev. No hay nada más obviamente diferente. – SlowLearner

Respuesta

2

Solo tengo mode-compile.el v2.29 disponible, pero en esa versión el problema es exactamente como usted lo describe, los argumentos para el comando de compilación no se escapan correctamente, y no hay ninguna opción para habilitarlo.

Es un poco de truco, pero usted debería ser capaz de redefinir la función correspondiente con la correcta escape para el nombre de archivo con esto en su .emacs archivo:

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

La línea cambié estaba cambiando

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

a

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

Una solución más completa sería también Escape del dbgflags (donde sea que estén configurados, solo escapando toda la variable no estará bien) y mc--shell-args cuando están configurados también.

+1

+1, pero le sugiero que escriba al autor y que lo solucione en la fuente. PD. Si prefije su código de elisp con '' Stack Overflow obtendrá el resaltado de sintaxis correcto. – phils

+0

Consejo útil, gracias, y de hecho, enviar un parche corriente arriba siempre es prudente. –

Cuestiones relacionadas