LINUX.ORG.RU

[emacs] нужно написать скрипт

 


0

0

Сам лисп не знаю, по этому нужна помощь. Использую скрипт для компиляции, найденый на просторах инета: (defun user-save-and-make-all () "save and call compile as make all" (interactive) (save-buffer) (compile "make -k") (message "make -k executed!")) забиндил на него клавиши, и хотелось бы дописать еще что бы при удачной компиляции открывалась внешняя консоль (eshell не нравится) отрабатывалась команда и закрывалась консоль. т.е что то типа make запуск консоли ./имя программы в консоли exit Вот не знаю как жто указать емаксу. Буду рад помощи.


(defun user-save-and-make-all-with-ext-command () 
  "save and call compile as make all"
  (interactive) 
  (save-buffer)
  (compile "make -k")  
  (shell-command-to-string "xterm -e \"./somecommand\"")
  (message "make -k executed!"))

Так?

Sectoid ★★★★★
()
Ответ на: комментарий от Sectoid

хмм. консоль открывается, но тут же закрывается. В программе написал std::cin >> a; в обычной консоли все хорошо, а тут консоль не ждет пока я что нибудь введу. Но суть правильная, сейчас может сам додумаюсь, я про shell-command не знал.

n4ela
() автор топика
Ответ на: комментарий от n4ela

А все понял, поменял somecommand на имя своей программы, работает как надо. Вот только теперь вопрос, можно ли что бы имя само подставлялось. Скажем из мейк файла поля target, TARGET = main что бы подставлялось main

n4ela
() автор топика
Ответ на: комментарий от Sectoid

я бы вместо
(compile "make -k")
написал
(call-interactively 'compile)
это вызывает компилятор, записанный
в переменной compile-command
А по умолчанию значение переменной равно "make -k"

h1t
()
Ответ на: комментарий от n4ela

(defun get-target-filename (makefile &optional key-name)
  (with-current-buffer (find-file makefile t)
    (let ((real-key-name (if key-name key-name "TARGET"))
          target)
      (when (re-search-forward (concat "" real-key-name "\\s +=\\s +\\([a-zA-Z0-9|\\.]+\\)") nil t nil)
        (setq target (match-string 1)))
      (kill-buffer (current-buffer))
      target)))


(defun user-save-and-make-all () 
  "save and call compile as make all"
  (interactive) 
  (save-buffer)
  (call-interactively 'compile)
  (shell-command-to-string (concat "xterm -e \"./" (get-target-filename (concat compilation-directory "/Makefile")) "\""))
  (message "make -k executed!"))

Как-то так.

Sectoid ★★★★★
()
Ответ на: комментарий от Sectoid

Йа идиот. Даже так:

(defun get-target-filename (makefile &optional key-name)
  (with-current-buffer (find-file makefile t)
    (let* ((real-key-name (if key-name key-name "TARGET"))
           (target (when (re-search-forward (concat "" real-key-name "\\s +=\\s +\\([a-zA-Z0-9|\\.]+\\)") nil t nil)
                     (match-string 1))))      
      (kill-buffer (current-buffer))
      target)))

Sectoid ★★★★★
()
Ответ на: комментарий от Sectoid

Спасибо большое. То что нужно

n4ela
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.