2012-11-03 7 views
5

Tôi đang chỉnh sửa tệp nguồn haskell. Tôi muốn chạy chức năng chính của mình trong bộ đệm low-haskell của tôi (đã được mở trong một khung khác) và tiếp tục chỉnh sửa tệp nguồn của tôi. Để làm điều này, tôi làmChức năng để đánh giá haskell trong ghci trong khi chỉnh sửa tệp nguồn bằng Emacs

C-c C-l, khung thay đổi, main<ret>, thay đổi trở lại khung gốc

Điều này có vẻ khá hiệu quả. Tôi muốn một chức năng/khóa emacs mà nó bắn một.

Trả lời

7

Có một chức năng thực hiện việc này đã được xác định trong inf-haskell.el: inferior-haskell-load-and-run. Thao tác này sẽ tải tệp hiện tại của bạn và chạy :main.

Bạn có thể gắn nó vào một quan trọng trong chế độ Haskell bằng cách thêm một cái móc:

(defun my-haskell-mode-hook() 
    (local-set-key (kbd "C-x C-r") 'inferior-haskell-load-and-run)) 
(add-hook 'haskell-mode-hook 'my-haskell-mode-hook) 

Tuy nhiên, chơi xung quanh với điều này cho một chút, nó dường như có một vấn đề kỳ lạ trên máy tính của tôi: đôi khi , khi nó bật lên bộ đệm *haskell*, nó không di chuyển điểm đến cuối. Tôi thấy điều này khá khó chịu. Bạn có thể dễ dàng sửa chữa nó bằng cách di chuyển các điểm đến cuối cùng mình:

(defun my-haskell-load-and-run() 
    "Loads and runs the current Haskell file." 
    (interactive) 
    (inferior-haskell-load-and-run inferior-haskell-run-command) 
    (sleep-for 0 100) 
    (end-of-buffer)) 

Tôi tin rằng sleep-for là cần thiết vì lệnh Haskell được điều hành không đồng bộ và phải mất một chút thời gian để trở lại. Toàn bộ điều này là một cái gì đó của một hack, nhưng nó có vẻ làm việc.

Ngoài ra, bạn có thể muốn tùy chỉnh chính xác những gì inferior-haskell-run-command là. Theo mặc định, nó là :main. Tuy nhiên, đối với tôi, tôi nghĩ chỉ cần main sẽ tốt hơn vì main bị ảnh hưởng bởi :set args ... trong đó :main thì không.

Nếu bạn muốn ở lại trong bộ đệm Haskell hiện tại của bạn, bạn chỉ có thể làm điều này:

(defun my-haskell-load-and-run() 
    "Loads and runs the current Haskell file." 
    (interactive) 
    (let ((start-buffer (current-buffer))) 
    (inferior-haskell-load-and-run inferior-haskell-run-command) 
    (sleep-for 0 100) 
    (end-of-buffer) 
    (pop-to-buffer start-buffer))) 
+0

này hoạt động tuyệt vời ngoại trừ tập trung của tôi là vào khung kém-Haskell ở cuối. Tôi muốn nó được trên tập tin nguồn tôi đã chỉnh sửa. –

+0

Giải pháp đơn giản nhất là chỉ cần bật trở lại bộ đệm bạn đã bắt đầu. Tôi sẽ chỉnh sửa nó vào câu trả lời của tôi. –

+0

Cảm ơn bạn. Để bắt tất cả các ngoại lệ trong nhật ký Inf-Haskell, trong trường hợp của tôi, tôi tăng thời gian lên một chút. (ngủ 1 750) – Hartmut