我在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*
缓冲区?
答案 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文件,因为我可能会在某个时候更新(您不希望丢失更改)。
修改强>
上一个函数的一个问题是它修改了最后一个编译命令。如果使用compile
或recompile
命令编译代码,这可能会令人讨厌。这是一个修复:
(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")))))