6

很简单的问题。在 Windows 7 64 上的 Emacs 23.4.1 中使用 CPerl 模式,当我C-c c用来运行脚本时,Emacs 不会将路径括在引号中,因此任何带有空格的目录都会导致 Perl 无法找到该文件。 "C:/Perl64/bin\perl.exe -w g:/foo/bar/first second/myscript.pl" 生成此错误消息: "Can't open perl script "g:/foo/bar/first": No such file or directory"

问题:如何让 Emacs 在将文件名传递给 Perl 时使用引号?

编辑:出于某种原因,我无法发表评论(可能是浏览器问题),所以我正在编辑原始帖子以回应@legoscia 的评论:“Cc c 运行命令模式编译”。在 Perl 菜单中,它被标记为“运行”。

4

1 回答 1

2

我只有 mode-compile.el v2.29 可用,但在那个版本中,问题与您描述的完全一样,编译命令的参数没有正确转义,并且没有启用它的选项。

这有点 hack,但您应该能够重新定义相关函数,并在文件中正确转义文件名.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)))))

我改变的线路正在改变

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

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

一个更完整的解决方法是同时转义dbgflags(无论它们在哪里设置,只是转义整个变量都是不对的)以及mc--shell-args它们也被设置的时候。

于 2012-06-23T14:50:24.937 回答