2009-09-13 28 views
5

Trong chế độ python, có một hàm gọi là py-execute-region gửi một vùng mã được đánh dấu tới bộ đệm Python để đánh giá. Sau khi đánh giá, con trỏ nằm trong bộ đệm Python, nhưng tôi muốn nó nằm trong bộ đệm kịch bản để tôi có thể tiếp tục sản xuất thêm mã. Tôi đã viết một chức năng tư vấn đơn giản:Emacs defadvice trên chức năng python-mode

(defadvice py-execute-region             
    (after py-execute-region-other-window activate)       
    """ After execution, return cursor to script buffer """     
    (other-window 1)               
) 

Nhưng điều này không làm gì cả. Tôi đã thử các biến thể khác như sử dụng 'xung quanh' thay vì 'sau'; thiết lập một biến cho tên bộ đệm kịch bản và sau đó pop-to-buffer để bộ đệm đó và các công cụ như thế. Không thành công! Tôi tự hỏi nếu cơ chế này rõ ràng với ai đó ... Cảm ơn!

Trả lời

8

Trong trường hợp này các giải pháp dường như là

(custom-set-variables 
'(py-shell-switch-buffers-on-execute nil)) 
1

Những gì bạn có ở đó hoạt động tốt cho tôi. Và nó sẽ tự động kích hoạt, do đó, một kích hoạt riêng biệt là không cần thiết. Tuy nhiên, bạn không cần phải bỏ hoạt động tư vấn và tái kích hoạt để thay đổi có hiệu lực:

1) xác định và kích hoạt lời khuyên

2) nó không làm những gì bạn muốn, vì vậy thay đổi những lời khuyên

3) tắt nó: (ad-vô hiệu hóa 'py-thi-region)

4) kích hoạt lại nó: (ad-kích hoạt' py-thi-vùng)

Bước 4 nên nhặt những thay đổi bạn đã thực hiện ở bước 2. Cách khác, bạn có thể thay đổi mã trong bước 2 và sau đó chỉ cần lại đánh giá mã trong bước 4 (giả sử cờ kích hoạt được thiết lập).

+0

Cảm ơn! ... nhưng vẫn không hiệu quả đối với tôi. Nếu tôi thay thế cơ thể của defadvice bằng (cửa sổ khác 1) (chèn "x"), nó đặt "x" trong bộ đệm tập lệnh nhưng con trỏ vẫn nằm trong bộ đệm Python ... rất khó hiểu. – hatmatrix

+0

Có lời khuyên nào khác được kích hoạt cho cùng một chức năng không? Tại thời điểm này, tôi sẽ bắt đầu một emacs vanilla (emacs -q), tải chế độ python, xác định và kích hoạt lời khuyên của bạn, và xem nếu nó vẫn không hoạt động. Có thể có một số tương tác kỳ lạ đang diễn ra. –

2

Sử dụng lời khuyên xung quanh để bọc chức năng trong một cuộc gọi đến save-window-excursion, sẽ khôi phục cấu hình cửa sổ trước đó sau khi lệnh hoàn tất.

(defadvice py-execute-region 
    (around preserve-window-configuration activate) 
    "After execution, return cursor to script buffer" 
    (save-window-excursion ad-do-it)) 

Xin lưu ý rằng nếu bộ đệm Python chưa được hiển thị, nó sẽ vẫn bị ẩn sau khi lệnh hoàn tất. Để khắc phục điều đó, bạn có thể thêm một lời khuyên để gọi switch-to-đệm-khác-cửa sổ vào cuối :

(defadvice py-execute-region 
    (after show-pybuf-other-window activate) 
    "After execution, show the python buffer in another window." 
    (switch-to-buffer-other-window "[PYTHON BUFFER NAME]")) 

Ngoài ra, hãy chắc chắn rằng bạn không sử dụng """triple quotes""" trong elisp. Tôi không nghĩ rằng chúng hoạt động.

+0

Cảm ơn! Nhưng không hoạt động ...save-window-excursion âm thanh như những gì tôi muốn nhưng nó không xuất hiện để làm bất cứ điều gì, và thứ hai flips vị trí của Python và bộ đệm script (mặc dù nó đặt con trỏ trong cửa sổ nơi bộ đệm kịch bản ban đầu được). Ban đầu tôi đã thử một cái gì đó tương tự với pop-to-buffer thay vì switch-to-buffer-other-window và nó đặt bộ đệm Python trong cửa sổ script! – hatmatrix

+0

Nếu bạn chạy một lệnh bên trong một chuyến tham quan tiết kiệm cửa sổ, sau khi nó kết thúc, cấu hình cửa sổ của bạn phải giống hệt khi bạn chạy lệnh trước đó. Hãy chắc chắn rằng bạn không có bất kỳ lời khuyên cũ nào khác được kích hoạt cũng đang can thiệp. –

+0

Cảm ơn - vâng, cấu hình cửa sổ của tôi không thay đổi nhưng con trỏ kết thúc trong bộ đệm Python ... Tôi nghĩ rằng tôi có khái niệm nhưng nó khiến tôi khó hiểu tại sao điều này hoặc không có thử nghiệm nào khác ... – hatmatrix

1

tôi đã không thực sự cố gắng này ra, nhưng tôi đã làm điều gì đó tương tự cho find-file, và qua đó tôi cần phải gọi tương tác trước khi gọi khác - cửa sổ. Tôi thực sự không có ý tưởng thực sự của Emacs Lisp, nhưng điều này có thể làm việc.

(defadvice py-execute-region             
    (after py-execute-region-other-window activate)       
    (interactive) 
    (other-window 1)               
) 
Các vấn đề liên quan