Windows — один ярлык для сохранения-компиляции-выполнения C ++ программы в Emacs?

Я пытался найти способ эффективно сохранить программу, скомпилировать ее и затем запустить в emacs. Мне это удалось только частично.

Я использую smart-compile.el, чтобы облегчить работу ( http://emacswiki.org/emacs/smart-compile.el ).
В этом я отредактировал соответствующую часть C ++ для ниже, так что программа компилируется и запускается, когда я набираю M-x smart-compile RET с последующим RET,

(defcustom smart-compile-alist '(
;; g++-3 is used instead of g++ as the latter does not
;; work in Windows. Also '&& %n' is added to run the
;; compiled object if the compilation is successful
("\\.[Cc]+[Pp]*\\'" . "g++-3 -O2 -Wall -pedantic -Werror
-Wreturn-type %f -lm -o %n && %n")
..

В качестве примера, для программы sqrt.cpp, smart-compile auto генерирует следующую команду compile:

g++-3 -O2 -Wall -pedantic -Werror -Wreturn-type sqrt.cpp -lm -o sqrt && sqrt

Это работает, пока мой .cpp не имеет каких-либо cin заявление. Для кодов с cin В этом окне консоли отображается точка, в которую пользователь должен вводить данные. Но я ничего не могу ввести, и статус «Компиляции» не работает.

Чтобы заставить коды с пользовательским вводом работать, я должен удалить && FILENAME часть, а затем запустить вручную ./FILENAME в Emacs ‘ eshell,

Я использую Emacs 24.3 в Windows. У меня установлен Cygwin и его бин добавлен в переменную среды Windows Path (поэтому компиляция g ++ — 3 работает).

Я был бы признателен, если бы кто-нибудь смог мне подсказать, как сохранить-компилировать-запустить пользовательский ввод требуемых .cpp-программ в emacs с помощью одной команды. Или, по крайней мере, как мне нужно изменить вышеупомянутую команду g ++ — 3, чтобы заставить compile + run работать для программ пользовательского ввода.

Спасибо!

1

Решение

Emacs программируется, поэтому, если что-то требует двух шагов, вы можете написать команду, которая объединяет их. Простой код будет выглядеть так:

(defun save-compile-execute ()
(interactive)
(smart-compile 1)                          ; step 1: compile
(let ((exe (smart-compile-string "%n")))   ; step 2: run in *eshell*
(with-current-buffer "*eshell*"(goto-char (point-max))
(insert exe)
(eshell-send-input))
(switch-to-buffer-other-window "*eshell*")))

Приведенный выше код прост, но у него есть один недостаток: он не ожидает завершения компиляции. поскольку smart-compile не поддерживает флаг для синхронной компиляции, это должно быть достигнуто путем временного подключения к compilation-finish-functions, что делает код более сложным:

(require 'cl)  ; for lexical-let

(defun do-execute (exe)
(with-current-buffer "*eshell*"(goto-char (point-max))
(insert exe)
(eshell-send-input))
(switch-to-buffer-other-window "*eshell*"))

(defun save-compile-execute ()
(interactive)
(lexical-let ((exe (smart-compile-string "./%n"))
finish-callback)
;; when compilation is done, execute the program
;; and remove the callback from
;; compilation-finish-functions
(setq finish-callback
(lambda (buf msg)
(do-execute exe)
(setq compilation-finish-functions
(delq finish-callback compilation-finish-functions))))
(push finish-callback compilation-finish-functions))
(smart-compile 1))

Команду можно запустить с М-х save-compile-execute RET или связав его с ключом.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector