Запуск интерактивного скрипта Python из Emacs - PullRequest
8 голосов
/ 17 февраля 2012

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

В любом случае, я сейчас работаю над сценарием Python, который требует ввода данных пользователем (подкласс cmd.Cmd).В vim, если бы я захотел попробовать, я мог просто сделать :!python % и затем мог взаимодействовать со своим сценарием, пока он не завершится.В emacs я попытался M-! python script.py, который действительно запускал бы скрипт в отдельном буфере, но тогда RETURNs, похоже, не отправлялись обратно в скрипт, а вместо этого перехватывались буфером emacs.Я также попытался взглянуть на C-c C-c в python-mode, но он запускает скрипт во временном каталоге, тогда как я просто хочу запустить его в (pwd).

Итак, есть ли канонический способ?делать это?

Ответы [ 6 ]

4 голосов
/ 17 февраля 2012

Я не знаю о каноническом , но если бы мне нужно было взаимодействовать со сценарием, я бы сделал M - x shell RET и запустите скрипт оттуда.

Также есть M - x terminal-emulator для более серьезной эмуляции терминала, а не только для оболочки.

3 голосов
/ 17 февраля 2012

Мне нравится использовать команду Emacs «compile» для тестирования / запуска моих скриптов на python.M - X compile RET вызовет «make -k» по умолчанию, но если вы удалите его и вставите в командную строку для вашего скрипта (включая опции), последующие «compiles» предоставят новый «compile»"Команда автоматически.Весь вывод вашего скрипта появится в буфере компиляции.(В отличие от оболочки, это обеспечивает хороший чистый буфер каждый раз, когда он вызывается. Хорошо подходит для поиска и тому подобное. Если вы забудете сохранить свой скрипт перед запуском, компиляция спросит вас, хотите ли вы сохранить файл.)

Вы потеряете командную строку при перезапуске Emacs.Но вы можете заставить Emacs установить команду компиляции для буфера, содержащего ваш скрипт, поместив в конец скрипта python такой код (фактически комментарий python):

 # Trigger emacs to run this script using the "compile" command
 # ;;; Local Variables: ***
 # ;;; compile-command: "my_cool_script.py --complicated_option some_filename.txt" ***
 # ;;; end: ***

Это удобно дляскрипты со сложными вызовами.Примечание: символ комментария python '#' защищает это от интерпретатора python, в то время как Emacs знает, как установить эти переменные, потому что он смотрит внизу каждого файла, когда открывает их.

Мне бы хотелось иметь возможность перейти к «ошибкам компиляции» в моем скрипте python, как это делает команда компиляции, когда вы используете ее для компиляции кода на C, но мне лень создавать регулярное выражение Emacsчтобы сделать эту работу.Возможно, это заставит задуматься о переполнении стека!

2 голосов
/ 30 октября 2015

В настоящее время я использую эти ловушки для определения моих команд компиляции:

(defun convert-filename-to-executable (file)
  (if (eq system-type 'windows-nt)
      (concat (file-name-sans-extension file) ".exe")
    ;; linux
    (concat "./" (file-name-sans-extension file))))


(add-hook 'c++-mode-hook
          (lambda ()
            (unless (file-exists-p "Makefile")
              (set (make-local-variable 'compile-command)
                   (let* ((file (file-name-nondirectory buffer-    file-name))
                      (executable (convert-filename-to-executable file)))
                 (concat "g++ -g -Wall -o "
                         (file-name-sans-extension file)
                         " "
                         file
                         " && "
                         executable))))))

(add-hook 'c-mode-hook
      (lambda ()
        (unless (file-exists-p "Makefile")
          (set (make-local-variable 'compile-command)
               (let* ((file (file-name-nondirectory buffer-file-name))
                      (executable (convert-filename-to-executable file)))
                 (concat "gcc -g -ansi -Wall -Wpedantic -Wextra -Wc++-compat -Wconversion -o "
                         (file-name-sans-extension file)
                         " "
                         file
                         " && "
                         executable))))))    
(add-hook 'python-mode-hook
          (lambda ()
              (set (make-local-variable 'compile-command)
                   (concat "python " buffer-file-name))))

(add-hook 'perl-mode-hook
          (lambda ()
              (set (make-local-variable 'compile-command)
                   (concat "python " buffer-file-name))))

Вместе с этой лямбдой установлен интерактивный вызов функции компиляции:

(global-set-key (kbd "<f4>") (lambda () (interactive) (setq current-prefix-arg '(4)) (call-interactively 'compile)))

Одна кнопкауправляйте ими всеми!

Если вы нажмете F4 (в моем случае вы можете самостоятельно установить ключ в лямбда-выражении для global-set-key), то файл откроется в C ++ илиРежим C будет скомпилирован, и файл в режиме Python или Perl будет запущен (интерактивно)

1 голос
/ 18 февраля 2012

Я думаю, что ansi-term имеет самую точную эмуляцию терминала.Но я не вижу способа передать аргументы процессу.Конечно, вы можете просто запустить его из оболочки внутри буфера ansi-term.

Но я думаю, что лучше всего не использовать python-send-buffer, а вместо этого использовать новую функцию, которая это делает "правильно ", то есть путем отправки пути к текущему файлу вместо создания временного файла.Конечно, есть некоторые небольшие отличия в том, что вы должны сначала сохранить текущий файл, но следующее должно, по крайней мере, привести вас на правильный путь.

(defun python-send-file ()
  (interactive)
  (save-buffer)
  (python-send-string (concat "execfile('" (buffer-file-name) "')")))

;; This overwrites the `python-send-buffer' binding so you may want to pick another key
(eval-after-load "python" 
  (define-key python-mode-map "\C-c\C-c" 'python-send-file))

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

  • Cq TAB всегда даст вам буквенную вкладку
  • Вы можете привязать вкладку к буквальной вкладке в inferior-python-mode-map:

    (define-key inferior-python-mode-map "\C-i" 'self-insert-command)
    
  • Я уверен, что есть другие, о которых я не могу думать

0 голосов
/ 11 июля 2015

Если вы используете C-c C-c, создается буфер (ищите inferior-python). Попробуйте изменить этот буфер *, каждый раз, когда вы нажимаете C-c C-c, результат отображается там, вы должны увидеть этот буфер, чтобы получить результаты. Используйте C-x 2, чтобы вы могли видеть оба буфера одновременно. Также попробуйте C-c C-z (переключиться на оболочку).

* Я использую Ibuffer для управления буферами, это очень хорошо. (кстати, http://tuhdo.github.io/index.html - отличное место для изучения некоторых emacs)

РЕДАКТИРОВАТЬ: Вы пробовали C-C C-P?

0 голосов
/ 19 февраля 2012

Еще один вариант:

Использование C-c C-c прекрасно работает с fgallina's python.el - pwd будет местоположением файла буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...