2012-06-19 9 views
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"Perl:EmacsにPerlスクリプトのフルパスに引用符を付けるにはどうすればいいですか?

質問:どのように私はPerl自身にファイル名を渡すときにEmacsは引用符を使用作るのですか?

編集:何らかの理由で(ブラウザの問題など)コメントできないため、@legosciaのコメントに応じて元の投稿を編集しています。「コマンドモードコンパイルを実行します。 Perlメニューでは、 "Run"とマークされています。

+0

「C-cc」は非標準的な結合であると思われる。 'C-h c C-c c'と入力するとどうなりますか? – legoscia

+1

'mode-compile.el'は標準ではありません。 http://perso.tls.cena.fr/boubaker/distrib/mode-compile.elなどを使用していますか? – phils

+0

@phils私は意図的に 'mode-compile.el'を使用していません - 私はそれをインストールしようとしている思い出がなく、また私が使用する唯一の言語が解釈されているので直接そうする必要はありません(R、Perl) 。おそらくESSにインストールされたものです...? Perlスクリプトがバッファにあるとき、メジャーモードはCPerlで、マイナーモードはAbbrevです。明らかに異なるものは何もありません。 – SlowLearner

答えて

2

私はmode-compile.el v2.29しか利用できませんが、そのバージョンで問題はあなたが記述した通りです。コンパイルコマンドの引数は正しくエスケープされず、有効にするオプションはありません。

それはハックのビットですが、あなたは正しいあなたの.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も設定されています。

+1

+1ですが、私は作者に書いて、これをソースに固定することをお勧めします。 p.s.あなたのelispコードの前に '<! - language:lang-el - >'をつけると、Stack Overflowは正しい構文の強調表示を得ます。 – phils

+0

本当にありがたいことですが、実際にパッチをアップストリームに送信することは常に賢明です。 –

関連する問題