Функция для оценки haskell в ghci при редактировании исходного файла с помощью Emacs

Я редактирую исходный файл haskell. Я хочу запустить свою основную функцию в моем буфере низшего хаскеля (уже открытом в другом фрейме) и продолжить редактирование исходного файла. Для этого я делаю

C-c C-l, изменить кадр, main<ret>, вернуться к исходному кадру

Это кажется довольно неэффективным. Мне нужна функция/ключ emacs, которая делает это одним выстрелом.


person Ian Kelling    schedule 03.11.2012    source источник


Ответы (1)


На самом деле для этого есть функция, уже определенная в inf-haskell.el: inferior-haskell-load-and-run. Это загружает ваш текущий файл и запускает :main.

Вы можете привязать его к ключу в режиме Haskell, добавив хук:

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

Однако, немного поэкспериментировав с этим, я обнаружил странную проблему на моем компьютере: иногда, когда он перемещается в буфер *haskell*, он не перемещает точку до конца. Я нахожу это довольно раздражающим. Вы можете легко исправить это, переместив точку в конец самостоятельно:

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

Я считаю, что sleep-for необходим, потому что команда Haskell запускается асинхронно и требует немного времени для возврата. Все это похоже на хак, но, похоже, работает.

Кроме того, вы можете точно настроить, что такое inferior-haskell-run-command. По умолчанию это :main. Однако для меня, я думаю, просто main было бы лучше, потому что main зависит от :set args ..., а :main нет.

Если вы хотите остаться в текущем буфере Haskell, вы можете просто сделать это:

(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)))
person Tikhon Jelvis    schedule 03.11.2012
comment
Это прекрасно работает, за исключением того, что в конце я сосредоточился на фрейме низшего хаскеля. Я бы хотел, чтобы это было в исходном файле, который я редактировал. - person Ian Kelling; 05.11.2012
comment
Самым простым решением было бы просто вернуться к буферу, с которого вы начали. Я просто отредактирую это в своем ответе. - person Tikhon Jelvis; 06.11.2012
comment
Спасибо. Чтобы поймать все исключения в журнале Inf-Haskell, в моем случае я немного увеличил время ожидания. (сон за 1 750) - person Hartmut P.; 10.01.2014
comment
Большое спасибо! Только одна мелочь: есть странное поведение, если вы пытаетесь отправить буфер с ошибкой компиляции (я использовал последний фрагмент кода). В случае ошибки компиляции курсор перемещается в конец буфера редактирования. - person oshyshko; 02.09.2014
comment
@oshyshko: О, интересно. Я не уверен, что может быть причиной этого. Кроме того, недавно появился новый режим низшего хаскеля, который может вызывать ошибки. Вы знаете, если это тот, который вы используете? - person Tikhon Jelvis; 03.09.2014