如何从Emacs运行Django shell?
我希望能在Emacs这个编辑器的窗口里运行 ./manage.py shell
,并且能享受到ipython带来的那些好东西,比如神奇命令和自动补全功能。理想情况下,我还希望能从这个窗口里把代码发送到django的命令行中执行。
这可能实现吗?
7 个回答
1
使用 ansi-term
可以让 ipython 的自动补全功能正常工作,不过要注意,这样做会把所有的 C-x [...]
快捷键重新映射为 C-c [...]
。
如果你觉得这样不错,可以通过在你的 .emacs 文件中添加以下内容来轻松创建一个快捷键:
(defun start-my-ipython-term ()
(interactive)
(ansi-term "/usr/bin/ipython"))
(global-set-key (kbd "<your keybinding here>") 'start-my-ipython-term)
2
这个问题虽然比较老,但可能对某些人还是有用的。我发现最简单的方法是在我的 .emacs 文件中添加以下内容:
(setq python-shell-interpreter "python"
python-shell-interpreter-args "-i /absolute/path/to/manage.py shell_plus")
这样你就可以使用任何 python-shell-interpreter 的命令,所有的操作都会在 django 的命令行中运行,而不是在普通的 python 解释器中。
我还写了一篇博客文章,详细讲解了这个内容,可以在这里查看。
8
好的,今天我自己搞定了这个。大部分内容是从 python-mode.el
里的 py-shell
复制粘贴过来的。
(defun django-shell (&optional argprompt)
(interactive "P")
;; Set the default shell if not already set
(labels ((read-django-project-dir
(prompt dir)
(let* ((dir (read-directory-name prompt dir))
(manage (expand-file-name (concat dir "manage.py"))))
(if (file-exists-p manage)
(expand-file-name dir)
(progn
(message "%s is not a Django project directory" manage)
(sleep-for .5)
(read-django-project-dir prompt dir))))))
(let* ((dir (read-django-project-dir
"project directory: "
default-directory))
(project-name (first
(remove-if (lambda (s) (or (string= "src" s) (string= "" s)))
(reverse (split-string dir "/")))))
(buffer-name (format "django-%s" project-name))
(manage (concat dir "manage.py")))
(cd dir)
(if (not (equal (buffer-name) buffer-name))
(switch-to-buffer-other-window
(apply 'make-comint buffer-name manage nil '("shell")))
(apply 'make-comint buffer-name manage nil '("shell")))
(make-local-variable 'comint-prompt-regexp)
(setq comint-prompt-regexp (concat py-shell-input-prompt-1-regexp "\\|"
py-shell-input-prompt-2-regexp "\\|"
"^([Pp]db) "))
(add-hook 'comint-output-filter-functions
'py-comint-output-filter-function)
;; pdbtrack
(add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file)
(setq py-pdbtrack-do-tracking-p t)
(set-syntax-table py-mode-syntax-table)
(use-local-map py-shell-map)
(run-hooks 'py-shell-hook))))