在emacs / Fsharp模式下启动mono exe文件

时间:2011-05-31 21:47:07

标签: emacs f# elisp

我在emacs中使用Fsharp mode^C x的密钥映射到Run ...命令,如下所示。

(defun fsharp-run-executable-file ()
  (interactive)
  (let ((name (buffer-file-name)))
    (if (string-match "^\\(.*\\)\\.\\(fs\\|fsi\\)$" name)
        (shell-command (concat (match-string 1 name) ".exe")))))

问题是它试图运行bash something.exe,而我需要运行mono something.exe命令。我收到了/bin/bash ...exe: cannot execute binary file的错误消息。

如何启动新的elisp命令来启动mono,然后将结果显示给*compilation*缓冲区?

2 个答案:

答案 0 :(得分:4)

您可以尝试将最后一行更改为:

(shell-command (concat "mono " (match-string 1 name) ".exe")))))

但我没有测试过这个。

答案 1 :(得分:3)

您可以重新定义fsharp-run-executable-file并改为使用此文件:

(defun fsharp-run-executable-file ()
  (interactive)
  (let ((name (buffer-file-name)))
    (if (string-match "^\\(.*\\)\\.\\(fs\\|fsi\\)$" name)
        (compile (concat "mono " (match-string 1 name) ".exe")))))

有两个变化:1)命令前的concat mono(如petebu所写); 2)使用compile函数,使输出位于*compilation*缓冲区。

要快速测试,只需评估上述功能(将其添加到Emacs init文件中以进行永久性更改)。请注意,您不应该修改fsharp.el文件,因为我可能会在某个时候更新(您不希望丢失更改)。

修改

上一个函数的一个问题是它修改了最后一个编译命令。如果使用compilerecompile命令编译代码,这可能会令人讨厌。这是一个修复:

(defun fsharp-run-executable-file ()
  (interactive)
  (let ((name (buffer-file-name)))
    (if (string-match "^\\(.*\\)\\.\\(fs\\|fsi\\)$" name)
        (compilation-start (concat "mono " (match-string 1 name) ".exe")))))