2010-12-27 28 views
6

Cập nhật: Câu hỏi vẫn còn thiếu câu trả lời thỏa đáng.IPython trong Emacs. Đánh giá mã nhanh

Tôi muốn "gửi" các đoạn mã tới trình thông dịch IPython trong Emacs 23.2 (Linux). Giả sử rằng tôi đã bắt đầu một vỏ IPython trong một bộ đệm trong Emacs (ví dụ: sử dụng Python-mode.elIPython.el), có cách nào để chọn một vùng trong bộ đệm khác và "gửi" vùng này tới vỏ IPython đã bắt đầu không?

Tôi đã thử C-c C-c (gửi-đệm-to-shell) và C-c | (gửi vùng-to-shell), nhưng này chỉ hoạt động chừng nào các mã được viết bằng Python và không có trong IPython (IPython có thể chạy mã Python). Lý do có vẻ như vậy, đối với cả hai lệnh, Emacs tạo một tệp tạm thời với phần mở rộng là .py (ngược lại với phần mở rộng là .ipy), sau đó được giải thích bởi IPython là "mã dành riêng cho Python". Điều này ngăn cản tôi sử dụng các tính năng cụ thể của IPython chẳng hạn như lệnh ma thuật.

Trên ghi chú riêng, tôi cũng đọc rằng Emac cung cấp M-| ('shell-command-on-region') để chạy các vùng được chọn trong trình bao. Để thực hiện điều này với một trình thông dịch IPython, tôi đã thử đặt shell-file-name thành đường dẫn IPython của tôi. Tuy nhiên, khi tôi chạy sau khi chọn một khu vực, Emacs nhắc nhở tôi như sau:

Shell lệnh vào khu vực:

và nếu tôi sau đó gõ RET, tôi nhận được người đàn ông trang IPython trên *Shell Command Output* bộ đệm, không có vùng được thực thi. Có bất kỳ lệnh IPython cụ thể mà tôi có thể sử dụng cho M-| ('shell-command-on-region') để có được IPython chạy mã của tôi?

Cảm ơn!

+1

Giả sử bạn có thể chạy trực tiếp ipython, tôi nghi ngờ bạn thực sự muốn thoát 'shell-file-name' một mình, và chỉ cần nhập tên thực thi ipython tại dấu nhắc. Đó là cách sử dụng bình thường cho 'shell-command-on-region', ở mức nào. Lịch sử minibuffer sẽ nhớ rằng lệnh, vì vậy bạn có thể dễ dàng lặp lại nó với 'M- | M-p RET'. Tôi không chắc chắn cách 'call-process-region' hoạt động, nhưng tôi tưởng tượng nó sẽ gửi văn bản vùng tới lệnh như stdin, miễn là lệnh ipython có thể xử lý việc nhận kịch bản theo cách đó, tôi nghĩ nó nên để làm việc (mặc dù nếu không, nó có thể giải thích cho văn bản trợ giúp). – phils

+0

Cảm ơn bạn phils, giải pháp đó hoạt động, nhưng nó đòi hỏi phải mở bắt đầu một vỏ IPython mới (mất một thời gian để bắt đầu) mỗi lần tôi cần kiểm tra đoạn mã –

Trả lời

1

Bạn đang sử dụng ipython.el? Nó sẽ hoạt động tốt với Emacs 23.

Nếu không, hãy xem EmacsWiki: iPython Emacs 23.

Ngoài ra còn có một phần trong IPython Cookbook trên Emacs (tìm kiếm cho IPythonEmacs23; xin lỗi không được phép gửi nhiều hơn một liên kết :(

Khi bạn đã bắt đầu một ipython vỏ (Cc) bạn! có thể thực hiện các đoạn mã từ các vùng của bất kỳ bộ đệm trong vỏ đã bắt đầu này sử dụng "Execute vùng (" Cc | ")

Andreas

+0

Cảm ơn Andreas. Tôi đã sử dụng IPython.el Các trang web EmacsWiki là một chút bối rối mặc dù. Bạn đã thành công trong việc gửi đoạn mã IPython cụ thể đến một vỏ IPython đã mở trong Emacs chưa? –

+0

Có lẽ tôi hiểu lầm câu hỏi của bạn, nhưng một khi tôi đã bắt đầu một ipython-shell (Cc!) Tôi có thể thực thi đoạn mã từ các khu vực của bất kỳ bộ đệm trong vỏ này đã bắt đầu bằng cách sử dụng "Execute region (" Cc | ") – Andreas

+0

bình luận cho câu trả lời – Andreas

0

tôi tìm thấy một câu trả lời một phần Q1:

Chế độ Python cung cấp C-c C-c có thể gửi bộ đệm đến một vỏ Python đã mở (tương tự C-c C-| có thể gửi một vùng đến trình bao) và nếu ipython.el được cài đặt, thì trình bao python mặc định được đặt thành IPython.

Thật không may, tính năng này chỉ hoạt động đối với các tập lệnh python chứ không phải cho tập lệnh IPython. C-c C-c hoạt động bằng cách sao chép bộ đệm bằng đoạn mã vào một tệp tạm thời với phần mở rộng .py sau đó được gửi đến trình bao. Vì tệp có phần mở rộng .py IPython thực hiện nó như thể nó là mã Python thông thường, và do đó đoạn mã không thể có mã đặc biệt IPython (như lệnh ma thuật IPython).

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