11 Stimmen

Wie führt man die Django-Shell von Emacs aus?

Ich würde gerne Folgendes ausführen können ./manage.py shell in einem Emacs-Puffer, mit all den netten Dingen, die man von ipython bekommt, wie magische Befehle und Autovervollständigung. Idealerweise würde ich auch gerne in der Lage sein, Code aus einem Puffer in der Django-Shell auszuwerten.

Ist dies möglich?

8voto

Ryszard Szopa Punkte 5333

OK, also habe ich das heute selbst gehackt. Ein großer Teil davon ist copy-and-paste von py-shell de 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))))

2voto

Farid Punkte 667

Dies ist eine ziemlich alte Frage, aber sie ist wahrscheinlich immer noch nützlich für jemanden. Ich habe herausgefunden, dass es am einfachsten ist, wenn ich folgendes zu meiner .emacs-Datei hinzufüge

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

Sie können dann einen der python-shell-interpreter-Befehle verwenden, und alles wird in der django-Shell statt mit dem regulären python-Interpreter ausgeführt.

Ich habe einen Blogbeitrag darüber geschrieben aquí .

1voto

mik01aj Punkte 11020

Verwendung von ansi-term wird die Tabulator-Vervollständigung von ipython zum Laufen bringen, aber beachten Sie, dass dadurch alle C-x [...] Tastenkombinationen zu C-c [...] .

Wenn es Ihnen gefällt, können Sie leicht eine Tastenkombination dafür erstellen, indem Sie dies in Ihre .emacs-Datei einfügen:

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

1voto

Maciej Pasternacki Punkte 2710

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

Ich verwende python-mode.el und ipython.el; das zugehörige .emacs.el-Fragment sieht folgendermaßen 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 das 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

1voto

Alex Recarey Punkte 18517

Nach der Erforschung dieser Frage denke ich, die beste Lösung, die für mehrere Django-Projekte ohne Ändern Ihrer Konfiguration jedes Mal, wenn Sie Swap funktionieren wird ist python-django.el sowie die korrekte Konfiguration von Verzeichnis-lokale Variablen .

python-django ist eine großartige Ergänzung zu python.el für django-Benutzer, mit vielen kleinen Verbesserungen der Lebensqualität, wie das Ausführen von Befehlen usw.

Um die django-Shell immer zu starten, wenn Sie sich in einem Projekt befinden, müssen Sie die richtigen Verzeichnis-Lokalvariablen setzen, indem Sie eine .dir-locals.el Datei im Stammverzeichnis Ihres Projekts. Sie können diese Konfiguration für die .dir-locals.el Datei. Der entscheidende Teil ist die Einstellung der python-shell-interpreter args auf manage.py shell für Ihr Projekt.

((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 Konfiguration wird übernommen aus diesem Blogpost durch den Autor des Projekts.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X