Подтвердить что ты не робот

Режим Emacs Shell: как отправить регион в оболочку?

Есть ли какой-нибудь модуль или команда, которая позволит мне отправить текущую область в Shell? Я хочу иметь что-то вроде Python-mode "python-send-region", который отправляет выбранную область в текущую рабочую оболочку Python.

4b9b3361

Ответ 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()"))