Запуск моно exe-файла в режиме emacs / Fsharp - PullRequest
4 голосов
/ 01 июня 2011

Я использую Режим Fsharp в Emacs.Ключ ^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 ]

4 голосов
/ 01 июня 2011

Вы можете попробовать изменить последнюю строку на:

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

но я не проверял это.

3 голосов
/ 01 июня 2011

Вы можете переопределить fsharp-run-исполняемый файл и использовать его вместо этого:

(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 для постоянного изменения). Обратите внимание, что вам не следует изменять файл 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")))))
...