在 IPython 模式下更改 Emacs “将代码发送到解释器” C-c C-r 命令

Change the Emacs “send code to interpreter” C-c C-r command in IPython-mode

这里的问题与 Change the "send code to interpreter" (C-c |) command in python-mode 相关(但不完全相同)并且是互补的。

我在 Mac 10.9.5、Emacs 24.4、Python 2.7.8 和 IPython 2.2.0 上工作。

我的想法是将 C-c C-r emacs 命令更改为 IPython 模式下的 region/line 代码发送到 C-RET,就像使用 R 时一样。这是因为我通常使用 R,但从现在开始,我将使用 R 和 Python(特别是 IPython,我非常喜欢),以及 C-RET——已经发送R-- 中的代码命令对我来说似乎更舒服。

在这个问题开头引用的 link 中,他们建议将以下行添加到 .emacs 文件中,以将 C-c | 命令更改为 C-c C-r

(eval-after-load "python"
  '(progn
     (define-key python-mode-map (kbd "C-c C-r") 'python-shell-send-region)))

目前,我的 .emacs 文件中的 python/IPython 配置如下所示:

;; Enable Python
(add-to-list 'load-path "/sw/lib/python-mode-1.0")
(load "python-mode")
(setq auto-mode-alist
      (cons '("\.py$" . python-mode) auto-mode-alist))
(setq interpreter-mode-alist
  (cons '("python" . python-mode)
        interpreter-mode-alist))
(autoload 'python-mode "python-mode" "Python editing mode." t)

;; Ipython. This python-mode takes the Key-map and the menu
(when (executable-find "ipython")
  (setq
   python-shell-interpreter "ipython"
   python-shell-interpreter-args ""
   python-shell-prompt-regexp "In \[[0-9]+\]: "
   python-shell-prompt-output-regexp "Out\[[0-9]+\]: "
   python-shell-completion-setup-code
   "from IPython.core.completerlib import module_completion"
   python-shell-completion-module-string-code
   "';'.join(module_completion('''%s'''))\n"
   python-shell-completion-string-code
   "';'.join(get_ipython().Completer.all_completions('''%s'''))\n"))

这是两个并行运行的 python 模式,第二个模式(IPython,我一直使用的模式)采用键映射和菜单(顺便说一句,任何欢迎提出更好配置的建议。IPython 部分基于:How to open IPython interpreter in emacs?)。

我尝试在我的python配置的末尾添加之前描述的(eval-after-load "python" '(progn ...命令(当然,将C-c C-r更改为C-RETC-ret 甚至 C-<return>)。

我也在 when (executable-find "ipython") ... 块中以不同的形式尝试过(例如 (define-key python-mode-map (kbd "C-c C-r") 'python-shell-send-region) )。但似乎没有任何效果。

因此,我的问题是:鉴于我的 Python/IPython 配置,我必须在 .emacs 文件中包含什么才能将 C-c C-r 命令更改为 (C-RET)

非常感谢!

使用(kbd "RET")

试试 python.el

(eval-after-load "python"
  '(define-key python-mode-map [(control c)(kbd "RET")] 'python-shell-send-region))

WRT python-mode.el:

(eval-after-load "python-mode"
  '(define-key python-mode-map [(control c) (kbd "RET")] 'py-execute-region))

顺便说一句,除非需要 IPython-exclusiv 功能,否则建议通过通用 Python 从 Emacs 执行代码。 IPython 实现了一堆很酷的东西,可能看起来与 Emacs 正交,Emacs 也实现了一堆很酷的东西。

这里是快速制作的东西,可以发送 python 行到 python-shell。我也经常在 R 中这样做。它还没有完全自动化,但我可能会有用。

这里还有一些有待完成:

  1. 如有必要,将行发送到专用进程

  2. 分配本地密钥

    (defun my-python-line ()
     (interactive)
      (save-excursion
      (setq the_script_buffer (format (buffer-name)))
      (end-of-line)
      (kill-region (point) (progn (back-to-indentation) (point)))
      ;(setq the_py_buffer (format "*Python[%s]*" (buffer-file-name)))
      (setq the_py_buffer "*Python*")
      (switch-to-buffer-other-window  the_py_buffer)
      (goto-char (buffer-end 1))
      (yank)
      (comint-send-input)
      (switch-to-buffer-other-window the_script_buffer)
      (yank))
    )
    
    (global-set-key  (kbd "C-c n") 'my-python-line)
    

更新

我对代码做了一些改进:

  1. 可能直接用代码来就算了pythonshell不行 运行还没有。

  2. 已设置本地设置密钥

    只剩下专门的流程了。欢迎在下面的答案中改进

    (defun my-python-line ()
    (interactive)
    (save-excursion
      (setq the_script_buffer (format (buffer-name)))
      (end-of-line)
      (kill-region (point) (progn (back-to-indentation) (point)))
      (if  (get-buffer  "*Python*")
      (message "")
      (run-python "ipython" nil nil))
      ;; (setq the_py_buffer (format "*Python[%s]*" (buffer-file-name)))
      (setq the_py_buffer "*Python*")
      (switch-to-buffer-other-window  the_py_buffer)
      (goto-char (buffer-end 1))
      (yank)
      (comint-send-input)
      (switch-to-buffer-other-window the_script_buffer)
      (yank))
      (end-of-line)
      (next-line)
      )
    
    (add-hook 'python-mode-hook
        (lambda ()
      (define-key python-mode-map "\C-cn" 'my-python-line)))
    

我做了一些黑客攻击,这就是我所拥有的: 通过阅读代码,您应该能够了解它是如何工作的。

(defun block-line-end ()
    (setq indentation (current-indentation))
    (forward-line)
    (while (> (current-indentation) indentation)
      (forward-line))
    (forward-line -1)
    (line-end-position))  
(defun my-python-shell-send-region (&optional beg end)
    (interactive)
    (let ((beg (cond (beg beg)
                ((region-active-p) (region-beginning))
                (t (line-beginning-position))))
          (end (cond (end end)
                ((region-active-p) 
                 (copy-marker (region-end)))
                (t (block-line-end)))))
      (python-shell-send-region beg end))
    (forward-line))