2009-09-07 2 views
10

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

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

ответ

0

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

Хит M-x 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) 
>>> 

и она должна воспитывать Джанго оболочки так же, как если вы работают на голом терминале, но это еще один буфер в Emacs.

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

1

Использование ansi-term сделает работу по заполнению вкладки ipython, однако учтите, что это переназначает все C-x [...] keybindings на 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) 
+0

У меня нет проблем с запуском буфера ipython, мне нужен буфер 'manage.py shell'. ansi-term не позволяет передавать аргументы программе, которую он выполняет. –

8

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

Я просто создал заменяющий скрипт оболочки ipython.

Я использую 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 сценарий выглядит следующим образом:

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

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

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

Вы можете использовать любой из команд питон-оболочка-интерпретатор, и все будет работать в Джанго оболочки вместо с обычным интерпретатором python.

Я написал об этом в блоге here.

0

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

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

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

`` `

Конфигурационный берется from this blogpost автором проекта.

Смежные вопросы