Режим Emacs Shell: как отправить регион в оболочку? - PullRequest
36 голосов
/ 09 июня 2011

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

Ответы [ 8 ]

40 голосов
/ 14 августа 2011

Хорошо, написал немного. Вероятно, потратит некоторое время на написание полного второстепенного режима.

На данный момент следующая функция отправит текущую строку (или регион, если метка активна). У меня неплохая работа:

(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)

Наслаждайтесь.

11 голосов
/ 09 июня 2011
(defun shell-region (start end)
  "execute region in an inferior shell"
  (interactive "r")
  (shell-command  (buffer-substring-no-properties start end)))
8 голосов
/ 11 декабря 2011

Я написал пакет, который отправляет / передает строки или области кода в процессы оболочки, в основном что-то похожее на то, что ESS для R. Он также позволяет существовать нескольким процессам оболочки и позволяет выбирать, в какой из регионов отправлять регион.,

Посмотрите здесь: http://www.emacswiki.org/emacs/essh

7 голосов
/ 09 сентября 2011

М-х append-to-buffer RET

6 голосов
/ 09 июня 2011

Mx shell-command-on-region

aka.

M- |

2 голосов
/ 21 февраля 2012

Изменение ответа Jurgens выше для работы с конкретным буфером дает следующую функцию, которая отправит регион и затем переключится на буфер, отображая его в другом окне, буфер с именем 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
1 голос
/ 09 июня 2011

Хотите ли вы, чтобы команда выполнялась автоматически или просто вводилась в командную строку при подготовке?

M-x append-to-buffer RET введет выделенный текст в указанный буфер в точке, но команда не будет выполнена оболочкой.

Функция-оболочка для этого может автоматически выбирать *shell* для буфера (или более разумно выбирать / подсказывать на основе текущих буферов в режиме оболочки), а затем вызывать append-to-buffer.

Вы можете тривиально записать макрос клавиатуры, чтобы скопировать регион, переключиться на *shell*, нажать и ввести (если требуется).

F3 Mw Cx б *shell* RET Cy RET F4
* * С тысячей тридцать четыре-х * +1036 * С-к * ** 1038 тысячу тридцать семь * п * ** 1040 тысячу тридцать-девять ** * RET тысячи сорок-одна * ** 1043 тысяча сорок-дв * М-х insert-kbd-macro RET * ** 1 049 1050 * * RET ** тысячи пятьдесят-одна * тысячи пятьдесят две (global-set-key (kbd "C-c e") 'my-execute-region-in-shell)

0 голосов
/ 18 декабря 2014

Вот еще одно решение из этого поста .

Просто скопируйте его для удобства.Здесь ключевым является заявление о печати. ​​

(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()"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...