如何从Emacs运行Django shell?

11 投票
7 回答
2626 浏览
提问于 2025-04-15 14:08

我希望能在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))))

撰写回答