Я пытался найти способ эффективно сохранить программу, скомпилировать ее и затем запустить в 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 работать для программ пользовательского ввода.
Спасибо!
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 или связав его с ключом.
Других решений пока нет …