2009-09-07 33 views
10

Tôi muốn có thể chạy ./manage.py shell trong bộ đệm Emacs, với tất cả những thứ tuyệt vời mà bạn nhận được từ ipython, như lệnh ma thuật và tự động hoàn thành. Lý tưởng nhất tôi cũng muốn để có thể đánh giá mã từ một bộ đệm để vỏ django.Làm thế nào để chạy shell django từ Emacs?

Điều này có khả thi không?

Trả lời

0

Nó sẽ không hoạt động trong shell? Tôi quản lý để có được một phiên django vỏ đi trong emacs vừa nãy.

Hit M-x shell và sau đó bắt đầu vỏ python của bạn bên trong đó phiên bash shell, như vậy:

M-x shell 

vỏ spawns

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

và nó sẽ mang đến một vỏ django cũng giống như khi bạn đang làm việc trong một thiết bị đầu cuối trần, nhưng nó là một bộ đệm khác trong Emacs.

Theo như tích hợp (gửi mã tới trình bao được đánh giá, v.v.) có vẻ như bạn có thể tìm thấy những gì bạn đang tìm kiếm ở cuối trang here (Emacs Wiki for python.el). Có rất nhiều thông tin có về việc nhận được iPython làm việc với python.el, và bạn có thể nhận được rằng để chạy vỏ django của bạn bằng cách sửa đổi mã có hoặc trong python.el.

1

Sử dụng ansi-term sẽ thực hiện công việc hoàn thành tab của ipython, tuy nhiên lưu ý rằng thao tác này sẽ remap tất cả các phím tắt C-x [...] để C-c [...].

Nếu bạn thích nó, bạn có thể dễ dàng tạo ra một keybinding cho nó bằng cách đặt này để emacs của bạn:

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

Tôi không gặp sự cố khi khởi động bộ đệm ipython, tôi muốn có bộ đệm 'manage.py shell'. ansi-term không cho phép bạn truyền các đối số cho chương trình mà nó thực hiện. –

8

OK, vì vậy tôi bị hack này bởi bản thân mình ngày hôm nay. Một phần chính của nó là sao chép và dán từ py-shell từ 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

Tôi đã tạo một kịch bản shell ipython thay thế.

Tôi sử dụng python-mode.el và ipython.el; đoạn .emacs.el liên quan đi như thế này:

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

nơi kịch bản smart_ipython trông như thế này:

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

Đây là một câu hỏi khá cũ, nhưng đây có thể vẫn hữu ích cho một ai đó. Tôi đã tìm thấy cách dễ nhất để làm điều này là bằng cách thêm dòng sau vào emacs tôi

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

Sau đó bạn có thể sử dụng bất kỳ lệnh python-vỏ thông dịch viên, và tất cả mọi thứ sẽ chạy trong vỏ django thay vì với trình thông dịch python thông thường.

Tôi đã viết một bài đăng blog về nó here.

0

Sau khi nghiên cứu câu hỏi này, tôi nghĩ giải pháp tốt nhất sẽ làm việc cho nhiều dự án django mà không thay đổi cấu hình mỗi lần hoán đổi là python-django.el và cấu hình chính xác của biến thư mục cục bộ.

python-django là một bổ sung tuyệt vời để python.el cho người dùng django, với nhiều chất lượng nhỏ cải thiện cuộc sống, giống như lệnh chạy, vv

Để làm cho nó luôn khởi động vỏ django khi trong một dự án, bạn cần phải thiết lập các biến thư mục cục bộ thích hợp, bằng cách tạo một tệp .dir-locals.el trong thư mục gốc của dự án của bạn. Bạn có thể sử dụng cấu hình này cho tệp .dir-locals.el. Phần quan trọng là thiết lập trình thông dịch python-shell của bạn lập thành manage.py shell cho dự án của bạn.

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

`` `

Các cấu hình được lấy from this blogpost bởi tác giả của dự án.

Các vấn đề liên quan