2011-06-08 11 views
29

¿Hay algún módulo o comando que me permita enviar la región actual a Shell? Quiero tener algo así como "python-send-region" de Python-mode que envía la región seleccionada al shell de Python actualmente en ejecución.Modo Emacs Shell: ¿cómo enviar la región a la shell?

+0

Buena pregunta. compañero. Estoy buscando lo mismo y no pude encontrar nada excepto su publicación. Encuentra difícil de creer que nadie haya escrito una línea básica y el remitente de regiones al shell actual de shcripts. Buscaré un poco y me escribiré si no encuentro. – VitoshKa

Respuesta

32

Ok, escribió un poco fácil. Probablemente dedique algo de tiempo a escribir un modo menor completo.

Por el momento, la siguiente función enviará la línea actual (o región si la marca está activa). Hace un buen trabajo para mí:

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

+0

Felicitaciones, muchas gracias. Solo una cosa, no estoy seguro de si realmente debido a su diversión (soy nuevo en emacs): la salida no se desplaza automáticamente hacia abajo. – vemv

+5

@vemv, '(setq comint-scroll-to-bottom-on-output t)' resolverá su problema. – VitoshKa

+0

Magia! Obtener una respuesta rápida para una pregunta relativamente vieja es el máximo placer. – vemv

5

M-x shell-command-on-región

aka.

M- |

+5

Eso hace algo diferente: solicita un comando de shell y envía la selección a ese comando. Quiero que la región se envíe directamente a shell (es decir, si destaco "ls" y lo envío, sería lo mismo que pegar "ls" en el búfer * Shell *) –

+0

Esto funciona bien si solo lo canalizas para golpear o cualquier armazón que quieras. Un poco de hack, pero te permite hacerlo sin escribir funciones adicionales. – WLPhoenix

+1

@WLPhoenix ¿puedes detallar por favor? – nicolas

1

¿Desea que el comando se ejecute automáticamente, o simplemente ingrese en la línea de comando en preparación?

M-xappend-to-bufferRET entrará en el texto seleccionado en la memoria intermedia fijada en el punto, pero el comando no sería ejecutado por la cáscara.

Una función de envoltura para eso podría elegir automáticamente *shell* para el búfer (o más inteligentemente seleccionar/solicitar basándose en búferes actuales en modo de shell), y luego llamar a append-to-buffer.

Puede grabar trivialmente una macro de teclado para copiar la región, cambiar a *shell*, yank, y entrar (si es necesario).

F3M-wC-xb*shell*RETC-yRETF4
C-xC-knmy-execute-region-in-shellRET
M-xinsert-kbd-macroRET RETmy-execute-region-in-shell
(global-set-key (kbd "C-c e") 'my-execute-region-in-shell)

11
(defun shell-region (start end) 
    "execute region in an inferior shell" 
    (interactive "r") 
    (shell-command (buffer-substring-no-properties start end))) 
+0

Esto es realmente excelente, me permite replicar la funcionalidad del editor Acme que más me importa. – sea6ear

7

Mxappend-to-bufferRET

6

escribí un paquete que envía/líneas o zonas de código de tuberías para bombardear procesos, básicamente algo similar que ESS es para R. También permite múltiples procesos de shell para existir y le permite elegir a cuál enviar la región.

un vistazo aquí: http://www.emacswiki.org/emacs/essh

+0

¡Hermoso paquete! – Nisba

1

Modificación Jurgens respuesta anterior para operar en un búfer específico da la siguiente función, que enviará la región y luego cambiar a la memoria intermedia, que muestra en otra ventana, el búfer llamado PYTHON se utiliza para la ilustración. El búfer de destino ya debería estar ejecutando un shell.

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

Aquí hay otra solución de this post.

Solo copiándolo para mayor comodidad. La declaración impresa es clave aquí.

(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()")) 
Cuestiones relacionadas