2009-09-07 21 views
10

Chciałbym móc uruchomić ./manage.py shell w buforze Emacs, z wszystkimi ładnymi rzeczami, które dostajesz z ipython, takimi jak magiczne polecenia i autouzupełnianie. Idealnie chciałbym również móc ocenić kod z bufora do powłoki django.Jak uruchomić powłokę django z Emacs?

Czy to możliwe?

Odpowiedz

0

To nie zadziała w shell? Udało mi się uzyskać teraz sesję powłoki Django w emacs.

Hit M-x shell a następnie uruchomić powłokę Pythona wewnątrz tej sesji powłoki bash, tak:

M-x shell 

powłoka ikra

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

i powinno wywołać powłokę django tak jakby ciebie pracują w gołym terminalu, ale jest to kolejny bufor w Emacs.

Jeśli chodzi o integrację (wysyłanie kodu do powłoki podlegającej ocenie itp.), Wydaje się, że możesz znaleźć to, czego szukasz na dole strony. Jest tam mnóstwo informacji o tym, jak iPython pracuje z python.el, i możesz to zrobić, aby uruchomić powłokę Django, modyfikując kod tam lub w python.el.

1

Wykonanie polecenia z użyciem tabulatora ipython będzie działać, ale pamiętaj, że zmieni to wszystkie kombinacje C-x [...] na C-c [...].

Jeśli Ci się spodoba, można łatwo stworzyć kombinacja klawiszy dla niego przez wprowadzenie do Twoich .emacs:

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

Nie mam problemów z uruchomieniem bufora na ipython, chcę mieć bufor 'manage.py shell'. ansi-term nie pozwala przekazywać argumentów do programu, który wykonuje. –

8

OK, więc włamał ten sam dzisiaj. Główną jego częścią jest kopiowanie i wklejanie z py-shell z 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

Po prostu utworzyłem zastępczy skrypt powłoki ipython.

Używam python-mode.el i ipython.el; związanych .emacs.el fragment wygląda tak:

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

gdzie smart_ipython skrypt wygląda tak:

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

Jest to dość stare pytanie, ale to chyba jeszcze przydatne dla kogoś. Znalazłem najprostszym sposobem osiągnięcia tego celu jest dodanie następujących do mojego .emacs

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

Następnie można użyć dowolnego z poleceń python-shell-tłumacza, a wszystko będzie działać w powłoce django zamiast z regularnym tłumaczem python.

Napisałem wpis na blogu na ten temat here.

0

Po zbadaniu tego pytania uważam, że najlepszym rozwiązaniem, które będzie działać dla wielu projektów django bez zmiany konfiguracji za każdym razem, gdy zostanie zamieniona, jest oraz poprawna konfiguracja zmiennych lokalnych katalogu.

python-django jest doskonałym dodatkiem do python.el dla użytkowników Django z wielu małych ulepszeń jakości życia, jak poleceń prowadzących itp

Aby dostać to zawsze uruchomić powłokę django, gdy w projekcie, musisz ustawić odpowiednie zmienne lokalne katalogu, tworząc plik .dir-locals.el w katalogu głównym projektu. Możesz użyć tej konfiguracji dla pliku .dir-locals.el. Najważniejszą częścią jest ustawienie argumentów interpretera Pythona-powłoki na manage.py shell dla twojego projektu.

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

`` `

config zostanie podjęta from this blogpost przez autora projektu.

Powiązane problemy