11

我希望能够./manage.py shell在 Emacs 缓冲区中运行,以及从 ipython 获得的所有好东西,比如魔法命令和自动完成。理想情况下,我还希望能够评估从缓冲区到 django shell 的代码。

这可能吗?

4

7 回答 7

8

好的,所以我今天自己破解了这个。它的主要部分是从py-shellfrom复制和粘贴python-mode.el

(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))))
于 2009-09-08T08:33:27.907 回答
2

这是一个相当古老的问题,但它可能对某人仍然有用。我发现最简单的方法是将以下内容添加到我的 .emacs

(setq python-shell-interpreter "python"
      python-shell-interpreter-args "-i /absolute/path/to/manage.py shell_plus")

然后,您可以使用任何 python-shell-interpreter 命令,所有内容都将在 django shell 中运行,而不是使用常规的 python 解释器。

我在这里写了一篇关于它的博客文章。

于 2015-09-30T13:48:14.453 回答
1

我只是创建了一个替换 ipython shell 脚本。

我使用 python-mode.el 和 ipython.el;相关的 .emacs.el 片段如下所示:

(setq ipython 命令“/Users/japhy/bin/smart_ipython”)
(需要'ipython)

;; 修复 ipython 0.10 的完成
(setq ipython-completion-command-string
      "print(';'.join(__IP.Completer.all_completions('%s'))) #PYTHON-MODE SILENT\n")

smart_ipython 脚本如下所示:

#!/bin/sh
set -e

/bin/echo -n "Select Django project/dir, or press enter for plain ipython: "

read selection
case $selection in
    '') exec ipython ;;
    project) cd /Users/japhy/Projekty/some/project/dir ;;
    # other often used projects go here
    *) cd $selection ;;
esac
exec python manage.py shell
于 2009-09-08T08:47:13.047 回答
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)
于 2009-09-07T20:53:51.643 回答
1

在研究了这个问题之后,我认为适用于多个 django 项目的最佳解决方案是在每次交换时不更改配置的情况下python-django.el加上正确的目录本地变量配置。

对于 django 用户来说,python-django 是对 python.el 的一个很好的补充,具有许多小的生活质量改进,比如运行命令等。

要让它在项目中始终启动 django shell,您需要通过.dir-locals.el在项目的根目录中创建一个文件来设置正确的目录局部变量。您可以将此配置用于.dir-locals.el文件。关键部分是将您的 python-shell-interpreter 参数设置manage.py shell为您的项目。

((python-mode
  (python-shell-interpreter . "python")
  (python-shell-interpreter-args . "/home/youruser/code/yourproject/manage.py shell")
  (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-shell-extra-pythonpaths "/home/youruser/code/yourproject/apps/")
  (python-shell-virtualenv-path . "/home/youruser/.virtualenvs/yourproject")))

```

配置来自项目作者的这篇博文。

于 2016-07-27T08:57:31.753 回答
0

它不会工作shell?我刚刚设法在 emacs 中进行了 django shell 会话。

点击M-x shell然后在该 bash shell 会话中启动您的 python shell,如下所示:

 M-x shell

贝壳产生

prompt> cd path/to/my/django/directory
prompt> python manage.py shell
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

它应该会打开一个 django shell,就像你在一个裸终端中工作一样,但它是 Emacs 中的另一个缓冲区。

至于集成(将代码发送到要评估的外壳等),您似乎可以在此处的页面底部找到您要查找的内容(Emacs Wiki for python.el)。那里有很多关于让 iPython 与 python.el 一起工作的信息,你可以通过修改那里或 python.el 中的代码来运行你的 django shell。

于 2009-09-07T17:57:53.887 回答
0

这是旧的,但希望这会对某人有所帮助。

在 Emacs 下运行 Django 开发的最新且最轻松的方法是使用 Django-Emacs 模式。

在这里能找到它。

https://github.com/fgallina/python-django.el

它看起来像这样:

在此处输入图像描述

安装此模式后,您会在 emacs 中获得一个名为“Django”的菜单条目。正如您在上面的屏幕截图中看到的那样,您可以在菜单中或键盘快捷键中想象到所有命令。Django Shell 就在那里,以及所有其他的东西。

这是一个非常酷的模式。

PS:当谈到这种模式时,我不是开发人员,也不是感兴趣的一方。我是一个快乐的用户。

编辑:

文件的格式似乎.dir-local.el略有变化。我目前正在使用 Emacs 25.2.2,以下格式适用于此任务

((python-mode . ((python-shell-interpreter . "/home/user/miniconda3/envs/xxx-web/bin/python")
         (python-shell-interpreter-args . "/var/www/sites/xxx-web/xxx/manage.py shell")
         (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-string-code . "';'.join(module_completion('''%s'''))\n")
         (python-shell-completion-string-code . "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
         (python-shell-virtualenv-root . "/home/user/miniconda3/envs/xxx-web"))))
于 2019-03-19T22:02:44.723 回答