Есть ли какой-нибудь модуль или команда, которая позволит мне отправить текущую область в Shell? Я хочу иметь что-то вроде Python-mode "python-send-region", который отправляет выбранную область в текущую рабочую оболочку Python.
Режим Emacs Shell: как отправить регион в оболочку?
Ответ 1
Хорошо, написал легкий бит. Вероятно, потребуется некоторое время, чтобы написать полный второстепенный режим.
В настоящее время следующая функция отправит текущую строку (или область, если знак активен). Очень хорошо для меня:
(defun sh-send-line-or-region (&optional step)
(interactive ())
(let ((proc (get-process "shell"))
pbuf min max command)
(unless proc
(let ((currbuff (current-buffer)))
(shell)
(switch-to-buffer currbuff)
(setq proc (get-process "shell"))
))
(setq pbuff (process-buffer proc))
(if (use-region-p)
(setq min (region-beginning)
max (region-end))
(setq min (point-at-bol)
max (point-at-eol)))
(setq command (concat (buffer-substring min max) "\n"))
(with-current-buffer pbuff
(goto-char (process-mark proc))
(insert command)
(move-marker (process-mark proc) (point))
) ;;pop-to-buffer does not work with save-current-buffer -- bug?
(process-send-string proc command)
(display-buffer (process-buffer proc) t)
(when step
(goto-char max)
(next-line))
))
(defun sh-send-line-or-region-and-step ()
(interactive)
(sh-send-line-or-region t))
(defun sh-switch-to-process-buffer ()
(interactive)
(pop-to-buffer (process-buffer (get-process "shell")) t))
(define-key sh-mode-map [(control ?j)] 'sh-send-line-or-region-and-step)
(define-key sh-mode-map [(control ?c) (control ?z)] 'sh-switch-to-process-buffer)
Enjoy.
Ответ 2
(defun shell-region (start end)
"execute region in an inferior shell"
(interactive "r")
(shell-command (buffer-substring-no-properties start end)))
Ответ 3
M-x append-to-buffer
RET
Ответ 4
Я написал пакет, который отправляет/передает строки или регионы кода в процессы оболочки, в основном что-то похожее на ESS для R. Он также позволяет создавать несколько процессов оболочки и позволяет выбрать, какой из них отправить регион в,
Посмотрите здесь: http://www.emacswiki.org/emacs/essh
Ответ 5
M-x shell-command-on-region
ака.
M-|
Ответ 6
Вы хотите, чтобы команда выполнялась автоматически или просто вводилась в командную строку при подготовке?
M-x append-to-buffer
RET будет вводить выделенный текст в указанный буфер в точке, но команда не будет выполнена оболочкой.
Функция обертки для этого может автоматически выбрать *shell*
для буфера (или более гибко выбрать/запросить на основе текущих буферов в режиме оболочки), а затем вызвать append-to-buffer.
Вы можете тривиально записать макрос клавиатуры, чтобы скопировать регион, переключиться на *shell*
, yank и ввести (если требуется).
F3 M-w C-x b *shell*
RET C-y RET F4
C-x C-k n my-execute-region-in-shell
RET
M-x insert-kbd-macro
RET my-execute-region-in-shell
RET (global-set-key (kbd "C-c e") 'my-execute-region-in-shell)
Ответ 7
Модификация ответа Юргенса выше для работы с конкретным буфером дает следующую функцию, которая отправит регион, а затем переключится на буфер, показывая его в другом окне, для иллюстрации используется буфер с именем PYTHON. Целевой буфер уже должен запускать оболочку.
(defun p-send(start end)
(interactive "r") ;;Make the custom function interactive and operative on a region
(append-to-buffer (get-buffer "*PYTHON*") start end) ;;append to the buffer named *PYTHON*
(switch-to-buffer-other-window (get-buffer "*PYTHON*")) ;;switches to the buffer
(execute-kbd-macro "\C-m")) ;;sends the enter keystroke to the shell
Ответ 8
Вот еще одно решение из этого сообщения.
Просто скопируйте его для удобства. Здесь указан оператор печати.
(add-hook 'python-mode-hook
'my-python-send-statement)
(defun my-python-send-statement ()
(interactive)
(local-set-key [C-return] 'my-python-send-statement)
(end-of-line)
(set-mark (line-beginning-position))
(call-interactively 'python-shell-send-region)
(python-shell-send-string "; print()"))