Как запустить оболочку django из Emacs?

Я хотел бы иметь возможность запускать ./manage.py shell в буфере Emacs со всеми приятными материалами, которые вы получаете от ipython, такими как магические команды и автозаполнение. В идеале я также хотел бы оценить код из буфера в оболочку django.

Возможно ли это?

Ответ 1

Хорошо, поэтому я сам взломал это сегодня. Большая его часть - копирование и вставка из py-shell из 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))))

Ответ 2

Это довольно старый вопрос, но он, вероятно, по-прежнему полезен для кого-то. Я нашел самый простой способ сделать это, добавив следующее в мой .emacs

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

Затем вы можете использовать любую команду python-shell-interpreter, и все будет работать в оболочке django вместо обычного интерпретатора python.

Я написал сообщение в блоге об этом здесь.

Ответ 3

Используя 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)

Ответ 4

Я просто создал замену оболочки ipython script.

Я использую python-mode.el и ipython.el; связанный фрагмент .emacs.el выглядит следующим образом:

(setq ipython-command "/Users/japhy/bin/smart_ipython")
(require 'ipython)

;; fix completion for ipython 0.10
(setq ipython-completion-command-string
      "print(';'.join(__IP.Completer.all_completions('%s'))) #PYTHON-MODE SILENT\n")

где smart_ipython script выглядит следующим образом:

#!/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

Ответ 5

После изучения этого вопроса я считаю, что лучшим решением, которое будет работать для нескольких проектов django без изменения вашей конфигурации при каждом свопинге, является python-django.el плюс правильная настройка локальных переменных каталога.

python-django - отличное дополнение к python.el для пользователей django, с множеством небольших улучшений качества жизни, таких как запуск команд и т.д.

Чтобы заставить его всегда запускать оболочку django в проекте, вам нужно установить правильные локальные переменные каталога, создав файл .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")))

`` `

Конфигурация взята из этого blogpost автором проекта.

Ответ 6

Он не работает в shell? Сейчас мне удалось получить сеанс оболочки django, который будет проходить в emacs.

Нажмите M-x shell, а затем запустите оболочку python внутри сеанса оболочки bash, например:

 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 так же, как если бы вы работали на голом терминале, но это еще один буфер в Emacs.

Что касается интеграции (отправка кода в оболочку для оценки и т.д.), похоже, что вы можете найти то, что ищете в нижней части страницы здесь (Emacs Wiki для python.el). Там много информации о том, как iPython работает с python.el, и вы можете получить это, чтобы запустить оболочку django, изменив код там или в python.el.

Ответ 7

Это старо, но, надеюсь, это кому-нибудь поможет.

Самый современный и легкий способ запуска разработки Django в Emacs - это использование режима Django-Emacs.

Это можно найти здесь.

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

Это выглядит примерно так:

enter image description here

Когда у вас установлен этот режим, вы получаете пункт меню под названием "Django" в вашем emacs. Как вы можете видеть на скриншоте выше, у вас есть все команды, которые вы можете представить в меню или в виде сочетаний клавиш. Оболочка Джанго там, наряду со всеми остальными вещами.

Это действительно крутой режим.

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"))))