【问题标题】:Emacs Shell mode: how to send region to shell?Emacs Shell 模式:如何将区域发送到 shell?
【发布时间】:2011-06-08 23:47:07
【问题描述】:

是否有一些模块或命令可以让我将当前区域发送到 shell?

我想要像 Python 模式的 python-send-region 这样的东西,它将所选区域发送到当前运行的 Python shell。

【问题讨论】:

  • 好问题。伙伴。我正在寻找同样的东西,除了你的帖子找不到任何东西。很难相信没有人从 sh 脚本向当前 shell 编写基本的行和区域发送者。会搜索一下,如果找不到会自己写。

标签: emacs


【解决方案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)

享受吧。

【讨论】:

  • 脱帽致敬,非常感谢。只有一件事,不确定是否真的因为你的乐趣(我是 emacs 的新手):输出不会自动向下滚动。
  • @vemv, (setq comint-scroll-to-bottom-on-output t) 会解决你的问题。
  • 魔术!快速回答一个相对较老的问题是最终的 SO 乐趣。
【解决方案2】:
(defun shell-region (start end)
  "execute region in an inferior shell"
  (interactive "r")
  (shell-command  (buffer-substring-no-properties start end)))

【讨论】:

  • 这真是太棒了——让我可以复制我最关心的 Acme 编辑器的功能。
【解决方案3】:

我编写了一个包,它可以将代码行或代码区域发送/管道到 shell 进程,基本上类似于 ESS 用于 R 的东西。它还允许存在多个 shell 进程,并让您选择将区域发送到哪个进程.

看看这里:http://www.emacswiki.org/emacs/essh

【讨论】:

  • 漂亮的包裹!
【解决方案4】:

M-x append-to-buffer RET

【讨论】:

    【解决方案5】:

    M-x shell-command-on-region

    又名。

    M-|

    【讨论】:

    • 它做了一些不同的事情——它提示输入一个 shell 命令并将选择发送到该命令。我希望将区域直接发送到 shell(即,如果我突出显示“ls”并发送它,它的行为与将“ls”粘贴到 Shell 缓冲区中的行为相同)
    • 如果您只是将它通过管道传输到 bash 或您想要的任何 shell,这可以正常工作。有点小技巧,但它可以让你在不编写任何额外函数的情况下做到这一点。
    • @WLPhoenix 你能详细点吗?
    【解决方案6】:

    修改上面的 Jurgens 答案以对特定缓冲区进行操作会得到以下函数,它将发送区域然后切换到缓冲区,将其显示在另一个窗口中,名为 PYTHON 的缓冲区用于插图。目标缓冲区应该已经在运行一个 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
    

    【讨论】:

      【解决方案7】:

      您希望命令自动执行,还是只是在准备中输入命令行?

      M-x append-to-buffer RET 将选定的文本输入到指定的缓冲区,但命令不会被shell执行。

      一个包装函数可以自动为缓冲区选择*shell*(或者更智能地选择/提示基于shell模式下的当前缓冲区),然后调用附加到缓冲区。

      您可以简单地记录一个键盘宏来复制该区域,切换到*shell*,拉一下,然后输入(如果需要)。

      F3M-wC-xb*shell*RETC-y RETF4
      C-xC-knmy-execute-region-in-shell RET
      M-xinsert-kbd-macroRETmy-execute-region-in-shellRET
      (global-set-key (kbd "C-c e") 'my-execute-region-in-shell)

      【讨论】:

        【解决方案8】:

        更新
        截至 2020 年年中,上述(出色且有用的)答案看起来有点不完整:sh-mode 具有将 shell 区域发送到非交互式 shell 的功能,并在名为 sh-send-line-or-region-and-step 的迷你缓冲区中输出。

        或者:单击窗口底部模式栏中的Shell-script,然后单击Mouse-1,然后单击Execute region。输出被发送到 minibuffer 和#<*Messages*>

        如果 minibuffer 输出不够,可以参考一些技术将输出重定向到其他缓冲区(不仅是 shell 缓冲区,参见例如 "How to redirect message/echo output to a buffer in Emacs?")。 您也可以使用C-c C-x 执行所有脚本。瞧。

        【讨论】:

          【解决方案9】:

          这是this post 的另一个解决方案。

          只是为了方便而复制它。 print 语句是这里的关键。

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

          【讨论】:

            【解决方案10】:

            我为 ansi-term / sane-term 调整了公认的答案。

            变化:

            1. 在任何地方都将“shell”更改为“ansi-term”
            2. (with-current-buffer pbuff ...) 形式不起作用,因为 line 和 char 模式在终端模式下的工作方式。它会给你一个只读缓冲区错误。在插入修复之前包装插入模式命令以打开切换线,但不需要,因为......
            3. 显然可以单独使用process-send-string形式,术语输出和光标位置反映了变化。
            (defun ansi-term-send-line-or-region (&optional step)
              (interactive ())
              (let ((proc (get-process "*ansi-term*"))
                     pbuf
                     min
                     max
                     command)
                (unless proc
                  (let ((currbuff (current-buffer)))
                    (sane-term)
                    (switch-to-buffer currbuff)
                    (setq proc (get-process "*ansi-term*"))))
            
                (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"))
                (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 "*ansi-term*")) 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)
            

            【讨论】:

              猜你喜欢
              • 2017-07-24
              • 1970-01-01
              • 1970-01-01
              • 2014-02-26
              • 2011-11-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多