2009-09-07 17 views
10

Mi piacerebbe essere in grado di eseguire ./manage.py shell in un buffer Emacs, con tutte le cose belle che si ottengono da ipython, come i comandi magici e il completamento automatico. Idealmente mi piacerebbe anche essere in grado di valutare il codice da un buffer alla shell di django.Come eseguire la shell django da Emacs?

È possibile?

risposta

0

Non funziona in shell? Sono riuscito a ottenere una sessione di shell django in corso in emacs proprio ora.

Hit M-x shell e quindi avviare la shell Python all'interno di quella sessione di shell bash, in questo modo:

M-x shell 

guscio genera

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

e dovrebbe far apparire un guscio Django proprio come se si stanno lavorando in un terminale spoglio, ma è un altro buffer in Emacs.

Per quanto riguarda l'integrazione (invio di codice alla shell da valutare, ecc.) Sembra che si possa trovare ciò che si sta cercando in fondo alla pagina here (Emacs Wiki for python.el). Ci sono molte informazioni su come far funzionare iPython con python.el, e potresti essere in grado di farlo per far girare la tua shell django modificando il codice lì o in python.el.

1

L'utilizzo di ansi-term comporterà il completamento del tab di ipython, tuttavia si noti che questo rimapperà tutte le combinazioni di tasti C-x [...] in C-c [...].

Se ti piace, è possibile creare facilmente una combinazione di tasti per esso mettendo questo ai vostri .emacs:

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

Non ho problemi ad avviare un buffer ipython, voglio un buffer 'manage.py shell'. ansi-term non ti permette di passare argomenti al programma che esegue. –

8

OK, così ho inciso questo da solo oggi. Una parte importante di esso è copia e incolla da py-shell da 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

Ho semplicemente creato uno script di shell ipython sostitutivo.

Io uso python-mode.el e ipython.el; correlate frammento .emacs.el va in questo modo:

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

cui sceneggiatura smart_ipython assomiglia a questo:

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

Questa è una domanda piuttosto vecchio, ma probabilmente è ancora utile per qualcuno. Ho trovato il modo più semplice per farlo è con l'aggiunta del seguente ai miei .emacs

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

È quindi possibile utilizzare uno qualsiasi dei comandi di python-shell-interprete, e tutto ciò che verrà eseguito nella shell Django invece di con il normale interprete Python.

Ho scritto un post sul blog su di esso here.

0

Dopo la ricerca di questa domanda credo che la soluzione migliore che funziona per più progetti Django senza cambiare la vostra configurazione ogni volta che si scambia è python-django.el più corretta configurazione del variabili di directory locali.

python-django è una grande aggiunta a python.el per gli utenti di Django, con molti piccoli miglioramenti della qualità della vita, come l'esecuzione di comandi ecc

Per farlo lanciare sempre il guscio Django quando in un progetto, è necessario impostare le variabili locali della directory appropriate, creando un file .dir-locals.el nella radice del progetto. È possibile utilizzare questa configurazione per il file .dir-locals.el. La parte critica è impostare gli argomenti dell'interprete python-shell su manage.py shell per il tuo progetto.

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

`` `

La configurazione è preso from this blogpost dall'autore del progetto.

Problemi correlati