2009-09-07 2 views
10

Ich möchte ./manage.py shell in einem Emacs-Puffer ausführen können, mit all den netten Sachen, die Sie von ipython erhalten, wie magische Befehle und automatische Vervollständigung. Idealerweise möchte ich auch Code aus einem Puffer zur Django-Shell auswerten können.Wie man django Shell von Emacs laufen lässt?

Ist das möglich?

Antwort

0

Es wird nicht funktionieren in shell? Ich habe gerade eine Django Shell Session in Emacs bekommen.

Hit M-x shell und dann Python-Shell innerhalb dieses Bash-Shell-Sitzung starten, etwa so:

M-x shell 

die Schale

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

laicht, und es sollte eine django Schale, als ob Sie bringen arbeiten in einem nackten Terminal, aber es ist ein weiterer Puffer in Emacs.

Soweit die Integration (Senden von Code an die zu bewertende Shell, etc) scheint es so, als ob Sie finden können, was Sie am Ende der Seite finden here (Emacs Wiki for python.el). Es gibt viele Informationen darüber, iPython mit python.el arbeiten zu lassen, und vielleicht kannst du das erreichen, um deine django-Shell auszuführen, indem du den Code dort oder in python.el änderst.

1

Mit ansi-term wird Ipython die Tab-Vervollständigung arbeiten, beachten Sie jedoch, dass dies alle C-x [...] Tastatureingaben zu C-c [...] neu zuordnen wird.

Wenn es Ihnen gefällt, können Sie leicht ein Keybinding dafür schaffen, indem diese setzen auf Ihre .emacs:

(defun start-my-ipython-term() 
    (interactive) 
    (ansi-term "/usr/bin/ipython")) 
(global-set-key (kbd "<your keybinding here>") 'start-my-ipython-term) 
+0

Ich habe keine Probleme beim Starten eines Ipython-Puffers, ich möchte einen 'manage.py Shell'-Puffer. ansi-term erlaubt es nicht, Argumente an das Programm zu übergeben, das es ausführt. –

8

OK, so dass ich gehackt dies von mir heute. Ein großer Teil davon ist Kopieren und Einfügen von py-shell von 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

Ich habe einfach ein Ersatz-Ipython-Shell-Skript erstellt.

Ich benutze python-mode.el und ipython.el; Zusammenhang geht .emacs.el Fragment wie folgt aus:

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

wo smart_ipython Skript wie folgt aussieht:

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

Dies ist eine ziemlich alte Frage, aber es ist wahrscheinlich für jemanden immer noch nützlich. Ich habe die einfachste Weg, dies zu tun, ist

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

indem Sie den folgenden meiner .emacs gefunden können Sie dann eine der Befehle Python-Shell-Interpreter verwenden, und alles wird in der django Shell ausgeführt statt mit dem regulären Python-Interpreter.

Ich schrieb einen Blogeintrag darüber here.

0

Nach der Untersuchung dieser Frage glaube ich, die beste Lösung, die Ihre Konfiguration jedes Mal, wenn Sie tauschen ist python-django.el plus korrekte Konfiguration Verzeichnis-lokalen Variablen ohne Änderung für mehr django Projekte arbeiten.

python-django eine große Bereicherung ist es python.el für django Benutzer, mit vielen kleinen Verbesserung der Lebensqualität, wie die Ausführung von Befehlen usw.

Um immer die django Shell zu starten, wenn in einem Projekt, Sie müssen die richtigen lokalen Verzeichnisvariablen festlegen, indem Sie eine .dir-locals.el-Datei im Stammverzeichnis Ihres Projekts erstellen. Sie können diese Konfiguration für die Datei .dir-locals.el verwenden. Der kritische Teil besteht darin, die Python-Shell-Interpreter-Argumente auf manage.py shell für Ihr Projekt zu setzen.

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

`` `

Die config-from this blogpost vom Autor des Projekts übernommen.