在 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-RET
或C-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 中这样做。它还没有完全自动化,但我可能会有用。
这里还有一些有待完成:
如有必要,将行发送到专用进程
分配本地密钥
(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)
更新
我对代码做了一些改进:
可能直接用代码来就算了pythonshell不行
运行还没有。
已设置本地设置密钥
只剩下专门的流程了。欢迎在下面的答案中改进
(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))
这里的问题与 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-RET
或C-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 中这样做。它还没有完全自动化,但我可能会有用。
这里还有一些有待完成:
如有必要,将行发送到专用进程
分配本地密钥
(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)
更新
我对代码做了一些改进:
可能直接用代码来就算了pythonshell不行 运行还没有。
已设置本地设置密钥
只剩下专门的流程了。欢迎在下面的答案中改进
(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))