Что делать, когда компиляция Emacs 23 Haskell (Cc Cl) переходит в бесконечный процесс?

Много раз бывает так, что пока я пытаюсь скомпилировать .hs файл, режим Emacs 23 Haskell входит в бесконечный процесс и не показывает никакого ответа. Единственное, что происходит, это то, что курсор превращается в круг, и внутри него начинают кружиться точки.

Каков наилучший подход, чтобы избежать этой ситуации? Если я попаду в эту ситуацию, как я могу выйти? В настоящее время я перезагружаю свой компьютер. Пожалуйста, руководство.

Недавно это произошло для следующего кода:

import Control.Monad
import Data.Char
main = do
  putStrLn "This is an addition"
  contents <- getContents
  putStrLn $ (shortLinesOnly contents)
  shortLinesOnly :: String -> String
shortLinesOnly input =
  allLines = lines input
   shortLines = filter (\line -> length line < 10) allLines
               res = unlines shortLines
                     in result

2 ответа

Решение

Может быть, имеет смысл найти функцию, которая выполняет компиляцию, и обернуть ее во что-то вроде:

(with-local-quit
  (with-timeout (60 (error "The process didn't finish in 60 seconds"))
     ;; do the calls to the compiler here
     ))

Если это еще не было сделано. Если это было сделано, то, как предлагает иллюзия жизни, вы сможете прервать процесс с помощью Cg.

Однако иногда Emacs может стать слишком медленным или слишком не отвечающим (система может уделять очень высокий приоритет запущенному процессу, так что вам придется ждать очень долго, пока элемент управления не вернется в Emacs из процесса блокировки с высоким приоритетом), Тем не менее, это еще не причина перезагрузить компьютер. В Linux вы, вероятно, работаете на уровне выполнения 3, и в этом случае вы можете сделать Ctrl+Alt+1 или любое число меньше, чем оболочка с X-сервером, а затем сделать

$ ps aux | grep "my process name"

это напечатает вам некоторые подробности о процессе, начиная с его идентификатора, учитывая идентификатор, который вы можете сделать:

$ kill id

Кроме того, вы можете просто убить все экземпляры emacs и все процессы, созданные из него:

$ killall emacs

Использование C-g, Вы можете использовать его, чтобы остановить любой процесс синхронизации, внутренний или внешний.

Другие вопросы по тегам